影响下载修改
continuous-integration/drone/push Build is passing Details

Test_HIR_Net8
hang 2024-11-14 16:41:30 +08:00
parent 6ca1e81b6a
commit 0af3c5ab8b
6 changed files with 10 additions and 256 deletions

View File

@ -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>
获取下载的访视检查信息 获取下载的访视检查信息

View File

@ -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; }

View File

@ -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; }

View File

@ -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 });
}
}
}
} }

View File

@ -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();

View File

@ -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
} }