更新提交

This commit is contained in:
maqiao 2025-06-24 08:55:34 +08:00
parent 3a9ec258a8
commit ac39763b13
49 changed files with 4552 additions and 83 deletions

View File

@ -7,7 +7,7 @@
</Found> </Found>
<NotFound> <NotFound>
<LayoutView Layout="@typeof(MainLayout)"> <LayoutView Layout="@typeof(MainLayout)">
<p role="alert">Sorry, there's nothing at this address.</p> <p role="alert">抱歉,找不到此页面。</p>
</LayoutView> </LayoutView>
</NotFound> </NotFound>
</Router> </Router>

View File

@ -28,6 +28,11 @@ namespace MasaBlazorApp3.DataAccess
public ITable<MachineRecord> MachineRecord => this.GetTable<MachineRecord>(); public ITable<MachineRecord> MachineRecord => this.GetTable<MachineRecord>();
public ITable<InOutInvoice> InOutInvoice => this.GetTable<InOutInvoice>(); public ITable<InOutInvoice> InOutInvoice => this.GetTable<InOutInvoice>();
public ITable<AccountBook> AccountBook => this.GetTable<AccountBook>(); public ITable<AccountBook> AccountBook => this.GetTable<AccountBook>();
public ITable<SettingManu> SettingManu => this.GetTable<SettingManu>();
public ITable<Plan> Plan => this.GetTable<Plan>();
public ITable<PlanDetails> PlanDetails => this.GetTable<PlanDetails>();
public ITable<AccountBookG2> AccountBookG2 => this.GetTable<AccountBookG2>();
public ITable<HkcChangeShifts> HkcChangeShifts => this.GetTable<HkcChangeShifts>();

View File

@ -6,9 +6,9 @@ using System.Threading.Tasks;
namespace MasaBlazorApp3.DataAccess namespace MasaBlazorApp3.DataAccess
{ {
public class ChannelStockWithDrawerCount<ChannelStock> public class ChannelStockWithDrawerCount<T>
{ {
public int[] DrawerArray { get; set; } public int[] DrawerArray { get; set; }
public List<ChannelStock> ChannelStocks { get; set; } = new List<ChannelStock>(); public List<T> ChannelStocks { get; set; } = new List<T>();
} }
} }

View File

@ -1,5 +1,6 @@
using System; using System;
using MasaBlazorApp3.Pojo; using MasaBlazorApp3.Pojo;
using MasaBlazorApp3.Pojo.Vo;
namespace MasaBlazorApp3.DataAccess.Dao namespace MasaBlazorApp3.DataAccess.Dao
{ {
@ -31,5 +32,28 @@ namespace MasaBlazorApp3.DataAccess.Dao
public Task<bool> DrawerCheckFinish(List<ChannelStock> Stocks); public Task<bool> DrawerCheckFinish(List<ChannelStock> Stocks);
//抽屉获取库存数据--药品绑定 //抽屉获取库存数据--药品绑定
Task<ChannelStockWithDrawerCount<ChannelStock>> GetChannelStockByBiaoDing(int DrawerNo, int Quantity=0); Task<ChannelStockWithDrawerCount<ChannelStock>> GetChannelStockByBiaoDing(int DrawerNo, int Quantity=0);
//手术室药箱获取绑定数据
Task<PageMultiData<ChannelList, Plan>> GetAllChannelListWithPlan(int? take, int? skip);
/// <summary>
/// 手术室药箱绑定套餐
/// </summary>
/// <returns></returns>
Task<bool> BindBox(ChannelList channelList);
/// <summary>
/// 手术室药箱解绑套餐
/// </summary>
/// <param name="list"></param>
/// <returns></returns>
Task<bool> UnBindBox(ChannelList list);
//获取手术室药箱中所有要补药的数据
Task<PageData<ChannelList>> GetAllBoxAddDrug(int? take, int? skip);
//手术室药箱补药获取毒麻柜中的药品信息
Task<List<BoxTakeVo>> getTakeInfoByBox(ChannelList cl);
//手术室药箱补药完成
Task<bool> BoxTakeFinish(List<BoxTakeVo> datas);
//手术室药箱入库
Task<PageData<ChannelList>> GetBoxWaitInfo(int? take, int? skip);
//手术室药箱入库获取待入库明细
Task<List<BoxTakeVo>> getBoxWaitByBox(ChannelList cl);
} }
} }

View File

@ -0,0 +1,16 @@
using MasaBlazorApp3.Pojo;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace MasaBlazorApp3.DataAccess.Dao
{
public interface IHkcChangeShiftsDao
{
//查询交接班记录
public Task<PageData<HkcChangeShifts>> GetChangeShiftRecordAsync(DateTime start, DateTime end, int? take, int? skip);
}
}

View File

@ -26,5 +26,11 @@ namespace MasaBlazorApp3.DataAccess.Dao
public Task<bool> OrderReturnFinish(List<OperationVo<MachineRecord>> datas, string OrderrNo); public Task<bool> OrderReturnFinish(List<OperationVo<MachineRecord>> datas, string OrderrNo);
public Task<List<OperationVo<MachineRecord>>> getReturnInfoByOrderNo(string OrderrNo); public Task<List<OperationVo<MachineRecord>>> getReturnInfoByOrderNo(string OrderrNo);
//获取药箱中的用药信息
public Task<PageData<OrderInfo>> GetAllOrderInfoByBox(int box,string OrderrNo, DateTime OrderDate, int? take, int? skip);
//获取所有药箱号
public Task<int[]> GetDrawerNum(string machineId);
//核对处方
public Task<bool> CheckOrderInfo(IList<OrderInfo> selectedOrderInfos, int DrawerNo);
} }
} }

View File

@ -0,0 +1,67 @@
using MasaBlazorApp3.Pojo;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace MasaBlazorApp3.DataAccess.Dao
{
public interface IPlanDao
{
/// <summary>
/// 获取所有套餐数据
/// </summary>
/// <returns></returns>
Task<PageMultiData<Plan,DrugInfo>> GetAllPlanInfo();
/// <summary>
/// 根据套餐ID获取套餐数据
/// </summary>
/// <param name="Id"></param>
/// <returns></returns>
Task<Plan> GetPlanById(int Id);
/// <summary>
/// 新增套餐
/// </summary>
/// <param name="plan"></param>
/// <returns></returns>
Task<bool> InsertPlanInfo(Plan plan);
/// <summary>
/// 更新套餐
/// </summary>
/// <param name="plan"></param>
/// <returns></returns>
Task<bool> UpdatePlanInfo(Plan plan);
/// <summary>
/// 删除套餐
/// </summary>
/// <param name="planId"></param>
/// <returns></returns>
Task<bool> DeletePlanInfo(int planID);
/// <summary>
/// 向套餐添加药品
/// </summary>
/// <param name="details"></param>
/// <returns></returns>
Task<bool> AddPlanDetail(PlanDetails details);
/// <summary>
/// 修改套餐中的药品
/// </summary>
/// <param name="details"></param>
/// <returns></returns>
Task<bool> UpdatePlanDetail(PlanDetails details);
/// <summary>
/// 删除套餐中的药品
/// </summary>
/// <param name="details"></param>
/// <returns></returns>
Task<bool> DeletePlanDetail(PlanDetails planID);
/// <summary>
/// 根据套餐明细获取套餐
/// </summary>
/// <param name="details"></param>
/// <returns></returns>
bool CheckDrugById(PlanDetails details);
}
}

View File

@ -0,0 +1,14 @@
using MasaBlazorApp3.Pojo;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace MasaBlazorApp3.DataAccess.Dao
{
interface ISettingManuDao
{
public Task<List<SettingManu>> GetMenuItemsAsync();
}
}

View File

@ -2,12 +2,14 @@
using LinqToDB; using LinqToDB;
using log4net; using log4net;
using MasaBlazorApp3.DataAccess.Dao; using MasaBlazorApp3.DataAccess.Dao;
using MasaBlazorApp3.Pages;
using MasaBlazorApp3.Pojo; using MasaBlazorApp3.Pojo;
using MasaBlazorApp3.Pojo.Config; using MasaBlazorApp3.Pojo.Config;
using MasaBlazorApp3.Pojo.Vo; using MasaBlazorApp3.Pojo.Vo;
using MasaBlazorApp3.Port; using MasaBlazorApp3.Port;
using Microsoft.Extensions.Options; using Microsoft.Extensions.Options;
using Mysqlx.Crud; using Mysqlx.Crud;
using System.Collections.Generic;
using System.Data; using System.Data;
namespace MasaBlazorApp3.DataAccess.Impl namespace MasaBlazorApp3.DataAccess.Impl
@ -183,7 +185,7 @@ namespace MasaBlazorApp3.DataAccess.Impl
//效期转换出错 //效期转换出错
if (stock.ManuNo != null) if (stock.ManuNo != null)
{ {
string[] idate= stock.EffDate.Split('/'); string[] idate = stock.EffDate.Split('/');
foreach (string iS in idate) foreach (string iS in idate)
{ {
if (!string.IsNullOrEmpty(iS.Replace(" ", "").Trim())) if (!string.IsNullOrEmpty(iS.Replace(" ", "").Trim()))
@ -191,13 +193,13 @@ namespace MasaBlazorApp3.DataAccess.Impl
switch (iS.Replace(" ", "").Trim().Length) switch (iS.Replace(" ", "").Trim().Length)
{ {
case 4: case 4:
EffDate = iS.Replace(" ", "").Trim(); EffDate = iS.Replace(" ", "").Trim();
break; break;
case 2: case 2:
EffDate += "-" + iS.Replace(" ", "").Trim(); EffDate += "-" + iS.Replace(" ", "").Trim();
break; break;
case 1: case 1:
EffDate += "-0"+iS.Replace(" ", "").Trim(); EffDate += "-0" + iS.Replace(" ", "").Trim();
break; break;
} }
} }
@ -208,25 +210,25 @@ namespace MasaBlazorApp3.DataAccess.Impl
} }
else else
{ {
EffDate=dEffDate.ToString("yyyy-MM-dd"); EffDate = dEffDate.ToString("yyyy-MM-dd");
} }
// 出入库记录 // 出入库记录
int mid = _connection.InsertWithInt32Identity(new MachineRecord() int mid = _connection.InsertWithInt32Identity(new MachineRecord()
{ {
MachineId = _setting.machineId, MachineId = _setting.machineId,
DrawerNo = stock.DrawerNo, DrawerNo = stock.DrawerNo,
ColNo = stock.ColNo, ColNo = stock.ColNo,
DrugId = stock.DrugId, DrugId = stock.DrugId,
ManuNo = ManuNo, ManuNo = ManuNo,
EffDate = !String.IsNullOrEmpty(EffDate) ? DateTime.ParseExact(EffDate, "yyyy-MM-dd", System.Globalization.CultureInfo.CurrentCulture) : null, EffDate = !String.IsNullOrEmpty(EffDate) ? DateTime.ParseExact(EffDate, "yyyy-MM-dd", System.Globalization.CultureInfo.CurrentCulture) : null,
OperationTime = DateTime.Now, OperationTime = DateTime.Now,
Type = type, Type = type,
Quantity = type == 1 ? stock.AddQuantity : stock.TakeQuantity, Quantity = type == 1 ? stock.AddQuantity : stock.TakeQuantity,
Operator = _globalStateService.Operator.Id, Operator = _globalStateService.Operator.Id,
Reviewer = _globalStateService.Reviewer?.Id ?? _globalStateService.Operator.Id, Reviewer = _globalStateService.Reviewer?.Id ?? _globalStateService.Operator.Id,
InvoiceId = InvoiceId InvoiceId = InvoiceId
}); });
// 更新库存 // 更新库存
var stockQ = _connection.ChannelStock.Where(cs => cs.Id == stock.Id) var stockQ = _connection.ChannelStock.Where(cs => cs.Id == stock.Id)
.Set(cs => cs.Quantity, type == 1 ? stock.Quantity + stock.AddQuantity : stock.Quantity - stock.TakeQuantity); .Set(cs => cs.Quantity, type == 1 ? stock.Quantity + stock.AddQuantity : stock.Quantity - stock.TakeQuantity);
@ -399,7 +401,7 @@ namespace MasaBlazorApp3.DataAccess.Impl
{ {
_connection.BeginTransaction(); _connection.BeginTransaction();
string InvoiceId = "DRAWER_" + CurrentTimeMillis(); string InvoiceId = "CHECK_" + CurrentTimeMillis();
var flag = true; var flag = true;
for (var i = 0; i < Stocks.Count; i++) for (var i = 0; i < Stocks.Count; i++)
{ {
@ -459,7 +461,10 @@ namespace MasaBlazorApp3.DataAccess.Impl
}); });
// 更新库存 // 更新库存
var stockQ = _connection.ChannelStock.Where(cs => cs.Id == stock.Id) var stockQ = _connection.ChannelStock.Where(cs => cs.Id == stock.Id)
.Set(cs => cs.Quantity, stock.CheckQuantity); .Set(cs => cs.Quantity, stock.CheckQuantity)
.Set(cs => cs.ManuNo, ManuNo)
.Set(cs => cs.EffDate, EffDate)
.Set(cs => cs.Dmnguid, stock.drugManuNo?.Id);
int r = stockQ.Update(); int r = stockQ.Update();
// 获取更新完库存之后的药品库存 // 获取更新完库存之后的药品库存
@ -544,6 +549,623 @@ namespace MasaBlazorApp3.DataAccess.Impl
.ToListAsync(); .ToListAsync();
return new ChannelStockWithDrawerCount<ChannelStock>() { DrawerArray = ints, ChannelStocks = channelStocks }; return new ChannelStockWithDrawerCount<ChannelStock>() { DrawerArray = ints, ChannelStocks = channelStocks };
} }
//手术室药箱获取绑定数据
public async Task<PageMultiData<ChannelList, Plan>> GetAllChannelListWithPlan(int? take, int? skip)
{
var query = _connection.ChannelList.AsQueryable()
.Where(cl => cl.MachineId == _setting.boxMachineId);
//.LoadWith(cl=>cl.PlanInfo);
int pagedData = await query.CountAsync();
List<ChannelList> list = await query
.OrderBy((cl) => cl.DrawerNo)
.Skip((int)skip)
.Take((int)take)
.ToListAsync();
if (list != null && list.Count > 0)
{
for (int i = 0; i < list.Count; i++)
{
if (!string.IsNullOrEmpty(list[i].DrugId))
{
list[i].PlanInfo = _connection.Plan.AsQueryable().Where(p => p.Id == Convert.ToInt32(list[i].DrugId)).FirstOrDefault();
}
}
}
var other = _connection.Plan.AsQueryable().Where(p => p.UseState == 1 && p._PlanDetails.Count > 0);
List<Plan> planInfos = await other
.LoadWith(p => p._PlanDetails.Where(pd => pd.UseState == 1))
.OrderBy((p) => p.Id)
.ToListAsync();
if (planInfos != null && planInfos.Count > 0)
{
for (int i = 0; i < planInfos.Count(); i++)
{
for (int j = 0; j < planInfos[i]._PlanDetails.Count(); j++)
{
planInfos[i]._PlanDetails[j]._DrugInfo =
_connection.DrugInfo.AsQueryable().Where(di => di.DrugId == planInfos[i]._PlanDetails[j].DrugId).First();
}
}
}
return new PageMultiData<ChannelList, Plan>()
{
TotalDesserts = pagedData,
Desserts = list,
Other = planInfos
};
}
/// <summary>
/// 手术室药箱绑定套餐
/// </summary>
/// <returns></returns>
public async Task<bool> BindBox(ChannelList list)
{
try
{
_connection.BeginTransaction();
bool bFlag = true;
var q = _connection.ChannelList
.Where(cs => cs.Id == list.Id).Set(cs => cs.DrugId, list.PlanInfo.Id.ToString());
//将套餐中的药品信息写入channelStock
//查询套餐中药品信息
var query = _connection.PlanDetails.AsQueryable().Where(p => p.PlanId == list.PlanInfo.Id);
List<PlanDetails> planInfos = await query.ToListAsync();
if (planInfos != null && planInfos.Count > 0)
{
for (int i = 0; i < planInfos.Count; i++)
{
int mid = await _connection.InsertAsync(new ChannelStock()
{
Id = Guid.NewGuid().ToString(),
ListId = list.Id,
MachineId = list.MachineId,
DrawerNo = list.DrawerNo,
DrugId = planInfos[i].DrugId.ToString(),
BaseQuantity = planInfos[i].BaseQuantity,
});
if (mid > 0)
{
bFlag = true;
}
else
{
bFlag = false;
break;
}
}
}
var r = await q.UpdateAsync();
if (bFlag && r > 0)
{
_connection.CommitTransaction();
return true;
}
else
{
_connection.RollbackTransaction();
return false;
}
}
catch (Exception ex)
{
_connection.RollbackTransaction();
logger.Info($"绑定套餐异常{ex.Message}");
return false;
}
}
/// <summary>
/// 手术室药箱解绑套餐
/// </summary>
/// <param name="list"></param>
/// <returns></returns>
public async Task<bool> UnBindBox(ChannelList list)
{
try
{
_connection.BeginTransaction();
var r = await _connection.ChannelList
.Where(cs => cs.Id == list.Id)
.Set(cs => cs.DrugId, String.Empty)
.UpdateAsync();
var cs = await _connection.ChannelStock.Where(cs => cs.ListId == list.Id).DeleteAsync();
if (r > 0 && cs > 0)
{
_connection.CommitTransaction();
return true;
}
else
{
_connection.RollbackTransaction();
return false;
}
}
catch (Exception ex)
{
_connection.RollbackTransaction();
logger.Info($"手术室药箱解绑异常:{ex.Message}");
return false;
}
}
//获取手术室药箱中所有要补药的数据
public async Task<PageData<ChannelList>> GetAllBoxAddDrug(int? take, int? skip)
{
try
{
List<ChannelList> channelLists = new List<ChannelList>();
var query = _connection.ChannelStock//.AsQueryable()
.Where(cs => cs.MachineId == _setting.boxMachineId&&cs.BoxState==1)
.GroupBy(cs => new { cs.DrawerNo, cs.DrugId })
.Select(g => new
{
DrawerNo = g.Key.DrawerNo,
DrugId = g.Key.DrugId,
sumQuantity = g.Sum(cs => cs.Quantity)
})
.ToList();
var queryChannelStock = _connection.ChannelStock.AsQueryable()
.Where(cs => cs.MachineId == _setting.boxMachineId&&cs.BoxState==1)
.LoadWith(cs => cs.Drug).ToList();
var queryList = await _connection.ChannelList.AsQueryable().Where(cl => cl.MachineId == _setting.boxMachineId).ToListAsync();
for (int i = 0; i < queryList.Count; i++)
{
foreach (var item in query)
{
if (queryList[i].DrawerNo == item.DrawerNo)
{
ChannelStock stock = queryChannelStock.Where(cs => cs.DrawerNo == item.DrawerNo && cs.DrugId == item.DrugId && cs.BaseQuantity > item.sumQuantity).FirstOrDefault();
if (stock != null)
{
stock.NeedQuantity = stock.BaseQuantity-item.sumQuantity;
queryList[i].ChannelStocks.Add(stock);
}
}
}
if (queryList[i].ChannelStocks != null && queryList[i].ChannelStocks.Count > 0)
{
channelLists.Add(queryList[i]);
}
}
int pagedData = channelLists.Count;
return new PageData<ChannelList>()
{
TotalDesserts = pagedData,
Desserts = channelLists
};
}
catch (Exception ex)
{
logger.Info($"获取药箱中补药数据失败{ex.Message}");
return null;
}
}
//手术室药箱补药获取毒麻柜中的药品信息
public async Task<List<BoxTakeVo>> getTakeInfoByBox(ChannelList cl)
{
try
{
List<BoxTakeVo> tempData = new();
List<BoxTakeVo> tempData2 = new();
var flag = true;
for (int i = 0; i < cl.ChannelStocks.Count; i++)
{
ChannelStock boxCs = cl.ChannelStocks[i];
// 当前药品取药数量
var Quantity = boxCs.NeedQuantity;
List<ChannelStock> stockList = await _connection.ChannelStock
.Where(cs=>cs.MachineId==_setting.machineId&&cs.DrawerType==1&&cs.DrugId==boxCs.DrugId&&cs.Quantity>0&&cs.ManuNo!=null)
.AsQueryable()
.OrderBy(cs=>cs.EffDate).ToListAsync();
// 当前药品的库存总量
var total = stockList.Sum(current => current.Quantity);
tempData2.Add(new BoxTakeVo()
{
Drug = boxCs.Drug,
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 BoxTakeVo()
{
Drug = boxCs.Drug,
BoxDetail= boxCs,
ChannelStock = stock,
StockQuantity = total,
Quantity = stock.Quantity,
});
Quantity -= stock.Quantity;
}
else
{
//取药数量小于库存
tempData.Add(new BoxTakeVo()
{
Drug = boxCs.Drug,
BoxDetail = boxCs,
ChannelStock = stock,
StockQuantity = total,
Quantity = Quantity,
});
Quantity = 0;
}
}
}
else
{
// 库存不足
flag = false;
}
}
}
if (flag)
{
return tempData;
}
else
{
return tempData2;
}
return tempData;
}
catch (Exception ex)
{
logger.Info($"获取数据异常{ex.Message}");
return null;
}
}
//手术室药箱补药完成
public async Task<bool> BoxTakeFinish(List<BoxTakeVo> datas)
{
try
{
_connection.BeginTransaction();
var flag = true;
// 更新处方状态
//int r1 = _connection.ChannelStock.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 boxTakeVo = datas[i];
var EffDate = boxTakeVo.ChannelStock.EffDate;
if (!DateTime.TryParse(boxTakeVo.ChannelStock.EffDate, out DateTime dEffDate))
{
//效期转换出错
if (boxTakeVo.ChannelStock.EffDate != null)
{
string[] idate = boxTakeVo.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 = boxTakeVo.ChannelStock.DrawerNo,
ColNo = boxTakeVo.ChannelStock.ColNo,
DrugId = boxTakeVo.ChannelStock.DrugId,
ManuNo = boxTakeVo.ChannelStock.ManuNo,
EffDate = !String.IsNullOrEmpty(EffDate) ? DateTime.ParseExact(EffDate, "yyyy-MM-dd", System.Globalization.CultureInfo.CurrentCulture) : null,
OperationTime = DateTime.Now,
Type = 2,
Quantity = boxTakeVo.GetQuantity,
Operator = _globalStateService.Operator.Id,
Reviewer = _globalStateService.Reviewer?.Id ?? _globalStateService.Operator.Id,
InvoiceId = boxTakeVo.BoxDetail.Id.ToString(),
});
// 更新库存
int r = _connection.ChannelStock.Where(cs => cs.Id == boxTakeVo.ChannelStock.Id)
.Set(cs => cs.Quantity, boxTakeVo.ChannelStock.Quantity - boxTakeVo.GetQuantity)
.Update();
#region ,
// 获取更新完库存之后的药品库存
//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(boxTakeVo.ChannelStock.DrugId))
// .ToListAsync();
// 保存账册,给药箱补药不记录出库账册
//int acid = _connection.InsertWithInt32Identity(new AccountBook()
//{
// MachineId = _setting.machineId,
// DrugId = boxTakeVo.ChannelStock.DrugId,
// ManuNo = boxTakeVo.ChannelStock.ManuNo,
// EffDate = !String.IsNullOrEmpty(EffDate) ? DateTime.ParseExact(EffDate, "yyyy-MM-dd", System.Globalization.CultureInfo.CurrentCulture) : null,
// OperationTime = DateTime.Now,
// Type = 2,
// OutQuantity = boxTakeVo.GetQuantity,
// AddQuantity = 0,
// Operator = _globalStateService.Operator.Id,
// Reviewer = _globalStateService.Reviewer?.Id ?? _globalStateService.Operator.Id,
// ManuStock = list.Where(it => it.ManuNo == boxTakeVo.ChannelStock.ManuNo).Sum(it => it.Quantity),
// TotalStock = list.Sum(it => it.Quantity),
// //InvoiceId = orderTakeVo.OrderDetail.Id.ToString()
//});
#endregion
//更新药箱中的药品数量
int boxID = _connection.Insert(new ChannelStock() {
Id = Guid.NewGuid().ToString(),
ListId = boxTakeVo.BoxDetail.Id,
MachineId = _setting.boxMachineId,
DrawerNo = boxTakeVo.BoxDetail.DrawerNo,
AddToQuantity = boxTakeVo.GetQuantity,
NeedQuantity=0,
DrugId = boxTakeVo.ChannelStock.DrugId,
ManuNo = boxTakeVo.ChannelStock.ManuNo,
EffDate= boxTakeVo.ChannelStock.EffDate,
BaseQuantity = boxTakeVo.BoxDetail.BaseQuantity,
BoardType = boxTakeVo.BoxDetail.BoardType,
BoxState= 2 //补药完成
});
// 手术室药箱入库记录
int boxMId = _connection.InsertWithInt32Identity(new MachineRecord()
{
MachineId = _setting.machineId,
DrawerNo = boxTakeVo.BoxDetail.DrawerNo,
DrugId = boxTakeVo.ChannelStock.DrugId,
ManuNo = boxTakeVo.ChannelStock.ManuNo,
EffDate = !String.IsNullOrEmpty(EffDate) ? DateTime.ParseExact(EffDate, "yyyy-MM-dd", System.Globalization.CultureInfo.CurrentCulture) : null,
OperationTime = DateTime.Now,
Type = 1,
Quantity = boxTakeVo.GetQuantity,
Operator = _globalStateService.Operator.Id,
Reviewer = _globalStateService.Reviewer?.Id ?? _globalStateService.Operator.Id,
InvoiceId = boxTakeVo.ChannelStock.Id.ToString(),
});
int totalQuantity = _connection.PlanDetails.Where(p => p.PlanId == Convert.ToInt32(boxTakeVo.BoxDetail.DrugId)).Sum(p => p.BaseQuantity);
int list=_connection.ChannelList.Where(cl => cl.Id == boxTakeVo.BoxDetail.Id)
.Set(cl => cl.TotalQuantity, totalQuantity)
.Update();
int delResutl = await _connection.ChannelStock.Where(cs => cs.Id == boxTakeVo.BoxDetail.Id).DeleteAsync();
if (mid > 0 && r > 0 && boxID > 0&& boxMId>0&& delResutl>0&& list>0)
{
if (boxTakeVo.ChannelStock.BoardType.ToString().Contains("5"))
{
await _portUtil.WriteQuantityMethod(boxTakeVo.ChannelStock.Quantity - boxTakeVo.GetQuantity, boxTakeVo.ChannelStock.DrawerNo, boxTakeVo.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<ChannelList>> GetBoxWaitInfo(int? take, int? skip)
{
try
{
List<ChannelList> channelLists = new List<ChannelList>();
var query = _connection.ChannelStock//.AsQueryable()
.Where(cs => cs.MachineId == _setting.boxMachineId && cs.BoxState == 2)
.GroupBy(cs => new { cs.DrawerNo, cs.DrugId })
.Select(g => new
{
DrawerNo = g.Key.DrawerNo,
DrugId = g.Key.DrugId,
sumQuantity = g.Sum(cs => cs.Quantity)
})
.ToList();
var queryChannelStock = _connection.ChannelStock.AsQueryable()
.Where(cs => cs.MachineId == _setting.boxMachineId && cs.BoxState == 2)
.LoadWith(cs => cs.Drug).ToList();
var queryList = await _connection.ChannelList.AsQueryable().Where(cl => cl.MachineId == _setting.boxMachineId).ToListAsync();
for (int i = 0; i < queryList.Count; i++)
{
foreach (var item in query)
{
if (queryList[i].DrawerNo == item.DrawerNo)
{
ChannelStock stock = queryChannelStock.Where(cs => cs.DrawerNo == item.DrawerNo && cs.DrugId == item.DrugId && cs.BaseQuantity > item.sumQuantity).FirstOrDefault();
if (stock != null)
{
stock.NeedQuantity = stock.BaseQuantity - item.sumQuantity;
queryList[i].ChannelStocks.Add(stock);
}
}
}
if (queryList[i].ChannelStocks != null && queryList[i].ChannelStocks.Count > 0)
{
channelLists.Add(queryList[i]);
}
}
int pagedData = channelLists.Count;
return new PageData<ChannelList>()
{
TotalDesserts = pagedData,
Desserts = channelLists
};
}
catch (Exception ex)
{
logger.Info($"获取药箱中补药数据失败{ex.Message}");
return null;
}
}
//手术室药箱入库获取待入库明细
public async Task<List<BoxTakeVo>> getBoxWaitByBox(ChannelList cl)
{
try
{
List<BoxTakeVo> tempData = new();
List<BoxTakeVo> tempData2 = new();
var flag = true;
for (int i = 0; i < cl.ChannelStocks.Count; i++)
{
ChannelStock boxCs = cl.ChannelStocks[i];
// 当前药品取药数量
var Quantity = boxCs.NeedQuantity;
List<ChannelStock> stockList = await _connection.ChannelStock
.Where(cs => cs.MachineId == _setting.machineId && cs.DrawerType == 1 && cs.DrugId == boxCs.DrugId && cs.Quantity > 0 && cs.ManuNo != null)
.AsQueryable()
.OrderBy(cs => cs.EffDate).ToListAsync();
// 当前药品的库存总量
var total = stockList.Sum(current => current.Quantity);
tempData2.Add(new BoxTakeVo()
{
Drug = boxCs.Drug,
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 BoxTakeVo()
{
Drug = boxCs.Drug,
BoxDetail = boxCs,
ChannelStock = stock,
StockQuantity = total,
Quantity = stock.Quantity,
});
Quantity -= stock.Quantity;
}
else
{
//取药数量小于库存
tempData.Add(new BoxTakeVo()
{
Drug = boxCs.Drug,
BoxDetail = boxCs,
ChannelStock = stock,
StockQuantity = total,
Quantity = Quantity,
});
Quantity = 0;
}
}
}
else
{
// 库存不足
flag = false;
}
}
}
if (flag)
{
return tempData;
}
else
{
return tempData2;
}
return tempData;
}
catch (Exception ex)
{
logger.Info($"获取数据异常{ex.Message}");
return null;
}
}
} }
} }

