Compare commits
	
		
			2 Commits
		
	
	
		
			1a0aced391
			...
			264a4bd0fc
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
							
							
								
								 | 
						264a4bd0fc | 
							 | 
					|
| 
							
							
								
								 | 
						4a25695d53 | 
							 | 
					
| 
						 | 
				
			
			@ -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>();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -29,5 +29,7 @@ namespace MasaBlazorApp3.DataAccess.Dao
 | 
			
		|||
 | 
			
		||||
        //盘点
 | 
			
		||||
        public Task<bool> DrawerCheckFinish(List<ChannelStock> Stocks);
 | 
			
		||||
        //抽屉获取库存数据--药品绑定
 | 
			
		||||
        Task<ChannelStockWithDrawerCount<ChannelStock>> GetChannelStockByBiaoDing(int DrawerNo, int Quantity=0);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -19,5 +19,7 @@ namespace MasaBlazorApp3.DataAccess.Dao
 | 
			
		|||
        bool ResetPassword(int id);
 | 
			
		||||
 | 
			
		||||
        Task<bool> UpdateSign(int id, string sign);
 | 
			
		||||
 | 
			
		||||
        bool UpdateUserPassword(User user);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -178,6 +178,39 @@ namespace MasaBlazorApp3.DataAccess.Impl
 | 
			
		|||
                    //var EffDate = !stock.drugManuNo.ManuNo.Equals(stock.ManuNo) ? stock.drugManuNo.EffDate : stock.EffDate;
 | 
			
		||||
                    var ManuNo = stock.ManuNo;
 | 
			
		||||
                    var EffDate = stock.EffDate;
 | 
			
		||||
                    if (!DateTime.TryParse(stock.EffDate, out DateTime dEffDate))
 | 
			
		||||
                    {
 | 
			
		||||
                        //效期转换出错
 | 
			
		||||
                        if (stock.ManuNo != null)
 | 
			
		||||
                        {
 | 
			
		||||
                            string[] idate= stock.EffDate.Split('/');
 | 
			
		||||
                            foreach (string iS in idate)
 | 
			
		||||
                            {
 | 
			
		||||
                                if (!string.IsNullOrEmpty(iS.Replace(" ", "").Trim()))
 | 
			
		||||
                                {
 | 
			
		||||
                                    switch (iS.Replace(" ", "").Trim().Length)
 | 
			
		||||
                                    {
 | 
			
		||||
                                        case 4:
 | 
			
		||||
                                                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()
 | 
			
		||||
                        {
 | 
			
		||||
| 
						 | 
				
			
			@ -232,7 +265,8 @@ namespace MasaBlazorApp3.DataAccess.Impl
 | 
			
		|||
                    if (mid > 0 && r > 0 && acid > 0)
 | 
			
		||||
                    {
 | 
			
		||||
 | 
			
		||||
                    } else
 | 
			
		||||
                    }
 | 
			
		||||
                    else
 | 
			
		||||
                    {
 | 
			
		||||
                        flag = false;
 | 
			
		||||
                        break;
 | 
			
		||||
| 
						 | 
				
			
			@ -248,7 +282,8 @@ namespace MasaBlazorApp3.DataAccess.Impl
 | 
			
		|||
                }
 | 
			
		||||
                return flag;
 | 
			
		||||
 | 
			
		||||
            } catch (Exception ex)
 | 
			
		||||
            }
 | 
			
		||||
            catch (Exception ex)
 | 
			
		||||
            {
 | 
			
		||||
                logger.Error($"抽屉{(type == 1 ? "加药" : "取药")}操作完成保存数据库失败,错误:" + ex.Message);
 | 
			
		||||
                _connection.RollbackTransaction();
 | 
			
		||||
| 
						 | 
				
			
			@ -278,10 +313,11 @@ namespace MasaBlazorApp3.DataAccess.Impl
 | 
			
		|||
            var q = _connection.ChannelStock
 | 
			
		||||
                .Where(cs => cs.Id == Stock.Id)
 | 
			
		||||
                .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);
 | 
			
		||||
 | 
			
		||||
            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);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -452,5 +488,30 @@ namespace MasaBlazorApp3.DataAccess.Impl
 | 
			
		|||
                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 };
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -298,6 +298,38 @@ namespace MasaBlazorApp3.DataAccess.Impl
 | 
			
		|||
                    for (var j = 0; j < stocks.Count; 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()
 | 
			
		||||
                        {
 | 
			
		||||
| 
						 | 
				
			
			@ -327,6 +359,7 @@ namespace MasaBlazorApp3.DataAccess.Impl
 | 
			
		|||
                        )
 | 
			
		||||
                             .Where(cs => cs.DrugId.Equals(ChannelStock.DrugId))
 | 
			
		||||
                             .ToListAsync();
 | 
			
		||||
                        
 | 
			
		||||
                        // 保存账册
 | 
			
		||||
                        int acid = _connection.InsertWithInt32Identity(new AccountBook()
 | 
			
		||||
                        {
 | 
			
		||||
| 
						 | 
				
			
			@ -428,6 +461,38 @@ namespace MasaBlazorApp3.DataAccess.Impl
 | 
			
		|||
                                .Set(cs => cs.EffDate, drugManuNo.EffDate.ToString());
 | 
			
		||||
                        }
 | 
			
		||||
                        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()
 | 
			
		||||
                        {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -231,6 +231,39 @@ namespace MasaBlazorApp3.DataAccess.Impl
 | 
			
		|||
                for (var i = 0; i < datas.Count; 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()
 | 
			
		||||
                    {
 | 
			
		||||
| 
						 | 
				
			
			@ -239,7 +272,7 @@ namespace MasaBlazorApp3.DataAccess.Impl
 | 
			
		|||
                        ColNo = orderTakeVo.ChannelStock.ColNo,
 | 
			
		||||
                        DrugId = orderTakeVo.ChannelStock.DrugId,
 | 
			
		||||
                        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,
 | 
			
		||||
                        Type = 2,
 | 
			
		||||
                        Quantity = orderTakeVo.GetQuantity,
 | 
			
		||||
| 
						 | 
				
			
			@ -266,7 +299,7 @@ namespace MasaBlazorApp3.DataAccess.Impl
 | 
			
		|||
                        MachineId = _setting.machineId,
 | 
			
		||||
                        DrugId = orderTakeVo.ChannelStock.DrugId,
 | 
			
		||||
                        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,
 | 
			
		||||
                        Type = 2,
 | 
			
		||||
                        OutQuantity = orderTakeVo.GetQuantity,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -107,5 +107,13 @@ namespace MasaBlazorApp3.DataAccess.Impl
 | 
			
		|||
            //}
 | 
			
		||||
            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;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -32,12 +32,11 @@ namespace MasaBlazorApp3.Finger
 | 
			
		|||
           // ConnectionMain();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public async void ConnectionMain()
 | 
			
		||||
        public async Task<bool> ConnectionMain()
 | 
			
		||||
        {
 | 
			
		||||
            await Task.Run(() =>
 | 
			
		||||
            {
 | 
			
		||||
                try
 | 
			
		||||
            return await Task<bool>.Run(() =>
 | 
			
		||||
            {
 | 
			
		||||
 | 
			
		||||
                bIsConnected = axCZKEM1.Connect_Net(_options.ip, fingerPort);
 | 
			
		||||
                logger.Info($"连接指纹机,IP:{_options.ip},端口:{fingerPort},机器号:{machineNumber},连接结果:{bIsConnected}");
 | 
			
		||||
                if (bIsConnected)
 | 
			
		||||
| 
						 | 
				
			
			@ -50,12 +49,10 @@ namespace MasaBlazorApp3.Finger
 | 
			
		|||
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
                }
 | 
			
		||||
                catch
 | 
			
		||||
                {
 | 
			
		||||
                }
 | 
			
		||||
                return bIsConnected;
 | 
			
		||||
            });
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        //If your fingerprint(or your card) passes the verification,this event will be triggered
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -30,6 +30,8 @@ namespace MasaBlazorApp3
 | 
			
		|||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public bool isInit { get; set; } = false;
 | 
			
		||||
 | 
			
		||||
        public event PropertyChangedEventHandler? PropertyChanged;
 | 
			
		||||
 | 
			
		||||
        //protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -19,7 +19,7 @@
 | 
			
		|||
                <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||!setting.Value.weigh.Contains(i))" Shade="Shade.Light" Variant="@(drawerNo !=i ? Variant.Outlined : Variant.Flat)" />
 | 
			
		||||
 | 
			
		||||
                    }
 | 
			
		||||
                </div>
 | 
			
		||||
| 
						 | 
				
			
			@ -50,7 +50,14 @@
 | 
			
		|||
    AllowPaging="true" PageSize="10" PagerHorizontalAlign="HorizontalAlign.Left" ShowPagingSummary="true" PagingSummaryFormat="{0}/{1} 共{2}条数据">
 | 
			
		||||
        <HeaderTemplate>
 | 
			
		||||
            <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>
 | 
			
		||||
        </HeaderTemplate>
 | 
			
		||||
        <Columns>
 | 
			
		||||
| 
						 | 
				
			
			@ -64,52 +71,17 @@
 | 
			
		|||
            <RadzenDataGridColumn Title="批次" Property="ManuNo">
 | 
			
		||||
                <Template Context="channel">
 | 
			
		||||
                    <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>
 | 
			
		||||
                <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 Title="库存" Property="Quantity">
 | 
			
		||||
                <Template Context="cs">
 | 
			
		||||
                    <RadzenButton ButtonStyle="ButtonStyle.Info" Variant="Variant.Flat" Shade="Shade.Lighter" class="m-1" Text="@cs.Quantity.ToString()" />
 | 
			
		||||
                </Template>
 | 
			
		||||
            </RadzenDataGridColumn>
 | 
			
		||||
            <RadzenDataGridColumn MinWidth="100px" Title="加药数量" Property="AddQuantity">
 | 
			
		||||
                <EditTemplate Context="cs">
 | 
			
		||||
                    @if (cs.BoardType == 2)
 | 
			
		||||
                    {
 | 
			
		||||
                        @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>
 | 
			
		||||
            <RadzenGridColumn Title="状态" Property="BiaoDingStatus">
 | 
			
		||||
 | 
			
		||||
            </RadzenGridColumn>
 | 
			
		||||
        </Columns>
 | 
			
		||||
    </RadzenDataGrid>
 | 
			
		||||
</RadzenStack>
 | 
			
		||||
| 
						 | 
				
			
			@ -119,8 +91,9 @@
 | 
			
		|||
    @inject PortUtil PortUtil;
 | 
			
		||||
    @inject NotificationService _message
 | 
			
		||||
    @inject IOptions<DrawerConfig> setting;
 | 
			
		||||
    @inject DialogService dialogService;
 | 
			
		||||
    int status = 0;
 | 
			
		||||
    int drawerNo = 1;
 | 
			
		||||
    int drawerNo = 0;
 | 
			
		||||
    RadzenDataGrid<ChannelStock> grid;
 | 
			
		||||
    private List<ChannelStock>? channels;
 | 
			
		||||
    bool isLoading;
 | 
			
		||||
| 
						 | 
				
			
			@ -128,11 +101,12 @@
 | 
			
		|||
    int[] DrawerNos = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 };
 | 
			
		||||
    int[] BeforeQuantity = new int[9];
 | 
			
		||||
    int[] AfterQuantity = new int[9];
 | 
			
		||||
    private readonly ILog logger = LogManager.GetLogger(typeof(DrawerAdd));
 | 
			
		||||
    private readonly ILog logger = LogManager.GetLogger(typeof(BiaoDing));
 | 
			
		||||
 | 
			
		||||
    // 当前操作的库位号列表
 | 
			
		||||
    public List<int> ColNos { get; set; } = new List<int>();
 | 
			
		||||
    int currentCol = 0;
 | 
			
		||||
    //当前操作的库位数据
 | 
			
		||||
    ChannelStock currentChannelStock;
 | 
			
		||||
    bool CompleteIsEnable = true;
 | 
			
		||||
    bool CancleIsEnable = true;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -146,7 +120,7 @@
 | 
			
		|||
    {
 | 
			
		||||
        isLoading = true;
 | 
			
		||||
 | 
			
		||||
        var result = await channelListDao.GetChannelStockByDrawerNoWithDrawers(drawerNo);
 | 
			
		||||
        var result = await channelListDao.GetChannelStockByBiaoDing(drawerNo);
 | 
			
		||||
        DrawerNos = result.DrawerArray;
 | 
			
		||||
        channels = result.ChannelStocks;
 | 
			
		||||
        count = result.ChannelStocks.Count;
 | 
			
		||||
| 
						 | 
				
			
			@ -158,7 +132,7 @@
 | 
			
		|||
    {
 | 
			
		||||
        this.status = 1;
 | 
			
		||||
        var promiseUtil = new PromiseUtil<object>();
 | 
			
		||||
        await promiseUtil.taskAsyncLoop(500, null, async (data, next, stop) =>
 | 
			
		||||
        await promiseUtil.taskAsyncLoop(300, null, async (data, next, stop) =>
 | 
			
		||||
        {
 | 
			
		||||
            try
 | 
			
		||||
            {
 | 
			
		||||
| 
						 | 
				
			
			@ -166,13 +140,11 @@
 | 
			
		|||
                {
 | 
			
		||||
                    stop();
 | 
			
		||||
                }
 | 
			
		||||
                // 开启抽屉
 | 
			
		||||
                else if (this.status == 1)
 | 
			
		||||
                else
 | 
			
		||||
                {
 | 
			
		||||
                    // if(库存》0)
 | 
			
		||||
                    // {}
 | 
			
		||||
 | 
			
		||||
                }
 | 
			
		||||
                    if (this.status == 1)
 | 
			
		||||
                    {
 | 
			
		||||
                        PortUtil.DrawerNo = this.drawerNo;
 | 
			
		||||
                        var b = await PortUtil.OpenDrawerStatus(this.drawerNo);
 | 
			
		||||
                        if (b)
 | 
			
		||||
                        {
 | 
			
		||||
| 
						 | 
				
			
			@ -181,79 +153,61 @@
 | 
			
		|||
                            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)
 | 
			
		||||
                        else
 | 
			
		||||
                        {
 | 
			
		||||
                    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 b2 = await PortUtil.CheckDrawerStatus2(drawerNo);
 | 
			
		||||
                    // 关闭则改变状态并终止循环
 | 
			
		||||
                    if (b2)
 | 
			
		||||
                    {
 | 
			
		||||
                        PortUtil.SpeakAsync($"加药完成,请,核对,或,录入,正确的,添加数量");
 | 
			
		||||
                        // 判断是否为称重抽屉
 | 
			
		||||
                        if (setting.Value.weigh != null && setting.Value.weigh.Contains(this.drawerNo))
 | 
			
		||||
                        {
 | 
			
		||||
                            //关闭抽屉后获取称重稳定数量
 | 
			
		||||
                            // await GetWeightQuantity();
 | 
			
		||||
                        }
 | 
			
		||||
                        this.status = 3;
 | 
			
		||||
                            _message.Notify(
 | 
			
		||||
                            new NotificationMessage { Severity = NotificationSeverity.Error, Summary = "提示", Detail = $"抽屉【{drawerNo}】打开失败,请检测硬件", Duration = 4000 }
 | 
			
		||||
                            );
 | 
			
		||||
                            logger.Info($"抽屉打开失败");
 | 
			
		||||
                            RestData();
 | 
			
		||||
                            PortUtil.Operate = false;
 | 
			
		||||
                            stop();
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                    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);
 | 
			
		||||
                            AfterQuantity = quantity.Select(it => Convert.ToInt32(it)).ToArray().Skip(3).Take(9).ToArray();
 | 
			
		||||
                            logger.Info($"单支抽屉,抽屉未关检测数量【{string.Join(",", AfterQuantity)}】");
 | 
			
		||||
 | 
			
		||||
                            channels.ForEach(cl =>
 | 
			
		||||
                            if (this.status == 2)
 | 
			
		||||
                            {
 | 
			
		||||
                            cl.AddQuantity = this.AfterQuantity[cl.ColNo - 1] - this.BeforeQuantity[cl.ColNo - 1];
 | 
			
		||||
                        });
 | 
			
		||||
                                //药盒称重抽屉
 | 
			
		||||
                                if (currentChannelStock != null && currentChannelStock.BoardType.ToString().Contains("3"))
 | 
			
		||||
                                {
 | 
			
		||||
                                    //打开药盒
 | 
			
		||||
                                    await PortUtil.OpenBoxByColNo(currentChannelStock.ColNo);
 | 
			
		||||
                                    this.status = 3;
 | 
			
		||||
                                }
 | 
			
		||||
                        // 判断是否为称重抽屉
 | 
			
		||||
                        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;
 | 
			
		||||
                                logger.Info($"AfterQuantity:{i}-{AfterQuantity}数量{string.Join(",", BeforeQuantity)}");
 | 
			
		||||
                            }
 | 
			
		||||
                            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)
 | 
			
		||||
            {
 | 
			
		||||
                logger.Info($"抽屉加药发生错误,{e.Message}");
 | 
			
		||||
                logger.Info($"标定药品发生错误,{e.Message}");
 | 
			
		||||
                _message.Notify(
 | 
			
		||||
                new NotificationMessage { Severity = NotificationSeverity.Error, Summary = "提示", Detail = $"发生错误,{e.Message}", Duration = 4000 }
 | 
			
		||||
            );
 | 
			
		||||
| 
						 | 
				
			
			@ -270,19 +224,28 @@
 | 
			
		|||
    {
 | 
			
		||||
        this.status = 0;
 | 
			
		||||
    }
 | 
			
		||||
    void Cancel()
 | 
			
		||||
    {
 | 
			
		||||
        this.status = 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void OnCellClick(DataGridCellMouseEventArgs<ChannelStock> args)
 | 
			
		||||
    {
 | 
			
		||||
        if (args.Data.BoardType.ToString().Contains("3"))
 | 
			
		||||
        if (this.status == 0)
 | 
			
		||||
        {
 | 
			
		||||
            //是药盒抽屉则点击行,打开对应行的药箱
 | 
			
		||||
            if (!ColNos.Contains(args.Data.ColNo))
 | 
			
		||||
            {
 | 
			
		||||
                ColNos.Add(args.Data.ColNo);
 | 
			
		||||
            }
 | 
			
		||||
            PortUtil.SpeakAsync("请先打开抽屉后再点开药盒");
 | 
			
		||||
        }
 | 
			
		||||
        else
 | 
			
		||||
        {
 | 
			
		||||
            grid.EditRow(args.Data);
 | 
			
		||||
            currentChannelStock = args.Data;
 | 
			
		||||
            if (args.Data.BoardType.ToString().Contains("3"))
 | 
			
		||||
            {
 | 
			
		||||
                PortUtil.SpeakAsync("正在打开药盒");
 | 
			
		||||
            }
 | 
			
		||||
            // else
 | 
			
		||||
            // {
 | 
			
		||||
            //     grid.EditRow(args.Data);
 | 
			
		||||
            // }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -1,7 +1,8 @@
 | 
			
		|||
 | 
			
		||||
<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">
 | 
			
		||||
        <RadzenButton Click="@ConfirmOK" ButtonStyle="ButtonStyle.Success" Variant="Variant.Flat" Text="确认" Style="width: 120px" />
 | 
			
		||||
| 
						 | 
				
			
			@ -11,8 +11,9 @@
 | 
			
		|||
</style>
 | 
			
		||||
<RadzenStack Orientation="Orientation.Horizontal">
 | 
			
		||||
    <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">
 | 
			
		||||
            @* <RadzenStack AlignItems="AlignItems.Center" JustifyContent="JustifyContent.Center" Orientation="Orientation.Vertical" Style="margin-top: 220px"> *@
 | 
			
		||||
        @if (DrawerNos.Count() > 8)
 | 
			
		||||
        {
 | 
			
		||||
            <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">
 | 
			
		||||
                <div class="row justify-content-around align-items-center" style="margin-top: 220px; height: 430px;">
 | 
			
		||||
                    @foreach (int i in DrawerNos)
 | 
			
		||||
                    {
 | 
			
		||||
| 
						 | 
				
			
			@ -20,8 +21,20 @@
 | 
			
		|||
 | 
			
		||||
                    }
 | 
			
		||||
                </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>
 | 
			
		||||
    <RadzenDataGrid @ref="grid"
 | 
			
		||||
    LoadData="@LoadData"
 | 
			
		||||
| 
						 | 
				
			
			@ -36,11 +49,11 @@
 | 
			
		|||
            <RadzenRow JustifyContent="JustifyContent.End">
 | 
			
		||||
                @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)
 | 
			
		||||
                {
 | 
			
		||||
                    <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)
 | 
			
		||||
                {
 | 
			
		||||
| 
						 | 
				
			
			@ -59,7 +72,19 @@
 | 
			
		|||
            <RadzenDataGridColumn Title="批次" Property="ManuNo">
 | 
			
		||||
                <Template Context="channel">
 | 
			
		||||
                    <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>
 | 
			
		||||
                <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;">
 | 
			
		||||
                            <Template>
 | 
			
		||||
                                <RadzenText TextStyle="TextStyle.Subtitle2" class="mb-0">@((context as DrugManuNo)?.ManuNo)</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>
 | 
			
		||||
                            <ValueTemplate>
 | 
			
		||||
                                <RadzenStack Orientation="Orientation.Horizontal">
 | 
			
		||||
                                    <RadzenText TextStyle="TextStyle.Subtitle2" class="mb-0">@((context as DrugManuNo)?.ManuNo)</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>
 | 
			
		||||
                            </ValueTemplate>
 | 
			
		||||
                        </RadzenDropDown>
 | 
			
		||||
| 
						 | 
				
			
			@ -94,7 +137,7 @@
 | 
			
		|||
            </RadzenDataGridColumn>
 | 
			
		||||
            <RadzenDataGridColumn MinWidth="100px" Title="加药数量" Property="AddQuantity">
 | 
			
		||||
                <EditTemplate Context="cs">
 | 
			
		||||
                    @if (cs.BoardType == 2)
 | 
			
		||||
                    @if (cs.BoardType.ToString().Contains("2") || cs.BoardType.ToString().Contains("3"))
 | 
			
		||||
                    {
 | 
			
		||||
                        @cs.AddQuantity
 | 
			
		||||
                    }
 | 
			
		||||
| 
						 | 
				
			
			@ -148,6 +191,7 @@
 | 
			
		|||
    }
 | 
			
		||||
    async Task OpenDrawer()
 | 
			
		||||
    {
 | 
			
		||||
        PortUtil.DrawerNo = this.drawerNo;
 | 
			
		||||
        this.status = 1;
 | 
			
		||||
        // 根据抽屉类型来决定打开前是否需要查询数量
 | 
			
		||||
        var promiseUtil = new PromiseUtil<object>();
 | 
			
		||||
| 
						 | 
				
			
			@ -170,16 +214,16 @@
 | 
			
		|||
                        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)}");
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                    // if (setting.Value.weigh != null && setting.Value.weigh.Contains(this.drawerNo))
 | 
			
		||||
                    // {
 | 
			
		||||
                    //     //开抽屉前先查数
 | 
			
		||||
                    //     for (int i = 0; i < 9; i++)
 | 
			
		||||
                    //     {
 | 
			
		||||
                    //         int beforeQuantity = await PortUtil.CheckQuantityForSingle(i + 1);
 | 
			
		||||
                    //         BeforeQuantity[i] = beforeQuantity;
 | 
			
		||||
                    //         logger.Info($"BeforeQuantity:{i++}-{beforeQuantity}数量{string.Join(",", BeforeQuantity)}");
 | 
			
		||||
                    //     }
 | 
			
		||||
                    // }
 | 
			
		||||
 | 
			
		||||
                    var b = await PortUtil.OpenDrawerStatus(this.drawerNo);
 | 
			
		||||
                    if (b)
 | 
			
		||||
| 
						 | 
				
			
			@ -204,14 +248,6 @@
 | 
			
		|||
                // 检测状态
 | 
			
		||||
                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);
 | 
			
		||||
                    // 关闭则改变状态并终止循环
 | 
			
		||||
| 
						 | 
				
			
			@ -230,6 +266,29 @@
 | 
			
		|||
                    }
 | 
			
		||||
                    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))
 | 
			
		||||
                        {
 | 
			
		||||
                            byte[] quantity = await PortUtil.CheckQuantityByDrawer(this.drawerNo);
 | 
			
		||||
| 
						 | 
				
			
			@ -245,16 +304,17 @@
 | 
			
		|||
                        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);
 | 
			
		||||
                                AfterQuantity[i] = afterQuantity;
 | 
			
		||||
                                logger.Info($"AfterQuantity:{i}-{AfterQuantity}数量{string.Join(",", BeforeQuantity)}");
 | 
			
		||||
                                int afterQuantity = await PortUtil.CheckQuantityForSingle(ColNos[i]);
 | 
			
		||||
                                AfterQuantity[ColNos[i]-1] = afterQuantity;
 | 
			
		||||
                                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];
 | 
			
		||||
                              });
 | 
			
		||||
                            await InvokeAsync(StateHasChanged);
 | 
			
		||||
                        }
 | 
			
		||||
                        next(); // continue iteration
 | 
			
		||||
                    }
 | 
			
		||||
| 
						 | 
				
			
			@ -282,6 +342,8 @@
 | 
			
		|||
        this.status = 0;
 | 
			
		||||
        this.BeforeQuantity = new int[9];
 | 
			
		||||
        this.AfterQuantity = new int[9];
 | 
			
		||||
        currentCol = 0;
 | 
			
		||||
        ColNos.Clear();
 | 
			
		||||
    }
 | 
			
		||||
    //关闭抽屉后获取称重稳定数量
 | 
			
		||||
    public async Task GetWeightQuantity()
 | 
			
		||||
| 
						 | 
				
			
			@ -311,6 +373,10 @@
 | 
			
		|||
                                 {
 | 
			
		||||
                                     cl.AddQuantity = this.AfterQuantity[cl.ColNo - 1] - this.BeforeQuantity[cl.ColNo - 1];
 | 
			
		||||
                                 });
 | 
			
		||||
                                CompleteIsEnable = true;
 | 
			
		||||
                                CancleIsEnable = true;
 | 
			
		||||
                                logger.Info("对比成功停止循环");
 | 
			
		||||
                                await InvokeAsync(StateHasChanged);
 | 
			
		||||
                            }
 | 
			
		||||
                            else
 | 
			
		||||
                            {
 | 
			
		||||
| 
						 | 
				
			
			@ -330,6 +396,7 @@
 | 
			
		|||
                            }
 | 
			
		||||
                            CompleteIsEnable = false;
 | 
			
		||||
                            PortUtil.DrawerNo = drawerNo;
 | 
			
		||||
                            PortUtil.ColNoLst = ColNos;
 | 
			
		||||
                            int[] quantity = await PortUtil.CheckQuantityByAddrForMulti();
 | 
			
		||||
                            AfterQuantity = quantity;
 | 
			
		||||
                            int[] Quantitys = new int[BeforeQuantity.Length];
 | 
			
		||||
| 
						 | 
				
			
			@ -377,14 +444,15 @@
 | 
			
		|||
            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);
 | 
			
		||||
                    });
 | 
			
		||||
                }
 | 
			
		||||
                ColNos.Clear();
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -396,7 +464,7 @@
 | 
			
		|||
 | 
			
		||||
    void Cancel()
 | 
			
		||||
    {
 | 
			
		||||
        this.status = 0;
 | 
			
		||||
        RestData();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void SelectDrawer(int drawerNo)
 | 
			
		||||
| 
						 | 
				
			
			@ -407,19 +475,21 @@
 | 
			
		|||
 | 
			
		||||
    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)
 | 
			
		||||
        {
 | 
			
		||||
            //是药盒抽屉则点击行,打开对应行的药箱
 | 
			
		||||
            if (!ColNos.Contains(args.Data.ColNo))
 | 
			
		||||
            {
 | 
			
		||||
                ColNos.Add(args.Data.ColNo);
 | 
			
		||||
            PortUtil.SpeakAsync("请先点取药按钮打开抽屉");
 | 
			
		||||
        }
 | 
			
		||||
        }
 | 
			
		||||
        else
 | 
			
		||||
        {
 | 
			
		||||
        currentCol = args.Data.ColNo;
 | 
			
		||||
        grid.EditRow(args.Data);
 | 
			
		||||
    }
 | 
			
		||||
    }
 | 
			
		||||
    private IDisposable? registration;
 | 
			
		||||
    protected override void OnAfterRender(bool firstRender)
 | 
			
		||||
    {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -10,19 +10,10 @@
 | 
			
		|||
    }
 | 
			
		||||
