From 9162f6ec9917ca291124be7a2df7c151de1618fb Mon Sep 17 00:00:00 2001 From: hang <872297557@qq.com> Date: Thu, 27 Jul 2023 09:23:13 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=B2=A1=E7=94=A8?= =?UTF-8?q?=E7=9A=84=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Allocation/VisitTaskHelpeService.cs | 70 +------------------ .../SubjectVisitCheckPassedTrigger.cs | 47 ------------- 2 files changed, 1 insertion(+), 116 deletions(-) diff --git a/IRaCIS.Core.Application/Service/Allocation/VisitTaskHelpeService.cs b/IRaCIS.Core.Application/Service/Allocation/VisitTaskHelpeService.cs index 263f052c9..3052d46fd 100644 --- a/IRaCIS.Core.Application/Service/Allocation/VisitTaskHelpeService.cs +++ b/IRaCIS.Core.Application/Service/Allocation/VisitTaskHelpeService.cs @@ -715,36 +715,9 @@ namespace IRaCIS.Core.Application.Service _provider.Set($"{trialId}_{StaticData.CacheKey.TaskMaxCode}", currentMaxCodeInt, TimeSpan.FromMinutes(30)); - #region 分配 - if (isAssignSubjectToDoctor) - { - - - if (trialReadingCriterionConfig.TaskAllocateObjEnum == TaskAllocateObj.Subject) - { - var allocateSubjectArmList = _visitTaskRepository.Where(t => t.TrialReadingCriterionId == trialReadingCriterionConfig.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 (allocateSubjectArmList.Count == 0) - { - - } - else - { - - - } - - - } - - - } - #endregion } - else if (trialReadingCriterionConfig.ReadingType == ReadingMethod.Single) + if (trialReadingCriterionConfig.ReadingType == ReadingMethod.Single) { @@ -775,47 +748,6 @@ namespace IRaCIS.Core.Application.Service _provider.Set($"{trialId}_{StaticData.CacheKey.TaskMaxCode}", currentMaxCodeInt, TimeSpan.FromMinutes(30)); - #region 分配 - - if (isAssignSubjectToDoctor) - { - - if (trialReadingCriterionConfig.TaskAllocateObjEnum == TaskAllocateObj.Subject) - { - - if (trialReadingCriterionConfig.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) - //{ - // throw new BusinessValidationFailedException("能参与读片的医生数量必须>=2,自动分配任务中止"); - - //} - - - } - } - else - { - //后续Subect 不自动分配 不处理 - } - - - - - } - - - } - #endregion } diff --git a/IRaCIS.Core.Application/Triggers/SubjectVisitCheckPassedTrigger.cs b/IRaCIS.Core.Application/Triggers/SubjectVisitCheckPassedTrigger.cs index cfbe3ad5b..551e4d648 100644 --- a/IRaCIS.Core.Application/Triggers/SubjectVisitCheckPassedTrigger.cs +++ b/IRaCIS.Core.Application/Triggers/SubjectVisitCheckPassedTrigger.cs @@ -68,59 +68,12 @@ namespace IRaCIS.Core.Application.Triggers context.Entity.IsPMBackOrReReading = false; - //找到手动生成任务的标准 - var criterionList = await _trialReadingCriterionRepository.Where(t => t.IsAutoCreate == false && t.IsSigned == true).Select(t => new { t.Id, t.TrialId,t.IsReadingTaskViewInOrder }).ToListAsync(); - - foreach (var criterion in criterionList) - { - //if(!await _SubjectCriteriaEvaluationVisitFilterRepository.AnyAsync(t=>t.SubjectId==subjectVisit.SubjectId&& t.SubjectVisitId==subjectVisit.Id && t.TrialReadingCriterionId == criterion.Id)) - //{ - // await _SubjectCriteriaEvaluationVisitFilterRepository.AddAsync(new SubjectCriteriaEvaluationVisitFilter() { SubjectId = subjectVisit.SubjectId, SubjectVisitId = subjectVisit.Id, TrialReadingCriterionId = criterion.Id }); - //} - - - - - - - } - await _visitTaskHelpeService.GenerateVisitTaskAsync(subjectVisit.TrialId, new List() { subjectVisit.Id }, true); } } - // 触发临床数据 - //if (context.ChangeType == ChangeType.Added) - //{ - // var cRCClinicalDatas = await _clinicalDataTrialSetRepository.Where(x => x.TrialId == context.Entity.TrialId && x.UploadRole == UploadRole.CRC && x.IsConfirm) - // .Select(x => new - // { - // x.Id, - // x.ClinicalDataLevel, - // }).ToListAsync(); - - // List readingClinicals = new List(); - // readingClinicals.AddRange( - - // cRCClinicalDatas.WhereIf(!context.Entity.IsBaseLine, x => x.ClinicalDataLevel == ClinicalLevel.SubjectVisit).Select(x => new ReadingClinicalData() - // { - // ClinicalDataTrialSetId = x.Id, - // IsVisit = true, - // SubjectId = context.Entity.SubjectId, - // ReadingId = context.Entity.Id, - // TrialId = context.Entity.TrialId - - // }).ToList() - - // ); - - - // await _readingClinicalDataRepository.AddRangeAsync(readingClinicals); - // await _readingClinicalDataRepository.SaveChangesAsync(); - - //} } From 2bde5d1309da1711d814028b88519969770c9353 Mon Sep 17 00:00:00 2001 From: hang <872297557@qq.com> Date: Thu, 27 Jul 2023 09:38:41 +0800 Subject: [PATCH 2/3] =?UTF-8?q?=E6=9A=82=E5=AD=98=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Allocation/VisitTaskHelpeService.cs | 99 ++----------------- .../Service/Allocation/VisitTaskService.cs | 3 +- .../SubjectVisitCheckPassedTrigger.cs | 3 - 3 files changed, 10 insertions(+), 95 deletions(-) diff --git a/IRaCIS.Core.Application/Service/Allocation/VisitTaskHelpeService.cs b/IRaCIS.Core.Application/Service/Allocation/VisitTaskHelpeService.cs index 3052d46fd..cb5b2466f 100644 --- a/IRaCIS.Core.Application/Service/Allocation/VisitTaskHelpeService.cs +++ b/IRaCIS.Core.Application/Service/Allocation/VisitTaskHelpeService.cs @@ -421,11 +421,11 @@ namespace IRaCIS.Core.Application.Service .Where(t => t.TrialId == trialId && t.IsSign && t.ReadingClinicalDataState == ReadingClinicalDataStatus.HaveSigned && t.ReadingId == readingId && t.ClinicalDataTrialSet.UploadRole == UploadRole.PM).Count(); - var readModule = _readModuleRepository.Where(t => t.Id == readingId).FirstOrDefault(); + var readModule = _readModuleRepository.Where(t => t.Id == readingId).FirstOrDefault(); //CRC 阅片期自定义结构化录入是否签名 bool crcReadModuleSign = true; - + //访视 if (readingCategory == ReadingCategory.Visit) @@ -466,7 +466,7 @@ namespace IRaCIS.Core.Application.Service // 肿瘤学 else if (readingCategory == ReadingCategory.Oncology) { - needSignCount= trialClinicalDataSetList.Where(t => t.TrialClinicalDataSetCriteriaList.Any(c => c.TrialReadingCriterionId == trialReadingCriterionId) && t.ClinicalDataLevel == ClinicalLevel.OncologyRead && t.UploadRole == UploadRole.PM).Count(); + needSignCount = trialClinicalDataSetList.Where(t => t.TrialClinicalDataSetCriteriaList.Any(c => c.TrialReadingCriterionId == trialReadingCriterionId) && t.ClinicalDataLevel == ClinicalLevel.OncologyRead && t.UploadRole == UploadRole.PM).Count(); if (readModule != null) { // 不存在需要CRC上传的临床数据 或者 PM已确认 @@ -484,7 +484,7 @@ namespace IRaCIS.Core.Application.Service } //可能仅仅CRC 基线 没有PM - if (needSignCount == haveSignedCount && crcReadModuleSign ) + if (needSignCount == haveSignedCount && crcReadModuleSign) { isClinicalDataSign = true; @@ -606,18 +606,12 @@ namespace IRaCIS.Core.Application.Service var visitNumList = _subjectVisitRepository.Where(t => t.SubjectId == subjectGroup.SubjectId && t.IsLostVisit == false).OrderBy(t => t.VisitNum).Select(t => t.VisitNum).ToList(); - foreach (var trialReadingCriterionConfig in trialReadingCriterionConfigList) { - //var subjectCriteriaEvaluation = _subjectCriteriaEvaluationRepository.Where(t => t.TrialReadingCriterionId == trialReadingCriterionConfig.TrialReadingCriterionId && t.IsJoinEvaluation && t.SubjectId == subjectVisit.SubjectId).FirstOrDefault(); - - if (trialReadingCriterionConfig.IsAutoCreate == true /*|| (trialReadingCriterionConfig.IsAutoCreate == false && subjectCriteriaEvaluation != null && subjectCriteriaEvaluation?.IsJoinEvaluation == true)*/) - + if (trialReadingCriterionConfig.IsAutoCreate == true) { - //var assignConfigList = await _subjectUserRepository.Where(t => t.TrialId == trialId && t.TrialReadingCriterionId == trialReadingCriterionConfig.TrialReadingCriterionId && t.SubjectId == subjectVisit.SubjectId && t.OrignalSubjectUserId == null && t.IsConfirmed).Select(u => new { u.DoctorUserId, u.ArmEnum }).ToListAsync(); - var blindTaskName = string.Empty; @@ -642,82 +636,7 @@ namespace IRaCIS.Core.Application.Service } - //每个访视 根据项目配置生成任务 双审生成两个 - - //双重 可能有一个人的任务没分配,然后影像回退不会影响未分配的任务,所以生成的时候 要进行判断 不能每次都生成两个 - if (trialReadingCriterionConfig.ReadingType == ReadingMethod.Double) - { - - var existCurrentVisitTaskList = _visitTaskRepository.Where(t => t.TrialId == trialId && t.SubjectId == subjectVisit.SubjectId - && t.TrialReadingCriterionId == trialReadingCriterionConfig.TrialReadingCriterionId && t.TaskState == TaskState.Effect - && t.TaskAllocationState == TaskAllocationState.NotAllocate && t.DoctorUserId == null && t.SourceSubjectVisitId == subjectVisit.Id).ToList(); - - VisitTask? task1 = null; - VisitTask? task2 = null; - - - if (!existCurrentVisitTaskList.Any(t => t.ArmEnum == Arm.DoubleReadingArm1)) - { - currentMaxCodeInt = currentMaxCodeInt + 1; - - task1 = await _visitTaskRepository.AddAsync(new VisitTask() - { - TrialId = trialId, - SubjectId = subjectVisit.SubjectId, - TaskBlindName = blindTaskName, - - IsUrgent = subjectVisit.IsUrgent, - TaskUrgentType = taskUrgentType, - IsCanEditUrgentState = isCanEditUrgentState, - TaskName = subjectVisit.VisitName, - VisitTaskNum = subjectVisit.VisitNum, - //CheckPassedTime = subjectVisit.CheckPassedTime, - ArmEnum = Arm.DoubleReadingArm1,//特殊 - Code = currentMaxCodeInt, - SourceSubjectVisitId = subjectVisit.Id, - TaskCode = AppSettings.GetCodeStr(currentMaxCodeInt, nameof(VisitTask)), - ReadingCategory = ReadingCategory.Visit, - - TrialReadingCriterionId = trialReadingCriterionConfig.TrialReadingCriterionId, - IsNeedClinicalDataSign = isNeedClinicalDataSign, - IsClinicalDataSign = isClinicalDataSign - }); - } - - if (!existCurrentVisitTaskList.Any(t => t.ArmEnum == Arm.DoubleReadingArm2)) - { - currentMaxCodeInt = currentMaxCodeInt + 1; - task2 = await _visitTaskRepository.AddAsync(new VisitTask() - { - TrialId = trialId, - SubjectId = subjectVisit.SubjectId, - TaskBlindName = blindTaskName, - TaskName = subjectVisit.VisitName, - IsUrgent = subjectVisit.IsUrgent, - - TaskUrgentType = taskUrgentType, - IsCanEditUrgentState = isCanEditUrgentState, - VisitTaskNum = subjectVisit.VisitNum, - //CheckPassedTime = subjectVisit.CheckPassedTime, - ArmEnum = Arm.DoubleReadingArm2,//特殊 - Code = currentMaxCodeInt, - SourceSubjectVisitId = subjectVisit.Id, - TaskCode = AppSettings.GetCodeStr(currentMaxCodeInt, nameof(VisitTask)), - ReadingCategory = ReadingCategory.Visit, - - TrialReadingCriterionId = trialReadingCriterionConfig.TrialReadingCriterionId, - IsNeedClinicalDataSign = isNeedClinicalDataSign, - IsClinicalDataSign = isClinicalDataSign - }); - } - - - _provider.Set($"{trialId}_{StaticData.CacheKey.TaskMaxCode}", currentMaxCodeInt, TimeSpan.FromMinutes(30)); - - - - } - if (trialReadingCriterionConfig.ReadingType == ReadingMethod.Single) + if (trialReadingCriterionConfig.ReadingType == ReadingMethod.Single) { @@ -983,7 +902,7 @@ namespace IRaCIS.Core.Application.Service case GenerateTaskCategory.Judge: var firstTask = await _visitTaskRepository.Where(x => generateTaskCommand.JudgeVisitTaskIdList.Contains(x.Id)).FirstOrDefaultAsync(); - + VisitTask visitTask = new VisitTask() { @@ -1084,7 +1003,7 @@ namespace IRaCIS.Core.Application.Service foreach (var item in generateTaskCommand.ReadingGenerataTaskList) { - + item.VisitNum = await _readModuleRepository.Where(x => x.Id == item.ReadModuleId).Select(x => x.SubjectVisit.VisitNum).FirstOrDefaultAsync(); @@ -1103,7 +1022,7 @@ namespace IRaCIS.Core.Application.Service SouceReadModuleId = item.ReadModuleId, TaskBlindName = item.ReadingName, - + TaskCode = AppSettings.GetCodeStr(currentMaxCodeInt + 1, nameof(VisitTask)), ReadingCategory = item.ReadingCategory, diff --git a/IRaCIS.Core.Application/Service/Allocation/VisitTaskService.cs b/IRaCIS.Core.Application/Service/Allocation/VisitTaskService.cs index 763866a32..a70e5a2c8 100644 --- a/IRaCIS.Core.Application/Service/Allocation/VisitTaskService.cs +++ b/IRaCIS.Core.Application/Service/Allocation/VisitTaskService.cs @@ -1396,7 +1396,6 @@ namespace IRaCIS.Core.Application.Service.Allocation public async Task PMSetTaskBack(Guid trialId, Guid taskId) { - //var trialConfig = (await _trialRepository.Where(t => t.Id == trialId).Select(t => new { TrialId = t.Id, t.IsReadingTaskViewInOrder, t.ReadingType }).FirstOrDefaultAsync()).IfNullThrowException(); var task = (await _visitTaskRepository.Where(t => t.Id == taskId).FirstOrDefaultAsync()).IfNullThrowException(); @@ -1429,7 +1428,7 @@ namespace IRaCIS.Core.Application.Service.Allocation return ResponseOutput.NotOk(_localizer["VisitTask_ConsistencyTaskCannotBeReturned"]); } - Expression> filterExpression = t => t.TrialId == trialId && t.SubjectId == task.SubjectId && (t.TaskState == TaskState.Effect || t.TaskState == TaskState.Freeze) /*&& t.TaskAllocationState == TaskAllocationState.Allocated*/; + Expression> filterExpression = t => t.TrialId == trialId && t.SubjectId == task.SubjectId && (t.TaskState == TaskState.Effect || t.TaskState == TaskState.Freeze); if (criterionConfig.CriterionType == CriterionType.RECIST1Point1 && criterionConfig.IsAdditionalAssessment) diff --git a/IRaCIS.Core.Application/Triggers/SubjectVisitCheckPassedTrigger.cs b/IRaCIS.Core.Application/Triggers/SubjectVisitCheckPassedTrigger.cs index 551e4d648..334acc33e 100644 --- a/IRaCIS.Core.Application/Triggers/SubjectVisitCheckPassedTrigger.cs +++ b/IRaCIS.Core.Application/Triggers/SubjectVisitCheckPassedTrigger.cs @@ -26,9 +26,6 @@ namespace IRaCIS.Core.Application.Triggers - - - public SubjectVisitCheckPassedTrigger(IRepository subjectRepository, IRepository clinicalDataTrialSetRepository, IRepository readingClinicalDataRepository, From 9bfca250442469e0348e67c3a1b5224ddbc020d6 Mon Sep 17 00:00:00 2001 From: hang <872297557@qq.com> Date: Thu, 27 Jul 2023 09:50:44 +0800 Subject: [PATCH 3/3] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E9=80=80=E5=9B=9E?= =?UTF-8?q?=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Allocation/VisitTaskHelpeService.cs | 105 ++++++++++++++++++ 1 file changed, 105 insertions(+) diff --git a/IRaCIS.Core.Application/Service/Allocation/VisitTaskHelpeService.cs b/IRaCIS.Core.Application/Service/Allocation/VisitTaskHelpeService.cs index cb5b2466f..c4b6776aa 100644 --- a/IRaCIS.Core.Application/Service/Allocation/VisitTaskHelpeService.cs +++ b/IRaCIS.Core.Application/Service/Allocation/VisitTaskHelpeService.cs @@ -669,6 +669,111 @@ namespace IRaCIS.Core.Application.Service + + + + #region 重阅/退回的时候,需要后续任务生成 + + if (trialReadingCriterionConfig.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 && t.SourceSubjectVisit.IsLostVisit == false).OrderBy(t => t.VisitTaskNum).FirstOrDefaultAsync(); + + + if (beforeBackVisitTask == null) + { + + singleTask.SuggesteFinishedTime = GetSuggessFinishTime(true, UrgentType.NotUrget); + + + 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 && t.SourceSubjectVisit.IsLostVisit == false).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) + { + //如果后续访视已分配有效 就不用处理 + if (visitGroup.Any(t => t.TaskState == TaskState.Effect && t.ArmEnum == Arm.SingleReadingArm)) + { + //不做处理 + } + + else + { + var arm = visitGroup.FirstOrDefault(t => t.TaskState == TaskState.Effect && t.DoctorUserId == null && t.ArmEnum == Arm.SingleReadingArm); + if (arm != null) + { + + arm.SuggesteFinishedTime = GetSuggessFinishTime(true, UrgentType.NotUrget); + } + 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, + TaskUrgentType = latestTask.TaskUrgentType, + SourceSubjectVisitId = latestTask.SourceSubjectVisitId, + VisitTaskNum = latestTask.VisitTaskNum, + TaskBlindName = visitBlindConfig.BlindFollowUpPrefix + " " + visitNumList.IndexOf(latestTask.VisitTaskNum), + TaskName = latestTask.TaskName, + + BlindSubjectCode = latestTask.BlindSubjectCode, + BlindTrialSiteCode = latestTask.BlindTrialSiteCode, + IsAnalysisCreate = latestTask.IsAnalysisCreate, + IsSelfAnalysis = latestTask.IsSelfAnalysis, + + + SuggesteFinishedTime = GetSuggessFinishTime(true, UrgentType.NotUrget), + + TrialReadingCriterionId = latestTask.TrialReadingCriterionId, + IsNeedClinicalDataSign = latestTask.IsNeedClinicalDataSign, + IsClinicalDataSign = latestTask.IsClinicalDataSign + + }); + + currentMaxCodeInt = currentMaxCodeInt + 1; + + _provider.Set($"{trialId}_{StaticData.CacheKey.TaskMaxCode}", currentMaxCodeInt, TimeSpan.FromMinutes(30)); + } + } + + + } + + } + + + + + } + + + #endregion + + + + + + + + } }