修改一致性核查后,增加标准 任务生成逻辑

Uat_Study
hang 2022-09-30 11:25:42 +08:00
parent ab9bb015cd
commit a81a66ee1b
2 changed files with 301 additions and 275 deletions

View File

@ -106,7 +106,8 @@ namespace IRaCIS.Core.Application.ViewModel
public List<TrialReadingCriterionDto> TrialReadingCriterionList { get; set; }
public List<TrialCriterionReadingCategory> CriterionReadingCategoryList { get; set; }
public List<CriterionReadingCategory> CriterionCategoryList => CriterionReadingCategoryList
public List<CriterionReadingCategory> 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();

View File

@ -36,11 +36,13 @@ namespace IRaCIS.Core.Application.Service
private readonly IUserInfo _userInfo;
private readonly IRepository<VisitTaskReReading> _visitTaskReReadingRepository;
private readonly IRepository<ReadingQuestionCriterionTrial> _trialReadingCriterionRepository;
public VisitTaskHelpeService(IRepository<VisitTask> visitTaskRepository, IRepository<SubjectUser> subjectUserRepository, IRepository<Trial> trialRepository, IEasyCachingProvider provider,
IRepository<SubjectVisit> subjectVisitRepository,
IRepository<ReadingJudgeInfo> readingJudgeInfoRepository,
IRepository<TaskAllocationRule> taskAllocationRuleRepository, IMapper mapper, IUserInfo userInfo, IRepository<VisitTaskReReading> visitTaskReReadingRepository)
IRepository<TaskAllocationRule> taskAllocationRuleRepository, IMapper mapper, IUserInfo userInfo, IRepository<VisitTaskReReading> visitTaskReReadingRepository, IRepository<ReadingQuestionCriterionTrial> 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,7 +98,13 @@ 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();
foreach (var trialReadingCriterionId in trialReadingCriterionIdList)
{
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)
@ -111,7 +123,9 @@ namespace IRaCIS.Core.Application.Service
Code = currentMaxCodeInt + 1,
SourceSubjectVisitId = subjectVisit.Id,
TaskCode = AppSettings.GetCodeStr(currentMaxCodeInt + 1, nameof(VisitTask)),
ReadingCategory = ReadingCategory.Visit
ReadingCategory = ReadingCategory.Visit,
TrialReadingCriterionId = trialReadingCriterionId
});
var task2 = await _visitTaskRepository.AddAsync(new VisitTask()
@ -127,7 +141,9 @@ namespace IRaCIS.Core.Application.Service
Code = currentMaxCodeInt + 2,
SourceSubjectVisitId = subjectVisit.Id,
TaskCode = AppSettings.GetCodeStr(currentMaxCodeInt + 2, nameof(VisitTask)),
ReadingCategory = ReadingCategory.Visit
ReadingCategory = ReadingCategory.Visit,
TrialReadingCriterionId = trialReadingCriterionId
});
currentMaxCodeInt = currentMaxCodeInt + 2;
@ -142,29 +158,26 @@ namespace IRaCIS.Core.Application.Service
if (trialConfig.TaskAllocateObjEnum == TaskAllocateObj.Subject)
{
var allocateSubjectArmList = _visitTaskRepository.Where(t => t.SubjectId == subjectVisit.SubjectId && t.TrialId == trialId && t.DoctorUserId != null && t.ArmEnum != Arm.JudgeArm)
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();
//不是初次分配 直接分配给Subject 之前的医生
if (allocateSubjectArmList.Count != 0)
//当前任务没有分配医生,初次分配
if (allocateSubjectArmList.Count == 0)
{
#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)))
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
@ -178,46 +191,55 @@ namespace IRaCIS.Core.Application.Service
if (trialConfig.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).OrderBy(t => t.VisitTaskNum).FirstOrDefaultAsync();
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();
if (beforeBackVisitTask == null)
//之前有回退的,那么当前访视任务生成但是不分配
if (beforeBackVisitTask != null)
{
#region 访视2 PM 回退 基线回退 访视2先一致性核查通过生成访视2任务但是不分配
//不用进行额外处理
//访视2 PM 回退 基线回退 访视2先一致性核查通过生成访视2任务但是不分配
}
else
{
#region 当前访视根据配置规则分配出去
var defaultState = trialConfig.FollowVisitAutoAssignDefaultState == TaskAllocateDefaultState.InitAllocated ? TaskAllocationState.InitAllocated : TaskAllocationState.Allocated;
if (assignConfigList.Any(t => t.ArmEnum == Arm.DoubleReadingArm1))
{
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);
}
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
}
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();
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,14 +333,6 @@ namespace IRaCIS.Core.Application.Service
}
}
}
//之前有回退的 后续访视不生成或者分配 当前访视生成但是不分配出去
else
{
//不用进行额外处理
}
}
//无序的时候 生成任务并分配出去
@ -323,20 +340,26 @@ namespace IRaCIS.Core.Application.Service
{
var defaultState = trialConfig.FollowVisitAutoAssignDefaultState == TaskAllocateDefaultState.InitAllocated ? TaskAllocationState.InitAllocated : TaskAllocationState.Allocated;
if (assignConfigList.Any(t => t.ArmEnum == Arm.DoubleReadingArm1))
{
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);
}
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
@ -348,11 +371,8 @@ namespace IRaCIS.Core.Application.Service
}
}
else
// 当前任务没有分配医生,初次分配
{
//return;
}
}
@ -377,7 +397,8 @@ namespace IRaCIS.Core.Application.Service
Code = currentMaxCodeInt + 1,
SourceSubjectVisitId = subjectVisit.Id,
TaskCode = AppSettings.GetCodeStr(currentMaxCodeInt + 1, nameof(VisitTask)),
ReadingCategory = ReadingCategory.Visit
ReadingCategory = ReadingCategory.Visit,
TrialReadingCriterionId==trialReadingCriterionId
});
@ -551,6 +572,10 @@ namespace IRaCIS.Core.Application.Service
}
}
await _subjectVisitRepository.BatchUpdateNoTrackingAsync(t => t.TrialId == trialId && t.Id == subjectVisit.Id, u => new SubjectVisit() { IsVisitTaskGenerated = true });
}
break;