</style>
 | 
			
		||||
<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="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">
 | 
			
		||||
            @* <RadzenStack AlignItems="AlignItems.Center" JustifyContent="JustifyContent.Center" Orientation="Orientation.Vertical" Style="margin-top: 220px"> *@
 | 
			
		||||
        @if (DrawerNos.Count() > 8)
 | 
			
		||||
        {
 | 
			
		||||
            <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">
 | 
			
		||||
                <div class="row justify-content-around align-items-center" style="margin-top: 220px; height: 430px;">
 | 
			
		||||
                    @foreach (int i in DrawerNos)
 | 
			
		||||
                    {
 | 
			
		||||
| 
						 | 
				
			
			@ -30,8 +21,20 @@
 | 
			
		|||
 | 
			
		||||
                    }
 | 
			
		||||
                </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>
 | 
			
		||||
    <RadzenDataGrid @ref="grid"
 | 
			
		||||
                    LoadData="@LoadData"
 | 
			
		||||
| 
						 | 
				
			
			@ -79,7 +82,7 @@
 | 
			
		|||
            </RadzenDataGridColumn>
 | 
			
		||||
            <RadzenDataGridColumn MinWidth="120px" Title="取药数量" Property="TakeQuantity">
 | 
			
		||||
                <EditTemplate Context="channel">
 | 
			
		||||
                    @if (channel.BoardType == 2)
 | 
			
		||||
                    @if (channel.BoardType.ToString().Contains("2") || channel.BoardType.ToString().Contains("3"))
 | 
			
		||||
                    {
 | 
			
		||||
                        @channel.TakeQuantity
 | 
			
		||||
                    }
 | 
			
		||||
| 
						 | 
				
			
			@ -112,6 +115,7 @@
 | 
			
		|||
 | 
			
		||||
    // 当前操作的库位号列表
 | 
			
		||||
    public List<int> ColNos { get; set; } = new List<int>();
 | 
			
		||||
    int currentCol = 0;
 | 
			
		||||
    bool CompleteIsEnable = true;
 | 
			
		||||
    bool CancleIsEnable = true;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -122,7 +126,7 @@
 | 
			
		|||
        isLoading = true;
 | 
			
		||||
 | 
			
		||||
        // var result = await channelListDao.GetChannelStockByDrawerNo(drawerNo, 1);
 | 
			
		||||
        var result = await channelListDao.GetChannelStockByDrawerNoWithDrawers(drawerNo);
 | 
			
		||||
        var result = await channelListDao.GetChannelStockByDrawerNoWithDrawers(drawerNo, 1);
 | 
			
		||||
        DrawerNos = result.DrawerArray;
 | 
			
		||||
        // Update the Data property
 | 
			
		||||
        channels = result.ChannelStocks;
 | 
			
		||||
| 
						 | 
				
			
			@ -134,6 +138,7 @@
 | 
			
		|||
    }
 | 
			
		||||
    async Task OpenDrawer()
 | 
			
		||||
    {
 | 
			
		||||
        PortUtil.DrawerNo = this.drawerNo;
 | 
			
		||||
        this.status = 1;
 | 
			
		||||
        // 根据抽屉类型来决定打开前是否需要查询数量
 | 
			
		||||
        var promiseUtil = new PromiseUtil<object>();
 | 
			
		||||
| 
						 | 
				
			
			@ -155,17 +160,6 @@
 | 
			
		|||
                        BeforeQuantity = quantity.Select(it => Convert.ToInt32(it)).ToArray().Skip(3).Take(9).ToArray();
 | 
			
		||||
                        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);
 | 
			
		||||
                    if (b)
 | 
			
		||||
