diff --git a/IRaCIS.Core.Application/Service/ImageAndDoc/Interface/IStudyService.cs b/IRaCIS.Core.Application/Service/ImageAndDoc/Interface/IStudyService.cs index ce4e2186d..1998c940b 100644 --- a/IRaCIS.Core.Application/Service/ImageAndDoc/Interface/IStudyService.cs +++ b/IRaCIS.Core.Application/Service/ImageAndDoc/Interface/IStudyService.cs @@ -9,7 +9,7 @@ namespace IRaCIS.Core.Application.Contracts Task> GetDicomAndNoneDicomStudyMonitorList(StudyQuery studyQuery); (List SeriesInstanceUid, List SopInstanceUid) GetHasUploadSeriesAndInstance(Guid studyId); DicomTrialSiteSubjectInfo GetSaveToDicomInfo(Guid subjectVisitId); - IResponseOutput Item(Guid studyId); + IResponseOutput Item(Guid studyId,bool? isPacs); Task Preview(Guid studyId); //IResponseOutput> VerifyStudyAllowUpload(VerifyUploadOrReupload verifyInfo); } 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..8d9ff79d4 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, @@ -159,7 +159,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc studyMonitor.FileSize = incommand.Study.SeriesList.SelectMany(t => t.InstanceList).Sum(t => t.FileSize); var studyId = IdentifierHelper.CreateGuid(incommand.Study.StudyInstanceUid, incommand.TrialId.ToString()); - var findStudy = await _dicomstudyRepository.FirstOrDefaultAsync(t => t.Id == studyId); + var findStudy = await _dicomStudyRepository.FirstOrDefaultAsync(t => t.Id == studyId); studyMonitor.StudyId = studyId; studyMonitor.StudyCode = findStudy?.StudyCode ?? ""; @@ -183,7 +183,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc using (await @lock.AcquireAsync()) { //查询数据库获取最大的Code 没有记录则为0 - var dbStudyCodeIntMax = _dicomstudyRepository.Where(s => s.TrialId == trialId).Select(t => t.Code).DefaultIfEmpty().Max(); + var dbStudyCodeIntMax = _dicomStudyRepository.Where(s => s.TrialId == trialId).Select(t => t.Code).DefaultIfEmpty().Max(); //获取缓存中的值 并发的时候,需要记录,已被占用的值 这样其他线程在此占用的最大的值上递增 var cacheMaxCodeInt = await _fusionCache.GetOrDefaultAsync(CacheKeys.TrialStudyMaxCode(trialId)); @@ -213,7 +213,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc SpecialArchiveStudyDeal(addStudy); modalitys = addStudy.Modalities; - await _dicomstudyRepository.AddAsync(addStudy); + await _dicomStudyRepository.AddAsync(addStudy); @@ -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(); + + + } } diff --git a/IRaCIS.Core.Application/Service/QC/QCListService.cs b/IRaCIS.Core.Application/Service/QC/QCListService.cs index 528aecd18..f9b7e58c6 100644 --- a/IRaCIS.Core.Application/Service/QC/QCListService.cs +++ b/IRaCIS.Core.Application/Service/QC/QCListService.cs @@ -717,7 +717,7 @@ namespace IRaCIS.Core.Application.Image.QA var qaChallengeQuery = _qcChallengeRepository.Where(t => t.SubjectVisitId == subjectVisitId && t.QCProcessEnum == trialQCProcess) .ProjectTo(_mapper.ConfigurationProvider, new { currentUserId = _userInfo.UserRoleId }); - var list = await qaChallengeQuery.ToListAsync(); + var list = await qaChallengeQuery.OrderByDescending(t=>t.CreateTime).ToListAsync(); //list.ForEach(t => t.DialogList.ToList().ForEach(u => u.IsCurrentUser = _userInfo.Id == u.CreateUserId)); diff --git a/IRaCIS.Core.Application/Service/QC/QCOperationService.cs b/IRaCIS.Core.Application/Service/QC/QCOperationService.cs index 5d1678d64..796d06f8c 100644 --- a/IRaCIS.Core.Application/Service/QC/QCOperationService.cs +++ b/IRaCIS.Core.Application/Service/QC/QCOperationService.cs @@ -1269,6 +1269,7 @@ namespace IRaCIS.Core.Application.Image.QA var isSecondReview = _subjectVisitRepository.Any(t => t.Id == inDto.SubjectVisitId && t.SecondReviewState == SecondReviewState.AuditPassed); var currentActionList = await _subjectVisitRepository.Where(x => x.TrialId == inDto.TrialId && x.CurrentActionUserId == _userInfo.UserRoleId) + .Where(t => t.Subject.Status != SubjectStatus.EndOfVisit) .WhereIf(isDistinguishType, t => isSecondReview == false ? t.SecondReviewState == SecondReviewState.None : t.SecondReviewState == SecondReviewState.WaitAudit) .OrderByDescending(x => x.IsUrgent) .ThenBy(x => x.Subject.Code).ThenBy(x => x.VisitNum).ToListAsync(); @@ -1293,6 +1294,7 @@ namespace IRaCIS.Core.Application.Image.QA break; case TrialQCProcess.SingleAudit: visitList = await _subjectVisitRepository + .Where(t => t.Subject.Status != SubjectStatus.EndOfVisit) .WhereIf(isDistinguishType, t => isSecondReview == false ? t.SecondReviewState == SecondReviewState.None : t.SecondReviewState == SecondReviewState.WaitAudit) .Where(x => !x.SubjectVisitImageBackRecordList.Any(t => t.ImageBackState == ImageBackStateEnum.None)) .Where(x => x.SubmitState == SubmitStateEnum.Submitted && x.SecondReviewState == SecondReviewState.None @@ -1330,6 +1332,7 @@ namespace IRaCIS.Core.Application.Image.QA case TrialQCProcess.DoubleAudit: visitList = await _subjectVisitRepository + .Where(t => t.Subject.Status != SubjectStatus.EndOfVisit) .WhereIf(isDistinguishType, t => isSecondReview == false ? t.SecondReviewState == SecondReviewState.None : t.SecondReviewState == SecondReviewState.WaitAudit) .Where(x => !x.SubjectVisitImageBackRecordList.Any(t => t.ImageBackState == ImageBackStateEnum.None)) .Where(x => x.SubmitState == SubmitStateEnum.Submitted && x.TrialId == inDto.TrialId && @@ -2305,6 +2308,19 @@ namespace IRaCIS.Core.Application.Image.QA { //复核时 删除qc 所做的答案 + sv.AuditState = AuditStateEnum.ToAudit; + + sv.CurrentActionUserExpireTime =null; + sv.CurrentActionUserId = null; + sv.IsTake = false; + + sv.PreliminaryAuditUserId = null; + sv.PreliminaryAuditTime = null; + sv.ReviewAuditUserId = null; + sv.ReviewAuditTime = null; + + sv.SecondReviewState = SecondReviewState.None; + await _trialQCQuestionAnswerRepository.BatchDeleteNoTrackingAsync(t => t.SubjectVisitId == qcChallenge.SubjectVisitId); } diff --git a/IRaCIS.Core.Domain.Share/Trial/SubjectStatus.cs b/IRaCIS.Core.Domain.Share/Trial/SubjectStatus.cs index 90ab27c3e..487d66a83 100644 --- a/IRaCIS.Core.Domain.Share/Trial/SubjectStatus.cs +++ b/IRaCIS.Core.Domain.Share/Trial/SubjectStatus.cs @@ -7,7 +7,7 @@ //访视结束 OutOfVisit = 2, - //访视中止 + //受试者中止 EndOfVisit = 3, } } \ No newline at end of file