首次提交,整体修改

This commit is contained in:
maqiao 2025-05-20 11:17:07 +08:00
parent 1a0aced391
commit 4a25695d53
33 changed files with 1985 additions and 593 deletions

View File

@ -0,0 +1,16 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace MasaBlazorApp3.DataAccess
{
public class ChannelStockWidthDrawerInfo<ChannelStock>
{
//抽屉信息(抽屉号,抽屉类型)
public List<Dictionary<int,int>> DrawerInfo { get; set; }
public List<ChannelStock> ChannelStocks { get; set; } = new List<ChannelStock>();
}
}

View File

@ -29,5 +29,7 @@ namespace MasaBlazorApp3.DataAccess.Dao
//盘点 //盘点
public Task<bool> DrawerCheckFinish(List<ChannelStock> Stocks); public Task<bool> DrawerCheckFinish(List<ChannelStock> Stocks);
//抽屉获取库存数据--药品绑定
Task<ChannelStockWithDrawerCount<ChannelStock>> GetChannelStockByBiaoDing(int DrawerNo, int Quantity=0);
} }
} }

View File

@ -19,5 +19,7 @@ namespace MasaBlazorApp3.DataAccess.Dao
bool ResetPassword(int id); bool ResetPassword(int id);
Task<bool> UpdateSign(int id, string sign); Task<bool> UpdateSign(int id, string sign);
bool UpdateUserPassword(User user);
} }
} }

View File

@ -98,11 +98,11 @@ namespace MasaBlazorApp3.DataAccess.Impl
.LoadWith(cs => cs.drugManuNo) .LoadWith(cs => cs.drugManuNo)
.LoadWith(cs => cs.Drug.Manus) .LoadWith(cs => cs.Drug.Manus)
.Where(cs => cs.DrawerNo == DrawerNo) .Where(cs => cs.DrawerNo == DrawerNo)
.Where(cs => cs.DrugId != String.Empty ) .Where(cs => cs.DrugId != String.Empty)
.Where(cs => cs.DrawerType == 1) .Where(cs => cs.DrawerType == 1)
.Where(cs => cs.MachineId == _setting.machineId); .Where(cs => cs.MachineId == _setting.machineId);
if(Quantity > 0) if (Quantity > 0)
{ {
query = query.Where(cs => cs.Quantity > 0); query = query.Where(cs => cs.Quantity > 0);
} }
@ -178,27 +178,60 @@ namespace MasaBlazorApp3.DataAccess.Impl
//var EffDate = !stock.drugManuNo.ManuNo.Equals(stock.ManuNo) ? stock.drugManuNo.EffDate : stock.EffDate; //var EffDate = !stock.drugManuNo.ManuNo.Equals(stock.ManuNo) ? stock.drugManuNo.EffDate : stock.EffDate;
var ManuNo = stock.ManuNo; var ManuNo = stock.ManuNo;
var EffDate = stock.EffDate; var EffDate = stock.EffDate;
// 出入库记录 if (!DateTime.TryParse(stock.EffDate, out DateTime dEffDate))
int mid = _connection.InsertWithInt32Identity(new MachineRecord()
{ {
MachineId = _setting.machineId, //效期转换出错
DrawerNo = stock.DrawerNo, if (stock.ManuNo != null)
ColNo = stock.ColNo, {
DrugId = stock.DrugId, string[] idate= stock.EffDate.Split('/');
ManuNo = ManuNo, foreach (string iS in idate)
EffDate = !String.IsNullOrEmpty(EffDate) ? DateTime.ParseExact(EffDate, "yyyy-MM-dd", System.Globalization.CultureInfo.CurrentCulture) : null, {
OperationTime = DateTime.Now, if (!string.IsNullOrEmpty(iS.Replace(" ", "").Trim()))
Type = type, {
Quantity = type == 1? stock.AddQuantity : stock.TakeQuantity, switch (iS.Replace(" ", "").Trim().Length)
Operator = _globalStateService.Operator.Id, {
Reviewer = _globalStateService.Reviewer?.Id ?? _globalStateService.Operator.Id, case 4:
InvoiceId = InvoiceId EffDate = iS.Replace(" ", "").Trim();
}); break;
case 2:
EffDate += "-" + iS.Replace(" ", "").Trim();
break;
case 1:
EffDate += "-0"+iS.Replace(" ", "").Trim();
break;
}
}
}
}
}
else
{
EffDate=dEffDate.ToString("yyyy-MM-dd");
}
// 出入库记录
int mid = _connection.InsertWithInt32Identity(new MachineRecord()
{
MachineId = _setting.machineId,
DrawerNo = stock.DrawerNo,
ColNo = stock.ColNo,
DrugId = stock.DrugId,
ManuNo = ManuNo,
EffDate = !String.IsNullOrEmpty(EffDate) ? DateTime.ParseExact(EffDate, "yyyy-MM-dd", System.Globalization.CultureInfo.CurrentCulture) : null,
OperationTime = DateTime.Now,
Type = type,
Quantity = type == 1 ? stock.AddQuantity : stock.TakeQuantity,
Operator = _globalStateService.Operator.Id,
Reviewer = _globalStateService.Reviewer?.Id ?? _globalStateService.Operator.Id,
InvoiceId = InvoiceId
});
// 更新库存 // 更新库存
var stockQ = _connection.ChannelStock.Where(cs => cs.Id == stock.Id) var stockQ = _connection.ChannelStock.Where(cs => cs.Id == stock.Id)
.Set(cs => cs.Quantity, type == 1 ? stock.Quantity + stock.AddQuantity : stock.Quantity - stock.TakeQuantity); .Set(cs => cs.Quantity, type == 1 ? stock.Quantity + stock.AddQuantity : stock.Quantity - stock.TakeQuantity);
// 入库时如果库存为0则有可能会修改批次效期进行保存 // 入库时如果库存为0则有可能会修改批次效期进行保存
if(type == 1 && stock.Quantity == 0 && !stock.drugManuNo.ManuNo.Equals(stock.ManuNo)) if (type == 1 && stock.Quantity == 0 && !stock.drugManuNo.ManuNo.Equals(stock.ManuNo))
{ {
stockQ = stockQ.Set(cs => cs.ManuNo, stock.drugManuNo.ManuNo).Set(cs => cs.EffDate, stock.drugManuNo.EffDate.ToString()).Set(cs => cs.Dmnguid, stock.drugManuNo.Id); stockQ = stockQ.Set(cs => cs.ManuNo, stock.drugManuNo.ManuNo).Set(cs => cs.EffDate, stock.drugManuNo.EffDate.ToString()).Set(cs => cs.Dmnguid, stock.drugManuNo.Id);
} }
@ -232,7 +265,8 @@ namespace MasaBlazorApp3.DataAccess.Impl
if (mid > 0 && r > 0 && acid > 0) if (mid > 0 && r > 0 && acid > 0)
{ {
} else }
else
{ {
flag = false; flag = false;
break; break;
@ -248,7 +282,8 @@ namespace MasaBlazorApp3.DataAccess.Impl
} }
return flag; return flag;
} catch (Exception ex) }
catch (Exception ex)
{ {
logger.Error($"抽屉{(type == 1 ? "" : "")}操作完成保存数据库失败,错误:" + ex.Message); logger.Error($"抽屉{(type == 1 ? "" : "")}操作完成保存数据库失败,错误:" + ex.Message);
_connection.RollbackTransaction(); _connection.RollbackTransaction();
@ -263,7 +298,7 @@ namespace MasaBlazorApp3.DataAccess.Impl
public async Task<bool> UnBind(string id) public async Task<bool> UnBind(string id)
{ {
var r = await _connection.ChannelStock var r = await _connection.ChannelStock
.Where(cs => cs.Id == id) .Where(cs => cs.Id == id)
.Set(cs => cs.DrugId, String.Empty) .Set(cs => cs.DrugId, String.Empty)
.Set(cs => cs.Dmnguid, String.Empty) .Set(cs => cs.Dmnguid, String.Empty)
@ -277,18 +312,19 @@ namespace MasaBlazorApp3.DataAccess.Impl
{ {
var q = _connection.ChannelStock var q = _connection.ChannelStock
.Where(cs => cs.Id == Stock.Id) .Where(cs => cs.Id == Stock.Id)
.Set(cs => cs.Dmnguid, Stock.drugManuNo?.Id??String.Empty) .Set(cs => cs.Dmnguid, Stock.drugManuNo?.Id ?? String.Empty)
.Set(cs => cs.EffDate, Stock.drugManuNo?.EffDate.ToString() ?? String.Empty) .Set(cs => cs.EffDate, Stock.drugManuNo?.EffDate.ToString().Substring(0, 10) ?? String.Empty)
.Set(cs => cs.ManuNo, Stock.drugManuNo?.ManuNo ?? String.Empty); .Set(cs => cs.ManuNo, Stock.drugManuNo?.ManuNo ?? String.Empty);
if (Stock.Drug != null && !Stock.Drug.DrugId.Equals(Stock.DrugId)) { if (Stock.Drug != null && !Stock.Drug.DrugId.Equals(Stock.DrugId))
{
q = q.Set(cs => cs.DrugId, Stock.Drug?.DrugId); q = q.Set(cs => cs.DrugId, Stock.Drug?.DrugId);
} }
var r = await q.UpdateAsync(); var r = await q.UpdateAsync();
return r > 0; return r > 0;
} }
public async Task<PageMultiData<ChannelStock,DrugInfo>> GetAllChannelListWithDrug(int DrawerType, string drugName, int? take, int? skip) public async Task<PageMultiData<ChannelStock, DrugInfo>> GetAllChannelListWithDrug(int DrawerType, string drugName, int? take, int? skip)
{ {
var query = _connection.ChannelStock.AsQueryable(); var query = _connection.ChannelStock.AsQueryable();
@ -319,18 +355,18 @@ namespace MasaBlazorApp3.DataAccess.Impl
.Take((int)take) .Take((int)take)
.ToListAsync(); .ToListAsync();
var other= _connection.DrugInfo.AsQueryable(); var other = _connection.DrugInfo.AsQueryable();
List<DrugInfo> drugInfos= await other List<DrugInfo> drugInfos = await other
.LoadWith(di => di.Manus) .LoadWith(di => di.Manus)
.OrderBy((di) => di.DrugId) .OrderBy((di) => di.DrugId)
.ToListAsync(); .ToListAsync();
return new PageMultiData<ChannelStock,DrugInfo>() return new PageMultiData<ChannelStock, DrugInfo>()
{ {
TotalDesserts = pagedData, TotalDesserts = pagedData,
Desserts = list, Desserts = list,
Other= drugInfos Other = drugInfos
}; };
} }
//抽屉加药、取药获取数据 //抽屉加药、取药获取数据
@ -349,11 +385,11 @@ namespace MasaBlazorApp3.DataAccess.Impl
{ {
query = query.Where(cs => cs.Quantity > 0); query = query.Where(cs => cs.Quantity > 0);
} }
int[] ints = _connection.ChannelStock.Where(cs => cs.MachineId == _setting.machineId).GroupBy(cs=>cs.DrawerNo).Select(cs=>cs.Key).ToArray(); int[] ints = _connection.ChannelStock.Where(cs => cs.MachineId == _setting.machineId).GroupBy(cs => cs.DrawerNo).Select(cs => cs.Key).ToArray();
List<ChannelStock> channelStocks= await query List<ChannelStock> channelStocks = await query
.OrderBy((cs) => cs.DrawerNo) .OrderBy((cs) => cs.DrawerNo)
.ThenBy((cs) => cs.ColNo) .ThenBy((cs) => cs.ColNo)
.ToListAsync(); .ToListAsync();
return new ChannelStockWithDrawerCount<ChannelStock>() { DrawerArray = ints, ChannelStocks = channelStocks }; return new ChannelStockWithDrawerCount<ChannelStock>() { DrawerArray = ints, ChannelStocks = channelStocks };
} }
//盘点 //盘点
@ -384,7 +420,7 @@ namespace MasaBlazorApp3.DataAccess.Impl
EffDate = !String.IsNullOrEmpty(EffDate) ? DateTime.ParseExact(EffDate, "yyyy-MM-dd", System.Globalization.CultureInfo.CurrentCulture) : null, EffDate = !String.IsNullOrEmpty(EffDate) ? DateTime.ParseExact(EffDate, "yyyy-MM-dd", System.Globalization.CultureInfo.CurrentCulture) : null,
OperationTime = DateTime.Now, OperationTime = DateTime.Now,
Type = 4, Type = 4,
Quantity =stock.CheckQuantity, Quantity = stock.CheckQuantity,
Operator = _globalStateService.Operator.Id, Operator = _globalStateService.Operator.Id,
Reviewer = _globalStateService.Reviewer?.Id ?? _globalStateService.Operator.Id, Reviewer = _globalStateService.Reviewer?.Id ?? _globalStateService.Operator.Id,
InvoiceId = InvoiceId InvoiceId = InvoiceId
@ -452,5 +488,30 @@ namespace MasaBlazorApp3.DataAccess.Impl
return false; return false;
} }
} }
//抽屉获取库存数据--药品绑定
public async Task<ChannelStockWithDrawerCount<ChannelStock>> GetChannelStockByBiaoDing(int DrawerNo, int Quantity = 0)
{
var query = _connection.ChannelStock.AsQueryable()
.LoadWith(cs => cs.Drug)
.LoadWith(cs => cs.drugManuNo)
.LoadWith(cs => cs.Drug.Manus)
.Where(cs => cs.DrawerType == 1)
.Where(cs => cs.MachineId == _setting.machineId);
if (DrawerNo > 0)
{
query = query.Where(cs => cs.DrawerNo == DrawerNo);
}
int[] ints = _connection.ChannelStock.Where(cs => cs.MachineId == _setting.machineId).GroupBy(cs => cs.DrawerNo).Select(cs => cs.Key).ToArray();
List<ChannelStock> channelStocks = await query
.OrderBy((cs) => cs.DrawerNo)
.ThenBy((cs) => cs.ColNo)
.ToListAsync();
return new ChannelStockWithDrawerCount<ChannelStock>() { DrawerArray = ints, ChannelStocks = channelStocks };
}
} }
} }

View File