| 
						 | 
				
			
			@ -189,15 +183,6 @@
 | 
			
		|||
                // 检测状态
 | 
			
		||||
                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);
 | 
			
		||||
                    // 关闭则改变状态并终止循环
 | 
			
		||||
| 
						 | 
				
			
			@ -217,32 +202,63 @@
 | 
			
		|||
                    }
 | 
			
		||||
                    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))
 | 
			
		||||
                        {
 | 
			
		||||
                            byte[] quantity = await PortUtil.CheckQuantityByDrawer(this.drawerNo);
 | 
			
		||||
                            AfterQuantity = quantity.Select(it => Convert.ToInt32(it)).ToArray().Skip(3).Take(9).ToArray();
 | 
			
		||||
                            logger.Info($"单支抽屉,抽屉未关检测数量【{string.Join(",", AfterQuantity)}】");
 | 
			
		||||
 | 
			
		||||
                            if (!BeforeQuantity.SequenceEqual(AfterQuantity))
 | 
			
		||||
                            {
 | 
			
		||||
                                channels.ForEach(cl =>
 | 
			
		||||
                            {
 | 
			
		||||
                                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))
 | 
			
		||||
                        {
 | 
			
		||||
                            //开抽屉后查数
 | 
			
		||||
                            for (int i = 0; i < 9; i++)
 | 
			
		||||
                            for (int i = 0; i < ColNos.Count; i++)
 | 
			
		||||
                            {
 | 
			
		||||
                                int afterQuantity = await PortUtil.CheckQuantityForSingle(i);
 | 
			
		||||
                                AfterQuantity[i] = afterQuantity;
 | 
			
		||||
                                logger.Info($"AfterQuantity:{i}-{AfterQuantity}数量{string.Join(",", BeforeQuantity)}");
 | 
			
		||||
                                int afterQuantity = await PortUtil.CheckQuantityForSingle(ColNos[i]);
 | 
			
		||||
                                AfterQuantity[ColNos[i]-1] = afterQuantity;
 | 
			
		||||
                                logger.Info($"AfterQuantity:{ColNos[i]}-{afterQuantity}数量{string.Join(",", AfterQuantity)}");
 | 
			
		||||
                            }
 | 
			
		||||
                            channels.ForEach(cl =>
 | 
			
		||||
                            if (!BeforeQuantity.SequenceEqual(AfterQuantity))
 | 
			
		||||
                            {
 | 
			
		||||
                                  cl.TakeQuantity = this.AfterQuantity[cl.ColNo - 1] - this.BeforeQuantity[cl.ColNo - 1];
 | 
			
		||||
                                channels.Where(cl => ColNos.Contains(cl.ColNo)).ToList().ForEach(cl =>
 | 
			
		||||
                              {
 | 
			
		||||
                                  cl.TakeQuantity = this.BeforeQuantity[cl.ColNo - 1] - this.AfterQuantity[cl.ColNo - 1];
 | 
			
		||||
                              });
 | 
			
		||||
                                await InvokeAsync(StateHasChanged);
 | 
			
		||||
                            }
 | 
			
		||||
                        }
 | 
			
		||||
                        next(); // continue iteration
 | 
			
		||||
                    }
 | 
			
		||||
| 
						 | 
				
			
			@ -300,6 +316,7 @@
 | 
			
		|||
                                 {
 | 
			
		||||
                                     cl.TakeQuantity = this.BeforeQuantity[cl.ColNo - 1] - this.AfterQuantity[cl.ColNo - 1];
 | 
			
		||||
                                 });
 | 
			
		||||
                                await InvokeAsync(StateHasChanged);
 | 
			
		||||
                            }
 | 
			
		||||
                            else
 | 
			
		||||
                            {
 | 
			
		||||
| 
						 | 
				
			
			@ -320,6 +337,7 @@
 | 
			
		|||
                            }
 | 
			
		||||
                            CompleteIsEnable = false;
 | 
			
		||||
                            PortUtil.DrawerNo = drawerNo;
 | 
			
		||||
                            PortUtil.ColNoLst = ColNos;
 | 
			
		||||
                            int[] quantity = await PortUtil.CheckQuantityByAddrForMulti();
 | 
			
		||||
                            AfterQuantity = quantity;
 | 
			
		||||
                            int[] Quantitys = new int[BeforeQuantity.Length];
 | 
			
		||||
