diff --git a/IRaCIS.Core.Application/Service/ImageAndDoc/DTO/DownloadAndUploadDTO.cs b/IRaCIS.Core.Application/Service/ImageAndDoc/DTO/DownloadAndUploadDTO.cs index 0032537e4..5f04db49f 100644 --- a/IRaCIS.Core.Application/Service/ImageAndDoc/DTO/DownloadAndUploadDTO.cs +++ b/IRaCIS.Core.Application/Service/ImageAndDoc/DTO/DownloadAndUploadDTO.cs @@ -43,6 +43,25 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc.DTO } + public class SubjectUploadTaskInfo + { + public Guid VisitTaskId { get; set; } + + public Guid SubjectId { get; set; } + + public string SubjectCode { get; set; } + + public string TaskBlindName { get; set; } + + public string TaskName { get; set; } + + public bool IsImageFilter { get; set; } + public string CriterionModalitys { get; set; } + + public Guid? SourceSubjectVisitId { get; set; } + + } + public class SubjectCRCImageUploadedDto { public Guid VisitTaskId { get; set; } diff --git a/IRaCIS.Core.Application/Service/ImageAndDoc/DTO/UnionStudyViewDodel.cs b/IRaCIS.Core.Application/Service/ImageAndDoc/DTO/UnionStudyViewDodel.cs index dbb274b34..4be018953 100644 --- a/IRaCIS.Core.Application/Service/ImageAndDoc/DTO/UnionStudyViewDodel.cs +++ b/IRaCIS.Core.Application/Service/ImageAndDoc/DTO/UnionStudyViewDodel.cs @@ -1,4 +1,5 @@ -using Newtonsoft.Json; +using IRaCIS.Core.Application.Service.ImageAndDoc.DTO; +using Newtonsoft.Json; using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; @@ -364,6 +365,46 @@ namespace IRaCIS.Core.Application.Contracts public decimal FileFize { get; set; } } + public class CRCUploadTaskQuery + { + [NotDefault] + public Guid SubjectId { get; set; } + + [NotDefault] + public Guid TrialReadingCriterionId { get; set; } + + [NotDefault] + public string SubjectCode { get; set; } + } + + public class CRCUploadTaskStudyQuery: SortInput + { + + [NotDefault] + public Guid VisitTaskId { get; set; } + } + + + public class IRUploadTaskDicomStudyDto : DicomStudyBasicInfo + { + + public int UploadedSeriesCount { get; set; } + + public int UploadedInstanceCount { get; set; } + + public List UploadedSopInstanceUidList { get; set; } + + + } + + public class IRUploadTaskNoneDicomStudyDto : NoneDicomStudyBasicInfo + { + + public int UploadedFileCount { get; set; } + } + + + public class CRCUploadedStudyQuqry { [NotDefault] diff --git a/IRaCIS.Core.Application/Service/ImageAndDoc/DownloadAndUploadService.cs b/IRaCIS.Core.Application/Service/ImageAndDoc/DownloadAndUploadService.cs index 3c3f7127c..04152e372 100644 --- a/IRaCIS.Core.Application/Service/ImageAndDoc/DownloadAndUploadService.cs +++ b/IRaCIS.Core.Application/Service/ImageAndDoc/DownloadAndUploadService.cs @@ -670,6 +670,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc /// /// /// + [HttpPost] public async Task PackageAndAnonymizImage(Guid trialId, Guid subjectVisitId, bool isDicom, bool isAnonymize = true) { @@ -894,6 +895,91 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc } + /// + /// IR 影像上传任务列表 + /// + /// + /// + [HttpPost] + public async Task> GetIRUploadTaskList(CRCUploadTaskQuery inQuery) + { + var query = _visitTaskRepository.Where(t => t.SubjectId == inQuery.SubjectId && t.TrialReadingCriterionId == inQuery.TrialReadingCriterionId + && t.SourceSubjectVisitId != null && t.DoctorUserId == _userInfo.Id && t.TaskState == TaskState.Effect) + .ProjectTo(_mapper.ConfigurationProvider); + + + var list = await query.Where(t => t.SubjectCode == inQuery.SubjectCode).ToListAsync(); + + return list; + } + /// + /// IR 上传任务 dicom 列表 后处理的数据不能排序 + /// + /// + /// + [HttpPost] + public async Task> GetIRUploadTaskDicomStudyList(CRCUploadTaskStudyQuery inQuery) + { + var list = await _visitTaskRepository.Where(t => t.Id == inQuery.VisitTaskId) + .SelectMany(t => t.SourceSubjectVisit.StudyList) + .ProjectTo(_mapper.ConfigurationProvider).SortToListAsync(inQuery); + + var taskDicomStudyList = _visitTaskRepository.Where(t => t.Id == inQuery.VisitTaskId) + .SelectMany(t => t.TaskStudyList) + .Select(u => new + { + u.Id, + u.SeriesCount, + u.InstanceCount, + SopInstanceList = u.InstanceList.Select(t => t.SopInstanceUid).ToList() + }) + .ToList(); + + foreach (var item in list) + { + var find = taskDicomStudyList.FirstOrDefault(t => t.Id == item.Id); + + if (find != null) + { + item.UploadedInstanceCount = find.InstanceCount; + item.UploadedSopInstanceUidList = find.SopInstanceList; + item.UploadedSeriesCount = find.SeriesCount; + } + } + + return list; + } + + /// + /// IR 上传任务 nonedicom 列表 后处理的数据不能排序 + /// + /// + /// + [HttpPost] + public async Task> GetIRUploadTaskNoneDicomStudyList(CRCUploadTaskStudyQuery inQuery) + { + var list = await _visitTaskRepository.Where(t => t.Id == inQuery.VisitTaskId) + .SelectMany(t => t.SourceSubjectVisit.StudyList) + .ProjectTo(_mapper.ConfigurationProvider).SortToListAsync(inQuery); + + var taskNoneDicomStudyList = _visitTaskRepository.Where(t => t.Id == inQuery.VisitTaskId) + .SelectMany(t => t.TaskNoneDicomStudyFileList).Where(t => t.VisitTaskId == inQuery.VisitTaskId) + .Select(u => new + { + u.OriginNoneDicomStudyId, + }) + .ToList(); + + foreach (var item in list) + { + item.UploadedFileCount = taskNoneDicomStudyList.Where(t => t.OriginNoneDicomStudyId == item.Id).Count(); + } + + return list; + + } + + /// /// IQC 获取CRC 上传到某一个访视的的检查信息 (原始影像信息 包含dicom 非dicom) @@ -963,6 +1049,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc /// /// /// + [HttpPost] public async Task> GetSubjectImageDownloadSelectList(IRReadingDownloadQuery inQuery) { @@ -970,8 +1057,8 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc && t.SourceSubjectVisitId != null && t.DoctorUserId == _userInfo.Id && t.TaskState == TaskState.Effect) .ProjectTo(_mapper.ConfigurationProvider); - - var list = await query.Where(t=>t.SubjectCode==inQuery.SubjectCode).ToListAsync(); + + var list = await query.Where(t => t.SubjectCode == inQuery.SubjectCode).ToListAsync(); return list; @@ -992,7 +1079,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc var isQueryDicom = inQuery.DicomStudyIdList.Count > 0; var isQueryNoneDicom = inQuery.NoneDicomStudyIdList.Count > 0; - var query = from sv in _subjectRepository.Where(t => t.Id == inQuery.SubjectId).SelectMany(t => t.SubjectVisitList.Where(t=>inQuery.SubjectVisitIdList.Contains(t.Id))) + var query = from sv in _subjectRepository.Where(t => t.Id == inQuery.SubjectId).SelectMany(t => t.SubjectVisitList.Where(t => inQuery.SubjectVisitIdList.Contains(t.Id))) select new { diff --git a/IRaCIS.Core.Application/Service/ImageAndDoc/_MapConfig.cs b/IRaCIS.Core.Application/Service/ImageAndDoc/_MapConfig.cs index 372bc020c..d6fb7d319 100644 --- a/IRaCIS.Core.Application/Service/ImageAndDoc/_MapConfig.cs +++ b/IRaCIS.Core.Application/Service/ImageAndDoc/_MapConfig.cs @@ -125,6 +125,12 @@ namespace IRaCIS.Core.Application.Service .ForMember(d => d.VisitNum, u => u.MapFrom(s => s.SubjectVisit.VisitNum)) .ForMember(d => d.VisitName, u => u.MapFrom(s => s.SubjectVisit.VisitName)); + 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.IsSelfAnalysis == true ? u.BlindSubjectCode : u.Subject.Code)); + CreateMap(); CreateMap(); CreateMap() diff --git a/IRaCIS.Core.Domain/Allocation/VisitTask.cs b/IRaCIS.Core.Domain/Allocation/VisitTask.cs index 5c284592f..fc102f03d 100644 --- a/IRaCIS.Core.Domain/Allocation/VisitTask.cs +++ b/IRaCIS.Core.Domain/Allocation/VisitTask.cs @@ -23,6 +23,8 @@ namespace IRaCIS.Core.Domain.Models [JsonIgnore] public List TaskStudyList { get; set; } + public List TaskNoneDicomStudyFileList { get; set; } + [JsonIgnore] [ForeignKey("TrialReadingCriterionId")] public ReadingQuestionCriterionTrial TrialReadingCriterion { get; set; } diff --git a/IRaCIS.Core.Domain/Image/NoneDicomStudyFile.cs b/IRaCIS.Core.Domain/Image/NoneDicomStudyFile.cs index c7c286986..10575a795 100644 --- a/IRaCIS.Core.Domain/Image/NoneDicomStudyFile.cs +++ b/IRaCIS.Core.Domain/Image/NoneDicomStudyFile.cs @@ -44,6 +44,10 @@ namespace IRaCIS.Core.Domain.Models public Guid? VisitTaskId { get; set; } + + /// + /// 为了不影响原始检查,跟任务绑定的 NoneDicomStudyId 为guid空 这个字段记录跟原始检查绑 + /// public Guid? OriginNoneDicomStudyId { get; set; } #endregion diff --git a/IRaCIS.Core.Infra.EFCore/Common/AuditingData.cs b/IRaCIS.Core.Infra.EFCore/Common/AuditingData.cs index 83bcad7a4..2a7d20bec 100644 --- a/IRaCIS.Core.Infra.EFCore/Common/AuditingData.cs +++ b/IRaCIS.Core.Infra.EFCore/Common/AuditingData.cs @@ -760,7 +760,7 @@ namespace IRaCIS.Core.Infra.EFCore.Common SelectList = selectList.Join(list, t => t.Id, u => u.DictionaryId, (t, u) => new { - Value = _userInfo.IsEn_Us ? t.Value : t.ValueCN, + Value =t.Value , t.ValueCN, t.Description, t.ShowOrder, @@ -2809,7 +2809,7 @@ namespace IRaCIS.Core.Infra.EFCore.Common //获取问题名称 组合成数组 var quesionList = await _dbContext.ReadingQuestionTrial.Where(t => taskQuestionAnswerList.Select(k => k.ReadingQuestionTrialId).Contains(t.Id)).IgnoreQueryFilters().Select(t => new { - QuestionName=_userInfo.IsEn_Us?t.QuestionEnName: t.QuestionName, + QuestionName=t.QuestionName, t.QuestionEnName, QuestionId = t.Id, t.DictionaryCode, @@ -3118,7 +3118,7 @@ namespace IRaCIS.Core.Infra.EFCore.Common var quesionList = await _dbContext.ReadingQuestionTrial.Where(t => questionIdList.Contains(t.Id)).Select(t => new { - QuestionName=_userInfo.IsEn_Us?t.QuestionEnName: t.QuestionName, + QuestionName=t.QuestionName, t.QuestionEnName, QuestionId = t.Id, t.DictionaryCode, @@ -3136,7 +3136,7 @@ namespace IRaCIS.Core.Infra.EFCore.Common { TaskBlindName = u.VisitTask.TaskBlindName, QuestionId = u.ReadingQuestionTrialId, - QuestionName= _userInfo.IsEn_Us ? u.ReadingQuestionTrial.QuestionEnName : u.ReadingQuestionTrial.QuestionName, + QuestionName= u.ReadingQuestionTrial.QuestionName, u.ReadingQuestionTrial.QuestionEnName, u.ReadingQuestionTrial.DictionaryCode, u.ReadingQuestionTrial.ShowOrder, diff --git a/IRaCIS.Core.Infrastructure/_IRaCIS/IQueryablePageListExtensions.cs b/IRaCIS.Core.Infrastructure/_IRaCIS/IQueryablePageListExtensions.cs index f423446c4..1e98ae975 100644 --- a/IRaCIS.Core.Infrastructure/_IRaCIS/IQueryablePageListExtensions.cs +++ b/IRaCIS.Core.Infrastructure/_IRaCIS/IQueryablePageListExtensions.cs @@ -165,6 +165,24 @@ namespace IRaCIS.Core.Infrastructure.Extention } + public static async Task> SortToListAsync(this IQueryable source, SortInput sortInput, string sortField="", CancellationToken cancellationToken = default) + { + var propName = string.Empty; + + if (string.IsNullOrWhiteSpace(sortInput.SortField)) + { + propName = sortField; + } + else + { + propName = sortInput.SortField; + } + + source = string.IsNullOrWhiteSpace(propName) ? source : (sortInput.Asc ? source.OrderBy(propName) : source.OrderBy(propName + " desc")); + + return await source.ToListAsync(cancellationToken); + + } } } diff --git a/IRaCIS.Core.Infrastructure/_IRaCIS/Input/PageInput.cs b/IRaCIS.Core.Infrastructure/_IRaCIS/Input/PageInput.cs index fb1b01f8a..b3dad6a0a 100644 --- a/IRaCIS.Core.Infrastructure/_IRaCIS/Input/PageInput.cs +++ b/IRaCIS.Core.Infrastructure/_IRaCIS/Input/PageInput.cs @@ -13,6 +13,12 @@ namespace IRaCIS.Core.Infrastructure.Extention public string SortField { get; set; } = ""; } + public class SortInput + { + public bool Asc { get; set; } = true; + public string SortField { get; set; } = ""; + } + public class PageInputMultiSort { public int PageIndex { get; set; } = 1;