@ -298,6 +298,38 @@ namespace MasaBlazorApp3.DataAccess.Impl
for (var j = 0; j < stocks.Count; j++) for (var j = 0; j < stocks.Count; j++)
{ {
var ChannelStock = stocks[j]; var ChannelStock = stocks[j];
if (!DateTime.TryParse(ChannelStock.EffDate, out DateTime dEffDate))
{
//效期转换出错
if (ChannelStock.EffDate != null)
{
string[] idate = ChannelStock.EffDate.Split('/');
foreach (string iS in idate)
{
if (!string.IsNullOrEmpty(iS.Trim()))
{
switch (iS.Trim().Length)
{
case 4:
ChannelStock.EffDate = iS.Trim();
break;
case 2:
ChannelStock.EffDate += "-" + iS.Trim();
break;
case 1:
ChannelStock.EffDate += "-0" + iS.Trim();
break;
}
}
}
}
}
else
{
ChannelStock.EffDate = dEffDate.ToString("yyyy-MM-dd");
}
// 出库记录 // 出库记录
int mid = _connection.InsertWithInt32Identity(new MachineRecord() int mid = _connection.InsertWithInt32Identity(new MachineRecord()
{ {
@ -327,6 +359,7 @@ namespace MasaBlazorApp3.DataAccess.Impl
) )
.Where(cs => cs.DrugId.Equals(ChannelStock.DrugId)) .Where(cs => cs.DrugId.Equals(ChannelStock.DrugId))
.ToListAsync(); .ToListAsync();
// 保存账册 // 保存账册
int acid = _connection.InsertWithInt32Identity(new AccountBook() int acid = _connection.InsertWithInt32Identity(new AccountBook()
{ {
@ -428,6 +461,38 @@ namespace MasaBlazorApp3.DataAccess.Impl
.Set(cs => cs.EffDate, drugManuNo.EffDate.ToString()); .Set(cs => cs.EffDate, drugManuNo.EffDate.ToString());
} }
int r = q.Update(); int r = q.Update();
if (!DateTime.TryParse(ChannelStock.EffDate, out DateTime dEffDate))
{
//效期转换出错
if (ChannelStock.EffDate != null)
{
string[] idate = ChannelStock.EffDate.Split('/');
foreach (string iS in idate)
{
if (!string.IsNullOrEmpty(iS.Trim()))
{
switch (iS.Trim().Length)
{
case 4:
ChannelStock.EffDate = iS.Trim();
break;
case 2:
ChannelStock.EffDate += "-" + iS.Trim();
break;
case 1:
ChannelStock.EffDate += "-0" + iS.Trim();
break;
}
}
}
}
}
else
{
ChannelStock.EffDate = dEffDate.ToString("yyyy-MM-dd");
}
// 入库记录 // 入库记录
int mid = _connection.InsertWithInt32Identity(new MachineRecord() int mid = _connection.InsertWithInt32Identity(new MachineRecord()
{ {

View File

@ -231,6 +231,39 @@ namespace MasaBlazorApp3.DataAccess.Impl
for (var i = 0; i < datas.Count; i++) for (var i = 0; i < datas.Count; i++)
{ {
var orderTakeVo = datas[i]; var orderTakeVo = datas[i];
var EffDate = orderTakeVo.ChannelStock.EffDate;
if (!DateTime.TryParse(orderTakeVo.ChannelStock.EffDate, out DateTime dEffDate))
{
//效期转换出错
if (orderTakeVo.ChannelStock.EffDate != null)
{
string[] idate = orderTakeVo.ChannelStock.EffDate.Split('/');
foreach (string iS in idate)
{
if (!string.IsNullOrEmpty(iS.Trim()))
{
switch (iS.Trim().Length)
{
case 4:
EffDate = iS.Trim();
break;
case 2:
EffDate += "-" + iS.Trim();
break;
case 1:
EffDate += "-0" + iS.Trim();
break;
}
}
}
}
}
else
{
EffDate = dEffDate.ToString("yyyy-MM-dd");
}
// 出库记录 // 出库记录
int mid = _connection.InsertWithInt32Identity(new MachineRecord() int mid = _connection.InsertWithInt32Identity(new MachineRecord()
{ {
@ -239,7 +272,7 @@ namespace MasaBlazorApp3.DataAccess.Impl
ColNo = orderTakeVo.ChannelStock.ColNo, ColNo = orderTakeVo.ChannelStock.ColNo,
DrugId = orderTakeVo.ChannelStock.DrugId, DrugId = orderTakeVo.ChannelStock.DrugId,
ManuNo = orderTakeVo.ChannelStock.ManuNo, ManuNo = orderTakeVo.ChannelStock.ManuNo,
EffDate = !String.IsNullOrEmpty(orderTakeVo.ChannelStock.EffDate) ? DateTime.ParseExact(orderTakeVo.ChannelStock.EffDate, "yyyy-MM-dd", System.Globalization.CultureInfo.CurrentCulture) : null, EffDate = !String.IsNullOrEmpty(EffDate) ? DateTime.ParseExact(EffDate, "yyyy-MM-dd", System.Globalization.CultureInfo.CurrentCulture) : null,
OperationTime = DateTime.Now, OperationTime = DateTime.Now,
Type = 2, Type = 2,
Quantity = orderTakeVo.GetQuantity, Quantity = orderTakeVo.GetQuantity,
@ -266,7 +299,7 @@ namespace MasaBlazorApp3.DataAccess.Impl
MachineId = _setting.machineId, MachineId = _setting.machineId,
DrugId = orderTakeVo.ChannelStock.DrugId, DrugId = orderTakeVo.ChannelStock.DrugId,
ManuNo = orderTakeVo.ChannelStock.ManuNo, ManuNo = orderTakeVo.ChannelStock.ManuNo,
EffDate = !String.IsNullOrEmpty(orderTakeVo.ChannelStock.EffDate) ? DateTime.ParseExact(orderTakeVo.ChannelStock.EffDate, "yyyy-MM-dd", System.Globalization.CultureInfo.CurrentCulture) : null, EffDate = !String.IsNullOrEmpty(EffDate) ? DateTime.ParseExact(EffDate, "yyyy-MM-dd", System.Globalization.CultureInfo.CurrentCulture) : null,
OperationTime = DateTime.Now, OperationTime = DateTime.Now,
Type = 2, Type = 2,
OutQuantity = orderTakeVo.GetQuantity, OutQuantity = orderTakeVo.GetQuantity,

View File

@ -107,5 +107,13 @@ namespace MasaBlazorApp3.DataAccess.Impl
//} //}
return (await statement.UpdateAsync()) > 0; return (await statement.UpdateAsync()) > 0;
} }
//修改密码
public bool UpdateUserPassword(User user)
{
var statement = _connection.User
.Where(u => u.Id == user.Id)
.Set(u => u.Password, MD5.GetMD5Hash(user.Password).ToLower());
return statement.Update() > 0;
}
} }
} }

View File

@ -32,30 +32,27 @@ namespace MasaBlazorApp3.Finger
// ConnectionMain(); // ConnectionMain();
} }
public async void ConnectionMain() public async Task<bool> ConnectionMain()
{ {
await Task.Run(() => return await Task<bool>.Run(() =>
{ {
try
{
bIsConnected = axCZKEM1.Connect_Net(_options.ip, fingerPort);
logger.Info($"连接指纹机,IP:{_options.ip},端口:{fingerPort},机器号:{machineNumber},连接结果:{bIsConnected}");
if (bIsConnected)
{
if (axCZKEM1.RegEvent(machineNumber, 65535))
{
this.axCZKEM1.OnAttTransactionEx += new zkemkeeper._IZKEMEvents_OnAttTransactionExEventHandler(axCZKEM1_OnAttTransactionEx);
//this.axCZKEM1.OnEnrollFinger += new zkemkeeper._IZKEMEvents_OnEnrollFingerEventHandler(axCZKEM1_OnEnrollFinger);
this.axCZKEM1.OnEnrollFingerEx += new zkemkeeper._IZKEMEvents_OnEnrollFingerExEventHandler(axCZKEM1_OnEnrollFingerEx);
} bIsConnected = axCZKEM1.Connect_Net(_options.ip, fingerPort);
logger.Info($"连接指纹机,IP:{_options.ip},端口:{fingerPort},机器号:{machineNumber},连接结果:{bIsConnected}");
if (bIsConnected)
{
if (axCZKEM1.RegEvent(machineNumber, 65535))
{
this.axCZKEM1.OnAttTransactionEx += new zkemkeeper._IZKEMEvents_OnAttTransactionExEventHandler(axCZKEM1_OnAttTransactionEx);
//this.axCZKEM1.OnEnrollFinger += new zkemkeeper._IZKEMEvents_OnEnrollFingerEventHandler(axCZKEM1_OnEnrollFinger);
this.axCZKEM1.OnEnrollFingerEx += new zkemkeeper._IZKEMEvents_OnEnrollFingerExEventHandler(axCZKEM1_OnEnrollFingerEx);
} }
} }
catch return bIsConnected;
{
}
}); });
} }
//If your fingerprint(or your card) passes the verification,this event will be triggered //If your fingerprint(or your card) passes the verification,this event will be triggered

View File

@ -30,6 +30,8 @@ namespace MasaBlazorApp3
} }
} }
public bool isInit { get; set; } = false;
public event PropertyChangedEventHandler? PropertyChanged; public event PropertyChangedEventHandler? PropertyChanged;
//protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) //protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)

View File

@ -19,7 +19,7 @@
<div class="row justify-content-around align-items-center" style="margin-top: 220px; height: 430px;"> <div class="row justify-content-around align-items-center" style="margin-top: 220px; height: 430px;">
@foreach (int i in DrawerNos) @foreach (int i in DrawerNos)
{ {
<RadzenButton class="col-5" Click="@(() => SelectDrawer(i))" Text="@i.ToString()" Disabled="@(status > 0)" Shade="Shade.Light" Variant="@(drawerNo !=i ? Variant.Outlined : Variant.Flat)" /> <RadzenButton class="col-5" Click="@(() => SelectDrawer(i))" Text="@i.ToString()" Disabled="@(status > 0||!setting.Value.weigh.Contains(i))" Shade="Shade.Light" Variant="@(drawerNo !=i ? Variant.Outlined : Variant.Flat)" />
} }
</div> </div>
@ -50,7 +50,14 @@
AllowPaging="true" PageSize="10" PagerHorizontalAlign="HorizontalAlign.Left" ShowPagingSummary="true" PagingSummaryFormat="{0}/{1} 共{2}条数据"> AllowPaging="true" PageSize="10" PagerHorizontalAlign="HorizontalAlign.Left" ShowPagingSummary="true" PagingSummaryFormat="{0}/{1} 共{2}条数据">
<HeaderTemplate> <HeaderTemplate>
<RadzenRow JustifyContent="JustifyContent.End"> <RadzenRow JustifyContent="JustifyContent.End">
<RadzenButton IsBusy="@(status>0)" BusyText="抽屉已打开。。。" ButtonStyle="ButtonStyle.Warning" Variant="Variant.Outlined" Shade="Shade.Light" Text="开抽屉" Click="@OpenDrawer" /> @if (status < 3)
{
<RadzenButton IsBusy="@(status>0)" BusyText="抽屉已打开。。。" ButtonStyle="ButtonStyle.Warning" Variant="Variant.Flat" Shade="Shade.Light" Text="开抽屉" Click="@OpenDrawer" />
}
@if (status > 0 && status <= 3)
{
<RadzenButton Visible="@CancleIsEnable" Variant="Variant.Flat" Text="取消" Click="@Cancel" Style="width: 120px" />
}
</RadzenRow> </RadzenRow>
</HeaderTemplate> </HeaderTemplate>
<Columns> <Columns>
@ -64,52 +71,17 @@
<RadzenDataGridColumn Title="批次" Property="ManuNo"> <RadzenDataGridColumn Title="批次" Property="ManuNo">
<Template Context="channel"> <Template Context="channel">
<RadzenText TextStyle="TextStyle.Subtitle2" class="mb-0">@channel.drugManuNo?.ManuNo</RadzenText> <RadzenText TextStyle="TextStyle.Subtitle2" class="mb-0">@channel.drugManuNo?.ManuNo</RadzenText>
<RadzenText TextStyle="TextStyle.Caption">@channel.drugManuNo?.EffDate</RadzenText> <RadzenText TextStyle="TextStyle.Caption">@channel.drugManuNo?.EffDate.ToString().Substring(0,10)</RadzenText>
</Template> </Template>
<EditTemplate Context="channel">
@if (channel.Quantity == 0 && !String.IsNullOrEmpty(channel.DrugId))
{
<RadzenDropDown TValue="DrugManuNo" Name="ManuNo" @bind-Value="channel.drugManuNo" Data="@channel.Drug?.Manus" Style="width:100%; display: block;">
<Template>
<RadzenText TextStyle="TextStyle.Subtitle2" class="mb-0">@((context as DrugManuNo)?.ManuNo)</RadzenText>
<RadzenText TextStyle="TextStyle.Caption">@((context as DrugManuNo)?.EffDate)</RadzenText>
</Template>
<ValueTemplate>
<RadzenStack Orientation="Orientation.Horizontal">
<RadzenText TextStyle="TextStyle.Subtitle2" class="mb-0">@((context as DrugManuNo)?.ManuNo)</RadzenText>
<RadzenText TextStyle="TextStyle.Caption">@((context as DrugManuNo)?.EffDate)</RadzenText>
</RadzenStack>
</ValueTemplate>
</RadzenDropDown>
<RadzenRequiredValidator Text="请选择批次" Component="ManuNo" Popup="true" />
}
else
{
<RadzenText TextStyle="TextStyle.Subtitle2" class="mb-0">@channel.drugManuNo?.ManuNo</RadzenText>
<RadzenText TextStyle="TextStyle.Caption">@channel.drugManuNo?.EffDate</RadzenText>
}
</EditTemplate>
</RadzenDataGridColumn> </RadzenDataGridColumn>
<RadzenDataGridColumn Title="库存" Property="Quantity"> <RadzenDataGridColumn Title="库存" Property="Quantity">
<Template Context="cs"> <Template Context="cs">
<RadzenButton ButtonStyle="ButtonStyle.Info" Variant="Variant.Flat" Shade="Shade.Lighter" class="m-1" Text="@cs.Quantity.ToString()" /> <RadzenButton ButtonStyle="ButtonStyle.Info" Variant="Variant.Flat" Shade="Shade.Lighter" class="m-1" Text="@cs.Quantity.ToString()" />
</Template> </Template>
</RadzenDataGridColumn> </RadzenDataGridColumn>
<RadzenDataGridColumn MinWidth="100px" Title="加药数量" Property="AddQuantity"> <RadzenGridColumn Title="状态" Property="BiaoDingStatus">
<EditTemplate Context="cs">
@if (cs.BoardType == 2) </RadzenGridColumn>
{
@cs.AddQuantity
}
else
{
<RadzenNumeric Min="0" Style="display: block" Name="Quantity" @bind-Value=@cs.AddQuantity />
<RadzenNumericRangeValidator Style="position: absolute;z-index: 9999;" Min="0" Text="请填写正确的添加数量" Component="Quantity" Popup="true" />
}
</EditTemplate>
</RadzenDataGridColumn>
</Columns> </Columns>
</RadzenDataGrid> </RadzenDataGrid>
</RadzenStack> </RadzenStack>
@ -119,20 +91,22 @@
@inject PortUtil PortUtil; @inject PortUtil PortUtil;
@inject NotificationService _message @inject NotificationService _message
@inject IOptions<DrawerConfig> setting; @inject IOptions<DrawerConfig> setting;
@inject DialogService dialogService;
int status = 0; int status = 0;
int drawerNo = 1; int drawerNo = 0;
RadzenDataGrid<ChannelStock> grid; RadzenDataGrid<ChannelStock> grid;
private List<ChannelStock>? channels; private List<ChannelStock>? channels;
bool isLoading; bool isLoading;
int count; int count;
int[] DrawerNos = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16}; 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[] BeforeQuantity = new int[9];
int[] AfterQuantity = new int[9]; int[] AfterQuantity = new int[9];
private readonly ILog logger = LogManager.GetLogger(typeof(DrawerAdd)); private readonly ILog logger = LogManager.GetLogger(typeof(BiaoDing));
// 当前操作的库位号列表 // 当前操作的库位号列表
public List<int> ColNos { get; set; } = new List<int>(); public List<int> ColNos { get; set; } = new List<int>();
int currentCol = 0; //当前操作的库位数据
ChannelStock currentChannelStock;
bool CompleteIsEnable = true; bool CompleteIsEnable = true;
bool CancleIsEnable = true; bool CancleIsEnable = true;
@ -146,7 +120,7 @@
{ {
isLoading = true; isLoading = true;
var result = await channelListDao.GetChannelStockByDrawerNoWithDrawers(drawerNo); var result = await channelListDao.GetChannelStockByBiaoDing(drawerNo);
DrawerNos = result.DrawerArray; DrawerNos = result.DrawerArray;
channels = result.ChannelStocks; channels = result.ChannelStocks;
count = result.ChannelStocks.Count; count = result.ChannelStocks.Count;
@ -158,7 +132,7 @@
{ {
this.status = 1; this.status = 1;
var promiseUtil = new PromiseUtil<object>(); var promiseUtil = new PromiseUtil<object>();
await promiseUtil.taskAsyncLoop(500, null, async (data, next, stop) => await promiseUtil.taskAsyncLoop(300, null, async (data, next, stop) =>
{ {
try try
{ {
@ -166,94 +140,74 @@
{ {
stop(); stop();
} }
// 开启抽屉 else
else if (this.status == 1)
{ {
// if(库存》0) if (this.status == 1)
// {}
}
var b = await PortUtil.OpenDrawerStatus(this.drawerNo);
if (b)
{
PortUtil.SpeakAsync($"{drawerNo}号抽屉已经打开,请,加药");
this.status = 2;
PortUtil.Operate = true;
next();
}
// else
// {
// _message.Notify(
// new NotificationMessage { Severity = NotificationSeverity.Error, Summary = "提示", Detail = $"抽屉【{drawerNo}】打开失败,请检测硬件", Duration = 4000 }
// );
// logger.Info($"抽屉打开失败");
// RestData();
// PortUtil.Operate = false;
// stop();
// }
else if (this.status == 2)
{
if (setting.Value.box != null && setting.Value.box.Contains(this.drawerNo))
{ {
//药盒抽屉,开药盒 PortUtil.DrawerNo = this.drawerNo;
for (int i = 0; i < ColNos.Count; i++) var b = await PortUtil.OpenDrawerStatus(this.drawerNo);
if (b)
{ {
await PortUtil.OpenBoxByColNo(ColNos[i]); PortUtil.SpeakAsync($"{drawerNo}号抽屉已经打开,请,加药");
this.status = 2;
PortUtil.Operate = true;
next();
} }
} else
// 查询抽屉是否为关闭状态
var b2 = await PortUtil.CheckDrawerStatus2(drawerNo);
// 关闭则改变状态并终止循环
if (b2)
{
PortUtil.SpeakAsync($"加药完成,请,核对,或,录入,正确的,添加数量");
// 判断是否为称重抽屉
if (setting.Value.weigh != null && setting.Value.weigh.Contains(this.drawerNo))
{ {
//关闭抽屉后获取称重稳定数量 _message.Notify(
// await GetWeightQuantity(); new NotificationMessage { Severity = NotificationSeverity.Error, Summary = "提示", Detail = $"抽屉【{drawerNo}】打开失败,请检测硬件", Duration = 4000 }
);
logger.Info($"抽屉打开失败");
RestData();
PortUtil.Operate = false;
stop();
} }
this.status = 3;
PortUtil.Operate = false;
stop();
} }
else else
{ {
if (setting.Value.single != null && setting.Value.single.Contains(this.drawerNo)) //查询抽屉状态
var b = await PortUtil.CheckDrawerStatus2(drawerNo);
if (!b)
{ {
byte[] quantity = await PortUtil.CheckQuantityByDrawer(this.drawerNo); if (this.status == 2)
AfterQuantity = quantity.Select(it => Convert.ToInt32(it)).ToArray().Skip(3).Take(9).ToArray();
logger.Info($"单支抽屉,抽屉未关检测数量【{string.Join(",", AfterQuantity)}】");
channels.ForEach(cl =>
{
cl.AddQuantity = this.AfterQuantity[cl.ColNo - 1] - this.BeforeQuantity[cl.ColNo - 1];
});
}
// 判断是否为称重抽屉
if (setting.Value.weigh != null && setting.Value.weigh.Contains(this.drawerNo))
{
//开抽屉后查数
for (int i = 0; i < 9; i++)
{ {
int afterQuantity = await PortUtil.CheckQuantityForSingle(i); //药盒称重抽屉
AfterQuantity[i] = afterQuantity; if (currentChannelStock != null && currentChannelStock.BoardType.ToString().Contains("3"))
logger.Info($"AfterQuantity:{i}-{AfterQuantity}数量{string.Join(",", BeforeQuantity)}"); {
//打开药盒
await PortUtil.OpenBoxByColNo(currentChannelStock.ColNo);
this.status = 3;
}
} }
channels.ForEach(cl => if (this.status == 3)
{ {
cl.AddQuantity = this.AfterQuantity[cl.ColNo - 1] - this.BeforeQuantity[cl.ColNo - 1]; this.status = 4;
}); //弹出标定对话框
var dialog = await dialogService.OpenAsync<BiaoDingDialog>(
$"标定",
new Dictionary<string, object>() { { "channelStockInfo",
currentChannelStock } },
new DialogOptions() { Width = "45vw", Resizable = true, Draggable = true, ShowClose = false });
currentChannelStock = null;
//关闭弹窗后将状态置为2以便下次点击药盒进行开药盒操作
this.status = 2;
}
next();
}
else
{
//抽屉已关闭
stop();
this.status = 0;
logger.Info($"抽屉关闭");
} }
next(); // continue iteration
} }
} }
} }
catch (Exception e) catch (Exception e)
{ {
logger.Info($"抽屉加药发生错误,{e.Message}"); logger.Info($"标定药品发生错误,{e.Message}");
_message.Notify( _message.Notify(
new NotificationMessage { Severity = NotificationSeverity.Error, Summary = "提示", Detail = $"发生错误,{e.Message}", Duration = 4000 } new NotificationMessage { Severity = NotificationSeverity.Error, Summary = "提示", Detail = $"发生错误,{e.Message}", Duration = 4000 }
); );
@ -270,19 +224,28 @@
{ {
this.status = 0; this.status = 0;
} }
void Cancel()
{
this.status = 0;
}
void OnCellClick(DataGridCellMouseEventArgs<ChannelStock> args) void OnCellClick(DataGridCellMouseEventArgs<ChannelStock> args)
{ {
if (args.Data.BoardType.ToString().Contains("3")) if (this.status == 0)
{ {
//是药盒抽屉则点击行,打开对应行的药箱 PortUtil.SpeakAsync("请先打开抽屉后再点开药盒");
if (!ColNos.Contains(args.Data.ColNo))
{
ColNos.Add(args.Data.ColNo);
}
} }
else else
{ {
grid.EditRow(args.Data); currentChannelStock = args.Data;
if (args.Data.BoardType.ToString().Contains("3"))
{
PortUtil.SpeakAsync("正在打开药盒");
}
// else
// {
// grid.EditRow(args.Data);
// }
} }
} }
} }

View File

@ -0,0 +1,188 @@
@using MasaBlazorApp3.Util
@using log4net
<RadzenStack>
@* <RadzenTemplateForm Submit="@((int BDQuantity) => { ConfirmOK(BDQuantity); })" Style="width:100%;height:100%"> *@
<div class="rz-form-row">
<div class="rz-form-input-wrapper">
<!--@onfocusin="@(() => Util.VirtualKeyboardHelper.ShowVirtualKeyboard())"-->
@if (channelStockInfo.Quantity>0)
{
<RadzenText TextStyle="TextStyle.Body1" Style="color: var(--rz-text-tertiary-color); align-content:center; text-align:center; font-size:medium;">库位库存不为零,请取出药品后点击【清空】按钮,清空完成后输入标定数量并放入对应数量药品并根据下一步提示操作</RadzenText>
}
else
{
<RadzenText TextStyle="TextStyle.Body1" Style="color: var(--rz-text-tertiary-color); align-content:center; text-align:center; font-size:medium;">正在清零,清零完成后输入标定数量并放入对应数量药品后点击【标定】按钮</RadzenText>
}
<RadzenTextBox id="BDQuantity" Name="BDQuantity" Value="10" Style="width:100%" />
<RadzenRequiredValidator Component="BDQuantity" Text="请填写标定数量" />
</div>
</div>
@* </RadzenTemplateForm> *@
<RadzenStack Orientation="Orientation.Horizontal" JustifyContent="JustifyContent.Center" Gap="0.5rem">
<RadzenButton Click="@Clear" ButtonStyle="ButtonStyle.Warning" Variant="Variant.Flat" Disabled="@(channelStockInfo.Quantity<=0)" Text="清空" Style="width: 120px" />
<RadzenButton Click="ConfirmOK" ButtonStyle="ButtonStyle.Success" IsBusy="@(status==2)" BusyText="正在标定。。。" Variant="Variant.Flat" Text="标定" Disabled=@(this.status<=0||this.status==2) Style="width: 120px" />
<RadzenButton Click="@CancelClick" Variant="Variant.Flat" Text="取消" Style="width: 120px" />
</RadzenStack>
</RadzenStack>
@code {
@inject Radzen.DialogService dialogService;
@inject NotificationService _message
@inject PortUtil PortUtil;
[Parameter] public ChannelStock channelStockInfo { get; set; }
PromiseUtil<object> promiseUtil = new PromiseUtil<object>();
private readonly ILog logger = LogManager.GetLogger(typeof(BiaoDingDialog));
int BDQuantity = 10;
int status = 0;
int iClear = 0;
int iBiaoDing = 0;
protected override async Task OnInitializedAsync()
{
if(channelStockInfo!=null&&channelStockInfo.Quantity<=0)
{
//库存为零,直接进行清空操作
await Clear();
}
base.OnInitializedAsync();
}
//清空按钮
async Task Clear()
{
PortUtil.SpeakAsync($"正在清空,请稍等");
this.status = 1;
int i = 0;
await promiseUtil.taskAsyncLoop(200, null, async (data, next, stop) =>
{
i++;
if (this.status == 0)
{
iClear = 0;
stop();
}
else
{
try
{
if (iClear == 0)
{
logger.Info($"清零操作{i}");
//无库存发送计数清零指令
await PortUtil.ClearCount(channelStockInfo.DrawerNo, channelStockInfo.ColNo);
iClear += 1;
next();
}
else
{
logger.Info($"查数操作{i}");
//发查数指令
PortUtil.DrawerNo = channelStockInfo.DrawerNo;
PortUtil.Operate = true;
int stock = await PortUtil.CheckQuantityForBiaoDing(channelStockInfo.ColNo);
if (stock != 0)
{
_message.Notify(
new NotificationMessage
{ Severity = NotificationSeverity.Success, Summary = "提示", Detail = "清空操作成功", Duration = 3000 }
);
PortUtil.SpeakAsync("清空完成请放入10个药品放好后点击标定按钮");
iClear = 0;
stop();
}
else
{
next();
}
}
}
catch (Exception ex)
{
logger.Info($"清空操作异常");
next();
}
}
});
}
//标定按钮
async Task ConfirmOK()
{
if (BDQuantity > 0)
{
try
{
status = 2;
PortUtil.SpeakAsync("正在标定,请稍等");
//提示输入标定数量发26指令
await PortUtil.SetNumCount(channelStockInfo.DrawerNo, channelStockInfo.ColNo, BDQuantity);
await Task.Delay(200);
int i = 1;
await promiseUtil.taskAsyncLoop(200, null, async (data, next, stop) =>
{
if(status==0)
{
stop();
}
if (status == 2)
{
//查数量
int quantity = await PortUtil.CheckQuantityForBiaoDing(channelStockInfo.ColNo);
if (quantity == BDQuantity)
{
//标定完成
status = 0;
_message.Notify(
new NotificationMessage
{ Severity = NotificationSeverity.Success, Summary = "提示", Detail = "标定成功", Duration = 3000 }
);
PortUtil.SpeakAsync("标定完成,请取出药品");
status = 0;
i = 0;
stop();
// 关闭弹窗
dialogService.Close(true);
}
else
{
i++;
logger.Info($"标定数量不一致{quantity}-{BDQuantity},标定次数{i}");
next();
}
}
});
}
catch (Exception ex)
{
logger.Error($"标定异常{ex.Message}");
_message.Notify(
new NotificationMessage
{ Severity = NotificationSeverity.Error, Summary = "提示", Detail = "标定异常", Duration = 3000 }
);
}
}
else
{
_message.Notify(
new NotificationMessage
{ Severity = NotificationSeverity.Error, Summary = "提示", Detail = "请输入标定数量", Duration = 3000 });
}
}
// 取消
async Task CancelClick()
{
status = 0;
// 关闭弹窗
dialogService.Close(true);
}
}

View File

@ -1,7 +1,8 @@
 
<RadzenStack> <RadzenStack>
<RadzenText TextStyle="TextStyle.Body1" Style="color: var(--rz-text-tertiary-color); align-content:center; text-align:center; font-size:medium;">确认要@(confirmInfo) 吗?</RadzenText> <RadzenText TextStyle="TextStyle.Body1" Style="color: var(--rz-text-tertiary-color); align-content:center; text-align:center; font-size:medium;">@(confirmInfo)</RadzenText>
<RadzenStack Orientation="Orientation.Horizontal" JustifyContent="JustifyContent.Center" Gap="0.5rem"> <RadzenStack Orientation="Orientation.Horizontal" JustifyContent="JustifyContent.Center" Gap="0.5rem">
<RadzenButton Click="@ConfirmOK" ButtonStyle="ButtonStyle.Success" Variant="Variant.Flat" Text="确认" Style="width: 120px" /> <RadzenButton Click="@ConfirmOK" ButtonStyle="ButtonStyle.Success" Variant="Variant.Flat" Text="确认" Style="width: 120px" />

View File

@ -11,17 +11,30 @@
</style> </style>
<RadzenStack Orientation="Orientation.Horizontal"> <RadzenStack Orientation="Orientation.Horizontal">
<div class="row justify-content-center"> <div class="row justify-content-center">
<div class="col-12 row justify-content-center align-items-center text-center" style="background: url('/images/box.png') no-repeat; background-size: 100% 100%; width: 380px; height:650px"> @if (DrawerNos.Count() > 8)
@* <RadzenStack AlignItems="AlignItems.Center" JustifyContent="JustifyContent.Center" Orientation="Orientation.Vertical" Style="margin-top: 220px"> *@ {
<div class="row justify-content-around align-items-center" style="margin-top: 220px; height: 430px;"> <div class="col-12 row justify-content-center align-items-center text-center" style="background: url('/images/box-16.jpg') no-repeat; background-size: 100% 100%; width: 380px; height:650px">
@foreach (int i in DrawerNos) <div class="row justify-content-around align-items-center" style="margin-top: 220px; height: 430px;">
{ @foreach (int i in DrawerNos)
<RadzenButton class="col-5" Click="@(() => SelectDrawer(i))" Text="@i.ToString()" Disabled="@(status > 0)" Shade="Shade.Light" Variant="@(drawerNo !=i ? Variant.Outlined : Variant.Flat)" /> {
<RadzenButton class="col-5" Click="@(() => SelectDrawer(i))" Text="@i.ToString()" Disabled="@(status > 0)" Shade="Shade.Light" Variant="@(drawerNo !=i ? Variant.Outlined : Variant.Flat)" />
} }
</div>
</div> </div>
@* </RadzenStack> *@ }
</div> else
{
<div class="col-12 row justify-content-center align-items-center text-center" style="background: url('/images/box.png') no-repeat; background-size: 100% 100%; width: 380px; height:650px">
<div class="row justify-content-around align-items-center" style="margin-top: 220px; height: 430px;">
@foreach (int i in DrawerNos)
{
<RadzenButton class="col-12" Click="@(() => SelectDrawer(i))" Text="@i.ToString()" Disabled="@(status > 0)" Shade="Shade.Light" Variant="@(drawerNo !=i ? Variant.Outlined : Variant.Flat)" />
}
</div>
</div>
}
</div> </div>
<RadzenDataGrid @ref="grid" <RadzenDataGrid @ref="grid"
LoadData="@LoadData" LoadData="@LoadData"
@ -36,11 +49,11 @@
<RadzenRow JustifyContent="JustifyContent.End"> <RadzenRow JustifyContent="JustifyContent.End">
@if (status < 3) @if (status < 3)
{ {
<RadzenButton IsBusy="@(status>0)" BusyText="加药中。。。" ButtonStyle="ButtonStyle.Warning" Variant="Variant.Outlined" Shade="Shade.Light" Text="加药" Click="@OpenDrawer" /> <RadzenButton IsBusy="@(status>0)" BusyText="加药中。。。" ButtonStyle="ButtonStyle.Warning" Variant="Variant.Flat" Shade="Shade.Light" Text="加药" Click="@OpenDrawer" />
} }
@if (status == 3) @if (status == 3)
{ {
<RadzenButton Visible="@CompleteIsEnable" ButtonStyle="ButtonStyle.Warning" Variant="Variant.Outlined" Shade="Shade.Light" Text="完成" Click="@AddFinish" /> <RadzenButton Visible="@CompleteIsEnable" ButtonStyle="ButtonStyle.Warning" Variant="Variant.Flat" Shade="Shade.Light" Text="完成" Click="@AddFinish" />
} }
@if (status > 0 && status <= 3) @if (status > 0 && status <= 3)
{ {
@ -59,7 +72,19 @@
<RadzenDataGridColumn Title="批次" Property="ManuNo"> <RadzenDataGridColumn Title="批次" Property="ManuNo">
<Template Context="channel"> <Template Context="channel">
<RadzenText TextStyle="TextStyle.Subtitle2" class="mb-0">@channel.drugManuNo?.ManuNo</RadzenText> <RadzenText TextStyle="TextStyle.Subtitle2" class="mb-0">@channel.drugManuNo?.ManuNo</RadzenText>
<RadzenText TextStyle="TextStyle.Caption">@channel.drugManuNo?.EffDate</RadzenText>
@if (channel.drugManuNo != null && channel.drugManuNo.EffDate.ToString().Length > 10)
{
<RadzenText TextStyle="TextStyle.Caption">
@channel.drugManuNo.EffDate.ToString().Substring(0, 10)
</RadzenText>
}
else
{
<RadzenText TextStyle="TextStyle.Caption">
@channel.drugManuNo?.EffDate
</RadzenText>
}
</Template> </Template>
<EditTemplate Context="channel"> <EditTemplate Context="channel">
@ -68,12 +93,30 @@
<RadzenDropDown TValue="DrugManuNo" Name="ManuNo" @bind-Value="channel.drugManuNo" Data="@channel.Drug?.Manus" Style="width:100%; display: block;"> <RadzenDropDown TValue="DrugManuNo" Name="ManuNo" @bind-Value="channel.drugManuNo" Data="@channel.Drug?.Manus" Style="width:100%; display: block;">
<Template> <Template>
<RadzenText TextStyle="TextStyle.Subtitle2" class="mb-0">@((context as DrugManuNo)?.ManuNo)</RadzenText> <RadzenText TextStyle="TextStyle.Subtitle2" class="mb-0">@((context as DrugManuNo)?.ManuNo)</RadzenText>
<RadzenText TextStyle="TextStyle.Caption">@((context as DrugManuNo)?.EffDate)</RadzenText> @if ((context as DrugManuNo).EffDate != null && (context as DrugManuNo).EffDate.ToString().Length > 10)
{
<RadzenText TextStyle="TextStyle.Caption">@((context as DrugManuNo).EffDate.ToString().Substring(0, 10))</RadzenText>
}
else
{
<RadzenText TextStyle="TextStyle.Caption">@((context as DrugManuNo)?.EffDate)</RadzenText>
}
</Template> </Template>
<ValueTemplate> <ValueTemplate>
<RadzenStack Orientation="Orientation.Horizontal"> <RadzenStack Orientation="Orientation.Horizontal">
<RadzenText TextStyle="TextStyle.Subtitle2" class="mb-0">@((context as DrugManuNo)?.ManuNo)</RadzenText> <RadzenText TextStyle="TextStyle.Subtitle2" class="mb-0">@((context as DrugManuNo)?.ManuNo)</RadzenText>
<RadzenText TextStyle="TextStyle.Caption">@((context as DrugManuNo)?.EffDate)</RadzenText> @if ((context as DrugManuNo).EffDate != null && (context as DrugManuNo).EffDate.ToString().Length > 10)
{
<RadzenText TextStyle="TextStyle.Caption">@((context as DrugManuNo).EffDate.ToString().Substring(0, 10))</RadzenText>
}
else
{
<RadzenText TextStyle="TextStyle.Caption">@((context as DrugManuNo)?.EffDate)</RadzenText>
}
</RadzenStack> </RadzenStack>
</ValueTemplate> </ValueTemplate>
</RadzenDropDown> </RadzenDropDown>
@ -94,7 +137,7 @@
</RadzenDataGridColumn> </RadzenDataGridColumn>
<RadzenDataGridColumn MinWidth="100px" Title="加药数量" Property="AddQuantity"> <RadzenDataGridColumn MinWidth="100px" Title="加药数量" Property="AddQuantity">
<EditTemplate Context="cs"> <EditTemplate Context="cs">
@if (cs.BoardType == 2) @if (cs.BoardType.ToString().Contains("2") || cs.BoardType.ToString().Contains("3"))
{ {
@cs.AddQuantity @cs.AddQuantity
} }
@ -130,7 +173,7 @@
public List<int> ColNos { get; set; } = new List<int>(); public List<int> ColNos { get; set; } = new List<int>();
int currentCol = 0; int currentCol = 0;
bool CompleteIsEnable = true; bool CompleteIsEnable = true;
bool CancleIsEnable=true; bool CancleIsEnable = true;
async Task LoadData(LoadDataArgs args) async Task LoadData(LoadDataArgs args)
{ {
isLoading = true; isLoading = true;
@ -148,6 +191,7 @@
} }
async Task OpenDrawer() async Task OpenDrawer()
{ {
PortUtil.DrawerNo = this.drawerNo;
this.status = 1; this.status = 1;
// 根据抽屉类型来决定打开前是否需要查询数量 // 根据抽屉类型来决定打开前是否需要查询数量
var promiseUtil = new PromiseUtil<object>(); var promiseUtil = new PromiseUtil<object>();
@ -170,16 +214,16 @@
logger.Info($"单支抽屉,开抽屉前检测数量【{string.Join(",", BeforeQuantity)}】"); logger.Info($"单支抽屉,开抽屉前检测数量【{string.Join(",", BeforeQuantity)}】");
} }
// 判断是否为称重抽屉 // 判断是否为称重抽屉
if (setting.Value.weigh != null && setting.Value.weigh.Contains(this.drawerNo)) // if (setting.Value.weigh != null && setting.Value.weigh.Contains(this.drawerNo))
{ // {
//开抽屉前先查数 // //开抽屉前先查数
for (int i = 0; i < 9; i++) // for (int i = 0; i < 9; i++)
{ // {
int beforeQuantity = await PortUtil.CheckQuantityForSingle(i); // int beforeQuantity = await PortUtil.CheckQuantityForSingle(i + 1);
BeforeQuantity[i] = beforeQuantity; // BeforeQuantity[i] = beforeQuantity;
logger.Info($"BeforeQuantity:{i}-{beforeQuantity}数量{string.Join(",", BeforeQuantity)}"); // logger.Info($"BeforeQuantity:{i++}-{beforeQuantity}数量{string.Join(",", BeforeQuantity)}");
} // }
} // }
var b = await PortUtil.OpenDrawerStatus(this.drawerNo); var b = await PortUtil.OpenDrawerStatus(this.drawerNo);
if (b) if (b)
@ -204,14 +248,6 @@
// 检测状态 // 检测状态
else if (this.status == 2) else if (this.status == 2)
{ {
if (setting.Value.box != null && setting.Value.box.Contains(this.drawerNo))
{
//药盒抽屉,开药盒
for(int i=0;i< ColNos.Count;i++)
{
await PortUtil.OpenBoxByColNo(ColNos[i]);
}
}
// 查询抽屉是否为关闭状态 // 查询抽屉是否为关闭状态
var b = await PortUtil.CheckDrawerStatus2(drawerNo); var b = await PortUtil.CheckDrawerStatus2(drawerNo);
// 关闭则改变状态并终止循环 // 关闭则改变状态并终止循环
@ -230,6 +266,29 @@
} }
else else
{ {
//药盒抽屉,开药盒
if (setting.Value.box != null && setting.Value.box.Contains(this.drawerNo))
{
if (setting.Value.weigh != null && setting.Value.weigh.Contains(this.drawerNo))
{
if (currentCol > 0)
{
//开药盒前先查数
int beforeQuantity = await PortUtil.CheckQuantityForSingle(currentCol);
BeforeQuantity[currentCol - 1] = beforeQuantity;
logger.Info($"BeforeQuantity:{currentCol}-{beforeQuantity}数量{string.Join(",", BeforeQuantity)}");
await Task.Delay(200);
ColNos.Add(currentCol);
}
}
//药盒抽屉,开药盒
if (currentCol > 0)
{
await PortUtil.OpenBoxByColNo(currentCol);
}
currentCol = 0;
}
if (setting.Value.single != null && setting.Value.single.Contains(this.drawerNo)) if (setting.Value.single != null && setting.Value.single.Contains(this.drawerNo))
{ {
byte[] quantity = await PortUtil.CheckQuantityByDrawer(this.drawerNo); byte[] quantity = await PortUtil.CheckQuantityByDrawer(this.drawerNo);
@ -245,16 +304,17 @@
if (setting.Value.weigh != null && setting.Value.weigh.Contains(this.drawerNo)) if (setting.Value.weigh != null && setting.Value.weigh.Contains(this.drawerNo))
{ {
//开抽屉后查数 //开抽屉后查数
for (int i = 0; i < 9; i++) for (int i = 0; i < ColNos.Count; i++)
{ {
int afterQuantity = await PortUtil.CheckQuantityForSingle(i); int afterQuantity = await PortUtil.CheckQuantityForSingle(ColNos[i]);
AfterQuantity[i] = afterQuantity; AfterQuantity[ColNos[i]-1] = afterQuantity;
logger.Info($"AfterQuantity:{i}-{AfterQuantity}数量{string.Join(",", BeforeQuantity)}"); logger.Info($"AfterQuantity:{ColNos[i]}-{string.Join(",", AfterQuantity)}数量{string.Join(", ", BeforeQuantity)}");
} }
channels.ForEach(cl => channels.Where(cl => ColNos.Contains(cl.ColNo)).ToList().ForEach(cl =>
{ {
cl.AddQuantity = this.AfterQuantity[cl.ColNo - 1] - this.BeforeQuantity[cl.ColNo - 1]; cl.AddQuantity = this.AfterQuantity[cl.ColNo - 1] - this.BeforeQuantity[cl.ColNo - 1];
}); });
await InvokeAsync(StateHasChanged);
} }
next(); // continue iteration next(); // continue iteration
} }
@ -282,6 +342,8 @@
this.status = 0; this.status = 0;
this.BeforeQuantity = new int[9]; this.BeforeQuantity = new int[9];
this.AfterQuantity = new int[9]; this.AfterQuantity = new int[9];
currentCol = 0;
ColNos.Clear();
} }
//关闭抽屉后获取称重稳定数量 //关闭抽屉后获取称重稳定数量
public async Task GetWeightQuantity() public async Task GetWeightQuantity()
@ -311,6 +373,10 @@
{ {
cl.AddQuantity = this.AfterQuantity[cl.ColNo - 1] - this.BeforeQuantity[cl.ColNo - 1]; cl.AddQuantity = this.AfterQuantity[cl.ColNo - 1] - this.BeforeQuantity[cl.ColNo - 1];
}); });
CompleteIsEnable = true;
CancleIsEnable = true;
logger.Info("对比成功停止循环");
await InvokeAsync(StateHasChanged);
} }
else else
{ {
@ -330,6 +396,7 @@
} }
CompleteIsEnable = false; CompleteIsEnable = false;
PortUtil.DrawerNo = drawerNo; PortUtil.DrawerNo = drawerNo;
PortUtil.ColNoLst = ColNos;
int[] quantity = await PortUtil.CheckQuantityByAddrForMulti(); int[] quantity = await PortUtil.CheckQuantityByAddrForMulti();
AfterQuantity = quantity; AfterQuantity = quantity;
int[] Quantitys = new int[BeforeQuantity.Length]; int[] Quantitys = new int[BeforeQuantity.Length];
@ -377,14 +444,15 @@
else else
{ {
// 判断是否为标签抽屉 // 判断是否为标签抽屉
if (setting.Value.label.Contains(this.drawerNo)) if (setting.Value != null && setting.Value.label != null && setting.Value.label.Contains(this.drawerNo))
{ {
//写标签数量 //写标签数量
channels.ForEach(async it => channels.Where(it => it.AddQuantity > 0).ToList().ForEach(async it =>
{ {
await PortUtil.WriteQuantityMethod(it.Quantity + it.AddQuantity, it.DrawerNo, it.ColNo); await PortUtil.WriteQuantityMethod(it.Quantity + it.AddQuantity, it.DrawerNo, it.ColNo);
}); });
} }
ColNos.Clear();
} }
} }
@ -396,7 +464,7 @@
void Cancel() void Cancel()
{ {
this.status = 0; RestData();
} }
void SelectDrawer(int drawerNo) void SelectDrawer(int drawerNo)
@ -407,18 +475,20 @@
void OnCellClick(DataGridCellMouseEventArgs<ChannelStock> args) void OnCellClick(DataGridCellMouseEventArgs<ChannelStock> args)
{ {
if (args.Data.BoardType.ToString().Contains("3")) // if (args.Data.BoardType.ToString().Contains("3"))
// {
// //是药盒抽屉则点击行,打开对应行的药箱
// if (!ColNos.Contains(args.Data.ColNo))
// {
// ColNos.Add(args.Data.ColNo);
// }
// }
if (setting.Value.box.Contains(args.Data.DrawerNo) && status != 2)
{ {
//是药盒抽屉则点击行,打开对应行的药箱 PortUtil.SpeakAsync("请先点取药按钮打开抽屉");
if (!ColNos.Contains(args.Data.ColNo))
{
ColNos.Add(args.Data.ColNo);
}
}
else
{
grid.EditRow(args.Data);
} }
currentCol = args.Data.ColNo;
grid.EditRow(args.Data);
} }
private IDisposable? registration; private IDisposable? registration;
protected override void OnAfterRender(bool firstRender) protected override void OnAfterRender(bool firstRender)

View File

@ -6,42 +6,45 @@
@using log4net; @using log4net;
<style> <style>
.rz-custom-header { .rz-custom-header {
width: 100%; width: 100%;
} }
</style> </style>
<RadzenStack Orientation="Orientation.Horizontal"> <RadzenStack Orientation="Orientation.Horizontal">
@* <div class="row justify-content-center align-items-center">
<div class="col-12 row justify-content-center align-items-center text-center" style="background: url('/images/box.png') no-repeat; background-size: 100% 100%; width: 240px; height:650px">
<RadzenStack AlignItems="AlignItems.Center" JustifyContent="JustifyContent.Center" Orientation="Orientation.Vertical" Style="margin-top: 220px">
@foreach (int i in DrawerNos)
{
<RadzenButton class="col-5" Click="@(() => SelectDrawer(i))" Text="@i.ToString()" Disabled="@(status > 0)" Shade="Shade.Light" Variant="@(drawerNo !=i ? Variant.Outlined : Variant.Flat)" />
}
</RadzenStack>
</div>
</div> *@
<div class="row justify-content-center"> <div class="row justify-content-center">
<div class="col-12 row justify-content-center align-items-center text-center" style="background: url('/images/box.png') no-repeat; background-size: 100% 100%; width: 380px; height:650px"> @if (DrawerNos.Count() > 8)
@* <RadzenStack AlignItems="AlignItems.Center" JustifyContent="JustifyContent.Center" Orientation="Orientation.Vertical" Style="margin-top: 220px"> *@ {
<div class="row justify-content-around align-items-center" style="margin-top: 220px; height: 430px;"> <div class="col-12 row justify-content-center align-items-center text-center" style="background: url('/images/box-16.jpg') no-repeat; background-size: 100% 100%; width: 380px; height:650px">
@foreach (int i in DrawerNos) <div class="row justify-content-around align-items-center" style="margin-top: 220px; height: 430px;">
{ @foreach (int i in DrawerNos)
<RadzenButton class="col-5" Click="@(() => SelectDrawer(i))" Text="@i.ToString()" Disabled="@(status > 0)" Shade="Shade.Light" Variant="@(drawerNo !=i ? Variant.Outlined : Variant.Flat)" /> {
<RadzenButton class="col-5" Click="@(() => SelectDrawer(i))" Text="@i.ToString()" Disabled="@(status > 0)" Shade="Shade.Light" Variant="@(drawerNo !=i ? Variant.Outlined : Variant.Flat)" />
} }
</div>
</div> </div>
@* </RadzenStack> *@ }
</div> else
{
<div class="col-12 row justify-content-center align-items-center text-center" style="background: url('/images/box.png') no-repeat; background-size: 100% 100%; width: 380px; height:650px">
<div class="row justify-content-around align-items-center" style="margin-top: 220px; height: 430px;">
@foreach (int i in DrawerNos)
{
<RadzenButton class="col-12" Click="@(() => SelectDrawer(i))" Text="@i.ToString()" Disabled="@(status > 0)" Shade="Shade.Light" Variant="@(drawerNo !=i ? Variant.Outlined : Variant.Flat)" />
}
</div>
</div>
}
</div> </div>
<RadzenDataGrid @ref="grid" <RadzenDataGrid @ref="grid"
LoadData="@LoadData" LoadData="@LoadData"
IsLoading="@isLoading" IsLoading="@isLoading"
Count="@count" Count="@count"
EmptyText="无数据" EmptyText="无数据"
Data="@channels" Data="@channels"
AllowColumnResize="true" AllowAlternatingRows="false" AllowColumnResize="true" AllowAlternatingRows="false"
CellClick="@((DataGridCellMouseEventArgs<ChannelStock> args) => OnCellClick(args))" CellClick="@((DataGridCellMouseEventArgs<ChannelStock> args) => OnCellClick(args))"
AllowPaging="true" PageSize="10" PagerHorizontalAlign="HorizontalAlign.Left" ShowPagingSummary="true" PagingSummaryFormat="{0}/{1} 共{2}条数据"> AllowPaging="true" PageSize="10" PagerHorizontalAlign="HorizontalAlign.Left" ShowPagingSummary="true" PagingSummaryFormat="{0}/{1} 共{2}条数据">
<HeaderTemplate> <HeaderTemplate>
<RadzenRow JustifyContent="JustifyContent.End"> <RadzenRow JustifyContent="JustifyContent.End">
@if (status < 3) @if (status < 3)
@ -50,7 +53,7 @@
} }
@if (status == 3) @if (status == 3)
{ {
<RadzenButton Visible="@CompleteIsEnable" ButtonStyle="ButtonStyle.Warning" Variant="Variant.Flat" Shade="Shade.Light" Text="完成" Click="@TakeFinish" /> <RadzenButton Visible="@CompleteIsEnable" ButtonStyle="ButtonStyle.Warning" Variant="Variant.Flat" Shade="Shade.Light" Text="完成" Click="@TakeFinish" />
} }
@if (status > 0 && status <= 3) @if (status > 0 && status <= 3)
{ {
@ -79,7 +82,7 @@
</RadzenDataGridColumn> </RadzenDataGridColumn>
<RadzenDataGridColumn MinWidth="120px" Title="取药数量" Property="TakeQuantity"> <RadzenDataGridColumn MinWidth="120px" Title="取药数量" Property="TakeQuantity">
<EditTemplate Context="channel"> <EditTemplate Context="channel">
@if (channel.BoardType == 2) @if (channel.BoardType.ToString().Contains("2") || channel.BoardType.ToString().Contains("3"))
{ {
@channel.TakeQuantity @channel.TakeQuantity
} }
@ -112,6 +115,7 @@
// 当前操作的库位号列表 // 当前操作的库位号列表
public List<int> ColNos { get; set; } = new List<int>(); public List<int> ColNos { get; set; } = new List<int>();
int currentCol = 0;
bool CompleteIsEnable = true; bool CompleteIsEnable = true;
bool CancleIsEnable = true; bool CancleIsEnable = true;
@ -122,7 +126,7 @@
isLoading = true; isLoading = true;
// var result = await channelListDao.GetChannelStockByDrawerNo(drawerNo, 1); // var result = await channelListDao.GetChannelStockByDrawerNo(drawerNo, 1);
var result = await channelListDao.GetChannelStockByDrawerNoWithDrawers(drawerNo); var result = await channelListDao.GetChannelStockByDrawerNoWithDrawers(drawerNo, 1);
DrawerNos = result.DrawerArray; DrawerNos = result.DrawerArray;
// Update the Data property // Update the Data property
channels = result.ChannelStocks; channels = result.ChannelStocks;
@ -134,6 +138,7 @@
} }
async Task OpenDrawer() async Task OpenDrawer()
{ {
PortUtil.DrawerNo = this.drawerNo;
this.status = 1; this.status = 1;
// 根据抽屉类型来决定打开前是否需要查询数量 // 根据抽屉类型来决定打开前是否需要查询数量
var promiseUtil = new PromiseUtil<object>(); var promiseUtil = new PromiseUtil<object>();
@ -155,17 +160,6 @@
BeforeQuantity = quantity.Select(it => Convert.ToInt32(it)).ToArray().Skip(3).Take(9).ToArray(); BeforeQuantity = quantity.Select(it => Convert.ToInt32(it)).ToArray().Skip(3).Take(9).ToArray();
logger.Info($"单支抽屉,开抽屉前检测数量【{string.Join(",", BeforeQuantity)}】"); logger.Info($"单支抽屉,开抽屉前检测数量【{string.Join(",", BeforeQuantity)}】");
} }
// 判断是否为称重抽屉
if (setting.Value.weigh!=null&&setting.Value.weigh.Contains(this.drawerNo))
{
//开抽屉前先查数
for (int i = 0; i < 9; i++)
{
int beforeQuantity = await PortUtil.CheckQuantityForSingle(i);
BeforeQuantity[i] = beforeQuantity;
logger.Info($"BeforeQuantity:{i}-{beforeQuantity}数量{string.Join(",", BeforeQuantity)}");
}
}
var b = await PortUtil.OpenDrawerStatus(this.drawerNo); var b = await PortUtil.OpenDrawerStatus(this.drawerNo);
if (b) if (b)
@ -189,15 +183,6 @@
// 检测状态 // 检测状态
else if (this.status == 2) else if (this.status == 2)
{ {
if (setting.Value.box != null && setting.Value.box.Contains(this.drawerNo))
{
//药盒抽屉,开药盒
for (int i = 0; i < ColNos.Count; i++)
{
await PortUtil.OpenBoxByColNo(ColNos[i]);
}
}
// 查询抽屉是否为关闭状态 // 查询抽屉是否为关闭状态
var b = await PortUtil.CheckDrawerStatus2(drawerNo); var b = await PortUtil.CheckDrawerStatus2(drawerNo);
// 关闭则改变状态并终止循环 // 关闭则改变状态并终止循环
@ -217,32 +202,63 @@
} }
else else
{ {
if (setting.Value.box != null && setting.Value.box.Contains(this.drawerNo))
{
// 判断是否为称重抽屉
if (setting.Value.weigh != null && setting.Value.weigh.Contains(this.drawerNo))
{
//开抽屉前先查数
if (currentCol > 0)
{
int beforeQuantity = await PortUtil.CheckQuantityForSingle(currentCol);
BeforeQuantity[currentCol - 1] = beforeQuantity;
logger.Info($"BeforeQuantity:{currentCol}-{beforeQuantity}数量{string.Join(",", BeforeQuantity)}");
await Task.Delay(200);
ColNos.Add(currentCol);
}
}
//药盒抽屉,开药盒
if (currentCol > 0)
{
await PortUtil.OpenBoxByColNo(currentCol);
}
currentCol = 0;
}
if (setting.Value.single != null && setting.Value.single.Contains(this.drawerNo)) if (setting.Value.single != null && setting.Value.single.Contains(this.drawerNo))
{ {
byte[] quantity = await PortUtil.CheckQuantityByDrawer(this.drawerNo); byte[] quantity = await PortUtil.CheckQuantityByDrawer(this.drawerNo);
AfterQuantity = quantity.Select(it => Convert.ToInt32(it)).ToArray().Skip(3).Take(9).ToArray(); AfterQuantity = quantity.Select(it => Convert.ToInt32(it)).ToArray().Skip(3).Take(9).ToArray();
logger.Info($"单支抽屉,抽屉未关检测数量【{string.Join(",", AfterQuantity)}】"); logger.Info($"单支抽屉,抽屉未关检测数量【{string.Join(",", AfterQuantity)}】");
channels.ForEach(cl => if (!BeforeQuantity.SequenceEqual(AfterQuantity))
{
channels.ForEach(cl =>
{ {
cl.TakeQuantity = this.BeforeQuantity[cl.ColNo - 1] - this.AfterQuantity[cl.ColNo - 1]; cl.TakeQuantity = this.BeforeQuantity[cl.ColNo - 1] - this.AfterQuantity[cl.ColNo - 1];
}); });
await InvokeAsync(StateHasChanged);
}
} }
// 判断是否为称重抽屉 // 判断是否为称重抽屉
if (setting.Value.weigh!=null&&setting.Value.weigh.Contains(this.drawerNo)) if (setting.Value.weigh != null && setting.Value.weigh.Contains(this.drawerNo))
{ {
//开抽屉后查数 //开抽屉后查数
for (int i = 0; i < 9; i++) for (int i = 0; i < ColNos.Count; i++)
{ {
int afterQuantity = await PortUtil.CheckQuantityForSingle(i); int afterQuantity = await PortUtil.CheckQuantityForSingle(ColNos[i]);
AfterQuantity[i] = afterQuantity; AfterQuantity[ColNos[i]-1] = afterQuantity;
logger.Info($"AfterQuantity:{i}-{AfterQuantity}数量{string.Join(",", BeforeQuantity)}"); logger.Info($"AfterQuantity:{ColNos[i]}-{afterQuantity}数量{string.Join(",", AfterQuantity)}");
} }
channels.ForEach(cl => if (!BeforeQuantity.SequenceEqual(AfterQuantity))
{
channels.Where(cl => ColNos.Contains(cl.ColNo)).ToList().ForEach(cl =>
{ {
cl.TakeQuantity = this.AfterQuantity[cl.ColNo - 1] - this.BeforeQuantity[cl.ColNo - 1]; cl.TakeQuantity = this.BeforeQuantity[cl.ColNo - 1] - this.AfterQuantity[cl.ColNo - 1];
}); });
await InvokeAsync(StateHasChanged);
}
} }
next(); // continue iteration next(); // continue iteration
} }
@ -300,6 +316,7 @@
{ {
cl.TakeQuantity = this.BeforeQuantity[cl.ColNo - 1] - this.AfterQuantity[cl.ColNo - 1]; cl.TakeQuantity = this.BeforeQuantity[cl.ColNo - 1] - this.AfterQuantity[cl.ColNo - 1];
}); });
await InvokeAsync(StateHasChanged);
} }
else else
{ {
@ -320,6 +337,7 @@
} }
CompleteIsEnable = false; CompleteIsEnable = false;
PortUtil.DrawerNo = drawerNo; PortUtil.DrawerNo = drawerNo;
PortUtil.ColNoLst = ColNos;
int[] quantity = await PortUtil.CheckQuantityByAddrForMulti(); int[] quantity = await PortUtil.CheckQuantityByAddrForMulti();
AfterQuantity = quantity; AfterQuantity = quantity;
int[] Quantitys = new int[BeforeQuantity.Length]; int[] Quantitys = new int[BeforeQuantity.Length];
@ -329,10 +347,14 @@
} }
finallyQuantity.Add(Quantitys); finallyQuantity.Add(Quantitys);
logger.Info($"Quantity{string.Join(",", Quantitys)}"); logger.Info($"Quantity{string.Join(",", Quantitys)}");
channels.ForEach(cl => if (!BeforeQuantity.SequenceEqual(AfterQuantity))
{
channels.ForEach(cl =>
{ {
cl.TakeQuantity = this.BeforeQuantity[cl.ColNo - 1] - this.AfterQuantity[cl.ColNo - 1]; cl.TakeQuantity = this.BeforeQuantity[cl.ColNo - 1] - this.AfterQuantity[cl.ColNo - 1];
}); });
await InvokeAsync(StateHasChanged);
}
next(); next();
} }
} }
@ -357,8 +379,10 @@
this.status = 0; this.status = 0;
this.BeforeQuantity = new int[9]; this.BeforeQuantity = new int[9];
this.AfterQuantity = new int[9]; this.AfterQuantity = new int[9];
ColNos.Clear();
currentCol = 0;
InvokeAsync(StateHasChanged); // InvokeAsync(StateHasChanged);
} }
async Task TakeFinish() async Task TakeFinish()
@ -376,12 +400,12 @@
else else
{ {
// 判断是否为标签抽屉 // 判断是否为标签抽屉
if (setting.Value.label.Contains(this.drawerNo)) if (setting.Value.label != null && setting.Value.label.Contains(this.drawerNo))
{ {
//写标签数量 //写标签数量
channels.ForEach(async it => channels.Where(it => it.TakeQuantity > 0).ToList().ForEach(async it =>
{ {
await PortUtil.WriteQuantityMethod(it.Quantity + it.AddQuantity, it.DrawerNo, it.ColNo); await PortUtil.WriteQuantityMethod(it.Quantity - it.TakeQuantity, it.DrawerNo, it.ColNo);
}); });
} }
} }
@ -394,30 +418,35 @@
void Cancel() void Cancel()
{ {
this.status = 0; RestData();
} }
void SelectDrawer(int drawerNo) void SelectDrawer(int drawerNo)
{ {
this.drawerNo = drawerNo; this.drawerNo = drawerNo;
InvokeAsync(StateHasChanged);
grid.Reload(); grid.Reload();
} }
void OnCellClick(DataGridCellMouseEventArgs<ChannelStock> args) void OnCellClick(DataGridCellMouseEventArgs<ChannelStock> args)
{ {
if (args.Data.BoardType.ToString().Contains("3")) // if (args.Data.BoardType.ToString().Contains("3"))
// {
// //是药盒抽屉则点击行,打开对应行的药箱
// if (!ColNos.Contains(args.Data.ColNo))
// {
// ColNos.Add(args.Data.ColNo);
// }
// }
// else
// {
// grid.EditRow(args.Data);
// }
if (setting.Value.box.Contains(args.Data.DrawerNo) && status != 2)
{ {
//是药盒抽屉则点击行,打开对应行的药箱 PortUtil.SpeakAsync("请先点取药按钮打开抽屉");
if (!ColNos.Contains(args.Data.ColNo))
{
ColNos.Add(args.Data.ColNo);
}
}
else
{
grid.EditRow(args.Data);
} }
currentCol = args.Data.ColNo;
grid.EditRow(args.Data);
} }
private IDisposable? registration; private IDisposable? registration;
protected override void OnAfterRender(bool firstRender) protected override void OnAfterRender(bool firstRender)

