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

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<TrialReadingCriterionDto> TrialReadingCriterionList { get; set; }
public List<TrialCriterionReadingCategory> CriterionReadingCategoryList { 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 }) .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(); .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 IUserInfo _userInfo;
private readonly IRepository<VisitTaskReReading> _visitTaskReReadingRepository; private readonly IRepository<VisitTaskReReading> _visitTaskReReadingRepository;
private readonly IRepository<ReadingQuestionCriterionTrial> _trialReadingCriterionRepository;
public VisitTaskHelpeService(IRepository<VisitTask> visitTaskRepository, IRepository<SubjectUser> subjectUserRepository, IRepository<Trial> trialRepository, IEasyCachingProvider provider, public VisitTaskHelpeService(IRepository<VisitTask> visitTaskRepository, IRepository<SubjectUser> subjectUserRepository, IRepository<Trial> trialRepository, IEasyCachingProvider provider,
IRepository<SubjectVisit> subjectVisitRepository, IRepository<SubjectVisit> subjectVisitRepository,
IRepository<ReadingJudgeInfo> readingJudgeInfoRepository, 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; _visitTaskRepository = visitTaskRepository;
_trialRepository = trialRepository; _trialRepository = trialRepository;
@ -52,6 +54,8 @@ namespace IRaCIS.Core.Application.Service
_mapper = mapper; _mapper = mapper;
_userInfo = userInfo; _userInfo = userInfo;
_visitTaskReReadingRepository = visitTaskReReadingRepository; _visitTaskReReadingRepository = visitTaskReReadingRepository;
_trialReadingCriterionRepository = trialReadingCriterionRepository
} }
//查询列表的时候,一致性核查通过未产生任务的 自动产生任务 如果是一致性核查,那么还会自动分配 //查询列表的时候,一致性核查通过未产生任务的 自动产生任务 如果是一致性核查,那么还会自动分配
@ -79,6 +83,8 @@ namespace IRaCIS.Core.Application.Service
var trialId = generateTaskCommand.TrialId; var trialId = generateTaskCommand.TrialId;
var isAssignSubjectToDoctor = generateTaskCommand.IsAssignSubjectToDoctor; 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 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(); 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: case GenerateTaskCategory.Visit:
foreach (var subjectVisit in generateTaskCommand.VisitGenerataTaskList) 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, var task1 = await _visitTaskRepository.AddAsync(new VisitTask()
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<int>($"{trialId}_{StaticData.CacheKey.TaskMaxCode}", currentMaxCodeInt, TimeSpan.FromMinutes(30));
#region 分配
if (isAssignSubjectToDoctor)
{
if (trialConfig.TaskAllocateObjEnum == TaskAllocateObj.Subject)
{ {
var allocateSubjectArmList = _visitTaskRepository.Where(t => t.SubjectId == subjectVisit.SubjectId && t.TrialId == trialId && t.DoctorUserId != null && t.ArmEnum != Arm.JudgeArm) TrialId = trialId,
.Select(t => new { t.DoctorUserId, t.ArmEnum }).Distinct().ToList(); 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<int>($"{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,自动分配任务中止");
} }
else
if (!(assignConfigList.Any(t => t.ArmEnum == Arm.DoubleReadingArm1) && assignConfigList.Any(t => t.ArmEnum == Arm.DoubleReadingArm2)))
{ {
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) if (assignConfigList.Count > 0 && trialConfig.IsFollowVisitAutoAssign)
{
#region 后续访视 未分配的进行再次分配,重置的或者失效的 需要重新生成新的任务 (PM 有序退回 或者PM 有序 申请重阅)
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(); #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的人 //访视2 PM 回退 基线回退 访视2先一致性核查通过生成访视2任务但是不分配
task1.DoctorUserId = assignConfigList.FirstOrDefault(t => t.ArmEnum == Arm.DoubleReadingArm1).DoctorUserId; }
task2.DoctorUserId = assignConfigList.FirstOrDefault(t => t.ArmEnum == Arm.DoubleReadingArm2).DoctorUserId; else
{
#region 当前访视根据配置规则分配出去
task1.AllocateTime = DateTime.Now; var defaultState = trialConfig.FollowVisitAutoAssignDefaultState == TaskAllocateDefaultState.InitAllocated ? TaskAllocationState.InitAllocated : TaskAllocationState.Allocated;
task2.AllocateTime = DateTime.Now;
task1.SuggesteFinishedTime = DateTime.Now.AddDays(7); if (assignConfigList.Any(t => t.ArmEnum == Arm.DoubleReadingArm1))
task2.SuggesteFinishedTime = DateTime.Now.AddDays(7); {
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还未通过时 生成任务 //存在退回访视1 又退回基线 这种情况 生成任务 考虑基线先一致性核查通过但是访视1还未通过时 生成任务
var followVisitTaskList = await _visitTaskRepository 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) .WhereIf(followBackVisitTask != null, t => t.VisitTaskNum < followBackVisitTask.VisitTaskNum)
.ToListAsync(); .ToListAsync();
var followVisitGroup = followVisitTaskList.GroupBy(t => t.VisitTaskNum); var followVisitGroup = followVisitTaskList.GroupBy(t => t.VisitTaskNum);
//每个访视去判断 是分配还是生成 //每个访视去判断 是分配还是生成(因为影响哪里有些是取消分配,有些是重阅重置)
foreach (var visitGroup in followVisitGroup) foreach (var visitGroup in followVisitGroup)
{ {
@ -256,6 +278,7 @@ namespace IRaCIS.Core.Application.Service
AllocateTime = DateTime.Now, AllocateTime = DateTime.Now,
DoctorUserId = task1.DoctorUserId, DoctorUserId = task1.DoctorUserId,
SuggesteFinishedTime = DateTime.Now.AddDays(7), SuggesteFinishedTime = DateTime.Now.AddDays(7),
TrialReadingCriterionId = latestTask.TrialReadingCriterionId
}); });
currentMaxCodeInt = currentMaxCodeInt + 1; currentMaxCodeInt = currentMaxCodeInt + 1;
@ -300,6 +323,8 @@ namespace IRaCIS.Core.Application.Service
AllocateTime = DateTime.Now, AllocateTime = DateTime.Now,
DoctorUserId = task2.DoctorUserId, DoctorUserId = task2.DoctorUserId,
SuggesteFinishedTime = DateTime.Now.AddDays(7), SuggesteFinishedTime = DateTime.Now.AddDays(7),
TrialReadingCriterionId = latestTask.TrialReadingCriterionId
}); });
currentMaxCodeInt = currentMaxCodeInt + 1; currentMaxCodeInt = currentMaxCodeInt + 1;
@ -308,129 +333,210 @@ namespace IRaCIS.Core.Application.Service
} }
} }
} }
//之前有回退的 后续访视不生成或者分配 当前访视生成但是不分配出去 //无序的时候 生成任务并分配出去
else 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 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)
}
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<int>($"{trialId}_{StaticData.CacheKey.TaskMaxCode}", currentMaxCodeInt, TimeSpan.FromMinutes(30));
#region 分配
if (isAssignSubjectToDoctor)
{ {
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<int>($"{trialId}_{StaticData.CacheKey.TaskMaxCode}", currentMaxCodeInt, TimeSpan.FromMinutes(30));
#region 分配
if (isAssignSubjectToDoctor)
{ {
if (trialConfig.IsFollowVisitAutoAssign) if (trialConfig.TaskAllocateObjEnum == TaskAllocateObj.Subject)
{ {
if (trialConfig.IsFollowVisitAutoAssign)
//该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 (_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,自动分配任务中止"); if (_taskAllocationRuleRepository.Where(t => t.TrialId == trialId && t.IsEnable).Count() < 2)
//break;
}
//配置了医生
if (assignConfigList.Count > 0)
{
#region 重阅/退回的时候,需要将取消分配的访视类型的 任务重新分配
if (trialConfig.IsReadingTaskViewInOrder)
{ {
//之前有回退的访视 那么当前访视一致性核查通过的时候,对后续访视不生成或者分配 当前访视生成但是不分配出去 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<int>($"{trialId}_{StaticData.CacheKey.TaskMaxCode}", currentMaxCodeInt, TimeSpan.FromMinutes(30));
}
}
}
//之前有回退的 后续访视不生成或者分配 当前访视生成但是不分配出去
else
{
//不用进行额外处理
}
}
//无序的时候 生成任务并分配出去
else
{
var defaultState = trialConfig.FollowVisitAutoAssignDefaultState == TaskAllocateDefaultState.InitAllocated ? TaskAllocationState.InitAllocated : TaskAllocationState.Allocated; var defaultState = trialConfig.FollowVisitAutoAssignDefaultState == TaskAllocateDefaultState.InitAllocated ? TaskAllocationState.InitAllocated : TaskAllocationState.Allocated;
singleTask.TaskAllocationState = defaultState; singleTask.TaskAllocationState = defaultState;
@ -441,116 +547,35 @@ namespace IRaCIS.Core.Application.Service
singleTask.SuggesteFinishedTime = DateTime.Now.AddDays(7); 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<int>($"{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
else {
{ //后续Subect 不自动分配 不处理
//后续Subect 不自动分配 不处理 }
}
}
} }
#endregion
} }
#endregion
} }
await _subjectVisitRepository.BatchUpdateNoTrackingAsync(t => t.TrialId == trialId && t.Id == subjectVisit.Id, u => new SubjectVisit() { IsVisitTaskGenerated = true }); await _subjectVisitRepository.BatchUpdateNoTrackingAsync(t => t.TrialId == trialId && t.Id == subjectVisit.Id, u => new SubjectVisit() { IsVisitTaskGenerated = true });
} }
break; break;
@ -577,7 +602,7 @@ namespace IRaCIS.Core.Application.Service
var newTask = await _visitTaskRepository.AddAsync(new VisitTask() var newTask = await _visitTaskRepository.AddAsync(new VisitTask()
{ {
TrialReadingCriterionId=reReadingVisitTask.TrialReadingCriterionId, TrialReadingCriterionId = reReadingVisitTask.TrialReadingCriterionId,
TrialId = reReadingVisitTask.TrialId, TrialId = reReadingVisitTask.TrialId,
SubjectId = reReadingVisitTask.SubjectId, SubjectId = reReadingVisitTask.SubjectId,
@ -600,7 +625,7 @@ namespace IRaCIS.Core.Application.Service
BlindSubjectCode = reReadingVisitTask.BlindSubjectCode, BlindSubjectCode = reReadingVisitTask.BlindSubjectCode,
BlindTrialSiteCode = reReadingVisitTask.BlindTrialSiteCode, BlindTrialSiteCode = reReadingVisitTask.BlindTrialSiteCode,
// TaskAllocationState = reReadingVisitTask.TaskAllocationState, // TaskAllocationState = reReadingVisitTask.TaskAllocationState,
// AllocateTime = DateTime.Now, // AllocateTime = DateTime.Now,
@ -613,7 +638,7 @@ namespace IRaCIS.Core.Application.Service
if (reReadingVisitTask.ReadingCategory == ReadingCategory.Judge) 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 }; var origenalTaskIdList = new Guid[] { judgeRecord.TaskIdOne, judgeRecord.TaskIdTwo };
@ -675,7 +700,7 @@ namespace IRaCIS.Core.Application.Service
IsAnalysisCreate = true, IsAnalysisCreate = true,
IsSelfAnalysis = true, IsSelfAnalysis = true,
TrialReadingCriterionId=task.TrialReadingCriterionId, TrialReadingCriterionId = task.TrialReadingCriterionId,
}; };
await _visitTaskRepository.AddAsync(consistentTask); await _visitTaskRepository.AddAsync(consistentTask);
@ -746,7 +771,7 @@ namespace IRaCIS.Core.Application.Service
VisitTaskNum = firstTask.VisitTaskNum + ReadingCommon.TaskNumDic[ReadingCategory.Judge], VisitTaskNum = firstTask.VisitTaskNum + ReadingCommon.TaskNumDic[ReadingCategory.Judge],
TrialId = firstTask.TrialId, TrialId = firstTask.TrialId,
Code = currentMaxCodeInt + 1, Code = currentMaxCodeInt + 1,
SourceSubjectVisitId = firstTask.SourceSubjectVisitId, SourceSubjectVisitId = firstTask.SourceSubjectVisitId,
SouceReadModuleId = firstTask.SouceReadModuleId, SouceReadModuleId = firstTask.SouceReadModuleId,
TaskCode = AppSettings.GetCodeStr(currentMaxCodeInt + 1, nameof(VisitTask)), TaskCode = AppSettings.GetCodeStr(currentMaxCodeInt + 1, nameof(VisitTask)),