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

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<ChargeRequest, Guid> _repository;
private readonly IRepository<PatientRegister, Guid> _patientRegisterRepository;
private readonly IRepository<PrimarykeyBuilder> _primarykeyBuilderRepository;
private readonly SysParmValueManager _sysParmValueManager;
private readonly IRepository<ThirdInterface, Guid> _thirdInterfaceRepository;
public ChargeRequestManager(IRepository<ChargeRequest, Guid> repository,
IRepository<PrimarykeyBuilder> primarykeyBuilderRepository,
SysParmValueManager sysParmValueManager,
IRepository<PatientRegister, Guid> patientRegisterRepository,
IRepository<ThirdInterface, Guid> thirdInterfaceRepository)
{
_repository = repository;
_primarykeyBuilderRepository = primarykeyBuilderRepository;
_sysParmValueManager = sysParmValueManager;
_patientRegisterRepository = patientRegisterRepository;
_thirdInterfaceRepository = thirdInterfaceRepository;
}
/// <summary>
/// 创建
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
public async Task<ChargeRequest> 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<ChargeRequestPlugInsOut> 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<ChargeRequestPlugInsOut>)method.Invoke(instance, args);
}
else
{
returnValue = (ChargeRequestPlugInsOut)method.Invoke(instance, args);
}
return returnValue;
}
private async Task<string> 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;
}
}
}