View File

@ -248,9 +248,9 @@
if(!string.IsNullOrEmpty(drugInfo.DrugId)) if(!string.IsNullOrEmpty(drugInfo.DrugId))
{ {
//弹出确认提示框 //弹出确认提示框
var b = await dialogService.OpenAsync<ConfirmDialo>( var b = await dialogService.OpenAsync<ConfirmDialog>(
$"删除确认", $"删除确认",
new Dictionary<string, object>() { { "confirmInfo", "删除药品:"+drugInfo.DrugName } }, new Dictionary<string, object>() { { "confirmInfo", "确认要删除药品:"+drugInfo.DrugName+"吗?" } },
new DialogOptions() { Width = "45vw", Resizable = true, Draggable = true, ShowClose = false }); new DialogOptions() { Width = "45vw", Resizable = true, Draggable = true, ShowClose = false });
if(b) if(b)
{ {
@ -301,9 +301,9 @@
if (SelectedDrugs.FirstOrDefault().Manus.Contains(drugManuNo)) if (SelectedDrugs.FirstOrDefault().Manus.Contains(drugManuNo))
{ {
//弹出确认提示框 //弹出确认提示框
var b = await dialogService.OpenAsync<ConfirmDialo>( var b = await dialogService.OpenAsync<ConfirmDialog>(
$"确认删除", $"确认删除",
new Dictionary<string, object>() { { "confirmInfo", "删除批次:"+drugManuNo.ManuNo } }, new Dictionary<string, object>() { { "confirmInfo", "确认要删除批次:"+drugManuNo.ManuNo+"吗?" } },
new DialogOptions() { Width = "45vw", Resizable = true, Draggable = true, ShowClose = false } new DialogOptions() { Width = "45vw", Resizable = true, Draggable = true, ShowClose = false }
); );
if(b) if(b)

View File

@ -0,0 +1,135 @@
@page "/EditPasswordDialog"
@using MasaBlazorApp3.Pojo.Config;
@using MasaBlazorApp3.Pojo.Vo;
@using MasaBlazorApp3.Util;
@using Microsoft.Extensions.Options;
@using Newtonsoft.Json;
@using log4net;
<style>
.rz-dialog-content {
padding: 0 !important;
}
</style>
<RadzenRow Gap="0" Style="overflow: hidden;width:100%;height:100%">
<RadzenColumn Size="12" SizeMD="5">
<RadzenCard class="rz-shadow-0 rz-border-radius-0 rz-text-align-center rz-p-12 align-items-center justify-content-center" Style="height: 100%; background: var(--rz-primary-light) no-repeat 100% 70% fixed url('data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTIwNCIgaGVpZ2h0PSIxNDU4IiB2aWV3Qm94PSIwIDAgMTIwNCAxNDU4IiBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgo8ZyBvcGFjaXR5PSIwLjUiIGZpbHRlcj0idXJsKCNmaWx0ZXIwX2ZfNDkzXzEwMTM0KSI+CjxjaXJjbGUgY3g9IjcyMi4xMjgiIGN5PSI4MzkuMDIiIHI9IjQ4MS40MTkiIGZpbGw9InVybCgjcGFpbnQwX3JhZGlhbF80OTNfMTAxMzQpIi8+CjwvZz4KPGcgb3BhY2l0eT0iMC41IiBmaWx0ZXI9InVybCgjZmlsdGVyMV9mXzQ5M18xMDEzNCkiPgo8Y2lyY2xlIGN4PSI0NzAuMzMzIiBjeT0iNTcwLjMzMyIgcj0iNDcwLjMzMyIgZmlsbD0idXJsKCNwYWludDFfcmFkaWFsXzQ5M18xMDEzNCkiLz4KPC9nPgo8ZyBvcGFjaXR5PSIwLjUiIGZpbHRlcj0idXJsKCNmaWx0ZXIyX2ZfNDkzXzEwMTM0KSI+CjxjaXJjbGUgY3g9IjY5MS41MTEiIGN5PSI1MjIuMjk3IiByPSIzMzEuNTAzIiBmaWxsPSJ1cmwoI3BhaW50Ml9yYWRpYWxfNDkzXzEwMTM0KSIvPgo8L2c+CjxnIG9wYWNpdHk9IjAuNSIgZmlsdGVyPSJ1cmwoI2ZpbHRlcjNfZl80OTNfMTAxMzQpIj4KPGNpcmNsZSBjeD0iNjA4LjI0NCIgY3k9IjEwNzkuOTciIHI9IjMzMS41MDMiIHRyYW5zZm9ybT0icm90YXRlKC04MS4yMjQ0IDYwOC4yNDQgMTA3OS45NykiIGZpbGw9InVybCgjcGFpbnQzX3JhZGlhbF80OTNfMTAxMzQpIi8+CjwvZz4KPGRlZnM+CjxmaWx0ZXIgaWQ9ImZpbHRlcjBfZl80OTNfMTAxMzQiIHg9IjE0MC43MDkiIHk9IjI1Ny42MDEiIHdpZHRoPSIxMTYyLjg0IiBoZWlnaHQ9IjExNjIuODQiIGZpbHRlclVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KPGZlRmxvb2QgZmxvb2Qtb3BhY2l0eT0iMCIgcmVzdWx0PSJCYWNrZ3JvdW5kSW1hZ2VGaXgiLz4KPGZlQmxlbmQgbW9kZT0ibm9ybWFsIiBpbj0iU291cmNlR3JhcGhpYyIgaW4yPSJCYWNrZ3JvdW5kSW1hZ2VGaXgiIHJlc3VsdD0ic2hhcGUiLz4KPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iNTAiIHJlc3VsdD0iZWZmZWN0MV9mb3JlZ3JvdW5kQmx1cl80OTNfMTAxMzQiLz4KPC9maWx0ZXI+CjxmaWx0ZXIgaWQ9ImZpbHRlcjFfZl80OTNfMTAxMzQiIHg9Ii0xMDAiIHk9IjAiIHdpZHRoPSIxMTQwLjY3IiBoZWlnaHQ9IjExNDAuNjciIGZpbHRlclVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KPGZlRmxvb2QgZmxvb2Qtb3BhY2l0eT0iMCIgcmVzdWx0PSJCYWNrZ3JvdW5kSW1hZ2VGaXgiLz4KPGZlQmxlbmQgbW9kZT0ibm9ybWFsIiBpbj0iU291cmNlR3JhcGhpYyIgaW4yPSJCYWNrZ3JvdW5kSW1hZ2VGaXgiIHJlc3VsdD0ic2hhcGUiLz4KPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iNTAiIHJlc3VsdD0iZWZmZWN0MV9mb3JlZ3JvdW5kQmx1cl80OTNfMTAxMzQiLz4KPC9maWx0ZXI+CjxmaWx0ZXIgaWQ9ImZpbHRlcjJfZl80OTNfMTAxMzQiIHg9IjI2MC4wMDgiIHk9IjkwLjc5MzkiIHdpZHRoPSI4NjMuMDA2IiBoZWlnaHQ9Ijg2My4wMDYiIGZpbHRlclVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KPGZlRmxvb2QgZmxvb2Qtb3BhY2l0eT0iMCIgcmVzdWx0PSJCYWNrZ3JvdW5kSW1hZ2VGaXgiLz4KPGZlQmxlbmQgbW9kZT0ibm9ybWFsIiBpbj0iU291cmNlR3JhcGhpYyIgaW4yPSJCYWNrZ3JvdW5kSW1hZ2VGaXgiIHJlc3VsdD0ic2hhcGUiLz4KPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iNTAiIHJlc3VsdD0iZWZmZWN0MV9mb3JlZ3JvdW5kQmx1cl80OTNfMTAxMzQiLz4KPC9maWx0ZXI+CjxmaWx0ZXIgaWQ9ImZpbHRlcjNfZl80OTNfMTAxMzQiIHg9IjE3Ni42OTQiIHk9IjY0OC40MjMiIHdpZHRoPSI4NjMuMSIgaGVpZ2h0PSI4NjMuMSIgZmlsdGVyVW5pdHM9InVzZXJTcGFjZU9uVXNlIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgo8ZmVGbG9vZCBmbG9vZC1vcGFjaXR5PSIwIiByZXN1bHQ9IkJhY2tncm91bmRJbWFnZUZpeCIvPgo8ZmVCbGVuZCBtb2RlPSJub3JtYWwiIGluPSJTb3VyY2VHcmFwaGljIiBpbjI9IkJhY2tncm91bmRJbWFnZUZpeCIgcmVzdWx0PSJzaGFwZSIvPgo8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSI1MCIgcmVzdWx0PSJlZmZlY3QxX2ZvcmVncm91bmRCbHVyXzQ5M18xMDEzNCIvPgo8L2ZpbHRlcj4KPHJhZGlhbEdyYWRpZW50IGlkPSJwYWludDBfcmFkaWFsXzQ5M18xMDEzNCIgY3g9IjAiIGN5PSIwIiByPSIxIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgZ3JhZGllbnRUcmFuc2Zvcm09InRyYW5zbGF0ZSg3MjIuMTI4IDgzOS4wMikgcm90YXRlKDkwKSBzY2FsZSg0ODEuNDE5KSI+CjxzdG9wIHN0b3AtY29sb3I9IiNGRjFBNkMiLz4KPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjRkYxQTZDIiBzdG9wLW9wYWNpdHk9IjAiLz4KPC9yYWRpYWxHcmFkaWVudD4KPHJhZGlhbEdyYWRpZW50IGlkPSJwYWludDFfcmFkaWFsXzQ5M18xMDEzNCIgY3g9IjAiIGN5PSIwIiByPSIxIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgZ3JhZGllbnRUcmFuc2Zvcm09InRyYW5zbGF0ZSg0NzAuMzMzIDU3MC4zMzMpIHJvdGF0ZSg5MCkgc2NhbGUoNDcwLjMzMykiPgo8c3RvcCBzdG9wLWNvbG9yPSIjM0FBQ0ZGIi8+CjxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iIzNBOTVGRiIgc3RvcC1vcGFjaXR5PSIwIi8+CjwvcmFkaWFsR3JhZGllbnQ+CjxyYWRpYWxHcmFkaWVudCBpZD0icGFpbnQyX3JhZGlhbF80OTNfMTAxMzQiIGN4PSIwIiBjeT0iMCIgcj0iMSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIGdyYWRpZW50VHJhbnNmb3JtPSJ0cmFuc2xhdGUoNjkxLjUxMSA1MjIuMjk3KSByb3RhdGUoOTApIHNjYWxlKDMzMS41MDMpIj4KPHN0b3Agc3RvcC1jb2xvcj0iIzQ4M0FGRiIvPgo8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiM0ODNBRkYiIHN0b3Atb3BhY2l0eT0iMCIvPgo8L3JhZGlhbEdyYWRpZW50Pgo8cmFkaWFsR3JhZGllbnQgaWQ9InBhaW50M19yYWRpYWxfNDkzXzEwMTM0IiBjeD0iMCIgY3k9IjAiIHI9IjEiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiBncmFkaWVudFRyYW5zZm9ybT0idHJhbnNsYXRlKDYwOC4yNDQgMTA3OS45Nykgcm90YXRlKDkwKSBzY2FsZSgzMzEuNTAzKSI+CjxzdG9wIHN0b3AtY29sb3I9IiNGRkM4M0EiLz4KPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjRkZDODNBIiBzdG9wLW9wYWNpdHk9IjAiLz4KPC9yYWRpYWxHcmFkaWVudD4KPC9kZWZzPgo8L3N2Zz4K')">
@if (userI == 1)
{
<RadzenText TextStyle="TextStyle.H6" class="rz-color-white">操作人 @globalStateService.Operator?.NickName 修改密码</RadzenText>
}
else if (userI == 2)
{
<RadzenText TextStyle="TextStyle.H6" class="rz-color-white">复核人 @globalStateService.Reviewer?.NickName 修改密码</RadzenText>
}
</RadzenCard>
</RadzenColumn>
<RadzenColumn Size="12" SizeMD="7">
<RadzenCard Class="rz-shadow-0 rz-border-radius-0 rz-p-12" Style="width:100%;height:100%">
<RadzenText TextStyle="TextStyle.H5" TagName="TagName.H2" class="rz-mb-6">
登录
</RadzenText>
<RadzenTemplateForm Data="@loginModel" Submit="@((Pojo.User args) => { Submit(args); })" Style="width:100%;height:100%">
<div class="rz-form-row">
<label class="rz-label" for="username">原密码</label>
<div class="rz-form-input-wrapper">
<RadzenTextBox id="username" Name="Username" @bind-Value="@loginModel.OldPassword" Style="width:100%" />
<RadzenRequiredValidator Component="Username" Text="请填写原密码" />
</div>
</div>
<div class="rz-form-row">
<label class="rz-label" for="password">新密码</label>
<div class="rz-form-input-wrapper">
<RadzenPassword id="password" Name="Password" @bind-Value="@loginModel.Password" Style="width:100%" />
<RadzenRequiredValidator Component="Password" Text="请填新密码" />
</div>
</div>
<div class="rz-form-row">
<label class="rz-label"></label>
<div class="rz-form-input-wrapper rz-login-buttons">
<RadzenButton Style="background:#255dd4;color:white;width:110px" ButtonType="ButtonType.Submit" Text="确定" />
<RadzenButton Style="border-color:#255dd4;width:110px" Variant="Variant.Outlined" Text="取消" Click="@Exit" />
</div>
</div>
</RadzenTemplateForm>
</RadzenCard>
</RadzenColumn>
</RadzenRow>
@code {
@inject NotificationService _message
@inject GlobalStateService globalStateService;
@inject IUserDao userDao;
@inject Radzen.DialogService dialogService;
private Pojo.User loginModel = new();
private readonly ILog logger = LogManager.GetLogger(typeof(LoginDialog));
[Parameter] public int userI { get; set; }
private void Submit(Pojo.User user)
{
if (userI == 1)
{
user.Username = globalStateService.Operator.Username;
}
else if (userI == 2)
{
user.Username = globalStateService.Reviewer.Username;
}
else
{
return;
}
Pojo.User u = userDao.GetByUsername(loginModel.Username);
if (u != null)
{
if (Util.MD5.GetMD5Hash(loginModel.OldPassword).ToLower().Equals(u.Password))
{
bool iRet=userDao.UpdateUserPassword(u);
if (iRet)
{
_message.Notify(new NotificationMessage { Severity = NotificationSeverity.Error, Summary = "提示", Detail = $"修改完成,退出后登录请使用新密码", Duration = 4000 });
logger.Error($"{loginModel.Username}修改密码失败,数据{JsonConvert.SerializeObject(u)}");
// 关闭弹窗
dialogService.Close(false);
}
else
{
_message.Notify(new NotificationMessage { Severity = NotificationSeverity.Error, Summary = "提示", Detail = $"修改失败", Duration = 4000 });
logger.Error($"{loginModel.Username}修改密码失败,数据{JsonConvert.SerializeObject(u)}");
// 关闭弹窗
dialogService.Close(false);
}
}
else
{
_message.Notify(
new NotificationMessage { Severity = NotificationSeverity.Error, Summary = "提示", Detail = $"原密码错误", Duration = 4000 }
);
logger.Info($"用户【{u.Username}】修改密码,原密码输入错误");
}
}
else
{
_message.Notify(
new NotificationMessage { Severity = NotificationSeverity.Error, Summary = "提示", Detail = $"无此用户", Duration = 4000 }
);
logger.Info($"修改密码没有用户:【{loginModel.Username}】");
}
}
//修改密码
private void UpdateUserPassword(Pojo.User user)
{
//退出后登录请使用新密码
}
private void Exit()
{
dialogService.Close(false);
}
}

View File

@ -1,43 +1,43 @@
@page "/home" @page "/"
@using MasaBlazorApp3.Util @using MasaBlazorApp3.Util
@using log4net @using log4net
@layout EmptyLayout @layout EmptyLayout
<style> <style>
.home-menu{ .home-menu {
transition: box-shadow 0.3s ease; /* 平滑过渡阴影效果 */ transition: box-shadow 0.3s ease; /* 平滑过渡阴影效果 */
cursor: pointer; cursor: pointer;
position: relative; position: relative;
z-index: 1; z-index: 1;
box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.7); box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.7);
} }
.home-menu>h2{ .home-menu > h2 {
font-weight: bold; font-weight: bold;
} }
.home-menu:hover { .home-menu:hover {
box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.7); /* 阴影效果 */ box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.7); /* 阴影效果 */
} }
.mask { .mask {
position: absolute; position: absolute;
top: 0; top: 0;
left: 0; left: 0;
width: 100%; width: 100%;
height: 100%; height: 100%;
background-color: black; background-color: black;
opacity: 0.6; opacity: 0.6;
z-index: 2; z-index: 2;
cursor: not-allowed; cursor: not-allowed;
} }
.rz-gauge .rz-tick-text { .rz-gauge .rz-tick-text {
fill: #ffffff !important; fill: #ffffff !important;
} }
</style> </style>
<RadzenStack Orientation="Orientation.Vertical" class="rz-background-color-primary-light" AlignItems="AlignItems.Center" Style="width:100vw;height:100vh" Gap="0"> <RadzenStack Orientation="Orientation.Vertical" class="rz-background-color-primary-light" AlignItems="AlignItems.Center" Style="width:100vw;height:100vh" Gap="0">
<RadzenRow Style="width:100vw;height:25vh;" Gap="0" RowGap="0"> <RadzenRow Style="width:100vw;height:25vh;" Gap="0" RowGap="0">
<RadzenColumn Size="4"> <RadzenColumn Size="4">
@ -46,11 +46,16 @@
<RadzenColumn Size="8"> <RadzenColumn Size="8">
<RadzenRow Style="height: 100%;width:100%" Orientation="Orientation.Horizontal" JustifyContent="JustifyContent.End" AlignItems="AlignItems.Center"> <RadzenRow Style="height: 100%;width:100%" Orientation="Orientation.Horizontal" JustifyContent="JustifyContent.End" AlignItems="AlignItems.Center">
<RadzenColumn Size="3"> <RadzenColumn Size="3">
@if (globalStateService.Operator != null)
<RadzenText Style="" class="rz-color-white" TextStyle="TextStyle.H5" TextAlign="TextAlign.Center">操作人:@Operator.NickName</RadzenText>
@if (Reviewer != null)
{ {
<RadzenText Style="" class="rz-color-white" TextStyle="TextStyle.H5" TextAlign="TextAlign.Center">复核人:@Reviewer.NickName</RadzenText> //<RadzenText Style="" class="rz-color-white" TextStyle="TextStyle.H5" TextAlign="TextAlign.Center">操作人:@globalStateService.Operator.NickName</RadzenText>
<RadzenText onclick="@(()=>{EditPassword(1);})" Style="" class="rz-color-white" TextStyle="TextStyle.H5" TextAlign="TextAlign.Center">操作人:@globalStateService.Operator.NickName</RadzenText>
}
@if (globalStateService.Reviewer != null)
{
//<RadzenText Style="" class="rz-color-white" TextStyle="TextStyle.H5" TextAlign="TextAlign.Center">复核人:@globalStateService.Reviewer.NickName</RadzenText>
<RadzenText onclick="@(()=>{EditPassword(2);})" Style="" class="rz-color-white" TextStyle="TextStyle.H5" TextAlign="TextAlign.Center">复核人:@globalStateService.Reviewer.NickName</RadzenText>
} }
</RadzenColumn> </RadzenColumn>
<RadzenColumn Size="3"> <RadzenColumn Size="3">
@ -64,51 +69,66 @@
<RadzenStack Style="height: 100%;width:41%" Gap="20"> <RadzenStack Style="height: 100%;width:41%" Gap="20">
<RadzenStack class="home-menu rz-background-color-info-lighter rz-ripple" JustifyContent="JustifyContent.Center" Style="height: 50%" @onclick="@(() => jump2Page(1))"> <RadzenStack class="home-menu rz-background-color-info-lighter rz-ripple" JustifyContent="JustifyContent.Center" Style="height: 50%" @onclick="@(() => jump2Page(1))">
<RadzenText Style="" class="rz-color-white" TextStyle="TextStyle.H2" TextAlign="TextAlign.Center" >出库</RadzenText> <RadzenText Style="" class="rz-color-white" TextStyle="TextStyle.H2" TextAlign="TextAlign.Center">出库</RadzenText>
@if (!Operator.role.permissionIds.Any(id => id - 10 < 10)) @if (globalStateService.Operator != null)
{ {
<div class="mask"> @if (!globalStateService.Operator.role.permissionIds.Any(id => id - 10 < 10))
<RadzenImage Path="images/no_auth.png" /> {
</div> <div class="mask">
<RadzenImage Path="images/no_auth.png" />
</div>
}
} }
</RadzenStack> </RadzenStack>
<RadzenStack class="home-menu rz-background-color-success-light rz-text-white rz-ripple" JustifyContent="JustifyContent.Center" @onclick="@(() => jump2Page(2))" Style="height: 50%"> <RadzenStack class="home-menu rz-background-color-success-light rz-text-white rz-ripple" JustifyContent="JustifyContent.Center" @onclick="@(() => jump2Page(2))" Style="height: 50%">
<RadzenText class="rz-color-white" TextStyle="TextStyle.H2" TextAlign="TextAlign.Center">入库</RadzenText> <RadzenText class="rz-color-white" TextStyle="TextStyle.H2" TextAlign="TextAlign.Center">入库</RadzenText>
@if (!Operator.role.permissionIds.Any(id => id - 20 > 0 && id - 20 < 10)) @if (globalStateService.Operator != null)
{ {
<div class="mask"> @if (!globalStateService.Operator.role.permissionIds.Any(id => id - 20 > 0 && id - 20 < 10))
<RadzenImage Path="images/no_auth.png" /> {
</div> <div class="mask">
<RadzenImage Path="images/no_auth.png" />
</div>
}
} }
</RadzenStack> </RadzenStack>
</RadzenStack> </RadzenStack>
<RadzenStack Style="height: 100%;width:59%" Gap="20"> <RadzenStack Style="height: 100%;width:59%" Gap="20">
<RadzenStack class="home-menu rz-background-color-series-2 rz-text-white rz-ripple" JustifyContent="JustifyContent.Center" @onclick="@(() => jump2Page(3))" Style="height: 43%;width:100%"> <RadzenStack class="home-menu rz-background-color-series-2 rz-text-white rz-ripple" JustifyContent="JustifyContent.Center" @onclick="@(() => jump2Page(3))" Style="height: 43%;width:100%">
<RadzenText class="rz-color-white" TextStyle="TextStyle.H2" TextAlign="TextAlign.Center">归还</RadzenText> <RadzenText class="rz-color-white" TextStyle="TextStyle.H2" TextAlign="TextAlign.Center">归还</RadzenText>
@if (!Operator.role.permissionIds.Any(id => id - 30 > 0 && id - 30 < 10)) @if (globalStateService.Operator != null)
{ {
<div class="mask"> @if (!globalStateService.Operator.role.permissionIds.Any(id => id - 30 > 0 && id - 30 < 10))
<RadzenImage Path="images/no_auth.png" />
</div>
}
</RadzenStack>
<RadzenStack Orientation="Orientation.Horizontal" Style="height: 57%;width:100%">
<RadzenStack class="home-menu rz-background-color-primary rz-text-white rz-ripple" JustifyContent="JustifyContent.Center" @onclick="@(() => jump2Page(4))" Style="height: 100%;width:50%">
<RadzenText class="rz-color-white" TextStyle="TextStyle.H2" TextAlign="TextAlign.Center">库存管理</RadzenText>
@if (!Operator.role.permissionIds.Any(id => id - 40 > 0 && id - 40 < 10))
{ {
<div class="mask"> <div class="mask">
<RadzenImage Path="images/no_auth.png" /> <RadzenImage Path="images/no_auth.png" />
</div> </div>
} }
}
</RadzenStack>
<RadzenStack Orientation="Orientation.Horizontal" Style="height: 57%;width:100%">
<RadzenStack class="home-menu rz-background-color-primary rz-text-white rz-ripple" JustifyContent="JustifyContent.Center" @onclick="@(() => jump2Page(4))" Style="height: 100%;width:50%">
<RadzenText class="rz-color-white" TextStyle="TextStyle.H2" TextAlign="TextAlign.Center">库存管理</RadzenText>
@if (globalStateService.Operator != null)
{
@if (!globalStateService.Operator.role.permissionIds.Any(id => id - 40 > 0 && id - 40 < 10))
{
<div class="mask">
<RadzenImage Path="images/no_auth.png" />
</div>
}
}
</RadzenStack> </RadzenStack>
<RadzenStack class="home-menu rz-background-color-success-lighter rz-text-white rz-ripple" JustifyContent="JustifyContent.Center" @onclick="@(() => jump2Page(5))" Style="height: 100%;width:50%"> <RadzenStack class="home-menu rz-background-color-success-lighter rz-text-white rz-ripple" JustifyContent="JustifyContent.Center" @onclick="@(() => jump2Page(5))" Style="height: 100%;width:50%">
<RadzenText class="rz-color-white" TextStyle="TextStyle.H2" TextAlign="TextAlign.Center">系统设置</RadzenText> <RadzenText class="rz-color-white" TextStyle="TextStyle.H2" TextAlign="TextAlign.Center">系统设置</RadzenText>
@if (!Operator.role.permissionIds.Any(id => id - 50 > 0 && id - 50 < 10)) @if (globalStateService.Operator != null)
{ {
<div class="mask"> @if (!globalStateService.Operator.role.permissionIds.Any(id => id - 50 > 0 && id - 50 < 10))
<RadzenImage Path="images/no_auth.png" /> {
</div> <div class="mask">
<RadzenImage Path="images/no_auth.png" />
</div>
}
} }
</RadzenStack> </RadzenStack>
@ -119,12 +139,12 @@
@code { @code {
@inject Radzen.DialogService dialogService;
@inject NotificationService _message
@inject NavigationManager na; @inject NavigationManager na;
@inject TooltipService tooltipService @inject TooltipService tooltipService
private List<Premission> userPremissions { get; set; } = new(); private List<Premission> userPremissions { get; set; } = new();
@inject GlobalStateService globalStateService; @inject GlobalStateService globalStateService;
Pojo.User Operator;
Pojo.User Reviewer;
Timer timer; Timer timer;
@inject PortUtil _portUtil; @inject PortUtil _portUtil;
@ -134,11 +154,6 @@
protected override void OnInitialized() protected override void OnInitialized()
{ {
Operator = globalStateService.Operator;
Reviewer = globalStateService.Reviewer;
// timer = new Timer(state => // timer = new Timer(state =>
// { // {
// var now = DateTime.Now; // var now = DateTime.Now;
@ -154,7 +169,7 @@
{ {
if (globalStateService.Operator == null || !currentPage) if (globalStateService.Operator == null || !currentPage)
{ {
logger.Info($"Home页自动退出循环停止{globalStateService.Operator==null},{!currentPage}"); logger.Info($"Home页自动退出循环停止{globalStateService.Operator == null},{!currentPage}");
stop(); stop();
} }
else else
@ -167,10 +182,9 @@
// 无人操作鼠标键盘 // 无人操作鼠标键盘
if ((DateTime.Now - _portUtil.dateTime).TotalSeconds > setting.Value.autoOutLog && CheckComputerFreeState.GetLastInputTime() > setting.Value.autoOutLog) if ((DateTime.Now - _portUtil.dateTime).TotalSeconds > setting.Value.autoOutLog && CheckComputerFreeState.GetLastInputTime() > setting.Value.autoOutLog)
{ {
logger.Info($"设备{setting.Value.autoOutLog}内无人操作,用户【{Operator?.NickName}】自动退出登录,_portUtil.Operate:{_portUtil.Operate},totalSecond:{(DateTime.Now - _portUtil.dateTime).TotalSeconds},lastInputTime:{CheckComputerFreeState.GetLastInputTime()},autoOutLog:{setting.Value.autoOutLog}"); logger.Info($"设备{setting.Value.autoOutLog}内无人操作,用户【{globalStateService.Operator?.NickName}】自动退出登录,_portUtil.Operate:{_portUtil.Operate},totalSecond:{(DateTime.Now - _portUtil.dateTime).TotalSeconds},lastInputTime:{CheckComputerFreeState.GetLastInputTime()},autoOutLog:{setting.Value.autoOutLog}");
globalStateService.Operator = null; globalStateService.Operator = null;
globalStateService.Reviewer = null; globalStateService.Reviewer = null;
na.NavigateTo("");
stop(); stop();
} }
else else
@ -199,22 +213,83 @@
timer?.Dispose(); timer?.Dispose();
} }
void jump2Page(int parentId) async void init()
{ {
List<int> childrenIds = Operator.role.permissionIds.Where(id => id - (parentId * 10) > 0 && id - (parentId * 10) < 10).ToList(); var b = await dialogService.OpenAsync<InitPage>(
if(childrenIds.Count > 0) $"调拨入库详情",
new Dictionary<string, object>() { },
new DialogOptions() { ShowTitle = false, Style = "min-height:auto;min-width:auto;width:auto", CloseDialogOnEsc = false, Resizable = true, Draggable = true, ShowClose = false }
);
}
protected override async Task OnAfterRenderAsync(bool firstRender)
{
base.OnAfterRender(firstRender);
if (firstRender && !globalStateService.isInit)
{ {
childrenIds.Sort(); this.init();
int minId = childrenIds[0]; }
string path = new Premission().getAdminPremission().Find(p => p.Id == parentId).Items.ToList().Find(p2 => p2.Id == minId).PremissionPath; }
na.NavigateTo(path);
currentPage = false;
async void jump2Page(int parentId)
{
bool a = globalStateService.Operator != null;
if (!a)
{
a = await dialogService.OpenAsync<LoginDialog>(
"",
null,
new DialogOptions() { Width = "55vw", Resizable = false, Draggable = false, ShowClose = false, ShowTitle = false });
}
if (a)
{
List<int> childrenIds = globalStateService.Operator.role.permissionIds.Where(id => id - (parentId * 10) > 0 && id - (parentId * 10) < 10).ToList();
if (childrenIds.Count > 0)
{
currentPage = false;
childrenIds.Sort();
int minId = childrenIds[0];
string path = new Premission().getAdminPremission().Find(p => p.Id == parentId).Items.ToList().Find(p2 => p2.Id == minId).PremissionPath;
na.NavigateTo(path);
}
else
{
_message.Notify(
new NotificationMessage { Severity = NotificationSeverity.Error, Summary = "提示", Detail = $"没有权限不能访问", Duration = 3000 }
);
await InvokeAsync(StateHasChanged);
}
} }
} }
void logout() void logout()
{ {
globalStateService.Operator = null; if (globalStateService.Operator != null)
globalStateService.Reviewer = null; {
na.NavigateTo(""); globalStateService.Operator = null;
globalStateService.Reviewer = null;
}
else
{
Environment.Exit(0);
}
}
//修改密码
async void EditPassword(int i)
{
if(i==1)
{
//修改操作人
await dialogService.OpenAsync<EditPasswordDialog>(
"",
null,
new DialogOptions() { Width = "55vw", Resizable = false, Draggable = false, ShowClose = false, ShowTitle = false });
}
else if(i==2)
{
//修改复核人
}
} }
} }

View File

@ -1,4 +1,4 @@
@page "/" @page "/login"
@layout EmptyLayout @layout EmptyLayout
@using System.ComponentModel; @using System.ComponentModel;

View File

@ -0,0 +1,110 @@
@page "/init"
@using MasaBlazorApp3.Pojo.Config;
@using MasaBlazorApp3.Pojo.Vo;
@using MasaBlazorApp3.Util;
@using Microsoft.Extensions.Options;
@using Newtonsoft.Json;
@using log4net;
<RadzenStack AlignItems="AlignItems.Center" Gap="2rem" class="rz-p-12">
<RadzenImage Path="images/community.svg" Style="width: 200px;" AlternateText="community" />
<RadzenText TextStyle="TextStyle.H6">加载程序必要连接中,请稍等。。。</RadzenText>
<RadzenText TextStyle="TextStyle.H6">@msg</RadzenText>
<RadzenText TextStyle="TextStyle.H6">@errMsg</RadzenText>
</RadzenStack>
@code {
@inject Radzen.DialogService dialogService;
@inject IOptions<DrawerConfig> setting;
@inject NotificationService _message;
@inject PortUtil PortUtil;
@inject FingerprintUtil FingerprintUtil;
@inject GlobalStateService globalStateService;
string msg;
string errMsg;
private readonly ILog logger = LogManager.GetLogger(typeof(InitPage));
protected override async Task OnInitializedAsync()
{
base.OnInitializedAsync();
}
protected override async Task OnAfterRenderAsync(bool firstRender)
{
base.OnAfterRender(firstRender);
if (firstRender)
{
await Task.Delay(15);
msg = "开始连接指纹模块";
InvokeAsync(StateHasChanged);
try
{
await FingerprintUtil.ConnectionMain();
msg = "指纹模块连接成功";
InvokeAsync(StateHasChanged);
} catch (Exception e)
{
msg = "指纹模块连接失败";
errMsg += "【指纹模块连接失败】";
InvokeAsync(StateHasChanged);
}
await Task.Delay(500);
msg = "开始连接抽屉串口";
InvokeAsync(StateHasChanged);
try
{
PortUtil.drawerSerial.Open();
logger.Info($"抽屉串口打开结果【{PortUtil.drawerSerial.IsOpen}】");
msg = "抽屉串口连接成功";
InvokeAsync(StateHasChanged);
} catch (Exception e)
{
msg = "抽屉串口连接失败";
errMsg += "【抽屉串口连接失败】";
InvokeAsync(StateHasChanged);
}
await Task.Delay(500);
msg = "开始连接CanBus模块";
InvokeAsync(StateHasChanged);
try
{
PortUtil.canBusSerial.Open();
logger.Info($"CanBus模块打开结果【{PortUtil.canBusSerial.IsOpen}】");
msg = "CanBus模块连接成功";
InvokeAsync(StateHasChanged);
} catch (Exception e)
{
msg = "CanBus模块连接失败";
errMsg += "【CanBus模块连接失败】";
InvokeAsync(StateHasChanged);
}
await Task.Delay(500);
msg = "开始连接条码扫描模块";
InvokeAsync(StateHasChanged);
try
{
PortUtil.scanCodeSerial.Open();
logger.Info($"条码扫描模块打开结果【{PortUtil.scanCodeSerial.IsOpen}】");
msg = "条码扫描模块连接成功";
InvokeAsync(StateHasChanged);
} catch (Exception e)
{
msg = "条码扫描模块连接失败";
errMsg += "【条码扫描模块连接失败】";
InvokeAsync(StateHasChanged);
}
globalStateService.isInit = true;
dialogService.Close();
}
}
}

View File

@ -16,41 +16,41 @@
</RadzenStack> </RadzenStack>
<RadzenStack> <RadzenStack>
<RadzenDataGrid @ref="grid" Data="@data" ExpandMode="DataGridExpandMode.Multiple" <RadzenDataGrid @ref="grid" Data="@data" ExpandMode="DataGridExpandMode.Multiple"
RowRender="@RowRender" RowRender="@RowRender"
EmptyText="无数据" AllowAlternatingRows="false"> EmptyText="无数据" AllowAlternatingRows="false">
<Template Context="di"> <Template Context="di">
<RadzenDataGrid Data="@di.ChannelStocks" EmptyText="无数据" @ref="di.Grid" <RadzenDataGrid Data="@di.ChannelStocks" EmptyText="无数据" @ref="di.Grid"
CellClick="@((DataGridCellMouseEventArgs<ChannelStock> args) => OnCellClick(args, di.Grid))"> CellClick="@((DataGridCellMouseEventArgs<ChannelStock> args) => OnCellClick(args, di.Grid))">
<Columns> <Columns>
<RadzenDataGridColumn Title="库位" Property="DrawerNo"> <RadzenDataGridColumn Title="库位" Property="DrawerNo">
<Template Context="s"> <Template Context="s">
@s.DrawerNo - @s.ColNo @s.DrawerNo - @s.ColNo
</Template> </Template>
</RadzenDataGridColumn> </RadzenDataGridColumn>
<RadzenDataGridColumn Title="库存" Property="Quantity"></RadzenDataGridColumn> <RadzenDataGridColumn Title="库存" Property="Quantity"></RadzenDataGridColumn>
@* <RadzenDataGridColumn Title="批次" Property="ManuNo"></RadzenDataGridColumn> @* <RadzenDataGridColumn Title="批次" Property="ManuNo"></RadzenDataGridColumn>
<RadzenDataGridColumn Title="效期" Property="EffDate"></RadzenDataGridColumn> *@ <RadzenDataGridColumn Title="效期" Property="EffDate"></RadzenDataGridColumn> *@
<RadzenDataGridColumn Title="入库数量" Property="AddQuantity"> <RadzenDataGridColumn Title="入库数量" Property="AddQuantity">
<EditTemplate Context="cs"> <EditTemplate Context="cs">
<RadzenNumeric Disabled="status > 0" Style="display: block" Min="0" Max="@di.Quantity" Name="Quantity" @bind-Value=@cs.AddQuantity /> <RadzenNumeric Disabled="status > 0" Style="display: block" Min="0" Max="@di.Quantity" Name="Quantity" @bind-Value=@cs.AddQuantity />
<RadzenNumericRangeValidator Style="position: absolute;z-index: 9999;" Min="0" Max="@di.Quantity" Text="请填写正确的添加数量" Component="Quantity" /> <RadzenNumericRangeValidator Style="position: absolute;z-index: 9999;" Min="0" Max="@di.Quantity" Text="请填写正确的添加数量" Component="Quantity" />
<RadzenCustomValidator Validator="@(() => di.ChannelStocks.Sum(cs2 => cs2.AddQuantity) == di.Quantity)" Component="Quantity" Text="入库总量应等于请领数量" Style="position: absolute;z-index: 9999;" /> <RadzenCustomValidator Validator="@(() => di.ChannelStocks.Sum(cs2 => cs2.AddQuantity) == di.Quantity)" Component="Quantity" Text="入库总量应等于请领数量" Style="position: absolute;z-index: 9999;" />
</EditTemplate> </EditTemplate>
</RadzenDataGridColumn> </RadzenDataGridColumn>
</Columns> </Columns>
</RadzenDataGrid> </RadzenDataGrid>
</Template> </Template>
<Columns> <Columns>
<RadzenDataGridColumn Property="Drug.DrugName" Title="药品" /> <RadzenDataGridColumn Property="Drug.DrugName" Title="药品" />
<RadzenDataGridColumn Property="Drug.DrugSpec" Title="规格" /> <RadzenDataGridColumn Property="Drug.DrugSpec" Title="规格" />
<RadzenDataGridColumn Property="Invoice.DrugManuNo" Title="批次" /> <RadzenDataGridColumn Property="Invoice.DrugManuNo" Title="批次" />
<RadzenDataGridColumn Property="Invoice.EffDate" Title="效期" /> <RadzenDataGridColumn Property="Invoice.EffDate" Title="效期" />
<RadzenDataGridColumn Property="Quantity" Title="请领数量" /> <RadzenDataGridColumn Property="Quantity" Title="请领数量" />
<RadzenDataGridColumn Property="StockQuantity" Title="总库存" /> <RadzenDataGridColumn Property="StockQuantity" Title="总库存" />
</Columns> </Columns>
</RadzenDataGrid> </RadzenDataGrid>
@ -89,15 +89,23 @@
public List<InvoiceVo> data { get; set; } public List<InvoiceVo> data { get; set; }
//称重取药数量
int[] WeightFinnalQuantity { get; set; } = new int[] { 0, 0, 0, 0, 0, 0, 0, 0, 0 };
// 当前操作的库位号列表
public List<int> ColNos { get; set; } = new List<int>();
int currentCol = 0;
//开抽屉前操作标识
private List<string> _flagList = new List<string>();
async Task StartAdd() async Task StartAdd()
{ {
if(data.Any(it => it.Quantity != it.ChannelStocks.Sum(cs => cs.AddQuantity))) if (data.Any(it => it.Quantity != it.ChannelStocks.Sum(cs => cs.AddQuantity)))
{ {
_message.Notify( _message.Notify(
new NotificationMessage { Severity = NotificationSeverity.Error, Summary = "提示", Detail = $"请填写正确的入库数量!", Duration = 4000 } new NotificationMessage { Severity = NotificationSeverity.Error, Summary = "提示", Detail = $"请填写正确的入库数量!", Duration = 4000 }
); );
} else }
else
{ {
await OpenDrawer(); await OpenDrawer();
} }
@ -142,14 +150,35 @@
{ {
BeforeQuantity = new int[9]; BeforeQuantity = new int[9];
AfterQuantity = new int[9]; AfterQuantity = new int[9];
// 判断是否为单支抽屉 for (int j = 0; j < data[index].ChannelStocks.Count; j++)
if (setting.Value.single.Contains(drawerNo))
{ {
byte[] quantity = await PortUtil.CheckQuantityByDrawer(drawerNo); // _flagList.Add(flag);
BeforeQuantity = quantity.Select(it => Convert.ToInt32(it)).ToArray().Skip(3).Take(9).ToArray(); //单支-查数
logger.Info($"单支抽屉【{drawerNo}】,开抽屉前检测数量【{string.Join(",", BeforeQuantity)}】"); if (data[index].ChannelStocks[j].BoardType.ToString().Contains("2"))
{
byte[] quantity = await PortUtil.CheckQuantityByDrawer(data[index].ChannelStocks[j].DrawerNo);
BeforeQuantity = quantity.Select(it => Convert.ToInt32(it)).ToArray().Skip(3).Take(9).ToArray();
logger.Info($"单支抽屉【{drawerNo}】,开抽屉前检测数量【{string.Join(",", BeforeQuantity)}】");
await PortUtil.NoLightOnByCol(drawerNo, data.Select(ot => ot.ChannelStocks.Where(cs => cs.DrawerNo == drawerNo).Select(cs => cs.ColNo)).Cast<int>().ToArray()); await PortUtil.NoLightOnByCol(drawerNo, data.Select(ot => ot.ChannelStocks.Where(cs => cs.DrawerNo == drawerNo).Select(cs => cs.ColNo)).Cast<int>().ToArray());
}
//称重-查数
if (data[index].ChannelStocks[j].BoardType.ToString().Contains("6"))
{
PortUtil.DrawerNo = data[index].ChannelStocks[j].DrawerNo;// drawerNo;
PortUtil.ColNoLst.Add(data[index].ChannelStocks[j].ColNo);
BeforeQuantity[data[index].ChannelStocks[j].ColNo - 1] = await PortUtil.CheckQuantityForSingle(data[index].ChannelStocks[j].ColNo);
logger.Info($"称重抽屉【{data[index].ChannelStocks[j].DrawerNo}】,开抽屉前检测数量【{string.Join(",", BeforeQuantity)}】");
await Task.Delay(200);
}
//药盒-开药盒
if (data[index].ChannelStocks[j].BoardType.ToString().Contains("3"))
{
PortUtil.DrawerNo = data[index].ChannelStocks[j].DrawerNo;
await PortUtil.OpenBoxByColNo(data[index].ChannelStocks[j].ColNo);
await Task.Delay(200);
}
} }
var b = await PortUtil.OpenDrawerStatus(drawerNo); var b = await PortUtil.OpenDrawerStatus(drawerNo);
if (b) if (b)
@ -186,6 +215,80 @@
{ {
PortUtil.SpeakAsync($"加药完成,请,点击完成按钮进行确认"); PortUtil.SpeakAsync($"加药完成,请,点击完成按钮进行确认");
this.status = 2; this.status = 2;
string alertMessage = string.Empty;
bool cancelFlag = false;
for (int i = 0; i < data.Count; i++)
{
for (int j = 0; j < data[i].ChannelStocks.Count; j++)
{
string flag = "关" + data[i].ChannelStocks[j].DrawerNo.ToString() + data[i].ChannelStocks[j].ColNo.ToString();
if (!_flagList.Contains(flag))
{
_flagList.Add(flag);
//关闭抽屉后获取称重数量
PortUtil.DrawerNo = data[i].ChannelStocks[j].DrawerNo;// drawerNo;
// 判断是否为称重抽屉
//单支-查数
if (data[i].ChannelStocks[j].BoardType.ToString().Contains("6"))
{
PortUtil.ColNoLst = this.ColNos;
AfterQuantity[data[i].ChannelStocks[j].ColNo - 1] = await PortUtil.CheckQuantityForSingle(data[i].ChannelStocks[j].ColNo);
logger.Info($"称重抽屉,关抽屉后检测数量【{string.Join(",", AfterQuantity)}】");
WeightFinnalQuantity[data[i].ChannelStocks[j].ColNo - 1] = BeforeQuantity[data[i].ChannelStocks[j].ColNo - 1] - AfterQuantity[data[i].ChannelStocks[j].ColNo - 1];
if (data[i].Quantity != WeightFinnalQuantity[data[i].ChannelStocks[j].ColNo - 1])
{
//称重自动计数数量与实际要取数量不一致弹出提示,确认后保存数据
alertMessage += $"{data[i].Drug.DrugName}应取数量【{data[i].Quantity}】,实际取出数量【{WeightFinnalQuantity[data[i].ChannelStocks[j].ColNo - 1]}】";
}
}
//单支-查数
if (data[i].ChannelStocks[j].BoardType.ToString().Contains("2"))
{
byte[] quantity = await PortUtil.CheckQuantityByDrawer(drawerNo);
AfterQuantity = quantity.Select(it => Convert.ToInt32(it)).ToArray().Skip(3).Take(9).ToArray();
logger.Info($"单支抽屉,关抽屉后检测数量【{string.Join(",", AfterQuantity)}】");
WeightFinnalQuantity[data[i].ChannelStocks[j].ColNo - 1] = BeforeQuantity[data[i].ChannelStocks[j].ColNo - 1] - AfterQuantity[data[i].ChannelStocks[j].ColNo - 1];
if (data[i].Quantity != WeightFinnalQuantity[data[i].ChannelStocks[j].ColNo - 1])
{
alertMessage += $"{data[i].Drug.DrugName}应取数量【{data[i].ChannelStocks[j].Quantity}】,实际取出数量【{WeightFinnalQuantity[data[i].ChannelStocks[j].ColNo - 1]}】";
}
}
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 });
if (!confirm)
{
RestData();
logger.Info("取消保存");
cancelFlag = true;
break;
}
else
{
logger.Info(alertMessage);
}
alertMessage = string.Empty;
}
}
}
if (cancelFlag)
{
break;
}
}
stop(); stop();
} }
else else
@ -196,21 +299,21 @@
} }
else else
{ {
if (setting.Value.single.Contains(drawerNo)) // if (setting.Value.single.Contains(drawerNo))
{ // {
byte[] quantity = await PortUtil.CheckQuantityByDrawer(drawerNo); // byte[] quantity = await PortUtil.CheckQuantityByDrawer(drawerNo);
AfterQuantity = quantity.Select(it => Convert.ToInt32(it)).ToArray().Skip(3).Take(9).ToArray(); // AfterQuantity = quantity.Select(it => Convert.ToInt32(it)).ToArray().Skip(3).Take(9).ToArray();
logger.Info($"单支抽屉【{drawerNo}】,抽屉未关检测数量【{string.Join(",", AfterQuantity)}】"); // logger.Info($"单支抽屉【{drawerNo}】,抽屉未关检测数量【{string.Join(",", AfterQuantity)}】");
data.ForEach(cl => // data.ForEach(cl =>
{ // {
cl.ChannelStocks.Where(cs => cs.DrawerNo == drawerNo).ToList().ForEach(cs => // cl.ChannelStocks.Where(cs => cs.DrawerNo == drawerNo).ToList().ForEach(cs =>
{ // {
logger.Info($"单支抽屉【{drawerNo}】,应加药品数量【{cs.AddQuantity}】,现实取数量【{AfterQuantity[cs.ColNo - 1] - BeforeQuantity[cs.ColNo - 1]}】"); // logger.Info($"单支抽屉【{drawerNo}】,应加药品数量【{cs.AddQuantity}】,现实取数量【{AfterQuantity[cs.ColNo - 1] - BeforeQuantity[cs.ColNo - 1]}】");
}); // });
}); // });
} // }
next(); // continue iteration next(); // continue iteration
} }
} }
@ -223,13 +326,12 @@
RestData(); RestData();
logger.Info($"调拨加药发生错误,{e.Message}"); logger.Info($"调拨加药发生错误,{e.Message}");
_message.Notify( _message.Notify(
new NotificationMessage { Severity = NotificationSeverity.Error, Summary = "提示", Detail = $"发生错误,{e.Message}", Duration = 4000 } new NotificationMessage { Severity = NotificationSeverity.Error, Summary = "提示", Detail = $"发生错误,{e.Message}", Duration = 4000 }
); );
if (setting.Value.single.Contains(drawerNo)) if (setting.Value.single.Contains(drawerNo))
{ {
PortUtil.AllLightOff(); PortUtil.AllLightOff();
} }
stop();
} }
}); });
} }
@ -237,6 +339,8 @@
void RestData() void RestData()
{ {
this.status = 0; this.status = 0;
_flagList.Clear();
this.ColNos.Clear();
} }
async Task AddFinish() async Task AddFinish()
@ -285,16 +389,17 @@
} }
void RowRender(RowRenderEventArgs<InvoiceVo> args) void RowRender(RowRenderEventArgs<InvoiceVo>
args)
{ {
args.Expandable = args.Data.ChannelStocks != null && args.Data.ChannelStocks.Count > 0; args.Expandable = args.Data.ChannelStocks != null && args.Data.ChannelStocks.Count > 0;
} }
void OnCellClick(DataGridCellMouseEventArgs<ChannelStock> args, RadzenDataGrid<ChannelStock> Grid) void OnCellClick(DataGridCellMouseEventArgs<ChannelStock>
args, RadzenDataGrid<ChannelStock>
Grid)
{ {
Grid.EditRow(args.Data); Grid.EditRow(args.Data);
} }
} }

