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.

529 lines
26 KiB

using Microsoft.AspNetCore.Authorization;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
using Org.BouncyCastle.Asn1.Ocsp;
using Shentun.Peis.Enums;
using Shentun.Peis.Models;
using Shentun.Peis.PlugIns;
using Shentun.Peis.PrintReports;
using Shentun.Peis.SysParmValues;
using Shentun.Utilities;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;
using Volo.Abp;
using Volo.Abp.Domain.Entities;
using Volo.Abp.Domain.Repositories;
using Volo.Abp.Domain.Services;
namespace Shentun.Peis.LisRequests
{
public class LisRequestManager : DomainService
{
private readonly IRepository<PatientRegister, Guid> _patientRegisterRepository;
private readonly IRepository<RegisterCheck, Guid> _registerCheckRepository;
private readonly IRepository<RegisterCheckAsbitem, Guid> _registerCheckAsbitemRepository;
private readonly IRepository<SampleGroup, Guid> _sampleGroupRepository;
private readonly IRepository<SampleGroupDetail> _sampleGroupDetailRepository;
private readonly IRepository<Asbitem, Guid> _asbitemRepository;
private readonly IRepository<ItemType, Guid> _itemTypeRepository;
private readonly IRepository<SysParmValue> _sysParmValueRepository;
private readonly IRepository<PrimarykeyBuilder> _primarykeyBuilderRepository;
private readonly IRepository<LisRequest, Guid> _lisRequestRepository;
private readonly IRepository<ThirdInterface, Guid> _thirdInterfaceRepository;
private readonly SysParmValueManager _sysParmValueManager;
public LisRequestManager(
IRepository<PatientRegister, Guid> patientRegisterRepository,
IRepository<RegisterCheck, Guid> registerCheckRepository,
IRepository<RegisterCheckAsbitem, Guid> registerCheckAsbitemRepository,
IRepository<SampleGroup, Guid> sampleGroupRepository,
IRepository<SampleGroupDetail> sampleGroupDetailRepository,
IRepository<Asbitem, Guid> asbitemRepository,
IRepository<ItemType, Guid> itemTypeRepository,
IRepository<SysParmValue> sysParmValueRepository,
IRepository<PrimarykeyBuilder> primarykeyBuilderRepository,
IRepository<LisRequest, Guid> lisRequestRepository,
SysParmValueManager sysParmValueManager,
IRepository<ThirdInterface, Guid> thirdInterfaceRepository
)
{
_patientRegisterRepository = patientRegisterRepository;
_registerCheckRepository = registerCheckRepository;
this._registerCheckAsbitemRepository = registerCheckAsbitemRepository;
this._sampleGroupRepository = sampleGroupRepository;
this._sampleGroupDetailRepository = sampleGroupDetailRepository;
this._sysParmValueRepository = sysParmValueRepository;
this._primarykeyBuilderRepository = primarykeyBuilderRepository;
this._lisRequestRepository = lisRequestRepository;
_sysParmValueManager = sysParmValueManager;
_thirdInterfaceRepository = thirdInterfaceRepository;
_asbitemRepository = asbitemRepository;
_itemTypeRepository = itemTypeRepository;
}
/// <summary>
/// 生成检验申请单
/// </summary>
/// <param name="patientRegisterId">人员登记ID</param>
/// <returns></returns>
public async Task<List<LisRequest>> SetLisRequestAsync(Guid patientRegisterId)
{
var sampleGroups = await _sampleGroupRepository.GetListAsync();
var _sampleGroupDetail = await _sampleGroupDetailRepository.GetListAsync();
var patientRegisterRequests = (
from patientRegister in await _patientRegisterRepository.GetQueryableAsync()
join registerCheck in await _registerCheckRepository.GetQueryableAsync()
on patientRegister.Id equals registerCheck.PatientRegisterId
join registerCheckAsbitem in await _registerCheckAsbitemRepository.GetQueryableAsync()
on registerCheck.Id equals registerCheckAsbitem.RegisterCheckId
join asbitem in await _asbitemRepository.GetQueryableAsync()
on registerCheckAsbitem.AsbitemId equals asbitem.Id
join itemType in await _itemTypeRepository.GetQueryableAsync()
on asbitem.ItemTypeId equals itemType.Id
where patientRegister.Id == patientRegisterId
&& patientRegister.CompleteFlag != PatientRegisterCompleteFlag.PreRegistration
&& patientRegister.CompleteFlag != PatientRegisterCompleteFlag.SumCheck
&& patientRegister.CompleteFlag != PatientRegisterCompleteFlag.Audit
&& itemType.CheckTypeFlag == CheckTypeFlag.Laboratory
&& registerCheck.CompleteFlag == RegisterCheckCompleteFlag.UnChecked
select new
{
patientRegister,
registerCheckAsbitem
}).ToList();
if(!patientRegisterRequests.Any())
{
return null;
}
var patientRegisterFirst = patientRegisterRequests.First().patientRegister;
var registerCheckAsbitems = patientRegisterRequests.Select(o => o.registerCheckAsbitem)
.Where(o => o.PatientRegisterId == patientRegisterFirst.Id).Distinct().ToList();
SetLisRequest(patientRegisterFirst, registerCheckAsbitems, sampleGroups, _sampleGroupDetail
, out var updateRegisterCheckAsbitems, out var createLisRequests);
await _lisRequestRepository.InsertManyAsync(createLisRequests, true);
await _registerCheckAsbitemRepository.UpdateManyAsync(updateRegisterCheckAsbitems, true);
return createLisRequests;
}
public void SetLisRequest(PatientRegister patientRegister,
List<RegisterCheckAsbitem> registerCheckAsbitems,
List<SampleGroup> sampleGroups,
List<SampleGroupDetail> sampleGroupDetails,
out List<RegisterCheckAsbitem> updateRegisterCheckAsbitems,
out List<LisRequest> createLisRequests)
{
var registerCheckAsbitemLisList = new List<RegisterCheckAsbitemLis>();
updateRegisterCheckAsbitems = new List<RegisterCheckAsbitem>();
foreach (var registerCheckAsbitem in registerCheckAsbitems)
{
var sampleGroupDetail = sampleGroupDetails.Where(o => o.AsbitemId == registerCheckAsbitem.AsbitemId).FirstOrDefault();
if (sampleGroupDetail != null)
{
registerCheckAsbitemLisList.Add(new RegisterCheckAsbitemLis()
{
RegisterCheckAsbitemId = registerCheckAsbitem.Id,
SampleGroupId = sampleGroupDetail.SampleGroupId,
LisRequestId = registerCheckAsbitem.LisRequestId,
});
}
}
//未设置的申请单设置到相同分组的已有申请单
var noRequestCheckAsbitems = registerCheckAsbitems.Where(o => o.LisRequestId == null || o.LisRequestId == Guid.Empty).ToList();
foreach (var registerCheckAsbitem in noRequestCheckAsbitems)
{
var registerCheckAsbitemLis = registerCheckAsbitemLisList.Where(o => o.RegisterCheckAsbitemId == registerCheckAsbitem.Id).SingleOrDefault();
if (registerCheckAsbitemLis == null)
{
continue;
}
var haveRegisterCheckAsbitemLis = registerCheckAsbitemLisList.Where(o => o.SampleGroupId == registerCheckAsbitemLis.SampleGroupId
&& o.LisRequestId != null && o.LisRequestId != Guid.Empty).FirstOrDefault();
if (haveRegisterCheckAsbitemLis != null)
{
registerCheckAsbitem.LisRequestId = haveRegisterCheckAsbitemLis.LisRequestId;
updateRegisterCheckAsbitems.Add(registerCheckAsbitem);
}
}
//未设置的项目重新设置申请单
noRequestCheckAsbitems = registerCheckAsbitems.Where(o => o.LisRequestId == null || o.LisRequestId == Guid.Empty).ToList();
var noRequestLisList = registerCheckAsbitemLisList.Where(o => noRequestCheckAsbitems.Select(o => o.Id).Contains(o.RegisterCheckAsbitemId)).ToList();
var sampleGroupids = noRequestLisList.Select(o => o.SampleGroupId).Distinct();
createLisRequests = new List<LisRequest>();
foreach (var sampleGroupid in sampleGroupids)
{
var sampleGroup = sampleGroups.Where(o => o.Id == sampleGroupid).Single();
//var guid = GuidGenerator.Create();
var lisRequest = new LisRequest(GuidGenerator.Create())
{
IsPrint = 'N',
IsSignIn = 'N',
LisRequestNo = CreateLisRequestNo(patientRegister.MedicalCenterId).Result,
SampleContainerId = sampleGroup.SampleContainerId,
SampleTypeId = sampleGroup.SampleTypeId
};
createLisRequests.Add(lisRequest);
foreach (var requestLis in noRequestLisList)
{
if (requestLis.SampleGroupId == sampleGroupid)
{
requestLis.LisRequestId = lisRequest.Id;
var registerCheckAsbitem = noRequestCheckAsbitems.Where(o => o.Id == requestLis.RegisterCheckAsbitemId).Single();
registerCheckAsbitem.LisRequestId = lisRequest.Id;
updateRegisterCheckAsbitems.Add(registerCheckAsbitem);
}
}
}
}
/// <summary>
/// 追加项目到检验单 如lisrequest内有项目完成体检或者弃检 不允许追加
/// </summary>
/// <param name="LisRequestId"></param>
/// <param name="RegisterCheckAsbitemIds"></param>
/// <returns></returns>
public async Task AppendLisRequestAsync(Guid LisRequestId, List<Guid> RegisterCheckAsbitemIds)
{
//根据RegisterAsbitemId
var registerCheckAsbitemInIdList = (await _registerCheckAsbitemRepository.GetQueryableAsync())
.Include(x => x.RegisterCheck)
.Include(x=>x.Asbitem)
.ThenInclude(x=>x.ItemType)
.Where(m => RegisterCheckAsbitemIds.Contains(m.Id)).ToList();
foreach(var registerCheckAsbitem in registerCheckAsbitemInIdList)
{
if(registerCheckAsbitem.Asbitem.ItemType.CheckTypeFlag != CheckTypeFlag.Laboratory)
{
throw new UserFriendlyException($"{registerCheckAsbitem.Asbitem.DisplayName}不是检验项目");
}
}
//根据LisRequestId
var registerAsbitemInLisRequestIdList = (await _registerCheckAsbitemRepository.GetQueryableAsync())
.Include(x => x.RegisterCheck)
.Where(m => m.LisRequestId == LisRequestId).ToList();
if (registerAsbitemInLisRequestIdList.Where(m => m.RegisterCheck.CompleteFlag != RegisterCheckCompleteFlag.UnChecked).Count() > 0)
{
//当前条码项目已完成体检或已弃检
throw new UserFriendlyException("当前条码项目已完成体检或已弃检");
}
if (registerCheckAsbitemInIdList.Any())
{
registerCheckAsbitemInIdList.ForEach(f => f.LisRequestId = LisRequestId);
await _registerCheckAsbitemRepository.UpdateManyAsync(registerCheckAsbitemInIdList);
}
else
{
throw new UserFriendlyException("RegisterAsbitem数据不存在");
}
}
/// <summary>
/// 追加项目到检验单 生成新的条码号
/// </summary>
/// <param name="LisRequestId"></param>
/// <param name="registerCheckAsbitemIds"></param>
/// <returns></returns>
public async Task<List<LisRequest>> AddLisRequestAsync(List<Guid> registerCheckAsbitemIds)
{
List<LisRequest> lisRequests = new List<LisRequest>();
//根据RegisterAsbitem表ID 查找登记的组合项目
var registerCheckAsbitemeList = (await _registerCheckAsbitemRepository.GetQueryableAsync())
.Include(x => x.Asbitem)
.ThenInclude(x => x.ItemType)
.Include(x => x.PatientRegister)
.Where(m => registerCheckAsbitemIds.Contains(m.Id))
.ToList();
if(!registerCheckAsbitemeList.Any())
{
return null;
}
foreach (var registerCheckAsbitem in registerCheckAsbitemeList)
{
if (registerCheckAsbitem.Asbitem.ItemType.CheckTypeFlag != CheckTypeFlag.Laboratory)
{
throw new UserFriendlyException($"{registerCheckAsbitem.Asbitem.DisplayName}不是检验项目");
}
}
var sampleGroups = await _sampleGroupRepository.GetListAsync();
var _sampleGroupDetail = await _sampleGroupDetailRepository.GetListAsync();
var patientRegisterFirst = registerCheckAsbitemeList.First().PatientRegister;
SetLisRequest(patientRegisterFirst, registerCheckAsbitemeList, sampleGroups, _sampleGroupDetail
, out var updateRegisterCheckAsbitems, out var createLisRequests);
await _lisRequestRepository.InsertManyAsync(createLisRequests, true);
await _registerCheckAsbitemRepository.UpdateManyAsync(updateRegisterCheckAsbitems, true);
//if (registerCheckAsbitemeList.Any())
//{
// //根据登记的组合ID 查找组合项目对应的条码分组
// var sampleGroupDetailList = await _sampleGroupDetailRepository.GetListAsync(m => registerCheckAsbitemeList.Select(s => s.AsbitemId).Contains(m.AsbitemId));
// if (sampleGroupDetailList.Any())
// {
// //查找条码分组信息 根据条码分组ID
// var sampleGroupList = (await _sampleGroupRepository.GetQueryableAsync())
// .Include(x => x.SampleContainer)
// .Include(x => x.SampleType)
// .Where(m => sampleGroupDetailList.Select(s => s.SampleGroupId).Contains(m.Id)).ToList();
// foreach (var sampleGroup in sampleGroupList)
// {
// //根据条码分组生成,一个条码分组生成一个检验单
// #region 生成检验申请单
// var lisRequestEnt = new LisRequest
// {
// IsPrint = 'N',
// IsSignIn = 'N',
// LisRequestNo = await CreateLisRequestNo(registerCheckAsbitemeList.FirstOrDefault().PatientRegister.MedicalCenterId),
// SampleContainerId = sampleGroup.SampleContainerId,
// SampleTypeId = sampleGroup.SampleTypeId
// };
// //生成检验申请单的新实体
// var lisRequestEnt_New = await _lisRequestRepository.InsertAsync(lisRequestEnt, true);
// lisRequests.Add(lisRequestEnt_New);
// #region 修改RegisterAsbitem表 LisRequestId
// //当前条码分组ID绑定的组合项目
// var AsbitemIds = sampleGroupDetailList.Where(m => m.SampleGroupId == sampleGroup.Id).Select(s => s.AsbitemId);
// //获取需要更新的RegisterCheckAsbitem数据
// var registerAsbitemeList_Update = await _registerCheckAsbitemRepository.GetListAsync(
// f => registerCheckAsbitemIds.Contains(f.Id) && AsbitemIds.Contains(f.AsbitemId));
// if (registerAsbitemeList_Update.Any())
// {
// //更新LisRequestId
// registerAsbitemeList_Update.ForEach(m => m.LisRequestId = lisRequestEnt_New.Id);
// await _registerCheckAsbitemRepository.UpdateManyAsync(registerAsbitemeList_Update);
// }
// #endregion
// #endregion
// }
// }
//}
return createLisRequests;
}
public async Task SendThirdLisRequestAsync(Guid id)
{
//var patientRegisterEntity = (from patientRegister in await _patientRegisterRepository.GetQueryableAsync()
// join registerCheck in await _registerCheckRepository.GetQueryableAsync()
// on patientRegister.Id equals registerCheck.PatientRegisterId
// join registerCheckAsbitem in await _registerCheckAsbitemRepository.GetQueryableAsync()
// on registerCheck.Id equals registerCheckAsbitem.RegisterCheckId
// join lisRequest in await _lisRequestRepository.GetQueryableAsync()
// on registerCheckAsbitem.LisRequestId equals lisRequest.Id
// where lisRequest.Id == id
// select new
// {
// patientRegister
// }).ToList().FirstOrDefault();
// if(patientRegisterEntity == null)
// {
// return;
// }
var thirdInterfaces = (await _thirdInterfaceRepository.GetListAsync(o => o.ThirdInterfaceType == ThirdInterfaceTypeFlag.LisRequest
))
.OrderBy(o => o.DisplayOrder).ToList();
foreach (var thirdInterface in thirdInterfaces)
{
var lisRequestPluginsInput = new LisRequestPlugInsInput()
{
LisRequestId = 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[] { lisRequestPluginsInput };
var LisRequestPluginsOut = await ReflectionHelper.InvokeAsync<LisRequestPlugInsOut>(assemblyName, className, parmValue, "SendRequestAsync", objects);
}
}
/// <summary>
/// 生成检验申请单条码号(规则,先找体检中心的配置,如未找到,就直接使用全局的)
/// 模式(0 日期+尾号 1.顺序递增)
/// </summary>
/// <param name="medicalCenterId">体检中心ID</param>
/// <returns></returns>
private async Task<string> CreateLisRequestNo(Guid medicalCenterId)
{
string LisRequestNo = ""; //条码号
//List<SysParmValue> spvlist = await _sysParmValueRepository.GetListAsync();
//var spv_tjzx = spvlist.Where(m => m.MedicalCenterId == medicalCenterId); //体检中心配置
//var spv_global = spvlist.Where(m => m.MedicalCenterId == Guid.Empty); //全局配置
string lis_request_no_rule_coding = "0"; // 模式(0 日期+尾号 1.顺序递增)
string lis_request_no_rule_tail_len = "4"; //尾号长度
string lis_request_no_rule_prefix = "T"; //前缀
lis_request_no_rule_coding = await _sysParmValueManager.GetSysParmValueAsync(medicalCenterId, "lis_request_no_rule_coding");
lis_request_no_rule_tail_len = await _sysParmValueManager.GetSysParmValueAsync(medicalCenterId, "lis_request_no_rule_tail_len");
lis_request_no_rule_prefix = await _sysParmValueManager.GetSysParmValueAsync(medicalCenterId, "lis_request_no_rule_prefix");
if (string.IsNullOrWhiteSpace(lis_request_no_rule_coding))
{
throw new UserFriendlyException("LIS编码方式不能为空");
}
if (string.IsNullOrWhiteSpace(lis_request_no_rule_tail_len))
{
throw new UserFriendlyException("LIS编码尾号长度不能为空");
}
int tailLen = 0;
if (!int.TryParse(lis_request_no_rule_tail_len, out tailLen))
{
throw new UserFriendlyException("LIS编码尾号长度不能为空");
}
if (tailLen < 3)
{
throw new UserFriendlyException("LIS编码尾号长度至少为3位");
}
if (string.IsNullOrWhiteSpace(lis_request_no_rule_prefix))
{
lis_request_no_rule_prefix = "";
}
var primarykeyBuilderEnt = await _primarykeyBuilderRepository.FirstOrDefaultAsync(f => f.PrimarykeyBuilderId == "lis_request_no");
string maxnum = "1";
string date = DateTime.Now.ToString("yyMMdd");// 当天
if (lis_request_no_rule_coding == "0")
{
//日期+尾号
#region 模式0 日期+尾号
if (primarykeyBuilderEnt != null)
{
if (primarykeyBuilderEnt.DateString != date)
{
//新的日期 为1 maxnum
primarykeyBuilderEnt.DateString = date;
maxnum = "1";
}
else
{
maxnum = (Convert.ToInt32(primarykeyBuilderEnt.SerialNo) + 1).ToString();
}
primarykeyBuilderEnt.SerialNo = maxnum; //更新新的序列号
LisRequestNo = lis_request_no_rule_prefix + date + maxnum.PadLeft(Convert.ToInt32(lis_request_no_rule_tail_len), '0');
await _primarykeyBuilderRepository.UpdateAsync(primarykeyBuilderEnt);
}
else
{
//初始写入
LisRequestNo = lis_request_no_rule_prefix + date + maxnum.PadLeft(Convert.ToInt32(lis_request_no_rule_tail_len), '0');
primarykeyBuilderEnt = new PrimarykeyBuilder
{
PrimarykeyBuilderId = "lis_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 = "lis_request_no",
DateString = "",
SerialNo = maxnum
};
await _primarykeyBuilderRepository.InsertAsync(primarykeyBuilderEnt,true);
}
LisRequestNo = lis_request_no_rule_prefix + maxnum.PadLeft(Convert.ToInt32(lis_request_no_rule_tail_len), '0');
#endregion
}
return LisRequestNo;
}
private class RegisterCheckAsbitemLis
{
public Guid RegisterCheckAsbitemId { get; set; }
public Guid SampleGroupId { get; set; }
public Guid? LisRequestId { get; set; }
}
//private async Task<LisRequestPlugInsOut> 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 }
// LisRequestPlugInsOut 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<LisRequestPlugInsOut>)method.Invoke(instance, args);
// }
// else
// {
// returnValue = (LisRequestPlugInsOut)method.Invoke(instance, args);
// }
// return returnValue;
//}
}
}