| 
						 | 
				
			
			@ -329,10 +347,14 @@
 | 
			
		|||
                            }
 | 
			
		||||
                            finallyQuantity.Add(Quantitys);
 | 
			
		||||
                            logger.Info($"Quantity{string.Join(",", Quantitys)}");
 | 
			
		||||
                            if (!BeforeQuantity.SequenceEqual(AfterQuantity))
 | 
			
		||||
                            {
 | 
			
		||||
                                channels.ForEach(cl =>
 | 
			
		||||
                                 {
 | 
			
		||||
                                     cl.TakeQuantity = this.BeforeQuantity[cl.ColNo - 1] - this.AfterQuantity[cl.ColNo - 1];
 | 
			
		||||
                                 });
 | 
			
		||||
                                await InvokeAsync(StateHasChanged);
 | 
			
		||||
                            }
 | 
			
		||||
                            next();
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
| 
						 | 
				
			
			@ -357,8 +379,10 @@
 | 
			
		|||
        this.status = 0;
 | 
			
		||||
        this.BeforeQuantity = new int[9];
 | 
			
		||||
        this.AfterQuantity = new int[9];
 | 
			
		||||
        ColNos.Clear();
 | 
			
		||||
        currentCol = 0;
 | 
			
		||||
 | 
			
		||||
        InvokeAsync(StateHasChanged);
 | 
			
		||||
        // InvokeAsync(StateHasChanged);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    async Task TakeFinish()
 | 
			
		||||