View File

@ -17,41 +17,41 @@
</RadzenStack> </RadzenStack>
<RadzenStack> <RadzenStack>
<RadzenDataGrid @ref="grid" Data="@data" ExpandMode="DataGridExpandMode.Multiple" <RadzenDataGrid @ref="grid" Data="@data" ExpandMode="DataGridExpandMode.Multiple"
RowRender="@RowRender" RowRender="@RowRender"
EmptyText="无数据" AllowAlternatingRows="false"> EmptyText="无数据" AllowAlternatingRows="false">
<Template Context="di"> <Template Context="di">
<RadzenDataGrid Data="@di.ChannelStocks" EmptyText="无数据" @ref="di.Grid" <RadzenDataGrid Data="@di.ChannelStocks" EmptyText="无数据" @ref="di.Grid"
CellClick="@((DataGridCellMouseEventArgs<ChannelStock> args) => OnCellClick(args, di.Grid))"> CellClick="@((DataGridCellMouseEventArgs<ChannelStock> args) => OnCellClick(args, di.Grid))">
<Columns> <Columns>
<RadzenDataGridColumn Title="库位" Property="DrawerNo"> <RadzenDataGridColumn Title="库位" Property="DrawerNo">
<Template Context="s"> <Template Context="s">
@s.DrawerNo - @s.ColNo @s.DrawerNo - @s.ColNo
</Template> </Template>
</RadzenDataGridColumn> </RadzenDataGridColumn>
<RadzenDataGridColumn Title="库存" Property="Quantity"></RadzenDataGridColumn> <RadzenDataGridColumn Title="库存" Property="Quantity"></RadzenDataGridColumn>
@* <RadzenDataGridColumn Title="批次" Property="ManuNo"></RadzenDataGridColumn> @* <RadzenDataGridColumn Title="批次" Property="ManuNo"></RadzenDataGridColumn>
<RadzenDataGridColumn Title="效期" Property="EffDate"></RadzenDataGridColumn> *@ <RadzenDataGridColumn Title="效期" Property="EffDate"></RadzenDataGridColumn> *@
<RadzenDataGridColumn Title="出库数量" Property="TakeQuantity"> <RadzenDataGridColumn Title="出库数量" Property="TakeQuantity">
<EditTemplate Context="cs"> <EditTemplate Context="cs">
<RadzenNumeric Style="display: block" Min="0" Max="@cs.Quantity" Name="Quantity" @bind-Value=@cs.TakeQuantity /> <RadzenNumeric Style="display: block" Min="0" Max="@cs.Quantity" Name="Quantity" @bind-Value=@cs.TakeQuantity />
<RadzenNumericRangeValidator Style="position: absolute;z-index: 9999;" Min="0" Max="@cs.Quantity" Text="请填写正确的取出数量" Component="Quantity" /> <RadzenNumericRangeValidator Style="position: absolute;z-index: 9999;" Min="0" Max="@cs.Quantity" Text="请填写正确的取出数量" Component="Quantity" />
<RadzenCustomValidator Validator="@(() => di.ChannelStocks.Sum(cs2 => cs2.TakeQuantity) == di.Quantity)" Component="Quantity" Text="出库总量应等于请领数量" Style="position: absolute;z-index: 9999;" /> <RadzenCustomValidator Validator="@(() => di.ChannelStocks.Sum(cs2 => cs2.TakeQuantity) == di.Quantity)" Component="Quantity" Text="出库总量应等于请领数量" Style="position: absolute;z-index: 9999;" />
</EditTemplate> </EditTemplate>
</RadzenDataGridColumn> </RadzenDataGridColumn>
</Columns> </Columns>
</RadzenDataGrid> </RadzenDataGrid>
</Template> </Template>
<Columns> <Columns>
<RadzenDataGridColumn Property="Drug.DrugName" Title="药品" /> <RadzenDataGridColumn Property="Drug.DrugName" Title="药品" />
<RadzenDataGridColumn Property="Drug.DrugSpec" Title="规格" /> <RadzenDataGridColumn Property="Drug.DrugSpec" Title="规格" />
<RadzenDataGridColumn Property="Invoice.DrugManuNo" Title="批次" /> <RadzenDataGridColumn Property="Invoice.DrugManuNo" Title="批次" />
<RadzenDataGridColumn Property="Invoice.EffDate" Title="效期" /> <RadzenDataGridColumn Property="Invoice.EffDate" Title="效期" />
<RadzenDataGridColumn Property="Quantity" Title="请领数量" /> <RadzenDataGridColumn Property="Quantity" Title="请领数量" />
<RadzenDataGridColumn Property="StockQuantity" Title="总库存" /> <RadzenDataGridColumn Property="StockQuantity" Title="总库存" />
</Columns> </Columns>
</RadzenDataGrid> </RadzenDataGrid>
@ -89,16 +89,26 @@
int status = 0; int status = 0;
public List<InvoiceVo> data { get; set; } public List<InvoiceVo> data { get; set; }
//称重取药数量
int[] WeightFinnalQuantity { get; set; } = new int[] { 0, 0, 0, 0, 0, 0, 0, 0, 0 };
// 当前操作的库位号列表
public List<int> ColNos { get; set; } = new List<int>();
int currentCol = 0;
//开抽屉前操作标识
private List<string> _flagList = new List<string>();
int[] BeforeQuantity = new int[9];
int[] AfterQuantity = new int[9];
async Task StartTake() async Task StartTake()
{ {
if(data.Any(it => it.Quantity != it.ChannelStocks.Sum(cs => cs.TakeQuantity))) if (data.Any(it => it.Quantity != it.ChannelStocks.Sum(cs => cs.TakeQuantity)))
{ {
_message.Notify( _message.Notify(
new NotificationMessage { Severity = NotificationSeverity.Error, Summary = "提示", Detail = $"请填写正确的出库数量!", Duration = 4000 } new NotificationMessage { Severity = NotificationSeverity.Error, Summary = "提示", Detail = $"请填写正确的出库数量!", Duration = 4000 }
); );
} else }
else
{ {
await OpenDrawer(); await OpenDrawer();
} }
@ -113,7 +123,7 @@
this.status = 1; this.status = 1;
// 解析需要打开的抽屉列表 // 解析需要打开的抽屉列表
List<ChannelStock> channels = new(); List<ChannelStock> channels = new();
for(int i = 0; i < data.Count; i++) for (int i = 0; i < data.Count; i++)
{ {
channels = channels.Concat(data[i].ChannelStocks.Where(cs => cs.TakeQuantity > 0)).ToList(); channels = channels.Concat(data[i].ChannelStocks.Where(cs => cs.TakeQuantity > 0)).ToList();
} }
@ -123,9 +133,7 @@
// 根据抽屉类型来决定打开前是否需要查询数量 // 根据抽屉类型来决定打开前是否需要查询数量
var promiseUtil = new PromiseUtil<int>(); var promiseUtil = new PromiseUtil<int>();
int index = 0; int index = 0;
var BeforeQuantity = new int[9]; await promiseUtil.taskAsyncLoop(500, 0, async (options, next, stop) =>
var AfterQuantity = new int[9];
await promiseUtil.taskAsyncLoop(500, 0 , async (options, next, stop) =>
{ {
var drawerNo = drawerNos[index]; var drawerNo = drawerNos[index];
try try
@ -141,15 +149,63 @@
{ {
BeforeQuantity = new int[9]; BeforeQuantity = new int[9];
AfterQuantity = new int[9]; AfterQuantity = new int[9];
// 判断是否为单支抽屉 for (int j = 0; j < data[index].ChannelStocks.Count; j++)
if (setting.Value.single.Contains(drawerNo))
{ {
byte[] quantity = await PortUtil.CheckQuantityByDrawer(drawerNo); //单支-查数
BeforeQuantity = quantity.Select(it => Convert.ToInt32(it)).ToArray().Skip(3).Take(9).ToArray(); if (data[index].ChannelStocks[j].BoardType.ToString().Contains("2"))
logger.Info($"单支抽屉【{drawerNo}】,开抽屉前检测数量【{string.Join(",", BeforeQuantity)}】"); {
byte[] quantity = await PortUtil.CheckQuantityByDrawer(data[index].ChannelStocks[j].DrawerNo);
BeforeQuantity = quantity.Select(it => Convert.ToInt32(it)).ToArray().Skip(3).Take(9).ToArray();
logger.Info($"单支抽屉【{drawerNo}】,开抽屉前检测数量【{string.Join(",", BeforeQuantity)}】");
await PortUtil.HasLightOnByCol(drawerNo, data.Select(ot => ot.ChannelStocks.Where(cs => cs.DrawerNo == drawerNo).Select(cs => cs.ColNo)).Cast<int>().ToArray()); await PortUtil.NoLightOnByCol(drawerNo, data.Select(ot => ot.ChannelStocks.Where(cs => cs.DrawerNo == drawerNo).Select(cs => cs.ColNo)).Cast<int>().ToArray());
}
//称重-查数
if (data[index].ChannelStocks[j].BoardType.ToString().Contains("6"))
{
PortUtil.DrawerNo = data[index].ChannelStocks[j].DrawerNo;// drawerNo;
PortUtil.ColNoLst.Add(data[index].ChannelStocks[j].ColNo);
BeforeQuantity[data[index].ChannelStocks[j].ColNo - 1] = await PortUtil.CheckQuantityForSingle(data[index].ChannelStocks[j].ColNo);
logger.Info($"称重抽屉【{data[index].ChannelStocks[j].DrawerNo}】,开抽屉前检测数量【{string.Join(",", BeforeQuantity)}】");
await Task.Delay(200);
}
//药盒-开药盒
if (data[index].ChannelStocks[j].BoardType.ToString().Contains("3"))
{
PortUtil.DrawerNo = data[index].ChannelStocks[j].DrawerNo;
await PortUtil.OpenBoxByColNo(data[index].ChannelStocks[j].ColNo);
await Task.Delay(200);
}
} }
// // 判断是否为单支抽屉
// if (setting.Value.single != null && setting.Value.single.Contains(drawerNo))
// {
// byte[] quantity = await PortUtil.CheckQuantityByDrawer(drawerNo);
// BeforeQuantity = quantity.Select(it => Convert.ToInt32(it)).ToArray().Skip(3).Take(9).ToArray();
// logger.Info($"单支抽屉【{drawerNo}】,开抽屉前检测数量【{string.Join(",", BeforeQuantity)}】");
// await PortUtil.HasLightOnByCol(drawerNo, data.Select(ot => ot.ChannelStocks.Where(cs => cs.DrawerNo == drawerNo).Select(cs => cs.ColNo)).Cast<int>().ToArray());
// }
// // 称重抽屉关上则查数
// if (setting.Value.weigh != null && setting.Value.weigh.Contains(drawerNo))
// {
// for (int i = 0; i < data.Count; i++)
// {
// for (int j = 0; j < data[i].ChannelStocks.Count; j++)
// {
// if (data[i].ChannelStocks[j].BoardType.ToString().Contains("6"))
// {
// PortUtil.DrawerNo = drawerNo;
// PortUtil.ColNoLst.Add(data[i].ChannelStocks[j].ColNo);
// BeforeQuantity[data[i].ChannelStocks[j].ColNo - 1] = await PortUtil.CheckQuantityForSingle(data[i].ChannelStocks[j].ColNo);
// logger.Info($"称重抽屉【{drawerNo}】,开抽屉前检测数量【{string.Join(",", BeforeQuantity)}】");
// await Task.Delay(200);
// }
// }
// }
// }
var b = await PortUtil.OpenDrawerStatus(drawerNo); var b = await PortUtil.OpenDrawerStatus(drawerNo);
if (b) if (b)
{ {
@ -181,10 +237,80 @@
{ {
PortUtil.AllLightOff(); PortUtil.AllLightOff();
} }
if (index == drawerNos.Count - 1) if (index == drawerNos.Count - 1)
{ {
PortUtil.SpeakAsync($"取药完成,请,点击完成按钮进行确认"); PortUtil.SpeakAsync($"取药完成,请,点击完成按钮进行确认");
this.status = 2; this.status = 2;
string alertMessage = string.Empty;
bool cancelFlag = false;
for (int i = 0; i < data.Count; i++)
{
for (int j = 0; j < data[i].ChannelStocks.Count; j++)
{
string flag = "关" + data[i].ChannelStocks[j].DrawerNo.ToString() + data[i].ChannelStocks[j].ColNo.ToString();
if (!_flagList.Contains(flag))
{
_flagList.Add(flag);
// 判断是否为称重抽屉
if (data[i].ChannelStocks[j].BoardType.ToString().Contains("6"))
{
//关闭抽屉后获取称重数量
PortUtil.DrawerNo = data[i].ChannelStocks[j].DrawerNo;// drawerNo;
PortUtil.ColNoLst = this.ColNos;
AfterQuantity[data[i].ChannelStocks[j].ColNo - 1] = await PortUtil.CheckQuantityForSingle(data[i].ChannelStocks[j].ColNo);
logger.Info($"称重抽屉,关抽屉后检测数量【{string.Join(",", AfterQuantity)}】");
WeightFinnalQuantity[data[i].ChannelStocks[j].ColNo - 1] = BeforeQuantity[data[i].ChannelStocks[j].ColNo - 1] - AfterQuantity[data[i].ChannelStocks[j].ColNo - 1];
if (data[i].Quantity != WeightFinnalQuantity[data[i].ChannelStocks[j].ColNo - 1])
{
//称重自动计数数量与实际要取数量不一致弹出提示,确认后保存数据
alertMessage += $"{data[i].Drug.DrugName}应取数量【{data[i].Quantity}】,实际取出数量【{WeightFinnalQuantity[data[i].ChannelStocks[j].ColNo - 1]}】";
}
}
if (data[i].ChannelStocks[j].BoardType.ToString().Contains("2"))
{
byte[] quantity = await PortUtil.CheckQuantityByDrawer(data[i].ChannelStocks[j].DrawerNo);
AfterQuantity = quantity.Select(it => Convert.ToInt32(it)).ToArray().Skip(3).Take(9).ToArray();
logger.Info($"单支抽屉,关抽屉后检测数量【{string.Join(",", AfterQuantity)}】");
WeightFinnalQuantity[data[i].ChannelStocks[j].ColNo - 1] = BeforeQuantity[data[i].ChannelStocks[j].ColNo - 1] - AfterQuantity[data[i].ChannelStocks[j].ColNo - 1];
if (data[i].Quantity != WeightFinnalQuantity[data[i].ChannelStocks[j].ColNo - 1])
{
alertMessage += $"{data[i].Drug.DrugName}应取数量【{data[i].ChannelStocks[j].Quantity}】,实际取出数量【{WeightFinnalQuantity[data[i].ChannelStocks[j].ColNo - 1]}】";
}
}
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("取消保存");
cancelFlag = true;
break;
}
else
{
logger.Info(alertMessage);
}
alertMessage = string.Empty;
}
}
}
if (cancelFlag)
{
break;
}
}
stop(); stop();
} }
else else
@ -195,7 +321,7 @@
} }
else else
{ {
if (setting.Value.single.Contains(drawerNo)) if (setting.Value.single != null && setting.Value.single.Contains(drawerNo))
{ {
byte[] quantity = await PortUtil.CheckQuantityByDrawer(drawerNo); byte[] quantity = await PortUtil.CheckQuantityByDrawer(drawerNo);
AfterQuantity = quantity.Select(it => Convert.ToInt32(it)).ToArray().Skip(3).Take(9).ToArray(); AfterQuantity = quantity.Select(it => Convert.ToInt32(it)).ToArray().Skip(3).Take(9).ToArray();
@ -210,6 +336,15 @@
}); });
} }
//是药盒抽屉开药盒
if (setting.Value.box != null && setting.Value.box.Contains(drawerNo) && currentCol != null)
{
PortUtil.DrawerNo = drawerNo;
await PortUtil.OpenBoxByColNo(currentCol);
ColNos.Add(currentCol);
currentCol = 0;
await Task.Delay(200);
}
next(); // continue iteration next(); // continue iteration
} }
} }
@ -236,6 +371,11 @@
void RestData() void RestData()
{ {
this.status = 0; this.status = 0;
this.BeforeQuantity = new int[9];
this.AfterQuantity = new int[9];
currentCol = 0;
ColNos.Clear();
_flagList.Clear();
} }
async Task TakeFinish() async Task TakeFinish()
@ -291,6 +431,7 @@
void OnCellClick(DataGridCellMouseEventArgs<ChannelStock> args, RadzenDataGrid<ChannelStock> Grid) void OnCellClick(DataGridCellMouseEventArgs<ChannelStock> args, RadzenDataGrid<ChannelStock> Grid)
{ {
currentCol = args.Data.ColNo;
Grid.EditRow(args.Data); Grid.EditRow(args.Data);
} }

