@page "/selfDetail/{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)
{
@context.ChannelStock.DrawerNo - @context.ChannelStock.ColNo
}
else
{
}
@if (status < 2)
{
}
@if (status == 2)
{
}
@if (status <= 2)
{
}
@code {
@inject Radzen.DialogService dialogService;
@inject NotificationService _message
@inject PortUtil PortUtil;
@inject ISelfTakeDao selfTakeDao;
@inject IOptions setting;
private readonly ILog logger = LogManager.GetLogger(typeof(OrderDetailDialog));
int status;
[Parameter] public OrderInfo order { get; set; }
[Parameter] public List orderDetails{ get; set; }
private bool CanTakeDrug = true;
public List data { get; set; }
protected override async Task OnInitializedAsync()
{
data = await selfTakeDao.getTakeInfoByOrderNo(orderDetails);
// 如果有【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.Operate = true;
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;
}
});
PortUtil.Operate = false;
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 selfTakeDao.OrderTakeFinish(data,order);
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();
}
}