diff --git a/IRaCIS.Core.Application/Service/ImageAndDoc/DTO/DicomSeriesModel.cs b/IRaCIS.Core.Application/Service/ImageAndDoc/DTO/DicomSeriesModel.cs index f0d944125..245c15eb1 100644 --- a/IRaCIS.Core.Application/Service/ImageAndDoc/DTO/DicomSeriesModel.cs +++ b/IRaCIS.Core.Application/Service/ImageAndDoc/DTO/DicomSeriesModel.cs @@ -87,7 +87,7 @@ namespace IRaCIS.Core.Application.Contracts.Dicom.DTO public bool IsReading { get; set; } public bool IsDeleted { get; set; } - + public long? FileSize { get; set; } public Guid? StudyId { get; set; } diff --git a/IRaCIS.Core.Application/Service/ImageAndDoc/DTO/DownloadAndUploadDTO.cs b/IRaCIS.Core.Application/Service/ImageAndDoc/DTO/DownloadAndUploadDTO.cs index 59a74aaf3..3124f5d84 100644 --- a/IRaCIS.Core.Application/Service/ImageAndDoc/DTO/DownloadAndUploadDTO.cs +++ b/IRaCIS.Core.Application/Service/ImageAndDoc/DTO/DownloadAndUploadDTO.cs @@ -107,8 +107,13 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc.DTO public string Modalities { get; set; } public string Description { get; set; } + public int SeriesCount { get; set; } public int InstanceCount { get; set; } + + public int ReadingSeriesCount { get; set; } + + public int ReadingInstanceCount { get; set; } } public class NoneDicomStudyBasicInfo @@ -128,6 +133,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc.DTO public string Description { get; set; } = string.Empty; + public int ReadingFileCount { get; set; } } } diff --git a/IRaCIS.Core.Application/Service/ImageAndDoc/DownloadAndUploadService.cs b/IRaCIS.Core.Application/Service/ImageAndDoc/DownloadAndUploadService.cs index dedb2ba2b..21ec662fa 100644 --- a/IRaCIS.Core.Application/Service/ImageAndDoc/DownloadAndUploadService.cs +++ b/IRaCIS.Core.Application/Service/ImageAndDoc/DownloadAndUploadService.cs @@ -884,6 +884,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc subjectCode = inQuery.SubjectCode; } + TaskState? taskState = null; if (inQuery.VisitTaskId != null) { //考虑到一致性分析,必须要这个编号进行过滤 @@ -894,20 +895,25 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc SubjectCode = t.IsAnalysisCreate ? t.BlindSubjectCode : t.Subject.Code, SubjectId = t.SubjectId, t.DoctorUserId, - t.IsAnalysisCreate + t.IsAnalysisCreate, + t.TaskState }).FirstNotNullAsync(); subjectId = taskInfo.SubjectId; subjectCode = taskInfo.SubjectCode; doctorUserId = (Guid)taskInfo.DoctorUserId!; isAnalysisCreate = taskInfo.IsAnalysisCreate; + + taskState = taskInfo.TaskState; } var query = _visitTaskRepository.Where(t => t.SubjectId == subjectId && t.TrialReadingCriterionId == inQuery.TrialReadingCriterionId && t.SourceSubjectVisitId != null && t.DoctorUserId == doctorUserId) - //满足 有序,或者随机只看到当前任务的dicom 非dicom检查 - .WhereIf(inQuery.VisitTaskId == null, t => t.TaskState == TaskState.Effect)//从待阅列表进入,要筛选出有效的,任务可能重阅了,也要看到该任务的的 + //满足 有序,或者随机只看到当前任务的dicom 非dicom检查 + .WhereIf(inQuery.VisitTaskId == null, t => t.TaskState == TaskState.Effect)//从待阅列表进入,要筛选出有效的,任务可能重阅了,也要看到该任务的 .WhereIf(criterionInfo.IsReadingTaskViewInOrder != ReadingOrder.SubjectRandom && inQuery.VisitTaskId != null, t => t.Id == inQuery.VisitTaskId) + .WhereIf(taskState == TaskState.Effect || taskState == TaskState.Freeze, t => t.TaskState == TaskState.Effect)//subject 随机可能当前阅片人有退回任务,此时传递了任务Id,但是要看整个subject得,要只留生效的 + .WhereIf(taskState != null && taskState != TaskState.Effect && taskState != TaskState.Freeze, t => t.Id == inQuery.VisitTaskId) //非生效只查当前任务 .ProjectTo(_mapper.ConfigurationProvider); //这里过滤是否是一致性分析的 @@ -1023,7 +1029,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc NoneDicomStudyList = sv.NoneDicomStudyList.Where(t => isQueryNoneDicom ? inQuery.NoneDicomStudyIdList.Contains(t.Id) : false) .Where(t => info.IsImageFilter ? ("|" + info.CriterionModalitys + "|").Contains("|" + t.Modality + "|") : true) - .Where(t=>t.IsReading) + .Where(t => t.IsReading) .Select(nd => new { nd.Modality, diff --git a/IRaCIS.Core.Application/Service/ImageAndDoc/SeriesService.cs b/IRaCIS.Core.Application/Service/ImageAndDoc/SeriesService.cs index d27075cd0..f8f88e201 100644 --- a/IRaCIS.Core.Application/Service/ImageAndDoc/SeriesService.cs +++ b/IRaCIS.Core.Application/Service/ImageAndDoc/SeriesService.cs @@ -1,5 +1,6 @@ using IRaCIS.Core.Application.Contracts.Dicom.DTO; using IRaCIS.Core.Application.Helper; +using IRaCIS.Core.Infrastructure.Extention; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Mvc; @@ -19,8 +20,9 @@ namespace IRaCIS.Core.Application.Services //医生读片那一块有耦合,关键序列 这里暂时留存 /// 指定资源Id,获取Dicom检查所属序列信息列表 /// Dicom检查的Id + /// [HttpGet, Route("{studyId:guid}")] - public async Task>> List(Guid studyId) + public async Task>> List(Guid studyId, bool? isReading) { //质控的时候,要标记序列,和instance 删除 ,所以要返回全部,但是 质控通过后,pm 进去看的时候要看过滤后的 @@ -32,14 +34,16 @@ namespace IRaCIS.Core.Application.Services //断点 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 }).ToListAsync();//.GroupBy(u => u.SeriesId); + .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) @@ -54,7 +58,8 @@ namespace IRaCIS.Core.Application.Services Path = k.Path, InstanceNumber = k.InstanceNumber, IsReading = k.IsReading, - IsDeleted = k.IsDeleted + IsDeleted = k.IsDeleted, + FileSize = k.FileSize }).ToList(); diff --git a/IRaCIS.Core.Application/Service/ImageAndDoc/_MapConfig.cs b/IRaCIS.Core.Application/Service/ImageAndDoc/_MapConfig.cs index ba2e1b19e..a0173b944 100644 --- a/IRaCIS.Core.Application/Service/ImageAndDoc/_MapConfig.cs +++ b/IRaCIS.Core.Application/Service/ImageAndDoc/_MapConfig.cs @@ -130,15 +130,20 @@ namespace IRaCIS.Core.Application.Service .ForMember(d => d.CriterionModalitys, u => u.MapFrom(s => s.TrialReadingCriterion.CriterionModalitys)) .ForMember(d => d.SubjectCode, u => u.MapFrom(u => u.IsAnalysisCreate == true ? u.BlindSubjectCode : u.Subject.Code)); - CreateMap(); - CreateMap(); + CreateMap() + .ForMember(d => d.ReadingSeriesCount, u => u.MapFrom(s => s.SeriesList.Where(t => t.IsReading).Count())) + .ForMember(d => d.ReadingInstanceCount, u => u.MapFrom(s => s.InstanceList.Where(t => t.IsReading && t.DicomSerie.IsReading).Count())); + + CreateMap() + .ForMember(d => d.ReadingFileCount, u => u.MapFrom(s => s.NoneDicomFileList.Where(t => t.IsReading).Count())); + CreateMap() .ForMember(d => d.VisitTaskId, u => u.MapFrom(s => s.Id)) .ForMember(d => d.IsImageFilter, u => u.MapFrom(s => s.TrialReadingCriterion.IsImageFilter)) .ForMember(d => d.CriterionModalitys, u => u.MapFrom(s => s.TrialReadingCriterion.CriterionModalitys)) .ForMember(d => d.SubjectCode, u => u.MapFrom(u => u.IsAnalysisCreate == true ? u.BlindSubjectCode : u.Subject.Code)) .ForMember(d => d.DicomStudyList, u => u.MapFrom(s => s.SourceSubjectVisit.StudyList)) - .ForMember(d => d.NoneDicomStudyList, u => u.MapFrom(s => s.SourceSubjectVisit.NoneDicomStudyList.Where(t=>t.IsReading))); + .ForMember(d => d.NoneDicomStudyList, u => u.MapFrom(s => s.SourceSubjectVisit.NoneDicomStudyList.Where(t => t.IsReading))); CreateMap() .ForMember(d => d.UserFullName, u => u.MapFrom(s => s.CreateUserRole.FullName)) diff --git a/IRaCIS.Core.Application/Service/QC/QCOperationService.cs b/IRaCIS.Core.Application/Service/QC/QCOperationService.cs index e291927c2..326fa9958 100644 --- a/IRaCIS.Core.Application/Service/QC/QCOperationService.cs +++ b/IRaCIS.Core.Application/Service/QC/QCOperationService.cs @@ -961,6 +961,9 @@ namespace IRaCIS.Core.Application.Image.QA var noneDicomStudyFile = (await _noneDicomStudyFileRepository.Where(t => t.Id == noneDicomStudyFileId, true).IgnoreQueryFilters().FirstOrDefaultAsync()).IfNullThrowException(); + var noneDicomStudy = (await _noneDicomStudyRepository.Where(t => t.Id == noneDicomStudyFile.NoneDicomStudyId, true).IgnoreQueryFilters().FirstOrDefaultAsync()).IfNullThrowException(); + + if (state == 1) { noneDicomStudyFile.IsReading = false; @@ -972,10 +975,15 @@ namespace IRaCIS.Core.Application.Image.QA else if (state == 4) { noneDicomStudyFile.IsDeleted = true; + + noneDicomStudy.FileCount = noneDicomStudy.FileCount - 1; + } else if (state == 5) { noneDicomStudyFile.IsDeleted = false; + + noneDicomStudy.FileCount = noneDicomStudy.FileCount + 1; } } diff --git a/IRaCIS.Core.Application/Service/TrialSiteUser/_MapConfig.cs b/IRaCIS.Core.Application/Service/TrialSiteUser/_MapConfig.cs index c8c1bf41e..0b5bba152 100644 --- a/IRaCIS.Core.Application/Service/TrialSiteUser/_MapConfig.cs +++ b/IRaCIS.Core.Application/Service/TrialSiteUser/_MapConfig.cs @@ -96,7 +96,7 @@ namespace IRaCIS.Core.Application.Service .ForMember(d => d.UserRealName, u => u.MapFrom(s => s.UserRole.IdentityUser.FullName)) .ForMember(d => d.TrialSiteId, u => u.MapFrom(t => trialSiteId)) .ForMember(d => d.UserType, u => u.MapFrom(t => t.UserRole.UserTypeRole.UserTypeShortName)) - .ForMember(d => d.IsSelect, u => u.MapFrom(t => t.Trial.TrialSiteUserList.Any(k => k.UserId == t.UserId && k.TrialSiteId== trialSiteId))); + .ForMember(d => d.IsSelect, u => u.MapFrom(t => t.Trial.TrialSiteUserList.Any(k => k.UserId == t.UserId && k.TrialSiteId == trialSiteId))); CreateMap(); @@ -125,8 +125,8 @@ namespace IRaCIS.Core.Application.Service CreateMap() .ForMember(d => d.TrialSiteId, u => u.MapFrom(s => s.Id)) - .ForMember(d => d.VisitCount, u => u.MapFrom(s => s.SubjectVisitList.Count(t=>t.IsDeleted==false))) - .ForMember(d => d.SubjectCount, u => u.MapFrom(s => s.SubjectList.Count(t=>t.IsDeleted==false))) + .ForMember(d => d.VisitCount, u => u.MapFrom(s => s.SubjectVisitList.Count(t => t.IsDeleted == false && t.SubmitState != SubmitStateEnum.None))) + .ForMember(d => d.SubjectCount, u => u.MapFrom(s => s.SubjectList.Count(t => t.IsDeleted == false))) //.ForMember(d => d.UserCount, u => u.MapFrom(s => s.CRCUserList.Count())) .ForMember(d => d.UserNameList, u => u.MapFrom(s => s.CRCUserList.Where(t => t.IsDeleted == false).Select(u => u.UserRole.IdentityUser.FullName))); #endregion @@ -142,7 +142,7 @@ namespace IRaCIS.Core.Application.Service //.ForMember(d => d.Site, u => u.MapFrom(s => isEn_Us ?s.Site.SiteName:s.Site.SiteNameCN)) //.ForMember(d => d.Hospital, u => u.MapFrom(s => s.Site.Hospital.HospitalName)) //.ForMember(d => d.UserCount, u => u.MapFrom(s => s.CRCUserList.Count())) - .ForMember(d => d.VisitCount, u => u.MapFrom(s => s.SubjectVisitList.Count())) + .ForMember(d => d.VisitCount, u => u.MapFrom(s => s.SubjectVisitList.Count(t => t.SubmitState != SubmitStateEnum.None))) .ForMember(d => d.SubjectCount, u => u.MapFrom(s => s.SubjectList.Count())) .ForMember(d => d.UserNameList, u => u.MapFrom(s => s.CRCUserList.Where(t => t.IsDeleted == false).Select(u => u.UserRole.IdentityUser.FullName))) .ForMember(d => d.CallingAEList, u => u.MapFrom(s => s.TrialSiteDicomAEList.Select(u => u.CallingAE))); @@ -261,7 +261,7 @@ namespace IRaCIS.Core.Application.Service .ForMember(t => t.ParentQuestionName, u => u.MapFrom(c => c.ParentReadingQuestionTrial.QuestionName)) .ForMember(t => t.RelevanceShowOrder, u => u.MapFrom(c => c.RelevanceReadingQuestionTrial.ShowOrder)) .ForMember(t => t.ParentQuestionShowOrder, u => u.MapFrom(c => c.ParentReadingQuestionTrial.ShowOrder)) - .ForMember(x => x.CreateUserRole, x => x.Ignore()); + .ForMember(x => x.CreateUserRole, x => x.Ignore()); diff --git a/IRaCIS.Core.Application/Service/Visit/_MapConfig.cs b/IRaCIS.Core.Application/Service/Visit/_MapConfig.cs index 54115ff3b..82fc94f01 100644 --- a/IRaCIS.Core.Application/Service/Visit/_MapConfig.cs +++ b/IRaCIS.Core.Application/Service/Visit/_MapConfig.cs @@ -60,13 +60,13 @@ namespace IRaCIS.Core.Application.Service //.ForMember(d => d.InPlanNoneDicomStudyUploadCount, u => u.MapFrom(s => s.SubjectVisitList.Where(t => t.InPlan).SelectMany(k => k.NoneDicomStudyList).Count())) //.ForMember(d => d.OutPlanNoneDicomStudyUploadCount, u => u.MapFrom(s => s.SubjectVisitList.Where(t => t.InPlan == false).SelectMany(k => k.NoneDicomStudyList).Count())) - .ForMember(d => d.InPlanVisitCount, u => u.MapFrom(s => s.SubjectVisitList.Count(t => t.InPlan))) - .ForMember(d => d.OutPlanVisitCount, u => u.MapFrom(s => s.SubjectVisitList.Count(t => t.InPlan == false))) + .ForMember(d => d.InPlanVisitCount, u => u.MapFrom(s => s.SubjectVisitList.Where(t => t.Subject.FinalSubjectVisitId != null ? t.VisitNum <= t.Subject.FinalSubjectVisit.VisitNum : true).Count(t => t.InPlan))) + .ForMember(d => d.OutPlanVisitCount, u => u.MapFrom(s => s.SubjectVisitList.Where(t => t.Subject.FinalSubjectVisitId != null ? t.VisitNum <= t.Subject.FinalSubjectVisit.VisitNum : true).Count(t => t.InPlan == false))) //执行不一定上传了 可能是失访 实际执行过了 .ForMember(d => d.MissingSubmmitCount, u => u.MapFrom(s => s.SubjectVisitList.Count(t => t.VisitNum < s.LatestSubjectVisit.VisitNum && t.SubmitState != SubmitStateEnum.Submitted && t.IsLostVisit == false))) - .ForMember(d => d.IsMissingImages, u => u.MapFrom(s => s.SubjectVisitList.Any(t => t.VisitNum < s.LatestSubjectVisit.VisitNum && t.SubmitState != SubmitStateEnum.Submitted && t.IsLostVisit == false))) + .ForMember(d => d.IsMissingImages, u => u.MapFrom(s => s.SubjectVisitList.Any(t => t.VisitNum < s.LatestSubjectVisit.VisitNum && t.SubmitState != SubmitStateEnum.Submitted && t.IsLostVisit == false))) .ForMember(d => d.InPlanVisitSubmmitCount, u => u.MapFrom(s => s.SubjectVisitList.Count(t => t.SubmitState == SubmitStateEnum.Submitted && t.InPlan == true))) .ForMember(d => d.LostVisitCount, u => u.MapFrom(s => s.SubjectVisitList.Count(t => t.IsLostVisit))) .ForMember(d => d.InPlanVisitSubmmitCount, u => u.MapFrom(s => s.SubjectVisitList.Count(t => t.SubmitState == SubmitStateEnum.Submitted && t.InPlan == true)))