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
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;
|
|
|
|
}
|
|
}
|
|
}
|