View File

@ -29,7 +29,19 @@ namespace MasaBlazorApp3.DataAccess.Impl
public bool DeleteDrugManuNo(string id) public bool DeleteDrugManuNo(string id)
{ {
return _connection.DrugManuNo.Where(dm => dm.Id == id).Delete() > 0; if (!string.IsNullOrEmpty(id))
{
int manuNo= _connection.DrugManuNo.Where(dm => dm.Id == id).Count();
if (manuNo > 0)
{
return _connection.DrugManuNo.Where(dm => dm.Id == id).Delete() > 0;
}
else return true;
}
else
{
return true;
}
} }
public bool UpdateDrugManuNo(DrugManuNo drugManuNo) public bool UpdateDrugManuNo(DrugManuNo drugManuNo)

View File

@ -0,0 +1,51 @@
using LinqToDB;
using log4net;
using MasaBlazorApp3.DataAccess.Dao;
using MasaBlazorApp3.Pojo;
using MasaBlazorApp3.Pojo.Config;
using MasaBlazorApp3.Port;
using Microsoft.Extensions.Options;
using System;
using System.Collections.Generic;
using System.Data.Common;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace MasaBlazorApp3.DataAccess.Impl
{
public class HkcChangeShiftsDao: IHkcChangeShiftsDao
{
private readonly AppDataConnection _connection;
private readonly SettingConfig _setting;
private readonly ILog logger = LogManager.GetLogger(typeof(HkcChangeShifts));
private readonly PortUtil _portUtil;
public HkcChangeShiftsDao(AppDataConnection connection, IOptions<SettingConfig> setting, PortUtil portUtil)
{
_connection = connection;
_setting = setting.Value;
_portUtil = portUtil;
}
public async Task<PageData<HkcChangeShifts>> GetChangeShiftRecordAsync(DateTime start, DateTime end, int? take, int? skip)
{
var query = _connection.HkcChangeShifts.AsQueryable().Where(it => it.MachineId.Equals(_setting.machineId));
if (start != null && start != DateTime.MinValue)
{
query = query.Where(mr => mr.optDate > start);
}
if (end != null && end != DateTime.MinValue)
{
query = query.Where(mr => mr.optDate < end);
}
int pagedData = await query.CountAsync();
List<HkcChangeShifts> Records = await query
.OrderByDescending(mr => mr.optDate)
.Skip((int)skip)
.Take((int)take)
.ToListAsync();
return new PageData<HkcChangeShifts>() { Desserts = Records, TotalDesserts = pagedData };
}
}
}

View File

@ -1,6 +1,7 @@
using LinqToDB; using LinqToDB;
using LinqToDB.SqlQuery; using LinqToDB.SqlQuery;
using log4net; using log4net;
using log4net.Util;
using MasaBlazorApp3.DataAccess.Dao; using MasaBlazorApp3.DataAccess.Dao;
using MasaBlazorApp3.Pages; using MasaBlazorApp3.Pages;
using MasaBlazorApp3.Pojo; using MasaBlazorApp3.Pojo;
@ -28,7 +29,7 @@ namespace MasaBlazorApp3.DataAccess.Impl
private readonly ILog logger = LogManager.GetLogger(typeof(OrderInfoDao)); private readonly ILog logger = LogManager.GetLogger(typeof(OrderInfoDao));
private readonly PortUtil _portUtil; private readonly PortUtil _portUtil;
public OrderInfoDao(AppDataConnection connection, IOptions<SettingConfig> setting, GlobalStateService globalStateService,PortUtil portUtil) public OrderInfoDao(AppDataConnection connection, IOptions<SettingConfig> setting, GlobalStateService globalStateService, PortUtil portUtil)
{ {
_connection = connection; _connection = connection;
_setting = setting.Value; _setting = setting.Value;
@ -54,7 +55,7 @@ namespace MasaBlazorApp3.DataAccess.Impl
{ {
query = query.Where(oi => oi.OrderNo.Equals(OrderrNo)); query = query.Where(oi => oi.OrderNo.Equals(OrderrNo));
} }
if(OrderDate !=null && OrderDate!= DateTime.MinValue) if (OrderDate != null && OrderDate != DateTime.MinValue)
{ {
query = query.Where(oi => oi.OrderDate.Date.Equals(OrderDate.Date)); query = query.Where(oi => oi.OrderDate.Date.Equals(OrderDate.Date));
} }
@ -67,6 +68,8 @@ namespace MasaBlazorApp3.DataAccess.Impl
int pagedData = await query.CountAsync(); int pagedData = await query.CountAsync();
List<OrderInfo> list = await query List<OrderInfo> list = await query
.LoadWith(oi => oi.Detail)
.LoadWith(oi => oi.Detail.Drug)
.OrderBy((oi) => oi.RecvDate) .OrderBy((oi) => oi.RecvDate)
.ThenBy((oi => oi.OrderNo)) .ThenBy((oi => oi.OrderNo))
.Skip((int)skip) .Skip((int)skip)
@ -115,7 +118,8 @@ namespace MasaBlazorApp3.DataAccess.Impl
{ {
query = query.Where(cs => cs.ManuNo.Equals(ManuNo)); query = query.Where(cs => cs.ManuNo.Equals(ManuNo));
} }
} else }
else
{ {
if (!String.IsNullOrEmpty(ManuNo)) if (!String.IsNullOrEmpty(ManuNo))
{ {
@ -218,7 +222,7 @@ namespace MasaBlazorApp3.DataAccess.Impl
_connection.BeginTransaction(); _connection.BeginTransaction();
var flag = true; var flag = true;
// 更新处方状态 // 更新处方状态
int r1 = _connection.OrderInfo.Where(oi => oi.OrderNo == datas.First().OrderDetail.OrderNo) int r1 = _connection.OrderInfo.Where(oi => oi.OrderNo == datas.First().OrderDetail.OrderNo)
.Set(oi => oi.Status, 1) .Set(oi => oi.Status, 1)
.Update(); .Update();
if (!(r1 > 0)) if (!(r1 > 0))
@ -465,10 +469,11 @@ namespace MasaBlazorApp3.DataAccess.Impl
.Set(cs => cs.Status, 2) .Set(cs => cs.Status, 2)
.Set(cs => cs.ReturnQuantity1, operationVo.data.Quantity).Update(); .Set(cs => cs.ReturnQuantity1, operationVo.data.Quantity).Update();
if(r2 > 0) if (r2 > 0)
{ {
} else }
else
{ {
flag = false; flag = false;
break; break;
@ -540,7 +545,7 @@ namespace MasaBlazorApp3.DataAccess.Impl
}); });
if (mid > 0 && r > 0 && acid > 0) if (mid > 0 && r > 0 && acid > 0)
{ {
if(channelStock.BoardType.ToString().Contains("5")) if (channelStock.BoardType.ToString().Contains("5"))
{ {
await _portUtil.WriteQuantityMethod(channelStock.Quantity - channelStock.ReturnQuantity, channelStock.DrawerNo, channelStock.ColNo); await _portUtil.WriteQuantityMethod(channelStock.Quantity - channelStock.ReturnQuantity, channelStock.DrawerNo, channelStock.ColNo);
} }
@ -573,5 +578,271 @@ namespace MasaBlazorApp3.DataAccess.Impl
return false; 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 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.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="machineId"></param>
/// <returns></returns>
public async Task<int[]> GetDrawerNum(string machineId)
{
int[] ints = _connection.ChannelStock.Where(cs => cs.MachineId == machineId).GroupBy(cs => cs.DrawerNo).Select(cs => cs.Key).ToArray();
return ints;
}
//核对处方
public async Task<bool> CheckOrderInfo(IList<OrderInfo> selectedOrderInfos,int DrawerNo)
{
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];
//更新处方状态
if (oi.state == 1)
{
int iUpdate= _connection.OrderInfo.Where(o=>o.OrderNo==oi.OrderNo).Set(o=>o.state,2).Update();
_connection.Insert(new OrderFinish()
{
OrderNo = oi.OrderNo,
PatientId = oi.PatientId,
Pharmacy = oi.Pharmacy,
State = 2,
//WinNo = DrawerNo + 1 + "号手术间",
Operator = _globalStateService.Operator.NickName,
});
}
int drawerNo = DrawerNo + 1;
ChannelStock cs =_connection.ChannelStock.AsQueryable()
.Where(cs => cs.DrugId == oi.Detail.DrugId
&& cs.ManuNo == oi.Detail.SetManuNo
// && cs.EffDate == oi._OrderDetail.SetEffDate
&& cs.MachineId.Equals(_setting.boxMachineId)
&& cs.DrawerNo == drawerNo
&& cs.Quantity >= oi.Detail.Quantity).First();
if (cs == null)
{
logger.Info($"手麻单{oi.OrderNo}对药品批次{oi.Detail.DrugId}-{oi.Detail.SetManuNo}在{drawerNo}药箱无库存");
continue;
}
cs.Quantity = cs.Quantity - oi.Detail.Quantity;
//cs.NeedNum = cs.NeedNum > 0 ? cs.NeedNum + oi._OrderDetail.Quantity : oi._OrderDetail.Quantity;
logger.Info($"更新手术间{cs.DrawerNo}药品{cs.DrugId}批次{cs.ManuNo}库存为{cs.Quantity},需补药数量为{oi.Detail.Quantity}");
// 更新数据 库存信息
_connection.Update(cs);
// 获取更新完库存后的药品库存
List<ChannelStock> nowChannels = _connection.ChannelStock.AsQueryable()
.Where(it => it.MachineId.Equals(cs.MachineId) || it.MachineId.Equals(_setting.machineId))
.Where(it => it.DrugId.Equals(cs.DrugId))
.Where(it => it.ManuNo.Equals(cs.ManuNo))
.Where(it => it.DrawerType == 1)
.ToList();
if (cs != null)
{
_connection.Insert(new MachineRecord()
{
MachineId = _setting.machineId,
DrawerNo = cs.DrawerNo,
ColNo = cs.ColNo,
DrugId = cs.DrugId,
ManuNo = cs.ManuNo,
EffDate = !String.IsNullOrEmpty(cs.EffDate) ? DateTime.ParseExact(cs.EffDate, "yyyy-MM-dd", System.Globalization.CultureInfo.CurrentCulture) : null,
Operator = _globalStateService.Operator?.Id,
Reviewer = _globalStateService.Reviewer?.Id,
OperationTime = DateTime.Now,
Quantity = oi.Detail.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.Detail.DrugId)
.Where(ab => ab.ManuNo == cs.ManuNo).OrderByDescending(ab => ab.Id).First();
//保存账册
int iInsertResult = _connection.Insert(new AccountBookG2()
{
DrugId = oi.Detail.DrugId,
Type = 2,
Department = oi.DeptName,
OrderNo = oi.OrderNo,
ManuNo = cs.ManuNo,
EffDate = cs.EffDate,
OutQuantity = oi.Detail.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.Detail.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.Detail.DrugId)
.Where(ab => ab.ManuNo == cs.ManuNo)
.Where(ab => ab.CreateDate == DateTime.Now.ToString("yyyy-MM-dd")).First();
if (accountBookG2Day != null)
{
accountBookG2Day.ManuStock = accountBookG2Day.ManuStock - oi.Detail.Quantity;
_connection.Update(accountBookG2Day);
}
else
{
//生成日结存时可能没有该库位的绑定信息,需要写入日结存
int iDayResult =_connection.Insert(new AccountBookG2()
{
DrugId = oi.Detail.DrugId,
Type = 3,
ManuNo = cs.ManuNo,
EffDate = cs.EffDate,
YQuantity = 0,
ManuStock = oi.Detail.Quantity,
TotalStock = oi.Detail.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.Detail.DrugId}-{cs.ManuNo}-{cs.EffDate}-{cs.Quantity}");
}
}
//修改凌晨生成的日结存与总结存数据
AccountBookG2 accountBookG2Total = _connection.AccountBookG2.AsQueryable()
.Where(ab => ab.MachineId.Equals(_setting.machineId))
.Where(ab => ab.Type == 4)
.Where(ab => ab.DrugId == oi.Detail.DrugId)
.Where(ab => ab.CreateDate == DateTime.Now.ToString("yyyy-MM-dd")).First();
if (accountBookG2Total != null)
{
accountBookG2Total.TotalStock = accountBookG2Total.TotalStock - oi.Detail.Quantity;
_connection.Update(accountBookG2Total);
}
else
{
//生成总结存时可能没有该库位的绑定信息,需要写入总结存
int iTotalResult = _connection.Insert(new AccountBookG2()
{
DrugId = oi.Detail.DrugId,
Type = 4,
YQuantity = 0,
ManuStock = oi.Detail.Quantity,
TotalStock = oi.Detail.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.Detail.DrugId}-{oi.Detail.Quantity}");
}
}
}
}
return true;
logger.Info($"管理员{_globalStateService.Operator.NickName}结束确认手麻单");
if (bFlag)
{
_connection.CommitTransaction();
return true;
}
}
catch (Exception ex)
{
_connection.RollbackTransaction();
logger.Info($"核对处方异常{ex.Message}");
return false;
}
}
} }
} }

