增加客户端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 Guid PatientId { get; set; }
|
||||||
|
|
||||||
|
public string AccessionNumber { get; set; }
|
||||||
|
|
||||||
public DateTime? StudyTime { get; set; }
|
public DateTime? StudyTime { get; set; }
|
||||||
public string Modalities { get; set; } = string.Empty;
|
public string Modalities { get; set; } = string.Empty;
|
||||||
|
|
||||||
|
|
|
@ -46,9 +46,9 @@ using FellowOakDicom.Network;
|
||||||
using Microsoft.Extensions.Logging;
|
using Microsoft.Extensions.Logging;
|
||||||
using DocumentFormat.OpenXml.Wordprocessing;
|
using DocumentFormat.OpenXml.Wordprocessing;
|
||||||
using System;
|
using System;
|
||||||
using Amazon.Runtime.Internal.Transform;
|
|
||||||
using static Microsoft.EntityFrameworkCore.DbLoggerCategory;
|
using static Microsoft.EntityFrameworkCore.DbLoggerCategory;
|
||||||
|
|
||||||
|
|
||||||
namespace IRaCIS.Application.Services
|
namespace IRaCIS.Application.Services
|
||||||
{
|
{
|
||||||
[ApiExplorerSettings(GroupName = "Trial")]
|
[ApiExplorerSettings(GroupName = "Trial")]
|
||||||
|
@ -685,6 +685,7 @@ namespace IRaCIS.Application.Services
|
||||||
InstanceCount = scpStudy.InstanceCount,
|
InstanceCount = scpStudy.InstanceCount,
|
||||||
Modalities = scpStudy.Modalities,
|
Modalities = scpStudy.Modalities,
|
||||||
PatientId = scpStudy.PatientId,
|
PatientId = scpStudy.PatientId,
|
||||||
|
AccessionNumber = scpStudy.AccessionNumber,
|
||||||
SCPStudyId = scpStudy.Id,
|
SCPStudyId = scpStudy.Id,
|
||||||
SeriesCount = scpStudy.SeriesCount,
|
SeriesCount = scpStudy.SeriesCount,
|
||||||
StudyTime = scpStudy.StudyTime,
|
StudyTime = scpStudy.StudyTime,
|
||||||
|
@ -2827,7 +2828,7 @@ namespace IRaCIS.Application.Services
|
||||||
|
|
||||||
#region 基础方法
|
#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);
|
var request = new DicomCFindRequest(DicomQueryRetrieveLevel.Study);
|
||||||
|
@ -2862,7 +2863,7 @@ namespace IRaCIS.Application.Services
|
||||||
|
|
||||||
//request.Dataset.AddOrUpdate(DicomTag.PatientID, "Test*");
|
//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);
|
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.StudyID, inQuery.StudyID.IsNullOrEmpty() ? "" : inQuery.StudyID);
|
||||||
request.Dataset.AddOrUpdate(DicomTag.AccessionNumber, inQuery.StudyID.IsNullOrEmpty() ? "" : inQuery.AccessionNumber);
|
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.StudyDate, inQuery.StudyDate.IsNullOrEmpty() ? "" : inQuery.StudyDate);
|
||||||
request.Dataset.AddOrUpdate(DicomTag.StudyTime, inQuery.StudyTime.IsNullOrEmpty() ? "" : inQuery.StudyTime);
|
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 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)
|
if (find != null)
|
||||||
{
|
{
|
||||||
|
@ -2938,64 +2945,80 @@ namespace IRaCIS.Application.Services
|
||||||
//var cts = new CancellationTokenSource();
|
//var cts = new CancellationTokenSource();
|
||||||
//CancellationToken token = cts.Token;
|
//CancellationToken token = cts.Token;
|
||||||
|
|
||||||
|
var @lock = _distributedLockProvider.CreateLock($"CFind");
|
||||||
|
|
||||||
|
|
||||||
var maxStudyCount = find.MaxStudyCount > 0 ? find.MaxStudyCount : 50;
|
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();
|
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)
|
await client.AddRequestsAsync(requestList);
|
||||||
{
|
|
||||||
//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.SendAsync();
|
await client.SendAsync();
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var resultInstanceUidList = result.Select(t => t.StudyInstanceUID).ToList();
|
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 hirServer = await _dicomAEReposiotry.FirstOrDefaultAsync(t => t.PacsTypeEnum == PacsType.HIRServer);
|
||||||
|
|
||||||
|
var hirClient = await _dicomAEReposiotry.FirstOrDefaultAsync(t => t.PacsTypeEnum == PacsType.HIRClient);
|
||||||
|
|
||||||
if (hirServer == null)
|
if (hirServer == null)
|
||||||
{
|
{
|
||||||
//"未找到服务端AE配置,请核查后再拉取"
|
//"未找到服务端AE配置,请核查后再拉取"
|
||||||
return ResponseOutput.NotOk(_localizer["Patient_NoPacsAE"]);
|
return ResponseOutput.NotOk(_localizer["Patient_NoPacsAE"]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (hirClient == null)
|
||||||
|
{
|
||||||
|
return ResponseOutput.NotOk(_localizer["Patient_NoPacsClientAE"]);
|
||||||
|
}
|
||||||
|
|
||||||
if (find != null)
|
if (find != null)
|
||||||
{
|
{
|
||||||
|
|
||||||
var task = Task.Run(async () =>
|
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();
|
client.NegotiateAsyncOps();
|
||||||
|
|
||||||
var cmoveRequestList = new List<DicomCMoveRequest>();
|
var cmoveRequestList = new List<DicomCMoveRequest>();
|
||||||
|
|
Loading…
Reference in New Issue