irc-netcore-api/IRaCIS.Core.Application/Service/TrialSiteUser/TrialDicomAEService.cs

170 lines
6.3 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

//--------------------------------------------------------------------
// 此代码由T4模板自动生成 byzhouhang 20210918
// 生成时间 2024-03-22 15:44:31
// 对此文件的更改可能会导致不正确的行为,并且如果重新生成代码,这些更改将会丢失。
//--------------------------------------------------------------------
using IRaCIS.Core.Domain.Models;
using Microsoft.AspNetCore.Mvc;
using IRaCIS.Core.Application.Interfaces;
using IRaCIS.Core.Application.ViewModel;
using FellowOakDicom.Network.Client;
using FellowOakDicom.Network;
using IRaCIS.Application.Contracts;
using IRaCIS.Core.Domain.Share;
using DocumentFormat.OpenXml.InkML;
namespace IRaCIS.Core.Application.Service
{
/// <summary>
/// DicomAEService
/// </summary>
[ApiExplorerSettings(GroupName = "Trial")]
public class TrialDicomAEService : BaseService, IDicomAEService
{
private readonly IRepository<TrialDicomAE> _dicomAERepository;
private readonly IRepository<Trial> _trialRepository;
public TrialDicomAEService(IRepository<TrialDicomAE> dicomAERepository, IRepository<Trial> trialRepository)
{
_trialRepository = trialRepository;
_dicomAERepository = dicomAERepository;
}
[HttpPost]
public async Task<IResponseOutput<PageOutput<DicomAEView>>> GetDicomAEList(DicomAEQuery inQuery)
{
var dicomAEQueryable = _dicomAERepository
.WhereIf(!string.IsNullOrWhiteSpace(inQuery.IP), t => t.IP.Contains(inQuery.IP))
.WhereIf(inQuery.Port != null, t => t.Port == inQuery.Port)
.WhereIf(!string.IsNullOrWhiteSpace(inQuery.CalledAE), t => t.CalledAE.Contains(inQuery.CalledAE))
.WhereIf(!string.IsNullOrWhiteSpace(inQuery.Description), t => t.Description.Contains(inQuery.Description))
.WhereIf(!string.IsNullOrWhiteSpace(inQuery.Modality), t => t.Modality.Contains(inQuery.Modality))
.ProjectTo<DicomAEView>(_mapper.ConfigurationProvider);
var pageList = await dicomAEQueryable.ToPagedListAsync(inQuery);
return ResponseOutput.Ok(pageList);
}
/// <summary>
/// 获取项目dicom AE 配置信息otherinfo里面有IsPACSConnect IsTrialPACSConfirmed
/// </summary>
/// <param name="trialId"></param>
/// <returns></returns>
public async Task<IResponseOutput<DicomAEView>> GetTrialDicomAE(Guid trialId)
{
var dicomAE = _dicomAERepository.Where(t => t.TrialId == trialId).ProjectTo<DicomAEView>(_mapper.ConfigurationProvider).FirstOrDefault();
var trialConfig = await _trialRepository.Where(t => t.Id == trialId).Select(t => new { t.IsPACSConnect, t.IsTrialPACSConfirmed }).FirstOrDefaultAsync();
return ResponseOutput.Ok(dicomAE, trialConfig);
}
public async Task<IResponseOutput> AddOrUpdateDicomAE(DicomAEAddOrEdit addOrEditDicomAE)
{
var verifyExp1 = new EntityVerifyExp<TrialDicomAE>()
{
VerifyExp = u => u.IP == addOrEditDicomAE.IP && u.Port == addOrEditDicomAE.Port && u.TrialId == addOrEditDicomAE.TrialId,
//"不允许添加相同的IP和端口的记录"
VerifyMsg = _localizer["TrialDicomAE_RepeatIPAndPort"]
};
var verifyExp2 = new EntityVerifyExp<TrialDicomAE>()
{
VerifyExp = u => u.CalledAE == addOrEditDicomAE.CalledAE ,
//"AE名称不能与其他项目相同"
VerifyMsg = _localizer["TrialDicomAE_RepeatCalledAE"]
};
var verifyExp3 = new EntityVerifyExp<TrialDicomAE>()
{
VerifyExp = u => u.TrialId == addOrEditDicomAE.TrialId,
//"AE名称不能与其他项目相同"
VerifyMsg = "该项目只允许添加一条dicom AE记录前端对接有bug时出现"
};
//var verifyExp2 = new EntityVerifyExp<TrialDicomAE>()
//{
// VerifyExp = u => u.TrialId == addOrEditDicomAE.TrialId,
// VerifyMsg = "只允许配置一条记录",
// IsVerify=addOrEditDicomAE.Id==null
//};
await _trialRepository.UpdatePartialFromQueryAsync(t => t.Id == addOrEditDicomAE.TrialId, u => new Trial() { IsPACSConnect = addOrEditDicomAE.IsPACSConnect }, true);
if (addOrEditDicomAE.IsPACSConnect)
{
// 在此处拷贝automapper 映射
var entity = await _dicomAERepository.InsertOrUpdateAsync(addOrEditDicomAE, true, verifyExp3, verifyExp1, verifyExp2);
return ResponseOutput.Ok(entity.Id.ToString());
}
else
{
return ResponseOutput.Ok();
}
}
[HttpDelete("{dicomAEId:guid}")]
public async Task<IResponseOutput> DeleteDicomAE(Guid dicomAEId)
{
var success = await _dicomAERepository.DeleteFromQueryAsync(t => t.Id == dicomAEId, true);
return ResponseOutput.Ok();
}
/// <summary>
/// 测试scp server 是否可以连接
/// </summary>
/// <returns></returns>
[HttpPost]
public async Task<bool> TestSCPServerConnect(TestAECommand inCommand)
{
try
{
var client = DicomClientFactory.Create(inCommand.IP, inCommand.Port, false, "test-callingAE", inCommand.CalledAE);
client.NegotiateAsyncOps();
await client.AddRequestAsync(new DicomCEchoRequest());
// 创建一个超时任务设置超时时间为1秒
var timeoutTask = Task.Delay(TimeSpan.FromSeconds(3));
// 发送 DICOM 请求
var sendTask = client.SendAsync();
// 等待任务完成,若超时任务先完成则抛出超时异常
if (await Task.WhenAny(sendTask, timeoutTask) == timeoutTask)
{
throw new TimeoutException("DICOM 请求超时。");
}
return true;
}
catch (Exception ex)
{
return false;
}
}
}
}