diff --git a/src/Shentun.Peis.Application.Contracts/LisRequests/LisRequestDto.cs b/src/Shentun.Peis.Application.Contracts/LisRequests/LisRequestDto.cs index 7256c64..cffacf6 100644 --- a/src/Shentun.Peis.Application.Contracts/LisRequests/LisRequestDto.cs +++ b/src/Shentun.Peis.Application.Contracts/LisRequests/LisRequestDto.cs @@ -61,7 +61,7 @@ namespace Shentun.Peis.LisRequests /// /// 组合项目简称(多个“,”号隔开) /// - public string AsbitemName { get; set; } + public string AsbitemNames { get; set; } /// /// 单位名称 diff --git a/src/Shentun.Peis.Application/LisRequests/LisRequestAppService.cs b/src/Shentun.Peis.Application/LisRequests/LisRequestAppService.cs index 0e41212..1272419 100644 --- a/src/Shentun.Peis.Application/LisRequests/LisRequestAppService.cs +++ b/src/Shentun.Peis.Application/LisRequests/LisRequestAppService.cs @@ -36,6 +36,8 @@ namespace Shentun.Peis.LisRequests private readonly IRepository _asbitemRepository; private readonly ILisRequestReportRepository _lisRequestReportRepository; private readonly LisRequestManager _lisRequestManager; + private readonly IRepository _sampleGroupRepository; + private readonly IRepository _sampleGroupDetailRepository; private readonly CacheService _cacheService; private readonly IRepository _customerOrgRepository; private readonly CustomerOrgManager _customerOrgManager; @@ -54,7 +56,9 @@ namespace Shentun.Peis.LisRequests IRepository registerCheckRepository, IRepository asbitemRepository, IRepository sampleContainerRepository, - IRepository sampleTypeRepository + IRepository sampleTypeRepository, + IRepository sampleGroupRepository, + IRepository sampleGroupDetailRepository ) { this._userRepository = userRepository; @@ -70,6 +74,8 @@ namespace Shentun.Peis.LisRequests _asbitemRepository = asbitemRepository; _sampleContainerRepository = sampleContainerRepository; _sampleTypeRepository = sampleTypeRepository; + _sampleGroupRepository = sampleGroupRepository; + _sampleGroupDetailRepository = sampleGroupDetailRepository; } [HttpPost("api/app/LisRequest/GetListInFilter")] @@ -182,7 +188,7 @@ namespace Shentun.Peis.LisRequests SampleContainerName = patient.sampleContainer.DisplayName, ContainerColor = patient.sampleContainer.ContainerColor, SampleContainerRemark = patient.sampleContainer.ContainerRemark, - AsbitemName = string.Join(",", patientList.OrderBy(o=>o.asbitem.DisplayOrder).Select(o=> o.asbitem.DisplayName ).Distinct()), + AsbitemNames = string.Join(",", patientList.OrderBy(o=>o.asbitem.DisplayOrder).Select(o=> o.asbitem.DisplayName ).Distinct()), CustomerOrgName = _cacheService.GetTopCustomerOrgAsync(patient.patientRegister.CustomerOrgId).Result.DisplayName, DepartmentName = _cacheService.GetCustomerOrgNameAsync(patient.patientRegister.CustomerOrgId).Result }; @@ -194,7 +200,151 @@ namespace Shentun.Peis.LisRequests return result; } + [HttpPost("api/app/LisRequest/GetListByFilter")] + public async Task> GetListByFilterAsync(GetLisRequestListDto input) + { + //var customerOrgList = await _customerOrgRepository.GetListAsync(); + + //Stopwatch stopwatch = Stopwatch.StartNew(); + //stopwatch.Start(); + + #region MyRegion + var patientRegisterQuery = (await _patientRegisterRepository.GetQueryableAsync()).Include(x => x.Patient).AsQueryable(); + + if (!string.IsNullOrEmpty(input.PatientNo)) + patientRegisterQuery = patientRegisterQuery.Where(m => m.Patient.PatientNo == input.PatientNo); + + if (!string.IsNullOrEmpty(input.IdNo)) + patientRegisterQuery = patientRegisterQuery.Where(m => m.Patient.IdNo == input.IdNo); + + if (!string.IsNullOrEmpty(input.PatientName)) + patientRegisterQuery = patientRegisterQuery.Where(m => !string.IsNullOrEmpty(m.PatientName) && m.PatientName.Contains(input.PatientName)); + + if (!string.IsNullOrEmpty(input.PatientRegisterNo)) + patientRegisterQuery = patientRegisterQuery.Where(m => m.PatientRegisterNo == input.PatientRegisterNo); + + if (!string.IsNullOrEmpty(input.Phone)) + patientRegisterQuery = patientRegisterQuery.Where(m => m.Patient.MobileTelephone == input.Phone || m.Patient.Telephone == input.Phone); + + if (input.SexId != null && input.SexId != ForSexFlag.All) + patientRegisterQuery = patientRegisterQuery.Where(m => m.SexId == input.SexId); + + if (input.EndDate == null) + input.EndDate = DateTime.Now; + + if (input.StartDate != null && input.EndDate != null) + patientRegisterQuery = patientRegisterQuery.Where(m => m.CreationTime >= input.StartDate && + m.CreationTime < ((DateTime)input.EndDate).AddDays(1)); + + + if (input.CustomerOrgId != null) + { + var CustomerOrgIds = await _customerOrgManager.GetCustomerOrgChildrenId(input.CustomerOrgId.Value); + patientRegisterQuery = patientRegisterQuery.Where(m => CustomerOrgIds.Contains(m.CustomerOrgId)); + } + + if (input.CustomerOrgRegisterId != null && input.CustomerOrgRegisterId != Guid.Empty) + { + patientRegisterQuery = patientRegisterQuery.Where(m => m.CustomerOrgRegisterId == input.CustomerOrgRegisterId); + } + patientRegisterQuery.Where(o => o.CompleteFlag != PatientRegisterCompleteFlag.PreRegistration); + #endregion + + + int totalCount = patientRegisterQuery.Count(); + + patientRegisterQuery = patientRegisterQuery.Skip(input.SkipCount * input.MaxResultCount).Take(input.MaxResultCount); + var patientRegisterList = patientRegisterQuery.ToList(); + if (patientRegisterList.Count > 10000) + { + throw new UserFriendlyException("选择的人员数不能超过1万条"); + } + var sampleGroups = await _sampleGroupRepository.GetListAsync(); + var _sampleGroupDetail = await _sampleGroupDetailRepository.GetListAsync(); + var patientRegisterRequests = ( + from patientRegister in patientRegisterQuery + join registerCheck in await _registerCheckRepository.GetQueryableAsync() + on patientRegister.Id equals registerCheck.PatientRegisterId + join registerCheckAsbitem in await _registerCheckAsbitemRepository.GetQueryableAsync() + on registerCheck.Id equals registerCheckAsbitem.RegisterCheckId + select new + { + patientRegister, + registerCheckAsbitem + }).ToList(); + //生成LIS申请数据 + var patientRegisters = patientRegisterRequests.Select(o=>o.patientRegister).Distinct().ToList(); + var createLisRequestList = new List(); + var updateRegisterCheckAsbitemList = new List(); + foreach (var patientRegister in patientRegisters) + { + var registerCheckAsbitems = patientRegisterRequests.Select(o=>o.registerCheckAsbitem) + .Where(o => o.PatientRegisterId == patientRegister.Id).Distinct().ToList(); + _lisRequestManager.Create(patientRegister, registerCheckAsbitems, sampleGroups, _sampleGroupDetail + , out var updateRegisterCheckAsbitems, out var createLisRequests); + createLisRequestList.AddRange(createLisRequests); + updateRegisterCheckAsbitemList.AddRange(updateRegisterCheckAsbitems); + } + await _lisRequestReportRepository.InsertManyAsync(createLisRequestList,true); + await _registerCheckAsbitemRepository.UpdateManyAsync(updateRegisterCheckAsbitemList, true); + + //返回检索到的数据 + var list = (from patient in await _patientRepository.GetQueryableAsync() + join patientRegister in patientRegisterQuery + on patient.Id equals patientRegister.PatientId + 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 asbitem in await _asbitemRepository.GetQueryableAsync() + on registerCheckAsbitem.AsbitemId equals asbitem.Id + join lisRequest in await _lisRequestReportRepository.GetQueryableAsync() + on registerCheckAsbitem.LisRequestId equals lisRequest.Id + join sampleContainer in await _sampleContainerRepository.GetQueryableAsync() + on lisRequest.SampleContainerId equals sampleContainer.Id + join sampleType in await _sampleTypeRepository.GetQueryableAsync() + on lisRequest.SampleTypeId equals sampleType.Id + select new + { + patient, + patientRegister, + asbitem, + lisRequest, + sampleContainer, + sampleType + }).ToList(); + var lisRequestIds = list.Select(o => new { Id = o.lisRequest.Id }).Distinct().ToList(); + + var lisRequestDtoList = new List(); + foreach (var lisRequestId in lisRequestIds) + { + var patientList = list.Where(o => o.lisRequest.Id == lisRequestId.Id).Distinct().ToList(); + var patient = patientList.First(); + var lisRequestDto = new LisRequestDto() + { + Id = lisRequestId.Id, + LisRequestNo = patient.lisRequest.LisRequestNo, + PatientNo = patient.patient.PatientNo, + PatientRegisterNo = patient.patientRegister.PatientRegisterNo, + PatientName = patient.patientRegister.PatientName, + SexName = _cacheService.GetSexNameAsync(patient.patientRegister.SexId).Result, + Age = patient.patientRegister.Age, + SampleTypeName = patient.sampleType.DisplayName, + SampleContainerName = patient.sampleContainer.DisplayName, + ContainerColor = patient.sampleContainer.ContainerColor, + SampleContainerRemark = patient.sampleContainer.ContainerRemark, + AsbitemNames = string.Join(",", patientList.OrderBy(o => o.asbitem.DisplayOrder).Select(o => o.asbitem.DisplayName).Distinct()), + CustomerOrgName = _cacheService.GetTopCustomerOrgAsync(patient.patientRegister.CustomerOrgId).Result.DisplayName, + DepartmentName = _cacheService.GetCustomerOrgNameAsync(patient.patientRegister.CustomerOrgId).Result + }; + lisRequestDtoList.Add(lisRequestDto); + } + lisRequestDtoList = lisRequestDtoList.OrderBy(o => o.PatientNo).ToList(); + var result = new PagedResultDto(patientRegisterList.Count, lisRequestDtoList); + + return result; + } /// /// 生成检验申请单 首次自动生成 /// diff --git a/src/Shentun.Peis.Domain/LisRequests/LisRequestManager.cs b/src/Shentun.Peis.Domain/LisRequests/LisRequestManager.cs index 2871780..c4c2f68 100644 --- a/src/Shentun.Peis.Domain/LisRequests/LisRequestManager.cs +++ b/src/Shentun.Peis.Domain/LisRequests/LisRequestManager.cs @@ -59,12 +59,84 @@ namespace Shentun.Peis.LisRequests .Where(m => m.PatientRegisterId == PatientRegisterId && m.LisRequestId == null) .ToList(); - var registerCheckAsbitems = registerCheckAsbitemList.Select(o=>o.Id).ToList(); + var registerCheckAsbitems = registerCheckAsbitemList.Select(o => o.Id).ToList(); lisRequests = await AddLisRequestAsync(registerCheckAsbitems); - + return lisRequests; } + public void Create(PatientRegister patientRegister, + List registerCheckAsbitems, + List sampleGroups, + List sampleGroupDetails, + out List updateRegisterCheckAsbitems, + out List createLisRequests) + { + var registerCheckAsbitemLisList = new List(); + updateRegisterCheckAsbitems = new List(); + foreach (var registerCheckAsbitem in registerCheckAsbitems) + { + var sampleGroupDetail = sampleGroupDetails.Where(o => o.AsbitemId == registerCheckAsbitem.AsbitemId).FirstOrDefault(); + if (sampleGroupDetail != null) + { + registerCheckAsbitemLisList.Add(new RegisterCheckAsbitemLis() + { + RegisterCheckAsbitemId = registerCheckAsbitem.Id, + SampleGroupId = sampleGroupDetail.SampleGroupId, + LisRequestId = registerCheckAsbitem.LisRequestId, + }); + } + } + //未设置的申请单设置到相同分组的已有申请单 + var noRequestCheckAsbitems = registerCheckAsbitems.Where(o=>o.LisRequestId == null || o.LisRequestId == Guid.Empty).ToList(); + foreach(var registerCheckAsbitem in noRequestCheckAsbitems) + { + var registerCheckAsbitemLis = registerCheckAsbitemLisList.Where(o => o.RegisterCheckAsbitemId == registerCheckAsbitem.Id).SingleOrDefault(); + if (registerCheckAsbitemLis == null) + { + continue; + } + var haveRegisterCheckAsbitemLis = registerCheckAsbitemLisList.Where(o => o.SampleGroupId == registerCheckAsbitemLis.SampleGroupId + && o.LisRequestId != null && o.LisRequestId != Guid.Empty).SingleOrDefault(); + if( haveRegisterCheckAsbitemLis != null) + { + registerCheckAsbitem.LisRequestId = haveRegisterCheckAsbitemLis.LisRequestId; + updateRegisterCheckAsbitems.Add(registerCheckAsbitem); + } + } + //未设置的项目重新设置申请单 + noRequestCheckAsbitems = registerCheckAsbitems.Where(o => o.LisRequestId == null || o.LisRequestId == Guid.Empty).ToList(); + var noRequestLisList = registerCheckAsbitemLisList.Where(o => noRequestCheckAsbitems.Select(o => o.Id).Contains(o.RegisterCheckAsbitemId)).ToList(); + var sampleGroupids = noRequestLisList.Select(o => o.SampleGroupId).Distinct(); + createLisRequests = new List(); + foreach ( var sampleGroupid in sampleGroupids) + { + var sampleGroup = sampleGroups.Where(o => o.Id == sampleGroupid).Single(); + //var guid = GuidGenerator.Create(); + var lisRequest = new LisRequest(GuidGenerator.Create()) + { + IsPrint = 'N', + IsSignIn = 'N', + LisRequestNo = CreateLisRequestNo(patientRegister.MedicalCenterId).Result, + SampleContainerId = sampleGroup.SampleContainerId, + SampleTypeId = sampleGroup.SampleTypeId + }; + createLisRequests.Add(lisRequest); + foreach (var requestLis in noRequestLisList) + { + if(requestLis.SampleGroupId == sampleGroupid) + { + requestLis.LisRequestId = lisRequest.Id; + var registerCheckAsbitem = noRequestCheckAsbitems.Where(o => o.Id == requestLis.RegisterCheckAsbitemId).Single(); + registerCheckAsbitem.LisRequestId = lisRequest.Id; + updateRegisterCheckAsbitems.Add(registerCheckAsbitem); + } + } + } + + + } + /// /// 追加项目到检验单 如lisrequest内有项目完成体检或者弃检 不允许追加 @@ -203,7 +275,7 @@ namespace Shentun.Peis.LisRequests lis_request_no_rule_coding = await _sysParmValueManager.GetSysParmValueAsync(medicalCenterId, "lis_request_no_rule_coding"); lis_request_no_rule_tail_len = await _sysParmValueManager.GetSysParmValueAsync(medicalCenterId, "lis_request_no_rule_tail_len"); lis_request_no_rule_prefix = await _sysParmValueManager.GetSysParmValueAsync(medicalCenterId, "lis_request_no_rule_prefix"); - if(string.IsNullOrWhiteSpace(lis_request_no_rule_coding)) + if (string.IsNullOrWhiteSpace(lis_request_no_rule_coding)) { throw new UserFriendlyException("LIS编码方式不能为空"); } @@ -212,11 +284,11 @@ namespace Shentun.Peis.LisRequests throw new UserFriendlyException("LIS编码尾号长度不能为空"); } int tailLen = 0; - if(!int.TryParse(lis_request_no_rule_tail_len, out tailLen)) + if (!int.TryParse(lis_request_no_rule_tail_len, out tailLen)) { throw new UserFriendlyException("LIS编码尾号长度不能为空"); } - if(tailLen < 3) + if (tailLen < 3) { throw new UserFriendlyException("LIS编码尾号长度至少为3位"); } @@ -306,5 +378,13 @@ namespace Shentun.Peis.LisRequests return LisRequestNo; } + + private class RegisterCheckAsbitemLis + { + public Guid RegisterCheckAsbitemId { get; set; } + public Guid SampleGroupId { get; set; } + public Guid? LisRequestId { get; set; } + } + } } diff --git a/test/Shentun.Peis.Application.Tests/LisRequestAppServiceTest.cs b/test/Shentun.Peis.Application.Tests/LisRequestAppServiceTest.cs index 2b57784..62b9768 100644 --- a/test/Shentun.Peis.Application.Tests/LisRequestAppServiceTest.cs +++ b/test/Shentun.Peis.Application.Tests/LisRequestAppServiceTest.cs @@ -44,7 +44,27 @@ namespace Shentun.Peis }); foreach (var item in pagedResultDto.Items) { - _output.WriteLine(item.PatientName + "," + item.AsbitemName); + _output.WriteLine(item.PatientName + "," + item.AsbitemNames); + } + + await unitOfWork.CompleteAsync(); + } + } + + [Fact] + public async Task GetListByFilterAsync() + { + using (var unitOfWork = _unitOfWorkManager.Begin(isTransactional: true)) + { + + PagedResultDto pagedResultDto = await _appService.GetListByFilterAsync(new GetLisRequestListDto() + { + StartDate = DateTime.Now.Date.AddDays(-30), + MaxResultCount = 1000 + }); + foreach (var item in pagedResultDto.Items) + { + _output.WriteLine(item.PatientName + "," + item.AsbitemNames); } await unitOfWork.CompleteAsync(); diff --git a/test/Shentun.Peis.ColumnReference.Tests/ColumnReferencePlugInsTest.cs b/test/Shentun.Peis.ColumnReference.Tests/ColumnReferencePlugInsTest.cs index 2725deb..91cb174 100644 --- a/test/Shentun.Peis.ColumnReference.Tests/ColumnReferencePlugInsTest.cs +++ b/test/Shentun.Peis.ColumnReference.Tests/ColumnReferencePlugInsTest.cs @@ -50,5 +50,13 @@ namespace Shentun.Peis.PlugIns.Tests } } + + [Fact] + public void GetPYSimpleCode() + { + var simpleCode = LanguageConverter.GetPYSimpleCode("血常规5项"); + _output.WriteLine(simpleCode); + + } } } diff --git a/test/Shentun.Peis.Domain.Tests/LisRequestManagerTest.cs b/test/Shentun.Peis.Domain.Tests/LisRequestManagerTest.cs new file mode 100644 index 0000000..4023130 --- /dev/null +++ b/test/Shentun.Peis.Domain.Tests/LisRequestManagerTest.cs @@ -0,0 +1,63 @@ +using NPOI.SS.Formula.Functions; +using Shentun.Peis.CardRegisters; +using Shentun.Peis.Enums; +using Shentun.Peis.IncludeDetails; +using Shentun.Peis.LisRequests; +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 LisRequestManagerTest : PeisDomainTestBase + { + private readonly IRepository _repository; + private readonly IRepository _patientRegisterRepository; + private readonly IRepository _registerCheckAsbitemRepository; + private readonly IRepository _sampleGroupRepository; + private readonly IRepository _sampleGroupDetailRepository; + + private readonly LisRequestManager _manager; + private readonly ITestOutputHelper _output; + private readonly IUnitOfWorkManager _unitOfWorkManager; + public LisRequestManagerTest(ITestOutputHelper output) + { + _output = output; + _repository = GetRequiredService>(); + _patientRegisterRepository = GetRequiredService>(); + _registerCheckAsbitemRepository = GetRequiredService>(); + _sampleGroupRepository = GetRequiredService>(); + _sampleGroupDetailRepository = GetRequiredService>(); + + _manager = GetRequiredService(); + + _unitOfWorkManager = GetRequiredService(); + } + [Fact] + public async Task Create() + { + using (IUnitOfWork unitOfWork = _unitOfWorkManager.Begin()) + { + var patientRegister = await _patientRegisterRepository.GetAsync(new Guid("3a11ee70-02cb-c5e6-a087-79ecdd0356b6")); + var registerCheckAsbitems = await _registerCheckAsbitemRepository.GetListAsync(o => o.PatientRegisterId == patientRegister.Id); + var sampleGroups = await _sampleGroupRepository.GetListAsync(); + var _sampleGroupDetail = await _sampleGroupDetailRepository.GetListAsync(); + _manager.Create(patientRegister, registerCheckAsbitems, sampleGroups, _sampleGroupDetail + ,out var updateRegisterCheckAsbitems,out var createLisRequests); + + await _repository.InsertManyAsync(createLisRequests); + await _registerCheckAsbitemRepository.UpdateManyAsync(updateRegisterCheckAsbitems); + await unitOfWork.CompleteAsync(); + + + } + } + } +} diff --git a/test/Shentun.Peis.EntityFrameworkCore.Tests/EntityFrameworkCore/PeisEntityFrameworkCoreTestModule.cs b/test/Shentun.Peis.EntityFrameworkCore.Tests/EntityFrameworkCore/PeisEntityFrameworkCoreTestModule.cs index 199c37d..c4c6915 100644 --- a/test/Shentun.Peis.EntityFrameworkCore.Tests/EntityFrameworkCore/PeisEntityFrameworkCoreTestModule.cs +++ b/test/Shentun.Peis.EntityFrameworkCore.Tests/EntityFrameworkCore/PeisEntityFrameworkCoreTestModule.cs @@ -40,8 +40,8 @@ public class PeisEntityFrameworkCoreTestModule : AbpModule } private void ConfigurePostGress(IServiceCollection services) { - //string connectStr = "Host=140.143.162.39;Port=5432;Database=ShentunPeis070703;User ID=postgres;Password=shentun123"; - string connectStr = "Host=10.1.12.140;Port=5432;Database=ShentunPeis;User ID=postgres;Password=st123;"; + string connectStr = "Host=140.143.162.39;Port=5432;Database=ShentunPeis070703;User ID=postgres;Password=shentun123"; + //string connectStr = "Host=10.1.12.140;Port=5432;Database=ShentunPeis;User ID=postgres;Password=st123;"; services.Configure(options => {