From fafbf9fcea458418c11770ffaa3333e061a475ff Mon Sep 17 00:00:00 2001 From: "{872297557@qq.com}" <872297557@qq.com> Date: Thu, 12 Jan 2023 17:06:59 +0800 Subject: [PATCH] =?UTF-8?q?=E7=94=9F=E6=88=90=E4=BB=BB=E5=8A=A1=20=20?= =?UTF-8?q?=E7=BB=B4=E6=8A=A4IsClinicalDataSign?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Allocation/VisitTaskHelpeService.cs | 99 ++++++++++++++++--- .../Service/QC/QCOperationService.cs | 39 +++++++- 2 files changed, 125 insertions(+), 13 deletions(-) diff --git a/IRaCIS.Core.Application/Service/Allocation/VisitTaskHelpeService.cs b/IRaCIS.Core.Application/Service/Allocation/VisitTaskHelpeService.cs index f24f23665..b5e16a927 100644 --- a/IRaCIS.Core.Application/Service/Allocation/VisitTaskHelpeService.cs +++ b/IRaCIS.Core.Application/Service/Allocation/VisitTaskHelpeService.cs @@ -14,6 +14,7 @@ using IRaCIS.Core.Infrastructure; using AutoMapper; using MassTransit; using IRaCIS.Core.Infra.EFCore.Common; +using System.Linq.Expressions; namespace IRaCIS.Core.Application.Service { @@ -40,15 +41,17 @@ namespace IRaCIS.Core.Application.Service private readonly IRepository _trialReadingCriterionRepository; private readonly IRepository _trialClinicalDataSetRepository; - + private readonly IRepository _readingClinicalDataRepository; + public VisitTaskHelpeService(IRepository visitTaskRepository, IRepository subjectUserRepository, IRepository trialRepository, IEasyCachingProvider provider, IRepository subjectVisitRepository, IRepository readModuleRepository, IRepository readingJudgeInfoRepository, IRepository taskAllocationRuleRepository, IMapper mapper, IUserInfo userInfo, IRepository visitTaskReReadingRepository, - IRepository trialReadingCriterionRepository, IRepository trialClinicalDataSetRepository) + IRepository trialReadingCriterionRepository, IRepository trialClinicalDataSetRepository, IRepository readingClinicalDataRepository) { + _readingClinicalDataRepository = readingClinicalDataRepository; _trialClinicalDataSetRepository = trialClinicalDataSetRepository; _visitTaskRepository = visitTaskRepository; @@ -119,7 +122,8 @@ namespace IRaCIS.Core.Application.Service { var blindTaskName = string.Empty; - + var isNeedClinicalDataSign = IsNeedClinicalDataSign(ReadingCategory.Visit, subjectVisit.IsBaseLine, trialReadingCriterionConfig.CriterionType, clinicalDataConfirmList); + var isClinicalDataSign = IsClinicalDataSign(ReadingCategory.Visit, subjectVisit.IsBaseLine, trialReadingCriterionConfig.CriterionType, clinicalDataConfirmList, subjectVisit.Id, trialId); if (visitNumList.IndexOf(subjectVisit.VisitNum) == 0) { @@ -157,7 +161,8 @@ namespace IRaCIS.Core.Application.Service ReadingCategory = ReadingCategory.Visit, TrialReadingCriterionId = trialReadingCriterionConfig.TrialReadingCriterionId, - IsNeedClinicalDataSign = IsNeedClinicalDataSign(ReadingCategory.Visit, subjectVisit.IsBaseLine, trialReadingCriterionConfig.CriterionType, clinicalDataConfirmList) + IsNeedClinicalDataSign = isNeedClinicalDataSign, + IsClinicalDataSign = isClinicalDataSign }); var task2 = await _visitTaskRepository.AddAsync(new VisitTask() @@ -176,7 +181,8 @@ namespace IRaCIS.Core.Application.Service ReadingCategory = ReadingCategory.Visit, TrialReadingCriterionId = trialReadingCriterionConfig.TrialReadingCriterionId, - IsNeedClinicalDataSign = IsNeedClinicalDataSign(ReadingCategory.Visit, subjectVisit.IsBaseLine, trialReadingCriterionConfig.CriterionType, clinicalDataConfirmList) + IsNeedClinicalDataSign = isNeedClinicalDataSign, + IsClinicalDataSign = isClinicalDataSign }); currentMaxCodeInt = currentMaxCodeInt + 2; @@ -226,7 +232,8 @@ namespace IRaCIS.Core.Application.Service TaskCode = AppSettings.GetCodeStr(currentMaxCodeInt + 1, nameof(VisitTask)), ReadingCategory = ReadingCategory.Visit, TrialReadingCriterionId = trialReadingCriterionConfig.TrialReadingCriterionId, - IsNeedClinicalDataSign = IsNeedClinicalDataSign(ReadingCategory.Visit, subjectVisit.IsBaseLine, trialReadingCriterionConfig.CriterionType, clinicalDataConfirmList) + IsNeedClinicalDataSign = isNeedClinicalDataSign, + IsClinicalDataSign = isClinicalDataSign }); @@ -302,6 +309,65 @@ namespace IRaCIS.Core.Application.Service } + + // 有可能在任务生成之前 就签名完了临床数据 + private bool IsClinicalDataSign(ReadingCategory readingCategory, bool isbaseLine, CriterionType criterionType, List trialClinicalDataSetList,Guid readingId, Guid trialId) + { + var isClinicalDataSign = false; + + var needSignCount = 0; + + //CRC 的自动签名 不用管 只用处理PM的就好 + var haveSignedCount = _readingClinicalDataRepository + .Where(t => t.TrialId == trialId && t.IsSign && t.ReadingClinicalDataState == ReadingClinicalDataStatus.HaveSigned && t.ReadingId == readingId && t.ClinicalDataTrialSet.UploadRole == UploadRole.PM).Count(); + + //访视 + if (readingCategory == ReadingCategory.Visit) + { + if (isbaseLine) + { + //CRC 的自动签名 不用管 只用处理PM 的就好 + needSignCount = trialClinicalDataSetList.Where(t => t.CriterionEnumList.Any(c => c == (int)criterionType) && (t.ClinicalDataLevel == ClinicalLevel.Subject || t.ClinicalDataLevel == ClinicalLevel.SubjectVisit) && t.UploadRole == UploadRole.PM).Count(); + } + else + { + needSignCount = trialClinicalDataSetList.Where(t => t.CriterionEnumList.Any(c => c == (int)criterionType) && t.ClinicalDataLevel == ClinicalLevel.SubjectVisit && t.UploadRole == UploadRole.PM).Count(); + + } + } + + else if (readingCategory == ReadingCategory.Judge) + { + + } + //阅片期 + else if (readingCategory == ReadingCategory.Global) + { + needSignCount = trialClinicalDataSetList.Where(t => t.CriterionEnumList.Any(c => c == (int)criterionType) && t.ClinicalDataLevel == ClinicalLevel.ImageRead && t.UploadRole == UploadRole.PM).Count(); + + } + // 肿瘤学 + else if (readingCategory == ReadingCategory.Oncology) + { + return trialClinicalDataSetList.Any(t => t.CriterionEnumList.Any(c => c == (int)criterionType) && t.ClinicalDataLevel == ClinicalLevel.OncologyRead); + } + else + { + needSignCount = trialClinicalDataSetList.Where(t => t.CriterionEnumList.Any(c => c == (int)criterionType) && t.ClinicalDataLevel == ClinicalLevel.OncologyRead && t.UploadRole == UploadRole.PM).Count(); + } + + if (needSignCount == haveSignedCount && needSignCount != 0) + { + isClinicalDataSign = true; + + } + + return isClinicalDataSign; + } + + + + public async Task AddTaskAsync(GenerateTaskCommand generateTaskCommand) { @@ -346,6 +412,9 @@ namespace IRaCIS.Core.Application.Service var blindTaskName = string.Empty; + var isNeedClinicalDataSign = IsNeedClinicalDataSign(ReadingCategory.Visit, subjectVisit.IsBaseLine, trialReadingCriterionConfig.CriterionType, clinicalDataConfirmList); + var isClinicalDataSign = IsClinicalDataSign(ReadingCategory.Visit, subjectVisit.IsBaseLine, trialReadingCriterionConfig.CriterionType, clinicalDataConfirmList, subjectVisit.Id, trialId); + if (visitNumList.IndexOf(subjectVisit.VisitNum) == 0) { @@ -385,7 +454,8 @@ namespace IRaCIS.Core.Application.Service ReadingCategory = ReadingCategory.Visit, TrialReadingCriterionId = trialReadingCriterionConfig.TrialReadingCriterionId, - IsNeedClinicalDataSign = IsNeedClinicalDataSign(ReadingCategory.Visit, subjectVisit.IsBaseLine, trialReadingCriterionConfig.CriterionType, clinicalDataConfirmList) + IsNeedClinicalDataSign = isNeedClinicalDataSign, + IsClinicalDataSign = isClinicalDataSign }); ; var task2 = await _visitTaskRepository.AddAsync(new VisitTask() @@ -404,7 +474,8 @@ namespace IRaCIS.Core.Application.Service ReadingCategory = ReadingCategory.Visit, TrialReadingCriterionId = trialReadingCriterionConfig.TrialReadingCriterionId, - IsNeedClinicalDataSign = IsNeedClinicalDataSign(ReadingCategory.Visit, subjectVisit.IsBaseLine, trialReadingCriterionConfig.CriterionType, clinicalDataConfirmList) + IsNeedClinicalDataSign = isNeedClinicalDataSign, + IsClinicalDataSign=isClinicalDataSign }); currentMaxCodeInt = currentMaxCodeInt + 2; @@ -536,6 +607,7 @@ namespace IRaCIS.Core.Application.Service SuggesteFinishedTime = DateTime.Now.AddDays(7), TrialReadingCriterionId = latestTask.TrialReadingCriterionId, IsNeedClinicalDataSign = latestTask.IsNeedClinicalDataSign, + IsClinicalDataSign=latestTask.IsClinicalDataSign }); currentMaxCodeInt = currentMaxCodeInt + 1; @@ -592,6 +664,7 @@ namespace IRaCIS.Core.Application.Service TrialReadingCriterionId = latestTask.TrialReadingCriterionId, IsNeedClinicalDataSign = latestTask.IsNeedClinicalDataSign, + IsClinicalDataSign = latestTask.IsClinicalDataSign }); currentMaxCodeInt = currentMaxCodeInt + 1; @@ -669,7 +742,8 @@ namespace IRaCIS.Core.Application.Service ReadingCategory = ReadingCategory.Visit, TrialReadingCriterionId = trialReadingCriterionConfig.TrialReadingCriterionId, - IsNeedClinicalDataSign = IsNeedClinicalDataSign(ReadingCategory.Visit, subjectVisit.IsBaseLine, trialReadingCriterionConfig.CriterionType, clinicalDataConfirmList) + IsNeedClinicalDataSign = isNeedClinicalDataSign, + IsClinicalDataSign = isClinicalDataSign }); @@ -796,6 +870,7 @@ namespace IRaCIS.Core.Application.Service TrialReadingCriterionId = latestTask.TrialReadingCriterionId, IsNeedClinicalDataSign = latestTask.IsNeedClinicalDataSign, + IsClinicalDataSign = latestTask.IsClinicalDataSign }); @@ -1133,7 +1208,8 @@ namespace IRaCIS.Core.Application.Service ReadingCategory = item.ReadingCategory, TrialReadingCriterionId = originalTaskInfo.TrialReadingCriterionId, - IsNeedClinicalDataSign = IsNeedClinicalDataSign(ReadingCategory.Global, false, criterionType, clinicalDataConfirmList) + IsNeedClinicalDataSign = IsNeedClinicalDataSign(ReadingCategory.Global, false, criterionType, clinicalDataConfirmList), + IsClinicalDataSign=IsClinicalDataSign(ReadingCategory.Global, false, criterionType, clinicalDataConfirmList,item.ReadModuleId,trialId) }); currentMaxCodeInt = currentMaxCodeInt + 1; @@ -1180,7 +1256,8 @@ namespace IRaCIS.Core.Application.Service TrialReadingCriterionId = originalTaskInfo.TrialReadingCriterionId, - IsNeedClinicalDataSign = IsNeedClinicalDataSign(ReadingCategory.Oncology, false, criterionType, clinicalDataConfirmList) + IsNeedClinicalDataSign = IsNeedClinicalDataSign(ReadingCategory.Oncology, false, criterionType, clinicalDataConfirmList), + IsClinicalDataSign = IsClinicalDataSign(ReadingCategory.Oncology, false, criterionType, clinicalDataConfirmList, item.ReadModuleId, trialId) }); diff --git a/IRaCIS.Core.Application/Service/QC/QCOperationService.cs b/IRaCIS.Core.Application/Service/QC/QCOperationService.cs index e4a1b1000..4766e2aa8 100644 --- a/IRaCIS.Core.Application/Service/QC/QCOperationService.cs +++ b/IRaCIS.Core.Application/Service/QC/QCOperationService.cs @@ -1103,6 +1103,9 @@ namespace IRaCIS.Core.Application.Image.QA [Authorize(Policy = IRaCISPolicy.CRC)] public async Task CRCRequestToQC(CRCRequestToQCCommand cRCRequestToQCCommand) { + + var trialId = cRCRequestToQCCommand.TrialId; + var trialConfig = (await _trialRepository .Select(t => new { TrialId = t.Id, t.QCProcessEnum, t.IsImageConsistencyVerification, t.IsUrgent, t.IsHaveFirstGiveMedicineDate, t.ClinicalInformationTransmissionEnum }) .FirstOrDefaultAsync(t => t.TrialId == cRCRequestToQCCommand.TrialId)).IfNullThrowException(); @@ -1131,7 +1134,8 @@ namespace IRaCIS.Core.Application.Image.QA return ResponseOutput.NotOk("当前批量提交访视的影像数据,其中部分已由其他CRC提交。", 3, ApiResponseCodeEnum.NeedTips); } - + //获取确认的临床数据配置 + var clinicalDataConfirmList = _repository.Where(t => t.TrialId == trialId && t.IsConfirm).ToList(); // 别人未提交的 foreach (var dbSubjectVisit in dbSubjectVisitList) @@ -1144,8 +1148,37 @@ namespace IRaCIS.Core.Application.Image.QA } //基线 且配置了临床数据 - if (trialConfig.ClinicalInformationTransmissionEnum != 0 && dbSubjectVisit.IsBaseLine/*&&dbSubjectVisit.ClinicalDataSignUserId==null*/) + if (trialConfig.ClinicalInformationTransmissionEnum != 0 /*&& dbSubjectVisit.IsBaseLine*//*&&dbSubjectVisit.ClinicalDataSignUserId==null*/) { + + + ////找到需要确认的PDF 临床数据 如果没有CRC 没有上传 那么就添加一条没有文件的记录 + + //var crcNeedConfirmClinicalDataSetList = clinicalDataConfirmList.Where(t => t.UploadRole == UploadRole.CRC && t.ClinicalUploadType == ClinicalUploadType.PDF).ToList(); + + //// 找到CRC 已经自己添加的临床PDF数据文件 + + //var crcAddClinicalDataIdList = _readingClinicalDataRepository.Where(t => t.ReadingId == dbSubjectVisit.Id && t.ClinicalDataTrialSet.UploadRole == UploadRole.CRC && t.ClinicalDataTrialSet.ClinicalUploadType == ClinicalUploadType.PDF) + // .Select(t => new { t.ClinicalDataTrialSetId }).ToList(); + + //foreach (var crcNeedConfirmClinicalDataSet in crcNeedConfirmClinicalDataSetList) + //{ + // if (!crcAddClinicalDataIdList.Any(t => t.ClinicalDataTrialSetId == crcNeedConfirmClinicalDataSet.Id)) + // { + // await _repository.AddAsync(new ReadingClinicalData() + // { + // TrialId = dbSubjectVisit.TrialId, + // SubjectId = dbSubjectVisit.SubjectId, + // ReadingId = dbSubjectVisit.Id, + // ClinicalDataTrialSetId = crcNeedConfirmClinicalDataSet.Id, + // IsVisit = true, + // IsSign = true, + // ReadingClinicalDataState = ReadingClinicalDataStatus.HaveSigned + + // }); + // } + //} + //已确认临床数据完整性 dbSubjectVisit.IsConfirmedClinicalData = true; @@ -1158,6 +1191,8 @@ namespace IRaCIS.Core.Application.Image.QA ReadingClinicalDataState = ReadingClinicalDataStatus.HaveSigned }); + + //var signSuccess = await _repository.UpdateFromQueryAsync(t => t.Id == cRCRequestToQCCommand.SignId, u => new TrialSign() { IsCompleted = true });