SiChuanShengErZhong30/MasaBlazorApp3/DataAccess/Impl/MachineRecordDao.cs

490 lines
23 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using LinqToDB;
using log4net;
using MasaBlazorApp3.DataAccess.Dao;
using MasaBlazorApp3.Pages;
using MasaBlazorApp3.Pojo;
using MasaBlazorApp3.Pojo.Config;
using MasaBlazorApp3.Pojo.Vo;
using MasaBlazorApp3.Port;
using Microsoft.Extensions.Options;
using Mysqlx.Crud;
using System.Collections.Generic;
using static LinqToDB.Common.Configuration;
namespace MasaBlazorApp3.DataAccess.Impl
{
public class MachineRecordDao : IMachineRecordDao
{
private readonly AppDataConnection _connection;
private readonly SettingConfig _setting;
private readonly ILog logger = LogManager.GetLogger(typeof(MachineRecordDao));
private readonly PortUtil _portUtil;
private GlobalStateService _globalStateService;
//public UserDao(MyContext context)
//{
// Context = context;
//}
public MachineRecordDao(AppDataConnection connection, IOptions<SettingConfig> setting, PortUtil portUtil, GlobalStateService globalStateService)
{
_connection = connection;
_setting = setting.Value;
_portUtil = portUtil;
_globalStateService = globalStateService;
}
public async Task<List<ChannelStock>> GetChannelStockByDrugId(string DrugId, String ManuNo)
{
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))
.Where(cs => cs.ManuNo.Equals(ManuNo));
return await query.OrderBy((cs) => cs.EffDate)
.ThenBy((cs) => cs.DrawerNo)
.ThenBy((cs) => cs.ColNo)
.ToListAsync();
}
//还药时有库位即可不需要库存大于0的条件
public async Task<List<ChannelStock>> GetChannelStockByDrugIdForReturn(string DrugId, String ManuNo)
{
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))
.Where(cs => cs.ManuNo.Equals(ManuNo));
return await query.OrderBy((cs) => cs.EffDate)
.ThenBy((cs) => cs.DrawerNo)
.ThenBy((cs) => cs.ColNo)
.ToListAsync();
}
public async Task<PageData<MachineRecord>> GetCanReturnRecords(DateTime start, DateTime end, int operatorId, string drugId, int? take, int? skip)
{
var query = _connection.MachineRecord.AsQueryable().Where(it => it.MachineId.Equals(_setting.machineId)&&it.InvoiceId.StartsWith("DRAWER_"));
if (start != null && start != DateTime.MinValue)
{
query = query.Where(mr => mr.OperationTime > start);
}
if (end != null && end != DateTime.MinValue)
{
query = query.Where(mr => mr.OperationTime < end.AddDays(1));
}
if (operatorId != 0)
{
query = query.Where(mr => mr.Operator == operatorId);
}
query = query.Where(mr => mr.Type == 2);
query = query.Where(mr => mr.Status < 2);
if (!String.IsNullOrEmpty(drugId))
{
query = query.Where(mr => mr.DrugId == drugId);
}
int pagedData = await query.CountAsync();
List<MachineRecord> MachineRecords = await query.LoadWith(mr => mr.Drug)
.LoadWith(mr => mr.OperatorUser)
.OrderByDescending(mr => mr.OperationTime)
.Skip((int)skip)
.Take((int)take)
.ToListAsync();
return new PageData<MachineRecord>() { Desserts = MachineRecords, TotalDesserts = pagedData };
}
public async Task<PageData<MachineRecord>> GetMachineRecordAsync(DateTime start, DateTime end, int operatorId, string drugId, int type, int? take, int? skip)
{
var query = from mr in _connection.MachineRecord select mr ;
if (start != null && start != DateTime.MinValue)
{
query = query.Where(mr => mr.OperationTime > start);
}
if (end != null && end != DateTime.MinValue)
{
query = query.Where(mr => mr.OperationTime < end.AddDays(1));
}
if (operatorId != 0)
{
query = query.Where(mr => mr.Operator == operatorId);
}
if (type != 0)
{
query = query.Where(mr => mr.Type == type);
}
if (!String.IsNullOrEmpty(drugId))
{
query = query.Where(mr => mr.DrugId == drugId);
}
query = query.OrderByDescending(mr => mr.OperationTime);
query =from mr in query
from dr in _connection.DrugInfo.Where(d => d.DrugId == mr.DrugId)
from us in _connection.User.Where(u => u.Id == mr.Operator)
select MachineRecord.Build(mr, dr, us);
int pagedData = await query.CountAsync();
List<MachineRecord> MachineRecords = await query
//.OrderByDescending(mr => mr.OperationTime)
.Skip((int)skip)
.Take((int)take)
.ToListAsync();
//var query = _connection.MachineRecord.AsQueryable().Where(it => it.MachineId.Equals(_setting.machineId));
//if (start != null && start != DateTime.MinValue)
//{
// query = query.Where(mr => mr.OperationTime > start);
//}
//if (end != null && end != DateTime.MinValue)
//{
// query = query.Where(mr => mr.OperationTime < end.AddDays(1));
//}
//if (operatorId != 0)
//{
// query = query.Where(mr => mr.Operator == operatorId);
//}
//if (type != 0)
//{
// query = query.Where(mr => mr.Type == type);
//}
//if (!String.IsNullOrEmpty(drugId))
//{
// query = query.Where(mr => mr.DrugId == drugId);
//}
//int pagedData = await query.CountAsync();
//List<MachineRecord> MachineRecords = await query.LoadWith(mr => mr.Drug)
// .LoadWith(mr => mr.OperatorUser)
// .OrderByDescending(mr => mr.OperationTime)
// .Skip((int)skip)
// .Take((int)take)
// .ToListAsync();
return new PageData<MachineRecord>() { Desserts = MachineRecords, TotalDesserts = pagedData };
}
public int InsertMachineRecord(MachineRecord record)
{
record.MachineId = _setting.machineId;
return _connection.InsertWithInt32Identity(record);
}
public async Task<List<OperationVo<List<MachineRecord>>>> getReturnDrugInfoByRecords(List<MachineRecord> records)
{
List<OperationVo<List<MachineRecord>>> list = new();
for (int i = 0; i < records.Count; i++)
{
var record = records[i];
//var index = list.FindIndex(it => it.Drug.DrugId == record.DrugId && it.data.Count > 0 && it.data.First().ManuNo == record.ManuNo);
var index = list.FindIndex(it => it.Drug.DrugId == record.DrugId && it.data.First().ManuNo == record.ManuNo);
if (index > -1)
{
list[index].Quantity += record.CurrentReturnQuantity;
list[index].data.Add(record);
if (list[index].ChannelStocks.Count > 0)
{
list[index].ChannelStocks.First().ReturnQuantity += record.CurrentReturnQuantity;
}
}
else
{
//List<ChannelStock> stockList = await this.GetChannelStockByDrugId(record.DrugId, record.ManuNo);
List<ChannelStock> stockList = await this.GetChannelStockByDrugIdForReturn(record.DrugId, record.ManuNo);
// 当前药品的库存总量
var total = stockList.Sum(current => current.Quantity);
if (stockList.Count > 0)
{
stockList.First().ReturnQuantity = record.CurrentReturnQuantity;
}
list.Add(new OperationVo<List<MachineRecord>>()
{
Drug = record.Drug,
ChannelStocks = stockList,
data = new List<MachineRecord> { record },
Quantity = record.CurrentReturnQuantity,
StockQuantity = total,
});
}
}
return list;
}
public async Task<bool> ReturnDrugFinish(List<OperationVo<List<MachineRecord>>> datas)
{
//throw new NotImplementedException();
//还药完成
try
{
_connection.BeginTransaction();
if (datas.Count > 0)
{
datas = datas.Select(it =>
{
it.ChannelStocks = it.ChannelStocks.Where(cs => cs.ReturnQuantity > 0).ToList();
return it;
}).ToList();
if (datas.Count > 0)
{
foreach (var data in datas)
{
int sumQuantity = data.data.Sum(mr => mr.CurrentReturnQuantity);
//更新 库存
foreach (ChannelStock record in data.ChannelStocks)
{
record.Quantity = record.Quantity + record.ReturnQuantity;
record.Id = record.Id;
_connection.Update(record);
// 保存数据 还药记录
int acid = _connection.InsertWithInt32Identity(new MachineRecord()
{
MachineId = record.MachineId,
DrawerNo = record.DrawerNo,
ColNo = record.ColNo,
DrugId = record.DrugId,
ManuNo = record.ManuNo,
EffDate = !String.IsNullOrEmpty(record.EffDate) ? DateTime.ParseExact(record.EffDate, "yyyy-MM-dd", System.Globalization.CultureInfo.CurrentCulture) : null,
Operator = data.data.First().Operator,
OperationTime = DateTime.Now,
Quantity = record.ReturnQuantity,
Type = 31,
InvoiceId = data.data.First().InvoiceId,
GetId = data.data.First().GetId
});
//称重计数或称重+智能显示+管控药盒 类型需要 发26指令
if (record.BoardType == 5 || record.BoardType == 6)
{
//计数数量设置发送称重26指令
_portUtil.SetNumCount(record.DrawerNo, record.ColNo, record.ReturnQuantity);
Thread.Sleep(80);
}
// 获取更新完库存之后的药品库存
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(record.DrugId))
.ToListAsync();
//账册添加入库记录
int accountID = _connection.InsertWithInt32Identity(new AccountBook()
{
MachineId = _setting.machineId,
DrugId = record.DrugId,
ManuNo = record.ManuNo,
EffDate = !String.IsNullOrEmpty(record.EffDate) ? DateTime.ParseExact(record.EffDate, "yyyy-MM-dd", System.Globalization.CultureInfo.CurrentCulture) : null,
OperationTime = DateTime.Now,
Type = 31,
AddQuantity = record.ReturnQuantity,
Operator = _globalStateService.Operator.Id,
Reviewer = _globalStateService.Reviewer?.Id ?? _globalStateService.Operator.Id,
ManuStock = list.Where(it => it.ManuNo == record.ManuNo).Sum(it => it.Quantity),
TotalStock = list.Sum(it => it.Quantity),
InvoiceId = data.data.First().InvoiceId,
});
}
// 更新 取药记录 设置还药数量、状态
foreach (MachineRecord record in data.data)
{
record.ReturnQuantity1 = record.ReturnQuantity1 + record.CurrentReturnQuantity;
record.Id = record.Id;
record.Status = (record.Quantity - (record.ReturnQuantity1 + record.ReturnQuantity2 + sumQuantity)) <= 0 ? 2 : 1;
_connection.Update(record);
//更新药盒库存(原库存减已还药数)
if(record.BoxDrawer>0)
{
//查询药盒库位中对应的药品信息
ChannelStock csBox = _connection.ChannelStock.Where(cs => cs.MachineId.Equals(_setting.boxMachineId) && cs.DrugId == record.DrugId && cs.ManuNo == record.ManuNo && cs.DrawerNo == record.BoxDrawer && cs.ColNo == record.BoxColNo).FirstOrDefault();
if(csBox!=null)
{
csBox.Quantity = csBox.Quantity - sumQuantity;
int iUpdateBox= _connection.Update(csBox);
if(iUpdateBox<=0)
{
logger.Info("更新药品库存失败");
}
}
else
{
logger.Info($"未查询到药品{record.DrugId}批次{record.ManuNo}在库位{record.BoxDrawer}-{record.BoxColNo}中信息");
}
}
}
}
_connection.CommitTransaction();
}
}
else
{
_connection.RollbackTransaction();
return false;
}
return true;
}
catch (Exception ex)
{
logger.Error("还药完成保存数据库失败,错误:" + ex.Message);
_connection.RollbackTransaction();
return false;
}
}
#region
public async Task<List<ChannelStock>> GetReturnEmpty()
{
List<ChannelStock> channelStocks = new();
var query = _connection.ChannelStock.AsQueryable().Where(it => it.MachineId == _setting.machineId && it.DrawerType == 2);
channelStocks= await query.LoadWith(cs => cs.Drug).ToListAsync();
//获取可归还数量
return channelStocks;
//if (start != null && start != DateTime.MinValue)
//{
// query = query.Where(mr => mr.OperationTime > start);
//}
//if (end != null && end != DateTime.MinValue)
//{
// query = query.Where(mr => mr.OperationTime < end);
//}
//if (operatorId != 0)
//{
// query = query.Where(mr => mr.Operator == operatorId);
//}
//query = query.Where(mr => mr.Type == 2);
//query = query.Where(mr => mr.Status < 2);
//if (!String.IsNullOrEmpty(drugId))
//{
// query = query.Where(mr => mr.DrugId == drugId);
//}
//int pagedData = await query.CountAsync();
//List<MachineRecord> MachineRecords = await query.LoadWith(mr => mr.Drug)
// .LoadWith(mr => mr.OperatorUser)
// .OrderByDescending(mr => mr.OperationTime)
// .Skip((int)skip)
// .Take((int)take)
// .ToListAsync();
//return new PageData<MachineRecord>() { Desserts = MachineRecords, TotalDesserts = pagedData };
}
public async Task<PageData<MachineRecord>> getReturnEmptyInfoByRecords(ChannelStock records)
{
List<MachineRecord> machineRecords = new();
int pagedData = 0;
if (records != null && !string.IsNullOrEmpty(records.DrugId))
{
var query = _connection.MachineRecord.Where(it => it.DrugId == records.DrugId && it.MachineId == _setting.machineId && it.Type == 2 && it.Status != 2).AsQueryable();
machineRecords = await query.LoadWith(cs => cs.OperatorUser).ToListAsync();
pagedData = await query.CountAsync();
}
return new PageData<MachineRecord>() { Desserts = machineRecords, TotalDesserts = pagedData };
}
public async Task<bool> ReturnEmptyFinish(List<MachineRecord> datas, ChannelStock channelStock)
{
try
{
_connection.BeginTransaction();
// 更新数据 库存信息
channelStock.Quantity = channelStock.Quantity+ datas.Sum(it => it.CurrentReturnQuantity);
int iStock = _connection.Update(channelStock);
for (int i = 0; i < datas.Count; i++)
{
MachineRecord _MachineRecord = datas[i];
_MachineRecord.ReturnQuantity2 = _MachineRecord.ReturnQuantity2+ _MachineRecord.CurrentReturnQuantity;
_MachineRecord.Status = _MachineRecord.ReturnQuantity2 + _MachineRecord.ReturnQuantity1 >= _MachineRecord.Quantity ? 2 : 1;
// 更新数据 取药记录 设置还药数量、状态
_connection.Update(_MachineRecord);
// 保存数据 还药空瓶记录
int iMachineRecord = _connection.InsertWithInt32Identity(new MachineRecord() {
MachineId= channelStock.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 = _MachineRecord.Operator,
OperationTime = DateTime.Now,
Quantity = _MachineRecord.CurrentReturnQuantity,
Type = 32,
InvoiceId = _MachineRecord.InvoiceId,
GetId = _MachineRecord.GetId
});
////称重计数或称重+智能显示+管控药盒 类型需要 发26指令
//if (channelStock.BoardType == 5 || channelStock.BoardType == 6)
//{
// //计数数量设置发送称重26指令
// _portUtil.SetNumCount(channelStock.DrawerNo, channelStock.ColNo, channelStock.ReturnQuantity);
// Thread.Sleep(80);
//}
if (channelStock.BoardType.ToString().Contains("5"))
{
await _portUtil.WriteQuantityMethod(channelStock.Quantity + datas.Sum(it => it.CurrentReturnQuantity), channelStock.DrawerNo, channelStock.ColNo);
}
}
// 更新屏显库存
if (channelStock.BoardType == 5 || channelStock.BoardType == 35)
{
_portUtil.WriteQuantity(channelStock.DrawerNo, channelStock.ColNo, channelStock.Quantity);
}
_connection.CommitTransaction();
return true;
}
catch (Exception ex)
{
logger.Error("还空瓶完成保存数据库失败,错误:" + ex.Message);
_connection.RollbackTransaction();
return false;
}
}
public async Task<List<ChannelStock>> GetReturnEmptyWithCanReturnQuantiy()
{
List<ChannelStock> channelStocks = new();
var queryStock = _connection.ChannelStock.Where(cs => cs.DrawerType == 2 && cs.MachineId == _setting.machineId);
var queryMachineRecord = _connection.MachineRecord.Where(dm => dm.Type == 2 && dm.Status != 2);
var query = from cs in queryStock
join other in queryMachineRecord on cs.DrugId equals other.DrugId
where cs.MachineId==other.MachineId
group other by cs.DrugId into g
select new
{
ChannelStockId = g.Key,
SumValue = g.Sum(x => x.Quantity-x.ReturnQuantity1-x.ReturnQuantity2)
};
var results = await query.ToListAsync();
channelStocks= await queryStock.LoadWith(cs => cs.Drug).ToListAsync();
foreach (var itemStock in channelStocks)
{
foreach (var itemResult in results)
{
if(itemStock.DrugId==itemResult.ChannelStockId)
{
itemStock.CanReturnQuantity = itemResult.SumValue;
}
}
}
return channelStocks;
}
#endregion
}
}