更新提交
This commit is contained in:
parent
3a9ec258a8
commit
ac39763b13
|
@ -7,7 +7,7 @@
|
|||
</Found>
|
||||
<NotFound>
|
||||
<LayoutView Layout="@typeof(MainLayout)">
|
||||
<p role="alert">Sorry, there's nothing at this address.</p>
|
||||
<p role="alert">抱歉,找不到此页面。</p>
|
||||
</LayoutView>
|
||||
</NotFound>
|
||||
</Router>
|
||||
|
|
|
@ -28,6 +28,11 @@ namespace MasaBlazorApp3.DataAccess
|
|||
public ITable<MachineRecord> MachineRecord => this.GetTable<MachineRecord>();
|
||||
public ITable<InOutInvoice> InOutInvoice => this.GetTable<InOutInvoice>();
|
||||
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>();
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -6,9 +6,9 @@ using System.Threading.Tasks;
|
|||
|
||||
namespace MasaBlazorApp3.DataAccess
|
||||
{
|
||||
public class ChannelStockWithDrawerCount<ChannelStock>
|
||||
public class ChannelStockWithDrawerCount<T>
|
||||
{
|
||||
public int[] DrawerArray { get; set; }
|
||||
public List<ChannelStock> ChannelStocks { get; set; } = new List<ChannelStock>();
|
||||
public List<T> ChannelStocks { get; set; } = new List<T>();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
using System;
|
||||
using MasaBlazorApp3.Pojo;
|
||||
using MasaBlazorApp3.Pojo.Vo;
|
||||
|
||||
namespace MasaBlazorApp3.DataAccess.Dao
|
||||
{
|
||||
|
@ -31,5 +32,28 @@ namespace MasaBlazorApp3.DataAccess.Dao
|
|||
public Task<bool> DrawerCheckFinish(List<ChannelStock> Stocks);
|
||||
//抽屉获取库存数据--药品绑定
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
||||
}
|
||||
}
|
|
@ -26,5 +26,11 @@ namespace MasaBlazorApp3.DataAccess.Dao
|
|||
public Task<bool> OrderReturnFinish(List<OperationVo<MachineRecord>> datas, 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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
|
@ -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();
|
||||
}
|
||||
}
|
|
@ -2,12 +2,14 @@
|
|||
using LinqToDB;
|
||||
using log4net;
|
||||
using MasaBlazorApp3.DataAccess.Dao;
|
||||
using MasaBlazorApp3.Pages;
|
||||
using MasaBlazorApp3.Pojo;
|
||||
using MasaBlazorApp3.Pojo.Config;
|
||||
using MasaBlazorApp3.Pojo.Vo;
|
||||
using MasaBlazorApp3.Port;
|
||||
using Microsoft.Extensions.Options;
|
||||
using Mysqlx.Crud;
|
||||
using System.Collections.Generic;
|
||||
using System.Data;
|
||||
|
||||
namespace MasaBlazorApp3.DataAccess.Impl
|
||||
|
@ -183,7 +185,7 @@ namespace MasaBlazorApp3.DataAccess.Impl
|
|||
//效期转换出错
|
||||
if (stock.ManuNo != null)
|
||||
{
|
||||
string[] idate= stock.EffDate.Split('/');
|
||||
string[] idate = stock.EffDate.Split('/');
|
||||
foreach (string iS in idate)
|
||||
{
|
||||
if (!string.IsNullOrEmpty(iS.Replace(" ", "").Trim()))
|
||||
|
@ -191,13 +193,13 @@ namespace MasaBlazorApp3.DataAccess.Impl
|
|||
switch (iS.Replace(" ", "").Trim().Length)
|
||||
{
|
||||
case 4:
|
||||
EffDate = iS.Replace(" ", "").Trim();
|
||||
EffDate = iS.Replace(" ", "").Trim();
|
||||
break;
|
||||
case 2:
|
||||
EffDate += "-" + iS.Replace(" ", "").Trim();
|
||||
break;
|
||||
case 1:
|
||||
EffDate += "-0"+iS.Replace(" ", "").Trim();
|
||||
EffDate += "-0" + iS.Replace(" ", "").Trim();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -208,25 +210,25 @@ namespace MasaBlazorApp3.DataAccess.Impl
|
|||
}
|
||||
else
|
||||
{
|
||||
EffDate=dEffDate.ToString("yyyy-MM-dd");
|
||||
EffDate = dEffDate.ToString("yyyy-MM-dd");
|
||||
}
|
||||
|
||||
// 出入库记录
|
||||
int mid = _connection.InsertWithInt32Identity(new MachineRecord()
|
||||
{
|
||||
MachineId = _setting.machineId,
|
||||
DrawerNo = stock.DrawerNo,
|
||||
ColNo = stock.ColNo,
|
||||
DrugId = stock.DrugId,
|
||||
ManuNo = ManuNo,
|
||||
EffDate = !String.IsNullOrEmpty(EffDate) ? DateTime.ParseExact(EffDate, "yyyy-MM-dd", System.Globalization.CultureInfo.CurrentCulture) : null,
|
||||
OperationTime = DateTime.Now,
|
||||
Type = type,
|
||||
Quantity = type == 1 ? stock.AddQuantity : stock.TakeQuantity,
|
||||
Operator = _globalStateService.Operator.Id,
|
||||
Reviewer = _globalStateService.Reviewer?.Id ?? _globalStateService.Operator.Id,
|
||||
InvoiceId = InvoiceId
|
||||
});
|
||||
// 出入库记录
|
||||
int mid = _connection.InsertWithInt32Identity(new MachineRecord()
|
||||
{
|
||||
MachineId = _setting.machineId,
|
||||
DrawerNo = stock.DrawerNo,
|
||||
ColNo = stock.ColNo,
|
||||
DrugId = stock.DrugId,
|
||||
ManuNo = ManuNo,
|
||||
EffDate = !String.IsNullOrEmpty(EffDate) ? DateTime.ParseExact(EffDate, "yyyy-MM-dd", System.Globalization.CultureInfo.CurrentCulture) : null,
|
||||
OperationTime = DateTime.Now,
|
||||
Type = type,
|
||||
Quantity = type == 1 ? stock.AddQuantity : stock.TakeQuantity,
|
||||
Operator = _globalStateService.Operator.Id,
|
||||
Reviewer = _globalStateService.Reviewer?.Id ?? _globalStateService.Operator.Id,
|
||||
InvoiceId = InvoiceId
|
||||
});
|
||||
// 更新库存
|
||||
var stockQ = _connection.ChannelStock.Where(cs => cs.Id == stock.Id)
|
||||
.Set(cs => cs.Quantity, type == 1 ? stock.Quantity + stock.AddQuantity : stock.Quantity - stock.TakeQuantity);
|
||||
|
@ -399,7 +401,7 @@ namespace MasaBlazorApp3.DataAccess.Impl
|
|||
{
|
||||
_connection.BeginTransaction();
|
||||
|
||||
string InvoiceId = "DRAWER_" + CurrentTimeMillis();
|
||||
string InvoiceId = "CHECK_" + CurrentTimeMillis();
|
||||
var flag = true;
|
||||
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)
|
||||
.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();
|
||||
// 获取更新完库存之后的药品库存
|
||||
|
@ -544,6 +549,623 @@ namespace MasaBlazorApp3.DataAccess.Impl
|
|||
.ToListAsync();
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -29,7 +29,19 @@ namespace MasaBlazorApp3.DataAccess.Impl
|
|||
|
||||
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)
|
||||
|
|
|
@ -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 };
|
||||
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,6 +1,7 @@
|
|||
using LinqToDB;
|
||||
using LinqToDB.SqlQuery;
|
||||
using log4net;
|
||||
using log4net.Util;
|
||||
using MasaBlazorApp3.DataAccess.Dao;
|
||||
using MasaBlazorApp3.Pages;
|
||||
using MasaBlazorApp3.Pojo;
|
||||
|
@ -28,7 +29,7 @@ namespace MasaBlazorApp3.DataAccess.Impl
|
|||
private readonly ILog logger = LogManager.GetLogger(typeof(OrderInfoDao));
|
||||
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;
|
||||
_setting = setting.Value;
|
||||
|
@ -54,7 +55,7 @@ namespace MasaBlazorApp3.DataAccess.Impl
|
|||
{
|
||||
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));
|
||||
}
|
||||
|
@ -67,6 +68,8 @@ namespace MasaBlazorApp3.DataAccess.Impl
|
|||
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)
|
||||
|
@ -115,7 +118,8 @@ namespace MasaBlazorApp3.DataAccess.Impl
|
|||
{
|
||||
query = query.Where(cs => cs.ManuNo.Equals(ManuNo));
|
||||
}
|
||||
} else
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!String.IsNullOrEmpty(ManuNo))
|
||||
{
|
||||
|
@ -218,7 +222,7 @@ namespace MasaBlazorApp3.DataAccess.Impl
|
|||
_connection.BeginTransaction();
|
||||
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)
|
||||
.Update();
|
||||
if (!(r1 > 0))
|
||||
|
@ -465,10 +469,11 @@ namespace MasaBlazorApp3.DataAccess.Impl
|
|||
.Set(cs => cs.Status, 2)
|
||||
.Set(cs => cs.ReturnQuantity1, operationVo.data.Quantity).Update();
|
||||
|
||||
if(r2 > 0)
|
||||
if (r2 > 0)
|
||||
{
|
||||
|
||||
} else
|
||||
}
|
||||
else
|
||||
{
|
||||
flag = false;
|
||||
break;
|
||||
|
@ -540,7 +545,7 @@ namespace MasaBlazorApp3.DataAccess.Impl
|
|||
});
|
||||
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);
|
||||
}
|
||||
|
@ -573,5 +578,271 @@ namespace MasaBlazorApp3.DataAccess.Impl
|
|||
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;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
|
@ -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();
|
||||
}
|
||||
|
||||
|
||||
}
|
|
@ -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();
|
||||
}
|
||||
|
||||
|
||||
}
|
|
@ -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()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
|
@ -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
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
|
@ -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();
|
||||
}
|
||||
}
|
|
@ -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;
|
||||
// }
|
||||
}
|
|
@ -252,7 +252,7 @@
|
|||
$"删除确认",
|
||||
new Dictionary<string, object>() { { "confirmInfo", "确认要删除药品:"+drugInfo.DrugName+"吗?" } },
|
||||
new DialogOptions() { Width = "45vw", Resizable = true, Draggable = true, ShowClose = false });
|
||||
if(b)
|
||||
if(b)
|
||||
{
|
||||
// 数据库删除
|
||||
drugInfoDao.DeleteDrugInfo(drugInfo.DrugId);
|
||||
|
@ -289,7 +289,7 @@
|
|||
void CancelEdit(DrugManuNo drugManuNo)
|
||||
{
|
||||
Reset(drugManuNo);
|
||||
|
||||
SelectedDrugs.FirstOrDefault().Manus.Remove(drugManuNo);
|
||||
ManusGrid.CancelEditRow(drugManuNo);
|
||||
ManusGrid.Reload();
|
||||
}
|
||||
|
@ -308,6 +308,7 @@
|
|||
);
|
||||
if(b)
|
||||
{
|
||||
SelectedDrugs.FirstOrDefault().Manus.Remove(drugManuNo);
|
||||
// 数据库删除
|
||||
drugManuNoDao.DeleteDrugManuNo(drugManuNo.Id);
|
||||
await ManusGrid.Reload();
|
||||
|
|
|
@ -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($"修改冰箱设置");
|
||||
}
|
||||
}
|
|
@ -120,7 +120,7 @@
|
|||
}
|
||||
</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%">
|
||||
<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.role.permissionIds.Any(id => id - 50 > 0 && id - 50 < 10))
|
||||
|
|
|
@ -20,6 +20,7 @@
|
|||
@inject PortUtil PortUtil;
|
||||
@inject FingerprintUtil FingerprintUtil;
|
||||
@inject GlobalStateService globalStateService;
|
||||
@inject IOptions<PortConfig> portSetting;
|
||||
|
||||
|
||||
string msg;
|
||||
|
@ -106,6 +107,22 @@
|
|||
errMsg += "【条码扫描模块连接失败】";
|
||||
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;
|
||||
dialogService.Close();
|
||||
}
|
||||
|
|
|
@ -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($"修改用户登录设置");
|
||||
}
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
}
|
|
@ -144,9 +144,9 @@
|
|||
<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">
|
||||
<Columns>
|
||||
<RadzenDropDownDataGridColumn Property="DrugId" Title="药品编码" />
|
||||
<RadzenDropDownDataGridColumn Property="DrugName" Width="120px" Title="名称" />
|
||||
<RadzenDropDownDataGridColumn Property="DrugSpec" Title="规格" />
|
||||
<RadzenDropDownDataGridColumn Property="DrugId" Title="药品编码" Sortable="false" />
|
||||
<RadzenDropDownDataGridColumn Property="DrugName" Width="120px" Title="名称" Sortable="false" />
|
||||
<RadzenDropDownDataGridColumn Property="DrugSpec" Title="规格" Sortable="false" />
|
||||
</Columns>
|
||||
</RadzenDropDownDataGrid>
|
||||
} 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">
|
||||
<Columns>
|
||||
<RadzenDropDownDataGridColumn Property="ManuNo" Title="批次" />
|
||||
<RadzenDropDownDataGridColumn Property="EffDate" Title="效期" />
|
||||
<RadzenDropDownDataGridColumn Property="ManuNo" Title="批次" Sortable="false" />
|
||||
<RadzenDropDownDataGridColumn Property="EffDate" Title="效期" Sortable="false" />
|
||||
</Columns>
|
||||
</RadzenDropDownDataGrid>
|
||||
}
|
||||
|
|
|
@ -95,14 +95,15 @@
|
|||
</RadzenDataGridColumn>
|
||||
<RadzenDataGridColumn MinWidth="120px" Title="盘点数量" Property="CheckQuantity">
|
||||
<EditTemplate Context="cs">
|
||||
@if (cs.BoardType == 2)
|
||||
@if (cs.BoardType.ToString().Contains("2") || cs.BoardType.ToString().Contains("3"))
|
||||
{
|
||||
@cs.CheckQuantity
|
||||
}
|
||||
else
|
||||
{
|
||||
<RadzenNumeric Min="0" Style="display: block" Name="CheckQuantity" @bind-Value=@cs.CheckQuantity />
|
||||
<RadzenNumericRangeValidator Style="position: absolute;z-index: 9999;" Min="0" Text="请填写正确的盘点数量" Component="CheckQuantity" Popup="true" />
|
||||
<RadzenNumeric Style="display: block" Name="CheckQuantity" @bind-Value=@cs.CheckQuantity>
|
||||
<RadzenNumericRangeValidator Style="position: absolute;z-index: 9999;" Min="1" Max="100" Text="请填写正确的取出数量" Component="CheckQuantity" />
|
||||
</RadzenNumeric>
|
||||
}
|
||||
</EditTemplate>
|
||||
</RadzenDataGridColumn>
|
||||
|
@ -243,7 +244,6 @@
|
|||
this.BeforeQuantity = new int[9];
|
||||
this.AfterQuantity = new int[9];
|
||||
}
|
||||
|
||||
async Task CheckFinish()
|
||||
{
|
||||
if (channels.Any(cl => cl.CheckQuantity != cl.Quantity && cl.DrugId != null && cl.drugManuNo != null))
|
||||
|
@ -257,7 +257,7 @@
|
|||
}
|
||||
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($"盘点完成");
|
||||
|
||||
}
|
||||
|
|
|
@ -1,24 +1,37 @@
|
|||
@page "/stock/list"
|
||||
<style>
|
||||
.rz-custom-header {
|
||||
width: 100%;
|
||||
@@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"
|
||||
IsLoading="@isLoading"
|
||||
RowRender="@RowRender"
|
||||
EmptyText="无数据"
|
||||
Data="@_forecasts"
|
||||
AllowColumnResize="true" AllowAlternatingRows="false"
|
||||
SelectionMode="DataGridSelectionMode.Single"
|
||||
ExpandMode="DataGridExpandMode.Multiple">
|
||||
IsLoading="@isLoading"
|
||||
RowRender="@RowRender"
|
||||
EmptyText="无数据"
|
||||
Data="@_forecasts"
|
||||
AllowColumnResize="true" AllowAlternatingRows="false"
|
||||
SelectionMode="DataGridSelectionMode.Single"
|
||||
ExpandMode="DataGridExpandMode.Multiple">
|
||||
<HeaderTemplate>
|
||||
<RadzenRow JustifyContent="JustifyContent.End" AlignItems="AlignItems.Center">
|
||||
<RadzenButton Icon="download" Text="库存导出" Variant="Variant.Outlined" />
|
||||
<RadzenButton Icon="download" Text="专用账册导出" Variant="Variant.Outlined" />
|
||||
<RadzenButton Icon="download" Text="库存导出" Variant="Variant.Outlined" Click="StockExport" />
|
||||
<RadzenButton Icon="download" Text="专用账册导出" Variant="Variant.Outlined" Click="AccountBookExport" />
|
||||
</RadzenRow>
|
||||
</HeaderTemplate>
|
||||
<Template Context="di">
|
||||
|
@ -29,16 +42,44 @@
|
|||
@s.DrawerNo - @s.ColNo
|
||||
</Template>
|
||||
</RadzenDataGridColumn>
|
||||
<RadzenDataGridColumn Title="数量" Property="Quantity"></RadzenDataGridColumn>
|
||||
<RadzenDataGridColumn Title="数量" Property="Quantity">
|
||||
</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>
|
||||
</RadzenDataGrid>
|
||||
</Template>
|
||||
<Columns>
|
||||
<RadzenDataGridColumn Frozen="true" Width="200px" Title="Ò©Æ·Ãû³Æ" Property="DrugName"></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>
|
||||
</RadzenDataGrid>
|
||||
</div>
|
||||
|
@ -83,7 +124,15 @@
|
|||
|
||||
|
||||
|
||||
async void StockExport()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
async void AccountBookExport()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -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; }
|
||||
}
|
||||
|
||||
}
|
|
@ -44,5 +44,11 @@ namespace MasaBlazorApp3.Pojo
|
|||
[Association(ThisKey = nameof(DrugId), OtherKey = nameof(DrugInfo.DrugId))]
|
||||
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; }
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,10 +1,4 @@
|
|||
using LinqToDB.Common.Internal.Cache;
|
||||
using LinqToDB.Mapping;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using LinqToDB.Mapping;
|
||||
|
||||
namespace MasaBlazorApp3.Pojo
|
||||
{
|
||||
|
@ -37,7 +31,9 @@ namespace MasaBlazorApp3.Pojo
|
|||
[Column("drawer_type")]
|
||||
public int DrawerType { get; set; }
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 1物理隔板;2单支计数;3管控药盒;4储物箱;5智能显示;6称重计数;63称重计数药盒;653称重计数药盒智能显示;
|
||||
/// </summary>
|
||||
[Column("board_type")]
|
||||
public int BoardType { get; set; }
|
||||
|
||||
|
@ -47,7 +43,7 @@ namespace MasaBlazorApp3.Pojo
|
|||
[Column("eff_date")]
|
||||
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; }
|
||||
|
||||
|
||||
|
@ -62,7 +58,7 @@ namespace MasaBlazorApp3.Pojo
|
|||
[Column("dmnguid")]
|
||||
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; }
|
||||
|
||||
|
||||
|
@ -72,7 +68,6 @@ namespace MasaBlazorApp3.Pojo
|
|||
|
||||
[Column(IsColumn = false)]
|
||||
public int CanReturnQuantity { get; set; }
|
||||
|
||||
[Column(IsColumn = false)]
|
||||
public int CheckQuantity
|
||||
{
|
||||
|
@ -81,5 +76,18 @@ namespace MasaBlazorApp3.Pojo
|
|||
}
|
||||
[Column("Pos_No")]
|
||||
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; }
|
||||
}
|
||||
}
|
||||
|
|
|
@ -19,5 +19,9 @@ namespace MasaBlazorApp3.Pojo.Config
|
|||
public bool canBusExsit { get; set; }
|
||||
public int doorAddr { get; set; }
|
||||
public int storageBoxAddr { get; set; }
|
||||
//存在冰箱串口
|
||||
public bool fridgePortExist { get; set; }
|
||||
//冰箱串口号
|
||||
public string fridgePortPath { get; set; }
|
||||
}
|
||||
}
|
||||
|
|
|
@ -14,6 +14,8 @@ namespace MasaBlazorApp3.Pojo.Config
|
|||
public bool opFirst { get; set; }
|
||||
//自动退出登录时间,单位秒(0不自动退出)
|
||||
public int autoOutLog { get; set; }
|
||||
//手术室药盒的设备id
|
||||
public string boxMachineId { get; set; }
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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; }
|
||||
}
|
||||
}
|
|
@ -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; }
|
||||
}
|
||||
}
|
|
@ -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; }
|
||||
}
|
||||
}
|
|
@ -154,6 +154,14 @@ namespace MasaBlazorApp3.Pojo
|
|||
[Column("state")]
|
||||
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; }
|
||||
|
||||
}
|
||||
}
|
|
@ -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; }
|
||||
}
|
||||
}
|
|
@ -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; }
|
||||
}
|
||||
}
|
|
@ -195,13 +195,70 @@ namespace MasaBlazorApp3.Pojo
|
|||
PremissionName = "权限管理",
|
||||
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(j);
|
||||
list.Add(h);
|
||||
list.Add(k);
|
||||
x.AddChild(set);
|
||||
list.Add(x);
|
||||
|
||||
return list;
|
||||
}
|
||||
|
||||
public bool HasChild()
|
||||
{
|
||||
return this.Items.Count() > 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
}
|
|
@ -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;
|
||||
|
||||
}
|
||||
}
|
|
@ -18,6 +18,7 @@ using System.Reflection;
|
|||
using MasaBlazorApp3.Pojo.Config;
|
||||
using Microsoft.Extensions.Options;
|
||||
using LinqToDB.Common;
|
||||
using MasaBlazorApp3.Util;
|
||||
|
||||
namespace MasaBlazorApp3.Port
|
||||
{
|
||||
|
@ -32,6 +33,9 @@ namespace MasaBlazorApp3.Port
|
|||
// 条码枪串口
|
||||
public SerialPort scanCodeSerial;
|
||||
|
||||
//冰箱串口
|
||||
public SerialPort fridgeSerial;
|
||||
|
||||
|
||||
public bool Operate { get; set; }
|
||||
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
|
||||
|
||||
#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
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
@ -47,6 +47,7 @@ internal class Program
|
|||
appBuilder.Services.Configure<SettingConfig>(config.GetSection("setting"));
|
||||
appBuilder.Services.Configure<PortConfig>(config.GetSection("port"));
|
||||
appBuilder.Services.Configure<DrawerConfig>(config.GetSection("drawer"));
|
||||
appBuilder.Services.Configure<fridgeConfig>(config.GetSection("fridge"));
|
||||
|
||||
// i18n
|
||||
//appBuilder.Services.AddI18nText();
|
||||
|
@ -62,6 +63,8 @@ internal class Program
|
|||
appBuilder.Services.AddScoped<IDrugInfoDao, DrugInfoDao>();
|
||||
appBuilder.Services.AddScoped<IMachineRecordDao, MachineRecordDao>();
|
||||
appBuilder.Services.AddScoped<IInOutInvoiceDao, InOutInvoiceDao>();
|
||||
appBuilder.Services.AddScoped<ISettingManuDao, SettingManuDao>();
|
||||
appBuilder.Services.AddScoped<IPlanDao, PlanDao>();
|
||||
|
||||
//自选取药
|
||||
appBuilder.Services.AddScoped<ISelfTakeDao, SelfTakeDao>();
|
||||
|
|
|
@ -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}");
|
||||
// }
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -11,7 +11,8 @@
|
|||
"loginMode": 1,
|
||||
"opFirst": true,
|
||||
//自动退出登录时间,单位秒(0不自动退出)
|
||||
"autoOutLog": 0
|
||||
"autoOutLog": 0,
|
||||
"boxMachineId": "DM5"
|
||||
},
|
||||
"port": {
|
||||
"drawerPortPath": "COM1",
|
||||
|
@ -20,13 +21,23 @@
|
|||
"canBusPortPath": "COM31",
|
||||
"canBusExsit": true,
|
||||
"doorAddr": 0,
|
||||
"storageBoxAddr": 0
|
||||
"storageBoxAddr": 0,
|
||||
"fridgePortExist": false,
|
||||
"fridgePortPath": "COM3"
|
||||
},
|
||||
"drawer": {
|
||||
"single": [ 3 ],
|
||||
"weigh": [4],
|
||||
"box": [4],
|
||||
"label": [4]
|
||||
"weigh": [ 4 ],
|
||||
"box": [ 4 ],
|
||||
"label": [ 4 ]
|
||||
},
|
||||
"fridge": {
|
||||
//冰箱温度区间
|
||||
"temperatureRange": "2-8",
|
||||
//冰箱状态1关闭;0打开
|
||||
"fridgeState": 0,
|
||||
//冰箱报警状态1关闭;0打开
|
||||
"alertState": 0
|
||||
}
|
||||
|
||||
}
|
Loading…
Reference in New Issue