View File

@ -0,0 +1,307 @@
using LinqToDB;
using log4net;
using MasaBlazorApp3.DataAccess.Dao;
using MasaBlazorApp3.Pojo;
using MasaBlazorApp3.Pojo.Config;
using Microsoft.Extensions.Options;
using System;
using System.Collections.Generic;
using System.Data.Common;
using System.Linq;
using System.Linq.Dynamic.Core;
using System.Numerics;
using System.Runtime.CompilerServices;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Linq;
using ZstdSharp.Unsafe;
namespace MasaBlazorApp3.DataAccess.Impl
{
public class PlanDao : IPlanDao
{
private AppDataConnection _connection;
private readonly SettingConfig _setting;
private readonly ILog logger = LogManager.GetLogger(typeof(DrugInfoDao));
private GlobalStateService _globalStateService;
public PlanDao(AppDataConnection connection, IOptions<SettingConfig> setting, GlobalStateService globalStateService)
{
_connection = connection;
_setting = setting.Value;
_globalStateService = globalStateService;
}
/// <summary>
/// 获取所有套餐数据
/// </summary>
/// <returns></returns>
public async Task<PageMultiData<Plan, DrugInfo>> GetAllPlanInfo()
{
var query = _connection.Plan.AsQueryable();
List<Plan> list = await query.Where(p=>p.UseState==1)
.LoadWith(p => p._PlanDetails.Where(pd=>pd.UseState==1))
//.ThenLoad(p=>p._DrugInfo)
.OrderBy(r => r.Id)
.ToListAsync();
if (list != null && list.Count > 0)
{
for (int i = 0; i < list.Count(); i++)
{
for (int j = 0; j < list[i]._PlanDetails.Count(); j++)
{
list[i]._PlanDetails[j]._DrugInfo =
_connection.DrugInfo.AsQueryable().Where(di => di.DrugId == list[i]._PlanDetails[j].DrugId).First();
}
}
}
var other = _connection.DrugInfo.AsQueryable();
List<DrugInfo> drugInfos = await other
.LoadWith(di => di.Manus)
.OrderBy((di) => di.DrugId)
.ToListAsync();
int pagedData = await query.CountAsync();
return new PageMultiData<Plan, DrugInfo>()
{
TotalDesserts = pagedData,
Desserts = list,
Other = drugInfos
};
}
/// <summary>
/// 根据套餐ID获取套餐数据
/// </summary>
/// <param name="Id"></param>
/// <returns></returns>
public async Task<Plan> GetPlanById(int Id)
{
var query = _connection.Plan.AsQueryable().Where(p => p.Id == Id&&p.UseState==1);
List<Plan> list = await query
.LoadWith(p => p._PlanDetails)
//.ThenLoad(p=>p._DrugInfo)
.OrderBy(r => r.Id)
.ToListAsync();
if (list != null && list.Count > 0)
{
for (int i = 0; i < list.Count(); i++)
{
for (int j = 0; j < list[i]._PlanDetails.Count(); j++)
{
list[i]._PlanDetails[j]._DrugInfo =
_connection.DrugInfo.AsQueryable().Where(di => di.DrugId == list[i]._PlanDetails[j].DrugId).First();
}
}
}
return list[0];
}
/// <summary>
/// 新增套餐
/// </summary>
/// <param name="plan"></param>
/// <returns></returns>
public async Task<bool> InsertPlanInfo(Plan plan)
{
try
{
plan.AddTime = DateTime.Now;
plan.OperatorUser = _globalStateService.Operator.Id;
plan.ReviewerUser = _globalStateService.Reviewer?.Id ?? _globalStateService.Operator.Id;
return _connection.InsertWithInt32Identity(plan) > 0;
}
catch (Exception ex)
{
logger.Error($"添加套餐{plan.Name}失败,错误:" + ex.Message);
return false;
}
}
/// <summary>
/// 更新套餐
/// </summary>
/// <param name="plan"></param>
/// <returns></returns>
public async Task<bool> UpdatePlanInfo(Plan plan)
{
try
{
var iResult = _connection.Plan
.Where(p => p.Id == plan.Id)
.Set(p => p.Name, plan.Name)
.Set(p => p.Description, plan.Description);
return iResult.Update() > 0;
}
catch (Exception ex)
{
logger.Error($"修改套餐{plan.Name}失败,错误:" + ex.Message);
return false;
}
}
/// <summary>
/// 删除套餐
/// </summary>
/// <param name="planId"></param>
/// <returns></returns>
public async Task<bool> DeletePlanInfo(int planId)
{
try
{
_connection.BeginTransaction();
bool flag = false;
//查询是否有绑定,没有绑定可以删除,有绑定则不允许删除
int hasCount = _connection.ChannelList.Where(cl => cl.DrugId == planId.ToString() && cl.MachineId == _setting.machineId).Count();
if (hasCount > 0)
{
return flag;
}
else
{
logger.Error($"删除套餐{planId}");
//查询该套餐下是否有药品,如果有则一并删除
int iHasPd = _connection.PlanDetails.Where(pd => pd.PlanId == planId).Count();
int pdResult = 1;
if (iHasPd > 0)
{
pdResult = _connection.PlanDetails.Where(pd => pd.PlanId == planId).Set(pd => pd.UseState, 0).Update();
}
int pResult = _connection.Plan.Where(p => p.Id == planId).Set(pd => pd.UseState, 0).Update();
if (pdResult > 0 && pResult > 0)
{
flag = true;
}
}
if (flag)
{
_connection.CommitTransaction();
}
else
{
_connection.RollbackTransaction();
}
return flag;
}
catch (Exception ex)
{
logger.Error($"修改套餐失败,错误:" + ex.Message);
_connection.RollbackTransaction();
return false;
}
}
/// <summary>
/// 向套餐中添加药品
/// </summary>
/// <param name="details"></param>
/// <returns></returns>
public async Task<bool> AddPlanDetail(PlanDetails details)
{
try
{
if (!string.IsNullOrEmpty(details.DrugId))
{
int id = _connection.InsertWithInt32Identity(details);
details.Id = id;
return id > 0;
}
else
{
return false;
}
}
catch (Exception ex)
{
logger.Error($"添加药品{details._DrugInfo.DrugName}失败,错误:" + ex.Message);
return false;
}
}
/// <summary>
/// 修改套餐中的药品
/// </summary>
/// <param name="details"></param>
/// <returns></returns>
public async Task<bool> UpdatePlanDetail(PlanDetails details)
{
try
{
var iResult = _connection.PlanDetails
.Where(p => p.Id == details.Id)
.Set(p => p.DrugId, details._DrugInfo.DrugId)
.Set(p => p.BaseQuantity, details.BaseQuantity);
return iResult.Update() > 0;
}
catch (Exception ex)
{
logger.Error($"修改药品{details._DrugInfo.DrugName}失败,错误:" + ex.Message);
return false;
}
}
/// <summary>
/// 删除套餐中的药品
/// </summary>
/// <param name="details"></param>
/// <returns></returns>
public async Task<bool> DeletePlanDetail(PlanDetails detail)
{
try
{
logger.Error($"删除套餐中的药品{detail._DrugInfo.DrugName}");
return _connection.PlanDetails.Where(p => p.Id == detail.Id).Set(p=>p.UseState,0).Update() > 0;
}
catch (Exception ex)
{
logger.Error($"添加药品失败,错误:" + ex.Message);
return false;
}
}
public bool CheckDrugById(PlanDetails details)
{
if (details._DrugInfo.DrugId != null)
{
//查询该药品是否已在套餐中存在,存在则不再添加
PlanDetails pdDrug = _connection.PlanDetails.Where(p => p.PlanId == details.PlanId && p.DrugId == details._DrugInfo.DrugId&&p.UseState==1).FirstOrDefault();
if (details.Id > 0)
{
//修改原数据
if (pdDrug != null && pdDrug.Id == details.Id)
{
return true;
}
else
{
return false;
}
}
else
{
//新增数据
if (pdDrug != null)
{
return !(pdDrug.Id > 0);
}
else
{
return true;
}
}
//return !(hasCount > 0);
}
else
{
return true;
}
}
}
}

View File

@ -0,0 +1,37 @@
using LinqToDB;
using MasaBlazorApp3.DataAccess.Dao;
using MasaBlazorApp3.Pojo;
using MasaBlazorApp3.Pojo.Config;
using MasaBlazorApp3.Port;
using Microsoft.Extensions.Options;
using System;
using System.Collections.Generic;
using System.Data.Common;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace MasaBlazorApp3.DataAccess.Impl
{
public class SettingManuDao : ISettingManuDao
{
private AppDataConnection _connection;
private readonly SettingConfig _setting;
private GlobalStateService _globalStateService;
public SettingManuDao(AppDataConnection connection, IOptions<SettingConfig> setting, GlobalStateService globalStateService, PortUtil portUtil)
{
_globalStateService = globalStateService;
_connection = connection;
_setting = setting.Value;
}
public async Task<List<SettingManu>> GetMenuItemsAsync()
{
var query = _connection.SettingManu.AsQueryable();
return await query
.OrderBy((sm) => sm.Id)
.ToListAsync();
}
}
}

View File

@ -0,0 +1,147 @@
@page "/Box/BoxAddBox"
<style>
@@keyframes shake {
0% {
opacity: 1;
color: red;
}
25% {
opacity: 1;
color: orange;
}
50% {
opacity: 0;
color: yellow;
}
75% {
opacity: 1;
color: crimson;
}
100% {
opacity: 1;
color: red;
}
}
.rz-custom-header {
width: 100%;
}
.shaky-text {
animation: shake 2s infinite ease-in-out;
/* 你可以根据需要调整动画的持续时间和迭代次数 */
transition: color 0.5s linear,opacity 0.5s linear;
}
</style>
<div class="container-fluid">
<RadzenDataGrid @ref="grid" RowSelect="@OnRowSelect" TItem="ChannelList"
IsLoading="@isLoading"
RowRender="@RowRender"
EmptyText="无数据"
Data="@_forecasts" @bind-Value=@selectedChannelLists
AllowColumnResize="true" AllowAlternatingRows="false"
SelectionMode="DataGridSelectionMode.Single"
ExpandMode="DataGridExpandMode.Multiple">
<Template Context="cs">
<RadzenDataGrid Data="@cs.ChannelStocks" EmptyText="无数据">
<Columns>
<RadzenDataGridColumn Title="药品名称" Property="Drug.DrugName">
</RadzenDataGridColumn>
<RadzenDataGridColumn Title="规格" Property="Drug.DrugSpec">
</RadzenDataGridColumn>
<RadzenDataGridColumn Title="厂家" Property="Drug.Manufactory">
</RadzenDataGridColumn>
@* <RadzenDataGridColumn Title="批次" Property="ManuNo"></RadzenDataGridColumn>
<RadzenDataGridColumn Title="效期" Property="EffDate">
</RadzenDataGridColumn> *@
<RadzenDataGridColumn Title="基数" Property="BaseQuantity">
</RadzenDataGridColumn>
<RadzenDataGridColumn Title="需补药数" Property="NeedQuantity">
</RadzenDataGridColumn>
</Columns>
</RadzenDataGrid>
</Template>
<Columns>
<RadzenDataGridColumn Frozen="true" Width="200px" Title="药箱号" Property="DrawerNo">
<Template Context="DrawerNo">
@DrawerNo.DrawerNo 号药箱
</Template>
</RadzenDataGridColumn>
<RadzenDataGridColumn Title="总库存" Property="TotalQuantity"></RadzenDataGridColumn>
</Columns>
</RadzenDataGrid>
</div>
@code {
@inject IChannelListDao channelStockDao;
@inject DialogService dialogService;
RadzenDataGrid<ChannelList> grid;
bool isLoading;
int count;
private IEnumerable<ChannelList>? _forecasts;
DateTime start;
DateTime end;
IList<ChannelList> selectedChannelLists;
protected override async Task OnInitializedAsync()
{
await base.OnInitializedAsync();
isLoading = true;
var result = await channelStockDao.GetBoxWaitInfo(10, 0);
// Update the Data property
_forecasts = result.Desserts;
isLoading = false;
}
protected override async Task OnAfterRenderAsync(bool firstRender)
{
base.OnAfterRender(firstRender);
if (firstRender)
{
// await grid.ExpandRows(grid.PagedView.Where(di => di.Stocks.Count > 0));
}
}
void RowRender(RowRenderEventArgs<ChannelList> args)
{
args.Expandable = args.Data.ChannelStocks.Count > 0;
}
async void OnRowSelect(ChannelList cl)
{
var b = await dialogService.OpenAsync<BoxAddBoxDetailDialog>(
$"{cl.DrawerNo}号药箱取药",
new Dictionary<string, object>() { { "boxChannelList", cl } },
new DialogOptions() { Width = "85vw", Resizable = true, Draggable = true, ShowClose = false }
);
if (b)
{
await grid.Reload();
}
}
async void StockExport()
{
}
async void AccountBookExport()
{
}
}

View File

@ -0,0 +1,318 @@
@page "/Box/BoxAddBoxDetail"
@using MasaBlazorApp3.Pojo.Config;
@using MasaBlazorApp3.Pojo.Vo;
@using MasaBlazorApp3.Util;
@using Microsoft.Extensions.Options;
@using Newtonsoft.Json;
@using log4net;
<RadzenStack Gap="1rem" Orientation="Orientation.Vertical" Style="height: 100%;">
<RadzenStack>
@if (CanTakeDrug)
{
<RadzenDataGrid Data="@data" AllowAlternatingRows="false">
<Columns>
<RadzenDataGridColumn Property="ChannelStock" Title="库位">
<Template>
@context.ChannelStock.DrawerNo - @context.ChannelStock.ColNo
</Template>
</RadzenDataGridColumn>
<RadzenDataGridColumn Property="Drug.DrugName" Title="药品" />
<RadzenDataGridColumn Property="Drug.DrugSpec" Title="规格" />
<RadzenDataGridColumn Property="ChannelStock.ManuNo" Title="批次" />
<RadzenDataGridColumn Property="ChannelStock.EffDate" Title="效期" />
<RadzenDataGridColumn Property="Quantity" Title="数量" />
</Columns>
</RadzenDataGrid>
}
else
{
<RadzenDataGrid Data="@data" AllowAlternatingRows="false">
<Columns>
<RadzenDataGridColumn Property="Drug.DrugName" Title="药品" />
<RadzenDataGridColumn Property="Drug.DrugSpec" Title="规格" />
<RadzenDataGridColumn Property="Quantity" Title="取药数量" />
<RadzenDataGridColumn Property="StockQuantity" Title="库存" />
</Columns>
</RadzenDataGrid>
}
</RadzenStack>
<RadzenStack Orientation="Orientation.Horizontal" JustifyContent="JustifyContent.Center" Gap="0.5rem">
@if (status < 2)
{
<RadzenButton Click="@OpenDrawer" Disabled="!CanTakeDrug" IsBusy="status > 0" BusyText="取药中。。。" ButtonStyle="ButtonStyle.Warning" Variant="Variant.Flat" Text="取药" Style="width: 120px" />
}
@if (status == 2)
{
<RadzenButton Click="@TakeFinish" ButtonStyle="ButtonStyle.Success" Variant="Variant.Flat" Text="完成" Style="width: 120px" />
}
@if (status <= 2)
{
<RadzenButton Click="@Cancel" Variant="Variant.Flat" Text="取消" Style="width: 120px" />
}
</RadzenStack>
</RadzenStack>
@code {
@inject Radzen.DialogService dialogService;
@inject IChannelListDao channelListDao;
@inject IOptions<DrawerConfig> setting;
@inject NotificationService _message
@inject PortUtil PortUtil;
private readonly ILog logger = LogManager.GetLogger(typeof(OrderDetailDialog));
int status;
[Parameter] public ChannelList boxChannelList { get; set; }
private bool CanTakeDrug = true;
public List<BoxTakeVo> data { get; set; }
//称重取药数量
int[] WeightFinnalQuantity { get; set; } = new int[] { 0, 0, 0, 0, 0, 0, 0, 0, 0 };
//开抽屉前操作标识
List<string> DrawerNoColNoList = new List<string>();
protected override async Task OnInitializedAsync()
{
data = await channelListDao.getTakeInfoByBox(boxChannelList);
// 如果有【stockQuantity】字段说明有药品库存不足
if (data.Any(it => it.ChannelStock == null))
{
CanTakeDrug = false;
}
base.OnInitializedAsync();
}
async Task OpenDrawer()
{
this.status = 1;
// 解析需要打开的抽屉列表
List<BoxTakeVo> drawerNos = this.data.GroupBy(it => it.ChannelStock.DrawerNo).Select(it => it.First()).ToList();
// 根据抽屉类型来决定打开前是否需要查询数量
var promiseUtil = new PromiseUtil<int>();
await promiseUtil.taskAsyncLoop(500, 0, async (options, next, stop) =>
{
var orderTakeVo = drawerNos[options._data];
var drawerNo = orderTakeVo.ChannelStock.DrawerNo;
try
{
if (this.status == 0)
{
stop();
}
// 开启抽屉
else if (this.status == 1)
{
if (orderTakeVo.Status == 0)
{
// 判断是否为单支抽屉
if (setting.Value.single.Contains(drawerNo))
{
byte[] quantity = await PortUtil.CheckQuantityByDrawer(drawerNo);
orderTakeVo.BeforeQuantity = quantity.Select(it => Convert.ToInt32(it)).ToArray().Skip(3).Take(9).ToArray();
logger.Info($"单支抽屉,开抽屉前检测数量【{string.Join(",", orderTakeVo.BeforeQuantity)}】");
await PortUtil.HasLightOnByCol(drawerNo, data.Where(ot => ot.ChannelStock.DrawerNo == drawerNo).Select(ot => ot.ChannelStock.ColNo).ToArray());
}
for (int i = 0; i < data.Count; i++)
{
if (!DrawerNoColNoList.Contains(data[i].ChannelStock.DrawerNo.ToString() + data[i].ChannelStock.ColNo))
{
if (data[i].ChannelStock.BoardType.ToString().Contains("6"))
{
PortUtil.DrawerNo = data[i].ChannelStock.DrawerNo;
PortUtil.ColNoLst.Add(data[i].ChannelStock.ColNo);
data[i].BeforeQuantity[data[i].ChannelStock.ColNo - 1] = await PortUtil.CheckQuantityForSingle(data[i].ChannelStock.ColNo);
logger.Info($"称重抽屉,开抽屉前检测数量【{string.Join(",", orderTakeVo.BeforeQuantity)}】");
await Task.Delay(200);
}
//是药盒抽屉开药盒
if (data[i].ChannelStock.BoardType.ToString().Contains("3"))
{
PortUtil.DrawerNo = data[i].ChannelStock.DrawerNo;
await PortUtil.OpenBoxByColNo(data[i].ChannelStock.ColNo);
await Task.Delay(200);
}
DrawerNoColNoList.Add(data[i].ChannelStock.DrawerNo.ToString() + data[i].ChannelStock.ColNo);
}
}
var b = await PortUtil.OpenDrawerStatus(drawerNo);
if (b)
{
PortUtil.speechSynthesizer.SpeakAsyncCancelAll();
PortUtil.SpeakAsync($"{drawerNo}号抽屉已经打开,请,取药");
orderTakeVo.Status = 1;
next();
}
else
{
_message.Notify(
new NotificationMessage { Severity = NotificationSeverity.Error, Summary = "提示", Detail = $"抽屉【{drawerNo}】打开失败,请检测硬件", Duration = 4000 }
);
logger.Info($"抽屉打开失败");
PortUtil.AllLightOff();
RestData();
stop();
}
}
// 检测状态
else if (orderTakeVo.Status == 1)
{
// 查询抽屉是否为关闭状态
var b = await PortUtil.CheckDrawerStatus2(drawerNo);
// 关闭则改变状态并终止循环
if (b)
{
data.ForEach(cl =>
{
if (cl.ChannelStock.DrawerNo == drawerNo)
{
cl.GetQuantity = cl.Quantity;
}
});
orderTakeVo.Status = 2;
PortUtil.AllLightOff();
if (options._data == drawerNos.Count - 1)
{
PortUtil.speechSynthesizer.SpeakAsyncCancelAll();
PortUtil.speechSynthesizer.SpeakAsyncCancelAll();
PortUtil.SpeakAsync($"取药完成,请,点击完成按钮进行确认");
this.status = 2;
string alertMessage = string.Empty;
//检查是否称重抽屉,核对实际取出数量是否与应取数量一致,不一致则弹出提示
for (int i = 0; i < data.Count; i++)
{
if (data[i].ChannelStock.BoardType.ToString().Contains("6"))
{
PortUtil.DrawerNo = data[i].ChannelStock.DrawerNo;// drawerNo;
PortUtil.ColNoLst.Add(data[i].ChannelStock.ColNo);
orderTakeVo.AfterQuantity[data[i].ChannelStock.ColNo - 1] = await PortUtil.CheckQuantityForSingle(data[i].ChannelStock.ColNo);
logger.Info($"称重抽屉,关抽屉后检测数量【{string.Join(",", orderTakeVo.AfterQuantity)}】");
WeightFinnalQuantity[data[i].ChannelStock.ColNo - 1] = data[i].BeforeQuantity[data[i].ChannelStock.ColNo - 1] - orderTakeVo.AfterQuantity[data[i].ChannelStock.ColNo - 1];
if (data[i].Quantity != WeightFinnalQuantity[data[i].ChannelStock.ColNo - 1])
{
//称重自动计数数量与实际要取数量不一致弹出提示,确认后保存数据
alertMessage += $"{data[i].Drug.DrugName}应取数量【{data[i].Quantity}】,实际取出数量【{WeightFinnalQuantity[data[i].ChannelStock.ColNo - 1]}】";
}
await Task.Delay(200);
}
if (data[i].ChannelStock.BoardType.ToString().Contains("2"))
{
byte[] quantity = await PortUtil.CheckQuantityByDrawer(drawerNo);
orderTakeVo.AfterQuantity = quantity.Select(it => Convert.ToInt32(it)).ToArray().Skip(3).Take(9).ToArray();
logger.Info($"单支抽屉,关抽屉后检测数量【{string.Join(",", orderTakeVo.AfterQuantity)}】");
WeightFinnalQuantity[data[i].ChannelStock.ColNo - 1] = orderTakeVo.BeforeQuantity[data[i].ChannelStock.ColNo - 1] - orderTakeVo.AfterQuantity[data[i].ChannelStock.ColNo - 1];
if (data[i].Quantity != WeightFinnalQuantity[data[i].ChannelStock.ColNo - 1])
{
alertMessage += $"{data[i].Drug.DrugName}应取数量【{orderTakeVo.Quantity}】,实际取出数量【{WeightFinnalQuantity[data[i].ChannelStock.ColNo - 1]}】";
}
}
}
if (!string.IsNullOrEmpty(alertMessage))
{
//弹出确认对话框
alertMessage += "应取数与实际取出数不一致确认要保存吗?";
//弹出确认提示框
var confirm = await dialogService.OpenAsync<ConfirmDialog>(
$"保存确认",
new Dictionary<string, object>() { { "confirmInfo", alertMessage } },
new DialogOptions() { Width = "45vw", Resizable = true, Draggable = true, ShowClose = false });
logger.Info(alertMessage);
if (!confirm)
{
RestData();
logger.Info("取消保存");
// 关闭弹窗
dialogService.Close(false);
}
}
stop();
}
else
{
options._data += 1;
next();
}
}
else
{
next(); // continue iteration
}
}
}
}
catch (Exception e)
{
RestData();
logger.Info($"{boxChannelList.DrawerNo}药盒取药发生错误,{e.Message}");
_message.Notify(
new NotificationMessage { Severity = NotificationSeverity.Error, Summary = "提示", Detail = $"发生错误,{e.Message}", Duration = 4000 }
);
if (setting.Value.single.Contains(drawerNo))
{
PortUtil.AllLightOff();
}
stop();
}
});
}
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();
}
void Cancel()
{
RestData();
// 关闭弹窗
dialogService.Close(false);
}
async Task TakeFinish()
{
// 保存账册、操作记录
var b = await channelListDao.BoxTakeFinish(data);
if (!b)
{
_message.Notify(new NotificationMessage { Severity = NotificationSeverity.Error, Summary = "提示", Detail = $"数据保存失败", Duration = 4000 });
logger.Error($"手术室药箱取药保存数据库失败,数据{JsonConvert.SerializeObject(data)}");
// 关闭弹窗
dialogService.Close(false);
}
else
{
// 关闭弹窗
dialogService.Close(true);
}
//重置状态
this.RestData();
}
}

