From 088aa83fead5ecb15a7f18da3ba82c84b95bc6ee Mon Sep 17 00:00:00 2001 From: hang <872297557@qq.com> Date: Wed, 5 Jul 2023 14:36:43 +0800 Subject: [PATCH] =?UTF-8?q?=E9=87=8D=E9=98=85=E8=B7=9F=E8=B8=AA=E4=BF=AE?= =?UTF-8?q?=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Allocation/DTO/VisitTaskViewModel.cs | 4 ++ .../Service/Allocation/VisitTaskService.cs | 48 ++++++++++++++----- IRaCIS.Core.Domain/Allocation/VisitTask.cs | 28 +++++++++-- .../ReadingQuestionCriterionTrial.cs | 43 +++++++++++++++-- 4 files changed, 104 insertions(+), 19 deletions(-) diff --git a/IRaCIS.Core.Application/Service/Allocation/DTO/VisitTaskViewModel.cs b/IRaCIS.Core.Application/Service/Allocation/DTO/VisitTaskViewModel.cs index eb0a20540..b92e3efe9 100644 --- a/IRaCIS.Core.Application/Service/Allocation/DTO/VisitTaskViewModel.cs +++ b/IRaCIS.Core.Application/Service/Allocation/DTO/VisitTaskViewModel.cs @@ -60,6 +60,8 @@ namespace IRaCIS.Core.Application.ViewModel public bool IsPMSetBack { get; set; } + public PIAuditState PIAuditState { get; set; } + #region 标准配置 public Guid TrialReadingCriterionId { get; set; } @@ -380,6 +382,8 @@ namespace IRaCIS.Core.Application.ViewModel public RequestReReadingResult? RequestReReadingResultEnum { get; set; } + public PIAuditState? PIAuditState { get; set; } + } diff --git a/IRaCIS.Core.Application/Service/Allocation/VisitTaskService.cs b/IRaCIS.Core.Application/Service/Allocation/VisitTaskService.cs index cd1501d3f..803e20ff2 100644 --- a/IRaCIS.Core.Application/Service/Allocation/VisitTaskService.cs +++ b/IRaCIS.Core.Application/Service/Allocation/VisitTaskService.cs @@ -748,7 +748,8 @@ namespace IRaCIS.Core.Application.Service.Allocation .WhereIf(queryVisitTask.TaskAllocationState != null, t => t.TaskAllocationState == queryVisitTask.TaskAllocationState) .WhereIf(queryVisitTask.TrialReadingCriterionId != null, t => t.TrialReadingCriterionId == queryVisitTask.TrialReadingCriterionId) .WhereIf(queryVisitTask.ReReadingApplyState != null, t => t.ReReadingApplyState == queryVisitTask.ReReadingApplyState) - + .WhereIf(queryVisitTask.PIAuditState != null, t => t.PIAuditState == queryVisitTask.PIAuditState) + .WhereIf(queryVisitTask.CompleteClinicalDataEnum == CompleteClinicalDataEnum.Complete, t => t.IsClinicalDataSign && t.IsNeedClinicalDataSign == true) .WhereIf(queryVisitTask.CompleteClinicalDataEnum == CompleteClinicalDataEnum.NotComplete, t => t.IsClinicalDataSign == false && t.IsNeedClinicalDataSign == true) .WhereIf(queryVisitTask.CompleteClinicalDataEnum == CompleteClinicalDataEnum.NA, t => t.IsNeedClinicalDataSign == false) @@ -797,7 +798,7 @@ namespace IRaCIS.Core.Application.Service.Allocation .WhereIf(queryVisitTask.RequestReReadingResultEnum != null, t => t.RequestReReadingResultEnum == queryVisitTask.RequestReReadingResultEnum) - + .WhereIf(queryVisitTask.PIAuditState != null, t => t.OriginalReReadingTask.PIAuditState == queryVisitTask.PIAuditState) .WhereIf(!string.IsNullOrEmpty(queryVisitTask.TrialSiteCode), t => (t.OriginalReReadingTask.BlindTrialSiteCode.Contains(queryVisitTask.TrialSiteCode!) && t.OriginalReReadingTask.IsAnalysisCreate) || (t.OriginalReReadingTask.Subject.TrialSite.TrialSiteCode.Contains(queryVisitTask.TrialSiteCode!) && t.OriginalReReadingTask.IsAnalysisCreate == false)) .WhereIf(!string.IsNullOrEmpty(queryVisitTask.TaskName), t => t.OriginalReReadingTask.TaskName.Contains(queryVisitTask.TaskName) || t.OriginalReReadingTask.TaskBlindName.Contains(queryVisitTask.TaskName)) .WhereIf(!string.IsNullOrEmpty(queryVisitTask.SubjectCode), t => (t.OriginalReReadingTask.Subject.Code.Contains(queryVisitTask.SubjectCode) && t.OriginalReReadingTask.IsAnalysisCreate == false) || (t.OriginalReReadingTask.BlindSubjectCode.Contains(queryVisitTask.SubjectCode) && t.OriginalReReadingTask.IsAnalysisCreate)) @@ -1078,21 +1079,43 @@ namespace IRaCIS.Core.Application.Service.Allocation var critrion = await _trialReadingCriterionRepository.FindAsync(trialReadingCriterionId); + var readingDivisionEnum = critrion.ReadingDivisionEnum; - var visitQuery = _visitTaskRepository.Where(x => x.TrialId == inDto.TrialId && x.DoctorUserId == _userInfo.Id - && x.TaskState == TaskState.Effect /*&& x.TrialReadingCriterionId== inDto.TrialReadingCriterionId*/) + var piReadingScopenEnum= critrion.PIReadingScopenEnum; - //前序 不存在 未生成任务的访视 + var visitQuery = _visitTaskRepository + .Where(x => x.TrialId == inDto.TrialId && x.TaskState == TaskState.Effect) + + .WhereIf(_userInfo.UserTypeEnumInt == (int)UserTypeEnum.SR, t => t.Subject.TrialSite.CRCUserList.Any(u => u.UserId == _userInfo.Id)) + // 仅仅SR阅片 PI 没有任务列表 + .WhereIf( readingDivisionEnum== ReadingDivisionEnum.OnlySR && _userInfo.UserTypeEnumInt == (int)UserTypeEnum.PI , t=>t.TrialId==Guid.Empty) + + + .WhereIf(readingDivisionEnum == ReadingDivisionEnum.PIandSR && _userInfo.UserTypeEnumInt == (int)UserTypeEnum.PI && piReadingScopenEnum== PIReadingScopenEnum.AllBaseline, + t => t.SourceSubjectVisit.IsBaseLine ==true) + + //PI 阅片所有 + .WhereIf(readingDivisionEnum == ReadingDivisionEnum.PIandSR && _userInfo.UserTypeEnumInt == (int)UserTypeEnum.PI && piReadingScopenEnum == PIReadingScopenEnum.AllBaselineandVisit, + t => true) + + .WhereIf(readingDivisionEnum == ReadingDivisionEnum.PIandSR && _userInfo.UserTypeEnumInt == (int)UserTypeEnum.PI && piReadingScopenEnum == PIReadingScopenEnum.AllVisit, + t => t.SourceSubjectVisit.IsBaseLine == false) + + .WhereIf(readingDivisionEnum == ReadingDivisionEnum.PIandSR && _userInfo.UserTypeEnumInt == (int)UserTypeEnum.SR && piReadingScopenEnum == PIReadingScopenEnum.AllBaseline, + t => t.SourceSubjectVisit.IsBaseLine == false) + + //SR 不阅片 + .WhereIf(readingDivisionEnum == ReadingDivisionEnum.PIandSR && _userInfo.UserTypeEnumInt == (int)UserTypeEnum.SR && piReadingScopenEnum == PIReadingScopenEnum.AllBaselineandVisit, + t => t.TrialId == Guid.Empty) + + .WhereIf(readingDivisionEnum == ReadingDivisionEnum.PIandSR && _userInfo.UserTypeEnumInt == (int)UserTypeEnum.SR && piReadingScopenEnum == PIReadingScopenEnum.AllVisit, + t => t.SourceSubjectVisit.IsBaseLine == true) + + //前序 不存在 未生成任务的访视 .WhereIf(critrion.IsAutoCreate == false, t => !t.Subject.SubjectCriteriaEvaluationVisitFilterList.Where(t => t.TrialReadingCriterionId == trialReadingCriterionId).Any(f => f.IsGeneratedTask == false && t.VisitTaskNum > f.SubjectVisit.VisitNum) ) // 前序 不存在 未一致性核查未通过的 .Where( t=>! t.Subject.SubjectVisitList.Any(sv => sv.CheckState != CheckStateEnum.CVPassed && t.VisitTaskNum > sv.VisitNum)) - //.WhereIf(critrion.IsAutoCreate == false, t => t.Subject.SubjectCriteriaEvaluationVisitFilterList.Where(t => t.TrialReadingCriterionId == trialReadingCriterionId).Any(t => t.IsGeneratedTask == false) ? - //t.VisitTaskNum <= t.Subject.SubjectCriteriaEvaluationVisitFilterList.Where(t => t.TrialReadingCriterionId == trialReadingCriterionId && t.IsGeneratedTask == false).Min(t => t.SubjectVisit.VisitNum) : true) - //.Where(t => t.Subject.SubjectVisitList.Any(t => t.CheckState != CheckStateEnum.CVPassed) ? t.VisitTaskNum <= t.Subject.SubjectVisitList.Where(t => t.CheckState != CheckStateEnum.CVPassed).Min(t => t.VisitNum) : true) - //满足前序访视不存在 需要签署但是未签署 sql 相当复杂 同时想查询所有未读的统计数字 就无法统计 byzhouhang - //但是加字段 IsFrontTaskNeedSignButNotSign 那么签名临床数据的时候,要对该subject 该标准的有效的任务 这个字段需要在签名的时候维护 采取这种方式 统计数字灵活 - //.Where(t => t.Subject.SubjectVisitTaskList.AsQueryable().Where(visitTaskLambda).Any(c => c.IsNeedClinicalDataSign == true && c.IsClinicalDataSign == false && c.VisitTaskNum < t.VisitTaskNum)) .WhereIf(!string.IsNullOrEmpty(inDto.SubjectCode), t => (t.Subject.Code.Contains(inDto.SubjectCode) && t.IsAnalysisCreate == false) || (t.BlindSubjectCode.Contains(inDto.SubjectCode) && t.IsAnalysisCreate)); @@ -1110,8 +1133,7 @@ namespace IRaCIS.Core.Application.Service.Allocation //未读 里可读任务量 UnReadCanReadTaskCount = x.Where(y => y.TrialReadingCriterionId == trialReadingCriterionId && y.ReadingTaskState != ReadingTaskState.HaveSigned && y.IsFrontTaskNeedSignButNotSign == false && (y.IsNeedClinicalDataSign == false || y.IsClinicalDataSign == true) - //不能对包含聚合或子查询的表达式执行聚合函数 - //&& !x.Any(t => t.ReadingTaskState != ReadingTaskState.HaveSigned && t.IsNeedClinicalDataSign == true && t.IsClinicalDataSign == false && t.VisitTaskNum /// 首次阅片时间 @@ -326,7 +326,7 @@ namespace IRaCIS.Core.Domain.Models [Projectable] [JsonIgnore] - public bool IsConvertedTask => BeforeConvertedTaskId != null || IsHistoryConvertedTask|| Subject.SubjectVisitTaskList.Where(t => t.TrialReadingCriterionId == TrialReadingCriterionId + public bool IsConvertedTask => BeforeConvertedTaskId != null || IsHistoryConvertedTask || Subject.SubjectVisitTaskList.Where(t => t.TrialReadingCriterionId == TrialReadingCriterionId && t.DoctorUserId == DoctorUserId && t.BeforeConvertedTaskId != null && t.TaskState == TaskState.Effect && t.VisitTaskNum < VisitTaskNum @@ -376,7 +376,7 @@ namespace IRaCIS.Core.Domain.Models public Trial Trial { get; set; } - + public PIAuditState PIAuditState { get; set; } //影像质量 等等第一层级问题答案 @@ -427,4 +427,26 @@ namespace IRaCIS.Core.Domain.Models } } + + /// + /// PI 审核状态 + /// + public enum PIAuditState + { + + /// + /// PI未审核 + /// + PInotAutit = 0, + + /// + /// PI不认同 + /// + PIAgree = 1, + + /// + /// PI认同 + /// + PINotAgree = 2 + } } diff --git a/IRaCIS.Core.Domain/Reading/ReadingCriterion/ReadingQuestionCriterionTrial.cs b/IRaCIS.Core.Domain/Reading/ReadingCriterion/ReadingQuestionCriterionTrial.cs index 810ae0db0..19a937a5a 100644 --- a/IRaCIS.Core.Domain/Reading/ReadingCriterion/ReadingQuestionCriterionTrial.cs +++ b/IRaCIS.Core.Domain/Reading/ReadingCriterion/ReadingQuestionCriterionTrial.cs @@ -126,9 +126,9 @@ namespace IRaCIS.Core.Domain.Models public bool IseCRFShowInDicomReading { get; set; } = false; - public int ReadingDivisionEnum { get; set; } + public ReadingDivisionEnum ReadingDivisionEnum { get; set; } - public int PIReadingScopenEnum { get; set; } + public PIReadingScopenEnum PIReadingScopenEnum { get; set; } #region 阅片单元配置 新加 @@ -275,8 +275,45 @@ namespace IRaCIS.Core.Domain.Models } - + /// + /// 阅片分工 + /// + public enum ReadingDivisionEnum + { + + /// + /// 仅SR阅片 + /// + OnlySR = 1, + + /// + /// PI和SR + /// + PIandSR = 2 + } + + /// + /// PI阅片范围 + /// + public enum PIReadingScopenEnum + { + + /// + /// 全部基线 + /// + AllBaseline = 1, + + /// + /// 全部随访 + /// + AllVisit = 2, + + /// + /// 全部基线和随访 + /// + AllBaselineandVisit = 3 + } }