修改一致性核查后,增加标准 任务生成逻辑
parent
ab9bb015cd
commit
a81a66ee1b
|
@ -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();
|
||||||
|
|
||||||
|
|
|
@ -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)),
|
||||||
|
|
Loading…
Reference in New Issue