| 
						 | 
				
			
			@ -376,12 +400,12 @@
 | 
			
		|||
            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,31 +418,36 @@
 | 
			
		|||
 | 
			
		||||
    void Cancel()
 | 
			
		||||
    {
 | 
			
		||||
        this.status = 0;
 | 
			
		||||
        RestData();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void SelectDrawer(int drawerNo)
 | 
			
		||||
    {
 | 
			
		||||
        this.drawerNo = drawerNo;
 | 
			
		||||
        InvokeAsync(StateHasChanged);
 | 
			
		||||
        grid.Reload();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    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)
 | 
			
		||||
        {
 | 
			
		||||
            //是药盒抽屉则点击行,打开对应行的药箱
 | 
			
		||||
            if (!ColNos.Contains(args.Data.ColNo))
 | 
			
		||||
            {
 | 
			
		||||
                ColNos.Add(args.Data.ColNo);
 | 
			
		||||
            PortUtil.SpeakAsync("请先点取药按钮打开抽屉");
 | 
			
		||||
        }
 | 
			
		||||
        }
 | 
			
		||||
        else
 | 
			
		||||
        {
 | 
			
		||||
        currentCol = args.Data.ColNo;
 | 
			
		||||
        grid.EditRow(args.Data);
 | 
			
		||||
    }
 | 
			
		||||
    }
 | 
			
		||||
    private IDisposable? registration;
 | 
			
		||||
    protected override void OnAfterRender(bool firstRender)
 | 
			
		||||
    {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -248,9 +248,9 @@
 | 
			
		|||
        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 });
 | 
			
		||||
             if(b)
 | 
			
		||||
            {
 | 
			
		||||
| 
						 | 
				
			
			@ -301,9 +301,9 @@
 | 
			
		|||
        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 }
 | 
			
		||||
            );
 | 
			
		||||
            if(b)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -0,0 +1,130 @@
 | 
			
		|||
