diff --git a/IRaCIS.Core.Application/Service/Allocation/TaskConsistentRuleService.cs b/IRaCIS.Core.Application/Service/Allocation/TaskConsistentRuleService.cs index 332948c15..dbb8aa148 100644 --- a/IRaCIS.Core.Application/Service/Allocation/TaskConsistentRuleService.cs +++ b/IRaCIS.Core.Application/Service/Allocation/TaskConsistentRuleService.cs @@ -117,7 +117,7 @@ namespace IRaCIS.Core.Application.Service var pageList = await visitTaskQueryable.ToPagedListAsync(queryVisitTask.PageIndex, queryVisitTask.PageSize, queryVisitTask.SortField, queryVisitTask.Asc, string.IsNullOrWhiteSpace(queryVisitTask.SortField), defalutSortArray); - var trialTaskConfig = _repository.Where(t => t.Id == queryVisitTask.TrialId).Select(t => new { IsHaveDoubleReadCriterion=t.ReadingQuestionCriterionTrialList.Any(t=>t.IsSigned && t.IsConfirm && t.ReadingType==ReadingMethod.Double), t.VitrualSiteCode }).FirstOrDefault(); + var trialTaskConfig = _repository.Where(t => t.Id == queryVisitTask.TrialId).Select(t => new { IsHaveDoubleReadCriterion=t.TrialReadingCriterionList.Any(t=>t.IsSigned && t.IsConfirm && t.ReadingType==ReadingMethod.Double), t.VitrualSiteCode }).FirstOrDefault(); return ResponseOutput.Ok(pageList, trialTaskConfig); } diff --git a/IRaCIS.Core.Application/Service/Allocation/VisitTaskService.cs b/IRaCIS.Core.Application/Service/Allocation/VisitTaskService.cs index 6a11e4044..c67402eea 100644 --- a/IRaCIS.Core.Application/Service/Allocation/VisitTaskService.cs +++ b/IRaCIS.Core.Application/Service/Allocation/VisitTaskService.cs @@ -1152,7 +1152,7 @@ namespace IRaCIS.Core.Application.Service.Allocation else { - if (subjectId!=null && _visitTaskRepository.Any(t => t.SubjectId == subjectId && t.TrialReadingCriterionId == trialReadingCriterionId && t.TrialReadingCriterion.IsReadingTaskViewInOrder == ReadingOrder.SubjectRandom)) + if (subjectId != null) { //找到 非一致性分析,未签名,状态正常的 并且任务名称是TimePoint的 任务 var needDealTaskList = await _visitTaskRepository.Where(t => t.SubjectId == subjectId && t.TrialReadingCriterionId == trialReadingCriterionId && t.IsAnalysisCreate == false && t.DoctorUserId == _userInfo.Id diff --git a/IRaCIS.Core.Application/Service/Allocation/_MapConfig.cs b/IRaCIS.Core.Application/Service/Allocation/_MapConfig.cs index 70b90f3fa..d6fc8810b 100644 --- a/IRaCIS.Core.Application/Service/Allocation/_MapConfig.cs +++ b/IRaCIS.Core.Application/Service/Allocation/_MapConfig.cs @@ -74,7 +74,7 @@ namespace IRaCIS.Core.Application.Service CreateMap() .ForMember(o => o.DoctorUser, t => t.MapFrom(u => u.Enroll.DoctorUser)) .ForMember(o => o.CriterionReadingCategoryList, t => t.MapFrom(u => u.Enroll.EnrollReadingCategoryList.Select(t => new TrialCriterionReadingCategory() { EnrollId = t.EnrollId, ReadingCategory = t.ReadingCategory, TrialReadingCriterionId = t.TrialReadingCriterionId }))) - .ForMember(o => o.TrialReadingCriterionList, t => t.MapFrom(u => u.Trial.ReadingQuestionCriterionTrialList.Where(t => t.IsConfirm))) + .ForMember(o => o.TrialReadingCriterionList, t => t.MapFrom(u => u.Trial.TrialReadingCriterionList.Where(t => t.IsConfirm))) .ForMember(o => o.ReadingCategoryList, t => t.MapFrom(u => u.Enroll.EnrollReadingCategoryList.Where(t=>t.TrialReadingCriterionId== trialReadingCriterionId).OrderBy(t => t.ReadingCategory).Select(t => t.ReadingCategory).ToList())) ; diff --git a/IRaCIS.Core.Application/Service/ImageAndDoc/DTO/DicomSeriesModel.cs b/IRaCIS.Core.Application/Service/ImageAndDoc/DTO/DicomSeriesModel.cs index d2c7d180e..318f4a901 100644 --- a/IRaCIS.Core.Application/Service/ImageAndDoc/DTO/DicomSeriesModel.cs +++ b/IRaCIS.Core.Application/Service/ImageAndDoc/DTO/DicomSeriesModel.cs @@ -68,6 +68,10 @@ namespace IRaCIS.Core.Application.Contracts.Dicom.DTO public int ShowOrder { get; set; } [JsonIgnore] public decimal RowIndex { get; set; } + [JsonIgnore] + public string WindowCenter { get; set; } + [JsonIgnore] + public string WindowWidth { get; set; } } public class DicomSeriesWithLabelDTO : DicomSeriesDTO diff --git a/IRaCIS.Core.Application/Service/QC/QCOperationService.cs b/IRaCIS.Core.Application/Service/QC/QCOperationService.cs index 190f47bcc..bd00eef1f 100644 --- a/IRaCIS.Core.Application/Service/QC/QCOperationService.cs +++ b/IRaCIS.Core.Application/Service/QC/QCOperationService.cs @@ -28,11 +28,11 @@ namespace IRaCIS.Core.Application.Image.QA private readonly IRepository _qcChallengeRepository; private readonly IRepository _dicomStudyRepository; private readonly IRepository _dicomSeriesrepository; - private readonly IReadingClinicalDataService _readingClinicalDataService; - private readonly IRepository _subjectRepository; + private readonly IReadingClinicalDataService _readingClinicalDataService; + private readonly IRepository _subjectRepository; private readonly IRepository _readingClinicalDataRepository; - private readonly IRepository _clinicalDataTrialSetRepository; - private readonly IRepository _qCChallengeDialogrepository; + private readonly IRepository _clinicalDataTrialSetRepository; + private readonly IRepository _qCChallengeDialogrepository; private readonly IRepository _checkChallengeDialogrepository; private readonly IRepository _trialRepository; private readonly IRepository _visitTaskRepository; @@ -45,11 +45,11 @@ namespace IRaCIS.Core.Application.Image.QA IRepository visitTaskRepository, IRepository dicomStudyRepository, IRepository dicomSeriesrepository, - IReadingClinicalDataService readingClinicalDataService, - IRepository subjectRepository, + IReadingClinicalDataService readingClinicalDataService, + IRepository subjectRepository, IRepository readingClinicalDataRepository, - IRepository clinicalDataTrialSetRepository, - IRepository qCChallengeDialogrepository, + IRepository clinicalDataTrialSetRepository, + IRepository qCChallengeDialogrepository, IRepository checkChallengeDialogrepository, IVisitTaskHelpeService visitTaskHelpeService, IDistributedLockProvider distributedLockProvider @@ -59,11 +59,11 @@ namespace IRaCIS.Core.Application.Image.QA _qcChallengeRepository = qcChallengeRepository; _dicomStudyRepository = dicomStudyRepository; this._dicomSeriesrepository = dicomSeriesrepository; - this._readingClinicalDataService = readingClinicalDataService; - this._subjectRepository = subjectRepository; + this._readingClinicalDataService = readingClinicalDataService; + this._subjectRepository = subjectRepository; this._readingClinicalDataRepository = readingClinicalDataRepository; - this._clinicalDataTrialSetRepository = clinicalDataTrialSetRepository; - this._qCChallengeDialogrepository = qCChallengeDialogrepository; + this._clinicalDataTrialSetRepository = clinicalDataTrialSetRepository; + this._qCChallengeDialogrepository = qCChallengeDialogrepository; this._checkChallengeDialogrepository = checkChallengeDialogrepository; _trialRepository = trialRepository; this._visitTaskRepository = visitTaskRepository; @@ -894,7 +894,7 @@ namespace IRaCIS.Core.Application.Image.QA public async Task CollectNextIQCQuality(GetNextIQCQualityInDto inDto) { var nextIQCQuality = await this.GetNextIQCQuality(inDto); - + if (nextIQCQuality.VisitId != null) { var visit = await _subjectVisitRepository.Where(x => x.Id == nextIQCQuality.VisitId).FirstNotNullAsync(); @@ -902,7 +902,7 @@ namespace IRaCIS.Core.Application.Image.QA { await ObtainOrCancelQCTask(inDto.TrialId, nextIQCQuality.VisitId.Value, true); } - + } return nextIQCQuality; @@ -932,23 +932,24 @@ namespace IRaCIS.Core.Application.Image.QA break; case TrialQCProcess.SingleAudit: visitList = await _subjectVisitRepository.Where(x => x.SubmitState == SubmitStateEnum.Submitted - && x.TrialId == inDto.TrialId && x.PreliminaryAuditUserId!= _userInfo.Id&&(x.CurrentActionUserId == _userInfo.Id || (x.AuditState != AuditStateEnum.PrimaryQCPassed && !x.IsTake))) - .Where(x => x.QCChallengeList.Count() == 0 || x.QCChallengeList.Where(y=>!y.IsClosed).OrderByDescending(x => x.CreateTime).FirstOrDefault().CreateUserId != _userInfo.Id) - .Include(x => x.Subject).ToListAsync(); + && x.TrialId == inDto.TrialId && x.PreliminaryAuditUserId != _userInfo.Id && (x.CurrentActionUserId == _userInfo.Id || (x.AuditState != AuditStateEnum.PrimaryQCPassed && !x.IsTake))) + .Where(x => x.QCChallengeList.Count() == 0 || x.QCChallengeList.Where(y => !y.IsClosed).OrderByDescending(x => x.CreateTime).FirstOrDefault().CreateUserId != _userInfo.Id) + .Include(x => x.Subject).ToListAsync(); - subjectVisit = visitList.Where(x => x.SubjectId == inDto.SubjectId) - + subjectVisit = visitList.Where(x => x.SubjectId == inDto.SubjectId) - .OrderBy(x=>x.VisitNum).FirstOrDefault(); - if(subjectVisit!=null) + + .OrderBy(x => x.VisitNum).FirstOrDefault(); + if (subjectVisit != null) { - return new GetNextIQCQualityOutDto() { - SubjectId= subjectVisit.SubjectId, - VisitId= subjectVisit.Id + return new GetNextIQCQualityOutDto() + { + SubjectId = subjectVisit.SubjectId, + VisitId = subjectVisit.Id }; } - subjectVisit= visitList.OrderBy(x => x.Subject.Code).ThenBy(x=>x.VisitNum).FirstOrDefault(); + subjectVisit = visitList.OrderBy(x => x.Subject.Code).ThenBy(x => x.VisitNum).FirstOrDefault(); if (subjectVisit != null) { return new GetNextIQCQualityOutDto() @@ -965,10 +966,10 @@ namespace IRaCIS.Core.Application.Image.QA case TrialQCProcess.DoubleAudit: visitList = await _subjectVisitRepository.Where(x => x.SubmitState == SubmitStateEnum.Submitted && x.TrialId == inDto.TrialId && - ((x.CurrentActionUserId == _userInfo.Id)||(!x.IsTake&& x.AuditState != AuditStateEnum.QCPassed&& (x.PreliminaryAuditUserId != _userInfo.Id))) + ((x.CurrentActionUserId == _userInfo.Id) || (!x.IsTake && x.AuditState != AuditStateEnum.QCPassed && (x.PreliminaryAuditUserId != _userInfo.Id))) ) - .Where(x => x.QCChallengeList.Count() == 0 || x.QCChallengeList.Where(y => !y.IsClosed).OrderByDescending(x => x.CreateTime).FirstOrDefault().CreateUserId !=_userInfo.Id) - .Include(x => x.Subject).ToListAsync(); + .Where(x => x.QCChallengeList.Count() == 0 || x.QCChallengeList.Where(y => !y.IsClosed).OrderByDescending(x => x.CreateTime).FirstOrDefault().CreateUserId != _userInfo.Id) + .Include(x => x.Subject).ToListAsync(); if (subjectVisit != null) { return new GetNextIQCQualityOutDto() @@ -1027,14 +1028,14 @@ namespace IRaCIS.Core.Application.Image.QA { //throw new BusinessValidationFailedException("当前访视已被领取,不允许领取"); - //---当前访视的影像质控任务已被其他QC领取,不允许领取 + //---当前访视的影像质控任务已被其他QC领取,不允许领取 return ResponseOutput.NotOk(_localizer["QCOperation_QCTaskNoAccess"], ApiResponseCodeEnum.NeedTips); } if (await _subjectVisitRepository.AnyAsync(t => t.Trial.QCQuestionConfirmedUserId == null && t.Id == subjectVisitId)) { - //---请先配置影像质控审核问题,再领取影像质控任务 + //---请先配置影像质控审核问题,再领取影像质控任务 return ResponseOutput.NotOk(_localizer["QCOperation_QCConfigFirst"], ApiResponseCodeEnum.NeedTips); } @@ -1053,14 +1054,14 @@ namespace IRaCIS.Core.Application.Image.QA if (trialConfig.QCProcessEnum == TrialQCProcess.NotAudit) { - //---项目配置为不审,没有领取QC Task + //---项目配置为不审,没有领取QC Task return ResponseOutput.NotOk(_localizer["QCOperation_NoQC"]); } else if (trialConfig.QCProcessEnum == TrialQCProcess.SingleAudit) { if (dbSubjectVisit.PreliminaryAuditUserId == _userInfo.Id) { - //---初审已通过,不能继续领取 + //---初审已通过,不能继续领取 return ResponseOutput.NotOk(_localizer["QCOperation_InitialAuditPassed"]); } @@ -1074,15 +1075,15 @@ namespace IRaCIS.Core.Application.Image.QA } else { - // ---项目配置为单审,不满足Submmit State:已提交 或者 Audit State:待审核/审核中, 不允许领取,请刷新界面 - return ResponseOutput.NotOk(_localizer["QCOperation_NoSingleAudit"]); + // ---项目配置为单审,不满足Submmit State:已提交 或者 Audit State:待审核/审核中, 不允许领取,请刷新界面 + return ResponseOutput.NotOk(_localizer["QCOperation_NoSingleAudit"]); } } else if (trialConfig.QCProcessEnum == TrialQCProcess.DoubleAudit) { if (dbSubjectVisit.PreliminaryAuditUserId == _userInfo.Id) { - //---复审不能和初审是同一个人 + //---复审不能和初审是同一个人 return ResponseOutput.NotOk(_localizer["QCOperation_NoSameReviewer"]); } @@ -1102,7 +1103,7 @@ namespace IRaCIS.Core.Application.Image.QA } else { - //---项目配置为复审,不满足提交状态:已提交 或者 审核状态:待审核/QC中, 不允许领取,请刷新界面 + //---项目配置为复审,不满足提交状态:已提交 或者 审核状态:待审核/QC中, 不允许领取,请刷新界面 return ResponseOutput.NotOk(_localizer["QCOperation_NoSecondaryAudit"]); } } @@ -1123,14 +1124,14 @@ namespace IRaCIS.Core.Application.Image.QA { if (dbSubjectVisit!.CurrentActionUserId != _userInfo.Id) { - //---您不是该质控任务当前领取人,没有操作权限! + //---您不是该质控任务当前领取人,没有操作权限! return ResponseOutput.NotOk(_localizer["QCOperation_NoRecipient"], ApiResponseCodeEnum.NeedTips); } if (trialConfig.QCProcessEnum == TrialQCProcess.NotAudit) { - //---项目配置影像质控为不审,不需要取消任务功能 + //---项目配置影像质控为不审,不需要取消任务功能 return ResponseOutput.NotOk(_localizer["QCOperation_NoQCFunction"]); } else if (trialConfig.QCProcessEnum == TrialQCProcess.SingleAudit) @@ -1143,7 +1144,7 @@ namespace IRaCIS.Core.Application.Image.QA else { - //---当前访视影像质控任务没有当前领取人,不能释放。 + //---当前访视影像质控任务没有当前领取人,不能释放。 return ResponseOutput.NotOk(_localizer["QCOperation_NoTaskOwner"]); } } @@ -1163,7 +1164,7 @@ namespace IRaCIS.Core.Application.Image.QA else { - //---当前访视影像质控任务没有当前领取人,不能释放。 + //---当前访视影像质控任务没有当前领取人,不能释放。 return ResponseOutput.NotOk(_localizer["QCOperation_NoTaskOwner"]); } } @@ -1214,7 +1215,7 @@ namespace IRaCIS.Core.Application.Image.QA } //同时要根据项目有没有配置Subject 级别临床数据 - if (dbSubjectVisitList.Any(t => t.IsBaseLine && !t.IsHaveClinicalData)&&trialinfo.ClinicalInformationTransmissionEnum!=0) + if (dbSubjectVisitList.Any(t => t.IsBaseLine && !t.IsHaveClinicalData) && trialinfo.ClinicalInformationTransmissionEnum != 0) { //---基线没有临床数据,确认提交? @@ -1235,36 +1236,36 @@ namespace IRaCIS.Core.Application.Image.QA //[Authorize(Policy = IRaCISPolicy.CRC)] public async Task CRCRequestToQC(CRCRequestToQCCommand cRCRequestToQCCommand) { - List modalitieTypess = new List() { "PT、CT", "CT、PT", "PET-CT" }; + List modalitieTypess = new List() { "PT、CT", "CT、PT", "PET-CT" }; // 验证临床数据 是否有Pet类型 #region 验证临床数据 是否有Pet类型 if (await _clinicalDataTrialSetRepository.AnyAsync(x => x.TrialId == cRCRequestToQCCommand.TrialId && x.IsConfirm && x.ClinicalDataLevel == ClinicalLevel.Study)) { - foreach (var item in cRCRequestToQCCommand.SubjectVisitIds) - { + foreach (var item in cRCRequestToQCCommand.SubjectVisitIds) + { - if (await _dicomStudyRepository.AnyAsync(x => x.SubjectVisitId == item && modalitieTypess.Contains(x.Modalities))) - { - var visit = await _subjectVisitRepository.Where(x => x.Id == item).FirstNotNullAsync(); - var clinicalData = await this._readingClinicalDataService.GetStudyClinicalData(new Service.Reading.Dto.GetStudyClinicalDataInDto() - { - SubjectVisitId = item, - }); + if (await _dicomStudyRepository.AnyAsync(x => x.SubjectVisitId == item && modalitieTypess.Contains(x.Modalities))) + { + var visit = await _subjectVisitRepository.Where(x => x.Id == item).FirstNotNullAsync(); + var clinicalData = await this._readingClinicalDataService.GetStudyClinicalData(new Service.Reading.Dto.GetStudyClinicalDataInDto() + { + SubjectVisitId = item, + }); - if (!clinicalData.Any(x => x.ClinicalDataLevel == ClinicalLevel.Study && x.ClinicalUploadType == ClinicalUploadType.PDF && x.PDFFileList.Count() > 0)) - { - throw new BusinessValidationFailedException(_localizer["QCOperation_NeedStudyClinical"]); - } - } + if (!clinicalData.Any(x => x.ClinicalDataLevel == ClinicalLevel.Study && x.ClinicalUploadType == ClinicalUploadType.PDF && x.PDFFileList.Count() > 0)) + { + throw new BusinessValidationFailedException(_localizer["QCOperation_NeedStudyClinical"]); + } + } - } - } - - #endregion + } + } + + #endregion - var trialId = cRCRequestToQCCommand.TrialId; + var trialId = cRCRequestToQCCommand.TrialId; var trialConfig = (await _trialRepository .Select(t => new { TrialId = t.Id, t.QCProcessEnum, t.IsImageConsistencyVerification, t.IsUrgent, t.IsHaveFirstGiveMedicineDate, t.ClinicalInformationTransmissionEnum }) @@ -1311,82 +1312,36 @@ namespace IRaCIS.Core.Application.Image.QA //基线不验证 if (trialConfig.IsHaveFirstGiveMedicineDate && !dbSubjectVisit.IsBaseLine && dbSubjectVisit.Subject.FirstGiveMedicineTime == null) { - //---项目配置了需要填写访视基准日期。但是受试者没有填写访视基准日期,不允许提交 + //---项目配置了需要填写访视基准日期。但是受试者没有填写访视基准日期,不允许提交 return ResponseOutput.NotOk(_localizer["QCOperation_MissingBaselineDate"]); } - //基线 且配置了临床数据 - //if (trialConfig.ClinicalInformationTransmissionEnum != 0 /*&& dbSubjectVisit.IsBaseLine*//*&&dbSubjectVisit.ClinicalDataSignUserId==null*/) - //{ + if (_subjectVisitRepository.Where(t => t.Id == dbSubjectVisit.Id).Any(t => (t.StudyList.Count(t => t.ModalityForEdit == "") > 0 ||t.NoneDicomStudyList.Count(t => t.Modality == "")>0) && t.Trial.TrialReadingCriterionList.Count(t => t.IsImageFilter == true) > 0)) + { + //有标准配置了影像筛选,该受试者有检查未设置检查类型,不允许提交 + return ResponseOutput.NotOk(_localizer["QCOperation_MissingModality"]); + } - ////找到需要确认的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; + //已确认临床数据完整性 + dbSubjectVisit.IsConfirmedClinicalData = true; // CRC 上传的基线数据签名 List clinicalneedSign = new List() { - ClinicalLevel.Subject, - ClinicalLevel.SubjectVisit, - ClinicalLevel.Study, - }; - - await _readingClinicalDataRepository.UpdatePartialFromQueryAsync(x => - clinicalneedSign.Contains(x.ClinicalDataTrialSet.ClinicalDataLevel)&& - x.ClinicalDataTrialSet.UploadRole == UploadRole.CRC && x.ReadingId == dbSubjectVisit.Id && x.IsSign==false, x => new ReadingClinicalData() - { - IsSign = true, - ReadingClinicalDataState = ReadingClinicalDataStatus.HaveSigned - }); - - - - //var signSuccess = await _repository.UpdateFromQueryAsync(t => t.Id == cRCRequestToQCCommand.SignId, u => new TrialSign() { IsCompleted = true }); - - - ////现在修改为 提交时 设置签名信息 - //dbSubjectVisit.ClinicalDataSignUserId = _userInfo.Id; - //dbSubjectVisit.ClinicalDataSignTime = DateTime.Now; - - //那么没有录入 不允许提交 - //if (!await _repository.AnyAsync(t => t.PreviousHistoryList.Any() || t.PreviousOtherList.Any() || t.PreviousSurgeryList.Any())) - //{ - // return ResponseOutput.NotOk("没有临床数据,不允许提交"); - //} - - //return ResponseOutput.NotOk("没有签名临床数据,不允许提交"); - //} - - + ClinicalLevel.Subject, + ClinicalLevel.SubjectVisit, + ClinicalLevel.Study, + }; + await _readingClinicalDataRepository.UpdatePartialFromQueryAsync(x => + clinicalneedSign.Contains(x.ClinicalDataTrialSet.ClinicalDataLevel) && + x.ClinicalDataTrialSet.UploadRole == UploadRole.CRC && x.ReadingId == dbSubjectVisit.Id && x.IsSign == false, x => new ReadingClinicalData() + { + IsSign = true, + ReadingClinicalDataState = ReadingClinicalDataStatus.HaveSigned + }); var maxVisit = await _subjectVisitRepository.Where(t => t.SubjectId == dbSubjectVisit.SubjectId && t.SubmitState == SubmitStateEnum.Submitted) @@ -1411,14 +1366,14 @@ namespace IRaCIS.Core.Application.Image.QA }); - await _visitTaskRepository.BatchUpdateNoTrackingAsync(x => trialInOrderCriterionIdList.Contains(x.TrialReadingCriterionId)&& x.SubjectId == dbSubjectVisit.SubjectId&& - dbSubjectVisit.VisitNum<= x.VisitTaskNum && x.VisitTaskNum < Math.Ceiling(dbSubjectVisit.VisitNum+0.01m) // 当前的访视 全局 裁判 及之前 全都加急 + await _visitTaskRepository.BatchUpdateNoTrackingAsync(x => trialInOrderCriterionIdList.Contains(x.TrialReadingCriterionId) && x.SubjectId == dbSubjectVisit.SubjectId && + dbSubjectVisit.VisitNum <= x.VisitTaskNum && x.VisitTaskNum < Math.Ceiling(dbSubjectVisit.VisitNum + 0.01m) // 当前的访视 全局 裁判 及之前 全都加急 && x.ReadingTaskState != ReadingTaskState.HaveSigned && x.TaskState == TaskState.Effect, x => new VisitTask() { IsUrgent = true, TaskUrgentType = TaskUrgentType.PDProgress, - IsCanEditUrgentState=false, + IsCanEditUrgentState = false, }); await _visitTaskRepository.BatchUpdateNoTrackingAsync(x => trialInOrderCriterionIdList.Contains(x.TrialReadingCriterionId) && x.SubjectId == dbSubjectVisit.SubjectId @@ -1428,7 +1383,7 @@ namespace IRaCIS.Core.Application.Image.QA IsUrgent = true, TaskUrgentType = TaskUrgentType.Other, - TaskUrgentRemake= "后续访视设为pd", + TaskUrgentRemake = "后续访视设为pd", IsCanEditUrgentState = false, }); } @@ -1440,7 +1395,7 @@ namespace IRaCIS.Core.Application.Image.QA }); await _visitTaskRepository.BatchUpdateNoTrackingAsync(x => trialInOrderCriterionIdList.Contains(x.TrialReadingCriterionId) && - x.VisitTaskNum>= dbSubjectVisit.VisitNum && x.VisitTaskNum < Math.Ceiling(dbSubjectVisit.VisitNum + 0.01m) // 当前的访视 全局 裁判 全都加急 + x.VisitTaskNum >= dbSubjectVisit.VisitNum && x.VisitTaskNum < Math.Ceiling(dbSubjectVisit.VisitNum + 0.01m) // 当前的访视 全局 裁判 全都加急 && x.ReadingTaskState != ReadingTaskState.HaveSigned && x.TaskState == TaskState.Effect, x => new VisitTask() { @@ -1464,14 +1419,7 @@ namespace IRaCIS.Core.Application.Image.QA dbSubjectVisit.IsUrgent = true; - ////PD确认的紧急会把前面所有未QC完成的访视均标记为紧急 - //var previosSVlist = await _subjectVisitRepository.Where(t => t.SubjectId == dbSubjectVisit.SubjectId && t.VisitNum < dbSubjectVisit.VisitNum && t.IsUrgent == false && t.SubmitState == SubmitStateEnum.Submitted, true).ToListAsync(); - - //previosSVlist.ForEach(t => - //{ - // t.IsUrgent = true; - //}); } @@ -1522,7 +1470,7 @@ namespace IRaCIS.Core.Application.Image.QA } //非基线设置为PD的话 或者设置为末次访视 根据配置自动生成阅片期 - if (!dbSubjectVisit.IsBaseLine && (dbSubjectVisit.PDState == PDStateEnum.PDProgress || dbSubjectVisit.IsFinalVisit) ) + if (!dbSubjectVisit.IsBaseLine && (dbSubjectVisit.PDState == PDStateEnum.PDProgress || dbSubjectVisit.IsFinalVisit)) { //该标准需要添加阅片期 @@ -1590,7 +1538,7 @@ namespace IRaCIS.Core.Application.Image.QA //判断质疑是否都关闭了 if (await _repository.AnyAsync(t => t.SubjectVisitId == subjectVisitId && t.IsClosed == false)) { - //---当前访视有影像质控质疑未关闭,不能进行此操作。 + //---当前访视有影像质控质疑未关闭,不能进行此操作。 return ResponseOutput.NotOk(_localizer["QCOperation_QCNotClosed"]); } } @@ -1621,7 +1569,7 @@ namespace IRaCIS.Core.Application.Image.QA if (trialConfig.QCProcessEnum == TrialQCProcess.NotAudit) { - //---项目配置影像质控为不审,不需要设置为影像质控通过。 + //---项目配置影像质控为不审,不需要设置为影像质控通过。 return ResponseOutput.NotOk(_localizer["QCOperation_NoQCNeeded"]); } @@ -1631,7 +1579,7 @@ namespace IRaCIS.Core.Application.Image.QA { if (!await _repository.AnyAsync(t => t.SubjectVisitId == subjectVisitId && t.CurrentQCEnum == CurrentQC.First)) { - //---影像质控审核问题没有保存,不能进行此操作。 + //---影像质控审核问题没有保存,不能进行此操作。 return ResponseOutput.NotOk(_localizer["QCOperation_QCNotSaved"]); } @@ -1651,7 +1599,7 @@ namespace IRaCIS.Core.Application.Image.QA { var physicalPath = FileStoreHelper.GetPhysicalFilePath(_hostEnvironment, path); - + if (System.IO.File.Exists(physicalPath)) { File.Delete(physicalPath); @@ -1662,7 +1610,7 @@ namespace IRaCIS.Core.Application.Image.QA } else { - //---项目配置影像质控为单审,当前访视影像质控任务不能从当前审核状态变更到 审核通过。 + //---项目配置影像质控为单审,当前访视影像质控任务不能从当前审核状态变更到 审核通过。 return ResponseOutput.NotOk(_localizer["QCOperation_NotChangePass"]); } @@ -1678,7 +1626,7 @@ namespace IRaCIS.Core.Application.Image.QA if (!await _repository.AnyAsync(t => t.SubjectVisitId == subjectVisitId && t.CurrentQCEnum == CurrentQC.First)) { - //---影像质控审核问题没有保存,不能进行此操作。 + //---影像质控审核问题没有保存,不能进行此操作。 return ResponseOutput.NotOk(_localizer["QCOperation_QCNotSaved"]); } @@ -1693,7 +1641,7 @@ namespace IRaCIS.Core.Application.Image.QA if (!await _repository.AnyAsync(t => t.SubjectVisitId == subjectVisitId && t.CurrentQCEnum == CurrentQC.Second)) { - //---影像质控审核问题没有保存,不能进行此操作。 + //---影像质控审核问题没有保存,不能进行此操作。 return ResponseOutput.NotOk(_localizer["QCOperation_QCNotSaved"]); } @@ -1738,7 +1686,7 @@ namespace IRaCIS.Core.Application.Image.QA if (trialConfig.QCProcessEnum == TrialQCProcess.NotAudit) { - //---项目配置影像质控为不审,不允许设置影像质控终止。 + //---项目配置影像质控为不审,不允许设置影像质控终止。 return ResponseOutput.NotOk(_localizer["QCOperation_NoQCNeededNotEnd"]); } else if (trialConfig.QCProcessEnum == TrialQCProcess.SingleAudit) @@ -1778,7 +1726,7 @@ namespace IRaCIS.Core.Application.Image.QA } - await _qcChallengeRepository.UpdatePartialFromQueryAsync(t => t.IsClosed == false&& t.SubjectVisitId==dbSubjectVisit.Id, u => new QCChallenge() { IsClosed = true, ClosedTime=DateTime.Now, CloseResonEnum = QCChallengeCloseEnum.Unresolvable }); + await _qcChallengeRepository.UpdatePartialFromQueryAsync(t => t.IsClosed == false && t.SubjectVisitId == dbSubjectVisit.Id, u => new QCChallenge() { IsClosed = true, ClosedTime = DateTime.Now, CloseResonEnum = QCChallengeCloseEnum.Unresolvable }); } @@ -1958,31 +1906,31 @@ namespace IRaCIS.Core.Application.Image.QA throw new BusinessValidationFailedException(_localizer["QCOperation_InvalidCompleteResend"]); } - List modalitieTypess = new List() { "PT、CT", "CT、PT", "PET-CT" }; - // 验证临床数据 是否有Pet类型 - #region 验证临床数据 是否有Pet类型 - if (await _clinicalDataTrialSetRepository.AnyAsync(x => x.TrialId == cRCReuploadFinishedCommand.TrialId && x.IsConfirm && x.ClinicalDataLevel == ClinicalLevel.Study)) - { + List modalitieTypess = new List() { "PT、CT", "CT、PT", "PET-CT" }; + // 验证临床数据 是否有Pet类型 + #region 验证临床数据 是否有Pet类型 + if (await _clinicalDataTrialSetRepository.AnyAsync(x => x.TrialId == cRCReuploadFinishedCommand.TrialId && x.IsConfirm && x.ClinicalDataLevel == ClinicalLevel.Study)) + { var item = qcChallenge.SubjectVisitId; - if (await _dicomStudyRepository.AnyAsync(x => x.SubjectVisitId == item && modalitieTypess.Contains(x.Modalities))) - { - var visit = await _subjectVisitRepository.Where(x => x.Id == item).FirstNotNullAsync(); - var clinicalData = await this._readingClinicalDataService.GetStudyClinicalData(new Service.Reading.Dto.GetStudyClinicalDataInDto() - { - SubjectVisitId = item, - }); + if (await _dicomStudyRepository.AnyAsync(x => x.SubjectVisitId == item && modalitieTypess.Contains(x.Modalities))) + { + var visit = await _subjectVisitRepository.Where(x => x.Id == item).FirstNotNullAsync(); + var clinicalData = await this._readingClinicalDataService.GetStudyClinicalData(new Service.Reading.Dto.GetStudyClinicalDataInDto() + { + SubjectVisitId = item, + }); - if (!clinicalData.Any(x => x.ClinicalDataLevel == ClinicalLevel.Study && x.ClinicalUploadType == ClinicalUploadType.PDF && x.PDFFileList.Count() > 0)) - { - throw new BusinessValidationFailedException(_localizer["QCOperation_NeedStudyClinical"]); - } - } - } + if (!clinicalData.Any(x => x.ClinicalDataLevel == ClinicalLevel.Study && x.ClinicalUploadType == ClinicalUploadType.PDF && x.PDFFileList.Count() > 0)) + { + throw new BusinessValidationFailedException(_localizer["QCOperation_NeedStudyClinical"]); + } + } + } - #endregion + #endregion - var subjectVisitId = qcChallenge.SubjectVisitId; + var subjectVisitId = qcChallenge.SubjectVisitId; if (await _subjectVisitRepository.Where(t => t.Id == subjectVisitId).SelectMany(t => t.StudyList).CountAsync() == 0 && await _subjectVisitRepository.Where(t => t.Id == subjectVisitId).SelectMany(t => t.NoneDicomStudyList).SelectMany(u => u.NoneDicomFileList).CountAsync() == 0) @@ -2117,14 +2065,14 @@ namespace IRaCIS.Core.Application.Image.QA if (await _subjectVisitRepository.Where(t => t.Id == command.SubjectVisitId) .AnyAsync(t => t.SubmitState == SubmitStateEnum.Submitted && t.IsEnrollmentConfirm != command.IsEnrollmentConfirm)) { - //---该访视已提交,不能修改入组确认状态 + //---该访视已提交,不能修改入组确认状态 return ResponseOutput.NotOk(_localizer["QCOperation_CannotModifyConfirmation"]); } if (await _subjectVisitRepository.Where(t => t.Id == command.SubjectVisitId) .AnyAsync(t => t.IsEnrollmentConfirm != command.IsEnrollmentConfirm && t.RequestBackState == RequestBackStateEnum.PM_AgressBack)) { - //---该访视为回退访视,不允许修改PD确认状态 + //---该访视为回退访视,不允许修改PD确认状态 return ResponseOutput.NotOk(_localizer["QCOperation_CannotModifyPDStatus"]); } @@ -2211,7 +2159,7 @@ namespace IRaCIS.Core.Application.Image.QA await _subjectVisitRepository.BatchUpdateNoTrackingAsync(t => t.Id == subjectVisitId, u => new SubjectVisit() { ForwardState = ForwardStateEnum.ForwardFailed }); - //---转发影像失败。 + //---转发影像失败。 return ResponseOutput.NotOk(_localizer["QCOperation_ForwardingFailed"] + result.Failures.ToString() + result.ToJson()); } } @@ -2231,8 +2179,8 @@ namespace IRaCIS.Core.Application.Image.QA await _subjectVisitRepository.UpdatePartialFromQueryAsync(t => t.Id == subjectVisitId, u => new SubjectVisit() { ForwardState = ForwardStateEnum.ForwardFailed }); - // --转发影像失败 - return ResponseOutput.NotOk(_localizer["QCOperation_ForwardingFailed"] + e.Message); + // --转发影像失败 + return ResponseOutput.NotOk(_localizer["QCOperation_ForwardingFailed"] + e.Message); } @@ -2242,7 +2190,7 @@ namespace IRaCIS.Core.Application.Image.QA await _subjectVisitRepository.SaveChangesAsync(); - //---转发影像失败。 + //---转发影像失败。 return isSuccess ? ResponseOutput.Ok() : ResponseOutput.NotOk(_localizer["QCOperation_ForwardingFailed"]); } diff --git a/IRaCIS.Core.Application/Service/TrialSiteUser/PersonalWorkstation.cs b/IRaCIS.Core.Application/Service/TrialSiteUser/PersonalWorkstation.cs index 8231149d1..2159ae68e 100644 --- a/IRaCIS.Core.Application/Service/TrialSiteUser/PersonalWorkstation.cs +++ b/IRaCIS.Core.Application/Service/TrialSiteUser/PersonalWorkstation.cs @@ -1465,7 +1465,7 @@ namespace IRaCIS.Core.Application .WhereIf(!string.IsNullOrEmpty(inQuery.ResearchProgramNo), o => o.ResearchProgramNo.Contains(inQuery.ResearchProgramNo)) .WhereIf(!string.IsNullOrWhiteSpace(inQuery.ExperimentName), o => o.ExperimentName.Contains(inQuery.ExperimentName)) .WhereIf(_userInfo.UserTypeEnumInt != (int)UserTypeEnum.SuperAdmin && _userInfo.UserTypeEnumInt != (int)UserTypeEnum.Admin && _userInfo.UserTypeEnumInt != (int)UserTypeEnum.OP, t => t.TrialUserList.Any(t => t.UserId == _userInfo.Id && t.IsDeleted == false) && t.IsDeleted == false) - .WhereIf(inQuery.CriterionType != null, o => o.ReadingQuestionCriterionTrialList.Any(t=>t.CriterionType==inQuery.CriterionType && t.IsSigned && t.IsConfirm)) + .WhereIf(inQuery.CriterionType != null, o => o.TrialReadingCriterionList.Any(t=>t.CriterionType==inQuery.CriterionType && t.IsSigned && t.IsConfirm)) .WhereIf(!string.IsNullOrEmpty(inQuery.PM_EMail), o => o.TrialUserList.Any(t => t.User.EMail.Contains(inQuery.PM_EMail) && (t.User.UserTypeEnum == UserTypeEnum.ProjectManager || t.User.UserTypeEnum == UserTypeEnum.APM))) .Select(t => new TrialToBeDoneDto() { @@ -1525,7 +1525,7 @@ namespace IRaCIS.Core.Application .Where(u => u.CurrentActionUserId == null && (u.PreliminaryAuditUserId == null || (u.PreliminaryAuditUserId != _userInfo.Id && u.ReviewAuditUserId == null))).Count() : 0, - IR_ReadingCriterionList =isIR ? t.ReadingQuestionCriterionTrialList.Where(t=>t.IsConfirm && t.IsSigned).OrderBy(t => t.CriterionName).Select(t=>t.CriterionName).ToList():null, + IR_ReadingCriterionList =isIR ? t.TrialReadingCriterionList.Where(t=>t.IsConfirm && t.IsSigned).OrderBy(t => t.CriterionName).Select(t=>t.CriterionName).ToList():null, IR_PMEmailList= isIR ? t.TrialUserList.Where(t=>t.User.UserTypeEnum==UserTypeEnum.ProjectManager || t.User.UserTypeEnum == UserTypeEnum.APM).OrderBy(t => t.User.EMail).Select(t => t.User.EMail).ToList() : null, diff --git a/IRaCIS.Core.Application/Service/TrialSiteUser/_MapConfig.cs b/IRaCIS.Core.Application/Service/TrialSiteUser/_MapConfig.cs index 5546e2036..3e51612bf 100644 --- a/IRaCIS.Core.Application/Service/TrialSiteUser/_MapConfig.cs +++ b/IRaCIS.Core.Application/Service/TrialSiteUser/_MapConfig.cs @@ -66,7 +66,7 @@ namespace IRaCIS.Core.Application.Service var userTypeEnumInt = 0; var isEn_Us = false; CreateMap() - .ForMember(x=>x.CriterionList,y=>y.MapFrom(z=>z.ReadingQuestionCriterionTrialList.Where(n=>n.IsConfirm).Select(m=>m.CriterionName))) + .ForMember(x=>x.CriterionList,y=>y.MapFrom(z=>z.TrialReadingCriterionList.Where(n=>n.IsConfirm).Select(m=>m.CriterionName))) .ForMember(d => d.DictionaryList, u => u.MapFrom(s => s.TrialDicList.Select(t => t.Dictionary).OrderBy(t => t.ShowOrder))) //.ForMember(d => d.Code, u => u.MapFrom(s => s.TrialCode)) .ForMember(d => d.Sponsor, u => u.MapFrom(s => s.Sponsor.SponsorName)) @@ -170,8 +170,8 @@ namespace IRaCIS.Core.Application.Service CreateMap().ForMember(t => t.TrialId, u => u.MapFrom(c => c.Id)) - .ForMember(t => t.TrialCriterionIds, u => u.MapFrom(c => c.ReadingQuestionCriterionTrialList.Where(v =>v.IsConfirm).OrderBy(x=>x.ShowOrder).Select(r => r.Id))) - .ForMember(t => t.TrialCriterionNames, u => u.MapFrom(c => c.ReadingQuestionCriterionTrialList.Where(v => v.IsConfirm).OrderBy(x => x.ShowOrder).Select(r => r.CriterionName))) + .ForMember(t => t.TrialCriterionIds, u => u.MapFrom(c => c.TrialReadingCriterionList.Where(v =>v.IsConfirm).OrderBy(x=>x.ShowOrder).Select(r => r.Id))) + .ForMember(t => t.TrialCriterionNames, u => u.MapFrom(c => c.TrialReadingCriterionList.Where(v => v.IsConfirm).OrderBy(x => x.ShowOrder).Select(r => r.CriterionName))) .ForMember(t => t.ClinicalDataTrialSetIds, u => u.MapFrom(c => c.clinicalDataTrialSets.Where(v => v.IsConfirm).Select(r => r.Id))) .ForMember(t => t.ClinicalDataSetNames, u => u.MapFrom(c => c.clinicalDataTrialSets.Where(v => v.IsConfirm).Select(r => isEn_Us ? r.ClinicalDataSetEnName:r.ClinicalDataSetName))) //.ForMember(t => t.CriterionIds, u => u.MapFrom(c => c.TrialDicList.Where(v => v.KeyName == StaticData.Criterion).Select(r => r.DictionaryId))) diff --git a/IRaCIS.Core.Application/Service/Visit/DTO/VisitPointViewModel.cs b/IRaCIS.Core.Application/Service/Visit/DTO/VisitPointViewModel.cs index aaccf5be4..92d44de4b 100644 --- a/IRaCIS.Core.Application/Service/Visit/DTO/VisitPointViewModel.cs +++ b/IRaCIS.Core.Application/Service/Visit/DTO/VisitPointViewModel.cs @@ -264,7 +264,7 @@ namespace IRaCIS.Core.Application.Contracts public bool IsCriticalSequence { get; set; } = false; - public int SeriesCount { get; set; } + public int SeriesCount =>SeriesList.Count; public int InstanceCount { get; set; } public bool IsDicom { get; set; } = true; diff --git a/IRaCIS.Core.Application/Service/Visit/SubjectVisitService.cs b/IRaCIS.Core.Application/Service/Visit/SubjectVisitService.cs index 26df900de..12d8e522d 100644 --- a/IRaCIS.Core.Application/Service/Visit/SubjectVisitService.cs +++ b/IRaCIS.Core.Application/Service/Visit/SubjectVisitService.cs @@ -15,6 +15,7 @@ using IRaCIS.Application.Services; using Microsoft.Extensions.DependencyInjection; using DocumentFormat.OpenXml.Drawing.Charts; using IRaCIS.Core.Domain.Models; +using NPOI.SS.Formula.Functions; namespace IRaCIS.Core.Application.Services { @@ -263,7 +264,7 @@ namespace IRaCIS.Core.Application.Services { InstanceCount = k.InstanceCount, Modalities = k.Modalities, - SeriesCount = k.SeriesCount, + //SeriesCount = k.SeriesCount, StudyCode = k.StudyCode, StudyId = k.Id }).ToListAsync(); @@ -297,7 +298,7 @@ namespace IRaCIS.Core.Application.Services ); //设置为阅片与否 不更改数据库检查 的instance数量 和 SeriesCount 所以这里要实时统计 - t.SeriesCount = t.SeriesList.Count; + //t.SeriesCount = t.SeriesList.Count; t.InstanceCount = t.SeriesList.SelectMany(t => t.InstanceInfoList).Count(); } @@ -483,172 +484,198 @@ namespace IRaCIS.Core.Application.Services var studyList = new List(); - var taskInfo = await _visitTaskRepository.Where(x => x.Id == indto.VisitTaskId).FirstNotNullAsync(); + var taskInfo = await _visitTaskRepository.Where(x => x.Id == indto.VisitTaskId).Select(t => new {t.TrialReadingCriterionId,t.TrialReadingCriterion.IsImageFilter,t.TrialReadingCriterion.CriterionModalitys, t.ReadingTaskState ,TaskStudyCount=t.TaskStudyList.Count }).FirstNotNullAsync(); - - #region dicom 检查查询 - - //如果是手动生成的标准,需要过滤检查和序列数据 - - var isManualGenerate = await _trialReadingCriterionRepository.AnyAsync(t => t.Id == taskInfo.TrialReadingCriterionId && t.IsAutoCreate == false); - - var dicomStudyList = await _repository.Where(t => t.TrialId == indto.TrialId && t.SubjectVisitId == indto.SujectVisitId) - .WhereIf(isManualGenerate, t => t.SubjectCriteriaEvaluationVisitStudyFilterList.Any(t => t.TrialReadingCriterionId == taskInfo.TrialReadingCriterionId && t.IsConfirmed && t.IsReading)) - .Select(k => new VisitStudyDTO() - { - InstanceCount = k.InstanceCount, - Modalities = k.Modalities, - SeriesCount = k.SeriesCount, - StudyCode = k.StudyCode, - StudyId = k.Id, - - }).ToListAsync(); - var studyIds = dicomStudyList.Select(t => t.StudyId).ToList(); - - var instanceList = await _repository.Where(t => studyIds.Contains(t.StudyId)) - .Select(t => new { t.SeriesId, t.Id, t.InstanceNumber, t.Path, t.NumberOfFrames, t.WindowCenter, t.WindowWidth, t.HtmlPath }).ToListAsync(); - - List seriesLists = await _repository.Where(s => studyIds.Contains(s.StudyId)) - .WhereIf(isManualGenerate == false, t => t.IsReading) - .WhereIf(isManualGenerate, t => t.SubjectCriteriaEvaluationVisitStudyFilterList.Any(t => t.TrialReadingCriterionId == taskInfo.TrialReadingCriterionId && t.IsConfirmed && t.IsReading)) - .OrderBy(s => s.SeriesNumber).ThenBy(s => s.SeriesTime).ProjectTo(_mapper.ConfigurationProvider).ToListAsync(); - - foreach (var t in dicomStudyList) + //影响后处理 上传了新的影像 + if (taskInfo.TaskStudyCount > 0) { - t.SeriesList = seriesLists.Where(s => s.StudyId == t.StudyId).OrderBy(s => s.SeriesNumber).ThenBy(s => s.SeriesTime).ToList(); - t.SeriesList.ForEach(series => + var taskStudyList= await _repository.Where(t => t.TrialId == indto.TrialId && t.VisitTaskId == indto.VisitTaskId).ProjectTo(_mapper.ConfigurationProvider).ToListAsync(); + + foreach (var study in taskStudyList) { - series.InstanceInfoList = instanceList.Where(t => t.SeriesId == series.Id).OrderBy(t => t.InstanceNumber).Select(k => - new InstanceBasicInfo() - { - Id = k.Id, - NumberOfFrames = k.NumberOfFrames, - HtmlPath = k.HtmlPath, - Path = k.Path, - InstanceNumber = k.InstanceNumber, + study.SeriesList = study.SeriesList.OrderBy(s => s.SeriesNumber).ThenBy(s => s.SeriesTime).ToList(); - }).ToList(); + foreach (var series in study.SeriesList) + { + series.WindowCenter = series.InstanceInfoList.FirstOrDefault()!.WindowCenter; + series.WindowWidth = series.InstanceInfoList.FirstOrDefault()!.WindowWidth; + } + //study.SeriesCount = study.SeriesList.Count; - series.WindowWidth = instanceList.FirstOrDefault()!.WindowWidth; - series.WindowCenter = instanceList.FirstOrDefault()!.WindowCenter; - }); + study.InstanceCount = study.SeriesList.SelectMany(t => t.InstanceInfoList).Count(); + } + + studyList.AddRange(taskStudyList); - //设置为阅片与否 不更改数据库检查 的instance数量 和 SeriesCount 所以这里要实时统计 - t.SeriesCount = t.SeriesList.Count; - t.InstanceCount = t.SeriesList.SelectMany(t => t.InstanceInfoList).Count(); } - - studyList.AddRange(dicomStudyList); - - #endregion - - #region dicom 关键序列处理 - - //已经签名的任务,加关键序列 - if (taskInfo.ReadingTaskState == ReadingTaskState.HaveSigned) + else { - var rowInfoList = await _readingTableAnswerRowInfoRepository.Where(x => x.VisitTaskId == indto.VisitTaskId && x.StudyId != null).OrderBy(x => x.ReadingQuestionTrial.ShowOrder).ThenBy(x => x.RowIndex).Select(x => new - { - x.ReadingQuestionTrial.ShowOrder, - x.RowIndex, - x.SeriesId, - x.StudyId, - x.InstanceId, - }).ToListAsync(); + #region dicom 检查查询 - var thisStudyIds = rowInfoList.OrderBy(x => x.ShowOrder).ThenBy(x => x.RowIndex).Select(x => x.StudyId).Distinct().ToList(); - var thisSeriesIdIds = rowInfoList.Where(x => x.SeriesId != null).OrderBy(x => x.ShowOrder).ThenBy(x => x.RowIndex).Select(x => x.SeriesId).Distinct().ToList(); - if (rowInfoList.Count > 0) - { - var thisVisitTaskStudy = await _repository.Where(t => thisStudyIds.Contains(t.Id)).Select(k => new VisitStudyDTO() + //如果是手动生成的标准,需要过滤检查和序列数据 + + var isManualGenerate = await _trialReadingCriterionRepository.AnyAsync(t => t.Id == taskInfo.TrialReadingCriterionId && t.IsAutoCreate == false); + + var dicomStudyList = await _repository.Where(t => t.TrialId == indto.TrialId && t.SubjectVisitId == indto.SujectVisitId) + .WhereIf(taskInfo.IsImageFilter==true, t=> taskInfo.CriterionModalitys.Contains(t.ModalityForEdit)) + .WhereIf(isManualGenerate, t => t.SubjectCriteriaEvaluationVisitStudyFilterList.Any(t => t.TrialReadingCriterionId == taskInfo.TrialReadingCriterionId && t.IsConfirmed && t.IsReading)) + .Select(k => new VisitStudyDTO() { InstanceCount = k.InstanceCount, - - SeriesCount = k.SeriesCount, - + Modalities = k.Modalities, + //SeriesCount = k.SeriesCount, + StudyCode = k.StudyCode, StudyId = k.Id, - IsCriticalSequence = true, - }).FirstOrDefaultAsync(); + }).ToListAsync(); + var studyIds = dicomStudyList.Select(t => t.StudyId).ToList(); - if (thisVisitTaskStudy != null) + var instanceList = await _repository.Where(t => studyIds.Contains(t.StudyId)) + .Select(t => new { t.SeriesId, t.Id, t.InstanceNumber, t.Path, t.NumberOfFrames, t.WindowCenter, t.WindowWidth, t.HtmlPath }).ToListAsync(); + + List seriesLists = await _repository.Where(s => studyIds.Contains(s.StudyId)) + .WhereIf(isManualGenerate == false, t => t.IsReading) + .WhereIf(isManualGenerate, t => t.SubjectCriteriaEvaluationVisitStudyFilterList.Any(t => t.TrialReadingCriterionId == taskInfo.TrialReadingCriterionId && t.IsConfirmed && t.IsReading)) + .OrderBy(s => s.SeriesNumber).ThenBy(s => s.SeriesTime).ProjectTo(_mapper.ConfigurationProvider).ToListAsync(); + + foreach (var t in dicomStudyList) + { + t.SeriesList = seriesLists.Where(s => s.StudyId == t.StudyId).OrderBy(s => s.SeriesNumber).ThenBy(s => s.SeriesTime).ToList(); + + t.SeriesList.ForEach(series => { - thisVisitTaskStudy.StudyId = default(Guid); - var item = await _repository.Where(s => thisSeriesIdIds.Contains(s.Id)).OrderBy(s => s.SeriesNumber). - ThenBy(s => s.SeriesTime) - .ProjectTo(_mapper.ConfigurationProvider).FirstOrDefaultAsync(); + series.InstanceInfoList = instanceList.Where(t => t.SeriesId == series.Id).OrderBy(t => t.InstanceNumber).Select(k => + new InstanceBasicInfo() + { + Id = k.Id, + NumberOfFrames = k.NumberOfFrames, + HtmlPath = k.HtmlPath, + Path = k.Path, + InstanceNumber = k.InstanceNumber, - if (item != null) + }).ToList(); + + series.WindowWidth = instanceList.FirstOrDefault()!.WindowWidth; + series.WindowCenter = instanceList.FirstOrDefault()!.WindowCenter; + }); + + //设置为阅片与否 不更改数据库检查 的instance数量 和 SeriesCount 所以这里要实时统计 + //t.SeriesCount = t.SeriesList.Count; + t.InstanceCount = t.SeriesList.SelectMany(t => t.InstanceInfoList).Count(); + } + + studyList.AddRange(dicomStudyList); + + #endregion + + #region dicom 关键序列处理 + + //已经签名的任务,加关键序列 + if (taskInfo.ReadingTaskState == ReadingTaskState.HaveSigned) + { + var rowInfoList = await _readingTableAnswerRowInfoRepository.Where(x => x.VisitTaskId == indto.VisitTaskId && x.StudyId != null).OrderBy(x => x.ReadingQuestionTrial.ShowOrder).ThenBy(x => x.RowIndex).Select(x => new + { + x.ReadingQuestionTrial.ShowOrder, + x.RowIndex, + x.SeriesId, + x.StudyId, + x.InstanceId, + }).ToListAsync(); + + var thisStudyIds = rowInfoList.OrderBy(x => x.ShowOrder).ThenBy(x => x.RowIndex).Select(x => x.StudyId).Distinct().ToList(); + var thisSeriesIdIds = rowInfoList.Where(x => x.SeriesId != null).OrderBy(x => x.ShowOrder).ThenBy(x => x.RowIndex).Select(x => x.SeriesId).Distinct().ToList(); + if (rowInfoList.Count > 0) + { + var thisVisitTaskStudy = await _repository.Where(t => thisStudyIds.Contains(t.Id)).Select(k => new VisitStudyDTO() { - item.SeriesInstanceUid = string.Empty; + InstanceCount = k.InstanceCount, - var markInstanceIdList = rowInfoList.Where(y => y.InstanceId != null).OrderBy(x => x.ShowOrder).ThenBy(x => x.RowIndex).Select(y => y.InstanceId!.Value).Distinct().ToList(); + //SeriesCount = k.SeriesCount, - item.InstanceInfoList = await _repository.Where(t => markInstanceIdList.Contains(t.Id)).OrderBy(t => t.InstanceNumber).Select(k => - new InstanceBasicInfo() - { - Id = k.Id, - NumberOfFrames = k.NumberOfFrames, - HtmlPath = k.HtmlPath, - Path = k.Path, - InstanceNumber = k.InstanceNumber, + StudyId = k.Id, + IsCriticalSequence = true, - }).ToListAsync(); + }).FirstOrDefaultAsync(); - item.InstanceInfoList.ForEach(x => + if (thisVisitTaskStudy != null) + { + thisVisitTaskStudy.StudyId = default(Guid); + var item = await _repository.Where(s => thisSeriesIdIds.Contains(s.Id)).OrderBy(s => s.SeriesNumber). + ThenBy(s => s.SeriesTime) + .ProjectTo(_mapper.ConfigurationProvider).FirstOrDefaultAsync(); + + if (item != null) { + item.SeriesInstanceUid = string.Empty; - var item = rowInfoList.FirstOrDefault(y => y.InstanceId == x.Id); - if (item != null) + var markInstanceIdList = rowInfoList.Where(y => y.InstanceId != null).OrderBy(x => x.ShowOrder).ThenBy(x => x.RowIndex).Select(y => y.InstanceId!.Value).Distinct().ToList(); + + item.InstanceInfoList = await _repository.Where(t => markInstanceIdList.Contains(t.Id)).OrderBy(t => t.InstanceNumber).Select(k => + new InstanceBasicInfo() + { + Id = k.Id, + NumberOfFrames = k.NumberOfFrames, + HtmlPath = k.HtmlPath, + Path = k.Path, + InstanceNumber = k.InstanceNumber, + + }).ToListAsync(); + + item.InstanceInfoList.ForEach(x => { - x.ShowOrder = item.ShowOrder; - x.RowIndex = item.RowIndex; - } - }); + var item = rowInfoList.FirstOrDefault(y => y.InstanceId == x.Id); + if (item != null) + { + x.ShowOrder = item.ShowOrder; + x.RowIndex = item.RowIndex; + } - item.InstanceInfoList.OrderBy(x => x.ShowOrder).ThenBy(x => x.RowIndex).ToList(); + }); + + item.InstanceInfoList.OrderBy(x => x.ShowOrder).ThenBy(x => x.RowIndex).ToList(); - item.InstanceCount = item.InstanceInfoList.Count; + item.InstanceCount = item.InstanceInfoList.Count; - item.Description = "Key Series"; + item.Description = "Key Series"; + + var modalityList = await _repository.Where(s => thisSeriesIdIds.Contains(s.Id)).OrderBy(s => s.SeriesNumber).ThenBy(s => s.SeriesTime).Select(x => x.Modality).Distinct().ToListAsync(); ; + item.Modality = string.Join(",", modalityList); + thisVisitTaskStudy.SeriesList.Add(item); + //thisVisitTaskStudy.SeriesCount = thisVisitTaskStudy.SeriesList.Count; + } + + + + studyList.Add(thisVisitTaskStudy); - var modalityList = await _repository.Where(s => thisSeriesIdIds.Contains(s.Id)).OrderBy(s => s.SeriesNumber).ThenBy(s => s.SeriesTime).Select(x => x.Modality).Distinct().ToListAsync(); ; - item.Modality = string.Join(",", modalityList); - thisVisitTaskStudy.SeriesList.Add(item); - thisVisitTaskStudy.SeriesCount = thisVisitTaskStudy.SeriesList.Count; } - studyList.Add(thisVisitTaskStudy); - } + studyList.ForEach(x => + { + x.SeriesList.ForEach(y => + { + y.IsBeMark = rowInfoList.Any(z => z.SeriesId == y.Id); + }); - + }); } - studyList.ForEach(x => - { - x.SeriesList.ForEach(y => - { - y.IsBeMark = rowInfoList.Any(z => z.SeriesId == y.Id); - }); - }); + #endregion } - #endregion - - - #region 非Dicom 检查查询 - var noDicomList = await _noneDicomStudyRepository.Where(x => x.TrialId == indto.TrialId && x.SubjectVisitId == indto.SujectVisitId).ToListAsync(); + var noDicomList = await _noneDicomStudyRepository.Where(x => x.TrialId == indto.TrialId && x.SubjectVisitId == indto.SujectVisitId) + .WhereIf(taskInfo.IsImageFilter == true, t => taskInfo.CriterionModalitys.Contains(t.Modality)).ToListAsync(); List noDicomStudyList = noDicomList.Select(x => new VisitStudyDTO() @@ -656,7 +683,7 @@ namespace IRaCIS.Core.Application.Services InstanceCount = x.FileCount, StudyId = x.Id, Modalities = x.Modality, - SeriesCount = 1, + //SeriesCount = 1, StudyCode = x.StudyCode, IsDicom = false, @@ -671,7 +698,7 @@ namespace IRaCIS.Core.Application.Services if (instanceCount == 0) { item.SeriesList = new List(); - item.SeriesCount = 0; + //item.SeriesCount = 0; } else { @@ -696,6 +723,7 @@ namespace IRaCIS.Core.Application.Services } studyList.AddRange(noDicomStudyList); + #endregion diff --git a/IRaCIS.Core.Application/Service/Visit/_MapConfig.cs b/IRaCIS.Core.Application/Service/Visit/_MapConfig.cs index b19696a98..35a01056d 100644 --- a/IRaCIS.Core.Application/Service/Visit/_MapConfig.cs +++ b/IRaCIS.Core.Application/Service/Visit/_MapConfig.cs @@ -1,6 +1,7 @@ using AutoMapper; using IRaCIS.Application.Contracts; using IRaCIS.Core.Application.Contracts; +using IRaCIS.Core.Application.Contracts.Dicom.DTO; using IRaCIS.Core.Application.MediatR.CommandAndQueries; using IRaCIS.Core.Domain.Share; @@ -101,6 +102,16 @@ namespace IRaCIS.Core.Application.Service .ForMember(d => d.SubjectCode, u => u.MapFrom(s => s.SubjectVisit.Subject.Code)) .ForMember(d => d.VisitName, u => u.MapFrom(s => s.SubjectVisit.VisitName)) .ForMember(d => d.TrialSiteCode, u => u.MapFrom(s => s.SubjectVisit.TrialSite.TrialSiteCode)); + + + CreateMap() + .ForMember(d => d.StudyId, u => u.MapFrom(s => s.Id)) + .ForMember(d => d.SeriesList, u => u.MapFrom(s => s.SeriesList)); + + CreateMap() + .ForMember(d => d.InstanceInfoList, u => u.MapFrom(s => s.InstanceList)); + + CreateMap(); } } diff --git a/IRaCIS.Core.Application/Service/WorkLoad/DoctorWorkloadService.cs b/IRaCIS.Core.Application/Service/WorkLoad/DoctorWorkloadService.cs index 4376ce2bb..773803cbf 100644 --- a/IRaCIS.Core.Application/Service/WorkLoad/DoctorWorkloadService.cs +++ b/IRaCIS.Core.Application/Service/WorkLoad/DoctorWorkloadService.cs @@ -252,7 +252,7 @@ namespace IRaCIS.Application.Services EnrollId = intoGroup.Id, IsEnable = allocateRule.IsEnable, - TrialReadingCriterionList = intoGroup.Trial.ReadingQuestionCriterionTrialList.Where(t => t.IsConfirm).Select(t => new TrialReadingCriterionDto() { TrialReadingCriterionId = t.Id, TrialReadingCriterionName = t.CriterionName, CriterionType = t.CriterionType, IsOncologyReading = t.IsOncologyReading, IsArbitrationReading = t.IsArbitrationReading, IsGlobalReading = t.IsGlobalReading, ReadingInfoSignTime = t.ReadingInfoSignTime, ReadingType = t.ReadingType }).ToList(), + TrialReadingCriterionList = intoGroup.Trial.TrialReadingCriterionList.Where(t => t.IsConfirm).Select(t => new TrialReadingCriterionDto() { TrialReadingCriterionId = t.Id, TrialReadingCriterionName = t.CriterionName, CriterionType = t.CriterionType, IsOncologyReading = t.IsOncologyReading, IsArbitrationReading = t.IsArbitrationReading, IsGlobalReading = t.IsGlobalReading, ReadingInfoSignTime = t.ReadingInfoSignTime, ReadingType = t.ReadingType }).ToList(), DoctorCriterionStatusList= intoGroup.EnrollReadingCriteriaList.Select(t=>new DoctorCriterionStatus() { diff --git a/IRaCIS.Core.Domain/Trial/Trial.cs b/IRaCIS.Core.Domain/Trial/Trial.cs index 76665a9be..7a714aea5 100644 --- a/IRaCIS.Core.Domain/Trial/Trial.cs +++ b/IRaCIS.Core.Domain/Trial/Trial.cs @@ -46,7 +46,7 @@ namespace IRaCIS.Core.Domain.Models [JsonIgnore] public List TrialUserList { get; set; } = new List(); [JsonIgnore] - public List ReadingQuestionCriterionTrialList { get; set; } = new List(); + public List TrialReadingCriterionList { get; set; } = new List(); [JsonIgnore] public List SubjectList { get; set; } = new List(); [JsonIgnore]