diff --git a/IRaCIS.Core.Application/IRaCIS.Core.Application.xml b/IRaCIS.Core.Application/IRaCIS.Core.Application.xml index d98b3e3ce..62dcea97d 100644 --- a/IRaCIS.Core.Application/IRaCIS.Core.Application.xml +++ b/IRaCIS.Core.Application/IRaCIS.Core.Application.xml @@ -4466,6 +4466,11 @@ 上传方式 + + + 临床级别 + + 上传角色 diff --git a/IRaCIS.Core.Application/Service/QC/QCListService.cs b/IRaCIS.Core.Application/Service/QC/QCListService.cs index 89841ef0d..e3d5a858c 100644 --- a/IRaCIS.Core.Application/Service/QC/QCListService.cs +++ b/IRaCIS.Core.Application/Service/QC/QCListService.cs @@ -77,8 +77,8 @@ namespace IRaCIS.Core.Application.Image.QA var pageList = await query.ToPagedListAsync(visitSearchDTO.PageIndex, visitSearchDTO.PageSize, visitSearchDTO.SortField, visitSearchDTO.Asc, string.IsNullOrWhiteSpace(visitSearchDTO.SortField), defalutSortArray); var config = await _repository.Where(t => t.Id == visitSearchDTO.TrialId).ProjectTo(_mapper.ConfigurationProvider).FirstOrDefaultAsync().IfNullThrowException(); - config.IsHaveSubjectClinicalData = await _clinicalDataTrialSet.AnyAsync(x => x.TrialId == visitSearchDTO.TrialId && x.IsConfirm && x.ClinicalDataLevel == ClinicalLevel.Subject && x.UploadRole == UploadRole.CRC); - config.IsHaveVisitClinicalData = await _clinicalDataTrialSet.AnyAsync(x => x.TrialId == visitSearchDTO.TrialId && x.IsConfirm && x.ClinicalDataLevel == ClinicalLevel.SubjectVisit && x.UploadRole == UploadRole.CRC); + config.IsHaveSubjectClinicalData = await _clinicalDataTrialSet.AnyAsync(x => x.TrialId == visitSearchDTO.TrialId && x.IsConfirm && (x.ClinicalDataLevel == ClinicalLevel.Subject || x.ClinicalDataLevel == ClinicalLevel.Study) && x.UploadRole == UploadRole.CRC); + config.IsHaveVisitClinicalData = await _clinicalDataTrialSet.AnyAsync(x => x.TrialId == visitSearchDTO.TrialId && x.IsConfirm && (x.ClinicalDataLevel == ClinicalLevel.SubjectVisit|| x.ClinicalDataLevel == ClinicalLevel.Study) && x.UploadRole == UploadRole.CRC); return (pageList, config); } diff --git a/IRaCIS.Core.Application/Service/QC/QCOperationService.cs b/IRaCIS.Core.Application/Service/QC/QCOperationService.cs index ef7a47d5c..0f57335a5 100644 --- a/IRaCIS.Core.Application/Service/QC/QCOperationService.cs +++ b/IRaCIS.Core.Application/Service/QC/QCOperationService.cs @@ -28,7 +28,8 @@ namespace IRaCIS.Core.Application.Image.QA private readonly IRepository _qcChallengeRepository; private readonly IRepository _dicomStudyRepository; private readonly IRepository _dicomSeriesrepository; - private readonly IRepository _subjectRepository; + private readonly IReadingClinicalDataService _readingClinicalDataService; + private readonly IRepository _subjectRepository; private readonly IRepository _readingClinicalDataRepository; private readonly IRepository _qCChallengeDialogrepository; private readonly IRepository _checkChallengeDialogrepository; @@ -43,7 +44,8 @@ namespace IRaCIS.Core.Application.Image.QA IRepository visitTaskRepository, IRepository dicomStudyRepository, IRepository dicomSeriesrepository, - IRepository subjectRepository, + IReadingClinicalDataService readingClinicalDataService, + IRepository subjectRepository, IRepository readingClinicalDataRepository, IRepository qCChallengeDialogrepository, IRepository checkChallengeDialogrepository, @@ -55,7 +57,8 @@ namespace IRaCIS.Core.Application.Image.QA _qcChallengeRepository = qcChallengeRepository; _dicomStudyRepository = dicomStudyRepository; this._dicomSeriesrepository = dicomSeriesrepository; - this._subjectRepository = subjectRepository; + this._readingClinicalDataService = readingClinicalDataService; + this._subjectRepository = subjectRepository; this._readingClinicalDataRepository = readingClinicalDataRepository; this._qCChallengeDialogrepository = qCChallengeDialogrepository; this._checkChallengeDialogrepository = checkChallengeDialogrepository; @@ -1220,7 +1223,33 @@ namespace IRaCIS.Core.Application.Image.QA public async Task CRCRequestToQC(CRCRequestToQCCommand cRCRequestToQCCommand) { - var trialId = cRCRequestToQCCommand.TrialId; + // 验证临床数据 是否有Pet类型 + #region 验证临床数据 是否有Pet类型 + foreach (var item in cRCRequestToQCCommand.SubjectVisitIds) + { + if (await _dicomStudyRepository.AnyAsync(x => x.SubjectVisitId == item && x.Modalities == "CT")) + { + var visit = await _subjectVisitRepository.Where(x => x.Id == item).FirstNotNullAsync(); + var clinicalData = await this._readingClinicalDataService.GetCRCClinicalData(new Service.Reading.Dto.GetCRCClinicalDataInDto() + { + IsBaseline = visit.IsBaseLine, + SubjectId = visit.SubjectId, + SubjectVisitId = item, + TrialId = cRCRequestToQCCommand.TrialId, + }); + + if (clinicalData.Any(x => x.ClinicalDataLevel == ClinicalLevel.Study && x.ClinicalUploadType == ClinicalUploadType.PDF && x.PDFFileList.Count() == 0)) + { + throw new BusinessValidationFailedException(_localizer["QCOperation_NeedStudyClinical"]); + } + } + + + } + #endregion + + + var trialId = cRCRequestToQCCommand.TrialId; var trialConfig = (await _trialRepository .Select(t => new { TrialId = t.Id, t.QCProcessEnum, t.IsImageConsistencyVerification, t.IsUrgent, t.IsHaveFirstGiveMedicineDate, t.ClinicalInformationTransmissionEnum }) diff --git a/IRaCIS.Core.Application/Service/Reading/ClinicalData/ClinicalAnswerService.cs b/IRaCIS.Core.Application/Service/Reading/ClinicalData/ClinicalAnswerService.cs index a1424d670..761800f5b 100644 --- a/IRaCIS.Core.Application/Service/Reading/ClinicalData/ClinicalAnswerService.cs +++ b/IRaCIS.Core.Application/Service/Reading/ClinicalData/ClinicalAnswerService.cs @@ -193,6 +193,17 @@ namespace IRaCIS.Core.Application.Service ReadingId = n.VisitId, TrialId = inDto.TrialId }).ToList()); + + readingClinicalDatas.AddRange( + dataTrialSetList.Where(x => x.ClinicalDataLevel == ClinicalLevel.Study).Where(x => clinicalDataList.Where(y => y.ClinicalDataTrialSetId == x.Id && y.ReadingId == n.VisitId).Count() == 0) + .Select(x => new ReadingClinicalData() + { + ClinicalDataTrialSetId = x.Id, + IsVisit = true, + SubjectId = n.SubjectId, + ReadingId = n.VisitId, + TrialId = inDto.TrialId + }).ToList()); }); diff --git a/IRaCIS.Core.Application/Service/Reading/ClinicalData/ReadingClinicalDataService.cs b/IRaCIS.Core.Application/Service/Reading/ClinicalData/ReadingClinicalDataService.cs index 633c2597d..61f027698 100644 --- a/IRaCIS.Core.Application/Service/Reading/ClinicalData/ReadingClinicalDataService.cs +++ b/IRaCIS.Core.Application/Service/Reading/ClinicalData/ReadingClinicalDataService.cs @@ -195,7 +195,8 @@ namespace IRaCIS.Application.Services Id = x.Id, ClinicalDataSetName = x.ClinicalDataTrialSet.ClinicalDataSetName.LanguageName(x.ClinicalDataTrialSet.ClinicalDataSetEnName, _userInfo.IsEn_Us) , ClinicalUploadType = x.ClinicalDataTrialSet.ClinicalUploadType, - ClinicalDataSetEnName=x.ClinicalDataTrialSet.ClinicalDataSetEnName, + ClinicalDataLevel=x.ClinicalDataTrialSet.ClinicalDataLevel, + ClinicalDataSetEnName =x.ClinicalDataTrialSet.ClinicalDataSetEnName, ClinicalDataTrialSetId = x.ClinicalDataTrialSet.Id, FileName = x.ClinicalDataTrialSet.FileName, UploadRole = x.ClinicalDataTrialSet.UploadRole, diff --git a/IRaCIS.Core.Application/Service/Reading/Dto/ReadingClinicalDataDto.cs b/IRaCIS.Core.Application/Service/Reading/Dto/ReadingClinicalDataDto.cs index cd3713b1f..39262facc 100644 --- a/IRaCIS.Core.Application/Service/Reading/Dto/ReadingClinicalDataDto.cs +++ b/IRaCIS.Core.Application/Service/Reading/Dto/ReadingClinicalDataDto.cs @@ -87,6 +87,11 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto /// public ClinicalUploadType ClinicalUploadType { get; set; } + /// + /// 临床级别 + /// + public ClinicalLevel ClinicalDataLevel { get; set; } + /// /// 上传角色 diff --git a/IRaCIS.Core.Application/Service/Reading/Dto/ReadingImageTaskViewModel.cs b/IRaCIS.Core.Application/Service/Reading/Dto/ReadingImageTaskViewModel.cs index 3d6a8c9ea..bc8d32f50 100644 --- a/IRaCIS.Core.Application/Service/Reading/Dto/ReadingImageTaskViewModel.cs +++ b/IRaCIS.Core.Application/Service/Reading/Dto/ReadingImageTaskViewModel.cs @@ -1317,7 +1317,9 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto public bool IsBaseLine { get; set; } - public bool IsHaveChange { get; set; } + public decimal VisitNum { get; set; } + + public bool IsHaveChange { get; set; } public string VisitRemark { get; set; } = string.Empty; diff --git a/IRaCIS.Core.Application/Service/Reading/Interface/IReadingClinicalDataService.cs b/IRaCIS.Core.Application/Service/Reading/Interface/IReadingClinicalDataService.cs index 94705f59a..82c175fb6 100644 --- a/IRaCIS.Core.Application/Service/Reading/Interface/IReadingClinicalDataService.cs +++ b/IRaCIS.Core.Application/Service/Reading/Interface/IReadingClinicalDataService.cs @@ -24,6 +24,9 @@ namespace IRaCIS.Core.Application.Contracts Task> GetReadingClinicalList(GetReadingClinicalDataListIndto inDto); - Task DealVisiTaskClinicalDataSignedAsync(Guid trialId, Guid subjectId, Guid readingId, bool isVisit, Guid trialReadingCritrialId); + Task> GetCRCClinicalData(GetCRCClinicalDataInDto inDto); + + + Task DealVisiTaskClinicalDataSignedAsync(Guid trialId, Guid subjectId, Guid readingId, bool isVisit, Guid trialReadingCritrialId); } } \ No newline at end of file diff --git a/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingImageTaskService.cs b/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingImageTaskService.cs index 00765027c..d99d8d493 100644 --- a/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingImageTaskService.cs +++ b/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingImageTaskService.cs @@ -1512,12 +1512,11 @@ namespace IRaCIS.Application.Services /// /// [HttpPost] - [TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "AfterStopCannNotOpt" })] public async Task MergeLesion(MergeLesionInDto inDto) { await VerifyTaskIsSign(inDto.VisitTaskId); await this.VerifyIsBaseLineTask(inDto.VisitTaskId); - var taskinfo = await _visitTaskRepository.Where(x => x.Id == inDto.MergeMainRowId).Include(x => x.TrialReadingCriterion).FirstNotNullAsync(); + var taskinfo = await _visitTaskRepository.Where(x => x.Id == inDto.VisitTaskId).Include(x => x.TrialReadingCriterion).FirstNotNullAsync(); var mergeRow = await _readingTableAnswerRowInfoRepository.Where(x => x.Id == inDto.MergeMainRowId).Include(x => x.ReadingQuestionTrial).FirstNotNullAsync(); var mark = mergeRow.ReadingQuestionTrial.OrderMark + mergeRow.RowIndex.GetLesionMark(); diff --git a/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingOncologyTaskService.cs b/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingOncologyTaskService.cs index 438de68c8..ca38c5187 100644 --- a/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingOncologyTaskService.cs +++ b/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingOncologyTaskService.cs @@ -215,7 +215,9 @@ namespace IRaCIS.Application.Services { VisitName = x.SourceSubjectVisit.VisitName, IsBaseLine = x.SourceSubjectVisit.IsBaseLine, - VisitTaskId = x.Id, + VisitNum=x.SourceSubjectVisit.VisitNum, + + VisitTaskId = x.Id, // QuestionList = x.ReadingTaskQuestionAnswerList.Where(y => y.ReadingQuestionTrial.IsJudgeQuestion).OrderBy(y => y.ReadingQuestionTrial.ShowOrder) //.Select(y => new OncologyQuestion() //{ @@ -225,7 +227,7 @@ namespace IRaCIS.Application.Services //}).ToList() }).ToListAsync(); - var oncologyReadingQuestions = await _readingOncologyTaskInfoRepository.Where(x => x.OncologyTaskId == inDto.VisitTaskId).ToListAsync(); + var oncologyReadingQuestions = await _readingOncologyTaskInfoRepository.Where(x => x.OncologyTaskId == inDto.VisitTaskId).Include(x=>x.VisitTask).ToListAsync(); // 上一次肿瘤学阅片 var lastOncologyTask = await _visitTaskRepository.Where(x => @@ -241,7 +243,7 @@ namespace IRaCIS.Application.Services if (lastOncologyTask != null&& taskInfo.TaskState==TaskState.Effect&&taskInfo.ReadingTaskState!=ReadingTaskState.HaveSigned) { - lastOncologyAnswerList= await _readingOncologyTaskInfoRepository.Where(x => x.OncologyTaskId == lastOncologyTask.Id).ToListAsync(); + lastOncologyAnswerList= await _readingOncologyTaskInfoRepository.Where(x => x.OncologyTaskId == lastOncologyTask.Id).Include(x => x.VisitTask).ToListAsync(); } @@ -249,7 +251,8 @@ namespace IRaCIS.Application.Services oncologyVisits.ForEach(x => { var oncologyData = oncologyReadingQuestions.Where(y => y.VisitTaskId == x.VisitTaskId).FirstOrDefault(); - var lastOncologyData = lastOncologyAnswerList.Where(y => y.VisitTaskId == x.VisitTaskId).FirstOrDefault(); + /// 根据任务编号匹配 不区分 r1 r2 + var lastOncologyData = lastOncologyAnswerList.Where(y => y.VisitTask.VisitTaskNum == x.VisitNum).FirstOrDefault(); var evaluationResult = string.Empty; var evaluationReason = string.Empty; diff --git a/IRaCIS.Core.Domain.Share/Reading/ReadEnum.cs b/IRaCIS.Core.Domain.Share/Reading/ReadEnum.cs index eef85caef..42f5cdb4a 100644 --- a/IRaCIS.Core.Domain.Share/Reading/ReadEnum.cs +++ b/IRaCIS.Core.Domain.Share/Reading/ReadEnum.cs @@ -1767,7 +1767,12 @@ public enum SUVChangeVSBaseline /// [DisplayAttribute(Name = "肿瘤学阅片")] OncologyRead = 3, - } + + /// + /// 检查 + /// + Study=4, + } /// /// 全局答案类型