diff --git a/IRaCIS.Core.API/Controllers/InspectionController.cs b/IRaCIS.Core.API/Controllers/InspectionController.cs index 7de33aaae..e9deab588 100644 --- a/IRaCIS.Core.API/Controllers/InspectionController.cs +++ b/IRaCIS.Core.API/Controllers/InspectionController.cs @@ -402,6 +402,19 @@ namespace IRaCIS.Core.API.Controllers return result; } + + [HttpPost, Route("Inspection/configTrialBasicInfo/ConfigTrialPACSInfoConfirm")] + [UnitOfWork] + [TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "BeforeOngoingCantOpt" })] + public async Task ConfigTrialPACSInfoConfirm(DataInspectionDto opt) + { + opt.Data.IsTrialPACSConfirmed = true; + var singid = await _inspectionService.RecordSing(opt.SignInfo); + var result = await _trialConfigService.ConfigTrialPACSInfo(opt.Data); + await _inspectionService.CompletedSign(singid, result); + return result; + } + /// /// 签名确认 /// diff --git a/IRaCIS.Core.Application/IRaCIS.Core.Application.xml b/IRaCIS.Core.Application/IRaCIS.Core.Application.xml index dc0ac3d68..8232128a0 100644 --- a/IRaCIS.Core.Application/IRaCIS.Core.Application.xml +++ b/IRaCIS.Core.Application/IRaCIS.Core.Application.xml @@ -9813,6 +9813,24 @@ + + + DicomAEService + + + + + 获取项目dicom AE 配置信息,otherinfo里面有IsPACSConnect IsTrialPACSConfirmed + + + + + + + 测试scp server 是否可以连接 + + + 项目外部人员 录入流程相关 @@ -9825,6 +9843,11 @@ + + + TrialSiteDicomAEService + + TaskAllocationRuleView 列表视图模型 @@ -10973,6 +10996,15 @@ UserWLTemplateAddOrEdit 列表查询参数模型 + + DicomAEView 列表视图模型 + + + DicomAEQuery 列表查询参数模型 + + + DicomAEAddOrEdit 列表查询参数模型 + TrialExternalUserView 列表视图模型 @@ -10982,6 +11014,15 @@ TrialExternalUserAddOrEdit 列表查询参数模型 + + TrialSiteDicomAEView 列表视图模型 + + + TrialSiteDicomAEQuery 列表查询参数模型 + + + TrialSiteDicomAEAddOrEdit 列表查询参数模型 + TrialUserPreparation View 列表视图模型 @@ -11071,11 +11112,21 @@ IOrganInfoService + + + IDicomAEService + + ITrialExternalUserService + + + ITrialSiteDicomAEService + + EmailNoticeConfigView 列表视图模型 @@ -13059,6 +13110,13 @@ + + + 配置pacs信息 + + + + 更新项目状态 diff --git a/IRaCIS.Core.Application/Service/Common/DTO/ExploreRecommendViewModel.cs b/IRaCIS.Core.Application/Service/Common/DTO/ExploreRecommendViewModel.cs index b87cfc9e7..382271cf1 100644 --- a/IRaCIS.Core.Application/Service/Common/DTO/ExploreRecommendViewModel.cs +++ b/IRaCIS.Core.Application/Service/Common/DTO/ExploreRecommendViewModel.cs @@ -9,19 +9,14 @@ using System.Collections.Generic; namespace IRaCIS.Core.Application.ViewModel { /// ExploreRecommendView 列表视图模型 - 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; } diff --git a/IRaCIS.Core.Application/Service/TrialSiteUser/DTO/DicomAEViewModel.cs b/IRaCIS.Core.Application/Service/TrialSiteUser/DTO/DicomAEViewModel.cs new file mode 100644 index 000000000..6e335b36d --- /dev/null +++ b/IRaCIS.Core.Application/Service/TrialSiteUser/DTO/DicomAEViewModel.cs @@ -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 +{ + /// DicomAEView 列表视图模型 + 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; } + + } + + ///DicomAEQuery 列表查询参数模型 + 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; } + } + + /// DicomAEAddOrEdit 列表查询参数模型 + 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; + } + + +} + + diff --git a/IRaCIS.Core.Application/Service/TrialSiteUser/DTO/TrialConfigDTO.cs b/IRaCIS.Core.Application/Service/TrialSiteUser/DTO/TrialConfigDTO.cs index dc0d0ded9..2508214e5 100644 --- a/IRaCIS.Core.Application/Service/TrialSiteUser/DTO/TrialConfigDTO.cs +++ b/IRaCIS.Core.Application/Service/TrialSiteUser/DTO/TrialConfigDTO.cs @@ -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; } diff --git a/IRaCIS.Core.Application/Service/TrialSiteUser/DTO/TrialSiteDicomAEViewModel.cs b/IRaCIS.Core.Application/Service/TrialSiteUser/DTO/TrialSiteDicomAEViewModel.cs new file mode 100644 index 000000000..94ac1e703 --- /dev/null +++ b/IRaCIS.Core.Application/Service/TrialSiteUser/DTO/TrialSiteDicomAEViewModel.cs @@ -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 +{ + /// TrialSiteDicomAEView 列表视图模型 + 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; } + + } + + ///TrialSiteDicomAEQuery 列表查询参数模型 + public class TrialSiteDicomAEQuery : PageInput + { + public string? CallingAE { get; set; } + + public string? IP { get; set; } + + public string? Port { get; set; } + + public string? Description { get; set; } + + } + + /// TrialSiteDicomAEAddOrEdit 列表查询参数模型 + 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; } + } + + +} + + diff --git a/IRaCIS.Core.Application/Service/TrialSiteUser/Interface/IDicomAEService.cs b/IRaCIS.Core.Application/Service/TrialSiteUser/Interface/IDicomAEService.cs new file mode 100644 index 000000000..71f56aeb4 --- /dev/null +++ b/IRaCIS.Core.Application/Service/TrialSiteUser/Interface/IDicomAEService.cs @@ -0,0 +1,24 @@ +//-------------------------------------------------------------------- +// 此代码由T4模板自动生成 byzhouhang 20210918 +// 生成时间 2024-03-22 15:44:27 +// 对此文件的更改可能会导致不正确的行为,并且如果重新生成代码,这些更改将会丢失。 +//-------------------------------------------------------------------- + +using IRaCIS.Core.Application.ViewModel; +namespace IRaCIS.Core.Application.Interfaces +{ + /// + /// IDicomAEService + /// + public interface IDicomAEService + { + + Task>> GetDicomAEList(DicomAEQuery inQuery); + + Task AddOrUpdateDicomAE(DicomAEAddOrEdit addOrEditDicomAE); + + Task DeleteDicomAE(Guid dicomAEId); + + + } +} diff --git a/IRaCIS.Core.Application/Service/TrialSiteUser/Interface/ITrialConfigService.cs b/IRaCIS.Core.Application/Service/TrialSiteUser/Interface/ITrialConfigService.cs index 7a06d0fb5..1de70d035 100644 --- a/IRaCIS.Core.Application/Service/TrialSiteUser/Interface/ITrialConfigService.cs +++ b/IRaCIS.Core.Application/Service/TrialSiteUser/Interface/ITrialConfigService.cs @@ -18,7 +18,7 @@ namespace IRaCIS.Application.Interfaces Task ConfigTrialUrgentInfo(TrialUrgentConfig trialConfig); - + Task ConfigTrialPACSInfo(TrialPACSConfig trialConfig); Task TrialConfigSignatureConfirm(SignConfirmDTO signConfirmDTO); Task AsyncTrialCriterionDictionary(AsyncTrialCriterionDictionaryInDto inDto); diff --git a/IRaCIS.Core.Application/Service/TrialSiteUser/Interface/ITrialSiteDicomAEService.cs b/IRaCIS.Core.Application/Service/TrialSiteUser/Interface/ITrialSiteDicomAEService.cs new file mode 100644 index 000000000..a6c2323a6 --- /dev/null +++ b/IRaCIS.Core.Application/Service/TrialSiteUser/Interface/ITrialSiteDicomAEService.cs @@ -0,0 +1,24 @@ +//-------------------------------------------------------------------- +// 此代码由T4模板自动生成 byzhouhang 20210918 +// 生成时间 2024-07-02 16:53:55 +// 对此文件的更改可能会导致不正确的行为,并且如果重新生成代码,这些更改将会丢失。 +//-------------------------------------------------------------------- + +using IRaCIS.Core.Application.ViewModel; +namespace IRaCIS.Core.Application.Interfaces +{ + /// + /// ITrialSiteDicomAEService + /// + public interface ITrialSiteDicomAEService + { + + Task> GetTrialSiteDicomAEList(TrialSiteDicomAEQuery inQuery); + + Task AddOrUpdateTrialSiteDicomAE(TrialSiteDicomAEAddOrEdit addOrEditTrialSiteDicomAE); + + Task DeleteTrialSiteDicomAE(Guid trialSiteDicomAEId); + + + } +} diff --git a/IRaCIS.Core.Application/Service/TrialSiteUser/TrialConfigService.cs b/IRaCIS.Core.Application/Service/TrialSiteUser/TrialConfigService.cs index 573b0b300..4be695071 100644 --- a/IRaCIS.Core.Application/Service/TrialSiteUser/TrialConfigService.cs +++ b/IRaCIS.Core.Application/Service/TrialSiteUser/TrialConfigService.cs @@ -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()); } + /// + /// 配置pacs信息 + /// + /// + /// + [HttpPut] + [TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "BeforeOngoingCantOpt", "AfterStopCannNotOpt" })] + public async Task 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 IfTrialCanOngoing(Guid trialId) { @@ -1318,7 +1337,7 @@ namespace IRaCIS.Core.Application public async Task>> 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); } diff --git a/IRaCIS.Core.Application/Service/TrialSiteUser/TrialDicomAEService.cs b/IRaCIS.Core.Application/Service/TrialSiteUser/TrialDicomAEService.cs new file mode 100644 index 000000000..035be1e3e --- /dev/null +++ b/IRaCIS.Core.Application/Service/TrialSiteUser/TrialDicomAEService.cs @@ -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 +{ + /// + /// DicomAEService + /// + [ApiExplorerSettings(GroupName = "Trial")] + public class TrialDicomAEService : BaseService, IDicomAEService + { + + private readonly IRepository _dicomAERepository; + private readonly IRepository _trialRepository; + + public TrialDicomAEService(IRepository dicomAERepository, IRepository trialRepository) + { + _trialRepository = trialRepository; + _dicomAERepository = dicomAERepository; + } + + [HttpPost] + public async Task>> 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(_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); + } + + + /// + /// 获取项目dicom AE 配置信息,otherinfo里面有IsPACSConnect IsTrialPACSConfirmed + /// + /// + /// + public async Task> GetTrialDicomAEList(Guid trialId) + { + var dicomAE = _dicomAERepository.Where(t => t.TrialId == trialId).ProjectTo(_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 AddOrUpdateDicomAE(DicomAEAddOrEdit addOrEditDicomAE) + { + var verifyExp1 = new EntityVerifyExp() + { + VerifyExp = u => u.IP == addOrEditDicomAE.IP && u.Port == addOrEditDicomAE.Port && u.TrialId == addOrEditDicomAE.TrialId, + + VerifyMsg = "不允许添加相同的IP和端口的记录" + }; + + //var verifyExp2 = new EntityVerifyExp() + //{ + // 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 DeleteDicomAE(Guid dicomAEId) + { + var success = await _dicomAERepository.DeleteFromQueryAsync(t => t.Id == dicomAEId, true); + return ResponseOutput.Ok(); + } + + + /// + /// 测试scp server 是否可以连接 + /// + /// + [HttpGet("{dicomAEId:guid}")] + public async Task 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; + } + } + + + } + + + } +} diff --git a/IRaCIS.Core.Application/Service/TrialSiteUser/TrialSiteDicomAEService.cs b/IRaCIS.Core.Application/Service/TrialSiteUser/TrialSiteDicomAEService.cs new file mode 100644 index 000000000..2cfec8f8f --- /dev/null +++ b/IRaCIS.Core.Application/Service/TrialSiteUser/TrialSiteDicomAEService.cs @@ -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 +{ + /// + /// TrialSiteDicomAEService + /// + [ApiExplorerSettings(GroupName = "Trial")] + public class TrialSiteDicomAEService : BaseService, ITrialSiteDicomAEService + { + + private readonly IRepository _trialSiteDicomAERepository; + + public TrialSiteDicomAEService(IRepository trialSiteDicomAERepository) + { + _trialSiteDicomAERepository = trialSiteDicomAERepository; + } + + [HttpPost] + public async Task> 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(_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 AddOrUpdateTrialSiteDicomAE(TrialSiteDicomAEAddOrEdit addOrEditTrialSiteDicomAE) + { + var verifyExp1 = new EntityVerifyExp() + { + 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 DeleteTrialSiteDicomAE(Guid trialSiteDicomAEId) + { + var success = await _trialSiteDicomAERepository.DeleteFromQueryAsync(t => t.Id == trialSiteDicomAEId, true); + return ResponseOutput.Ok(); + } + + + } +} diff --git a/IRaCIS.Core.Application/Service/TrialSiteUser/_MapConfig2.cs b/IRaCIS.Core.Application/Service/TrialSiteUser/_MapConfig2.cs index b608fb229..96041148e 100644 --- a/IRaCIS.Core.Application/Service/TrialSiteUser/_MapConfig2.cs +++ b/IRaCIS.Core.Application/Service/TrialSiteUser/_MapConfig2.cs @@ -45,7 +45,11 @@ namespace IRaCIS.Core.Application.Service CreateMap(); - + + CreateMap(); + CreateMap().ReverseMap(); + + } } diff --git a/IRaCIS.Core.Domain/Image/SCPImageUpload.cs b/IRaCIS.Core.Domain/Image/SCPImageUpload.cs new file mode 100644 index 000000000..a2982fba0 --- /dev/null +++ b/IRaCIS.Core.Domain/Image/SCPImageUpload.cs @@ -0,0 +1,61 @@ + +//-------------------------------------------------------------------- +// 此代码由T4模板自动生成 byzhouhang 20210918 +// 生成时间 2024-05-24 14:31:45 +// 对此文件的更改可能会导致不正确的行为,并且如果重新生成代码,这些更改将会丢失。 +using System; +using IRaCIS.Core.Domain.Share; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; +using System.Collections.Generic; +namespace IRaCIS.Core.Domain.Models +{ + /// + ///SCPImageUpload + /// + [Table("SCPImageUpload")] + public class SCPImageUpload : Entity, IAuditAdd + { + + + + [Required] + public DateTime CreateTime { get; set; } + + + [Required] + public Guid CreateUserId { get; set; } + + + [Required] + public string CallingAE { get; set; }=string.Empty; + + [Required] + public string CalledAE { get; set; } = string.Empty; + + + [Required] + public string CallingAEIP { get; set; } = string.Empty; + + + [Required] + public DateTime StartTime { get; set; } + + [Required] + public DateTime EndTime { get; set; } + + + [Required] + public int FileCount { get; set; } + + + [Required] + public long FileSize { get; set; } + + + public int StudyCount { get; set; } + + } + + +} diff --git a/IRaCIS.Core.Domain/Image/SCPInstance.cs b/IRaCIS.Core.Domain/Image/SCPInstance.cs new file mode 100644 index 000000000..f0eb643f6 --- /dev/null +++ b/IRaCIS.Core.Domain/Image/SCPInstance.cs @@ -0,0 +1,53 @@ +using System; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; + +namespace IRaCIS.Core.Domain.Models +{ + [Table("SCPInstance")] + public class SCPInstance : Entity, IAuditAdd, IAuditUpdate + { + [JsonIgnore] + [ForeignKey("SeriesId")] + public SCPSeries SCPSeries { get; set; } + + [JsonIgnore] + [ForeignKey("StudyId")] + public SCPStudy SCPStudy { get; set; } + + [DatabaseGenerated(DatabaseGeneratedOption.Identity)] + + public Guid SeqId { get; set; } + public Guid StudyId { get; set; } + public Guid SeriesId { get; set; } + public string StudyInstanceUid { get; set; } + public string SeriesInstanceUid { get; set; } + public string SopInstanceUid { get; set; } + public int InstanceNumber { get; set; } + public DateTime? InstanceTime { get; set; } + public bool CPIStatus { get; set; } + public int ImageRows { get; set; } + public int ImageColumns { get; set; } + public int SliceLocation { get; set; } + + + public string SliceThickness { get; set; } + public int NumberOfFrames { get; set; } + public string PixelSpacing { get; set; } + + public string ImagerPixelSpacing { get; set; } + public string FrameOfReferenceUID { get; set; } + public string WindowCenter { get; set; } + public string WindowWidth { get; set; } + + public bool Anonymize { get; set; } + public string Path { get; set; } = string.Empty; + + public Guid CreateUserId { get; set; } + public DateTime CreateTime { get; set; } = DateTime.Now; + public Guid UpdateUserId { get; set; } + public DateTime UpdateTime { get; set; } = DateTime.Now; + + + } +} diff --git a/IRaCIS.Core.Domain/Image/SCPPatient.cs b/IRaCIS.Core.Domain/Image/SCPPatient.cs new file mode 100644 index 000000000..21eda7f87 --- /dev/null +++ b/IRaCIS.Core.Domain/Image/SCPPatient.cs @@ -0,0 +1,37 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; + +namespace IRaCIS.Core.Domain.Models +{ + [Table("SCPPatient")] + public class SCPPatient : Entity, IAuditUpdate, IAuditAdd + { + public List SCPStudyList { get; set; } + + public string PatientIdStr { get; set; } = string.Empty; + public string PatientName { get; set; } = string.Empty; + public string PatientAge { get; set; } = string.Empty; + public string PatientSex { get; set; } = string.Empty; + public string PatientBirthDate { get; set; } = string.Empty; + + public Guid UpdateUserId { get; set; } + public DateTime UpdateTime { get; set; } = DateTime.Now; + public Guid CreateUserId { get; set; } + public DateTime CreateTime { get; set; } = DateTime.Now; + + + public DateTime? EarliestStudyTime { get; set; } + + public DateTime? LatestStudyTime { get; set; } + + public DateTime LatestPushTime { get; set; } + + + [JsonIgnore] + public Subject Subject { get; set; } + public Guid? SubjectId { get; set; } + + } +} diff --git a/IRaCIS.Core.Domain/Image/SCPSeries.cs b/IRaCIS.Core.Domain/Image/SCPSeries.cs new file mode 100644 index 000000000..5c2213c20 --- /dev/null +++ b/IRaCIS.Core.Domain/Image/SCPSeries.cs @@ -0,0 +1,57 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; + +namespace IRaCIS.Core.Domain.Models +{ + [Table("SCPSeries")] + public class SCPSeries : Entity, IAuditAdd, IAuditUpdate, ISoftDelete + { + [JsonIgnore] + [ForeignKey("StudyId")] + public SCPStudy SCPStudy { get; set; } + + [JsonIgnore] + public List SCPInstanceList { get; set; } + + [DatabaseGenerated(DatabaseGeneratedOption.Identity)] + public Guid SeqId { get; set; } + public Guid StudyId { get; set; } + public string StudyInstanceUid { get; set; } + public string SeriesInstanceUid { get; set; } + public int SeriesNumber { get; set; } + public DateTime? SeriesTime { get; set; } + public string Modality { get; set; } + public string Description { get; set; } + public int InstanceCount { get; set; } + public string SliceThickness { get; set; } + + public string ImagePositionPatient { get; set; } + public string ImageOrientationPatient { get; set; } + public string BodyPartExamined { get; set; } + public string SequenceName { get; set; } + public string ProtocolName { get; set; } + public string ImagerPixelSpacing { get; set; } + + public string AcquisitionTime { get; set; } = string.Empty; + public string AcquisitionNumber { get; set; } = string.Empty; + public string TriggerTime { get; set; } = string.Empty; + + public string BodyPartForEdit { get; set; } = string.Empty; + + public Guid CreateUserId { get; set; } + public DateTime CreateTime { get; set; } = DateTime.Now; + public Guid UpdateUserId { get; set; } + public DateTime UpdateTime { get; set; } = DateTime.Now; + + public DateTime? DeletedTime { get; set; } + + public Guid? DeleteUserId { get; set; } + public bool IsDeleted {get;set;} + public bool IsReading { get; set; } = true; + + public string ImageResizePath { get; set; }=string.Empty; + + } +} diff --git a/IRaCIS.Core.Domain/Image/SCPStudy.cs b/IRaCIS.Core.Domain/Image/SCPStudy.cs new file mode 100644 index 000000000..c78222617 --- /dev/null +++ b/IRaCIS.Core.Domain/Image/SCPStudy.cs @@ -0,0 +1,95 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; + +namespace IRaCIS.Core.Domain.Models +{ + [Table("SCPStudy")] + public class SCPStudy : Entity, IAuditUpdate, IAuditAdd, ISoftDelete + { + + + + + + //0 未知 1 单重 2 双重 + public bool IsDoubleReview { get; set; } + + [JsonIgnore] + public List InstanceList { get; set; } + + [JsonIgnore] + public List SeriesList { get; set; } + + + [DatabaseGenerated(DatabaseGeneratedOption.Identity)] + public Guid SeqId { get; set; } + + [ForeignKey("PatientId")] + [JsonIgnore] + public SCPPatient Patient { get; set; } + public Guid PatientId { get; set; } + + + + + public string StudyInstanceUid { get; set; } = string.Empty; + public DateTime? StudyTime { get; set; } + public string Modalities { get; set; } = string.Empty; + + public string Description { get; set; } = string.Empty; + public int SeriesCount { get; set; } = 0; + public int InstanceCount { get; set; } = 0; + + + public string InstitutionName { get; set; } = string.Empty; + public string PatientIdStr { get; set; } = string.Empty; + public string PatientName { get; set; } = string.Empty; + public string PatientAge { get; set; } = string.Empty; + public string PatientSex { get; set; } = string.Empty; + + public string StudyId { get; set; } = string.Empty; + public string AccessionNumber { get; set; } = string.Empty; + public string PatientBirthDate { get; set; } = string.Empty; + public string AcquisitionTime { get; set; } = string.Empty; + public string AcquisitionNumber { get; set; } = string.Empty; + public string TriggerTime { get; set; } = string.Empty; + + public string BodyPartExamined { get; set; } = string.Empty; + + public string BodyPartForEdit { get; set; } = string.Empty; + + public string ModalityForEdit { get; set; } = string.Empty; + + + + public Guid UpdateUserId { get; set; } + public DateTime UpdateTime { get; set; } = DateTime.Now; + public Guid CreateUserId { get; set; } + public DateTime CreateTime { get; set; } = DateTime.Now; + + + //软删除 + public bool IsDeleted { get; set; } + + public DateTime? DeletedTime { get; set; } + + public Guid? DeleteUserId { get; set; } + + public string CallingAE { get; set; } = string.Empty; + + public string CalledAE { get; set; } = string.Empty; + + public bool IsUploadFinished { get; set; } + + + + + public Guid? SubjectVisitId { get; set; } + + [JsonIgnore] + public SubjectVisit SubjectVisit { get; set; } + + } +} diff --git a/IRaCIS.Core.Domain/Image/TrialDicomAE.cs b/IRaCIS.Core.Domain/Image/TrialDicomAE.cs new file mode 100644 index 000000000..0d91a9c77 --- /dev/null +++ b/IRaCIS.Core.Domain/Image/TrialDicomAE.cs @@ -0,0 +1,52 @@ + +//-------------------------------------------------------------------- +// 此代码由T4模板自动生成 byzhouhang 20210918 +// 生成时间 2024-03-22 15:44:11 +// 对此文件的更改可能会导致不正确的行为,并且如果重新生成代码,这些更改将会丢失。 +using System; +using IRaCIS.Core.Domain.Share; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; +namespace IRaCIS.Core.Domain.Models +{ + /// + ///DicomAE + /// + [Table("TrialDicomAE")] + public class TrialDicomAE : Entity, IAuditUpdate, IAuditAdd + { + + public Guid TrialId { get; set; } + + public DateTime CreateTime { get; set; } + + + public Guid CreateUserId { get; set; } + + + public Guid UpdateUserId { get; set; } + + + public DateTime UpdateTime { get; set; } + + public string CalledAE { get; set; } = string.Empty; + + public string IP { get; set; } + + + public int Port { get; set; } + + + public string Modality { get; set; } = string.Empty; + + + public string Description { get; set; }=string.Empty; + + + public DateTime? LatestTestTime { get; set; } + + public bool IsTestOK { get; set; } + + } + +} diff --git a/IRaCIS.Core.Domain/Trial/Trial.cs b/IRaCIS.Core.Domain/Trial/Trial.cs index e63ca4315..d00d43d55 100644 --- a/IRaCIS.Core.Domain/Trial/Trial.cs +++ b/IRaCIS.Core.Domain/Trial/Trial.cs @@ -401,7 +401,9 @@ namespace IRaCIS.Core.Domain.Models #endregion + public bool IsPACSConnect { get; set; } + public bool IsTrialPACSConfirmed { get; set; } ///// ///// 图像是否有标注 diff --git a/IRaCIS.Core.Domain/TrialSiteUser/TrialSiteDicomAE.cs b/IRaCIS.Core.Domain/TrialSiteUser/TrialSiteDicomAE.cs new file mode 100644 index 000000000..a23e4d5b6 --- /dev/null +++ b/IRaCIS.Core.Domain/TrialSiteUser/TrialSiteDicomAE.cs @@ -0,0 +1,59 @@ + +//-------------------------------------------------------------------- +// 此代码由T4模板自动生成 byzhouhang 20210918 +// 生成时间 2024-07-02 16:53:49 +// 对此文件的更改可能会导致不正确的行为,并且如果重新生成代码,这些更改将会丢失。 +using System; +using IRaCIS.Core.Domain.Share; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; +namespace IRaCIS.Core.Domain.Models +{ + /// + ///TrialSiteDicomAE + /// + [Table("TrialSiteDicomAE")] + public class TrialSiteDicomAE : Entity, IAuditUpdate, IAuditAdd + { + + + + public DateTime? DeletedTime { get; set; } + + + public Guid TrialId { get; set; } + + + public Guid UpdateUserId { get; set; } + + + public Guid? DeleteUserId { get; set; } + + + public DateTime CreateTime { get; set; } + + + public Guid CreateUserId { get; set; } + + public bool IsDeleted { get; set; } + + public DateTime UpdateTime { 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; } + + } + +} diff --git a/IRaCIS.Core.Infra.EFCore/Context/IRaCISDBContext.cs b/IRaCIS.Core.Infra.EFCore/Context/IRaCISDBContext.cs index c5e8715c7..f4dcffdd9 100644 --- a/IRaCIS.Core.Infra.EFCore/Context/IRaCISDBContext.cs +++ b/IRaCIS.Core.Infra.EFCore/Context/IRaCISDBContext.cs @@ -483,6 +483,18 @@ namespace IRaCIS.Core.Infra.EFCore public virtual DbSet ExploreRecommend { get; set; } + public virtual DbSet SCPPatient { get; set; } + public virtual DbSet SCPStudy { get; set; } + public virtual DbSet SCPSeries { get; set; } + public virtual DbSet SCPInstance { get; set; } + public virtual DbSet TrialDicomAE { get; set; } + + + public virtual DbSet TrialSiteDicomAE { get; set; } + + + public virtual DbSet SCPImageUpload { get; set; } + public override async Task SaveChangesAsync(CancellationToken cancellationToken = new CancellationToken()) { diff --git a/IRaCIS.Core.Test/DbHelper.ttinclude b/IRaCIS.Core.Test/DbHelper.ttinclude index 649ef03e0..8790fcb50 100644 --- a/IRaCIS.Core.Test/DbHelper.ttinclude +++ b/IRaCIS.Core.Test/DbHelper.ttinclude @@ -4,7 +4,7 @@ public static readonly string ConnectionString = "Server=106.14.89.110,1435;Database=Test_IRC;User ID=sa;Password=xc@123456;TrustServerCertificate=true"; public static readonly string DbDatabase = "Test_IRC"; //表名称用字符串,拼接 - public static readonly string TableName = "ExploreRecommend"; + public static readonly string TableName = "TrialSiteDicomAE"; //具体文件里面 例如service 可以配置是否分页 } #>