diff --git a/IRaCIS.Core.API/Controllers/InspectionController.cs b/IRaCIS.Core.API/Controllers/InspectionController.cs index defe64133..8018bc159 100644 --- a/IRaCIS.Core.API/Controllers/InspectionController.cs +++ b/IRaCIS.Core.API/Controllers/InspectionController.cs @@ -11,6 +11,7 @@ using IRaCIS.Core.Application.Service; using IRaCIS.Core.Application.Service.Inspection.DTO; using IRaCIS.Core.Application.Service.Inspection.Interface; using IRaCIS.Core.Application.Service.Reading.Dto; +using IRaCIS.Core.Application.Service.Reading.Interface; using IRaCIS.Core.Application.ViewModel; using IRaCIS.Core.Domain.Models; using IRaCIS.Core.Domain.Share; @@ -36,6 +37,7 @@ namespace IRaCIS.Core.API.Controllers private readonly IHttpContextAccessor _httpContext; private readonly ITrialConfigService _trialConfigService; private readonly INoneDicomStudyService _noneDicomStudyService; + private readonly IClinicalAnswerService _clinicalAnswerService; private readonly ISubjectService _subjectService; private readonly IReadingClinicalDataService _readingClinicalDataService; private readonly ISubjectVisitService _subjectVisitService; @@ -62,6 +64,7 @@ namespace IRaCIS.Core.API.Controllers IReadingMedicineQuestionService readingMedicineQuestionService, ITrialConfigService _trialConfigService, INoneDicomStudyService noneDicomStudyService, + IClinicalAnswerService clinicalAnswerService, ISubjectService _subjectService, IReadingClinicalDataService _readingClinicalDataService, ISubjectVisitService subjectVisitService, @@ -82,6 +85,7 @@ namespace IRaCIS.Core.API.Controllers this._httpContext = httpContext; this._trialConfigService = _trialConfigService; this._noneDicomStudyService = noneDicomStudyService; + this._clinicalAnswerService = clinicalAnswerService; this._subjectService = _subjectService; this._readingClinicalDataService = _readingClinicalDataService; this._subjectVisitService = subjectVisitService; @@ -233,6 +237,58 @@ namespace IRaCIS.Core.API.Controllers } + /// + /// CRC签名临床数据 + /// + /// + /// + [HttpPost, Route("Inspection/ClinicalAnswer/CRCSignClinicalData")] + [TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "AfterStopCannNotOpt" })] + + [UnitOfWork] + public async Task CRCSignClinicalData(DataInspectionDto opt) + { + var singid = await _inspectionService.RecordSing(opt.SignInfo); + var result = await _clinicalAnswerService.CRCSignClinicalData(opt.Data); + await _inspectionService.CompletedSign(singid, result); + return result; + } + + /// + /// PM确认临床数据 + /// + /// + /// + [HttpPost, Route("Inspection/ClinicalAnswer/PMConfirmClinical")] + [TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "AfterStopCannNotOpt" })] + + [UnitOfWork] + public async Task PMConfirmClinical(DataInspectionDto opt) + { + var singid = await _inspectionService.RecordSing(opt.SignInfo); + var result = await _clinicalAnswerService.PMConfirmClinical(opt.Data); + await _inspectionService.CompletedSign(singid, result); + return result; + } + + + /// + /// 提交结构化录入并签名 + /// + /// + /// + [HttpPost, Route("Inspection/ClinicalAnswer/SubmitClinicalFormAndSign")] + [TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "AfterStopCannNotOpt" })] + + [UnitOfWork] + public async Task SubmitClinicalFormAndSign(DataInspectionDto opt) + { + var singid = await _inspectionService.RecordSing(opt.SignInfo); + var result = await _clinicalAnswerService.SubmitClinicalForm(opt.Data); + await _inspectionService.CompletedSign(singid, result); + return result; + } + /// /// 提交阅片裁判问题 /// diff --git a/IRaCIS.Core.API/IRaCIS.Core.API.xml b/IRaCIS.Core.API/IRaCIS.Core.API.xml index 045a819ce..7e6ee7ae3 100644 --- a/IRaCIS.Core.API/IRaCIS.Core.API.xml +++ b/IRaCIS.Core.API/IRaCIS.Core.API.xml @@ -139,6 +139,27 @@ + + + CRC签名临床数据 + + + + + + + PM确认临床数据 + + + + + + + 提交结构化录入并签名 + + + + 提交阅片裁判问题 diff --git a/IRaCIS.Core.API/_ServiceExtensions/EFSetup.cs b/IRaCIS.Core.API/_ServiceExtensions/EFSetup.cs index 8e737a5a2..c1d2c31cc 100644 --- a/IRaCIS.Core.API/_ServiceExtensions/EFSetup.cs +++ b/IRaCIS.Core.API/_ServiceExtensions/EFSetup.cs @@ -37,6 +37,7 @@ namespace IRaCIS.Core.API triggerOptions.AddTrigger(); triggerOptions.AddTrigger(); triggerOptions.AddTrigger(); + triggerOptions.AddTrigger(); triggerOptions.AddTrigger(); triggerOptions.AddTrigger(); triggerOptions.AddTrigger(); diff --git a/IRaCIS.Core.Application/IRaCIS.Core.Application.xml b/IRaCIS.Core.Application/IRaCIS.Core.Application.xml index 8ec9ae1cf..36cf82d1c 100644 --- a/IRaCIS.Core.Application/IRaCIS.Core.Application.xml +++ b/IRaCIS.Core.Application/IRaCIS.Core.Application.xml @@ -2499,6 +2499,13 @@ 临床答案 + + + CRC签名临床数据 + + + + 自动添加CRC临床数据 @@ -2542,6 +2549,13 @@ + + + 获取PM待确认列表 + + + + 获取CRC确认列表 @@ -2556,6 +2570,20 @@ + + + 获取临床数据表格信息 查看没有表格问题的列表 + + + + + + + 获取临床数据表格信息 查看有表格问题的列表 + + + + CRC 确认临床数据 @@ -2738,6 +2766,36 @@ + + + 上传角色 + + + + + 访视Id 或者模块Id + + + + + 临床级别 + + + + + 上传方式 + + + + + 模块名称 + + + + + 受试者Id + + 临床级别 @@ -2748,16 +2806,16 @@ 受试者ID + + + 模块名称 + + 最晚拍片日期 - - - VisitId - - VisitId @@ -10687,6 +10745,13 @@ vvv + + + 获取PM核对临床数据 + + + + SPM 阅片人筛选 diff --git a/IRaCIS.Core.Application/Service/Reading/ClinicalData/ClinicalAnswerService.cs b/IRaCIS.Core.Application/Service/Reading/ClinicalData/ClinicalAnswerService.cs index 5ee443924..1c28eb9e4 100644 --- a/IRaCIS.Core.Application/Service/Reading/ClinicalData/ClinicalAnswerService.cs +++ b/IRaCIS.Core.Application/Service/Reading/ClinicalData/ClinicalAnswerService.cs @@ -87,6 +87,25 @@ namespace IRaCIS.Core.Application.Service _iClinicalQuestionService = iClinicalQuestionService; } + /// + /// CRC签名临床数据 + /// + /// + /// + [HttpPost] + public async Task CRCSignClinicalData(CRCSignClinicalDataInDto inDto) + { + + await _readingClinicalDataRepository.UpdatePartialFromQueryAsync(x =>x.Id==inDto.ReadingClinicalDataId, x => new ReadingClinicalData() + { + IsSign = true, + ReadingClinicalDataState = ReadingClinicalDataStatus.HaveSigned + }); + + await _readingClinicalDataRepository.SaveChangesAsync(); + return ResponseOutput.Ok(true); + } + /// /// 自动添加CRC临床数据 /// @@ -199,7 +218,13 @@ namespace IRaCIS.Core.Application.Service SubjectId=x.SubjectId, SubjectCode=x.Subject.Code, TrialId=inDto.TrialId, - ClinicalDataTrialSetId = x.ClinicalDataTrialSet.Id, + ReadingId= x.ReadingId, + ReadingClinicalDataId=x.Id, + UploadRole = x.ClinicalDataTrialSet.UploadRole, + ClinicalDataLevel = x.ClinicalDataTrialSet.ClinicalDataLevel, + ClinicalUploadType= x.ClinicalDataTrialSet.ClinicalUploadType, + BaseLineVisitId= x.Subject.SubjectVisitList.Where(x=>x.IsBaseLine).Select(x=>x.Id).FirstOrDefault(), + ClinicalDataTrialSetId = x.ClinicalDataTrialSet.Id, ClinicalDataSetEnName= x.ClinicalDataTrialSet.ClinicalDataSetEnName, ClinicalDataSetName = x.ClinicalDataTrialSet.ClinicalDataSetName, }); @@ -320,8 +345,20 @@ namespace IRaCIS.Core.Application.Service TrialId= inDto.TrialId, Id = inDto.ClinicalFormId ?? NewId.NextGuid(), ReadingId = inDto.ReadingId, - VisitId = inDto.VisitId, }; + + + var existsClinical = await _clinicalFormRepository.Where(x => + x.SubjectId == inDto.SubjectId + && x.ClinicalDataTrialSetId == inDto.ClinicalDataTrialSetId + ).WhereIf(inDto.ReadingId != null, x => x.ReadingId == inDto.ReadingId) + .Where(x => x.ClinicalDataTrialSet.UploadRole != UploadRole.CRC && (x.ClinicalDataTrialSet.ClinicalDataLevel != ClinicalLevel.ImageRead + || x.ClinicalDataTrialSet.ClinicalDataLevel != ClinicalLevel.OncologyRead)).AnyAsync(); + + if (existsClinical) + { + throw new BusinessValidationFailedException("已经添加过临床数据,不允许多次添加!"); + } try { var checkDateQuestionId = await _trialClinicalQuestionRepository.Where(x => x.TrialClinicalId == inDto.ClinicalDataTrialSetId && x.IsCheckDate).Select(x => x.Id).FirstNotNullAsync(); @@ -335,7 +372,7 @@ namespace IRaCIS.Core.Application.Service if (clinicalForm.CheckDate != null) { - if (await _readModuleRepository.AnyAsync(x => x.SubjectVisit.LatestScanDate <= clinicalForm.CheckDate && x.IsCRCConfirm)) + if (await _readModuleRepository.AnyAsync(x =>x.SubjectId== inDto.SubjectId&& x.SubjectVisit.LatestScanDate <= clinicalForm.CheckDate && x.IsCRCConfirm)) { throw new BusinessValidationFailedException("无法添加和修改当前日期的临床数据,因为CRC已经确认!"); } @@ -396,7 +433,13 @@ namespace IRaCIS.Core.Application.Service await _clinicalAnswerRowInfoRepository.BatchDeleteNoTrackingAsync(x => x.ClinicalFormId == inDto.ClinicalFormId); await _clinicalTableAnswerRepository.BatchDeleteNoTrackingAsync(x => x.ClinicalFormId == inDto.ClinicalFormId); } - + if(inDto.ReadingId!=null) + { + await _readingClinicalDataRepository.UpdatePartialFromQueryAsync(x => x.ReadingId == inDto.ReadingId && x.ClinicalDataTrialSetId == inDto.ClinicalDataTrialSetId, x => new ReadingClinicalData() + { + IsSign = true + }); + } await _clinicalFormRepository.AddAsync(clinicalForm); await _clinicalQuestionAnswerRepository.AddRangeAsync(clinicalQuestionAnswers); await _clinicalAnswerRowInfoRepository.AddRangeAsync(clinicalAnswerRowInfos); @@ -427,28 +470,54 @@ namespace IRaCIS.Core.Application.Service return ResponseOutput.Ok(true); } - /// - /// 获取CRC确认列表 - /// - /// - /// - [HttpPost] + /// + /// 获取PM待确认列表 + /// + /// + /// + [HttpPost] + public async Task> GetPMConfirmList(GetPMConfirmListInDto inDto) + { + return await GetCRCConfirmList(new GetCRCConfirmListInDto() + { + TrialId = inDto.TrialId, + IsCRCConfirm = true, + IsPMConfirm = false, + PageIndex = inDto.PageIndex, + PageSize = inDto.PageSize, + Asc = inDto.Asc, + SortField = inDto.SortField, + TrialReadingCriterionId = inDto.TrialReadingCriterionId + + }); + } + + /// + /// 获取CRC确认列表 + /// + /// + /// + [HttpPost] public async Task> GetCRCConfirmList(GetCRCConfirmListInDto inDto) { var query = _readModuleRepository.Where(x => x.TrialId == inDto.TrialId) .WhereIf(inDto.ReadModuleId != null, x => x.Id == inDto.ReadModuleId) - .WhereIf(inDto.TrialReadingCriterionId != null, x => x.TrialReadingCriterionId == inDto.TrialReadingCriterionId) + .WhereIf(inDto.IsCRCConfirm != null, x => x.IsCRCConfirm == inDto.IsCRCConfirm) + .WhereIf(inDto.IsPMConfirm != null, x => x.IsPMConfirm == inDto.IsPMConfirm) + .WhereIf(inDto.TrialReadingCriterionId != null, x => x.TrialReadingCriterionId == inDto.TrialReadingCriterionId) .WhereIf(inDto.SubjectId != null, x => x.SubjectId == inDto.SubjectId) .Select(x => new GetCRCConfirmListOutDto() { SubjectId = x.SubjectId, IsCRCConfirm = x.IsCRCConfirm, + VisitBlindName=x.SubjectVisit.BlindName, LatestScanDate = x.SubjectVisit.LatestScanDate, ReadingSetType = x.ReadingSetType, IsPMConfirm = x.IsPMConfirm, SubjectCode = x.Subject.Code, ReadModuleId = x.Id, + ModuleName=x.ModuleName, }); @@ -460,6 +529,7 @@ namespace IRaCIS.Core.Application.Service .Include(x=>x.ClinicalDataTrialSet) .Select(x => new CRCClinicalForm { + SubjectId=x.SubjectId, CheckDate = x.CheckDate, ClinicalDataLevel = x.ClinicalDataTrialSet.ClinicalDataLevel, ClinicalFormId = x.Id, @@ -468,7 +538,9 @@ namespace IRaCIS.Core.Application.Service ClinicalDataSetEnName=x.ClinicalDataTrialSet.ClinicalDataSetEnName, IsHaveTableQuestion=x.ClinicalDataTrialSet.TrialClinicalQuestionList.Any(y=>y.ClinicalQuestionType== ReadingQestionType.Table), }).ToListAsync(); - var confirmList = await _readModuleCriterionFromRepository.Where(x => x.TrialId == inDto.TrialId) + var confirmList = await _readModuleCriterionFromRepository.Where(x => x.TrialId == inDto.TrialId + &&x.ClinicalForm.ClinicalDataTrialSet.UploadRole== UploadRole.CRC + &&(x.ClinicalForm.ClinicalDataTrialSet.ClinicalDataLevel==ClinicalLevel.ImageRead|| x.ClinicalForm.ClinicalDataTrialSet.ClinicalDataLevel == ClinicalLevel.OncologyRead)) .Select(x => new GetCRCBeConfirm { CheckDate = x.ClinicalForm.CheckDate ?? default(DateTime), @@ -498,7 +570,8 @@ namespace IRaCIS.Core.Application.Service { if (x.ReadingSetType == ReadingSetType.ImageReading) { - x.ClinicalFormList = formList.Where(y => y.ClinicalDataLevel == ClinicalLevel.ImageRead&&y.CheckDate <= x.LatestScanDate) + x.ClinicalFormList = formList.Where(y => y.ClinicalDataLevel == ClinicalLevel.ImageRead&&y.CheckDate <= x.LatestScanDate&&y.SubjectId==x.SubjectId) + .Select(y => new GetCRCBeConfirmListOutDto() { CheckDate = y.CheckDate ?? default(DateTime), @@ -511,7 +584,7 @@ namespace IRaCIS.Core.Application.Service } else { - x.ClinicalFormList = formList.Where(y => y.ClinicalDataLevel == ClinicalLevel.OncologyRead&&y.CheckDate <= x.LatestScanDate) + x.ClinicalFormList = formList.Where(y => y.ClinicalDataLevel == ClinicalLevel.OncologyRead&&y.CheckDate <= x.LatestScanDate && y.SubjectId == x.SubjectId) .Select(y => new GetCRCBeConfirmListOutDto() { CheckDate = y.CheckDate ?? default(DateTime), @@ -553,10 +626,10 @@ namespace IRaCIS.Core.Application.Service /// /// [HttpPost] - public async Task> GetClinicalTableList(GetClinicalTableListInDto inDto) + public async Task<(List,object)> GetClinicalTableList(GetClinicalTableListInDto inDto) { - var readModule=await _readModuleRepository.Where(x => x.Id == inDto.ReadModuleId).FirstNotNullAsync(): + var readModule=await _readModuleRepository.Where(x => x.Id == inDto.ReadModuleId).FirstNotNullAsync(); var confirmList = (await this.GetCRCConfirmList(new GetCRCConfirmListInDto() { @@ -585,13 +658,14 @@ namespace IRaCIS.Core.Application.Service List result = new List(); clinicalDataTrialSetIds.ForEach(x => { GetClinicalTableListOutDto dto = new GetClinicalTableListOutDto(); + dto.ModuleName = readModule.ModuleName; dto.ClinicalDataSetName = confirmList.Where(y => y.ClinicalDataTrialSetId == x).Select(y => y.ClinicalDataSetName).First(); dto.QuestionList = questionList.Where(y => y.TrialClinicalId == x).OrderBy(y => y.ShowOrder).ToList(); dto.AnswerList = new List>(); var ClinicalFormIds= answers.Where(y => y.ClinicalDataTrialSetId == x).OrderBy(x => x.CheckDate).Select(x => x.ClinicalFormId).Distinct().ToList(); ClinicalFormIds.ForEach(z => { - var dic = answers.Where(y => y.ClinicalDataTrialSetId == x).OrderBy(y => y.CheckDate).ToDictionary(x => x.QuestionId.ToString(), x => x.Answer); + var dic = answers.Where(y => y.ClinicalFormId == z).OrderBy(y => y.CheckDate).ToDictionary(x => x.QuestionId.ToString(), x => x.Answer); dic.Add("ClinicalFormId", z.ToString()); dic.Add("TrialId", inDto.TrialId.ToString()); dic.Add("SubjectId", readModule.SubjectId.ToString()); @@ -602,9 +676,12 @@ namespace IRaCIS.Core.Application.Service }); result.Add(dto); }); - return result; + return (result, new + { + readModule.ModuleName, + }); - } + } /// @@ -613,9 +690,10 @@ namespace IRaCIS.Core.Application.Service /// /// [HttpPost] - public async Task> GetClinicalDateList(GetCRCBeConfirmListInDto inDto) + public async Task<(List,object)> GetClinicalDateList(GetCRCBeConfirmListInDto inDto) { - var confirmList = (await this.GetCRCConfirmList(new GetCRCConfirmListInDto() + var readModule = await _readModuleRepository.Where(x => x.Id == inDto.ReadModuleId).FirstNotNullAsync(); + var confirmList = (await this.GetCRCConfirmList(new GetCRCConfirmListInDto() { ReadModuleId = inDto.ReadModuleId, TrialId = inDto.TrialId, @@ -633,7 +711,6 @@ namespace IRaCIS.Core.Application.Service result.Add(new GetClinicalDateListOutDto() { - ClinicalDataSetName = confirmList.Where(y => y.ClinicalDataTrialSetId == x).Select(y => y.ClinicalDataSetName).First(), DateList = confirmList.Where(y => y.ClinicalDataTrialSetId == x).ToList() @@ -641,7 +718,9 @@ namespace IRaCIS.Core.Application.Service }); - return result; + return (result,new { + readModule.ModuleName, + }); } /// @@ -759,7 +838,7 @@ namespace IRaCIS.Core.Application.Service await _readModuleRepository.UpdatePartialFromQueryAsync(x => inDto.ReadModuleId == x.Id, x => new ReadModule() { - IsPMConfirm = false + IsPMConfirm = true }); await _readModuleRepository.SaveChangesAsync(); diff --git a/IRaCIS.Core.Application/Service/Reading/ClinicalData/ClinicalDataSetService.cs b/IRaCIS.Core.Application/Service/Reading/ClinicalData/ClinicalDataSetService.cs index 75207345c..110f6c134 100644 --- a/IRaCIS.Core.Application/Service/Reading/ClinicalData/ClinicalDataSetService.cs +++ b/IRaCIS.Core.Application/Service/Reading/ClinicalData/ClinicalDataSetService.cs @@ -66,8 +66,11 @@ namespace IRaCIS.Application.Services && x.ClinicalUploadType == ClinicalUploadType.Structuring && x.UploadRole == UploadRole.CRC ); - - if (_systemClinicalQuestionRepository.Where(x => isNeedVerify&& x.SystemClinicalId == inDto.SystemClinicalId && x.IsCheckDate).Count() != 1) + if (_systemClinicalQuestionRepository.Where(x => x.SystemClinicalId == inDto.SystemClinicalId).Count() == 0) + { + throw new BusinessValidationFailedException("当前临床数据未配置问题,请先配置问题之后再应用"); + } + if (isNeedVerify&&_systemClinicalQuestionRepository.Where(x => x.SystemClinicalId == inDto.SystemClinicalId && x.IsCheckDate).Count() != 1) { throw new BusinessValidationFailedException(_localizer["ClinicalDataSet_Apply"]); @@ -98,7 +101,12 @@ namespace IRaCIS.Application.Services && x.ClinicalUploadType == ClinicalUploadType.Structuring && x.UploadRole == UploadRole.CRC ); - if (_trialClinicalQuestionRepository.Where(x => isNeedVerify&& x.TrialClinicalId == inDto.TrialClinicalId && x.IsCheckDate).Count() != 1) + if (_trialClinicalQuestionRepository.Where(x => x.TrialClinicalId == inDto.TrialClinicalId).Count() == 0) + { + throw new BusinessValidationFailedException("当前临床数据未配置问题,请先配置问题之后再应用"); + } + + if (isNeedVerify&&_trialClinicalQuestionRepository.Where(x => x.TrialClinicalId == inDto.TrialClinicalId && x.IsCheckDate).Count() != 1) { throw new BusinessValidationFailedException(_localizer["ClinicalDataSet_Apply"]); diff --git a/IRaCIS.Core.Application/Service/Reading/ClinicalData/ReadingClinicalDataService.cs b/IRaCIS.Core.Application/Service/Reading/ClinicalData/ReadingClinicalDataService.cs index 967d63a51..3a4bc14ae 100644 --- a/IRaCIS.Core.Application/Service/Reading/ClinicalData/ReadingClinicalDataService.cs +++ b/IRaCIS.Core.Application/Service/Reading/ClinicalData/ReadingClinicalDataService.cs @@ -24,6 +24,7 @@ namespace IRaCIS.Application.Services private readonly IRepository _subjectVisitRepository; private readonly IRepository _previousHistoryRepository; + private readonly IRepository _readModuleCriterionFromRepository; private readonly IRepository _previousOtherRepository; private readonly IRepository _previousSurgeryRepository; private readonly IRepository _readingQuestionCriterionTrialRepository; @@ -37,7 +38,7 @@ namespace IRaCIS.Application.Services IRepository previousPDFRepository, IRepository subjectVisitRepository, IRepository previousHistoryRepository, - + IRepository readModuleCriterionFromRepository, IRepository previousOtherRepository, IRepository previousSurgeryRepository, IRepository readingQuestionCriterionTrialRepository, @@ -53,6 +54,7 @@ namespace IRaCIS.Application.Services this._previousPDFRepository = previousPDFRepository; this._subjectVisitRepository = subjectVisitRepository; this._previousHistoryRepository = previousHistoryRepository; + this._readModuleCriterionFromRepository = readModuleCriterionFromRepository; this._previousOtherRepository = previousOtherRepository; this._previousSurgeryRepository = previousSurgeryRepository; this._readingQuestionCriterionTrialRepository = readingQuestionCriterionTrialRepository; @@ -676,9 +678,80 @@ namespace IRaCIS.Application.Services }); + var result = await resultQuery.ToListAsync(); - // 根据标准 - if (inDto.VisitTaskId != null) + + + + // 这里处理CRC上传 阅片期的临床数据 + var readModule = await _readModuleRepository.Where(x => x.Id == inDto.ReadingId) + .WhereIf(inDto.SelectIsSign,x=>x.IsPMConfirm) + .WhereIf(!inDto.SelectIsSign, x => x.IsCRCConfirm) + .FirstOrDefaultAsync(); + if (readModule != null) + { + var moduleCriterionFromList = await _readModuleCriterionFromRepository.Where(x => x.ReadModuleId == readModule.Id).Select(x => new{ + ClinicalFormId= x.ClinicalFormId, + CheckDate= x.ClinicalForm.CheckDate, + ClinicalDataTrialSetId= x.ClinicalForm.ClinicalDataTrialSetId + + + }).ToListAsync(); + + var setIds = moduleCriterionFromList.Select(x=>x.ClinicalDataTrialSetId).Distinct().ToList(); + var clinicalresult = await _clinicalDataTrialSetRepository.Where(x => x.UploadRole == UploadRole.CRC && (x.ClinicalDataLevel == ClinicalLevel.OncologyRead || x.ClinicalDataLevel == ClinicalLevel.ImageRead)) + .Where(x => setIds.Contains(x.Id)) + .Select(x => new GetReadingClinicalDataListOutDto() + { + + ClinicalDataLevel = x.ClinicalDataLevel, + SubjectId = inDto.SubjectId, + ReadingId = default(Guid), + ClinicalDataSetName = x.ClinicalDataSetName.LanguageName(x.ClinicalDataSetEnName, _userInfo.IsEn_Us), + ClinicalDataSetEnName = x.ClinicalDataSetEnName, + ClinicalDataTrialSetId = x.Id, + IsSign = readModule.IsPMConfirm, + ClinicalUploadType = x.ClinicalUploadType, + Id = default(Guid), + UploadRole = x.UploadRole, + IsCRCUpload = x.UploadRole == UploadRole.CRC, + IsNeedMerge = true, + ReadModuleId = readModule.Id, + //FileCount = x.FileCount, + + //ReadingClinicalDataState = x.ReadingClinicalDataState, + + //FileList = x.ReadingClinicalDataPDFList.Select(y => new GetFileDto() + //{ + // Id = y.Id, + // FileName = y.FileName, + // Path = y.Path, + // CreateTime = y.CreateTime, + //}).ToList() + + }).ToListAsync(); + + clinicalresult.ForEach(x => + { + x.FileCount = moduleCriterionFromList.Where(y => y.ClinicalDataTrialSetId == x.ClinicalDataTrialSetId).Count(); + x.ClinicalFromList = moduleCriterionFromList.Where(y => y.ClinicalDataTrialSetId == x.ClinicalDataTrialSetId).OrderBy(y => y.CheckDate).Select(x => new ClinicalFromData + { + CheckDate = x.CheckDate, + ClinicalFormId = x.ClinicalFormId + + }).ToList(); + + x.ReadingClinicalDataState = readModule.IsPMConfirm ? ReadingClinicalDataStatus.HaveSigned : ReadingClinicalDataStatus.HaveChecked; + + }); + + result.AddRange(clinicalresult); + } + + + + // 根据标准 + if (inDto.VisitTaskId != null) { var visitTaskInfo = await _visitTaskRepository.FirstOrDefaultAsync(x => x.Id == inDto.VisitTaskId); @@ -750,6 +823,73 @@ namespace IRaCIS.Application.Services }); var result = await resultQuery.ToListAsync(); + + // 这里处理CRC上传 阅片期的临床数据 + var readModule = await _readModuleRepository.Where(x => x.Id == inDto.ReadingId&&x.IsCRCConfirm) + + .FirstOrDefaultAsync(); + if (readModule != null) + { + var moduleCriterionFromList = await _readModuleCriterionFromRepository.Where(x => x.ReadModuleId == readModule.Id).Select(x => new { + ClinicalFormId = x.ClinicalFormId, + CheckDate = x.ClinicalForm.CheckDate, + ClinicalDataTrialSetId = x.ClinicalForm.ClinicalDataTrialSetId + + + }).ToListAsync(); + + var setIds = moduleCriterionFromList.Select(x => x.ClinicalDataTrialSetId).Distinct().ToList(); + var clinicalresult = await _clinicalDataTrialSetRepository.Where(x => x.UploadRole == UploadRole.CRC && (x.ClinicalDataLevel == ClinicalLevel.OncologyRead || x.ClinicalDataLevel == ClinicalLevel.ImageRead)) + .Where(x => setIds.Contains(x.Id)) + .Select(x => new GetReadingClinicalDataListOutDto() + { + + ClinicalDataLevel = x.ClinicalDataLevel, + SubjectId = inDto.SubjectId, + ReadingId = default(Guid), + ClinicalDataSetName = x.ClinicalDataSetName.LanguageName(x.ClinicalDataSetEnName, _userInfo.IsEn_Us), + ClinicalDataSetEnName = x.ClinicalDataSetEnName, + ClinicalDataTrialSetId = x.Id, + IsSign = readModule.IsPMConfirm, + ClinicalUploadType = x.ClinicalUploadType, + Id = default(Guid), + UploadRole = x.UploadRole, + IsCRCUpload = x.UploadRole == UploadRole.CRC, + IsNeedMerge = true, + ReadModuleId = readModule.Id, + //FileCount = x.FileCount, + + //ReadingClinicalDataState = x.ReadingClinicalDataState, + + //FileList = x.ReadingClinicalDataPDFList.Select(y => new GetFileDto() + //{ + // Id = y.Id, + // FileName = y.FileName, + // Path = y.Path, + // CreateTime = y.CreateTime, + //}).ToList() + + }).ToListAsync(); + + clinicalresult.ForEach(x => + { + x.FileCount = moduleCriterionFromList.Where(y => y.ClinicalDataTrialSetId == x.ClinicalDataTrialSetId).Count(); + x.ClinicalFromList = moduleCriterionFromList.Where(y => y.ClinicalDataTrialSetId == x.ClinicalDataTrialSetId).OrderBy(y => y.CheckDate).Select(x => new ClinicalFromData + { + CheckDate = x.CheckDate, + ClinicalFormId = x.ClinicalFormId + + }).ToList(); + + x.ReadingClinicalDataState = readModule.IsPMConfirm ? ReadingClinicalDataStatus.HaveSigned : ReadingClinicalDataStatus.HaveChecked; + + }); + + result.AddRange(clinicalresult); + } + + + //result = result.Where(x => !(x.UploadRole == UploadRole.CRC && x.ClinicalUploadType == ClinicalUploadType.PDF && x.FileList.Count() == 0)).ToList(); return result; } diff --git a/IRaCIS.Core.Application/Service/Reading/Dto/ClinicalAnswerDto.cs b/IRaCIS.Core.Application/Service/Reading/Dto/ClinicalAnswerDto.cs index f94ede42a..8d3fff220 100644 --- a/IRaCIS.Core.Application/Service/Reading/Dto/ClinicalAnswerDto.cs +++ b/IRaCIS.Core.Application/Service/Reading/Dto/ClinicalAnswerDto.cs @@ -8,6 +8,10 @@ using System.Threading.Tasks; namespace IRaCIS.Core.Application.Service.Reading.Dto { + public class CRCSignClinicalDataInDto + { + public Guid ReadingClinicalDataId { get; set; } + } public class AutoAddClinicalInDto { public Guid? SubjectId { get; set; } @@ -28,9 +32,33 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto { public Guid SubjectId { get; set; } + public Guid ReadingClinicalDataId { get; set; } + + /// + /// 上传角色 + /// + public UploadRole UploadRole { get; set; } public Guid TrialId { get; set; } - public string SubjectCode { get; set; } + /// + /// 访视Id 或者模块Id + /// + public Guid ReadingId { get; set; } + + /// + /// 临床级别 + /// + public ClinicalLevel ClinicalDataLevel { get; set; } + + + public Guid? BaseLineVisitId { get; set; } + + /// + /// 上传方式 + /// + public ClinicalUploadType ClinicalUploadType { get; set; } + + public string SubjectCode { get; set; } public Guid ClinicalDataTrialSetId { get; set; } public string ClinicalDataSetName { get; set; } @@ -99,10 +127,21 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto public string Answer { get; set; } = string.Empty; } + public class GetPMConfirmListInDto: PageInput + { + public Guid TrialId { get; set; } + + public Guid TrialReadingCriterionId { get; set; } + } + public class GetCRCConfirmListInDto:PageInput { - public Guid? TrialReadingCriterionId { get; set; } + public bool? IsCRCConfirm { get; set; } + + public bool? IsPMConfirm { get; set; } + + public Guid? TrialReadingCriterionId { get; set; } public Guid? SubjectId { get; set; } @@ -122,6 +161,7 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto { public string ClinicalDataSetName { get; set; } + public List DateList { get; set; } } @@ -145,7 +185,12 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto public class GetClinicalTableListOutDto: GetClinicalQuestionAnswerListOutDto { public string ClinicalDataSetName { get; set; } - } + + /// + /// 模块名称 + /// + public string ModuleName { get; set; } + } public class GetCRCBeConfirm: GetCRCBeConfirmListOutDto @@ -181,6 +226,10 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto public class CRCClinicalForm { + /// + /// 受试者Id + /// + public Guid SubjectId { get; set; } public DateTime? CheckDate { get; set; } public Guid ClinicalFormId { get; set; } @@ -210,7 +259,14 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto public Guid SubjectId { get; set; } public Guid ReadModuleId { get; set; } - public bool IsPMConfirm { get; set; } + /// + /// 模块名称 + /// + public string ModuleName { get; set; } + + public string VisitBlindName { get; set; } + + public bool IsPMConfirm { get; set; } public ReadingSetType ReadingSetType { get; set; } @@ -230,8 +286,16 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto /// public DateTime? LatestScanDate { get; set; } + public List ClinicalNameList + { + get + { + return this.ClinicalFormList.Select(x => x.ClinicalDataSetName).Distinct().ToList(); + } + } - public List ClinicalFormList { get; set; } + + public List ClinicalFormList { get; set; } public int FormCount { @@ -248,11 +312,6 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto } public class SubmitClinicalFormInDto { - /// - /// VisitId - /// - public Guid? VisitId { get; set; } - /// /// VisitId /// diff --git a/IRaCIS.Core.Application/Service/Reading/Dto/ReadingClinicalDataDto.cs b/IRaCIS.Core.Application/Service/Reading/Dto/ReadingClinicalDataDto.cs index 85a126ec2..9cf83bbc3 100644 --- a/IRaCIS.Core.Application/Service/Reading/Dto/ReadingClinicalDataDto.cs +++ b/IRaCIS.Core.Application/Service/Reading/Dto/ReadingClinicalDataDto.cs @@ -10,8 +10,8 @@ using System.Threading.Tasks; namespace IRaCIS.Core.Application.Service.Reading.Dto { - public class AddOrUpdateReadingClinicalDataDto - { + public class AddOrUpdateReadingClinicalDataDto + { public Guid? Id { get; set; } @@ -127,9 +127,9 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto public List PreviousOtherList { get; set; } - public List PreviousSurgeryList{ get; set; } + public List PreviousSurgeryList { get; set; } + - } @@ -137,7 +137,7 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto public class GetCRCClinicalDataInDto { [NotDefault] - public Guid SubjectVisitId { get; set; } + public Guid SubjectVisitId { get; set; } [NotDefault] public Guid TrialId { get; set; } @@ -163,7 +163,7 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto /// /// 文件名称 /// - public string FileName { get; set; } + public string FileName { get; set; } /// /// 路径 @@ -195,9 +195,9 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto /// /// 获取访视列表 /// - public class GetReadingClinicalDataListIndto + public class GetReadingClinicalDataListIndto { - [NotDefault] + [NotDefault] public Guid SubjectId { get; set; } [NotDefault] public Guid ReadingId { get; set; } @@ -220,7 +220,7 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto public bool IsBaseLine { get; set; } } - public class GetReadingClinicalDataPDFListIndto:PageInput + public class GetReadingClinicalDataPDFListIndto : PageInput { public Guid ReadingClinicalDataId { get; set; } } @@ -283,7 +283,7 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto public class PMClinicalDataConfirmCommand - { + { public Guid Id { get; set; } /// @@ -363,11 +363,15 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto /// public bool IsCRCUpload { get; set; } + public bool IsNeedMerge { get; set; } = false; + + public Guid ReadModuleId { get; set; } + /// /// 是否签名 /// - public bool IsSign { get; set; } + public bool IsSign { get; set; } /// @@ -395,6 +399,8 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto // } //} + public List ClinicalFromList { get; set; } + public List FileList { get; set; } = new List(); @@ -404,6 +410,19 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto } + public class ClinicalFromData + { + /// + /// 表单Id + /// + public Guid ClinicalFormId { get; set; } + + /// + /// 检查日期 + /// + public DateTime? CheckDate { get; set; } + } + public class GetFileDto { diff --git a/IRaCIS.Core.Application/Service/Reading/Interface/IClinicalAnswerService.cs b/IRaCIS.Core.Application/Service/Reading/Interface/IClinicalAnswerService.cs index 29775bb1f..f2f803ee9 100644 --- a/IRaCIS.Core.Application/Service/Reading/Interface/IClinicalAnswerService.cs +++ b/IRaCIS.Core.Application/Service/Reading/Interface/IClinicalAnswerService.cs @@ -9,6 +9,13 @@ namespace IRaCIS.Core.Application.Service.Reading.Interface { public interface IClinicalAnswerService { - Task AutoAddCRCClinical(AutoAddClinicalInDto inDto); - } + Task CRCSignClinicalData(CRCSignClinicalDataInDto inDto); + + Task AutoAddCRCClinical(AutoAddClinicalInDto inDto); + + Task PMConfirmClinical(CRCConfirmClinicalInDto inDto); + + Task SubmitClinicalForm(SubmitClinicalFormInDto inDto); + + } } diff --git a/IRaCIS.Core.Application/Service/TrialSiteUser/DTO/PersonalWorkstationViewModel.cs b/IRaCIS.Core.Application/Service/TrialSiteUser/DTO/PersonalWorkstationViewModel.cs index 5f446672e..33ccd99e4 100644 --- a/IRaCIS.Core.Application/Service/TrialSiteUser/DTO/PersonalWorkstationViewModel.cs +++ b/IRaCIS.Core.Application/Service/TrialSiteUser/DTO/PersonalWorkstationViewModel.cs @@ -105,10 +105,13 @@ namespace IRaCIS.Core.Application.Contracts public int? ToBeApprovalCount { get; set; } } + public class GetPMClinicalDataToBeDoneListOutDto: TrialBaseInfoDto + { + public int? ToBeApprovalCount { get; set; } + } public class ReviewerSelectToBeDoneQuery : PageInput { - } public class ReviewerSelectToBeDoneDto : TrialBaseInfoDto diff --git a/IRaCIS.Core.Application/Service/TrialSiteUser/PersonalWorkstation.cs b/IRaCIS.Core.Application/Service/TrialSiteUser/PersonalWorkstation.cs index a5e088ad0..e58ce76c2 100644 --- a/IRaCIS.Core.Application/Service/TrialSiteUser/PersonalWorkstation.cs +++ b/IRaCIS.Core.Application/Service/TrialSiteUser/PersonalWorkstation.cs @@ -21,15 +21,19 @@ namespace IRaCIS.Core.Application private readonly IRepository _trialUserRepository; private readonly IRepository _trialDocumentRepository; private readonly IRepository _systemDocumentRepository; + private readonly IRepository _readModuleRepository; private readonly IRepository _systemNoticeRepository; public PersonalWorkstation(IRepository trialRepository, IRepository trialUserRepository, IRepository trialDocumentRepository, - IRepository systemDocumentRepository, IRepository systemNoticeRepository) + IRepository systemDocumentRepository, + IRepository readModuleRepository, + IRepository systemNoticeRepository) { _trialRepository = trialRepository; _trialUserRepository = trialUserRepository; _trialDocumentRepository = trialDocumentRepository; _systemDocumentRepository = systemDocumentRepository; + this._readModuleRepository = readModuleRepository; _systemNoticeRepository = systemNoticeRepository; } @@ -294,6 +298,43 @@ namespace IRaCIS.Core.Application } + /// + /// 获取PM核对临床数据 + /// + /// + /// + [HttpPost] + public async Task>> GetPMClinicalDataToBeDoneList(ReviewerSelectToBeDoneQuery inQuery) + { + + var query = _trialRepository + .Where(t => t.TrialUserList.Any(t => t.UserId == _userInfo.Id)) + .Select(t => new GetPMClinicalDataToBeDoneListOutDto() + { + TrialId = t.Id, + ResearchProgramNo = t.ResearchProgramNo, + ExperimentName = t.ExperimentName, + TrialCode = t.TrialCode, + + + ToBeApprovalCount = t.ReadModuleList.Where(u => u.IsCRCConfirm&&!u.IsPMConfirm).Count() + }); + + var result = await query.ToPagedListAsync(inQuery.PageIndex, inQuery.PageSize, string.IsNullOrEmpty(inQuery.SortField) ? nameof(ReviewerSelectToBeDoneDto.TrialId) : inQuery.SortField, inQuery.Asc); + + + var all =await _trialRepository + .Where(t => t.TrialUserList.Any(t => t.UserId == _userInfo.Id)) + .Select(t => new GetPMClinicalDataToBeDoneListOutDto() + { + + + ToBeApprovalCount = t.ReadModuleList.Where(u => u.IsCRCConfirm && !u.IsPMConfirm).Count() + }).ToListAsync(); + + return ResponseOutput.Ok(result, new { ToBeApprovalCount = all.Sum(x=>x.ToBeApprovalCount) }); ; + } + #endregion diff --git a/IRaCIS.Core.Domain.Share/Reading/ReadEnum.cs b/IRaCIS.Core.Domain.Share/Reading/ReadEnum.cs index 3608eb7fa..243e765b6 100644 --- a/IRaCIS.Core.Domain.Share/Reading/ReadEnum.cs +++ b/IRaCIS.Core.Domain.Share/Reading/ReadEnum.cs @@ -1924,6 +1924,9 @@ namespace IRaCIS.Core.Domain.Share HaveUploaded = 1, + /// + /// 待核查 + /// HaveChecked = 2, HaveSigned = 3 diff --git a/IRaCIS.Core.Domain/Reading/ClinicalQuestionAnswer/ClinicalForm.cs b/IRaCIS.Core.Domain/Reading/ClinicalQuestionAnswer/ClinicalForm.cs index f41eb924f..1d052b9f9 100644 --- a/IRaCIS.Core.Domain/Reading/ClinicalQuestionAnswer/ClinicalForm.cs +++ b/IRaCIS.Core.Domain/Reading/ClinicalQuestionAnswer/ClinicalForm.cs @@ -44,11 +44,6 @@ namespace IRaCIS.Core.Domain.Models /// public Guid ClinicalDataTrialSetId { get; set; } - /// - /// VisitId - /// - public Guid? VisitId { get; set; } - /// /// VisitId /// diff --git a/IRaCIS.Core.Domain/Reading/ReadingPeriod/ReadModule.cs b/IRaCIS.Core.Domain/Reading/ReadingPeriod/ReadModule.cs index fba287340..1be9cb363 100644 --- a/IRaCIS.Core.Domain/Reading/ReadingPeriod/ReadModule.cs +++ b/IRaCIS.Core.Domain/Reading/ReadingPeriod/ReadModule.cs @@ -119,11 +119,15 @@ namespace IRaCIS.Core.Domain.Models [ForeignKey("SubjectVisitId")] public SubjectVisit SubjectVisit { get; set; } + [JsonIgnore] + [ForeignKey("TrialId")] + public Trial Trial { get; set; } - /// - /// 阅片配置的类型 - /// - public ReadingSetType ReadingSetType { get; set; } + + /// + /// 阅片配置的类型 + /// + public ReadingSetType ReadingSetType { get; set; } diff --git a/IRaCIS.Core.Domain/Trial/Trial.cs b/IRaCIS.Core.Domain/Trial/Trial.cs index 86afacb29..bc38a6392 100644 --- a/IRaCIS.Core.Domain/Trial/Trial.cs +++ b/IRaCIS.Core.Domain/Trial/Trial.cs @@ -53,6 +53,8 @@ namespace IRaCIS.Core.Domain.Models public List TrialSiteList { get; set; } = new List(); [JsonIgnore] public List TrialSiteUserList { get; set; } = new List(); + [JsonIgnore] + public List ReadModuleList { get; set; } = new List(); public Guid IndicationTypeId { get; set; } = Guid.Empty;