using Microsoft.EntityFrameworkCore; using Shentun.Peis.Enums; using Shentun.Peis.Models; using Shentun.Peis.ReferenceRanges; using Shentun.Peis.RegisterCheckItems; using Shentun.Peis.RegisterChecks; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; //using TencentCloud.Ame.V20190916.Models; using TencentCloud.Iot.V20180123.Models; using Volo.Abp; using Volo.Abp.Domain.Repositories; using Volo.Abp.Domain.Services; namespace Shentun.Peis.RegisterAsbitems { /// /// 检查组合项目记录 /// public class RegisterAsbitemManager : DomainService { private readonly IRepository _registerAsbitemRepository; private readonly IRepository _registerCheckRepository; private readonly IRepository _registerCheckItemRepository; private readonly IRepository _asbitemDetailRepository; private readonly IRepository _asbitemRepository; private readonly IRepository _unitRepository; private readonly IRepository _patientRegisterRepository; private readonly IRepository _itemRepository; private readonly IRepository _referenceRangeRepository; private readonly ReferenceRangeManager _referenceRangeManager; private readonly RegisterCheckManager _registerCheckManager; private readonly RegisterCheckItemManager _registerCheckItemManager; public RegisterAsbitemManager(IRepository registerAsbitemRepository, IRepository registerCheckRepository, IRepository registerCheckItemRepository, IRepository asbitemDetailRepository, IRepository asbitemRepository, IRepository unitRepository, IRepository patientRegisterRepository, IRepository itemRepository, IRepository referenceRangeRepository, ReferenceRangeManager referenceRangeManager, RegisterCheckManager registerCheckManager, RegisterCheckItemManager registerCheckItemManager ) { this._registerAsbitemRepository = registerAsbitemRepository; this._registerCheckRepository = registerCheckRepository; this._registerCheckItemRepository = registerCheckItemRepository; this._asbitemDetailRepository = asbitemDetailRepository; this._asbitemRepository = asbitemRepository; this._unitRepository = unitRepository; this._patientRegisterRepository = patientRegisterRepository; this._itemRepository = itemRepository; this._referenceRangeRepository = referenceRangeRepository; this._referenceRangeManager = referenceRangeManager; this._registerCheckManager = registerCheckManager; this._registerCheckItemManager = registerCheckItemManager; } /// /// 添加数据 /// /// 体检中心ID /// 登记的组合项目 /// 是否需要自动合并 /// public async Task CreateAsync(Guid OrganizationUnitId, RegisterAsbitem ent, bool IsAutoMerger) { var IsregisterAsbitemEnt = await _registerAsbitemRepository.FirstOrDefaultAsync(m => m.PatientRegisterId == ent.PatientRegisterId && m.AsbitemId == ent.AsbitemId); if (IsregisterAsbitemEnt == null) { //添加check跟item数据 #region 默认添加RegisterCheck数据 RegisterCheck registerCheckEnt = new RegisterCheck { CheckRequestNo = await _registerCheckManager.CreateCheckRequestNo(OrganizationUnitId), CheckRequestPrintTimes = 0, CompleteFlag = RegisterCheckCompleteFlag.UnChecked, IsAudit = 'N', IsLock = 'N' }; var registerCheckEnt_Res = await _registerCheckRepository.InsertAsync(registerCheckEnt, true); #endregion RegisterAsbitem entity = new RegisterAsbitem { Amount = ent.Amount, AsbitemId = ent.AsbitemId, ChargePrice = ent.ChargePrice, IsCharge = ent.IsCharge, LisRequestId = ent.LisRequestId, PatientRegisterId = ent.PatientRegisterId, PayTypeFlag = ent.PayTypeFlag, StandardPrice = ent.StandardPrice, GroupPackageId = ent.GroupPackageId, RegisterCheckId = registerCheckEnt_Res.Id }; var registerAsbitemEnt_Res = await _registerAsbitemRepository.InsertAsync(entity, true); if (registerCheckEnt_Res != null) { #region 默认添加RegisterCheckItem数据 需要遍历Item // var itemList = await _asbitemDetailRepository.GetListAsync(m => m.AsbitemId == ent.AsbitemId); var asbitemDetailList = (await _asbitemDetailRepository.GetDbSetAsync()).Include(x => x.Item).Where(m => m.AsbitemId == ent.AsbitemId).ToList(); List registerCheckItemList = new List(); if (asbitemDetailList.Any()) { var itemList = await _itemRepository.GetListAsync(); var referenceRangeList = await _referenceRangeRepository.GetListAsync(); var patientRegisterEnt = await _patientRegisterRepository.GetAsync(ent.PatientRegisterId); foreach (var item in asbitemDetailList) { //参考范围 // var referenceRangeEnt = await _referenceRangeManager.GetReferenceRangeInSexAge(item.ItemId, ent.PatientRegisterId); var referenceRangeEnt = _referenceRangeManager.GetReferenceRangeInSexAgeTemp(referenceRangeList, itemList.Where(m => m.Id == item.ItemId).FirstOrDefault(), patientRegisterEnt.SexId, patientRegisterEnt.Age); string UnitName = ""; if (item.Item.UnitId != null && item.Item.UnitId != Guid.Empty) { //单位 var unitEnt = await _unitRepository.GetAsync(item.Item.UnitId.Value); if (unitEnt != null) { UnitName = unitEnt.DisplayName; } } RegisterCheckItem registerCheckItem = new RegisterCheckItem { ItemId = item.ItemId, RegisterCheckId = registerCheckEnt_Res.Id, ReferenceRangeValue = referenceRangeEnt == null ? "" : referenceRangeEnt.ReferenceRangeValue, CriticalRangeValue = referenceRangeEnt == null ? "" : referenceRangeEnt.CriticalRangeValue, Unit = UnitName }; registerCheckItemList.Add(registerCheckItem); } await _registerCheckItemRepository.InsertManyAsync(registerCheckItemList); } else { var asbitemEntity = await _asbitemRepository.FindAsync(m => m.Id == ent.AsbitemId); if (asbitemEntity.IsCheck == 'Y') throw new UserFriendlyException($"{asbitemEntity.DisplayName}项目未包含明细项目"); } #endregion } #region 数据登记完,自动合并 先判断自身组合项目能否合并 如果可以合并再去找当前登记下的组合项目是否有同项目类别的数据(并且判断这个组合项目是否为可以合并的) //是否需要自动合并 if (IsAutoMerger) { var asbitemEnt = (await _asbitemRepository.GetDbSetAsync()).Include(x => x.ItemType).Where(m => m.Id == ent.AsbitemId).FirstOrDefault(); if (asbitemEnt != null) { if (asbitemEnt.IsItemResultMerger == 'Y' && asbitemEnt.ItemType.IsMergeAsbitem == 'Y') { //可以合并 //查询需要合并的数据 var mergerRegisterAsbitemList = (await _registerAsbitemRepository.GetDbSetAsync()).Include(x => x.Asbitem).Include(x => x.Asbitem.ItemType) .Where(m => m.PatientRegisterId == ent.PatientRegisterId && m.Asbitem.IsItemResultMerger == 'Y' && m.Asbitem.ItemType.IsMergeAsbitem == 'Y' && m.Asbitem.ItemTypeId == asbitemEnt.ItemTypeId); //1就是本身 if (mergerRegisterAsbitemList.Count() > 1) { //有需要合并的数据 await MergeRegisterAsbitemAsync(mergerRegisterAsbitemList.Select(s => s.Id).ToList(), OrganizationUnitId); } } } } #endregion return registerAsbitemEnt_Res; } else { //重复 return IsregisterAsbitemEnt; } } public async Task>CreateManyAsync(PatientRegister patientRegister, List registerAsbitems) { if(patientRegister == null) { throw new UserFriendlyException("patientRegister不能为空"); } foreach(var registerAsbitem in registerAsbitems) { registerAsbitem.PatientRegisterId = patientRegister.Id; if(registerAsbitem.StandardPrice < 0) { throw new UserFriendlyException("标准价格不能小于0"); } if (registerAsbitem.ChargePrice < 0) { throw new UserFriendlyException("实收价格不能小于0"); } if (registerAsbitem.Amount < 1) { throw new UserFriendlyException("数量不能小于1"); } DataHelper.CheckCharIsYOrN(registerAsbitem.IsCharge,"是否已收费"); if(registerAsbitem.PayTypeFlag != PayTypeFlag.OrgPay && registerAsbitem.PayTypeFlag != PayTypeFlag.PersonPay && registerAsbitem.PayTypeFlag != PayTypeFlag.Free) { throw new UserFriendlyException("支付方式类别不存在"); } } return new List(); } /// /// 删除数据 判断条件(1.只能删除未收费的 2.已完成体检的不能删除) /// /// /// public async Task DeleteAsync(Guid RegisterAsbitemId) { var registerAsbitemEnt = await _registerAsbitemRepository.GetAsync(RegisterAsbitemId); if (registerAsbitemEnt == null) throw new UserFriendlyException($"数据有误"); if (registerAsbitemEnt.IsCharge == 'Y') throw new UserFriendlyException($"当前体检项目已收费,不能删除"); var registerCheckEnt = await _registerCheckRepository.GetAsync(m => m.Id == registerAsbitemEnt.RegisterCheckId); if (registerCheckEnt != null && registerCheckEnt.CompleteFlag == RegisterCheckCompleteFlag.Checked) throw new UserFriendlyException($"当前体检项目已完成,不能删除"); await _registerAsbitemRepository.DeleteAsync(registerAsbitemEnt); } /// /// 删除数据 判断条件(1.只能删除未收费的 2.已完成体检的不能删除) /// /// /// public async Task DeleteManyAsync(List RegisterAsbitemIds) { foreach (var RegisterAsbitemId in RegisterAsbitemIds) { await DeleteAsync(RegisterAsbitemId); } } /// /// 更新 /// /// dto /// 需要更新的目标实体 /// public void UpdateAsync(RegisterAsbitem sourceEntity, RegisterAsbitem targetEntity) { if (sourceEntity.ChargePrice != null) targetEntity.ChargePrice = sourceEntity.ChargePrice; if (sourceEntity.Amount != null) targetEntity.Amount = sourceEntity.Amount; if (sourceEntity.IsCharge != null) targetEntity.IsCharge = sourceEntity.IsCharge; if (sourceEntity.PayTypeFlag != null) targetEntity.PayTypeFlag = sourceEntity.PayTypeFlag; targetEntity.GroupPackageId = sourceEntity.GroupPackageId; } ///// ///// 更新Check表下的参考范围信息 ///// ///// //public async Task UpdateCheckReferenceRange(Guid PatientRegisterId) //{ // var entlist = (await _registerCheckItemRepository.GetDbSetAsync()) // .Include(x => x.RegisterCheck) // .Include(x => x.RegisterCheck.RegisterAsbitems) // .ThenInclude(x => x.PatientRegister) // .Where(m => m.RegisterCheck.RegisterAsbitems.FirstOrDefault().PatientRegisterId == PatientRegisterId).ToList(); // var itemList = await _itemRepository.GetListAsync(); // var referenceRangeList = await _referenceRangeRepository.GetListAsync(); // foreach (var ent in entlist) // { // // var referenceRangeEnt = await _referenceRangeManager.GetReferenceRangeInSexAge(ent.ItemId, PatientRegisterId); //根据新的条件获取参考范围 // var referenceRangeEnt = _referenceRangeManager.GetReferenceRangeInSexAgeTemp(referenceRangeList, // itemList.Where(m => m.Id == ent.ItemId).FirstOrDefault(), // ent.RegisterCheck.RegisterAsbitems.FirstOrDefault().PatientRegister.SexId, // ent.RegisterCheck.RegisterAsbitems.FirstOrDefault().PatientRegister.Age); //根据新的条件获取参考范围 // ent.ReferenceRangeValue = referenceRangeEnt == null ? "" : referenceRangeEnt.ReferenceRangeValue; // ent.CriticalRangeValue = referenceRangeEnt == null ? "" : referenceRangeEnt.CriticalRangeValue; // } // await _registerCheckItemRepository.UpdateManyAsync(entlist); //} /// /// 更新Check表下的参考范围信息 /// /// public async Task UpdateCheckReferenceRange(Guid PatientRegisterId) { var entlist = (await _registerCheckItemRepository.GetDbSetAsync()) .Include(x => x.RegisterCheck) .Include(x => x.RegisterCheck.RegisterAsbitems) .ThenInclude(x => x.PatientRegister) .Where(m => m.RegisterCheck.RegisterAsbitems.FirstOrDefault().PatientRegisterId == PatientRegisterId).ToList(); var itemList = await _itemRepository.GetListAsync(); var referenceRangeList = await _referenceRangeRepository.GetListAsync(); foreach (var ent in entlist) { // var referenceRangeEnt = await _referenceRangeManager.GetReferenceRangeInSexAge(ent.ItemId, PatientRegisterId); //根据新的条件获取参考范围 var referenceRangeEnt = _referenceRangeManager.GetReferenceRangeInSexAgeTemp(referenceRangeList, itemList.Where(m => m.Id == ent.ItemId).FirstOrDefault(), ent.RegisterCheck.RegisterAsbitems.FirstOrDefault().PatientRegister.SexId, ent.RegisterCheck.RegisterAsbitems.FirstOrDefault().PatientRegister.Age); //根据新的条件获取参考范围 ent.ReferenceRangeValue = referenceRangeEnt == null ? "" : referenceRangeEnt.ReferenceRangeValue; ent.CriticalRangeValue = referenceRangeEnt == null ? "" : referenceRangeEnt.CriticalRangeValue; } await _registerCheckItemRepository.UpdateManyAsync(entlist); } /// /// 合并组合项目 /// /// /// 体检中心ID /// public async Task MergeRegisterAsbitemAsync(List RegisterAsbitemIds, Guid OrganizationUnitId) { //原有项目 var registerAsbitemList = await _registerAsbitemRepository.GetListAsync(m => RegisterAsbitemIds.Contains(m.Id)); //待删除RegisterCheck List RegisterCheckIds = registerAsbitemList.GroupBy(g => g.RegisterCheckId.Value).Select(s => s.Key).ToList(); //删除registerCheckItem await _registerCheckItemManager.CheckAndDeleteAsync(RegisterCheckIds); //删除registerCheck await _registerCheckManager.CheckAndDeleteAsync(RegisterCheckIds); #region 重新插入一个新的registerCheck //添加check跟item数据 #region 默认添加RegisterCheck数据 RegisterCheck registerCheckEnt = new RegisterCheck { CheckRequestNo = await _registerCheckManager.CreateCheckRequestNo(OrganizationUnitId), CheckRequestPrintTimes = 0, CompleteFlag = RegisterCheckCompleteFlag.UnChecked, IsAudit = 'N', IsLock = 'N' }; var registerCheckEnt_Res = await _registerCheckRepository.InsertAsync(registerCheckEnt, true); #endregion if (registerCheckEnt_Res != null) { #region 默认添加RegisterCheckItem数据 需要遍历Item // var itemList = await _asbitemDetailRepository.GetListAsync(m => m.AsbitemId == ent.AsbitemId); var asbitemDetailList = (await _asbitemDetailRepository.GetDbSetAsync()).Include(x => x.Item).Where(m => registerAsbitemList.Select(s => s.AsbitemId).Contains(m.AsbitemId)).ToList(); List registerCheckItemList = new List(); if (asbitemDetailList.Any()) { var itemList = await _itemRepository.GetListAsync(); var referenceRangeList = await _referenceRangeRepository.GetListAsync(); var patientRegisterEnt = await _patientRegisterRepository.GetAsync(registerAsbitemList.FirstOrDefault().PatientRegisterId); foreach (var item in asbitemDetailList) { //参考范围 // var referenceRangeEnt = await _referenceRangeManager.GetReferenceRangeInSexAge(item.ItemId, ent.PatientRegisterId); var referenceRangeEnt = _referenceRangeManager.GetReferenceRangeInSexAgeTemp(referenceRangeList, itemList.Where(m => m.Id == item.ItemId).FirstOrDefault(), patientRegisterEnt.SexId, patientRegisterEnt.Age); string UnitName = ""; if (item.Item.UnitId != null && item.Item.UnitId != Guid.Empty) { //单位 var unitEnt = await _unitRepository.GetAsync(item.Item.UnitId.Value); if (unitEnt != null) { UnitName = unitEnt.DisplayName; } } RegisterCheckItem registerCheckItem = new RegisterCheckItem { ItemId = item.ItemId, RegisterCheckId = registerCheckEnt_Res.Id, ReferenceRangeValue = referenceRangeEnt == null ? "" : referenceRangeEnt.ReferenceRangeValue, CriticalRangeValue = referenceRangeEnt == null ? "" : referenceRangeEnt.CriticalRangeValue, Unit = UnitName }; //去重 if (!registerCheckItemList.Any() || (registerCheckItemList.Any() && registerCheckItemList.Where(m => m.ItemId == registerCheckItem.ItemId).Count() == 0)) registerCheckItemList.Add(registerCheckItem); } await _registerCheckItemRepository.InsertManyAsync(registerCheckItemList); } #endregion registerAsbitemList.ForEach(registerAsbitem => registerAsbitem.RegisterCheckId = registerCheckEnt_Res.Id); } #endregion } /// /// 取消合并组合项目 按RegisterAsbitemId重新生成新的RegisterCheck数据 /// /// /// 体检中心ID /// public async Task CancelMergeRegisterAsbitemAsync(List RegisterAsbitemIds, Guid RegisterCheckId, Guid OrganizationUnitId) { //原有项目 var registerAsbitemList = await _registerAsbitemRepository.GetListAsync(m => RegisterAsbitemIds.Contains(m.Id)); //待删除RegisterCheck List RegisterCheckIds = new List { RegisterCheckId }; //删除registerCheckItem await _registerCheckItemManager.CheckAndDeleteAsync(RegisterCheckIds); //删除registerCheck await _registerCheckManager.CheckAndDeleteAsync(RegisterCheckIds); #region 重新插入多个新的registerCheck foreach (var registerAsbitem in registerAsbitemList) { #region 默认添加RegisterCheck数据 RegisterCheck registerCheckEnt = new RegisterCheck { CheckRequestNo = await _registerCheckManager.CreateCheckRequestNo(OrganizationUnitId), CheckRequestPrintTimes = 0, CompleteFlag = RegisterCheckCompleteFlag.UnChecked, IsAudit = 'N', IsLock = 'N' }; var registerCheckEnt_Res = await _registerCheckRepository.InsertAsync(registerCheckEnt, true); if (registerCheckEnt_Res != null) { #region 默认添加RegisterCheckItem数据 需要遍历Item // var itemList = await _asbitemDetailRepository.GetListAsync(m => m.AsbitemId == ent.AsbitemId); var asbitemDetailList = (await _asbitemDetailRepository.GetDbSetAsync()).Include(x => x.Item).Where(m => m.AsbitemId == registerAsbitem.AsbitemId).ToList(); List registerCheckItemList = new List(); if (asbitemDetailList.Any()) { var itemList = await _itemRepository.GetListAsync(); var referenceRangeList = await _referenceRangeRepository.GetListAsync(); var patientRegisterEnt = await _patientRegisterRepository.GetAsync(registerAsbitemList.FirstOrDefault().PatientRegisterId); foreach (var item in asbitemDetailList) { //参考范围 // var referenceRangeEnt = await _referenceRangeManager.GetReferenceRangeInSexAge(item.ItemId, ent.PatientRegisterId); var referenceRangeEnt = _referenceRangeManager.GetReferenceRangeInSexAgeTemp(referenceRangeList, itemList.Where(m => m.Id == item.ItemId).FirstOrDefault(), patientRegisterEnt.SexId, patientRegisterEnt.Age); string UnitName = ""; if (item.Item.UnitId != null && item.Item.UnitId != Guid.Empty) { //单位 var unitEnt = await _unitRepository.GetAsync(item.Item.UnitId.Value); if (unitEnt != null) { UnitName = unitEnt.DisplayName; } } RegisterCheckItem registerCheckItem = new RegisterCheckItem { ItemId = item.ItemId, RegisterCheckId = registerCheckEnt_Res.Id, ReferenceRangeValue = referenceRangeEnt == null ? "" : referenceRangeEnt.ReferenceRangeValue, CriticalRangeValue = referenceRangeEnt == null ? "" : referenceRangeEnt.CriticalRangeValue, Unit = UnitName }; registerCheckItemList.Add(registerCheckItem); } await _registerCheckItemRepository.InsertManyAsync(registerCheckItemList); } #endregion registerAsbitem.RegisterCheckId = registerCheckEnt_Res.Id; } #endregion } #endregion //更新RegisterAsbitem表RegisterCheckId await _registerAsbitemRepository.UpdateManyAsync(registerAsbitemList); } /// /// 检查是否能删除、合并、取消合并 /// /// /// /// public async Task CheckIsDelete(Guid RegisterAsbitemId) { var registerAsbitemEnt = await _registerAsbitemRepository.GetAsync(RegisterAsbitemId); if (registerAsbitemEnt == null) throw new UserFriendlyException($"数据有误"); if (registerAsbitemEnt.IsCharge == 'Y') throw new UserFriendlyException($"当前体检项目已收费,不能操作"); var registerCheckEnt = await _registerCheckRepository.GetAsync(m => m.Id == registerAsbitemEnt.RegisterCheckId); if (registerCheckEnt != null && (registerCheckEnt.CompleteFlag == RegisterCheckCompleteFlag.Checked || registerCheckEnt.CompleteFlag == RegisterCheckCompleteFlag.GiveUpChecked)) throw new UserFriendlyException($"当前体检项目已完成或者已弃检,不能操作"); } /// /// 检查是否在一个项目类别下 /// /// /// /// public async Task CheckIsItemType(List RegisterAsbitemIds) { var query = from a in await _registerAsbitemRepository.GetQueryableAsync() join b in await _asbitemRepository.GetQueryableAsync() on a.AsbitemId equals b.Id where RegisterAsbitemIds.Contains(a.Id) group b by b.ItemTypeId; var itemTypeCount = query.Count(); if (itemTypeCount > 1) { throw new UserFriendlyException($"合并的项目不在一个项目类别内"); } } } }