@page "/stock/check" @using MasaBlazorApp3.Pojo.Config @using MasaBlazorApp3.Util @using Microsoft.Extensions.Options @using Newtonsoft.Json @using log4net @* *@ @foreach (int i in DrawerNos) { } @* *@ @if (status < 3) { } @if (status == 3) { } @if (status > 0 && status <= 3) { } @channel.Drug?.DrugName @channel.Drug?.DrugSpec @channel.drugManuNo?.ManuNo @channel.drugManuNo?.EffDate @if (channel.Quantity == 0 && !String.IsNullOrEmpty(channel.DrugId)) { @((context as DrugManuNo)?.ManuNo) @((context as DrugManuNo)?.EffDate) @((context as DrugManuNo)?.ManuNo) @((context as DrugManuNo)?.EffDate) } else { @channel.drugManuNo?.ManuNo @channel.drugManuNo?.EffDate } @if (cs.BoardType == 2) { @cs.CheckQuantity } else { } @code { @inject IChannelListDao channelListDao; @inject NavigationManager na; @inject PortUtil PortUtil; @inject NotificationService _message @inject IOptions setting; int status = 0; int drawerNo = 1; RadzenDataGrid grid; private List? channels; bool isLoading; int count; int[] DrawerNos = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 }; int[] BeforeQuantity = new int[9]; int[] AfterQuantity = new int[9]; private readonly ILog logger = LogManager.GetLogger(typeof(DrawerAdd)); async Task LoadData(LoadDataArgs args) { isLoading = true; var result = await channelListDao.GetChannelStockByDrawerNoWithDrawers(drawerNo); // var result = await channelListDao.GetChannelStockByDrawerNo(drawerNo); // Update the Data property DrawerNos = result.DrawerArray; // for (int i = 0; i < result.ChannelStocks.Count; i++) // { // result.ChannelStocks[i].CheckQuantity = result.ChannelStocks[i].Quantity; // } result.ChannelStocks.ForEach(cs => cs.CheckQuantity = cs.Quantity); channels = result.ChannelStocks; // Update the count count = result.ChannelStocks.Count; isLoading = false; } async Task OpenDrawer() { this.status = 1; // 根据抽屉类型来决定打开前是否需要查询数量 var promiseUtil = new PromiseUtil(); await promiseUtil.taskAsyncLoop(500, null, async (data, next, stop) => { try { if (this.status == 0) { stop(); } // 开启抽屉 else if (this.status == 1) { // 判断是否为单支抽屉 if (setting.Value.single.Contains(this.drawerNo)) { byte[] quantity = await PortUtil.CheckQuantityByDrawer(this.drawerNo); BeforeQuantity = quantity.Select(it => Convert.ToInt32(it)).ToArray().Skip(3).Take(9).ToArray(); logger.Info($"单支抽屉,开抽屉前检测数量【{string.Join(",", BeforeQuantity)}】"); } var b = await PortUtil.OpenDrawerStatus(this.drawerNo); if (b) { PortUtil.SpeakAsync($"{drawerNo}号抽屉已经打开,请,盘点"); this.status = 2; next(); } else { _message.Notify( new NotificationMessage { Severity = NotificationSeverity.Error, Summary = "提示", Detail = $"抽屉【{drawerNo}】打开失败,请检测硬件", Duration = 4000 } ); logger.Info($"抽屉打开失败"); RestData(); stop(); } } // 检测状态 else if (this.status == 2) { // 查询抽屉是否为关闭状态 var b = await PortUtil.CheckDrawerStatus2(drawerNo); // 关闭则改变状态并终止循环 if (b) { PortUtil.SpeakAsync($"盘点完成,请,核对,或,录入,正确的,盘点数量"); this.status = 3; stop(); } else { if (setting.Value.single.Contains(this.drawerNo)) { byte[] quantity = await PortUtil.CheckQuantityByDrawer(this.drawerNo); AfterQuantity = quantity.Select(it => Convert.ToInt32(it)).ToArray().Skip(3).Take(9).ToArray(); logger.Info($"单支抽屉,抽屉未关检测数量【{string.Join(",", AfterQuantity)}】"); channels.ForEach(cl => { cl.CheckQuantity = this.AfterQuantity[cl.ColNo - 1];// - this.BeforeQuantity[cl.ColNo - 1]; }); } next(); // continue iteration } } } catch (Exception e) { logger.Info($"抽屉盘点发生错误,{e.Message}"); _message.Notify( new NotificationMessage { Severity = NotificationSeverity.Error, Summary = "提示", Detail = $"发生错误,{e.Message}", Duration = 4000 } ); if (setting.Value.single.Contains(this.drawerNo)) { PortUtil.AllLightOff(); } RestData(); stop(); } }); } void RestData() { this.status = 0; 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)) { // 保存账册、操作记录 var b = await channelListDao.DrawerCheckFinish(channels.Where(cl => cl.CheckQuantity != cl.Quantity).ToList()); if (!b) { _message.Notify(new NotificationMessage { Severity = NotificationSeverity.Error, Summary = "提示", Detail = $"数据保存失败", Duration = 4000 }); logger.Error($"盘点保存数据库失败,数据{JsonConvert.SerializeObject(channels)}"); } else { _message.Notify(new NotificationMessage { Severity = NotificationSeverity.Info, Summary = "提示", Detail = $"盘点完成", Duration = 4000 }); logger.Error($"盘点完成"); } } //重置状态 this.RestData(); // 重新查询库存 await grid.Reload(); } void Cancel() { this.status = 0; } void SelectDrawer(int drawerNo) { this.drawerNo = drawerNo; grid.Reload(); } void OnCellClick(DataGridCellMouseEventArgs args) { grid.EditRow(args.Data); } private IDisposable? registration; protected override void OnAfterRender(bool firstRender) { if (firstRender) { registration = na.RegisterLocationChangingHandler(OnLocationChanging); } } private ValueTask OnLocationChanging(LocationChangingContext context) { // 操作中不可跳转页面 if (status > 0) { context.PreventNavigation(); //阻止导航 } return ValueTask.CompletedTask; } //在生命周期函数Dispose中,移除订阅的事件,并销毁非托管资源registration=========================================== public void Dispose() { registration?.Dispose(); } }