From 06118b08c5cd64f0155137e1c642b15dadfa2709 Mon Sep 17 00:00:00 2001 From: hang <872297557@qq.com> Date: Mon, 28 Jul 2025 14:22:56 +0800 Subject: [PATCH] =?UTF-8?q?pacs=20=E5=BD=B1=E5=83=8F=E9=A2=84=E8=A7=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Service/ImageAndDoc/SeriesService.cs | 170 +++++++++--------- .../Service/ImageAndDoc/StudyService.cs | 16 +- .../Service/ImageAndDoc/_MapConfig.cs | 5 + 3 files changed, 99 insertions(+), 92 deletions(-) diff --git a/IRaCIS.Core.Application/Service/ImageAndDoc/SeriesService.cs b/IRaCIS.Core.Application/Service/ImageAndDoc/SeriesService.cs index f8f88e201..27285b3b7 100644 --- a/IRaCIS.Core.Application/Service/ImageAndDoc/SeriesService.cs +++ b/IRaCIS.Core.Application/Service/ImageAndDoc/SeriesService.cs @@ -11,6 +11,8 @@ namespace IRaCIS.Core.Application.Services [AllowAnonymous] public class SeriesService(IRepository _seriesRepository, IRepository _instanceRepository, + IRepository _scpSeriesRepository, + IRepository _scpInstanceRepository, IMapper _mapper, IUserInfo _userInfo, IStringLocalizer _localizer, IWebHostEnvironment _hostEnvironment) : BaseService { @@ -22,104 +24,96 @@ namespace IRaCIS.Core.Application.Services /// Dicom检查的Id /// [HttpGet, Route("{studyId:guid}")] - public async Task>> List(Guid studyId, bool? isReading) + public async Task>> List(Guid studyId, bool? isReading, bool? isPacs) { - //质控的时候,要标记序列,和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() - .WhereIf(isQCFinished, t => t.IsDeleted == false) - .WhereIf(isReading == true, t => t.IsReading == true) - .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() - .WhereIf(isQCFinished, t => t.IsDeleted == false) - .WhereIf(isReading == true, t => t.IsReading == true) - .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, t.FileSize }).ToListAsync();//.GroupBy(u => u.SeriesId); - - - foreach (var series in seriesList) + if (isPacs == true) { + var seriesList = await _scpSeriesRepository.Where(s => s.StudyId == studyId).IgnoreQueryFilters() + .OrderBy(s => s.SeriesNumber).ThenBy(s => s.SeriesTime).ThenBy(s => s.CreateTime) + .ProjectTo(_mapper.ConfigurationProvider).ToListAsync(); - series.InstanceInfoList = instanceList.Where(t => t.SeriesId == series.Id).OrderBy(t => t.InstanceNumber).Select(k => - new InstanceBasicInfo() - { - Id = k.Id, - NumberOfFrames = k.NumberOfFrames, - HtmlPath = k.HtmlPath, - Path = k.Path, - InstanceNumber = k.InstanceNumber, - IsReading = k.IsReading, - IsDeleted = k.IsDeleted, - FileSize = k.FileSize + var instanceList = await _scpInstanceRepository.Where(s => s.StudyId == studyId).IgnoreQueryFilters() + .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.FileSize }).ToListAsync();//.GroupBy(u => u.SeriesId); - }).ToList(); - series.InstanceCount = series.InstanceInfoList.Count; + foreach (var series in seriesList) + { + + series.InstanceInfoList = instanceList.Where(t => t.SeriesId == series.Id).OrderBy(t => t.InstanceNumber).Select(k => + new InstanceBasicInfo() + { + Id = k.Id, + NumberOfFrames = k.NumberOfFrames, + HtmlPath = string.Empty, + Path = k.Path, + InstanceNumber = k.InstanceNumber, + IsReading = true, + IsDeleted = false, + FileSize = k.FileSize + + }).ToList(); + + series.InstanceCount = series.InstanceInfoList.Count; + } + + return ResponseOutput.Ok(seriesList); + + } + else + { + //质控的时候,要标记序列,和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() + .WhereIf(isQCFinished, t => t.IsDeleted == false) + .WhereIf(isReading == true, t => t.IsReading == true) + .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() + .WhereIf(isQCFinished, t => t.IsDeleted == false) + .WhereIf(isReading == true, t => t.IsReading == true) + .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, t.FileSize }).ToListAsync();//.GroupBy(u => u.SeriesId); + + + foreach (var series in seriesList) + { + + series.InstanceInfoList = instanceList.Where(t => t.SeriesId == series.Id).OrderBy(t => t.InstanceNumber).Select(k => + new InstanceBasicInfo() + { + Id = k.Id, + NumberOfFrames = k.NumberOfFrames, + HtmlPath = k.HtmlPath, + Path = k.Path, + InstanceNumber = k.InstanceNumber, + IsReading = k.IsReading, + IsDeleted = k.IsDeleted, + FileSize = k.FileSize + + }).ToList(); + + series.InstanceCount = series.InstanceInfoList.Count; + } + + return ResponseOutput.Ok(seriesList); + } - #region 暂时废弃 - - //bool hasKeyInstance = false; - //var SeriesIdList = _imageLabelRepository.Where(u => u.TpCode == tpCode).Select(s => s.SeriesId).Distinct().ToList(); - //var instanceIdList = _imageLabelRepository.Where(u => u.TpCode == tpCode).Select(s => s.InstanceId).Distinct().ToList(); - //foreach (var item in seriesList) - //{ - // if (SeriesIdList.Contains(item.Id)) - // { - // item.HasLabel = true; - // hasKeyInstance = true; - // } - // else item.HasLabel = false; - //} - //if (hasKeyInstance) - //{ - // seriesList.Add(new DicomSeriesWithLabelDTO - // { - // KeySeries = true, - // Id = SeriesIdList[0], - // InstanceCount = instanceIdList.Count, - // HasLabel = true, - // Modality = seriesList[0].Modality, - // Description = "Key Series" - // }); - //} - - //var idList = await _instanceRepository.Where(s => s.StudyId == studyId).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 }).ToListAsync();//.GroupBy(u => u.SeriesId); - - //foreach (var item in seriesList) - //{ - // if (item.KeySeries) - // { - // item.InstanceList = instanceIdList; - // } - // else - // { - // //item.InstanceList = idList.Where(s => s.SeriesId == item.Id).OrderBy(t => t.InstanceNumber) - // // .ThenBy(s => s.InstanceTime).ThenBy(s => s.CreateTime).Select(u => u.Id).ToList(); - - // item.InstanceList = idList.Where(s => s.SeriesId == item.Id).Select(u => u.Id).ToList(); - - // item.InstancePathList = idList.Where(s => s.SeriesId == item.Id).Select(u => u.Path).ToList(); - // } - //} - - - #endregion - return ResponseOutput.Ok(seriesList); + + } diff --git a/IRaCIS.Core.Application/Service/ImageAndDoc/StudyService.cs b/IRaCIS.Core.Application/Service/ImageAndDoc/StudyService.cs index 51bf23ad6..ce62e1db1 100644 --- a/IRaCIS.Core.Application/Service/ImageAndDoc/StudyService.cs +++ b/IRaCIS.Core.Application/Service/ImageAndDoc/StudyService.cs @@ -15,11 +15,11 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc public class StudyService(IRepository _subjectVisitRepository, IRepository _dicomInstanceRepository, IRepository _dicomSeriesRepository, - IRepository _dicomstudyRepository, + IRepository _dicomStudyRepository, IRepository _dictionaryRepository, IRepository _trialRepository, IRepository _visitTaskRepository, - IRepository _dicomStudyRepository, + IRepository _scpStudyRepository, IRepository _subjectRepository, IRepository _studyMonitorRepository, IRepository _systemAnonymizationRepository, @@ -628,9 +628,17 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc /// Dicom检查的Id [HttpGet, Route("{studyId:guid}")] [AllowAnonymous] - public IResponseOutput Item(Guid studyId) + public IResponseOutput Item(Guid studyId,bool? isPacs) { - return ResponseOutput.Ok(_mapper.Map(_dicomStudyRepository.Where().FirstOrDefault(s => s.Id == studyId))); + if (isPacs == true) + { + return ResponseOutput.Ok(_mapper.Map(_scpStudyRepository.Where().FirstOrDefault(s => s.Id == studyId))); + } + else + { + return ResponseOutput.Ok(_mapper.Map(_dicomStudyRepository.Where().FirstOrDefault(s => s.Id == studyId))); + + } } diff --git a/IRaCIS.Core.Application/Service/ImageAndDoc/_MapConfig.cs b/IRaCIS.Core.Application/Service/ImageAndDoc/_MapConfig.cs index d60cf3813..31bd3b1b2 100644 --- a/IRaCIS.Core.Application/Service/ImageAndDoc/_MapConfig.cs +++ b/IRaCIS.Core.Application/Service/ImageAndDoc/_MapConfig.cs @@ -154,6 +154,11 @@ namespace IRaCIS.Core.Application.Service .ForMember(d => d.TrialSiteCode, u => u.MapFrom(s => s.Subject.TrialSite.TrialSiteCode)) ; + CreateMap(); + CreateMap(); + + + } }