From 4e943a54f9e994540d9f1337ce1017f2f0c933bc Mon Sep 17 00:00:00 2001 From: "DESKTOP-G961P6V\\Zhh" <839860190@qq.com> Date: Sat, 4 May 2024 03:14:07 +0800 Subject: [PATCH] =?UTF-8?q?LIS=E7=BB=93=E6=9E=9C=E5=AF=BC=E5=85=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Shentun.Peis.PlugIns.csproj | 2 + .../CreateImportLisResultDto.cs | 64 ++++++ .../IImportLisResultAppService.cs | 13 ++ .../ImportLisResultAppService.cs | 199 ++++++++++++++++-- .../ReferenceRangeAppService.cs | 8 +- .../ReferenceRanges/ReferenceRangeManager.cs | 54 ++++- .../ImportLisResultAppServiceTest.cs | 68 ++++++ .../appsettings.json | 5 + 8 files changed, 388 insertions(+), 25 deletions(-) create mode 100644 src/Shentun.Peis.Application.Contracts/ImportLisResults/CreateImportLisResultDto.cs create mode 100644 src/Shentun.Peis.Application.Contracts/ImportLisResults/IImportLisResultAppService.cs create mode 100644 test/Shentun.Peis.Application.Tests/ImportLisResultAppServiceTest.cs diff --git a/src/Shentun.ColumnReferencePlugIns/Shentun.Peis.PlugIns.csproj b/src/Shentun.ColumnReferencePlugIns/Shentun.Peis.PlugIns.csproj index 77449d7..d17ec2e 100644 --- a/src/Shentun.ColumnReferencePlugIns/Shentun.Peis.PlugIns.csproj +++ b/src/Shentun.ColumnReferencePlugIns/Shentun.Peis.PlugIns.csproj @@ -17,6 +17,8 @@ + + diff --git a/src/Shentun.Peis.Application.Contracts/ImportLisResults/CreateImportLisResultDto.cs b/src/Shentun.Peis.Application.Contracts/ImportLisResults/CreateImportLisResultDto.cs new file mode 100644 index 0000000..f26796a --- /dev/null +++ b/src/Shentun.Peis.Application.Contracts/ImportLisResults/CreateImportLisResultDto.cs @@ -0,0 +1,64 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace Shentun.Peis.ImportLisResults +{ + public class CreateImportLisResultDto + { + public string LisRequestNo { get; set; } + /// 项目编号 + /// + public Guid ItemId { get; set; } + /// + /// 项目名称 + /// + public string ItemName { get; set; } + + /// + /// 结果 + /// + public string? Result { get; set; } + /// + /// 单位 + /// + + public string? Unit { get; set; } + /// + /// 参考范围 + /// + + public string? ReferenceRangeValue { get; set; } + /// + /// 危急值范围 + /// + + public string? CriticalRangeValue { get; set; } + /// + /// 危急值 + /// + + public string? CriticalValue { get; set; } + /// + /// 报告单状态 + /// + + public string? ResultStatusId { get; set; } = "01";//01-正常 + /// + /// 报告单提示 + /// + public string ReportPrompt { get; set; } + /// + /// 检查医生 + /// + + public string? CheckDoctorName { get; set; } + /// + /// 检查日期 + /// + + public DateTime? CheckDate { get; set; } + + public Guid ExecOrganizationUnitId { get; set; } + } +} diff --git a/src/Shentun.Peis.Application.Contracts/ImportLisResults/IImportLisResultAppService.cs b/src/Shentun.Peis.Application.Contracts/ImportLisResults/IImportLisResultAppService.cs new file mode 100644 index 0000000..25544e2 --- /dev/null +++ b/src/Shentun.Peis.Application.Contracts/ImportLisResults/IImportLisResultAppService.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Threading.Tasks; +using Volo.Abp.Application.Dtos; + +namespace Shentun.Peis.ImportLisResults +{ + public interface IImportLisResultAppService + { + public Task ImportResultAsync(List input); + } +} diff --git a/src/Shentun.Peis.Application/ImportLisResults/ImportLisResultAppService.cs b/src/Shentun.Peis.Application/ImportLisResults/ImportLisResultAppService.cs index ef32324..5beef0b 100644 --- a/src/Shentun.Peis.Application/ImportLisResults/ImportLisResultAppService.cs +++ b/src/Shentun.Peis.Application/ImportLisResults/ImportLisResultAppService.cs @@ -1,10 +1,14 @@ using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Configuration; using Shentun.Peis.DiagnosisFunctions; +using Shentun.Peis.Enums; +using Shentun.Peis.Items; using Shentun.Peis.Models; using Shentun.Peis.PlugIns; +using Shentun.Peis.ReferenceRanges; using Shentun.Peis.RegisterCheckItems; using Shentun.Peis.RegisterChecks; +using Shentun.Peis.Units; using System; using System.Collections.Generic; using System.Linq; @@ -18,7 +22,7 @@ using Volo.Abp.Users; namespace Shentun.Peis.ImportLisResults { - public class ImportLisResultAppService : ApplicationService + public class ImportLisResultAppService : ApplicationService,IImportLisResultAppService { private readonly IRepository _registerCheckItemRepository; private readonly IRepository _patientRegisterRepository; @@ -26,9 +30,11 @@ namespace Shentun.Peis.ImportLisResults private readonly IRepository _registerCheckRepository; private readonly IRepository _registerCheckAsbitemRepository; private readonly IRepository _lisRequestRepository; + private readonly IRepository _itemRepository; private readonly IRepository _registerCheckSummaryRepository; private readonly IRepository _registerCheckSuggestionRepository; private readonly IRepository _userRepository; + private readonly IRepository _unitRepository; private readonly RegisterCheckManager _registerCheckManager; private readonly RegisterCheckItemManager _registerCheckItemManager; private readonly CacheService _cacheService; @@ -38,6 +44,11 @@ namespace Shentun.Peis.ImportLisResults private readonly IRepository _userItemTypeRepository; private readonly IRepository _asbitemRepository; private readonly DiagnosisFunctionAppService _diagnosisFunctionAppService; + private readonly ReferenceRangeManager _referenceRangeManager; + private readonly ItemManager _itemManager; + private readonly UnitManager _unitManager; + private readonly RegisterCheckAppService _registerCheckAppService; + private List _unitList; public ImportLisResultAppService(IRepository registerCheckRepository, IRepository registerCheckItemRepository, IRepository patientRegisterRepository, @@ -55,7 +66,13 @@ namespace Shentun.Peis.ImportLisResults IRepository asbitemRepository, IRepository registerCheckAsbitemRepository, IRepository lisRequestRepository, - DiagnosisFunctionAppService diagnosisFunctionAppService) + IRepository unitRepository, + DiagnosisFunctionAppService diagnosisFunctionAppService, + ReferenceRangeManager referenceRangeManager, + IRepository itemRepository, + ItemManager itemManager, + UnitManager unitManager, + RegisterCheckAppService registerCheckAppService) { _registerCheckRepository = registerCheckRepository; _userRepository = userRepository; @@ -75,13 +92,22 @@ namespace Shentun.Peis.ImportLisResults _registerCheckAsbitemRepository = registerCheckAsbitemRepository; _lisRequestRepository = lisRequestRepository; _diagnosisFunctionAppService = diagnosisFunctionAppService; + _referenceRangeManager = referenceRangeManager; + _itemRepository = itemRepository; + _itemManager = itemManager; + _unitRepository = unitRepository; + _unitList = _unitRepository.GetListAsync().Result; + _unitManager = unitManager; + _registerCheckAppService = registerCheckAppService; } [HttpGet("api/app/ImportLisResult/ImportResult")] - public async Task ImportResultAsync(List input) + public async Task ImportResultAsync(List input) { //设置结果 - var list = (from registerCheck in await _registerCheckRepository.GetQueryableAsync() + var list = (from patientRegister in await _patientRegisterRepository.GetQueryableAsync() + join registerCheck in await _registerCheckRepository.GetQueryableAsync() + on patientRegister.Id equals registerCheck.PatientRegisterId join registerCheckAsbitem in await _registerCheckAsbitemRepository.GetQueryableAsync() on registerCheck.Id equals registerCheckAsbitem.RegisterCheckId join registerCheckItem in await _registerCheckItemRepository.GetQueryableAsync() @@ -91,6 +117,7 @@ namespace Shentun.Peis.ImportLisResults where input.Select(o => o.LisRequestNo).ToList().Contains(lisRequest.LisRequestNo) select new { + patientRegister, registerCheck, registerCheckAsbitem, registerCheckItem, @@ -98,11 +125,12 @@ namespace Shentun.Peis.ImportLisResults }).ToList(); var lisRequestNos = input.Select(o => o.LisRequestNo).Distinct().ToList(); - foreach(var inputItem in input) + var registerChecks = new List(); + foreach (var inputItem in input) { - var lisRequestItem = list.Where(o=>o.lisRequest.LisRequestNo == inputItem.LisRequestNo - && o.registerCheckItem.ItemId == new Guid(inputItem.ItemId)).FirstOrDefault(); - if(lisRequestItem == null) + var lisRequestItem = list.Where(o => o.lisRequest.LisRequestNo == inputItem.LisRequestNo + && o.registerCheckItem.ItemId == inputItem.ItemId).FirstOrDefault(); + if (lisRequestItem == null) { continue; } @@ -113,29 +141,166 @@ namespace Shentun.Peis.ImportLisResults Unit = inputItem.Unit, CriticalRangeValue = inputItem.CriticalRangeValue }; + //修改参考范围 + await UpdateItemReferenceRangeValueAsync(inputItem.ItemId, lisRequestItem.patientRegister.SexId, + lisRequestItem.patientRegister.Age, inputItem.ReferenceRangeValue); + //修改单位 + await UpdateItemUnitAsync(inputItem.ItemId, inputItem.Unit); - await _registerCheckItemManager.UpdateRegisterCheckItemAsync(itemSource, lisRequestItem.registerCheckItem); - await _registerCheckItemRepository.UpdateAsync(lisRequestItem.registerCheckItem); + //await _registerCheckItemManager.UpdateRegisterCheckItemAsync(itemSource, lisRequestItem.registerCheckItem); + //await _registerCheckItemRepository.UpdateAsync(lisRequestItem.registerCheckItem); + if (!registerChecks.Where(o => o.Id == lisRequestItem.registerCheck.Id).ToList().Any()) + { + lisRequestItem.registerCheck.CheckDoctorId = inputItem.CheckDoctorName; + lisRequestItem.registerCheck.CheckDate = inputItem.CheckDate; + registerChecks.Add(lisRequestItem.registerCheck); + } } - //生成小结 - var registerChecks = list.Select(o=>o.registerCheck).Distinct().ToList(); - foreach(var registerCheck in registerChecks) + //保存结果 + + foreach (var registerCheck in registerChecks) { + var updateCheckResultDto = new UpdateCheckResultDto() + { + RegisterCheckId = registerCheck.Id, + CheckDoctorId = registerCheck.CheckDoctorId, + CheckDate = registerCheck.CheckDate, + RegisterCheckItems = list.Where(o => o.registerCheck.Id == registerCheck.Id) + .Select(o => new UpdateRegisterCheckItemDetail() + { + ItemId = o.registerCheckItem.ItemId, + Result = o.registerCheckItem.Result, + + }).ToList() + + }; + var getDiagnosisResultRequestDto = new GetDiagnosisResultRequestDto() { RegisterCheckId = registerCheck.Id, - Items = list.Where(o=>o.registerCheck.Id == registerCheck.Id) - .Select(o=>new GetDiagnosisResultRequest_Item() + Items = list.Where(o => o.registerCheck.Id == registerCheck.Id) + .Select(o => new GetDiagnosisResultRequest_Item() { ItemId = o.registerCheckItem.ItemId, Result = o.registerCheckItem.Result, }).ToList() }; + //生成小结 + var summarry = await _diagnosisFunctionAppService.GetDoctorCheckDiagnosisResultAsync(getDiagnosisResultRequestDto); + + for (var i = 0; i < summarry.DiagnosisResultDetails.Count; i++) + { + updateCheckResultDto.Summarys.Add(new UpdateRegisterCheckSummaryDetail() + { + Summary = summarry.DiagnosisResultDetails[i].DiagnosisResult, + SummaryFlag = '0' + }); + } + + await _registerCheckAppService.UpdateCheckResult(updateCheckResultDto); } - - //保存小结 + } + + private async Task UpdateItemReferenceRangeValueAsync(Guid itemId, char sexId, int? age, string referenceRangeValue) + { + var referenceRanges = (await _referenceRangeRepository.GetQueryableAsync()).Where(o => o.ItemId == itemId).ToList(); + if (age == null) age = 30; + if (string.IsNullOrWhiteSpace(referenceRangeValue)) + { + return; + } + var item = await _itemRepository.GetAsync(itemId); + ReferenceRange referenceRange = null; + if (_referenceRangeManager.IsNumberReferenceRange(referenceRangeValue)) + { + item.ReferenceRangeTypeFlag = ItemReferenceRangeTypeFlag.Number; + await _itemRepository.UpdateAsync(item,true); + + referenceRange = referenceRanges.Where(o => o.ForSexId == sexId + && age >= o.AgeLowerLimit && age <= o.AgeUpperLimit + && o.ReferenceRangeTypeFlag == ItemReferenceRangeTypeFlag.Number).FirstOrDefault(); + if (referenceRange != null) + { + referenceRange.ReferenceRangeValue = referenceRangeValue; + await _referenceRangeRepository.UpdateAsync(referenceRange, true); + return; + } + + referenceRange = referenceRanges.Where(o => o.ForSexId == ForSexFlag.All + && age >= o.AgeLowerLimit && age <= o.AgeUpperLimit + && o.ReferenceRangeTypeFlag == ItemReferenceRangeTypeFlag.Number).FirstOrDefault(); + if (referenceRange != null) + { + referenceRange.ReferenceRangeValue = referenceRangeValue; + await _referenceRangeRepository.UpdateAsync(referenceRange, true); + return; + } + referenceRange = new ReferenceRange() + { + ItemId = itemId, + AgeLowerLimit = 0, + AgeUpperLimit = 200, + ReferenceRangeTypeFlag = ItemReferenceRangeTypeFlag.Number, + ReferenceRangeValue = referenceRangeValue, + ForSexId = ForSexFlag.All + }; + referenceRange = _referenceRangeManager.Create(referenceRange); + await _referenceRangeRepository.InsertAsync(referenceRange, true); + return; + } + + item.ReferenceRangeTypeFlag = ItemReferenceRangeTypeFlag.Character; + await _itemRepository.UpdateAsync(item, true); + referenceRange = referenceRanges.Where(o => o.ReferenceRangeTypeFlag == ItemReferenceRangeTypeFlag.Character).FirstOrDefault(); + if (referenceRange != null) + { + referenceRange.ReferenceRangeValue = referenceRangeValue; + await _referenceRangeRepository.UpdateAsync(referenceRange, true); + return; + } + + referenceRange = new ReferenceRange() + { + ItemId = itemId, + AgeLowerLimit = 0, + AgeUpperLimit = 200, + ReferenceRangeTypeFlag = ItemReferenceRangeTypeFlag.Character, + ReferenceRangeValue = referenceRangeValue, + ForSexId = ForSexFlag.All + }; + referenceRange = _referenceRangeManager.Create(referenceRange); + await _referenceRangeRepository.InsertAsync(referenceRange, true); + return; + } + + private async Task UpdateItemUnitAsync(Guid itemId,string unitName) + { + if (string.IsNullOrWhiteSpace(unitName)) + { + return; + } + unitName = unitName.Trim(); + var item = await _itemRepository.GetAsync(itemId); + var unit = _unitList.Where(o => o.DisplayName.Trim().ToLower() == unitName.ToLower()).FirstOrDefault(); + if (unit != null) + { + if (item.UnitId == unit.Id) + { + return; + } + item.UnitId = unit.Id; + await _itemRepository.UpdateAsync(item, true); + return; + } + unit = new Unit() + { + DisplayName = unitName, + }; + unit = await _unitManager.CreateAsync(unit); + await _unitRepository.InsertAsync(unit, true); + _unitList.Add(unit); } } } diff --git a/src/Shentun.Peis.Application/ReferenceRanges/ReferenceRangeAppService.cs b/src/Shentun.Peis.Application/ReferenceRanges/ReferenceRangeAppService.cs index f85b3a7..1ad6d4a 100644 --- a/src/Shentun.Peis.Application/ReferenceRanges/ReferenceRangeAppService.cs +++ b/src/Shentun.Peis.Application/ReferenceRanges/ReferenceRangeAppService.cs @@ -152,7 +152,7 @@ namespace Shentun.Peis.ReferenceRanges public override async Task CreateAsync(CreateReferenceRangeDto input) { var createEntity = ObjectMapper.Map(input); - var entity = _manager.CreateAsync(createEntity); + var entity = _manager.Create(createEntity); entity = await Repository.InsertAsync(entity); //更新项目表参考范围类型 // await _itemManager.UpdateRangeTypeAsync(input.ItemId, input.ReferenceRangeTypeFlag); @@ -172,7 +172,7 @@ namespace Shentun.Peis.ReferenceRanges { var entity = await Repository.GetAsync(id); var sourceEntity = ObjectMapper.Map(input); - _manager.UpdateAsync(sourceEntity, entity); + _manager.Update(sourceEntity, entity); entity = await Repository.UpdateAsync(entity); //更新项目表参考范围类型 @@ -194,7 +194,7 @@ namespace Shentun.Peis.ReferenceRanges ////先删除字符型数据 //await Repository.DeleteAsync(m => m.ItemId == input.ItemId && m.ReferenceRangeTypeFlag == input.ReferenceRangeTypeFlag); - var entity = _manager.CreateAsync(createEntity); + var entity = _manager.Create(createEntity); entity = await Repository.InsertAsync(entity); //更新项目表参考范围类型 await _itemManager.UpdateRangeTypeAsync(input.ItemId, input.ReferenceRangeTypeFlag); @@ -214,7 +214,7 @@ namespace Shentun.Peis.ReferenceRanges { var entity = await Repository.GetAsync(id); var sourceEntity = ObjectMapper.Map(input); - _manager.UpdateTextAsync(sourceEntity, entity); + _manager.UpdateText(sourceEntity, entity); entity = await Repository.UpdateAsync(entity); //更新项目表参考范围类型 diff --git a/src/Shentun.Peis.Domain/ReferenceRanges/ReferenceRangeManager.cs b/src/Shentun.Peis.Domain/ReferenceRanges/ReferenceRangeManager.cs index a728b77..16e09ed 100644 --- a/src/Shentun.Peis.Domain/ReferenceRanges/ReferenceRangeManager.cs +++ b/src/Shentun.Peis.Domain/ReferenceRanges/ReferenceRangeManager.cs @@ -6,7 +6,9 @@ using System; using System.Collections.Generic; using System.Linq; using System.Text; +using System.Text.RegularExpressions; using System.Threading.Tasks; +using Volo.Abp; using Volo.Abp.Domain.Repositories; using Volo.Abp.Domain.Services; @@ -35,12 +37,12 @@ namespace Shentun.Peis.ReferenceRanges /// /// /// - public ReferenceRange CreateAsync( + public ReferenceRange Create( ReferenceRange entity ) { Verify(entity); - return new ReferenceRange + return new ReferenceRange(GuidGenerator.Create()) { AgeLowerLimit = entity.AgeLowerLimit, AgeUpperLimit = entity.AgeUpperLimit, @@ -63,7 +65,7 @@ namespace Shentun.Peis.ReferenceRanges /// /// /// - public void UpdateAsync( + public void Update( ReferenceRange sourceEntity, ReferenceRange targetEntity ) @@ -88,7 +90,7 @@ namespace Shentun.Peis.ReferenceRanges /// /// /// - public void UpdateTextAsync( + public void UpdateText( ReferenceRange sourceEntity, ReferenceRange targetEntity ) @@ -254,5 +256,49 @@ namespace Shentun.Peis.ReferenceRanges } } + public bool IsNumberReferenceRange(string referenceRangeValue) + { + if(string.IsNullOrWhiteSpace(referenceRangeValue)) + { + new UserFriendlyException("调用IsNumberReferenceRange时参考范围不能为空"); + } + if (Regex.Matches(referenceRangeValue, "≧").Count() == 1) + { + return true; + } + if (Regex.Matches(referenceRangeValue, ">=").Count() == 1) + { + return true; + } + if (Regex.Matches(referenceRangeValue, "≥").Count() == 1) + { + return true; + } + if (Regex.Matches(referenceRangeValue, ">=").Count() == 1) + { + return true; + } + if (Regex.Matches(referenceRangeValue, "≤").Count() == 1) + { + return true; + } + if (Regex.Matches(referenceRangeValue, "≦").Count() == 1) + { + return true; + } + if (Regex.Matches(referenceRangeValue, "<=").Count() == 1) + { + return true; + } + if (Regex.Matches(referenceRangeValue, "-").Count() == 1) + { + return true; + } + if (Regex.Matches(referenceRangeValue, "--").Count() == 1) + { + return true; + } + return false; + } } } diff --git a/test/Shentun.Peis.Application.Tests/ImportLisResultAppServiceTest.cs b/test/Shentun.Peis.Application.Tests/ImportLisResultAppServiceTest.cs new file mode 100644 index 0000000..0dce5ef --- /dev/null +++ b/test/Shentun.Peis.Application.Tests/ImportLisResultAppServiceTest.cs @@ -0,0 +1,68 @@ +using Shentun.Peis.ChargeRequests; +using Shentun.Peis.ImportLisResults; +using Shentun.Peis.Models; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Volo.Abp.Domain.Repositories; +using Volo.Abp.Uow; +using Xunit; +using Xunit.Abstractions; + +namespace Shentun.Peis +{ + public class ImportLisResultAppServiceTest : PeisApplicationTestBase + { + private readonly IRepository _repository; + private readonly ImportLisResultAppService _appService; + private readonly ITestOutputHelper _output; + private readonly IUnitOfWorkManager _unitOfWorkManager; + public ImportLisResultAppServiceTest(ITestOutputHelper testOutputHelper) + { + _output = testOutputHelper; + _unitOfWorkManager = GetRequiredService(); + _repository = GetRequiredService>(); + _appService = GetRequiredService(); + } + [Fact] + public async Task ImportResultAsync() + { + using (var unitOfWork = _unitOfWorkManager.Begin(isTransactional: true)) + { + + var entity = new List() + { + new CreateImportLisResultDto() + { + LisRequestNo = "T202404290063", + ItemId = new Guid("3a1203c2-c974-de89-ee07-3427f22fa8f7"), + Result = "32", + Unit = "g/l", + ReferenceRangeValue = "0-20" + }, + new CreateImportLisResultDto() + { + LisRequestNo = "T202404290063", + ItemId = new Guid("3a1203c2-ccd1-e29b-84b4-26bd28bbe12e"), + Result = "51.63", + Unit = "ml", + ReferenceRangeValue = "0-20" + }, + new CreateImportLisResultDto() + { + LisRequestNo = "T202404290063", + ItemId = new Guid("3a1203c2-d3b1-61fe-94e9-1210fd5555ec"), + Result = "123.001", + Unit = "次", + ReferenceRangeValue = "0-20" + } + }; + + await _appService.ImportResultAsync(entity); + await unitOfWork.CompleteAsync(); + } + } + } +} diff --git a/test/Shentun.Peis.Application.Tests/appsettings.json b/test/Shentun.Peis.Application.Tests/appsettings.json index f92b29c..0aa3856 100644 --- a/test/Shentun.Peis.Application.Tests/appsettings.json +++ b/test/Shentun.Peis.Application.Tests/appsettings.json @@ -8,6 +8,11 @@ //"Default": "Host=140.143.162.39;Port=5432;Database=ShentunPeis070703;User ID=postgres;Password=shentun123;", "Default": "Host=10.1.12.140;Port=5432;Database=ShentunPeis;User ID=postgres;Password=st123;" }, + "RemoteServices": { + "Default": { + "BaseUrl": "http://localhost:53929/" + } + }, "OpenIddict": { "Applications": { "Peis_Web": {