diff --git a/IRaCIS.Core.Application/Service/ImageAndDoc/InstanceService.cs b/IRaCIS.Core.Application/Service/ImageAndDoc/InstanceService.cs index 179997232..cc67adb4d 100644 --- a/IRaCIS.Core.Application/Service/ImageAndDoc/InstanceService.cs +++ b/IRaCIS.Core.Application/Service/ImageAndDoc/InstanceService.cs @@ -19,8 +19,14 @@ namespace IRaCIS.Core.Application.Services [HttpGet("{seriesId:guid}")] public async Task>> List(Guid seriesId) { - var list = await _instanceRepository.Where(s => s.SeriesId == seriesId).IgnoreQueryFilters().OrderBy(s => s.InstanceNumber). - ThenBy(s => s.InstanceTime).ThenBy(s => s.CreateTime) + var qcAuditState = await _instanceRepository.Where(s => s.SeriesId == seriesId).Select(t => t.DicomStudy.SubjectVisit.AuditState).FirstOrDefaultAsync(); + + //质控通过以后,过滤删除的 质控之前的不过滤 + var isQCFinished = qcAuditState == AuditStateEnum.QCPassed; + + var list = await _instanceRepository.Where(s => s.SeriesId == seriesId).IgnoreQueryFilters() + .WhereIf(isQCFinished, t => t.IsDeleted == false) + .OrderBy(s => s.InstanceNumber).ThenBy(s => s.InstanceTime).ThenBy(s => s.CreateTime) .ProjectTo(_mapper.ConfigurationProvider).ToListAsync(); var seriesInfo = await _instanceRepository.Where(s => s.SeriesId == seriesId).Select(t => new { t.DicomSerie.ImageResizePath,t.DicomSerie.IsDeleted,t.DicomSerie.IsReading }).FirstOrDefaultAsync(); diff --git a/IRaCIS.Core.Application/Service/ImageAndDoc/SeriesService.cs b/IRaCIS.Core.Application/Service/ImageAndDoc/SeriesService.cs index 5323fab52..d27075cd0 100644 --- a/IRaCIS.Core.Application/Service/ImageAndDoc/SeriesService.cs +++ b/IRaCIS.Core.Application/Service/ImageAndDoc/SeriesService.cs @@ -22,15 +22,26 @@ namespace IRaCIS.Core.Application.Services [HttpGet, Route("{studyId:guid}")] public async Task>> List(Guid studyId) { + //质控的时候,要标记序列,和instance 删除 ,所以要返回全部,但是 质控通过后,pm 进去看的时候要看过滤后的 + + var qcAuditState = await _seriesRepository.Where(s => s.StudyId == studyId).Select(t => t.DicomStudy.SubjectVisit.AuditState).FirstOrDefaultAsync(); + + //质控通过以后,预览过滤删除的 质控之前的不过滤 + var isQCFinished = qcAuditState == AuditStateEnum.QCPassed; + //断点 - var seriesList = await _seriesRepository.Where(s => s.StudyId == studyId).IgnoreQueryFilters().OrderBy(s => s.SeriesNumber). - ThenBy(s => s.SeriesTime).ThenBy(s => s.CreateTime) + var seriesList = await _seriesRepository.Where(s => s.StudyId == studyId).IgnoreQueryFilters() + .WhereIf(isQCFinished, t => t.IsDeleted == false) + .OrderBy(s => s.SeriesNumber).ThenBy(s => s.SeriesTime).ThenBy(s => s.CreateTime) .ProjectTo(_mapper.ConfigurationProvider).ToListAsync(); - var instanceList = await _instanceRepository.Where(s => s.StudyId == studyId).IgnoreQueryFilters().OrderBy(t => t.SeriesId).ThenBy(t => t.InstanceNumber) - .ThenBy(s => s.InstanceTime).ThenBy(s => s.CreateTime) + var instanceList = await _instanceRepository.Where(s => s.StudyId == studyId).IgnoreQueryFilters() + .WhereIf(isQCFinished, t => t.IsDeleted == false) + .OrderBy(t => t.SeriesId).ThenBy(t => t.InstanceNumber) + .ThenBy(s => s.InstanceTime).ThenBy(s => s.CreateTime) .Select(t => new { t.SeriesId, t.Id, t.Path, t.NumberOfFrames, t.InstanceNumber, t.HtmlPath, t.IsReading, t.IsDeleted }).ToListAsync();//.GroupBy(u => u.SeriesId); + foreach (var series in seriesList) { diff --git a/IRaCIS.Core.Application/Service/ImageAndDoc/_MapConfig.cs b/IRaCIS.Core.Application/Service/ImageAndDoc/_MapConfig.cs index 608dc6dd2..ab7aa15c1 100644 --- a/IRaCIS.Core.Application/Service/ImageAndDoc/_MapConfig.cs +++ b/IRaCIS.Core.Application/Service/ImageAndDoc/_MapConfig.cs @@ -63,12 +63,15 @@ namespace IRaCIS.Core.Application.Service // .ForMember(o => o.InstancePathList, t => t.MapFrom(u => u.DicomInstanceList.OrderBy(t=>t.InstanceNumber).Select(t => t.Path))) ; + var isNeedStat = false; CreateMap() .ForMember(o => o.IsCompleteClinicalData, t => t.MapFrom(u => !u.ReadingClinicalDataList.Any(x => x.ReadingClinicalDataPDFList.Count() == 0))) .ForMember(o => o.UploadedTime, t => t.MapFrom(u => u.CreateTime)) .ForMember(o => o.Uploader, t => t.MapFrom(u => u.CreateUserRole.IdentityUser.FullName)) .ForMember(o => o.StudyId, t => t.MapFrom(u => u.Id)) - .ForMember(o => o.IsHaveUploadFailed, t => t.MapFrom(u => u.DicomStudyMonitorList.Any(t => t.FailedFileCount > 0))) + .ForMember(o => o.SeriesCount, t => t.MapFrom(u => isNeedStat == false ? u.SeriesCount : u.SeriesList.Count())) + .ForMember(o => o.InstanceCount, t => t.MapFrom(u => isNeedStat == false ? u.InstanceCount : u.InstanceList.Count())) + .ForMember(o => o.IsHaveUploadFailed, t => t.MapFrom(u => u.DicomStudyMonitorList.Any(t => t.FailedFileCount > 0))) .ForMember(o => o.Modalities, t => t.MapFrom(u => string.Join('、', u.SeriesList.Select(t => t.Modality).Distinct()))); diff --git a/IRaCIS.Core.Application/Service/QC/QCListService.cs b/IRaCIS.Core.Application/Service/QC/QCListService.cs index 7a52b16f8..3e64ac1d9 100644 --- a/IRaCIS.Core.Application/Service/QC/QCListService.cs +++ b/IRaCIS.Core.Application/Service/QC/QCListService.cs @@ -525,9 +525,16 @@ namespace IRaCIS.Core.Application.Image.QA [HttpGet("{subjectVisitId:guid}")] public async Task>> GetSubjectVisitUploadedStudyList(Guid subjectVisitId) { + var qcAuditState = await _subjectVisitRepository.Where(s => s.Id == subjectVisitId).Select(t => t.AuditState).FirstOrDefaultAsync(); + + //质控过程中,因为会修改统计数字,但是此时其他人看,应该看到完整的影像 + var isQCFinished = qcAuditState == AuditStateEnum.QCPassed; + + var isNeedStat = _userInfo.UserTypeEnumInt != (int)UserTypeEnum.IQC && !isQCFinished; var visit = await _subjectVisitRepository.Where(x => x.Id == subjectVisitId).FirstNotNullAsync(); - var list = await _dicomStudyRepository.Where(s => s.SubjectVisitId == subjectVisitId).IgnoreQueryFilters().ProjectTo(_mapper.ConfigurationProvider).OrderBy(t => t.StudyCode).ToListAsync(); + + var list = await _dicomStudyRepository.Where(s => s.SubjectVisitId == subjectVisitId).IgnoreQueryFilters().ProjectTo(_mapper.ConfigurationProvider,new { isNeedStat= isNeedStat }).OrderBy(t => t.StudyCode).ToListAsync(); var config = await _subjectVisitRepository.Where(t => t.Id == subjectVisitId).Select(t => t.Trial).ProjectTo(_mapper.ConfigurationProvider).FirstOrDefaultAsync().IfNullThrowException(); diff --git a/IRaCIS.Core.Application/Service/Visit/SubjectVisitService.cs b/IRaCIS.Core.Application/Service/Visit/SubjectVisitService.cs index 9633222b5..0ca732f8f 100644 --- a/IRaCIS.Core.Application/Service/Visit/SubjectVisitService.cs +++ b/IRaCIS.Core.Application/Service/Visit/SubjectVisitService.cs @@ -212,6 +212,13 @@ namespace IRaCIS.Core.Application.Services [AllowAnonymous] public async Task> GetVisitStudyList(Guid trialId, Guid sujectVisitId, int isReading, [FromQuery] Guid? visitTaskId) { + + var qcAuditState = await _subjectVisitRepository.Where(s => s.Id == sujectVisitId).Select(t => t.AuditState).FirstOrDefaultAsync(); + + //质控通过以后,过滤删除的 质控之前的不过滤 + var isQCFinished = qcAuditState == AuditStateEnum.QCPassed; + + var isImageFilter = false; var criterionModalitys = ""; if (visitTaskId != null) @@ -237,13 +244,16 @@ namespace IRaCIS.Core.Application.Services var studyIds = studyList.Select(t => t.StudyId).ToList(); var instanceList = await _dicomInstanceRepository.Where(t => studyIds.Contains(t.StudyId)).IgnoreQueryFilters() - .WhereIf(isReading == 1, s => s.IsReading) + .WhereIf(isReading == 1, s => s.IsReading && s.IsDeleted == false) + .WhereIf(isQCFinished, t => t.IsDeleted == false) .Select(t => new { t.SeriesId, t.Id, t.InstanceNumber, t.Path, t.NumberOfFrames, t.HtmlPath, t.IsReading, t.IsDeleted }).ToListAsync(); foreach (var t in studyList) { t.SeriesList = await _dicomSeriesRepository.Where(s => s.StudyId == t.StudyId).IgnoreQueryFilters() - .WhereIf(isReading == 1, s => s.IsReading).OrderBy(s => s.SeriesNumber).ThenBy(s => s.SeriesTime) + .WhereIf(isReading == 1, s => s.IsReading && s.IsDeleted == false) + .WhereIf(isQCFinished, t => t.IsDeleted == false) + .OrderBy(s => s.SeriesNumber).ThenBy(s => s.SeriesTime) .ProjectTo(_mapper.ConfigurationProvider).ToListAsync(); diff --git a/IRaCIS.Core.Domain.Share/QC/AuditStateEnum.cs b/IRaCIS.Core.Domain.Share/QC/AuditStateEnum.cs index 35f4dc763..df265f46d 100644 --- a/IRaCIS.Core.Domain.Share/QC/AuditStateEnum.cs +++ b/IRaCIS.Core.Domain.Share/QC/AuditStateEnum.cs @@ -23,7 +23,7 @@ namespace IRaCIS.Core.Domain.Share InSecondaryQC = 6, - //任何QC设置为QC Failed + //任何QC设置为QC Failed--去掉了 QCFailed = 7, //2nd QC设置为QC Passed diff --git a/IRaCIS.Core.Domain/Image/DicomStudy.cs b/IRaCIS.Core.Domain/Image/DicomStudy.cs index 1ca22dc30..ee9228614 100644 --- a/IRaCIS.Core.Domain/Image/DicomStudy.cs +++ b/IRaCIS.Core.Domain/Image/DicomStudy.cs @@ -10,6 +10,9 @@ public class DicomStudy : BaseFullDeleteAuditEntity, IEntitySeqId [JsonIgnore] public List SeriesList { get; set; } + [JsonIgnore] + public List InstanceList { get; set; } + [JsonIgnore] [ForeignKey("SubjectId")] public Subject Subject { get; set; } diff --git a/IRaCIS.Core.Infra.EFCore/EntityConfigration/ImageConfigration.cs b/IRaCIS.Core.Infra.EFCore/EntityConfigration/ImageConfigration.cs index 2b2d4d63c..f2e4ef204 100644 --- a/IRaCIS.Core.Infra.EFCore/EntityConfigration/ImageConfigration.cs +++ b/IRaCIS.Core.Infra.EFCore/EntityConfigration/ImageConfigration.cs @@ -13,7 +13,7 @@ public class DicomStudyConfigration : IEntityTypeConfiguration { builder.HasKey(e => e.SeqId); - //builder.HasMany(s => s.InstanceList).WithOne(se => se.DicomStudy).HasForeignKey(se => se.StudyId).HasPrincipalKey(st => st.Id); + builder.HasMany(s => s.InstanceList).WithOne(se => se.DicomStudy).HasForeignKey(se => se.StudyId).HasPrincipalKey(st => st.Id); builder.HasMany(s => s.SeriesList).WithOne(se => se.DicomStudy).HasForeignKey(se => se.StudyId).HasPrincipalKey(st => st.Id); @@ -42,7 +42,7 @@ public class DicomInstanceConfigration : IEntityTypeConfiguration { builder.HasKey(e => e.SeqId); - builder.HasOne(e => e.DicomStudy).WithMany().HasForeignKey(t=>t.StudyId).HasPrincipalKey(st => st.Id); + builder.HasOne(e => e.DicomStudy).WithMany(c=>c.InstanceList).HasForeignKey(t=>t.StudyId).HasPrincipalKey(st => st.Id); builder.HasMany(s => s.ReadingTableAnswerRowInfoList).WithOne(di => di.Instance).HasForeignKey(t => t.InstanceId).HasPrincipalKey(se => se.Id);