SiChuanShengErZhong_JZ/MasaBlazorApp3/DataAccess/Impl/OrderInfoDao.cs

1623 lines
84 KiB
C#
Raw Normal View History

2025-10-11 17:30:22 +08:00
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<SettingConfig> setting, GlobalStateService globalStateService, PortUtil portUtil, NotificationService message)
{
_connection = connection;
_setting = setting.Value;
_globalStateService = globalStateService;
_portUtil = portUtil;
_message = message;
}
public async Task<PageData<OrderInfo>> GetAllOrderInfo(string OrderrNo, DateTime OrderDate, int? take, int? skip)
{
//var query = _connection.OrderInfo.AsQueryable();
//query.InnerJoin<OrderDetail>((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<OrderInfo> 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<OrderInfo>()
{
TotalDesserts = pagedData,
Desserts = list
};
}
public async Task<PageData<OrderInfo>> GetAllOrderInfoForImport(string name, string OrderrNo, DateTime OrderDate, BoxModel boxModel, int? take, int? skip)
{
//var query = _connection.OrderInfo.AsQueryable();
//query.InnerJoin<OrderDetail>((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<OrderInfo> 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<OrderInfo>();
list[i].SelectedOrderList.Add(list[i]);
}
}
return new PageData<OrderInfo>()
{
TotalDesserts = pagedData,
Desserts = list
};
}
public async Task<List<OrderDetail>> 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<List<ChannelStock>> 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<List<OrderTakeVo>> getTakeInfoByOrderNo(string OrderrNo)
{
List<OrderTakeVo> tempData = new();
List<OrderTakeVo> tempData2 = new();
List<OrderDetail> details = await this.getDetailByOrderNo(OrderrNo);
var flag = true;
for (var i = 0; i < details.Count; i++)
{
//List<IDictionary<string, object>> tempData = new();
OrderDetail detail = details[i];
// 当前detail取药数量
var Quantity = detail.Quantity;
List<ChannelStock> 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<bool> OrderTakeFinish(List<OrderTakeVo> 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<ChannelStock> 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<PageData<OrderInfo>> 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<OrderInfo> list = await query
.OrderBy((oi) => oi.RecvDate)
.ThenBy((oi => oi.OrderNo))
.Skip((int)skip)
.Take((int)take)
.ToListAsync();
return new PageData<OrderInfo>()
{
TotalDesserts = pagedData,
Desserts = list
};
}
public async Task<List<MachineRecord>> 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<List<OperationVo<MachineRecord>>> getReturnInfoByOrderNo(string OrderrNo)
{
List<OperationVo<MachineRecord>> tempData = new();
List<MachineRecord> details = await this.GetMachineRecordByOrderNo(OrderrNo);
for (var i = 0; i < details.Count; i++)
{
//List<IDictionary<string, object>> tempData = new();
MachineRecord detail = details[i];
List<ChannelStock> 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<MachineRecord>()
{
Drug = detail.Drug,
data = detail,
StockQuantity = total,
Quantity = Quantity,
ChannelStocks = stockList,
});
}
return tempData;
}
public async Task<DrugManuNo> 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<bool> OrderReturnFinish(List<OperationVo<MachineRecord>> 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<ChannelStock> 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<ChannelStock> 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;
}
}
/// <summary>
/// 获取药盒中的用药信息
/// </summary>
/// <param name="OrderrNo"></param>
/// <param name="OrderDate"></param>
/// <param name="take"></param>
/// <param name="skip"></param>
/// <returns></returns>
public async Task<PageData<OrderInfo>> 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<OrderInfo> 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<OrderInfo> 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<OrderInfo>()
{
TotalDesserts = pagedData,
Desserts = list
};
}
/// <summary>
/// 获取待处理处方中的麻醉师
/// </summary>
/// <param name="OrderrNo"></param>
/// <param name="OrderDate"></param>
/// <param name="take"></param>
/// <param name="skip"></param>
/// <returns></returns>
public async Task<PageData<OrderInfo>> 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<OrderInfo> 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<OrderInfo>()
{
TotalDesserts = pagedData,
Desserts = list
};
}
/// <summary>
/// 获取待处理处方中的麻醉师
/// </summary>
/// <param name="OrderrNo"></param>
/// <param name="OrderDate"></param>
/// <param name="take"></param>
/// <param name="skip"></param>
/// <returns></returns>
public async Task<PageData<ChannelStock>> GetAllOrderInfoDrugByBox(BoxModel boxNum, string roomName, DateTime? OrderDate)
{
List<ChannelStock> 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<OrderInfo> 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<ChannelStock> 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<ChannelStock>()
{
TotalDesserts = pagedData,
Desserts = csList.OrderBy(cs => cs.DrugId).OrderByDescending(cs => cs.UseQuantity).ToList()
};
}
//public List<string> GetAnaesthetistName()
//{
// List<string> strList = new List<string>();
// strList = _connection.OrderInfo.Where(it=>it.state==0&&it.HisDispFlag==0&&it.CancelFlag==0).Select(it => it.anaesthetistName).Distinct().ToList();
// return strList;
//}
/// <summary>
/// 获取所有药盒号
/// </summary>
/// <param name="machineId"></param>
/// <returns></returns>
public async Task<List<ChannelStock>> GetDrawerNum(string machineId)
{
List<ChannelStock> 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;
}
/// <summary>
/// 获取指定药盒号
/// </summary>
/// <param name="machineId"></param>
/// <returns></returns>
public async Task<List<BoxModel>> GetDrawerNumByOperationNum(string machineId, int boxColor)
{
List<BoxModel> boxModelList = new List<BoxModel>();
//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<ChannelList> 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<bool> CheckOrderInfo(IList<OrderInfo> 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<ChannelStock> 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<ChannelStock> 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<bool> CheckOrderInfoByChannelStock(IList<ChannelStock> 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<OrderInfo> 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<ChannelStock> 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<ChannelStock> 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<ChannelStock> 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<OrderTakeVo> drawerNos = new();
List<ChannelStock> returnStock = new();
//if (csList.Any(c => c.DrawerChanneStockList?.Count > 0))
if (csList[i].DrawerChanneStockList != null && csList[i].DrawerChanneStockList.Count > 0)
{
List<ChannelStock> 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<List<Anaesthetist>> GetAnaesthetistName()
{
List<Anaesthetist> strList = new List<Anaesthetist>();
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<List<BoxModel>> GetOperationNum(int boxColor)
{
List<BoxModel> boxNumList = new List<BoxModel>();
//List<int> 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<List<BoxModel>> GetAllBindOperationNum()
{
List<BoxModel> boxModelList = new List<BoxModel>();
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<List<ChannelStock>> 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<List<BoxModel>> GetDrawerNumByOperationNum(string machineId, List<int> operationNum)
{
throw new NotImplementedException();
}
}
}