影响下载修改
continuous-integration/drone/push Build is passing
Details
continuous-integration/drone/push Build is passing
Details
parent
6ca1e81b6a
commit
0af3c5ab8b
|
@ -18204,15 +18204,6 @@
|
||||||
<param name="inQuery"></param>
|
<param name="inQuery"></param>
|
||||||
<returns></returns>
|
<returns></returns>
|
||||||
</member>
|
</member>
|
||||||
<member name="M:IRaCIS.Application.Services.PatientService.RequestPackageAndAnonymizImage(System.Guid,System.Guid,IRaCIS.Core.Application.Helper.IOSSService,System.Boolean)">
|
|
||||||
<summary>
|
|
||||||
打包和匿名化影像 默认是匿名化打包,也可以不匿名化打包
|
|
||||||
</summary>
|
|
||||||
<param name="trialId"></param>
|
|
||||||
<param name="subjectVisitId"></param>
|
|
||||||
<param name="isAnonymize"></param>
|
|
||||||
<returns></returns>
|
|
||||||
</member>
|
|
||||||
<member name="M:IRaCIS.Application.Services.PatientService.GetDownloadSubjectVisitStudyInfo(System.Guid,System.Guid)">
|
<member name="M:IRaCIS.Application.Services.PatientService.GetDownloadSubjectVisitStudyInfo(System.Guid,System.Guid)">
|
||||||
<summary>
|
<summary>
|
||||||
获取下载的访视检查信息
|
获取下载的访视检查信息
|
||||||
|
|
|
@ -108,6 +108,9 @@ namespace IRaCIS.Core.Application.ViewModel
|
||||||
|
|
||||||
public class VisitTaskViewBasic
|
public class VisitTaskViewBasic
|
||||||
{
|
{
|
||||||
|
|
||||||
|
public Guid? SourceSubjectVisitId { get; set; }
|
||||||
|
|
||||||
public string SubjectShortName { get; set; }
|
public string SubjectShortName { get; set; }
|
||||||
|
|
||||||
public Guid Id { get; set; }
|
public Guid Id { get; set; }
|
||||||
|
|
|
@ -922,14 +922,13 @@ namespace IRaCIS.Application.Contracts
|
||||||
|
|
||||||
public string IP { get; set; }
|
public string IP { get; set; }
|
||||||
|
|
||||||
public long VisitImageZipSize { get; set; }
|
public bool IsSuccess { get; set; }
|
||||||
|
|
||||||
//文件大小
|
public DateTime DownloadStartTime { get; set; }
|
||||||
public int VisitImageFileCount { get; set; }
|
public DateTime? DownloadEndTime { get; set; }
|
||||||
|
|
||||||
public string VisitImageZipPath { get; set; } = string.Empty;
|
public int ImageCount { get; set; }
|
||||||
|
public long ImageSize { get; set; }
|
||||||
public int? StudyCount { get; set; }
|
|
||||||
|
|
||||||
public UserTypeEnum UserTypeEnum { get; set; }
|
public UserTypeEnum UserTypeEnum { get; set; }
|
||||||
|
|
||||||
|
|
|
@ -2215,9 +2215,7 @@ namespace IRaCIS.Application.Services
|
||||||
VisitNum = t.VisitNum,
|
VisitNum = t.VisitNum,
|
||||||
VisitName = t.VisitName,
|
VisitName = t.VisitName,
|
||||||
VisitEarliestStudyTime = t.SCPStudySubjectVisitList.Min(t => t.SCPStudy.StudyTime),
|
VisitEarliestStudyTime = t.SCPStudySubjectVisitList.Min(t => t.SCPStudy.StudyTime),
|
||||||
VisitLatestStudyTime = t.SCPStudySubjectVisitList.Max(t => t.SCPStudy.StudyTime),
|
VisitLatestStudyTime = t.SCPStudySubjectVisitList.Max(t => t.SCPStudy.StudyTime)
|
||||||
VisitImageZipPath = t.VisitImageZipPath,
|
|
||||||
PackState = t.PackState,
|
|
||||||
});
|
});
|
||||||
|
|
||||||
var defalutSortArray = new string[] { nameof(PatientSubjectVisitView.SubjectId), nameof(PatientSubjectVisitView.VisitNum) };
|
var defalutSortArray = new string[] { nameof(PatientSubjectVisitView.SubjectId), nameof(PatientSubjectVisitView.VisitNum) };
|
||||||
|
@ -2707,40 +2705,7 @@ namespace IRaCIS.Application.Services
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 打包和匿名化影像 默认是匿名化打包,也可以不匿名化打包
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="trialId"></param>
|
|
||||||
/// <param name="subjectVisitId"></param>
|
|
||||||
/// <param name="isAnonymize"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
|
|
||||||
public async Task<IResponseOutput> RequestPackageAndAnonymizImage(Guid trialId, Guid subjectVisitId, [FromServices] IOSSService _oSSService, bool isAnonymize = true)
|
|
||||||
{
|
|
||||||
var subjectVisit = await _subjectVisitRepository.FirstOrDefaultAsync(t => t.Id == subjectVisitId);
|
|
||||||
|
|
||||||
if (subjectVisit.PackState == PackState.WaitPack)
|
|
||||||
{
|
|
||||||
HangfireJobHelper.NotImmediatelyOnceOnlyJob<IDownloadAndUploadService>(t => t.RequestPackageAndAnonymizImage(trialId, subjectVisitId, isAnonymize), TimeSpan.FromSeconds(1));
|
|
||||||
|
|
||||||
subjectVisit.PackState = PackState.Packing;
|
|
||||||
|
|
||||||
await _subjectVisitRepository.SaveChangesAsync();
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
var zipPath = subjectVisit.VisitImageZipPath;
|
|
||||||
|
|
||||||
if (!string.IsNullOrEmpty(zipPath))
|
|
||||||
{
|
|
||||||
//记录下载的记录
|
|
||||||
|
|
||||||
await _subejctVisitDownloadRepository.AddAsync(new SubejctVisitDownload() { IP = _userInfo.IP, SubjectVisitId = subjectVisitId }, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
return ResponseOutput.Ok(zipPath);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 获取下载的访视检查信息
|
/// 获取下载的访视检查信息
|
||||||
|
@ -2869,191 +2834,4 @@ namespace IRaCIS.Application.Services
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public interface IDownloadAndUploadService
|
|
||||||
{
|
|
||||||
Task RequestPackageAndAnonymizImage(Guid trialId, Guid subjectVisitId, bool isAnonymize = true);
|
|
||||||
}
|
|
||||||
[ApiExplorerSettings(GroupName = "Trial")]
|
|
||||||
public class DownloadAndUploadService : BaseService, IDownloadAndUploadService
|
|
||||||
{
|
|
||||||
|
|
||||||
private readonly IRepository<SystemAnonymization> _systemAnonymizationRepository;
|
|
||||||
private readonly IRepository<SubjectVisit> _subjectVisitRepository;
|
|
||||||
private readonly IOSSService _oSSService;
|
|
||||||
public DownloadAndUploadService(IRepository<SystemAnonymization> systemAnonymizationRepository, IRepository<SubjectVisit> subjectVisitRepository, IOSSService oSSService)
|
|
||||||
{
|
|
||||||
_systemAnonymizationRepository = systemAnonymizationRepository;
|
|
||||||
|
|
||||||
_subjectVisitRepository = subjectVisitRepository;
|
|
||||||
|
|
||||||
_oSSService = oSSService;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public async Task RequestPackageAndAnonymizImage(Guid trialId, Guid subjectVisitId, bool isAnonymize = true)
|
|
||||||
{
|
|
||||||
|
|
||||||
var subjectVisit = await _subjectVisitRepository.FirstOrDefaultAsync(t => t.Id == subjectVisitId);
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
var addOrUpdateFixedFieldList = new List<SystemAnonymization>();
|
|
||||||
|
|
||||||
var ircFieldList = new List<SystemAnonymization>();
|
|
||||||
|
|
||||||
if (isAnonymize)
|
|
||||||
{
|
|
||||||
var systemAnonymizationList = _systemAnonymizationRepository.Where(t => t.IsEnable).ToList();
|
|
||||||
|
|
||||||
addOrUpdateFixedFieldList = systemAnonymizationList.Where(t => t.IsFixed).ToList();
|
|
||||||
|
|
||||||
ircFieldList = systemAnonymizationList.Where(t => t.IsFixed == false).ToList();
|
|
||||||
}
|
|
||||||
|
|
||||||
var subjectAndVisitInfo = _subjectVisitRepository.Where(t => t.Id == subjectVisitId).Select(t => new { SubjectCode = t.Subject.Code, t.Trial.TrialCode, t.VisitNum }).FirstOrDefault();
|
|
||||||
|
|
||||||
var query = from sv in _subjectVisitRepository.Where(t => t.Id == subjectVisitId)
|
|
||||||
|
|
||||||
select new
|
|
||||||
{
|
|
||||||
SubjectCode = sv.Subject.Code,
|
|
||||||
VisitName = sv.VisitName,
|
|
||||||
StudyList = sv.StudyList.Select(u => new
|
|
||||||
{
|
|
||||||
u.PatientIdStr,
|
|
||||||
u.StudyTime,
|
|
||||||
u.StudyCode,
|
|
||||||
|
|
||||||
SeriesList = u.SeriesList.Select(z => new
|
|
||||||
{
|
|
||||||
z.Modality,
|
|
||||||
|
|
||||||
InstancePathList = z.DicomInstanceList.Select(k => new
|
|
||||||
{
|
|
||||||
k.Path
|
|
||||||
})
|
|
||||||
})
|
|
||||||
|
|
||||||
})
|
|
||||||
};
|
|
||||||
|
|
||||||
var info = query.FirstOrDefault();
|
|
||||||
|
|
||||||
if (info != null)
|
|
||||||
{
|
|
||||||
// 创建一个临时文件夹来存放文件
|
|
||||||
string tempFolderPath = Path.Combine(Directory.GetCurrentDirectory(), $"DownloadTemp_{NewId.NextGuid()}");
|
|
||||||
Directory.CreateDirectory(tempFolderPath);
|
|
||||||
|
|
||||||
// 遍历查询结果
|
|
||||||
foreach (var studyInfo in info.StudyList)
|
|
||||||
{
|
|
||||||
// 遍历 Series
|
|
||||||
foreach (var seriesInfo in studyInfo.SeriesList)
|
|
||||||
{
|
|
||||||
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)
|
|
||||||
{
|
|
||||||
// 复制文件到相应的文件夹
|
|
||||||
string destinationPath = Path.Combine(studyFolderPath, Path.GetFileName(instanceInfo.Path));
|
|
||||||
|
|
||||||
//下载到当前目录
|
|
||||||
await _oSSService.DownLoadFromOSSAsync(instanceInfo.Path, destinationPath);
|
|
||||||
|
|
||||||
#region 匿名化逻辑
|
|
||||||
|
|
||||||
|
|
||||||
if (isAnonymize)
|
|
||||||
{
|
|
||||||
DicomFile dicomFile = await DicomFile.OpenAsync(destinationPath, Encoding.Default);
|
|
||||||
|
|
||||||
DicomDataset dataset = dicomFile.Dataset;
|
|
||||||
|
|
||||||
foreach (var item in addOrUpdateFixedFieldList)
|
|
||||||
{
|
|
||||||
|
|
||||||
var dicomTag = new DicomTag(Convert.ToUInt16(item.Group, 16), Convert.ToUInt16(item.Element, 16));
|
|
||||||
|
|
||||||
dataset.AddOrUpdate(dicomTag, item.ReplaceValue);
|
|
||||||
}
|
|
||||||
|
|
||||||
foreach (var item in ircFieldList)
|
|
||||||
{
|
|
||||||
|
|
||||||
var dicomTag = new DicomTag(Convert.ToUInt16(item.Group, 16), Convert.ToUInt16(item.Element, 16));
|
|
||||||
|
|
||||||
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
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
var zipPath = Path.Combine(Directory.GetCurrentDirectory(), $"{info.SubjectCode}_{info.VisitName}_ImageStudy.zip");
|
|
||||||
|
|
||||||
ZipFile.CreateFromDirectory(tempFolderPath, zipPath);
|
|
||||||
|
|
||||||
//上传到Oss
|
|
||||||
var relativePath = await _oSSService.UploadToOSSAsync(zipPath, $"download_zip/{subjectVisitId}", false);
|
|
||||||
|
|
||||||
|
|
||||||
//subjectVisit.PackState = PackState.Packed;
|
|
||||||
//subjectVisit.VisitImageZipPath = relativePath;
|
|
||||||
//await _subjectVisitRepository.SaveChangesAsync();
|
|
||||||
|
|
||||||
var zipSize = File.OpenRead(zipPath).Length;
|
|
||||||
var fileCount = info.StudyList.SelectMany(t => t.SeriesList).SelectMany(t => t.InstancePathList).Count();
|
|
||||||
await _subjectVisitRepository.BatchUpdateNoTrackingAsync(t => t.Id == subjectVisitId, u => new SubjectVisit() { PackState = PackState.Packed, VisitImageZipPath = relativePath, VisitImageFileCount = fileCount, VisitImageZipSize = zipSize });
|
|
||||||
|
|
||||||
|
|
||||||
//清理文件夹
|
|
||||||
Directory.Delete(tempFolderPath, true);
|
|
||||||
File.Delete(zipPath);
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
await _subjectVisitRepository.BatchUpdateNoTrackingAsync(t => t.Id == subjectVisitId, u => new SubjectVisit() { PackState = PackState.WaitPack });
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -25,9 +25,6 @@ namespace IRaCIS.Core.Application.Service
|
||||||
CreateMap<SubejctVisitDownload, VisitImageDownloadView>()
|
CreateMap<SubejctVisitDownload, VisitImageDownloadView>()
|
||||||
.ForMember(d => d.SubjectCode, u => u.MapFrom(s => s.SubjectVisit.Subject.Code))
|
.ForMember(d => d.SubjectCode, u => u.MapFrom(s => s.SubjectVisit.Subject.Code))
|
||||||
.ForMember(d => d.VisitName, u => u.MapFrom(s => s.SubjectVisit.VisitName))
|
.ForMember(d => d.VisitName, u => u.MapFrom(s => s.SubjectVisit.VisitName))
|
||||||
.ForMember(d => d.VisitImageFileCount, u => u.MapFrom(s => s.SubjectVisit.VisitImageFileCount))
|
|
||||||
.ForMember(d => d.VisitImageZipPath, u => u.MapFrom(s => s.SubjectVisit.VisitImageZipPath))
|
|
||||||
.ForMember(d => d.VisitImageZipSize, u => u.MapFrom(s => s.SubjectVisit.VisitImageZipSize))
|
|
||||||
.ForMember(d => d.DownloadTime, u => u.MapFrom(s => s.CreateTime))
|
.ForMember(d => d.DownloadTime, u => u.MapFrom(s => s.CreateTime))
|
||||||
.ForMember(d => d.DownloadUserName, u => u.MapFrom(s => s.CreateUser.UserName))
|
.ForMember(d => d.DownloadUserName, u => u.MapFrom(s => s.CreateUser.UserName))
|
||||||
.ForMember(d => d.StudyCount, u => u.MapFrom(s => s.SubjectVisit.StudyList.Count()))
|
.ForMember(d => d.StudyCount, u => u.MapFrom(s => s.SubjectVisit.StudyList.Count()))
|
||||||
|
@ -173,9 +170,7 @@ namespace IRaCIS.Core.Application.Service
|
||||||
.ForMember(d => d.SubjectShortName, u => u.MapFrom(s => s.Subject.ShortName))
|
.ForMember(d => d.SubjectShortName, u => u.MapFrom(s => s.Subject.ShortName))
|
||||||
.ForMember(d => d.TrialReadingCriterionName, u => u.MapFrom(s => s.TrialReadingCriterion.CriterionName))
|
.ForMember(d => d.TrialReadingCriterionName, u => u.MapFrom(s => s.TrialReadingCriterion.CriterionName))
|
||||||
.ForMember(d => d.CriterionType, u => u.MapFrom(s => s.TrialReadingCriterion.CriterionType))
|
.ForMember(d => d.CriterionType, u => u.MapFrom(s => s.TrialReadingCriterion.CriterionType))
|
||||||
.ForMember(d => d.PatientList, u => u.MapFrom(s => s.Subject.SubjectPatientList))
|
.ForMember(d => d.PatientList, u => u.MapFrom(s => s.Subject.SubjectPatientList));
|
||||||
.ForMember(d => d.VisitImageZipPath, u => u.MapFrom(s => s.SourceSubjectVisit.VisitImageZipPath))
|
|
||||||
.ForMember(d => d.PackState, u => u.MapFrom(s => s.SourceSubjectVisit.PackState));
|
|
||||||
|
|
||||||
CreateMap<AddOrUpdateSubjectVisitCommand, SubjectVisit>().ReverseMap();
|
CreateMap<AddOrUpdateSubjectVisitCommand, SubjectVisit>().ReverseMap();
|
||||||
|
|
||||||
|
|
|
@ -184,17 +184,5 @@ public class SubjectVisit : BaseFullDeleteAuditEntity
|
||||||
public ReadingStatusEnum ReadingStatus { get; set; }
|
public ReadingStatusEnum ReadingStatus { get; set; }
|
||||||
|
|
||||||
|
|
||||||
#region HIR 废弃
|
|
||||||
//文件数
|
|
||||||
public long VisitImageZipSize { get; set; }
|
|
||||||
|
|
||||||
//文件大小
|
|
||||||
public int VisitImageFileCount { get; set; }
|
|
||||||
|
|
||||||
public string VisitImageZipPath { get; set; } = string.Empty;
|
|
||||||
|
|
||||||
//路径
|
|
||||||
public PackState PackState { get; set; }
|
|
||||||
#endregion
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue