增加客户端pacs ae 配置
continuous-integration/drone/push Build is passing
Details
continuous-integration/drone/push Build is passing
Details
parent
d568964c64
commit
355ca22134
|
@ -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;
|
||||
|
||||
|
|
|
@ -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>();
|
||||
|
|
Loading…
Reference in New Issue