@using MasaBlazorApp3.Pojo.Config @using MasaBlazorApp3.Util @using MasaBlazorApp3.Pojo.Vo; @using Microsoft.Extensions.Options @using log4net;
@* *@
@* *@ @if (status < 2) { } @if (status == 2) { } @if (status <= 2) { }
@code { @inject Radzen.DialogService dialogService; @inject IOptions setting; @inject PortUtil PortUtil; @inject NotificationService _message; @inject IOrderInfoDao orderInfoDao; [Parameter] public IList csList { get; set; } List orderDetailList = new(); ChannelStock listBoxSelectedcsList = new(); private readonly ILog logger = LogManager.GetLogger(typeof(OrderDetailDialog)); int status; List data = new(); //计数取药数量 int[] WeightFinnalQuantity { get; set; } = new int[] { 0, 0, 0, 0, 0, 0, 0, 0, 0 }; // //取药数量小于库存 // tempData.Add(new OrderTakeVo() // { // Drug = detail.Drug, // OrderDetail = detail, // ChannelStock = stock, // StockQuantity = total, // Quantity = Quantity, // }); protected override async Task OnInitializedAsync() { for (int i = 0; i < csList.Count; i++) { if (csList[i].EmptyStock != null && csList[i].EmptyStock.ReturnQuantity > 0) { data.Add(new OrderTakeVo() { ChannelStock = csList[i].EmptyStock }); } if (csList[i].DrawerChanneStockList != null && csList[i].DrawerChanneStockList.Count > 0) { for (int j = 0; j < csList[i].DrawerChanneStockList.Count; j++) { data.Add(new OrderTakeVo() { ChannelStock = csList[i].DrawerChanneStockList[j] }); } } } base.OnInitializedAsync(); } // async Task ConfirmOK() // { // // 关闭弹窗 // dialogService.Close(true); // } async Task OpenDrawer() { this.status = 1; await Task.Delay(200); // 解析需要打开的抽屉列表 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; var drawerType = orderTakeVo.ChannelStock.DrawerType; 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.speechSynthesizer.SpeakAsyncCancelAll(); if (drawerType==1) { PortUtil.SpeakAsync($"{drawerNo}号抽屉已经打开,请,环药"); } else { PortUtil.SpeakAsync($"{drawerNo}号抽屉已经打开,请,环空瓶"); } orderTakeVo.Status = 1; next(); } else { _message.Notify( new NotificationMessage { Severity = NotificationSeverity.Error, Summary = "提示", Detail = $"抽屉【{drawerNo}】打开失败,请检测硬件", Duration = 4000 } ); logger.Info($"抽屉打开失败"); 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; if (options._data == drawerNos.Count - 1) { 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("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($"处方取药发生错误,{e.Message}"); _message.Notify( new NotificationMessage { Severity = NotificationSeverity.Error, Summary = "提示", Detail = $"发生错误,{e.Message}", Duration = 4000 } ); if (setting.Value.single.Contains(drawerNo)) { } 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]; } void Cancel() { RestData(); // 关闭弹窗 dialogService.Close(false); } async Task TakeFinish() { // 保存账册、操作记录 bool bResult = await orderInfoDao.CheckOrderInfoByChannelStock(csList.ToList(), null); if (bResult) { _message.Notify( new NotificationMessage { Severity = NotificationSeverity.Success, Summary = "提示", Detail = $"处方已核对完成", Duration = 4000 } ); // 关闭弹窗 dialogService.Close(true); } else { _message.Notify( new NotificationMessage { Severity = NotificationSeverity.Error, Summary = "提示", Detail = $"处方核对失败", Duration = 4000 } ); } //重置状态 this.RestData(); } }