diff --git a/IRaCIS.Core.Application/IRaCIS.Core.Application.xml b/IRaCIS.Core.Application/IRaCIS.Core.Application.xml index 532cdd2da..e51bf5247 100644 --- a/IRaCIS.Core.Application/IRaCIS.Core.Application.xml +++ b/IRaCIS.Core.Application/IRaCIS.Core.Application.xml @@ -3202,7 +3202,7 @@ - 自动添加CRC临床数据 + 自动添加CRC临床数据 (不包括检查级别) @@ -12337,7 +12337,7 @@ - + 配置流程验证 diff --git a/IRaCIS.Core.Application/Service/ImageAndDoc/StudyService.cs b/IRaCIS.Core.Application/Service/ImageAndDoc/StudyService.cs index 57e7a8cec..c74549364 100644 --- a/IRaCIS.Core.Application/Service/ImageAndDoc/StudyService.cs +++ b/IRaCIS.Core.Application/Service/ImageAndDoc/StudyService.cs @@ -139,7 +139,11 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc } - + /// + /// 上传临床数据 + /// + /// + /// [TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "AfterStopCannNotOpt" })] public async Task AddOrUpdateArchiveStudy(NewArchiveStudyCommand incommand) { diff --git a/IRaCIS.Core.Application/Service/Reading/ClinicalData/ClinicalAnswerService.cs b/IRaCIS.Core.Application/Service/Reading/ClinicalData/ClinicalAnswerService.cs index 761800f5b..1bfd22237 100644 --- a/IRaCIS.Core.Application/Service/Reading/ClinicalData/ClinicalAnswerService.cs +++ b/IRaCIS.Core.Application/Service/Reading/ClinicalData/ClinicalAnswerService.cs @@ -16,6 +16,7 @@ using IRaCIS.Core.Domain.Models; using IRaCIS.Core.Infrastructure.Extention; using IRaCIS.Core.Application.Service.Reading.Interface; using IRaCIS.Core.Application.Contracts; +using OfficeOpenXml.FormulaParsing.Excel.Functions.Information; namespace IRaCIS.Core.Application.Service { @@ -41,6 +42,7 @@ namespace IRaCIS.Core.Application.Service private readonly IRepository _subjectRepository; private readonly IRepository _readModuleCriterionFromRepository; private readonly IRepository _readModuleRepository; + private readonly IRepository _dicomStudyRepository; private readonly IRepository _clinicalQuestionAnswerRepository; private readonly IRepository _clinicalTableAnswerRepository; @@ -64,6 +66,7 @@ namespace IRaCIS.Core.Application.Service IReadingClinicalDataService iReadingClinicalDataService, IRepository readModuleCriterionFromRepository, IRepository readModuleRepository, + IRepository dicomStudyRepository, IRepository subjectVisitRepository, IRepository clinicalTableAnswerRepository, IRepository clinicalQuestionAnswerRepository, @@ -87,6 +90,7 @@ namespace IRaCIS.Core.Application.Service this._subjectRepository = subjectRepository; this._readModuleCriterionFromRepository = readModuleCriterionFromRepository; this._readModuleRepository = readModuleRepository; + this._dicomStudyRepository = dicomStudyRepository; _clinicalTableAnswerRepository = clinicalTableAnswerRepository; _iClinicalQuestionService = iClinicalQuestionService; } @@ -111,11 +115,56 @@ namespace IRaCIS.Core.Application.Service } /// - /// 自动添加CRC临床数据 + /// 删除检查级别临床数据 /// /// /// - public async Task AutoAddCRCClinical(AutoAddClinicalInDto inDto) + public async Task DeleteStudyClinical(DeleteStudyClinicalInDto inDto) + { + await _readingClinicalDataRepository.BatchDeleteNoTrackingAsync(x => x.StudyId == inDto.StudyId); + + } + + /// + /// 添加检查级别临床数据 + /// + /// + /// + public async Task AddStudyClinical(AddStudyClinicalInDto inDto) + { + var studyInfo = await _dicomStudyRepository.Where(x => x.Id == inDto.StudyId).FirstNotNullAsync(); + + List clinicals = await _clinicalDataTrialSetRepository.Where(x => + x.TrialId == studyInfo.TrialId && x.IsConfirm&&x.ClinicalDataLevel== ClinicalLevel.Study).ToListAsync(); + + List datas = new List(); + + clinicals.ForEach(x => + { + datas.Add(new ReadingClinicalData() + { + ClinicalDataTrialSetId = x.Id, + IsVisit = true, + SubjectId = studyInfo.SubjectId, + ReadingId = studyInfo.SubjectVisitId, + TrialId = studyInfo.TrialId, + StudyId = studyInfo.Id + + }); + + }); + + await _readingClinicalDataRepository.AddRangeAsync(datas); + await _readingClinicalDataRepository.SaveChangesAsync(); + + } + + /// + /// 自动添加CRC临床数据 (不包括检查级别) + /// + /// + /// + public async Task AutoAddCRCClinical(AutoAddClinicalInDto inDto) { var dataTrialSetList = await _clinicalDataTrialSetRepository.Where(x =>x.TrialId == inDto.TrialId && x.UploadRole == UploadRole.CRC && x.IsConfirm) .IgnoreAutoIncludes().ToListAsync(); @@ -194,16 +243,16 @@ namespace IRaCIS.Core.Application.Service 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()); + //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 b144be19e..e451debc9 100644 --- a/IRaCIS.Core.Application/Service/Reading/ClinicalData/ReadingClinicalDataService.cs +++ b/IRaCIS.Core.Application/Service/Reading/ClinicalData/ReadingClinicalDataService.cs @@ -9,6 +9,7 @@ using Microsoft.Extensions.DependencyInjection; using System.Linq.Expressions; using IRaCIS.Core.Infrastructure; using System.Linq.Dynamic.Core; +using Microsoft.Extensions.Logging; namespace IRaCIS.Application.Services { @@ -178,19 +179,33 @@ namespace IRaCIS.Application.Services #region 临床数据CRC 相关 - /// - /// 获取CRC上传的文件 - /// - /// - /// - [HttpPost] + + /// + /// 获取CRC上传的文件 + /// + /// + /// + [HttpPost] public async Task> GetCRCClinicalData(GetCRCClinicalDataInDto inDto) { - List cRCClinicalDataList = await _readingClinicalDataRepository.Where(x => x.ReadingId == inDto.SubjectVisitId) - .WhereIf(inDto.IsBaseline, x => x.ClinicalDataTrialSet.ClinicalDataLevel == ClinicalLevel.Subject || x.ClinicalDataTrialSet.ClinicalDataLevel == ClinicalLevel.SubjectVisit|| x.ClinicalDataTrialSet.ClinicalDataLevel == ClinicalLevel.Study) - .WhereIf(!inDto.IsBaseline, x => x.ClinicalDataTrialSet.ClinicalDataLevel == ClinicalLevel.SubjectVisit || x.ClinicalDataTrialSet.ClinicalDataLevel == ClinicalLevel.Study) - .Where(x => x.ClinicalDataTrialSet.TrialId == inDto.TrialId && x.ClinicalDataTrialSet.UploadRole == UploadRole.CRC) - .Select(x => new GetCRCClinicalDataOutDto() + + var query = _readingClinicalDataRepository.AsQueryable(); + if (inDto.StudyId != null) + { + query = query.Where(x => x.StudyId == inDto.StudyId.Value); + } + else + { + query = query.Where(x => x.ReadingId == inDto.SubjectVisitId) + .WhereIf(inDto.IsBaseline, x => x.ClinicalDataTrialSet.ClinicalDataLevel == ClinicalLevel.Subject || x.ClinicalDataTrialSet.ClinicalDataLevel == ClinicalLevel.SubjectVisit) + .WhereIf(!inDto.IsBaseline, x => x.ClinicalDataTrialSet.ClinicalDataLevel == ClinicalLevel.SubjectVisit) + .Where(x => x.ClinicalDataTrialSet.TrialId == inDto.TrialId && x.ClinicalDataTrialSet.UploadRole == UploadRole.CRC); + + } + + + List cRCClinicalDataList = await query + .Select(x => new GetCRCClinicalDataOutDto() { Id = x.Id, ClinicalDataSetName = x.ClinicalDataTrialSet.ClinicalDataSetName.LanguageName(x.ClinicalDataTrialSet.ClinicalDataSetEnName, _userInfo.IsEn_Us) , diff --git a/IRaCIS.Core.Application/Service/Reading/Dto/ClinicalAnswerDto.cs b/IRaCIS.Core.Application/Service/Reading/Dto/ClinicalAnswerDto.cs index fb669cb58..c09cbbf25 100644 --- a/IRaCIS.Core.Application/Service/Reading/Dto/ClinicalAnswerDto.cs +++ b/IRaCIS.Core.Application/Service/Reading/Dto/ClinicalAnswerDto.cs @@ -12,7 +12,19 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto { public Guid ReadingClinicalDataId { get; set; } } - public class AutoAddClinicalInDto + + + public class DeleteStudyClinicalInDto + { + public Guid StudyId { get; set; } + } + + public class AddStudyClinicalInDto + { + public Guid StudyId { get; set; } + } + + public class AutoAddClinicalInDto { public Guid? SubjectId { get; set; } diff --git a/IRaCIS.Core.Application/Service/Reading/Dto/ReadingClinicalDataDto.cs b/IRaCIS.Core.Application/Service/Reading/Dto/ReadingClinicalDataDto.cs index 39262facc..f697a924a 100644 --- a/IRaCIS.Core.Application/Service/Reading/Dto/ReadingClinicalDataDto.cs +++ b/IRaCIS.Core.Application/Service/Reading/Dto/ReadingClinicalDataDto.cs @@ -143,16 +143,17 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto public class GetCRCClinicalDataInDto { - [NotDefault] public Guid SubjectVisitId { get; set; } - [NotDefault] public Guid TrialId { get; set; } - [NotDefault] public Guid SubjectId { get; set; } public bool IsBaseline { get; set; } + + public Guid? StudyId { get; set; } + + } /// diff --git a/IRaCIS.Core.Application/Service/Reading/Interface/IClinicalAnswerService.cs b/IRaCIS.Core.Application/Service/Reading/Interface/IClinicalAnswerService.cs index 0553e985a..c3decdd72 100644 --- a/IRaCIS.Core.Application/Service/Reading/Interface/IClinicalAnswerService.cs +++ b/IRaCIS.Core.Application/Service/Reading/Interface/IClinicalAnswerService.cs @@ -11,7 +11,13 @@ namespace IRaCIS.Core.Application.Service.Reading.Interface { Task CRCSignClinicalData(CRCSignClinicalDataInDto inDto); - Task AutoAddCRCClinical(AutoAddClinicalInDto inDto); + + Task DeleteStudyClinical(DeleteStudyClinicalInDto inDto); + + Task AddStudyClinical(AddStudyClinicalInDto inDto); + + + Task AutoAddCRCClinical(AutoAddClinicalInDto inDto); Task PMConfirmClinical(CRCConfirmClinicalInDto inDto); diff --git a/IRaCIS.Core.Application/Triggers/SubjectVisitTrigger.cs b/IRaCIS.Core.Application/Triggers/SubjectVisitTrigger.cs index 979c1f779..5a14814f2 100644 --- a/IRaCIS.Core.Application/Triggers/SubjectVisitTrigger.cs +++ b/IRaCIS.Core.Application/Triggers/SubjectVisitTrigger.cs @@ -1,4 +1,5 @@ using EntityFrameworkCore.Triggered; +using IRaCIS.Core.Application.Service.Reading.Interface; using IRaCIS.Core.Domain.Share; namespace IRaCIS.Core.Application.Triggers @@ -9,13 +10,14 @@ namespace IRaCIS.Core.Application.Triggers public class SubjectVisitTrigger : IAfterSaveTrigger, IAfterSaveTrigger, IAfterSaveTrigger { private readonly IRepository _subjectVisitRepository; - private readonly IRepository _repository; + private readonly IClinicalAnswerService _iClinicalAnswerService; + private readonly IRepository _repository; - public SubjectVisitTrigger(IRepository subjectVisitRepository,IRepository repository) + public SubjectVisitTrigger(IRepository subjectVisitRepository, IClinicalAnswerService iClinicalAnswerService,IRepository repository) { _subjectVisitRepository = subjectVisitRepository; - - _repository = repository; + this._iClinicalAnswerService = iClinicalAnswerService; + _repository = repository; } //注意删除不能用扩展方法,必须用EF跟踪的实体 否则不能取到 SubjectVisitId @@ -65,13 +67,33 @@ namespace IRaCIS.Core.Application.Triggers await UpdateSubjectVisitSubmitStateAsync(subjectVisitId); + //添加检查级别临床数据 + + // 检查类型 ModalityForEdit + // 检查模态 Modalities + var modalityForEdit = context.Entity.ModalityForEdit; + if (modalityForEdit.Contains("PT") && modalityForEdit.Contains("CT")) + { + await _iClinicalAnswerService.AddStudyClinical(new Service.Reading.Dto.AddStudyClinicalInDto() + { + StudyId = studyId, + }); + } + + } if (context.ChangeType == ChangeType.Deleted) { await UpdateSubjectVisitImageDateAsync(subjectVisitId); await UpdateSubjectVisitSubmitStateAsync(subjectVisitId); - } + + //删除检查级别临床数据 + await _iClinicalAnswerService.DeleteStudyClinical(new Service.Reading.Dto.DeleteStudyClinicalInDto() + { + StudyId = context.Entity.Id, + }); + } } diff --git a/IRaCIS.Core.Domain/Reading/ClinicalData/ReadingClinicalData.cs b/IRaCIS.Core.Domain/Reading/ClinicalData/ReadingClinicalData.cs index bdcb87f34..8d78e35d4 100644 --- a/IRaCIS.Core.Domain/Reading/ClinicalData/ReadingClinicalData.cs +++ b/IRaCIS.Core.Domain/Reading/ClinicalData/ReadingClinicalData.cs @@ -24,6 +24,8 @@ namespace IRaCIS.Core.Domain.Models /// public Guid ReadingId { get; set; } + public Guid? StudyId { get; set; } + /// /// 受试者ID ///