From 8b5753a2db7f2ea50ff4ab1fa774519789613255 Mon Sep 17 00:00:00 2001 From: hang <872297557@qq.com> Date: Mon, 17 Oct 2022 13:55:39 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BB=A3=E7=A0=81=E7=AE=80=E5=8D=95=E6=95=B4?= =?UTF-8?q?=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../IRaCIS.Core.Application.xml | 35 -- .../ClinicalDataSetService.cs | 2 +- .../ReadingClinicalDataService.cs | 285 +++++------ .../{ => ReadingPeriod}/ReadModuleService.cs | 0 .../ReadingPeriodSetService.cs | 449 +++++++++--------- 5 files changed, 387 insertions(+), 384 deletions(-) rename IRaCIS.Core.Application/Service/Reading/{ => ClinicalData}/ClinicalDataSetService.cs (99%) rename IRaCIS.Core.Application/Service/Reading/{ => ClinicalData}/ReadingClinicalDataService.cs (94%) rename IRaCIS.Core.Application/Service/Reading/{ => ReadingPeriod}/ReadModuleService.cs (100%) rename IRaCIS.Core.Application/Service/Reading/{ => ReadingPeriod}/ReadingPeriodSetService.cs (85%) diff --git a/IRaCIS.Core.Application/IRaCIS.Core.Application.xml b/IRaCIS.Core.Application/IRaCIS.Core.Application.xml index 004f4304e..1f798a5de 100644 --- a/IRaCIS.Core.Application/IRaCIS.Core.Application.xml +++ b/IRaCIS.Core.Application/IRaCIS.Core.Application.xml @@ -1691,21 +1691,6 @@ 是否是基线 - - - 项目ID - - - - - 对象ID - - - - - 受试者ID - - 阅片临床数据ID @@ -1726,21 +1711,6 @@ 是否为访视 - - - 项目ID - - - - - 对象ID - - - - - 受试者ID - - 阅片临床数据ID @@ -1761,11 +1731,6 @@ 是否为访视 - - - 临床级别 - - 是否盲化 diff --git a/IRaCIS.Core.Application/Service/Reading/ClinicalDataSetService.cs b/IRaCIS.Core.Application/Service/Reading/ClinicalData/ClinicalDataSetService.cs similarity index 99% rename from IRaCIS.Core.Application/Service/Reading/ClinicalDataSetService.cs rename to IRaCIS.Core.Application/Service/Reading/ClinicalData/ClinicalDataSetService.cs index b9bb0b28c..f95b1bc67 100644 --- a/IRaCIS.Core.Application/Service/Reading/ClinicalDataSetService.cs +++ b/IRaCIS.Core.Application/Service/Reading/ClinicalData/ClinicalDataSetService.cs @@ -190,7 +190,7 @@ namespace IRaCIS.Application.Services #endregion - #region 系统和项目标准下拉 和临床数据关联 + #region 系统和项目标准下拉 界面上配置和临床数据关联 [HttpPost] public async Task> GetSystemCriterionSelectList(SystemCriterionSelectQuery inQuery) diff --git a/IRaCIS.Core.Application/Service/Reading/ReadingClinicalDataService.cs b/IRaCIS.Core.Application/Service/Reading/ClinicalData/ReadingClinicalDataService.cs similarity index 94% rename from IRaCIS.Core.Application/Service/Reading/ReadingClinicalDataService.cs rename to IRaCIS.Core.Application/Service/Reading/ClinicalData/ReadingClinicalDataService.cs index 1ecdd2014..a6a642987 100644 --- a/IRaCIS.Core.Application/Service/Reading/ReadingClinicalDataService.cs +++ b/IRaCIS.Core.Application/Service/Reading/ClinicalData/ReadingClinicalDataService.cs @@ -1,15 +1,6 @@ -using IRaCIS.Application.Interfaces; -using IRaCIS.Core.Infra.EFCore; -using IRaCIS.Core.Domain.Share; -using IRaCIS.Core.Application.Filter; +using IRaCIS.Core.Domain.Share; using Microsoft.AspNetCore.Mvc; -using IRaCIS.Core.Application.Service.WorkLoad.DTO; -using Microsoft.AspNetCore.Authorization; -using IRaCIS.Core.Application.Auth; using IRaCIS.Core.Application.Service.Reading.Dto; -using MassTransit; -using System.ComponentModel.DataAnnotations; -using System.Reflection; using IRaCIS.Core.Infra.EFCore.Common; using IRaCIS.Core.Application.Contracts; using IRaCIS.Core.Application.Service.Inspection.DTO; @@ -65,6 +56,8 @@ namespace IRaCIS.Application.Services } + #region 临床数据基本增删改 + /// /// 新增或者修改 /// @@ -87,10 +80,10 @@ namespace IRaCIS.Application.Services var entity = _mapper.Map(indto); entity.ReadingClinicalDataPDFList = indto.AddFileList.Select(x => new ReadingClinicalDataPDF() { - + FileName = x.FileName, Path = x.Path, - + }).ToList(); entity.ReadingClinicalDataState = ReadingClinicalDataStatus.HaveUploaded; @@ -109,10 +102,10 @@ namespace IRaCIS.Application.Services var addFileList = indto.AddFileList.Select(x => new ReadingClinicalDataPDF() { - + FileName = x.FileName, Path = x.Path, - + ReadingClinicalDataId = entity.Id, }).ToList(); await _readingClinicalDataPDFRepository.AddRangeAsync(addFileList); @@ -129,6 +122,28 @@ namespace IRaCIS.Application.Services } + + /// + /// 删除 + /// + /// + /// + [HttpDelete("{id:guid}")] + public async Task DeleteReadingClinicalData(Guid id) + { + + await _readingClinicalDataRepository.DeleteFromQueryAsync(x => x.Id == id, true); + await _readingClinicalDataPDFRepository.DeleteFromQueryAsync(x => x.ReadingClinicalDataId == id, true); + return ResponseOutput.Result(true); + } + + + #endregion + + + + #region 临床数据CRC 相关 + /// /// 获取CRC上传的文件 /// @@ -150,8 +165,8 @@ namespace IRaCIS.Application.Services FileName = x.ClinicalDataTrialSet.FileName, UploadRole = x.ClinicalDataTrialSet.UploadRole, Path = x.ClinicalDataTrialSet.Path, - IsBlind=x.IsBlind, - IsComplete=x.IsComplete + IsBlind = x.IsBlind, + IsComplete = x.IsComplete }).ToListAsync(); List clinicalData = (await this.GetReadingClinicalDataList(new GetReadingClinicalDataListIndto() @@ -180,10 +195,6 @@ namespace IRaCIS.Application.Services } - - - - /// /// 添加CRC数据类型 /// @@ -209,34 +220,52 @@ namespace IRaCIS.Application.Services } - ///// - ///// 设置临床数据是否盲化 - ///// - ///// - //[HttpPost] - //public async Task SetReadingClinicalDataIsBlind(SetReadingClinicalDataIsBlind inDto) - //{ - // await _readingClinicalDataRepository.UpdatePartialFromQueryAsync(inDto.Id, x=>new ReadingClinicalData() { - // IsBlind=inDto.IsBlind, - // }); - // return ResponseOutput.Ok(await _readingClinicalDataRepository.SaveChangesAsync()); - //} + #endregion + + + + #region 临床数据签名 和确认 /// - /// 删除 + /// 影像阅片临床数据签名 /// - /// - /// - [HttpDelete("{id:guid}")] - public async Task DeleteReadingClinicalData(Guid id) - { + // [HttpPost] - await _readingClinicalDataRepository.DeleteFromQueryAsync(x => x.Id == id, true); - await _readingClinicalDataPDFRepository.DeleteFromQueryAsync(x => x.ReadingClinicalDataId == id, true); - return ResponseOutput.Result(true); + public async Task ReadClinicalDataSign(ReadingClinicalDataSignIndto inDto) + { + await _readingClinicalDataRepository.UpdatePartialFromQueryAsync(x => x.Id == inDto.ReadingClinicalDataId, x => new ReadingClinicalData() + { + IsSign = true, + ReadingClinicalDataState = ReadingClinicalDataStatus.HaveSigned + }); + + var result = await _readingClinicalDataRepository.SaveChangesAsync(); + + + var readingId = await _readingClinicalDataRepository.Where(x => x.Id == inDto.ReadingClinicalDataId).Select(x => x.ReadingId).FirstOrDefaultAsync(); + + await this.iServiceProvider.GetService().AddOncologyTask(readingId); + + return ResponseOutput.Result(result); } + [HttpPut] + public async Task PMClinicalDataConfirm(PMClinicalDataConfirmCommand command) + { + await _readingClinicalDataRepository.UpdatePartialFromQueryAsync(t => t.Id == command.Id, u => new ReadingClinicalData() + { + IsBlind = command.IsBlind, + IsComplete = command.IsComplete, + ReadingClinicalDataState = ReadingClinicalDataStatus.HaveChecked + }); + await _readingClinicalDataRepository.SaveChangesAsync(); + return ResponseOutput.Ok(); + } + #endregion + + + #region 临床数据相关查询 /// /// 获取下拉菜单 /// @@ -262,7 +291,7 @@ namespace IRaCIS.Application.Services ReadModule readModule = null; if (inDto.ReadingId != null) { - readModule = await _readModuleRepository.Where(x => x.Id ==inDto.ReadingId).FirstOrDefaultAsync(); + readModule = await _readModuleRepository.Where(x => x.Id == inDto.ReadingId).FirstOrDefaultAsync(); } Dictionary keyValuePairs = new Dictionary(); @@ -274,11 +303,11 @@ namespace IRaCIS.Application.Services List clinicalList = await _clinicalDataTrialSetRepository.Where(x => x.TrialId == inDto.TrialId && x.IsConfirm) .WhereIf(inDto.UploadRole != null, x => x.UploadRole == inDto.UploadRole) .Where(x => !usedIdsQuery.Contains(x.Id)) - .WhereIf(inDto.TrialReadingCriterionId != null, t => t.TrialClinicalDataCriterionList.Any(t=>t.TrialReadingCriterionId == inDto.TrialReadingCriterionId) ) + .WhereIf(inDto.TrialReadingCriterionId != null, t => t.TrialClinicalDataCriterionList.Any(t => t.TrialReadingCriterionId == inDto.TrialReadingCriterionId)) .WhereIf(inDto.IsVisit && inDto.IsBaseLine, x => x.ClinicalDataLevel == ClinicalLevel.Subject || x.ClinicalDataLevel == ClinicalLevel.SubjectVisit) .WhereIf(inDto.IsVisit && !inDto.IsBaseLine, x => x.ClinicalDataLevel == ClinicalLevel.SubjectVisit) - .WhereIf(!inDto.IsVisit, x => x.ClinicalDataLevel == ClinicalLevel.ImageRead||x.ClinicalDataLevel==ClinicalLevel.OncologyRead) - .WhereIf(readModule!=null, x => x.ClinicalDataLevel == keyValuePairs[readModule.ModuleType]) + .WhereIf(!inDto.IsVisit, x => x.ClinicalDataLevel == ClinicalLevel.ImageRead || x.ClinicalDataLevel == ClinicalLevel.OncologyRead) + .WhereIf(readModule != null, x => x.ClinicalDataLevel == keyValuePairs[readModule.ModuleType]) .Select(x => new GetTrialClinicalDataSelectOutDto() { ClinicalDataLevel = x.ClinicalDataLevel, @@ -292,29 +321,6 @@ namespace IRaCIS.Application.Services } - /// - /// 影像阅片临床数据签名 - /// - // [HttpPost] - - public async Task ReadClinicalDataSign(ReadingClinicalDataSignIndto inDto) - { - await _readingClinicalDataRepository.UpdatePartialFromQueryAsync(x => x.Id == inDto.ReadingClinicalDataId, x => new ReadingClinicalData() - { - IsSign = true, - ReadingClinicalDataState=ReadingClinicalDataStatus.HaveSigned - }); - - var result = await _readingClinicalDataRepository.SaveChangesAsync(); - - - var readingId = await _readingClinicalDataRepository.Where(x => x.Id == inDto.ReadingClinicalDataId).Select(x => x.ReadingId).FirstOrDefaultAsync(); - - await this.iServiceProvider.GetService().AddOncologyTask(readingId); - - return ResponseOutput.Result(result); - } - /// /// 获取访视 阅片或任务临床数据 /// @@ -364,6 +370,56 @@ namespace IRaCIS.Application.Services }); } + + /// + /// 获取阅片临床数据列表 + /// + /// + /// + [HttpPost] + public async Task<(List, object)> GetReadingClinicalDataList(GetReadingClinicalDataListIndto inDto) + { + GetTrialClinicalDataSelectIndto getTrialClinicalDataSelectIndto = new GetTrialClinicalDataSelectIndto() + { + ReadingId = inDto.ReadingId, + TrialId = inDto.TrialId, + IsBaseLine = inDto.IsBaseLine, + SubjectId = inDto.SubjectId, + IsVisit = inDto.IsVisit, + }; + + var clinicalDataList = await this.GetTrialClinicalDataSelect(getTrialClinicalDataSelectIndto); + + if (_userInfo.UserTypeEnumInt == (int)UserTypeEnum.ClinicalResearchCoordinator || _userInfo.UserTypeEnumInt == (int)UserTypeEnum.IQC) + { + inDto.UploadRole = UploadRole.CRC; + } + var isBaseLine = await _subjectVisitRepository.AnyAsync(x => x.Id == inDto.ReadingId && x.IsBaseLine); + + + var result = await this.GetReadingClinicalList(inDto); + + + var previousHistoryList = await _previousHistoryRepository.Where(x => x.SubjectVisitId == inDto.ReadingId).ProjectTo(_mapper.ConfigurationProvider).ToListAsync(); + var previousOtherList = await _previousOtherRepository.Where(x => x.SubjectVisitId == inDto.ReadingId).ProjectTo(_mapper.ConfigurationProvider).ToListAsync(); + var previousSurgeryList = await _previousSurgeryRepository.Where(x => x.SubjectVisitId == inDto.ReadingId).ProjectTo(_mapper.ConfigurationProvider).ToListAsync(); + foreach (var item in result) + { + item.ClinicalTableData = new ClinicalDataTable() + { + PreviousHistoryList = previousHistoryList.Where(x => x.ClinicalDataTrialSetId == item.ClinicalDataTrialSetId).ToList(), + PreviousOtherList = previousOtherList.Where(x => x.ClinicalDataTrialSetId == item.ClinicalDataTrialSetId).ToList(), + PreviousSurgeryList = previousSurgeryList.Where(x => x.ClinicalDataTrialSetId == item.ClinicalDataTrialSetId).ToList(), + }; + + } + + return (result, new + { + IsCanAddClinicalData = clinicalDataList.Count() > 0, + }); + } + [NonDynamicMethod] public async Task> GetClinicalDataList(GetReadingOrTaskClinicalDataListInDto inDto) { @@ -403,68 +459,7 @@ namespace IRaCIS.Application.Services return result; } - /// - /// 获取阅片临床数据列表 - /// - /// - /// - [HttpPost] - public async Task<(List,object)> GetReadingClinicalDataList(GetReadingClinicalDataListIndto inDto) - { - GetTrialClinicalDataSelectIndto getTrialClinicalDataSelectIndto = new GetTrialClinicalDataSelectIndto() - { - ReadingId = inDto.ReadingId, - TrialId = inDto.TrialId, - IsBaseLine = inDto.IsBaseLine, - SubjectId = inDto.SubjectId, - IsVisit = inDto.IsVisit, - }; - var clinicalDataList = await this.GetTrialClinicalDataSelect(getTrialClinicalDataSelectIndto); - - if (_userInfo.UserTypeEnumInt == (int)UserTypeEnum.ClinicalResearchCoordinator || _userInfo.UserTypeEnumInt == (int)UserTypeEnum.IQC) - { - inDto.UploadRole = UploadRole.CRC; - } - var isBaseLine = await _subjectVisitRepository.AnyAsync(x => x.Id == inDto.ReadingId && x.IsBaseLine); - - - var result =await this.GetReadingClinicalList(inDto); - - - var previousHistoryList = await _previousHistoryRepository.Where(x => x.SubjectVisitId == inDto.ReadingId).ProjectTo(_mapper.ConfigurationProvider).ToListAsync(); - var previousOtherList = await _previousOtherRepository.Where(x => x.SubjectVisitId == inDto.ReadingId).ProjectTo(_mapper.ConfigurationProvider).ToListAsync(); - var previousSurgeryList = await _previousSurgeryRepository.Where(x => x.SubjectVisitId == inDto.ReadingId).ProjectTo(_mapper.ConfigurationProvider).ToListAsync(); - foreach (var item in result) - { - item.ClinicalTableData = new ClinicalDataTable() - { - PreviousHistoryList = previousHistoryList.Where(x => x.ClinicalDataTrialSetId == item.ClinicalDataTrialSetId).ToList(), - PreviousOtherList = previousOtherList.Where(x => x.ClinicalDataTrialSetId == item.ClinicalDataTrialSetId).ToList(), - PreviousSurgeryList = previousSurgeryList.Where(x => x.ClinicalDataTrialSetId == item.ClinicalDataTrialSetId).ToList(), - }; - - } - - return (result, new { - IsCanAddClinicalData= clinicalDataList.Count()>0, - }) ; - } - - - [HttpPut] - public async Task PMClinicalDataConfirm(PMClinicalDataConfirmCommand command) - { - await _readingClinicalDataRepository.UpdatePartialFromQueryAsync(t => t.Id == command.Id, u => new ReadingClinicalData() - { - IsBlind=command.IsBlind, - IsComplete=command.IsComplete, - ReadingClinicalDataState=ReadingClinicalDataStatus.HaveChecked - }); - await _readingClinicalDataRepository.SaveChangesAsync(); - - return ResponseOutput.Ok(); - } /// /// 获取临床数据集合 /// @@ -486,11 +481,11 @@ namespace IRaCIS.Application.Services Id = x.Id, UploadRole = x.ClinicalDataTrialSet.UploadRole, IsCRCUpload = x.ClinicalDataTrialSet.UploadRole == UploadRole.CRC, - IsBlind=x.IsBlind, - IsComplete=x.IsComplete, - FileCount=x.FileCount, + IsBlind = x.IsBlind, + IsComplete = x.IsComplete, + FileCount = x.FileCount, - ReadingClinicalDataState=x.ReadingClinicalDataState, + ReadingClinicalDataState = x.ReadingClinicalDataState, FileList = x.ReadingClinicalDataPDFList.Select(y => new GetFileDto() { @@ -506,13 +501,19 @@ namespace IRaCIS.Application.Services return result; } + #endregion + + + #region 阅片临床数据PDF + /// /// 获取单个阅片临床数据的所有文件 /// /// /// [HttpPost] - public async Task> GetReadingClinicalDataPDFList(GetReadingClinicalDataPDFListIndto inDto) { + public async Task> GetReadingClinicalDataPDFList(GetReadingClinicalDataPDFListIndto inDto) + { var result = await _readingClinicalDataPDFRepository.Where(x => x.ReadingClinicalDataId == inDto.ReadingClinicalDataId).ProjectTo(_mapper.ConfigurationProvider) .ToPagedListAsync(inDto.PageIndex, inDto.PageSize, inDto.SortField == null ? nameof(GetReadingClinicalDataPDFListOutDto.FileName) : inDto.SortField, @@ -532,6 +533,22 @@ namespace IRaCIS.Application.Services return ResponseOutput.Result(true); } + #endregion + + + + ///// + ///// 设置临床数据是否盲化 + ///// + ///// + //[HttpPost] + //public async Task SetReadingClinicalDataIsBlind(SetReadingClinicalDataIsBlind inDto) + //{ + // await _readingClinicalDataRepository.UpdatePartialFromQueryAsync(inDto.Id, x=>new ReadingClinicalData() { + // IsBlind=inDto.IsBlind, + // }); + // return ResponseOutput.Ok(await _readingClinicalDataRepository.SaveChangesAsync()); + //} } } diff --git a/IRaCIS.Core.Application/Service/Reading/ReadModuleService.cs b/IRaCIS.Core.Application/Service/Reading/ReadingPeriod/ReadModuleService.cs similarity index 100% rename from IRaCIS.Core.Application/Service/Reading/ReadModuleService.cs rename to IRaCIS.Core.Application/Service/Reading/ReadingPeriod/ReadModuleService.cs diff --git a/IRaCIS.Core.Application/Service/Reading/ReadingPeriodSetService.cs b/IRaCIS.Core.Application/Service/Reading/ReadingPeriod/ReadingPeriodSetService.cs similarity index 85% rename from IRaCIS.Core.Application/Service/Reading/ReadingPeriodSetService.cs rename to IRaCIS.Core.Application/Service/Reading/ReadingPeriod/ReadingPeriodSetService.cs index 4f8b86aea..b4c5664ca 100644 --- a/IRaCIS.Core.Application/Service/Reading/ReadingPeriodSetService.cs +++ b/IRaCIS.Core.Application/Service/Reading/ReadingPeriod/ReadingPeriodSetService.cs @@ -1,16 +1,7 @@ -using IRaCIS.Application.Interfaces; -using IRaCIS.Core.Infra.EFCore; -using IRaCIS.Core.Domain.Share; -using IRaCIS.Core.Application.Filter; +using IRaCIS.Core.Domain.Share; using Microsoft.AspNetCore.Mvc; -using IRaCIS.Core.Application.Service.WorkLoad.DTO; -using Microsoft.AspNetCore.Authorization; -using IRaCIS.Core.Application.Auth; using IRaCIS.Core.Application.Service.Reading.Dto; using MassTransit; - -using IRaCIS.Core.Infra.EFCore.Common; -using IRaCIS.Core.Infrastructure.Extention; using IRaCIS.Core.Application.Service; using IRaCIS.Core.Application.ViewModel; using IRaCIS.Core.Infrastructure; @@ -65,6 +56,9 @@ namespace IRaCIS.Application.Services } + + #region 阅片期配置 基本信息维护 以及生效 + /// /// 新增或者修改 (增加标准搜索,已修改) /// @@ -73,8 +67,8 @@ namespace IRaCIS.Application.Services [HttpPost] public async Task AddOrUpdateReadingPeriodSet(ReadingPeriodSetAddOrEdit addOrEditReadingPeriodSet) { - if (await _readingPeriodSetRepository.AnyAsync(x => x.Id != addOrEditReadingPeriodSet.Id&&x.IsTakeEffect!= ReadingPeriodStatus.Revocation - && x.TrialId == addOrEditReadingPeriodSet.TrialId && x.ReadingPeriodName == addOrEditReadingPeriodSet.ReadingPeriodName && x.TrialReadingCriterionId==addOrEditReadingPeriodSet.TrialReadingCriterionId)) + if (await _readingPeriodSetRepository.AnyAsync(x => x.Id != addOrEditReadingPeriodSet.Id && x.IsTakeEffect != ReadingPeriodStatus.Revocation + && x.TrialId == addOrEditReadingPeriodSet.TrialId && x.ReadingPeriodName == addOrEditReadingPeriodSet.ReadingPeriodName && x.TrialReadingCriterionId == addOrEditReadingPeriodSet.TrialReadingCriterionId)) { return ResponseOutput.NotOk("阅片期名称重复,操作失败"); } @@ -124,192 +118,22 @@ namespace IRaCIS.Application.Services } } + + /// - /// 获取影像阅片的预览 // 需要清除之前已经选中的 (增加标准搜索,已修改) + /// 删除 /// + /// /// - [HttpPost] - public async Task> GetPreviewTheReadingList(PreviewTheReadingListInDto inDto) + [HttpDelete("{readingPeriodSetId:guid}")] + public async Task DeleteReadingPeriodSet(Guid readingPeriodSetId) { - var readModulequery = _readModuleRepository.AsQueryable(); + await _readingPeriodSetRepository.DeleteFromQueryAsync(t => t.Id == readingPeriodSetId, true); + await _readingPeriodPlanRepository.DeleteFromQueryAsync(t => t.ReadingPeriodSetId == readingPeriodSetId, true); - // 当前项目 最晚拍片日期不为null 中心筛选 - var visitQuery = _subjectVisitRepository.Where(x => x.TrialId == inDto.TrialId &&x.LatestScanDate!=null&&!x.IsLostVisit) - .WhereIf(inDto.ReadingScope== ReadingScopeEnum.Site, x => inDto.SiteIds.Contains(x.SiteId)); - - // 已经存在的访视 需要排除 - var existsBubjectVisitsQuery= _readModuleRepository.Where(y => y.ReadingSetType == inDto.ReadingSetType && y.TrialId == inDto.TrialId && y.TrialReadingCriterionId == inDto.TrialReadingCriterionId).Select(x => x.SubjectVisitId); - - visitQuery = visitQuery.Where(x => !existsBubjectVisitsQuery.Contains(x.Id)) - .WhereIf(inDto.ExpirationDate != null, x => x.LatestScanDate <= inDto.ExpirationDate.Value) - .WhereIf(inDto.ExpirationVisitNum != null, x => x.VisitNum == inDto.ExpirationVisitNum) - .WhereIf(inDto.ReadingSetType==ReadingSetType.TumorReading,x => readModulequery.Where(y => y.SubjectVisitId == x.Id && y.ReadingSetType == ReadingSetType.ImageReading).Count() > 0); - - var subjectIdlist = await visitQuery.OrderBy(x => x.SubjectId).Select(x => x.SubjectId).Distinct().Skip((inDto.PageIndex - 1) * inDto.PageSize).Take(inDto.PageSize).ToListAsync(); - - - var totalCount = visitQuery.Select(x => x.SubjectId).Distinct().Count(); - - var visitlist = await visitQuery.Include(x => x.Subject).Include(x => x.TrialSite).Where(x => subjectIdlist.Contains(x.SubjectId)).ToListAsync(); - - var subjectVisits = visitlist.GroupBy(x => x.SubjectId).Select(x => new - { - SubjectId = x.Key, - Visits = x.ToList() - }); - - List visits = new List(); - subjectVisits.ForEach(x => - { - var visit = x.Visits.OrderByDescending(x => x.VisitNum).FirstOrDefault(); - if (visit != null) - { - visits.Add(visit); - } - }); - - PageOutput result = new PageOutput() - { - CurrentPageData = visits - .Select(x => new PreviewTheReadingListOutDto - { - ExpirationDate = inDto.ExpirationDate, - SubjectVisitId = x.Id, - TrialSiteCode = x.TrialSite.TrialSiteCode, - LatestScanDate = x.LatestScanDate, - ReadingPeriodName = inDto.ReadingPeriodName, - SubjectCode = x.Subject.Code, - SubjectId = x.SubjectId, - SubjectVisitName = x.VisitName, - }).ToList(), - PageSize = inDto.PageSize, - PageIndex = inDto.PageIndex, - TotalCount = totalCount, - }; - return result; + return ResponseOutput.Ok(); } - /// - /// 添加对应的阅片 (增加标准不影响 因为阅片期设置关联了标准) - /// - /// - /// - public async Task GenerateReadingTask(ReadingToGenerateInDto inDto) - { - List plans = new List(); - inDto.SubjectVisitIds.ForEach(x => - { - plans.Add(new ReadingPeriodPlan() - { - SubjectVisitId = x, - ReadingPeriodSetId = inDto.ReadingPeriodSetId - }); - }); - await _readingPeriodPlanRepository.DeleteFromQueryAsync(x => x.ReadingPeriodSetId == inDto.ReadingPeriodSetId); - await _readingPeriodPlanRepository.SaveChangesAsync(); - await _readingPeriodPlanRepository.AddRangeAsync(plans); - var result = await _readingPeriodPlanRepository.SaveChangesAsync(); - return ResponseOutput.Result(result); - } - - /// - /// 获取选中的计划 (增加标准不影响 因为阅片期设置关联了标准) - /// - /// - /// - [HttpPost] - public async Task> GetPreviewTheReadingPlanList(PreviewTheReadingListDto inDto) - { - var plans = _readingPeriodPlanRepository.Where(x => x.ReadingPeriodSetId == inDto.ReadingPeriodSetId).Include(x => x.SubjectVisit).Include(x => x.SubjectVisit.TrialSite).Include(x => x.SubjectVisit.Subject) - .Include(x => x.ReadingPeriodSet).Select(x => new PreviewTheReadingListOutDto - { - Id = x.Id, - ExpirationDate = x.ReadingPeriodSet.ExpirationDate, - SubjectVisitId = x.SubjectVisitId, - TrialSiteCode = x.SubjectVisit.TrialSite.TrialSiteCode, - LatestScanDate = x.SubjectVisit.LatestScanDate, - ReadingPeriodName = x.ReadingPeriodSet.ReadingPeriodName, - ReadingPeriodSetId = x.ReadingPeriodSetId, - SubjectCode = x.SubjectVisit.Subject.Code, - SubjectId = x.SubjectVisit.SubjectId, - SubjectVisitName = x.SubjectVisit.VisitName, - EffectOfTime = x.ReadingPeriodSet.EffectOfTime, - }); - - return await plans.ToPagedListAsync(inDto.PageIndex, inDto.PageSize, inDto.SortField == null ? nameof(PreviewTheReadingListOutDto.SubjectId) : inDto.SortField, - inDto.Asc); - } - - - /// - /// 分页获取 (增加标准搜索,已修改) - /// - /// - /// - [HttpPost] - public async Task> GetReadingPeriodSetList(ReadingPeriodSetQuery query) - { - var readQuery =_readingPeriodSetRepository.Where(t=>t.TrialId==query.TrialId).Include(x=>x.ReadingPeriodSites) - .WhereIf(query.ReadingPeriodName != null, x => x.ReadingPeriodName.Contains(query.ReadingPeriodName!)) - .WhereIf(query.TrialReadingCriterionId != null, x => x.TrialReadingCriterionId==query.TrialReadingCriterionId) - .ProjectTo(_mapper.ConfigurationProvider); - var pageList= await readQuery.ToPagedListAsync(query.PageIndex, query.PageSize, query.SortField == null ? nameof(ReadingPeriodSetView.CreateTime) : query.SortField, - query.Asc); - - pageList.CurrentPageData.ForEach(x => - { - x.SubjectVisitName = x.IsGlobal ? "末次访视" : x.SubjectVisitName; - }); - return pageList; - } - - - - /// - /// 获取单条 - /// - /// - /// - [HttpPost("{id:guid}")] - public async Task GetReadingPeriodSet(Guid id) - { - return await _readingPeriodSetRepository.AsQueryable().Include(x => x.ReadingPeriodSites).Where(x => x.Id == id).ProjectTo(_mapper.ConfigurationProvider).FirstOrDefaultAsync(); - } - - /// - /// 获取阅片期配置的截至访视的下拉框 (增加标准搜索,已修改) - /// - /// - /// - [HttpPost] - public async Task> GetReadingVisitList(GetReadingVisitListInDto inDto) - { - var maxVisitNum = await _readingPeriodSetRepository - .WhereIf(inDto.TrialReadingCriterionId!=null,t=>t.TrialReadingCriterionId==inDto.TrialReadingCriterionId) - - .Where(x => x.TrialId == inDto.TrialId && x.ReadingSetType == inDto.ReadingSetType&&x.IsTakeEffect== ReadingPeriodStatus.TakeEffect ) - .MaxAsync(x => x.ExpirationVisitNum)??0; - var thisVisitNum = await _readingPeriodSetRepository.Where(x => x.Id == inDto.ReadingPeriodSetId).Select(x => x.ExpirationVisitNum).FirstOrDefaultAsync() ?? -1; - - var globalVisitNum = new List(); - if (inDto.ReadingSetType == ReadingSetType.TumorReading) - { - globalVisitNum = await _readModuleRepository - .WhereIf(inDto.TrialReadingCriterionId != null, t => t.TrialReadingCriterionId == inDto.TrialReadingCriterionId) - - .Where(x => x.ReadingSetType == ReadingSetType.ImageReading && x.TrialId == inDto.TrialId).Select(x => x.VisitNum).Distinct().ToListAsync(); - } - - List result = await _visitStageRepository.Where(x => x.TrialId == inDto.TrialId ) - .WhereIf(inDto.ReadingSetType == ReadingSetType.TumorReading,x=> globalVisitNum.Contains(x.VisitNum)) - .Where(x=>x.VisitNum== thisVisitNum || x.VisitNum >= maxVisitNum).Select(x => new GetReadingVisitListOutDto() - { - VisitName = x.VisitName, - VisitNum = x.VisitNum, - VisitStageId = x.Id, - }).ToListAsync(); - return result; - } /// /// 设置阅片期配置是否生效 (增加标准搜索,已修改) @@ -327,8 +151,8 @@ namespace IRaCIS.Application.Services .Include(x => x.ReadingPeriodSet).Include(x => x.SubjectVisit).ToList(); var needAddVisitIds = plans.Select(x => x.SubjectVisitId).ToList(); - var repeatVisitNames = _readModuleRepository.Where(x => x.TrialReadingCriterionId== readingPeriodSet.TrialReadingCriterionId && x.ReadingSetType == readingPeriodSet.ReadingSetType && needAddVisitIds.Contains(x.SubjectVisitId)).Select(x =>x.Subject.Code+"的"+ x.SubjectVisit.VisitName).ToList(); - if(repeatVisitNames.Count!=0) + var repeatVisitNames = _readModuleRepository.Where(x => x.TrialReadingCriterionId == readingPeriodSet.TrialReadingCriterionId && x.ReadingSetType == readingPeriodSet.ReadingSetType && needAddVisitIds.Contains(x.SubjectVisitId)).Select(x => x.Subject.Code + "的" + x.SubjectVisit.VisitName).ToList(); + if (repeatVisitNames.Count != 0) { return ResponseOutput.NotOk($"{string.Join(",", repeatVisitNames)}已经添加过阅片期,无法设置生效"); } @@ -350,7 +174,7 @@ namespace IRaCIS.Application.Services VisitNum = item.SubjectVisit.VisitNum, //增加标准 - TrialReadingCriterionId=readingPeriodSet.TrialReadingCriterionId + TrialReadingCriterionId = readingPeriodSet.TrialReadingCriterionId }); }; @@ -361,8 +185,8 @@ namespace IRaCIS.Application.Services { case ReadingSetType.ImageReading: //增加标准 - var taskInfoList = await _visitTaskRepository.Where(x =>x.TrialReadingCriterionId==readingPeriodSet.TrialReadingCriterionId && subjectVisitIds.Contains(x.SourceSubjectVisitId ?? default(Guid)) && - x.TaskState==TaskState.Effect && x.ReadingTaskState == ReadingTaskState.HaveSigned && !x.IsAnalysisCreate).ToListAsync(); + var taskInfoList = await _visitTaskRepository.Where(x => x.TrialReadingCriterionId == readingPeriodSet.TrialReadingCriterionId && subjectVisitIds.Contains(x.SourceSubjectVisitId ?? default(Guid)) && + x.TaskState == TaskState.Effect && x.ReadingTaskState == ReadingTaskState.HaveSigned && !x.IsAnalysisCreate).ToListAsync(); foreach (var item in taskInfoList) { @@ -394,23 +218,23 @@ namespace IRaCIS.Application.Services case ReadingSetType.TumorReading: - + var criterionInfo = await _readingQuestionCriterionTrialRepository.Where(x => x.Id == readingPeriodSet.TrialReadingCriterionId).Select(x => new { x.ReadingType, - + }).FirstNotNullAsync(); //增加标准 var globalModuleIds = await _readModuleRepository.Where(x => x.TrialReadingCriterionId == readingPeriodSet.TrialReadingCriterionId && subjectVisitIds.Contains(x.SubjectVisitId) && x.ModuleType == ModuleTypeEnum.Global).Select(x => x.Id).ToListAsync(); //增加标准 - var globalTaskInfo = await _visitTaskRepository.Where(x => x.TrialReadingCriterionId == readingPeriodSet.TrialReadingCriterionId && globalModuleIds.Contains(x.SouceReadModuleId ?? default(Guid)) && x.TaskState == TaskState.Effect && x.ReadingTaskState == ReadingTaskState.HaveSigned&&!x.IsAnalysisCreate).GroupBy(x=> new { x.SouceReadModuleId }).Select(x => - new { - SouceReadModuleId=x.Key.SouceReadModuleId, - Count=x.ToList().Count, - TaskId = x.Select(x=>x.Id).FirstOrDefault(), + var globalTaskInfo = await _visitTaskRepository.Where(x => x.TrialReadingCriterionId == readingPeriodSet.TrialReadingCriterionId && globalModuleIds.Contains(x.SouceReadModuleId ?? default(Guid)) && x.TaskState == TaskState.Effect && x.ReadingTaskState == ReadingTaskState.HaveSigned && !x.IsAnalysisCreate).GroupBy(x => new { x.SouceReadModuleId }).Select(x => + new { + SouceReadModuleId = x.Key.SouceReadModuleId, + Count = x.ToList().Count, + TaskId = x.Select(x => x.Id).FirstOrDefault(), ReadModuleId = x.Select(x => x.SouceReadModuleId).FirstOrDefault(), JudgeTaskId = x.Select(x => x.JudgeVisitTaskId).FirstOrDefault(), JudgeTaskResultId = x.Select(x => x.JudgeVisitTask.JudgeResultTaskId).FirstOrDefault(), @@ -490,18 +314,215 @@ namespace IRaCIS.Application.Services - /// - /// 删除 - /// - /// - /// - [HttpDelete("{readingPeriodSetId:guid}")] - public async Task DeleteReadingPeriodSet(Guid readingPeriodSetId) - { - await _readingPeriodSetRepository.DeleteFromQueryAsync(t => t.Id == readingPeriodSetId,true); - await _readingPeriodPlanRepository.DeleteFromQueryAsync(t => t.ReadingPeriodSetId == readingPeriodSetId, true); + #endregion - return ResponseOutput.Ok(); + + #region 阅片计划 相关 + + /// + /// 获取选中的计划 (增加标准不影响 因为阅片期设置关联了标准) + /// + /// + /// + [HttpPost] + public async Task> GetPreviewTheReadingPlanList(PreviewTheReadingListDto inDto) + { + var plans = _readingPeriodPlanRepository.Where(x => x.ReadingPeriodSetId == inDto.ReadingPeriodSetId).Include(x => x.SubjectVisit).Include(x => x.SubjectVisit.TrialSite).Include(x => x.SubjectVisit.Subject) + .Include(x => x.ReadingPeriodSet).Select(x => new PreviewTheReadingListOutDto + { + Id = x.Id, + ExpirationDate = x.ReadingPeriodSet.ExpirationDate, + SubjectVisitId = x.SubjectVisitId, + TrialSiteCode = x.SubjectVisit.TrialSite.TrialSiteCode, + LatestScanDate = x.SubjectVisit.LatestScanDate, + ReadingPeriodName = x.ReadingPeriodSet.ReadingPeriodName, + ReadingPeriodSetId = x.ReadingPeriodSetId, + SubjectCode = x.SubjectVisit.Subject.Code, + SubjectId = x.SubjectVisit.SubjectId, + SubjectVisitName = x.SubjectVisit.VisitName, + EffectOfTime = x.ReadingPeriodSet.EffectOfTime, + }); + + return await plans.ToPagedListAsync(inDto.PageIndex, inDto.PageSize, inDto.SortField == null ? nameof(PreviewTheReadingListOutDto.SubjectId) : inDto.SortField, + inDto.Asc); } + + + /// + /// 添加对应的阅片计划 (后续生效将计划变为模块) (增加标准不影响 因为阅片期设置关联了标准) + /// + /// + /// + public async Task GenerateReadingTask(ReadingToGenerateInDto inDto) + { + List plans = new List(); + inDto.SubjectVisitIds.ForEach(x => + { + plans.Add(new ReadingPeriodPlan() + { + SubjectVisitId = x, + ReadingPeriodSetId = inDto.ReadingPeriodSetId + }); + }); + await _readingPeriodPlanRepository.DeleteFromQueryAsync(x => x.ReadingPeriodSetId == inDto.ReadingPeriodSetId); + await _readingPeriodPlanRepository.SaveChangesAsync(); + await _readingPeriodPlanRepository.AddRangeAsync(plans); + var result = await _readingPeriodPlanRepository.SaveChangesAsync(); + return ResponseOutput.Result(result); + } + + #endregion + + + + #region 阅片期相关查询 + + /// + /// 分页获取 (增加标准搜索,已修改) + /// + /// + /// + [HttpPost] + public async Task> GetReadingPeriodSetList(ReadingPeriodSetQuery query) + { + var readQuery = _readingPeriodSetRepository.Where(t => t.TrialId == query.TrialId).Include(x => x.ReadingPeriodSites) + .WhereIf(query.ReadingPeriodName != null, x => x.ReadingPeriodName.Contains(query.ReadingPeriodName!)) + .WhereIf(query.TrialReadingCriterionId != null, x => x.TrialReadingCriterionId == query.TrialReadingCriterionId) + .ProjectTo(_mapper.ConfigurationProvider); + var pageList = await readQuery.ToPagedListAsync(query.PageIndex, query.PageSize, query.SortField == null ? nameof(ReadingPeriodSetView.CreateTime) : query.SortField, + query.Asc); + + pageList.CurrentPageData.ForEach(x => + { + x.SubjectVisitName = x.IsGlobal ? "末次访视" : x.SubjectVisitName; + }); + return pageList; + } + + + + /// + /// 获取单条 + /// + /// + /// + [HttpPost("{id:guid}")] + public async Task GetReadingPeriodSet(Guid id) + { + return await _readingPeriodSetRepository.AsQueryable().Include(x => x.ReadingPeriodSites).Where(x => x.Id == id).ProjectTo(_mapper.ConfigurationProvider).FirstOrDefaultAsync(); + } + + /// + /// 获取阅片期配置的截至访视的下拉框 (增加标准搜索,已修改) + /// + /// + /// + [HttpPost] + public async Task> GetReadingVisitList(GetReadingVisitListInDto inDto) + { + var maxVisitNum = await _readingPeriodSetRepository + .WhereIf(inDto.TrialReadingCriterionId != null, t => t.TrialReadingCriterionId == inDto.TrialReadingCriterionId) + + .Where(x => x.TrialId == inDto.TrialId && x.ReadingSetType == inDto.ReadingSetType && x.IsTakeEffect == ReadingPeriodStatus.TakeEffect) + .MaxAsync(x => x.ExpirationVisitNum) ?? 0; + var thisVisitNum = await _readingPeriodSetRepository.Where(x => x.Id == inDto.ReadingPeriodSetId).Select(x => x.ExpirationVisitNum).FirstOrDefaultAsync() ?? -1; + + var globalVisitNum = new List(); + if (inDto.ReadingSetType == ReadingSetType.TumorReading) + { + globalVisitNum = await _readModuleRepository + .WhereIf(inDto.TrialReadingCriterionId != null, t => t.TrialReadingCriterionId == inDto.TrialReadingCriterionId) + + .Where(x => x.ReadingSetType == ReadingSetType.ImageReading && x.TrialId == inDto.TrialId).Select(x => x.VisitNum).Distinct().ToListAsync(); + } + + List result = await _visitStageRepository.Where(x => x.TrialId == inDto.TrialId) + .WhereIf(inDto.ReadingSetType == ReadingSetType.TumorReading, x => globalVisitNum.Contains(x.VisitNum)) + .Where(x => x.VisitNum == thisVisitNum || x.VisitNum >= maxVisitNum).Select(x => new GetReadingVisitListOutDto() + { + VisitName = x.VisitName, + VisitNum = x.VisitNum, + VisitStageId = x.Id, + }).ToListAsync(); + return result; + } + + + + /// + /// 获取影像阅片的预览 // 需要清除之前已经选中的 (增加标准搜索,已修改) + /// + /// + [HttpPost] + public async Task> GetPreviewTheReadingList(PreviewTheReadingListInDto inDto) + { + var readModulequery = _readModuleRepository.AsQueryable(); + + // 当前项目 最晚拍片日期不为null 中心筛选 + var visitQuery = _subjectVisitRepository.Where(x => x.TrialId == inDto.TrialId && x.LatestScanDate != null && !x.IsLostVisit) + .WhereIf(inDto.ReadingScope == ReadingScopeEnum.Site, x => inDto.SiteIds.Contains(x.SiteId)); + + // 已经存在的访视 需要排除 + var existsBubjectVisitsQuery = _readModuleRepository.Where(y => y.ReadingSetType == inDto.ReadingSetType && y.TrialId == inDto.TrialId && y.TrialReadingCriterionId == inDto.TrialReadingCriterionId).Select(x => x.SubjectVisitId); + + visitQuery = visitQuery.Where(x => !existsBubjectVisitsQuery.Contains(x.Id)) + .WhereIf(inDto.ExpirationDate != null, x => x.LatestScanDate <= inDto.ExpirationDate.Value) + .WhereIf(inDto.ExpirationVisitNum != null, x => x.VisitNum == inDto.ExpirationVisitNum) + .WhereIf(inDto.ReadingSetType == ReadingSetType.TumorReading, x => readModulequery.Where(y => y.SubjectVisitId == x.Id && y.ReadingSetType == ReadingSetType.ImageReading).Count() > 0); + + var subjectIdlist = await visitQuery.OrderBy(x => x.SubjectId).Select(x => x.SubjectId).Distinct().Skip((inDto.PageIndex - 1) * inDto.PageSize).Take(inDto.PageSize).ToListAsync(); + + + var totalCount = visitQuery.Select(x => x.SubjectId).Distinct().Count(); + + var visitlist = await visitQuery.Include(x => x.Subject).Include(x => x.TrialSite).Where(x => subjectIdlist.Contains(x.SubjectId)).ToListAsync(); + + var subjectVisits = visitlist.GroupBy(x => x.SubjectId).Select(x => new + { + SubjectId = x.Key, + Visits = x.ToList() + }); + + List visits = new List(); + subjectVisits.ForEach(x => + { + var visit = x.Visits.OrderByDescending(x => x.VisitNum).FirstOrDefault(); + if (visit != null) + { + visits.Add(visit); + } + }); + + PageOutput result = new PageOutput() + { + CurrentPageData = visits + .Select(x => new PreviewTheReadingListOutDto + { + ExpirationDate = inDto.ExpirationDate, + SubjectVisitId = x.Id, + TrialSiteCode = x.TrialSite.TrialSiteCode, + LatestScanDate = x.LatestScanDate, + ReadingPeriodName = inDto.ReadingPeriodName, + SubjectCode = x.Subject.Code, + SubjectId = x.SubjectId, + SubjectVisitName = x.VisitName, + }).ToList(), + PageSize = inDto.PageSize, + PageIndex = inDto.PageIndex, + TotalCount = totalCount, + }; + return result; + } + + #endregion + + + + + + + + + } }