修改一致性核查后,增加标准 任务生成逻辑
parent
ab9bb015cd
commit
a81a66ee1b
|
@ -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();
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
@ -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,
|
||||
|
@ -675,7 +700,7 @@ namespace IRaCIS.Core.Application.Service
|
|||
IsAnalysisCreate = true,
|
||||
IsSelfAnalysis = true,
|
||||
|
||||
TrialReadingCriterionId=task.TrialReadingCriterionId,
|
||||
TrialReadingCriterionId = task.TrialReadingCriterionId,
|
||||
};
|
||||
|
||||
await _visitTaskRepository.AddAsync(consistentTask);
|
||||
|
|
Loading…
Reference in New Issue