|
|
|
@ -84,7 +84,7 @@ namespace IRaCIS.Core.Application.Service
|
|
|
|
|
{
|
|
|
|
|
//找到一致性核查通过且没有产生任务的访视
|
|
|
|
|
var needGenerateVisit = await _subjectVisitRepository.Where(t => t.TrialId == trialId && t.CheckState == CheckStateEnum.CVPassed &&
|
|
|
|
|
!t.VisitTaskList.Any(u=>u.TrialReadingCriterionId== confirmedTrialReadingCriterionId &&u.SourceSubjectVisitId==t.Id)).ToListAsync();
|
|
|
|
|
!t.VisitTaskList.Any(u => u.TrialReadingCriterionId == confirmedTrialReadingCriterionId && u.SourceSubjectVisitId == t.Id)).ToListAsync();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var trialReadingCriterionConfig = await _trialReadingCriterionRepository.Where(t => t.Id == confirmedTrialReadingCriterionId).Select(t => new { TrialReadingCriterionId = t.Id, t.ReadingTool, t.ReadingType, t.IsReadingTaskViewInOrder, t.IsFollowVisitAutoAssign, t.IsFollowGlobalVisitAutoAssign, t.FollowGlobalVisitAutoAssignDefaultState, t.FollowVisitAutoAssignDefaultState, t.TaskAllocateObjEnum }).FirstOrDefaultAsync();
|
|
|
|
@ -99,13 +99,13 @@ namespace IRaCIS.Core.Application.Service
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
foreach (var subjectGroup in needGenerateVisit.GroupBy(t=>t.SubjectId).Select(g=> new { SubjectId= g.Key, SubjectVisitList= g.ToList() }))
|
|
|
|
|
foreach (var subjectGroup in needGenerateVisit.GroupBy(t => t.SubjectId).Select(g => new { SubjectId = g.Key, SubjectVisitList = g.ToList() }))
|
|
|
|
|
{
|
|
|
|
|
var assignConfigList = await _subjectUserRepository.Where(t => t.TrialId == trialId && t.TrialReadingCriterionId == trialReadingCriterionConfig.TrialReadingCriterionId && t.SubjectId == subjectGroup.SubjectId && t.OrignalSubjectUserId == null && t.IsConfirmed).Select(u => new { u.DoctorUserId, u.ArmEnum }).ToListAsync();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var visitNumList = _subjectVisitRepository.Where(t => t.SubjectId == subjectGroup.SubjectId && t.IsLostVisit == false ).OrderBy(t=>t.VisitNum).Select(t=>t.VisitNum).ToList();
|
|
|
|
|
var visitNumList = _subjectVisitRepository.Where(t => t.SubjectId == subjectGroup.SubjectId && t.IsLostVisit == false).OrderBy(t => t.VisitNum).Select(t => t.VisitNum).ToList();
|
|
|
|
|
|
|
|
|
|
foreach (var subjectVisit in subjectGroup.SubjectVisitList)
|
|
|
|
|
{
|
|
|
|
@ -121,7 +121,7 @@ namespace IRaCIS.Core.Application.Service
|
|
|
|
|
{
|
|
|
|
|
if (trialReadingCriterionConfig.IsReadingTaskViewInOrder)
|
|
|
|
|
{
|
|
|
|
|
blindTaskName = visitBlindConfig.BlindFollowUpPrefix+" " + visitNumList.IndexOf(subjectVisit.VisitNum);
|
|
|
|
|
blindTaskName = visitBlindConfig.BlindFollowUpPrefix + " " + visitNumList.IndexOf(subjectVisit.VisitNum);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
@ -258,7 +258,7 @@ namespace IRaCIS.Core.Application.Service
|
|
|
|
|
var trialId = generateTaskCommand.TrialId;
|
|
|
|
|
var isAssignSubjectToDoctor = generateTaskCommand.IsAssignSubjectToDoctor;
|
|
|
|
|
|
|
|
|
|
var trialReadingCriterionConfigList = _trialReadingCriterionRepository.Where(t => t.TrialId == trialId && t.ReadingInfoSignTime !=null).Select(t => new { TrialReadingCriterionId= t.Id ,t.ReadingTool,t.ReadingType, t.IsReadingTaskViewInOrder, t.IsFollowVisitAutoAssign, t.IsFollowGlobalVisitAutoAssign, t.FollowGlobalVisitAutoAssignDefaultState, t.FollowVisitAutoAssignDefaultState,t.TaskAllocateObjEnum } ).ToList();
|
|
|
|
|
var trialReadingCriterionConfigList = _trialReadingCriterionRepository.Where(t => t.TrialId == trialId && t.ReadingInfoSignTime != null).Select(t => new { TrialReadingCriterionId = t.Id, t.ReadingTool, t.ReadingType, t.IsReadingTaskViewInOrder, t.IsFollowVisitAutoAssign, t.IsFollowGlobalVisitAutoAssign, t.FollowGlobalVisitAutoAssignDefaultState, t.FollowVisitAutoAssignDefaultState, t.TaskAllocateObjEnum }).ToList();
|
|
|
|
|
|
|
|
|
|
var visitBlindConfig = _trialRepository.Where(t => t.Id == trialId).Select(t => new { t.BlindBaseLineName, t.BlindFollowUpPrefix }).FirstOrDefault();
|
|
|
|
|
|
|
|
|
@ -275,13 +275,13 @@ namespace IRaCIS.Core.Application.Service
|
|
|
|
|
//每个Subject 的每个访视 都要根据每个标准进行任务的生成 和分配(考虑回退后 的分配)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
foreach (var subjectGroup in generateTaskCommand.VisitGenerataTaskList.GroupBy(t=>t.SubjectId).Select(g=>new {SubjectId=g.Key,SubjectVisitList=g.ToList()}))
|
|
|
|
|
foreach (var subjectGroup in generateTaskCommand.VisitGenerataTaskList.GroupBy(t => t.SubjectId).Select(g => new { SubjectId = g.Key, SubjectVisitList = g.ToList() }))
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
foreach (var subjectVisit in subjectGroup.SubjectVisitList)
|
|
|
|
|
{
|
|
|
|
|
var visitNumList = _subjectVisitRepository.Where(t => t.SubjectId == subjectGroup.SubjectId && t.IsLostVisit==false).OrderBy(t => t.VisitNum).Select(t => t.VisitNum).ToList();
|
|
|
|
|
var visitNumList = _subjectVisitRepository.Where(t => t.SubjectId == subjectGroup.SubjectId && t.IsLostVisit == false).OrderBy(t => t.VisitNum).Select(t => t.VisitNum).ToList();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
foreach (var trialReadingCriterionConfig in trialReadingCriterionConfigList)
|
|
|
|
@ -301,7 +301,7 @@ namespace IRaCIS.Core.Application.Service
|
|
|
|
|
{
|
|
|
|
|
if (trialReadingCriterionConfig.IsReadingTaskViewInOrder)
|
|
|
|
|
{
|
|
|
|
|
blindTaskName = visitBlindConfig.BlindFollowUpPrefix+" " + visitNumList.IndexOf(subjectVisit.VisitNum);
|
|
|
|
|
blindTaskName = visitBlindConfig.BlindFollowUpPrefix + " " + visitNumList.IndexOf(subjectVisit.VisitNum);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
@ -421,7 +421,7 @@ namespace IRaCIS.Core.Application.Service
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//后续最近的未一致性核查通过的访视任务
|
|
|
|
|
var followBackVisitTask = await _visitTaskRepository.Where(t => t.TrialId == trialId && t.TrialReadingCriterionId == trialReadingCriterionConfig.TrialReadingCriterionId && t.SubjectId == subjectVisit.SubjectId && t.VisitTaskNum > subjectVisit.VisitNum && t.ReadingCategory == ReadingCategory.Visit && t.SourceSubjectVisit.CheckState != CheckStateEnum.CVPassed && t.SourceSubjectVisit.IsLostVisit==false).OrderBy(t => t.VisitTaskNum).FirstOrDefaultAsync();
|
|
|
|
|
var followBackVisitTask = await _visitTaskRepository.Where(t => t.TrialId == trialId && t.TrialReadingCriterionId == trialReadingCriterionConfig.TrialReadingCriterionId && t.SubjectId == subjectVisit.SubjectId && t.VisitTaskNum > subjectVisit.VisitNum && t.ReadingCategory == ReadingCategory.Visit && t.SourceSubjectVisit.CheckState != CheckStateEnum.CVPassed && t.SourceSubjectVisit.IsLostVisit == false).OrderBy(t => t.VisitTaskNum).FirstOrDefaultAsync();
|
|
|
|
|
|
|
|
|
|
//大于当前访视 同时小于最近的未一致性核查通过的访视任务分配 或者生成
|
|
|
|
|
|
|
|
|
@ -433,10 +433,16 @@ namespace IRaCIS.Core.Application.Service
|
|
|
|
|
|
|
|
|
|
var followVisitGroup = followVisitTaskList.GroupBy(t => t.VisitTaskNum);
|
|
|
|
|
|
|
|
|
|
//每个访视去判断 是分配还是生成(因为影响哪里有些是取消分配,有些是重阅重置)
|
|
|
|
|
//每个访视去判断 是分配还是生成(因为影响哪里有些是取消分配,有些是重阅重置需要重新生成)
|
|
|
|
|
foreach (var visitGroup in followVisitGroup)
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
//如果后续访视已分配有效 就不用处理
|
|
|
|
|
if (visitGroup.Any(t => t.TaskState == TaskState.Effect && t.TaskAllocationState == TaskAllocationState.Allocated && t.ArmEnum == Arm.DoubleReadingArm1))
|
|
|
|
|
{
|
|
|
|
|
//不做处理
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
var arm1 = visitGroup.FirstOrDefault(t => t.TaskState == TaskState.Effect && t.TaskAllocationState == TaskAllocationState.NotAllocate && t.DoctorUserId == null && t.ArmEnum == Arm.DoubleReadingArm1);
|
|
|
|
|
if (arm1 != null)
|
|
|
|
|
{
|
|
|
|
@ -461,7 +467,7 @@ namespace IRaCIS.Core.Application.Service
|
|
|
|
|
|
|
|
|
|
SourceSubjectVisitId = latestTask.SourceSubjectVisitId,
|
|
|
|
|
VisitTaskNum = latestTask.VisitTaskNum,
|
|
|
|
|
TaskBlindName = visitBlindConfig.BlindFollowUpPrefix+" " + visitNumList.IndexOf(latestTask.VisitTaskNum) ,
|
|
|
|
|
TaskBlindName = visitBlindConfig.BlindFollowUpPrefix + " " + visitNumList.IndexOf(latestTask.VisitTaskNum),
|
|
|
|
|
TaskName = latestTask.TaskName,
|
|
|
|
|
|
|
|
|
|
BlindSubjectCode = latestTask.BlindSubjectCode,
|
|
|
|
@ -480,6 +486,15 @@ namespace IRaCIS.Core.Application.Service
|
|
|
|
|
_provider.Set<int>($"{trialId}_{StaticData.CacheKey.TaskMaxCode}", currentMaxCodeInt, TimeSpan.FromMinutes(30));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//如果后续访视已分配有效 就不用处理
|
|
|
|
|
if (visitGroup.Any(t => t.TaskState == TaskState.Effect && t.TaskAllocationState == TaskAllocationState.Allocated && t.ArmEnum == Arm.DoubleReadingArm2))
|
|
|
|
|
{
|
|
|
|
|
//不做处理
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
var arm2 = visitGroup.FirstOrDefault(t => t.TaskState == TaskState.Effect && t.TaskAllocationState == TaskAllocationState.NotAllocate && t.DoctorUserId == null && t.ArmEnum == Arm.DoubleReadingArm2);
|
|
|
|
|
if (arm2 != null)
|
|
|
|
|
{
|
|
|
|
@ -506,7 +521,7 @@ namespace IRaCIS.Core.Application.Service
|
|
|
|
|
|
|
|
|
|
SourceSubjectVisitId = latestTask.SourceSubjectVisitId,
|
|
|
|
|
VisitTaskNum = latestTask.VisitTaskNum,
|
|
|
|
|
TaskBlindName = visitBlindConfig.BlindFollowUpPrefix+" " + visitNumList.IndexOf(latestTask.VisitTaskNum),
|
|
|
|
|
TaskBlindName = visitBlindConfig.BlindFollowUpPrefix + " " + visitNumList.IndexOf(latestTask.VisitTaskNum),
|
|
|
|
|
TaskName = latestTask.TaskName,
|
|
|
|
|
|
|
|
|
|
BlindSubjectCode = latestTask.BlindSubjectCode,
|
|
|
|
@ -527,6 +542,8 @@ namespace IRaCIS.Core.Application.Service
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
//无序的时候 生成任务并分配出去
|
|
|
|
@ -634,7 +651,7 @@ namespace IRaCIS.Core.Application.Service
|
|
|
|
|
if (trialReadingCriterionConfig.IsReadingTaskViewInOrder)
|
|
|
|
|
{
|
|
|
|
|
//之前有回退到影像上传的访视 那么当前访视一致性核查通过的时候,当前访视生成但是不分配出去(排除失访的)
|
|
|
|
|
var beforeBackVisitTask = await _visitTaskRepository.Where(t => t.TrialId == trialId && t.SubjectId == subjectVisit.SubjectId && t.VisitTaskNum < subjectVisit.VisitNum && t.ReadingCategory == ReadingCategory.Visit && t.SourceSubjectVisit.CheckState != CheckStateEnum.CVPassed && t.SourceSubjectVisit.IsLostVisit==false).OrderBy(t => t.VisitTaskNum).FirstOrDefaultAsync();
|
|
|
|
|
var beforeBackVisitTask = await _visitTaskRepository.Where(t => t.TrialId == trialId && t.SubjectId == subjectVisit.SubjectId && t.VisitTaskNum < subjectVisit.VisitNum && t.ReadingCategory == ReadingCategory.Visit && t.SourceSubjectVisit.CheckState != CheckStateEnum.CVPassed && t.SourceSubjectVisit.IsLostVisit == false).OrderBy(t => t.VisitTaskNum).FirstOrDefaultAsync();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (beforeBackVisitTask == null)
|
|
|
|
@ -674,7 +691,14 @@ namespace IRaCIS.Core.Application.Service
|
|
|
|
|
|
|
|
|
|
foreach (var visitGroup in followVisitGroup)
|
|
|
|
|
{
|
|
|
|
|
//如果后续访视已分配有效 就不用处理
|
|
|
|
|
if (visitGroup.Any(t => t.TaskState == TaskState.Effect && t.TaskAllocationState == TaskAllocationState.Allocated && t.ArmEnum == Arm.SingleReadingArm))
|
|
|
|
|
{
|
|
|
|
|
//不做处理
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
var arm = visitGroup.FirstOrDefault(t => t.TaskState == TaskState.Effect && t.TaskAllocationState == TaskAllocationState.NotAllocate && t.DoctorUserId == null && t.ArmEnum == Arm.SingleReadingArm);
|
|
|
|
|
if (arm != null)
|
|
|
|
|
{
|
|
|
|
@ -699,7 +723,7 @@ namespace IRaCIS.Core.Application.Service
|
|
|
|
|
|
|
|
|
|
SourceSubjectVisitId = latestTask.SourceSubjectVisitId,
|
|
|
|
|
VisitTaskNum = latestTask.VisitTaskNum,
|
|
|
|
|
TaskBlindName = visitBlindConfig.BlindFollowUpPrefix+" " + visitNumList.IndexOf(latestTask.VisitTaskNum),
|
|
|
|
|
TaskBlindName = visitBlindConfig.BlindFollowUpPrefix + " " + visitNumList.IndexOf(latestTask.VisitTaskNum),
|
|
|
|
|
TaskName = latestTask.TaskName,
|
|
|
|
|
|
|
|
|
|
BlindSubjectCode = latestTask.BlindSubjectCode,
|
|
|
|
@ -715,6 +739,8 @@ namespace IRaCIS.Core.Application.Service
|
|
|
|
|
|
|
|
|
|
_provider.Set<int>($"{trialId}_{StaticData.CacheKey.TaskMaxCode}", currentMaxCodeInt, TimeSpan.FromMinutes(30));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -952,7 +978,7 @@ namespace IRaCIS.Core.Application.Service
|
|
|
|
|
case GenerateTaskCategory.Judge:
|
|
|
|
|
var firstTask = await _visitTaskRepository.Where(x => generateTaskCommand.JudgeVisitTaskIdList.Contains(x.Id)).FirstOrDefaultAsync();
|
|
|
|
|
|
|
|
|
|
var subjectUser = await _subjectUserRepository.Where(x => x.SubjectId == firstTask.SubjectId && x.ArmEnum == Arm.JudgeArm && x.IsConfirmed &&x.TrialReadingCriterionId==firstTask.TrialReadingCriterionId).FirstOrDefaultAsync();
|
|
|
|
|
var subjectUser = await _subjectUserRepository.Where(x => x.SubjectId == firstTask.SubjectId && x.ArmEnum == Arm.JudgeArm && x.IsConfirmed && x.TrialReadingCriterionId == firstTask.TrialReadingCriterionId).FirstOrDefaultAsync();
|
|
|
|
|
|
|
|
|
|
VisitTask visitTask = new VisitTask()
|
|
|
|
|
{
|
|
|
|
@ -1003,7 +1029,7 @@ namespace IRaCIS.Core.Application.Service
|
|
|
|
|
case GenerateTaskCategory.Global:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var originalTaskInfo = await _visitTaskRepository.Where(x => x.Id == generateTaskCommand.OriginalVisitId).Include(x=>x.TrialReadingCriterion).FirstNotNullAsync();
|
|
|
|
|
var originalTaskInfo = await _visitTaskRepository.Where(x => x.Id == generateTaskCommand.OriginalVisitId).Include(x => x.TrialReadingCriterion).FirstNotNullAsync();
|
|
|
|
|
|
|
|
|
|
// 需要添加全局任务再添加
|
|
|
|
|
if (originalTaskInfo.TrialReadingCriterion.IsGlobalTask)
|
|
|
|
@ -1050,7 +1076,7 @@ namespace IRaCIS.Core.Application.Service
|
|
|
|
|
foreach (var item in generateTaskCommand.ReadingGenerataTaskList)
|
|
|
|
|
{
|
|
|
|
|
//需要 根据标准筛选
|
|
|
|
|
var oncologySubjectUser = await _subjectUserRepository.Where(x => x.SubjectId == item.SubjectId && x.ArmEnum == Arm.TumorArm && x.IsConfirmed&&x.TrialReadingCriterionId== originalTaskInfo.TrialReadingCriterionId).FirstOrDefaultAsync();
|
|
|
|
|
var oncologySubjectUser = await _subjectUserRepository.Where(x => x.SubjectId == item.SubjectId && x.ArmEnum == Arm.TumorArm && x.IsConfirmed && x.TrialReadingCriterionId == originalTaskInfo.TrialReadingCriterionId).FirstOrDefaultAsync();
|
|
|
|
|
|
|
|
|
|
item.VisitNum = await _readModuleRepository.Where(x => x.Id == item.ReadModuleId).Select(x => x.SubjectVisit.VisitNum).FirstOrDefaultAsync();
|
|
|
|
|
|
|
|
|
|