交接柜补药可选择添加的库位与批次填写数量
This commit is contained in:
parent
32087e3177
commit
098b7776e6
File diff suppressed because it is too large
Load Diff
|
|
@ -0,0 +1,380 @@
|
|||
@page "/Box/BoxAddDetail"
|
||||
@using MasaBlazorApp3.Pojo.Config;
|
||||
@using MasaBlazorApp3.Pojo.Vo;
|
||||
@using MasaBlazorApp3.Util;
|
||||
@using Microsoft.Extensions.Options;
|
||||
@using Newtonsoft.Json;
|
||||
@using log4net;
|
||||
|
||||
<RadzenStack Gap="1rem" Orientation="Orientation.Vertical" Style="height: 100%;">
|
||||
<RadzenStack>
|
||||
@if (CanTakeDrug)
|
||||
{
|
||||
<RadzenDataGrid Data="@data" AllowAlternatingRows="false" ExpandMode="DataGridExpandMode.Multiple">
|
||||
<Template Context="manu">
|
||||
<RadzenDataGrid @ref="grid" Data="@manu.ChannelStock.DrawerChanneStockList" CellClick="@((DataGridCellMouseEventArgs<ChannelStock> args) => OnCellClick(args))" EmptyText="无数据">
|
||||
<Columns>
|
||||
<RadzenDataGridColumn Title="库位">
|
||||
<Template>
|
||||
@context.DrawerNo - @context.ColNo
|
||||
</Template>
|
||||
</RadzenDataGridColumn>
|
||||
<RadzenDataGridColumn Property="manu.ManuNo" Title="批次" />
|
||||
<RadzenDataGridColumn Property="manu.EffDate" Title="效期" />
|
||||
<RadzenDataGridColumn Property="manu.Quantity" Title="库存" />
|
||||
<RadzenDataGridColumn Property="manu.TakeQuantity" Title="取药数量">
|
||||
@* <Template>
|
||||
@manu.Quantity
|
||||
</Template> *@
|
||||
<EditTemplate Context="cs">
|
||||
<RadzenNumeric Style="display: block" Name="takeQuantity" @bind-Value=@cs.TakeQuantity>
|
||||
<RadzenNumericRangeValidator Style="position: absolute;z-index: 9999;" Min="1" Max="100" Text="请填写正确的取出数量" Component="takeQuantity" />
|
||||
</RadzenNumeric>
|
||||
</EditTemplate>
|
||||
</RadzenDataGridColumn>
|
||||
</Columns>
|
||||
</RadzenDataGrid>
|
||||
</Template>
|
||||
<Columns>
|
||||
|
||||
<RadzenDataGridColumn Property="Drug.DrugName" Title="药品" />
|
||||
<RadzenDataGridColumn Property="Drug.DrugSpec" Title="规格" />
|
||||
</Columns>
|
||||
</RadzenDataGrid>
|
||||
}
|
||||
else
|
||||
{
|
||||
<RadzenDataGrid Data="@data" AllowAlternatingRows="false">
|
||||
<Columns>
|
||||
<RadzenDataGridColumn Property="Drug.DrugName" Title="药品" />
|
||||
<RadzenDataGridColumn Property="Drug.DrugSpec" Title="规格" />
|
||||
<RadzenDataGridColumn Property="Quantity" Title="取药数量" />
|
||||
<RadzenDataGridColumn Property="StockQuantity" Title="库存" />
|
||||
</Columns>
|
||||
</RadzenDataGrid>
|
||||
}
|
||||
|
||||
|
||||
|
||||
</RadzenStack>
|
||||
<RadzenStack Orientation="Orientation.Horizontal" JustifyContent="JustifyContent.Center" Gap="0.5rem">
|
||||
@if (status < 2)
|
||||
{
|
||||
<RadzenButton Click="@OpenDrawer" Disabled="!CanTakeDrug" IsBusy="status > 0" BusyText="取药中。。。" ButtonStyle="ButtonStyle.Warning" Variant="Variant.Flat" Text="取药" Style="width: 120px" />
|
||||
}
|
||||
@if (status == 2)
|
||||
{
|
||||
<RadzenButton Click="@TakeFinish" ButtonStyle="ButtonStyle.Success" Variant="Variant.Flat" Text="完成" Style="width: 120px" />
|
||||
}
|
||||
@if (status <= 2)
|
||||
{
|
||||
<RadzenButton Click="@Cancel" Variant="Variant.Flat" Text="取消" Style="width: 120px" />
|
||||
}
|
||||
</RadzenStack>
|
||||
</RadzenStack>
|
||||
|
||||
@code {
|
||||
@inject Radzen.DialogService dialogService;
|
||||
@inject IChannelListDao channelListDao;
|
||||
@inject IOptions<DrawerConfig> setting;
|
||||
@inject NotificationService _message
|
||||
@inject PortUtil PortUtil;
|
||||
private readonly ILog logger = LogManager.GetLogger(typeof(OrderDetailDialog));
|
||||
|
||||
int status;
|
||||
|
||||
[Parameter] public ChannelList boxChannelList { get; set; }
|
||||
private bool CanTakeDrug = true;
|
||||
|
||||
public List<BoxTakeVo> data { get; set; }
|
||||
//称重取药数量
|
||||
int[] WeightFinnalQuantity { get; set; } = new int[] { 0, 0, 0, 0, 0, 0, 0, 0, 0 };
|
||||
|
||||
//开抽屉前操作标识
|
||||
List<string> DrawerNoColNoList = new List<string>();
|
||||
|
||||
protected override async Task OnInitializedAsync()
|
||||
{
|
||||
data = await channelListDao.getTakeInfoByBox(boxChannelList);
|
||||
// 如果有【stockQuantity】字段说明有药品库存不足
|
||||
if (data.Any(it => it.ChannelStock == null))
|
||||
{
|
||||
CanTakeDrug = false;
|
||||
}
|
||||
base.OnInitializedAsync();
|
||||
}
|
||||
|
||||
async Task OpenDrawer()
|
||||
{
|
||||
this.status = 1;
|
||||
PortUtil.PowerOn();
|
||||
await Task.Delay(200);
|
||||
// 解析需要打开的抽屉列表
|
||||
List<BoxTakeVo> drawerNos = this.data.GroupBy(it => it.ChannelStock.DrawerNo).Select(it => it.First()).ToList();
|
||||
// for (int i = 0; i < data.Count; i++)
|
||||
// {
|
||||
// if (data[i].ChannelStock != null && data[i].ChannelStock.DrawerChanneStockList != null && data[i].ChannelStock.DrawerChanneStockList.Count > 0)
|
||||
// {
|
||||
// for (int j = 0; j < data[i].ChannelStock.DrawerChanneStockList.Count; j++)
|
||||
// {
|
||||
// if (data[i].ChannelStock.DrawerChanneStockList[j].TakeQuantity <= 0)
|
||||
// {
|
||||
// continue;
|
||||
// }
|
||||
// BoxTakeVo boxTakeVo = new BoxTakeVo() { ChannelStock = data[i].ChannelStock.DrawerChanneStockList[j] };
|
||||
// if (!drawerNos.Contains(boxTakeVo))
|
||||
// {
|
||||
// // if (!(drawerNos.Where(dn => dn.ChannelStock.DrawerNo == boxTakeVo.ChannelStock.DrawerNo).Count() > 0))
|
||||
// // {
|
||||
// drawerNos.Add(boxTakeVo);
|
||||
// // }
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
|
||||
// 根据抽屉类型来决定打开前是否需要查询数量
|
||||
var promiseUtil = new PromiseUtil<int>();
|
||||
|
||||
await promiseUtil.taskAsyncLoop(500, 0, async (options, next, stop) =>
|
||||
{
|
||||
var orderTakeVo = drawerNos[options._data];
|
||||
var drawerNo = orderTakeVo.ChannelStock.DrawerNo;
|
||||
try
|
||||
{
|
||||
if (this.status == 0)
|
||||
{
|
||||
stop();
|
||||
}
|
||||
// 开启抽屉
|
||||
else if (this.status == 1)
|
||||
{
|
||||
if (orderTakeVo.Status == 0)
|
||||
{
|
||||
// 判断是否为单支抽屉
|
||||
if (setting.Value.single.Contains(drawerNo))
|
||||
{
|
||||
byte[] quantity = await PortUtil.CheckQuantityByDrawer(drawerNo);
|
||||
orderTakeVo.BeforeQuantity = quantity.Select(it => Convert.ToInt32(it)).ToArray().Skip(3).Take(9).ToArray();
|
||||
logger.Info($"单支抽屉,开抽屉前检测数量【{string.Join(",", orderTakeVo.BeforeQuantity)}】");
|
||||
var drawerChanneStockList = data.Where(ot => ot.ChannelStock.DrawerNo == drawerNo).Select(ot => ot.ChannelStock.DrawerChanneStockList).ToList();
|
||||
await PortUtil.HasLightOnByCol(drawerNo, drawerChanneStockList[0].Where(i => i.TakeQuantity > 0).ToList().Select(i => i.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.PowerOff();
|
||||
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 (data.Any(it => it.ChannelStock.BoardType.ToString().Contains("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") && data[i].ChannelStock.DrawerNo == 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)}】");
|
||||
// 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}应取数量【{data[i].Quantity}】,实际取出数量【{WeightFinnalQuantity[data[i].ChannelStock.ColNo - 1]}】";
|
||||
// }
|
||||
for (int j = 0; j < data[i].ChannelStock.DrawerChanneStockList.Count; j++)
|
||||
{
|
||||
WeightFinnalQuantity[data[i].ChannelStock.DrawerChanneStockList[j].ColNo - 1] = orderTakeVo.BeforeQuantity[data[i].ChannelStock.DrawerChanneStockList[j].ColNo - 1] - orderTakeVo.AfterQuantity[data[i].ChannelStock.DrawerChanneStockList[j].ColNo - 1];
|
||||
if (data[i].ChannelStock.DrawerChanneStockList[j].TakeQuantity != WeightFinnalQuantity[data[i].ChannelStock.DrawerChanneStockList[j].ColNo - 1])
|
||||
{
|
||||
alertMessage += $"{data[i].Drug.DrugName}应取数量【{data[i].ChannelStock.DrawerChanneStockList[j].TakeQuantity}】,实际取出数量【{WeightFinnalQuantity[data[i].ChannelStock.ColNo - 1]}】";
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//有单支抽屉则广播灭灯
|
||||
PortUtil.PowerOff();
|
||||
// if (!string.IsNullOrEmpty(alertMessage))
|
||||
// {
|
||||
// //弹出确认对话框
|
||||
alertMessage += "应取数与实际取出数不一致确认要保存吗?";
|
||||
// //弹出确认提示框
|
||||
// var confirm = await dialogService.OpenAsync<ConfirmDialog>(
|
||||
// $"保存确认",
|
||||
// new Dictionary<string, object>() { { "confirmInfo", alertMessage } },
|
||||
// new DialogOptions() { Width = "45vw", Resizable = true, Draggable = true, ShowClose = false });
|
||||
logger.Info(alertMessage);
|
||||
// if (!confirm)
|
||||
// {
|
||||
// RestData();
|
||||
// logger.Info("取消保存");
|
||||
// // 关闭弹窗
|
||||
// dialogService.Close(false);
|
||||
// }
|
||||
// }
|
||||
stop();
|
||||
}
|
||||
else
|
||||
{
|
||||
options._data += 1;
|
||||
next();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
next(); // continue iteration
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
RestData();
|
||||
logger.Info($"{boxChannelList.DrawerNo}药盒取药发生错误,{e.Message}");
|
||||
_message.Notify(
|
||||
new NotificationMessage { Severity = NotificationSeverity.Error, Summary = "提示", Detail = $"发生错误,{e.Message}", Duration = 4000 }
|
||||
);
|
||||
if (setting.Value.single.Contains(drawerNo))
|
||||
{
|
||||
PortUtil.PowerOff();
|
||||
}
|
||||
stop();
|
||||
}
|
||||
});
|
||||
PortUtil.PowerOff();
|
||||
}
|
||||
|
||||
void RestData()
|
||||
{
|
||||
PortUtil.PowerOff();
|
||||
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, boxChannelList);
|
||||
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();
|
||||
}
|
||||
|
||||
RadzenDataGrid<ChannelStock> grid;
|
||||
void OnCellClick(DataGridCellMouseEventArgs<ChannelStock> args)
|
||||
{
|
||||
this.grid.EditRow(args.Data);
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue