增加客户端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,20 +2945,27 @@ 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)
{
//var time= response.Dataset?.GetSingleValueOrDefault<string?>(DicomTag.StudyTime, "")
using (@lock.Acquire())
{
if (result.Count == maxStudyCount)
{
response.Status = DicomStatus.Cancel;
}
var studyTime = response.Dataset.GetDateTime(DicomTag.StudyDate, DicomTag.StudyTime);
@ -2978,24 +2992,33 @@ namespace IRaCIS.Application.Services
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);
//看当前前端有没有传递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);
}
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>();