diff --git a/IRaCIS.Core.Application/Helper/FileStoreHelper.cs b/IRaCIS.Core.Application/Helper/FileStoreHelper.cs index 43819b93..bfd3d412 100644 --- a/IRaCIS.Core.Application/Helper/FileStoreHelper.cs +++ b/IRaCIS.Core.Application/Helper/FileStoreHelper.cs @@ -417,7 +417,7 @@ public static class FileStoreHelper return Path.Combine(rootPath, StaticData.Folder.TrialDataFolder, trialId.ToString(), siteId.ToString(), subjectId.ToString(), subjectVisitId.ToString(), StaticData.Folder.DicomFolder); } - public static string GetDicomInstanceFilePath(IWebHostEnvironment _hostEnvironment, Guid trialId, Guid siteId, Guid subjectId, Guid subjectVisitId, Guid studyId, Guid instanceId) + public static (string PhysicalPath, string RelativePath) GetDicomInstanceFilePath(IWebHostEnvironment _hostEnvironment, Guid trialId, Guid siteId, Guid subjectId, Guid subjectVisitId, Guid studyId, Guid instanceId) { var rootPath = FileStoreHelper.GetIRaCISRootDataFolder(_hostEnvironment); @@ -429,10 +429,17 @@ public static class FileStoreHelper { Directory.CreateDirectory(path); } - return Path.Combine(path, instanceId.ToString() + ".dcm"); + + var physicalPath = Path.Combine(path, instanceId.ToString() + ".dcm"); + + var relativePath = $"/{StaticData.Folder.IRaCISDataFolder}/{StaticData.Folder.TrialDataFolder}/{trialId}/{siteId}/{subjectId}/{subjectVisitId}/{StaticData.Folder.DicomFolder}/{studyId}/{instanceId}.dcm"; + + return (physicalPath, relativePath); } + + // 获取医生通用文件存放路径 public static (string PhysicalPath, string RelativePath) GetDoctorOrdinaryFilePath(IWebHostEnvironment _hostEnvironment, string fileName,Guid doctorId,string attachmentType) diff --git a/IRaCIS.Core.Application/Service/ImageAndDoc/DTO/DicomSeriesModel.cs b/IRaCIS.Core.Application/Service/ImageAndDoc/DTO/DicomSeriesModel.cs index 4d348f7e..bdea84a7 100644 --- a/IRaCIS.Core.Application/Service/ImageAndDoc/DTO/DicomSeriesModel.cs +++ b/IRaCIS.Core.Application/Service/ImageAndDoc/DTO/DicomSeriesModel.cs @@ -31,6 +31,8 @@ public DateTime UpdateTime { get; set; } public List InstanceList { get; set; } = new List(); + + public List InstancePathList { get; set; } = new List(); } public class DicomSeriesWithLabelDTO : DicomSeriesDTO diff --git a/IRaCIS.Core.Application/Service/ImageAndDoc/DicomArchiveService.cs b/IRaCIS.Core.Application/Service/ImageAndDoc/DicomArchiveService.cs index 18a035d6..4b325717 100644 --- a/IRaCIS.Core.Application/Service/ImageAndDoc/DicomArchiveService.cs +++ b/IRaCIS.Core.Application/Service/ImageAndDoc/DicomArchiveService.cs @@ -43,7 +43,7 @@ namespace IRaCIS.Core.Application.Services public async Task DicomDBDataSaveChange() { - var success = await _studyRepository.SaveChangesAsync(); + var success = await _studyRepository.SaveChangesAsync(); return success; } @@ -62,17 +62,17 @@ namespace IRaCIS.Core.Application.Services if (instanceUidList.Any(t => t == sopInstanceUid)) { - return (IdentifierHelper.CreateGuid(studyInstanceUid, addtionalInfo.TrialId.ToString()), string.Empty) ; + return (IdentifierHelper.CreateGuid(studyInstanceUid, addtionalInfo.TrialId.ToString()), string.Empty); } - var anonymize_AddFixedFiledList = _provider.Get>(StaticData.Anonymize.Anonymize_AddFixedFiled).Value ??new List(); - var anonymize_AddIRCInfoFiledList = _provider.Get>(StaticData.Anonymize.Anonymize_AddIRCInfoFiled).Value ??new List(); + var anonymize_AddFixedFiledList = _provider.Get>(StaticData.Anonymize.Anonymize_AddFixedFiled).Value ?? new List(); + var anonymize_AddIRCInfoFiledList = _provider.Get>(StaticData.Anonymize.Anonymize_AddIRCInfoFiled).Value ?? new List(); var anonymize_FixedFieldList = _provider.Get>(StaticData.Anonymize.Anonymize_FixedField).Value ?? new List(); var anonymize_IRCInfoFieldList = _provider.Get>(StaticData.Anonymize.Anonymize_IRCInfoField).Value ?? new List(); - if(anonymize_AddFixedFiledList.Union(anonymize_AddIRCInfoFiledList).Union(anonymize_FixedFieldList).Union(anonymize_IRCInfoFieldList) .Count()==0) + if (anonymize_AddFixedFiledList.Union(anonymize_AddIRCInfoFiledList).Union(anonymize_FixedFieldList).Union(anonymize_IRCInfoFieldList).Count() == 0) { throw new BusinessValidationFailedException("未取到缓存匿名化配置数据,上传停止,请联系开发人员核实"); } @@ -113,7 +113,7 @@ namespace IRaCIS.Core.Application.Services } if (dicomTag == DicomTag.PatientID) { - dataset.AddOrUpdate(dicomTag, addtionalInfo.TrialCode+"_"+ addtionalInfo.SubjectCode); + dataset.AddOrUpdate(dicomTag, addtionalInfo.TrialCode + "_" + addtionalInfo.SubjectCode); } @@ -127,14 +127,14 @@ namespace IRaCIS.Core.Application.Services dicomSeries.DicomStudy = dicomStudy; - var createtime=DateTime.Now; - + var createtime = DateTime.Now; + if (isStudyNeedAdd) { // 添加检查 await _studyRepository.AddAsync(dicomStudy); } - + if (isSeriesNeedAdd) { dicomSeries.DicomStudy = dicomStudy; @@ -143,12 +143,12 @@ namespace IRaCIS.Core.Application.Services } - - await _instanceRepository.AddAsync(dicomInstance); + var (physicalPath, relativePath) = FileStoreHelper.GetDicomInstanceFilePath(_hostEnvironment, dicomStudy.TrialId, dicomStudy.SiteId, dicomStudy.SubjectId, dicomStudy.SubjectVisitId, dicomStudy.Id, dicomInstance.Id); + dicomInstance.Path = relativePath; + await _instanceRepository.AddAsync(dicomInstance); - string filePath = FileStoreHelper.GetDicomInstanceFilePath(_hostEnvironment, dicomStudy.TrialId, dicomStudy.SiteId, dicomStudy.SubjectId, dicomStudy.SubjectVisitId, dicomStudy.Id, dicomInstance.Id); var samplesPerPixel = dataset.GetSingleValueOrDefault(DicomTag.SamplesPerPixel, string.Empty); var photometricInterpretation = dataset.GetSingleValueOrDefault(DicomTag.PhotometricInterpretation, string.Empty); @@ -156,23 +156,23 @@ namespace IRaCIS.Core.Application.Services { if (dataset.InternalTransferSyntax.IsEncapsulated) { - await dicomFile.SaveAsync(filePath); + await dicomFile.SaveAsync(physicalPath); } else { - await dicomFile.Clone(DicomTransferSyntax.JPEGLSLossless).SaveAsync(filePath); + await dicomFile.Clone(DicomTransferSyntax.JPEGLSLossless).SaveAsync(physicalPath); } } else { - if (dataset.InternalTransferSyntax.IsEncapsulated) await dicomFile.SaveAsync(filePath); - else await dicomFile.Clone(DicomTransferSyntax.RLELossless).SaveAsync(filePath); //RLELossless + if (dataset.InternalTransferSyntax.IsEncapsulated) await dicomFile.SaveAsync(physicalPath); + else await dicomFile.Clone(DicomTransferSyntax.RLELossless).SaveAsync(physicalPath); //RLELossless } return (dicomInstance.StudyId, dicomStudy.StudyCode); } - private DicomStudy CreateDicomStudy(DicomDataset dataset, DicomTrialSiteSubjectInfo addtionalInfo, out bool isStudyNeedAdd) + private DicomStudy CreateDicomStudy(DicomDataset dataset, DicomTrialSiteSubjectInfo addtionalInfo, out bool isStudyNeedAdd) { string studyInstanceUid = dataset.GetString(DicomTag.StudyInstanceUID); @@ -200,7 +200,7 @@ namespace IRaCIS.Core.Application.Services var modality = dataset.GetSingleValueOrDefault(DicomTag.Modality, string.Empty); - var dicModalityList = _dictionaryRepository.Where(t => t.Code == "Modality").SelectMany(t => t.ChildList.Select(c => c.Value)).ToList(); + var dicModalityList = _dictionaryRepository.Where(t => t.Code == "Modality").SelectMany(t => t.ChildList.Select(c => c.Value)).ToList(); dicomStudy = new DicomStudy { @@ -251,15 +251,15 @@ namespace IRaCIS.Core.Application.Services var dbStudyCodeIntMax = _studyRepository.Where(s => s.TrialId == addtionalInfo.TrialId).Select(t => t.Code).DefaultIfEmpty().Max(); //获取缓存中的值 并发的时候,需要记录,已被占用的值 这样其他线程在此占用的最大的值上递增 - var cacheMaxCodeInt = _provider.Get($"{addtionalInfo.TrialId }_{ StaticData.CacheKey.StudyMaxCode}").Value; + var cacheMaxCodeInt = _provider.Get($"{addtionalInfo.TrialId}_{StaticData.CacheKey.StudyMaxCode}").Value; int currentNextCodeInt = cacheMaxCodeInt > dbStudyCodeIntMax ? cacheMaxCodeInt + 1 : dbStudyCodeIntMax + 1; dicomStudy.Code = currentNextCodeInt; - dicomStudy.StudyCode = AppSettings.GetCodeStr(currentNextCodeInt, nameof(DicomStudy)); + dicomStudy.StudyCode = AppSettings.GetCodeStr(currentNextCodeInt, nameof(DicomStudy)); - _provider.Set($"{addtionalInfo.TrialId }_{ StaticData.CacheKey.StudyMaxCode}", dicomStudy.Code, TimeSpan.FromMinutes(30)); + _provider.Set($"{addtionalInfo.TrialId}_{StaticData.CacheKey.StudyMaxCode}", dicomStudy.Code, TimeSpan.FromMinutes(30)); } diff --git a/IRaCIS.Core.Application/Service/ImageAndDoc/InstanceService.cs b/IRaCIS.Core.Application/Service/ImageAndDoc/InstanceService.cs index 434d7be7..1da8a6c5 100644 --- a/IRaCIS.Core.Application/Service/ImageAndDoc/InstanceService.cs +++ b/IRaCIS.Core.Application/Service/ImageAndDoc/InstanceService.cs @@ -56,11 +56,11 @@ namespace IRaCIS.Core.Application.Services DicomStudy dicomStudy = await _studyRepository.FirstOrDefaultAsync(s => s.Id == dicomInstance.StudyId).IfNullThrowException(); - path = FileStoreHelper.GetDicomInstanceFilePath(_hostEnvironment, dicomStudy.TrialId, dicomStudy.SiteId, dicomStudy.SubjectId, dicomStudy.SubjectVisitId, dicomStudy.Id, dicomInstance.Id); + var(physicalPath, relativePath) = FileStoreHelper.GetDicomInstanceFilePath(_hostEnvironment, dicomStudy.TrialId, dicomStudy.SiteId, dicomStudy.SubjectId, dicomStudy.SubjectVisitId, dicomStudy.Id, dicomInstance.Id); - using (var sw = ImageHelper.RenderPreviewJpeg(path)) + using (var sw = ImageHelper.RenderPreviewJpeg(physicalPath)) { var bytes = new byte[sw.Length]; sw.Read(bytes, 0, bytes.Length); @@ -85,11 +85,11 @@ namespace IRaCIS.Core.Application.Services //} //else - filePath = FileStoreHelper.GetDicomInstanceFilePath(_hostEnvironment, dicomStudy.TrialId, dicomStudy.SiteId, dicomStudy.SubjectId, dicomStudy.SubjectVisitId, dicomStudy.Id, dicomInstance.Id); + var (physicalPath, relativePath) = FileStoreHelper.GetDicomInstanceFilePath(_hostEnvironment, dicomStudy.TrialId, dicomStudy.SiteId, dicomStudy.SubjectId, dicomStudy.SubjectVisitId, dicomStudy.Id, dicomInstance.Id); - using (var sw = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read)) + using (var sw = new FileStream(physicalPath, FileMode.Open, FileAccess.Read, FileShare.Read)) { var bytes = new byte[sw.Length]; sw.Read(bytes, 0, bytes.Length); diff --git a/IRaCIS.Core.Application/Service/ImageAndDoc/SeriesService.cs b/IRaCIS.Core.Application/Service/ImageAndDoc/SeriesService.cs index 037c3e8e..d93fb6ae 100644 --- a/IRaCIS.Core.Application/Service/ImageAndDoc/SeriesService.cs +++ b/IRaCIS.Core.Application/Service/ImageAndDoc/SeriesService.cs @@ -64,7 +64,9 @@ namespace IRaCIS.Core.Application.Services }); } - var idList = await _instanceRepository.Where(s => s.StudyId == studyId).ToListAsync();//.GroupBy(u => u.SeriesId); + 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) { @@ -74,8 +76,12 @@ namespace IRaCIS.Core.Application.Services } 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).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(); } } @@ -97,9 +103,9 @@ namespace IRaCIS.Core.Application.Services DicomStudy dicomStudy = await _studyRepository.FirstOrDefaultAsync(s => s.Id == dicomInstance.StudyId).IfNullThrowException(); - path = FileStoreHelper.GetDicomInstanceFilePath(_hostEnvironment, dicomStudy.TrialId, dicomStudy.SiteId, dicomStudy.SubjectId, dicomStudy.SubjectVisitId, dicomStudy.Id, dicomInstance.Id); + var (physicalPath, relativePath) = FileStoreHelper.GetDicomInstanceFilePath(_hostEnvironment, dicomStudy.TrialId, dicomStudy.SiteId, dicomStudy.SubjectId, dicomStudy.SubjectVisitId, dicomStudy.Id, dicomInstance.Id); - using (var sw = ImageHelper.RenderPreviewJpeg(path)) + using (var sw = ImageHelper.RenderPreviewJpeg(physicalPath)) { var bytes = new byte[sw.Length]; sw.Read(bytes, 0, bytes.Length); diff --git a/IRaCIS.Core.Application/Service/ImageAndDoc/StudyService.cs b/IRaCIS.Core.Application/Service/ImageAndDoc/StudyService.cs index 5ba8d03d..0a7e13d1 100644 --- a/IRaCIS.Core.Application/Service/ImageAndDoc/StudyService.cs +++ b/IRaCIS.Core.Application/Service/ImageAndDoc/StudyService.cs @@ -324,7 +324,9 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc DicomStudy dicomStudy = await _repository.FirstOrDefaultAsync(s => s.Id == dicomInstance.StudyId); if (dicomStudy != null) { - path = FileStoreHelper.GetDicomInstanceFilePath(_hostEnvironment, dicomStudy.TrialId, dicomStudy.SiteId, dicomStudy.SubjectId, dicomStudy.SubjectVisitId, dicomStudy.Id, dicomInstance.Id); + var( physicalPath ,relativePath )= FileStoreHelper.GetDicomInstanceFilePath(_hostEnvironment, dicomStudy.TrialId, dicomStudy.SiteId, dicomStudy.SubjectId, dicomStudy.SubjectVisitId, dicomStudy.Id, dicomInstance.Id); + + path = physicalPath; } } diff --git a/IRaCIS.Core.Application/Service/QC/QCOperationService.cs b/IRaCIS.Core.Application/Service/QC/QCOperationService.cs index 81a24e0d..44bab361 100644 --- a/IRaCIS.Core.Application/Service/QC/QCOperationService.cs +++ b/IRaCIS.Core.Application/Service/QC/QCOperationService.cs @@ -780,12 +780,12 @@ namespace IRaCIS.Core.Application.Image.QA instanceIdList.ForEach(t => { var dicomStudy = new DicomStudy() { Id = t.StudyId, SubjectId = t.SubjectId, TrialId = trialId, SiteId = t.SiteId, SubjectVisitId = subjectVisitId }; - var path = + var (physicalPath, relativePath) = FileStoreHelper.GetDicomInstanceFilePath(_hostEnvironment, dicomStudy.TrialId, dicomStudy.SiteId, dicomStudy.SubjectId, dicomStudy.SubjectVisitId, dicomStudy.Id, t.InstanceId); - if (System.IO.File.Exists(path)) + if (System.IO.File.Exists(physicalPath)) { - File.Delete(path); + File.Delete(physicalPath); } }); @@ -1365,13 +1365,13 @@ namespace IRaCIS.Core.Application.Image.QA instanceIdList.ForEach(t => { var dicomStudy = new DicomStudy() { Id = t.StudyId, SubjectId = t.SubjectId, TrialId = trialId, SiteId = t.SiteId, SubjectVisitId = subjectVisitId }; - var path = + var (physicalPath, relativePath) = FileStoreHelper.GetDicomInstanceFilePath(_hostEnvironment, dicomStudy.TrialId, dicomStudy.SiteId, dicomStudy.SubjectId, dicomStudy.SubjectVisitId, dicomStudy.Id, t.InstanceId); - if (System.IO.File.Exists(path)) + if (System.IO.File.Exists(physicalPath)) { - File.Delete(path); + File.Delete(physicalPath); } }); @@ -1428,13 +1428,13 @@ namespace IRaCIS.Core.Application.Image.QA instanceIdList.ForEach(t => { var dicomStudy = new DicomStudy() { Id = t.StudyId, SubjectId = t.SubjectId, TrialId = trialId, SiteId = t.SiteId, SubjectVisitId = subjectVisitId }; - var path = + var(physicalPath, relativePath) = FileStoreHelper.GetDicomInstanceFilePath(_hostEnvironment, dicomStudy.TrialId, dicomStudy.SiteId, dicomStudy.SubjectId, dicomStudy.SubjectVisitId, dicomStudy.Id, t.InstanceId); - if (System.IO.File.Exists(path)) + if (System.IO.File.Exists(physicalPath)) { - File.Delete(path); + File.Delete(physicalPath); } }); diff --git a/IRaCIS.Core.Application/Service/QC/_MapConfig.cs b/IRaCIS.Core.Application/Service/QC/_MapConfig.cs index 21f31122..d089b7de 100644 --- a/IRaCIS.Core.Application/Service/QC/_MapConfig.cs +++ b/IRaCIS.Core.Application/Service/QC/_MapConfig.cs @@ -148,8 +148,17 @@ namespace IRaCIS.Core.Application.Service .ForMember(o => o.SubjectCode, t => t.MapFrom(u => u.Subject.Code)) .ForMember(o => o.UserName, t => t.MapFrom(u => u.DoctorUser.UserName)); - - + CreateMap() + .ForMember(o => o.OverallTumorEvaluationResult, t => t.MapFrom(u => u.ReadingTaskQuestionAnswerList.Where(c => c.ReadingQuestionTrial.QuestionType == QuestionType.Tumor).FirstOrDefault().Answer )) + .ForMember(o => o.TargetlesionEvaluationResult, t => t.MapFrom(u => u.ReadingTaskQuestionAnswerList.Where(c => c.ReadingQuestionTrial.QuestionType == QuestionType.TargetLesion).FirstOrDefault().Answer)) + .ForMember(o => o.NoneTargetlesionEvaluationResult, t => t.MapFrom(u => u.ReadingTaskQuestionAnswerList.Where(c => c.ReadingQuestionTrial.QuestionType == QuestionType.NoTargetLesion).FirstOrDefault().Answer)) + .ForMember(o => o.IsExistNewlesionEvaluationResult, t => t.MapFrom(u => u.ReadingTaskQuestionAnswerList.Where(c => c.ReadingQuestionTrial.QuestionType == QuestionType.NewLesions).FirstOrDefault().Answer)) + + .ForMember(o => o.TrialSiteCode, t => t.MapFrom(u => u.Subject.TrialSite.TrialSiteCode)) + .ForMember(o => o.SubjectCode, t => t.MapFrom(u => u.Subject.Code)) + .ForMember(o => o.UserName, t => t.MapFrom(u => u.DoctorUser.UserName)); + + #endregion diff --git a/IRaCIS.Core.Application/TestService.cs b/IRaCIS.Core.Application/TestService.cs index 9818277c..02b140b3 100644 --- a/IRaCIS.Core.Application/TestService.cs +++ b/IRaCIS.Core.Application/TestService.cs @@ -1,5 +1,6 @@ using BeetleX.BNR; using IRaCIS.Core.Application.Service; +using IRaCIS.Core.Domain.Share; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Caching.Distributed; using System.Text.RegularExpressions; @@ -105,9 +106,16 @@ namespace IRaCIS.Application.Services return findStr; } [HttpPost] - public async Task Get(TestModel testModel) + public async Task Get(TestModel testModel) { + + //update DicomInstance set Path = '/IRaCISData/TrialData/' + cast(DicomInstance.TrialId as varchar) + '/' + DicomInstance.SiteId + '/' + DicomInstance.SubjectId + '/' + DicomInstance.SubjectVisitId + '/Dicom/' + DicomInstance.StudyId + '/' + DicomInstance.Id + '.dcm' + + + await _repository.BatchUpdateAsync(u=>u.Id!=Guid.Empty,t => new DicomInstance() { Path = $"/{StaticData.Folder.IRaCISDataFolder}/{StaticData.Folder.TrialDataFolder}/{t.TrialId}/{t.SiteId}/{t.SubjectId}/{t.SubjectVisitId}/{StaticData.Folder.DicomFolder}/{t.StudyId}/{t.Id}.dcm" }); + + // Load a document. //using (var document = DocX.Load(Path.Combine(_hostEnvironment.ContentRootPath, "ReplaceText.docx"))) //{ @@ -126,7 +134,7 @@ namespace IRaCIS.Application.Services // } //} - return await NpoiWordHelper.TemplateExportWordAsync(Path.Combine(_hostEnvironment.ContentRootPath, "ReplaceText.docx"), new { test = "xiugai", ZZZZ = "ModiffyZZZZ" }, null, _hostEnvironment); + //return await NpoiWordHelper.TemplateExportWordAsync(Path.Combine(_hostEnvironment.ContentRootPath, "ReplaceText.docx"), new { test = "xiugai", ZZZZ = "ModiffyZZZZ" }, null, _hostEnvironment); //_cache.SetString("test" , "cacheStr"); diff --git a/IRaCIS.Core.Domain/Image/DicomInstance.cs b/IRaCIS.Core.Domain/Image/DicomInstance.cs index 4f301ede..8626970f 100644 --- a/IRaCIS.Core.Domain/Image/DicomInstance.cs +++ b/IRaCIS.Core.Domain/Image/DicomInstance.cs @@ -46,5 +46,8 @@ namespace IRaCIS.Core.Domain.Models public DateTime CreateTime { get; set; } = DateTime.Now; public Guid UpdateUserId { get; set; } public DateTime UpdateTime { get; set; } = DateTime.Now; + + + public string Path { get; set; } } }