View File

@ -0,0 +1,329 @@
@page "/Box/BoxAddDetail"
@using MasaBlazorApp3.Pojo.Config;
@using MasaBlazorApp3.Pojo.Vo;
@using MasaBlazorApp3.Util;
@using Microsoft.Extensions.Options;
@using Newtonsoft.Json;
@using log4net;
<RadzenStack Gap="1rem" Orientation="Orientation.Vertical" Style="height: 100%;">
<RadzenStack>
@* <RadzenStack class="rz-p-4 rz-border-radius-1" Style="border: var(--rz-grid-cell-border)" Orientation="Orientation.Horizontal" Gap="1rem">
<RadzenText TextStyle="TextStyle.Overline" Class="rz-mt-2 rz-my-0" Style="color: var(--rz-text-tertiary-color);">处方号:</RadzenText>
<RadzenText TextStyle="TextStyle.Body1" Class="rz-text-truncate"><b>@(order?.OrderNo)</b></RadzenText>
<RadzenText TextStyle="TextStyle.Overline" Class="rz-mt-2 rz-my-0" Style="color: var(--rz-text-tertiary-color);">患者姓名:</RadzenText>
<RadzenText TextStyle="TextStyle.Body1" Class="rz-text-truncate"><b>@(order?.PatientName)</b></RadzenText>
<RadzenText TextStyle="TextStyle.Overline" Class="rz-mt-2 rz-my-0" Style="color: var(--rz-text-tertiary-color);">性别:</RadzenText>
<RadzenText TextStyle="TextStyle.Body1" Class="rz-text-truncate"><b>@(order?.Sex)</b></RadzenText>
<RadzenText TextStyle="TextStyle.Overline" Class="rz-mt-2 rz-my-0" Style="color: var(--rz-text-tertiary-color);">年龄:</RadzenText>
<RadzenText TextStyle="TextStyle.Body1" Class="rz-text-truncate"><b>@(order?.Age)</b></RadzenText>
</RadzenStack> *@
@if (CanTakeDrug)
{
<RadzenDataGrid Data="@data" AllowAlternatingRows="false">
<Columns>
<RadzenDataGridColumn Property="ChannelStock" Title="库位">
<Template>
@context.ChannelStock.DrawerNo - @context.ChannelStock.ColNo
</Template>
</RadzenDataGridColumn>
<RadzenDataGridColumn Property="Drug.DrugName" Title="药品" />
<RadzenDataGridColumn Property="Drug.DrugSpec" Title="规格" />
<RadzenDataGridColumn Property="ChannelStock.ManuNo" Title="批次" />
<RadzenDataGridColumn Property="ChannelStock.EffDate" Title="效期" />
<RadzenDataGridColumn Property="Quantity" Title="数量" />
</Columns>
</RadzenDataGrid>
}
else
{
<RadzenDataGrid Data="@data" AllowAlternatingRows="false">
<Columns>
<RadzenDataGridColumn Property="Drug.DrugName" Title="药品" />
<RadzenDataGridColumn Property="Drug.DrugSpec" Title="规格" />
<RadzenDataGridColumn Property="Quantity" Title="取药数量" />
<RadzenDataGridColumn Property="StockQuantity" Title="库存" />
</Columns>
</RadzenDataGrid>
}
</RadzenStack>
<RadzenStack Orientation="Orientation.Horizontal" JustifyContent="JustifyContent.Center" Gap="0.5rem">
@if (status < 2)
{
<RadzenButton Click="@OpenDrawer" Disabled="!CanTakeDrug" IsBusy="status > 0" BusyText="取药中。。。" ButtonStyle="ButtonStyle.Warning" Variant="Variant.Flat" Text="取药" Style="width: 120px" />
}
@if (status == 2)
{
<RadzenButton Click="@TakeFinish" ButtonStyle="ButtonStyle.Success" Variant="Variant.Flat" Text="完成" Style="width: 120px" />
}
@if (status <= 2)
{
<RadzenButton Click="@Cancel" Variant="Variant.Flat" Text="取消" Style="width: 120px" />
}
</RadzenStack>
</RadzenStack>
@code {
@inject Radzen.DialogService dialogService;
@inject IChannelListDao channelListDao;
@inject IOptions<DrawerConfig> setting;
@inject NotificationService _message
@inject PortUtil PortUtil;
private readonly ILog logger = LogManager.GetLogger(typeof(OrderDetailDialog));
int status;
[Parameter] public ChannelList boxChannelList { get; set; }
private bool CanTakeDrug = true;
public List<BoxTakeVo> data { get; set; }
//称重取药数量
int[] WeightFinnalQuantity { get; set; } = new int[] { 0, 0, 0, 0, 0, 0, 0, 0, 0 };
//开抽屉前操作标识
List<string> DrawerNoColNoList = new List<string>();
protected override async Task OnInitializedAsync()
{
data = await channelListDao.getTakeInfoByBox(boxChannelList);
// 如果有【stockQuantity】字段说明有药品库存不足
if (data.Any(it => it.ChannelStock == null))
{
CanTakeDrug = false;
}
base.OnInitializedAsync();
}
async Task OpenDrawer()
{
this.status = 1;
// 解析需要打开的抽屉列表
List<BoxTakeVo> drawerNos = this.data.GroupBy(it => it.ChannelStock.DrawerNo).Select(it => it.First()).ToList();
// 根据抽屉类型来决定打开前是否需要查询数量
var promiseUtil = new PromiseUtil<int>();
await promiseUtil.taskAsyncLoop(500, 0, async (options, next, stop) =>
{
var orderTakeVo = drawerNos[options._data];
var drawerNo = orderTakeVo.ChannelStock.DrawerNo;
try
{
if (this.status == 0)
{
stop();
}
// 开启抽屉
else if (this.status == 1)
{
if (orderTakeVo.Status == 0)
{
// 判断是否为单支抽屉
if (setting.Value.single.Contains(drawerNo))
{
byte[] quantity = await PortUtil.CheckQuantityByDrawer(drawerNo);
orderTakeVo.BeforeQuantity = quantity.Select(it => Convert.ToInt32(it)).ToArray().Skip(3).Take(9).ToArray();
logger.Info($"单支抽屉,开抽屉前检测数量【{string.Join(",", orderTakeVo.BeforeQuantity)}】");
await PortUtil.HasLightOnByCol(drawerNo, data.Where(ot => ot.ChannelStock.DrawerNo == drawerNo).Select(ot => ot.ChannelStock.ColNo).ToArray());
}
for (int i = 0; i < data.Count; i++)
{
if (!DrawerNoColNoList.Contains(data[i].ChannelStock.DrawerNo.ToString() + data[i].ChannelStock.ColNo))
{
if (data[i].ChannelStock.BoardType.ToString().Contains("6"))
{
PortUtil.DrawerNo = data[i].ChannelStock.DrawerNo;
PortUtil.ColNoLst.Add(data[i].ChannelStock.ColNo);
data[i].BeforeQuantity[data[i].ChannelStock.ColNo - 1] = await PortUtil.CheckQuantityForSingle(data[i].ChannelStock.ColNo);
logger.Info($"称重抽屉,开抽屉前检测数量【{string.Join(",", orderTakeVo.BeforeQuantity)}】");
await Task.Delay(200);
}
//是药盒抽屉开药盒
if (data[i].ChannelStock.BoardType.ToString().Contains("3"))
{
PortUtil.DrawerNo = data[i].ChannelStock.DrawerNo;
await PortUtil.OpenBoxByColNo(data[i].ChannelStock.ColNo);
await Task.Delay(200);
}
DrawerNoColNoList.Add(data[i].ChannelStock.DrawerNo.ToString() + data[i].ChannelStock.ColNo);
}
}
var b = await PortUtil.OpenDrawerStatus(drawerNo);
if (b)
{
PortUtil.speechSynthesizer.SpeakAsyncCancelAll();
PortUtil.SpeakAsync($"{drawerNo}号抽屉已经打开,请,取药");
orderTakeVo.Status = 1;
next();
}
else
{
_message.Notify(
new NotificationMessage { Severity = NotificationSeverity.Error, Summary = "提示", Detail = $"抽屉【{drawerNo}】打开失败,请检测硬件", Duration = 4000 }
);
logger.Info($"抽屉打开失败");
PortUtil.AllLightOff();
RestData();
stop();
}
}
// 检测状态
else if (orderTakeVo.Status == 1)
{
// 查询抽屉是否为关闭状态
var b = await PortUtil.CheckDrawerStatus2(drawerNo);
// 关闭则改变状态并终止循环
if (b)
{
data.ForEach(cl =>
{
if (cl.ChannelStock.DrawerNo == drawerNo)
{
cl.GetQuantity = cl.Quantity;
}
});
orderTakeVo.Status = 2;
PortUtil.AllLightOff();
if (options._data == drawerNos.Count - 1)
{
PortUtil.speechSynthesizer.SpeakAsyncCancelAll();
PortUtil.speechSynthesizer.SpeakAsyncCancelAll();
PortUtil.SpeakAsync($"取药完成,请,点击完成按钮进行确认");
this.status = 2;
string alertMessage = string.Empty;
//检查是否称重抽屉,核对实际取出数量是否与应取数量一致,不一致则弹出提示
for (int i = 0; i < data.Count; i++)
{
if (data[i].ChannelStock.BoardType.ToString().Contains("6"))
{
PortUtil.DrawerNo = data[i].ChannelStock.DrawerNo;// drawerNo;
PortUtil.ColNoLst.Add(data[i].ChannelStock.ColNo);
orderTakeVo.AfterQuantity[data[i].ChannelStock.ColNo - 1] = await PortUtil.CheckQuantityForSingle(data[i].ChannelStock.ColNo);
logger.Info($"称重抽屉,关抽屉后检测数量【{string.Join(",", orderTakeVo.AfterQuantity)}】");
WeightFinnalQuantity[data[i].ChannelStock.ColNo - 1] = data[i].BeforeQuantity[data[i].ChannelStock.ColNo - 1] - orderTakeVo.AfterQuantity[data[i].ChannelStock.ColNo - 1];
if (data[i].Quantity != WeightFinnalQuantity[data[i].ChannelStock.ColNo - 1])
{
//称重自动计数数量与实际要取数量不一致弹出提示,确认后保存数据
alertMessage += $"{data[i].Drug.DrugName}应取数量【{data[i].Quantity}】,实际取出数量【{WeightFinnalQuantity[data[i].ChannelStock.ColNo - 1]}】";
}
await Task.Delay(200);
}
if (data[i].ChannelStock.BoardType.ToString().Contains("2"))
{
byte[] quantity = await PortUtil.CheckQuantityByDrawer(drawerNo);
orderTakeVo.AfterQuantity = quantity.Select(it => Convert.ToInt32(it)).ToArray().Skip(3).Take(9).ToArray();
logger.Info($"单支抽屉,关抽屉后检测数量【{string.Join(",", orderTakeVo.AfterQuantity)}】");
WeightFinnalQuantity[data[i].ChannelStock.ColNo - 1] = orderTakeVo.BeforeQuantity[data[i].ChannelStock.ColNo - 1] - orderTakeVo.AfterQuantity[data[i].ChannelStock.ColNo - 1];
if (data[i].Quantity != WeightFinnalQuantity[data[i].ChannelStock.ColNo - 1])
{
alertMessage += $"{data[i].Drug.DrugName}应取数量【{orderTakeVo.Quantity}】,实际取出数量【{WeightFinnalQuantity[data[i].ChannelStock.ColNo - 1]}】";
}
}
}
if (!string.IsNullOrEmpty(alertMessage))
{
//弹出确认对话框
alertMessage += "应取数与实际取出数不一致确认要保存吗?";
//弹出确认提示框
var confirm = await dialogService.OpenAsync<ConfirmDialog>(
$"保存确认",
new Dictionary<string, object>() { { "confirmInfo", alertMessage } },
new DialogOptions() { Width = "45vw", Resizable = true, Draggable = true, ShowClose = false });
logger.Info(alertMessage);
if (!confirm)
{
RestData();
logger.Info("取消保存");
// 关闭弹窗
dialogService.Close(false);
}
}
stop();
}
else
{
options._data += 1;
next();
}
}
else
{
next(); // continue iteration
}
}
}
}
catch (Exception e)
{
RestData();
logger.Info($"{boxChannelList.DrawerNo}药盒取药发生错误,{e.Message}");
_message.Notify(
new NotificationMessage { Severity = NotificationSeverity.Error, Summary = "提示", Detail = $"发生错误,{e.Message}", Duration = 4000 }
);
if (setting.Value.single.Contains(drawerNo))
{
PortUtil.AllLightOff();
}
stop();
}
});
}
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();
}
void Cancel()
{
RestData();
// 关闭弹窗
dialogService.Close(false);
}
async Task TakeFinish()
{
// 保存账册、操作记录
var b = await channelListDao.BoxTakeFinish(data);
if (!b)
{
_message.Notify(new NotificationMessage { Severity = NotificationSeverity.Error, Summary = "提示", Detail = $"数据保存失败", Duration = 4000 });
logger.Error($"手术室药箱取药保存数据库失败,数据{JsonConvert.SerializeObject(data)}");
// 关闭弹窗
dialogService.Close(false);
}
else
{
// 关闭弹窗
dialogService.Close(true);
}
//重置状态
this.RestData();
}
}

View File

@ -0,0 +1,146 @@
@page "/Box/BoxAdd"
<style>
@@keyframes shake {
0% {
opacity: 1;
color: red;
}
25% {
opacity: 1;
color: orange;
}
50% {
opacity: 0;
color: yellow;
}
75% {
opacity: 1;
color: crimson;
}
100% {
opacity: 1;
color: red;
}
}
.rz-custom-header {
width: 100%;
}
.shaky-text {
animation: shake 2s infinite ease-in-out;
/* 你可以根据需要调整动画的持续时间和迭代次数 */
transition: color 0.5s linear,opacity 0.5s linear;
}
</style>
<div class="container-fluid">
<RadzenDataGrid @ref="grid" RowSelect="@OnRowSelect" TItem="ChannelList"
IsLoading="@isLoading"
RowRender="@RowRender"
EmptyText="无数据"
Data="@_forecasts" @bind-Value=@selectedChannelLists
AllowColumnResize="true" AllowAlternatingRows="false"
SelectionMode="DataGridSelectionMode.Single"
ExpandMode="DataGridExpandMode.Multiple">
<Template Context="cs">
<RadzenDataGrid Data="@cs.ChannelStocks" EmptyText="无数据">
<Columns>
<RadzenDataGridColumn Title="药品名称" Property="Drug.DrugName">
</RadzenDataGridColumn>
<RadzenDataGridColumn Title="规格" Property="Drug.DrugSpec">
</RadzenDataGridColumn>
<RadzenDataGridColumn Title="厂家" Property="Drug.Manufactory">
</RadzenDataGridColumn>
@* <RadzenDataGridColumn Title="批次" Property="ManuNo"></RadzenDataGridColumn>
<RadzenDataGridColumn Title="效期" Property="EffDate">
</RadzenDataGridColumn> *@
<RadzenDataGridColumn Title="基数" Property="BaseQuantity">
</RadzenDataGridColumn>
<RadzenDataGridColumn Title="需补药数" Property="NeedQuantity">
</RadzenDataGridColumn>
</Columns>
</RadzenDataGrid>
</Template>
<Columns>
<RadzenDataGridColumn Frozen="true" Width="200px" Title="药箱号" Property="DrawerNo">
<Template Context="DrawerNo">
@DrawerNo.DrawerNo 号药箱
</Template>
</RadzenDataGridColumn>
<RadzenDataGridColumn Title="总库存" Property="TotalQuantity"></RadzenDataGridColumn>
</Columns>
</RadzenDataGrid>
</div>
@code {
@inject IChannelListDao channelStockDao;
@inject DialogService dialogService;
RadzenDataGrid<ChannelList> grid;
bool isLoading;
int count;
private IEnumerable<ChannelList>? _forecasts;
DateTime start;
DateTime end;
IList<ChannelList> selectedChannelLists;
protected override async Task OnInitializedAsync()
{
await base.OnInitializedAsync();
isLoading = true;
var result = await channelStockDao.GetAllBoxAddDrug(10, 0);
// Update the Data property
_forecasts = result.Desserts;
isLoading = false;
}
protected override async Task OnAfterRenderAsync(bool firstRender)
{
base.OnAfterRender(firstRender);
if (firstRender)
{
// await grid.ExpandRows(grid.PagedView.Where(di => di.Stocks.Count > 0));
}
}
void RowRender(RowRenderEventArgs<ChannelList> args)
{
args.Expandable = args.Data.ChannelStocks.Count > 0;
}
async void OnRowSelect(ChannelList cl)
{
var b = await dialogService.OpenAsync<BoxAddDetailDialog>(
$"{cl.DrawerNo}号药箱取药",
new Dictionary<string, object>() { { "boxChannelList", cl } },
new DialogOptions() { Width = "85vw", Resizable = true, Draggable = true, ShowClose = false }
);
if (b)
{
await grid.Reload();
}
}
async void StockExport()
{
}
async void AccountBookExport()
{
}
}

View File

