using Shentun.WebPeis.CustomerOrgs; using Shentun.WebPeis.Enums; using Shentun.WebPeis.Models; using Shentun.WebPeis.Persons; using Shentun.WebPeis.SysParmValues; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Volo.Abp; using Volo.Abp.Domain.Repositories; using Volo.Abp.Domain.Services; using Volo.Abp.Identity; namespace Shentun.WebPeis.AppointPatientRegisters { public class AppointPatientRegisterManager : DomainService { private readonly IRepository _personRepository; private readonly IRepository _customerOrgRepository; private readonly IRepository _customerOrgGroupRepository; private readonly IRepository _customerOrgGroupDetailRepository; private readonly IRepository _customerOrgRegisterRepository; private readonly IRepository _medicalPackageRepository; private readonly IRepository _medicalPackageDetailRepository; private readonly IRepository _repository; private readonly IRepository _identityUserRepository; private readonly IdentityUserManager _identityUserManager; private readonly IRepository _nationRepository; private readonly SysParmValueManager _sysParmValueManager; private readonly IRepository _primarykeyBuilderRepository; private readonly IRepository _asbitemRepository; private readonly CustomerOrgManager _customerOrgManager; public AppointPatientRegisterManager(IRepository repository, IRepository personRepository, IRepository identityUserRepository, IdentityUserManager identityUserManager, IRepository nationRepository, SysParmValueManager sysParmValueManager, IRepository primarykeyBuilderRepository, IRepository customerOrgGroupRepository, IRepository medicalPackageRepository, IRepository customerOrgRepository, IRepository customerOrgRegisterRepository, IRepository asbitemRepository, CustomerOrgManager customerOrgManager, IRepository medicalPackageDetailRepository, IRepository customerOrgGroupDetailRepository ) { _repository = repository; _personRepository = personRepository; _identityUserRepository = identityUserRepository; _identityUserManager = identityUserManager; _nationRepository = nationRepository; _sysParmValueManager = sysParmValueManager; _primarykeyBuilderRepository = primarykeyBuilderRepository; _customerOrgGroupRepository = customerOrgGroupRepository; _medicalPackageRepository = medicalPackageRepository; _customerOrgRepository = customerOrgRepository; _customerOrgRegisterRepository = customerOrgRegisterRepository; _asbitemRepository = asbitemRepository; _customerOrgManager = customerOrgManager; _medicalPackageDetailRepository = medicalPackageDetailRepository; _customerOrgGroupDetailRepository = customerOrgGroupDetailRepository; } public async Task CreateAsync(AppointPatientRegister entity) { await Verify(entity); entity.AppointPatientRegisterId = GuidGenerator.Create(); entity.CompleteFlag = AppointPatientRegisterCompleteFlag.Appoint; entity.IsCharge = 'N'; foreach (var appointRegisterAsbitem in entity.AppointRegisterAsbitems) { appointRegisterAsbitem.AppointPatientRegisterId = entity.AppointPatientRegisterId; } return entity; } private async Task Verify(AppointPatientRegister entity) { Check.NotNull(entity.PersonId, "人员ID"); Check.NotNull(entity.MedicalCenterId, "体检中心"); Check.NotDefaultOrNull(entity.CustomerOrgId, "单位"); Check.NotNull(entity.AppointDate, "体检日期"); var person = await _personRepository.GetAsync(o=>o.PersonId == entity.PersonId); if (entity.AppointDate < DateTime.Now.Date) { throw new UserFriendlyException("预约日期不能小于当前日期"); } if (entity.PregnantFlag != PregnantFlag.None && entity.PregnantFlag != PregnantFlag.PreparePregnancy && entity.PregnantFlag != PregnantFlag.Pregnancy) { throw new UserFriendlyException("备孕标志错误"); } if (entity.CustomerOrgGroupId != Guid.Empty && entity.CustomerOrgGroupId != null) { var customerOrgGroup = (await _customerOrgGroupRepository.GetQueryableAsync()). Where(o => o.CustomerOrgRegisterId == entity.CustomerOrgRegisterId && o.CustomerOrgGroupId == entity.CustomerOrgGroupId).FirstOrDefault(); if (customerOrgGroup == null) { throw new UserFriendlyException("单位分组ID不存在"); } if(customerOrgGroup.ForSexId != ForSexFlag.All && customerOrgGroup.ForSexId != person.SexId ) { throw new UserFriendlyException("套餐的性别和人员性别不一致"); } if(customerOrgGroup.MaritalStatusId != MaritalStatusFlag.All && person.MaritalStatusId == MaritalStatusFlag.UnMarried && customerOrgGroup.MaritalStatusId != MaritalStatusFlag.UnMarried) { throw new UserFriendlyException("套餐的婚姻状况和人员婚姻状况不一致"); } } if (entity.MedicalPackageId != Guid.Empty && entity.MedicalPackageId != null) { var medicalPackage = (await _medicalPackageRepository.GetQueryableAsync()). Where(o => o.MedicalPackageId == entity.MedicalPackageId).FirstOrDefault(); if (medicalPackage == null) { throw new UserFriendlyException("套餐ID不存在"); } if (medicalPackage.ForSexId != ForSexFlag.All && medicalPackage.ForSexId != person.SexId) { throw new UserFriendlyException("套餐的性别和人员性别不一致"); } if (medicalPackage.MaritalStatusId != MaritalStatusFlag.All && person.MaritalStatusId == MaritalStatusFlag.UnMarried && medicalPackage.MaritalStatusId != MaritalStatusFlag.UnMarried) { throw new UserFriendlyException("套餐的婚姻状况和人员婚姻状况不一致"); } } var customerOrg = await _customerOrgRepository.FindAsync(o => o.CustomerOrgId == entity.CustomerOrgId); if (customerOrg == null) { throw new UserFriendlyException("客户单位ID不存在"); } if (customerOrg.CustomerOrgId == GuidFlag.PersonCustomerOrgId) { if (entity.CustomerOrgGroupId != Guid.Empty && entity.CustomerOrgGroupId != null) { throw new UserFriendlyException("个人体检不能选单位分组"); } } else { if (entity.MedicalPackageId != Guid.Empty && entity.MedicalPackageId != null) { throw new UserFriendlyException("单位体检不能选套餐"); } if(entity.PatientRegisterId == null || entity.PatientRegisterId == Guid.Empty) { throw new UserFriendlyException("团检预约必须有人员备案登记编号"); } } var customerOrgRegister = await _customerOrgRegisterRepository.FindAsync(o => o.CustomerOrgRegisterId == entity.CustomerOrgRegisterId); if (customerOrgRegister == null) { throw new UserFriendlyException("客户登记单位次数不存在"); } if (customerOrgRegister.CustomerOrgId != customerOrg.CustomerOrgId) { var topCustomerOrg = await _customerOrgManager.GetTopCustomerOrgAsync(customerOrg.CustomerOrgId); var topCustomerOrgRegisterOrg = await _customerOrgManager.GetTopCustomerOrgAsync(customerOrgRegister.CustomerOrgId); if (topCustomerOrg.CustomerOrgId != topCustomerOrgRegisterOrg.CustomerOrgId) { throw new UserFriendlyException("登记单位和登记单位体检次数不一致"); } } if (entity.AppointRegisterAsbitems == null || !entity.AppointRegisterAsbitems.Any()) { throw new UserFriendlyException("必须预约组合项目"); } if (entity.MedicalPackageId != null) { var medicalPackageDetails = await _medicalPackageDetailRepository.GetListAsync(o=>o.MedicalPackageId == entity.MedicalPackageId); medicalPackageDetails.ForEach(o => { if (!entity.AppointRegisterAsbitems.Where(x=>x.AsbitemId == o.AsbitemId).Any()) { throw new UserFriendlyException("套餐项目不能取消"); } }); } if (entity.CustomerOrgGroupId != null) { var customerOrgGroupDetails = await _customerOrgGroupDetailRepository .GetListAsync(o => o.CustomerOrgGroupId == entity.CustomerOrgGroupId); customerOrgGroupDetails.ForEach(o => { if (!entity.AppointRegisterAsbitems.Where(x => x.AsbitemId == o.AsbitemId).Any()) { throw new UserFriendlyException("单位分组项目不能取消"); } }); foreach(var asbitem in entity.AppointRegisterAsbitems) { decimal addMoney = 0; var customerOrgGroupDetail = customerOrgGroupDetails.Where(o => o.AsbitemId == asbitem.AsbitemId).FirstOrDefault(); if(customerOrgGroupDetail == null) { addMoney += customerOrgGroupDetail.Price; } if(addMoney > 0) { var customerOrgGroup = await _customerOrgGroupRepository.GetAsync(o => o.CustomerOrgGroupId == entity.CustomerOrgGroupId); if(addMoney > customerOrgGroup.CanAddMoney) { throw new UserFriendlyException($"自选的单位支付金额不能超过{customerOrgGroup.CanAddMoney}元"); } } } } var asbitems = await _asbitemRepository.GetListAsync(); foreach (var appointRegisterAsbitem in entity.AppointRegisterAsbitems) { var asbitem = asbitems.Where(o => o.AsbitemId == appointRegisterAsbitem.AsbitemId).Single(); if (asbitem.ForSexId != ForSexFlag.All && asbitem.ForSexId != person.SexId) { throw new UserFriendlyException("套餐的性别和人员性别不一致"); } if (asbitem.MaritalStatusId != MaritalStatusFlag.All && person.MaritalStatusId == MaritalStatusFlag.UnMarried && asbitem.MaritalStatusId != MaritalStatusFlag.UnMarried) { throw new UserFriendlyException("组合项目的婚姻状况和人员婚姻状况不一致"); } appointRegisterAsbitem.StandardPrice = asbitem.Price; if (appointRegisterAsbitem.ChargePrice < 0) { throw new UserFriendlyException($"{asbitem.AsbitemName}价格不能小于0"); } if (appointRegisterAsbitem.ChargePrice > 10000) { throw new UserFriendlyException($"{asbitem.AsbitemName}价格不能大于10000"); } if (appointRegisterAsbitem.Amount < 1) { throw new UserFriendlyException($"{asbitem.AsbitemName}数量不能小于1"); } if (customerOrg.CustomerOrgId == GuidFlag.PersonCustomerOrgId) { appointRegisterAsbitem.PayTypeFlag = PayTypeFlag.PersonPay; } else { //在这里要判断属于分组的免费,不属于分组的自费 if (appointRegisterAsbitem.PayTypeFlag != PayTypeFlag.PersonPay && appointRegisterAsbitem.PayTypeFlag != PayTypeFlag.OrgPay) { throw new UserFriendlyException($"{asbitem.AsbitemName}支付类别错误"); } } appointRegisterAsbitem.IsCharge = 'N'; } var appoentPatientRegisters = await _repository.GetListAsync(o => o.PersonId == entity.PersonId && o.AppointDate >= DateTime.Now.Date && o.CompleteFlag != AppointPatientRegisterCompleteFlag.CancelAppoint); if(appoentPatientRegisters.Count >= 1) { throw new UserFriendlyException("已有今天及之后的预约订单,必须先取消订单"); } } } }