Browse Source

预约

master
DESKTOP-G961P6V\Zhh 1 year ago
parent
commit
5266753523
  1. 75
      src/Shentun.WebPeis.Application.Contracts/AppointPatientRegisters/PersonDiseaseRiskLevelDto.cs
  2. 87
      src/Shentun.WebPeis.Application.Contracts/AppointPatientRegisters/RecommendMedicalPackageDto.cs
  3. 18
      src/Shentun.WebPeis.Application.Contracts/AppointPatientRegisters/RecommendMedicalPackagePersonAndRecommendIdInputDto.cs
  4. 7
      src/Shentun.WebPeis.Application.Contracts/QuestionRegisters/QuestionRegisterDiseaseRiskDto.cs
  5. 332
      src/Shentun.WebPeis.Application/AppointPatientRegisters/AppointPatientRegisterAppService.cs
  6. 1
      src/Shentun.WebPeis.Application/QuestionRegisters/QuestionRegisterAppService.cs
  7. 9
      src/Shentun.WebPeis.Domain/Models/MedicalPackage.cs
  8. 6
      src/Shentun.WebPeis.EntityFrameworkCore/Configures/MedicalPackageConfigure.cs
  9. 26
      test/Shentun.WebPeis.Application.Tests/AppointPatientRegisterAppServiceTest.cs

75
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
{
/// <summary>
/// 主键
/// </summary>
public Guid DiseaseRiskId { get; set; }
/// <summary>
/// 名称
/// </summary>
public string DiseaseRiskName { get; set; } = null!;
/// <summary>
/// 显示顺序
/// </summary>
public int DisplayOrder { get; set; }
/// <summary>
/// 风险级别ID
/// </summary>
public Guid? DiseaseRiskLevelId { get; set; }
/// <summary>
/// 风险级别名称
/// </summary>
public string DiseaseRiskLevelName { get; set; }
public List<PersonDiseaseRiskLevelAsbitem> Asbitems { get; set; } = new List<PersonDiseaseRiskLevelAsbitem>();
}
public class PersonDiseaseRiskLevelAsbitem
{
/// <summary>
/// 编号
/// </summary>
public Guid AsbitemId { get; set; }
/// <summary>
/// 名称
/// </summary>
public string AsbitemName { get; set; } = null!;
/// <summary>
/// 简称
/// </summary>
public string? ShortName { get; set; }
/// <summary>
/// 价格
/// </summary>
public decimal Price { get; set; }
/// <summary>
/// 临床意义
/// </summary>
public string? ClinicalMeaning { get; set; }
/// <summary>
/// 警告事项
/// </summary>
public string? Warn { get; set; }
public char IsBelongMedicalPackage { get; set; }
public int AsbitemRecommendLevelId { get; set; }
public int DisplayOrder { get; set; }
}
}

87
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
{
/// <summary>
/// 套餐主档编号
/// </summary>
public Guid MedicalPackageId { get; set; }
/// <summary>
/// 名称
/// </summary>
public string MedicalPackageName { get; set; } = null!;
/// <summary>
/// 价格
/// </summary>
public decimal Price { get; set; }
/// <summary>
/// 套餐和推荐项目总价格
/// </summary>
public decimal SumPrice { get; set; }
/// <summary>
/// 备注
/// </summary>
public string? Remark { get; set; }
/// <summary>
/// 显示顺序
/// </summary>
public int DisplayOrder { get; set; }
/// <summary>
/// 套餐组合项目
/// </summary>
public List<RecommendMedicalPackageAsbitem> Asbitems { get; set; } = new List<RecommendMedicalPackageAsbitem>();
/// <summary>
/// 风险级别推荐组合项目
/// </summary>
public List<PersonDiseaseRiskLevelDto> DiseaseRiskLevelAsbitems { get; set; } = new List<PersonDiseaseRiskLevelDto>();
}
public class RecommendMedicalPackageAsbitem
{
/// <summary>
/// 编号
/// </summary>
public Guid AsbitemId { get; set; }
/// <summary>
/// 名称
/// </summary>
public string AsbitemName { get; set; } = null!;
/// <summary>
/// 简称
/// </summary>
public string? ShortName { get; set; }
/// <summary>
/// 价格
/// </summary>
public decimal Price { get; set; }
/// <summary>
/// 临床意义
/// </summary>
public string? ClinicalMeaning { get; set; }
/// <summary>
/// 警告事项
/// </summary>
public string? Warn { get; set; }
public char IsBelongMedicalPackage { get; set; }
public int DisplayOrder { get; set; }
}
}

