using Google.Protobuf; using LinqToDB; using LinqToDB.SqlQuery; using log4net; using log4net.Util; using MasaBlazorApp3.DataAccess.Dao; using MasaBlazorApp3.Pages; using MasaBlazorApp3.Pojo; using MasaBlazorApp3.Pojo.Config; using MasaBlazorApp3.Pojo.Vo; using MasaBlazorApp3.Port; using MasaBlazorApp3.Util; using Microsoft.Extensions.Options; using Mysqlx.Crud; using Radzen; using Radzen.Blazor.Rendering; using System; using System.Collections; using System.Collections.Generic; using System.Data; using System.Linq; using System.Reflection.PortableExecutable; using System.Security.Permissions; using System.Text; using System.Threading.Tasks; using static LinqToDB.Common.Configuration; using static LinqToDB.Reflection.Methods.LinqToDB.Insert; namespace MasaBlazorApp3.DataAccess.Impl { public class OrderInfoDao : IOrderInfoDao { private readonly SettingConfig _setting; private AppDataConnection _connection; private GlobalStateService _globalStateService; private readonly ILog logger = LogManager.GetLogger(typeof(OrderInfoDao)); private readonly PortUtil _portUtil; NotificationService _message; public OrderInfoDao(AppDataConnection connection, IOptions setting, GlobalStateService globalStateService, PortUtil portUtil, NotificationService message) { _connection = connection; _setting = setting.Value; _globalStateService = globalStateService; _portUtil = portUtil; _message = message; } public async Task> GetAllOrderInfo(string OrderrNo, DateTime OrderDate, int? take, int? skip) { //var query = _connection.OrderInfo.AsQueryable(); //query.InnerJoin((oi, od) => oi.OrderNo == od.OrderNo); var query2 = from od in _connection.OrderDetail from cl in _connection.ChannelStock.Where(c => c.MachineId == _setting.machineId).InnerJoin(c => c.DrugId == od.DrugId) group od by od.OrderNo into temp select new { temp.Key }; var query = from oi in _connection.OrderInfo from od in query2.InnerJoin(od => od.Key == oi.OrderNo) select oi; if (!String.IsNullOrEmpty(OrderrNo)) { query = query.Where(oi => oi.OrderNo.Equals(OrderrNo)); } if (OrderDate != null && OrderDate != DateTime.MinValue) { query = query.Where(oi => oi.ChargeDate.Date.Equals(OrderDate.Date)); } query = query.Where(oi => oi.Status == 0); query = query.Where(oi => oi.HisDispFlag == 0); query = query.Where(oi => oi.CancelFlag == 0); int pagedData = await query.CountAsync(); List list = await query //.LoadWith(oi => oi.Detail) //.LoadWith(oi => oi.Detail.Drug) .OrderBy((oi) => oi.RecvDate) .ThenBy((oi => oi.OrderNo)) .Skip((int)skip) .Take((int)take) .ToListAsync(); return new PageData() { TotalDesserts = pagedData, Desserts = list }; } public async Task> GetAllOrderInfoForImport(string name, string OrderrNo, DateTime OrderDate, BoxModel boxModel, int? take, int? skip) { //var query = _connection.OrderInfo.AsQueryable(); //query.InnerJoin((oi, od) => oi.OrderNo == od.OrderNo); var query2 = from od in _connection.OrderDetail from cl in _connection.ChannelStock.Where(c => c.MachineId == _setting.boxMachineId && c.DrawerNo != boxModel.BoxName && c.ColNo != boxModel.BoxNo).InnerJoin(c => c.DrugId == od.DrugId) group od by od.OrderNo into temp select new { temp.Key }; var query = from oi in _connection.OrderInfo from od in query2.InnerJoin(od => od.Key == oi.OrderNo) select oi; if (!string.IsNullOrEmpty(name)) { query = query.Where(oi => oi.PatientName.Equals(name)); } if (!String.IsNullOrEmpty(OrderrNo)) { query = query.Where(oi => oi.OrderNo.Equals(OrderrNo)); } if (OrderDate != null && OrderDate != DateTime.MinValue) { query = query.Where(oi => oi.ChargeDate.Date.Equals(OrderDate.Date)); } query = query.Where(oi => oi.Status == 0); query = query.Where(oi => oi.HisDispFlag == 0); query = query.Where(oi => oi.CancelFlag == 0); int pagedData = await query.CountAsync(); List list = await query .LoadWith(oi => oi.DetailInfo) //.LoadWith(oi => oi.DetailInfo.Drug) .OrderBy((oi) => oi.RecvDate) .ThenBy((oi => oi.OrderNo)) .Skip((int)skip) .Take((int)take) .ToListAsync(); for (int i = 0; i < list.Count; i++) { if (list[i].DetailInfo != null && list[i].DetailInfo.Id > 0) { list[i].DetailInfo.Drug = await _connection.DrugInfo.AsQueryable().Where(d => d.DrugId == list[i].DetailInfo.DrugId).FirstOrDefaultAsync(); list[i].SelectedOrderList = new List(); list[i].SelectedOrderList.Add(list[i]); } } return new PageData() { TotalDesserts = pagedData, Desserts = list }; } public async Task> getDetailByOrderNo(string OrderrNo) { var query2 = from cl in _connection.ChannelStock where cl.MachineId == _setting.machineId group cl by cl.DrugId into temp select new { temp.Key }; ; var query = from od in _connection.OrderDetail.Where(od => od.OrderNo == OrderrNo) from cl in query2.InnerJoin(c => c.Key == od.DrugId) orderby od.DrugId select od; query = query.LoadWith(od => od.Drug); return await query.ToListAsync(); } public async Task> GetChannelStockByDrugId(string DrugId, String ManuNo, int quantity = 0) { var query = _connection.ChannelStock.AsQueryable(); query = query.Where(cs => cs.MachineId.Equals(_setting.machineId)).Where(cs => cs.DrawerType == 1) .Where(cs => cs.Quantity > 0) .Where(cs => cs.DrugId.Equals(DrugId)); if (quantity > 0) { if (!String.IsNullOrEmpty(ManuNo)) { query = query.Where(cs => cs.ManuNo.Equals(ManuNo)); } } else { if (!String.IsNullOrEmpty(ManuNo)) { query = query.Where(cs => cs.ManuNo.Equals(ManuNo) || cs.Quantity == 0); } } return await query.OrderBy((cs) => cs.EffDate) .ThenBy((cs) => cs.DrawerNo) .ThenBy((cs) => cs.ColNo) .ToListAsync(); } public async Task> getTakeInfoByOrderNo(string OrderrNo) { List tempData = new(); List tempData2 = new(); List details = await this.getDetailByOrderNo(OrderrNo); var flag = true; for (var i = 0; i < details.Count; i++) { //List> tempData = new(); OrderDetail detail = details[i]; // 当前detail取药数量 var Quantity = detail.Quantity; List stockList = await this.GetChannelStockByDrugId(detail.DrugId, detail.SetManuNo, Quantity); // 当前药品的库存总量 var total = stockList.Sum(current => current.Quantity); tempData2.Add(new OrderTakeVo() { Drug = detail.Drug, OrderDetail = detail, StockQuantity = total, Quantity = Quantity }); if (flag) { // 盘点库存是否足够 if (total > Quantity) { for (var j = 0; Quantity > 0; j++) { ChannelStock stock = stockList[j]; if (Quantity > stock.Quantity) { // 取药数量大于库存 tempData.Add(new OrderTakeVo() { Drug = detail.Drug, OrderDetail = detail, ChannelStock = stock, StockQuantity = total, Quantity = stock.Quantity, }); Quantity -= stock.Quantity; } else { //取药数量小于库存 tempData.Add(new OrderTakeVo() { Drug = detail.Drug, OrderDetail = detail, ChannelStock = stock, StockQuantity = total, Quantity = Quantity, }); Quantity = 0; } } } else { // 库存不足 flag = false; } } } if (flag) { return tempData; } else { return tempData2; } } public async Task OrderTakeFinish(List datas) { try { _connection.BeginTransaction(); var flag = true; // 更新处方状态 int r1 = _connection.OrderInfo.Where(oi => oi.OrderNo == datas.First().OrderDetail.OrderNo) .Set(oi => oi.Status, 1) .Update(); if (!(r1 > 0)) { flag = false; logger.Error("处方取药完成更新处方状态失败"); _connection.RollbackTransaction(); return flag; } for (var i = 0; i < datas.Count; i++) { var orderTakeVo = datas[i]; var EffDate = orderTakeVo.ChannelStock.EffDate; if (!DateTime.TryParse(orderTakeVo.ChannelStock.EffDate, out DateTime dEffDate)) { //效期转换出错 if (orderTakeVo.ChannelStock.EffDate != null) { string[] idate = orderTakeVo.ChannelStock.EffDate.Split('/'); foreach (string iS in idate) { if (!string.IsNullOrEmpty(iS.Trim())) { switch (iS.Trim().Length) { case 4: EffDate = iS.Trim(); break; case 2: EffDate += "-" + iS.Trim(); break; case 1: EffDate += "-0" + iS.Trim(); break; } } } } } else { EffDate = dEffDate.ToString("yyyy-MM-dd"); } // 出库记录 int mid = _connection.InsertWithInt32Identity(new MachineRecord() { MachineId = _setting.machineId, DrawerNo = orderTakeVo.ChannelStock.DrawerNo, ColNo = orderTakeVo.ChannelStock.ColNo, DrugId = orderTakeVo.ChannelStock.DrugId, ManuNo = orderTakeVo.ChannelStock.ManuNo, EffDate = !String.IsNullOrEmpty(EffDate) ? DateTime.ParseExact(EffDate, "yyyy-MM-dd", System.Globalization.CultureInfo.CurrentCulture) : null, OperationTime = DateTime.Now, Type = 2, Quantity = orderTakeVo.GetQuantity, Operator = _globalStateService.Operator.Id, Reviewer = _globalStateService.Reviewer?.Id ?? _globalStateService.Operator.Id, InvoiceId = orderTakeVo.OrderDetail.Id.ToString(), }); // 更新库存 int r = _connection.ChannelStock.Where(cs => cs.Id == orderTakeVo.ChannelStock.Id) .Set(cs => cs.Quantity, orderTakeVo.ChannelStock.Quantity - orderTakeVo.GetQuantity) .Update(); // 获取更新完库存之后的药品库存 List list = await _connection.ChannelStock.AsQueryable() .InnerJoin( _connection.ChannelList.Where(cl => cl.MachineId.Equals(_setting.machineId)).Where(cl => cl.DrawerType == 1), (cs, cl) => cs.ListId == cl.Id, (cs, cl) => cs ) .Where(cs => cs.DrugId.Equals(orderTakeVo.ChannelStock.DrugId)) .ToListAsync(); // 保存账册 int acid = _connection.InsertWithInt32Identity(new AccountBook() { MachineId = _setting.machineId, DrugId = orderTakeVo.ChannelStock.DrugId, ManuNo = orderTakeVo.ChannelStock.ManuNo, EffDate = !String.IsNullOrEmpty(EffDate) ? DateTime.ParseExact(EffDate, "yyyy-MM-dd", System.Globalization.CultureInfo.CurrentCulture) : null, OperationTime = DateTime.Now, Type = 2, OutQuantity = orderTakeVo.GetQuantity, AddQuantity = 0, Operator = _globalStateService.Operator.Id, Reviewer = _globalStateService.Reviewer?.Id ?? _globalStateService.Operator.Id, ManuStock = list.Where(it => it.ManuNo == orderTakeVo.ChannelStock.ManuNo).Sum(it => it.Quantity), TotalStock = list.Sum(it => it.Quantity), InvoiceId = orderTakeVo.OrderDetail.Id.ToString() }); if (mid > 0 && r > 0 && acid > 0) { if (orderTakeVo.ChannelStock.BoardType.ToString().Contains("5")) { await _portUtil.WriteQuantityMethod(orderTakeVo.ChannelStock.Quantity - orderTakeVo.GetQuantity, orderTakeVo.ChannelStock.DrawerNo, orderTakeVo.ChannelStock.ColNo); } } else { flag = false; break; } } if (flag) { _connection.CommitTransaction(); } else { _connection.RollbackTransaction(); } return flag; } catch (Exception ex) { logger.Error("处方取药完成保存数据库失败,错误:" + ex.Message); _connection.RollbackTransaction(); return false; } } public async Task> GetAllCanReturnOrderInfo(string OrderrNo, DateTime OrderDate, int? take, int? skip) { var query2 = from od in _connection.OrderDetail from cl in _connection.ChannelStock.Where(c => c.MachineId == _setting.machineId).InnerJoin(c => c.DrugId == od.DrugId) group od by od.OrderNo into temp select new { temp.Key }; var query = from oi in _connection.OrderInfo from od in query2.InnerJoin(od => od.Key == oi.OrderNo) select oi; if (!String.IsNullOrEmpty(OrderrNo)) { query = query.Where(oi => oi.OrderNo.Equals(OrderrNo)); } if (OrderDate != null && OrderDate != DateTime.MinValue) { query = query.Where(oi => oi.ChargeDate.Date.Equals(OrderDate.Date)); } query = query.Where(oi => oi.Status == 1); query = query.Where(oi => oi.CancelFlag == 1); int pagedData = await query.CountAsync(); List list = await query .OrderBy((oi) => oi.RecvDate) .ThenBy((oi => oi.OrderNo)) .Skip((int)skip) .Take((int)take) .ToListAsync(); return new PageData() { TotalDesserts = pagedData, Desserts = list }; } public async Task> GetMachineRecordByOrderNo(string OrderrNo) { var query = _connection.MachineRecord.AsQueryable(); query = query.InnerJoin( _connection.OrderDetail.Where(od => od.OrderNo.Equals(OrderrNo)), (mr, od) => mr.InvoiceId.Equals(od.Id), (mr, od) => mr ) .Where(md => md.Type == 2) .LoadWith(md => md.Drug) ; return await query.ToListAsync(); } public async Task>> getReturnInfoByOrderNo(string OrderrNo) { List> tempData = new(); List details = await this.GetMachineRecordByOrderNo(OrderrNo); for (var i = 0; i < details.Count; i++) { //List> tempData = new(); MachineRecord detail = details[i]; List stockList = await this.GetChannelStockByDrugId(detail.DrugId, detail.ManuNo); // 当前药品的库存总量 var total = stockList.Sum(current => current.Quantity); // 当前detail出库数量 var Quantity = detail.Quantity; stockList.First().AddQuantity = Quantity; tempData.Add(new OperationVo() { Drug = detail.Drug, data = detail, StockQuantity = total, Quantity = Quantity, ChannelStocks = stockList, }); } return tempData; } public async Task GetDrugManuNo(string drugId, string manuNo) { var query = _connection.DrugManuNo.AsQueryable(); return await query.Where(m => m.DrugId.Equals(drugId)) .Where(m => m.ManuNo.Equals(manuNo)) .FirstAsync(); } public async Task OrderReturnFinish(List> datas, string OrderNo) { try { _connection.BeginTransaction(); var flag = true; // 更新处方状态 int r1 = _connection.OrderInfo.Where(oi => oi.OrderNo == OrderNo) .Set(oi => oi.Status, 0) .Update(); if (!(r1 > 0)) { flag = false; logger.Error("处方取药完成更新处方状态失败"); _connection.RollbackTransaction(); return flag; } for (var i = 0; i < datas.Count; i++) { var operationVo = datas[i]; List stocks = operationVo.ChannelStocks.Where(cs => cs.ReturnQuantity > 0).ToList(); // 更新取出记录状态 var r2 = _connection.MachineRecord.Where(cs => cs.Id == operationVo.data.Id) .Set(cs => cs.Status, 2) .Set(cs => cs.ReturnQuantity1, operationVo.data.Quantity).Update(); if (r2 > 0) { } else { flag = false; break; } for (var j = 0; j < stocks.Count; j++) { var channelStock = stocks[j]; // 更新库存 var q = _connection.ChannelStock.Where(cs => cs.Id == channelStock.Id) .Set(cs => cs.Quantity, channelStock.Quantity + channelStock.ReturnQuantity); if (String.IsNullOrEmpty(channelStock.ManuNo) || (channelStock.Quantity == 0 && !channelStock.ManuNo.Equals(operationVo.data.ManuNo))) { DrugManuNo drugManuNo = await GetDrugManuNo(channelStock.DrugId, operationVo.data.ManuNo); channelStock.Dmnguid = drugManuNo.Id; channelStock.ManuNo = drugManuNo.ManuNo; channelStock.EffDate = drugManuNo.EffDate.ToString(); q = q.Set(cs => cs.Dmnguid, drugManuNo.Id) .Set(cs => cs.ManuNo, drugManuNo.ManuNo) .Set(cs => cs.EffDate, drugManuNo.EffDate.ToString()); } int r = q.Update(); // 退回记录 int mid = _connection.InsertWithInt32Identity(new MachineRecord() { MachineId = _setting.machineId, DrawerNo = channelStock.DrawerNo, ColNo = channelStock.ColNo, DrugId = channelStock.DrugId, ManuNo = channelStock.ManuNo, EffDate = !String.IsNullOrEmpty(channelStock.EffDate) ? DateTime.ParseExact(channelStock.EffDate, "yyyy-MM-dd", System.Globalization.CultureInfo.CurrentCulture) : null, OperationTime = DateTime.Now, Type = 31, Quantity = channelStock.ReturnQuantity, Operator = _globalStateService.Operator.Id, Reviewer = _globalStateService.Reviewer?.Id ?? _globalStateService.Operator.Id, InvoiceId = operationVo.data.InvoiceId.ToString(), GetId = operationVo.data.Id }); // 获取更新完库存之后的药品库存 List list = await _connection.ChannelStock.AsQueryable() .InnerJoin( _connection.ChannelList.Where(cl => cl.MachineId.Equals(_setting.machineId)).Where(cl => cl.DrawerType == 1), (cs, cl) => cs.ListId == cl.Id, (cs, cl) => cs ) .Where(cs => cs.DrugId.Equals(channelStock.DrugId)) .ToListAsync(); // 保存账册 int acid = _connection.InsertWithInt32Identity(new AccountBook() { MachineId = _setting.machineId, DrugId = channelStock.DrugId, ManuNo = channelStock.ManuNo, EffDate = !String.IsNullOrEmpty(channelStock.EffDate) ? DateTime.ParseExact(channelStock.EffDate, "yyyy-MM-dd", System.Globalization.CultureInfo.CurrentCulture) : null, OperationTime = DateTime.Now, Type = 2, OutQuantity = channelStock.ReturnQuantity, AddQuantity = 0, Operator = _globalStateService.Operator.Id, Reviewer = _globalStateService.Reviewer?.Id ?? _globalStateService.Operator.Id, ManuStock = list.Where(it => it.ManuNo == channelStock.ManuNo).Sum(it => it.Quantity), TotalStock = list.Sum(it => it.Quantity), InvoiceId = operationVo.data.InvoiceId }); if (mid > 0 && r > 0 && acid > 0) { if (channelStock.BoardType.ToString().Contains("5")) { await _portUtil.WriteQuantityMethod(channelStock.Quantity - channelStock.ReturnQuantity, channelStock.DrawerNo, channelStock.ColNo); } } else { flag = false; break; } } } if (flag) { _connection.CommitTransaction(); } else { _connection.RollbackTransaction(); } return flag; } catch (Exception ex) { logger.Error("处方取药完成保存数据库失败,错误:" + ex.Message); _connection.RollbackTransaction(); return false; } } /// /// 获取药盒中的用药信息 /// /// /// /// /// /// public async Task> GetAllOrderInfoByBox(int box, string OrderrNo, DateTime OrderDate, int? take, int? skip) { var query2 = from od in _connection.OrderDetail from cl in _connection.ChannelStock.Where(c => c.MachineId == _setting.boxMachineId).InnerJoin(c => c.DrugId == od.DrugId) group od by od.OrderNo into temp select new { temp.Key }; var query = from oi in _connection.OrderInfo from od in query2.InnerJoin(od => od.Key == oi.OrderNo) where oi.Pharmacy == _setting.storage select oi; if (!String.IsNullOrEmpty(OrderrNo)) { query = query.Where(oi => oi.OrderNo.Equals(OrderrNo)); } if (OrderDate != null && OrderDate != DateTime.MinValue) { query = query.Where(oi => oi.ChargeDate.Date.Equals(OrderDate.Date)); } query = query.Where(oi => oi.Status == 0); query = query.Where(oi => oi.HisDispFlag == 0); query = query.Where(oi => oi.CancelFlag == 0); //query = query.Where(oi => oi.DoctorCode == box); int pagedData = await query.CountAsync(); List list = await query .LoadWith(oi => oi.DetailInfo) .OrderBy((oi) => oi.RecvDate) .ThenBy((oi => oi.OrderNo)) .Skip((int)skip) .Take((int)take) .ToListAsync(); if (list != null && list.Count > 0) { for (int i = 0; i < list.Count; i++) { //for (int j = 0; j < list[i].DetailList.Count; j++) //{ if (list[i].DetailInfo != null && list[i].DetailInfo.Id > 0) { list[i].DetailInfo.Drug = await _connection.DrugInfo.AsQueryable().Where(d => d.DrugId == list[i].DetailInfo.DrugId).FirstOrDefaultAsync(); if (list[i].DetailInfo.Drug != null) { list[i].DetailInfo.Drug.Manus = await _connection.DrugManuNo.AsQueryable().Where(m => m.DrugId == list[i].DetailInfo.DrugId).ToListAsync(); } } //} } } //var query2 = from od in _connection.OrderDetail // from cl in _connection.ChannelStock.Where(c => c.MachineId == _setting.machineId).InnerJoin(c => c.DrugId == od.DrugId) // group od by od.OrderNo into temp // select new { temp.Key }; //var query = from oi in _connection.OrderInfo // from od in query2.InnerJoin(od => od.Key == oi.OrderNo) // select oi; //if (!String.IsNullOrEmpty(OrderrNo)) //{ // query = query.Where(oi => oi.OrderNo.Equals(OrderrNo)); //} //if (OrderDate != null && OrderDate != DateTime.MinValue) //{ // query = query.Where(oi => oi.OrderDate.Date.Equals(OrderDate.Date)); //} //query = query.Where(oi => oi.Status == 0); //query = query.Where(oi => oi.HisDispFlag == 0); //query = query.Where(oi => oi.CancelFlag == 0); ////query = query.Where(oi => oi.DoctorCode == box); //int pagedData = await query.CountAsync(); //List list = await query // .LoadWith(oi => oi.Detail) // .LoadWith(oi => oi.Detail.Drug) // .OrderBy((oi) => oi.RecvDate) // .ThenBy((oi => oi.OrderNo)) // .Skip((int)skip) // .Take((int)take) // .ToListAsync(); //if (list != null && list.Count > 0) //{ // for (int i = 0; i < list.Count; i++) // { // //list[i].Detail = await _connection.OrderDetail.AsQueryable() // // .Where(od => od.OrderNo == list[i].OrderNo) // // .LoadWith(od => od.Drug) // // .ToListAsync(); // } //} return new PageData() { TotalDesserts = pagedData, Desserts = list }; } /// /// 获取待处理处方中的麻醉师 /// /// /// /// /// /// public async Task> GetAllOrderInfo(string Name, string BoxNum, string PatientName, string OrderrNo, DateTime? OrderDate, int? take, int? skip) { logger.Info($"GetAllOrderInfo开始:{DateTime.Now}"); var query2 = from od in _connection.OrderDetail from cl in _connection.ChannelStock.Where(c => c.MachineId == _setting.boxMachineId).InnerJoin(c => c.DrugId == od.DrugId) group od by od.OrderNo into temp select new { temp.Key }; var query = from oi in _connection.OrderInfo from od in query2.InnerJoin(od => od.Key == oi.OrderNo) where oi.Pharmacy == _setting.storage select oi; if (!string.IsNullOrEmpty(Name)) { query = query.Where(oi => oi.anaesthetistName == Name); } if (!string.IsNullOrEmpty(BoxNum) && !BoxNum.Contains("99") && !BoxNum.Contains("111")) { query = query.Where(oi => oi.RoomName == BoxNum); } if (!string.IsNullOrEmpty(PatientName)) { query = query.Where(oi => oi.PatientName.Contains(PatientName)); } if (!String.IsNullOrEmpty(OrderrNo)) { query = query.Where(oi => oi.OrderNo.Equals(OrderrNo)); } if (OrderDate != null && OrderDate != DateTime.MinValue) { query = query.Where(oi => oi.ChargeDate.Date.Equals(((DateTime)OrderDate).Date)); } query = query.Where(oi => oi.Status == 0); query = query.Where(oi => oi.HisDispFlag == 0); query = query.Where(oi => oi.CancelFlag == 0); int pagedData = await query.CountAsync(); List list = await query .LoadWith(oi => oi.DetailInfo) .OrderBy((oi) => oi.DetailInfo.DrugId) .ThenBy((oi => oi.OrderNo)) //.Skip((int)skip) //.Take((int)take) .ToListAsync(); if (list != null && list.Count > 0) { var group = list.GroupBy(it => it.DetailInfo.DrugId) .Select(it => new { drugId = it.Key, totalQuantity = it.Sum(g => g.DetailInfo.Quantity) }); foreach (var item in group) { OrderInfo oiGroup = list.Where(it => it.DetailInfo.DrugId == item.drugId).FirstOrDefault(); list.Where(it => it.OrderId == oiGroup.OrderId).ToList().ForEach(it => it.DetailInfo.TotalQuantity = item.totalQuantity); } for (int i = 0; i < list.Count; i++) { if (list[i].DetailInfo != null && list[i].DetailInfo.Id > 0) { list[i].DetailInfo.Drug = await _connection.DrugInfo.AsQueryable().Where(d => d.DrugId == list[i].DetailInfo.DrugId).FirstOrDefaultAsync(); if (list[i].DetailInfo.Drug != null) { list[i].DetailInfo.Drug.Manus = await _connection.DrugManuNo.AsQueryable().Where(m => m.DrugId == list[i].DetailInfo.DrugId).ToListAsync(); } } } } logger.Info($"GetAllOrderInfo结束:{DateTime.Now}"); return new PageData() { TotalDesserts = pagedData, Desserts = list }; } /// /// 获取待处理处方中的麻醉师 /// /// /// /// /// /// public async Task> GetAllOrderInfoDrugByBox(BoxModel boxNum, string roomName, DateTime? OrderDate) { List csList = await _connection.ChannelStock .Where(cs => cs.MachineId == _setting.boxMachineId && cs.DrawerNo == boxNum.BoxName && cs.ColNo == boxNum.BoxNo && cs.Quantity > 0) .LoadWith(cs => cs.Drug) .ToListAsync(); if (csList != null && csList.Count > 0) { for (int i = 0; i < csList.Count; i++) { List oiList = await _connection.OrderInfo.Where(oi => oi.RoomName == roomName && oi.Status == 0 && oi.HisDispFlag == 0 && oi.CancelFlag == 0 && oi.ChargeDate.Date.Equals(((DateTime)OrderDate).Date)) .LoadWith(oi => oi.DetailInfo).Where(oi => oi.DetailInfo.DrugId == csList[i].DrugId && oi.DetailInfo.SetManuNo == csList[i].ManuNo) .ToListAsync(); csList[i].OrderList = oiList; csList[i].SelectedOrderList = oiList; csList[i].UseQuantity = oiList.Sum(oi => oi.DetailInfo.Quantity); csList[i].OrderQuantity = oiList.Count; csList[i].EmptyQuantity = oiList.Sum(oi => oi.DetailInfo.Quantity); csList[i].TotalQuantity = csList.Where(c => c.DrugId == csList[i].DrugId).Sum(c => c.Quantity); if ((String.IsNullOrEmpty(csList[i].ListId) && csList[i].Quantity > csList[i].UseQuantity) || (csList[i].Quantity > csList[i].BaseQuantity)) { //药品未在套餐中绑定需要把药还到对应抽屉 List allDrugStock = await GetStockByDRrug(csList[i].DrugId, csList[i].ManuNo, 1);// await _connection.ChannelStock.Where(cs => cs.MachineId == _setting.machineId && cs.DrawerType == 1 && cs.DrugId == csList[i].DrugId && cs.ManuNo == csList[i].ManuNo).OrderBy(cs => cs.Quantity).ToListAsync(); if (allDrugStock != null && allDrugStock.Count > 0) { csList[i].DrawerChanneStockList = new(); int iReturnQuantity = csList[i].Quantity - csList[i].UseQuantity - csList[i].BaseQuantity; for (int j = 0; j < allDrugStock.Count; j++) { if (allDrugStock[j].BoardType.ToString().Contains("2") && allDrugStock[j].Quantity >= 25) continue; if (allDrugStock[j].BoardType.ToString().Contains("2") && allDrugStock[j].Quantity + csList[i].Quantity - csList[i].UseQuantity > 25) { //if (iReturnQuantity <= allDrugStock.Sum(it => it.Quantity)) if (allDrugStock[j].Quantity <= 25) { //有空位置可以放 int canStockQuantity = 25 - allDrugStock[j].Quantity; if (canStockQuantity > iReturnQuantity) { allDrugStock[j].ReturnQuantity = iReturnQuantity; csList[i].DrawerChanneStockList.Add(allDrugStock[j]); break; } else { allDrugStock[j].ReturnQuantity = canStockQuantity; iReturnQuantity = iReturnQuantity - allDrugStock[j].ReturnQuantity; csList[i].DrawerChanneStockList.Add(allDrugStock[j]); } //iReturnQuantity = iReturnQuantity - allDrugStock[j].ReturnQuantity; //for (int q = 0; iReturnQuantity > 0; q++) //{ // allDrugStock[j].ReturnQuantity = 25 - allDrugStock[q].Quantity; // csList[i].DrawerChanneStockList.Add(allDrugStock[q]); // iReturnQuantity = iReturnQuantity - allDrugStock[q].ReturnQuantity; // if (iReturnQuantity <= 0) // break; //} } else { //库位不足,有药品无库位可放 allDrugStock[j].ReturnQuantity = iReturnQuantity; csList[i].DrawerChanneStockList.Add(allDrugStock[j]); logger.Info($"还药品【{csList[i].Drug.DrugName}】库位不足,有药品无库位可放"); } } else { allDrugStock[j].ReturnQuantity = iReturnQuantity; csList[i].DrawerChanneStockList.Add(allDrugStock[j]); break; } } } } } } int pagedData = csList.Count; return new PageData() { TotalDesserts = pagedData, Desserts = csList.OrderBy(cs => cs.DrugId).OrderByDescending(cs => cs.UseQuantity).ToList() }; } //public List GetAnaesthetistName() //{ // List strList = new List(); // strList = _connection.OrderInfo.Where(it=>it.state==0&&it.HisDispFlag==0&&it.CancelFlag==0).Select(it => it.anaesthetistName).Distinct().ToList(); // return strList; //} /// /// 获取所有药盒号 /// /// /// public async Task> GetDrawerNum(string machineId) { List stockList = _connection.ChannelStock .Where(cs => cs.MachineId == machineId) .GroupBy(cs => new { cs.DrawerNo, cs.ColNo }) .Select(g => new ChannelStock { DrawerNo = g.Key.DrawerNo, ColNo = g.Key.ColNo, }) .ToList(); return stockList; } /// /// 获取指定药盒号 /// /// /// public async Task> GetDrawerNumByOperationNum(string machineId, int boxColor) { List boxModelList = new List(); //var query = _connection.ChannelStock // .Where(cs => cs.MachineId == machineId && operationNum.Contains(cs.DrawerNo)&&cs.Quantity>0); //boxModelList = await _connection.ChannelStock // .Where(cs => cs.MachineId == machineId && cs.Quantity > 0 && (operationNum.Contains(cs.DrawerNo))) // .Select(cs => new BoxModel { BoxName = cs.DrawerNo, BoxNo = Convert.ToInt32(cs.ColNo) }).Distinct().OrderBy(cs=>new { cs.BoxName, cs.BoxNo }).ToListAsync(); //return boxModelList; var query = _connection.ChannelList.Where(cs => cs.MachineId == machineId).AsQueryable(); if (boxColor > 0) { query.Where(cs => cs.ColNo == boxColor); } List csList = query.OrderBy(cs => cs.DrawerNo).ToList(); if (csList != null && csList.Count > 0) { for (int i = 0; i < csList.Count; i++) { boxModelList.Add(new BoxModel { BoxName = csList[i].DrawerNo, BoxNo = csList[i].ColNo }); } } return boxModelList; } //核对处方 public async Task CheckOrderInfo(IList selectedOrderInfos, BoxModel boxModel) { try { _connection.BeginTransaction(); bool bFlag = true; logger.Info($"管理员{_globalStateService.Operator.NickName}开始确认手麻单"); string empChannelStock = string.Empty; for (int i = 0; i < selectedOrderInfos.Count; i++) { OrderInfo oi = selectedOrderInfos[i]; int drawerNo = Convert.ToInt32(boxModel.BoxName); if (oi.DetailInfo != null && oi.DetailInfo.Id > 0) { //ChannelStock? cs = _connection.ChannelStock.AsQueryable() // .Where(cs => cs.DrugId == oi.DetailList[j].DrugId // // && cs.ManuNo == oi.DetailList[j].SetManuNo // // && cs.EffDate == oi._OrderDetail.SetEffDate // && cs.MachineId.Equals(_setting.boxMachineId) // && cs.DrawerNo == drawerNo // && cs.Quantity >= oi.DetailList[j].Quantity).FirstOrDefault(); List cs = _connection.ChannelStock.AsQueryable() .Where(cs => cs.DrugId == oi.DetailInfo.DrugId && cs.ManuNo == oi.DetailInfo.drugManuNo.ManuNo //&& cs.EffDate == ((DateTime)oi.DetailInfo.drugManuNo.EffDate).ToString("yyyy-MM-dd") && cs.MachineId.Equals(_setting.boxMachineId) && cs.DrawerNo == drawerNo && cs.ColNo == boxModel.BoxNo).OrderBy(cs => cs.EffDate).ToList(); if (cs.Count <= 0) { logger.Info($"处方{oi.OrderNo}中药品{oi.DetailInfo.Drug.DrugName}在{drawerNo}号药盒无库存"); empChannelStock += $"处方{oi.OrderNo}中药品{oi.DetailInfo.Drug.DrugName}在{drawerNo}号药盒无库存 "; continue; } int csQuantity = cs.Sum(cs => cs.Quantity); if (csQuantity < oi.DetailInfo.Quantity) { logger.Info($"处方{oi.OrderNo}中药品{oi.DetailInfo.Drug.DrugName}在{drawerNo}号库存不足,需要核对数{oi.DetailInfo.Quantity},库存总数{csQuantity}"); empChannelStock += $"处方{oi.OrderNo}中药品{oi.DetailInfo.Drug.DrugName}在{drawerNo}号库存不足,需要核对数{oi.DetailInfo.Quantity},库存总数{csQuantity} "; continue; } //更新处方状态 if (oi.Status == 0) { int iUpdate = _connection.OrderInfo.Where(o => o.OrderNo == oi.OrderNo).Set(o => o.Status, 2).Update(); int odUpdate = _connection.OrderDetail.Where(od => od.OrderNo == oi.OrderNo).Set(od => od.SetManuNo, oi.DetailInfo.drugManuNo.ManuNo).Set(od => od.Quantity, oi.DetailInfo.Quantity).Update(); _connection.Insert(new OrderFinish() { OrderNo = oi.OrderNo, PatientId = oi.PatientId, Pharmacy = oi.Pharmacy, State = 1, //WinNo = DrawerNo + 1 + "号手术间", Operator = _globalStateService.Operator.NickName, }); } int Break = 0; for (int k = 0; (k < cs.Count && Break == 0); k++) { int oldQuantity = cs[k].Quantity; int useQuantity = 0; //实际使用数量 if (cs[k].Quantity >= oi.DetailInfo.Quantity) { cs[k].Quantity = cs[k].Quantity - oi.DetailInfo.Quantity; Break = 1;//药品够取跳出循环 useQuantity = oi.DetailInfo.Quantity; } else { oi.DetailInfo.Quantity = oi.DetailInfo.Quantity - cs[k].Quantity; useQuantity = cs[k].Quantity; cs[k].Quantity = 0; } //cs.NeedNum = cs.NeedNum > 0 ? cs.NeedNum + oi._OrderDetail.Quantity : oi._OrderDetail.Quantity; logger.Info($"更新药盒{cs[k].DrawerNo}药品{cs[k].DrugId}批次{cs[k].ManuNo}库存为{oldQuantity},处方用药数量为{oi.DetailInfo.Quantity}"); // 更新数据 库存信息 _connection.Update(cs[k]); //更新ChannelList对应的总库存 ChannelList? channelList = _connection.ChannelList.AsQueryable().Where(cl => cl.MachineId.Equals(cs[k].MachineId) && cl.Id.Equals(cs[k].ListId) && cl.DrawerNo.Equals(cs[k].DrawerNo)).FirstOrDefault(); if (channelList != null) { channelList.TotalQuantity = channelList.TotalQuantity - useQuantity;// oi.DetailList[j].Quantity; _connection.Update(channelList); } // 获取更新完库存后的药品库存 List nowChannels = _connection.ChannelStock.AsQueryable() .Where(it => it.MachineId.Equals(cs[k].MachineId) || it.MachineId.Equals(_setting.machineId)) .Where(it => it.DrugId.Equals(cs[k].DrugId)) .Where(it => it.ManuNo.Equals(cs[k].ManuNo)) .Where(it => it.DrawerType == 1) .ToList(); _connection.Insert(new MachineRecord() { MachineId = _setting.machineId, DrawerNo = cs[k].DrawerNo, ColNo = cs[k].ColNo, DrugId = cs[k].DrugId, ManuNo = cs[k].ManuNo, EffDate = !String.IsNullOrEmpty(cs[k].EffDate) ? DateTime.ParseExact(cs[k].EffDate, "yyyy-MM-dd", System.Globalization.CultureInfo.CurrentCulture) : null, Operator = _globalStateService.Operator?.Id, Reviewer = _globalStateService.Reviewer?.Id, OperationTime = DateTime.Now, Quantity = useQuantity,// oi.DetailList[j].Quantity, Type = 2, InvoiceId = oi.OrderNo //, StockQuantity = nowChannels.Sum(it => it.Quantity) }); //查询上一条账册中的空瓶数 AccountBookG2? accountBookEmpty = _connection.AccountBookG2.AsQueryable() .Where(ab => ab.MachineId.Equals(_setting.machineId)) .Where(ab => ab.Type == 1 || ab.Type == 2) .Where(ab => ab.DrugId == oi.DetailInfo.DrugId) .Where(ab => ab.ManuNo == cs[k].ManuNo).OrderByDescending(ab => ab.Id).FirstOrDefault(); //保存账册 int iInsertResult = _connection.Insert(new AccountBookG2() { DrugId = oi.DetailInfo.DrugId, Type = 2, Department = oi.DeptName, OrderNo = oi.OrderNo, ManuNo = cs[k].ManuNo, EffDate = cs[k].EffDate, OutQuantity = useQuantity,// oi.DetailList[j].Quantity, UserId1 = _globalStateService.Operator?.Id, UserId2 = _globalStateService.Reviewer?.Id, MachineId = _setting.machineId, CreateDate = DateTime.Now.ToString("yyyy-MM-dd"), CreateTime = DateTime.Now, InvoiceNo = oi.OrderNo, ManuStock = nowChannels.Sum(it => it.Quantity), TotalStock = (accountBookEmpty != null ? (accountBookEmpty.TotalStock > 0 ? accountBookEmpty.TotalStock : 0) : 0) + oi.DetailInfo.Quantity, ShoushuJian = drawerNo.ToString() }); //修改凌晨生成的日结存与总结存数据 AccountBookG2? accountBookG2Day = _connection.AccountBookG2.AsQueryable() .Where(ab => ab.MachineId.Equals(_setting.machineId)) .Where(ab => ab.Type == 3) .Where(ab => ab.DrugId == oi.DetailInfo.DrugId) .Where(ab => ab.ManuNo == cs[k].ManuNo) .Where(ab => ab.CreateDate == DateTime.Now.ToString("yyyy-MM-dd")).FirstOrDefault(); if (accountBookG2Day != null) { accountBookG2Day.ManuStock = accountBookG2Day.ManuStock - useQuantity;// oi.DetailList[j].Quantity; _connection.Update(accountBookG2Day); } else { //生成日结存时可能没有该库位的绑定信息,需要写入日结存 int iDayResult = _connection.Insert(new AccountBookG2() { DrugId = oi.DetailInfo.DrugId, Type = 3, ManuNo = cs[k].ManuNo, EffDate = cs[k].EffDate, YQuantity = 0, ManuStock = useQuantity,// oi.DetailList[j].Quantity, TotalStock = useQuantity,// oi.DetailList[j].Quantity, UserId1 = _globalStateService.Operator?.Id, UserId2 = _globalStateService.Reviewer?.Id, MachineId = _setting.machineId, CreateDate = DateTime.Now.ToString("yyyy-MM-dd"), InvoiceNo = "日结存" }); if (iDayResult <= 0) { logger.Info($"未写入日结存数据{oi.DetailInfo.DrugId}-{cs[k].ManuNo}-{cs[k].EffDate}-{useQuantity}"); empChannelStock += $"未写入日结存数据{oi.DetailInfo.DrugId}-{cs[k].ManuNo}-{cs[k].EffDate}-{useQuantity} "; } } //修改凌晨生成的日结存与总结存数据 AccountBookG2? accountBookG2Total = _connection.AccountBookG2.AsQueryable() .Where(ab => ab.MachineId.Equals(_setting.machineId)) .Where(ab => ab.Type == 4) .Where(ab => ab.DrugId == oi.DetailInfo.DrugId) .Where(ab => ab.CreateDate == DateTime.Now.ToString("yyyy-MM-dd")).FirstOrDefault(); if (accountBookG2Total != null) { accountBookG2Total.TotalStock = accountBookG2Total.TotalStock - useQuantity;// oi.DetailList[j].Quantity; _connection.Update(accountBookG2Total); } else { //生成总结存时可能没有该库位的绑定信息,需要写入总结存 int iTotalResult = _connection.Insert(new AccountBookG2() { DrugId = oi.DetailInfo.DrugId, Type = 4, YQuantity = 0, ManuStock = useQuantity,//oi.DetailList[j].Quantity, TotalStock = useQuantity,// oi.DetailList[j].Quantity, UserId1 = _globalStateService.Operator?.Id, UserId2 = _globalStateService.Reviewer?.Id, MachineId = _setting.machineId, CreateDate = DateTime.Now.ToString("yyyy-MM-dd"), InvoiceNo = "总结存" }); if (iTotalResult <= 0) { logger.Info($"未写入总结存数据{oi.DetailInfo.DrugId}-{useQuantity}"); empChannelStock += $"未写入总结存数据{oi.DetailInfo.DrugId}-{useQuantity} "; } } } } } logger.Info($"管理员{_globalStateService.Operator.NickName}结束确认手麻单"); if (!string.IsNullOrEmpty(empChannelStock)) { _message.Notify( new NotificationMessage { Severity = NotificationSeverity.Error, Summary = "提示", Detail = $"有未核对处方:{empChannelStock}", Duration = 4000 } ); _connection.RollbackTransaction(); return false; } if (bFlag) { _connection.CommitTransaction(); return true; } else { _connection.RollbackTransaction(); logger.Info($"管理员{_globalStateService.Operator.NickName}确认手麻单失败"); return false; } } catch (Exception ex) { _connection.RollbackTransaction(); logger.Info($"核对处方异常{ex.Message}"); return false; } } int status; //核对处方 public async Task CheckOrderInfoByChannelStock(IList csList, BoxModel boxModel) { try { _connection.BeginTransaction(); bool bFlag = true; logger.Info($"管理员{_globalStateService.Operator.NickName}开始核对处方"); string empChannelStock = string.Empty; for (int i = 0; i < csList.Count; i++) { ChannelStock channelStock = csList[i]; if (channelStock != null && channelStock.SelectedOrderList != null && channelStock.SelectedOrderList.Count > 0) { List oiList = channelStock.SelectedOrderList.ToList(); for (int j = 0; j < oiList.Count; j++) { //修改选中的处方状态 int iUpdate = _connection.OrderInfo.Where(o => o.OrderNo == oiList[j].OrderNo).Set(o => o.Status, 2).Update(); _connection.Insert(new OrderFinish() { OrderNo = oiList[j].OrderNo, PatientId = oiList[j].PatientId, Pharmacy = oiList[j].Pharmacy, State = 1, //WinNo = DrawerNo + 1 + "号手术间", Operator = _globalStateService.Operator.NickName, }); //更新库存 channelStock.Quantity = channelStock.Quantity - oiList[j].DetailInfo.Quantity; _connection.Update(channelStock); //更新ChannelList对应的总库存 if (!string.IsNullOrEmpty(channelStock.ListId) && channelStock.ListId != "0") { ChannelList? channelList = _connection.ChannelList.AsQueryable().Where(cl => cl.Id == channelStock.ListId).FirstOrDefault(); if (channelList != null) { channelList.TotalQuantity = channelList.TotalQuantity - oiList[j].DetailInfo.Quantity; _connection.Update(channelList); } } //记录出库记录 _connection.Insert(new MachineRecord() { MachineId = _setting.machineId, DrawerNo = channelStock.DrawerNo, ColNo = channelStock.ColNo, DrugId = channelStock.DrugId, ManuNo = channelStock.ManuNo, EffDate = !String.IsNullOrEmpty(channelStock.EffDate) ? DateTime.ParseExact(channelStock.EffDate, "yyyy-MM-dd", System.Globalization.CultureInfo.CurrentCulture) : null, Operator = _globalStateService.Operator?.Id, Reviewer = _globalStateService.Reviewer?.Id, OperationTime = DateTime.Now, Quantity = oiList[j].DetailInfo.Quantity, Type = 2, InvoiceId = oiList[j].OrderNo }); //保存账册 // 获取更新完库存后的药品库存 List nowChannels = _connection.ChannelStock.AsQueryable() .Where(it => it.MachineId.Equals(_setting.machineId) || it.MachineId.Equals(_setting.boxMachineId)) .Where(it => it.DrugId.Equals(oiList[j].DetailInfo.DrugId)) .Where(it => it.ManuNo.Equals(oiList[j].DetailInfo.SetManuNo)) .Where(it => it.DrawerType == 1) .ToList(); //查询上一条账册中的空瓶数 AccountBookG2? accountBookEmpty = _connection.AccountBookG2.AsQueryable() .Where(ab => ab.MachineId.Equals(_setting.machineId)) .Where(ab => ab.Type == 1 || ab.Type == 2) .Where(ab => ab.DrugId == oiList[j].DetailInfo.DrugId) .Where(ab => ab.ManuNo == oiList[j].DetailInfo.SetManuNo).OrderByDescending(ab => ab.Id).FirstOrDefault(); //保存账册 int iInsertResult = _connection.Insert(new AccountBookG2() { DrugId = oiList[j].DetailInfo.DrugId, Type = 2, Department = oiList[j].DeptName, OrderNo = oiList[j].OrderNo, ManuNo = oiList[j].DetailInfo.SetManuNo, EffDate = oiList[j].DetailInfo.SetEffDate, OutQuantity = oiList[j].DetailInfo.Quantity, UserId1 = _globalStateService.Operator?.Id, UserId2 = _globalStateService.Reviewer?.Id, MachineId = _setting.machineId, CreateDate = DateTime.Now.ToString("yyyy-MM-dd"), CreateTime = DateTime.Now, InvoiceNo = oiList[j].OrderNo, ManuStock = nowChannels.Sum(it => it.Quantity), TotalStock = (accountBookEmpty != null ? (accountBookEmpty.TotalStock > 0 ? accountBookEmpty.TotalStock : 0) : 0) + oiList[j].DetailInfo.Quantity, ShoushuJian = oiList[j].RoomName }); //修改日结 //修改凌晨生成的日结存与总结存数据 AccountBookG2? accountBookG2Day = _connection.AccountBookG2.AsQueryable() .Where(ab => ab.MachineId.Equals(_setting.machineId)) .Where(ab => ab.Type == 3) .Where(ab => ab.DrugId == oiList[j].DetailInfo.DrugId) .Where(ab => ab.ManuNo == oiList[j].DetailInfo.SetManuNo) .Where(ab => ab.CreateDate == DateTime.Now.ToString("yyyy-MM-dd")).FirstOrDefault(); if (accountBookG2Day != null) { accountBookG2Day.ManuStock = accountBookG2Day.ManuStock - oiList[j].DetailInfo.Quantity; _connection.Update(accountBookG2Day); } else { //生成日结存时可能没有该库位的绑定信息,需要写入日结存 int iDayResult = _connection.Insert(new AccountBookG2() { DrugId = oiList[j].DetailInfo.DrugId, Type = 3, ManuNo = oiList[j].DetailInfo.SetManuNo, EffDate = oiList[j].DetailInfo.SetEffDate, YQuantity = 0, ManuStock = oiList[j].DetailInfo.Quantity, TotalStock = oiList[j].DetailInfo.Quantity, UserId1 = _globalStateService.Operator?.Id, UserId2 = _globalStateService.Reviewer?.Id, MachineId = _setting.machineId, CreateDate = DateTime.Now.ToString("yyyy-MM-dd"), InvoiceNo = "日结存" }); if (iDayResult <= 0) { logger.Info($"未写入日结存数据{oiList[j].DetailInfo.DrugId}-{oiList[j].DetailInfo.SetManuNo}-{oiList[j].DetailInfo.SetEffDate}-{oiList[j].DetailInfo.Quantity}"); empChannelStock += $"未写入日结存数据{oiList[j].DetailInfo.DrugId}-{oiList[j].DetailInfo.SetManuNo}-{oiList[j].DetailInfo.SetEffDate}-{oiList[j].DetailInfo.Quantity} "; } } //总结 //修改凌晨生成的日结存与总结存数据 AccountBookG2? accountBookG2Total = _connection.AccountBookG2.AsQueryable() .Where(ab => ab.MachineId.Equals(_setting.machineId)) .Where(ab => ab.Type == 4) .Where(ab => ab.DrugId == oiList[j].DetailInfo.DrugId) .Where(ab => ab.CreateDate == DateTime.Now.ToString("yyyy-MM-dd")).FirstOrDefault(); if (accountBookG2Total != null) { accountBookG2Total.TotalStock = accountBookG2Total.TotalStock - oiList[j].DetailInfo.Quantity;// oi.DetailList[j].Quantity; _connection.Update(accountBookG2Total); } else { //生成总结存时可能没有该库位的绑定信息,需要写入总结存 int iTotalResult = _connection.Insert(new AccountBookG2() { DrugId = oiList[j].DetailInfo.DrugId, Type = 4, YQuantity = 0, ManuStock = oiList[j].DetailInfo.Quantity, TotalStock = oiList[j].DetailInfo.Quantity, UserId1 = _globalStateService.Operator?.Id, UserId2 = _globalStateService.Reviewer?.Id, MachineId = _setting.machineId, CreateDate = DateTime.Now.ToString("yyyy-MM-dd"), InvoiceNo = "总结存" }); if (iTotalResult <= 0) { logger.Info($"未写入总结存数据{oiList[j].DetailInfo.DrugId}-{oiList[j].DetailInfo.Quantity}"); empChannelStock += $"未写入总结存数据{oiList[j].DetailInfo.DrugId}-{oiList[j].DetailInfo.Quantity} "; } } //移出库位里是否有未绑套餐且库存为0的数据,有则删除 _connection.ChannelStock.Where(cs => cs.MachineId.Equals(_setting.boxMachineId) && (string.IsNullOrEmpty(cs.ListId)) && cs.DrawerNo == channelStock.DrawerNo && cs.ColNo == channelStock.ColNo && cs.Quantity <= 0).Delete(); //删除绑定套餐中同一药品多批次且库存为0的第一条数据 List delChannelStock = await _connection.ChannelStock.Where(cs => cs.MachineId.Equals(_setting.boxMachineId) && cs.DrawerNo == channelStock.DrawerNo && cs.ColNo == channelStock.ColNo && cs.DrugId == channelStock.DrugId).ToListAsync(); if (delChannelStock != null && delChannelStock.Count > 1) { //删除绑定套餐中库存为0的药的批次数据,只保留一条数据 List del = delChannelStock.Where(c => c.Quantity <= 0).ToList(); if (del != null && del.Count > 0) { if (delChannelStock.Count == del.Count) { for (int d = 1; d < del.Count; d++) { _connection.ChannelStock.Where(cs => cs.Id == del[d].Id).Delete(); } } else { for (int d = 0; d < del.Count; d++) { _connection.ChannelStock.Where(cs => cs.Id == del[d].Id).Delete(); } } } } } } List drawerNos = new(); List returnStock = new(); //if (csList.Any(c => c.DrawerChanneStockList?.Count > 0)) if (csList[i].DrawerChanneStockList != null && csList[i].DrawerChanneStockList.Count > 0) { List drawerChannelStockList = csList[i].DrawerChanneStockList; for (int j = 0; j < drawerChannelStockList.Count; j++) { //还药将库存加入抽屉、从药盒中减库存 _connection.ChannelStock.Where(cs => cs.Id == csList[i].DrawerChanneStockList[j].Id).Set(cs => cs.Quantity, csList[i].DrawerChanneStockList[j].Quantity + csList[i].DrawerChanneStockList[j].ReturnQuantity).Update(); _connection.ChannelStock.Where(cs => cs.Id == csList[i].Id).Set(cs => cs.Quantity, csList[i].Quantity - csList[i].DrawerChanneStockList[j].ReturnQuantity).Update(); //药盒对应channel_list表总库存也要减 ChannelList clList = _connection.ChannelList.Where(cl => cl.MachineId.Equals(_setting.boxMachineId) && cl.DrawerNo == csList[i].DrawerNo && cl.ColNo == csList[i].ColNo).FirstOrDefault(); if (clList != null) { clList.TotalQuantity -= csList[i].DrawerChanneStockList[j].ReturnQuantity; int iUpdate = await _connection.UpdateAsync(clList); if (iUpdate <= 0) { logger.Info($"抽屉还药记录药盒{boxModel.BoxName}-{boxModel.BoxNo}总库存失败,还药数量{csList[i].DrawerChanneStockList[j].ReturnQuantity}"); } } MachineRecord _MachineRecord = _connection.MachineRecord .Where(dm => dm.MachineId.Equals(_setting.boxMachineId) && dm.DrugId == csList[i].DrugId && dm.ManuNo == csList[i].ManuNo && dm.BoxDrawer == csList[i].DrawerNo && dm.ColNo == csList[i].ColNo && dm.Type == 2 && dm.Status != 2).FirstOrDefault(); if (_MachineRecord != null) { _MachineRecord.ReturnQuantity2 = _MachineRecord.ReturnQuantity2 + _MachineRecord.CurrentReturnQuantity; _MachineRecord.Status = _MachineRecord.ReturnQuantity2 + _MachineRecord.ReturnQuantity1 >= _MachineRecord.Quantity ? 2 : 1; // 更新借药数据 取药记录 设置还药数量、状态 _connection.Update(_MachineRecord); } //添加还药记录 int acid = _connection.InsertWithInt32Identity(new MachineRecord() { MachineId = _setting.boxMachineId, DrawerNo = csList[i].DrawerChanneStockList[j].DrawerNo, ColNo = csList[i].DrawerChanneStockList[j].ColNo, DrugId = csList[i].DrugId, ManuNo = csList[i].DrawerChanneStockList[j].ManuNo, // EffDate = !String.IsNullOrEmpty(record.EffDate) ? DateTime.ParseExact(record.EffDate, "yyyy-MM-dd", System.Globalization.CultureInfo.CurrentCulture) : null, Operator = _globalStateService.Operator?.Id, Reviewer = _globalStateService.Reviewer?.Id, OperationTime = DateTime.Now, Quantity = csList[i].DrawerChanneStockList[j].ReturnQuantity, Type = 31, InvoiceId = csList[i].Location, GetId = _MachineRecord?.GetId }); } } if (csList[i].EmptyStock != null && csList[i].EmptyStock.ReturnQuantity > 0) { //还空瓶,将空瓶数量加到空瓶库位 //还药将库存加入抽屉、从药盒中减库存 _connection.ChannelStock.Where(cs => cs.Id == csList[i].EmptyStock.Id).Set(cs => cs.Quantity, csList[i].EmptyStock.Quantity + csList[i].EmptyStock.ReturnQuantity).Update(); MachineRecord _MachineRecord = _connection.MachineRecord .Where(dm => dm.MachineId.Equals(_setting.boxMachineId) && dm.DrugId == csList[i].DrugId && dm.ManuNo == csList[i].ManuNo && dm.BoxDrawer == csList[i].DrawerNo && dm.ColNo == csList[i].ColNo && dm.Type == 2 && dm.Status != 2).FirstOrDefault(); if (_MachineRecord != null) { _MachineRecord.ReturnQuantity2 = _MachineRecord.ReturnQuantity2 + _MachineRecord.CurrentReturnQuantity; _MachineRecord.Status = _MachineRecord.ReturnQuantity2 + _MachineRecord.ReturnQuantity1 >= _MachineRecord.Quantity ? 2 : 1; // 更新借药数据 取药记录 设置还药数量、状态 _connection.Update(_MachineRecord); } //添加还空瓶记录 int acid = _connection.InsertWithInt32Identity(new MachineRecord() { MachineId = _setting.boxMachineId, DrawerNo = csList[i].EmptyStock.DrawerNo, ColNo = csList[i].EmptyStock.ColNo, DrugId = csList[i].DrugId, ManuNo = csList[i].EmptyStock.ManuNo, // EffDate = !String.IsNullOrEmpty(record.EffDate) ? DateTime.ParseExact(record.EffDate, "yyyy-MM-dd", System.Globalization.CultureInfo.CurrentCulture) : null, Operator = _globalStateService.Operator?.Id, Reviewer = _globalStateService.Reviewer?.Id, OperationTime = DateTime.Now, Quantity = csList[i].EmptyStock.ReturnQuantity, Type = 32, InvoiceId = csList[i].Location, GetId = _MachineRecord?.GetId }); } } //将药盒中无绑定库位的药品且库存为0的删除 _connection.ChannelStock.Where(cs => cs.MachineId.Equals(_setting.boxMachineId) && string.IsNullOrEmpty(cs.ListId) && cs.Quantity <= 0).Delete(); logger.Info($"管理员{_globalStateService.Operator.NickName}结束确认手麻单"); if (!string.IsNullOrEmpty(empChannelStock)) { _message.Notify( new NotificationMessage { Severity = NotificationSeverity.Error, Summary = "提示", Detail = $"有未核对处方:{empChannelStock}", Duration = 4000 } ); _connection.RollbackTransaction(); return false; } if (bFlag) { _connection.CommitTransaction(); return true; } else { _connection.RollbackTransaction(); logger.Info($"管理员{_globalStateService.Operator.NickName}确认手麻单失败"); return false; } } catch (Exception ex) { _connection.RollbackTransaction(); logger.Info($"核对处方异常{ex.Message}"); return false; } } void RestData() { // PortUtil.speechSynthesizer.SpeakAsyncCancelAll(); // this.status = 0; // data.ForEach(it => // { // it.Status = 0; // it.BeforeQuantity = new int[9]; // it.AfterQuantity = new int[9]; // }); // this.WeightFinnalQuantity = new int[9]; // DrawerNoColNoList.Clear(); } public async Task> GetAnaesthetistName() { List strList = new List(); strList = await _connection.OrderInfo.Where(it => it.state == 0 && it.HisDispFlag == 0 && it.CancelFlag == 0).Select(it => new Anaesthetist { Name = it.anaesthetistName }).Distinct().ToListAsync(); return strList; } //获取麻醉师单对应的手术间号 public async Task> GetOperationNum(int boxColor) { List boxNumList = new List(); //List roomNameList = await _connection.OrderInfo // .Where(it => it.state == 0 && it.HisDispFlag == 0 && it.CancelFlag == 0&&it.anaesthetistName== anaesthetistName) // .Select(it => Convert.ToInt32(it.RoomName.Substring(6, it.RoomName.Length - 6))).Distinct().ToListAsync(); //roomNameList.Add(99); //roomNameList.Add(111); logger.Info($"开始查询药盒{DateTime.Now}"); boxNumList = await GetDrawerNumByOperationNum(_setting.boxMachineId, boxColor); logger.Info($"结束查询药盒{DateTime.Now}"); return boxNumList; } //获取麻醉师单对应的手术间号(查询全部手术间已绑套餐的手术间) public async Task> GetAllBindOperationNum() { List boxModelList = new List(); boxModelList = await _connection.ChannelList .Where(cs => cs.MachineId == _setting.boxMachineId && (!string.IsNullOrEmpty(cs.DrugId))) .Select(cs => new BoxModel { BoxName = cs.DrawerNo, BoxNo = Convert.ToInt32(cs.ColNo) }).Distinct().OrderBy(cs => new { cs.BoxName, cs.BoxNo }).ToListAsync(); return boxModelList; } //查询药品对应的库位 drawerType=1药品库位,其他则是回收库位 public async Task> GetStockByDRrug(string drugId, string manuNo, int drawerType) { if (drawerType == 1) { return await _connection.ChannelStock.Where(cs => cs.MachineId == _setting.machineId && cs.DrawerType == drawerType && cs.DrugId == drugId && cs.ManuNo == manuNo).OrderBy(cs => cs.Quantity).ToListAsync(); } else { return await _connection.ChannelStock.Where(cs => cs.MachineId == _setting.machineId && cs.DrawerType != 1 && cs.DrugId == drugId).OrderBy(cs => cs.Quantity).ToListAsync(); } } public Task> GetDrawerNumByOperationNum(string machineId, List operationNum) { throw new NotImplementedException(); } } }