View File

@ -0,0 +1,226 @@
@page "/loginDialog"
@using MasaBlazorApp3.Pojo.Config;
@using MasaBlazorApp3.Pojo.Vo;
@using MasaBlazorApp3.Util;
@using Microsoft.Extensions.Options;
@using Newtonsoft.Json;
@using log4net;
<style>
.rz-dialog-content {
padding: 0 !important;
}
</style>
<RadzenRow Gap="0" Style="overflow: hidden;width:100%;height:100%">
<RadzenColumn Size="12" SizeMD="5">
<RadzenCard class="rz-shadow-0 rz-border-radius-0 rz-text-align-center rz-p-12 align-items-center justify-content-center" Style="height: 100%; background: var(--rz-primary-light) no-repeat 100% 70% fixed url('data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTIwNCIgaGVpZ2h0PSIxNDU4IiB2aWV3Qm94PSIwIDAgMTIwNCAxNDU4IiBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgo8ZyBvcGFjaXR5PSIwLjUiIGZpbHRlcj0idXJsKCNmaWx0ZXIwX2ZfNDkzXzEwMTM0KSI+CjxjaXJjbGUgY3g9IjcyMi4xMjgiIGN5PSI4MzkuMDIiIHI9IjQ4MS40MTkiIGZpbGw9InVybCgjcGFpbnQwX3JhZGlhbF80OTNfMTAxMzQpIi8+CjwvZz4KPGcgb3BhY2l0eT0iMC41IiBmaWx0ZXI9InVybCgjZmlsdGVyMV9mXzQ5M18xMDEzNCkiPgo8Y2lyY2xlIGN4PSI0NzAuMzMzIiBjeT0iNTcwLjMzMyIgcj0iNDcwLjMzMyIgZmlsbD0idXJsKCNwYWludDFfcmFkaWFsXzQ5M18xMDEzNCkiLz4KPC9nPgo8ZyBvcGFjaXR5PSIwLjUiIGZpbHRlcj0idXJsKCNmaWx0ZXIyX2ZfNDkzXzEwMTM0KSI+CjxjaXJjbGUgY3g9IjY5MS41MTEiIGN5PSI1MjIuMjk3IiByPSIzMzEuNTAzIiBmaWxsPSJ1cmwoI3BhaW50Ml9yYWRpYWxfNDkzXzEwMTM0KSIvPgo8L2c+CjxnIG9wYWNpdHk9IjAuNSIgZmlsdGVyPSJ1cmwoI2ZpbHRlcjNfZl80OTNfMTAxMzQpIj4KPGNpcmNsZSBjeD0iNjA4LjI0NCIgY3k9IjEwNzkuOTciIHI9IjMzMS41MDMiIHRyYW5zZm9ybT0icm90YXRlKC04MS4yMjQ0IDYwOC4yNDQgMTA3OS45NykiIGZpbGw9InVybCgjcGFpbnQzX3JhZGlhbF80OTNfMTAxMzQpIi8+CjwvZz4KPGRlZnM+CjxmaWx0ZXIgaWQ9ImZpbHRlcjBfZl80OTNfMTAxMzQiIHg9IjE0MC43MDkiIHk9IjI1Ny42MDEiIHdpZHRoPSIxMTYyLjg0IiBoZWlnaHQ9IjExNjIuODQiIGZpbHRlclVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KPGZlRmxvb2QgZmxvb2Qtb3BhY2l0eT0iMCIgcmVzdWx0PSJCYWNrZ3JvdW5kSW1hZ2VGaXgiLz4KPGZlQmxlbmQgbW9kZT0ibm9ybWFsIiBpbj0iU291cmNlR3JhcGhpYyIgaW4yPSJCYWNrZ3JvdW5kSW1hZ2VGaXgiIHJlc3VsdD0ic2hhcGUiLz4KPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iNTAiIHJlc3VsdD0iZWZmZWN0MV9mb3JlZ3JvdW5kQmx1cl80OTNfMTAxMzQiLz4KPC9maWx0ZXI+CjxmaWx0ZXIgaWQ9ImZpbHRlcjFfZl80OTNfMTAxMzQiIHg9Ii0xMDAiIHk9IjAiIHdpZHRoPSIxMTQwLjY3IiBoZWlnaHQ9IjExNDAuNjciIGZpbHRlclVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KPGZlRmxvb2QgZmxvb2Qtb3BhY2l0eT0iMCIgcmVzdWx0PSJCYWNrZ3JvdW5kSW1hZ2VGaXgiLz4KPGZlQmxlbmQgbW9kZT0ibm9ybWFsIiBpbj0iU291cmNlR3JhcGhpYyIgaW4yPSJCYWNrZ3JvdW5kSW1hZ2VGaXgiIHJlc3VsdD0ic2hhcGUiLz4KPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iNTAiIHJlc3VsdD0iZWZmZWN0MV9mb3JlZ3JvdW5kQmx1cl80OTNfMTAxMzQiLz4KPC9maWx0ZXI+CjxmaWx0ZXIgaWQ9ImZpbHRlcjJfZl80OTNfMTAxMzQiIHg9IjI2MC4wMDgiIHk9IjkwLjc5MzkiIHdpZHRoPSI4NjMuMDA2IiBoZWlnaHQ9Ijg2My4wMDYiIGZpbHRlclVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KPGZlRmxvb2QgZmxvb2Qtb3BhY2l0eT0iMCIgcmVzdWx0PSJCYWNrZ3JvdW5kSW1hZ2VGaXgiLz4KPGZlQmxlbmQgbW9kZT0ibm9ybWFsIiBpbj0iU291cmNlR3JhcGhpYyIgaW4yPSJCYWNrZ3JvdW5kSW1hZ2VGaXgiIHJlc3VsdD0ic2hhcGUiLz4KPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iNTAiIHJlc3VsdD0iZWZmZWN0MV9mb3JlZ3JvdW5kQmx1cl80OTNfMTAxMzQiLz4KPC9maWx0ZXI+CjxmaWx0ZXIgaWQ9ImZpbHRlcjNfZl80OTNfMTAxMzQiIHg9IjE3Ni42OTQiIHk9IjY0OC40MjMiIHdpZHRoPSI4NjMuMSIgaGVpZ2h0PSI4NjMuMSIgZmlsdGVyVW5pdHM9InVzZXJTcGFjZU9uVXNlIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgo8ZmVGbG9vZCBmbG9vZC1vcGFjaXR5PSIwIiByZXN1bHQ9IkJhY2tncm91bmRJbWFnZUZpeCIvPgo8ZmVCbGVuZCBtb2RlPSJub3JtYWwiIGluPSJTb3VyY2VHcmFwaGljIiBpbjI9IkJhY2tncm91bmRJbWFnZUZpeCIgcmVzdWx0PSJzaGFwZSIvPgo8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSI1MCIgcmVzdWx0PSJlZmZlY3QxX2ZvcmVncm91bmRCbHVyXzQ5M18xMDEzNCIvPgo8L2ZpbHRlcj4KPHJhZGlhbEdyYWRpZW50IGlkPSJwYWludDBfcmFkaWFsXzQ5M18xMDEzNCIgY3g9IjAiIGN5PSIwIiByPSIxIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgZ3JhZGllbnRUcmFuc2Zvcm09InRyYW5zbGF0ZSg3MjIuMTI4IDgzOS4wMikgcm90YXRlKDkwKSBzY2FsZSg0ODEuNDE5KSI+CjxzdG9wIHN0b3AtY29sb3I9IiNGRjFBNkMiLz4KPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjRkYxQTZDIiBzdG9wLW9wYWNpdHk9IjAiLz4KPC9yYWRpYWxHcmFkaWVudD4KPHJhZGlhbEdyYWRpZW50IGlkPSJwYWludDFfcmFkaWFsXzQ5M18xMDEzNCIgY3g9IjAiIGN5PSIwIiByPSIxIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgZ3JhZGllbnRUcmFuc2Zvcm09InRyYW5zbGF0ZSg0NzAuMzMzIDU3MC4zMzMpIHJvdGF0ZSg5MCkgc2NhbGUoNDcwLjMzMykiPgo8c3RvcCBzdG9wLWNvbG9yPSIjM0FBQ0ZGIi8+CjxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iIzNBOTVGRiIgc3RvcC1vcGFjaXR5PSIwIi8+CjwvcmFkaWFsR3JhZGllbnQ+CjxyYWRpYWxHcmFkaWVudCBpZD0icGFpbnQyX3JhZGlhbF80OTNfMTAxMzQiIGN4PSIwIiBjeT0iMCIgcj0iMSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIGdyYWRpZW50VHJhbnNmb3JtPSJ0cmFuc2xhdGUoNjkxLjUxMSA1MjIuMjk3KSByb3RhdGUoOTApIHNjYWxlKDMzMS41MDMpIj4KPHN0b3Agc3RvcC1jb2xvcj0iIzQ4M0FGRiIvPgo8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiM0ODNBRkYiIHN0b3Atb3BhY2l0eT0iMCIvPgo8L3JhZGlhbEdyYWRpZW50Pgo8cmFkaWFsR3JhZGllbnQgaWQ9InBhaW50M19yYWRpYWxfNDkzXzEwMTM0IiBjeD0iMCIgY3k9IjAiIHI9IjEiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiBncmFkaWVudFRyYW5zZm9ybT0idHJhbnNsYXRlKDYwOC4yNDQgMTA3OS45Nykgcm90YXRlKDkwKSBzY2FsZSgzMzEuNTAzKSI+CjxzdG9wIHN0b3AtY29sb3I9IiNGRkM4M0EiLz4KPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjRkZDODNBIiBzdG9wLW9wYWNpdHk9IjAiLz4KPC9yYWRpYWxHcmFkaWVudD4KPC9kZWZzPgo8L3N2Zz4K')">
@if (loginMode == 2)
{
<RadzenText TextStyle="TextStyle.H6" class="rz-color-white">操作人:@globalStateService.Operator?.NickName</RadzenText>
<RadzenText TextStyle="TextStyle.H6" class="rz-color-white">复核人:@globalStateService.Reviewer?.NickName</RadzenText>
}
</RadzenCard>
</RadzenColumn>
<RadzenColumn Size="12" SizeMD="7">
<RadzenCard Class="rz-shadow-0 rz-border-radius-0 rz-p-12" Style="width:100%;height:100%">
<RadzenText TextStyle="TextStyle.H5" TagName="TagName.H2" class="rz-mb-6">
登录
</RadzenText>
<RadzenTemplateForm Data="@loginModel" Submit="@((Pojo.User args) => { Submit(args); })" Style="width:100%;height:100%">
<div class="rz-form-row">
<label class="rz-label" for="username">账号</label>
<div class="rz-form-input-wrapper">
<!--@onfocusin="@(() => Util.VirtualKeyboardHelper.ShowVirtualKeyboard())"-->
<RadzenTextBox id="username" Name="Username" @bind-Value="@loginModel.Username" Style="width:100%" />
<RadzenRequiredValidator Component="Username" Text="请填写用户名" />
</div>
</div>
<div class="rz-form-row">
<label class="rz-label" for="password">密码</label>
<div class="rz-form-input-wrapper">
<RadzenPassword id="password" Name="Password" @bind-Value="@loginModel.Password" Style="width:100%" />
<RadzenRequiredValidator Component="Password" Text="请填写密码" />
</div>
</div>
<div class="rz-form-row">
<label class="rz-label"></label>
<div class="rz-form-input-wrapper rz-login-buttons">
<RadzenButton Style="background:#255dd4;color:white;width:110px" ButtonType="ButtonType.Submit" Text="登录" />
<RadzenButton Style="border-color:#255dd4;width:110px" Variant="Variant.Outlined" Text="取消" Click="@Exit" />
</div>
</div>
</RadzenTemplateForm>
</RadzenCard>
</RadzenColumn>
</RadzenRow>
@code {
@inject Radzen.DialogService dialogService;
@inject FingerprintUtil FingerprintUtil;
@inject PortUtil PortUtil;
@inject NavigationManager na;
@inject NotificationService _message
@inject GlobalStateService globalStateService;
@inject IUserDao userDao;
@inject Microsoft.Extensions.Options.IOptions<Pojo.Config.SettingConfig> setting;
private readonly ILog logger = LogManager.GetLogger(typeof(LoginDialog));
private int loginMode = 1;
private bool opFirst = true;
bool isShow;
private Pojo.User loginModel = new();
protected override Task OnInitializedAsync()
{
FingerprintUtil.axCZKEM1.OnAttTransactionEx += axCZKEM1_OnAttTransactionEx;
loginMode = setting.Value.loginMode;
opFirst = setting.Value.opFirst;
return base.OnInitializedAsync();
}
private void SetUser(Pojo.User user)
{
// 判断是否为双人登录模式
if (loginMode == 2)
{
// 判断是否是操作人优先登录
if (opFirst)
{
// 判断操作人是否已经登录,已经登录说明此时为第二人登录
if (globalStateService.Operator != null)
{
// 判断是否还是操作人的验证
if (globalStateService.Operator.Id != user.Id)
{
FingerprintUtil.axCZKEM1.OnAttTransactionEx -= axCZKEM1_OnAttTransactionEx;
globalStateService.Reviewer = user;
logger.Info($"双人登录模式:操作人【{globalStateService.Operator.NickName}】复核人【{user.NickName}】登录");
dialogService.Close(true);
}
else
{
_message.Notify(
new NotificationMessage { Severity = NotificationSeverity.Error, Summary = "提示", Detail = $"验证重复,请使用其他账号", Duration = 3000 }
);
}
}
else
{
// 此时为第一人登录
globalStateService.Operator = user;
InvokeAsync(StateHasChanged);
}
}
// 操作人为第二人登录
else
{
// 判断复核人是否已经登录,已经登录说明此时为第二人登录
if (globalStateService.Reviewer != null)
{
// 判断是否还是复核人的验证
if (globalStateService.Reviewer.Id != user.Id)
{
FingerprintUtil.axCZKEM1.OnAttTransactionEx -= axCZKEM1_OnAttTransactionEx;
globalStateService.Operator = user;
logger.Info($"双人登录模式:操作人【{user.NickName}】复核人【{globalStateService.Reviewer.NickName}】登录");
dialogService.Close(true);
}
else
{
_message.Notify(
new NotificationMessage { Severity = NotificationSeverity.Error, Summary = "提示", Detail = $"验证重复,请使用其他账号", Duration = 3000 }
);
}
}
else
{
// 此时为第一人登录
globalStateService.Reviewer = user;
InvokeAsync(StateHasChanged);
}
}
}
else
{
FingerprintUtil.axCZKEM1.OnAttTransactionEx -= axCZKEM1_OnAttTransactionEx;
globalStateService.Operator = user;
logger.Info($"单人登录模式:用户【{user.NickName}】登录");
dialogService.Close(true);
}
}
private void Submit(Pojo.User user)
{
Pojo.User u = userDao.GetByUsername(loginModel.Username);
if (u != null)
{
if (Util.MD5.GetMD5Hash(loginModel.Password).ToLower().Equals(u.Password))
{
SetUser(u);
loginModel.Username="";
loginModel.Password = "";
}
else
{
_message.Notify(
new NotificationMessage { Severity = NotificationSeverity.Error, Summary = "提示", Detail = $"密码错误", Duration = 4000 }
);
logger.Info($"用户【{u.NickName}】密码输入错误");
}
}
else
{
_message.Notify(
new NotificationMessage { Severity = NotificationSeverity.Error, Summary = "提示", Detail = $"无此用户", Duration = 4000 }
);
logger.Info($"没有用户:【{loginModel.Username}】");
}
}
private void axCZKEM1_OnAttTransactionEx(string sEnrollNumber, int iIsInValid, int iAttState, int iVerifyMethod, int iYear, int iMonth, int iDay, int iHour, int iMinute, int iSecond, int iWorkCode)
{
Pojo.User u = userDao.GetById(Convert.ToInt32(sEnrollNumber));
if (u != null)
{
SetUser(u);
}
else
{
_message.Notify(
new NotificationMessage { Severity = NotificationSeverity.Error, Summary = "提示", Detail = $"系统中没有ID为【{sEnrollNumber}】的用户", Duration = 4000 }
);
logger.Info($"指纹机验证通过id为【{sEnrollNumber}】,但是华康数据库中无此用户");
}
}
private void Exit()
{
dialogService.Close(false);
}
}