@ -0,0 +1,162 @@
@page "/Box/BoxBindings"
<div class="container-fluid">
<div class="row">
<div class="col-12 mb-4">
<RadzenDataList @ref="grid" LoadData="@LoadData" WrapItems="true" Count="@count" IsLoading="@isLoading" Data="@_forecasts" PageSize="6" AllowPaging="true" PagerHorizontalAlign="HorizontalAlign.Left"
ShowPagingSummary="true" PagingSummaryFormat="{0}/{1} 共{2}条数据">
<Template Context="channel">
<RadzenCard class="col-3">
<RadzenRow>
<RadzenColumn Size="8" Class="rz-text-truncate">
<b class="rz-pr-3">@(channel.DrawerNo)</b>
<b>号手术间</b>
</RadzenColumn>
<RadzenColumn Size="4" Class="rz-text-align-end">
@if (channel.TotalQuantity == 0)
{
<RadzenButton ButtonStyle="ButtonStyle.Secondary" Variant="Variant.Outlined" Size="ButtonSize.Small" Click="@(() => EditChannel(channel))" Text="绑定/解绑" />
}
</RadzenColumn>
</RadzenRow>
<hr style="border: none; background-color: rgba(0,0,0,.2); height: 1px; margin: 1rem 0;" />
<RadzenStack Orientation="Orientation.Horizontal" AlignItems="AlignItems.Center">
<RadzenStack Gap="0">
<RadzenText TextStyle="TextStyle.Overline" class="rz-display-flex rz-mt-2 rz-my-0">套餐</RadzenText>
@if (channel.DrugId == null || channel.TotalQuantity == 0)
{
<RadzenDropDownDataGrid AllowVirtualization="true" Name="planName" TValue="Plan" @bind-Value="channel.PlanInfo" Data="@plans"
Style="width:100%; display: block;" AllowFilteringByAllStringColumns="true" TextProperty="Name">
<Columns>
<RadzenDropDownDataGridColumn Property="Name" Title="套餐名称" Sortable="false" />
<RadzenDropDownDataGridColumn Property="Description" Width="120px" Title="套餐描述" Sortable="false" />
</Columns>
</RadzenDropDownDataGrid>
<RadzenCustomValidator Component="planName" Validator="@(()=>(channel.PlanInfo.Id>0))" Popup=true Text="请先选择套餐再点击绑定按钮" />
}
else
{
<RadzenText TextStyle="TextStyle.Body1"><b>@(channel.PlanInfo.Name)</b></RadzenText>
}
<RadzenText TextStyle="TextStyle.Overline" class="rz-display-flex rz-mt-4 rz-mb-0">总库存</RadzenText>
<RadzenText TextStyle="TextStyle.Body1"><b>@(channel.TotalQuantity)</b></RadzenText>
</RadzenStack>
</RadzenStack>
</RadzenCard>
</Template>
</RadzenDataList>
</div>
</div>
</div>
@code {
@inject IChannelListDao channelListDao;
@inject IDrugInfoDao drugInfoDao;
@inject DialogService dialogService;
@inject NotificationService _message
RadzenDataList<ChannelList> grid;
bool isLoading;
int count;
private IEnumerable<ChannelList>? _forecasts;
List<DrugInfo> drugInfos;
List<DrugManuNo> drugManuNos;
DrugInfo drugInfo;
DrugManuNo drugManuNo;
List<Plan> plans;
protected override async Task OnInitializedAsync()
{
await base.OnInitializedAsync();
//drugInfos = await drugInfoDao.GetAllDrug();
}
async Task LoadData(LoadDataArgs args)
{
isLoading = true;
var result = await channelListDao.GetAllChannelListWithPlan(args.Top, args.Skip);
// Update the Data property
_forecasts = result.Desserts;
// Update the count
count = result.TotalDesserts;
isLoading = false;
plans = result.Other;
}
async Task reloadGrid()
{
await grid.Reload();
}
async Task EditChannel(ChannelList list)
{
if (list.PlanInfo.Id > 0)
{
// 说明之前有绑定并且未改变,那么就是在进行解绑
if (list.DrugId != null && list.DrugId.Equals(list.PlanInfo.Id.ToString()))
{
var b = await channelListDao.UnBindBox(list);
if (b)
{
_message.Notify(
new NotificationMessage { Severity = NotificationSeverity.Success, Summary = "提示", Detail = $"解除绑定成功", Duration = 4000 }
);
await reloadGrid();
}
}
// 否则是进行绑定
else
{
var b = await channelListDao.BindBox(list);
if (b)
{
_message.Notify(
new NotificationMessage { Severity = NotificationSeverity.Success, Summary = "提示", Detail = $"绑定成功", Duration = 4000 }
);
await reloadGrid();
}
}
}
else
{
if (list.PlanInfo != null)
{
// 说明只设置了药品
var b = await channelListDao.BindBox(list);
if (b)
{
_message.Notify(
new NotificationMessage { Severity = NotificationSeverity.Success, Summary = "提示", Detail = $"绑定成功", Duration = 4000 }
);
await reloadGrid();
}
}
// 什么都没有选择或者么有改变,只是点击了按钮,此时不操作
else
{
}
}
}
}

View File

@ -0,0 +1,114 @@
@page "/setting/Change"
<div class="container-fluid">
<div class="row">
<div class="col-12 mb-4">
<form onsubmit="@(() => grid.Reload())">
<RadzenFieldset Text="查询">
<RadzenStack Orientation="Orientation.Horizontal" Gap="1rem">
<RadzenRow AlignItems="AlignItems.Center">
<RadzenColumn Size="4">
<RadzenLabel Text="开始时间" Component="Start" />
</RadzenColumn>
<RadzenColumn Size="8">
<RadzenDatePicker DateFormat="yyyy-MM-dd HH:mm:ss" ShowTime="true" @bind-Value="start" Style="width: 100%;" Name="Start" />
</RadzenColumn>
</RadzenRow>
<RadzenRow AlignItems="AlignItems.Center">
<RadzenColumn Size="4">
<RadzenLabel Text="结束时间" Component="End" />
</RadzenColumn>
<RadzenColumn Size="8">
<RadzenDatePicker DateFormat="yyyy-MM-dd HH:mm:ss" ShowTime="true" @bind-Value="end" Style="width: 100%;" Name="End" />
</RadzenColumn>
</RadzenRow>
<RadzenRow AlignItems="AlignItems.Center">
<RadzenColumn Size="12">
<RadzenButton Size="ButtonSize.Large" ButtonType="ButtonType.Submit" IsBusy="isLoading" Icon="search" Text="查询" />
<RadzenButton Size="ButtonSize.Large" Click="reloadGrid" IsBusy="isLoading" Icon="refresh" Text="重置" ButtonStyle="ButtonStyle.Warning" />
</RadzenColumn>
</RadzenRow>
</RadzenStack>
</RadzenFieldset>
</form>
</div>
<div class="col-12 mb-4">
<RadzenDataGrid @ref="grid"
LoadData="@LoadData"
IsLoading="@isLoading"
Count="@count"
EmptyText="无数据"
Data="@_forecasts"
AllowColumnResize="true" AllowAlternatingRows="false"
SelectionMode="DataGridSelectionMode.Single"
AllowPaging="true" PageSize="10" PagerHorizontalAlign="HorizontalAlign.Left" ShowPagingSummary="true" PagingSummaryFormat="{0}/{1} 共{2}条数据">
<Columns>
<RadzenDataGridColumn Title="日期" Property="optDate">
<Template Context="mr">
@mr.optDate.ToString("yyyy-MM-dd")
</Template>
</RadzenDataGridColumn>
<RadzenDataGridColumn Title="交班人发药人" Property="FromOperator"></RadzenDataGridColumn>
<RadzenDataGridColumn Title="交班人审核人" Property="FromRviewer"></RadzenDataGridColumn>
<RadzenDataGridColumn Title="接班人发药人" Property="ToOperator"></RadzenDataGridColumn>
<RadzenDataGridColumn Title="接班人审核人" Property="ToReviewer"></RadzenDataGridColumn>
<RadzenDataGridColumn Title="接班日期" Property="ToDate">
<Template Context="mr">
@mr.ToDate.ToString("yyyy-MM-dd")
</Template>
</RadzenDataGridColumn>
<RadzenDataGridColumn Title="当班状态" Property="State">
</RadzenDataGridColumn>
<RadzenDataGridColumn title="库位" Property="Location"></RadzenDataGridColumn>
</Columns>
</RadzenDataGrid>
</div>
</div>
</div>
@code {
@inject IHkcChangeShiftsDao hkcChangeShiftsDao;
@inject DialogService dialogService;
@inject NavigationManager navigate;
RadzenDataGrid<HkcChangeShifts> grid;
bool isLoading;
int count;
private IEnumerable<HkcChangeShifts>? _forecasts;
DateTime start;
DateTime end;
[Parameter] public string type { get; set; }
protected override void OnParametersSet()
{
if (grid != null)
{
reloadGrid();
}
}
async Task LoadData(LoadDataArgs args)
{
isLoading = true;
var result = await hkcChangeShiftsDao.GetChangeShiftRecordAsync(start, end,args.Top, args.Skip);
// Update the Data property
_forecasts = result.Desserts;
// Update the count
count = result.TotalDesserts;
isLoading = false;
}
async Task reloadGrid()
{
start = DateTime.MinValue;
end = DateTime.MinValue;
await grid.Reload();
}
}

View File

@ -0,0 +1,139 @@
@page "/Box/Check"
@using MasaBlazorApp3.Pojo.Config
<RadzenStack Orientation="Orientation.Horizontal" class="col-12 mb-4">
<div class="col-12 row justify-content-center align-items-center text-center" style="background: url('/images/box-16.jpg') no-repeat; background-size: 100% 100%; width: 380px; height:650px">
<div class="row justify-content-around align-items-center" style="margin-top: 220px; height: 430px;">
@foreach (int i in DrawerNos)
{
<RadzenButton class="col-5" Click="@(() => SelectDrawer(i))" Text="@i.ToString()" Disabled="@(status > 0)" Shade="Shade.Light" Variant="@(drawerNo !=i ? Variant.Outlined : Variant.Flat)" />
}
</div>
</div>
<div class="col-9 mb-4">
<form onsubmit="@(() => grid.Reload())">
<RadzenFieldset Text="查询">
<RadzenStack Orientation="Orientation.Horizontal" Gap="1rem">
<RadzenRow AlignItems="AlignItems.Center">
<RadzenColumn Size="4">
<RadzenLabel Text="处方号" Component="OrderNo" />
</RadzenColumn>
<RadzenColumn Size="8">
<RadzenTextBox @bind-Value="OrderNo" Style="width: 100%;" Name="OrderNo"></RadzenTextBox>
</RadzenColumn>
</RadzenRow>
<RadzenRow AlignItems="AlignItems.Center">
<RadzenColumn Size="4">
<RadzenLabel Text="处方时间" Component="OrderDate" />
</RadzenColumn>
<RadzenColumn Size="8">
<RadzenDatePicker DateFormat="yyyy-MM-dd" CurrentDateChanged="@OnCurrentDateChanged" @bind-Value="OrderDate" Style="width: 100%;" Name="OrderDate" />
</RadzenColumn>
</RadzenRow>
<RadzenRow AlignItems="AlignItems.Center">
<RadzenColumn Size="12">
<RadzenButton Size="ButtonSize.Medium" ButtonType="ButtonType.Submit" IsBusy="isLoading" Icon="search" Text="查询" />
<RadzenButton Size="ButtonSize.Medium" Click="reloadGrid" IsBusy="isLoading" Icon="refresh" Text="重置" ButtonStyle="ButtonStyle.Warning" />
</RadzenColumn>
</RadzenRow>
</RadzenStack>
</RadzenFieldset>
<RadzenButton Size="ButtonSize.Medium" Click="Confirm" ButtonType="ButtonType.Button" IsBusy="isLoading" Icon="check_circle" Text="确认" Style="margin:0.5rem" />
</form>
<RadzenDataGrid @ref="grid" AllowRowSelectOnRowClick="@allowRowSelectOnRowClick" AllowFiltering="true" LoadData="@LoadData"
FilterPopupRenderMode="PopupRenderMode.OnDemand" FilterCaseSensitivity="FilterCaseSensitivity.CaseInsensitive"
Data="@orderInfos" ColumnWidth="200px" IsLoading="@isLoading" Count="@count" EmptyText="无数据"
SelectionMode="DataGridSelectionMode.Multiple" @bind-Value=@selectedOrderInfos
AllowPaging="true" PageSize="10" PagerHorizontalAlign="HorizontalAlign.Left" ShowPagingSummary="true" PagingSummaryFormat="{0}/{1} 共{2}条数据">
<Columns>
<RadzenDataGridColumn Sortable="false" Filterable="false" Width="4rem">
<HeaderTemplate>
<RadzenCheckBox TabIndex="-1" TriState="false" TValue="bool?" InputAttributes="@(new Dictionary<string,object>(){ { "aria-label", "Select all items" }})"
Value="@(selectedOrderInfos == null || selectedOrderInfos?.Any() != true ? false : !orderInfos.All(i => selectedOrderInfos.Contains(i)) ? null : orderInfos.Any(i => selectedOrderInfos.Contains(i)))"
Change="@(args => selectedOrderInfos = args == true ? orderInfos.ToList() : null)" />
</HeaderTemplate>
<Template Context="data">
<RadzenCheckBox TabIndex="-1" TriState="false" Value="@(selectedOrderInfos != null && selectedOrderInfos.Contains(data))" InputAttributes="@(new Dictionary<string,object>(){ { "aria-label", "Select item" }})"
TValue="bool" Change="@(args => { if (!allowRowSelectOnRowClick) { grid.SelectRow(data); } })" />
</Template>
</RadzenDataGridColumn>
<RadzenDataGridColumn Property="PatientName" Title="姓名" Sortable="false" Filterable="false" Width="4rem" />
<RadzenDataGridColumn Property="Sex" Title="性别" Sortable="false" Filterable="false" Width="2rem" />
<RadzenDataGridColumn Property="OrderNo" Title="单号" Sortable="false" Filterable="false" Width="8rem" />
<RadzenDataGridColumn Property="Detail.Drug.DrugName" Title="药品名称" FormatString="{0:d}" Sortable="false" Filterable="false" Width="8rem" />
<RadzenDataGridColumn Property="Detail.SetManuNo" Title="药品批次" Sortable="false" Filterable="false" Width="8rem" />
<RadzenDataGridColumn Property="Detail.Quantity" Title="数量" Sortable="false" Filterable="false" Width="2rem" />
</Columns>
</RadzenDataGrid>
</div>
</RadzenStack>
@code {
@inject IOrderInfoDao orderInfoDao;
@inject DialogService dialogService;
@inject Microsoft.Extensions.Options.IOptions<Pojo.Config.SettingConfig> setting;
bool allowRowSelectOnRowClick = true;
IEnumerable<OrderInfo> orderInfos;
IList<OrderInfo> selectedOrderInfos;
RadzenDataGrid<OrderInfo> grid;
bool isLoading;
int count;
int[] DrawerNos = new int[] { 1, 2, 3, 4, 5, 6, 7, 8 };
int status = 0;
int drawerNo = 1;
string OrderNo;
DateTime OrderDate;
void SelectDrawer(int drawerNo)
{
this.drawerNo = drawerNo;
grid.Reload();
}
void OnCurrentDateChanged(DateTime args)
{
OrderDate = new DateTime(args.Year, args.Month, args.Day);
}
//重置
async Task reloadGrid()
{
OrderNo = "";
OrderDate = DateTime.MinValue;
await grid.Reload();
}
//确认
async Task Confirm()
{
orderInfoDao.CheckOrderInfo(selectedOrderInfos, drawerNo);
}
async Task LoadData(LoadDataArgs args)
{
isLoading = true;
var result = await orderInfoDao.GetAllOrderInfoByBox(drawerNo, OrderNo, OrderDate, args.Top, args.Skip);
// Update the Data property
orderInfos = result.Desserts;
// Update the count
count = result.TotalDesserts;
isLoading = false;
DrawerNos = await orderInfoDao.GetDrawerNum(setting.Value.boxMachineId);
}
// protected override async Task OnInitializedAsync()
// {
// await base.OnInitializedAsync();
// // orderInfos = dbContext.Employees;
// var result = await orderInfoDao.GetAllOrderInfo(OrderNo, OrderDate, args.Top, args.Skip);
// // Update the Data property
// orderInfos = result.Desserts;
// // Update the count
// count = result.TotalDesserts;
// isLoading = false;
// }
}

View File

@ -252,7 +252,7 @@
$"删除确认", $"删除确认",
new Dictionary<string, object>() { { "confirmInfo", "确认要删除药品:"+drugInfo.DrugName+"吗?" } }, new Dictionary<string, object>() { { "confirmInfo", "确认要删除药品:"+drugInfo.DrugName+"吗?" } },
new DialogOptions() { Width = "45vw", Resizable = true, Draggable = true, ShowClose = false }); new DialogOptions() { Width = "45vw", Resizable = true, Draggable = true, ShowClose = false });
if(b) if(b)
{ {
// 数据库删除 // 数据库删除
drugInfoDao.DeleteDrugInfo(drugInfo.DrugId); drugInfoDao.DeleteDrugInfo(drugInfo.DrugId);
@ -289,7 +289,7 @@
void CancelEdit(DrugManuNo drugManuNo) void CancelEdit(DrugManuNo drugManuNo)
{ {
Reset(drugManuNo); Reset(drugManuNo);
SelectedDrugs.FirstOrDefault().Manus.Remove(drugManuNo);
ManusGrid.CancelEditRow(drugManuNo); ManusGrid.CancelEditRow(drugManuNo);
ManusGrid.Reload(); ManusGrid.Reload();
} }
@ -308,6 +308,7 @@
); );
if(b) if(b)
{ {
SelectedDrugs.FirstOrDefault().Manus.Remove(drugManuNo);
// 数据库删除 // 数据库删除
drugManuNoDao.DeleteDrugManuNo(drugManuNo.Id); drugManuNoDao.DeleteDrugManuNo(drugManuNo.Id);
await ManusGrid.Reload(); await ManusGrid.Reload();

View File

@ -0,0 +1,119 @@
@page "/manage/setting/Fridge"
@using MasaBlazorApp3.Util
@using Newtonsoft.Json.Linq
@using log4net
@layout SettingLayout
<div class="main">
<div class="top-row px-4">
<RadzenButton Icon="account_circle" Style="margin-left: auto;" Click="@SaveMethod">
<ChildContent>
保存设置
</ChildContent>
</RadzenButton>
</div>
<div class="content px-4">
<RadzenCard class="rz-my-6">
<RadzenStack Orientation="Orientation.Horizontal" AlignItems="AlignItems.Start" Wrap="FlexWrap.Wrap">
<RadzenStack Orientation="Orientation.Vertical" Gap="4px">
冰箱温度区间
<RadzenTextBox Placeholder="2-8" Value="@temperatureRange" Change="@(args=>temperatureRange=args)"></RadzenTextBox>
</RadzenStack>
<RadzenStack Orientation="Orientation.Vertical" Gap="4px">
冰箱状态
<RadzenRadioButtonList Value=@fridgeStateValue TValue="int" Change=@(args => fridgeStateValue = args)>
<Items>
<RadzenRadioButtonListItem Text="开" Value="0" />
<RadzenRadioButtonListItem Text="关" Value="1" />
</Items>
</RadzenRadioButtonList>
</RadzenStack>
<RadzenStack Orientation="Orientation.Vertical" Gap="4px">
报警状态
<RadzenRadioButtonList Value="@alertStateValue" TValue="int" Change="@(args=>alertStateValue=args)">
<Items>
<RadzenRadioButtonListItem Text="开" Value="0"/>
<RadzenRadioButtonListItem Text="关" Value="1"/>
</Items>
</RadzenRadioButtonList>
</RadzenStack>
</RadzenStack>
</RadzenCard>
</div>
</div>
@inject Microsoft.Extensions.Options.IOptions<Pojo.Config.fridgeConfig> setting;
@inject PortUtil port;
@inject NotificationService _message
@code {
private readonly ILog logger = LogManager.GetLogger(typeof(LoginDialog));
int fridgeStateValue = 1;
int alertStateValue = 1;
string temperatureRange = "2-8";
protected override void OnInitialized()
{
fridgeStateValue = setting.Value.fridgeState;
alertStateValue = setting.Value.alertState;
temperatureRange = setting.Value.temperatureRange;
base.OnInitialized();
}
//保存
async Task SaveMethod()
{
// 获取当前工作目录
string currentDirectory = Directory.GetCurrentDirectory();
// setting.Value.fridgeState = fridgeStateValue;
// setting.Value.alertState = alertStateValue;
// setting.Value.temperatureRange = temperatureRange;
string filePath =Path.Combine(currentDirectory, "appsettings.json");
string jsonString= File.ReadAllText(filePath);
var jsonNode = JObject.Parse(jsonString);
jsonNode["fridge"]["temperatureRange"] = temperatureRange;
jsonNode["fridge"]["fridgeState"]= fridgeStateValue;
jsonNode["fridge"]["alertState"] = alertStateValue;
var options = new JsonSerializerOptions { WriteIndented = true };
File.WriteAllText(filePath, jsonNode.ToString(Newtonsoft.Json.Formatting.Indented));
if (fridgeStateValue==0)
{
await port.FridegOpen(1);
}
else
{
await port.FridgeOff(1);
}
if (alertStateValue==0)
{
await port.FridgeAlarmOn(1);
}
else
{
await port.FridgeAlarmOff(1);
}
string[] newRange = temperatureRange.Split('-');
if(newRange.Length>=2)
{
string[] range= setting.Value.temperatureRange.Split('-');
bool bMix = float.TryParse(newRange[0], out float Min);
bool bMax = float.TryParse(newRange[1], out float Max);
if (bMix && bMax)
{
if (range == null || range[0] == null||(range != null && range[0] != null && range[0] != newRange[0]))
{
//设定冰箱温度最小值
await port.FridgeMinSetting(Min, 1);
}
if (range == null || range[0] == null || (range != null && range[1] != null && range[1] != newRange[1]))
{
//设定冰箱温度最大值
await port.FridgeMaxSetting(Max, 1);
}
}
}
_message.Notify(
new NotificationMessage { Severity = NotificationSeverity.Success, Summary = "提示", Detail = $"保存成功", Duration = 4000 }
);
logger.Info($"修改冰箱设置");
}
}

View File

@ -120,7 +120,7 @@
} }
</RadzenStack> </RadzenStack>
<RadzenStack class="home-menu rz-background-color-success-lighter rz-text-white rz-ripple" JustifyContent="JustifyContent.Center" @onclick="@(() => jump2Page(5))" Style="height: 100%;width:50%"> <RadzenStack class="home-menu rz-background-color-success-lighter rz-text-white rz-ripple" JustifyContent="JustifyContent.Center" @onclick="@(() => jump2Page(5))" Style="height: 100%;width:50%">
<RadzenText class="rz-color-white" TextStyle="TextStyle.H2" TextAlign="TextAlign.Center">系统设置</RadzenText> <RadzenText class="rz-color-white" TextStyle="TextStyle.H2" TextAlign="TextAlign.Center">系统管理</RadzenText>
@if (globalStateService.Operator != null) @if (globalStateService.Operator != null)
{ {
@if (!globalStateService.Operator.role.permissionIds.Any(id => id - 50 > 0 && id - 50 < 10)) @if (!globalStateService.Operator.role.permissionIds.Any(id => id - 50 > 0 && id - 50 < 10))

View File

@ -20,6 +20,7 @@
@inject PortUtil PortUtil; @inject PortUtil PortUtil;
@inject FingerprintUtil FingerprintUtil; @inject FingerprintUtil FingerprintUtil;
@inject GlobalStateService globalStateService; @inject GlobalStateService globalStateService;
@inject IOptions<PortConfig> portSetting;
string msg; string msg;
@ -106,6 +107,22 @@
errMsg += "【条码扫描模块连接失败】"; errMsg += "【条码扫描模块连接失败】";
InvokeAsync(StateHasChanged); InvokeAsync(StateHasChanged);
} }
if (portSetting.Value.fridgePortExist)
{
try
{
PortUtil.fridgeSerial.Open();
logger.Info($"冰箱串口打开结果【{PortUtil.fridgeSerial.IsOpen}】");
msg = "冰箱串口连接成功";
InvokeAsync(StateHasChanged);
}
catch (Exception)
{
msg = "冰箱串口打开失败";
errMsg += "【冰箱串口打开失败】";
InvokeAsync(StateHasChanged);
}
}
globalStateService.isInit = true; globalStateService.isInit = true;
dialogService.Close(); dialogService.Close();
} }