18
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
{
/// <summary>
/// 人员ID
/// </summary>
public Guid PersonId { get; set; }
/// <summary>
/// 推荐ID
/// </summary>
public int RecommendId { get; set; }
}
}

7
src/Shentun.WebPeis.Application.Contracts/QuestionRegisters/QuestionRegisterDiseaseRiskDto.cs

@ -21,8 +21,13 @@ namespace Shentun.WebPeis.QuestionRegisters
/// </summary> /// </summary>
public int DisplayOrder { get; set; } public int DisplayOrder { get; set; }
/// <summary>
/// 风险级别ID
/// </summary>
public Guid? DiseaseRiskLevelId { get; set; }
/// <summary> /// <summary>
/// 风险级别
/// 风险级别名称
/// </summary> /// </summary>
public string DiseaseRiskLevelName { get; set; } public string DiseaseRiskLevelName { get; set; }

332
src/Shentun.WebPeis.Application/AppointPatientRegisters/AppointPatientRegisterAppService.cs

@ -8,16 +8,19 @@ using Shentun.WebPeis.Models;
using Shentun.WebPeis.OrganizationUnits; using Shentun.WebPeis.OrganizationUnits;
using Shentun.WebPeis.PatientRegisters; using Shentun.WebPeis.PatientRegisters;
using Shentun.WebPeis.Persons; using Shentun.WebPeis.Persons;
using Shentun.WebPeis.QuestionRegisters;
using System; using System;
using System.Collections; using System.Collections;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Security.Cryptography.X509Certificates;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using Volo.Abp; using Volo.Abp;
using Volo.Abp.Application.Services; using Volo.Abp.Application.Services;
using Volo.Abp.Domain.Repositories; using Volo.Abp.Domain.Repositories;
using Volo.Abp.Identity; using Volo.Abp.Identity;
using Volo.Abp.Uow;
using static Volo.Abp.Identity.Settings.IdentitySettingNames; using static Volo.Abp.Identity.Settings.IdentitySettingNames;
namespace Shentun.WebPeis.AppointPatientRegisters namespace Shentun.WebPeis.AppointPatientRegisters
@ -48,6 +51,17 @@ namespace Shentun.WebPeis.AppointPatientRegisters
private readonly IRepository<Patient> _patientRepository; private readonly IRepository<Patient> _patientRepository;
private readonly IRepository<RegisterCheck> _registerCheckRepository; private readonly IRepository<RegisterCheck> _registerCheckRepository;
private readonly IRepository<RegisterCheckAsbitem> _registerCheckAsbitemRepository; private readonly IRepository<RegisterCheckAsbitem> _registerCheckAsbitemRepository;
private readonly IRepository<QuestionRegister> _questionRegisterRepository;
private readonly IRepository<QuestionRegisterItem> _questionRegisterItemRepository;
private readonly IRepository<QuestionRegisterAnswer> _questionRegisterAnswerRrepository;
private readonly IRepository<Question> _questionRepository;
private readonly IRepository<QuestionAnswer> _questionAnswerRepository;
private readonly IRepository<QuestionSubjectType> _questionSubjectTypeRepository;
private readonly IRepository<DiseaseRisk> _diseaseRiskRepository;
private readonly IRepository<DiseaseRiskLevel> _diseaseRiskLevelRepository;
private readonly IRepository<DiseaseRiskLevelAnswer> _diseaseRiskLevelAnswerRepository;
private readonly IRepository<DiseaseRiskLevelAsbitem> _diseaseRiskLevelAsbitemRepository;
public AppointPatientRegisterAppService(IRepository<AppointPatientRegister> repository, public AppointPatientRegisterAppService(IRepository<AppointPatientRegister> repository,
CacheService cacheService, CacheService cacheService,
IRepository<ItemType> itemTypeRepository, IRepository<ItemType> itemTypeRepository,
@ -66,7 +80,19 @@ namespace Shentun.WebPeis.AppointPatientRegisters
IRepository<PatientRegister> patientRegisterRepository, IRepository<PatientRegister> patientRegisterRepository,
IRepository<Patient> patientRepository, IRepository<Patient> patientRepository,
IRepository<RegisterCheck> registerCheckRepository, IRepository<RegisterCheck> registerCheckRepository,
IRepository<RegisterCheckAsbitem> registerCheckAsbitemRepository
IRepository<RegisterCheckAsbitem> registerCheckAsbitemRepository,
IRepository<QuestionRegister> questionRegisterRepository,
IRepository<QuestionRegisterItem> questionRegisterItemRepository,
IRepository<QuestionRegisterAnswer> questionRegisterAnswerRrepository,
IRepository<Question> questionRepository,
IRepository<QuestionAnswer> questionAnswerRepository,
IRepository<QuestionSubjectType> questionSubjectTypeRepository,
IRepository<DiseaseRisk> diseaseRiskRepository,
IRepository<DiseaseRiskLevel> diseaseRiskLevelRepository,
IRepository<DiseaseRiskLevelAnswer> diseaseRiskLevelAnswerRepository,
IRepository<DiseaseRiskLevelAsbitem> diseaseRiskLevelAsbitemRepository
) )
{ {
_repository = repository; _repository = repository;
@ -89,6 +115,18 @@ namespace Shentun.WebPeis.AppointPatientRegisters
_registerCheckAsbitemRepository = registerCheckAsbitemRepository; _registerCheckAsbitemRepository = registerCheckAsbitemRepository;
_registerCheckRepository = registerCheckRepository; _registerCheckRepository = registerCheckRepository;
_questionRegisterRepository = questionRegisterRepository;
_questionRegisterItemRepository = questionRegisterItemRepository;
_questionRegisterAnswerRrepository = questionRegisterAnswerRrepository;
_questionRepository = questionRepository;
_questionAnswerRepository = questionAnswerRepository;
_questionSubjectTypeRepository = questionSubjectTypeRepository;
_diseaseRiskRepository = diseaseRiskRepository;
_diseaseRiskLevelRepository = diseaseRiskLevelRepository;
_diseaseRiskLevelAnswerRepository = diseaseRiskLevelAnswerRepository;
_diseaseRiskLevelAsbitemRepository = diseaseRiskLevelAsbitemRepository;
} }
/// <summary> /// <summary>
/// 创建预约,小程序使用 /// 创建预约,小程序使用
@ -226,7 +264,7 @@ namespace Shentun.WebPeis.AppointPatientRegisters
query = query.Where(o => o.user.PhoneNumber == input.MobilePhone); 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); query = query.Where(o => o.appointPatientRegister.CompleteFlag == input.CompleteFlag);
} }
@ -280,7 +318,7 @@ namespace Shentun.WebPeis.AppointPatientRegisters
{ {
if (input == null) throw new UserFriendlyException("参数不能为空"); if (input == null) throw new UserFriendlyException("参数不能为空");
var query = (from user in await _identityUserRepository.GetQueryableAsync() var query = (from user in await _identityUserRepository.GetQueryableAsync()
join person in await _personRepository.GetQueryableAsync() join person in await _personRepository.GetQueryableAsync()
on user.Id equals person.PersonId on user.Id equals person.PersonId
@ -298,7 +336,7 @@ namespace Shentun.WebPeis.AppointPatientRegisters
on appointRegisterAsbitem.AsbitemId equals asbitem.AsbitemId on appointRegisterAsbitem.AsbitemId equals asbitem.AsbitemId
join customerOrg in await _customerOrgRepository.GetQueryableAsync() join customerOrg in await _customerOrgRepository.GetQueryableAsync()
on appointPatientRegister.CustomerOrgId equals customerOrg.CustomerOrgId on appointPatientRegister.CustomerOrgId equals customerOrg.CustomerOrgId
where appointPatientRegister.PersonId == input.PersonId &&
where appointPatientRegister.PersonId == input.PersonId &&
appointPatientRegister.CompleteFlag != AppointPatientRegisterCompleteFlag.CancelAppoint appointPatientRegister.CompleteFlag != AppointPatientRegisterCompleteFlag.CancelAppoint
orderby appointPatientRegister.AppointDate orderby appointPatientRegister.AppointDate
select new select new
@ -335,7 +373,7 @@ namespace Shentun.WebPeis.AppointPatientRegisters
MedicalPackageName = o.FirstOrDefault().haveMedicalPackage == null ? "" : o.FirstOrDefault().haveMedicalPackage.MedicalPackageName, MedicalPackageName = o.FirstOrDefault().haveMedicalPackage == null ? "" : o.FirstOrDefault().haveMedicalPackage.MedicalPackageName,
MedicalCenterId = o.FirstOrDefault().appointPatientRegister.MedicalCenterId, MedicalCenterId = o.FirstOrDefault().appointPatientRegister.MedicalCenterId,
CompleteFlag = o.FirstOrDefault().appointPatientRegister.CompleteFlag, CompleteFlag = o.FirstOrDefault().appointPatientRegister.CompleteFlag,
AppointDate = o.FirstOrDefault().appointPatientRegister.AppointDate, AppointDate = o.FirstOrDefault().appointPatientRegister.AppointDate,
Remark = o.FirstOrDefault().appointPatientRegister.Remark, Remark = o.FirstOrDefault().appointPatientRegister.Remark,
PregnantFlag = o.FirstOrDefault().appointPatientRegister.PregnantFlag, PregnantFlag = o.FirstOrDefault().appointPatientRegister.PregnantFlag,
@ -344,7 +382,7 @@ namespace Shentun.WebPeis.AppointPatientRegisters
SexName = _cacheService.GetSexNameAsync(o.FirstOrDefault().person.SexId).Result, SexName = _cacheService.GetSexNameAsync(o.FirstOrDefault().person.SexId).Result,
MaritalStatusName = _cacheService.GetMaritalStatusNameAsync(o.FirstOrDefault().person.MaritalStatusId).Result, MaritalStatusName = _cacheService.GetMaritalStatusNameAsync(o.FirstOrDefault().person.MaritalStatusId).Result,
CustomerOrgName = _customerOrgManager.GetTopCustomerOrgAsync(o.FirstOrDefault().appointPatientRegister.CustomerOrgId).Result.CustomerOrgName CustomerOrgName = _customerOrgManager.GetTopCustomerOrgAsync(o.FirstOrDefault().appointPatientRegister.CustomerOrgId).Result.CustomerOrgName
}).ToList(); }).ToList();
@ -360,8 +398,8 @@ namespace Shentun.WebPeis.AppointPatientRegisters
[HttpPost("api/app/AppointPatientRegister/CancelAppoint")] [HttpPost("api/app/AppointPatientRegister/CancelAppoint")]
public async Task CancelAppointAsync(AppointPatientRegisterIdInputDto input) 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("已收费不能取消"); throw new UserFriendlyException("已收费不能取消");
} }
@ -453,7 +491,7 @@ namespace Shentun.WebPeis.AppointPatientRegisters
[HttpPost("api/app/AppointPatientRegister/GetCustomerOrgAppointPatientRegisterByPersonId")] [HttpPost("api/app/AppointPatientRegister/GetCustomerOrgAppointPatientRegisterByPersonId")]
public async Task<PatientRegisterDto> GetCustomerOrgAppointPatientRegisterByPersonIdAsync(PersonIdInputDto input) public async Task<PatientRegisterDto> GetCustomerOrgAppointPatientRegisterByPersonIdAsync(PersonIdInputDto input)
{ {
var patientRegisterDto = (from user in await _identityUserRepository.GetQueryableAsync() var patientRegisterDto = (from user in await _identityUserRepository.GetQueryableAsync()
join person in await _personRepository.GetQueryableAsync() join person in await _personRepository.GetQueryableAsync()
on user.Id equals person.PersonId on user.Id equals person.PersonId
@ -478,8 +516,8 @@ namespace Shentun.WebPeis.AppointPatientRegisters
ChildCustomerOrgName = customerOrg.CustomerOrgName, ChildCustomerOrgName = customerOrg.CustomerOrgName,
CustomerOrgRegisterId = patientRegister.CustomerOrgRegisterId, CustomerOrgRegisterId = patientRegister.CustomerOrgRegisterId,
CustomerOrgGroupId = patientRegister.CustomerOrgGroupId, 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, CanAddMoney = haveCustomerOrgGroup == null ? 0 : haveCustomerOrgGroup.CanAddMoney,
}).FirstOrDefault(); }).FirstOrDefault();
if (patientRegisterDto == null) if (patientRegisterDto == null)
@ -493,7 +531,7 @@ namespace Shentun.WebPeis.AppointPatientRegisters
var appointPatientRegisters = await _repository.GetListAsync(o => o.PersonId == input.PersonId && var appointPatientRegisters = await _repository.GetListAsync(o => o.PersonId == input.PersonId &&
o.AppointDate >= DateTime.Now.Date && o.CustomerOrgRegisterId == patientRegisterDto.CustomerOrgRegisterId o.AppointDate >= DateTime.Now.Date && o.CustomerOrgRegisterId == patientRegisterDto.CustomerOrgRegisterId
&& o.CompleteFlag != AppointPatientRegisterCompleteFlag.CancelAppoint); && o.CompleteFlag != AppointPatientRegisterCompleteFlag.CancelAppoint);
if (appointPatientRegisters .Any())
if (appointPatientRegisters.Any())
{ {
throw new UserFriendlyException("已有今天及之后的团检预约订单,必须先取消订单才能重新预约"); throw new UserFriendlyException("已有今天及之后的团检预约订单,必须先取消订单才能重新预约");
} }
@ -568,7 +606,277 @@ namespace Shentun.WebPeis.AppointPatientRegisters
} }
/// <summary>
/// 获取推荐个人套餐按优先级
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpPost("api/app/AppointPatientRegister/GetRecommendMedicalPackageByPersonAndRecommendId")]
public async Task<RecommendMedicalPackageDto> 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<PersonDiseaseRiskLevelDto>();
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;
}
/// <summary>
/// 获取推荐个人套餐列表
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpPost("api/app/AppointPatientRegister/GetRecommendMedicalPackageListByPersonId")]
public async Task<List<RecommendMedicalPackageDto>> GetRecommendMedicalPackageListByPersonIdAsync(PersonIdInputDto input)
{
var recommendMedicalPackageDtos = new List<RecommendMedicalPackageDto>();
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;
}
/// <summary>
/// 获取疾病风险和对应的组合项目列表
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
private async Task<List<PersonDiseaseRiskLevelDto>> 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;
}
} }
} }

