增加客户端pacs ae 配置
continuous-integration/drone/push Build is passing Details

Test_HIR_Net8
hang 2024-12-18 11:30:19 +08:00
parent d568964c64
commit 355ca22134
2 changed files with 85 additions and 53 deletions

View File

@ -1008,6 +1008,8 @@ namespace IRaCIS.Application.Contracts
public Guid PatientId { get; set; }
public string AccessionNumber { get; set; }
public DateTime? StudyTime { get; set; }
public string Modalities { get; set; } = string.Empty;

View File

@ -46,9 +46,9 @@ using FellowOakDicom.Network;
using Microsoft.Extensions.Logging;
using DocumentFormat.OpenXml.Wordprocessing;
using System;
using Amazon.Runtime.Internal.Transform;
using static Microsoft.EntityFrameworkCore.DbLoggerCategory;
namespace IRaCIS.Application.Services
{
[ApiExplorerSettings(GroupName = "Trial")]
@ -685,6 +685,7 @@ namespace IRaCIS.Application.Services
InstanceCount = scpStudy.InstanceCount,
Modalities = scpStudy.Modalities,
PatientId = scpStudy.PatientId,
AccessionNumber = scpStudy.AccessionNumber,
SCPStudyId = scpStudy.Id,
SeriesCount = scpStudy.SeriesCount,
StudyTime = scpStudy.StudyTime,
@ -2827,7 +2828,7 @@ namespace IRaCIS.Application.Services
#region 基础方法
public static DicomCFindRequest CreateStudyRequest(SCUQuery inQuery, List<string> modalityList)
public static DicomCFindRequest CreateStudyRequest(SCUQuery inQuery, string modality/*, List<string> modalityList*/)
{
var request = new DicomCFindRequest(DicomQueryRetrieveLevel.Study);
@ -2862,7 +2863,7 @@ namespace IRaCIS.Application.Services
//request.Dataset.AddOrUpdate(DicomTag.PatientID, "Test*");
var modalityQuery = string.Join($"\\", (inQuery.ModalitiesInStudyList == null || inQuery.ModalitiesInStudyList?.Count == 0) ? modalityList : inQuery.ModalitiesInStudyList);
//var modalityQuery = string.Join($"\\", (inQuery.ModalitiesInStudyList == null || inQuery.ModalitiesInStudyList?.Count == 0) ? modalityList : inQuery.ModalitiesInStudyList);
//病例号
request.Dataset.AddOrUpdate(DicomTag.PatientID, inQuery.PatientID.IsNullOrEmpty() ? "" : inQuery.PatientID);
@ -2874,7 +2875,7 @@ namespace IRaCIS.Application.Services
request.Dataset.AddOrUpdate(DicomTag.StudyID, inQuery.StudyID.IsNullOrEmpty() ? "" : inQuery.StudyID);
request.Dataset.AddOrUpdate(DicomTag.AccessionNumber, inQuery.StudyID.IsNullOrEmpty() ? "" : inQuery.AccessionNumber);
//request.Dataset.AddOrUpdate(DicomTag.ModalitiesInStudy, modalityQuery);
request.Dataset.AddOrUpdate(DicomTag.ModalitiesInStudy, modality);
request.Dataset.AddOrUpdate(DicomTag.StudyDate, inQuery.StudyDate.IsNullOrEmpty() ? "" : inQuery.StudyDate);
request.Dataset.AddOrUpdate(DicomTag.StudyTime, inQuery.StudyTime.IsNullOrEmpty() ? "" : inQuery.StudyTime);
@ -2931,6 +2932,12 @@ namespace IRaCIS.Application.Services
var find = await _dicomAEReposiotry.FirstOrDefaultAsync(t => t.Id == inQuery.PacsDicomAEId);
var hirClient = await _dicomAEReposiotry.FirstOrDefaultAsync(t => t.PacsTypeEnum == PacsType.HIRClient);
if (hirClient == null)
{
throw new BusinessValidationFailedException(_localizer["Patient_NoPacsClientAE"]);
}
if (find != null)
{
@ -2938,64 +2945,80 @@ namespace IRaCIS.Application.Services
//var cts = new CancellationTokenSource();
//CancellationToken token = cts.Token;
var @lock = _distributedLockProvider.CreateLock($"CFind");
var maxStudyCount = find.MaxStudyCount > 0 ? find.MaxStudyCount : 50;
var client = DicomClientFactory.Create(find.IP, find.Port, false, "HIRSCUAE", find.CalledAE);
var client = DicomClientFactory.Create(find.IP, find.Port, false, hirClient.CalledAE, find.CalledAE);
client.NegotiateAsyncOps();
var request = CreateStudyRequest(inQuery, find.ModalityList);
request.OnResponseReceived += (req, response) =>
DicomCFindRequest.ResponseDelegate responseDelegate = (req, response) =>
{
if (response.HasDataset)
{
using (@lock.Acquire())
{
if (result.Count == maxStudyCount)
{
response.Status = DicomStatus.Cancel;
}
var studyTime = response.Dataset.GetDateTime(DicomTag.StudyDate, DicomTag.StudyTime);
DateOnly datePart = DateOnly.FromDateTime(studyTime);
TimeOnly timePart = TimeOnly.FromDateTime(studyTime);
DateTime? birthDate = DateTime.ParseExact(response.Dataset?.GetSingleValueOrDefault<string>(DicomTag.PatientBirthDate, ""), "yyyyMMdd", null);
// 格式化为你需要的日期格式例如yyyy-MM-dd
string formattedBirthDate = birthDate?.ToString("yyyy-MM-dd") ?? string.Empty;
result.Add(new SCUStudyView()
{
PatientID = response.Dataset?.GetSingleValueOrDefault<string>(DicomTag.PatientID, ""),
PatientName = response.Dataset?.GetSingleValueOrDefault<string>(DicomTag.PatientName, ""),
PatientSex = response.Dataset?.GetSingleValueOrDefault<string>(DicomTag.PatientSex, ""),
PatientBirthDate = formattedBirthDate,
StudyID = response.Dataset?.GetSingleValueOrDefault<string>(DicomTag.StudyID, ""),
AccessionNumber = response.Dataset?.GetSingleValueOrDefault<string>(DicomTag.AccessionNumber, ""),
ModalitiesInStudy = response.Dataset?.GetSingleValueOrDefault<string>(DicomTag.ModalitiesInStudy, ""),
StudyDate = datePart.ToString("yyyy-MM-dd"),
StudyTime = timePart.ToString("HH:mm:ss"),
BodyPartExamined = response.Dataset?.GetSingleValueOrDefault<string>(DicomTag.BodyPartExamined, ""),
StudyDescription = response.Dataset?.GetSingleValueOrDefault<string>(DicomTag.StudyDescription, ""),
StudyInstanceUID = response.Dataset?.GetSingleValueOrDefault<string>(DicomTag.StudyInstanceUID, "")
});
}
}
};
//看当前前端有没有传递modality有的话以前端为准没有的话以配置为准 构造同样数量的请求
var requestModalityList = (inQuery.ModalitiesInStudyList != null && inQuery.ModalitiesInStudyList.Count > 0) ? inQuery.ModalitiesInStudyList : find.ModalityList;
requestModalityList = requestModalityList.Count == 0 ? new List<string>() { "" } : requestModalityList;
requestModalityList = new List<string>() { "" };
var requestList = new List<DicomCFindRequest>();
foreach (var modality in requestModalityList)
{
var request = CreateStudyRequest(inQuery, modality);
request.OnResponseReceived += responseDelegate;
requestList.Add(request);
}
if (response.HasDataset)
{
//var time= response.Dataset?.GetSingleValueOrDefault<string?>(DicomTag.StudyTime, "")
var studyTime = response.Dataset.GetDateTime(DicomTag.StudyDate, DicomTag.StudyTime);
DateOnly datePart = DateOnly.FromDateTime(studyTime);
TimeOnly timePart = TimeOnly.FromDateTime(studyTime);
DateTime? birthDate = DateTime.ParseExact(response.Dataset?.GetSingleValueOrDefault<string>(DicomTag.PatientBirthDate, ""), "yyyyMMdd", null);
// 格式化为你需要的日期格式例如yyyy-MM-dd
string formattedBirthDate = birthDate?.ToString("yyyy-MM-dd") ?? string.Empty;
result.Add(new SCUStudyView()
{
PatientID = response.Dataset?.GetSingleValueOrDefault<string>(DicomTag.PatientID, ""),
PatientName = response.Dataset?.GetSingleValueOrDefault<string>(DicomTag.PatientName, ""),
PatientSex = response.Dataset?.GetSingleValueOrDefault<string>(DicomTag.PatientSex, ""),
PatientBirthDate = formattedBirthDate,
StudyID = response.Dataset?.GetSingleValueOrDefault<string>(DicomTag.StudyID, ""),
AccessionNumber = response.Dataset?.GetSingleValueOrDefault<string>(DicomTag.AccessionNumber, ""),
ModalitiesInStudy = response.Dataset?.GetSingleValueOrDefault<string>(DicomTag.ModalitiesInStudy, ""),
StudyDate = datePart.ToString("yyyy-MM-dd"),
StudyTime = timePart.ToString("HH:mm:ss"),
BodyPartExamined = response.Dataset?.GetSingleValueOrDefault<string>(DicomTag.BodyPartExamined, ""),
StudyDescription = response.Dataset?.GetSingleValueOrDefault<string>(DicomTag.StudyDescription, ""),
StudyInstanceUID = response.Dataset?.GetSingleValueOrDefault<string>(DicomTag.StudyInstanceUID, "")
});
if (result.Count == maxStudyCount)
{
response.Status = DicomStatus.Cancel;
}
}
};
await client.AddRequestAsync(request);
await client.AddRequestsAsync(requestList);
await client.SendAsync();
}
var resultInstanceUidList = result.Select(t => t.StudyInstanceUID).ToList();
@ -3049,18 +3072,25 @@ namespace IRaCIS.Application.Services
var hirServer = await _dicomAEReposiotry.FirstOrDefaultAsync(t => t.PacsTypeEnum == PacsType.HIRServer);
var hirClient = await _dicomAEReposiotry.FirstOrDefaultAsync(t => t.PacsTypeEnum == PacsType.HIRClient);
if (hirServer == null)
{
//"未找到服务端AE配置请核查后再拉取"
return ResponseOutput.NotOk(_localizer["Patient_NoPacsAE"]);
}
if (hirClient == null)
{
return ResponseOutput.NotOk(_localizer["Patient_NoPacsClientAE"]);
}
if (find != null)
{
var task = Task.Run(async () =>
{
var client = DicomClientFactory.Create(find.IP, find.Port, false, "HIRSCUAE", find.CalledAE);
var client = DicomClientFactory.Create(find.IP, find.Port, false, hirClient.CalledAE, find.CalledAE);
client.NegotiateAsyncOps();
var cmoveRequestList = new List<DicomCMoveRequest>();