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.

223 lines
9.3 KiB

2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
  1. using Microsoft.Extensions.Configuration;
  2. using Shentun.Peis.Enums;
  3. using Shentun.Peis.Models;
  4. using Shentun.Peis.PlugIns;
  5. using Shentun.Peis.SysParmValues;
  6. using System;
  7. using System.Collections.Generic;
  8. using System.IO;
  9. using System.Linq;
  10. using System.Reflection;
  11. using System.Text;
  12. using System.Threading.Tasks;
  13. using Volo.Abp;
  14. using Volo.Abp.Domain.Repositories;
  15. using Volo.Abp.Domain.Services;
  16. namespace Shentun.Peis.ChargeRequests
  17. {
  18. public class ChargeRequestManager : DomainService
  19. {
  20. private readonly IRepository<ChargeRequest, Guid> _repository;
  21. private readonly IRepository<PatientRegister, Guid> _patientRegisterRepository;
  22. private readonly IRepository<PrimarykeyBuilder> _primarykeyBuilderRepository;
  23. private readonly SysParmValueManager _sysParmValueManager;
  24. private readonly IRepository<ThirdInterface, Guid> _thirdInterfaceRepository;
  25. public ChargeRequestManager(IRepository<ChargeRequest, Guid> repository,
  26. IRepository<PrimarykeyBuilder> primarykeyBuilderRepository,
  27. SysParmValueManager sysParmValueManager,
  28. IRepository<PatientRegister, Guid> patientRegisterRepository,
  29. IRepository<ThirdInterface, Guid> thirdInterfaceRepository)
  30. {
  31. _repository = repository;
  32. _primarykeyBuilderRepository = primarykeyBuilderRepository;
  33. _sysParmValueManager = sysParmValueManager;
  34. _patientRegisterRepository = patientRegisterRepository;
  35. _thirdInterfaceRepository = thirdInterfaceRepository;
  36. }
  37. /// <summary>
  38. /// 创建
  39. /// </summary>
  40. /// <param name="entity"></param>
  41. /// <returns></returns>
  42. public async Task<ChargeRequest> CreateAsync(
  43. ChargeRequest entity
  44. )
  45. {
  46. var patientRegister = await _patientRegisterRepository.GetAsync( entity.PatientRegisterId );
  47. return new ChargeRequest(
  48. GuidGenerator.Create()
  49. )
  50. {
  51. PatientRegisterId = entity.PatientRegisterId,
  52. HisChargeNo = entity.HisChargeNo,
  53. ChargeRequestNo = await CreateChargeRequestNo(patientRegister.MedicalCenterId),
  54. ChargeRequestFlag = ChargeRequestFlag.Request,
  55. };
  56. }
  57. public async Task SendThirChargeRequestAsync(Guid id)
  58. {
  59. var thirdInterfaces = (await _thirdInterfaceRepository.GetListAsync(o => o.ThirdInterfaceType == ThirdInterfaceTypeFlag.ChargeRequest))
  60. .OrderBy(o => o.DisplayOrder).ToList();
  61. foreach (var thirdInterface in thirdInterfaces)
  62. {
  63. var chargeRequestPlugInsInput = new ChargeRequestPlugInsInput()
  64. {
  65. ChargeRequestId = id
  66. };
  67. var parmValue = thirdInterface.ParmValue;
  68. var configurationBuilder = new ConfigurationBuilder()
  69. .AddJsonStream(new MemoryStream(System.Text.Encoding.UTF8.GetBytes(parmValue)));
  70. var config = configurationBuilder.Build();
  71. var assemblyName = config.GetSection("Interface").GetSection("AssemblyName").Value;
  72. var className = config.GetSection("Interface").GetSection("ClassName").Value;
  73. object[] objects = new object[] { chargeRequestPlugInsInput };
  74. var chargeRequestPluginsOut = await InvokeAsync(assemblyName, className, parmValue, "SendRequest", objects);
  75. }
  76. }
  77. private async Task<ChargeRequestPlugInsOut> InvokeAsync(string assemblyName, string className, string classConstructorArg, string methodName, object[] args = null)
  78. {
  79. Assembly assembly = Assembly.Load(assemblyName);
  80. Type type = assembly.GetType(className);
  81. // 创建类的实例
  82. object instance = Activator.CreateInstance(type, classConstructorArg);
  83. // 获取方法信息
  84. MethodInfo method = type.GetMethod(methodName);
  85. // 调用方法,如果方法需要参数,可以传入对应的参数数组,例如: new object[] { arg1, arg2 }
  86. ChargeRequestPlugInsOut returnValue;
  87. var isAsync = (method.ReturnType == typeof(Task) ||
  88. (method.ReturnType.IsGenericType && method.ReturnType.GetGenericTypeDefinition() == typeof(Task<>)));
  89. if (isAsync)
  90. {
  91. // 使用反射调用方法
  92. //object returnValue = method.Invoke(instance, args);
  93. returnValue = await (Task<ChargeRequestPlugInsOut>)method.Invoke(instance, args);
  94. }
  95. else
  96. {
  97. returnValue = (ChargeRequestPlugInsOut)method.Invoke(instance, args);
  98. }
  99. return returnValue;
  100. }
  101. private async Task<string> CreateChargeRequestNo(Guid medicalCenterId)
  102. {
  103. string LisRequestNo = ""; //条码号
  104. string request_no_rule_coding = "0"; // 模式(0 日期+尾号 1.顺序递增)
  105. string request_no_rule_tail_len = "4"; //尾号长度
  106. string request_no_rule_prefix = "T"; //前缀
  107. request_no_rule_coding = await _sysParmValueManager.GetSysParmValueAsync(medicalCenterId, "charge_request_no_rule_coding");
  108. request_no_rule_tail_len = await _sysParmValueManager.GetSysParmValueAsync(medicalCenterId, "charge_request_no_rule_tail_len");
  109. request_no_rule_prefix = await _sysParmValueManager.GetSysParmValueAsync(medicalCenterId, "charge_request_no_rule_prefix");
  110. if (string.IsNullOrWhiteSpace(request_no_rule_coding))
  111. {
  112. throw new UserFriendlyException("收费申请单号编码方式不能为空");
  113. }
  114. if (string.IsNullOrWhiteSpace(request_no_rule_tail_len))
  115. {
  116. throw new UserFriendlyException("收费申请单号编码尾号长度不能为空");
  117. }
  118. int tailLen = 0;
  119. if (!int.TryParse(request_no_rule_tail_len, out tailLen))
  120. {
  121. throw new UserFriendlyException("收费申请单号编码尾号长度不能为空");
  122. }
  123. if (tailLen < 3)
  124. {
  125. throw new UserFriendlyException("收费申请单号编码尾号长度至少为3位");
  126. }
  127. if (string.IsNullOrWhiteSpace(request_no_rule_prefix))
  128. {
  129. request_no_rule_prefix = "";
  130. }
  131. var primarykeyBuilderEnt = await _primarykeyBuilderRepository.FirstOrDefaultAsync(f => f.PrimarykeyBuilderId == "lis_request_no");
  132. string maxnum = "1";
  133. string date = DateTime.Now.ToString("yyyyMMdd");// 当天
  134. if (request_no_rule_coding == "0")
  135. {
  136. //日期+尾号
  137. #region 模式0 日期+尾号
  138. if (primarykeyBuilderEnt != null)
  139. {
  140. if (primarykeyBuilderEnt.DateString != date)
  141. {
  142. //新的日期 为1 maxnum
  143. primarykeyBuilderEnt.DateString = date;
  144. }
  145. else
  146. {
  147. maxnum = (Convert.ToInt32(primarykeyBuilderEnt.SerialNo) + 1).ToString();
  148. }
  149. primarykeyBuilderEnt.SerialNo = maxnum; //更新新的序列号
  150. LisRequestNo = request_no_rule_prefix + date + maxnum.PadLeft(Convert.ToInt32(request_no_rule_tail_len), '0');
  151. await _primarykeyBuilderRepository.UpdateAsync(primarykeyBuilderEnt);
  152. }
  153. else
  154. {
  155. //初始写入
  156. LisRequestNo = request_no_rule_prefix + date + maxnum.PadLeft(Convert.ToInt32(request_no_rule_tail_len), '0');
  157. primarykeyBuilderEnt = new PrimarykeyBuilder
  158. {
  159. PrimarykeyBuilderId = "charge_request_no",
  160. DateString = date,
  161. SerialNo = maxnum
  162. };
  163. await _primarykeyBuilderRepository.InsertAsync(primarykeyBuilderEnt,true);
  164. }
  165. #endregion
  166. }
  167. else
  168. {
  169. //模式1 顺序递增
  170. #region 模式1 顺序递增
  171. if (primarykeyBuilderEnt != null)
  172. {
  173. maxnum = (Convert.ToInt32(primarykeyBuilderEnt.SerialNo) + 1).ToString();
  174. primarykeyBuilderEnt.SerialNo = maxnum; //更新num
  175. await _primarykeyBuilderRepository.UpdateAsync(primarykeyBuilderEnt);
  176. }
  177. else
  178. {
  179. //初始写入
  180. primarykeyBuilderEnt = new PrimarykeyBuilder
  181. {
  182. PrimarykeyBuilderId = "charge_request_no",
  183. DateString = "",
  184. SerialNo = maxnum
  185. };
  186. await _primarykeyBuilderRepository.InsertAsync(primarykeyBuilderEnt,true);
  187. }
  188. LisRequestNo = request_no_rule_prefix + maxnum.PadLeft(Convert.ToInt32(request_no_rule_tail_len), '0');
  189. #endregion
  190. }
  191. return LisRequestNo;
  192. }
  193. }
  194. }