diff --git a/IRaCIS.Core.Application/Service/Allocation/DTO/TaskAllocationRuleViewModel.cs b/IRaCIS.Core.Application/Service/Allocation/DTO/TaskAllocationRuleViewModel.cs index 64f158160..f9b73fe39 100644 --- a/IRaCIS.Core.Application/Service/Allocation/DTO/TaskAllocationRuleViewModel.cs +++ b/IRaCIS.Core.Application/Service/Allocation/DTO/TaskAllocationRuleViewModel.cs @@ -106,7 +106,8 @@ namespace IRaCIS.Core.Application.ViewModel public List TrialReadingCriterionList { get; set; } public List CriterionReadingCategoryList { get; set; } - public List CriterionCategoryList => CriterionReadingCategoryList + public List CriterionCategoryList => CriterionReadingCategoryList.Count == 0 ? TrialReadingCriterionList.Select(t => new CriterionReadingCategory() { EnrollId = EnrollId, TrialReadingCriterionId = t.TrialReadingCriterionId }).ToList() : + CriterionReadingCategoryList .GroupBy(t => new { t.TrialReadingCriterionId, t.EnrollId }) .Select(g => new CriterionReadingCategory() { EnrollId = g.Key.EnrollId, TrialReadingCriterionId = g.Key.TrialReadingCriterionId, ReadingCategorys = g.Select(t => t.ReadingCategory).ToList() }).ToList(); diff --git a/IRaCIS.Core.Application/Service/Allocation/VisitTaskHelpeService.cs b/IRaCIS.Core.Application/Service/Allocation/VisitTaskHelpeService.cs index dccbd7cd6..9c6ba8d89 100644 --- a/IRaCIS.Core.Application/Service/Allocation/VisitTaskHelpeService.cs +++ b/IRaCIS.Core.Application/Service/Allocation/VisitTaskHelpeService.cs @@ -36,11 +36,13 @@ namespace IRaCIS.Core.Application.Service private readonly IUserInfo _userInfo; private readonly IRepository _visitTaskReReadingRepository; + private readonly IRepository _trialReadingCriterionRepository; + public VisitTaskHelpeService(IRepository visitTaskRepository, IRepository subjectUserRepository, IRepository trialRepository, IEasyCachingProvider provider, IRepository subjectVisitRepository, IRepository readingJudgeInfoRepository, - IRepository taskAllocationRuleRepository, IMapper mapper, IUserInfo userInfo, IRepository visitTaskReReadingRepository) + IRepository taskAllocationRuleRepository, IMapper mapper, IUserInfo userInfo, IRepository visitTaskReReadingRepository, IRepository trialReadingCriterionRepository) { _visitTaskRepository = visitTaskRepository; _trialRepository = trialRepository; @@ -52,6 +54,8 @@ namespace IRaCIS.Core.Application.Service _mapper = mapper; _userInfo = userInfo; _visitTaskReReadingRepository = visitTaskReReadingRepository; + + _trialReadingCriterionRepository = trialReadingCriterionRepository } //查询列表的时候,一致性核查通过未产生任务的 自动产生任务 如果是一致性核查,那么还会自动分配 @@ -79,6 +83,8 @@ namespace IRaCIS.Core.Application.Service var trialId = generateTaskCommand.TrialId; var isAssignSubjectToDoctor = generateTaskCommand.IsAssignSubjectToDoctor; + var trialReadingCriterionIdList = _trialReadingCriterionRepository.Where(t => t.TrialId == trialId && t.IsConfirm).Select(t => t.Id).ToList(); + var trialConfig = (await _trialRepository.Where(t => t.Id == trialId).Select(t => new { TrialId = t.Id, t.ReadingType, t.IsFollowVisitAutoAssign, t.IsFollowGlobalVisitAutoAssign, t.FollowGlobalVisitAutoAssignDefaultState, t.FollowVisitAutoAssignDefaultState, t.TaskAllocateObjEnum, t.IsReadingTaskViewInOrder }).FirstOrDefaultAsync()).IfNullThrowException(); var dbMaxCode = _visitTaskRepository.Where(t => t.TrialId == trialId).Select(t => t.Code).DefaultIfEmpty().Max(); @@ -92,132 +98,148 @@ namespace IRaCIS.Core.Application.Service case GenerateTaskCategory.Visit: foreach (var subjectVisit in generateTaskCommand.VisitGenerataTaskList) { - var assignConfigList = await _subjectUserRepository.Where(t => t.TrialId == trialId && t.SubjectId == subjectVisit.SubjectId && t.OrignalSubjectUserId == null && t.IsConfirmed).Select(u => new { u.DoctorUserId, u.ArmEnum }).ToListAsync(); - if (trialConfig.ReadingType == ReadingMethod.Double) + foreach (var trialReadingCriterionId in trialReadingCriterionIdList) { - //每个访视 根据项目配置生成任务 双审生成两个 - var task1 = await _visitTaskRepository.AddAsync(new VisitTask() + + + var assignConfigList = await _subjectUserRepository.Where(t => t.TrialId == trialId && t.TrialReadingCriterionId == trialReadingCriterionId && t.SubjectId == subjectVisit.SubjectId && t.OrignalSubjectUserId == null && t.IsConfirmed).Select(u => new { u.DoctorUserId, u.ArmEnum }).ToListAsync(); + + + if (trialConfig.ReadingType == ReadingMethod.Double) { - TrialId = trialId, - SubjectId = subjectVisit.SubjectId, - IsUrgent = subjectVisit.IsUrgent, - TaskBlindName = subjectVisit.BlindName, - TaskName = subjectVisit.VisitName, - VisitTaskNum = subjectVisit.VisitNum, - //CheckPassedTime = subjectVisit.CheckPassedTime, - ArmEnum = Arm.DoubleReadingArm1,//特殊 - Code = currentMaxCodeInt + 1, - SourceSubjectVisitId = subjectVisit.Id, - TaskCode = AppSettings.GetCodeStr(currentMaxCodeInt + 1, nameof(VisitTask)), - ReadingCategory = ReadingCategory.Visit - }); - - var task2 = await _visitTaskRepository.AddAsync(new VisitTask() - { - TrialId = trialId, - SubjectId = subjectVisit.SubjectId, - IsUrgent = subjectVisit.IsUrgent, - TaskBlindName = subjectVisit.BlindName, - TaskName = subjectVisit.VisitName, - VisitTaskNum = subjectVisit.VisitNum, - //CheckPassedTime = subjectVisit.CheckPassedTime, - ArmEnum = Arm.DoubleReadingArm2,//特殊 - Code = currentMaxCodeInt + 2, - SourceSubjectVisitId = subjectVisit.Id, - TaskCode = AppSettings.GetCodeStr(currentMaxCodeInt + 2, nameof(VisitTask)), - ReadingCategory = ReadingCategory.Visit - }); - - currentMaxCodeInt = currentMaxCodeInt + 2; - - _provider.Set($"{trialId}_{StaticData.CacheKey.TaskMaxCode}", currentMaxCodeInt, TimeSpan.FromMinutes(30)); - - - #region 分配 - if (isAssignSubjectToDoctor) - { - - - if (trialConfig.TaskAllocateObjEnum == TaskAllocateObj.Subject) + //每个访视 根据项目配置生成任务 双审生成两个 + var task1 = await _visitTaskRepository.AddAsync(new VisitTask() { - var allocateSubjectArmList = _visitTaskRepository.Where(t => t.SubjectId == subjectVisit.SubjectId && t.TrialId == trialId && t.DoctorUserId != null && t.ArmEnum != Arm.JudgeArm) - .Select(t => new { t.DoctorUserId, t.ArmEnum }).Distinct().ToList(); + TrialId = trialId, + SubjectId = subjectVisit.SubjectId, + IsUrgent = subjectVisit.IsUrgent, + TaskBlindName = subjectVisit.BlindName, + TaskName = subjectVisit.VisitName, + VisitTaskNum = subjectVisit.VisitNum, + //CheckPassedTime = subjectVisit.CheckPassedTime, + ArmEnum = Arm.DoubleReadingArm1,//特殊 + Code = currentMaxCodeInt + 1, + SourceSubjectVisitId = subjectVisit.Id, + TaskCode = AppSettings.GetCodeStr(currentMaxCodeInt + 1, nameof(VisitTask)), + ReadingCategory = ReadingCategory.Visit, + + TrialReadingCriterionId = trialReadingCriterionId + }); + + var task2 = await _visitTaskRepository.AddAsync(new VisitTask() + { + TrialId = trialId, + SubjectId = subjectVisit.SubjectId, + IsUrgent = subjectVisit.IsUrgent, + TaskBlindName = subjectVisit.BlindName, + TaskName = subjectVisit.VisitName, + VisitTaskNum = subjectVisit.VisitNum, + //CheckPassedTime = subjectVisit.CheckPassedTime, + ArmEnum = Arm.DoubleReadingArm2,//特殊 + Code = currentMaxCodeInt + 2, + SourceSubjectVisitId = subjectVisit.Id, + TaskCode = AppSettings.GetCodeStr(currentMaxCodeInt + 2, nameof(VisitTask)), + ReadingCategory = ReadingCategory.Visit, + + TrialReadingCriterionId = trialReadingCriterionId + }); + + currentMaxCodeInt = currentMaxCodeInt + 2; + + _provider.Set($"{trialId}_{StaticData.CacheKey.TaskMaxCode}", currentMaxCodeInt, TimeSpan.FromMinutes(30)); + #region 分配 + if (isAssignSubjectToDoctor) + { - //不是初次分配 直接分配给Subject 之前的医生 - if (allocateSubjectArmList.Count != 0) + + if (trialConfig.TaskAllocateObjEnum == TaskAllocateObj.Subject) { - #region 验证历史任务 + var allocateSubjectArmList = _visitTaskRepository.Where(t => t.TrialReadingCriterionId == trialReadingCriterionId && t.SubjectId == subjectVisit.SubjectId && t.TrialId == trialId && t.DoctorUserId != null && t.ArmEnum != Arm.JudgeArm) + .Select(t => new { t.DoctorUserId, t.ArmEnum }).Distinct().ToList(); - if (_taskAllocationRuleRepository.Where(t => t.TrialId == trialId && t.IsEnable).Count() < 2) + //当前任务没有分配医生,初次分配 + if (allocateSubjectArmList.Count == 0) { - throw new BusinessValidationFailedException("能参与读片的医生数量必须>=2,自动分配任务中止"); } - - - - if (!(assignConfigList.Any(t => t.ArmEnum == Arm.DoubleReadingArm1) && assignConfigList.Any(t => t.ArmEnum == Arm.DoubleReadingArm2))) + else { - throw new BusinessValidationFailedException("该受试者阅片医生未配置完成"); + #region 验证历史任务 停用影响体验 - } + //if (_taskAllocationRuleRepository.Where(t => t.TrialId == trialId && t.IsEnable).Count() < 2) + //{ + // throw new BusinessValidationFailedException("能参与读片的医生数量必须>=2,自动分配任务中止"); + //} + //if (!(assignConfigList.Any(t => t.ArmEnum == Arm.DoubleReadingArm1) && assignConfigList.Any(t => t.ArmEnum == Arm.DoubleReadingArm2))) + //{ + // throw new BusinessValidationFailedException("该受试者阅片医生未配置完成"); + //} - #endregion + #endregion - //并且配置了医生 - if (assignConfigList.Count > 0 && trialConfig.IsFollowVisitAutoAssign) - { - - #region 后续访视 未分配的进行再次分配,重置的或者失效的 需要重新生成新的任务 (PM 有序退回 或者PM 有序 申请重阅) - - - if (trialConfig.IsReadingTaskViewInOrder) + //并且配置了医生 + if (assignConfigList.Count > 0 && trialConfig.IsFollowVisitAutoAssign) { - //之前有回退的访视 那么当前访视一致性核查通过的时候,对后续访视不生成或者分配 当前访视生成但是不分配出去 - 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).OrderBy(t => t.VisitTaskNum).FirstOrDefaultAsync(); + #region 后续访视 未分配的进行再次分配,重置的或者失效的 需要重新生成新的任务 (PM 有序退回 或者PM 有序 申请重阅) - if (beforeBackVisitTask == null) + if (trialConfig.IsReadingTaskViewInOrder) { - #region 访视2 PM 回退 基线回退 访视2先一致性核查通过,生成访视2任务,但是不分配 + //之前有回退到影像上传的访视 那么当前访视一致性核查通过的时候,对后续访视不生成或者分配 当前访视生成但是不分配出去 - var defaultState = trialConfig.FollowVisitAutoAssignDefaultState == TaskAllocateDefaultState.InitAllocated ? TaskAllocationState.InitAllocated : TaskAllocationState.Allocated; + var beforeBackVisitTask = await _visitTaskRepository.Where(t => t.TrialId == trialId && t.TrialReadingCriterionId == trialReadingCriterionId && t.SubjectId == subjectVisit.SubjectId && t.VisitTaskNum < subjectVisit.VisitNum && t.ReadingCategory == ReadingCategory.Visit && t.SourceSubjectVisit.CheckState != CheckStateEnum.CVPassed).OrderBy(t => t.VisitTaskNum).FirstOrDefaultAsync(); - task1.TaskAllocationState = defaultState; - task2.TaskAllocationState = defaultState; + //之前有回退的,那么当前访视任务生成但是不分配 + if (beforeBackVisitTask != null) + { + //不用进行额外处理 - //分配给对应Arm的人 - task1.DoctorUserId = assignConfigList.FirstOrDefault(t => t.ArmEnum == Arm.DoubleReadingArm1).DoctorUserId; - task2.DoctorUserId = assignConfigList.FirstOrDefault(t => t.ArmEnum == Arm.DoubleReadingArm2).DoctorUserId; + //访视2 PM 回退 基线回退 访视2先一致性核查通过,生成访视2任务,但是不分配 + } + else + { + #region 当前访视根据配置规则分配出去 - task1.AllocateTime = DateTime.Now; - task2.AllocateTime = DateTime.Now; + var defaultState = trialConfig.FollowVisitAutoAssignDefaultState == TaskAllocateDefaultState.InitAllocated ? TaskAllocationState.InitAllocated : TaskAllocationState.Allocated; - task1.SuggesteFinishedTime = DateTime.Now.AddDays(7); - task2.SuggesteFinishedTime = DateTime.Now.AddDays(7); + if (assignConfigList.Any(t => t.ArmEnum == Arm.DoubleReadingArm1)) + { + task1.TaskAllocationState = defaultState; + //分配给对应Arm的人 + task1.DoctorUserId = assignConfigList.FirstOrDefault(t => t.ArmEnum == Arm.DoubleReadingArm1).DoctorUserId; + task1.AllocateTime = DateTime.Now; - #endregion + task1.SuggesteFinishedTime = DateTime.Now.AddDays(7); + } + if (assignConfigList.Any(t => t.ArmEnum == Arm.DoubleReadingArm2)) + { + task2.TaskAllocationState = defaultState; + task2.DoctorUserId = assignConfigList.FirstOrDefault(t => t.ArmEnum == Arm.DoubleReadingArm2).DoctorUserId; + task2.AllocateTime = DateTime.Now; + task2.SuggesteFinishedTime = DateTime.Now.AddDays(7); + } - var followBackVisitTask = await _visitTaskRepository.Where(t => t.TrialId == trialId && t.SubjectId == subjectVisit.SubjectId && t.VisitTaskNum > subjectVisit.VisitNum && t.ReadingCategory == ReadingCategory.Visit && t.SourceSubjectVisit.CheckState != CheckStateEnum.CVPassed).OrderBy(t => t.VisitTaskNum).FirstOrDefaultAsync(); + #endregion + } + + var followBackVisitTask = await _visitTaskRepository.Where(t => t.TrialId == trialId && t.TrialReadingCriterionId == trialReadingCriterionId && t.SubjectId == subjectVisit.SubjectId && t.VisitTaskNum > subjectVisit.VisitNum && t.ReadingCategory == ReadingCategory.Visit && t.SourceSubjectVisit.CheckState != CheckStateEnum.CVPassed).OrderBy(t => t.VisitTaskNum).FirstOrDefaultAsync(); //存在退回访视1 又退回基线 这种情况 生成任务 考虑基线先一致性核查通过,但是访视1还未通过时 生成任务 var followVisitTaskList = await _visitTaskRepository - .Where(t => t.TrialId == trialId && t.SubjectId == subjectVisit.SubjectId && t.VisitTaskNum > subjectVisit.VisitNum && t.SourceSubjectVisit.CheckState == CheckStateEnum.CVPassed && t.ReadingCategory == ReadingCategory.Visit && t.IsAnalysisCreate == false, true) + .Where(t => t.TrialId == trialId && t.TrialReadingCriterionId == trialReadingCriterionId && t.SubjectId == subjectVisit.SubjectId && t.VisitTaskNum > subjectVisit.VisitNum && t.SourceSubjectVisit.CheckState == CheckStateEnum.CVPassed && t.ReadingCategory == ReadingCategory.Visit && t.IsAnalysisCreate == false, true) .WhereIf(followBackVisitTask != null, t => t.VisitTaskNum < followBackVisitTask.VisitTaskNum) .ToListAsync(); var followVisitGroup = followVisitTaskList.GroupBy(t => t.VisitTaskNum); - //每个访视去判断 是分配还是生成 - - + //每个访视去判断 是分配还是生成(因为影响哪里有些是取消分配,有些是重阅重置) foreach (var visitGroup in followVisitGroup) { @@ -256,6 +278,7 @@ namespace IRaCIS.Core.Application.Service AllocateTime = DateTime.Now, DoctorUserId = task1.DoctorUserId, SuggesteFinishedTime = DateTime.Now.AddDays(7), + TrialReadingCriterionId = latestTask.TrialReadingCriterionId }); currentMaxCodeInt = currentMaxCodeInt + 1; @@ -300,6 +323,8 @@ namespace IRaCIS.Core.Application.Service AllocateTime = DateTime.Now, DoctorUserId = task2.DoctorUserId, SuggesteFinishedTime = DateTime.Now.AddDays(7), + + TrialReadingCriterionId = latestTask.TrialReadingCriterionId }); currentMaxCodeInt = currentMaxCodeInt + 1; @@ -308,129 +333,210 @@ namespace IRaCIS.Core.Application.Service } } + } - //之前有回退的 后续访视不生成或者分配 当前访视生成但是不分配出去 + //无序的时候 生成任务并分配出去 else { - //不用进行额外处理 + var defaultState = trialConfig.FollowVisitAutoAssignDefaultState == TaskAllocateDefaultState.InitAllocated ? TaskAllocationState.InitAllocated : TaskAllocationState.Allocated; + + if (assignConfigList.Any(t => t.ArmEnum == Arm.DoubleReadingArm1)) + { + task1.TaskAllocationState = defaultState; + //分配给对应Arm的人 + task1.DoctorUserId = assignConfigList.FirstOrDefault(t => t.ArmEnum == Arm.DoubleReadingArm1).DoctorUserId; + task1.AllocateTime = DateTime.Now; + + task1.SuggesteFinishedTime = DateTime.Now.AddDays(7); + } + + if (assignConfigList.Any(t => t.ArmEnum == Arm.DoubleReadingArm2)) + { + task2.TaskAllocationState = defaultState; + task2.DoctorUserId = assignConfigList.FirstOrDefault(t => t.ArmEnum == Arm.DoubleReadingArm2).DoctorUserId; + task2.AllocateTime = DateTime.Now; + task2.SuggesteFinishedTime = DateTime.Now.AddDays(7); + } + } + #endregion } - //无序的时候 生成任务并分配出去 else + //后续访视不自动分配,或者配置的医生数量不足,就不进行分配 { - var defaultState = trialConfig.FollowVisitAutoAssignDefaultState == TaskAllocateDefaultState.InitAllocated ? TaskAllocationState.InitAllocated : TaskAllocationState.Allocated; - task1.TaskAllocationState = defaultState; - task2.TaskAllocationState = defaultState; - - //分配给对应Arm的人 - task1.DoctorUserId = assignConfigList.FirstOrDefault(t => t.ArmEnum == Arm.DoubleReadingArm1).DoctorUserId; - task2.DoctorUserId = assignConfigList.FirstOrDefault(t => t.ArmEnum == Arm.DoubleReadingArm2).DoctorUserId; - - task1.AllocateTime = DateTime.Now; - task2.AllocateTime = DateTime.Now; - - task1.SuggesteFinishedTime = DateTime.Now.AddDays(7); - task2.SuggesteFinishedTime = DateTime.Now.AddDays(7); } - - #endregion - - } - else - //后续访视不自动分配,或者配置的医生数量不足,就不进行分配 - { - } + } - else - // 当前任务没有分配医生,初次分配 - { - //return; - } + + } - + #endregion } - #endregion - - } - else if (trialConfig.ReadingType == ReadingMethod.Single) - { - - - var singleTask = await _visitTaskRepository.AddAsync(new VisitTask() - { - TrialId = trialId, - SubjectId = subjectVisit.SubjectId, - IsUrgent = subjectVisit.IsUrgent, - TaskBlindName = subjectVisit.BlindName, - TaskName = subjectVisit.VisitName, - VisitTaskNum = subjectVisit.VisitNum, - //CheckPassedTime = subjectVisit.CheckPassedTime, - ArmEnum = Arm.SingleReadingArm, //特殊 - Code = currentMaxCodeInt + 1, - SourceSubjectVisitId = subjectVisit.Id, - TaskCode = AppSettings.GetCodeStr(currentMaxCodeInt + 1, nameof(VisitTask)), - ReadingCategory = ReadingCategory.Visit - }); - - - currentMaxCodeInt = currentMaxCodeInt + 1; - - _provider.Set($"{trialId}_{StaticData.CacheKey.TaskMaxCode}", currentMaxCodeInt, TimeSpan.FromMinutes(30)); - - #region 分配 - - if (isAssignSubjectToDoctor) + else if (trialConfig.ReadingType == ReadingMethod.Single) { - if (trialConfig.TaskAllocateObjEnum == TaskAllocateObj.Subject) + + var singleTask = await _visitTaskRepository.AddAsync(new VisitTask() + { + TrialId = trialId, + SubjectId = subjectVisit.SubjectId, + IsUrgent = subjectVisit.IsUrgent, + TaskBlindName = subjectVisit.BlindName, + TaskName = subjectVisit.VisitName, + VisitTaskNum = subjectVisit.VisitNum, + //CheckPassedTime = subjectVisit.CheckPassedTime, + ArmEnum = Arm.SingleReadingArm, //特殊 + Code = currentMaxCodeInt + 1, + SourceSubjectVisitId = subjectVisit.Id, + TaskCode = AppSettings.GetCodeStr(currentMaxCodeInt + 1, nameof(VisitTask)), + ReadingCategory = ReadingCategory.Visit, + TrialReadingCriterionId==trialReadingCriterionId + }); + + + currentMaxCodeInt = currentMaxCodeInt + 1; + + _provider.Set($"{trialId}_{StaticData.CacheKey.TaskMaxCode}", currentMaxCodeInt, TimeSpan.FromMinutes(30)); + + #region 分配 + + if (isAssignSubjectToDoctor) { - if (trialConfig.IsFollowVisitAutoAssign) + if (trialConfig.TaskAllocateObjEnum == TaskAllocateObj.Subject) { - - //该Subject 之前是否有已分配的 如果改变配置 可能会出现 一个Subject 分配的同一个医生 有的在Arm1 有的在Arm2 - var allocateSubjectArmList = _visitTaskRepository.Where(t => t.SubjectId == subjectVisit.SubjectId && t.TrialId == trialId && t.DoctorUserId != null && t.ArmEnum != Arm.JudgeArm) - .Select(t => new { t.DoctorUserId, t.ArmEnum }).Distinct().ToList(); - - //不是初次分配 - if (allocateSubjectArmList.Count != 0) + if (trialConfig.IsFollowVisitAutoAssign) { - if (_taskAllocationRuleRepository.Where(t => t.TrialId == trialId && t.IsEnable).Count() < 2) + + + //该Subject 之前是否有已分配的 如果改变配置 可能会出现 一个Subject 分配的同一个医生 有的在Arm1 有的在Arm2 + var allocateSubjectArmList = _visitTaskRepository.Where(t => t.SubjectId == subjectVisit.SubjectId && t.TrialId == trialId && t.DoctorUserId != null && t.ArmEnum != Arm.JudgeArm) + .Select(t => new { t.DoctorUserId, t.ArmEnum }).Distinct().ToList(); + + //不是初次分配 + if (allocateSubjectArmList.Count != 0) { - throw new BusinessValidationFailedException("能参与读片的医生数量必须>=2,自动分配任务中止"); - - //break; - } - - //配置了医生 - if (assignConfigList.Count > 0) - { - - - - #region 重阅/退回的时候,需要将取消分配的访视类型的 任务重新分配 - - - if (trialConfig.IsReadingTaskViewInOrder) + if (_taskAllocationRuleRepository.Where(t => t.TrialId == trialId && t.IsEnable).Count() < 2) { - //之前有回退的访视 那么当前访视一致性核查通过的时候,对后续访视不生成或者分配 当前访视生成但是不分配出去 + throw new BusinessValidationFailedException("能参与读片的医生数量必须>=2,自动分配任务中止"); - 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).OrderBy(t => t.VisitTaskNum).FirstOrDefaultAsync(); + //break; + } + + //配置了医生 + if (assignConfigList.Count > 0) + { - if (beforeBackVisitTask == null) + + #region 重阅/退回的时候,需要将取消分配的访视类型的 任务重新分配 + + + if (trialConfig.IsReadingTaskViewInOrder) { - #region 访视2 PM 回退 基线回退 访视2先一致性核查通过,生成访视2任务,但是不分配 + //之前有回退的访视 那么当前访视一致性核查通过的时候,对后续访视不生成或者分配 当前访视生成但是不分配出去 + 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).OrderBy(t => t.VisitTaskNum).FirstOrDefaultAsync(); + + + if (beforeBackVisitTask == null) + { + #region 访视2 PM 回退 基线回退 访视2先一致性核查通过,生成访视2任务,但是不分配 + + var defaultState = trialConfig.FollowVisitAutoAssignDefaultState == TaskAllocateDefaultState.InitAllocated ? TaskAllocationState.InitAllocated : TaskAllocationState.Allocated; + + singleTask.TaskAllocationState = defaultState; + + singleTask.DoctorUserId = assignConfigList.FirstOrDefault(t => t.ArmEnum == 0).DoctorUserId; + + singleTask.AllocateTime = DateTime.Now; + + singleTask.SuggesteFinishedTime = DateTime.Now.AddDays(7); + + #endregion + + + var followBackVisitTask = await _visitTaskRepository.Where(t => t.TrialId == trialId && t.SubjectId == subjectVisit.SubjectId && t.VisitTaskNum > subjectVisit.VisitNum && t.ReadingCategory == ReadingCategory.Visit && t.SourceSubjectVisit.CheckState != CheckStateEnum.CVPassed).OrderBy(t => t.VisitTaskNum).FirstOrDefaultAsync(); + + //存在退回访视1 又退回基线 这种情况 生成任务 考虑基线先一致性核查通过,但是访视1还未通过时 生成任务 + var followVisitTaskList = await _visitTaskRepository + .Where(t => t.TrialId == trialId && t.SubjectId == subjectVisit.SubjectId && t.VisitTaskNum > subjectVisit.VisitNum && t.SourceSubjectVisit.CheckState == CheckStateEnum.CVPassed && t.ReadingCategory == ReadingCategory.Visit && t.IsAnalysisCreate == false, true) + .WhereIf(followBackVisitTask != null, t => t.VisitTaskNum < followBackVisitTask.VisitTaskNum) + .ToListAsync(); + + var followVisitGroup = followVisitTaskList.GroupBy(t => t.VisitTaskNum); + + //每个访视去判断 是分配还是生成 + + + foreach (var visitGroup in followVisitGroup) + { + + var arm = visitGroup.FirstOrDefault(t => t.TaskState == TaskState.Effect && t.TaskAllocationState == TaskAllocationState.NotAllocate && t.DoctorUserId == null && t.ArmEnum == Arm.SingleReadingArm); + if (arm != null) + { + arm.TaskAllocationState = TaskAllocationState.Allocated; + arm.AllocateTime = DateTime.Now; + arm.DoctorUserId = singleTask.DoctorUserId; + arm.SuggesteFinishedTime = DateTime.Now.AddDays(7); + } + else + { + var latestTask = visitGroup.Where(t => t.ArmEnum == Arm.SingleReadingArm).OrderByDescending(t => t.CreateTime).First(); + + var taskOne = await _visitTaskRepository.AddAsync(new VisitTask() + { + TrialId = trialId, + SubjectId = subjectVisit.SubjectId, + IsUrgent = subjectVisit.IsUrgent, + ArmEnum = Arm.SingleReadingArm,//特殊 + Code = currentMaxCodeInt + 1, + TaskCode = AppSettings.GetCodeStr(currentMaxCodeInt + 1, nameof(VisitTask)), + ReadingCategory = ReadingCategory.Visit, + + SourceSubjectVisitId = latestTask.SourceSubjectVisitId, + VisitTaskNum = latestTask.VisitTaskNum, + TaskBlindName = latestTask.TaskBlindName, + TaskName = latestTask.TaskName, + + BlindSubjectCode = latestTask.BlindSubjectCode, + BlindTrialSiteCode = latestTask.BlindTrialSiteCode, + IsAnalysisCreate = latestTask.IsAnalysisCreate, + IsSelfAnalysis = latestTask.IsSelfAnalysis, + TaskAllocationState = TaskAllocationState.Allocated, + AllocateTime = DateTime.Now, + DoctorUserId = singleTask.DoctorUserId + }); + + currentMaxCodeInt = currentMaxCodeInt + 1; + + _provider.Set($"{trialId}_{StaticData.CacheKey.TaskMaxCode}", currentMaxCodeInt, TimeSpan.FromMinutes(30)); + } + + } + + } + //之前有回退的 后续访视不生成或者分配 当前访视生成但是不分配出去 + else + { + //不用进行额外处理 + } + + + + } + //无序的时候 生成任务并分配出去 + else + { var defaultState = trialConfig.FollowVisitAutoAssignDefaultState == TaskAllocateDefaultState.InitAllocated ? TaskAllocationState.InitAllocated : TaskAllocationState.Allocated; singleTask.TaskAllocationState = defaultState; @@ -441,116 +547,35 @@ namespace IRaCIS.Core.Application.Service singleTask.SuggesteFinishedTime = DateTime.Now.AddDays(7); - #endregion - - - var followBackVisitTask = await _visitTaskRepository.Where(t => t.TrialId == trialId && t.SubjectId == subjectVisit.SubjectId && t.VisitTaskNum > subjectVisit.VisitNum && t.ReadingCategory == ReadingCategory.Visit && t.SourceSubjectVisit.CheckState != CheckStateEnum.CVPassed).OrderBy(t => t.VisitTaskNum).FirstOrDefaultAsync(); - - //存在退回访视1 又退回基线 这种情况 生成任务 考虑基线先一致性核查通过,但是访视1还未通过时 生成任务 - var followVisitTaskList = await _visitTaskRepository - .Where(t => t.TrialId == trialId && t.SubjectId == subjectVisit.SubjectId && t.VisitTaskNum > subjectVisit.VisitNum && t.SourceSubjectVisit.CheckState == CheckStateEnum.CVPassed && t.ReadingCategory == ReadingCategory.Visit && t.IsAnalysisCreate == false, true) - .WhereIf(followBackVisitTask != null, t => t.VisitTaskNum < followBackVisitTask.VisitTaskNum) - .ToListAsync(); - - var followVisitGroup = followVisitTaskList.GroupBy(t => t.VisitTaskNum); - - //每个访视去判断 是分配还是生成 - - - foreach (var visitGroup in followVisitGroup) - { - - var arm = visitGroup.FirstOrDefault(t => t.TaskState == TaskState.Effect && t.TaskAllocationState == TaskAllocationState.NotAllocate && t.DoctorUserId == null && t.ArmEnum == Arm.SingleReadingArm); - if (arm != null) - { - arm.TaskAllocationState = TaskAllocationState.Allocated; - arm.AllocateTime = DateTime.Now; - arm.DoctorUserId = singleTask.DoctorUserId; - arm.SuggesteFinishedTime = DateTime.Now.AddDays(7); - } - else - { - var latestTask = visitGroup.Where(t => t.ArmEnum == Arm.SingleReadingArm).OrderByDescending(t => t.CreateTime).First(); - - var taskOne = await _visitTaskRepository.AddAsync(new VisitTask() - { - TrialId = trialId, - SubjectId = subjectVisit.SubjectId, - IsUrgent = subjectVisit.IsUrgent, - ArmEnum = Arm.SingleReadingArm,//特殊 - Code = currentMaxCodeInt + 1, - TaskCode = AppSettings.GetCodeStr(currentMaxCodeInt + 1, nameof(VisitTask)), - ReadingCategory = ReadingCategory.Visit, - - SourceSubjectVisitId = latestTask.SourceSubjectVisitId, - VisitTaskNum = latestTask.VisitTaskNum, - TaskBlindName = latestTask.TaskBlindName, - TaskName = latestTask.TaskName, - - BlindSubjectCode = latestTask.BlindSubjectCode, - BlindTrialSiteCode = latestTask.BlindTrialSiteCode, - IsAnalysisCreate = latestTask.IsAnalysisCreate, - IsSelfAnalysis = latestTask.IsSelfAnalysis, - TaskAllocationState = TaskAllocationState.Allocated, - AllocateTime = DateTime.Now, - DoctorUserId = singleTask.DoctorUserId - }); - - currentMaxCodeInt = currentMaxCodeInt + 1; - - _provider.Set($"{trialId}_{StaticData.CacheKey.TaskMaxCode}", currentMaxCodeInt, TimeSpan.FromMinutes(30)); - } - - } - - } - //之前有回退的 后续访视不生成或者分配 当前访视生成但是不分配出去 - else - { - //不用进行额外处理 } - + #endregion } - //无序的时候 生成任务并分配出去 - else - { - var defaultState = trialConfig.FollowVisitAutoAssignDefaultState == TaskAllocateDefaultState.InitAllocated ? TaskAllocationState.InitAllocated : TaskAllocationState.Allocated; - - singleTask.TaskAllocationState = defaultState; - - singleTask.DoctorUserId = assignConfigList.FirstOrDefault(t => t.ArmEnum == 0).DoctorUserId; - - singleTask.AllocateTime = DateTime.Now; - - singleTask.SuggesteFinishedTime = DateTime.Now.AddDays(7); - - } - - #endregion - } } - } - else - { - //后续Subect 不自动分配 不处理 - } + else + { + //后续Subect 不自动分配 不处理 + } + } + + } + #endregion } - #endregion } + await _subjectVisitRepository.BatchUpdateNoTrackingAsync(t => t.TrialId == trialId && t.Id == subjectVisit.Id, u => new SubjectVisit() { IsVisitTaskGenerated = true }); } break; @@ -577,7 +602,7 @@ namespace IRaCIS.Core.Application.Service var newTask = await _visitTaskRepository.AddAsync(new VisitTask() { - TrialReadingCriterionId=reReadingVisitTask.TrialReadingCriterionId, + TrialReadingCriterionId = reReadingVisitTask.TrialReadingCriterionId, TrialId = reReadingVisitTask.TrialId, SubjectId = reReadingVisitTask.SubjectId, @@ -600,7 +625,7 @@ namespace IRaCIS.Core.Application.Service BlindSubjectCode = reReadingVisitTask.BlindSubjectCode, BlindTrialSiteCode = reReadingVisitTask.BlindTrialSiteCode, - + // TaskAllocationState = reReadingVisitTask.TaskAllocationState, // AllocateTime = DateTime.Now, @@ -613,7 +638,7 @@ namespace IRaCIS.Core.Application.Service if (reReadingVisitTask.ReadingCategory == ReadingCategory.Judge) { - var judgeRecord = await _readingJudgeInfoRepository.Where(t => t.JudgeTaskId == reReadingVisitTask.Id).FirstOrDefaultAsync(); + var judgeRecord = await _readingJudgeInfoRepository.Where(t => t.JudgeTaskId == reReadingVisitTask.Id).FirstOrDefaultAsync(); var origenalTaskIdList = new Guid[] { judgeRecord.TaskIdOne, judgeRecord.TaskIdTwo }; @@ -675,7 +700,7 @@ namespace IRaCIS.Core.Application.Service IsAnalysisCreate = true, IsSelfAnalysis = true, - TrialReadingCriterionId=task.TrialReadingCriterionId, + TrialReadingCriterionId = task.TrialReadingCriterionId, }; await _visitTaskRepository.AddAsync(consistentTask); @@ -746,7 +771,7 @@ namespace IRaCIS.Core.Application.Service VisitTaskNum = firstTask.VisitTaskNum + ReadingCommon.TaskNumDic[ReadingCategory.Judge], TrialId = firstTask.TrialId, Code = currentMaxCodeInt + 1, - + SourceSubjectVisitId = firstTask.SourceSubjectVisitId, SouceReadModuleId = firstTask.SouceReadModuleId, TaskCode = AppSettings.GetCodeStr(currentMaxCodeInt + 1, nameof(VisitTask)),