接口撤回
continuous-integration/drone/push Build is passing Details

Test_HIR_Net8
hang 2025-12-23 13:10:35 +08:00
parent 9c3e72b1bb
commit fb33acd827
5 changed files with 188 additions and 151 deletions

View File

@ -490,25 +490,9 @@ namespace IRaCIS.Core.SCP.Service
uint botOffset = 0; uint botOffset = 0;
//需要拆成固定片段的
if (syntax.IsEncapsulated && fragmentCount == pixelData.NumberOfFrames) if (syntax.IsEncapsulated && fragmentCount == pixelData.NumberOfFrames)
{ {
//// ① 先复制 Dataset非常关键
//var newDataset = dicomFile.Dataset.Clone();
//// ② 从“旧 dataset”读 PixelData
//var srcPd = DicomPixelData.Create(dicomFile.Dataset);
//// ③ 在“新 dataset”中创建新的 PixelData
//var dstPd = DicomPixelData.Create(newDataset, true);
//// ④ 重建 PixelData自动 BOT
//for (int i = 0; i < srcPd.NumberOfFrames; i++)
//{
// var frame = srcPd.GetFrame(i);
// dstPd.AddFrame(frame);
//}
var newFragments = new DicomOtherByteFragment(DicomTag.PixelData); var newFragments = new DicomOtherByteFragment(DicomTag.PixelData);
for (int n = 0; n < pixelData.NumberOfFrames; n++) for (int n = 0; n < pixelData.NumberOfFrames; n++)
@ -555,9 +539,57 @@ namespace IRaCIS.Core.SCP.Service
ms.SetLength(0); ms.SetLength(0);
dicomFile.Save(ms); dicomFile.Save(ms);
} }
//传递过来的就是拆分的,但是是没有偏移表的,我需要自己创建偏移表,不然生成缩略图失败
else if (syntax.IsEncapsulated && fragmentCount > pixelData.NumberOfFrames && originOffsetTable.Count==0)
{
uint offset = 0;
bot.Add(offset);
var fistSize = frag.Fragments.FirstOrDefault()?.Size??0;
//和上一个大小不一样
var isDiffrentBefore = false;
// 假设你知道每帧对应的 fragment 数量
foreach (var frameFragments in frag.Fragments)
{
if(frameFragments.Size== fistSize)
{
isDiffrentBefore = false;
// 累加这一帧所有 fragment 的大小
offset += (uint)frameFragments.Size;
continue;
}
else
{
offset += (uint)frameFragments.Size;
isDiffrentBefore = true;
}
if (isDiffrentBefore)
{
bot.Add(offset);
}
}
bot.RemoveAt(bot.Count - 1);
// 设置到新的 PixelData
frag.OffsetTable.AddRange(bot.ToArray());
// 重新保存 DICOM 到流
ms.SetLength(0);
dicomFile.Save(ms);
}
ms.Position = 0;
#endregion #endregion
@ -573,21 +605,11 @@ namespace IRaCIS.Core.SCP.Service
#endregion #endregion
ms.Position = 0;
//irc 从路径最后一截取Guid //irc 从路径最后一截取Guid
storeRelativePath = await ossService.UploadToOSSAsync(ms, ossFolderPath, instanceId.ToString(), false); storeRelativePath = await ossService.UploadToOSSAsync(ms, ossFolderPath, instanceId.ToString(), false);
fileSize = ms.Length; fileSize = ms.Length;
}
Log.Logger.Information($"CallingAE:{Association.CallingAE} CalledAE:{Association.CalledAE} {request.SOPInstanceUID} 上传完成 ");
}
catch (Exception ec)
{
Log.Logger.Warning($"CallingAE:{Association.CallingAE} CalledAE:{Association.CalledAE} 上传异常 {ec.Message}");
}
var @lock = _distributedLockProvider.CreateLock($"{studyInstanceUid}"); var @lock = _distributedLockProvider.CreateLock($"{studyInstanceUid}");
@ -596,7 +618,7 @@ namespace IRaCIS.Core.SCP.Service
{ {
try try
{ {
var scpStudyId = await dicomArchiveService.ArchiveDicomFileAsync(request.File, storeRelativePath, Association.CallingAE, Association.CalledAE, fileSize); var scpStudyId = await dicomArchiveService.ArchiveDicomFileAsync(dicomFile, storeRelativePath, Association.CallingAE, Association.CalledAE, fileSize);
var series = await _seriesRepository.FirstOrDefaultAsync(t => t.Id == seriesId); var series = await _seriesRepository.FirstOrDefaultAsync(t => t.Id == seriesId);
@ -607,7 +629,7 @@ namespace IRaCIS.Core.SCP.Service
// 生成缩略图 // 生成缩略图
using (var memoryStream = new MemoryStream()) using (var memoryStream = new MemoryStream())
{ {
DicomImage image = new DicomImage(request.Dataset); DicomImage image = new DicomImage(dicomFile.Dataset);
var sharpimage = image.RenderImage().AsSharpImage(); var sharpimage = image.RenderImage().AsSharpImage();
sharpimage.Save(memoryStream, new JpegEncoder()); sharpimage.Save(memoryStream, new JpegEncoder());
@ -702,10 +724,22 @@ namespace IRaCIS.Core.SCP.Service
//监控信息设置 //监控信息设置
_upload.FileCount++; _upload.FileCount++;
_upload.FileSize = _upload.FileSize + fileSize; _upload.FileSize = _upload.FileSize + fileSize;
return new DicomCStoreResponse(request, DicomStatus.Success);
} }
} }
Log.Logger.Information($"CallingAE:{Association.CallingAE} CalledAE:{Association.CalledAE} {request.SOPInstanceUID} 上传完成 ");
}
catch (Exception ec)
{
Log.Logger.Warning($"CallingAE:{Association.CallingAE} CalledAE:{Association.CalledAE} 上传异常 {ec.Message}");
}
return new DicomCStoreResponse(request, DicomStatus.Success);
}
public Task OnCStoreRequestExceptionAsync(string tempFileName, Exception e) public Task OnCStoreRequestExceptionAsync(string tempFileName, Exception e)
{ {

View File

@ -315,7 +315,7 @@ namespace IRaCIS.Core.SCP.Service
SliceLocation = dataset.GetSingleValueOrDefault(DicomTag.SliceLocation, 0), SliceLocation = dataset.GetSingleValueOrDefault(DicomTag.SliceLocation, 0),
SliceThickness = dataset.GetSingleValueOrDefault(DicomTag.SliceThickness, string.Empty), SliceThickness = dataset.GetSingleValueOrDefault(DicomTag.SliceThickness, string.Empty),
NumberOfFrames = dataset.GetSingleValueOrDefault(DicomTag.NumberOfFrames, 0), NumberOfFrames = dataset.GetSingleValueOrDefault(DicomTag.NumberOfFrames, 1),
PixelSpacing = dataset.GetSingleValueOrDefault(DicomTag.PixelSpacing, string.Empty), PixelSpacing = dataset.GetSingleValueOrDefault(DicomTag.PixelSpacing, string.Empty),
ImagerPixelSpacing = dataset.GetSingleValueOrDefault(DicomTag.ImagerPixelSpacing, string.Empty), ImagerPixelSpacing = dataset.GetSingleValueOrDefault(DicomTag.ImagerPixelSpacing, string.Empty),
FrameOfReferenceUID = dataset.GetSingleValueOrDefault(DicomTag.FrameOfReferenceUID, string.Empty), FrameOfReferenceUID = dataset.GetSingleValueOrDefault(DicomTag.FrameOfReferenceUID, string.Empty),

View File

@ -894,10 +894,10 @@ namespace IRaCIS.Core.API.Controllers
#endregion #endregion
[HttpGet("download/PatientStudyBatchDownload")] [HttpPost("download/PatientStudyBatchDownload")]
public async Task<IActionResult> DownloadPatientStudyBatch([FromServices] IPatientService _patientService, [FromServices] IOSSService _oSSService, public async Task<IActionResult> DownloadPatientStudyBatch([FromServices] IPatientService _patientService, [FromServices] IOSSService _oSSService,
[FromServices] IHubContext<DownloadHub, IDownloadClient> _downLoadHub, [FromServices] IHubContext<DownloadHub, IDownloadClient> _downLoadHub,
[FromQuery] PatientImageDownloadCommand inCommand) PatientImageDownloadCommand inCommand)
{ {
inCommand.SCPStudyIdList = inCommand.SCPStudyIdList.Where(t => t != Guid.Empty).ToList(); inCommand.SCPStudyIdList = inCommand.SCPStudyIdList.Where(t => t != Guid.Empty).ToList();
var rusult = await _patientService.GetDownloadPatientStudyInfo(inCommand); var rusult = await _patientService.GetDownloadPatientStudyInfo(inCommand);

View File

@ -291,6 +291,8 @@ namespace IRaCIS.Application.Contracts
public List<PatientTagView> ViewPatientHospitalGroupTagList => PatientHospitalGroupTagList.Where(t => CurrentUserHospitalGroupList.Contains(t.HospitalGroupName)).ToList(); public List<PatientTagView> ViewPatientHospitalGroupTagList => PatientHospitalGroupTagList.Where(t => CurrentUserHospitalGroupList.Contains(t.HospitalGroupName)).ToList();
//public long? FileSize { get; set; }
} }
public class PatientTagView public class PatientTagView

View File

@ -776,8 +776,9 @@ namespace IRaCIS.Application.Services
StudyHospitalGroupList = patient.SCPStudyList.SelectMany(t => t.HospitalGroupList).Select(t => t.HospitalGroup.Name).Distinct().ToList(), StudyHospitalGroupList = patient.SCPStudyList.SelectMany(t => t.HospitalGroupList).Select(t => t.HospitalGroup.Name).Distinct().ToList(),
PatientHospitalGroupTagList = patient.PatientHospitalGroupTagList PatientHospitalGroupTagList = patient.PatientHospitalGroupTagList
.Select(t => new PatientTagView() { HospitalGroupName = t.HospitalGroupTag.HospitalGroup.Name, HospitalGroupTagName = t.HospitalGroupTag.Name }).ToList() .Select(t => new PatientTagView() { HospitalGroupName = t.HospitalGroupTag.HospitalGroup.Name, HospitalGroupTagName = t.HospitalGroupTag.Name }).ToList(),
//FileSize = patient.SCPStudyList.Where(t => isAdminOrOA ? true : t.HospitalGroupList.Any(c => currentUserHospitalGroupIdList.Contains(c.HospitalGroupId))).SelectMany(t => t.InstanceList).Sum(t => t.FileSize)
}; };
@ -3387,8 +3388,8 @@ namespace IRaCIS.Application.Services
var query = _patientRepository.Where(t => patientIdList.Contains(t.Id)).Select(t => new DownloadPatientDto() var query = _patientRepository.Where(t => patientIdList.Contains(t.Id)).Select(t => new DownloadPatientDto()
{ {
PatientName= t.PatientName, PatientName = t.PatientName,
PatientIdStr= t.PatientIdStr, PatientIdStr = t.PatientIdStr,
StudyList = t.SCPStudyList.Where(t => studyIdList.Count > 0 ? studyIdList.Contains(t.Id) : true) StudyList = t.SCPStudyList.Where(t => studyIdList.Count > 0 ? studyIdList.Contains(t.Id) : true)
.Where(t => isAdminOrOA ? true : t.HospitalGroupList.Any(c => currentUserHospitalGroupIdList.Contains(c.HospitalGroupId))) .Where(t => isAdminOrOA ? true : t.HospitalGroupList.Any(c => currentUserHospitalGroupIdList.Contains(c.HospitalGroupId)))
@ -3443,7 +3444,7 @@ namespace IRaCIS.Application.Services
Id = NewId.NextSequentialGuid(), Id = NewId.NextSequentialGuid(),
IP = _userInfo.IP, IP = _userInfo.IP,
DownloadStartTime = DateTime.Now, DownloadStartTime = DateTime.Now,
StudyCount= patientList.SelectMany(t => t.StudyList).Count(), StudyCount = patientList.SelectMany(t => t.StudyList).Count(),
ImageCount = patientList.SelectMany(t => t.StudyList).Sum(s => s.SeriesList.Sum(s => s.InstanceList.Count())), ImageCount = patientList.SelectMany(t => t.StudyList).Sum(s => s.SeriesList.Sum(s => s.InstanceList.Count())),
ImageSize = patientList.SelectMany(t => t.StudyList).Sum(t => t.SeriesList.Sum(s => s.InstanceList.Sum(i => i.FileSize))) ?? 0 ImageSize = patientList.SelectMany(t => t.StudyList).Sum(t => t.SeriesList.Sum(s => s.InstanceList.Sum(i => i.FileSize))) ?? 0
}; };
@ -3460,7 +3461,7 @@ namespace IRaCIS.Application.Services
/// 获取下载的访视检查信息 /// 获取下载的访视检查信息
/// </summary> /// </summary>
/// <returns></returns> /// <returns></returns>
public async Task<IResponseOutput<List<DownloadVisitDto> >> GetDownloadSubjectVisitStudyInfo(VisitImageDownloadCommand inCommand) public async Task<IResponseOutput<List<DownloadVisitDto>>> GetDownloadSubjectVisitStudyInfo(VisitImageDownloadCommand inCommand)
{ {
var dirDic = new Dictionary<string, string>(); var dirDic = new Dictionary<string, string>();
@ -3468,15 +3469,15 @@ namespace IRaCIS.Application.Services
#region DIR处理导出文件名并将对应关系上传到OSS里面存储 #region DIR处理导出文件名并将对应关系上传到OSS里面存储
//有传输语法值的导出 才生成DIR //有传输语法值的导出 才生成DIR
if (_subjectVisitRepository.Where(t => inCommand.SubjectVisitIdList.Contains(t.Id) ).SelectMany(t => t.StudyList.SelectMany(t => t.InstanceList)).All(c => c.TransferSyntaxUID != string.Empty)) if (_subjectVisitRepository.Where(t => inCommand.SubjectVisitIdList.Contains(t.Id)).SelectMany(t => t.StudyList.SelectMany(t => t.InstanceList)).All(c => c.TransferSyntaxUID != string.Empty))
{ {
var list = _subjectVisitRepository.Where(t => inCommand.SubjectVisitIdList.Contains(t.Id)).SelectMany(t => t.StudyList) var list = _subjectVisitRepository.Where(t => inCommand.SubjectVisitIdList.Contains(t.Id)).SelectMany(t => t.StudyList)
.SelectMany(t => t.InstanceList) .SelectMany(t => t.InstanceList)
.Select(t => new StudyDIRInfo() .Select(t => new StudyDIRInfo()
{ {
SubjectId=t.SubjectId, SubjectId = t.SubjectId,
TrialId=t.TrialId, TrialId = t.TrialId,
SubjectVisitId=t.SubjectVisitId, SubjectVisitId = t.SubjectVisitId,
DicomStudyId = t.DicomStudy.Id, DicomStudyId = t.DicomStudy.Id,
PatientId = t.DicomStudy.PatientId, PatientId = t.DicomStudy.PatientId,
@ -3511,7 +3512,7 @@ namespace IRaCIS.Application.Services
//var pathInfoList = await _subjectVisitRepository.Where(t => inCommand.SubjectVisitIdList.Contains(t.Id)).Select(t => new { t.TrialId, t.SubjectId, VisitId = t.Id }).ToListAsync(); //var pathInfoList = await _subjectVisitRepository.Where(t => inCommand.SubjectVisitIdList.Contains(t.Id)).Select(t => new { t.TrialId, t.SubjectId, VisitId = t.Id }).ToListAsync();
foreach (var item in list.GroupBy(t => new { t.StudyInstanceUid, t.DicomStudyId,t.SubjectVisitId,t.TrialId,t.SubjectId })) foreach (var item in list.GroupBy(t => new { t.StudyInstanceUid, t.DicomStudyId, t.SubjectVisitId, t.TrialId, t.SubjectId }))
{ {
var ossFolder = $"{item.Key.TrialId}/Image/{item.Key.SubjectId}/{item.Key.SubjectVisitId}/{item.Key.StudyInstanceUid}"; var ossFolder = $"{item.Key.TrialId}/Image/{item.Key.SubjectId}/{item.Key.SubjectVisitId}/{item.Key.StudyInstanceUid}";
@ -3569,7 +3570,7 @@ namespace IRaCIS.Application.Services
var visitList = await query.ToListAsync(); var visitList = await query.ToListAsync();
foreach (var item in visitList.SelectMany(t=>t.StudyList).SelectMany(t => t.SeriesList).SelectMany(t => t.InstanceList)) foreach (var item in visitList.SelectMany(t => t.StudyList).SelectMany(t => t.SeriesList).SelectMany(t => t.InstanceList))
{ {
var key = item.InstanceId.ToString(); var key = item.InstanceId.ToString();
if (dirDic.ContainsKey(key)) if (dirDic.ContainsKey(key))
@ -3609,7 +3610,7 @@ namespace IRaCIS.Application.Services
[HttpGet] [HttpGet]
public async Task<IResponseOutput> DownloadImageSuccess(Guid trialImageDownloadId) public async Task<IResponseOutput> DownloadImageSuccess(Guid trialImageDownloadId)
{ {
await _subejctVisitDownloadRepository.UpdatePartialFromQueryAsync( trialImageDownloadId, u => new SubejctVisitDownload() await _subejctVisitDownloadRepository.UpdatePartialFromQueryAsync(trialImageDownloadId, u => new SubejctVisitDownload()
{ DownloadEndTime = DateTime.Now, IsSuccess = true }, true); { DownloadEndTime = DateTime.Now, IsSuccess = true }, true);
return ResponseOutput.Ok(); return ResponseOutput.Ok();
} }