From a929513ad43261fa2701f92ab98967be5fc884e5 Mon Sep 17 00:00:00 2001 From: "DESKTOP-G961P6V\\Zhh" <839860190@qq.com> Date: Sun, 16 Jun 2024 22:54:34 +0800 Subject: [PATCH 1/4] =?UTF-8?q?=E9=A2=84=E7=BA=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AppointPatientRegisterAppService.cs | 2 +- .../QuestionRegisters/QuestionRegisterAppService.cs | 7 ------- 2 files changed, 1 insertion(+), 8 deletions(-) diff --git a/src/Shentun.WebPeis.Application/AppointPatientRegisters/AppointPatientRegisterAppService.cs b/src/Shentun.WebPeis.Application/AppointPatientRegisters/AppointPatientRegisterAppService.cs index b323d06..0802398 100644 --- a/src/Shentun.WebPeis.Application/AppointPatientRegisters/AppointPatientRegisterAppService.cs +++ b/src/Shentun.WebPeis.Application/AppointPatientRegisters/AppointPatientRegisterAppService.cs @@ -91,7 +91,7 @@ namespace Shentun.WebPeis.AppointPatientRegisters } /// - /// 预约,小程序使用 + /// 创建预约,小程序使用 /// /// /// diff --git a/src/Shentun.WebPeis.Application/QuestionRegisters/QuestionRegisterAppService.cs b/src/Shentun.WebPeis.Application/QuestionRegisters/QuestionRegisterAppService.cs index c23b52d..dd5abb2 100644 --- a/src/Shentun.WebPeis.Application/QuestionRegisters/QuestionRegisterAppService.cs +++ b/src/Shentun.WebPeis.Application/QuestionRegisters/QuestionRegisterAppService.cs @@ -77,13 +77,6 @@ namespace Shentun.WebPeis.QuestionRegisters questionRegisterDto = await GetBasicDataAsync(input); if (questionRegister == null) { - //没有登记过 - //questionRegister = new QuestionRegister(); - //questionRegister.PersonId = input.PersonId; - //questionRegister = await _questionRegisterManager.CreateAsync(questionRegister); - //await _repository.InsertAsync(questionRegister); - //questionRegisterDto.QuestionRegisterId = questionRegister.QuestionRegisterId; - //await _unitOfWorkManager.Current.SaveChangesAsync(); return questionRegisterDto; } questionRegisterDto.QuestionRegisterId = questionRegister.QuestionRegisterId; From 5266753523f16fda0c1912b773263b45127f50c7 Mon Sep 17 00:00:00 2001 From: "DESKTOP-G961P6V\\Zhh" <839860190@qq.com> Date: Mon, 17 Jun 2024 01:25:53 +0800 Subject: [PATCH 2/4] =?UTF-8?q?=E9=A2=84=E7=BA=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../PersonDiseaseRiskLevelDto.cs | 75 ++++ .../RecommendMedicalPackageDto.cs | 87 +++++ ...icalPackagePersonAndRecommendIdInputDto.cs | 18 + .../QuestionRegisterDiseaseRiskDto.cs | 7 +- .../AppointPatientRegisterAppService.cs | 332 +++++++++++++++++- .../QuestionRegisterAppService.cs | 1 + .../Models/MedicalPackage.cs | 9 +- .../Configures/MedicalPackageConfigure.cs | 6 + .../AppointPatientRegisterAppServiceTest.cs | 26 ++ 9 files changed, 547 insertions(+), 14 deletions(-) create mode 100644 src/Shentun.WebPeis.Application.Contracts/AppointPatientRegisters/PersonDiseaseRiskLevelDto.cs create mode 100644 src/Shentun.WebPeis.Application.Contracts/AppointPatientRegisters/RecommendMedicalPackageDto.cs create mode 100644 src/Shentun.WebPeis.Application.Contracts/AppointPatientRegisters/RecommendMedicalPackagePersonAndRecommendIdInputDto.cs diff --git a/src/Shentun.WebPeis.Application.Contracts/AppointPatientRegisters/PersonDiseaseRiskLevelDto.cs b/src/Shentun.WebPeis.Application.Contracts/AppointPatientRegisters/PersonDiseaseRiskLevelDto.cs new file mode 100644 index 0000000..251278b --- /dev/null +++ b/src/Shentun.WebPeis.Application.Contracts/AppointPatientRegisters/PersonDiseaseRiskLevelDto.cs @@ -0,0 +1,75 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace Shentun.WebPeis.AppointPatientRegisters +{ + public class PersonDiseaseRiskLevelDto + { + /// + /// 主键 + /// + public Guid DiseaseRiskId { get; set; } + /// + /// 名称 + /// + + public string DiseaseRiskName { get; set; } = null!; + + /// + /// 显示顺序 + /// + + public int DisplayOrder { get; set; } + + /// + /// 风险级别ID + /// + public Guid? DiseaseRiskLevelId { get; set; } + /// + /// 风险级别名称 + /// + + public string DiseaseRiskLevelName { get; set; } + + public List Asbitems { get; set; } = new List(); + } + + public class PersonDiseaseRiskLevelAsbitem + { + /// + /// 编号 + /// + public Guid AsbitemId { get; set; } + + /// + /// 名称 + /// + public string AsbitemName { get; set; } = null!; + + /// + /// 简称 + /// + public string? ShortName { get; set; } + + /// + /// 价格 + /// + public decimal Price { get; set; } + /// + /// 临床意义 + /// + public string? ClinicalMeaning { get; set; } + + /// + /// 警告事项 + /// + public string? Warn { get; set; } + + public char IsBelongMedicalPackage { get; set; } + + public int AsbitemRecommendLevelId { get; set; } + + public int DisplayOrder { get; set; } + } +} diff --git a/src/Shentun.WebPeis.Application.Contracts/AppointPatientRegisters/RecommendMedicalPackageDto.cs b/src/Shentun.WebPeis.Application.Contracts/AppointPatientRegisters/RecommendMedicalPackageDto.cs new file mode 100644 index 0000000..febbcfe --- /dev/null +++ b/src/Shentun.WebPeis.Application.Contracts/AppointPatientRegisters/RecommendMedicalPackageDto.cs @@ -0,0 +1,87 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace Shentun.WebPeis.AppointPatientRegisters +{ + public class RecommendMedicalPackageDto + { + /// + /// 套餐主档编号 + /// + public Guid MedicalPackageId { get; set; } + + /// + /// 名称 + /// + public string MedicalPackageName { get; set; } = null!; + + /// + /// 价格 + /// + public decimal Price { get; set; } + + /// + /// 套餐和推荐项目总价格 + /// + public decimal SumPrice { get; set; } + + /// + /// 备注 + /// + public string? Remark { get; set; } + + /// + /// 显示顺序 + /// + public int DisplayOrder { get; set; } + + /// + /// 套餐组合项目 + /// + public List Asbitems { get; set; } = new List(); + + /// + /// 风险级别推荐组合项目 + /// + public List DiseaseRiskLevelAsbitems { get; set; } = new List(); + + + } + + public class RecommendMedicalPackageAsbitem + { + /// + /// 编号 + /// + public Guid AsbitemId { get; set; } + + /// + /// 名称 + /// + public string AsbitemName { get; set; } = null!; + + /// + /// 简称 + /// + public string? ShortName { get; set; } + + /// + /// 价格 + /// + public decimal Price { get; set; } + /// + /// 临床意义 + /// + public string? ClinicalMeaning { get; set; } + + /// + /// 警告事项 + /// + public string? Warn { get; set; } + + public char IsBelongMedicalPackage { get; set; } + + public int DisplayOrder { get; set; } + } +} diff --git a/src/Shentun.WebPeis.Application.Contracts/AppointPatientRegisters/RecommendMedicalPackagePersonAndRecommendIdInputDto.cs b/src/Shentun.WebPeis.Application.Contracts/AppointPatientRegisters/RecommendMedicalPackagePersonAndRecommendIdInputDto.cs new file mode 100644 index 0000000..a53903c --- /dev/null +++ b/src/Shentun.WebPeis.Application.Contracts/AppointPatientRegisters/RecommendMedicalPackagePersonAndRecommendIdInputDto.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace Shentun.WebPeis.AppointPatientRegisters +{ + public class RecommendMedicalPackagePersonAndRecommendIdInputDto + { + /// + /// 人员ID + /// + public Guid PersonId { get; set; } + /// + /// 推荐ID + /// + public int RecommendId { get; set; } + } +} diff --git a/src/Shentun.WebPeis.Application.Contracts/QuestionRegisters/QuestionRegisterDiseaseRiskDto.cs b/src/Shentun.WebPeis.Application.Contracts/QuestionRegisters/QuestionRegisterDiseaseRiskDto.cs index f39013f..a7b8804 100644 --- a/src/Shentun.WebPeis.Application.Contracts/QuestionRegisters/QuestionRegisterDiseaseRiskDto.cs +++ b/src/Shentun.WebPeis.Application.Contracts/QuestionRegisters/QuestionRegisterDiseaseRiskDto.cs @@ -21,8 +21,13 @@ namespace Shentun.WebPeis.QuestionRegisters /// public int DisplayOrder { get; set; } + + /// + /// 风险级别ID + /// + public Guid? DiseaseRiskLevelId { get; set; } /// - /// 风险级别 + /// 风险级别名称 /// public string DiseaseRiskLevelName { get; set; } diff --git a/src/Shentun.WebPeis.Application/AppointPatientRegisters/AppointPatientRegisterAppService.cs b/src/Shentun.WebPeis.Application/AppointPatientRegisters/AppointPatientRegisterAppService.cs index 0802398..f9e20fd 100644 --- a/src/Shentun.WebPeis.Application/AppointPatientRegisters/AppointPatientRegisterAppService.cs +++ b/src/Shentun.WebPeis.Application/AppointPatientRegisters/AppointPatientRegisterAppService.cs @@ -8,16 +8,19 @@ using Shentun.WebPeis.Models; using Shentun.WebPeis.OrganizationUnits; using Shentun.WebPeis.PatientRegisters; using Shentun.WebPeis.Persons; +using Shentun.WebPeis.QuestionRegisters; using System; using System.Collections; using System.Collections.Generic; using System.Linq; +using System.Security.Cryptography.X509Certificates; using System.Text; using System.Threading.Tasks; using Volo.Abp; using Volo.Abp.Application.Services; using Volo.Abp.Domain.Repositories; using Volo.Abp.Identity; +using Volo.Abp.Uow; using static Volo.Abp.Identity.Settings.IdentitySettingNames; namespace Shentun.WebPeis.AppointPatientRegisters @@ -48,6 +51,17 @@ namespace Shentun.WebPeis.AppointPatientRegisters private readonly IRepository _patientRepository; private readonly IRepository _registerCheckRepository; private readonly IRepository _registerCheckAsbitemRepository; + + private readonly IRepository _questionRegisterRepository; + private readonly IRepository _questionRegisterItemRepository; + private readonly IRepository _questionRegisterAnswerRrepository; + private readonly IRepository _questionRepository; + private readonly IRepository _questionAnswerRepository; + private readonly IRepository _questionSubjectTypeRepository; + private readonly IRepository _diseaseRiskRepository; + private readonly IRepository _diseaseRiskLevelRepository; + private readonly IRepository _diseaseRiskLevelAnswerRepository; + private readonly IRepository _diseaseRiskLevelAsbitemRepository; public AppointPatientRegisterAppService(IRepository repository, CacheService cacheService, IRepository itemTypeRepository, @@ -66,7 +80,19 @@ namespace Shentun.WebPeis.AppointPatientRegisters IRepository patientRegisterRepository, IRepository patientRepository, IRepository registerCheckRepository, - IRepository registerCheckAsbitemRepository + IRepository registerCheckAsbitemRepository, + + IRepository questionRegisterRepository, + IRepository questionRegisterItemRepository, + IRepository questionRegisterAnswerRrepository, + IRepository questionRepository, + IRepository questionAnswerRepository, + IRepository questionSubjectTypeRepository, + IRepository diseaseRiskRepository, + IRepository diseaseRiskLevelRepository, + IRepository diseaseRiskLevelAnswerRepository, + IRepository diseaseRiskLevelAsbitemRepository + ) { _repository = repository; @@ -89,6 +115,18 @@ namespace Shentun.WebPeis.AppointPatientRegisters _registerCheckAsbitemRepository = registerCheckAsbitemRepository; _registerCheckRepository = registerCheckRepository; + _questionRegisterRepository = questionRegisterRepository; + _questionRegisterItemRepository = questionRegisterItemRepository; + _questionRegisterAnswerRrepository = questionRegisterAnswerRrepository; + _questionRepository = questionRepository; + _questionAnswerRepository = questionAnswerRepository; + _questionSubjectTypeRepository = questionSubjectTypeRepository; + _diseaseRiskRepository = diseaseRiskRepository; + _diseaseRiskLevelRepository = diseaseRiskLevelRepository; + _diseaseRiskLevelAnswerRepository = diseaseRiskLevelAnswerRepository; + _diseaseRiskLevelAsbitemRepository = diseaseRiskLevelAsbitemRepository; + + } /// /// 创建预约,小程序使用 @@ -226,7 +264,7 @@ namespace Shentun.WebPeis.AppointPatientRegisters query = query.Where(o => o.user.PhoneNumber == input.MobilePhone); } - if(input.CompleteFlag != null) + if (input.CompleteFlag != null) { query = query.Where(o => o.appointPatientRegister.CompleteFlag == input.CompleteFlag); } @@ -280,7 +318,7 @@ namespace Shentun.WebPeis.AppointPatientRegisters { if (input == null) throw new UserFriendlyException("参数不能为空"); - + var query = (from user in await _identityUserRepository.GetQueryableAsync() join person in await _personRepository.GetQueryableAsync() on user.Id equals person.PersonId @@ -298,7 +336,7 @@ namespace Shentun.WebPeis.AppointPatientRegisters on appointRegisterAsbitem.AsbitemId equals asbitem.AsbitemId join customerOrg in await _customerOrgRepository.GetQueryableAsync() on appointPatientRegister.CustomerOrgId equals customerOrg.CustomerOrgId - where appointPatientRegister.PersonId == input.PersonId && + where appointPatientRegister.PersonId == input.PersonId && appointPatientRegister.CompleteFlag != AppointPatientRegisterCompleteFlag.CancelAppoint orderby appointPatientRegister.AppointDate select new @@ -335,7 +373,7 @@ namespace Shentun.WebPeis.AppointPatientRegisters MedicalPackageName = o.FirstOrDefault().haveMedicalPackage == null ? "" : o.FirstOrDefault().haveMedicalPackage.MedicalPackageName, MedicalCenterId = o.FirstOrDefault().appointPatientRegister.MedicalCenterId, CompleteFlag = o.FirstOrDefault().appointPatientRegister.CompleteFlag, - + AppointDate = o.FirstOrDefault().appointPatientRegister.AppointDate, Remark = o.FirstOrDefault().appointPatientRegister.Remark, PregnantFlag = o.FirstOrDefault().appointPatientRegister.PregnantFlag, @@ -344,7 +382,7 @@ namespace Shentun.WebPeis.AppointPatientRegisters SexName = _cacheService.GetSexNameAsync(o.FirstOrDefault().person.SexId).Result, MaritalStatusName = _cacheService.GetMaritalStatusNameAsync(o.FirstOrDefault().person.MaritalStatusId).Result, CustomerOrgName = _customerOrgManager.GetTopCustomerOrgAsync(o.FirstOrDefault().appointPatientRegister.CustomerOrgId).Result.CustomerOrgName - + }).ToList(); @@ -360,8 +398,8 @@ namespace Shentun.WebPeis.AppointPatientRegisters [HttpPost("api/app/AppointPatientRegister/CancelAppoint")] public async Task CancelAppointAsync(AppointPatientRegisterIdInputDto input) { - var appointPatientRegister = await _repository.GetAsync(o => o.AppointPatientRegisterId == input.AppointPatientRegisterId); - if(appointPatientRegister.IsCharge == 'Y') + var appointPatientRegister = await _repository.GetAsync(o => o.AppointPatientRegisterId == input.AppointPatientRegisterId); + if (appointPatientRegister.IsCharge == 'Y') { throw new UserFriendlyException("已收费不能取消"); } @@ -453,7 +491,7 @@ namespace Shentun.WebPeis.AppointPatientRegisters [HttpPost("api/app/AppointPatientRegister/GetCustomerOrgAppointPatientRegisterByPersonId")] public async Task GetCustomerOrgAppointPatientRegisterByPersonIdAsync(PersonIdInputDto input) { - + var patientRegisterDto = (from user in await _identityUserRepository.GetQueryableAsync() join person in await _personRepository.GetQueryableAsync() on user.Id equals person.PersonId @@ -478,8 +516,8 @@ namespace Shentun.WebPeis.AppointPatientRegisters ChildCustomerOrgName = customerOrg.CustomerOrgName, CustomerOrgRegisterId = patientRegister.CustomerOrgRegisterId, CustomerOrgGroupId = patientRegister.CustomerOrgGroupId, - CustomerOrgGroupName = haveCustomerOrgGroup == null?"": haveCustomerOrgGroup.CustomerOrgGroupName, - Price = haveCustomerOrgGroup == null ? 0:haveCustomerOrgGroup.Price, + CustomerOrgGroupName = haveCustomerOrgGroup == null ? "" : haveCustomerOrgGroup.CustomerOrgGroupName, + Price = haveCustomerOrgGroup == null ? 0 : haveCustomerOrgGroup.Price, CanAddMoney = haveCustomerOrgGroup == null ? 0 : haveCustomerOrgGroup.CanAddMoney, }).FirstOrDefault(); if (patientRegisterDto == null) @@ -493,7 +531,7 @@ namespace Shentun.WebPeis.AppointPatientRegisters var appointPatientRegisters = await _repository.GetListAsync(o => o.PersonId == input.PersonId && o.AppointDate >= DateTime.Now.Date && o.CustomerOrgRegisterId == patientRegisterDto.CustomerOrgRegisterId && o.CompleteFlag != AppointPatientRegisterCompleteFlag.CancelAppoint); - if (appointPatientRegisters .Any()) + if (appointPatientRegisters.Any()) { throw new UserFriendlyException("已有今天及之后的团检预约订单,必须先取消订单才能重新预约"); } @@ -568,7 +606,277 @@ namespace Shentun.WebPeis.AppointPatientRegisters } + /// + /// 获取推荐个人套餐按优先级 + /// + /// + /// + [HttpPost("api/app/AppointPatientRegister/GetRecommendMedicalPackageByPersonAndRecommendId")] + public async Task GetRecommendMedicalPackageByPersonAndRecommendIdAsync(RecommendMedicalPackagePersonAndRecommendIdInputDto input) + { + var person = await _personRepository.GetAsync(o => o.PersonId == input.PersonId); + var medicalPackages = await _medicalPackageRepository.GetListAsync(o => o.IsActive == 'Y' && + o.IsWebAppoint == 'Y' && o.IsBasicRecommend == 'Y' && + (o.ForSexId == ForSexFlag.All || o.ForSexId == person.SexId)); + if (person.MaritalStatusId == MaritalStatusFlag.UnMarried) + { + //未婚 + if (medicalPackages.Where(o => o.MaritalStatusId == MaritalStatusFlag.Married).Any()) + { + medicalPackages = medicalPackages.Where(o => + o.MaritalStatusId == MaritalStatusFlag.UnMarried).ToList(); + } + else + { + medicalPackages = medicalPackages.Where(o => o.MaritalStatusId == MaritalStatusFlag.All).ToList(); + } + + + } + else if (person.MaritalStatusId != MaritalStatusFlag.UnKnown) + { + //已婚 + if (medicalPackages.Where(o => o.MaritalStatusId == MaritalStatusFlag.Married).Any()) + { + medicalPackages = medicalPackages.Where(o => o.MaritalStatusId == MaritalStatusFlag.Married).ToList(); + } + else + { + medicalPackages = medicalPackages.Where(o => o.MaritalStatusId == MaritalStatusFlag.All).ToList(); + } + } + + + var medicalPackage = medicalPackages.FirstOrDefault(); + if (medicalPackage == null) + { + return null; + } + + var recommendMedicalPackageDto = new RecommendMedicalPackageDto() + { + MedicalPackageId = medicalPackage.MedicalPackageId, + MedicalPackageName = medicalPackage.MedicalPackageName, + DisplayOrder = medicalPackage.DisplayOrder + }; + var medicalPackageAsbitems = (from medicalPackageDetail in await _medicalPackageDetailRepository.GetQueryableAsync() + join asbitem in await _asbitemRepository.GetQueryableAsync() + on medicalPackageDetail.AsbitemId equals asbitem.AsbitemId + where medicalPackageDetail.MedicalPackageId == medicalPackage.MedicalPackageId + select new RecommendMedicalPackageAsbitem() + { + AsbitemId = medicalPackageDetail.AsbitemId, + AsbitemName = asbitem.AsbitemName, + ShortName = asbitem.ShortName, + Price = asbitem.Price, + ClinicalMeaning = asbitem.ClinicalMeaning, + Warn = asbitem.Warn, + IsBelongMedicalPackage = 'Y', + DisplayOrder = asbitem.DisplayOrder + }).ToList(); + + recommendMedicalPackageDto.Asbitems.AddRange(medicalPackageAsbitems); + + var questionRegister = (await _repository.GetQueryableAsync()) + .Where(o => o.PersonId == input.PersonId) + .OrderByDescending(o => o.CreationTime) + .FirstOrDefault(); + + if (questionRegister == null) + { + return recommendMedicalPackageDto; + } + + //----推荐组合项目 + var personDiseaseRiskLevelDtos = await GetDiseaseRiskListByPersonIdAsync(input.PersonId); + foreach (var personDiseaseRiskLevelDto in personDiseaseRiskLevelDtos) + { + foreach (var personDiseaseRiskLevelAsbitem in personDiseaseRiskLevelDto.Asbitems) + { + if (medicalPackageAsbitems.Where(o => o.AsbitemId == personDiseaseRiskLevelAsbitem.AsbitemId).Any()) + { + personDiseaseRiskLevelAsbitem.IsBelongMedicalPackage = 'Y'; + } + } + } + + var personDiseaseRiskLevelResultDtos = new List(); + foreach (var personDiseaseRiskLevelDto in personDiseaseRiskLevelDtos) + { + var personDiseaseRiskLevelResultDto = new PersonDiseaseRiskLevelDto() + { + DiseaseRiskId = personDiseaseRiskLevelDto.DiseaseRiskId, + DiseaseRiskName = personDiseaseRiskLevelDto.DiseaseRiskName, + DisplayOrder = personDiseaseRiskLevelDto.DisplayOrder, + DiseaseRiskLevelId = personDiseaseRiskLevelDto.DiseaseRiskLevelId, + DiseaseRiskLevelName = personDiseaseRiskLevelDto.DiseaseRiskLevelName + }; + personDiseaseRiskLevelResultDtos.Add(personDiseaseRiskLevelResultDto); + } + //一级推荐组合项目 + foreach (var personDiseaseRiskLevelResultDto in personDiseaseRiskLevelResultDtos) + { + var personDiseaseRiskLevelDto = personDiseaseRiskLevelDtos.Where(o => + o.DiseaseRiskLevelId == personDiseaseRiskLevelResultDto.DiseaseRiskLevelId + ).First(); + var asbitems = personDiseaseRiskLevelDto.Asbitems.Where(o => o.AsbitemRecommendLevelId == input.RecommendId + || o.IsBelongMedicalPackage == 'Y') + .ToList(); + personDiseaseRiskLevelResultDto.Asbitems.AddRange(asbitems); + } + + recommendMedicalPackageDto.DiseaseRiskLevelAsbitems.AddRange(personDiseaseRiskLevelResultDtos); + return recommendMedicalPackageDto; + + } + /// + /// 获取推荐个人套餐列表 + /// + /// + /// + [HttpPost("api/app/AppointPatientRegister/GetRecommendMedicalPackageListByPersonId")] + public async Task> GetRecommendMedicalPackageListByPersonIdAsync(PersonIdInputDto input) + { + var recommendMedicalPackageDtos = new List(); + for (var i = 0; i < 3; i++) + { + + var recommendMedicalPackageDto = await GetRecommendMedicalPackageByPersonAndRecommendIdAsync(new RecommendMedicalPackagePersonAndRecommendIdInputDto() + { + PersonId = input.PersonId, + RecommendId = i + 1 + }); + if(i == 0) + { + recommendMedicalPackageDto.MedicalPackageName = "推荐必查方案"; + } + else if(i == 1) + { + recommendMedicalPackageDto.MedicalPackageName = "精准筛查方案"; + } + else if(i == 2) + { + recommendMedicalPackageDto.MedicalPackageName = "深入检查方案"; + } + recommendMedicalPackageDtos.Add(recommendMedicalPackageDto); + } + return recommendMedicalPackageDtos; + } + /// + /// 获取疾病风险和对应的组合项目列表 + /// + /// + /// + private async Task> GetDiseaseRiskListByPersonIdAsync(Guid personId) + { + var questionRegister = (await _questionRegisterRepository.GetQueryableAsync()) + .Where(o => o.PersonId == personId) + .OrderByDescending(o => o.CreationTime) + .FirstOrDefault(); + + if (questionRegister == null) + { + return null; + } + + var questionRegisterItems = (from questionRegisterItem in await _questionRegisterItemRepository.GetQueryableAsync() + join questionRegisterAnswer in await _questionRegisterAnswerRrepository.GetQueryableAsync() + on questionRegisterItem.QuestionRegisterItemId equals questionRegisterAnswer.QuestionRegisterItemId + join questionAnswer in await _questionAnswerRepository.GetQueryableAsync() + on questionRegisterAnswer.QuestionAnswerId equals questionAnswer.QuestionAnswerId + join question in await _questionRepository.GetQueryableAsync() + on questionRegisterItem.QuestionId equals question.QuestionId + join questionSubjectType in await _questionSubjectTypeRepository.GetQueryableAsync() + on question.QuestionSubjectTypeId equals questionSubjectType.QuestionSubjectTypeId + where questionRegisterItem.QuestionRegisterId == questionRegister.QuestionRegisterId + orderby questionSubjectType.DisplayOrder, question.DisplayOrder + select new + { + questionSubjectType, + question, + questionRegisterItem, + questionRegisterAnswer, + questionAnswer + }).ToList(); + + var diseaseRisks = (from diseaseRisk in await _diseaseRiskRepository.GetQueryableAsync() + join diseaseRiskLevel in await _diseaseRiskLevelRepository.GetQueryableAsync() + on diseaseRisk.DiseaseRiskId equals diseaseRiskLevel.DiseaseRiskId into emptyDiseaseRiskLevel + from haveDiseaseRiskLevel in emptyDiseaseRiskLevel.DefaultIfEmpty() + join diseaseRiskLevelAnswer in await _diseaseRiskLevelAnswerRepository.GetQueryableAsync() + on haveDiseaseRiskLevel.DiseaseRiskLevelId equals diseaseRiskLevelAnswer.DiseaseRiskLevelId into emptyDiseaseRiskLevelAnswer + from haveDiseaseRiskLevelAnswer in emptyDiseaseRiskLevelAnswer.DefaultIfEmpty() + orderby diseaseRisk.DisplayOrder + select new + { + diseaseRisk, + haveDiseaseRiskLevel, + haveDiseaseRiskLevelAnswer + }).ToList(); + + var questionRegisterDiseaseRiskDtos = diseaseRisks.GroupBy(o => o.diseaseRisk) + .Select(o => new PersonDiseaseRiskLevelDto() + { + DiseaseRiskId = o.Key.DiseaseRiskId, + DiseaseRiskName = o.Key.DiseaseRiskName, + DisplayOrder = o.Key.DisplayOrder + }).ToList(); + + foreach (var diseaseRisk in questionRegisterDiseaseRiskDtos) + { + //疾病级别必须按优先级别排序,取顺序最高的作为最高风险级 + var diseaseRiskLevels = diseaseRisks.Where(o => o.diseaseRisk.DiseaseRiskId == diseaseRisk.DiseaseRiskId + && o.haveDiseaseRiskLevel != null) + .OrderByDescending(o => o.haveDiseaseRiskLevel == null ? 1 : o.haveDiseaseRiskLevel.DisplayOrder).ToList(); + DiseaseRiskLevel matchDiseaseRiskLevel = null; + foreach (var diseaseRiskLevel in diseaseRiskLevels) + { + if (questionRegisterItems.Where(o => diseaseRiskLevel.haveDiseaseRiskLevelAnswer != null && + o.questionRegisterAnswer.QuestionAnswerId == + diseaseRiskLevel.haveDiseaseRiskLevelAnswer.QuestionAnswerId).Any()) + { + if (diseaseRiskLevel.haveDiseaseRiskLevel != null) + { + matchDiseaseRiskLevel = diseaseRiskLevel.haveDiseaseRiskLevel; + break; + } + + } + } + if (matchDiseaseRiskLevel == null) + { + matchDiseaseRiskLevel = diseaseRiskLevels.LastOrDefault() == null ? null : diseaseRiskLevels.LastOrDefault().haveDiseaseRiskLevel; + } + if (matchDiseaseRiskLevel != null) + { + diseaseRisk.DiseaseRiskLevelId = matchDiseaseRiskLevel.DiseaseRiskLevelId; + diseaseRisk.DiseaseRiskLevelName = matchDiseaseRiskLevel.DiseaseRiskLevelName; + + var personDiseaseRiskLevelAsbitems = (from diseaseRiskLevelAsbitem in await _diseaseRiskLevelAsbitemRepository.GetQueryableAsync() + join asbitem in await _asbitemRepository.GetQueryableAsync() + on diseaseRiskLevelAsbitem.AsbitemId equals asbitem.AsbitemId + where diseaseRiskLevelAsbitem.DiseaseRiskLevelId == diseaseRisk.DiseaseRiskLevelId + select new PersonDiseaseRiskLevelAsbitem() + { + AsbitemId = asbitem.AsbitemId, + AsbitemName = asbitem.AsbitemName, + ShortName = asbitem.ShortName, + Price = asbitem.Price, + ClinicalMeaning = asbitem.ClinicalMeaning, + Warn = asbitem.Warn, + DisplayOrder = asbitem.DisplayOrder, + AsbitemRecommendLevelId = diseaseRiskLevelAsbitem.AsbitemRecommendLevelId + }).ToList(); + diseaseRisk.Asbitems.AddRange(personDiseaseRiskLevelAsbitems); + } + + + + } + + return questionRegisterDiseaseRiskDtos; + } } } diff --git a/src/Shentun.WebPeis.Application/QuestionRegisters/QuestionRegisterAppService.cs b/src/Shentun.WebPeis.Application/QuestionRegisters/QuestionRegisterAppService.cs index dd5abb2..f954e8b 100644 --- a/src/Shentun.WebPeis.Application/QuestionRegisters/QuestionRegisterAppService.cs +++ b/src/Shentun.WebPeis.Application/QuestionRegisters/QuestionRegisterAppService.cs @@ -387,6 +387,7 @@ namespace Shentun.WebPeis.QuestionRegisters } else { + diseaseRisk.DiseaseRiskLevelId = matchDiseaseRiskLevel.DiseaseRiskLevelId; diseaseRisk.DiseaseRiskLevelName = matchDiseaseRiskLevel.DiseaseRiskLevelName; } diff --git a/src/Shentun.WebPeis.Domain/Models/MedicalPackage.cs b/src/Shentun.WebPeis.Domain/Models/MedicalPackage.cs index cc4deeb..3049bec 100644 --- a/src/Shentun.WebPeis.Domain/Models/MedicalPackage.cs +++ b/src/Shentun.WebPeis.Domain/Models/MedicalPackage.cs @@ -50,8 +50,15 @@ public partial class MedicalPackage: AuditedEntity, IHasConcurrencyStamp public string? ConcurrencyStamp { get; set; } - + /// + /// 支持WEB预约 + /// public char? IsWebAppoint { get; set; } + /// + /// 是基础套餐 + /// + + public char? IsBasicRecommend { get; set; } /// /// 适用婚姻状况 diff --git a/src/Shentun.WebPeis.EntityFrameworkCore/Configures/MedicalPackageConfigure.cs b/src/Shentun.WebPeis.EntityFrameworkCore/Configures/MedicalPackageConfigure.cs index e4359ca..6cac438 100644 --- a/src/Shentun.WebPeis.EntityFrameworkCore/Configures/MedicalPackageConfigure.cs +++ b/src/Shentun.WebPeis.EntityFrameworkCore/Configures/MedicalPackageConfigure.cs @@ -69,6 +69,12 @@ namespace Shentun.WebPeis.Configures .HasMaxLength(1) .IsRequired() .HasColumnName("marital_status_id"); + + entity.Property(e => e.IsBasicRecommend) + .HasMaxLength(1) + .IsRequired() + .HasDefaultValueSql("'N'::bpchar") + .HasColumnName("is_basic_recommend"); } } } diff --git a/test/Shentun.WebPeis.Application.Tests/AppointPatientRegisterAppServiceTest.cs b/test/Shentun.WebPeis.Application.Tests/AppointPatientRegisterAppServiceTest.cs index ddd788a..147de38 100644 --- a/test/Shentun.WebPeis.Application.Tests/AppointPatientRegisterAppServiceTest.cs +++ b/test/Shentun.WebPeis.Application.Tests/AppointPatientRegisterAppServiceTest.cs @@ -110,5 +110,31 @@ namespace Shentun.WebPeis await unitOfWork.CompleteAsync(); } } + + + [Fact] + public async Task GetRecommendMedicalPackageListByPersonIdAsync() + { + using (var unitOfWork = _unitOfWorkManager.Begin(isTransactional: true)) + { + + var entity = new PersonIdInputDto() + { + PersonId = new Guid("3a12d72c-19d9-e8b2-71f6-cf283103e191") + }; + var list = await _appService.GetRecommendMedicalPackageListByPersonIdAsync(entity); + foreach (var item in list) + { + _output.WriteLine(item.MedicalPackageName); + foreach(var item2 in item.Asbitems) + { + _output.WriteLine(item2.AsbitemName + "-" + item2.IsBelongMedicalPackage); + } + + } + await unitOfWork.CompleteAsync(); + } + } + } } From f400453ae23a35f76442878a611eaa22b3c69b51 Mon Sep 17 00:00:00 2001 From: "DESKTOP-G961P6V\\Zhh" <839860190@qq.com> Date: Mon, 17 Jun 2024 02:42:47 +0800 Subject: [PATCH 3/4] =?UTF-8?q?=E9=A2=84=E7=BA=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../PersonDiseaseRiskLevelDto.cs | 62 +++++++++---------- .../RecommendMedicalPackageDto.cs | 11 ++++ .../AppointPatientRegisterAppService.cs | 55 ++++++++-------- .../AppointPatientRegisterAppServiceTest.cs | 11 +++- 4 files changed, 81 insertions(+), 58 deletions(-) diff --git a/src/Shentun.WebPeis.Application.Contracts/AppointPatientRegisters/PersonDiseaseRiskLevelDto.cs b/src/Shentun.WebPeis.Application.Contracts/AppointPatientRegisters/PersonDiseaseRiskLevelDto.cs index 251278b..b08a70b 100644 --- a/src/Shentun.WebPeis.Application.Contracts/AppointPatientRegisters/PersonDiseaseRiskLevelDto.cs +++ b/src/Shentun.WebPeis.Application.Contracts/AppointPatientRegisters/PersonDiseaseRiskLevelDto.cs @@ -32,44 +32,44 @@ namespace Shentun.WebPeis.AppointPatientRegisters public string DiseaseRiskLevelName { get; set; } - public List Asbitems { get; set; } = new List(); + public List Asbitems { get; set; } = new List(); } - public class PersonDiseaseRiskLevelAsbitem - { - /// - /// 编号 - /// - public Guid AsbitemId { get; set; } + //public class PersonDiseaseRiskLevelAsbitem + //{ + // /// + // /// 编号 + // /// + // public Guid AsbitemId { get; set; } - /// - /// 名称 - /// - public string AsbitemName { get; set; } = null!; + // /// + // /// 名称 + // /// + // public string AsbitemName { get; set; } = null!; - /// - /// 简称 - /// - public string? ShortName { get; set; } + // /// + // /// 简称 + // /// + // public string? ShortName { get; set; } - /// - /// 价格 - /// - public decimal Price { get; set; } - /// - /// 临床意义 - /// - public string? ClinicalMeaning { get; set; } + // /// + // /// 价格 + // /// + // public decimal Price { get; set; } + // /// + // /// 临床意义 + // /// + // public string? ClinicalMeaning { get; set; } - /// - /// 警告事项 - /// - public string? Warn { get; set; } + // /// + // /// 警告事项 + // /// + // public string? Warn { get; set; } - public char IsBelongMedicalPackage { get; set; } + // public char IsBelongMedicalPackage { get; set; } - public int AsbitemRecommendLevelId { get; set; } + // public int AsbitemRecommendLevelId { get; set; } - public int DisplayOrder { get; set; } - } + // public int DisplayOrder { get; set; } + //} } diff --git a/src/Shentun.WebPeis.Application.Contracts/AppointPatientRegisters/RecommendMedicalPackageDto.cs b/src/Shentun.WebPeis.Application.Contracts/AppointPatientRegisters/RecommendMedicalPackageDto.cs index febbcfe..709a2b5 100644 --- a/src/Shentun.WebPeis.Application.Contracts/AppointPatientRegisters/RecommendMedicalPackageDto.cs +++ b/src/Shentun.WebPeis.Application.Contracts/AppointPatientRegisters/RecommendMedicalPackageDto.cs @@ -80,8 +80,19 @@ namespace Shentun.WebPeis.AppointPatientRegisters /// public string? Warn { get; set; } + /// + /// 是否属于套餐 + /// public char IsBelongMedicalPackage { get; set; } + /// + /// 显示顺序 + /// public int DisplayOrder { get; set; } + /// + /// 组合项目推荐级别 + /// + + public int AsbitemRecommendLevelId { get; set; } } } diff --git a/src/Shentun.WebPeis.Application/AppointPatientRegisters/AppointPatientRegisterAppService.cs b/src/Shentun.WebPeis.Application/AppointPatientRegisters/AppointPatientRegisterAppService.cs index f9e20fd..fb23977 100644 --- a/src/Shentun.WebPeis.Application/AppointPatientRegisters/AppointPatientRegisterAppService.cs +++ b/src/Shentun.WebPeis.Application/AppointPatientRegisters/AppointPatientRegisterAppService.cs @@ -657,6 +657,8 @@ namespace Shentun.WebPeis.AppointPatientRegisters { MedicalPackageId = medicalPackage.MedicalPackageId, MedicalPackageName = medicalPackage.MedicalPackageName, + Price = medicalPackage.Price, + SumPrice = medicalPackage.Price, DisplayOrder = medicalPackage.DisplayOrder }; @@ -664,6 +666,8 @@ namespace Shentun.WebPeis.AppointPatientRegisters var medicalPackageAsbitems = (from medicalPackageDetail in await _medicalPackageDetailRepository.GetQueryableAsync() join asbitem in await _asbitemRepository.GetQueryableAsync() on medicalPackageDetail.AsbitemId equals asbitem.AsbitemId + join itemType in await _itemTypeRepository.GetQueryableAsync() + on asbitem.ItemTypeId equals itemType.ItemTypeId where medicalPackageDetail.MedicalPackageId == medicalPackage.MedicalPackageId select new RecommendMedicalPackageAsbitem() { @@ -674,7 +678,7 @@ namespace Shentun.WebPeis.AppointPatientRegisters ClinicalMeaning = asbitem.ClinicalMeaning, Warn = asbitem.Warn, IsBelongMedicalPackage = 'Y', - DisplayOrder = asbitem.DisplayOrder + DisplayOrder = itemType.DisplayOrder * 100 + asbitem.DisplayOrder }).ToList(); recommendMedicalPackageDto.Asbitems.AddRange(medicalPackageAsbitems); @@ -690,14 +694,18 @@ namespace Shentun.WebPeis.AppointPatientRegisters } //----推荐组合项目 + var personDiseaseRiskLevelDtos = await GetDiseaseRiskListByPersonIdAsync(input.PersonId); + //去掉基本套餐中已经包含的组合项目 foreach (var personDiseaseRiskLevelDto in personDiseaseRiskLevelDtos) { - foreach (var personDiseaseRiskLevelAsbitem in personDiseaseRiskLevelDto.Asbitems) + for (var i = 0; i< personDiseaseRiskLevelDto.Asbitems.Count; i++ ) { + var personDiseaseRiskLevelAsbitem = personDiseaseRiskLevelDto.Asbitems[i]; if (medicalPackageAsbitems.Where(o => o.AsbitemId == personDiseaseRiskLevelAsbitem.AsbitemId).Any()) { - personDiseaseRiskLevelAsbitem.IsBelongMedicalPackage = 'Y'; + personDiseaseRiskLevelDto.Asbitems.Remove(personDiseaseRiskLevelAsbitem); + i --; } } } @@ -705,29 +713,25 @@ namespace Shentun.WebPeis.AppointPatientRegisters var personDiseaseRiskLevelResultDtos = new List(); foreach (var personDiseaseRiskLevelDto in personDiseaseRiskLevelDtos) { - var personDiseaseRiskLevelResultDto = new PersonDiseaseRiskLevelDto() + if(personDiseaseRiskLevelDto.Asbitems.Where(o=>o.AsbitemRecommendLevelId == input.RecommendId).Count() > 0) { - DiseaseRiskId = personDiseaseRiskLevelDto.DiseaseRiskId, - DiseaseRiskName = personDiseaseRiskLevelDto.DiseaseRiskName, - DisplayOrder = personDiseaseRiskLevelDto.DisplayOrder, - DiseaseRiskLevelId = personDiseaseRiskLevelDto.DiseaseRiskLevelId, - DiseaseRiskLevelName = personDiseaseRiskLevelDto.DiseaseRiskLevelName - }; - personDiseaseRiskLevelResultDtos.Add(personDiseaseRiskLevelResultDto); - } - //一级推荐组合项目 - foreach (var personDiseaseRiskLevelResultDto in personDiseaseRiskLevelResultDtos) - { - var personDiseaseRiskLevelDto = personDiseaseRiskLevelDtos.Where(o => - o.DiseaseRiskLevelId == personDiseaseRiskLevelResultDto.DiseaseRiskLevelId - ).First(); - var asbitems = personDiseaseRiskLevelDto.Asbitems.Where(o => o.AsbitemRecommendLevelId == input.RecommendId - || o.IsBelongMedicalPackage == 'Y') - .ToList(); - personDiseaseRiskLevelResultDto.Asbitems.AddRange(asbitems); + //只有有推荐的项目才进入推荐风险项目列表 + var personDiseaseRiskLevelResultDto = new PersonDiseaseRiskLevelDto() + { + DiseaseRiskId = personDiseaseRiskLevelDto.DiseaseRiskId, + DiseaseRiskName = personDiseaseRiskLevelDto.DiseaseRiskName, + DisplayOrder = personDiseaseRiskLevelDto.DisplayOrder, + DiseaseRiskLevelId = personDiseaseRiskLevelDto.DiseaseRiskLevelId, + DiseaseRiskLevelName = personDiseaseRiskLevelDto.DiseaseRiskLevelName + }; + personDiseaseRiskLevelResultDto.Asbitems = + personDiseaseRiskLevelDto.Asbitems.Where(o => o.AsbitemRecommendLevelId == input.RecommendId).ToList(); + recommendMedicalPackageDto.SumPrice += personDiseaseRiskLevelResultDto.Asbitems.Sum(o => o.Price); + personDiseaseRiskLevelResultDtos.Add(personDiseaseRiskLevelResultDto); + } + } - - recommendMedicalPackageDto.DiseaseRiskLevelAsbitems.AddRange(personDiseaseRiskLevelResultDtos); + recommendMedicalPackageDto.DiseaseRiskLevelAsbitems = personDiseaseRiskLevelResultDtos; return recommendMedicalPackageDto; } @@ -858,7 +862,8 @@ namespace Shentun.WebPeis.AppointPatientRegisters join asbitem in await _asbitemRepository.GetQueryableAsync() on diseaseRiskLevelAsbitem.AsbitemId equals asbitem.AsbitemId where diseaseRiskLevelAsbitem.DiseaseRiskLevelId == diseaseRisk.DiseaseRiskLevelId - select new PersonDiseaseRiskLevelAsbitem() + orderby asbitem.DisplayOrder + select new RecommendMedicalPackageAsbitem() { AsbitemId = asbitem.AsbitemId, AsbitemName = asbitem.AsbitemName, diff --git a/test/Shentun.WebPeis.Application.Tests/AppointPatientRegisterAppServiceTest.cs b/test/Shentun.WebPeis.Application.Tests/AppointPatientRegisterAppServiceTest.cs index 147de38..898d519 100644 --- a/test/Shentun.WebPeis.Application.Tests/AppointPatientRegisterAppServiceTest.cs +++ b/test/Shentun.WebPeis.Application.Tests/AppointPatientRegisterAppServiceTest.cs @@ -125,12 +125,19 @@ namespace Shentun.WebPeis var list = await _appService.GetRecommendMedicalPackageListByPersonIdAsync(entity); foreach (var item in list) { - _output.WriteLine(item.MedicalPackageName); + _output.WriteLine("---------------" + item.MedicalPackageName); foreach(var item2 in item.Asbitems) { _output.WriteLine(item2.AsbitemName + "-" + item2.IsBelongMedicalPackage); } - + foreach (var item2 in item.DiseaseRiskLevelAsbitems) + { + _output.WriteLine("---" + item2.DiseaseRiskName +"-" + item2.DiseaseRiskLevelName + "---"); + foreach(var item3 in item2.Asbitems) + { + _output.WriteLine(item3.AsbitemName ); + } + } } await unitOfWork.CompleteAsync(); } From 46697027abf9dc22b2a4ce1c2223c2b12fde9c1b Mon Sep 17 00:00:00 2001 From: "DESKTOP-G961P6V\\Zhh" <839860190@qq.com> Date: Mon, 17 Jun 2024 22:35:30 +0800 Subject: [PATCH 4/4] =?UTF-8?q?=E5=A5=97=E9=A4=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Shentun.WebPeis.Domain/Models/MedicalPackage.cs | 10 ++++++++++ .../Configures/MedicalPackageConfigure.cs | 12 ++++++++++++ 2 files changed, 22 insertions(+) diff --git a/src/Shentun.WebPeis.Domain/Models/MedicalPackage.cs b/src/Shentun.WebPeis.Domain/Models/MedicalPackage.cs index 3049bec..241f175 100644 --- a/src/Shentun.WebPeis.Domain/Models/MedicalPackage.cs +++ b/src/Shentun.WebPeis.Domain/Models/MedicalPackage.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using Volo.Abp.Domain.Entities.Auditing; using Volo.Abp.Domain.Entities; +using System.ComponentModel.DataAnnotations.Schema; namespace Shentun.WebPeis.Models; @@ -65,6 +66,15 @@ public partial class MedicalPackage: AuditedEntity, IHasConcurrencyStamp /// public char MaritalStatusId { get; set; } + /// + /// 适用年龄下限 + /// + public short AgeLowerLimit { get; set; } + /// + /// 适用年龄上限 + /// + public short AgeUpperLimit { get; set; } + public virtual ICollection MedicalPackageDetails { get; set; } = new List(); public override object?[] GetKeys() diff --git a/src/Shentun.WebPeis.EntityFrameworkCore/Configures/MedicalPackageConfigure.cs b/src/Shentun.WebPeis.EntityFrameworkCore/Configures/MedicalPackageConfigure.cs index 6cac438..9ccc031 100644 --- a/src/Shentun.WebPeis.EntityFrameworkCore/Configures/MedicalPackageConfigure.cs +++ b/src/Shentun.WebPeis.EntityFrameworkCore/Configures/MedicalPackageConfigure.cs @@ -75,6 +75,18 @@ namespace Shentun.WebPeis.Configures .IsRequired() .HasDefaultValueSql("'N'::bpchar") .HasColumnName("is_basic_recommend"); + + entity.Property(e => e.AgeLowerLimit) + .HasComment("适用年龄下限") + .IsRequired() + .HasColumnName("age_lower_limit") + .HasDefaultValueSql("0"); + + entity.Property(e => e.AgeUpperLimit) + .HasColumnName("age_upper_limit") + .HasDefaultValueSql("200") + .HasComment("适用年龄上限") + .IsRequired(); } } }