View File

@ -0,0 +1,74 @@
@page "/manage/setting/login"
@page "/manage/setting"
@using Newtonsoft.Json.Linq
@using log4net
@layout SettingLayout
<div class="main">
<div class="top-row px-4">
<RadzenButton Icon="account_circle" Style="margin-left: auto;" Click="@SaveMethod">
<ChildContent>
保存设置
</ChildContent>
</RadzenButton>
</div>
<div class="content px-4">
<RadzenCard class="rz-my-6">
<RadzenStack Orientation="Orientation.Horizontal" AlignItems="AlignItems.Start" Wrap="FlexWrap.Wrap">
<RadzenStack Orientation="Orientation.Vertical" Gap="4px">
登录模式
<RadzenRadioButtonList Value=@loginValue TValue="int" Change=@(args => loginValue = args)>
<Items>
<RadzenRadioButtonListItem Text="单人登录" Value="1" />
<RadzenRadioButtonListItem Text="双人登录" Value="2" />
</Items>
</RadzenRadioButtonList>
</RadzenStack>
@* <RadzenStack Orientation="Orientation.Vertical" Gap="4px">
优先登录
<RadzenRadioButtonList Value=@preValue TValue="int" Change=@(args => preValue = args)>
<Items>
<RadzenRadioButtonListItem Text="操作人" Value="1" />
<RadzenRadioButtonListItem Text="审核人" Value="2" />
</Items>
</RadzenRadioButtonList>
</RadzenStack> *@
</RadzenStack>
</RadzenCard>
</div>
</div>
@inject Microsoft.Extensions.Options.IOptions<Pojo.Config.setting> setting;
@inject Microsoft.Extensions.Options.IOptions<Pojo.Config.SettingConfig> setting;
@inject NotificationService _message
@code {
private readonly ILog logger = LogManager.GetLogger(typeof(LoginDialog));
int loginValue = 1;
// int preValue = 1;
protected override void OnInitialized()
{
loginValue = setting.Value.loginMode;
base.OnInitialized();
}
//保存
async Task SaveMethod()
{
// 获取当前工作目录
string currentDirectory = Directory.GetCurrentDirectory();
// setting.Value.fridgeState = fridgeStateValue;
// setting.Value.alertState = alertStateValue;
// setting.Value.temperatureRange = temperatureRange;
string filePath = Path.Combine(currentDirectory, "appsettings.json");
string jsonString = File.ReadAllText(filePath);
var jsonNode = JObject.Parse(jsonString);
jsonNode["setting"]["loginMode"] = loginValue;
var options = new JsonSerializerOptions { WriteIndented = true };
File.WriteAllText(filePath, jsonNode.ToString(Newtonsoft.Json.Formatting.Indented));
_message.Notify(
new NotificationMessage { Severity = NotificationSeverity.Success, Summary = "提示", Detail = $"保存成功", Duration = 4000 }
);
logger.Info($"修改用户登录设置");
}
}

View File

@ -0,0 +1,431 @@
@page "/Box/Plan"
<style>
.rz-custom-header {
width: 100%;
}
</style>
<div class="container-fluid">
<div class="row">
<div class="col-12 mb-4">
<RadzenFieldset>
<RadzenStack Orientation="Orientation.Horizontal" Gap="1rem">
<RadzenRow AlignItems="AlignItems.Center">
<RadzenColumn Size="12" Style="margin-top:12px">
<RadzenButton Size="ButtonSize.Large" Click="reloadGrid" IsBusy="isLoading" Icon="refresh" Text="刷新" ButtonStyle="ButtonStyle.Warning" />
<RadzenButton Size="ButtonSize.Large" ButtonStyle="ButtonStyle.Success" Icon="add_circle_outline" Click="@InsertPlanRow" Text="新增套餐" />
</RadzenColumn>
</RadzenRow>
</RadzenStack>
</RadzenFieldset>
</div>
<div class="col-6 mb-4">
<RadzenDataGrid @ref="grid"
LoadData="@LoadData"
@bind-Value="@SelectedPlan"
IsLoading="@isLoading"
Count="@count"
EmptyText="无数据"
Data="@_forecasts"
AllowColumnResize="true" AllowAlternatingRows="false"
SelectionMode="DataGridSelectionMode.Single" RowUpdate="@((Plan di)=>{OnUpdatePlanRow(di);})" RowCreate="@((Plan di)=>{OnCreatePlanRow(di);})"
AllowPaging="true" PageSize="10" PagerHorizontalAlign="HorizontalAlign.Left" ColumnWidth="100px" ShowPagingSummary="true" PagingSummaryFormat="{0}/{1} 共{2}条数据">
<Columns>
<RadzenDataGridColumn Frozen="true" Title="套餐名称" Property="Name">
<EditTemplate Context="planInfo">
<RadzenTextBox Name="Name" @bind-Value="planInfo.Name" Style="width:100%; display: block;" />
<RadzenRequiredValidator Text="请填写套餐名称" Component="Name" Popup="true" />
</EditTemplate>
</RadzenDataGridColumn>
<RadzenDataGridColumn Width="200px" Title="套餐描述" Property="Description">
<EditTemplate Context="planInfo">
<RadzenTextBox Name="Description" @bind-Value="planInfo.Description" Style="width:100%;display:block;" />
<RadzenRequiredValidator Text="请填写套餐描述" Component="Description" Popup="true" />
</EditTemplate>
</RadzenDataGridColumn>
<RadzenDataGridColumn Context="planInfo" Title="操作" Filterable="false" Sortable="false" TextAlign="TextAlign.Left" Frozen="true" FrozenPosition="FrozenColumnPosition.Right" Width="8rem">
<Template Context="planInfo">
<RadzenButton Icon="edit" ButtonStyle="ButtonStyle.Light" Variant="Variant.Flat" Size="ButtonSize.Medium" Click="@(args => EditPlanRow(planInfo))" @onclick:stopPropagation="true">
</RadzenButton>
<RadzenButton ButtonStyle="ButtonStyle.Danger" Icon="delete" Variant="Variant.Flat" Shade="Shade.Lighter" Size="ButtonSize.Medium" class="my-1 ms-1" Click="@(args => DeletePlanRow(planInfo))" @onclick:stopPropagation="true">
</RadzenButton>
</Template>
<EditTemplate Context="planInfo">
<RadzenButton Icon="check" ButtonStyle="ButtonStyle.Success" Variant="Variant.Flat" Size="ButtonSize.Medium" Click="@((args) => SavePlanRow(planInfo))" aria-label="Save">
</RadzenButton>
<RadzenButton Icon="close" ButtonStyle="ButtonStyle.Light" Variant="Variant.Flat" Size="ButtonSize.Medium" class="my-1 ms-1" Click="@((args) => CancelPlanEdit(planInfo))" aria-label="Cancel">
</RadzenButton>
<RadzenButton ButtonStyle="ButtonStyle.Danger" Icon="delete" Variant="Variant.Flat" Shade="Shade.Lighter" Size="ButtonSize.Medium" class="my-1 ms-1" Click="@(args => DeletePlanRow(planInfo))" aria-label="Delete">
</RadzenButton>
</EditTemplate>
</RadzenDataGridColumn>
</Columns>
</RadzenDataGrid>
</div>
<div class="col-6 mb-4">
<RadzenDataGrid @ref="PlanDetailsGrid" EmptyText="无数据"
Data="@(SelectedPlan?.FirstOrDefault()?._PlanDetails)"
RowUpdate="@((PlanDetails pd) => { OnUpdateRow(pd); })"
RowCreate="@((PlanDetails pd) => { OnCreateRow(pd); })"
KeyProperty="Id"
AllowColumnResize="true" AllowAlternatingRows="false">
@* <HeaderTemplate>
<RadzenRow JustifyContent="JustifyContent.End" AlignItems="AlignItems.Center">
<RadzenButton Icon="download" Text="添加" Variant="Variant.Outlined" />
</RadzenRow>
</HeaderTemplate> *@
<Columns>
<RadzenDataGridColumn Title="序号" Property="index" Width="5rem">
<Template Context="data">
@(SelectedPlan.FirstOrDefault()?._PlanDetails.IndexOf(data) + 1)
</Template>
</RadzenDataGridColumn>
<RadzenDataGridColumn Title="药品" Property="_DrugInfo.DrugName" Width="25rem">
<Template Context="data">
<RadzenText TextStyle="TextStyle.Body1"><b>@(data._DrugInfo?.DrugName)</b></RadzenText>
<RadzenText TextStyle="TextStyle.Body1"><b>@(data._DrugInfo?.DrugSpec)</b></RadzenText>
</Template>
<EditTemplate Context="planDetails">
<RadzenDropDownDataGrid AllowVirtualization="true" Name="drugName" TValue="DrugInfo" @bind-Value="planDetails._DrugInfo" Data="@drugInfos"
Style="width:100%; display: block;" AllowFilteringByAllStringColumns="true" TextProperty="DrugName">
<Columns>
<RadzenDropDownDataGridColumn Property="DrugId" Title="药品编码" />
<RadzenDropDownDataGridColumn Property="DrugName" Width="120px" Title="名称" />
<RadzenDropDownDataGridColumn Property="DrugSpec" Title="规格" />
</Columns>
</RadzenDropDownDataGrid>
<RadzenCustomValidator Component="drugName" Validator="@(()=>(planDetails._DrugInfo.DrugId!=null))" Text="请选择药品" Popup=true />
<RadzenCustomValidator Component="drugName" Validator="@(()=>ValidatroDrug(planDetails))" Text="套餐中已包含该药品" Popup=true />
</EditTemplate>
</RadzenDataGridColumn>
<RadzenDataGridColumn Title="基数" Property="BaseQuantity" Width="5rem">
<EditTemplate Context="planDetails">
<RadzenNumeric Name="BaseQuantity" @bind-Value="planDetails.BaseQuantity" Style="width:100%; display: block;" />
<RadzenNumericRangeValidator Style="position: absolute;z-index: 9999;" Min="0" Text="请填写正确的添加数量" Component="BaseQuantity" Popup="true" />
</EditTemplate>
</RadzenDataGridColumn>
<RadzenDataGridColumn Title="操作" Filterable="false" Sortable="false" TextAlign="TextAlign.Left" Frozen="true" FrozenPosition="FrozenColumnPosition.Right" Width="8rem">
<Template Context="planDetails">
<RadzenButton Icon="edit" ButtonStyle="ButtonStyle.Light" Variant="Variant.Flat" Size="ButtonSize.Medium" Click="@(args => EditRow(planDetails))" @onclick:stopPropagation="true">
</RadzenButton>
<RadzenButton ButtonStyle="ButtonStyle.Danger" Icon="delete" Variant="Variant.Flat" Shade="Shade.Lighter" Size="ButtonSize.Medium" class="my-1 ms-1" Click="@(args => DeleteRow(planDetails))" @onclick:stopPropagation="true">
</RadzenButton>
</Template>
<EditTemplate Context="planDetails">
<RadzenButton Icon="check" ButtonStyle="ButtonStyle.Success" Variant="Variant.Flat" Size="ButtonSize.Medium" Click="@((args) => InsertRow(planDetails))" aria-label="Save">
</RadzenButton>
<RadzenButton Icon="close" ButtonStyle="ButtonStyle.Light" Variant="Variant.Flat" Size="ButtonSize.Medium" class="my-1 ms-1" Click="@((args) => CancelEdit(planDetails))" aria-label="Cancel">
</RadzenButton>
<RadzenButton ButtonStyle="ButtonStyle.Danger" Icon="delete" Variant="Variant.Flat" Shade="Shade.Lighter" Size="ButtonSize.Medium" class="my-1 ms-1" Click="@(args => DeleteRow(planDetails))" aria-label="Delete">
</RadzenButton>
</EditTemplate>
</RadzenDataGridColumn>
</Columns>
</RadzenDataGrid>
<div style="margin-top:5px">
<RadzenButton Size="ButtonSize.Medium" ButtonStyle="ButtonStyle.Success" Icon="add_circle_outline" Click="@InsertRow" Text="新增药品" />
</div>
</div>
</div>
</div>
@code {
@inject IPlanDao planDao;
@inject DialogService dialogService;
@inject NotificationService _message
RadzenDataGrid<Plan> grid;
RadzenDataGrid<PlanDetails> PlanDetailsGrid;
bool isLoading;
int count;
private IEnumerable<Plan>? _forecasts;
IList<Plan>? SelectedPlan { get; set; } = new List<Plan>();
List<PlanDetails> SelectedPlanDetails = new List<PlanDetails>();
List<DrugInfo> drugInfos;
async Task LoadData(LoadDataArgs args)
{
isLoading = true;
var result = await planDao.GetAllPlanInfo();
// Update the Data property
_forecasts = result.Desserts;
count = result.TotalDesserts;
SelectedPlan = new List<Plan>() { _forecasts.FirstOrDefault() };
isLoading = false;
drugInfos = result.Other;
}
// async Task LoadDetailDate(LoadDataArgs args)
// {
// // SelectedPlan = new List<Plan>() { await planDao.GetPlanById(SelectedPlan.FirstOrDefault().Id) };
// }
async Task reloadGrid()
{
await grid.Reload();
}
void OnUpdatePlanRow(Plan dl)
{
// Reset(dl);
// 数据库更新
planDao.UpdatePlanInfo(dl);
grid.Reload();
}
void OnCreatePlanRow(Plan dl)
{
// 数据库添加套餐
planDao.InsertPlanInfo(dl);
SelectedPlan.Remove(dl);
grid.Reload();
}
//新增套餐
async Task InsertPlanRow()
{
var planInfo = new Plan();
if (_forecasts.Count() <= 0)
{
_forecasts = new List<Plan>
{
new Plan()
};
await grid.InsertRow(_forecasts.FirstOrDefault());
}
else
{
await grid.InsertRow(planInfo);
}
}
//修改套餐
async Task EditPlanRow(Plan planInfo)
{
await grid.EditRow(planInfo);
}
//删除套餐
async Task DeletePlanRow(Plan planInfo)
{
if (planInfo.Id > 0)
{
//弹出确认提示框
var b = await dialogService.OpenAsync<ConfirmDialog>(
$"删除确认",
new Dictionary<string, object>() { { "confirmInfo", "确认要删除套餐:" + planInfo.Name + "吗?" } },
new DialogOptions() { Width = "45vw", Resizable = true, Draggable = true, ShowClose = false });
if (b)
{
// 数据库删除
if (await planDao.DeletePlanInfo(planInfo.Id))
{
_message.Notify
(
new NotificationMessage
{
Severity = NotificationSeverity.Success,
Summary = "提示",
Detail = $"删除成功",
Duration = 4000
}
);
}
else
{
_message.Notify
(
new NotificationMessage
{
Severity = NotificationSeverity.Error,
Summary = "提示",
Detail = "删除失败",
Duration = 4000
}
);
}
}
await grid.Reload();
}
else
{
grid.CancelEditRow(planInfo);
await grid.Reload();
}
}
//保存套餐信息
async Task SavePlanRow(Plan planInfo)
{
await grid.UpdateRow(planInfo);
}
async Task CancelPlanEdit(Plan planInfo)
{
grid.CancelEditRow(planInfo);
await grid.Reload();
await PlanDetailsGrid.Reload();
}
void Reset(PlanDetails pd)
{
SelectedPlanDetails.Remove(pd);
}
//修改药品
async Task EditRow(PlanDetails planDetail)
{
// planDetail.DrugId = null;
await PlanDetailsGrid.EditRow(planDetail);
}
//保存修改药品
async Task InsertRow(PlanDetails planDetail)
{
await PlanDetailsGrid.UpdateRow(planDetail);
}
//取消修改药品
async Task CancelEdit(PlanDetails planDetail)
{
PlanDetailsGrid.CancelEditRow(planDetail);
SelectedPlan.FirstOrDefault()._PlanDetails.RemoveAll(pd => pd.Id == 0);
await PlanDetailsGrid.Reload();
}
//删除药品
async Task DeleteRow(PlanDetails planDetail)
{
// Reset(planDetail);
if (planDetail.Id > 0)
{
//弹出确认提示框
var b = await dialogService.OpenAsync<ConfirmDialog>(
$"确认删除",
new Dictionary<string, object>() { { "confirmInfo", "确认要删除药品:" + planDetail._DrugInfo.DrugName + "吗?" } },
new DialogOptions() { Width = "45vw", Resizable = true, Draggable = true, ShowClose = false }
);
if (b)
{
SelectedPlan.FirstOrDefault()._PlanDetails.Remove(planDetail);
// 数据库删除
if (await planDao.DeletePlanDetail(planDetail))
{
_message.Notify(new NotificationMessage
{
Severity = NotificationSeverity.Success,
Summary = "提示",
Detail = "删除成功",
Duration = 4000
}
);
}
else
{
_message.Notify(new NotificationMessage
{
Severity = NotificationSeverity.Error,
Summary = "提示",
Detail = "删除失败",
Duration = 4000
}
);
}
await PlanDetailsGrid.Reload();
}
}
else
{
PlanDetailsGrid.CancelEditRow(planDetail);
}
SelectedPlan.FirstOrDefault()._PlanDetails.RemoveAll(pd => pd.Id == 0);
}
async void OnUpdateRow(PlanDetails planDetail)
{
// Reset(planDetail);
SelectedPlanDetails.Add(planDetail);
// 数据库更新
if (await planDao.UpdatePlanDetail(planDetail))
{
_message.Notify(new NotificationMessage
{
Severity = NotificationSeverity.Success,
Summary = "提示",
Detail = "修改成功",
Duration = 4000
}
);
}
else
{
_message.Notify(new NotificationMessage
{
Severity = NotificationSeverity.Error,
Summary = "提示",
Detail = "修改失败",
Duration = 4000
}
);
}
await PlanDetailsGrid.Reload();
}
//保存套餐下添加的药品
async void OnCreateRow(PlanDetails planDetail)
{
if (SelectedPlan.FirstOrDefault() != null)
{
planDetail.PlanId = SelectedPlan.FirstOrDefault().Id;
planDetail.DrugId = planDetail.DrugId == null ? planDetail._DrugInfo.DrugId : planDetail.DrugId;
if (await planDao.AddPlanDetail(planDetail))
{
_message.Notify(new NotificationMessage
{
Severity = NotificationSeverity.Success,
Summary = "提示",
Detail = "保存成功",
Duration = 4000
}
);
}
else
{
_message.Notify(new NotificationMessage
{
Severity = NotificationSeverity.Error,
Summary = "提示",
Detail = "保存失败",
Duration = 4000
}
);
}
}
// await grid.Reload();
await PlanDetailsGrid.Reload();
}
//新增药品
async Task InsertRow()
{
var detail = new Pojo.PlanDetails()
{
PlanId = SelectedPlan.FirstOrDefault().Id
};
SelectedPlan.FirstOrDefault()._PlanDetails.Add(detail);
await PlanDetailsGrid.InsertRow(detail);
}
//验证药品是否已存在套餐中
bool ValidatroDrug(PlanDetails planDetail)
{
if (planDetail.PlanId == 0)
{
//新增的
planDetail.PlanId = SelectedPlan.FirstOrDefault().Id;
}
return planDao.CheckDrugById(planDetail);
}
}

View File