1
src/Shentun.WebPeis.Application/QuestionRegisters/QuestionRegisterAppService.cs

@ -387,6 +387,7 @@ namespace Shentun.WebPeis.QuestionRegisters
} }
else else
{ {
diseaseRisk.DiseaseRiskLevelId = matchDiseaseRiskLevel.DiseaseRiskLevelId;
diseaseRisk.DiseaseRiskLevelName = matchDiseaseRiskLevel.DiseaseRiskLevelName; diseaseRisk.DiseaseRiskLevelName = matchDiseaseRiskLevel.DiseaseRiskLevelName;
} }

9
src/Shentun.WebPeis.Domain/Models/MedicalPackage.cs

@ -50,8 +50,15 @@ public partial class MedicalPackage: AuditedEntity, IHasConcurrencyStamp
public string? ConcurrencyStamp { get; set; } public string? ConcurrencyStamp { get; set; }
/// <summary>
/// 支持WEB预约
/// </summary>
public char? IsWebAppoint { get; set; } public char? IsWebAppoint { get; set; }
/// <summary>
/// 是基础套餐
/// </summary>
public char? IsBasicRecommend { get; set; }
/// <summary> /// <summary>
/// 适用婚姻状况 /// 适用婚姻状况

6
src/Shentun.WebPeis.EntityFrameworkCore/Configures/MedicalPackageConfigure.cs

@ -69,6 +69,12 @@ namespace Shentun.WebPeis.Configures
.HasMaxLength(1) .HasMaxLength(1)
.IsRequired() .IsRequired()
.HasColumnName("marital_status_id"); .HasColumnName("marital_status_id");
entity.Property(e => e.IsBasicRecommend)
.HasMaxLength(1)
.IsRequired()
.HasDefaultValueSql("'N'::bpchar")
.HasColumnName("is_basic_recommend");
} }
} }
} }

26
test/Shentun.WebPeis.Application.Tests/AppointPatientRegisterAppServiceTest.cs

@ -110,5 +110,31 @@ namespace Shentun.WebPeis
await unitOfWork.CompleteAsync(); 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();
}
}
} }
} }
Loading…
Cancel
Save