View File

@ -62,7 +62,7 @@
} }
@if (status <= 2) @if (status <= 2)
{ {
<RadzenButton Click="@((args) => dialogService.Close(false))" Variant="Variant.Flat" Text="取消" Style="width: 120px" /> <RadzenButton Click="@Cancel" Variant="Variant.Flat" Text="取消" Style="width: 120px" />
} }
</RadzenStack> </RadzenStack>
</RadzenStack> </RadzenStack>
@ -82,8 +82,8 @@
private bool CanTakeDrug = true; private bool CanTakeDrug = true;
public List<OrderTakeVo> data { get; set; } public List<OrderTakeVo> data { get; set; }
//称重取药数量
int[] WeightFinnalQuantity { get; set; } = new int[] { 0, 0, 0, 0, 0, 0, 0, 0, 0 };
protected override async Task OnInitializedAsync() protected override async Task OnInitializedAsync()
{ {
@ -129,6 +129,26 @@
await PortUtil.HasLightOnByCol(drawerNo, data.Where(ot => ot.ChannelStock.DrawerNo == drawerNo).Select(ot => ot.ChannelStock.ColNo).ToArray()); await PortUtil.HasLightOnByCol(drawerNo, data.Where(ot => ot.ChannelStock.DrawerNo == drawerNo).Select(ot => ot.ChannelStock.ColNo).ToArray());
} }
for (int i = 0; i < data.Count; i++)
{
if (data[i].ChannelStock.BoardType.ToString().Contains("6"))
{
PortUtil.DrawerNo = drawerNo;
PortUtil.ColNoLst.Add(data[i].ChannelStock.ColNo);
orderTakeVo.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 = drawerNo;
await PortUtil.OpenBoxByColNo(data[i].ChannelStock.ColNo);
await Task.Delay(200);
}
}
var b = await PortUtil.OpenDrawerStatus(drawerNo); var b = await PortUtil.OpenDrawerStatus(drawerNo);
if (b) if (b)
{ {
@ -170,6 +190,55 @@
{ {
PortUtil.SpeakAsync($"取药完成,请,点击完成按钮进行确认"); PortUtil.SpeakAsync($"取药完成,请,点击完成按钮进行确认");
this.status = 2; 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 = 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] = 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]}】";
}
await Task.Delay(200);
}
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<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("取消保存");
}
}
stop(); stop();
} }
else else
@ -180,35 +249,21 @@
} }
else 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 next(); // continue iteration
} }
} }
} }
} }
catch (Exception e) catch (Exception e)
{ {
RestData(); RestData();
logger.Info($"处方取药发生错误,{e.Message}"); logger.Info($"处方取药发生错误,{e.Message}");
_message.Notify( _message.Notify(
new NotificationMessage { Severity = NotificationSeverity.Error, Summary = "提示", Detail = $"发生错误,{e.Message}", Duration = 4000 } new NotificationMessage { Severity = NotificationSeverity.Error, Summary = "提示", Detail = $"发生错误,{e.Message}", Duration = 4000 }
); );
if (setting.Value.single.Contains(drawerNo)) if (setting.Value.single.Contains(drawerNo))
{ {
PortUtil.AllLightOff(); PortUtil.AllLightOff();
@ -221,8 +276,20 @@
void RestData() void RestData()
{ {
this.status = 0; 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(true);
} }
async Task TakeFinish() async Task TakeFinish()
{ {

View File

@ -196,9 +196,9 @@
if (roleList.Contains(role)) if (roleList.Contains(role))
{ {
//弹出确认提示框 //弹出确认提示框
var b = await dialogService.OpenAsync<ConfirmDialo>( var b = await dialogService.OpenAsync<ConfirmDialog>(
$"删除确认", $"删除确认",
new Dictionary<string, object>() { { "confirmInfo", "删除角色:" + role.RoleName } }, new Dictionary<string, object>() { { "confirmInfo", "确认要删除角色:" + role.RoleName+"吗?" } },
new DialogOptions() { Width = "45vw", Resizable = true, Draggable = true, ShowClose = false }); new DialogOptions() { Width = "45vw", Resizable = true, Draggable = true, ShowClose = false });
if (b) if (b)
{ {

View File

@ -77,11 +77,14 @@
int status; int status;
[Parameter] public OrderInfo order { get; set; } [Parameter] public OrderInfo order { get; set; }
[Parameter] public List<OrderDetail> orderDetails{ get; set; } [Parameter] public List<OrderDetail> orderDetails { get; set; }
private bool CanTakeDrug = true; private bool CanTakeDrug = true;
public List<OrderTakeVo> data { get; set; } public List<OrderTakeVo> data { get; set; }
//称重取药数量
int[] WeightFinnalQuantity { get; set; } = new int[] { 0, 0, 0, 0, 0, 0, 0, 0, 0 };
protected override async Task OnInitializedAsync() protected override async Task OnInitializedAsync()
{ {
data = await selfTakeDao.getTakeInfoByOrderNo(orderDetails); data = await selfTakeDao.getTakeInfoByOrderNo(orderDetails);
@ -126,6 +129,26 @@
await PortUtil.HasLightOnByCol(drawerNo, data.Where(ot => ot.ChannelStock.DrawerNo == drawerNo).Select(ot => ot.ChannelStock.ColNo).ToArray()); await PortUtil.HasLightOnByCol(drawerNo, data.Where(ot => ot.ChannelStock.DrawerNo == drawerNo).Select(ot => ot.ChannelStock.ColNo).ToArray());
} }
for (int i = 0; i < data.Count; i++)
{
if (data[i].ChannelStock.BoardType.ToString().Contains("6"))
{
PortUtil.DrawerNo = drawerNo;
PortUtil.ColNoLst.Add(data[i].ChannelStock.ColNo);
orderTakeVo.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 = drawerNo;
await PortUtil.OpenBoxByColNo(data[i].ChannelStock.ColNo);
await Task.Delay(200);
}
}
var b = await PortUtil.OpenDrawerStatus(drawerNo); var b = await PortUtil.OpenDrawerStatus(drawerNo);
if (b) if (b)
{ {
@ -169,6 +192,55 @@
{ {
PortUtil.SpeakAsync($"取药完成,请,点击完成按钮进行确认"); PortUtil.SpeakAsync($"取药完成,请,点击完成按钮进行确认");
this.status = 2; 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 = 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] = 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]}】";
}
await Task.Delay(200);
}
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<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("取消保存");
}
}
stop(); stop();
} }
else else
@ -179,21 +251,21 @@
} }
else else
{ {
if (setting.Value.single.Contains(drawerNo)) // if (setting.Value.single.Contains(drawerNo))
{ // {
byte[] quantity = await PortUtil.CheckQuantityByDrawer(drawerNo); // byte[] quantity = await PortUtil.CheckQuantityByDrawer(drawerNo);
orderTakeVo.AfterQuantity = quantity.Select(it => Convert.ToInt32(it)).ToArray().Skip(3).Take(9).ToArray(); // orderTakeVo.AfterQuantity = quantity.Select(it => Convert.ToInt32(it)).ToArray().Skip(3).Take(9).ToArray();
logger.Info($"单支抽屉,抽屉未关检测数量【{string.Join(",", orderTakeVo.AfterQuantity)}】"); // logger.Info($"单支抽屉,抽屉未关检测数量【{string.Join(",", orderTakeVo.AfterQuantity)}】");
data.ForEach(cl => // data.ForEach(cl =>
{ // {
if (cl.ChannelStock.DrawerNo == drawerNo) // if (cl.ChannelStock.DrawerNo == drawerNo)
{ // {
logger.Info($"单支抽屉【{drawerNo}】,应取药品数量【{orderTakeVo.Quantity}】,现实取数量【{orderTakeVo.BeforeQuantity[cl.ChannelStock.ColNo - 1] - orderTakeVo.AfterQuantity[cl.ChannelStock.ColNo - 1]}】"); // logger.Info($"单支抽屉【{drawerNo}】,应取药品数量【{orderTakeVo.Quantity}】,现实取数量【{orderTakeVo.BeforeQuantity[cl.ChannelStock.ColNo - 1] - orderTakeVo.AfterQuantity[cl.ChannelStock.ColNo - 1]}】");
} // }
}); // });
} // }
next(); // continue iteration next(); // continue iteration
} }
} }

View File

@ -233,9 +233,9 @@
if (userList.Contains(user)) if (userList.Contains(user))
{ {
//弹出确认提示框 //弹出确认提示框
var b = await dialogService.OpenAsync<ConfirmDialo>( var b = await dialogService.OpenAsync<ConfirmDialog>(
$"删除确认", $"删除确认",
new Dictionary<string, object>() { { "confirmInfo", "删除用户:"+user.Username } }, new Dictionary<string, object>() { { "confirmInfo", "确认要删除用户:"+user.Username+"吗?" } },
new DialogOptions() { Width = "45vw", Resizable = true, Draggable = true, ShowClose = false }); new DialogOptions() { Width = "45vw", Resizable = true, Draggable = true, ShowClose = false });
if (b) if (b)
{ {
@ -258,9 +258,9 @@
if (userList.Contains(user)) if (userList.Contains(user))
{ {
//弹出确认提示框 //弹出确认提示框
var b = await dialogService.OpenAsync<ConfirmDialo>( var b = await dialogService.OpenAsync<ConfirmDialog>(
$"密码重置确认", $"密码重置确认",
new Dictionary<string, object>() { { "confirmInfo", "重置用户:" + user.Username+" 的密码" } }, new Dictionary<string, object>() { { "confirmInfo", "确认要重置用户:" + user.Username+" 的密码吗?" } },
new DialogOptions() { Width = "45vw", Resizable = true, Draggable = true, ShowClose = false }); new DialogOptions() { Width = "45vw", Resizable = true, Draggable = true, ShowClose = false });
if (b) if (b)
{ {

View File

@ -66,11 +66,11 @@ namespace MasaBlazorApp3.Pojo
public DrugManuNo? drugManuNo { get; set; } public DrugManuNo? drugManuNo { get; set; }
[Column(IsColumn =false)] [Column(IsColumn = false)]
public string Location public string Location
{ get=>DrawerNo+ "-" + ColNo; } { get => DrawerNo + "-" + ColNo; }
[Column(IsColumn =false)] [Column(IsColumn = false)]
public int CanReturnQuantity { get; set; } public int CanReturnQuantity { get; set; }
[Column(IsColumn = false)] [Column(IsColumn = false)]
@ -79,5 +79,7 @@ namespace MasaBlazorApp3.Pojo
get; get;
set; set;
} }
[Column("Pos_No")]
public int BiaoDingStatus { get; set; }
} }
} }

View File

@ -35,5 +35,8 @@ namespace MasaBlazorApp3.Pojo
[Association(ThisKey = nameof(RoleId), OtherKey = nameof(Role.Id))] [Association(ThisKey = nameof(RoleId), OtherKey = nameof(Role.Id))]
public Role role { get; set; } public Role role { get; set; }
[Column(IsColumn =false)]
public string OldPassword { get; set; }
} }
} }

