pacs 直连修改
continuous-integration/drone/push Build is passing

This commit is contained in:
2024-07-02 17:20:32 +08:00
parent 5cc41b3b0f
commit d094f22ab2
23 changed files with 934 additions and 18 deletions
@@ -9,19 +9,14 @@ using System.Collections.Generic;
namespace IRaCIS.Core.Application.ViewModel
{
/// <summary> ExploreRecommendView 列表视图模型 </summary>
public class ExploreRecommendView
public class ExploreRecommendView: ExploreRecommendAddOrEdit
{
public Guid Id { get; set; }
public string Version { get; set; }
public string Title { get; set; }
public DateTime CreateTime { get; set; }
public Guid CreateUserId { get; set; }
public Guid UpdateUserId { get; set; }
public DateTime UpdateTime { get; set; }
public bool IsDeleted { get; set; }
public string DownloadUrl { get; set; }
public string Path { get; set; }
public string FileName { get; set; }
public DateTime? DeleteTime { get; set; }
public Guid? DeleteUserId { get; set; }
}
@@ -51,10 +46,7 @@ namespace IRaCIS.Core.Application.ViewModel
public Guid Id { get; set; }
public string Version { get; set; }
public string Title { get; set; }
public DateTime CreateTime { get; set; }
public Guid CreateUserId { get; set; }
public Guid UpdateUserId { get; set; }
public DateTime UpdateTime { get; set; }
public bool IsDeleted { get; set; }
public string DownloadUrl { get; set; }
public string Path { get; set; }
@@ -0,0 +1,66 @@
//--------------------------------------------------------------------
// 此代码由T4模板自动生成 byzhouhang 20210918
// 生成时间 2024-03-22 15:44:37
// 对此文件的更改可能会导致不正确的行为,并且如果重新生成代码,这些更改将会丢失。
//--------------------------------------------------------------------
using System;
using IRaCIS.Core.Domain.Share;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
namespace IRaCIS.Core.Application.ViewModel
{
/// <summary> DicomAEView 列表视图模型 </summary>
public class DicomAEView : DicomAEAddOrEdit
{
public DateTime CreateTime { get; set; }
public Guid CreateUserId { get; set; }
public Guid UpdateUserId { get; set; }
public DateTime UpdateTime { get; set; }
public DateTime? LatestTestTime { get; set; }
public bool IsTestOK { get; set; }
public bool IsPACSConnect { get; set; }
public bool IsTrialPACSConfirmed { get; set; }
}
///<summary>DicomAEQuery 列表查询参数模型</summary>
public class DicomAEQuery : PageInput
{
public Guid? TrialId { get; set; }
public string? CalledAE { get; set; }
public string? IP { get; set; }
public int? Port { get; set; }
public string? Modality { get; set; }
public string? Description { get; set; }
}
///<summary> DicomAEAddOrEdit 列表查询参数模型</summary>
public class DicomAEAddOrEdit
{
public Guid? Id { get; set; }
[NotDefault]
public Guid TrialId { get; set; }
public string CalledAE { get; set; }
public string IP { get; set; }
public int Port { get; set; }
public string Modality { get; set; } = string.Empty;
public string Description { get; set; } = string.Empty;
}
}
@@ -313,6 +313,16 @@ namespace IRaCIS.Core.Application.Contracts
}
public class TrialPACSConfig
{
[NotDefault]
public Guid TrialId { get; set; }
public bool IsPACSConnect { get; set; }
public bool IsTrialPACSConfirmed { get; set; } = true;
}
public class TrialStateChangeDTO
{
public Guid Id { get; set; }
@@ -0,0 +1,55 @@
//--------------------------------------------------------------------
// 此代码由T4模板自动生成 byzhouhang 20210918
// 生成时间 2024-07-02 16:53:52
// 对此文件的更改可能会导致不正确的行为,并且如果重新生成代码,这些更改将会丢失。
//--------------------------------------------------------------------
using System;
using IRaCIS.Core.Domain.Share;
using System.Collections.Generic;
namespace IRaCIS.Core.Application.ViewModel
{
/// <summary> TrialSiteDicomAEView 列表视图模型 </summary>
public class TrialSiteDicomAEView : TrialSiteDicomAEAddOrEdit
{
public Guid UpdateUserId { get; set; }
public Guid? DeleteUserId { get; set; }
public DateTime CreateTime { get; set; }
public Guid CreateUserId { get; set; }
public DateTime UpdateTime { get; set; }
}
///<summary>TrialSiteDicomAEQuery 列表查询参数模型</summary>
public class TrialSiteDicomAEQuery : PageInput
{
public string? CallingAE { get; set; }
public string? IP { get; set; }
public string? Port { get; set; }
public string? Description { get; set; }
}
///<summary> TrialSiteDicomAEAddOrEdit 列表查询参数模型</summary>
public class TrialSiteDicomAEAddOrEdit
{
public Guid? Id { get; set; }
public Guid TrialId { get; set; }
public Guid TrialSiteId { get; set; }
public string CallingAE { get; set; }
public string IP { get; set; }
public string Port { get; set; }
public string Description { get; set; }
//public bool IsDeleted { get; set; }
}
}
@@ -0,0 +1,24 @@
//--------------------------------------------------------------------
// 此代码由T4模板自动生成 byzhouhang 20210918
// 生成时间 2024-03-22 15:44:27
// 对此文件的更改可能会导致不正确的行为,并且如果重新生成代码,这些更改将会丢失。
//--------------------------------------------------------------------
using IRaCIS.Core.Application.ViewModel;
namespace IRaCIS.Core.Application.Interfaces
{
/// <summary>
/// IDicomAEService
/// </summary>
public interface IDicomAEService
{
Task<IResponseOutput<PageOutput<DicomAEView>>> GetDicomAEList(DicomAEQuery inQuery);
Task<IResponseOutput> AddOrUpdateDicomAE(DicomAEAddOrEdit addOrEditDicomAE);
Task<IResponseOutput> DeleteDicomAE(Guid dicomAEId);
}
}
@@ -18,7 +18,7 @@ namespace IRaCIS.Application.Interfaces
Task<IResponseOutput> ConfigTrialUrgentInfo(TrialUrgentConfig trialConfig);
Task<IResponseOutput> ConfigTrialPACSInfo(TrialPACSConfig trialConfig);
Task<IResponseOutput> TrialConfigSignatureConfirm(SignConfirmDTO signConfirmDTO);
Task<IResponseOutput> AsyncTrialCriterionDictionary(AsyncTrialCriterionDictionaryInDto inDto);
@@ -0,0 +1,24 @@
//--------------------------------------------------------------------
// 此代码由T4模板自动生成 byzhouhang 20210918
// 生成时间 2024-07-02 16:53:55
// 对此文件的更改可能会导致不正确的行为,并且如果重新生成代码,这些更改将会丢失。
//--------------------------------------------------------------------
using IRaCIS.Core.Application.ViewModel;
namespace IRaCIS.Core.Application.Interfaces
{
/// <summary>
/// ITrialSiteDicomAEService
/// </summary>
public interface ITrialSiteDicomAEService
{
Task<PageOutput<TrialSiteDicomAEView>> GetTrialSiteDicomAEList(TrialSiteDicomAEQuery inQuery);
Task<IResponseOutput> AddOrUpdateTrialSiteDicomAE(TrialSiteDicomAEAddOrEdit addOrEditTrialSiteDicomAE);
Task<IResponseOutput> DeleteTrialSiteDicomAE(Guid trialSiteDicomAEId);
}
}
@@ -604,7 +604,7 @@ namespace IRaCIS.Core.Application
await _readingQuestionCriterionTrialRepository.UpdatePartialFromQueryAsync(inDto.TrialReadingCriterionId, x => new ReadingQuestionCriterionTrial()
{
IsImageFilter=inDto.IsImageFilter,
IsImageFilter = inDto.IsImageFilter,
ImageDownloadEnum = inDto.ImageDownloadEnum,
ImageUploadEnum = inDto.ImageUploadEnum,
CriterionModalitys = inDto.CriterionModalitys,
@@ -954,7 +954,7 @@ namespace IRaCIS.Core.Application
trialInfo.UpdateTime = DateTime.Now;
//await _readingQuestionCriterionTrialRepository.BatchUpdateNoTrackingAsync(t => t.TrialId == trialConfig.TrialId && t.IsSigned == false, u => new ReadingQuestionCriterionTrial() { CriterionModalitys = trialConfig.Modalitys });
//await _readingQuestionCriterionTrialRepository.BatchUpdateNoTrackingAsync(t => t.TrialId == trialConfig.TrialId && t.IsSigned == false, u => new ReadingQuestionCriterionTrial() { CriterionModalitys = trialConfig.Modalitys });
return ResponseOutput.Ok(await _repository.SaveChangesAsync());
}
@@ -1151,6 +1151,25 @@ namespace IRaCIS.Core.Application
return ResponseOutput.Ok(await _repository.SaveChangesAsync());
}
/// <summary>
/// 配置pacs信息
/// </summary>
/// <param name="trialConfig"></param>
/// <returns></returns>
[HttpPut]
[TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "BeforeOngoingCantOpt", "AfterStopCannNotOpt" })]
public async Task<IResponseOutput> ConfigTrialPACSInfo(TrialPACSConfig trialConfig)
{
var trialInfo = (await _trialRepository.FirstOrDefaultAsync(t => t.Id == trialConfig.TrialId)).IfNullThrowException();
trialInfo.IsPACSConnect = trialConfig.IsPACSConnect;
trialConfig.IsTrialPACSConfirmed = trialConfig.IsTrialPACSConfirmed;
trialInfo.UpdateTime = DateTime.Now;
await _trialRepository.SaveChangesAsync();
return ResponseOutput.Ok(await _repository.SaveChangesAsync());
}
[HttpGet("{trialId:guid}")]
public async Task<IResponseOutput> IfTrialCanOngoing(Guid trialId)
{
@@ -1318,7 +1337,7 @@ namespace IRaCIS.Core.Application
public async Task<IResponseOutput<List<TrialBodyPartView>>> GetTrialBodyPartList(Guid trialId)
{
var list = await _trialRepository.Where(t => t.Id == trialId).SelectMany(t => t.TrialBodyPartList).Select(t => new TrialBodyPartView() { Code = t.Code, Name = _userInfo.IsEn_Us ? t.Name : t.NameCN ,Id=t.Id,IsHandAdd=t.IsHandAdd}).ToListAsync();
var list = await _trialRepository.Where(t => t.Id == trialId).SelectMany(t => t.TrialBodyPartList).Select(t => new TrialBodyPartView() { Code = t.Code, Name = _userInfo.IsEn_Us ? t.Name : t.NameCN, Id = t.Id, IsHandAdd = t.IsHandAdd }).ToListAsync();
return ResponseOutput.Ok(list);
}
@@ -0,0 +1,149 @@
//--------------------------------------------------------------------
// 此代码由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;
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.PageIndex, inQuery.PageSize, inQuery.SortField == string.Empty ? nameof(DicomAEView.CalledAE) : inQuery.SortField, inQuery.Asc);
return ResponseOutput.Ok(pageList);
}
/// <summary>
/// 获取项目dicom AE 配置信息,otherinfo里面有IsPACSConnect IsTrialPACSConfirmed
/// </summary>
/// <param name="trialId"></param>
/// <returns></returns>
public async Task<IResponseOutput<DicomAEView>> GetTrialDicomAEList(Guid trialId)
{
var dicomAE = _dicomAERepository.Where(t => t.TrialId == trialId).ProjectTo<DicomAEView>(_mapper.ConfigurationProvider).FirstOrDefault();
var trialConfig = _trialRepository.Where(t => t.Id == trialId).Select(t => new { t.IsPACSConnect, t.IsTrialPACSConfirmed });
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,
VerifyMsg = "不允许添加相同的IP和端口的记录"
};
//var verifyExp2 = new EntityVerifyExp<TrialDicomAE>()
//{
// VerifyExp = u => u.TrialId == addOrEditDicomAE.TrialId,
// VerifyMsg = "只允许配置一条记录",
// IsVerify=addOrEditDicomAE.Id==null
//};
// 在此处拷贝automapper 映射
var entity = await _dicomAERepository.InsertOrUpdateAsync(addOrEditDicomAE, true, verifyExp1);
return ResponseOutput.Ok(entity.Id.ToString());
}
[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>
[HttpGet("{dicomAEId:guid}")]
public async Task<bool> TestSCPServerConnect(Guid dicomAEId)
{
var find = await _dicomAERepository.FirstOrDefaultAsync(t => t.Id == dicomAEId);
if (find == null)
{
return false;
}
else
{
find.LatestTestTime = DateTime.Now;
try
{
var client = DicomClientFactory.Create(find.IP, find.Port, false, "test-callingAE", find.CalledAE);
client.NegotiateAsyncOps();
await client.AddRequestAsync(new DicomCEchoRequest());
await client.SendAsync();
find.IsTestOK = true;
await _dicomAERepository.SaveChangesAsync();
return true;
}
catch (Exception ex)
{
find.IsTestOK = false;
await _dicomAERepository.SaveChangesAsync();
return false;
}
}
}
}
}
@@ -0,0 +1,74 @@
//--------------------------------------------------------------------
// 此代码由T4模板自动生成 byzhouhang 20210918
// 生成时间 2024-07-02 16:53:58
// 对此文件的更改可能会导致不正确的行为,并且如果重新生成代码,这些更改将会丢失。
//--------------------------------------------------------------------
using IRaCIS.Core.Domain.Models;
using Microsoft.AspNetCore.Mvc;
using IRaCIS.Core.Application.Interfaces;
using IRaCIS.Core.Application.ViewModel;
namespace IRaCIS.Core.Application.Service
{
/// <summary>
/// TrialSiteDicomAEService
/// </summary>
[ApiExplorerSettings(GroupName = "Trial")]
public class TrialSiteDicomAEService : BaseService, ITrialSiteDicomAEService
{
private readonly IRepository<TrialSiteDicomAE> _trialSiteDicomAERepository;
public TrialSiteDicomAEService(IRepository<TrialSiteDicomAE> trialSiteDicomAERepository)
{
_trialSiteDicomAERepository = trialSiteDicomAERepository;
}
[HttpPost]
public async Task<PageOutput<TrialSiteDicomAEView>> GetTrialSiteDicomAEList(TrialSiteDicomAEQuery inQuery)
{
var trialSiteDicomAEQueryable =
_trialSiteDicomAERepository
.WhereIf(!string.IsNullOrWhiteSpace(inQuery.IP), t => t.IP.Contains(inQuery.IP))
.WhereIf(!string.IsNullOrWhiteSpace(inQuery.Port), t => t.Port.Contains(inQuery.Port))
.WhereIf(!string.IsNullOrWhiteSpace(inQuery.Description), t => t.Description.Contains(inQuery.Description))
.WhereIf(!string.IsNullOrWhiteSpace(inQuery.CallingAE), t => t.CallingAE.Contains(inQuery.CallingAE))
.ProjectTo<TrialSiteDicomAEView>(_mapper.ConfigurationProvider);
var pageList = await trialSiteDicomAEQueryable
.ToPagedListAsync(inQuery.PageIndex, inQuery.PageSize, string.IsNullOrWhiteSpace(inQuery.SortField) ? nameof(TrialSiteDicomAEView.Id) : inQuery.SortField,
inQuery.Asc);
return pageList;
}
public async Task<IResponseOutput> AddOrUpdateTrialSiteDicomAE(TrialSiteDicomAEAddOrEdit addOrEditTrialSiteDicomAE)
{
var verifyExp1 = new EntityVerifyExp<TrialSiteDicomAE>()
{
VerifyExp = u => u.IP == addOrEditTrialSiteDicomAE.IP && u.Port == addOrEditTrialSiteDicomAE.Port &&u.CallingAE==addOrEditTrialSiteDicomAE.CallingAE && u.TrialId == addOrEditTrialSiteDicomAE.TrialId,
VerifyMsg = "不允许添加相同的IP和端口的记录"
};
var entity = await _trialSiteDicomAERepository.InsertOrUpdateAsync(addOrEditTrialSiteDicomAE, true, verifyExp1);
return ResponseOutput.Ok(entity.Id.ToString());
}
[HttpDelete("{trialSiteDicomAEId:guid}")]
public async Task<IResponseOutput> DeleteTrialSiteDicomAE(Guid trialSiteDicomAEId)
{
var success = await _trialSiteDicomAERepository.DeleteFromQueryAsync(t => t.Id == trialSiteDicomAEId, true);
return ResponseOutput.Ok();
}
}
}
@@ -45,7 +45,11 @@ namespace IRaCIS.Core.Application.Service
CreateMap<AddOrUpdateTrialBodyPartCommand, TrialBodyPart>();
CreateMap<TrialSiteDicomAE, TrialSiteDicomAEView>();
CreateMap<TrialSiteDicomAE, TrialSiteDicomAEAddOrEdit>().ReverseMap();
}
}