@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.H5" class="rz-color-white">操作人 @globalStateService.Operator?.NickName 正在修改密码</RadzenText>
 | 
			
		||||
            }
 | 
			
		||||
            else if (userI == 2)
 | 
			
		||||
            {
 | 
			
		||||
                <RadzenText TextStyle="TextStyle.H5" 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="oldPassword">原密码</label>
 | 
			
		||||
                    <div class="rz-form-input-wrapper">
 | 
			
		||||
                        <RadzenPassword id="oldPassword" Name="oldPassword" @bind-Value="@loginModel.OldPassword" Style="width:100%" />
 | 
			
		||||
                        <RadzenRequiredValidator Component="oldPassword" 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))
 | 
			
		||||
            {
 | 
			
		||||
                u.Password = loginModel.Password;
 | 
			
		||||
                bool iRet=userDao.UpdateUserPassword(u);
 | 
			
		||||
                if (iRet)
 | 
			
		||||
                {
 | 
			
		||||
                    _message.Notify(new NotificationMessage { Severity = NotificationSeverity.Success, 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 Exit()
 | 
			
		||||
    {
 | 
			
		||||
        dialogService.Close(false);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -1,4 +1,4 @@
 | 
			
		|||
@page "/home"
 | 
			
		||||
@page "/"
 | 
			
		||||
@using MasaBlazorApp3.Util
 | 
			
		||||
@using log4net
 | 
			
		||||
@layout EmptyLayout
 | 
			
		||||
| 
						 | 
				
			
			@ -46,11 +46,16 @@
 | 
			
		|||
        <RadzenColumn Size="8">
 | 
			
		||||
            <RadzenRow Style="height: 100%;width:100%" Orientation="Orientation.Horizontal" JustifyContent="JustifyContent.End" AlignItems="AlignItems.Center">
 | 
			
		||||
                <RadzenColumn Size="3">
 | 
			
		||||
 | 
			
		||||
                    <RadzenText Style="" class="rz-color-white" TextStyle="TextStyle.H5" TextAlign="TextAlign.Center">操作人:@Operator.NickName</RadzenText>
 | 
			
		||||
                    @if (Reviewer != null)
 | 
			
		||||
                    @if (globalStateService.Operator != 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 Size="3">
 | 
			
		||||
| 
						 | 
				
			
			@ -65,51 +70,66 @@
 | 
			
		|||
        <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))">
 | 
			
		||||
                <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)
 | 
			
		||||
                {
 | 
			
		||||
                    @if (!globalStateService.Operator.role.permissionIds.Any(id => id - 10 < 10))
 | 
			
		||||
                    {
 | 
			
		||||
                        <div class="mask">
 | 
			
		||||
                            <RadzenImage Path="images/no_auth.png" />
 | 
			
		||||
                        </div>
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            </RadzenStack>
 | 
			
		||||
            <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>
 | 
			
		||||
                @if (!Operator.role.permissionIds.Any(id => id - 20 > 0 && id - 20 < 10))
 | 
			
		||||
                @if (globalStateService.Operator != null)
 | 
			
		||||
                {
 | 
			
		||||
                    @if (!globalStateService.Operator.role.permissionIds.Any(id => id - 20 > 0 && id - 20 < 10))
 | 
			
		||||
                    {
 | 
			
		||||
                        <div class="mask">
 | 
			
		||||
                            <RadzenImage Path="images/no_auth.png" />
 | 
			
		||||
                        </div>
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            </RadzenStack>
 | 
			
		||||
        </RadzenStack>
 | 
			
		||||
        <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%">
 | 
			
		||||
                <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)
 | 
			
		||||
                {
 | 
			
		||||
                    @if (!globalStateService.Operator.role.permissionIds.Any(id => id - 30 > 0 && id - 30 < 10))
 | 
			
		||||
                    {
 | 
			
		||||
                        <div class="mask">
 | 
			
		||||
                            <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))
 | 
			
		||||
                    @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 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>
 | 
			
		||||
                    @if (!Operator.role.permissionIds.Any(id => id - 50 > 0 && id - 50 < 10))
 | 
			
		||||
                    @if (globalStateService.Operator != null)
 | 
			
		||||
                    {
 | 
			
		||||
                        @if (!globalStateService.Operator.role.permissionIds.Any(id => id - 50 > 0 && id - 50 < 10))
 | 
			
		||||
                        {
 | 
			
		||||
                            <div class="mask">
 | 
			
		||||
                                <RadzenImage Path="images/no_auth.png" />
 | 
			
		||||
                            </div>
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                </RadzenStack>
 | 
			
		||||
 | 
			
		||||
            </RadzenStack>
 | 
			
		||||
| 
						 | 
				
			
			@ -119,12 +139,12 @@
 | 
			
		|||
 | 
			
		||||
 | 
			
		||||
@code {
 | 
			
		||||
    @inject Radzen.DialogService dialogService;
 | 
			
		||||
    @inject NotificationService _message
 | 
			
		||||
    @inject NavigationManager na;
 | 
			
		||||
    @inject TooltipService tooltipService
 | 
			
		||||
    private List<Premission> userPremissions { get; set; } = new();
 | 
			
		||||
    @inject GlobalStateService globalStateService;
 | 
			
		||||
    Pojo.User Operator;
 | 
			
		||||
    Pojo.User Reviewer;
 | 
			
		||||
 | 
			
		||||
    Timer timer;
 | 
			
		||||
    @inject PortUtil _portUtil;
 | 
			
		||||
| 
						 | 
				
			
			@ -134,11 +154,6 @@
 | 
			
		|||
 | 
			
		||||
    protected override void OnInitialized()
 | 
			
		||||
    {
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        Operator = globalStateService.Operator;
 | 
			
		||||
        Reviewer = globalStateService.Reviewer;
 | 
			
		||||
 | 
			
		||||
        // timer = new Timer(state =>
 | 
			
		||||
        // {
 | 
			
		||||
        //     var now = DateTime.Now;
 | 
			
		||||
| 
						 | 
				
			
			@ -167,10 +182,9 @@
 | 
			
		|||
                           // 无人操作鼠标键盘
 | 
			
		||||
                           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.Reviewer = null;
 | 
			
		||||
                               na.NavigateTo("");
 | 
			
		||||
                               stop();
 | 
			
		||||
                           }
 | 
			
		||||
                           else
 | 
			
		||||
| 
						 | 
				
			
			@ -199,22 +213,87 @@
 | 
			
		|||
        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>(
 | 
			
		||||
               $"调拨入库详情",
 | 
			
		||||
             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)
 | 
			
		||||
        {
 | 
			
		||||
            this.init();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    async void jump2Page(int parentId)
 | 
			
		||||
    {
 | 
			
		||||
        bool a = true;
 | 
			
		||||
        if ((setting.Value.loginMode == 2 && (globalStateService.Operator == null || globalStateService.Reviewer == null))
 | 
			
		||||
        || setting.Value.loginMode == 1 && globalStateService.Operator == null)
 | 
			
		||||
        {
 | 
			
		||||
            a = await dialogService.OpenAsync<LoginDialog>(
 | 
			
		||||
                  "",
 | 
			
		||||
                null,
 | 
			
		||||
                new DialogOptions() { Width = "55vw", Resizable = false, Draggable = false, ShowClose = false, ShowTitle = false });
 | 
			
		||||
 | 
			
		||||
        }
 | 
			
		||||
        // 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);
 | 
			
		||||
            currentPage = false;
 | 
			
		||||
            }
 | 
			
		||||
            else
 | 
			
		||||
            {
 | 
			
		||||
                _message.Notify(
 | 
			
		||||
                            new NotificationMessage { Severity = NotificationSeverity.Error, Summary = "提示", Detail = $"没有权限不能访问", Duration = 3000 }
 | 
			
		||||
                        );
 | 
			
		||||
                await InvokeAsync(StateHasChanged);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    void logout()
 | 
			
		||||
    {
 | 
			
		||||
        if (globalStateService.Operator != null)
 | 
			
		||||
        {
 | 
			
		||||
            globalStateService.Operator = null;
 | 
			
		||||
            globalStateService.Reviewer = null;
 | 
			
		||||
        na.NavigateTo("");
 | 
			
		||||
        }
 | 
			
		||||
        else
 | 
			
		||||
        {
 | 
			
		||||
            Environment.Exit(0);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
    //修改密码
 | 
			
		||||
    async void EditPassword(int i)
 | 
			
		||||
    {
 | 
			
		||||
        //修改复核人
 | 
			
		||||
        await dialogService.OpenAsync<EditPasswordDialog>(
 | 
			
		||||
        "",
 | 
			
		||||
          new Dictionary<string, object>() { { "userI", i } },
 | 
			
		||||
        new DialogOptions() { Width = "55vw", Resizable = false, Draggable = false, ShowClose = false, ShowTitle = false });
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,4 +1,4 @@
 | 
			
		|||
@page "/"
 | 
			
		||||
@page "/login"
 | 
			
		||||
@layout EmptyLayout
 | 
			
		||||
 | 
			
		||||
@using System.ComponentModel;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -89,6 +89,13 @@
 | 
			
		|||
 | 
			
		||||
    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()
 | 
			
		||||
    {
 | 
			
		||||
        if (data.Any(it => it.Quantity != it.ChannelStocks.Sum(cs => cs.AddQuantity)))
 | 
			
		||||
| 
						 | 
				
			
			@ -97,7 +104,8 @@
 | 
			
		|||
                new NotificationMessage { Severity = NotificationSeverity.Error, Summary = "提示", Detail = $"请填写正确的入库数量!", Duration = 4000 }
 | 
			
		||||
            );
 | 
			
		||||
 | 
			
		||||
        } else
 | 
			
		||||
        }
 | 
			
		||||
        else
 | 
			
		||||
        {
 | 
			
		||||
            await OpenDrawer();
 | 
			
		||||
        }
 | 
			
		||||
| 
						 | 
				
			
			@ -142,15 +150,36 @@
 | 
			
		|||
                    {
 | 
			
		||||
                        BeforeQuantity = new int[9];
 | 
			
		||||
                        AfterQuantity = new int[9];
 | 
			
		||||
                        // 判断是否为单支抽屉
 | 
			
		||||
                        if (setting.Value.single.Contains(drawerNo))
 | 
			
		||||
                        for (int j = 0; j < data[index].ChannelStocks.Count; j++)
 | 
			
		||||
                        {
 | 
			
		||||
                            byte[] quantity = await PortUtil.CheckQuantityByDrawer(drawerNo);
 | 
			
		||||
                            // _flagList.Add(flag);
 | 
			
		||||
                            //单支-查数
 | 
			
		||||
                            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());
 | 
			
		||||
                            }
 | 
			
		||||
                            //称重-查数
 | 
			
		||||
                            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);
 | 
			
		||||
                        if (b)
 | 
			
		||||
                        {
 | 
			
		||||
| 
						 | 
				
			
			@ -186,6 +215,80 @@
 | 
			
		|||
                            {
 | 
			
		||||
                                PortUtil.SpeakAsync($"加药完成,请,点击完成按钮进行确认");
 | 
			
		||||
                                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();
 | 
			
		||||
                            }
 | 
			
		||||
                            else
 | 
			
		||||
| 
						 | 
				
			
			@ -196,21 +299,21 @@
 | 
			
		|||
                        }
 | 
			
		||||
                        else
 | 
			
		||||
                        {
 | 
			
		||||
                            if (setting.Value.single.Contains(drawerNo))
 | 
			
		||||
                            {
 | 
			
		||||
                                byte[] quantity = await PortUtil.CheckQuantityByDrawer(drawerNo);
 | 
			
		||||
                                AfterQuantity = quantity.Select(it => Convert.ToInt32(it)).ToArray().Skip(3).Take(9).ToArray();
 | 
			
		||||
                                logger.Info($"单支抽屉【{drawerNo}】,抽屉未关检测数量【{string.Join(",", AfterQuantity)}】");
 | 
			
		||||
                            // if (setting.Value.single.Contains(drawerNo))
 | 
			
		||||
                            // {
 | 
			
		||||
                            //     byte[] quantity = await PortUtil.CheckQuantityByDrawer(drawerNo);
 | 
			
		||||
                            //     AfterQuantity = quantity.Select(it => Convert.ToInt32(it)).ToArray().Skip(3).Take(9).ToArray();
 | 
			
		||||
                            //     logger.Info($"单支抽屉【{drawerNo}】,抽屉未关检测数量【{string.Join(",", AfterQuantity)}】");
 | 
			
		||||
 | 
			
		||||
                                data.ForEach(cl =>
 | 
			
		||||
                                {
 | 
			
		||||
                                    cl.ChannelStocks.Where(cs => cs.DrawerNo == drawerNo).ToList().ForEach(cs =>
 | 
			
		||||
                                    {
 | 
			
		||||
                                        logger.Info($"单支抽屉【{drawerNo}】,应加药品数量【{cs.AddQuantity}】,现实取数量【{AfterQuantity[cs.ColNo - 1] - BeforeQuantity[cs.ColNo - 1]}】");
 | 
			
		||||
                                    });
 | 
			
		||||
                            //     data.ForEach(cl =>
 | 
			
		||||
                            //     {
 | 
			
		||||
                            //         cl.ChannelStocks.Where(cs => cs.DrawerNo == drawerNo).ToList().ForEach(cs =>
 | 
			
		||||
                            //         {
 | 
			
		||||
                            //             logger.Info($"单支抽屉【{drawerNo}】,应加药品数量【{cs.AddQuantity}】,现实取数量【{AfterQuantity[cs.ColNo - 1] - BeforeQuantity[cs.ColNo - 1]}】");
 | 
			
		||||
                            //         });
 | 
			
		||||
 | 
			
		||||
                                });
 | 
			
		||||
                            }
 | 
			
		||||
                            //     });
 | 
			
		||||
                            // }
 | 
			
		||||
                            next(); // continue iteration
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
| 
						 | 
				
			
			@ -229,7 +332,6 @@
 | 
			
		|||
                {
 | 
			
		||||
                    PortUtil.AllLightOff();
 | 
			
		||||
                }
 | 
			
		||||
                stop();
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			@ -237,6 +339,8 @@
 | 
			
		|||
    void RestData()
 | 
			
		||||
    {
 | 
			
		||||
        this.status = 0;
 | 
			
		||||
        _flagList.Clear();
 | 
			
		||||
        this.ColNos.Clear();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    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;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    void OnCellClick(DataGridCellMouseEventArgs<ChannelStock> args, RadzenDataGrid<ChannelStock> Grid)
 | 
			
		||||
    void OnCellClick(DataGridCellMouseEventArgs<ChannelStock>
 | 
			
		||||
        args, RadzenDataGrid<ChannelStock>
 | 
			
		||||
            Grid)
 | 
			
		||||
    {
 | 
			
		||||
        Grid.EditRow(args.Data);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -89,6 +89,15 @@
 | 
			
		|||
    int status = 0;
 | 
			
		||||
 | 
			
		||||
    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()
 | 
			
		||||
    {
 | 
			
		||||
| 
						 | 
				
			
			@ -98,7 +107,8 @@
 | 
			
		|||
                                new NotificationMessage { Severity = NotificationSeverity.Error, Summary = "提示", Detail = $"请填写正确的出库数量!", Duration = 4000 }
 | 
			
		||||
                            );
 | 
			
		||||
 | 
			
		||||
        } else
 | 
			
		||||
        }
 | 
			
		||||
        else
 | 
			
		||||
        {
 | 
			
		||||
            await OpenDrawer();
 | 
			
		||||
        }
 | 
			
		||||
| 
						 | 
				
			
			@ -123,8 +133,6 @@
 | 
			
		|||
        // 根据抽屉类型来决定打开前是否需要查询数量
 | 
			
		||||
        var promiseUtil = new PromiseUtil<int>();
 | 
			
		||||
        int index = 0;
 | 
			
		||||
        var BeforeQuantity = new int[9];
 | 
			
		||||
        var AfterQuantity = new int[9];
 | 
			
		||||
        await promiseUtil.taskAsyncLoop(500, 0, async (options, next, stop) =>
 | 
			
		||||
        {
 | 
			
		||||
            var drawerNo = drawerNos[index];
 | 
			
		||||
| 
						 | 
				
			
			@ -141,15 +149,63 @@
 | 
			
		|||
                    {
 | 
			
		||||
                        BeforeQuantity = new int[9];
 | 
			
		||||
                        AfterQuantity = new int[9];
 | 
			
		||||
                        // 判断是否为单支抽屉
 | 
			
		||||
                        if (setting.Value.single.Contains(drawerNo))
 | 
			
		||||
                        for (int j = 0; j < data[index].ChannelStocks.Count; j++)
 | 
			
		||||
                        {
 | 
			
		||||
                            byte[] quantity = await PortUtil.CheckQuantityByDrawer(drawerNo);
 | 
			
		||||
                            //单支-查数
 | 
			
		||||
                            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.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);
 | 
			
		||||
                        if (b)
 | 
			
		||||
                        {
 | 
			
		||||
| 
						 | 
				
			
			@ -181,10 +237,80 @@
 | 
			
		|||
                            {
 | 
			
		||||
                                PortUtil.AllLightOff();
 | 
			
		||||
                            }
 | 
			
		||||
 | 
			
		||||
                            if (index == drawerNos.Count - 1)
 | 
			
		||||
                            {
 | 
			
		||||
                                PortUtil.SpeakAsync($"取药完成,请,点击完成按钮进行确认");
 | 
			
		||||
                                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();
 | 
			
		||||
                            }
 | 
			
		||||
                            else
 | 
			
		||||
| 
						 | 
				
			
			@ -195,7 +321,7 @@
 | 
			
		|||
                        }
 | 
			
		||||
                        else
 | 
			
		||||
                        {
 | 
			
		||||
                            if (setting.Value.single.Contains(drawerNo))
 | 
			
		||||
                            if (setting.Value.single != null && setting.Value.single.Contains(drawerNo))
 | 
			
		||||
                            {
 | 
			
		||||
                                byte[] quantity = await PortUtil.CheckQuantityByDrawer(drawerNo);
 | 
			
		||||
                                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
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
| 
						 | 
				
			
			@ -236,6 +371,11 @@
 | 
			
		|||
    void RestData()
 | 
			
		||||
    {
 | 
			
		||||
        this.status = 0;
 | 
			
		||||
        this.BeforeQuantity = new int[9];
 | 
			
		||||
        this.AfterQuantity = new int[9];
 | 
			
		||||
        currentCol = 0;
 | 
			
		||||
        ColNos.Clear();
 | 
			
		||||
        _flagList.Clear();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    async Task TakeFinish()
 | 
			
		||||
| 
						 | 
				
			
			@ -291,6 +431,7 @@
 | 
			
		|||
 | 
			
		||||
    void OnCellClick(DataGridCellMouseEventArgs<ChannelStock> args, RadzenDataGrid<ChannelStock> Grid)
 | 
			
		||||
    {
 | 
			
		||||
        currentCol = args.Data.ColNo;
 | 
			
		||||
        Grid.EditRow(args.Data);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -62,7 +62,7 @@
 | 
			
		|||
        }
 | 
			
		||||
        @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>
 | 
			
		||||
| 
						 | 
				
			
			@ -82,8 +82,8 @@
 | 
			
		|||
    private bool CanTakeDrug = true;
 | 
			
		||||
 | 
			
		||||
    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()
 | 
			
		||||
    {
 | 
			
		||||
| 
						 | 
				
			
			@ -129,6 +129,26 @@
 | 
			
		|||
 | 
			
		||||
                            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);
 | 
			
		||||
                        if (b)
 | 
			
		||||
                        {
 | 
			
		||||
| 
						 | 
				
			
			@ -170,6 +190,55 @@
 | 
			
		|||
                            {
 | 
			
		||||
                                PortUtil.SpeakAsync($"取药完成,请,点击完成按钮进行确认");
 | 
			
		||||
                                this.status = 2;
 | 
			
		||||
                                string alertMessage = string.Empty;
 | 
			
		||||
                                //检查是否称重抽屉,核对实际取出数量是否与应取数量一致,不一致则弹出提示
 | 
			
		||||
                                for (int i = 0; i < data.Count; i++)
 | 
			
		||||
                                {
 | 
			
		||||
                                    if (data[i].ChannelStock.BoardType.ToString().Contains("6"))
 | 
			
		||||
                                    {
 | 
			
		||||
                                        PortUtil.DrawerNo = 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();
 | 
			
		||||
                            }
 | 
			
		||||
                            else
 | 
			
		||||
| 
						 | 
				
			
			@ -180,27 +249,13 @@
 | 
			
		|||
                        }
 | 
			
		||||
                        else
 | 
			
		||||
                        {
 | 
			
		||||
                            if (setting.Value.single.Contains(drawerNo))
 | 
			
		||||
                            {
 | 
			
		||||
                                byte[] quantity = await PortUtil.CheckQuantityByDrawer(drawerNo);
 | 
			
		||||
                                orderTakeVo.AfterQuantity = quantity.Select(it => Convert.ToInt32(it)).ToArray().Skip(3).Take(9).ToArray();
 | 
			
		||||
                                logger.Info($"单支抽屉,抽屉未关检测数量【{string.Join(",", orderTakeVo.AfterQuantity)}】");
 | 
			
		||||
 | 
			
		||||
                                data.ForEach(cl =>
 | 
			
		||||
                                {
 | 
			
		||||
                                    if (cl.ChannelStock.DrawerNo == drawerNo)
 | 
			
		||||
                                    {
 | 
			
		||||
                                        logger.Info($"单支抽屉【{drawerNo}】,应取药品数量【{orderTakeVo.Quantity}】,现实取数量【{orderTakeVo.BeforeQuantity[cl.ChannelStock.ColNo - 1] - orderTakeVo.AfterQuantity[cl.ChannelStock.ColNo - 1]}】");
 | 
			
		||||
                                    }
 | 
			
		||||
 | 
			
		||||
                                });
 | 
			
		||||
                            }
 | 
			
		||||
                            next(); // continue iteration
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
            }
 | 
			
		||||
            catch (Exception e)
 | 
			
		||||
            {
 | 
			
		||||
| 
						 | 
				
			
			@ -221,8 +276,20 @@
 | 
			
		|||
    void RestData()
 | 
			
		||||
    {
 | 
			
		||||
        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()
 | 
			
		||||
    {
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -196,9 +196,9 @@
 | 
			
		|||
        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 });
 | 
			
		||||
            if (b)
 | 
			
		||||
            {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -79,9 +79,12 @@
 | 
			
		|||
    [Parameter] public OrderInfo order { get; set; }
 | 
			
		||||
    [Parameter] public List<OrderDetail> orderDetails { get; set; } 
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    private bool CanTakeDrug = true;
 | 
			
		||||
 | 
			
		||||
    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()
 | 
			
		||||
    {
 | 
			
		||||
        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());
 | 
			
		||||
                        }
 | 
			
		||||
                        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);
 | 
			
		||||
                        if (b)
 | 
			
		||||
                        {
 | 
			
		||||
| 
						 | 
				
			
			@ -169,6 +192,55 @@
 | 
			
		|||
                            {
 | 
			
		||||
                                PortUtil.SpeakAsync($"取药完成,请,点击完成按钮进行确认");
 | 
			
		||||
                                this.status = 2;
 | 
			
		||||
                                string alertMessage = string.Empty;
 | 
			
		||||
                                //检查是否称重抽屉,核对实际取出数量是否与应取数量一致,不一致则弹出提示
 | 
			
		||||
                                for (int i = 0; i < data.Count; i++)
 | 
			
		||||
                                {
 | 
			
		||||
                                    if (data[i].ChannelStock.BoardType.ToString().Contains("6"))
 | 
			
		||||
                                    {
 | 
			
		||||
                                        PortUtil.DrawerNo = 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();
 | 
			
		||||
                            }
 | 
			
		||||
                            else
 | 
			
		||||
| 
						 | 
				
			
			@ -179,21 +251,21 @@
 | 
			
		|||
                        }
 | 
			
		||||
                        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)}】");
 | 
			
		||||
                            // 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]}】");
 | 
			
		||||
                                    }
 | 
			
		||||
                            //     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
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -233,9 +233,9 @@
 | 
			
		|||
        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 });
 | 
			
		||||
            if (b)
 | 
			
		||||
            {
 | 
			
		||||
| 
						 | 
				
			
			@ -258,9 +258,9 @@
 | 
			
		|||
        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 });
 | 
			
		||||
            if (b)
 | 
			
		||||
            {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -79,5 +79,7 @@ namespace MasaBlazorApp3.Pojo
 | 
			
		|||
            get;
 | 
			
		||||
            set;
 | 
			
		||||
        }
 | 
			
		||||
        [Column("Pos_No")]
 | 
			
		||||
        public int BiaoDingStatus { get; set; }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -35,5 +35,8 @@ namespace MasaBlazorApp3.Pojo
 | 
			
		|||
 | 
			
		||||
        [Association(ThisKey = nameof(RoleId), OtherKey = nameof(Role.Id))]
 | 
			
		||||
        public Role role { get; set; }
 | 
			
		||||
 | 
			
		||||
        [Column(IsColumn =false)]
 | 
			
		||||
        public string OldPassword { get; set; }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -55,8 +55,8 @@ namespace MasaBlazorApp3.Port
 | 
			
		|||
                string DrawerPortPath = _portConfig.drawerPortPath;
 | 
			
		||||
                logger.Info($"打开抽屉串口【{DrawerPortPath}】");
 | 
			
		||||
                drawerSerial = new SerialPort(DrawerPortPath, 9600, Parity.None, 8);
 | 
			
		||||
                drawerSerial.Open();
 | 
			
		||||
                logger.Info($"抽屉串口打开结果【{drawerSerial.IsOpen}】");
 | 
			
		||||
                //drawerSerial.Open();
 | 
			
		||||
                //logger.Info($"抽屉串口打开结果【{drawerSerial.IsOpen}】");
 | 
			
		||||
            }
 | 
			
		||||
            catch (Exception e)
 | 
			
		||||
            {
 | 
			
		||||
| 
						 | 
				
			
			@ -72,8 +72,8 @@ namespace MasaBlazorApp3.Port
 | 
			
		|||
                    string code = scanCodeSerial.ReadExisting();
 | 
			
		||||
                    
 | 
			
		||||
                };
 | 
			
		||||
                scanCodeSerial.Open();
 | 
			
		||||
                logger.Info($"条码枪串口打开结果【{scanCodeSerial.IsOpen}】");
 | 
			
		||||
                //scanCodeSerial.Open();
 | 
			
		||||
                //logger.Info($"条码枪串口打开结果【{scanCodeSerial.IsOpen}】");
 | 
			
		||||
            }
 | 
			
		||||
            catch (Exception e)
 | 
			
		||||
            {
 | 
			
		||||
| 
						 | 
				
			
			@ -86,8 +86,8 @@ namespace MasaBlazorApp3.Port
 | 
			
		|||
                    string CanBusPortPath = _portConfig.canBusPortPath;
 | 
			
		||||
                    logger.Info($"打开can总线串口【{CanBusPortPath}】");
 | 
			
		||||
                    canBusSerial = new SerialPort(CanBusPortPath, 57600, Parity.None, 8);
 | 
			
		||||
                    canBusSerial.Open();
 | 
			
		||||
                    logger.Info($"can总线串口打开结果【{canBusSerial.IsOpen}】");
 | 
			
		||||
                    //canBusSerial.Open();
 | 
			
		||||
                    //logger.Info($"can总线串口打开结果【{canBusSerial.IsOpen}】");
 | 
			
		||||
                }
 | 
			
		||||
                catch (Exception e)
 | 
			
		||||
                {
 | 
			
		||||
| 
						 | 
				
			
			@ -410,7 +410,7 @@ namespace MasaBlazorApp3.Port
 | 
			
		|||
                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, 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);
 | 
			
		||||
                byte[] retBuffer = await GetBufferByPort(canBusSerial, 8);
 | 
			
		||||
                logger.Info($"开药盒返回{ColNo}【{Convert.ToHexString(retBuffer)}】");
 | 
			
		||||
| 
						 | 
				
			
			@ -770,34 +770,52 @@ namespace MasaBlazorApp3.Port
 | 
			
		|||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public async void ClearCount(int DrawerNo, int ColNo)
 | 
			
		||||
        public async Task ClearCount(int DrawerNo, int ColNo)
 | 
			
		||||
        {
 | 
			
		||||
            try
 | 
			
		||||
            {
 | 
			
		||||
                canBusSerial.DiscardInBuffer();
 | 
			
		||||
            var index = ColNo > 3 ? 2 : 1;
 | 
			
		||||
            var lock1 = ColNo % 3 == 0 ? 3 : ColNo % 3;
 | 
			
		||||
            var channel = Convert.ToInt32((DrawerNo * 10 + index).ToString(), 16);
 | 
			
		||||
            byte[] buffer = new byte[] { 0xaa, (byte)(channel), 0x25, (byte)lock1, 0x00, 0x00, 0x00, 0xee };
 | 
			
		||||
                int[] iNum = new int[] { 3, 2, 1 };
 | 
			
		||||
                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);
 | 
			
		||||
            }
 | 
			
		||||
            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)
 | 
			
		||||
        {
 | 
			
		||||
            try
 | 
			
		||||
            {
 | 
			
		||||
                canBusSerial.DiscardInBuffer();
 | 
			
		||||
            var index = ColNo > 3 ? 2 : 1;
 | 
			
		||||
            var lock1 = ColNo % 3 == 0 ? 3 : ColNo % 3;
 | 
			
		||||
            var channel = Convert.ToInt32((DrawerNo * 10 + index).ToString(), 16);
 | 
			
		||||
            byte[] buffer = new byte[] { 0xaa, (byte)(channel), 0x26, (byte)lock1, 0x00, 0x00, 0x00, 0xee };
 | 
			
		||||
                int[] iNum = new int[] { 3, 2, 1 };
 | 
			
		||||
                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);
 | 
			
		||||
            buffer[5] = (byte)(Quantity & 0xff);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
            logger.Info($"称重发送数量【{string.Join(",", buffer)}】");
 | 
			
		||||
                logger.Info($"标定数量【{Convert.ToHexString(buffer)}】");
 | 
			
		||||
                canBusSerial.Write(buffer, 0, 8);
 | 
			
		||||
            }
 | 
			
		||||
            catch (Exception ex)
 | 
			
		||||
            {
 | 
			
		||||
                logger.Info($"操作发生异常:ex:{ex.Message},方法名:SetNumCount;参数:{DrawerNo},{ColNo},{Quantity}");
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // 以板子为单位获取抽屉内所有库位的药品数量
 | 
			
		||||
        public async Task<byte[]> CheckQuantityByAddr()
 | 
			
		||||
| 
						 | 
				
			
			@ -843,7 +861,7 @@ namespace MasaBlazorApp3.Port
 | 
			
		|||
 | 
			
		||||
                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);
 | 
			
		||||
                byte[] result = await GetBufferByPort(canBusSerial, 8);
 | 
			
		||||
                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 };
 | 
			
		||||
 | 
			
		||||
            logger.Info($"称重发送库位数量查询{colNo}【{Convert.ToHexString(buffer)}】");
 | 
			
		||||
            logger.Info($"称重发送库位数量查询{DrawerNo}-{colNo}【{Convert.ToHexString(buffer)}】");
 | 
			
		||||
            canBusSerial.Write(buffer, 0, 8);
 | 
			
		||||
            byte[] result = await GetBufferByPort(canBusSerial, 8);
 | 
			
		||||
            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 };
 | 
			
		||||
 | 
			
		||||
            logger.Info($"称重发送库位数量查询{colNo}【{Convert.ToHexString(buffer)}】");
 | 
			
		||||
            logger.Info($"称重发送库位数量查询{DrawerNo}-{colNo}【{Convert.ToHexString(buffer)}】");
 | 
			
		||||
            canBusSerial.Write(buffer, 0, 8);
 | 
			
		||||
            byte[] result = await GetBufferByPort(canBusSerial, 8);
 | 
			
		||||
            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 };
 | 
			
		||||
 | 
			
		||||
                logger.Info($"称重发送库位数量查询{ColNos[i]}【{Convert.ToHexString(buffer)}】");
 | 
			
		||||
                logger.Info($"称重发送库位数量查询{DrawerNo}-{ColNos[i]}【{Convert.ToHexString(buffer)}】");
 | 
			
		||||
                canBusSerial.Write(buffer, 0, 8);
 | 
			
		||||
                byte[] result = await GetBufferByPort(canBusSerial, 8);
 | 
			
		||||
                logger.Info($"称重发送库位数量查询返回结果【{Convert.ToHexString(result)}】");
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,6 +1,6 @@
 | 
			
		|||
@inherits LayoutComponentBase
 | 
			
		||||
 | 
			
		||||
<div style="width:100vw;height:100vh">
 | 
			
		||||
<RadzenLayout>
 | 
			
		||||
    @Body
 | 
			
		||||
</div>
 | 
			
		||||
    <RadzenNotification />
 | 
			
		||||
    <RadzenComponents />
 | 
			
		||||
</RadzenLayout>
 | 
			
		||||
| 
						 | 
				
			
			@ -138,7 +138,7 @@
 | 
			
		|||
    void backHome()
 | 
			
		||||
    {
 | 
			
		||||
        currentPage = false;
 | 
			
		||||
        na.NavigateTo("/home");
 | 
			
		||||
        na.NavigateTo("");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void logout()
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -8,7 +8,7 @@
 | 
			
		|||
  "setting": {
 | 
			
		||||
    "machineId": "DM1",
 | 
			
		||||
    "storage": null,
 | 
			
		||||
    "loginMode": 1,
 | 
			
		||||
    "loginMode": 2,
 | 
			
		||||
    "opFirst": true,
 | 
			
		||||
    //自动退出登录时间,单位秒(0不自动退出)
 | 
			
		||||
    "autoOutLog": 0
 | 
			
		||||
| 
						 | 
				
			
			@ -17,16 +17,16 @@
 | 
			
		|||
    "drawerPortPath": "COM1",
 | 
			
		||||
    "drawerProtocol": 485,
 | 
			
		||||
    "scanCodePortPath": "COM8",
 | 
			
		||||
    "canBusPortPath": "COM5",
 | 
			
		||||
    "canBusPortPath": "COM31",
 | 
			
		||||
    "canBusExsit": true,
 | 
			
		||||
    "doorAddr": 0,
 | 
			
		||||
    "storageBoxAddr": 0
 | 
			
		||||
  },
 | 
			
		||||
  "drawer": {
 | 
			
		||||
    "single": [ 3 ],
 | 
			
		||||
    "weigh": [1],
 | 
			
		||||
    "box": [],
 | 
			
		||||
    "label": []
 | 
			
		||||
    "weigh": [4],
 | 
			
		||||
    "box": [4],
 | 
			
		||||
    "label": [4]
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							| 
		 After Width: | Height: | Size: 18 KiB  | 
		Loading…
	
		Reference in New Issue