diff --git a/IRaCIS.Core.Application/Service/Visit/DTO/VisitPointViewModel.cs b/IRaCIS.Core.Application/Service/Visit/DTO/VisitPointViewModel.cs index 00bfd5a2d..aaccf5be4 100644 --- a/IRaCIS.Core.Application/Service/Visit/DTO/VisitPointViewModel.cs +++ b/IRaCIS.Core.Application/Service/Visit/DTO/VisitPointViewModel.cs @@ -59,10 +59,10 @@ namespace IRaCIS.Core.Application.Contracts public class SetSubjectVisitUrgentCommand { - public Guid SubjectVisitId { get; set; } + public Guid SubjectVisitId { get; set; } - public bool isUrgent { get; set; } + public bool isUrgent { get; set; } } public class SubjectVisitDTO : SubjectVisitCommand { @@ -113,7 +113,7 @@ namespace IRaCIS.Core.Application.Contracts public class UploadVisitCheckExcelDto { - + public Guid trialId { get; set; } public string AuditInfo { get; set; } @@ -135,7 +135,7 @@ namespace IRaCIS.Core.Application.Contracts public class SubjectVisitSelectItem { - public Guid Id { get; set; } + public Guid Id { get; set; } public decimal VisitNum { get; set; } public string VisitName { get; set; } = String.Empty; @@ -186,9 +186,9 @@ namespace IRaCIS.Core.Application.Contracts public class GetReadingVisitStudyListIndto { - public Guid TrialId { get; set; } - public Guid SujectVisitId { get; set; } - public Guid? VisitTaskId { get; set; } + public Guid TrialId { get; set; } + public Guid SujectVisitId { get; set; } + public Guid VisitTaskId { get; set; } } @@ -207,54 +207,54 @@ namespace IRaCIS.Core.Application.Contracts public class GetPTAndCtSeriesOutDto { - public Guid VisitTaskId { get; set; } - public Guid CTSeriesId { get; set; } - public Guid PTSeriesId { get; set; } + public Guid VisitTaskId { get; set; } + public Guid CTSeriesId { get; set; } + public Guid PTSeriesId { get; set; } - public Guid StudyId { get; set; } + public Guid StudyId { get; set; } - public Guid? SubjectVisitId { get; set; } + public Guid? SubjectVisitId { get; set; } - public bool IsBaseLineTask { get; set; } + public bool IsBaseLineTask { get; set; } - public string TaskBlindName { get; set; } = string.Empty; + public string TaskBlindName { get; set; } = string.Empty; - public List StudyInfoList { get; set; } - } + public List StudyInfoList { get; set; } + } public class StudyInfo { - public Guid StudyId { get; set; } - public string StudyCode { get; set; } = String.Empty; + public Guid StudyId { get; set; } + public string StudyCode { get; set; } = String.Empty; - public Guid SubjectVisitId { get; set; } - public string Modalities { get; set; } = String.Empty; + public Guid SubjectVisitId { get; set; } + public string Modalities { get; set; } = String.Empty; - public bool IsCriticalSequence { get; set; } = false; + public bool IsCriticalSequence { get; set; } = false; - public int SeriesCount { get; set; } - public int InstanceCount { get; set; } + public int SeriesCount { get; set; } + public int InstanceCount { get; set; } - public bool IsDicom { get; set; } = true; + public bool IsDicom { get; set; } = true; - public List CTSeriesList { get; set; } + public List CTSeriesList { get; set; } - public List PTSeriesList { get; set; } - } + public List PTSeriesList { get; set; } + } public class GetDicomSeriesInfoInDto { - public Guid SeriesId { get; set; } - } + public Guid SeriesId { get; set; } + } - public class GetPTAndCtSeriesInDto - { - public Guid VisitTaskId { get; set; } - } + public class GetPTAndCtSeriesInDto + { + public Guid VisitTaskId { get; set; } + } public class VisitStudyDTO { @@ -287,11 +287,11 @@ namespace IRaCIS.Core.Application.Contracts //public Guid StudyMonitorId { get; set; } public Guid? AbandonStudyId { get; set; } - + public Guid SubjectVisitId { get; set; } public string StudyInstanceUid { get; set; } = String.Empty; - + } @@ -382,7 +382,7 @@ namespace IRaCIS.Core.Application.Contracts public string ErrorMesseage { get; set; } = String.Empty; - public List UploadedSeriesList { get; set;} = new List(); + public List UploadedSeriesList { get; set; } = new List(); } @@ -418,7 +418,7 @@ namespace IRaCIS.Core.Application.Contracts { public string StudyInstanceUid { get; set; } = String.Empty; - public DateTime? StudyDate { get; set; } + public DateTime? StudyDate { get; set; } } @@ -535,10 +535,10 @@ namespace IRaCIS.Core.Application.Contracts public Guid TrialId { get; set; } public string SubjectInfo { get; set; } = String.Empty; - public string VisitPlanInfo { get; set; }=String.Empty; + public string VisitPlanInfo { get; set; } = String.Empty; public Guid? SubjectVisitId { get; set; } - + public DateTime? StudyTimeBegin { get; set; } diff --git a/IRaCIS.Core.Application/Service/Visit/SubjectVisitService.cs b/IRaCIS.Core.Application/Service/Visit/SubjectVisitService.cs index 45d106551..c0a716b4c 100644 --- a/IRaCIS.Core.Application/Service/Visit/SubjectVisitService.cs +++ b/IRaCIS.Core.Application/Service/Visit/SubjectVisitService.cs @@ -480,22 +480,82 @@ namespace IRaCIS.Core.Application.Services [HttpPost] public async Task> GetReadingVisitStudyList(GetReadingVisitStudyListIndto indto) { - var result = new List(); - - var rowInfoList = await _readingTableAnswerRowInfoRepository.Where(x => x.VisitTaskId == indto.VisitTaskId && x.StudyId != null).OrderBy(x => x.ReadingQuestionTrial.ShowOrder).ThenBy(x => x.RowIndex).Select(x => new - { - x.ReadingQuestionTrial.ShowOrder, - x.RowIndex, - x.SeriesId, - x.StudyId, - x.InstanceId, - }).ToListAsync(); + var studyList = new List(); var taskInfo = await _visitTaskRepository.Where(x => x.Id == indto.VisitTaskId).FirstNotNullAsync(); + + #region dicom 检查查询 + + //如果是手动生成的标准,需要过滤检查和序列数据 + + var isManualGenerate = await _trialReadingCriterionRepository.AnyAsync(t => t.Id == taskInfo.TrialReadingCriterionId && t.IsAutoCreate == false); + + var dicomStudyList = await _repository.Where(t => t.TrialId == indto.TrialId && t.SubjectVisitId == indto.SujectVisitId) + .WhereIf(isManualGenerate, t => t.SubjectCriteriaEvaluationVisitStudyFilterList.Any(t => t.TrialReadingCriterionId == taskInfo.TrialReadingCriterionId && t.IsConfirmed && t.IsReading)) + .Select(k => new VisitStudyDTO() + { + InstanceCount = k.InstanceCount, + Modalities = k.Modalities, + SeriesCount = k.SeriesCount, + StudyCode = k.StudyCode, + StudyId = k.Id, + + }).ToListAsync(); + var studyIds = dicomStudyList.Select(t => t.StudyId).ToList(); + + var instanceList = await _repository.Where(t => studyIds.Contains(t.StudyId)) + .Select(t => new { t.SeriesId, t.Id, t.InstanceNumber, t.Path, t.NumberOfFrames, t.WindowCenter, t.WindowWidth, t.HtmlPath }).ToListAsync(); + + List seriesLists = await _repository.Where(s => studyIds.Contains(s.StudyId)) + .WhereIf(isManualGenerate == false, t => t.IsReading) + .WhereIf(isManualGenerate, t => t.SubjectCriteriaEvaluationVisitStudyFilterList.Any(t => t.TrialReadingCriterionId == taskInfo.TrialReadingCriterionId && t.IsConfirmed && t.IsReading)) + .OrderBy(s => s.SeriesNumber).ThenBy(s => s.SeriesTime).ProjectTo(_mapper.ConfigurationProvider).ToListAsync(); + + foreach (var t in dicomStudyList) + { + t.SeriesList = seriesLists.Where(s => s.StudyId == t.StudyId).OrderBy(s => s.SeriesNumber).ThenBy(s => s.SeriesTime).ToList(); + + t.SeriesList.ForEach(series => + { + 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, + + }).ToList(); + + series.WindowWidth = instanceList.FirstOrDefault()!.WindowWidth; + series.WindowCenter = instanceList.FirstOrDefault()!.WindowCenter; + }); + + //设置为阅片与否 不更改数据库检查 的instance数量 和 SeriesCount 所以这里要实时统计 + t.SeriesCount = t.SeriesList.Count; + t.InstanceCount = t.SeriesList.SelectMany(t => t.InstanceInfoList).Count(); + } + + studyList.AddRange(dicomStudyList); + + #endregion + + #region dicom 关键序列处理 + + //已经签名的任务,加关键序列 if (taskInfo.ReadingTaskState == ReadingTaskState.HaveSigned) { + var rowInfoList = await _readingTableAnswerRowInfoRepository.Where(x => x.VisitTaskId == indto.VisitTaskId && x.StudyId != null).OrderBy(x => x.ReadingQuestionTrial.ShowOrder).ThenBy(x => x.RowIndex).Select(x => new + { + x.ReadingQuestionTrial.ShowOrder, + x.RowIndex, + x.SeriesId, + x.StudyId, + x.InstanceId, + }).ToListAsync(); var thisStudyIds = rowInfoList.OrderBy(x => x.ShowOrder).ThenBy(x => x.RowIndex).Select(x => x.StudyId).Distinct().ToList(); var thisSeriesIdIds = rowInfoList.Where(x => x.SeriesId != null).OrderBy(x => x.ShowOrder).ThenBy(x => x.RowIndex).Select(x => x.SeriesId).Distinct().ToList(); @@ -559,9 +619,6 @@ namespace IRaCIS.Core.Application.Services item.Modality = string.Join(",", modalityList); thisVisitTaskStudy.SeriesList.Add(item); thisVisitTaskStudy.SeriesCount = thisVisitTaskStudy.SeriesList.Count; - - - } @@ -570,66 +627,24 @@ namespace IRaCIS.Core.Application.Services } + + } - } - - //如果是手动生成的标准,需要过滤检查和序列数据 - - var isManualGenerate = await _trialReadingCriterionRepository.AnyAsync(t => t.Id == taskInfo.TrialReadingCriterionId && t.IsAutoCreate == false); - - var studyList = await _repository.Where(t => t.TrialId == indto.TrialId && t.SubjectVisitId == indto.SujectVisitId) - .WhereIf(isManualGenerate, t => t.SubjectCriteriaEvaluationVisitStudyFilterList.Any(t => t.TrialReadingCriterionId == taskInfo.TrialReadingCriterionId && t.IsConfirmed && t.IsReading)) - .Select(k => new VisitStudyDTO() + studyList.ForEach(x => { - InstanceCount = k.InstanceCount, - Modalities = k.Modalities, - SeriesCount = k.SeriesCount, - StudyCode = k.StudyCode, - StudyId = k.Id, + x.SeriesList.ForEach(y => + { + y.IsBeMark = rowInfoList.Any(z => z.SeriesId == y.Id); + }); - }).ToListAsync(); - var studyIds = studyList.Select(t => t.StudyId).ToList(); - - var instanceList = await _repository.Where(t => studyIds.Contains(t.StudyId)) - .Select(t => new { t.SeriesId, t.Id, t.InstanceNumber, t.Path, t.NumberOfFrames, t.WindowCenter, t.WindowWidth, t.HtmlPath }).ToListAsync(); - - - - List seriesLists = await _repository.Where(s => studyIds.Contains(s.StudyId) /*&& s.IsReading*/) - .WhereIf(isManualGenerate == false, t => t.IsReading) - .WhereIf(isManualGenerate, t => t.SubjectCriteriaEvaluationVisitStudyFilterList.Any(t => t.TrialReadingCriterionId == taskInfo.TrialReadingCriterionId && t.IsConfirmed && t.IsReading)) - .OrderBy(s => s.SeriesNumber). ThenBy(s => s.SeriesTime).ProjectTo(_mapper.ConfigurationProvider).ToListAsync(); - - foreach (var t in studyList) - { - t.SeriesList = seriesLists.Where(s => s.StudyId == t.StudyId).OrderBy(s => s.SeriesNumber).ThenBy(s => s.SeriesTime).ToList(); - - t.SeriesList.ForEach(series => - { - 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, - - }).ToList(); - - series.WindowWidth = instanceList.FirstOrDefault()!.WindowWidth; - series.WindowCenter = instanceList.FirstOrDefault()!.WindowCenter; }); - - //设置为阅片与否 不更改数据库检查 的instance数量 和 SeriesCount 所以这里要实时统计 - t.SeriesCount = t.SeriesList.Count; - t.InstanceCount = t.SeriesList.SelectMany(t => t.InstanceInfoList).Count(); } - // 非Dicom + #endregion + #region 非Dicom 检查查询 var noDicomList = await _noneDicomStudyRepository.Where(x => x.TrialId == indto.TrialId && x.SubjectVisitId == indto.SujectVisitId).ToListAsync(); @@ -677,24 +692,13 @@ namespace IRaCIS.Core.Application.Services } - - if (studyList == null || studyList.Count == 0) - { - studyList = new List(); - } - studyList.AddRange(noDicomStudyList); + #endregion - studyList.ForEach(x => - { - x.SeriesList.ForEach(y => - { - y.IsBeMark = rowInfoList.Any(z => z.SeriesId == y.Id); - }); - }); - result.AddRange(studyList); - result = result.Where(x => x.SeriesCount > 0).ToList(); + + var result = studyList.Where(x => x.SeriesCount > 0).ToList(); + return result;