修改ivus影像下载功能
continuous-integration/drone/push Build is passing
Details
continuous-integration/drone/push Build is passing
Details
parent
814f1e576a
commit
e0c6e9aabf
|
@ -54,11 +54,11 @@
|
|||
},
|
||||
"applicationUrl": "http://localhost:6100"
|
||||
},
|
||||
"IRaCIS.US_IRC": {
|
||||
"IRaCIS.US_Uat_IRC": {
|
||||
"commandName": "Project",
|
||||
"launchBrowser": true,
|
||||
"environmentVariables": {
|
||||
"ASPNETCORE_ENVIRONMENT": "US_IRC"
|
||||
"ASPNETCORE_ENVIRONMENT": "US_Uat_IRC"
|
||||
},
|
||||
"applicationUrl": "http://localhost:6100"
|
||||
}
|
||||
|
|
|
@ -23,7 +23,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
|
|||
{
|
||||
public interface IDownloadAndUploadService
|
||||
{
|
||||
Task PackageAndAnonymizImage(Guid trialId, Guid subjectVisitId, bool isAnonymize = true);
|
||||
Task PackageAndAnonymizImage(Guid trialId, Guid subjectVisitId, bool isDicom, bool isAnonymize = true);
|
||||
}
|
||||
[ApiExplorerSettings(GroupName = "Trial")]
|
||||
public class DownloadAndUploadService : BaseService, IDownloadAndUploadService
|
||||
|
@ -107,8 +107,8 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
|
|||
{
|
||||
await SubejctRandomReadingTaskNameDeal(subjectId, trialReadingCriterionId);
|
||||
|
||||
var query = _repository.Where<VisitTask>(t => t.SubjectId == subjectId && t.TrialReadingCriterionId == trialReadingCriterionId && t.SourceSubjectVisitId != null
|
||||
&& t.DoctorUserId == _userInfo.Id && t.TaskState==TaskState.Effect)
|
||||
var query = _repository.Where<VisitTask>(t => t.SubjectId == subjectId && t.TrialReadingCriterionId == trialReadingCriterionId && t.SourceSubjectVisitId != null
|
||||
&& t.DoctorUserId == _userInfo.Id && t.TaskState == TaskState.Effect)
|
||||
.Select(u => new SubjectImageUploadDTO()
|
||||
{
|
||||
VisitTaskId = u.Id,
|
||||
|
@ -129,7 +129,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
|
|||
PackState = u.SourceSubjectVisit.PackState,
|
||||
|
||||
OrginalStudyList = u.SourceSubjectVisit.StudyList
|
||||
.Where(t => u.TrialReadingCriterion.IsImageFilter ?("|"+u.TrialReadingCriterion.CriterionModalitys+"|").Contains("|"+t.ModalityForEdit+"|" ) : true)
|
||||
.Where(t => u.TrialReadingCriterion.IsImageFilter ? ("|" + u.TrialReadingCriterion.CriterionModalitys + "|").Contains("|" + t.ModalityForEdit + "|") : true)
|
||||
.Select(t => new StudyBasicInfo()
|
||||
{
|
||||
Id = t.Id,
|
||||
|
@ -484,24 +484,38 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
|
|||
/// </summary>
|
||||
/// <param name="trialId"></param>
|
||||
/// <param name="subjectVisitId"></param>
|
||||
/// <param name="isDicom"></param>
|
||||
/// <param name="isAnonymize"></param>
|
||||
/// <returns></returns>
|
||||
|
||||
public async Task<IResponseOutput> RequestPackageAndAnonymizImage(Guid trialId, Guid subjectVisitId, bool isAnonymize = true)
|
||||
public async Task<IResponseOutput> RequestPackageAndAnonymizImage(Guid trialId, Guid subjectVisitId, bool isDicom, bool isAnonymize = true)
|
||||
{
|
||||
var subjectVisit = await _subjectVisitRepository.FirstOrDefaultAsync(t => t.Id == subjectVisitId);
|
||||
|
||||
if (subjectVisit.PackState == PackState.WaitPack)
|
||||
{
|
||||
HangfireJobHelper.NotImmediatelyOnceOnlyJob<IDownloadAndUploadService>(t => t.PackageAndAnonymizImage(trialId, subjectVisitId, isAnonymize), TimeSpan.FromSeconds(1));
|
||||
var packState = isDicom ? subjectVisit.PackState : subjectVisit.NoDicomPackState;
|
||||
|
||||
if (packState == PackState.WaitPack)
|
||||
{
|
||||
|
||||
if (isDicom)
|
||||
{
|
||||
subjectVisit.PackState = PackState.Packing;
|
||||
HangfireJobHelper.NotImmediatelyOnceOnlyJob<IDownloadAndUploadService>(t => t.PackageAndAnonymizImage(trialId, subjectVisitId,true, isAnonymize), TimeSpan.FromSeconds(1));
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
subjectVisit.NoDicomPackState = PackState.Packing;
|
||||
|
||||
HangfireJobHelper.NotImmediatelyOnceOnlyJob<IDownloadAndUploadService>(t => t.PackageAndAnonymizImage(trialId, subjectVisitId, false, isAnonymize), TimeSpan.FromSeconds(1));
|
||||
}
|
||||
|
||||
subjectVisit.PackState = PackState.Packing;
|
||||
|
||||
await _subjectVisitRepository.SaveChangesAsync();
|
||||
|
||||
}
|
||||
|
||||
return ResponseOutput.Ok(subjectVisit.VisitImageZipPath);
|
||||
return ResponseOutput.Ok(isDicom ? subjectVisit.VisitImageZipPath : subjectVisit.VisitNoDicomImageZipPath);
|
||||
|
||||
}
|
||||
|
||||
|
@ -544,9 +558,10 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
|
|||
/// </summary>
|
||||
/// <param name="trialId"></param>
|
||||
/// <param name="subjectVisitId"></param>
|
||||
/// <param name="isDicom"></param>
|
||||
/// <param name="isAnonymize"></param>
|
||||
/// <returns></returns>
|
||||
public async Task PackageAndAnonymizImage(Guid trialId, Guid subjectVisitId, bool isAnonymize = true)
|
||||
public async Task PackageAndAnonymizImage(Guid trialId, Guid subjectVisitId, bool isDicom, bool isAnonymize = true)
|
||||
{
|
||||
|
||||
var subjectVisit = await _subjectVisitRepository.FirstOrDefaultAsync(t => t.Id == subjectVisitId);
|
||||
|
@ -590,6 +605,20 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
|
|||
})
|
||||
})
|
||||
|
||||
}),
|
||||
|
||||
NoneDicomStudyList = sv.NoneDicomStudyList.Select(nd => new
|
||||
{
|
||||
nd.Modality,
|
||||
nd.StudyCode,
|
||||
nd.ImageDate,
|
||||
|
||||
FileList = nd.NoneDicomFileList.Select(file => new
|
||||
{
|
||||
file.FileName,
|
||||
file.Path,
|
||||
file.FileType
|
||||
})
|
||||
})
|
||||
};
|
||||
|
||||
|
@ -601,107 +630,138 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
|
|||
string tempFolderPath = Path.Combine(Directory.GetCurrentDirectory(), $"DownloadTemp_{NewId.NextGuid()}");
|
||||
Directory.CreateDirectory(tempFolderPath);
|
||||
|
||||
// 遍历查询结果
|
||||
foreach (var studyInfo in info.StudyList)
|
||||
//dicom 处理
|
||||
|
||||
if (isDicom)
|
||||
{
|
||||
// 遍历 Series
|
||||
foreach (var seriesInfo in studyInfo.SeriesList)
|
||||
// 遍历查询结果
|
||||
foreach (var studyInfo in info.StudyList)
|
||||
{
|
||||
string studyFolderPath = Path.Combine(tempFolderPath, $"{info.SubjectCode}_{info.VisitName}", $"{studyInfo.StudyCode}_{studyInfo.StudyTime?.ToString("yyyy-MM-dd")}_{seriesInfo.Modality}");
|
||||
|
||||
// 创建 影像 文件夹
|
||||
Directory.CreateDirectory(studyFolderPath);
|
||||
|
||||
// 遍历 InstancePathList
|
||||
foreach (var instanceInfo in seriesInfo.InstancePathList)
|
||||
// 遍历 Series
|
||||
foreach (var seriesInfo in studyInfo.SeriesList)
|
||||
{
|
||||
// 复制文件到相应的文件夹
|
||||
string destinationPath = Path.Combine(studyFolderPath, Path.GetFileName(instanceInfo.Path));
|
||||
string studyDicomFolderPath = Path.Combine(tempFolderPath, "Dicom", $"{info.SubjectCode}_{info.VisitName}", $"{studyInfo.StudyCode}_{studyInfo.StudyTime?.ToString("yyyy-MM-dd")}_{seriesInfo.Modality}");
|
||||
|
||||
//下载到当前目录
|
||||
await _oSSService.DownLoadFromOSSAsync(instanceInfo.Path, destinationPath);
|
||||
// 创建 影像 文件夹
|
||||
Directory.CreateDirectory(studyDicomFolderPath);
|
||||
|
||||
#region 匿名化逻辑
|
||||
|
||||
|
||||
if (isAnonymize)
|
||||
// 遍历 InstancePathList
|
||||
foreach (var instanceInfo in seriesInfo.InstancePathList)
|
||||
{
|
||||
//受试者随机阅片,需要匿名化检查时间
|
||||
DicomFile dicomFile = await DicomFile.OpenAsync(destinationPath, Encoding.Default);
|
||||
DicomDataset dataset = dicomFile.Dataset;
|
||||
dataset.AddOrUpdate(DicomTag.StudyDate, string.Empty);
|
||||
dataset.AddOrUpdate(DicomTag.StudyTime, string.Empty);
|
||||
// 复制文件到相应的文件夹
|
||||
string destinationPath = Path.Combine(studyDicomFolderPath, Path.GetFileName(instanceInfo.Path));
|
||||
|
||||
#region 前端已经匿名化,不需要做相关tag匿名化
|
||||
//DicomFile dicomFile = await DicomFile.OpenAsync(destinationPath, Encoding.Default);
|
||||
//下载到当前目录
|
||||
await _oSSService.DownLoadFromOSSAsync(instanceInfo.Path, destinationPath);
|
||||
|
||||
//DicomDataset dataset = dicomFile.Dataset;
|
||||
#region 匿名化逻辑
|
||||
|
||||
//foreach (var item in addOrUpdateFixedFieldList)
|
||||
//{
|
||||
|
||||
// var dicomTag = new DicomTag(Convert.ToUInt16(item.Group, 16), Convert.ToUInt16(item.Element, 16));
|
||||
if (isAnonymize)
|
||||
{
|
||||
//受试者随机阅片,需要匿名化检查时间
|
||||
DicomFile dicomFile = await DicomFile.OpenAsync(destinationPath, Encoding.Default);
|
||||
DicomDataset dataset = dicomFile.Dataset;
|
||||
dataset.AddOrUpdate(DicomTag.StudyDate, string.Empty);
|
||||
dataset.AddOrUpdate(DicomTag.StudyTime, string.Empty);
|
||||
|
||||
// dataset.AddOrUpdate(dicomTag, item.ReplaceValue);
|
||||
//}
|
||||
#region 前端已经匿名化,不需要做相关tag匿名化
|
||||
//DicomFile dicomFile = await DicomFile.OpenAsync(destinationPath, Encoding.Default);
|
||||
|
||||
//foreach (var item in ircFieldList)
|
||||
//{
|
||||
//DicomDataset dataset = dicomFile.Dataset;
|
||||
|
||||
// var dicomTag = new DicomTag(Convert.ToUInt16(item.Group, 16), Convert.ToUInt16(item.Element, 16));
|
||||
//foreach (var item in addOrUpdateFixedFieldList)
|
||||
//{
|
||||
|
||||
// if (dicomTag == DicomTag.ClinicalTrialProtocolID)
|
||||
// {
|
||||
// dataset.AddOrUpdate(dicomTag, subjectAndVisitInfo.TrialCode);
|
||||
// var dicomTag = new DicomTag(Convert.ToUInt16(item.Group, 16), Convert.ToUInt16(item.Element, 16));
|
||||
|
||||
// }
|
||||
// if (dicomTag == DicomTag.ClinicalTrialSiteID)
|
||||
// {
|
||||
// //dataset.AddOrUpdate(dicomTag, subjectAndVisitInfo.TrialSiteCode);
|
||||
// dataset.AddOrUpdate(dicomTag, item.ReplaceValue);
|
||||
//}
|
||||
|
||||
// }
|
||||
// if (dicomTag == DicomTag.ClinicalTrialSubjectID)
|
||||
// {
|
||||
// dataset.AddOrUpdate(dicomTag, subjectAndVisitInfo.SubjectCode);
|
||||
//foreach (var item in ircFieldList)
|
||||
//{
|
||||
|
||||
// }
|
||||
// if (dicomTag == DicomTag.ClinicalTrialTimePointID)
|
||||
// {
|
||||
// dataset.AddOrUpdate(dicomTag, subjectAndVisitInfo.VisitNum.ToString());
|
||||
// var dicomTag = new DicomTag(Convert.ToUInt16(item.Group, 16), Convert.ToUInt16(item.Element, 16));
|
||||
|
||||
// }
|
||||
// if (dicomTag == DicomTag.PatientID)
|
||||
// {
|
||||
// dataset.AddOrUpdate(dicomTag, subjectAndVisitInfo.TrialCode + "_" + subjectAndVisitInfo.SubjectCode);
|
||||
// if (dicomTag == DicomTag.ClinicalTrialProtocolID)
|
||||
// {
|
||||
// dataset.AddOrUpdate(dicomTag, subjectAndVisitInfo.TrialCode);
|
||||
|
||||
// }
|
||||
// }
|
||||
// if (dicomTag == DicomTag.ClinicalTrialSiteID)
|
||||
// {
|
||||
// //dataset.AddOrUpdate(dicomTag, subjectAndVisitInfo.TrialSiteCode);
|
||||
|
||||
//}
|
||||
// }
|
||||
// if (dicomTag == DicomTag.ClinicalTrialSubjectID)
|
||||
// {
|
||||
// dataset.AddOrUpdate(dicomTag, subjectAndVisitInfo.SubjectCode);
|
||||
|
||||
// }
|
||||
// if (dicomTag == DicomTag.ClinicalTrialTimePointID)
|
||||
// {
|
||||
// dataset.AddOrUpdate(dicomTag, subjectAndVisitInfo.VisitNum.ToString());
|
||||
|
||||
// }
|
||||
// if (dicomTag == DicomTag.PatientID)
|
||||
// {
|
||||
// dataset.AddOrUpdate(dicomTag, subjectAndVisitInfo.TrialCode + "_" + subjectAndVisitInfo.SubjectCode);
|
||||
|
||||
// }
|
||||
|
||||
//}
|
||||
#endregion
|
||||
|
||||
}
|
||||
#endregion
|
||||
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
var zipDicomPath = Path.Combine(Directory.GetCurrentDirectory(), $"{info.SubjectCode}_{info.VisitName}_ImageStudy_Dicom.zip");
|
||||
ZipFile.CreateFromDirectory(Path.Combine(tempFolderPath, "Dicom"), zipDicomPath);
|
||||
//上传到Oss
|
||||
var relativeDicomPath = await _oSSService.UploadToOSSAsync(zipDicomPath, $"download_zip", false);
|
||||
|
||||
await _subjectVisitRepository.BatchUpdateNoTrackingAsync(t => t.Id == subjectVisitId, u => new SubjectVisit() { PackState = PackState.Packed, VisitImageZipPath = relativeDicomPath });
|
||||
|
||||
|
||||
File.Delete(zipDicomPath);
|
||||
}
|
||||
else
|
||||
{
|
||||
//非dicom 处理
|
||||
|
||||
var zipPath = Path.Combine(Directory.GetCurrentDirectory(), $"{info.SubjectCode}_{info.VisitName}_ImageStudy.zip");
|
||||
foreach (var noneDicomStudy in info.NoneDicomStudyList)
|
||||
{
|
||||
string studyNoneDicomFolderPath = Path.Combine(tempFolderPath, "NoneDicom", $"{info.SubjectCode}_{info.VisitName}", $"{noneDicomStudy.StudyCode}_{noneDicomStudy.ImageDate.ToString("yyyy-MM-dd")}_{noneDicomStudy.Modality}");
|
||||
|
||||
ZipFile.CreateFromDirectory(tempFolderPath, zipPath);
|
||||
Directory.CreateDirectory(studyNoneDicomFolderPath);
|
||||
|
||||
//上传到Oss
|
||||
var relativePath = await _oSSService.UploadToOSSAsync(zipPath, $"download_zip", false);
|
||||
foreach (var file in noneDicomStudy.FileList)
|
||||
{
|
||||
string destinationPath = Path.Combine(studyNoneDicomFolderPath, Path.GetFileName(file.FileName));
|
||||
|
||||
//下载到当前目录
|
||||
await _oSSService.DownLoadFromOSSAsync(file.Path, destinationPath);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//subjectVisit.PackState = PackState.Packed;
|
||||
//subjectVisit.VisitImageZipPath = relativePath;
|
||||
//await _subjectVisitRepository.SaveChangesAsync();
|
||||
await _subjectVisitRepository.BatchUpdateNoTrackingAsync(t => t.Id == subjectVisitId, u => new SubjectVisit() { PackState = PackState.Packed, VisitImageZipPath = relativePath });
|
||||
var zipNoneDicomPath = Path.Combine(Directory.GetCurrentDirectory(), $"{info.SubjectCode}_{info.VisitName}_ImageStudy_NoneDicom.zip");
|
||||
ZipFile.CreateFromDirectory(Path.Combine(tempFolderPath, "NoneDicom"), zipNoneDicomPath);
|
||||
var relativeNoneDicomPath = await _oSSService.UploadToOSSAsync(zipNoneDicomPath, $"download_zip", false);
|
||||
|
||||
File.Delete(zipNoneDicomPath);
|
||||
|
||||
await _subjectVisitRepository.BatchUpdateNoTrackingAsync(t => t.Id == subjectVisitId, u => new SubjectVisit() { PackState = PackState.Packed, VisitNoDicomImageZipPath = relativeNoneDicomPath });
|
||||
|
||||
|
||||
}
|
||||
|
||||
//清理文件夹
|
||||
Directory.Delete(tempFolderPath, true);
|
||||
File.Delete(zipPath);
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
@ -72,7 +72,7 @@ namespace IRaCIS.Core.Application.Contracts
|
|||
public List<TrialSiteUserSurveyView> TrialSiteUserSurveyList { get; set; } = new List<TrialSiteUserSurveyView>();
|
||||
|
||||
|
||||
public SiteSurveyFiledConfig SiteSurveyFiledConfig { get; set; }
|
||||
public TrialExtraConfig SiteSurveyFiledConfig { get; set; }
|
||||
}
|
||||
|
||||
public class TrialSiteUserSurveyAllDTO : TrialSiteUserSurveyView
|
||||
|
|
|
@ -391,9 +391,9 @@ namespace IRaCIS.Core.Application.Contracts
|
|||
var result = await _trialSiteSurveyRepository.Where(t => t.Id == trialSiteSurveyId && t.TrialId == trialId).IgnoreQueryFilters()
|
||||
.ProjectTo<LoginReturnDTO>(_mapper.ConfigurationProvider, new { isEn_Us = _userInfo.IsEn_Us }).FirstOrDefaultAsync().IfNullThrowException();
|
||||
|
||||
var siteSurveryConfig = _trialSiteSurveyRepository.Where(t => t.Id == trialSiteSurveyId).Select(t => t.Trial.SiteSurveyConfigJsonStr).FirstOrDefault()??string.Empty;
|
||||
var siteSurveryConfig = _trialSiteSurveyRepository.Where(t => t.Id == trialSiteSurveyId).Select(t => t.Trial.TrialExtraConfigJsonStr).FirstOrDefault()??string.Empty;
|
||||
|
||||
result.SiteSurveyFiledConfig = JsonConvert.DeserializeObject<SiteSurveyFiledConfig>(siteSurveryConfig) ?? new SiteSurveyFiledConfig();
|
||||
result.SiteSurveyFiledConfig = JsonConvert.DeserializeObject<TrialExtraConfig>(siteSurveryConfig) ?? new TrialExtraConfig();
|
||||
return result;
|
||||
}
|
||||
|
||||
|
|
|
@ -21,6 +21,7 @@ using DocumentFormat.OpenXml.Office.CustomUI;
|
|||
using IRaCIS.Core.Domain.Models;
|
||||
using IRaCIS.Application.Contracts;
|
||||
using SixLabors.ImageSharp.Formats.Tiff.Compression.Decompressors;
|
||||
using Newtonsoft.Json;
|
||||
|
||||
namespace IRaCIS.Core.Application
|
||||
{
|
||||
|
@ -1373,5 +1374,12 @@ namespace IRaCIS.Core.Application
|
|||
return ResponseOutput.Ok(cro.Id.ToString(), ApiResponseCodeEnum.NeedTips);
|
||||
|
||||
}
|
||||
|
||||
public async Task<TrialExtraConfig> GetTrialExtralConfig(Guid trialId)
|
||||
{
|
||||
var extralConfig = _trialRepository.Where(t => t.Id == trialId).Select(t => t.TrialExtraConfigJsonStr).FirstOrDefault() ?? string.Empty;
|
||||
|
||||
return JsonConvert.DeserializeObject<TrialExtraConfig>(extralConfig) ?? new TrialExtraConfig();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -41,11 +41,26 @@ namespace IRaCIS.Core.Domain.Share
|
|||
|
||||
}
|
||||
|
||||
public class SiteSurveyFiledConfig
|
||||
public class TrialExtraConfig
|
||||
{
|
||||
public List<string> NotShowFieldList { get; set; }=new List<string>();
|
||||
#region MyRegion
|
||||
|
||||
//QC质控
|
||||
public bool IsSupportQCDownloadImage { get; set; } = false;
|
||||
|
||||
#endregion
|
||||
|
||||
|
||||
|
||||
#region 中心调研
|
||||
|
||||
public List<string> NotShowFieldList { get; set; } = new List<string>();
|
||||
|
||||
public List<SiteSurveyModifyFiled> ModifyFiledList { get; set; } = new List<SiteSurveyModifyFiled>();
|
||||
|
||||
#endregion
|
||||
|
||||
|
||||
public List<SiteSurveyModifyFiled> ModifyFiledList { get; set; }=new List<SiteSurveyModifyFiled>();
|
||||
|
||||
}
|
||||
|
||||
|
|
|
@ -182,9 +182,8 @@ namespace IRaCIS.Core.Domain.Models
|
|||
|
||||
|
||||
|
||||
//public List<SiteSurveyFiledConfig>
|
||||
|
||||
public string SiteSurveyConfigJsonStr { get; set; } = string.Empty;
|
||||
public string TrialExtraConfigJsonStr { get; set; } = string.Empty;
|
||||
|
||||
public bool VisitPlanConfirmed { get; set; }
|
||||
|
||||
|
|
|
@ -248,6 +248,10 @@ namespace IRaCIS.Core.Domain.Models
|
|||
public string VisitImageZipPath { get; set; } = string.Empty;
|
||||
|
||||
public PackState PackState { get; set; }
|
||||
|
||||
public PackState NoDicomPackState { get; set; }
|
||||
|
||||
public string VisitNoDicomImageZipPath { get; set;} = string.Empty;
|
||||
}
|
||||
/// <summary>
|
||||
/// 影像下载打包状态
|
||||
|
|
Loading…
Reference in New Issue