View File

@ -55,8 +55,8 @@ namespace MasaBlazorApp3.Port
string DrawerPortPath = _portConfig.drawerPortPath; string DrawerPortPath = _portConfig.drawerPortPath;
logger.Info($"打开抽屉串口【{DrawerPortPath}】"); logger.Info($"打开抽屉串口【{DrawerPortPath}】");
drawerSerial = new SerialPort(DrawerPortPath, 9600, Parity.None, 8); drawerSerial = new SerialPort(DrawerPortPath, 9600, Parity.None, 8);
drawerSerial.Open(); //drawerSerial.Open();
logger.Info($"抽屉串口打开结果【{drawerSerial.IsOpen}】"); //logger.Info($"抽屉串口打开结果【{drawerSerial.IsOpen}】");
} }
catch (Exception e) catch (Exception e)
{ {
@ -72,8 +72,8 @@ namespace MasaBlazorApp3.Port
string code = scanCodeSerial.ReadExisting(); string code = scanCodeSerial.ReadExisting();
}; };
scanCodeSerial.Open(); //scanCodeSerial.Open();
logger.Info($"条码枪串口打开结果【{scanCodeSerial.IsOpen}】"); //logger.Info($"条码枪串口打开结果【{scanCodeSerial.IsOpen}】");
} }
catch (Exception e) catch (Exception e)
{ {
@ -86,8 +86,8 @@ namespace MasaBlazorApp3.Port
string CanBusPortPath = _portConfig.canBusPortPath; string CanBusPortPath = _portConfig.canBusPortPath;
logger.Info($"打开can总线串口【{CanBusPortPath}】"); logger.Info($"打开can总线串口【{CanBusPortPath}】");
canBusSerial = new SerialPort(CanBusPortPath, 57600, Parity.None, 8); canBusSerial = new SerialPort(CanBusPortPath, 57600, Parity.None, 8);
canBusSerial.Open(); //canBusSerial.Open();
logger.Info($"can总线串口打开结果【{canBusSerial.IsOpen}】"); //logger.Info($"can总线串口打开结果【{canBusSerial.IsOpen}】");
} }
catch (Exception e) catch (Exception e)
{ {
@ -410,7 +410,7 @@ namespace MasaBlazorApp3.Port
var channel = Convert.ToInt32((DrawerNo * 10 + Math.Ceiling(decolNO / 3)).ToString(), 16); var channel = Convert.ToInt32((DrawerNo * 10 + Math.Ceiling(decolNO / 3)).ToString(), 16);
byte[] buffer = new byte[] { 0xaa, (byte)channel, 5, (byte)bColNo, 0x00, 0x00, 0x00, 0xee }; byte[] buffer = new byte[] { 0xaa, (byte)channel, 5, (byte)bColNo, 0x00, 0x00, 0x00, 0xee };
//byte[] buffer = new byte[] { 0xaa, 0x11, 0x05,0x01, 0x00,0x00,0x00,0xee}; //byte[] buffer = new byte[] { 0xaa, 0x11, 0x05,0x01, 0x00,0x00,0x00,0xee};
logger.Info($"开药盒{ColNo}【{Convert.ToHexString(buffer)}】"); logger.Info($"开药盒{DrawerNo}-{ColNo}【{Convert.ToHexString(buffer)}】");
canBusSerial.Write(buffer, 0, 8); canBusSerial.Write(buffer, 0, 8);
byte[] retBuffer = await GetBufferByPort(canBusSerial, 8); byte[] retBuffer = await GetBufferByPort(canBusSerial, 8);
logger.Info($"开药盒返回{ColNo}【{Convert.ToHexString(retBuffer)}】"); logger.Info($"开药盒返回{ColNo}【{Convert.ToHexString(retBuffer)}】");
@ -770,33 +770,51 @@ namespace MasaBlazorApp3.Port
} }
} }
public async void ClearCount(int DrawerNo, int ColNo) public async Task ClearCount(int DrawerNo, int ColNo)
{ {
canBusSerial.DiscardInBuffer(); try
var index = ColNo > 3 ? 2 : 1; {
var lock1 = ColNo % 3 == 0 ? 3 : ColNo % 3; canBusSerial.DiscardInBuffer();
var channel = Convert.ToInt32((DrawerNo * 10 + index).ToString(), 16); int[] iNum = new int[] { 3, 2, 1 };
byte[] buffer = new byte[] { 0xaa, (byte)(channel), 0x25, (byte)lock1, 0x00, 0x00, 0x00, 0xee }; var colNo2 = ColNo % 3 > 0 ? (ColNo % 3) - 1 : 2;
var bColNo = iNum[colNo2];
decimal decolNO = (decimal)ColNo;
var channel = Convert.ToInt32((DrawerNo * 10 + Math.Ceiling(decolNO / 3)).ToString(), 16);
byte[] buffer = new byte[] { 0xaa, (byte)(channel), 0x25, (byte)bColNo, 0x00, 0x00, 0x00, 0xee };
logger.Info($"称重发送清空计数【{string.Join(",", buffer)}】"); logger.Info($"称重发送清空计数【{Convert.ToHexString(buffer)}】");
canBusSerial.Write(buffer, 0, 8); canBusSerial.Write(buffer, 0, 8);
}
catch (Exception ex)
{
logger.Info($"操作发生异常ex:{ex.Message},方法名ClearCount参数{DrawerNo}{ColNo}");
}
} }
public async void SetNumCount(int DrawerNo, int ColNo, int Quantity) public async Task SetNumCount(int DrawerNo, int ColNo, int Quantity)
{ {
canBusSerial.DiscardInBuffer(); try
var index = ColNo > 3 ? 2 : 1; {
var lock1 = ColNo % 3 == 0 ? 3 : ColNo % 3; canBusSerial.DiscardInBuffer();
var channel = Convert.ToInt32((DrawerNo * 10 + index).ToString(), 16); int[] iNum = new int[] { 3, 2, 1 };
byte[] buffer = new byte[] { 0xaa, (byte)(channel), 0x26, (byte)lock1, 0x00, 0x00, 0x00, 0xee }; var colNo2 = ColNo % 3 > 0 ? (ColNo % 3) - 1 : 2;
var bColNo = iNum[colNo2];
decimal decolNO = (decimal)ColNo;
var channel = Convert.ToInt32((DrawerNo * 10 + Math.Ceiling(decolNO / 3)).ToString(), 16);
byte[] buffer = new byte[] { 0xaa, (byte)(channel), 0x26, (byte)bColNo, 0x00, 0x00, 0x00, 0xee };
buffer[4] = (byte)(Quantity & 0xff);
//buffer[4] = (byte)(Quantity >> 8);
//buffer[5] = (byte)(Quantity & 0xff);
buffer[4] = (byte)(Quantity >> 8); logger.Info($"标定数量【{Convert.ToHexString(buffer)}】");
buffer[5] = (byte)(Quantity & 0xff); canBusSerial.Write(buffer, 0, 8);
}
catch (Exception ex)
logger.Info($"称重发送数量【{string.Join(",", buffer)}】"); {
canBusSerial.Write(buffer, 0, 8); logger.Info($"操作发生异常ex:{ex.Message},方法名SetNumCount参数{DrawerNo}{ColNo},{Quantity}");
}
} }
// 以板子为单位获取抽屉内所有库位的药品数量 // 以板子为单位获取抽屉内所有库位的药品数量
@ -843,7 +861,7 @@ namespace MasaBlazorApp3.Port
byte[] buffer = new byte[] { 0xaa, (byte)(channel), 0x27, (byte)bColNo, 0x00, 0x00, 0x00, 0xee }; byte[] buffer = new byte[] { 0xaa, (byte)(channel), 0x27, (byte)bColNo, 0x00, 0x00, 0x00, 0xee };
logger.Info($"称重发送库位数量查询{ColNoLst[i]}【{Convert.ToHexString(buffer)}】"); logger.Info($"称重发送库位数量查询{DrawerNo}-{ColNoLst[i]}【{Convert.ToHexString(buffer)}】");
canBusSerial.Write(buffer, 0, 8); canBusSerial.Write(buffer, 0, 8);
byte[] result = await GetBufferByPort(canBusSerial, 8); byte[] result = await GetBufferByPort(canBusSerial, 8);
logger.Info($"称重发送库位数量查询返回结果【{Convert.ToHexString(result)}】"); logger.Info($"称重发送库位数量查询返回结果【{Convert.ToHexString(result)}】");
@ -888,7 +906,7 @@ namespace MasaBlazorApp3.Port
byte[] buffer = new byte[] { 0xaa, (byte)(channel), 0x27, (byte)bColNo, 0x00, 0x00, 0x00, 0xee }; byte[] buffer = new byte[] { 0xaa, (byte)(channel), 0x27, (byte)bColNo, 0x00, 0x00, 0x00, 0xee };
logger.Info($"称重发送库位数量查询{colNo}【{Convert.ToHexString(buffer)}】"); logger.Info($"称重发送库位数量查询{DrawerNo}-{colNo}【{Convert.ToHexString(buffer)}】");
canBusSerial.Write(buffer, 0, 8); canBusSerial.Write(buffer, 0, 8);
byte[] result = await GetBufferByPort(canBusSerial, 8); byte[] result = await GetBufferByPort(canBusSerial, 8);
byte[] hl = result.Skip(4).Take(2).ToArray(); byte[] hl = result.Skip(4).Take(2).ToArray();
@ -922,7 +940,7 @@ namespace MasaBlazorApp3.Port
byte[] buffer = new byte[] { 0xaa, (byte)(channel), 0x27, (byte)bColNo, 0x00, 0x00, 0x00, 0xee }; byte[] buffer = new byte[] { 0xaa, (byte)(channel), 0x27, (byte)bColNo, 0x00, 0x00, 0x00, 0xee };
logger.Info($"称重发送库位数量查询{colNo}【{Convert.ToHexString(buffer)}】"); logger.Info($"称重发送库位数量查询{DrawerNo}-{colNo}【{Convert.ToHexString(buffer)}】");
canBusSerial.Write(buffer, 0, 8); canBusSerial.Write(buffer, 0, 8);
byte[] result = await GetBufferByPort(canBusSerial, 8); byte[] result = await GetBufferByPort(canBusSerial, 8);
logger.Info($"称重发送库位数量查询返回结果【{Convert.ToHexString(result)}】"); logger.Info($"称重发送库位数量查询返回结果【{Convert.ToHexString(result)}】");
@ -951,7 +969,7 @@ namespace MasaBlazorApp3.Port
byte[] buffer = new byte[] { 0xaa, (byte)(channel), 0x27, (byte)bColNo, 0x00, 0x00, 0x00, 0xee }; byte[] buffer = new byte[] { 0xaa, (byte)(channel), 0x27, (byte)bColNo, 0x00, 0x00, 0x00, 0xee };
logger.Info($"称重发送库位数量查询{ColNos[i]}【{Convert.ToHexString(buffer)}】"); logger.Info($"称重发送库位数量查询{DrawerNo}-{ColNos[i]}【{Convert.ToHexString(buffer)}】");
canBusSerial.Write(buffer, 0, 8); canBusSerial.Write(buffer, 0, 8);
byte[] result = await GetBufferByPort(canBusSerial, 8); byte[] result = await GetBufferByPort(canBusSerial, 8);
logger.Info($"称重发送库位数量查询返回结果【{Convert.ToHexString(result)}】"); logger.Info($"称重发送库位数量查询返回结果【{Convert.ToHexString(result)}】");

