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.

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