@ -144,9 +144,9 @@
<RadzenDropDownDataGrid Change="@((args) => { channel.drugManuNo = null; })" AllowVirtualization="true" Name="@("Drug_" + channel.Id)" TValue="DrugInfo" @bind-Value="channel.Drug" Data="@drugInfos" <RadzenDropDownDataGrid Change="@((args) => { channel.drugManuNo = null; })" AllowVirtualization="true" Name="@("Drug_" + channel.Id)" TValue="DrugInfo" @bind-Value="channel.Drug" Data="@drugInfos"
Style="width:100%; display: block;" AllowFilteringByAllStringColumns="true" TextProperty="DrugName"> Style="width:100%; display: block;" AllowFilteringByAllStringColumns="true" TextProperty="DrugName">
<Columns> <Columns>
<RadzenDropDownDataGridColumn Property="DrugId" Title="药品编码" /> <RadzenDropDownDataGridColumn Property="DrugId" Title="药品编码" Sortable="false" />
<RadzenDropDownDataGridColumn Property="DrugName" Width="120px" Title="名称" /> <RadzenDropDownDataGridColumn Property="DrugName" Width="120px" Title="名称" Sortable="false" />
<RadzenDropDownDataGridColumn Property="DrugSpec" Title="规格" /> <RadzenDropDownDataGridColumn Property="DrugSpec" Title="规格" Sortable="false" />
</Columns> </Columns>
</RadzenDropDownDataGrid> </RadzenDropDownDataGrid>
} else } else
@ -161,8 +161,8 @@
{ {
<RadzenDropDownDataGrid @bind-Value=@channel.drugManuNo Data=@channel.Drug?.Manus Disabled="@(channel.Drug == null)" TValue="DrugManuNo" Name="@("Drugmanu_" + channel.Id)" TextProperty="ManuNo"> <RadzenDropDownDataGrid @bind-Value=@channel.drugManuNo Data=@channel.Drug?.Manus Disabled="@(channel.Drug == null)" TValue="DrugManuNo" Name="@("Drugmanu_" + channel.Id)" TextProperty="ManuNo">
<Columns> <Columns>
<RadzenDropDownDataGridColumn Property="ManuNo" Title="批次" /> <RadzenDropDownDataGridColumn Property="ManuNo" Title="批次" Sortable="false" />
<RadzenDropDownDataGridColumn Property="EffDate" Title="效期" /> <RadzenDropDownDataGridColumn Property="EffDate" Title="效期" Sortable="false" />
</Columns> </Columns>
</RadzenDropDownDataGrid> </RadzenDropDownDataGrid>
} }

View File

@ -95,14 +95,15 @@
</RadzenDataGridColumn> </RadzenDataGridColumn>
<RadzenDataGridColumn MinWidth="120px" Title="盘点数量" Property="CheckQuantity"> <RadzenDataGridColumn MinWidth="120px" Title="盘点数量" Property="CheckQuantity">
<EditTemplate Context="cs"> <EditTemplate Context="cs">
@if (cs.BoardType == 2) @if (cs.BoardType.ToString().Contains("2") || cs.BoardType.ToString().Contains("3"))
{ {
@cs.CheckQuantity @cs.CheckQuantity
} }
else else
{ {
<RadzenNumeric Min="0" Style="display: block" Name="CheckQuantity" @bind-Value=@cs.CheckQuantity /> <RadzenNumeric Style="display: block" Name="CheckQuantity" @bind-Value=@cs.CheckQuantity>
<RadzenNumericRangeValidator Style="position: absolute;z-index: 9999;" Min="0" Text="请填写正确的盘点数量" Component="CheckQuantity" Popup="true" /> <RadzenNumericRangeValidator Style="position: absolute;z-index: 9999;" Min="1" Max="100" Text="请填写正确的取出数量" Component="CheckQuantity" />
</RadzenNumeric>
} }
</EditTemplate> </EditTemplate>
</RadzenDataGridColumn> </RadzenDataGridColumn>
@ -243,7 +244,6 @@
this.BeforeQuantity = new int[9]; this.BeforeQuantity = new int[9];
this.AfterQuantity = new int[9]; this.AfterQuantity = new int[9];
} }
async Task CheckFinish() async Task CheckFinish()
{ {
if (channels.Any(cl => cl.CheckQuantity != cl.Quantity && cl.DrugId != null && cl.drugManuNo != null)) if (channels.Any(cl => cl.CheckQuantity != cl.Quantity && cl.DrugId != null && cl.drugManuNo != null))
@ -257,7 +257,7 @@
} }
else else
{ {
_message.Notify(new NotificationMessage { Severity = NotificationSeverity.Info, Summary = "提示", Detail = $"盘点完成", Duration = 4000 }); _message.Notify(new NotificationMessage { Severity = NotificationSeverity.Success, Summary = "提示", Detail = $"盘点完成", Duration = 4000 });
logger.Info($"盘点完成"); logger.Info($"盘点完成");
} }

View File

@ -1,24 +1,37 @@
@page "/stock/list" @page "/stock/list"
<style> <style>
.rz-custom-header { @@keyframes shake {
width: 100%; 0% { opacity:1;color:red; }
25%{opacity:1;color:orange;}
50% { opacity:0;color:yellow;}
75%{opacity:1;color:crimson;}
100% { opacity:1;color:red; }
} }
.rz-custom-header {
width: 100%;
}
.shaky-text {
animation: shake 2s infinite ease-in-out;
/* 你可以根据需要调整动画的持续时间和迭代次数 */
transition:color 0.5s linear,opacity 0.5s linear;
}
</style> </style>
<div class="container-fluid"> <div class="container-fluid">
<RadzenDataGrid @ref="grid" <RadzenDataGrid @ref="grid"
IsLoading="@isLoading" IsLoading="@isLoading"
RowRender="@RowRender" RowRender="@RowRender"
EmptyText="无数据" EmptyText="无数据"
Data="@_forecasts" Data="@_forecasts"
AllowColumnResize="true" AllowAlternatingRows="false" AllowColumnResize="true" AllowAlternatingRows="false"
SelectionMode="DataGridSelectionMode.Single" SelectionMode="DataGridSelectionMode.Single"
ExpandMode="DataGridExpandMode.Multiple"> ExpandMode="DataGridExpandMode.Multiple">
<HeaderTemplate> <HeaderTemplate>
<RadzenRow JustifyContent="JustifyContent.End" AlignItems="AlignItems.Center"> <RadzenRow JustifyContent="JustifyContent.End" AlignItems="AlignItems.Center">
<RadzenButton Icon="download" Text="库存导出" Variant="Variant.Outlined" /> <RadzenButton Icon="download" Text="库存导出" Variant="Variant.Outlined" Click="StockExport" />
<RadzenButton Icon="download" Text="专用账册导出" Variant="Variant.Outlined" /> <RadzenButton Icon="download" Text="专用账册导出" Variant="Variant.Outlined" Click="AccountBookExport" />
</RadzenRow> </RadzenRow>
</HeaderTemplate> </HeaderTemplate>
<Template Context="di"> <Template Context="di">
@ -29,16 +42,44 @@
@s.DrawerNo - @s.ColNo @s.DrawerNo - @s.ColNo
</Template> </Template>
</RadzenDataGridColumn> </RadzenDataGridColumn>
<RadzenDataGridColumn Title="数量" Property="Quantity"></RadzenDataGridColumn> <RadzenDataGridColumn Title="数量" Property="Quantity">
</RadzenDataGridColumn>
<RadzenDataGridColumn Title="Åú´Î" Property="ManuNo"></RadzenDataGridColumn> <RadzenDataGridColumn Title="Åú´Î" Property="ManuNo"></RadzenDataGridColumn>
<RadzenDataGridColumn Title="效期" Property="EffDate"></RadzenDataGridColumn> <RadzenDataGridColumn Title="效期" Property="EffDate">
<Template Context="s">
@{
DateTime dateTime;
bool success = DateTime.TryParse(s.EffDate, out dateTime);
if(success&&dateTime<=DateTime.Now.AddMonths(3))
{
@s.EffDate<p class="shaky-text">近效期药品!</p>
}
else
{
@s.EffDate
}
}
</Template>
</RadzenDataGridColumn>
</Columns> </Columns>
</RadzenDataGrid> </RadzenDataGrid>
</Template> </Template>
<Columns> <Columns>
<RadzenDataGridColumn Frozen="true" Width="200px" Title="Ò©Æ·Ãû³Æ" Property="DrugName"></RadzenDataGridColumn> <RadzenDataGridColumn Frozen="true" Width="200px" Title="Ò©Æ·Ãû³Æ" Property="DrugName"></RadzenDataGridColumn>
<RadzenDataGridColumn Title="¹æ¸ñ" Property="DrugSpec"></RadzenDataGridColumn> <RadzenDataGridColumn Title="¹æ¸ñ" Property="DrugSpec"></RadzenDataGridColumn>
<RadzenDataGridColumn Title="总库存" Property="StockQuantity"></RadzenDataGridColumn> <RadzenDataGridColumn Title="总库存" Property="StockQuantity">
<Template Context="s">
@if(s.StockQuantity<10)
{
@s.StockQuantity<p class="shaky-text">库存预警!</p>
}
else
{
@s.StockQuantity
}
</Template>
</RadzenDataGridColumn>
</Columns> </Columns>
</RadzenDataGrid> </RadzenDataGrid>
</div> </div>
@ -83,7 +124,15 @@
async void StockExport()
{
}
async void AccountBookExport()
{
}

View File

@ -0,0 +1,153 @@
using LinqToDB.Mapping;
namespace MasaBlazorApp3.Pojo
{
[Table("account_book_g2")]
public class AccountBookG2
{
/// <summary>
/// 主键
/// </summary>
[Column("id")]
public int Id { get; set; }
/// <summary>
/// 药品id
/// </summary>
[Column("drug_id")]
public string DrugId { get; set; }
/// <summary>
/// 1领入2发出3日结4总结5转结
/// </summary>
[Column("type")]
public int Type { get; set; }
/// <summary>
/// 科室
/// </summary>
[Column("department")]
public string Department { get; set; }
/// <summary>
/// 设备内记录凭证
/// </summary>
[Column("invoice_no")]
public string InvoiceNo { get; set; }
/// <summary>
/// 处方号或凭证号
/// </summary>
[Column("order_no")]
public string OrderNo { get; set; }
/// <summary>
/// 批次
/// </summary>
[Column("manu_no")]
public string ManuNo { get; set; }
/// <summary>
/// 效期
/// </summary>
[Column("eff_date")]
public string EffDate { get; set; }
/// <summary>
/// 上日结存
/// </summary>
[Column("yesterday_quantity")]
public int YQuantity { get; set; }
/// <summary>
/// 收入
/// </summary>
[Column("add_quantity")]
public int AddQuantity { get; set; }
/// <summary>
/// 发出
/// </summary>
[Column("out_quantity")]
public int OutQuantity { get; set; }
/// <summary>
/// 批次结存
/// </summary>
[Column("manu_stock")]
public int ManuStock { get; set; }
/// <summary>
/// 总结存
/// </summary>
[Column("total_stock")]
public int TotalStock { get; set; }
/// <summary>
/// 发药领药人id
/// </summary>
[Column("user_id1")]
public int? UserId1 { get; set; }
/// <summary>
/// 复核人id
/// </summary>
[Column("user_id2")]
public int? UserId2 { get; set; }
/// <summary>
/// 设备id
/// </summary>
[Column("machine_id")]
public string MachineId { get; set; }
/// <summary>
/// 日期
/// </summary>
[Column("create_date")]
public string CreateDate { get; set; }
/// <summary>
/// 插入更新时间(当前时间戳)
/// </summary>
[Column("create_time")]
public DateTime CreateTime { get; set; }
/// <summary>
/// 药品名称
/// </summary>
[Column(IsColumn = false)]
public string DrugName { get; set; }
/// <summary>
/// 规格
/// </summary>
[Column(IsColumn = false)]
public string DrugSpec { get; set; }
/// <summary>
/// 厂家
/// </summary>
[Column(IsColumn = false)]
public string Manufactory { get; set; }
/// <summary>
/// 发药人
/// </summary>
[Column(IsColumn = false)]
public string OperatorName { get; set; }
/// <summary>
/// 复核人
/// </summary>
[Column(IsColumn = false)]
public string ReviewerName { get; set; }
/// <summary>
/// 手术间
/// </summary>
[Column("shoushuJian")]
public string ShoushuJian { get; set; }
}
}

View File

@ -44,5 +44,11 @@ namespace MasaBlazorApp3.Pojo
[Association(ThisKey = nameof(DrugId), OtherKey = nameof(DrugInfo.DrugId))] [Association(ThisKey = nameof(DrugId), OtherKey = nameof(DrugInfo.DrugId))]
public DrugInfo Drug { get; set; } = new(); public DrugInfo Drug { get; set; } = new();
//关联药品中的套餐信息表
[Association(ThisKey =nameof(DrugId),OtherKey = nameof(Plan.Id))]
public Plan PlanInfo { get; set; }=new();
//手术室药箱中的库存总数
[Column("stock_quantity")]
public int TotalQuantity { get; set; }
} }
} }

View File

@ -1,10 +1,4 @@
using LinqToDB.Common.Internal.Cache; using LinqToDB.Mapping;
using LinqToDB.Mapping;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace MasaBlazorApp3.Pojo namespace MasaBlazorApp3.Pojo
{ {
@ -37,7 +31,9 @@ namespace MasaBlazorApp3.Pojo
[Column("drawer_type")] [Column("drawer_type")]
public int DrawerType { get; set; } public int DrawerType { get; set; }
/// <summary>
/// 1物理隔板;2单支计数;3管控药盒;4储物箱;5智能显示;6称重计数;63称重计数药盒;653称重计数药盒智能显示;
/// </summary>
[Column("board_type")] [Column("board_type")]
public int BoardType { get; set; } public int BoardType { get; set; }
@ -47,7 +43,7 @@ namespace MasaBlazorApp3.Pojo
[Column("eff_date")] [Column("eff_date")]
public string EffDate { get; set; } public string EffDate { get; set; }
[Association(ThisKey = nameof(DrugId), OtherKey = nameof(DrugInfo.DrugId))] [LinqToDB.Mapping.Association(ThisKey = nameof(DrugId), OtherKey = nameof(DrugInfo.DrugId))]
public DrugInfo? Drug { get; set; } public DrugInfo? Drug { get; set; }
@ -62,7 +58,7 @@ namespace MasaBlazorApp3.Pojo
[Column("dmnguid")] [Column("dmnguid")]
public string Dmnguid { get; set; } public string Dmnguid { get; set; }
[Association(ThisKey = nameof(Dmnguid), OtherKey = nameof(DrugManuNo.Id))] [LinqToDB.Mapping.Association(ThisKey = nameof(Dmnguid), OtherKey = nameof(DrugManuNo.Id))]
public DrugManuNo? drugManuNo { get; set; } public DrugManuNo? drugManuNo { get; set; }
@ -72,7 +68,6 @@ namespace MasaBlazorApp3.Pojo
[Column(IsColumn = false)] [Column(IsColumn = false)]
public int CanReturnQuantity { get; set; } public int CanReturnQuantity { get; set; }
[Column(IsColumn = false)] [Column(IsColumn = false)]
public int CheckQuantity public int CheckQuantity
{ {
@ -81,5 +76,18 @@ namespace MasaBlazorApp3.Pojo
} }
[Column("Pos_No")] [Column("Pos_No")]
public int BiaoDingStatus { get; set; } public int BiaoDingStatus { get; set; }
//手术室药箱中的药品基数
[Column("Check_Quantity")]
public int BaseQuantity { get; set; }
//手术室药箱中某药品全部批次的需要加药数
[Column("col_no2")]
public int NeedQuantity { get; set; }
//手术室药箱中某药品全部批次的已取药待入库数
[Column("col_no1")]
public int AddToQuantity { get; set; }
//手术室药箱中药品补药状态(1需补药2已补药待入库0满库状态)
[Column("state")]
public int BoxState { get; set; }
} }
} }

View File

@ -19,5 +19,9 @@ namespace MasaBlazorApp3.Pojo.Config
public bool canBusExsit { get; set; } public bool canBusExsit { get; set; }
public int doorAddr { get; set; } public int doorAddr { get; set; }
public int storageBoxAddr { get; set; } public int storageBoxAddr { get; set; }
//存在冰箱串口
public bool fridgePortExist { get; set; }
//冰箱串口号
public string fridgePortPath { get; set; }
} }
} }

View File

@ -14,6 +14,8 @@ namespace MasaBlazorApp3.Pojo.Config
public bool opFirst { get; set; } public bool opFirst { get; set; }
//自动退出登录时间,单位秒0不自动退出 //自动退出登录时间,单位秒0不自动退出
public int autoOutLog { get; set; } public int autoOutLog { get; set; }
//手术室药盒的设备id
public string boxMachineId { get; set; }
} }
} }

View File

@ -0,0 +1,16 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace MasaBlazorApp3.Pojo.Config
{
//冰箱配置文件
public class fridgeConfig
{
public string temperatureRange { get; set; }
public int fridgeState { get; set; }
public int alertState { get; set; }
}
}

View File

@ -0,0 +1,26 @@
using LinqToDB.Mapping;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace MasaBlazorApp3.Pojo
{
/// <summary>
/// 药品基数
/// </summary>
[Table("drug_base")]
public class DrugBase
{
[PrimaryKey]
[Column("drugid")]
public string DrugId { get; set; }
[Column("machine_id")]
public string MachineId { get; set; }
[Column("baseQuantity")]
public int BaseQuantity { get; set; }
}
}

View File

@ -0,0 +1,35 @@
using LinqToDB.Mapping;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace MasaBlazorApp3.Pojo
{
//交接班表
[Table("hkc_changeshifts")]
public class HkcChangeShifts
{
[Column("Id")]
public int Id { get; set; }
[Column("optDate")]
public DateTime optDate { get; set; }
[Column("FromOperator")]
public string FromOperator { get; set; }
[Column("FromRviewer")]
public string FromRviewer { get; set; }
[Column("ToOperator")]
public string ToOperator { get; set; }
[Column("ToReviewer")]
public string ToReviewer { get; set; }
[Column("ToDate")]
public DateTime ToDate { get; set; }
[Column("State")]
public string State { get; set; }
[Column("optState")]
public string optState { get; set; }
[Column("machine_id")]
public string MachineId { get; set; }
}
}

View File

@ -154,6 +154,14 @@ namespace MasaBlazorApp3.Pojo
[Column("state")] [Column("state")]
public int state { get; set; } = 0; public int state { get; set; } = 0;
[Association(ThisKey = nameof(OrderNo), OtherKey = nameof(OrderDetail.OrderNo))]
public OrderDetail Detail { get; set; } = new();
/// <summary>
/// 是否选中
/// </summary>
[Column(IsColumn =false)]
public bool ItemIsChecked { get; set; }
} }
} }

View File

@ -0,0 +1,37 @@
using LinqToDB.Mapping;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace MasaBlazorApp3.Pojo
{
[Table("Plan")]
public class Plan
{
//主键
[Column("Id")]
public int Id { get; set; }
//套餐名
[Column("Name")]
public string Name { get; set; }
//套餐描述
[Column("Description")]
public string Description { get; set; }
[Association(ThisKey = nameof(Id), OtherKey = nameof(PlanDetails.PlanId))]
public List<PlanDetails> _PlanDetails { get; set; } = new();
//添加时间
[Column("AddTime")]
public DateTime AddTime { get; set; }
//可用状态0不可用1可用
[Column("usestate")]
public int UseState { get; set; }
//操作人
[Column("operatorUser")]
public int OperatorUser { get; set; }
//审核人
[Column("reviewerUser")]
public int ReviewerUser { get; set; }
}
}

View File

@ -0,0 +1,41 @@
using LinqToDB.Mapping;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace MasaBlazorApp3.Pojo
{
[Table("Plan_Details")]
public class PlanDetails
{
//主键
[Column("Id")]
public int Id { get; set; }
//套餐外键
[Column("Plan_Id")]
public int PlanId { get; set; }
//药品基数
[Column("Base_Quantity")]
public int BaseQuantity { get; set; }
//药品ID
[Column("Drug_Id")]
public string DrugId { get; set; }
[Association(ThisKey = nameof(Id), OtherKey = nameof(PlanDetails.DrugId))]
public DrugInfo _DrugInfo { get; set; } = new();
//添加时间
[Column("AddTime")]
public DateTime AddTime { get; set; }
//可用状态0不可用1可用
[Column("usestate")]
public int UseState { get; set; }
//操作人
[Column("operatorUser")]
public int OperatorUser { get; set; }
//审核人
[Column("reviewerUser")]
public int ReviewerUser { get; set; }
}
}

View File

@ -195,13 +195,70 @@ namespace MasaBlazorApp3.Pojo
PremissionName = "权限管理", PremissionName = "权限管理",
PremissionPath = "/manage/role" PremissionPath = "/manage/role"
}); });
Premission set = new Premission()
{
Id = 53,
PremissionName = "系统设置",
PremissionPath = "/manage/setting"
//PremissionPath = "/Box/Plan"
};
set.AddChild(new Premission()
{
Id = 531,
PremissionName = "登录设置",
PremissionPath = "/manage/setting/login"
});
set.AddChild(new Premission()
{
Id = 532,
PremissionName = "冰箱设置",
PremissionPath = "/manage/setting/Fridge"
});
x.AddChild(new Premission()
{
Id = 54,
PremissionName = "套餐管理",
PremissionPath = "/Box/Plan"
});
x.AddChild(new Premission()
{
Id = 55,
PremissionName = "绑定药箱",
PremissionPath = "/Box/BoxBindings"
});
x.AddChild(new Premission()
{
Id = 56,
PremissionName = "药箱核对",
PremissionPath = "/Box/Check"
});
x.AddChild(new Premission()
{
Id = 57,
PremissionName = "药箱加药",
PremissionPath = "/Box/BoxAdd"
});
x.AddChild(new Premission()
{
Id = 58,
PremissionName = "药箱入库",
PremissionPath = "/Box/BoxAddBox"
});
list.Add(q); list.Add(q);
list.Add(j); list.Add(j);
list.Add(h); list.Add(h);
list.Add(k); list.Add(k);
x.AddChild(set);
list.Add(x); list.Add(x);
return list; return list;
} }
public bool HasChild()
{
return this.Items.Count() > 0;
}
} }
} }