View File

@ -1,6 +1,6 @@
@inherits LayoutComponentBase @inherits LayoutComponentBase
<RadzenLayout>
<div style="width:100vw;height:100vh">
@Body @Body
</div> <RadzenNotification />
<RadzenNotification /> <RadzenComponents />
</RadzenLayout>

View File

@ -138,7 +138,7 @@
void backHome() void backHome()
{ {
currentPage = false; currentPage = false;
na.NavigateTo("/home"); na.NavigateTo("");
} }
void logout() void logout()

View File

@ -8,7 +8,7 @@
"setting": { "setting": {
"machineId": "DM1", "machineId": "DM1",
"storage": null, "storage": null,
"loginMode": 1, "loginMode": 2,
"opFirst": true, "opFirst": true,
//退,0退 //退,0退
"autoOutLog": 0 "autoOutLog": 0
@ -17,16 +17,16 @@
"drawerPortPath": "COM1", "drawerPortPath": "COM1",
"drawerProtocol": 485, "drawerProtocol": 485,
"scanCodePortPath": "COM8", "scanCodePortPath": "COM8",
"canBusPortPath": "COM5", "canBusPortPath": "COM31",
"canBusExsit": true, "canBusExsit": true,
"doorAddr": 0, "doorAddr": 0,
"storageBoxAddr": 0 "storageBoxAddr": 0
}, },
"drawer": { "drawer": {
"single": [ 3 ], "single": [ 3 ],
"weigh": [1], "weigh": [4],
"box": [], "box": [4],
"label": [] "label": [4]
} }
} }

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 18 KiB