From ac39763b130f053bca9c6f934bcf2657b27226d4 Mon Sep 17 00:00:00 2001 From: maqiao <625215135@qq.com> Date: Tue, 24 Jun 2025 08:55:34 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- MasaBlazorApp3/App.razor | 2 +- .../DataAccess/AppDataConnection.cs | 5 + .../DataAccess/ChannelStockWithDrawerCount.cs | 4 +- .../DataAccess/Dao/IChannelListDao.cs | 24 + .../DataAccess/Dao/IHkcChangeShiftsDao.cs | 16 + .../DataAccess/Dao/IOrderInfoDao.cs | 6 + MasaBlazorApp3/DataAccess/Dao/IPlanDao.cs | 67 ++ .../DataAccess/Dao/ISettingManuDao.cs | 14 + .../DataAccess/Impl/ChannelListDao.cs | 666 +++++++++++++++++- .../DataAccess/Impl/DrugManuNoDao.cs | 14 +- .../DataAccess/Impl/HkcChangeShiftsDao.cs | 51 ++ .../DataAccess/Impl/OrderInfoDao.cs | 291 +++++++- MasaBlazorApp3/DataAccess/Impl/PlanDao.cs | 307 ++++++++ .../DataAccess/Impl/SettingManuDao.cs | 37 + MasaBlazorApp3/Pages/BoxAddBox.razor | 147 ++++ .../Pages/BoxAddBoxDetailDialog.razor | 318 +++++++++ MasaBlazorApp3/Pages/BoxAddDetailDialog.razor | 329 +++++++++ MasaBlazorApp3/Pages/BoxAddDrug.razor | 146 ++++ MasaBlazorApp3/Pages/BoxBind.razor | 162 +++++ MasaBlazorApp3/Pages/ChangeShifts.razor | 114 +++ MasaBlazorApp3/Pages/CheckOrder.razor | 139 ++++ MasaBlazorApp3/Pages/DrugList.razor | 5 +- MasaBlazorApp3/Pages/FridgeSetting.razor | 119 ++++ MasaBlazorApp3/Pages/Home.razor | 2 +- MasaBlazorApp3/Pages/InitPage.razor | 17 + MasaBlazorApp3/Pages/LoginSetting.razor | 74 ++ MasaBlazorApp3/Pages/PlanManagement.razor | 431 ++++++++++++ MasaBlazorApp3/Pages/StockBinding.razor | 10 +- MasaBlazorApp3/Pages/StockCheck.razor | 10 +- MasaBlazorApp3/Pages/StockList.razor | 79 ++- MasaBlazorApp3/Pojo/AccountBookG2.cs | 153 ++++ MasaBlazorApp3/Pojo/ChannelList.cs | 6 + MasaBlazorApp3/Pojo/ChannelStock.cs | 30 +- MasaBlazorApp3/Pojo/Config/PortConfig.cs | 4 + MasaBlazorApp3/Pojo/Config/SettingConfig.cs | 2 + MasaBlazorApp3/Pojo/Config/fridgeConfig.cs | 16 + MasaBlazorApp3/Pojo/DrugBase.cs | 26 + MasaBlazorApp3/Pojo/HkcChangeShifts.cs | 35 + MasaBlazorApp3/Pojo/OrderInfo.cs | 12 +- MasaBlazorApp3/Pojo/Plan.cs | 37 + MasaBlazorApp3/Pojo/PlanDetails.cs | 41 ++ MasaBlazorApp3/Pojo/Premission.cs | 57 ++ MasaBlazorApp3/Pojo/SettingManu.cs | 21 + MasaBlazorApp3/Pojo/Vo/BoxTakeVo.cs | 32 + MasaBlazorApp3/Port/PortUtil.cs | 397 ++++++++++- MasaBlazorApp3/Program.cs | 3 + MasaBlazorApp3/Shared/SettingLayout.razor | 94 +++ MasaBlazorApp3/Util/CRC16MODBUS.cs | 42 ++ MasaBlazorApp3/appsettings.json | 21 +- 49 files changed, 4552 insertions(+), 83 deletions(-) create mode 100644 MasaBlazorApp3/DataAccess/Dao/IHkcChangeShiftsDao.cs create mode 100644 MasaBlazorApp3/DataAccess/Dao/IPlanDao.cs create mode 100644 MasaBlazorApp3/DataAccess/Dao/ISettingManuDao.cs create mode 100644 MasaBlazorApp3/DataAccess/Impl/HkcChangeShiftsDao.cs create mode 100644 MasaBlazorApp3/DataAccess/Impl/PlanDao.cs create mode 100644 MasaBlazorApp3/DataAccess/Impl/SettingManuDao.cs create mode 100644 MasaBlazorApp3/Pages/BoxAddBox.razor create mode 100644 MasaBlazorApp3/Pages/BoxAddBoxDetailDialog.razor create mode 100644 MasaBlazorApp3/Pages/BoxAddDetailDialog.razor create mode 100644 MasaBlazorApp3/Pages/BoxAddDrug.razor create mode 100644 MasaBlazorApp3/Pages/BoxBind.razor create mode 100644 MasaBlazorApp3/Pages/ChangeShifts.razor create mode 100644 MasaBlazorApp3/Pages/CheckOrder.razor create mode 100644 MasaBlazorApp3/Pages/FridgeSetting.razor create mode 100644 MasaBlazorApp3/Pages/LoginSetting.razor create mode 100644 MasaBlazorApp3/Pages/PlanManagement.razor create mode 100644 MasaBlazorApp3/Pojo/AccountBookG2.cs create mode 100644 MasaBlazorApp3/Pojo/Config/fridgeConfig.cs create mode 100644 MasaBlazorApp3/Pojo/DrugBase.cs create mode 100644 MasaBlazorApp3/Pojo/HkcChangeShifts.cs create mode 100644 MasaBlazorApp3/Pojo/Plan.cs create mode 100644 MasaBlazorApp3/Pojo/PlanDetails.cs create mode 100644 MasaBlazorApp3/Pojo/SettingManu.cs create mode 100644 MasaBlazorApp3/Pojo/Vo/BoxTakeVo.cs create mode 100644 MasaBlazorApp3/Shared/SettingLayout.razor create mode 100644 MasaBlazorApp3/Util/CRC16MODBUS.cs diff --git a/MasaBlazorApp3/App.razor b/MasaBlazorApp3/App.razor index 35e483c..f132fb4 100644 --- a/MasaBlazorApp3/App.razor +++ b/MasaBlazorApp3/App.razor @@ -7,7 +7,7 @@ - Sorry, there's nothing at this address. + 抱歉,找不到此页面。 diff --git a/MasaBlazorApp3/DataAccess/AppDataConnection.cs b/MasaBlazorApp3/DataAccess/AppDataConnection.cs index a632a31..60abc3f 100644 --- a/MasaBlazorApp3/DataAccess/AppDataConnection.cs +++ b/MasaBlazorApp3/DataAccess/AppDataConnection.cs @@ -28,6 +28,11 @@ namespace MasaBlazorApp3.DataAccess public ITable MachineRecord => this.GetTable(); public ITable InOutInvoice => this.GetTable(); public ITable AccountBook => this.GetTable(); + public ITable SettingManu => this.GetTable(); + public ITable Plan => this.GetTable(); + public ITable PlanDetails => this.GetTable(); + public ITable AccountBookG2 => this.GetTable(); + public ITable HkcChangeShifts => this.GetTable(); diff --git a/MasaBlazorApp3/DataAccess/ChannelStockWithDrawerCount.cs b/MasaBlazorApp3/DataAccess/ChannelStockWithDrawerCount.cs index 7f3eeb8..4c7e67f 100644 --- a/MasaBlazorApp3/DataAccess/ChannelStockWithDrawerCount.cs +++ b/MasaBlazorApp3/DataAccess/ChannelStockWithDrawerCount.cs @@ -6,9 +6,9 @@ using System.Threading.Tasks; namespace MasaBlazorApp3.DataAccess { - public class ChannelStockWithDrawerCount + public class ChannelStockWithDrawerCount { public int[] DrawerArray { get; set; } - public List ChannelStocks { get; set; } = new List(); + public List ChannelStocks { get; set; } = new List(); } } diff --git a/MasaBlazorApp3/DataAccess/Dao/IChannelListDao.cs b/MasaBlazorApp3/DataAccess/Dao/IChannelListDao.cs index 6240790..e7c14bd 100644 --- a/MasaBlazorApp3/DataAccess/Dao/IChannelListDao.cs +++ b/MasaBlazorApp3/DataAccess/Dao/IChannelListDao.cs @@ -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 DrawerCheckFinish(List Stocks); //抽屉获取库存数据--药品绑定 Task> GetChannelStockByBiaoDing(int DrawerNo, int Quantity=0); + //手术室药箱获取绑定数据 + Task> GetAllChannelListWithPlan(int? take, int? skip); + /// + /// 手术室药箱绑定套餐 + /// + /// + Task BindBox(ChannelList channelList); + /// + /// 手术室药箱解绑套餐 + /// + /// + /// + Task UnBindBox(ChannelList list); + //获取手术室药箱中所有要补药的数据 + Task> GetAllBoxAddDrug(int? take, int? skip); + //手术室药箱补药获取毒麻柜中的药品信息 + Task> getTakeInfoByBox(ChannelList cl); + //手术室药箱补药完成 + Task BoxTakeFinish(List datas); + //手术室药箱入库 + Task> GetBoxWaitInfo(int? take, int? skip); + //手术室药箱入库获取待入库明细 + Task> getBoxWaitByBox(ChannelList cl); } } diff --git a/MasaBlazorApp3/DataAccess/Dao/IHkcChangeShiftsDao.cs b/MasaBlazorApp3/DataAccess/Dao/IHkcChangeShiftsDao.cs new file mode 100644 index 0000000..d82de55 --- /dev/null +++ b/MasaBlazorApp3/DataAccess/Dao/IHkcChangeShiftsDao.cs @@ -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> GetChangeShiftRecordAsync(DateTime start, DateTime end, int? take, int? skip); + + } +} diff --git a/MasaBlazorApp3/DataAccess/Dao/IOrderInfoDao.cs b/MasaBlazorApp3/DataAccess/Dao/IOrderInfoDao.cs index a5b0c7e..d08e106 100644 --- a/MasaBlazorApp3/DataAccess/Dao/IOrderInfoDao.cs +++ b/MasaBlazorApp3/DataAccess/Dao/IOrderInfoDao.cs @@ -26,5 +26,11 @@ namespace MasaBlazorApp3.DataAccess.Dao public Task OrderReturnFinish(List> datas, string OrderrNo); public Task>> getReturnInfoByOrderNo(string OrderrNo); + //获取药箱中的用药信息 + public Task> GetAllOrderInfoByBox(int box,string OrderrNo, DateTime OrderDate, int? take, int? skip); + //获取所有药箱号 + public Task GetDrawerNum(string machineId); + //核对处方 + public Task CheckOrderInfo(IList selectedOrderInfos, int DrawerNo); } } diff --git a/MasaBlazorApp3/DataAccess/Dao/IPlanDao.cs b/MasaBlazorApp3/DataAccess/Dao/IPlanDao.cs new file mode 100644 index 0000000..dcdf0c5 --- /dev/null +++ b/MasaBlazorApp3/DataAccess/Dao/IPlanDao.cs @@ -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 + { + + /// + /// 获取所有套餐数据 + /// + /// + Task> GetAllPlanInfo(); + /// + /// 根据套餐ID获取套餐数据 + /// + /// + /// + Task GetPlanById(int Id); + /// + /// 新增套餐 + /// + /// + /// + Task InsertPlanInfo(Plan plan); + /// + /// 更新套餐 + /// + /// + /// + Task UpdatePlanInfo(Plan plan); + /// + /// 删除套餐 + /// + /// + /// + Task DeletePlanInfo(int planID); + /// + /// 向套餐添加药品 + /// + /// + /// + Task AddPlanDetail(PlanDetails details); + /// + /// 修改套餐中的药品 + /// + /// + /// + Task UpdatePlanDetail(PlanDetails details); + /// + /// 删除套餐中的药品 + /// + /// + /// + Task DeletePlanDetail(PlanDetails planID); + /// + /// 根据套餐明细获取套餐 + /// + /// + /// + bool CheckDrugById(PlanDetails details); + } +} diff --git a/MasaBlazorApp3/DataAccess/Dao/ISettingManuDao.cs b/MasaBlazorApp3/DataAccess/Dao/ISettingManuDao.cs new file mode 100644 index 0000000..36545dc --- /dev/null +++ b/MasaBlazorApp3/DataAccess/Dao/ISettingManuDao.cs @@ -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> GetMenuItemsAsync(); + } +} diff --git a/MasaBlazorApp3/DataAccess/Impl/ChannelListDao.cs b/MasaBlazorApp3/DataAccess/Impl/ChannelListDao.cs index 66f4fce..55a5da5 100644 --- a/MasaBlazorApp3/DataAccess/Impl/ChannelListDao.cs +++ b/MasaBlazorApp3/DataAccess/Impl/ChannelListDao.cs @@ -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() { DrawerArray = ints, ChannelStocks = channelStocks }; } + //手术室药箱获取绑定数据 + public async Task> 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 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 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() + { + + TotalDesserts = pagedData, + Desserts = list, + Other = planInfos + }; + } + /// + /// 手术室药箱绑定套餐 + /// + /// + public async Task 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 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; + } + } + /// + /// 手术室药箱解绑套餐 + /// + /// + /// + public async Task 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> GetAllBoxAddDrug(int? take, int? skip) + { + try + { + List channelLists = new List(); + 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() + { + + TotalDesserts = pagedData, + Desserts = channelLists + }; + } + catch (Exception ex) + { + logger.Info($"获取药箱中补药数据失败{ex.Message}"); + return null; + } + } + + //手术室药箱补药获取毒麻柜中的药品信息 + public async Task> getTakeInfoByBox(ChannelList cl) + { + try + { + List tempData = new(); + List tempData2 = new(); + var flag = true; + for (int i = 0; i < cl.ChannelStocks.Count; i++) + { + ChannelStock boxCs = cl.ChannelStocks[i]; + // 当前药品取药数量 + var Quantity = boxCs.NeedQuantity; + List 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 BoxTakeFinish(List 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 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> GetBoxWaitInfo(int? take, int? skip) + { + try + { + List channelLists = new List(); + 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() + { + + TotalDesserts = pagedData, + Desserts = channelLists + }; + } + catch (Exception ex) + { + logger.Info($"获取药箱中补药数据失败{ex.Message}"); + return null; + } + } + //手术室药箱入库获取待入库明细 + public async Task> getBoxWaitByBox(ChannelList cl) + { + try + { + List tempData = new(); + List tempData2 = new(); + var flag = true; + for (int i = 0; i < cl.ChannelStocks.Count; i++) + { + ChannelStock boxCs = cl.ChannelStocks[i]; + // 当前药品取药数量 + var Quantity = boxCs.NeedQuantity; + List 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; + } + } } } diff --git a/MasaBlazorApp3/DataAccess/Impl/DrugManuNoDao.cs b/MasaBlazorApp3/DataAccess/Impl/DrugManuNoDao.cs index 824f9d2..8062766 100644 --- a/MasaBlazorApp3/DataAccess/Impl/DrugManuNoDao.cs +++ b/MasaBlazorApp3/DataAccess/Impl/DrugManuNoDao.cs @@ -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) diff --git a/MasaBlazorApp3/DataAccess/Impl/HkcChangeShiftsDao.cs b/MasaBlazorApp3/DataAccess/Impl/HkcChangeShiftsDao.cs new file mode 100644 index 0000000..fa91262 --- /dev/null +++ b/MasaBlazorApp3/DataAccess/Impl/HkcChangeShiftsDao.cs @@ -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 setting, PortUtil portUtil) + { + _connection = connection; + _setting = setting.Value; + _portUtil = portUtil; + } + public async Task> 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 Records = await query + .OrderByDescending(mr => mr.optDate) + .Skip((int)skip) + .Take((int)take) + .ToListAsync(); + + return new PageData() { Desserts = Records, TotalDesserts = pagedData }; + + } + } +} diff --git a/MasaBlazorApp3/DataAccess/Impl/OrderInfoDao.cs b/MasaBlazorApp3/DataAccess/Impl/OrderInfoDao.cs index a7152f7..abeb449 100644 --- a/MasaBlazorApp3/DataAccess/Impl/OrderInfoDao.cs +++ b/MasaBlazorApp3/DataAccess/Impl/OrderInfoDao.cs @@ -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 setting, GlobalStateService globalStateService,PortUtil portUtil) + public OrderInfoDao(AppDataConnection connection, IOptions 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 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)) { @@ -123,7 +127,7 @@ namespace MasaBlazorApp3.DataAccess.Impl } } - + return await query.OrderBy((cs) => cs.EffDate) .ThenBy((cs) => cs.DrawerNo) .ThenBy((cs) => cs.ColNo) @@ -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; @@ -511,7 +516,7 @@ namespace MasaBlazorApp3.DataAccess.Impl InvoiceId = operationVo.data.InvoiceId.ToString(), GetId = operationVo.data.Id }); - + // 获取更新完库存之后的药品库存 List list = await _connection.ChannelStock.AsQueryable() .InnerJoin( @@ -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); } @@ -553,7 +558,7 @@ namespace MasaBlazorApp3.DataAccess.Impl } - + } if (flag) { @@ -573,5 +578,271 @@ namespace MasaBlazorApp3.DataAccess.Impl return false; } } + + + /// + /// 获取药箱中的用药信息 + /// + /// + /// + /// + /// + /// + public async Task> GetAllOrderInfoByBox(int box, string OrderrNo, DateTime OrderDate, int? take, int? skip) + { + //var query = _connection.OrderInfo.AsQueryable(); + + //query.InnerJoin((oi, od) => oi.OrderNo == od.OrderNo); + + var query2 = from od in _connection.OrderDetail + from cl in _connection.ChannelStock.Where(c => c.MachineId == _setting.machineId).InnerJoin(c => c.DrugId == od.DrugId) + group od by od.OrderNo into temp + select new { temp.Key }; + var query = from oi in _connection.OrderInfo + from od in query2.InnerJoin(od => od.Key == oi.OrderNo) + select oi; + + if (!String.IsNullOrEmpty(OrderrNo)) + { + query = query.Where(oi => oi.OrderNo.Equals(OrderrNo)); + } + if (OrderDate != null && OrderDate != DateTime.MinValue) + { + query = query.Where(oi => oi.OrderDate.Date.Equals(OrderDate.Date)); + } + + query = query.Where(oi => oi.Status == 0); + query = query.Where(oi => oi.HisDispFlag == 0); + query = query.Where(oi => oi.CancelFlag == 0); + //query = query.Where(oi => oi.DoctorCode == box); + + int pagedData = await query.CountAsync(); + + List list = await query + //.LoadWith(oi => oi.Detail) + //.LoadWith(oi => oi.Detail.Drug) + .OrderBy((oi) => oi.RecvDate) + .ThenBy((oi => oi.OrderNo)) + .Skip((int)skip) + .Take((int)take) + .ToListAsync(); + if (list != null && list.Count > 0) + { + for (int i = 0; i < list.Count; i++) + { + //list[i].Detail = await _connection.OrderDetail.AsQueryable() + // .Where(od => od.OrderNo == list[i].OrderNo) + // .LoadWith(od => od.Drug) + // .ToListAsync(); + } + } + + return new PageData() + { + TotalDesserts = pagedData, + Desserts = list + }; + } + /// + /// 获取所有药箱号 + /// + /// + /// + public async Task 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 CheckOrderInfo(IList 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 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; + } + } + } } diff --git a/MasaBlazorApp3/DataAccess/Impl/PlanDao.cs b/MasaBlazorApp3/DataAccess/Impl/PlanDao.cs new file mode 100644 index 0000000..54d8dc8 --- /dev/null +++ b/MasaBlazorApp3/DataAccess/Impl/PlanDao.cs @@ -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 setting, GlobalStateService globalStateService) + { + _connection = connection; + _setting = setting.Value; + _globalStateService = globalStateService; + } + /// + /// 获取所有套餐数据 + /// + /// + public async Task> GetAllPlanInfo() + { + var query = _connection.Plan.AsQueryable(); + + List 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 drugInfos = await other + .LoadWith(di => di.Manus) + .OrderBy((di) => di.DrugId) + .ToListAsync(); + + int pagedData = await query.CountAsync(); + return new PageMultiData() + { + + TotalDesserts = pagedData, + Desserts = list, + Other = drugInfos + }; + } + /// + /// 根据套餐ID获取套餐数据 + /// + /// + /// + public async Task GetPlanById(int Id) + { + var query = _connection.Plan.AsQueryable().Where(p => p.Id == Id&&p.UseState==1); + List 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]; + } + + /// + /// 新增套餐 + /// + /// + /// + public async Task 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; + } + } + + /// + /// 更新套餐 + /// + /// + /// + public async Task 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; + } + } + /// + /// 删除套餐 + /// + /// + /// + public async Task 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; + } + } + + + /// + /// 向套餐中添加药品 + /// + /// + /// + public async Task 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; + } + } + /// + /// 修改套餐中的药品 + /// + /// + /// + public async Task 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; + } + } + + /// + /// 删除套餐中的药品 + /// + /// + /// + public async Task 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; + } + } + + } +} diff --git a/MasaBlazorApp3/DataAccess/Impl/SettingManuDao.cs b/MasaBlazorApp3/DataAccess/Impl/SettingManuDao.cs new file mode 100644 index 0000000..44cd6fb --- /dev/null +++ b/MasaBlazorApp3/DataAccess/Impl/SettingManuDao.cs @@ -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 setting, GlobalStateService globalStateService, PortUtil portUtil) + { + _globalStateService = globalStateService; + _connection = connection; + _setting = setting.Value; + } + public async Task> GetMenuItemsAsync() + { + var query = _connection.SettingManu.AsQueryable(); + + + return await query + .OrderBy((sm) => sm.Id) + .ToListAsync(); + } + } +} diff --git a/MasaBlazorApp3/Pages/BoxAddBox.razor b/MasaBlazorApp3/Pages/BoxAddBox.razor new file mode 100644 index 0000000..82af903 --- /dev/null +++ b/MasaBlazorApp3/Pages/BoxAddBox.razor @@ -0,0 +1,147 @@ +@page "/Box/BoxAddBox" + + + + + + + + + + + + + + + + @* + + *@ + + + + + + + + + + + @DrawerNo.DrawerNo 号药箱 + + + + + + + +@code { + @inject IChannelListDao channelStockDao; + @inject DialogService dialogService; + RadzenDataGrid grid; + bool isLoading; + int count; + private IEnumerable? _forecasts; + DateTime start; + DateTime end; + + IList 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 args) + { + args.Expandable = args.Data.ChannelStocks.Count > 0; + } + + async void OnRowSelect(ChannelList cl) + { + var b = await dialogService.OpenAsync( + $"{cl.DrawerNo}号药箱取药", + new Dictionary() { { "boxChannelList", cl } }, + new DialogOptions() { Width = "85vw", Resizable = true, Draggable = true, ShowClose = false } + ); + if (b) + { + await grid.Reload(); + } + } + + + async void StockExport() + { + + } + + async void AccountBookExport() + { + + } + + + +} \ No newline at end of file diff --git a/MasaBlazorApp3/Pages/BoxAddBoxDetailDialog.razor b/MasaBlazorApp3/Pages/BoxAddBoxDetailDialog.razor new file mode 100644 index 0000000..cdd4d04 --- /dev/null +++ b/MasaBlazorApp3/Pages/BoxAddBoxDetailDialog.razor @@ -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; + + + + @if (CanTakeDrug) + { + + + + + @context.ChannelStock.DrawerNo - @context.ChannelStock.ColNo + + + + + + + + + + } + else + { + + + + + + + + + } + + + + + + @if (status < 2) + { + + } + @if (status == 2) + { + + } + @if (status <= 2) + { + + } + + + +@code { + @inject Radzen.DialogService dialogService; + @inject IChannelListDao channelListDao; + @inject IOptions 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 data { get; set; } + //称重取药数量 + int[] WeightFinnalQuantity { get; set; } = new int[] { 0, 0, 0, 0, 0, 0, 0, 0, 0 }; + + //开抽屉前操作标识 + List DrawerNoColNoList = new List(); + + 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 drawerNos = this.data.GroupBy(it => it.ChannelStock.DrawerNo).Select(it => it.First()).ToList(); + + // 根据抽屉类型来决定打开前是否需要查询数量 + var promiseUtil = new PromiseUtil(); + + 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( + $"保存确认", + new Dictionary() { { "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(); + } + + +} diff --git a/MasaBlazorApp3/Pages/BoxAddDetailDialog.razor b/MasaBlazorApp3/Pages/BoxAddDetailDialog.razor new file mode 100644 index 0000000..0ccf4d1 --- /dev/null +++ b/MasaBlazorApp3/Pages/BoxAddDetailDialog.razor @@ -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; + + + + @* + 处方号: + @(order?.OrderNo) + 患者姓名: + @(order?.PatientName) + 性别: + @(order?.Sex) + 年龄: + @(order?.Age) + + *@ + @if (CanTakeDrug) + { + + + + + @context.ChannelStock.DrawerNo - @context.ChannelStock.ColNo + + + + + + + + + + } + else + { + + + + + + + + + } + + + + + + @if (status < 2) + { + + } + @if (status == 2) + { + + } + @if (status <= 2) + { + + } + + + +@code { + @inject Radzen.DialogService dialogService; + @inject IChannelListDao channelListDao; + @inject IOptions 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 data { get; set; } + //称重取药数量 + int[] WeightFinnalQuantity { get; set; } = new int[] { 0, 0, 0, 0, 0, 0, 0, 0, 0 }; + + //开抽屉前操作标识 + List DrawerNoColNoList = new List(); + + 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 drawerNos = this.data.GroupBy(it => it.ChannelStock.DrawerNo).Select(it => it.First()).ToList(); + + // 根据抽屉类型来决定打开前是否需要查询数量 + var promiseUtil = new PromiseUtil(); + + 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( + $"保存确认", + new Dictionary() { { "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(); + } + + +} diff --git a/MasaBlazorApp3/Pages/BoxAddDrug.razor b/MasaBlazorApp3/Pages/BoxAddDrug.razor new file mode 100644 index 0000000..402d0f2 --- /dev/null +++ b/MasaBlazorApp3/Pages/BoxAddDrug.razor @@ -0,0 +1,146 @@ +@page "/Box/BoxAdd" + + + + + + + + + + + + + + + @* + + *@ + + + + + + + + + + + @DrawerNo.DrawerNo 号药箱 + + + + + + + +@code { + @inject IChannelListDao channelStockDao; + @inject DialogService dialogService; + RadzenDataGrid grid; + bool isLoading; + int count; + private IEnumerable? _forecasts; + DateTime start; + DateTime end; + + IList 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 args) + { + args.Expandable = args.Data.ChannelStocks.Count > 0; + } + + async void OnRowSelect(ChannelList cl) + { + var b = await dialogService.OpenAsync( + $"{cl.DrawerNo}号药箱取药", + new Dictionary() { { "boxChannelList", cl } }, + new DialogOptions() { Width = "85vw", Resizable = true, Draggable = true, ShowClose = false } + ); + if (b) + { + await grid.Reload(); + } + } + + + async void StockExport() + { + + } + + async void AccountBookExport() + { + + } + + + +} diff --git a/MasaBlazorApp3/Pages/BoxBind.razor b/MasaBlazorApp3/Pages/BoxBind.razor new file mode 100644 index 0000000..687e10c --- /dev/null +++ b/MasaBlazorApp3/Pages/BoxBind.razor @@ -0,0 +1,162 @@ +@page "/Box/BoxBindings" + + + + + + + + + + + + @(channel.DrawerNo) + 号手术间 + + + + @if (channel.TotalQuantity == 0) + { + + } + + + + + + 套餐 + @if (channel.DrugId == null || channel.TotalQuantity == 0) + { + + + + + + + + + + + } + else + { + @(channel.PlanInfo.Name) + } + 总库存 + @(channel.TotalQuantity) + + + + + + + + + +@code { + @inject IChannelListDao channelListDao; + @inject IDrugInfoDao drugInfoDao; + @inject DialogService dialogService; + @inject NotificationService _message + RadzenDataList grid; + bool isLoading; + int count; + private IEnumerable? _forecasts; + + List drugInfos; + List drugManuNos; + + DrugInfo drugInfo; + + DrugManuNo drugManuNo; + + + List 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 + { + + } + } + } + + + + + +} diff --git a/MasaBlazorApp3/Pages/ChangeShifts.razor b/MasaBlazorApp3/Pages/ChangeShifts.razor new file mode 100644 index 0000000..dbd25b3 --- /dev/null +++ b/MasaBlazorApp3/Pages/ChangeShifts.razor @@ -0,0 +1,114 @@ +@page "/setting/Change" + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @mr.optDate.ToString("yyyy-MM-dd") + + + + + + + + + + @mr.ToDate.ToString("yyyy-MM-dd") + + + + + + + + + + + +@code { + @inject IHkcChangeShiftsDao hkcChangeShiftsDao; + @inject DialogService dialogService; + + @inject NavigationManager navigate; + RadzenDataGrid grid; + bool isLoading; + int count; + private IEnumerable? _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(); + } +} \ No newline at end of file diff --git a/MasaBlazorApp3/Pages/CheckOrder.razor b/MasaBlazorApp3/Pages/CheckOrder.razor new file mode 100644 index 0000000..6fa2249 --- /dev/null +++ b/MasaBlazorApp3/Pages/CheckOrder.razor @@ -0,0 +1,139 @@ +@page "/Box/Check" +@using MasaBlazorApp3.Pojo.Config + + + + + @foreach (int i in DrawerNos) + { + + + } + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@code { + @inject IOrderInfoDao orderInfoDao; + @inject DialogService dialogService; + @inject Microsoft.Extensions.Options.IOptions setting; + + bool allowRowSelectOnRowClick = true; + IEnumerable orderInfos; + IList selectedOrderInfos; + RadzenDataGrid 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; + // } +} \ No newline at end of file diff --git a/MasaBlazorApp3/Pages/DrugList.razor b/MasaBlazorApp3/Pages/DrugList.razor index ad77e96..4e56516 100644 --- a/MasaBlazorApp3/Pages/DrugList.razor +++ b/MasaBlazorApp3/Pages/DrugList.razor @@ -252,7 +252,7 @@ $"ɾȷ", new Dictionary() { { "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(); diff --git a/MasaBlazorApp3/Pages/FridgeSetting.razor b/MasaBlazorApp3/Pages/FridgeSetting.razor new file mode 100644 index 0000000..da60a45 --- /dev/null +++ b/MasaBlazorApp3/Pages/FridgeSetting.razor @@ -0,0 +1,119 @@ +@page "/manage/setting/Fridge" +@using MasaBlazorApp3.Util +@using Newtonsoft.Json.Linq +@using log4net +@layout SettingLayout + + + + + 保存设置 + + + + + + + + + 冰箱温度区间 + + + + 冰箱状态 + fridgeStateValue = args)> + + + + + + + + 报警状态 + + + + + + + + + + + + + +@inject Microsoft.Extensions.Options.IOptions 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($"修改冰箱设置"); + } +} diff --git a/MasaBlazorApp3/Pages/Home.razor b/MasaBlazorApp3/Pages/Home.razor index ea54aaf..8739e3b 100644 --- a/MasaBlazorApp3/Pages/Home.razor +++ b/MasaBlazorApp3/Pages/Home.razor @@ -120,7 +120,7 @@ } jump2Page(5))" Style="height: 100%;width:50%"> - 系统设置 + 系统管理 @if (globalStateService.Operator != null) { @if (!globalStateService.Operator.role.permissionIds.Any(id => id - 50 > 0 && id - 50 < 10)) diff --git a/MasaBlazorApp3/Pages/InitPage.razor b/MasaBlazorApp3/Pages/InitPage.razor index b02ee23..b422044 100644 --- a/MasaBlazorApp3/Pages/InitPage.razor +++ b/MasaBlazorApp3/Pages/InitPage.razor @@ -20,6 +20,7 @@ @inject PortUtil PortUtil; @inject FingerprintUtil FingerprintUtil; @inject GlobalStateService globalStateService; + @inject IOptions 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(); } diff --git a/MasaBlazorApp3/Pages/LoginSetting.razor b/MasaBlazorApp3/Pages/LoginSetting.razor new file mode 100644 index 0000000..0605af1 --- /dev/null +++ b/MasaBlazorApp3/Pages/LoginSetting.razor @@ -0,0 +1,74 @@ +@page "/manage/setting/login" +@page "/manage/setting" +@using Newtonsoft.Json.Linq +@using log4net +@layout SettingLayout + + + + + 保存设置 + + + + + + + + 登录模式 + loginValue = args)> + + + + + + + @* + 优先登录 + preValue = args)> + + + + + + *@ + + + + + +@inject Microsoft.Extensions.Options.IOptions setting; +@inject Microsoft.Extensions.Options.IOptions 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($"修改用户登录设置"); + } +} diff --git a/MasaBlazorApp3/Pages/PlanManagement.razor b/MasaBlazorApp3/Pages/PlanManagement.razor new file mode 100644 index 0000000..e9505ed --- /dev/null +++ b/MasaBlazorApp3/Pages/PlanManagement.razor @@ -0,0 +1,431 @@ +@page "/Box/Plan" + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @* + + + + *@ + + + + @(SelectedPlan.FirstOrDefault()?._PlanDetails.IndexOf(data) + 1) + + + + + @(data._DrugInfo?.DrugName) + @(data._DrugInfo?.DrugSpec) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@code { + @inject IPlanDao planDao; + @inject DialogService dialogService; + @inject NotificationService _message + + RadzenDataGrid grid; + RadzenDataGrid PlanDetailsGrid; + bool isLoading; + int count; + private IEnumerable? _forecasts; + IList? SelectedPlan { get; set; } = new List(); + List SelectedPlanDetails = new List(); + List 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() { _forecasts.FirstOrDefault() }; + + isLoading = false; + drugInfos = result.Other; + } + // async Task LoadDetailDate(LoadDataArgs args) + // { + // // SelectedPlan = new List() { 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 + { + 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( + $"删除确认", + new Dictionary() { { "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( + $"确认删除", + new Dictionary() { { "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); + } +} \ No newline at end of file diff --git a/MasaBlazorApp3/Pages/StockBinding.razor b/MasaBlazorApp3/Pages/StockBinding.razor index 918cb8b..a05d8c7 100644 --- a/MasaBlazorApp3/Pages/StockBinding.razor +++ b/MasaBlazorApp3/Pages/StockBinding.razor @@ -144,9 +144,9 @@ - - - + + + } else @@ -161,8 +161,8 @@ { - - + + } diff --git a/MasaBlazorApp3/Pages/StockCheck.razor b/MasaBlazorApp3/Pages/StockCheck.razor index 4d09030..6fe5d6d 100644 --- a/MasaBlazorApp3/Pages/StockCheck.razor +++ b/MasaBlazorApp3/Pages/StockCheck.razor @@ -95,14 +95,15 @@ - @if (cs.BoardType == 2) + @if (cs.BoardType.ToString().Contains("2") || cs.BoardType.ToString().Contains("3")) { @cs.CheckQuantity } else { - - + + + } @@ -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($"盘点完成"); } diff --git a/MasaBlazorApp3/Pages/StockList.razor b/MasaBlazorApp3/Pages/StockList.razor index 300a7ca..6d78dae 100644 --- a/MasaBlazorApp3/Pages/StockList.razor +++ b/MasaBlazorApp3/Pages/StockList.razor @@ -1,24 +1,37 @@ @page "/stock/list" + IsLoading="@isLoading" + RowRender="@RowRender" + EmptyText="" + Data="@_forecasts" + AllowColumnResize="true" AllowAlternatingRows="false" + SelectionMode="DataGridSelectionMode.Single" + ExpandMode="DataGridExpandMode.Multiple"> - - + + @@ -29,16 +42,44 @@ @s.DrawerNo - @s.ColNo - + + - + + + @{ + DateTime dateTime; + bool success = DateTime.TryParse(s.EffDate, out dateTime); + if(success&&dateTime<=DateTime.Now.AddMonths(3)) + { + @s.EffDateЧҩƷ + } + else + { + @s.EffDate + } + } + + - + + + @if(s.StockQuantity<10) + { + @s.StockQuantityԤ + } + else + { + @s.StockQuantity + } + + + @@ -53,7 +94,7 @@ DateTime start; DateTime end; - + protected override async Task OnInitializedAsync() { @@ -83,7 +124,15 @@ + async void StockExport() + { + } + + async void AccountBookExport() + { + + } diff --git a/MasaBlazorApp3/Pojo/AccountBookG2.cs b/MasaBlazorApp3/Pojo/AccountBookG2.cs new file mode 100644 index 0000000..f087368 --- /dev/null +++ b/MasaBlazorApp3/Pojo/AccountBookG2.cs @@ -0,0 +1,153 @@ +using LinqToDB.Mapping; +namespace MasaBlazorApp3.Pojo +{ + [Table("account_book_g2")] + public class AccountBookG2 + { + /// + /// 主键 + /// + [Column("id")] + public int Id { get; set; } + + /// + /// 药品id + /// + [Column("drug_id")] + public string DrugId { get; set; } + + /// + /// 1领入2发出3日结4总结5转结 + /// + [Column("type")] + public int Type { get; set; } + + /// + /// 科室 + /// + [Column("department")] + public string Department { get; set; } + + /// + /// 设备内记录凭证 + /// + [Column("invoice_no")] + public string InvoiceNo { get; set; } + + /// + /// 处方号或凭证号 + /// + [Column("order_no")] + public string OrderNo { get; set; } + + /// + /// 批次 + /// + [Column("manu_no")] + public string ManuNo { get; set; } + + /// + /// 效期 + /// + [Column("eff_date")] + public string EffDate { get; set; } + + /// + /// 上日结存 + /// + [Column("yesterday_quantity")] + public int YQuantity { get; set; } + + /// + /// 收入 + /// + [Column("add_quantity")] + public int AddQuantity { get; set; } + + /// + /// 发出 + /// + [Column("out_quantity")] + public int OutQuantity { get; set; } + + /// + /// 批次结存 + /// + [Column("manu_stock")] + public int ManuStock { get; set; } + + /// + /// 总结存 + /// + [Column("total_stock")] + public int TotalStock { get; set; } + + + /// + /// 发药领药人id + /// + [Column("user_id1")] + public int? UserId1 { get; set; } + + /// + /// 复核人id + /// + [Column("user_id2")] + public int? UserId2 { get; set; } + + /// + /// 设备id + /// + [Column("machine_id")] + public string MachineId { get; set; } + + /// + /// 日期 + /// + [Column("create_date")] + public string CreateDate { get; set; } + + /// + /// 插入更新时间(当前时间戳) + /// + [Column("create_time")] + public DateTime CreateTime { get; set; } + + /// + /// 药品名称 + /// + [Column(IsColumn = false)] + public string DrugName { get; set; } + + /// + /// 规格 + /// + [Column(IsColumn = false)] + public string DrugSpec { get; set; } + + /// + /// 厂家 + /// + [Column(IsColumn = false)] + public string Manufactory { get; set; } + + /// + /// 发药人 + /// + [Column(IsColumn = false)] + public string OperatorName { get; set; } + + /// + /// 复核人 + /// + [Column(IsColumn = false)] + public string ReviewerName { get; set; } + + /// + /// 手术间 + /// + [Column("shoushuJian")] + public string ShoushuJian { get; set; } + } + +} diff --git a/MasaBlazorApp3/Pojo/ChannelList.cs b/MasaBlazorApp3/Pojo/ChannelList.cs index 4c21caf..0352e52 100644 --- a/MasaBlazorApp3/Pojo/ChannelList.cs +++ b/MasaBlazorApp3/Pojo/ChannelList.cs @@ -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; } } } diff --git a/MasaBlazorApp3/Pojo/ChannelStock.cs b/MasaBlazorApp3/Pojo/ChannelStock.cs index f54a161..68cb305 100644 --- a/MasaBlazorApp3/Pojo/ChannelStock.cs +++ b/MasaBlazorApp3/Pojo/ChannelStock.cs @@ -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; } - + /// + /// 1物理隔板;2单支计数;3管控药盒;4储物箱;5智能显示;6称重计数;63称重计数药盒;653称重计数药盒智能显示; + /// [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; } } } diff --git a/MasaBlazorApp3/Pojo/Config/PortConfig.cs b/MasaBlazorApp3/Pojo/Config/PortConfig.cs index b7089a3..b25ee14 100644 --- a/MasaBlazorApp3/Pojo/Config/PortConfig.cs +++ b/MasaBlazorApp3/Pojo/Config/PortConfig.cs @@ -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; } } } diff --git a/MasaBlazorApp3/Pojo/Config/SettingConfig.cs b/MasaBlazorApp3/Pojo/Config/SettingConfig.cs index d945d95..777f269 100644 --- a/MasaBlazorApp3/Pojo/Config/SettingConfig.cs +++ b/MasaBlazorApp3/Pojo/Config/SettingConfig.cs @@ -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; } } } diff --git a/MasaBlazorApp3/Pojo/Config/fridgeConfig.cs b/MasaBlazorApp3/Pojo/Config/fridgeConfig.cs new file mode 100644 index 0000000..60cc004 --- /dev/null +++ b/MasaBlazorApp3/Pojo/Config/fridgeConfig.cs @@ -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; } + } +} diff --git a/MasaBlazorApp3/Pojo/DrugBase.cs b/MasaBlazorApp3/Pojo/DrugBase.cs new file mode 100644 index 0000000..6b8b6b5 --- /dev/null +++ b/MasaBlazorApp3/Pojo/DrugBase.cs @@ -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 +{ + /// + /// 药品基数 + /// + [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; } + } +} diff --git a/MasaBlazorApp3/Pojo/HkcChangeShifts.cs b/MasaBlazorApp3/Pojo/HkcChangeShifts.cs new file mode 100644 index 0000000..796edcd --- /dev/null +++ b/MasaBlazorApp3/Pojo/HkcChangeShifts.cs @@ -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; } + } +} diff --git a/MasaBlazorApp3/Pojo/OrderInfo.cs b/MasaBlazorApp3/Pojo/OrderInfo.cs index 6a2e9b6..f9f65fc 100644 --- a/MasaBlazorApp3/Pojo/OrderInfo.cs +++ b/MasaBlazorApp3/Pojo/OrderInfo.cs @@ -153,7 +153,15 @@ 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(); + + /// + /// 是否选中 + /// + [Column(IsColumn =false)] + public bool ItemIsChecked { get; set; } + } } \ No newline at end of file diff --git a/MasaBlazorApp3/Pojo/Plan.cs b/MasaBlazorApp3/Pojo/Plan.cs new file mode 100644 index 0000000..67b82c1 --- /dev/null +++ b/MasaBlazorApp3/Pojo/Plan.cs @@ -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 { 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; } + } +} diff --git a/MasaBlazorApp3/Pojo/PlanDetails.cs b/MasaBlazorApp3/Pojo/PlanDetails.cs new file mode 100644 index 0000000..e9ec3ac --- /dev/null +++ b/MasaBlazorApp3/Pojo/PlanDetails.cs @@ -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; } + } +} diff --git a/MasaBlazorApp3/Pojo/Premission.cs b/MasaBlazorApp3/Pojo/Premission.cs index 3f47a1e..fb9d6fd 100644 --- a/MasaBlazorApp3/Pojo/Premission.cs +++ b/MasaBlazorApp3/Pojo/Premission.cs @@ -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; + } } } diff --git a/MasaBlazorApp3/Pojo/SettingManu.cs b/MasaBlazorApp3/Pojo/SettingManu.cs new file mode 100644 index 0000000..6eb0a1a --- /dev/null +++ b/MasaBlazorApp3/Pojo/SettingManu.cs @@ -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 Children { get; set; } = new(); + } +} diff --git a/MasaBlazorApp3/Pojo/Vo/BoxTakeVo.cs b/MasaBlazorApp3/Pojo/Vo/BoxTakeVo.cs new file mode 100644 index 0000000..48570d8 --- /dev/null +++ b/MasaBlazorApp3/Pojo/Vo/BoxTakeVo.cs @@ -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; + + } +} diff --git a/MasaBlazorApp3/Port/PortUtil.cs b/MasaBlazorApp3/Port/PortUtil.cs index 1b0a70b..110971f 100644 --- a/MasaBlazorApp3/Port/PortUtil.cs +++ b/MasaBlazorApp3/Port/PortUtil.cs @@ -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 冰箱 + /// + /// 冰箱使能 + /// + /// + 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}"); + } + } + /// + /// 冰箱失能 + /// + /// + 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}"); + } + } + /// + /// 冰箱报警使能 + /// + /// + 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}"); + } + + } + + /// + /// 冰箱报警失能 + /// + /// + 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}"); + } + } + /// + /// 冰箱温度设定最小 + /// + /// + 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}"); + } + } + /// + /// 冰箱温度设定最大 + /// + /// + 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}"); + } + } + /// + /// 获取冰箱温度 + /// + /// + public async Task 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; + } + /// + /// 设置冰箱温度 + /// + /// + public async Task 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; + } + /// + /// 冰箱延迟报警 + /// + /// + 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 + } } diff --git a/MasaBlazorApp3/Program.cs b/MasaBlazorApp3/Program.cs index 6cae607..73d4898 100644 --- a/MasaBlazorApp3/Program.cs +++ b/MasaBlazorApp3/Program.cs @@ -47,6 +47,7 @@ internal class Program appBuilder.Services.Configure(config.GetSection("setting")); appBuilder.Services.Configure(config.GetSection("port")); appBuilder.Services.Configure(config.GetSection("drawer")); + appBuilder.Services.Configure(config.GetSection("fridge")); // i18n //appBuilder.Services.AddI18nText(); @@ -62,6 +63,8 @@ internal class Program appBuilder.Services.AddScoped(); appBuilder.Services.AddScoped(); appBuilder.Services.AddScoped(); + appBuilder.Services.AddScoped(); + appBuilder.Services.AddScoped(); //自选取药 appBuilder.Services.AddScoped(); diff --git a/MasaBlazorApp3/Shared/SettingLayout.razor b/MasaBlazorApp3/Shared/SettingLayout.razor new file mode 100644 index 0000000..23ff7d6 --- /dev/null +++ b/MasaBlazorApp3/Shared/SettingLayout.razor @@ -0,0 +1,94 @@ +@inherits LayoutComponentBase +@* @page "/manage/setting" *@ + +@layout MainLayout + + + + + @foreach (var menuItem in menuItems) + { + @if (menuItem.Children.Any()) + { + + @foreach (var child in menuItem.Children) + { + + } + + } + else + { + + } + } + + + + + + @Body + + + + + + +@inject NavigationManager Navigation +@inject ISettingManuDao settingManuDao; +@code { + RadzenPanelMenu panelMenu; + List menuItems = new(); + + protected override async Task OnInitializedAsync() + { + menuItems = await settingManuDao.GetMenuItemsAsync(); + } + // async void jump2Page(string path) + // { + // Navigation.NavigateTo(path); + // //可以在这里添加其他逻辑,例如记录导航历史或更新状态 + // Console.WriteLine($"Navigating to: {path}"); + // } +} diff --git a/MasaBlazorApp3/Util/CRC16MODBUS.cs b/MasaBlazorApp3/Util/CRC16MODBUS.cs new file mode 100644 index 0000000..a695875 --- /dev/null +++ b/MasaBlazorApp3/Util/CRC16MODBUS.cs @@ -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; + } + } +} diff --git a/MasaBlazorApp3/appsettings.json b/MasaBlazorApp3/appsettings.json index 42fd59a..fdbf1d2 100644 --- a/MasaBlazorApp3/appsettings.json +++ b/MasaBlazorApp3/appsettings.json @@ -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 } } \ No newline at end of file
Sorry, there's nothing at this address.
抱歉,找不到此页面。
ЧҩƷ
Ԥ