View File

@ -0,0 +1,21 @@
using LinqToDB.Mapping;
namespace MasaBlazorApp3.Pojo
{
//系统设置中的菜单
[Table("SettingManu")]
public class SettingManu
{
[PrimaryKey, Identity]
[Column("id")]
public int Id { get; set; }
[Column("Manu_Name")]
public string Name { get; set; }
[Column("Manu_Icon")]
public string Icon { get; set; }
[Column("Path")]
public string Path { get; set; }
[Column(IsColumn = false)]
public List<SettingManu> Children { get; set; } = new();
}
}

View File

@ -0,0 +1,32 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace MasaBlazorApp3.Pojo.Vo
{
public class BoxTakeVo
{
public DrugInfo Drug { get; set; }
public ChannelStock BoxDetail { get; set; }
public ChannelStock ChannelStock { get; set; }
public int StockQuantity { get; set; }
public int Quantity { get; set; }
public int GetQuantity { get; set; } = 0;
public int Status { get; set; } = 0;
public int[] BeforeQuantity { get; set; } = new int[] { 0, 0, 0, 0, 0, 0, 0, 0, 0 };
public int[] AfterQuantity { get; set; } = new int[] { 0, 0, 0, 0, 0, 0, 0, 0, 0 };
public int AddQuantity { get; set; } = 0;
}
}

View File

@ -18,6 +18,7 @@ using System.Reflection;
using MasaBlazorApp3.Pojo.Config; using MasaBlazorApp3.Pojo.Config;
using Microsoft.Extensions.Options; using Microsoft.Extensions.Options;
using LinqToDB.Common; using LinqToDB.Common;
using MasaBlazorApp3.Util;
namespace MasaBlazorApp3.Port namespace MasaBlazorApp3.Port
{ {
@ -32,6 +33,9 @@ namespace MasaBlazorApp3.Port
// 条码枪串口 // 条码枪串口
public SerialPort scanCodeSerial; public SerialPort scanCodeSerial;
//冰箱串口
public SerialPort fridgeSerial;
public bool Operate { get; set; } public bool Operate { get; set; }
public DateTime dateTime { get; set; } = DateTime.Now; public DateTime dateTime { get; set; } = DateTime.Now;
@ -95,7 +99,21 @@ namespace MasaBlazorApp3.Port
} }
} }
if (_portConfig.fridgePortExist)
{
try
{
string FridgePortPath = _portConfig.fridgePortPath;
logger.Info($"打开冰箱串口【{FridgePortPath}】");
fridgeSerial = new SerialPort(FridgePortPath, 9600, Parity.None, 8);
//fridgeSerial.Open();
//logger.Info($"冰箱串口打开结果【{fridgeSerial.IsOpen}】");
}
catch (Exception e)
{
logger.Error("冰箱串口打开错误" + e.Message);
}
}
} }
@ -1001,5 +1019,382 @@ namespace MasaBlazorApp3.Port
#endregion #endregion
#endregion #endregion
#region
/// <summary>
/// 冰箱使能
/// </summary>
/// <returns></returns>
public async Task FridegOpen(int iIndex)
{
try
{
fridgeSerial.DiscardInBuffer();
byte bAddress;
if (iIndex == 1)
{
bAddress = 0x01;
}
else
{
bAddress = 0x02;
}
byte[] buffer = new byte[] { bAddress, 0x06, 0x10, 0xD4, 0x00, 0x01, 0x0C, 0xF2 };
//byte[] buffer = new byte[] { 0x01, 0x06, 0x10, 0xD4, 0x00, 0x01 };
////获取数组CRC校验码
//byte[] byteDate = CRC16MODBUS.CrcModBus(buffer);
////Array.Reverse(byteDate);
//int dataLength = buffer.Length;
//Array.Resize(ref buffer, dataLength + byteDate.Length);
//for (int i = 0; i < byteDate.Length; i++)
//{
// buffer[dataLength + i] = byteDate[i];
//}
logger.Info($"冰箱使能【{Convert.ToHexString(buffer)}】");
fridgeSerial.Write(buffer, 0, 8);
await Task.Delay(80);
}
catch (Exception ex)
{
logger.Info($"冰箱使能发生异常ex:{ex.Message}");
}
}
/// <summary>
/// 冰箱失能
/// </summary>
/// <returns></returns>
public async Task FridgeOff(int iIndex)
{
try
{
fridgeSerial.DiscardInBuffer();
byte bAddress;
if (iIndex == 1)
{
bAddress = 0x01;
}
else
{
bAddress = 0x02;
}
byte[] buffer = new byte[] { bAddress, 0x06, 0x10, 0xD4, 0x00, 0x00, 0xCD, 0x32 };
//byte[] buffer = new byte[] { 0x01, 0x06, 0x10, 0xD4, 0x00, 0x01 };
////获取数组CRC校验码
//byte[] byteDate = CRC16MODBUS.CrcModBus(buffer);
////Array.Reverse(byteDate);
//int dataLength = buffer.Length;
//Array.Resize(ref buffer, dataLength + byteDate.Length);
//for (int i = 0; i < byteDate.Length; i++)
//{
// buffer[dataLength + i] = byteDate[i];
//}
logger.Info($"冰箱失能【{Convert.ToHexString(buffer)}】");
fridgeSerial.Write(buffer, 0, 8);
await Task.Delay(80);
}
catch (Exception ex)
{
logger.Info($"冰箱失能发生异常ex:{ex.Message}");
}
}
/// <summary>
/// 冰箱报警使能
/// </summary>
/// <returns></returns>
public async Task FridgeAlarmOn(int iIndex)
{
try
{
fridgeSerial.DiscardInBuffer();
byte bAddress;
if (iIndex == 1)
{
bAddress = 0x01;
}
else
{
bAddress = 0x02;
}
byte[] buffer = new byte[] { bAddress, 0x06, 0x10, 0xD5, 0x00, 0x01, 0x5D, 0x32 };
//byte[] buffer = new byte[] { 0x01, 0x06, 0x10, 0xD5, 0x00, 0x01 };
////获取数组CRC校验码
//byte[] byteDate = CRC16MODBUS.CrcModBus(buffer);
////Array.Reverse(byteDate);
//int dataLength = buffer.Length;
//Array.Resize(ref buffer, dataLength + byteDate.Length);
//for (int i = 0; i < byteDate.Length; i++)
//{
// buffer[dataLength + i] = byteDate[i];
//}
logger.Info($"冰箱报警使能【{Convert.ToHexString(buffer)}】");
fridgeSerial.Write(buffer, 0, 8);
await Task.Delay(80);
}
catch (Exception ex)
{
logger.Info($"冰箱报警使能发生异常ex:{ex.Message}");
}
}
/// <summary>
/// 冰箱报警失能
/// </summary>
/// <returns></returns>
public async Task FridgeAlarmOff(int iIndex)
{
try
{
fridgeSerial.DiscardInBuffer();
byte bAddress;
if (iIndex == 1)
{
bAddress = 0x01;
}
else
{
bAddress = 0x02;
}
byte[] buffer = new byte[] { bAddress, 0x06, 0x10, 0xD5, 0x00, 0x00, 0x9C, 0xF2 };
//byte[] buffer = new byte[] { 0x01, 0x06, 0x10, 0xD5, 0x00, 0x00 };
////获取数组CRC校验码
//byte[] byteDate = CRC16MODBUS.CrcModBus(buffer);
////Array.Reverse(byteDate);
//int dataLength = buffer.Length;
//Array.Resize(ref buffer, dataLength + byteDate.Length);
//for (int i = 0; i < byteDate.Length; i++)
//{
// buffer[dataLength + i] = byteDate[i];
//}
logger.Info($"冰箱报警失能【{Convert.ToHexString(buffer)}】");
fridgeSerial.Write(buffer, 0, 8);
await Task.Delay(80);
}
catch (Exception ex)
{
logger.Info($"冰箱报警失能发生异常ex:{ex.Message}");
}
}
/// <summary>
/// 冰箱温度设定最小
/// </summary>
/// <returns></returns>
public async Task FridgeMinSetting(float min, int iIndex)
{
try
{
int iMix = Convert.ToInt32(min * 10);
fridgeSerial.DiscardInBuffer();
//byte[] bufferMin = new byte[] { 0x01, 0x06, 0x10, 0xC9, 0x00, 0x15, 0x9C, 0xFB };
byte bAddress;
if (iIndex == 1)
{
bAddress = 0x01;
}
else
{
bAddress = 0x02;
}
byte[] bufferMin = new byte[] { bAddress, 0x06, 0x10, 0xC9, 0x00, (byte)(iMix & 0xff) };
//获取数组CRC校验码
byte[] byteDate = CRC16MODBUS.CrcModBus(bufferMin);
//Array.Reverse(byteDate);
int dataLength = bufferMin.Length;
Array.Resize(ref bufferMin, dataLength + byteDate.Length);
for (int i = 0; i < byteDate.Length; i++)
{
bufferMin[dataLength + i] = byteDate[i];
}
logger.Info($"冰箱温度设定Min:【{Convert.ToHexString(bufferMin)}】");
fridgeSerial.Write(bufferMin, 0, 8);
}
catch (Exception ex)
{
logger.Info($"获取冰箱温度发生异常ex:{ex.Message}");
}
}
/// <summary>
/// 冰箱温度设定最大
/// </summary>
/// <returns></returns>
public async Task FridgeMaxSetting(float max, int iIndex)
{
try
{
int iMax = Convert.ToInt32(max * 10);
fridgeSerial.DiscardInBuffer();
//byte[] bufferMin = new byte[] { 0x01, 0x06, 0x10, 0xC9, 0x00, 0x15, 0x9C, 0xFB };
byte bAddress;
if (iIndex == 1)
{
bAddress = 0x01;
}
else
{
bAddress = 0x02;
}
byte[] bufferMax = new byte[] { bAddress, 0x06, 0x10, 0xC8, 0x00, (byte)(iMax & 0xff) };
//获取数组CRC校验码
byte[] byteDate = CRC16MODBUS.CrcModBus(bufferMax);
//Array.Reverse(byteDate);
int dataLength = bufferMax.Length;
Array.Resize(ref bufferMax, dataLength + byteDate.Length);
for (int i = 0; i < byteDate.Length; i++)
{
bufferMax[dataLength + i] = byteDate[i];
}
logger.Info($"冰箱温度设定Max:【{Convert.ToHexString(bufferMax)}】");
fridgeSerial.Write(bufferMax, 0, 8);
}
catch (Exception ex)
{
logger.Info($"获取冰箱温度发生异常ex:{ex.Message}");
}
}
/// <summary>
/// 获取冰箱温度
/// </summary>
/// <returns></returns>
public async Task<float> GetFridgeTemperature(int iIndex)
{
float temperature = 0.0f;
try
{
fridgeSerial.DiscardInBuffer();
byte bAddress;
if (iIndex == 1)
{
bAddress = 0x01;
}
else
{
bAddress = 0x02;
}
byte[] buffer = new byte[] { bAddress, 0x03, 0x10, 0x02, 0x00, 0x01, 0x21, 0x0A };
//byte[] buffer = new byte[] { 0x01, 0x03, 0x10, 0x02, 0x00, 0x01 };
////获取数组CRC校验码
//byte[] byteDate = CRC16MODBUS.CrcModBus(buffer);
////Array.Reverse(byteDate);
//int dataLength = buffer.Length;
//Array.Resize(ref buffer, dataLength + byteDate.Length);
//for (int i = 0; i < byteDate.Length; i++)
//{
// buffer[dataLength + i] = byteDate[i];
//}
logger.Info($"获取冰箱温度【{Convert.ToHexString(buffer)}】");
fridgeSerial.Write(buffer, 0, 8);
byte[] retByte = await GetBufferByPort(fridgeSerial, 7);
logger.Info($"获取冰箱温度返回【{Convert.ToHexString(retByte)}】");
if (retByte != null && retByte.Length >= 7)
{
var hight = retByte[3];
var low = retByte[4];
int iHight = Convert.ToInt32(hight << 8);
int iLow = Convert.ToInt32(retByte[4]);
temperature = Convert.ToSingle(iHight + iLow) / 10;
}
}
catch (Exception ex)
{
logger.Info($"获取冰箱温度发生异常ex:{ex.Message}");
}
return temperature;
}
/// <summary>
/// 设置冰箱温度
/// </summary>
/// <returns></returns>
public async Task<float> SetFridgeTemperature(float temperature, int iIndex)
{
int tpt = (int)temperature * 10;
byte Temperature = (byte)(tpt & 0xff);
try
{
//if (!FridgeOperate)
{
fridgeSerial.DiscardInBuffer();
byte bAddress;
if (iIndex == 1)
{
bAddress = 0x01;
}
else
{
bAddress = 0x02;
}
//byte[] buffer = new byte[] { 0x01, 0x03, 0x10, 0x02, 0x00, 0x01, 0x21,0x0A };
byte[] buffer = new byte[] { bAddress, 0x06, 0x10, 0x02, 0x00, (byte)Temperature };
//获取数组CRC校验码
byte[] byteDate = CRC16MODBUS.CrcModBus(buffer);
//Array.Reverse(byteDate);
int dataLength = buffer.Length;
Array.Resize(ref buffer, dataLength + byteDate.Length);
for (int i = 0; i < byteDate.Length; i++)
{
buffer[dataLength + i] = byteDate[i];
}
logger.Info($"设置冰箱温度【{Convert.ToHexString(buffer)}】");
fridgeSerial.Write(buffer, 0, 8);
await GetBufferByPort(fridgeSerial, 8);
}
}
catch (Exception ex)
{
logger.Info($"获取冰箱温度发生异常ex:{ex.Message}");
}
return temperature;
}
/// <summary>
/// 冰箱延迟报警
/// </summary>
/// <returns></returns>
public async Task FridgeDelayWarm(int iIndex)
{
try
{
//if (!FridgeOperate)
{
fridgeSerial.DiscardInBuffer();
byte bAddress;
if (iIndex == 1)
{
bAddress = 0x01;
}
else
{
bAddress = 0x02;
}
byte[] buffer = new byte[] { bAddress, 0x06, 0x10, 0xCD, 0x00, 0x01, 0xDD, 0x35 };
//byte[] buffer = new byte[] { 0x01, 0x06, 0x10, 0xCD, 0x00, 0x01 };
////获取数组CRC校验码
//byte[] byteDate = CRC16MODBUS.CrcModBus(buffer);
////Array.Reverse(byteDate);
//int dataLength = buffer.Length;
//Array.Resize(ref buffer, dataLength + byteDate.Length);
//for (int i = 0; i < byteDate.Length; i++)
//{
// buffer[dataLength + i] = byteDate[i];
//}
logger.Info($"冰箱延迟报警【{Convert.ToHexString(buffer)}】");
fridgeSerial.Write(buffer, 0, 8);
}
}
catch (Exception ex)
{
logger.Info($"获取冰箱温度发生异常ex:{ex.Message}");
}
}
#endregion
} }
} }

View File

@ -47,6 +47,7 @@ internal class Program
appBuilder.Services.Configure<SettingConfig>(config.GetSection("setting")); appBuilder.Services.Configure<SettingConfig>(config.GetSection("setting"));
appBuilder.Services.Configure<PortConfig>(config.GetSection("port")); appBuilder.Services.Configure<PortConfig>(config.GetSection("port"));
appBuilder.Services.Configure<DrawerConfig>(config.GetSection("drawer")); appBuilder.Services.Configure<DrawerConfig>(config.GetSection("drawer"));
appBuilder.Services.Configure<fridgeConfig>(config.GetSection("fridge"));
// i18n // i18n
//appBuilder.Services.AddI18nText(); //appBuilder.Services.AddI18nText();
@ -62,6 +63,8 @@ internal class Program
appBuilder.Services.AddScoped<IDrugInfoDao, DrugInfoDao>(); appBuilder.Services.AddScoped<IDrugInfoDao, DrugInfoDao>();
appBuilder.Services.AddScoped<IMachineRecordDao, MachineRecordDao>(); appBuilder.Services.AddScoped<IMachineRecordDao, MachineRecordDao>();
appBuilder.Services.AddScoped<IInOutInvoiceDao, InOutInvoiceDao>(); appBuilder.Services.AddScoped<IInOutInvoiceDao, InOutInvoiceDao>();
appBuilder.Services.AddScoped<ISettingManuDao, SettingManuDao>();
appBuilder.Services.AddScoped<IPlanDao, PlanDao>();
//自选取药 //自选取药
appBuilder.Services.AddScoped<ISelfTakeDao, SelfTakeDao>(); appBuilder.Services.AddScoped<ISelfTakeDao, SelfTakeDao>();

View File

@ -0,0 +1,94 @@
@inherits LayoutComponentBase
@* @page "/manage/setting" *@
@layout MainLayout
<div class="app-container">
<div class="sidebar">
<RadzenPanelMenu>
@foreach (var menuItem in menuItems)
{
@if (menuItem.Children.Any())
{
<RadzenPanelMenuItem Text="@menuItem.Name" Icon="@menuItem.Icon">
@foreach (var child in menuItem.Children)
{
<RadzenPanelMenuItem Text="@child.Name" Icon="@child.Icon" />
}
</RadzenPanelMenuItem>
}
else
{
<RadzenPanelMenuItem Text="@menuItem.Name" Icon="@menuItem.Icon" Path="@menuItem.Path" />
}
}
</RadzenPanelMenu>
</div>
<!-- 右侧内容区域 -->
<div class="main">
<div class="content">
@Body
</div>
</div>
</div>
<style>
.app-container {
display: flex;
height: 100vh;
}
.sidebar {
width: 250px;
background-color: #f8f9fa;
border-right: 1px solid #dee2e6;
height: 100vh;
display: flex;
flex-direction: column;
}
.sidebar-header {
padding: 1rem;
border-bottom: 1px solid #dee2e6;
}
.main {
flex: 1;
display: flex;
flex-direction: column;
height: 100vh;
overflow: auto;
}
.top-row {
height: 60px;
border-bottom: 1px solid #dee2e6;
display: flex;
align-items: center;
padding: 0 1rem;
}
.content {
flex: 1;
padding: 1rem;
overflow-y: auto;
}
</style>
@inject NavigationManager Navigation
@inject ISettingManuDao settingManuDao;
@code {
RadzenPanelMenu panelMenu;
List<SettingManu> menuItems = new();
protected override async Task OnInitializedAsync()
{
menuItems = await settingManuDao.GetMenuItemsAsync();
}
// async void jump2Page(string path)
// {
// Navigation.NavigateTo(path);
// //可以在这里添加其他逻辑,例如记录导航历史或更新状态
// Console.WriteLine($"Navigating to: {path}");
// }
}

View File

@ -0,0 +1,42 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace MasaBlazorApp3.Util
{
public class CRC16MODBUS
{
/// Name: CRC-16/MODBUS x16+x15+x2+1
/// Poly: 0x8005
/// Init: 0xFFFF
/// Refin: true
/// Refout: true
/// Xorout: 0x0000
///******************************添加数据CRC16MODBUS校验位*******************************************
public static byte[] CrcModBus(byte[] buffer, int start = 0, int len = 0)
{
if (buffer == null || buffer.Length == 0) return null;
if (start < 0) return null;
if (len == 0) len = buffer.Length - start;
int length = start + len;
if (length > buffer.Length) return null;
ushort crc = 0xFFFF;// Initial value
for (int i = start; i < length; i++)
{
crc ^= buffer[i];
for (int j = 0; j < 8; j++)
{
if ((crc & 1) > 0)
crc = (ushort)((crc >> 1) ^ 0xA001);// 0xA001 = reverse 0x8005
else
crc = (ushort)(crc >> 1);
}
}
byte[] ret = BitConverter.GetBytes(crc);
//Array.Reverse(ret);
return ret;
}
}
}

View File

@ -11,7 +11,8 @@
"loginMode": 1, "loginMode": 1,
"opFirst": true, "opFirst": true,
//退,0退 //退,0退
"autoOutLog": 0 "autoOutLog": 0,
"boxMachineId": "DM5"
}, },
"port": { "port": {
"drawerPortPath": "COM1", "drawerPortPath": "COM1",
@ -20,13 +21,23 @@
"canBusPortPath": "COM31", "canBusPortPath": "COM31",
"canBusExsit": true, "canBusExsit": true,
"doorAddr": 0, "doorAddr": 0,
"storageBoxAddr": 0 "storageBoxAddr": 0,
"fridgePortExist": false,
"fridgePortPath": "COM3"
}, },
"drawer": { "drawer": {
"single": [ 3 ], "single": [ 3 ],
"weigh": [4], "weigh": [ 4 ],
"box": [4], "box": [ 4 ],
"label": [4] "label": [ 4 ]
},
"fridge": {
//
"temperatureRange": "2-8",
//10
"fridgeState": 0,
//10
"alertState": 0
} }
} }