using Microsoft.Extensions.Configuration; using Shentun.Peis.Enums; using Shentun.Peis.Models; using Shentun.Peis.PlugIns; using Shentun.Peis.SysParmValues; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Reflection; using System.Text; using System.Threading.Tasks; using Volo.Abp; using Volo.Abp.Domain.Repositories; using Volo.Abp.Domain.Services; namespace Shentun.Peis.ChargeRequests { public class ChargeRequestManager : DomainService { private readonly IRepository _repository; private readonly IRepository _patientRegisterRepository; private readonly IRepository _primarykeyBuilderRepository; private readonly SysParmValueManager _sysParmValueManager; private readonly IRepository _thirdInterfaceRepository; public ChargeRequestManager(IRepository repository, IRepository primarykeyBuilderRepository, SysParmValueManager sysParmValueManager, IRepository patientRegisterRepository, IRepository thirdInterfaceRepository) { _repository = repository; _primarykeyBuilderRepository = primarykeyBuilderRepository; _sysParmValueManager = sysParmValueManager; _patientRegisterRepository = patientRegisterRepository; _thirdInterfaceRepository = thirdInterfaceRepository; } /// /// 创建 /// /// /// public async Task CreateAsync( ChargeRequest entity ) { var patientRegister = await _patientRegisterRepository.GetAsync( entity.PatientRegisterId ); return new ChargeRequest( GuidGenerator.Create() ) { PatientRegisterId = entity.PatientRegisterId, HisChargeNo = entity.HisChargeNo, ChargeRequestNo = await CreateChargeRequestNo(patientRegister.MedicalCenterId), ChargeRequestFlag = ChargeRequestFlag.Request, }; } public async Task SendThirChargeRequestAsync(Guid id) { var thirdInterfaces = (await _thirdInterfaceRepository.GetListAsync(o => o.ThirdInterfaceType == ThirdInterfaceTypeFlag.ChargeRequest)) .OrderBy(o => o.DisplayOrder).ToList(); foreach (var thirdInterface in thirdInterfaces) { var chargeRequestPlugInsInput = new ChargeRequestPlugInsInput() { ChargeRequestId = id }; var parmValue = thirdInterface.ParmValue; var configurationBuilder = new ConfigurationBuilder() .AddJsonStream(new MemoryStream(System.Text.Encoding.UTF8.GetBytes(parmValue))); var config = configurationBuilder.Build(); var assemblyName = config.GetSection("Interface").GetSection("AssemblyName").Value; var className = config.GetSection("Interface").GetSection("ClassName").Value; object[] objects = new object[] { chargeRequestPlugInsInput }; var chargeRequestPluginsOut = await InvokeAsync(assemblyName, className, parmValue, "SendRequest", objects); } } private async Task InvokeAsync(string assemblyName, string className, string classConstructorArg, string methodName, object[] args = null) { Assembly assembly = Assembly.Load(assemblyName); Type type = assembly.GetType(className); // 创建类的实例 object instance = Activator.CreateInstance(type, classConstructorArg); // 获取方法信息 MethodInfo method = type.GetMethod(methodName); // 调用方法,如果方法需要参数,可以传入对应的参数数组,例如: new object[] { arg1, arg2 } ChargeRequestPlugInsOut returnValue; var isAsync = (method.ReturnType == typeof(Task) || (method.ReturnType.IsGenericType && method.ReturnType.GetGenericTypeDefinition() == typeof(Task<>))); if (isAsync) { // 使用反射调用方法 //object returnValue = method.Invoke(instance, args); returnValue = await (Task)method.Invoke(instance, args); } else { returnValue = (ChargeRequestPlugInsOut)method.Invoke(instance, args); } return returnValue; } private async Task CreateChargeRequestNo(Guid medicalCenterId) { string LisRequestNo = ""; //条码号 string request_no_rule_coding = "0"; // 模式(0 日期+尾号 1.顺序递增) string request_no_rule_tail_len = "4"; //尾号长度 string request_no_rule_prefix = "T"; //前缀 request_no_rule_coding = await _sysParmValueManager.GetSysParmValueAsync(medicalCenterId, "charge_request_no_rule_coding"); request_no_rule_tail_len = await _sysParmValueManager.GetSysParmValueAsync(medicalCenterId, "charge_request_no_rule_tail_len"); request_no_rule_prefix = await _sysParmValueManager.GetSysParmValueAsync(medicalCenterId, "charge_request_no_rule_prefix"); if (string.IsNullOrWhiteSpace(request_no_rule_coding)) { throw new UserFriendlyException("收费申请单号编码方式不能为空"); } if (string.IsNullOrWhiteSpace(request_no_rule_tail_len)) { throw new UserFriendlyException("收费申请单号编码尾号长度不能为空"); } int tailLen = 0; if (!int.TryParse(request_no_rule_tail_len, out tailLen)) { throw new UserFriendlyException("收费申请单号编码尾号长度不能为空"); } if (tailLen < 3) { throw new UserFriendlyException("收费申请单号编码尾号长度至少为3位"); } if (string.IsNullOrWhiteSpace(request_no_rule_prefix)) { request_no_rule_prefix = ""; } var primarykeyBuilderEnt = await _primarykeyBuilderRepository.FirstOrDefaultAsync(f => f.PrimarykeyBuilderId == "lis_request_no"); string maxnum = "1"; string date = DateTime.Now.ToString("yyyyMMdd");// 当天 if (request_no_rule_coding == "0") { //日期+尾号 #region 模式0 日期+尾号 if (primarykeyBuilderEnt != null) { if (primarykeyBuilderEnt.DateString != date) { //新的日期 为1 maxnum primarykeyBuilderEnt.DateString = date; } else { maxnum = (Convert.ToInt32(primarykeyBuilderEnt.SerialNo) + 1).ToString(); } primarykeyBuilderEnt.SerialNo = maxnum; //更新新的序列号 LisRequestNo = request_no_rule_prefix + date + maxnum.PadLeft(Convert.ToInt32(request_no_rule_tail_len), '0'); await _primarykeyBuilderRepository.UpdateAsync(primarykeyBuilderEnt); } else { //初始写入 LisRequestNo = request_no_rule_prefix + date + maxnum.PadLeft(Convert.ToInt32(request_no_rule_tail_len), '0'); primarykeyBuilderEnt = new PrimarykeyBuilder { PrimarykeyBuilderId = "charge_request_no", DateString = date, SerialNo = maxnum }; await _primarykeyBuilderRepository.InsertAsync(primarykeyBuilderEnt,true); } #endregion } else { //模式1 顺序递增 #region 模式1 顺序递增 if (primarykeyBuilderEnt != null) { maxnum = (Convert.ToInt32(primarykeyBuilderEnt.SerialNo) + 1).ToString(); primarykeyBuilderEnt.SerialNo = maxnum; //更新num await _primarykeyBuilderRepository.UpdateAsync(primarykeyBuilderEnt); } else { //初始写入 primarykeyBuilderEnt = new PrimarykeyBuilder { PrimarykeyBuilderId = "charge_request_no", DateString = "", SerialNo = maxnum }; await _primarykeyBuilderRepository.InsertAsync(primarykeyBuilderEnt,true); } LisRequestNo = request_no_rule_prefix + maxnum.PadLeft(Convert.ToInt32(request_no_rule_tail_len), '0'); #endregion } return LisRequestNo; } } }