@page "/orderDetail/{order}" @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) { } else { } @if (status < 2) { } @if (status == 2) { } @if (status <= 2) { } @code { @inject Radzen.DialogService dialogService; @inject IOrderInfoDao orderInfoDao; @inject IChannelListDao channelListDao; @inject IOptions setting; @inject NotificationService _message @inject PortUtil PortUtil; private readonly ILog logger = LogManager.GetLogger(typeof(OrderDetailDialog)); int status; [Parameter] public OrderInfo order { get; set; } private bool CanTakeDrug = true; public List data { get; set; } protected override async Task OnInitializedAsync() { data = await orderInfoDao.getTakeInfoByOrderNo(order.OrderNo); // 如果有【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()); } var b = await PortUtil.OpenDrawerStatus(drawerNo); if (b) { 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.SpeakAsync($"取药完成,请,点击完成按钮进行确认"); this.status = 2; stop(); } else { options._data += 1; next(); } } else { if (setting.Value.single.Contains(drawerNo)) { 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)}】"); data.ForEach(cl => { if (cl.ChannelStock.DrawerNo == drawerNo) { logger.Info($"单支抽屉【{drawerNo}】,应取药品数量【{orderTakeVo.Quantity}】,现实取数量【{orderTakeVo.BeforeQuantity[cl.ChannelStock.ColNo - 1] - orderTakeVo.AfterQuantity[cl.ChannelStock.ColNo - 1]}】"); } }); } next(); // continue iteration } } } } catch (Exception e) { RestData(); logger.Info($"处方取药发生错误,{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() { this.status = 0; } async Task TakeFinish() { // 保存账册、操作记录 var b = await orderInfoDao.OrderTakeFinish(data); if (!b) { _message.Notify(new NotificationMessage { Severity = NotificationSeverity.Error, Summary = "提示", Detail = $"数据保存失败", Duration = 4000 }); logger.Error($"处方取药保存数据库失败,数据{JsonConvert.SerializeObject(data)}"); // 关闭弹窗 dialogService.Close(false); } else { // for (int i = 0; i < data.Count; i++) // { // // 判断是否为标签抽屉 // if (setting.Value.label.Contains(data[i].ChannelStock.DrawerNo)) // { // //写标签数量 // await PortUtil.WriteQuantityMethod(data[i].Quantity + data[i].GetQuantity, data[i].ChannelStock.DrawerNo, data[i].ChannelStock.ColNo); // } // } // 关闭弹窗 dialogService.Close(true); } //重置状态 this.RestData(); } }