You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

249 lines
12 KiB

1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
  1. using Shentun.WebPeis.CustomerOrgs;
  2. using Shentun.WebPeis.Enums;
  3. using Shentun.WebPeis.Models;
  4. using Shentun.WebPeis.Persons;
  5. using Shentun.WebPeis.SysParmValues;
  6. using System;
  7. using System.Collections.Generic;
  8. using System.Linq;
  9. using System.Text;
  10. using System.Threading.Tasks;
  11. using Volo.Abp;
  12. using Volo.Abp.Domain.Repositories;
  13. using Volo.Abp.Domain.Services;
  14. using Volo.Abp.Identity;
  15. namespace Shentun.WebPeis.AppointPatientRegisters
  16. {
  17. public class AppointPatientRegisterManager : DomainService
  18. {
  19. private readonly IRepository<CustomerOrg> _customerOrgRepository;
  20. private readonly IRepository<CustomerOrgGroup> _customerOrgGroupRepository;
  21. private readonly IRepository<CustomerOrgGroupDetail> _customerOrgGroupDetailRepository;
  22. private readonly IRepository<CustomerOrgRegister> _customerOrgRegisterRepository;
  23. private readonly IRepository<MedicalPackage> _medicalPackageRepository;
  24. private readonly IRepository<MedicalPackageDetail> _medicalPackageDetailRepository;
  25. private readonly IRepository<AppointPatientRegister> _repository;
  26. private readonly IRepository<IdentityUser> _identityUserRepository;
  27. private readonly IdentityUserManager _identityUserManager;
  28. private readonly IRepository<Nation> _nationRepository;
  29. private readonly SysParmValueManager _sysParmValueManager;
  30. private readonly IRepository<PrimarykeyBuilder> _primarykeyBuilderRepository;
  31. private readonly IRepository<Asbitem> _asbitemRepository;
  32. private readonly CustomerOrgManager _customerOrgManager;
  33. public AppointPatientRegisterManager(IRepository<AppointPatientRegister> repository,
  34. IRepository<IdentityUser> identityUserRepository,
  35. IdentityUserManager identityUserManager,
  36. IRepository<Nation> nationRepository,
  37. SysParmValueManager sysParmValueManager,
  38. IRepository<PrimarykeyBuilder> primarykeyBuilderRepository,
  39. IRepository<CustomerOrgGroup> customerOrgGroupRepository,
  40. IRepository<MedicalPackage> medicalPackageRepository,
  41. IRepository<CustomerOrg> customerOrgRepository,
  42. IRepository<CustomerOrgRegister> customerOrgRegisterRepository,
  43. IRepository<Asbitem> asbitemRepository,
  44. CustomerOrgManager customerOrgManager,
  45. IRepository<MedicalPackageDetail> medicalPackageDetailRepository,
  46. IRepository<CustomerOrgGroupDetail> customerOrgGroupDetailRepository
  47. )
  48. {
  49. _repository = repository;
  50. _identityUserRepository = identityUserRepository;
  51. _identityUserManager = identityUserManager;
  52. _nationRepository = nationRepository;
  53. _sysParmValueManager = sysParmValueManager;
  54. _primarykeyBuilderRepository = primarykeyBuilderRepository;
  55. _customerOrgGroupRepository = customerOrgGroupRepository;
  56. _medicalPackageRepository = medicalPackageRepository;
  57. _customerOrgRepository = customerOrgRepository;
  58. _customerOrgRegisterRepository = customerOrgRegisterRepository;
  59. _asbitemRepository = asbitemRepository;
  60. _customerOrgManager = customerOrgManager;
  61. _medicalPackageDetailRepository = medicalPackageDetailRepository;
  62. _customerOrgGroupDetailRepository = customerOrgGroupDetailRepository;
  63. }
  64. public async Task<AppointPatientRegister> CreateAsync(AppointPatientRegister entity)
  65. {
  66. await Verify(entity);
  67. entity.AppointPatientRegisterId = GuidGenerator.Create();
  68. entity.CompleteFlag = AppointPatientRegisterCompleteFlag.Appoint;
  69. entity.IsCharge = 'N';
  70. foreach (var appointRegisterAsbitem in entity.AppointRegisterAsbitems)
  71. {
  72. appointRegisterAsbitem.AppointPatientRegisterId = entity.AppointPatientRegisterId;
  73. }
  74. return entity;
  75. }
  76. private async Task Verify(AppointPatientRegister entity)
  77. {
  78. Check.NotNull<Guid>(entity.PersonId, "人员ID");
  79. Check.NotNull<Guid>(entity.MedicalCenterId, "体检中心");
  80. Check.NotDefaultOrNull<Guid>(entity.CustomerOrgId, "单位");
  81. Check.NotNull<DateTime>(entity.AppointDate, "体检日期");
  82. if(entity.AppointDate < DateTime.Now.Date)
  83. {
  84. throw new UserFriendlyException("预约日期不能小于当前日期");
  85. }
  86. if (entity.PregnantFlag != PregnantFlag.None && entity.PregnantFlag != PregnantFlag.PreparePregnancy
  87. && entity.PregnantFlag != PregnantFlag.Pregnancy)
  88. {
  89. throw new UserFriendlyException("备孕标志错误");
  90. }
  91. if (entity.CustomerOrgGroupId != Guid.Empty && entity.CustomerOrgGroupId != null)
  92. {
  93. if ((await _customerOrgGroupRepository.GetQueryableAsync()).
  94. Where(o => o.CustomerOrgRegisterId == entity.CustomerOrgRegisterId &&
  95. o.CustomerOrgGroupId == entity.CustomerOrgGroupId).Count() == 0)
  96. {
  97. throw new UserFriendlyException("单位分组ID不存在");
  98. }
  99. }
  100. if (entity.MedicalPackageId != Guid.Empty && entity.MedicalPackageId != null)
  101. {
  102. if ((await _medicalPackageRepository.GetQueryableAsync()).
  103. Where(o => o.MedicalPackageId == entity.MedicalPackageId).Count() == 0)
  104. {
  105. throw new UserFriendlyException("套餐ID不存在");
  106. }
  107. }
  108. var customerOrg = await _customerOrgRepository.FindAsync(o => o.CustomerOrgId == entity.CustomerOrgId);
  109. if (customerOrg == null)
  110. {
  111. throw new UserFriendlyException("客户单位ID不存在");
  112. }
  113. if (customerOrg.CustomerOrgId == GuidFlag.PersonCustomerOrgId)
  114. {
  115. if (entity.CustomerOrgGroupId != Guid.Empty && entity.CustomerOrgGroupId != null)
  116. {
  117. throw new UserFriendlyException("个人体检不能选单位分组");
  118. }
  119. }
  120. else
  121. {
  122. if (entity.MedicalPackageId != Guid.Empty && entity.MedicalPackageId != null)
  123. {
  124. throw new UserFriendlyException("单位体检不能选套餐");
  125. }
  126. if(entity.PatientRegisterId == null || entity.PatientRegisterId == Guid.Empty)
  127. {
  128. throw new UserFriendlyException("团检预约必须有人员备案登记编号");
  129. }
  130. }
  131. var customerOrgRegister = await _customerOrgRegisterRepository.FindAsync(o => o.CustomerOrgRegisterId == entity.CustomerOrgRegisterId);
  132. if (customerOrgRegister == null)
  133. {
  134. throw new UserFriendlyException("客户登记单位次数不存在");
  135. }
  136. if (customerOrgRegister.CustomerOrgId != customerOrg.CustomerOrgId)
  137. {
  138. var topCustomerOrg = await _customerOrgManager.GetTopCustomerOrgAsync(customerOrg.CustomerOrgId);
  139. var topCustomerOrgRegisterOrg = await _customerOrgManager.GetTopCustomerOrgAsync(customerOrgRegister.CustomerOrgId);
  140. if (topCustomerOrg.CustomerOrgId != topCustomerOrgRegisterOrg.CustomerOrgId)
  141. {
  142. throw new UserFriendlyException("登记单位和登记单位体检次数不一致");
  143. }
  144. }
  145. if (entity.AppointRegisterAsbitems == null || !entity.AppointRegisterAsbitems.Any())
  146. {
  147. throw new UserFriendlyException("必须预约组合项目");
  148. }
  149. if (entity.MedicalPackageId != null)
  150. {
  151. var medicalPackageDetails = await _medicalPackageDetailRepository.GetListAsync(o=>o.MedicalPackageId == entity.MedicalPackageId);
  152. medicalPackageDetails.ForEach(o =>
  153. {
  154. if (!entity.AppointRegisterAsbitems.Where(x=>x.AsbitemId == o.AsbitemId).Any())
  155. {
  156. throw new UserFriendlyException("套餐项目不能取消");
  157. }
  158. });
  159. }
  160. if (entity.CustomerOrgGroupId != null)
  161. {
  162. var customerOrgGroupDetails = await _customerOrgGroupDetailRepository
  163. .GetListAsync(o => o.CustomerOrgGroupId == entity.CustomerOrgGroupId);
  164. customerOrgGroupDetails.ForEach(o =>
  165. {
  166. if (!entity.AppointRegisterAsbitems.Where(x => x.AsbitemId == o.AsbitemId).Any())
  167. {
  168. throw new UserFriendlyException("单位分组项目不能取消");
  169. }
  170. });
  171. foreach(var asbitem in entity.AppointRegisterAsbitems)
  172. {
  173. decimal addMoney = 0;
  174. var customerOrgGroupDetail = customerOrgGroupDetails.Where(o => o.AsbitemId == asbitem.AsbitemId).FirstOrDefault();
  175. if(customerOrgGroupDetail != null)
  176. {
  177. addMoney += customerOrgGroupDetail.Price;
  178. }
  179. if(addMoney > 0)
  180. {
  181. var customerOrgGroup = await _customerOrgGroupRepository.GetAsync(o => o.CustomerOrgGroupId == entity.CustomerOrgGroupId);
  182. if(addMoney > customerOrgGroup.CanAddMoney)
  183. {
  184. throw new UserFriendlyException($"自选的单位支付金额能超过{customerOrgGroup.CanAddMoney}元");
  185. }
  186. }
  187. }
  188. }
  189. var asbitems = await _asbitemRepository.GetListAsync();
  190. foreach (var appointRegisterAsbitem in entity.AppointRegisterAsbitems)
  191. {
  192. var asbitem = asbitems.Where(o => o.AsbitemId == appointRegisterAsbitem.AsbitemId).Single();
  193. appointRegisterAsbitem.StandardPrice = asbitem.Price;
  194. if (appointRegisterAsbitem.ChargePrice < 0)
  195. {
  196. throw new UserFriendlyException($"{asbitem.AsbitemName}价格不能小于0");
  197. }
  198. if (appointRegisterAsbitem.ChargePrice > 10000)
  199. {
  200. throw new UserFriendlyException($"{asbitem.AsbitemName}价格不能大于10000");
  201. }
  202. if (appointRegisterAsbitem.Amount < 1)
  203. {
  204. throw new UserFriendlyException($"{asbitem.AsbitemName}数量不能小于1");
  205. }
  206. if (customerOrg.CustomerOrgId == GuidFlag.PersonCustomerOrgId)
  207. {
  208. appointRegisterAsbitem.PayTypeFlag = PayTypeFlag.PersonPay;
  209. }
  210. else
  211. {
  212. //在这里要判断属于分组的免费,不属于分组的自费
  213. if (appointRegisterAsbitem.PayTypeFlag != PayTypeFlag.PersonPay &&
  214. appointRegisterAsbitem.PayTypeFlag != PayTypeFlag.OrgPay)
  215. {
  216. throw new UserFriendlyException($"{asbitem.AsbitemName}支付类别错误");
  217. }
  218. }
  219. appointRegisterAsbitem.IsCharge = 'N';
  220. }
  221. var appoentPatientRegisters = await _repository.GetListAsync(o => o.PersonId == entity.PersonId &&
  222. o.AppointDate >= DateTime.Now.Date && o.CompleteFlag != AppointPatientRegisterCompleteFlag.CancelAppoint);
  223. if(appoentPatientRegisters.Count >= 1)
  224. {
  225. throw new UserFriendlyException("已有今天及之后的预约订单,必须先取消订单才能重新预约");
  226. }
  227. }
  228. }
  229. }