更新提交
This commit is contained in:
		
							parent
							
								
									3a9ec258a8
								
							
						
					
					
						commit
						ac39763b13
					
				| 
						 | 
					@ -7,7 +7,7 @@
 | 
				
			||||||
    </Found>
 | 
					    </Found>
 | 
				
			||||||
    <NotFound>
 | 
					    <NotFound>
 | 
				
			||||||
        <LayoutView Layout="@typeof(MainLayout)">
 | 
					        <LayoutView Layout="@typeof(MainLayout)">
 | 
				
			||||||
            <p role="alert">Sorry, there's nothing at this address.</p>
 | 
					            <p role="alert">抱歉,找不到此页面。</p>
 | 
				
			||||||
        </LayoutView>
 | 
					        </LayoutView>
 | 
				
			||||||
    </NotFound>
 | 
					    </NotFound>
 | 
				
			||||||
</Router>
 | 
					</Router>
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -28,6 +28,11 @@ namespace MasaBlazorApp3.DataAccess
 | 
				
			||||||
        public ITable<MachineRecord> MachineRecord => this.GetTable<MachineRecord>();
 | 
					        public ITable<MachineRecord> MachineRecord => this.GetTable<MachineRecord>();
 | 
				
			||||||
        public ITable<InOutInvoice> InOutInvoice => this.GetTable<InOutInvoice>();
 | 
					        public ITable<InOutInvoice> InOutInvoice => this.GetTable<InOutInvoice>();
 | 
				
			||||||
        public ITable<AccountBook> AccountBook => this.GetTable<AccountBook>();
 | 
					        public ITable<AccountBook> AccountBook => this.GetTable<AccountBook>();
 | 
				
			||||||
 | 
					        public ITable<SettingManu> SettingManu => this.GetTable<SettingManu>();
 | 
				
			||||||
 | 
					        public ITable<Plan> Plan => this.GetTable<Plan>();
 | 
				
			||||||
 | 
					        public ITable<PlanDetails> PlanDetails => this.GetTable<PlanDetails>();
 | 
				
			||||||
 | 
					        public ITable<AccountBookG2> AccountBookG2 => this.GetTable<AccountBookG2>();
 | 
				
			||||||
 | 
					        public ITable<HkcChangeShifts> HkcChangeShifts => this.GetTable<HkcChangeShifts>();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -6,9 +6,9 @@ using System.Threading.Tasks;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace MasaBlazorApp3.DataAccess
 | 
					namespace MasaBlazorApp3.DataAccess
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    public class ChannelStockWithDrawerCount<ChannelStock>
 | 
					    public class ChannelStockWithDrawerCount<T>
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        public int[] DrawerArray { get; set; }
 | 
					        public int[] DrawerArray { get; set; }
 | 
				
			||||||
        public List<ChannelStock> ChannelStocks { get; set; } = new List<ChannelStock>();
 | 
					        public List<T> ChannelStocks { get; set; } = new List<T>();
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,5 +1,6 @@
 | 
				
			||||||
using System;
 | 
					using System;
 | 
				
			||||||
using MasaBlazorApp3.Pojo;
 | 
					using MasaBlazorApp3.Pojo;
 | 
				
			||||||
 | 
					using MasaBlazorApp3.Pojo.Vo;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace MasaBlazorApp3.DataAccess.Dao
 | 
					namespace MasaBlazorApp3.DataAccess.Dao
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
| 
						 | 
					@ -31,5 +32,28 @@ namespace MasaBlazorApp3.DataAccess.Dao
 | 
				
			||||||
        public Task<bool> DrawerCheckFinish(List<ChannelStock> Stocks);
 | 
					        public Task<bool> DrawerCheckFinish(List<ChannelStock> Stocks);
 | 
				
			||||||
        //抽屉获取库存数据--药品绑定
 | 
					        //抽屉获取库存数据--药品绑定
 | 
				
			||||||
        Task<ChannelStockWithDrawerCount<ChannelStock>> GetChannelStockByBiaoDing(int DrawerNo, int Quantity=0);
 | 
					        Task<ChannelStockWithDrawerCount<ChannelStock>> GetChannelStockByBiaoDing(int DrawerNo, int Quantity=0);
 | 
				
			||||||
 | 
					        //手术室药箱获取绑定数据
 | 
				
			||||||
 | 
					        Task<PageMultiData<ChannelList, Plan>> GetAllChannelListWithPlan(int? take, int? skip);
 | 
				
			||||||
 | 
					        /// <summary>
 | 
				
			||||||
 | 
					        /// 手术室药箱绑定套餐
 | 
				
			||||||
 | 
					        /// </summary>
 | 
				
			||||||
 | 
					        /// <returns></returns>
 | 
				
			||||||
 | 
					        Task<bool> BindBox(ChannelList channelList);
 | 
				
			||||||
 | 
					        /// <summary>
 | 
				
			||||||
 | 
					        /// 手术室药箱解绑套餐
 | 
				
			||||||
 | 
					        /// </summary>
 | 
				
			||||||
 | 
					        /// <param name="list"></param>
 | 
				
			||||||
 | 
					        /// <returns></returns>
 | 
				
			||||||
 | 
					        Task<bool> UnBindBox(ChannelList list);
 | 
				
			||||||
 | 
					        //获取手术室药箱中所有要补药的数据
 | 
				
			||||||
 | 
					        Task<PageData<ChannelList>> GetAllBoxAddDrug(int? take, int? skip);
 | 
				
			||||||
 | 
					        //手术室药箱补药获取毒麻柜中的药品信息
 | 
				
			||||||
 | 
					        Task<List<BoxTakeVo>> getTakeInfoByBox(ChannelList cl);
 | 
				
			||||||
 | 
					        //手术室药箱补药完成
 | 
				
			||||||
 | 
					        Task<bool> BoxTakeFinish(List<BoxTakeVo> datas);
 | 
				
			||||||
 | 
					        //手术室药箱入库
 | 
				
			||||||
 | 
					        Task<PageData<ChannelList>> GetBoxWaitInfo(int? take, int? skip);
 | 
				
			||||||
 | 
					        //手术室药箱入库获取待入库明细
 | 
				
			||||||
 | 
					        Task<List<BoxTakeVo>> getBoxWaitByBox(ChannelList cl);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,16 @@
 | 
				
			||||||
 | 
					using MasaBlazorApp3.Pojo;
 | 
				
			||||||
 | 
					using System;
 | 
				
			||||||
 | 
					using System.Collections.Generic;
 | 
				
			||||||
 | 
					using System.Linq;
 | 
				
			||||||
 | 
					using System.Text;
 | 
				
			||||||
 | 
					using System.Threading.Tasks;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace MasaBlazorApp3.DataAccess.Dao
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    public interface IHkcChangeShiftsDao
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        //查询交接班记录
 | 
				
			||||||
 | 
					        public Task<PageData<HkcChangeShifts>> GetChangeShiftRecordAsync(DateTime start, DateTime end, int? take, int? skip);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -26,5 +26,11 @@ namespace MasaBlazorApp3.DataAccess.Dao
 | 
				
			||||||
        public Task<bool> OrderReturnFinish(List<OperationVo<MachineRecord>> datas, string OrderrNo);
 | 
					        public Task<bool> OrderReturnFinish(List<OperationVo<MachineRecord>> datas, string OrderrNo);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        public Task<List<OperationVo<MachineRecord>>> getReturnInfoByOrderNo(string OrderrNo);
 | 
					        public Task<List<OperationVo<MachineRecord>>> getReturnInfoByOrderNo(string OrderrNo);
 | 
				
			||||||
 | 
					        //获取药箱中的用药信息
 | 
				
			||||||
 | 
					        public Task<PageData<OrderInfo>> GetAllOrderInfoByBox(int box,string OrderrNo, DateTime OrderDate, int? take, int? skip);
 | 
				
			||||||
 | 
					        //获取所有药箱号 
 | 
				
			||||||
 | 
					        public Task<int[]> GetDrawerNum(string machineId);
 | 
				
			||||||
 | 
					        //核对处方
 | 
				
			||||||
 | 
					        public Task<bool> CheckOrderInfo(IList<OrderInfo> selectedOrderInfos, int DrawerNo);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,67 @@
 | 
				
			||||||
 | 
					using MasaBlazorApp3.Pojo;
 | 
				
			||||||
 | 
					using System;
 | 
				
			||||||
 | 
					using System.Collections.Generic;
 | 
				
			||||||
 | 
					using System.Linq;
 | 
				
			||||||
 | 
					using System.Text;
 | 
				
			||||||
 | 
					using System.Threading.Tasks;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace MasaBlazorApp3.DataAccess.Dao
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    public interface IPlanDao
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /// <summary>
 | 
				
			||||||
 | 
					        /// 获取所有套餐数据
 | 
				
			||||||
 | 
					        /// </summary>
 | 
				
			||||||
 | 
					        /// <returns></returns>
 | 
				
			||||||
 | 
					        Task<PageMultiData<Plan,DrugInfo>> GetAllPlanInfo();
 | 
				
			||||||
 | 
					        /// <summary>
 | 
				
			||||||
 | 
					        /// 根据套餐ID获取套餐数据
 | 
				
			||||||
 | 
					        /// </summary>
 | 
				
			||||||
 | 
					        /// <param name="Id"></param>
 | 
				
			||||||
 | 
					        /// <returns></returns>
 | 
				
			||||||
 | 
					        Task<Plan> GetPlanById(int Id);
 | 
				
			||||||
 | 
					        /// <summary>
 | 
				
			||||||
 | 
					        /// 新增套餐
 | 
				
			||||||
 | 
					        /// </summary>
 | 
				
			||||||
 | 
					        /// <param name="plan"></param>
 | 
				
			||||||
 | 
					        /// <returns></returns>
 | 
				
			||||||
 | 
					        Task<bool> InsertPlanInfo(Plan plan);
 | 
				
			||||||
 | 
					        /// <summary>
 | 
				
			||||||
 | 
					        /// 更新套餐
 | 
				
			||||||
 | 
					        /// </summary>
 | 
				
			||||||
 | 
					        /// <param name="plan"></param>
 | 
				
			||||||
 | 
					        /// <returns></returns>
 | 
				
			||||||
 | 
					        Task<bool> UpdatePlanInfo(Plan plan);
 | 
				
			||||||
 | 
					        /// <summary>
 | 
				
			||||||
 | 
					        /// 删除套餐
 | 
				
			||||||
 | 
					        /// </summary>
 | 
				
			||||||
 | 
					        /// <param name="planId"></param>
 | 
				
			||||||
 | 
					        /// <returns></returns>
 | 
				
			||||||
 | 
					        Task<bool> DeletePlanInfo(int planID);
 | 
				
			||||||
 | 
					        /// <summary>
 | 
				
			||||||
 | 
					        /// 向套餐添加药品
 | 
				
			||||||
 | 
					        /// </summary>
 | 
				
			||||||
 | 
					        /// <param name="details"></param>
 | 
				
			||||||
 | 
					        /// <returns></returns>
 | 
				
			||||||
 | 
					        Task<bool> AddPlanDetail(PlanDetails details);
 | 
				
			||||||
 | 
					        /// <summary>
 | 
				
			||||||
 | 
					        /// 修改套餐中的药品
 | 
				
			||||||
 | 
					        /// </summary>
 | 
				
			||||||
 | 
					        /// <param name="details"></param>
 | 
				
			||||||
 | 
					        /// <returns></returns>
 | 
				
			||||||
 | 
					        Task<bool> UpdatePlanDetail(PlanDetails details);
 | 
				
			||||||
 | 
					        /// <summary>
 | 
				
			||||||
 | 
					        /// 删除套餐中的药品
 | 
				
			||||||
 | 
					        /// </summary>
 | 
				
			||||||
 | 
					        /// <param name="details"></param>
 | 
				
			||||||
 | 
					        /// <returns></returns>
 | 
				
			||||||
 | 
					        Task<bool> DeletePlanDetail(PlanDetails planID);
 | 
				
			||||||
 | 
					        /// <summary>
 | 
				
			||||||
 | 
					        /// 根据套餐明细获取套餐
 | 
				
			||||||
 | 
					        /// </summary>
 | 
				
			||||||
 | 
					        /// <param name="details"></param>
 | 
				
			||||||
 | 
					        /// <returns></returns>
 | 
				
			||||||
 | 
					        bool CheckDrugById(PlanDetails details);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,14 @@
 | 
				
			||||||
 | 
					using MasaBlazorApp3.Pojo;
 | 
				
			||||||
 | 
					using System;
 | 
				
			||||||
 | 
					using System.Collections.Generic;
 | 
				
			||||||
 | 
					using System.Linq;
 | 
				
			||||||
 | 
					using System.Text;
 | 
				
			||||||
 | 
					using System.Threading.Tasks;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace MasaBlazorApp3.DataAccess.Dao
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    interface ISettingManuDao
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        public Task<List<SettingManu>> GetMenuItemsAsync();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -2,12 +2,14 @@
 | 
				
			||||||
using LinqToDB;
 | 
					using LinqToDB;
 | 
				
			||||||
using log4net;
 | 
					using log4net;
 | 
				
			||||||
using MasaBlazorApp3.DataAccess.Dao;
 | 
					using MasaBlazorApp3.DataAccess.Dao;
 | 
				
			||||||
 | 
					using MasaBlazorApp3.Pages;
 | 
				
			||||||
using MasaBlazorApp3.Pojo;
 | 
					using MasaBlazorApp3.Pojo;
 | 
				
			||||||
using MasaBlazorApp3.Pojo.Config;
 | 
					using MasaBlazorApp3.Pojo.Config;
 | 
				
			||||||
using MasaBlazorApp3.Pojo.Vo;
 | 
					using MasaBlazorApp3.Pojo.Vo;
 | 
				
			||||||
using MasaBlazorApp3.Port;
 | 
					using MasaBlazorApp3.Port;
 | 
				
			||||||
using Microsoft.Extensions.Options;
 | 
					using Microsoft.Extensions.Options;
 | 
				
			||||||
using Mysqlx.Crud;
 | 
					using Mysqlx.Crud;
 | 
				
			||||||
 | 
					using System.Collections.Generic;
 | 
				
			||||||
using System.Data;
 | 
					using System.Data;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace MasaBlazorApp3.DataAccess.Impl
 | 
					namespace MasaBlazorApp3.DataAccess.Impl
 | 
				
			||||||
| 
						 | 
					@ -399,7 +401,7 @@ namespace MasaBlazorApp3.DataAccess.Impl
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                _connection.BeginTransaction();
 | 
					                _connection.BeginTransaction();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                string InvoiceId = "DRAWER_" + CurrentTimeMillis();
 | 
					                string InvoiceId = "CHECK_" + CurrentTimeMillis();
 | 
				
			||||||
                var flag = true;
 | 
					                var flag = true;
 | 
				
			||||||
                for (var i = 0; i < Stocks.Count; i++)
 | 
					                for (var i = 0; i < Stocks.Count; i++)
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
| 
						 | 
					@ -459,7 +461,10 @@ namespace MasaBlazorApp3.DataAccess.Impl
 | 
				
			||||||
                    });
 | 
					                    });
 | 
				
			||||||
                    // 更新库存
 | 
					                    // 更新库存
 | 
				
			||||||
                    var stockQ = _connection.ChannelStock.Where(cs => cs.Id == stock.Id)
 | 
					                    var stockQ = _connection.ChannelStock.Where(cs => cs.Id == stock.Id)
 | 
				
			||||||
                        .Set(cs => cs.Quantity, stock.CheckQuantity);
 | 
					                        .Set(cs => cs.Quantity, stock.CheckQuantity)
 | 
				
			||||||
 | 
					                        .Set(cs => cs.ManuNo, ManuNo)
 | 
				
			||||||
 | 
					                        .Set(cs => cs.EffDate, EffDate)
 | 
				
			||||||
 | 
					                        .Set(cs => cs.Dmnguid, stock.drugManuNo?.Id);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                    int r = stockQ.Update();
 | 
					                    int r = stockQ.Update();
 | 
				
			||||||
                    // 获取更新完库存之后的药品库存
 | 
					                    // 获取更新完库存之后的药品库存
 | 
				
			||||||
| 
						 | 
					@ -544,6 +549,623 @@ namespace MasaBlazorApp3.DataAccess.Impl
 | 
				
			||||||
                .ToListAsync();
 | 
					                .ToListAsync();
 | 
				
			||||||
            return new ChannelStockWithDrawerCount<ChannelStock>() { DrawerArray = ints, ChannelStocks = channelStocks };
 | 
					            return new ChannelStockWithDrawerCount<ChannelStock>() { DrawerArray = ints, ChannelStocks = channelStocks };
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					        //手术室药箱获取绑定数据
 | 
				
			||||||
 | 
					        public async Task<PageMultiData<ChannelList, Plan>> GetAllChannelListWithPlan(int? take, int? skip)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            var query = _connection.ChannelList.AsQueryable()
 | 
				
			||||||
 | 
					                .Where(cl => cl.MachineId == _setting.boxMachineId);
 | 
				
			||||||
 | 
					            //.LoadWith(cl=>cl.PlanInfo);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            int pagedData = await query.CountAsync();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            List<ChannelList> list = await query
 | 
				
			||||||
 | 
					                .OrderBy((cl) => cl.DrawerNo)
 | 
				
			||||||
 | 
					                .Skip((int)skip)
 | 
				
			||||||
 | 
					                .Take((int)take)
 | 
				
			||||||
 | 
					                .ToListAsync();
 | 
				
			||||||
 | 
					            if (list != null && list.Count > 0)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                for (int i = 0; i < list.Count; i++)
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    if (!string.IsNullOrEmpty(list[i].DrugId))
 | 
				
			||||||
 | 
					                    {
 | 
				
			||||||
 | 
					                        list[i].PlanInfo = _connection.Plan.AsQueryable().Where(p => p.Id == Convert.ToInt32(list[i].DrugId)).FirstOrDefault();
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            var other = _connection.Plan.AsQueryable().Where(p => p.UseState == 1 && p._PlanDetails.Count > 0);
 | 
				
			||||||
 | 
					            List<Plan> planInfos = await other
 | 
				
			||||||
 | 
					                .LoadWith(p => p._PlanDetails.Where(pd => pd.UseState == 1))
 | 
				
			||||||
 | 
					                .OrderBy((p) => p.Id)
 | 
				
			||||||
 | 
					                .ToListAsync();
 | 
				
			||||||
 | 
					            if (planInfos != null && planInfos.Count > 0)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                for (int i = 0; i < planInfos.Count(); i++)
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    for (int j = 0; j < planInfos[i]._PlanDetails.Count(); j++)
 | 
				
			||||||
 | 
					                    {
 | 
				
			||||||
 | 
					                        planInfos[i]._PlanDetails[j]._DrugInfo =
 | 
				
			||||||
 | 
					                             _connection.DrugInfo.AsQueryable().Where(di => di.DrugId == planInfos[i]._PlanDetails[j].DrugId).First();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            return new PageMultiData<ChannelList, Plan>()
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                TotalDesserts = pagedData,
 | 
				
			||||||
 | 
					                Desserts = list,
 | 
				
			||||||
 | 
					                Other = planInfos
 | 
				
			||||||
 | 
					            };
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        /// <summary>
 | 
				
			||||||
 | 
					        /// 手术室药箱绑定套餐
 | 
				
			||||||
 | 
					        /// </summary>
 | 
				
			||||||
 | 
					        /// <returns></returns>
 | 
				
			||||||
 | 
					        public async Task<bool> BindBox(ChannelList list)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            try
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                _connection.BeginTransaction();
 | 
				
			||||||
 | 
					                bool bFlag = true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                var q = _connection.ChannelList
 | 
				
			||||||
 | 
					                    .Where(cs => cs.Id == list.Id).Set(cs => cs.DrugId, list.PlanInfo.Id.ToString());
 | 
				
			||||||
 | 
					                //将套餐中的药品信息写入channelStock
 | 
				
			||||||
 | 
					                //查询套餐中药品信息
 | 
				
			||||||
 | 
					                var query = _connection.PlanDetails.AsQueryable().Where(p => p.PlanId == list.PlanInfo.Id);
 | 
				
			||||||
 | 
					                List<PlanDetails> planInfos = await query.ToListAsync();
 | 
				
			||||||
 | 
					                if (planInfos != null && planInfos.Count > 0)
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    for (int i = 0; i < planInfos.Count; i++)
 | 
				
			||||||
 | 
					                    {
 | 
				
			||||||
 | 
					                        int mid = await _connection.InsertAsync(new ChannelStock()
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            Id = Guid.NewGuid().ToString(),
 | 
				
			||||||
 | 
					                            ListId = list.Id,
 | 
				
			||||||
 | 
					                            MachineId = list.MachineId,
 | 
				
			||||||
 | 
					                            DrawerNo = list.DrawerNo,
 | 
				
			||||||
 | 
					                            DrugId = planInfos[i].DrugId.ToString(),
 | 
				
			||||||
 | 
					                            BaseQuantity = planInfos[i].BaseQuantity,
 | 
				
			||||||
 | 
					                        });
 | 
				
			||||||
 | 
					                        if (mid > 0)
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            bFlag = true;
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                        else
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            bFlag = false;
 | 
				
			||||||
 | 
					                            break;
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                var r = await q.UpdateAsync();
 | 
				
			||||||
 | 
					                if (bFlag && r > 0)
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    _connection.CommitTransaction();
 | 
				
			||||||
 | 
					                    return true;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                else
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    _connection.RollbackTransaction();
 | 
				
			||||||
 | 
					                    return false;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            catch (Exception ex)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                _connection.RollbackTransaction();
 | 
				
			||||||
 | 
					                logger.Info($"绑定套餐异常{ex.Message}");
 | 
				
			||||||
 | 
					                return false;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        /// <summary>
 | 
				
			||||||
 | 
					        /// 手术室药箱解绑套餐
 | 
				
			||||||
 | 
					        /// </summary>
 | 
				
			||||||
 | 
					        /// <param name="list"></param>
 | 
				
			||||||
 | 
					        /// <returns></returns>
 | 
				
			||||||
 | 
					        public async Task<bool> UnBindBox(ChannelList list)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            try
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                _connection.BeginTransaction();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                var r = await _connection.ChannelList
 | 
				
			||||||
 | 
					                     .Where(cs => cs.Id == list.Id)
 | 
				
			||||||
 | 
					                     .Set(cs => cs.DrugId, String.Empty)
 | 
				
			||||||
 | 
					                     .UpdateAsync();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                var cs = await _connection.ChannelStock.Where(cs => cs.ListId == list.Id).DeleteAsync();
 | 
				
			||||||
 | 
					                if (r > 0 && cs > 0)
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    _connection.CommitTransaction();
 | 
				
			||||||
 | 
					                    return true;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                else
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    _connection.RollbackTransaction();
 | 
				
			||||||
 | 
					                    return false;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            catch (Exception ex)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                _connection.RollbackTransaction();
 | 
				
			||||||
 | 
					                logger.Info($"手术室药箱解绑异常:{ex.Message}");
 | 
				
			||||||
 | 
					                return false;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        //获取手术室药箱中所有要补药的数据
 | 
				
			||||||
 | 
					        public async Task<PageData<ChannelList>> GetAllBoxAddDrug(int? take, int? skip)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            try
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                List<ChannelList> channelLists = new List<ChannelList>();
 | 
				
			||||||
 | 
					                var query = _connection.ChannelStock//.AsQueryable()
 | 
				
			||||||
 | 
					                .Where(cs => cs.MachineId == _setting.boxMachineId&&cs.BoxState==1)
 | 
				
			||||||
 | 
					                .GroupBy(cs => new { cs.DrawerNo, cs.DrugId })
 | 
				
			||||||
 | 
					                .Select(g => new
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    DrawerNo = g.Key.DrawerNo,
 | 
				
			||||||
 | 
					                    DrugId = g.Key.DrugId,
 | 
				
			||||||
 | 
					                    sumQuantity = g.Sum(cs => cs.Quantity)
 | 
				
			||||||
 | 
					                })
 | 
				
			||||||
 | 
					                .ToList();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                var queryChannelStock = _connection.ChannelStock.AsQueryable()
 | 
				
			||||||
 | 
					               .Where(cs => cs.MachineId == _setting.boxMachineId&&cs.BoxState==1)
 | 
				
			||||||
 | 
					               .LoadWith(cs => cs.Drug).ToList();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                var queryList = await _connection.ChannelList.AsQueryable().Where(cl => cl.MachineId == _setting.boxMachineId).ToListAsync();
 | 
				
			||||||
 | 
					                for (int i = 0; i < queryList.Count; i++)
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    foreach (var item in query)
 | 
				
			||||||
 | 
					                    {
 | 
				
			||||||
 | 
					                        if (queryList[i].DrawerNo == item.DrawerNo)
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            ChannelStock stock = queryChannelStock.Where(cs => cs.DrawerNo == item.DrawerNo && cs.DrugId == item.DrugId && cs.BaseQuantity > item.sumQuantity).FirstOrDefault();
 | 
				
			||||||
 | 
					                            if (stock != null)
 | 
				
			||||||
 | 
					                            {
 | 
				
			||||||
 | 
					                                stock.NeedQuantity = stock.BaseQuantity-item.sumQuantity;
 | 
				
			||||||
 | 
					                                queryList[i].ChannelStocks.Add(stock);
 | 
				
			||||||
 | 
					                            }
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                    if (queryList[i].ChannelStocks != null && queryList[i].ChannelStocks.Count > 0)
 | 
				
			||||||
 | 
					                    {
 | 
				
			||||||
 | 
					                        channelLists.Add(queryList[i]);
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                int pagedData = channelLists.Count;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                return new PageData<ChannelList>()
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    TotalDesserts = pagedData,
 | 
				
			||||||
 | 
					                    Desserts = channelLists
 | 
				
			||||||
 | 
					                };
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            catch (Exception ex)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                logger.Info($"获取药箱中补药数据失败{ex.Message}");
 | 
				
			||||||
 | 
					                return null;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        //手术室药箱补药获取毒麻柜中的药品信息
 | 
				
			||||||
 | 
					        public async Task<List<BoxTakeVo>> getTakeInfoByBox(ChannelList cl)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            try
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                List<BoxTakeVo> tempData = new();
 | 
				
			||||||
 | 
					                List<BoxTakeVo> tempData2 = new();
 | 
				
			||||||
 | 
					                var flag = true;
 | 
				
			||||||
 | 
					                for (int i = 0; i < cl.ChannelStocks.Count; i++)
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    ChannelStock boxCs = cl.ChannelStocks[i];
 | 
				
			||||||
 | 
					                    // 当前药品取药数量
 | 
				
			||||||
 | 
					                    var Quantity = boxCs.NeedQuantity;
 | 
				
			||||||
 | 
					                    List<ChannelStock> stockList = await _connection.ChannelStock
 | 
				
			||||||
 | 
					                        .Where(cs=>cs.MachineId==_setting.machineId&&cs.DrawerType==1&&cs.DrugId==boxCs.DrugId&&cs.Quantity>0&&cs.ManuNo!=null)
 | 
				
			||||||
 | 
					                        .AsQueryable()
 | 
				
			||||||
 | 
					                        .OrderBy(cs=>cs.EffDate).ToListAsync();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    // 当前药品的库存总量
 | 
				
			||||||
 | 
					                    var total = stockList.Sum(current => current.Quantity);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    tempData2.Add(new BoxTakeVo()
 | 
				
			||||||
 | 
					                    {
 | 
				
			||||||
 | 
					                        Drug = boxCs.Drug,
 | 
				
			||||||
 | 
					                        StockQuantity = total,
 | 
				
			||||||
 | 
					                        Quantity = Quantity
 | 
				
			||||||
 | 
					                    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    if (flag)
 | 
				
			||||||
 | 
					                    {
 | 
				
			||||||
 | 
					                        // 盘点库存是否足够
 | 
				
			||||||
 | 
					                        if (total > Quantity)
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                            for (var j = 0; Quantity > 0; j++)
 | 
				
			||||||
 | 
					                            {
 | 
				
			||||||
 | 
					                                ChannelStock stock = stockList[j];
 | 
				
			||||||
 | 
					                                if (Quantity > stock.Quantity)
 | 
				
			||||||
 | 
					                                {
 | 
				
			||||||
 | 
					                                    // 取药数量大于库存
 | 
				
			||||||
 | 
					                                    tempData.Add(new BoxTakeVo()
 | 
				
			||||||
 | 
					                                    {
 | 
				
			||||||
 | 
					                                        Drug = boxCs.Drug,
 | 
				
			||||||
 | 
					                                        BoxDetail= boxCs,
 | 
				
			||||||
 | 
					                                        ChannelStock = stock,
 | 
				
			||||||
 | 
					                                        StockQuantity = total,
 | 
				
			||||||
 | 
					                                        Quantity = stock.Quantity,
 | 
				
			||||||
 | 
					                                    });
 | 
				
			||||||
 | 
					                                    Quantity -= stock.Quantity;
 | 
				
			||||||
 | 
					                                }
 | 
				
			||||||
 | 
					                                else
 | 
				
			||||||
 | 
					                                {
 | 
				
			||||||
 | 
					                                    //取药数量小于库存
 | 
				
			||||||
 | 
					                                    tempData.Add(new BoxTakeVo()
 | 
				
			||||||
 | 
					                                    {
 | 
				
			||||||
 | 
					                                        Drug = boxCs.Drug,
 | 
				
			||||||
 | 
					                                        BoxDetail = boxCs,
 | 
				
			||||||
 | 
					                                        ChannelStock = stock,
 | 
				
			||||||
 | 
					                                        StockQuantity = total,
 | 
				
			||||||
 | 
					                                        Quantity = Quantity,
 | 
				
			||||||
 | 
					                                    });
 | 
				
			||||||
 | 
					                                    Quantity = 0;
 | 
				
			||||||
 | 
					                                }
 | 
				
			||||||
 | 
					                            }
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                        else
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            // 库存不足
 | 
				
			||||||
 | 
					                            flag = false;
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                if (flag)
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    return tempData;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                else
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    return tempData2;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                return tempData;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            catch (Exception ex)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                logger.Info($"获取数据异常{ex.Message}");
 | 
				
			||||||
 | 
					                return null;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        //手术室药箱补药完成
 | 
				
			||||||
 | 
					        public async Task<bool> BoxTakeFinish(List<BoxTakeVo> datas)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            try
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                _connection.BeginTransaction();
 | 
				
			||||||
 | 
					                var flag = true;
 | 
				
			||||||
 | 
					                // 更新处方状态
 | 
				
			||||||
 | 
					                //int r1 = _connection.ChannelStock.Where(oi => oi.OrderNo == datas.First().OrderDetail.OrderNo)
 | 
				
			||||||
 | 
					                //        .Set(oi => oi.Status, 1)
 | 
				
			||||||
 | 
					                //        .Update();
 | 
				
			||||||
 | 
					                //if (!(r1 > 0))
 | 
				
			||||||
 | 
					                //{
 | 
				
			||||||
 | 
					                //    flag = false;
 | 
				
			||||||
 | 
					                //    logger.Error("处方取药完成更新处方状态失败");
 | 
				
			||||||
 | 
					                //    _connection.RollbackTransaction();
 | 
				
			||||||
 | 
					                //    return flag;
 | 
				
			||||||
 | 
					                //}
 | 
				
			||||||
 | 
					                for (var i = 0; i < datas.Count; i++)
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    var boxTakeVo = datas[i];
 | 
				
			||||||
 | 
					                    var EffDate = boxTakeVo.ChannelStock.EffDate;
 | 
				
			||||||
 | 
					                    if (!DateTime.TryParse(boxTakeVo.ChannelStock.EffDate, out DateTime dEffDate))
 | 
				
			||||||
 | 
					                    {
 | 
				
			||||||
 | 
					                        //效期转换出错
 | 
				
			||||||
 | 
					                        if (boxTakeVo.ChannelStock.EffDate != null)
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            string[] idate = boxTakeVo.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()
 | 
				
			||||||
 | 
					                    {
 | 
				
			||||||
 | 
					                        MachineId = _setting.machineId,
 | 
				
			||||||
 | 
					                        DrawerNo = boxTakeVo.ChannelStock.DrawerNo,
 | 
				
			||||||
 | 
					                        ColNo = boxTakeVo.ChannelStock.ColNo,
 | 
				
			||||||
 | 
					                        DrugId = boxTakeVo.ChannelStock.DrugId,
 | 
				
			||||||
 | 
					                        ManuNo = boxTakeVo.ChannelStock.ManuNo,
 | 
				
			||||||
 | 
					                        EffDate = !String.IsNullOrEmpty(EffDate) ? DateTime.ParseExact(EffDate, "yyyy-MM-dd", System.Globalization.CultureInfo.CurrentCulture) : null,
 | 
				
			||||||
 | 
					                        OperationTime = DateTime.Now,
 | 
				
			||||||
 | 
					                        Type = 2,
 | 
				
			||||||
 | 
					                        Quantity = boxTakeVo.GetQuantity,
 | 
				
			||||||
 | 
					                        Operator = _globalStateService.Operator.Id,
 | 
				
			||||||
 | 
					                        Reviewer = _globalStateService.Reviewer?.Id ?? _globalStateService.Operator.Id,
 | 
				
			||||||
 | 
					                        InvoiceId = boxTakeVo.BoxDetail.Id.ToString(),
 | 
				
			||||||
 | 
					                    });
 | 
				
			||||||
 | 
					                    // 更新库存
 | 
				
			||||||
 | 
					                    int r = _connection.ChannelStock.Where(cs => cs.Id == boxTakeVo.ChannelStock.Id)
 | 
				
			||||||
 | 
					                        .Set(cs => cs.Quantity, boxTakeVo.ChannelStock.Quantity - boxTakeVo.GetQuantity)
 | 
				
			||||||
 | 
					                        .Update();
 | 
				
			||||||
 | 
					                    #region 保存账册,给药箱补药不记录出库账册
 | 
				
			||||||
 | 
					                    // 获取更新完库存之后的药品库存
 | 
				
			||||||
 | 
					                    //List<ChannelStock> list = await _connection.ChannelStock.AsQueryable()
 | 
				
			||||||
 | 
					                    //     .InnerJoin(
 | 
				
			||||||
 | 
					                    //         _connection.ChannelList.Where(cl => cl.MachineId.Equals(_setting.machineId)).Where(cl => cl.DrawerType == 1),
 | 
				
			||||||
 | 
					                    //         (cs, cl) => cs.ListId == cl.Id,
 | 
				
			||||||
 | 
					                    //         (cs, cl) => cs
 | 
				
			||||||
 | 
					                    //     )
 | 
				
			||||||
 | 
					                    //     .Where(cs => cs.DrugId.Equals(boxTakeVo.ChannelStock.DrugId))
 | 
				
			||||||
 | 
					                    //     .ToListAsync();
 | 
				
			||||||
 | 
					                    // 保存账册,给药箱补药不记录出库账册
 | 
				
			||||||
 | 
					                    //int acid = _connection.InsertWithInt32Identity(new AccountBook()
 | 
				
			||||||
 | 
					                    //{
 | 
				
			||||||
 | 
					                    //    MachineId = _setting.machineId,
 | 
				
			||||||
 | 
					                    //    DrugId = boxTakeVo.ChannelStock.DrugId,
 | 
				
			||||||
 | 
					                    //    ManuNo = boxTakeVo.ChannelStock.ManuNo,
 | 
				
			||||||
 | 
					                    //    EffDate = !String.IsNullOrEmpty(EffDate) ? DateTime.ParseExact(EffDate, "yyyy-MM-dd", System.Globalization.CultureInfo.CurrentCulture) : null,
 | 
				
			||||||
 | 
					                    //    OperationTime = DateTime.Now,
 | 
				
			||||||
 | 
					                    //    Type = 2,
 | 
				
			||||||
 | 
					                    //    OutQuantity = boxTakeVo.GetQuantity,
 | 
				
			||||||
 | 
					                    //    AddQuantity = 0,
 | 
				
			||||||
 | 
					                    //    Operator = _globalStateService.Operator.Id,
 | 
				
			||||||
 | 
					                    //    Reviewer = _globalStateService.Reviewer?.Id ?? _globalStateService.Operator.Id,
 | 
				
			||||||
 | 
					                    //    ManuStock = list.Where(it => it.ManuNo == boxTakeVo.ChannelStock.ManuNo).Sum(it => it.Quantity),
 | 
				
			||||||
 | 
					                    //    TotalStock = list.Sum(it => it.Quantity),
 | 
				
			||||||
 | 
					                    //    //InvoiceId = orderTakeVo.OrderDetail.Id.ToString()
 | 
				
			||||||
 | 
					                    //});
 | 
				
			||||||
 | 
					                    #endregion
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    //更新药箱中的药品数量
 | 
				
			||||||
 | 
					                    int boxID = _connection.Insert(new ChannelStock() { 
 | 
				
			||||||
 | 
					                        Id = Guid.NewGuid().ToString(),
 | 
				
			||||||
 | 
					                        ListId = boxTakeVo.BoxDetail.Id,
 | 
				
			||||||
 | 
					                        MachineId = _setting.boxMachineId,
 | 
				
			||||||
 | 
					                        DrawerNo = boxTakeVo.BoxDetail.DrawerNo,
 | 
				
			||||||
 | 
					                        AddToQuantity = boxTakeVo.GetQuantity,
 | 
				
			||||||
 | 
					                        NeedQuantity=0,
 | 
				
			||||||
 | 
					                        DrugId = boxTakeVo.ChannelStock.DrugId,
 | 
				
			||||||
 | 
					                        ManuNo = boxTakeVo.ChannelStock.ManuNo,
 | 
				
			||||||
 | 
					                        EffDate= boxTakeVo.ChannelStock.EffDate,
 | 
				
			||||||
 | 
					                        BaseQuantity = boxTakeVo.BoxDetail.BaseQuantity,
 | 
				
			||||||
 | 
					                        BoardType = boxTakeVo.BoxDetail.BoardType,
 | 
				
			||||||
 | 
					                        BoxState= 2 //补药完成
 | 
				
			||||||
 | 
					                    });
 | 
				
			||||||
 | 
					                    // 手术室药箱入库记录
 | 
				
			||||||
 | 
					                    int boxMId = _connection.InsertWithInt32Identity(new MachineRecord()
 | 
				
			||||||
 | 
					                    {
 | 
				
			||||||
 | 
					                        MachineId = _setting.machineId,
 | 
				
			||||||
 | 
					                        DrawerNo = boxTakeVo.BoxDetail.DrawerNo,
 | 
				
			||||||
 | 
					                        DrugId = boxTakeVo.ChannelStock.DrugId,
 | 
				
			||||||
 | 
					                        ManuNo = boxTakeVo.ChannelStock.ManuNo,
 | 
				
			||||||
 | 
					                        EffDate = !String.IsNullOrEmpty(EffDate) ? DateTime.ParseExact(EffDate, "yyyy-MM-dd", System.Globalization.CultureInfo.CurrentCulture) : null,
 | 
				
			||||||
 | 
					                        OperationTime = DateTime.Now,
 | 
				
			||||||
 | 
					                        Type = 1,
 | 
				
			||||||
 | 
					                        Quantity = boxTakeVo.GetQuantity,
 | 
				
			||||||
 | 
					                        Operator = _globalStateService.Operator.Id,
 | 
				
			||||||
 | 
					                        Reviewer = _globalStateService.Reviewer?.Id ?? _globalStateService.Operator.Id,
 | 
				
			||||||
 | 
					                        InvoiceId = boxTakeVo.ChannelStock.Id.ToString(),
 | 
				
			||||||
 | 
					                    });
 | 
				
			||||||
 | 
					                    int totalQuantity = _connection.PlanDetails.Where(p => p.PlanId == Convert.ToInt32(boxTakeVo.BoxDetail.DrugId)).Sum(p => p.BaseQuantity);
 | 
				
			||||||
 | 
					                    int list=_connection.ChannelList.Where(cl => cl.Id == boxTakeVo.BoxDetail.Id)
 | 
				
			||||||
 | 
					                        .Set(cl => cl.TotalQuantity, totalQuantity)
 | 
				
			||||||
 | 
					                        .Update();
 | 
				
			||||||
 | 
					                    int delResutl = await _connection.ChannelStock.Where(cs => cs.Id == boxTakeVo.BoxDetail.Id).DeleteAsync();
 | 
				
			||||||
 | 
					                    if (mid > 0 && r > 0 && boxID > 0&& boxMId>0&& delResutl>0&& list>0)
 | 
				
			||||||
 | 
					                    {
 | 
				
			||||||
 | 
					                        if (boxTakeVo.ChannelStock.BoardType.ToString().Contains("5"))
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            await _portUtil.WriteQuantityMethod(boxTakeVo.ChannelStock.Quantity - boxTakeVo.GetQuantity, boxTakeVo.ChannelStock.DrawerNo, boxTakeVo.ChannelStock.ColNo);
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                    else
 | 
				
			||||||
 | 
					                    {
 | 
				
			||||||
 | 
					                        flag = false;
 | 
				
			||||||
 | 
					                        break;
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                if (flag)
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    _connection.CommitTransaction();
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                else
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    _connection.RollbackTransaction();
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                return flag;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            catch (Exception ex)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                logger.Error("处方取药完成保存数据库失败,错误:" + ex.Message);
 | 
				
			||||||
 | 
					                _connection.RollbackTransaction();
 | 
				
			||||||
 | 
					                return false;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        //手术室药箱入库
 | 
				
			||||||
 | 
					        public async Task<PageData<ChannelList>> GetBoxWaitInfo(int? take, int? skip)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            try
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                List<ChannelList> channelLists = new List<ChannelList>();
 | 
				
			||||||
 | 
					                var query = _connection.ChannelStock//.AsQueryable()
 | 
				
			||||||
 | 
					                .Where(cs => cs.MachineId == _setting.boxMachineId && cs.BoxState == 2)
 | 
				
			||||||
 | 
					                .GroupBy(cs => new { cs.DrawerNo, cs.DrugId })
 | 
				
			||||||
 | 
					                .Select(g => new
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    DrawerNo = g.Key.DrawerNo,
 | 
				
			||||||
 | 
					                    DrugId = g.Key.DrugId,
 | 
				
			||||||
 | 
					                    sumQuantity = g.Sum(cs => cs.Quantity)
 | 
				
			||||||
 | 
					                })
 | 
				
			||||||
 | 
					                .ToList();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                var queryChannelStock = _connection.ChannelStock.AsQueryable()
 | 
				
			||||||
 | 
					               .Where(cs => cs.MachineId == _setting.boxMachineId && cs.BoxState == 2)
 | 
				
			||||||
 | 
					               .LoadWith(cs => cs.Drug).ToList();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                var queryList = await _connection.ChannelList.AsQueryable().Where(cl => cl.MachineId == _setting.boxMachineId).ToListAsync();
 | 
				
			||||||
 | 
					                for (int i = 0; i < queryList.Count; i++)
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    foreach (var item in query)
 | 
				
			||||||
 | 
					                    {
 | 
				
			||||||
 | 
					                        if (queryList[i].DrawerNo == item.DrawerNo)
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            ChannelStock stock = queryChannelStock.Where(cs => cs.DrawerNo == item.DrawerNo && cs.DrugId == item.DrugId && cs.BaseQuantity > item.sumQuantity).FirstOrDefault();
 | 
				
			||||||
 | 
					                            if (stock != null)
 | 
				
			||||||
 | 
					                            {
 | 
				
			||||||
 | 
					                                stock.NeedQuantity = stock.BaseQuantity - item.sumQuantity;
 | 
				
			||||||
 | 
					                                queryList[i].ChannelStocks.Add(stock);
 | 
				
			||||||
 | 
					                            }
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                    if (queryList[i].ChannelStocks != null && queryList[i].ChannelStocks.Count > 0)
 | 
				
			||||||
 | 
					                    {
 | 
				
			||||||
 | 
					                        channelLists.Add(queryList[i]);
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                int pagedData = channelLists.Count;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                return new PageData<ChannelList>()
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    TotalDesserts = pagedData,
 | 
				
			||||||
 | 
					                    Desserts = channelLists
 | 
				
			||||||
 | 
					                };
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            catch (Exception ex)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                logger.Info($"获取药箱中补药数据失败{ex.Message}");
 | 
				
			||||||
 | 
					                return null;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        //手术室药箱入库获取待入库明细
 | 
				
			||||||
 | 
					        public async Task<List<BoxTakeVo>> getBoxWaitByBox(ChannelList cl)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            try
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                List<BoxTakeVo> tempData = new();
 | 
				
			||||||
 | 
					                List<BoxTakeVo> tempData2 = new();
 | 
				
			||||||
 | 
					                var flag = true;
 | 
				
			||||||
 | 
					                for (int i = 0; i < cl.ChannelStocks.Count; i++)
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    ChannelStock boxCs = cl.ChannelStocks[i];
 | 
				
			||||||
 | 
					                    // 当前药品取药数量
 | 
				
			||||||
 | 
					                    var Quantity = boxCs.NeedQuantity;
 | 
				
			||||||
 | 
					                    List<ChannelStock> stockList = await _connection.ChannelStock
 | 
				
			||||||
 | 
					                        .Where(cs => cs.MachineId == _setting.machineId && cs.DrawerType == 1 && cs.DrugId == boxCs.DrugId && cs.Quantity > 0 && cs.ManuNo != null)
 | 
				
			||||||
 | 
					                        .AsQueryable()
 | 
				
			||||||
 | 
					                        .OrderBy(cs => cs.EffDate).ToListAsync();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    // 当前药品的库存总量
 | 
				
			||||||
 | 
					                    var total = stockList.Sum(current => current.Quantity);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    tempData2.Add(new BoxTakeVo()
 | 
				
			||||||
 | 
					                    {
 | 
				
			||||||
 | 
					                        Drug = boxCs.Drug,
 | 
				
			||||||
 | 
					                        StockQuantity = total,
 | 
				
			||||||
 | 
					                        Quantity = Quantity
 | 
				
			||||||
 | 
					                    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    if (flag)
 | 
				
			||||||
 | 
					                    {
 | 
				
			||||||
 | 
					                        // 盘点库存是否足够
 | 
				
			||||||
 | 
					                        if (total > Quantity)
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                            for (var j = 0; Quantity > 0; j++)
 | 
				
			||||||
 | 
					                            {
 | 
				
			||||||
 | 
					                                ChannelStock stock = stockList[j];
 | 
				
			||||||
 | 
					                                if (Quantity > stock.Quantity)
 | 
				
			||||||
 | 
					                                {
 | 
				
			||||||
 | 
					                                    // 取药数量大于库存
 | 
				
			||||||
 | 
					                                    tempData.Add(new BoxTakeVo()
 | 
				
			||||||
 | 
					                                    {
 | 
				
			||||||
 | 
					                                        Drug = boxCs.Drug,
 | 
				
			||||||
 | 
					                                        BoxDetail = boxCs,
 | 
				
			||||||
 | 
					                                        ChannelStock = stock,
 | 
				
			||||||
 | 
					                                        StockQuantity = total,
 | 
				
			||||||
 | 
					                                        Quantity = stock.Quantity,
 | 
				
			||||||
 | 
					                                    });
 | 
				
			||||||
 | 
					                                    Quantity -= stock.Quantity;
 | 
				
			||||||
 | 
					                                }
 | 
				
			||||||
 | 
					                                else
 | 
				
			||||||
 | 
					                                {
 | 
				
			||||||
 | 
					                                    //取药数量小于库存
 | 
				
			||||||
 | 
					                                    tempData.Add(new BoxTakeVo()
 | 
				
			||||||
 | 
					                                    {
 | 
				
			||||||
 | 
					                                        Drug = boxCs.Drug,
 | 
				
			||||||
 | 
					                                        BoxDetail = boxCs,
 | 
				
			||||||
 | 
					                                        ChannelStock = stock,
 | 
				
			||||||
 | 
					                                        StockQuantity = total,
 | 
				
			||||||
 | 
					                                        Quantity = Quantity,
 | 
				
			||||||
 | 
					                                    });
 | 
				
			||||||
 | 
					                                    Quantity = 0;
 | 
				
			||||||
 | 
					                                }
 | 
				
			||||||
 | 
					                            }
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                        else
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            // 库存不足
 | 
				
			||||||
 | 
					                            flag = false;
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                if (flag)
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    return tempData;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                else
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    return tempData2;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                return tempData;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            catch (Exception ex)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                logger.Info($"获取数据异常{ex.Message}");
 | 
				
			||||||
 | 
					                return null;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -28,9 +28,21 @@ namespace MasaBlazorApp3.DataAccess.Impl
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        public bool DeleteDrugManuNo(string id)
 | 
					        public bool DeleteDrugManuNo(string id)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            if (!string.IsNullOrEmpty(id))
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                int manuNo= _connection.DrugManuNo.Where(dm => dm.Id == id).Count();
 | 
				
			||||||
 | 
					                if (manuNo > 0)
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
                    return _connection.DrugManuNo.Where(dm => dm.Id == id).Delete() > 0;
 | 
					                    return _connection.DrugManuNo.Where(dm => dm.Id == id).Delete() > 0;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					                else return true;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            else
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                return true;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        public bool UpdateDrugManuNo(DrugManuNo drugManuNo)
 | 
					        public bool UpdateDrugManuNo(DrugManuNo drugManuNo)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,51 @@
 | 
				
			||||||
 | 
					using LinqToDB;
 | 
				
			||||||
 | 
					using log4net;
 | 
				
			||||||
 | 
					using MasaBlazorApp3.DataAccess.Dao;
 | 
				
			||||||
 | 
					using MasaBlazorApp3.Pojo;
 | 
				
			||||||
 | 
					using MasaBlazorApp3.Pojo.Config;
 | 
				
			||||||
 | 
					using MasaBlazorApp3.Port;
 | 
				
			||||||
 | 
					using Microsoft.Extensions.Options;
 | 
				
			||||||
 | 
					using System;
 | 
				
			||||||
 | 
					using System.Collections.Generic;
 | 
				
			||||||
 | 
					using System.Data.Common;
 | 
				
			||||||
 | 
					using System.Linq;
 | 
				
			||||||
 | 
					using System.Text;
 | 
				
			||||||
 | 
					using System.Threading.Tasks;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace MasaBlazorApp3.DataAccess.Impl
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    public class HkcChangeShiftsDao: IHkcChangeShiftsDao
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        private readonly AppDataConnection _connection;
 | 
				
			||||||
 | 
					        private readonly SettingConfig _setting;
 | 
				
			||||||
 | 
					        private readonly ILog logger = LogManager.GetLogger(typeof(HkcChangeShifts));
 | 
				
			||||||
 | 
					        private readonly PortUtil _portUtil;
 | 
				
			||||||
 | 
					        public HkcChangeShiftsDao(AppDataConnection connection, IOptions<SettingConfig> setting, PortUtil portUtil)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            _connection = connection;
 | 
				
			||||||
 | 
					            _setting = setting.Value;
 | 
				
			||||||
 | 
					            _portUtil = portUtil;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        public async Task<PageData<HkcChangeShifts>> GetChangeShiftRecordAsync(DateTime start, DateTime end, int? take, int? skip)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var query = _connection.HkcChangeShifts.AsQueryable().Where(it => it.MachineId.Equals(_setting.machineId));
 | 
				
			||||||
 | 
					            if (start != null && start != DateTime.MinValue)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                query = query.Where(mr => mr.optDate > start);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            if (end != null && end != DateTime.MinValue)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                query = query.Where(mr => mr.optDate < end);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            int pagedData = await query.CountAsync();
 | 
				
			||||||
 | 
					            List<HkcChangeShifts> Records = await query
 | 
				
			||||||
 | 
					                .OrderByDescending(mr => mr.optDate)
 | 
				
			||||||
 | 
					                .Skip((int)skip)
 | 
				
			||||||
 | 
					                .Take((int)take)
 | 
				
			||||||
 | 
					                .ToListAsync();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            return new PageData<HkcChangeShifts>() { Desserts = Records, TotalDesserts = pagedData };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -1,6 +1,7 @@
 | 
				
			||||||
using LinqToDB;
 | 
					using LinqToDB;
 | 
				
			||||||
using LinqToDB.SqlQuery;
 | 
					using LinqToDB.SqlQuery;
 | 
				
			||||||
using log4net;
 | 
					using log4net;
 | 
				
			||||||
 | 
					using log4net.Util;
 | 
				
			||||||
using MasaBlazorApp3.DataAccess.Dao;
 | 
					using MasaBlazorApp3.DataAccess.Dao;
 | 
				
			||||||
using MasaBlazorApp3.Pages;
 | 
					using MasaBlazorApp3.Pages;
 | 
				
			||||||
using MasaBlazorApp3.Pojo;
 | 
					using MasaBlazorApp3.Pojo;
 | 
				
			||||||
| 
						 | 
					@ -67,6 +68,8 @@ namespace MasaBlazorApp3.DataAccess.Impl
 | 
				
			||||||
            int pagedData = await query.CountAsync();
 | 
					            int pagedData = await query.CountAsync();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            List<OrderInfo> list = await query
 | 
					            List<OrderInfo> list = await query
 | 
				
			||||||
 | 
					                .LoadWith(oi => oi.Detail)
 | 
				
			||||||
 | 
					                .LoadWith(oi => oi.Detail.Drug)
 | 
				
			||||||
                .OrderBy((oi) => oi.RecvDate)
 | 
					                .OrderBy((oi) => oi.RecvDate)
 | 
				
			||||||
                .ThenBy((oi => oi.OrderNo))
 | 
					                .ThenBy((oi => oi.OrderNo))
 | 
				
			||||||
                .Skip((int)skip)
 | 
					                .Skip((int)skip)
 | 
				
			||||||
| 
						 | 
					@ -115,7 +118,8 @@ namespace MasaBlazorApp3.DataAccess.Impl
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
                    query = query.Where(cs => cs.ManuNo.Equals(ManuNo));
 | 
					                    query = query.Where(cs => cs.ManuNo.Equals(ManuNo));
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            } else
 | 
					            }
 | 
				
			||||||
 | 
					            else
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                if (!String.IsNullOrEmpty(ManuNo))
 | 
					                if (!String.IsNullOrEmpty(ManuNo))
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
| 
						 | 
					@ -468,7 +472,8 @@ namespace MasaBlazorApp3.DataAccess.Impl
 | 
				
			||||||
                    if (r2 > 0)
 | 
					                    if (r2 > 0)
 | 
				
			||||||
                    {
 | 
					                    {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                    } else
 | 
					                    }
 | 
				
			||||||
 | 
					                    else
 | 
				
			||||||
                    {
 | 
					                    {
 | 
				
			||||||
                        flag = false;
 | 
					                        flag = false;
 | 
				
			||||||
                        break;
 | 
					                        break;
 | 
				
			||||||
| 
						 | 
					@ -573,5 +578,271 @@ namespace MasaBlazorApp3.DataAccess.Impl
 | 
				
			||||||
                return false;
 | 
					                return false;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /// <summary>
 | 
				
			||||||
 | 
					        /// 获取药箱中的用药信息
 | 
				
			||||||
 | 
					        /// </summary>
 | 
				
			||||||
 | 
					        /// <param name="OrderrNo"></param>
 | 
				
			||||||
 | 
					        /// <param name="OrderDate"></param>
 | 
				
			||||||
 | 
					        /// <param name="take"></param>
 | 
				
			||||||
 | 
					        /// <param name="skip"></param>
 | 
				
			||||||
 | 
					        /// <returns></returns>
 | 
				
			||||||
 | 
					        public async Task<PageData<OrderInfo>> GetAllOrderInfoByBox(int box, string OrderrNo, DateTime OrderDate, int? take, int? skip)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            //var query = _connection.OrderInfo.AsQueryable();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            //query.InnerJoin<OrderDetail>((oi, od) => oi.OrderNo == od.OrderNo);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            var query2 = from od in _connection.OrderDetail
 | 
				
			||||||
 | 
					                         from cl in _connection.ChannelStock.Where(c => c.MachineId == _setting.machineId).InnerJoin(c => c.DrugId == od.DrugId)
 | 
				
			||||||
 | 
					                         group od by od.OrderNo into temp
 | 
				
			||||||
 | 
					                         select new { temp.Key };
 | 
				
			||||||
 | 
					            var query = from oi in _connection.OrderInfo
 | 
				
			||||||
 | 
					                        from od in query2.InnerJoin(od => od.Key == oi.OrderNo)
 | 
				
			||||||
 | 
					                        select oi;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (!String.IsNullOrEmpty(OrderrNo))
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                query = query.Where(oi => oi.OrderNo.Equals(OrderrNo));
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            if (OrderDate != null && OrderDate != DateTime.MinValue)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                query = query.Where(oi => oi.OrderDate.Date.Equals(OrderDate.Date));
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            query = query.Where(oi => oi.Status == 0);
 | 
				
			||||||
 | 
					            query = query.Where(oi => oi.HisDispFlag == 0);
 | 
				
			||||||
 | 
					            query = query.Where(oi => oi.CancelFlag == 0);
 | 
				
			||||||
 | 
					            //query = query.Where(oi => oi.DoctorCode == box);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            int pagedData = await query.CountAsync();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            List<OrderInfo> list = await query
 | 
				
			||||||
 | 
					                //.LoadWith(oi => oi.Detail)
 | 
				
			||||||
 | 
					                //.LoadWith(oi => oi.Detail.Drug)
 | 
				
			||||||
 | 
					                .OrderBy((oi) => oi.RecvDate)
 | 
				
			||||||
 | 
					                .ThenBy((oi => oi.OrderNo))
 | 
				
			||||||
 | 
					                .Skip((int)skip)
 | 
				
			||||||
 | 
					                .Take((int)take)
 | 
				
			||||||
 | 
					                .ToListAsync();
 | 
				
			||||||
 | 
					            if (list != null && list.Count > 0)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                for (int i = 0; i < list.Count; i++)
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    //list[i].Detail = await _connection.OrderDetail.AsQueryable()
 | 
				
			||||||
 | 
					                    //    .Where(od => od.OrderNo == list[i].OrderNo)
 | 
				
			||||||
 | 
					                    //    .LoadWith(od => od.Drug)
 | 
				
			||||||
 | 
					                    //    .ToListAsync();
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            return new PageData<OrderInfo>()
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                TotalDesserts = pagedData,
 | 
				
			||||||
 | 
					                Desserts = list
 | 
				
			||||||
 | 
					            };
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        /// <summary>
 | 
				
			||||||
 | 
					        /// 获取所有药箱号
 | 
				
			||||||
 | 
					        /// </summary>
 | 
				
			||||||
 | 
					        /// <param name="machineId"></param>
 | 
				
			||||||
 | 
					        /// <returns></returns>
 | 
				
			||||||
 | 
					        public async Task<int[]> GetDrawerNum(string machineId)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            int[] ints = _connection.ChannelStock.Where(cs => cs.MachineId == machineId).GroupBy(cs => cs.DrawerNo).Select(cs => cs.Key).ToArray();
 | 
				
			||||||
 | 
					            return ints;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        //核对处方
 | 
				
			||||||
 | 
					        public async Task<bool> CheckOrderInfo(IList<OrderInfo> selectedOrderInfos,int DrawerNo)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            try
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                _connection.BeginTransaction();
 | 
				
			||||||
 | 
					                bool bFlag = true;
 | 
				
			||||||
 | 
					                logger.Info($"管理员{_globalStateService.Operator.NickName}开始确认手麻单");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                string empChannelStock = string.Empty;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                for (int i = 0; i < selectedOrderInfos.Count; i++)
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    OrderInfo oi = selectedOrderInfos[i];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    //更新处方状态
 | 
				
			||||||
 | 
					                    if (oi.state == 1)
 | 
				
			||||||
 | 
					                    {
 | 
				
			||||||
 | 
					                        int iUpdate= _connection.OrderInfo.Where(o=>o.OrderNo==oi.OrderNo).Set(o=>o.state,2).Update();
 | 
				
			||||||
 | 
					                        _connection.Insert(new OrderFinish()
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            OrderNo = oi.OrderNo,
 | 
				
			||||||
 | 
					                            PatientId = oi.PatientId,
 | 
				
			||||||
 | 
					                            Pharmacy = oi.Pharmacy,
 | 
				
			||||||
 | 
					                            State = 2,
 | 
				
			||||||
 | 
					                            //WinNo = DrawerNo + 1 + "号手术间",
 | 
				
			||||||
 | 
					                            Operator = _globalStateService.Operator.NickName,
 | 
				
			||||||
 | 
					                        });
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                    int drawerNo = DrawerNo + 1;
 | 
				
			||||||
 | 
					                    ChannelStock cs =_connection.ChannelStock.AsQueryable()
 | 
				
			||||||
 | 
					                                     .Where(cs => cs.DrugId == oi.Detail.DrugId
 | 
				
			||||||
 | 
					                                            && cs.ManuNo == oi.Detail.SetManuNo
 | 
				
			||||||
 | 
					                                            // && cs.EffDate == oi._OrderDetail.SetEffDate
 | 
				
			||||||
 | 
					                                            && cs.MachineId.Equals(_setting.boxMachineId)
 | 
				
			||||||
 | 
					                                            && cs.DrawerNo == drawerNo
 | 
				
			||||||
 | 
					                                            && cs.Quantity >= oi.Detail.Quantity).First();
 | 
				
			||||||
 | 
					                    if (cs == null)
 | 
				
			||||||
 | 
					                    {
 | 
				
			||||||
 | 
					                        logger.Info($"手麻单{oi.OrderNo}对药品批次{oi.Detail.DrugId}-{oi.Detail.SetManuNo}在{drawerNo}药箱无库存");
 | 
				
			||||||
 | 
					                        continue;
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                    cs.Quantity = cs.Quantity - oi.Detail.Quantity;
 | 
				
			||||||
 | 
					                    //cs.NeedNum = cs.NeedNum > 0 ? cs.NeedNum + oi._OrderDetail.Quantity : oi._OrderDetail.Quantity;
 | 
				
			||||||
 | 
					                    logger.Info($"更新手术间{cs.DrawerNo}药品{cs.DrugId}批次{cs.ManuNo}库存为{cs.Quantity},需补药数量为{oi.Detail.Quantity}");
 | 
				
			||||||
 | 
					                    // 更新数据 库存信息
 | 
				
			||||||
 | 
					                    _connection.Update(cs);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    // 获取更新完库存后的药品库存
 | 
				
			||||||
 | 
					                    List<ChannelStock> nowChannels = _connection.ChannelStock.AsQueryable()
 | 
				
			||||||
 | 
					                        .Where(it => it.MachineId.Equals(cs.MachineId) || it.MachineId.Equals(_setting.machineId))
 | 
				
			||||||
 | 
					                        .Where(it => it.DrugId.Equals(cs.DrugId))
 | 
				
			||||||
 | 
					                        .Where(it => it.ManuNo.Equals(cs.ManuNo))
 | 
				
			||||||
 | 
					                        .Where(it => it.DrawerType == 1)
 | 
				
			||||||
 | 
					                        .ToList();
 | 
				
			||||||
 | 
					                    if (cs != null)
 | 
				
			||||||
 | 
					                    {
 | 
				
			||||||
 | 
					                        _connection.Insert(new MachineRecord()
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            MachineId = _setting.machineId,
 | 
				
			||||||
 | 
					                            DrawerNo = cs.DrawerNo,
 | 
				
			||||||
 | 
					                            ColNo = cs.ColNo,
 | 
				
			||||||
 | 
					                            DrugId = cs.DrugId,
 | 
				
			||||||
 | 
					                            ManuNo = cs.ManuNo,
 | 
				
			||||||
 | 
					                            EffDate = !String.IsNullOrEmpty(cs.EffDate) ? DateTime.ParseExact(cs.EffDate, "yyyy-MM-dd", System.Globalization.CultureInfo.CurrentCulture) : null,
 | 
				
			||||||
 | 
					                            Operator = _globalStateService.Operator?.Id,
 | 
				
			||||||
 | 
					                            Reviewer = _globalStateService.Reviewer?.Id,
 | 
				
			||||||
 | 
					                            OperationTime = DateTime.Now,
 | 
				
			||||||
 | 
					                            Quantity = oi.Detail.Quantity,
 | 
				
			||||||
 | 
					                            Type = 2,
 | 
				
			||||||
 | 
					                            InvoiceId = oi.OrderNo
 | 
				
			||||||
 | 
					                            //, StockQuantity = nowChannels.Sum(it => it.Quantity)
 | 
				
			||||||
 | 
					                        });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                       
 | 
				
			||||||
 | 
					                        //查询上一条账册中的空瓶数
 | 
				
			||||||
 | 
					                        AccountBookG2 accountBookEmpty =_connection.AccountBookG2.AsQueryable()
 | 
				
			||||||
 | 
					                        .Where(ab => ab.MachineId.Equals(_setting.machineId))
 | 
				
			||||||
 | 
					                        .Where(ab => ab.Type == 1 || ab.Type == 2)
 | 
				
			||||||
 | 
					                        .Where(ab => ab.DrugId == oi.Detail.DrugId)
 | 
				
			||||||
 | 
					                        .Where(ab => ab.ManuNo == cs.ManuNo).OrderByDescending(ab => ab.Id).First();
 | 
				
			||||||
 | 
					                        //保存账册
 | 
				
			||||||
 | 
					                        int iInsertResult = _connection.Insert(new AccountBookG2()
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            DrugId = oi.Detail.DrugId,
 | 
				
			||||||
 | 
					                            Type = 2,
 | 
				
			||||||
 | 
					                            Department = oi.DeptName,
 | 
				
			||||||
 | 
					                            OrderNo = oi.OrderNo,
 | 
				
			||||||
 | 
					                            ManuNo = cs.ManuNo,
 | 
				
			||||||
 | 
					                            EffDate = cs.EffDate,
 | 
				
			||||||
 | 
					                            OutQuantity = oi.Detail.Quantity,
 | 
				
			||||||
 | 
					                            UserId1 = _globalStateService.Operator?.Id,
 | 
				
			||||||
 | 
					                            UserId2 = _globalStateService.Reviewer?.Id,
 | 
				
			||||||
 | 
					                            MachineId = _setting.machineId,
 | 
				
			||||||
 | 
					                            CreateDate = DateTime.Now.ToString("yyyy-MM-dd"),
 | 
				
			||||||
 | 
					                            CreateTime = DateTime.Now,
 | 
				
			||||||
 | 
					                            InvoiceNo = oi.OrderNo,
 | 
				
			||||||
 | 
					                            ManuStock = nowChannels.Sum(it => it.Quantity),
 | 
				
			||||||
 | 
					                            TotalStock = (accountBookEmpty != null ? (accountBookEmpty.TotalStock > 0 ? accountBookEmpty.TotalStock : 0) : 0) + oi.Detail.Quantity,
 | 
				
			||||||
 | 
					                            ShoushuJian = drawerNo.ToString()
 | 
				
			||||||
 | 
					                        });
 | 
				
			||||||
 | 
					                        //修改凌晨生成的日结存与总结存数据
 | 
				
			||||||
 | 
					                        AccountBookG2 accountBookG2Day = _connection.AccountBookG2.AsQueryable()
 | 
				
			||||||
 | 
					                        .Where(ab => ab.MachineId.Equals(_setting.machineId))
 | 
				
			||||||
 | 
					                        .Where(ab => ab.Type == 3)
 | 
				
			||||||
 | 
					                        .Where(ab => ab.DrugId == oi.Detail.DrugId)
 | 
				
			||||||
 | 
					                        .Where(ab => ab.ManuNo == cs.ManuNo)
 | 
				
			||||||
 | 
					                        .Where(ab => ab.CreateDate == DateTime.Now.ToString("yyyy-MM-dd")).First();
 | 
				
			||||||
 | 
					                        if (accountBookG2Day != null)
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            accountBookG2Day.ManuStock = accountBookG2Day.ManuStock - oi.Detail.Quantity;
 | 
				
			||||||
 | 
					                            _connection.Update(accountBookG2Day);
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                        else
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            //生成日结存时可能没有该库位的绑定信息,需要写入日结存
 | 
				
			||||||
 | 
					                            int iDayResult =_connection.Insert(new AccountBookG2()
 | 
				
			||||||
 | 
					                            {
 | 
				
			||||||
 | 
					                                DrugId = oi.Detail.DrugId,
 | 
				
			||||||
 | 
					                                Type = 3,
 | 
				
			||||||
 | 
					                                ManuNo = cs.ManuNo,
 | 
				
			||||||
 | 
					                                EffDate = cs.EffDate,
 | 
				
			||||||
 | 
					                                YQuantity = 0,
 | 
				
			||||||
 | 
					                                ManuStock = oi.Detail.Quantity,
 | 
				
			||||||
 | 
					                                TotalStock = oi.Detail.Quantity,
 | 
				
			||||||
 | 
					                                UserId1 = _globalStateService.Operator?.Id,
 | 
				
			||||||
 | 
					                                UserId2 = _globalStateService.Reviewer?.Id,
 | 
				
			||||||
 | 
					                                MachineId = _setting.machineId,
 | 
				
			||||||
 | 
					                                CreateDate = DateTime.Now.ToString("yyyy-MM-dd"),
 | 
				
			||||||
 | 
					                                InvoiceNo = "日结存"
 | 
				
			||||||
 | 
					                            });
 | 
				
			||||||
 | 
					                            if (iDayResult <= 0)
 | 
				
			||||||
 | 
					                            {
 | 
				
			||||||
 | 
					                                logger.Info($"未写入日结存数据{oi.Detail.DrugId}-{cs.ManuNo}-{cs.EffDate}-{cs.Quantity}");
 | 
				
			||||||
 | 
					                            }
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                        //修改凌晨生成的日结存与总结存数据
 | 
				
			||||||
 | 
					                        AccountBookG2 accountBookG2Total = _connection.AccountBookG2.AsQueryable()
 | 
				
			||||||
 | 
					                        .Where(ab => ab.MachineId.Equals(_setting.machineId))
 | 
				
			||||||
 | 
					                        .Where(ab => ab.Type == 4)
 | 
				
			||||||
 | 
					                        .Where(ab => ab.DrugId == oi.Detail.DrugId)
 | 
				
			||||||
 | 
					                        .Where(ab => ab.CreateDate == DateTime.Now.ToString("yyyy-MM-dd")).First();
 | 
				
			||||||
 | 
					                        if (accountBookG2Total != null)
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            accountBookG2Total.TotalStock = accountBookG2Total.TotalStock - oi.Detail.Quantity;
 | 
				
			||||||
 | 
					                            _connection.Update(accountBookG2Total);
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                        else
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            //生成总结存时可能没有该库位的绑定信息,需要写入总结存
 | 
				
			||||||
 | 
					                            int iTotalResult = _connection.Insert(new AccountBookG2()
 | 
				
			||||||
 | 
					                            {
 | 
				
			||||||
 | 
					                                DrugId = oi.Detail.DrugId,
 | 
				
			||||||
 | 
					                                Type = 4,
 | 
				
			||||||
 | 
					                                YQuantity = 0,
 | 
				
			||||||
 | 
					                                ManuStock = oi.Detail.Quantity,
 | 
				
			||||||
 | 
					                                TotalStock = oi.Detail.Quantity,
 | 
				
			||||||
 | 
					                                UserId1 = _globalStateService.Operator?.Id,
 | 
				
			||||||
 | 
					                                UserId2 = _globalStateService.Reviewer?.Id,
 | 
				
			||||||
 | 
					                                MachineId = _setting.machineId,
 | 
				
			||||||
 | 
					                                CreateDate = DateTime.Now.ToString("yyyy-MM-dd"),
 | 
				
			||||||
 | 
					                                InvoiceNo = "总结存"
 | 
				
			||||||
 | 
					                            });
 | 
				
			||||||
 | 
					                            if (iTotalResult <= 0)
 | 
				
			||||||
 | 
					                            {
 | 
				
			||||||
 | 
					                                logger.Info($"未写入总结存数据{oi.Detail.DrugId}-{oi.Detail.Quantity}");
 | 
				
			||||||
 | 
					                            }
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					              
 | 
				
			||||||
 | 
					                return true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                logger.Info($"管理员{_globalStateService.Operator.NickName}结束确认手麻单");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                if (bFlag)
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    _connection.CommitTransaction();
 | 
				
			||||||
 | 
					                    return true;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            catch (Exception ex)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                _connection.RollbackTransaction();
 | 
				
			||||||
 | 
					                logger.Info($"核对处方异常{ex.Message}");
 | 
				
			||||||
 | 
					                return false;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,307 @@
 | 
				
			||||||
 | 
					using LinqToDB;
 | 
				
			||||||
 | 
					using log4net;
 | 
				
			||||||
 | 
					using MasaBlazorApp3.DataAccess.Dao;
 | 
				
			||||||
 | 
					using MasaBlazorApp3.Pojo;
 | 
				
			||||||
 | 
					using MasaBlazorApp3.Pojo.Config;
 | 
				
			||||||
 | 
					using Microsoft.Extensions.Options;
 | 
				
			||||||
 | 
					using System;
 | 
				
			||||||
 | 
					using System.Collections.Generic;
 | 
				
			||||||
 | 
					using System.Data.Common;
 | 
				
			||||||
 | 
					using System.Linq;
 | 
				
			||||||
 | 
					using System.Linq.Dynamic.Core;
 | 
				
			||||||
 | 
					using System.Numerics;
 | 
				
			||||||
 | 
					using System.Runtime.CompilerServices;
 | 
				
			||||||
 | 
					using System.Text;
 | 
				
			||||||
 | 
					using System.Threading.Tasks;
 | 
				
			||||||
 | 
					using System.Xml.Linq;
 | 
				
			||||||
 | 
					using ZstdSharp.Unsafe;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace MasaBlazorApp3.DataAccess.Impl
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    public class PlanDao : IPlanDao
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        private AppDataConnection _connection;
 | 
				
			||||||
 | 
					        private readonly SettingConfig _setting;
 | 
				
			||||||
 | 
					        private readonly ILog logger = LogManager.GetLogger(typeof(DrugInfoDao));
 | 
				
			||||||
 | 
					        private GlobalStateService _globalStateService;
 | 
				
			||||||
 | 
					        public PlanDao(AppDataConnection connection, IOptions<SettingConfig> setting, GlobalStateService globalStateService)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            _connection = connection;
 | 
				
			||||||
 | 
					            _setting = setting.Value;
 | 
				
			||||||
 | 
					            _globalStateService = globalStateService;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        /// <summary>
 | 
				
			||||||
 | 
					        /// 获取所有套餐数据
 | 
				
			||||||
 | 
					        /// </summary>
 | 
				
			||||||
 | 
					        /// <returns></returns>
 | 
				
			||||||
 | 
					        public async Task<PageMultiData<Plan, DrugInfo>> GetAllPlanInfo()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var query = _connection.Plan.AsQueryable();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            List<Plan> list = await query.Where(p=>p.UseState==1)
 | 
				
			||||||
 | 
					                .LoadWith(p => p._PlanDetails.Where(pd=>pd.UseState==1))
 | 
				
			||||||
 | 
					                //.ThenLoad(p=>p._DrugInfo)
 | 
				
			||||||
 | 
					                .OrderBy(r => r.Id)
 | 
				
			||||||
 | 
					                .ToListAsync();
 | 
				
			||||||
 | 
					            if (list != null && list.Count > 0)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                for (int i = 0; i < list.Count(); i++)
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    for (int j = 0; j < list[i]._PlanDetails.Count(); j++)
 | 
				
			||||||
 | 
					                    {
 | 
				
			||||||
 | 
					                        list[i]._PlanDetails[j]._DrugInfo =
 | 
				
			||||||
 | 
					                             _connection.DrugInfo.AsQueryable().Where(di => di.DrugId == list[i]._PlanDetails[j].DrugId).First();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            var other = _connection.DrugInfo.AsQueryable();
 | 
				
			||||||
 | 
					            List<DrugInfo> drugInfos = await other
 | 
				
			||||||
 | 
					                .LoadWith(di => di.Manus)
 | 
				
			||||||
 | 
					                .OrderBy((di) => di.DrugId)
 | 
				
			||||||
 | 
					                .ToListAsync();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            int pagedData = await query.CountAsync();
 | 
				
			||||||
 | 
					            return new PageMultiData<Plan, DrugInfo>()
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                TotalDesserts = pagedData,
 | 
				
			||||||
 | 
					                Desserts = list,
 | 
				
			||||||
 | 
					                Other = drugInfos
 | 
				
			||||||
 | 
					            };
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        /// <summary>
 | 
				
			||||||
 | 
					        /// 根据套餐ID获取套餐数据
 | 
				
			||||||
 | 
					        /// </summary>
 | 
				
			||||||
 | 
					        /// <param name="Id"></param>
 | 
				
			||||||
 | 
					        /// <returns></returns>
 | 
				
			||||||
 | 
					        public async Task<Plan> GetPlanById(int Id)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var query = _connection.Plan.AsQueryable().Where(p => p.Id == Id&&p.UseState==1);
 | 
				
			||||||
 | 
					            List<Plan> list = await query
 | 
				
			||||||
 | 
					               .LoadWith(p => p._PlanDetails)
 | 
				
			||||||
 | 
					               //.ThenLoad(p=>p._DrugInfo)
 | 
				
			||||||
 | 
					               .OrderBy(r => r.Id)
 | 
				
			||||||
 | 
					               .ToListAsync();
 | 
				
			||||||
 | 
					            if (list != null && list.Count > 0)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                for (int i = 0; i < list.Count(); i++)
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    for (int j = 0; j < list[i]._PlanDetails.Count(); j++)
 | 
				
			||||||
 | 
					                    {
 | 
				
			||||||
 | 
					                        list[i]._PlanDetails[j]._DrugInfo =
 | 
				
			||||||
 | 
					                             _connection.DrugInfo.AsQueryable().Where(di => di.DrugId == list[i]._PlanDetails[j].DrugId).First();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            return list[0];
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /// <summary>
 | 
				
			||||||
 | 
					        /// 新增套餐
 | 
				
			||||||
 | 
					        /// </summary>
 | 
				
			||||||
 | 
					        /// <param name="plan"></param>
 | 
				
			||||||
 | 
					        /// <returns></returns>
 | 
				
			||||||
 | 
					        public async Task<bool> InsertPlanInfo(Plan plan)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            try
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                plan.AddTime = DateTime.Now;
 | 
				
			||||||
 | 
					                plan.OperatorUser = _globalStateService.Operator.Id;
 | 
				
			||||||
 | 
					                plan.ReviewerUser = _globalStateService.Reviewer?.Id ?? _globalStateService.Operator.Id;
 | 
				
			||||||
 | 
					                return _connection.InsertWithInt32Identity(plan) > 0;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            catch (Exception ex)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                logger.Error($"添加套餐{plan.Name}失败,错误:" + ex.Message);
 | 
				
			||||||
 | 
					                return false;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /// <summary>
 | 
				
			||||||
 | 
					        /// 更新套餐
 | 
				
			||||||
 | 
					        /// </summary>
 | 
				
			||||||
 | 
					        /// <param name="plan"></param>
 | 
				
			||||||
 | 
					        /// <returns></returns>
 | 
				
			||||||
 | 
					        public async Task<bool> UpdatePlanInfo(Plan plan)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            try
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                var iResult = _connection.Plan
 | 
				
			||||||
 | 
					                  .Where(p => p.Id == plan.Id)
 | 
				
			||||||
 | 
					                  .Set(p => p.Name, plan.Name)
 | 
				
			||||||
 | 
					                  .Set(p => p.Description, plan.Description);
 | 
				
			||||||
 | 
					                return iResult.Update() > 0;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            catch (Exception ex)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                logger.Error($"修改套餐{plan.Name}失败,错误:" + ex.Message);
 | 
				
			||||||
 | 
					                return false;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        /// <summary>
 | 
				
			||||||
 | 
					        /// 删除套餐
 | 
				
			||||||
 | 
					        /// </summary>
 | 
				
			||||||
 | 
					        /// <param name="planId"></param>
 | 
				
			||||||
 | 
					        /// <returns></returns>
 | 
				
			||||||
 | 
					        public async Task<bool> DeletePlanInfo(int planId)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            try
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                _connection.BeginTransaction();
 | 
				
			||||||
 | 
					                bool flag = false;
 | 
				
			||||||
 | 
					                //查询是否有绑定,没有绑定可以删除,有绑定则不允许删除
 | 
				
			||||||
 | 
					                int hasCount = _connection.ChannelList.Where(cl => cl.DrugId == planId.ToString() && cl.MachineId == _setting.machineId).Count();
 | 
				
			||||||
 | 
					                if (hasCount > 0)
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    return flag;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                else
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    logger.Error($"删除套餐{planId}");
 | 
				
			||||||
 | 
					                    //查询该套餐下是否有药品,如果有则一并删除
 | 
				
			||||||
 | 
					                    int iHasPd = _connection.PlanDetails.Where(pd => pd.PlanId == planId).Count();
 | 
				
			||||||
 | 
					                    int pdResult = 1;
 | 
				
			||||||
 | 
					                    if (iHasPd > 0)
 | 
				
			||||||
 | 
					                    {
 | 
				
			||||||
 | 
					                        pdResult = _connection.PlanDetails.Where(pd => pd.PlanId == planId).Set(pd => pd.UseState, 0).Update();
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                    int pResult = _connection.Plan.Where(p => p.Id == planId).Set(pd => pd.UseState, 0).Update();
 | 
				
			||||||
 | 
					                    if (pdResult > 0 && pResult > 0)
 | 
				
			||||||
 | 
					                    {
 | 
				
			||||||
 | 
					                        flag = true;
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                if (flag)
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    _connection.CommitTransaction();
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                else
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    _connection.RollbackTransaction();
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                return flag;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            catch (Exception ex)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                logger.Error($"修改套餐失败,错误:" + ex.Message);
 | 
				
			||||||
 | 
					                _connection.RollbackTransaction();
 | 
				
			||||||
 | 
					                return false;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /// <summary>
 | 
				
			||||||
 | 
					        /// 向套餐中添加药品
 | 
				
			||||||
 | 
					        /// </summary>
 | 
				
			||||||
 | 
					        /// <param name="details"></param>
 | 
				
			||||||
 | 
					        /// <returns></returns>
 | 
				
			||||||
 | 
					        public async Task<bool> AddPlanDetail(PlanDetails details)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            try
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                if (!string.IsNullOrEmpty(details.DrugId))
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    int id = _connection.InsertWithInt32Identity(details);
 | 
				
			||||||
 | 
					                    details.Id = id;
 | 
				
			||||||
 | 
					                    return id > 0;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                else
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    return false;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            catch (Exception ex)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                logger.Error($"添加药品{details._DrugInfo.DrugName}失败,错误:" + ex.Message);
 | 
				
			||||||
 | 
					                return false;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        /// <summary>
 | 
				
			||||||
 | 
					        /// 修改套餐中的药品
 | 
				
			||||||
 | 
					        /// </summary>
 | 
				
			||||||
 | 
					        /// <param name="details"></param>
 | 
				
			||||||
 | 
					        /// <returns></returns>
 | 
				
			||||||
 | 
					        public async Task<bool> UpdatePlanDetail(PlanDetails details)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            try
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                var iResult = _connection.PlanDetails
 | 
				
			||||||
 | 
					                  .Where(p => p.Id == details.Id)
 | 
				
			||||||
 | 
					                  .Set(p => p.DrugId, details._DrugInfo.DrugId)
 | 
				
			||||||
 | 
					                  .Set(p => p.BaseQuantity, details.BaseQuantity);
 | 
				
			||||||
 | 
					                return iResult.Update() > 0;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            catch (Exception ex)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                logger.Error($"修改药品{details._DrugInfo.DrugName}失败,错误:" + ex.Message);
 | 
				
			||||||
 | 
					                return false;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /// <summary>
 | 
				
			||||||
 | 
					        /// 删除套餐中的药品
 | 
				
			||||||
 | 
					        /// </summary>
 | 
				
			||||||
 | 
					        /// <param name="details"></param>
 | 
				
			||||||
 | 
					        /// <returns></returns>
 | 
				
			||||||
 | 
					        public async Task<bool> DeletePlanDetail(PlanDetails detail)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            try
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                logger.Error($"删除套餐中的药品{detail._DrugInfo.DrugName}");
 | 
				
			||||||
 | 
					                return _connection.PlanDetails.Where(p => p.Id == detail.Id).Set(p=>p.UseState,0).Update() > 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            catch (Exception ex)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                logger.Error($"添加药品失败,错误:" + ex.Message);
 | 
				
			||||||
 | 
					                return false;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        public bool CheckDrugById(PlanDetails details)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            if (details._DrugInfo.DrugId != null)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                //查询该药品是否已在套餐中存在,存在则不再添加
 | 
				
			||||||
 | 
					                PlanDetails pdDrug = _connection.PlanDetails.Where(p => p.PlanId == details.PlanId && p.DrugId == details._DrugInfo.DrugId&&p.UseState==1).FirstOrDefault();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                if (details.Id > 0)
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    //修改原数据
 | 
				
			||||||
 | 
					                    if (pdDrug != null && pdDrug.Id == details.Id)
 | 
				
			||||||
 | 
					                    {
 | 
				
			||||||
 | 
					                        return true;
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                    else
 | 
				
			||||||
 | 
					                    {
 | 
				
			||||||
 | 
					                        return false;
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                else
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    //新增数据
 | 
				
			||||||
 | 
					                    if (pdDrug != null)
 | 
				
			||||||
 | 
					                    {
 | 
				
			||||||
 | 
					                        return !(pdDrug.Id > 0);
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                    else
 | 
				
			||||||
 | 
					                    {
 | 
				
			||||||
 | 
					                        return true;
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                //return !(hasCount > 0);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            else
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                return true;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,37 @@
 | 
				
			||||||
 | 
					using LinqToDB;
 | 
				
			||||||
 | 
					using MasaBlazorApp3.DataAccess.Dao;
 | 
				
			||||||
 | 
					using MasaBlazorApp3.Pojo;
 | 
				
			||||||
 | 
					using MasaBlazorApp3.Pojo.Config;
 | 
				
			||||||
 | 
					using MasaBlazorApp3.Port;
 | 
				
			||||||
 | 
					using Microsoft.Extensions.Options;
 | 
				
			||||||
 | 
					using System;
 | 
				
			||||||
 | 
					using System.Collections.Generic;
 | 
				
			||||||
 | 
					using System.Data.Common;
 | 
				
			||||||
 | 
					using System.Linq;
 | 
				
			||||||
 | 
					using System.Text;
 | 
				
			||||||
 | 
					using System.Threading.Tasks;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace MasaBlazorApp3.DataAccess.Impl
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    public class SettingManuDao : ISettingManuDao
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        private AppDataConnection _connection;
 | 
				
			||||||
 | 
					        private readonly SettingConfig _setting;
 | 
				
			||||||
 | 
					        private GlobalStateService _globalStateService;
 | 
				
			||||||
 | 
					        public SettingManuDao(AppDataConnection connection, IOptions<SettingConfig> setting, GlobalStateService globalStateService, PortUtil portUtil)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            _globalStateService = globalStateService;
 | 
				
			||||||
 | 
					            _connection = connection;
 | 
				
			||||||
 | 
					            _setting = setting.Value;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        public async Task<List<SettingManu>> GetMenuItemsAsync()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var query = _connection.SettingManu.AsQueryable();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            return await query
 | 
				
			||||||
 | 
					                .OrderBy((sm) => sm.Id)
 | 
				
			||||||
 | 
					                .ToListAsync();
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,147 @@
 | 
				
			||||||
 | 
					@page "/Box/BoxAddBox"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<style>
 | 
				
			||||||
 | 
					    @@keyframes shake {
 | 
				
			||||||
 | 
					        0% {
 | 
				
			||||||
 | 
					            opacity: 1;
 | 
				
			||||||
 | 
					            color: red;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        25% {
 | 
				
			||||||
 | 
					            opacity: 1;
 | 
				
			||||||
 | 
					            color: orange;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        50% {
 | 
				
			||||||
 | 
					            opacity: 0;
 | 
				
			||||||
 | 
					            color: yellow;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        75% {
 | 
				
			||||||
 | 
					            opacity: 1;
 | 
				
			||||||
 | 
					            color: crimson;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        100% {
 | 
				
			||||||
 | 
					            opacity: 1;
 | 
				
			||||||
 | 
					            color: red;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    .rz-custom-header {
 | 
				
			||||||
 | 
					        width: 100%;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    .shaky-text {
 | 
				
			||||||
 | 
					        animation: shake 2s infinite ease-in-out;
 | 
				
			||||||
 | 
					        /* 你可以根据需要调整动画的持续时间和迭代次数 */
 | 
				
			||||||
 | 
					        transition: color 0.5s linear,opacity 0.5s linear;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					</style>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<div class="container-fluid">
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <RadzenDataGrid @ref="grid" RowSelect="@OnRowSelect" TItem="ChannelList"
 | 
				
			||||||
 | 
					                    IsLoading="@isLoading"
 | 
				
			||||||
 | 
					                    RowRender="@RowRender"
 | 
				
			||||||
 | 
					                    EmptyText="无数据"
 | 
				
			||||||
 | 
					                    Data="@_forecasts" @bind-Value=@selectedChannelLists
 | 
				
			||||||
 | 
					                    AllowColumnResize="true" AllowAlternatingRows="false"
 | 
				
			||||||
 | 
					                    SelectionMode="DataGridSelectionMode.Single"
 | 
				
			||||||
 | 
					                    ExpandMode="DataGridExpandMode.Multiple">
 | 
				
			||||||
 | 
					        <Template Context="cs">
 | 
				
			||||||
 | 
					            <RadzenDataGrid Data="@cs.ChannelStocks" EmptyText="无数据">
 | 
				
			||||||
 | 
					                <Columns>
 | 
				
			||||||
 | 
					                    <RadzenDataGridColumn Title="药品名称" Property="Drug.DrugName">
 | 
				
			||||||
 | 
					                    </RadzenDataGridColumn>
 | 
				
			||||||
 | 
					                    <RadzenDataGridColumn Title="规格" Property="Drug.DrugSpec">
 | 
				
			||||||
 | 
					                    </RadzenDataGridColumn>
 | 
				
			||||||
 | 
					                    <RadzenDataGridColumn Title="厂家" Property="Drug.Manufactory">
 | 
				
			||||||
 | 
					                    </RadzenDataGridColumn>
 | 
				
			||||||
 | 
					                    @*  <RadzenDataGridColumn Title="批次" Property="ManuNo"></RadzenDataGridColumn>
 | 
				
			||||||
 | 
					                    <RadzenDataGridColumn Title="效期" Property="EffDate">
 | 
				
			||||||
 | 
					                    </RadzenDataGridColumn> *@
 | 
				
			||||||
 | 
					                    <RadzenDataGridColumn Title="基数" Property="BaseQuantity">
 | 
				
			||||||
 | 
					                    </RadzenDataGridColumn>
 | 
				
			||||||
 | 
					                    <RadzenDataGridColumn Title="需补药数" Property="NeedQuantity">
 | 
				
			||||||
 | 
					                    </RadzenDataGridColumn>
 | 
				
			||||||
 | 
					                </Columns>
 | 
				
			||||||
 | 
					            </RadzenDataGrid>
 | 
				
			||||||
 | 
					        </Template>
 | 
				
			||||||
 | 
					        <Columns>
 | 
				
			||||||
 | 
					            <RadzenDataGridColumn Frozen="true" Width="200px" Title="药箱号" Property="DrawerNo">
 | 
				
			||||||
 | 
					                <Template Context="DrawerNo">
 | 
				
			||||||
 | 
					                    @DrawerNo.DrawerNo 号药箱
 | 
				
			||||||
 | 
					                </Template>
 | 
				
			||||||
 | 
					            </RadzenDataGridColumn>
 | 
				
			||||||
 | 
					            <RadzenDataGridColumn Title="总库存" Property="TotalQuantity"></RadzenDataGridColumn>
 | 
				
			||||||
 | 
					        </Columns>
 | 
				
			||||||
 | 
					    </RadzenDataGrid>
 | 
				
			||||||
 | 
					</div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@code {
 | 
				
			||||||
 | 
					    @inject IChannelListDao channelStockDao;
 | 
				
			||||||
 | 
					    @inject DialogService dialogService;
 | 
				
			||||||
 | 
					    RadzenDataGrid<ChannelList> grid;
 | 
				
			||||||
 | 
					    bool isLoading;
 | 
				
			||||||
 | 
					    int count;
 | 
				
			||||||
 | 
					    private IEnumerable<ChannelList>? _forecasts;
 | 
				
			||||||
 | 
					    DateTime start;
 | 
				
			||||||
 | 
					    DateTime end;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    IList<ChannelList> selectedChannelLists;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    protected override async Task OnInitializedAsync()
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        await base.OnInitializedAsync();
 | 
				
			||||||
 | 
					        isLoading = true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        var result = await channelStockDao.GetBoxWaitInfo(10, 0);
 | 
				
			||||||
 | 
					        // Update the Data property
 | 
				
			||||||
 | 
					        _forecasts = result.Desserts;
 | 
				
			||||||
 | 
					        isLoading = false;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    protected override async Task OnAfterRenderAsync(bool firstRender)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        base.OnAfterRender(firstRender);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (firstRender)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            // await grid.ExpandRows(grid.PagedView.Where(di => di.Stocks.Count > 0));
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    void RowRender(RowRenderEventArgs<ChannelList> args)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        args.Expandable = args.Data.ChannelStocks.Count > 0;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    async void OnRowSelect(ChannelList cl)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        var b = await dialogService.OpenAsync<BoxAddBoxDetailDialog>(
 | 
				
			||||||
 | 
					               $"{cl.DrawerNo}号药箱取药",
 | 
				
			||||||
 | 
					             new Dictionary<string, object>() { { "boxChannelList", cl } },
 | 
				
			||||||
 | 
					             new DialogOptions() { Width = "85vw", Resizable = true, Draggable = true, ShowClose = false }
 | 
				
			||||||
 | 
					       );
 | 
				
			||||||
 | 
					        if (b)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            await grid.Reload();
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    async void StockExport()
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    async void AccountBookExport()
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,318 @@
 | 
				
			||||||
 | 
					@page "/Box/BoxAddBoxDetail"
 | 
				
			||||||
 | 
					@using MasaBlazorApp3.Pojo.Config;
 | 
				
			||||||
 | 
					@using MasaBlazorApp3.Pojo.Vo;
 | 
				
			||||||
 | 
					@using MasaBlazorApp3.Util;
 | 
				
			||||||
 | 
					@using Microsoft.Extensions.Options;
 | 
				
			||||||
 | 
					@using Newtonsoft.Json;
 | 
				
			||||||
 | 
					@using log4net;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<RadzenStack Gap="1rem" Orientation="Orientation.Vertical" Style="height: 100%;">
 | 
				
			||||||
 | 
					    <RadzenStack>
 | 
				
			||||||
 | 
					        @if (CanTakeDrug)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            <RadzenDataGrid Data="@data" AllowAlternatingRows="false">
 | 
				
			||||||
 | 
					                <Columns>
 | 
				
			||||||
 | 
					                    <RadzenDataGridColumn Property="ChannelStock" Title="库位">
 | 
				
			||||||
 | 
					                        <Template>
 | 
				
			||||||
 | 
					                            @context.ChannelStock.DrawerNo - @context.ChannelStock.ColNo
 | 
				
			||||||
 | 
					                        </Template>
 | 
				
			||||||
 | 
					                    </RadzenDataGridColumn>
 | 
				
			||||||
 | 
					                    <RadzenDataGridColumn Property="Drug.DrugName" Title="药品" />
 | 
				
			||||||
 | 
					                    <RadzenDataGridColumn Property="Drug.DrugSpec" Title="规格" />
 | 
				
			||||||
 | 
					                    <RadzenDataGridColumn Property="ChannelStock.ManuNo" Title="批次" />
 | 
				
			||||||
 | 
					                    <RadzenDataGridColumn Property="ChannelStock.EffDate" Title="效期" />
 | 
				
			||||||
 | 
					                    <RadzenDataGridColumn Property="Quantity" Title="数量" />
 | 
				
			||||||
 | 
					                </Columns>
 | 
				
			||||||
 | 
					            </RadzenDataGrid>
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        else
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            <RadzenDataGrid Data="@data" AllowAlternatingRows="false">
 | 
				
			||||||
 | 
					                <Columns>
 | 
				
			||||||
 | 
					                    <RadzenDataGridColumn Property="Drug.DrugName" Title="药品" />
 | 
				
			||||||
 | 
					                    <RadzenDataGridColumn Property="Drug.DrugSpec" Title="规格" />
 | 
				
			||||||
 | 
					                    <RadzenDataGridColumn Property="Quantity" Title="取药数量" />
 | 
				
			||||||
 | 
					                    <RadzenDataGridColumn Property="StockQuantity" Title="库存" />
 | 
				
			||||||
 | 
					                </Columns>
 | 
				
			||||||
 | 
					            </RadzenDataGrid>
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    </RadzenStack>
 | 
				
			||||||
 | 
					    <RadzenStack Orientation="Orientation.Horizontal" JustifyContent="JustifyContent.Center" Gap="0.5rem">
 | 
				
			||||||
 | 
					        @if (status < 2)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            <RadzenButton Click="@OpenDrawer" Disabled="!CanTakeDrug" IsBusy="status > 0" BusyText="取药中。。。" ButtonStyle="ButtonStyle.Warning" Variant="Variant.Flat" Text="取药" Style="width: 120px" />
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        @if (status == 2)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            <RadzenButton Click="@TakeFinish" ButtonStyle="ButtonStyle.Success" Variant="Variant.Flat" Text="完成" Style="width: 120px" />
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        @if (status <= 2)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            <RadzenButton Click="@Cancel" Variant="Variant.Flat" Text="取消" Style="width: 120px" />
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    </RadzenStack>
 | 
				
			||||||
 | 
					</RadzenStack>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@code {
 | 
				
			||||||
 | 
					    @inject Radzen.DialogService dialogService;
 | 
				
			||||||
 | 
					    @inject IChannelListDao channelListDao;
 | 
				
			||||||
 | 
					    @inject IOptions<DrawerConfig> setting;
 | 
				
			||||||
 | 
					    @inject NotificationService _message
 | 
				
			||||||
 | 
					    @inject PortUtil PortUtil;
 | 
				
			||||||
 | 
					    private readonly ILog logger = LogManager.GetLogger(typeof(OrderDetailDialog));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    int status;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    [Parameter] public ChannelList boxChannelList { get; set; }
 | 
				
			||||||
 | 
					    private bool CanTakeDrug = true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public List<BoxTakeVo> data { get; set; }
 | 
				
			||||||
 | 
					    //称重取药数量
 | 
				
			||||||
 | 
					    int[] WeightFinnalQuantity { get; set; } = new int[] { 0, 0, 0, 0, 0, 0, 0, 0, 0 };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    //开抽屉前操作标识
 | 
				
			||||||
 | 
					    List<string> DrawerNoColNoList = new List<string>();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    protected override async Task OnInitializedAsync()
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        data = await channelListDao.getTakeInfoByBox(boxChannelList);
 | 
				
			||||||
 | 
					        // 如果有【stockQuantity】字段说明有药品库存不足
 | 
				
			||||||
 | 
					        if (data.Any(it => it.ChannelStock == null))
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            CanTakeDrug = false;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        base.OnInitializedAsync();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    async Task OpenDrawer()
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        this.status = 1;
 | 
				
			||||||
 | 
					        // 解析需要打开的抽屉列表
 | 
				
			||||||
 | 
					        List<BoxTakeVo> drawerNos = this.data.GroupBy(it => it.ChannelStock.DrawerNo).Select(it => it.First()).ToList();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // 根据抽屉类型来决定打开前是否需要查询数量
 | 
				
			||||||
 | 
					        var promiseUtil = new PromiseUtil<int>();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        await promiseUtil.taskAsyncLoop(500, 0, async (options, next, stop) =>
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var orderTakeVo = drawerNos[options._data];
 | 
				
			||||||
 | 
					            var drawerNo = orderTakeVo.ChannelStock.DrawerNo;
 | 
				
			||||||
 | 
					            try
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                if (this.status == 0)
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    stop();
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                // 开启抽屉
 | 
				
			||||||
 | 
					                else if (this.status == 1)
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    if (orderTakeVo.Status == 0)
 | 
				
			||||||
 | 
					                    {
 | 
				
			||||||
 | 
					                        // 判断是否为单支抽屉
 | 
				
			||||||
 | 
					                        if (setting.Value.single.Contains(drawerNo))
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            byte[] quantity = await PortUtil.CheckQuantityByDrawer(drawerNo);
 | 
				
			||||||
 | 
					                            orderTakeVo.BeforeQuantity = quantity.Select(it => Convert.ToInt32(it)).ToArray().Skip(3).Take(9).ToArray();
 | 
				
			||||||
 | 
					                            logger.Info($"单支抽屉,开抽屉前检测数量【{string.Join(",", orderTakeVo.BeforeQuantity)}】");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                            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 (!DrawerNoColNoList.Contains(data[i].ChannelStock.DrawerNo.ToString() + data[i].ChannelStock.ColNo))
 | 
				
			||||||
 | 
					                            {
 | 
				
			||||||
 | 
					                                if (data[i].ChannelStock.BoardType.ToString().Contains("6"))
 | 
				
			||||||
 | 
					                                {
 | 
				
			||||||
 | 
					                                    PortUtil.DrawerNo = data[i].ChannelStock.DrawerNo;
 | 
				
			||||||
 | 
					                                    PortUtil.ColNoLst.Add(data[i].ChannelStock.ColNo);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                                    data[i].BeforeQuantity[data[i].ChannelStock.ColNo - 1] = await PortUtil.CheckQuantityForSingle(data[i].ChannelStock.ColNo);
 | 
				
			||||||
 | 
					                                    logger.Info($"称重抽屉,开抽屉前检测数量【{string.Join(",", orderTakeVo.BeforeQuantity)}】");
 | 
				
			||||||
 | 
					                                    await Task.Delay(200);
 | 
				
			||||||
 | 
					                                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                                //是药盒抽屉开药盒
 | 
				
			||||||
 | 
					                                if (data[i].ChannelStock.BoardType.ToString().Contains("3"))
 | 
				
			||||||
 | 
					                                {
 | 
				
			||||||
 | 
					                                    PortUtil.DrawerNo = data[i].ChannelStock.DrawerNo;
 | 
				
			||||||
 | 
					                                    await PortUtil.OpenBoxByColNo(data[i].ChannelStock.ColNo);
 | 
				
			||||||
 | 
					                                    await Task.Delay(200);
 | 
				
			||||||
 | 
					                                }
 | 
				
			||||||
 | 
					                                DrawerNoColNoList.Add(data[i].ChannelStock.DrawerNo.ToString() + data[i].ChannelStock.ColNo);
 | 
				
			||||||
 | 
					                            }
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                        var b = await PortUtil.OpenDrawerStatus(drawerNo);
 | 
				
			||||||
 | 
					                        if (b)
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            PortUtil.speechSynthesizer.SpeakAsyncCancelAll();
 | 
				
			||||||
 | 
					                            PortUtil.SpeakAsync($"{drawerNo}号抽屉已经打开,请,取药");
 | 
				
			||||||
 | 
					                            orderTakeVo.Status = 1;
 | 
				
			||||||
 | 
					                            next();
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                        else
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            _message.Notify(
 | 
				
			||||||
 | 
					                            new NotificationMessage { Severity = NotificationSeverity.Error, Summary = "提示", Detail = $"抽屉【{drawerNo}】打开失败,请检测硬件", Duration = 4000 }
 | 
				
			||||||
 | 
					                        );
 | 
				
			||||||
 | 
					                            logger.Info($"抽屉打开失败");
 | 
				
			||||||
 | 
					                            PortUtil.AllLightOff();
 | 
				
			||||||
 | 
					                            RestData();
 | 
				
			||||||
 | 
					                            stop();
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                    // 检测状态
 | 
				
			||||||
 | 
					                    else if (orderTakeVo.Status == 1)
 | 
				
			||||||
 | 
					                    {
 | 
				
			||||||
 | 
					                        // 查询抽屉是否为关闭状态
 | 
				
			||||||
 | 
					                        var b = await PortUtil.CheckDrawerStatus2(drawerNo);
 | 
				
			||||||
 | 
					                        // 关闭则改变状态并终止循环
 | 
				
			||||||
 | 
					                        if (b)
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                            data.ForEach(cl =>
 | 
				
			||||||
 | 
					                            {
 | 
				
			||||||
 | 
					                                if (cl.ChannelStock.DrawerNo == drawerNo)
 | 
				
			||||||
 | 
					                                {
 | 
				
			||||||
 | 
					                                    cl.GetQuantity = cl.Quantity;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                                }
 | 
				
			||||||
 | 
					                            });
 | 
				
			||||||
 | 
					                            orderTakeVo.Status = 2;
 | 
				
			||||||
 | 
					                            PortUtil.AllLightOff();
 | 
				
			||||||
 | 
					                            if (options._data == drawerNos.Count - 1)
 | 
				
			||||||
 | 
					                            {
 | 
				
			||||||
 | 
					                                PortUtil.speechSynthesizer.SpeakAsyncCancelAll();
 | 
				
			||||||
 | 
					                                PortUtil.speechSynthesizer.SpeakAsyncCancelAll();
 | 
				
			||||||
 | 
					                                PortUtil.SpeakAsync($"取药完成,请,点击完成按钮进行确认");
 | 
				
			||||||
 | 
					                                this.status = 2;
 | 
				
			||||||
 | 
					                                string alertMessage = string.Empty;
 | 
				
			||||||
 | 
					                                //检查是否称重抽屉,核对实际取出数量是否与应取数量一致,不一致则弹出提示
 | 
				
			||||||
 | 
					                                for (int i = 0; i < data.Count; i++)
 | 
				
			||||||
 | 
					                                {
 | 
				
			||||||
 | 
					                                    if (data[i].ChannelStock.BoardType.ToString().Contains("6"))
 | 
				
			||||||
 | 
					                                    {
 | 
				
			||||||
 | 
					                                        PortUtil.DrawerNo = data[i].ChannelStock.DrawerNo;// drawerNo;
 | 
				
			||||||
 | 
					                                        PortUtil.ColNoLst.Add(data[i].ChannelStock.ColNo);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                                        orderTakeVo.AfterQuantity[data[i].ChannelStock.ColNo - 1] = await PortUtil.CheckQuantityForSingle(data[i].ChannelStock.ColNo);
 | 
				
			||||||
 | 
					                                        logger.Info($"称重抽屉,关抽屉后检测数量【{string.Join(",", orderTakeVo.AfterQuantity)}】");
 | 
				
			||||||
 | 
					                                        WeightFinnalQuantity[data[i].ChannelStock.ColNo - 1] = data[i].BeforeQuantity[data[i].ChannelStock.ColNo - 1] - orderTakeVo.AfterQuantity[data[i].ChannelStock.ColNo - 1];
 | 
				
			||||||
 | 
					                                        if (data[i].Quantity != WeightFinnalQuantity[data[i].ChannelStock.ColNo - 1])
 | 
				
			||||||
 | 
					                                        {
 | 
				
			||||||
 | 
					                                            //称重自动计数数量与实际要取数量不一致弹出提示,确认后保存数据
 | 
				
			||||||
 | 
					                                            alertMessage += $"{data[i].Drug.DrugName}应取数量【{data[i].Quantity}】,实际取出数量【{WeightFinnalQuantity[data[i].ChannelStock.ColNo - 1]}】";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                                        }
 | 
				
			||||||
 | 
					                                        await Task.Delay(200);
 | 
				
			||||||
 | 
					                                    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                                    if (data[i].ChannelStock.BoardType.ToString().Contains("2"))
 | 
				
			||||||
 | 
					                                    {
 | 
				
			||||||
 | 
					                                        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("取消保存");
 | 
				
			||||||
 | 
					                                        // 关闭弹窗
 | 
				
			||||||
 | 
					                                        dialogService.Close(false);
 | 
				
			||||||
 | 
					                                    }
 | 
				
			||||||
 | 
					                                }
 | 
				
			||||||
 | 
					                                stop();
 | 
				
			||||||
 | 
					                            }
 | 
				
			||||||
 | 
					                            else
 | 
				
			||||||
 | 
					                            {
 | 
				
			||||||
 | 
					                                options._data += 1;
 | 
				
			||||||
 | 
					                                next();
 | 
				
			||||||
 | 
					                            }
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                        else
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            next(); // continue iteration
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            catch (Exception e)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                RestData();
 | 
				
			||||||
 | 
					                logger.Info($"{boxChannelList.DrawerNo}药盒取药发生错误,{e.Message}");
 | 
				
			||||||
 | 
					                _message.Notify(
 | 
				
			||||||
 | 
					                new NotificationMessage { Severity = NotificationSeverity.Error, Summary = "提示", Detail = $"发生错误,{e.Message}", Duration = 4000 }
 | 
				
			||||||
 | 
					            );
 | 
				
			||||||
 | 
					                if (setting.Value.single.Contains(drawerNo))
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    PortUtil.AllLightOff();
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                stop();
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    void RestData()
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        PortUtil.speechSynthesizer.SpeakAsyncCancelAll();
 | 
				
			||||||
 | 
					        this.status = 0;
 | 
				
			||||||
 | 
					        data.ForEach(it =>
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            it.Status = 0;
 | 
				
			||||||
 | 
					            it.BeforeQuantity = new int[9];
 | 
				
			||||||
 | 
					            it.AfterQuantity = new int[9];
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					        this.WeightFinnalQuantity = new int[9];
 | 
				
			||||||
 | 
					        DrawerNoColNoList.Clear();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    void Cancel()
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        RestData();
 | 
				
			||||||
 | 
					        // 关闭弹窗
 | 
				
			||||||
 | 
					        dialogService.Close(false);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    async Task TakeFinish()
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // 保存账册、操作记录
 | 
				
			||||||
 | 
					        var b = await channelListDao.BoxTakeFinish(data);
 | 
				
			||||||
 | 
					        if (!b)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            _message.Notify(new NotificationMessage { Severity = NotificationSeverity.Error, Summary = "提示", Detail = $"数据保存失败", Duration = 4000 });
 | 
				
			||||||
 | 
					            logger.Error($"手术室药箱取药保存数据库失败,数据{JsonConvert.SerializeObject(data)}");
 | 
				
			||||||
 | 
					            // 关闭弹窗
 | 
				
			||||||
 | 
					            dialogService.Close(false);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        else
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            // 关闭弹窗
 | 
				
			||||||
 | 
					            dialogService.Close(true);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        //重置状态
 | 
				
			||||||
 | 
					        this.RestData();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,329 @@
 | 
				
			||||||
 | 
					@page "/Box/BoxAddDetail"
 | 
				
			||||||
 | 
					@using MasaBlazorApp3.Pojo.Config;
 | 
				
			||||||
 | 
					@using MasaBlazorApp3.Pojo.Vo;
 | 
				
			||||||
 | 
					@using MasaBlazorApp3.Util;
 | 
				
			||||||
 | 
					@using Microsoft.Extensions.Options;
 | 
				
			||||||
 | 
					@using Newtonsoft.Json;
 | 
				
			||||||
 | 
					@using log4net;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<RadzenStack Gap="1rem" Orientation="Orientation.Vertical" Style="height: 100%;">
 | 
				
			||||||
 | 
					    <RadzenStack>
 | 
				
			||||||
 | 
					      @*   <RadzenStack class="rz-p-4 rz-border-radius-1" Style="border: var(--rz-grid-cell-border)" Orientation="Orientation.Horizontal" Gap="1rem">
 | 
				
			||||||
 | 
					            <RadzenText TextStyle="TextStyle.Overline" Class="rz-mt-2 rz-my-0" Style="color: var(--rz-text-tertiary-color);">处方号:</RadzenText>
 | 
				
			||||||
 | 
					            <RadzenText TextStyle="TextStyle.Body1" Class="rz-text-truncate"><b>@(order?.OrderNo)</b></RadzenText>
 | 
				
			||||||
 | 
					            <RadzenText TextStyle="TextStyle.Overline" Class="rz-mt-2 rz-my-0" Style="color: var(--rz-text-tertiary-color);">患者姓名:</RadzenText>
 | 
				
			||||||
 | 
					            <RadzenText TextStyle="TextStyle.Body1" Class="rz-text-truncate"><b>@(order?.PatientName)</b></RadzenText>
 | 
				
			||||||
 | 
					            <RadzenText TextStyle="TextStyle.Overline" Class="rz-mt-2 rz-my-0" Style="color: var(--rz-text-tertiary-color);">性别:</RadzenText>
 | 
				
			||||||
 | 
					            <RadzenText TextStyle="TextStyle.Body1" Class="rz-text-truncate"><b>@(order?.Sex)</b></RadzenText>
 | 
				
			||||||
 | 
					            <RadzenText TextStyle="TextStyle.Overline" Class="rz-mt-2 rz-my-0" Style="color: var(--rz-text-tertiary-color);">年龄:</RadzenText>
 | 
				
			||||||
 | 
					            <RadzenText TextStyle="TextStyle.Body1" Class="rz-text-truncate"><b>@(order?.Age)</b></RadzenText>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        </RadzenStack> *@
 | 
				
			||||||
 | 
					        @if (CanTakeDrug)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            <RadzenDataGrid Data="@data" AllowAlternatingRows="false">
 | 
				
			||||||
 | 
					                <Columns>
 | 
				
			||||||
 | 
					                    <RadzenDataGridColumn Property="ChannelStock" Title="库位">
 | 
				
			||||||
 | 
					                        <Template>
 | 
				
			||||||
 | 
					                            @context.ChannelStock.DrawerNo - @context.ChannelStock.ColNo
 | 
				
			||||||
 | 
					                        </Template>
 | 
				
			||||||
 | 
					                    </RadzenDataGridColumn>
 | 
				
			||||||
 | 
					                    <RadzenDataGridColumn Property="Drug.DrugName" Title="药品" />
 | 
				
			||||||
 | 
					                    <RadzenDataGridColumn Property="Drug.DrugSpec" Title="规格" />
 | 
				
			||||||
 | 
					                    <RadzenDataGridColumn Property="ChannelStock.ManuNo" Title="批次" />
 | 
				
			||||||
 | 
					                    <RadzenDataGridColumn Property="ChannelStock.EffDate" Title="效期" />
 | 
				
			||||||
 | 
					                    <RadzenDataGridColumn Property="Quantity" Title="数量" />
 | 
				
			||||||
 | 
					                </Columns>
 | 
				
			||||||
 | 
					            </RadzenDataGrid>
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        else
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            <RadzenDataGrid Data="@data" AllowAlternatingRows="false">
 | 
				
			||||||
 | 
					                <Columns>
 | 
				
			||||||
 | 
					                    <RadzenDataGridColumn Property="Drug.DrugName" Title="药品" />
 | 
				
			||||||
 | 
					                    <RadzenDataGridColumn Property="Drug.DrugSpec" Title="规格" />
 | 
				
			||||||
 | 
					                    <RadzenDataGridColumn Property="Quantity" Title="取药数量" />
 | 
				
			||||||
 | 
					                    <RadzenDataGridColumn Property="StockQuantity" Title="库存" />
 | 
				
			||||||
 | 
					                </Columns>
 | 
				
			||||||
 | 
					            </RadzenDataGrid>
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    </RadzenStack>
 | 
				
			||||||
 | 
					    <RadzenStack Orientation="Orientation.Horizontal" JustifyContent="JustifyContent.Center" Gap="0.5rem">
 | 
				
			||||||
 | 
					        @if (status < 2)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            <RadzenButton Click="@OpenDrawer" Disabled="!CanTakeDrug" IsBusy="status > 0" BusyText="取药中。。。" ButtonStyle="ButtonStyle.Warning" Variant="Variant.Flat" Text="取药" Style="width: 120px" />
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        @if (status == 2)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            <RadzenButton Click="@TakeFinish" ButtonStyle="ButtonStyle.Success" Variant="Variant.Flat" Text="完成" Style="width: 120px" />
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        @if (status <= 2)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            <RadzenButton Click="@Cancel" Variant="Variant.Flat" Text="取消" Style="width: 120px" />
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    </RadzenStack>
 | 
				
			||||||
 | 
					</RadzenStack>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@code {
 | 
				
			||||||
 | 
					    @inject Radzen.DialogService dialogService;
 | 
				
			||||||
 | 
					    @inject IChannelListDao channelListDao;
 | 
				
			||||||
 | 
					    @inject IOptions<DrawerConfig> setting;
 | 
				
			||||||
 | 
					    @inject NotificationService _message
 | 
				
			||||||
 | 
					    @inject PortUtil PortUtil;
 | 
				
			||||||
 | 
					    private readonly ILog logger = LogManager.GetLogger(typeof(OrderDetailDialog));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    int status;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    [Parameter] public ChannelList boxChannelList { get; set; }
 | 
				
			||||||
 | 
					    private bool CanTakeDrug = true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public List<BoxTakeVo> data { get; set; }
 | 
				
			||||||
 | 
					    //称重取药数量
 | 
				
			||||||
 | 
					    int[] WeightFinnalQuantity { get; set; } = new int[] { 0, 0, 0, 0, 0, 0, 0, 0, 0 };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    //开抽屉前操作标识
 | 
				
			||||||
 | 
					    List<string> DrawerNoColNoList = new List<string>();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    protected override async Task OnInitializedAsync()
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        data = await channelListDao.getTakeInfoByBox(boxChannelList);
 | 
				
			||||||
 | 
					        // 如果有【stockQuantity】字段说明有药品库存不足
 | 
				
			||||||
 | 
					        if (data.Any(it => it.ChannelStock == null))
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            CanTakeDrug = false;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        base.OnInitializedAsync();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    async Task OpenDrawer()
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        this.status = 1;
 | 
				
			||||||
 | 
					        // 解析需要打开的抽屉列表
 | 
				
			||||||
 | 
					        List<BoxTakeVo> drawerNos = this.data.GroupBy(it => it.ChannelStock.DrawerNo).Select(it => it.First()).ToList();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // 根据抽屉类型来决定打开前是否需要查询数量
 | 
				
			||||||
 | 
					        var promiseUtil = new PromiseUtil<int>();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        await promiseUtil.taskAsyncLoop(500, 0, async (options, next, stop) =>
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var orderTakeVo = drawerNos[options._data];
 | 
				
			||||||
 | 
					            var drawerNo = orderTakeVo.ChannelStock.DrawerNo;
 | 
				
			||||||
 | 
					            try
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                if (this.status == 0)
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    stop();
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                // 开启抽屉
 | 
				
			||||||
 | 
					                else if (this.status == 1)
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    if (orderTakeVo.Status == 0)
 | 
				
			||||||
 | 
					                    {
 | 
				
			||||||
 | 
					                        // 判断是否为单支抽屉
 | 
				
			||||||
 | 
					                        if (setting.Value.single.Contains(drawerNo))
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            byte[] quantity = await PortUtil.CheckQuantityByDrawer(drawerNo);
 | 
				
			||||||
 | 
					                            orderTakeVo.BeforeQuantity = quantity.Select(it => Convert.ToInt32(it)).ToArray().Skip(3).Take(9).ToArray();
 | 
				
			||||||
 | 
					                            logger.Info($"单支抽屉,开抽屉前检测数量【{string.Join(",", orderTakeVo.BeforeQuantity)}】");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                            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 (!DrawerNoColNoList.Contains(data[i].ChannelStock.DrawerNo.ToString() + data[i].ChannelStock.ColNo))
 | 
				
			||||||
 | 
					                            {
 | 
				
			||||||
 | 
					                                if (data[i].ChannelStock.BoardType.ToString().Contains("6"))
 | 
				
			||||||
 | 
					                                {
 | 
				
			||||||
 | 
					                                    PortUtil.DrawerNo = data[i].ChannelStock.DrawerNo;
 | 
				
			||||||
 | 
					                                    PortUtil.ColNoLst.Add(data[i].ChannelStock.ColNo);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                                    data[i].BeforeQuantity[data[i].ChannelStock.ColNo - 1] = await PortUtil.CheckQuantityForSingle(data[i].ChannelStock.ColNo);
 | 
				
			||||||
 | 
					                                    logger.Info($"称重抽屉,开抽屉前检测数量【{string.Join(",", orderTakeVo.BeforeQuantity)}】");
 | 
				
			||||||
 | 
					                                    await Task.Delay(200);
 | 
				
			||||||
 | 
					                                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                                //是药盒抽屉开药盒
 | 
				
			||||||
 | 
					                                if (data[i].ChannelStock.BoardType.ToString().Contains("3"))
 | 
				
			||||||
 | 
					                                {
 | 
				
			||||||
 | 
					                                    PortUtil.DrawerNo = data[i].ChannelStock.DrawerNo;
 | 
				
			||||||
 | 
					                                    await PortUtil.OpenBoxByColNo(data[i].ChannelStock.ColNo);
 | 
				
			||||||
 | 
					                                    await Task.Delay(200);
 | 
				
			||||||
 | 
					                                }
 | 
				
			||||||
 | 
					                                DrawerNoColNoList.Add(data[i].ChannelStock.DrawerNo.ToString() + data[i].ChannelStock.ColNo);
 | 
				
			||||||
 | 
					                            }
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                        var b = await PortUtil.OpenDrawerStatus(drawerNo);
 | 
				
			||||||
 | 
					                        if (b)
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            PortUtil.speechSynthesizer.SpeakAsyncCancelAll();
 | 
				
			||||||
 | 
					                            PortUtil.SpeakAsync($"{drawerNo}号抽屉已经打开,请,取药");
 | 
				
			||||||
 | 
					                            orderTakeVo.Status = 1;
 | 
				
			||||||
 | 
					                            next();
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                        else
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            _message.Notify(
 | 
				
			||||||
 | 
					                            new NotificationMessage { Severity = NotificationSeverity.Error, Summary = "提示", Detail = $"抽屉【{drawerNo}】打开失败,请检测硬件", Duration = 4000 }
 | 
				
			||||||
 | 
					                        );
 | 
				
			||||||
 | 
					                            logger.Info($"抽屉打开失败");
 | 
				
			||||||
 | 
					                            PortUtil.AllLightOff();
 | 
				
			||||||
 | 
					                            RestData();
 | 
				
			||||||
 | 
					                            stop();
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                    // 检测状态
 | 
				
			||||||
 | 
					                    else if (orderTakeVo.Status == 1)
 | 
				
			||||||
 | 
					                    {
 | 
				
			||||||
 | 
					                        // 查询抽屉是否为关闭状态
 | 
				
			||||||
 | 
					                        var b = await PortUtil.CheckDrawerStatus2(drawerNo);
 | 
				
			||||||
 | 
					                        // 关闭则改变状态并终止循环
 | 
				
			||||||
 | 
					                        if (b)
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                            data.ForEach(cl =>
 | 
				
			||||||
 | 
					                            {
 | 
				
			||||||
 | 
					                                if (cl.ChannelStock.DrawerNo == drawerNo)
 | 
				
			||||||
 | 
					                                {
 | 
				
			||||||
 | 
					                                    cl.GetQuantity = cl.Quantity;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                                }
 | 
				
			||||||
 | 
					                            });
 | 
				
			||||||
 | 
					                            orderTakeVo.Status = 2;
 | 
				
			||||||
 | 
					                            PortUtil.AllLightOff();
 | 
				
			||||||
 | 
					                            if (options._data == drawerNos.Count - 1)
 | 
				
			||||||
 | 
					                            {
 | 
				
			||||||
 | 
					                                PortUtil.speechSynthesizer.SpeakAsyncCancelAll();
 | 
				
			||||||
 | 
					                                PortUtil.speechSynthesizer.SpeakAsyncCancelAll();
 | 
				
			||||||
 | 
					                                PortUtil.SpeakAsync($"取药完成,请,点击完成按钮进行确认");
 | 
				
			||||||
 | 
					                                this.status = 2;
 | 
				
			||||||
 | 
					                                string alertMessage = string.Empty;
 | 
				
			||||||
 | 
					                                //检查是否称重抽屉,核对实际取出数量是否与应取数量一致,不一致则弹出提示
 | 
				
			||||||
 | 
					                                for (int i = 0; i < data.Count; i++)
 | 
				
			||||||
 | 
					                                {
 | 
				
			||||||
 | 
					                                    if (data[i].ChannelStock.BoardType.ToString().Contains("6"))
 | 
				
			||||||
 | 
					                                    {
 | 
				
			||||||
 | 
					                                        PortUtil.DrawerNo = data[i].ChannelStock.DrawerNo;// drawerNo;
 | 
				
			||||||
 | 
					                                        PortUtil.ColNoLst.Add(data[i].ChannelStock.ColNo);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                                        orderTakeVo.AfterQuantity[data[i].ChannelStock.ColNo - 1] = await PortUtil.CheckQuantityForSingle(data[i].ChannelStock.ColNo);
 | 
				
			||||||
 | 
					                                        logger.Info($"称重抽屉,关抽屉后检测数量【{string.Join(",", orderTakeVo.AfterQuantity)}】");
 | 
				
			||||||
 | 
					                                        WeightFinnalQuantity[data[i].ChannelStock.ColNo - 1] = data[i].BeforeQuantity[data[i].ChannelStock.ColNo - 1] - orderTakeVo.AfterQuantity[data[i].ChannelStock.ColNo - 1];
 | 
				
			||||||
 | 
					                                        if (data[i].Quantity != WeightFinnalQuantity[data[i].ChannelStock.ColNo - 1])
 | 
				
			||||||
 | 
					                                        {
 | 
				
			||||||
 | 
					                                            //称重自动计数数量与实际要取数量不一致弹出提示,确认后保存数据
 | 
				
			||||||
 | 
					                                            alertMessage += $"{data[i].Drug.DrugName}应取数量【{data[i].Quantity}】,实际取出数量【{WeightFinnalQuantity[data[i].ChannelStock.ColNo - 1]}】";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                                        }
 | 
				
			||||||
 | 
					                                        await Task.Delay(200);
 | 
				
			||||||
 | 
					                                    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                                    if (data[i].ChannelStock.BoardType.ToString().Contains("2"))
 | 
				
			||||||
 | 
					                                    {
 | 
				
			||||||
 | 
					                                        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("取消保存");
 | 
				
			||||||
 | 
					                                        // 关闭弹窗
 | 
				
			||||||
 | 
					                                        dialogService.Close(false);
 | 
				
			||||||
 | 
					                                    }
 | 
				
			||||||
 | 
					                                }
 | 
				
			||||||
 | 
					                                stop();
 | 
				
			||||||
 | 
					                            }
 | 
				
			||||||
 | 
					                            else
 | 
				
			||||||
 | 
					                            {
 | 
				
			||||||
 | 
					                                options._data += 1;
 | 
				
			||||||
 | 
					                                next();
 | 
				
			||||||
 | 
					                            }
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                        else
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            next(); // continue iteration
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            catch (Exception e)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                RestData();
 | 
				
			||||||
 | 
					                logger.Info($"{boxChannelList.DrawerNo}药盒取药发生错误,{e.Message}");
 | 
				
			||||||
 | 
					                _message.Notify(
 | 
				
			||||||
 | 
					                new NotificationMessage { Severity = NotificationSeverity.Error, Summary = "提示", Detail = $"发生错误,{e.Message}", Duration = 4000 }
 | 
				
			||||||
 | 
					            );
 | 
				
			||||||
 | 
					                if (setting.Value.single.Contains(drawerNo))
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    PortUtil.AllLightOff();
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                stop();
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    void RestData()
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        PortUtil.speechSynthesizer.SpeakAsyncCancelAll();
 | 
				
			||||||
 | 
					        this.status = 0;
 | 
				
			||||||
 | 
					        data.ForEach(it =>
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            it.Status = 0;
 | 
				
			||||||
 | 
					            it.BeforeQuantity = new int[9];
 | 
				
			||||||
 | 
					            it.AfterQuantity = new int[9];
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					        this.WeightFinnalQuantity = new int[9];
 | 
				
			||||||
 | 
					        DrawerNoColNoList.Clear();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    void Cancel()
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        RestData();
 | 
				
			||||||
 | 
					        // 关闭弹窗
 | 
				
			||||||
 | 
					        dialogService.Close(false);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    async Task TakeFinish()
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // 保存账册、操作记录
 | 
				
			||||||
 | 
					        var b = await channelListDao.BoxTakeFinish(data);
 | 
				
			||||||
 | 
					        if (!b)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            _message.Notify(new NotificationMessage { Severity = NotificationSeverity.Error, Summary = "提示", Detail = $"数据保存失败", Duration = 4000 });
 | 
				
			||||||
 | 
					            logger.Error($"手术室药箱取药保存数据库失败,数据{JsonConvert.SerializeObject(data)}");
 | 
				
			||||||
 | 
					            // 关闭弹窗
 | 
				
			||||||
 | 
					            dialogService.Close(false);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        else
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            // 关闭弹窗
 | 
				
			||||||
 | 
					            dialogService.Close(true);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        //重置状态
 | 
				
			||||||
 | 
					        this.RestData();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,146 @@
 | 
				
			||||||
 | 
					@page "/Box/BoxAdd"
 | 
				
			||||||
 | 
					<style>
 | 
				
			||||||
 | 
					    @@keyframes shake {
 | 
				
			||||||
 | 
					    0% {
 | 
				
			||||||
 | 
					    opacity: 1;
 | 
				
			||||||
 | 
					    color: red;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    25% {
 | 
				
			||||||
 | 
					    opacity: 1;
 | 
				
			||||||
 | 
					    color: orange;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    50% {
 | 
				
			||||||
 | 
					    opacity: 0;
 | 
				
			||||||
 | 
					    color: yellow;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    75% {
 | 
				
			||||||
 | 
					    opacity: 1;
 | 
				
			||||||
 | 
					    color: crimson;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    100% {
 | 
				
			||||||
 | 
					    opacity: 1;
 | 
				
			||||||
 | 
					    color: red;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    .rz-custom-header {
 | 
				
			||||||
 | 
					    width: 100%;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    .shaky-text {
 | 
				
			||||||
 | 
					    animation: shake 2s infinite ease-in-out;
 | 
				
			||||||
 | 
					    /* 你可以根据需要调整动画的持续时间和迭代次数 */
 | 
				
			||||||
 | 
					    transition: color 0.5s linear,opacity 0.5s linear;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					</style>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<div class="container-fluid">
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <RadzenDataGrid @ref="grid" RowSelect="@OnRowSelect" TItem="ChannelList"
 | 
				
			||||||
 | 
					    IsLoading="@isLoading"
 | 
				
			||||||
 | 
					    RowRender="@RowRender"
 | 
				
			||||||
 | 
					    EmptyText="无数据"
 | 
				
			||||||
 | 
					    Data="@_forecasts" @bind-Value=@selectedChannelLists
 | 
				
			||||||
 | 
					    AllowColumnResize="true" AllowAlternatingRows="false"
 | 
				
			||||||
 | 
					    SelectionMode="DataGridSelectionMode.Single"
 | 
				
			||||||
 | 
					    ExpandMode="DataGridExpandMode.Multiple">
 | 
				
			||||||
 | 
					        <Template Context="cs">
 | 
				
			||||||
 | 
					            <RadzenDataGrid Data="@cs.ChannelStocks" EmptyText="无数据">
 | 
				
			||||||
 | 
					                <Columns>
 | 
				
			||||||
 | 
					                    <RadzenDataGridColumn Title="药品名称" Property="Drug.DrugName">
 | 
				
			||||||
 | 
					                    </RadzenDataGridColumn>
 | 
				
			||||||
 | 
					                    <RadzenDataGridColumn Title="规格" Property="Drug.DrugSpec">
 | 
				
			||||||
 | 
					                    </RadzenDataGridColumn>
 | 
				
			||||||
 | 
					                    <RadzenDataGridColumn Title="厂家" Property="Drug.Manufactory">
 | 
				
			||||||
 | 
					                    </RadzenDataGridColumn>
 | 
				
			||||||
 | 
					                   @*  <RadzenDataGridColumn Title="批次" Property="ManuNo"></RadzenDataGridColumn>
 | 
				
			||||||
 | 
					                    <RadzenDataGridColumn Title="效期" Property="EffDate">
 | 
				
			||||||
 | 
					                    </RadzenDataGridColumn> *@
 | 
				
			||||||
 | 
					                    <RadzenDataGridColumn Title="基数" Property="BaseQuantity">
 | 
				
			||||||
 | 
					                    </RadzenDataGridColumn>
 | 
				
			||||||
 | 
					                    <RadzenDataGridColumn Title="需补药数" Property="NeedQuantity">
 | 
				
			||||||
 | 
					                    </RadzenDataGridColumn>
 | 
				
			||||||
 | 
					                </Columns>
 | 
				
			||||||
 | 
					            </RadzenDataGrid>
 | 
				
			||||||
 | 
					        </Template>
 | 
				
			||||||
 | 
					        <Columns>
 | 
				
			||||||
 | 
					            <RadzenDataGridColumn Frozen="true" Width="200px" Title="药箱号" Property="DrawerNo">
 | 
				
			||||||
 | 
					                <Template Context="DrawerNo">
 | 
				
			||||||
 | 
					                    @DrawerNo.DrawerNo 号药箱
 | 
				
			||||||
 | 
					                </Template>
 | 
				
			||||||
 | 
					            </RadzenDataGridColumn>
 | 
				
			||||||
 | 
					            <RadzenDataGridColumn Title="总库存" Property="TotalQuantity"></RadzenDataGridColumn>
 | 
				
			||||||
 | 
					        </Columns>
 | 
				
			||||||
 | 
					    </RadzenDataGrid>
 | 
				
			||||||
 | 
					</div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@code {
 | 
				
			||||||
 | 
					    @inject IChannelListDao channelStockDao;
 | 
				
			||||||
 | 
					    @inject DialogService dialogService;
 | 
				
			||||||
 | 
					    RadzenDataGrid<ChannelList> grid;
 | 
				
			||||||
 | 
					    bool isLoading;
 | 
				
			||||||
 | 
					    int count;
 | 
				
			||||||
 | 
					    private IEnumerable<ChannelList>? _forecasts;
 | 
				
			||||||
 | 
					    DateTime start;
 | 
				
			||||||
 | 
					    DateTime end;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    IList<ChannelList> selectedChannelLists;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    protected override async Task OnInitializedAsync()
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        await base.OnInitializedAsync();
 | 
				
			||||||
 | 
					        isLoading = true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        var result = await channelStockDao.GetAllBoxAddDrug(10, 0);
 | 
				
			||||||
 | 
					        // Update the Data property
 | 
				
			||||||
 | 
					        _forecasts = result.Desserts;
 | 
				
			||||||
 | 
					        isLoading = false;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    protected override async Task OnAfterRenderAsync(bool firstRender)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        base.OnAfterRender(firstRender);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (firstRender)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            // await grid.ExpandRows(grid.PagedView.Where(di => di.Stocks.Count > 0));
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    void RowRender(RowRenderEventArgs<ChannelList> args)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        args.Expandable = args.Data.ChannelStocks.Count > 0;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    async void OnRowSelect(ChannelList cl)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        var b = await dialogService.OpenAsync<BoxAddDetailDialog>(
 | 
				
			||||||
 | 
					               $"{cl.DrawerNo}号药箱取药",
 | 
				
			||||||
 | 
					             new Dictionary<string, object>() { { "boxChannelList", cl } },
 | 
				
			||||||
 | 
					             new DialogOptions() { Width = "85vw", Resizable = true, Draggable = true, ShowClose = false }
 | 
				
			||||||
 | 
					       );
 | 
				
			||||||
 | 
					        if (b)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            await grid.Reload();
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    async void StockExport()
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    async void AccountBookExport()
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,162 @@
 | 
				
			||||||
 | 
					@page "/Box/BoxBindings"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<div class="container-fluid">
 | 
				
			||||||
 | 
					    <div class="row">
 | 
				
			||||||
 | 
					        <div class="col-12 mb-4">
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            <RadzenDataList @ref="grid" LoadData="@LoadData" WrapItems="true" Count="@count" IsLoading="@isLoading" Data="@_forecasts" PageSize="6" AllowPaging="true" PagerHorizontalAlign="HorizontalAlign.Left"
 | 
				
			||||||
 | 
					                            ShowPagingSummary="true" PagingSummaryFormat="{0}/{1} 共{2}条数据">
 | 
				
			||||||
 | 
					                <Template Context="channel">
 | 
				
			||||||
 | 
					                    <RadzenCard class="col-3">
 | 
				
			||||||
 | 
					                        <RadzenRow>
 | 
				
			||||||
 | 
					                            <RadzenColumn Size="8" Class="rz-text-truncate">
 | 
				
			||||||
 | 
					                                <b class="rz-pr-3">@(channel.DrawerNo)</b>
 | 
				
			||||||
 | 
					                                <b>号手术间</b>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                            </RadzenColumn>
 | 
				
			||||||
 | 
					                            <RadzenColumn Size="4" Class="rz-text-align-end">
 | 
				
			||||||
 | 
					                                @if (channel.TotalQuantity == 0)
 | 
				
			||||||
 | 
					                                {
 | 
				
			||||||
 | 
					                                    <RadzenButton ButtonStyle="ButtonStyle.Secondary" Variant="Variant.Outlined" Size="ButtonSize.Small" Click="@(() => EditChannel(channel))" Text="绑定/解绑" />
 | 
				
			||||||
 | 
					                                }
 | 
				
			||||||
 | 
					                            </RadzenColumn>
 | 
				
			||||||
 | 
					                        </RadzenRow>
 | 
				
			||||||
 | 
					                        <hr style="border: none; background-color: rgba(0,0,0,.2); height: 1px; margin: 1rem 0;" />
 | 
				
			||||||
 | 
					                        <RadzenStack Orientation="Orientation.Horizontal" AlignItems="AlignItems.Center">
 | 
				
			||||||
 | 
					                            <RadzenStack Gap="0">
 | 
				
			||||||
 | 
					                                <RadzenText TextStyle="TextStyle.Overline" class="rz-display-flex rz-mt-2 rz-my-0">套餐</RadzenText>
 | 
				
			||||||
 | 
					                                @if (channel.DrugId == null || channel.TotalQuantity == 0)
 | 
				
			||||||
 | 
					                                {
 | 
				
			||||||
 | 
					                                    <RadzenDropDownDataGrid AllowVirtualization="true" Name="planName" TValue="Plan" @bind-Value="channel.PlanInfo" Data="@plans"
 | 
				
			||||||
 | 
					                                                            Style="width:100%; display: block;" AllowFilteringByAllStringColumns="true" TextProperty="Name">
 | 
				
			||||||
 | 
					                                    
 | 
				
			||||||
 | 
					                                        <Columns>
 | 
				
			||||||
 | 
					                                            <RadzenDropDownDataGridColumn Property="Name" Title="套餐名称" Sortable="false" />
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                                            <RadzenDropDownDataGridColumn Property="Description" Width="120px" Title="套餐描述" Sortable="false" />
 | 
				
			||||||
 | 
					                                        </Columns>
 | 
				
			||||||
 | 
					                                    </RadzenDropDownDataGrid>
 | 
				
			||||||
 | 
					                                    <RadzenCustomValidator Component="planName" Validator="@(()=>(channel.PlanInfo.Id>0))" Popup=true Text="请先选择套餐再点击绑定按钮" />
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                                }
 | 
				
			||||||
 | 
					                                else
 | 
				
			||||||
 | 
					                                {
 | 
				
			||||||
 | 
					                                    <RadzenText TextStyle="TextStyle.Body1"><b>@(channel.PlanInfo.Name)</b></RadzenText>
 | 
				
			||||||
 | 
					                                }
 | 
				
			||||||
 | 
					                                <RadzenText TextStyle="TextStyle.Overline" class="rz-display-flex rz-mt-4 rz-mb-0">总库存</RadzenText>
 | 
				
			||||||
 | 
					                                <RadzenText TextStyle="TextStyle.Body1"><b>@(channel.TotalQuantity)</b></RadzenText>
 | 
				
			||||||
 | 
					                            </RadzenStack>
 | 
				
			||||||
 | 
					                        </RadzenStack>
 | 
				
			||||||
 | 
					                    </RadzenCard>
 | 
				
			||||||
 | 
					                </Template>
 | 
				
			||||||
 | 
					            </RadzenDataList>
 | 
				
			||||||
 | 
					        </div>
 | 
				
			||||||
 | 
					    </div>
 | 
				
			||||||
 | 
					</div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@code {
 | 
				
			||||||
 | 
					    @inject IChannelListDao channelListDao;
 | 
				
			||||||
 | 
					    @inject IDrugInfoDao drugInfoDao;
 | 
				
			||||||
 | 
					    @inject DialogService dialogService;
 | 
				
			||||||
 | 
					    @inject NotificationService _message
 | 
				
			||||||
 | 
					    RadzenDataList<ChannelList> grid;
 | 
				
			||||||
 | 
					    bool isLoading;
 | 
				
			||||||
 | 
					    int count;
 | 
				
			||||||
 | 
					    private IEnumerable<ChannelList>? _forecasts;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    List<DrugInfo> drugInfos;
 | 
				
			||||||
 | 
					    List<DrugManuNo> drugManuNos;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    DrugInfo drugInfo;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    DrugManuNo drugManuNo;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    List<Plan> plans;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    protected override async Task OnInitializedAsync()
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        await base.OnInitializedAsync();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        //drugInfos = await drugInfoDao.GetAllDrug();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    async Task LoadData(LoadDataArgs args)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        isLoading = true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        var result = await channelListDao.GetAllChannelListWithPlan(args.Top, args.Skip);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Update the Data property
 | 
				
			||||||
 | 
					        _forecasts = result.Desserts;
 | 
				
			||||||
 | 
					        // Update the count
 | 
				
			||||||
 | 
					        count = result.TotalDesserts;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        isLoading = false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        plans = result.Other;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    async Task reloadGrid()
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        await grid.Reload();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    async Task EditChannel(ChannelList list)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        if (list.PlanInfo.Id > 0)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            // 说明之前有绑定并且未改变,那么就是在进行解绑
 | 
				
			||||||
 | 
					            if (list.DrugId != null && list.DrugId.Equals(list.PlanInfo.Id.ToString()))
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                var b = await channelListDao.UnBindBox(list);
 | 
				
			||||||
 | 
					                if (b)
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    _message.Notify(
 | 
				
			||||||
 | 
					                        new NotificationMessage { Severity = NotificationSeverity.Success, Summary = "提示", Detail = $"解除绑定成功", Duration = 4000 }
 | 
				
			||||||
 | 
					                    );
 | 
				
			||||||
 | 
					                    await reloadGrid();
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            // 否则是进行绑定
 | 
				
			||||||
 | 
					            else
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                var b = await channelListDao.BindBox(list);
 | 
				
			||||||
 | 
					                if (b)
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    _message.Notify(
 | 
				
			||||||
 | 
					                        new NotificationMessage { Severity = NotificationSeverity.Success, Summary = "提示", Detail = $"绑定成功", Duration = 4000 }
 | 
				
			||||||
 | 
					                    );
 | 
				
			||||||
 | 
					                    await reloadGrid();
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        else
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            if (list.PlanInfo != null)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                // 说明只设置了药品
 | 
				
			||||||
 | 
					                var b = await channelListDao.BindBox(list);
 | 
				
			||||||
 | 
					                if (b)
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    _message.Notify(
 | 
				
			||||||
 | 
					                        new NotificationMessage { Severity = NotificationSeverity.Success, Summary = "提示", Detail = $"绑定成功", Duration = 4000 }
 | 
				
			||||||
 | 
					                    );
 | 
				
			||||||
 | 
					                    await reloadGrid();
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            // 什么都没有选择或者么有改变,只是点击了按钮,此时不操作
 | 
				
			||||||
 | 
					            else
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,114 @@
 | 
				
			||||||
 | 
					@page "/setting/Change"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<div class="container-fluid">
 | 
				
			||||||
 | 
					    <div class="row">
 | 
				
			||||||
 | 
					        <div class="col-12 mb-4">
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            <form onsubmit="@(() => grid.Reload())">
 | 
				
			||||||
 | 
					                <RadzenFieldset Text="查询">
 | 
				
			||||||
 | 
					                    <RadzenStack Orientation="Orientation.Horizontal" Gap="1rem">
 | 
				
			||||||
 | 
					                        <RadzenRow AlignItems="AlignItems.Center">
 | 
				
			||||||
 | 
					                            <RadzenColumn Size="4">
 | 
				
			||||||
 | 
					                                <RadzenLabel Text="开始时间" Component="Start" />
 | 
				
			||||||
 | 
					                            </RadzenColumn>
 | 
				
			||||||
 | 
					                            <RadzenColumn Size="8">
 | 
				
			||||||
 | 
					                                <RadzenDatePicker DateFormat="yyyy-MM-dd HH:mm:ss" ShowTime="true" @bind-Value="start" Style="width: 100%;" Name="Start" />
 | 
				
			||||||
 | 
					                            </RadzenColumn>
 | 
				
			||||||
 | 
					                        </RadzenRow>
 | 
				
			||||||
 | 
					                        <RadzenRow AlignItems="AlignItems.Center">
 | 
				
			||||||
 | 
					                            <RadzenColumn Size="4">
 | 
				
			||||||
 | 
					                                <RadzenLabel Text="结束时间" Component="End" />
 | 
				
			||||||
 | 
					                            </RadzenColumn>
 | 
				
			||||||
 | 
					                            <RadzenColumn Size="8">
 | 
				
			||||||
 | 
					                                <RadzenDatePicker DateFormat="yyyy-MM-dd HH:mm:ss" ShowTime="true" @bind-Value="end" Style="width: 100%;" Name="End" />
 | 
				
			||||||
 | 
					                            </RadzenColumn>
 | 
				
			||||||
 | 
					                        </RadzenRow>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                        <RadzenRow AlignItems="AlignItems.Center">
 | 
				
			||||||
 | 
					                            <RadzenColumn Size="12">
 | 
				
			||||||
 | 
					                                <RadzenButton Size="ButtonSize.Large" ButtonType="ButtonType.Submit" IsBusy="isLoading" Icon="search" Text="查询" />
 | 
				
			||||||
 | 
					                                <RadzenButton Size="ButtonSize.Large" Click="reloadGrid" IsBusy="isLoading" Icon="refresh" Text="重置" ButtonStyle="ButtonStyle.Warning" />
 | 
				
			||||||
 | 
					                            </RadzenColumn>
 | 
				
			||||||
 | 
					                        </RadzenRow>
 | 
				
			||||||
 | 
					                    </RadzenStack>
 | 
				
			||||||
 | 
					                </RadzenFieldset>
 | 
				
			||||||
 | 
					            </form>
 | 
				
			||||||
 | 
					        </div>
 | 
				
			||||||
 | 
					        <div class="col-12 mb-4">
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            <RadzenDataGrid @ref="grid"
 | 
				
			||||||
 | 
					                            LoadData="@LoadData"
 | 
				
			||||||
 | 
					                            IsLoading="@isLoading"
 | 
				
			||||||
 | 
					                            Count="@count"
 | 
				
			||||||
 | 
					                            EmptyText="无数据"
 | 
				
			||||||
 | 
					                            Data="@_forecasts"
 | 
				
			||||||
 | 
					                            AllowColumnResize="true" AllowAlternatingRows="false"
 | 
				
			||||||
 | 
					                            SelectionMode="DataGridSelectionMode.Single"
 | 
				
			||||||
 | 
					                            AllowPaging="true" PageSize="10" PagerHorizontalAlign="HorizontalAlign.Left" ShowPagingSummary="true" PagingSummaryFormat="{0}/{1} 共{2}条数据">
 | 
				
			||||||
 | 
					                <Columns>
 | 
				
			||||||
 | 
					                    <RadzenDataGridColumn Title="日期" Property="optDate">
 | 
				
			||||||
 | 
					                        <Template Context="mr">
 | 
				
			||||||
 | 
					                            @mr.optDate.ToString("yyyy-MM-dd")
 | 
				
			||||||
 | 
					                        </Template>
 | 
				
			||||||
 | 
					                    </RadzenDataGridColumn>
 | 
				
			||||||
 | 
					                    <RadzenDataGridColumn Title="交班人发药人" Property="FromOperator"></RadzenDataGridColumn>
 | 
				
			||||||
 | 
					                    <RadzenDataGridColumn Title="交班人审核人" Property="FromRviewer"></RadzenDataGridColumn>
 | 
				
			||||||
 | 
					                    <RadzenDataGridColumn Title="接班人发药人" Property="ToOperator"></RadzenDataGridColumn>
 | 
				
			||||||
 | 
					                    <RadzenDataGridColumn Title="接班人审核人" Property="ToReviewer"></RadzenDataGridColumn>
 | 
				
			||||||
 | 
					                    <RadzenDataGridColumn Title="接班日期" Property="ToDate">
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                        <Template Context="mr">
 | 
				
			||||||
 | 
					                            @mr.ToDate.ToString("yyyy-MM-dd")
 | 
				
			||||||
 | 
					                        </Template>
 | 
				
			||||||
 | 
					                    </RadzenDataGridColumn>
 | 
				
			||||||
 | 
					                    <RadzenDataGridColumn Title="当班状态" Property="State">
 | 
				
			||||||
 | 
					                    </RadzenDataGridColumn>
 | 
				
			||||||
 | 
					                    <RadzenDataGridColumn title="库位" Property="Location"></RadzenDataGridColumn>
 | 
				
			||||||
 | 
					                </Columns>
 | 
				
			||||||
 | 
					            </RadzenDataGrid>
 | 
				
			||||||
 | 
					        </div>
 | 
				
			||||||
 | 
					    </div>
 | 
				
			||||||
 | 
					</div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@code {
 | 
				
			||||||
 | 
					    @inject IHkcChangeShiftsDao hkcChangeShiftsDao;
 | 
				
			||||||
 | 
					    @inject DialogService dialogService;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @inject NavigationManager navigate;
 | 
				
			||||||
 | 
					    RadzenDataGrid<HkcChangeShifts> grid;
 | 
				
			||||||
 | 
					    bool isLoading;
 | 
				
			||||||
 | 
					    int count;
 | 
				
			||||||
 | 
					    private IEnumerable<HkcChangeShifts>? _forecasts;
 | 
				
			||||||
 | 
					    DateTime start;
 | 
				
			||||||
 | 
					    DateTime end;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    [Parameter] public string type { get; set; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    protected override void OnParametersSet()
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        if (grid != null)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            reloadGrid();
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    async Task LoadData(LoadDataArgs args)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        isLoading = true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        var result = await hkcChangeShiftsDao.GetChangeShiftRecordAsync(start, end,args.Top, args.Skip);
 | 
				
			||||||
 | 
					        // Update the Data property
 | 
				
			||||||
 | 
					        _forecasts = result.Desserts;
 | 
				
			||||||
 | 
					        // Update the count
 | 
				
			||||||
 | 
					        count = result.TotalDesserts;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        isLoading = false;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    async Task reloadGrid()
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        start = DateTime.MinValue;
 | 
				
			||||||
 | 
					        end = DateTime.MinValue;
 | 
				
			||||||
 | 
					        await grid.Reload();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,139 @@
 | 
				
			||||||
 | 
					@page "/Box/Check"
 | 
				
			||||||
 | 
					@using MasaBlazorApp3.Pojo.Config
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<RadzenStack Orientation="Orientation.Horizontal" class="col-12 mb-4">
 | 
				
			||||||
 | 
					    <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)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                <RadzenButton class="col-5" Click="@(() => SelectDrawer(i))" Text="@i.ToString()" Disabled="@(status > 0)" Shade="Shade.Light" Variant="@(drawerNo !=i ? Variant.Outlined : Variant.Flat)" />
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        </div>
 | 
				
			||||||
 | 
					    </div>
 | 
				
			||||||
 | 
					    <div class="col-9 mb-4">
 | 
				
			||||||
 | 
					        <form onsubmit="@(() => grid.Reload())">
 | 
				
			||||||
 | 
					            <RadzenFieldset Text="查询">
 | 
				
			||||||
 | 
					                <RadzenStack Orientation="Orientation.Horizontal" Gap="1rem">
 | 
				
			||||||
 | 
					                    <RadzenRow AlignItems="AlignItems.Center">
 | 
				
			||||||
 | 
					                        <RadzenColumn Size="4">
 | 
				
			||||||
 | 
					                            <RadzenLabel Text="处方号" Component="OrderNo" />
 | 
				
			||||||
 | 
					                        </RadzenColumn>
 | 
				
			||||||
 | 
					                        <RadzenColumn Size="8">
 | 
				
			||||||
 | 
					                            <RadzenTextBox @bind-Value="OrderNo" Style="width: 100%;" Name="OrderNo"></RadzenTextBox>
 | 
				
			||||||
 | 
					                        </RadzenColumn>
 | 
				
			||||||
 | 
					                    </RadzenRow>
 | 
				
			||||||
 | 
					                    <RadzenRow AlignItems="AlignItems.Center">
 | 
				
			||||||
 | 
					                        <RadzenColumn Size="4">
 | 
				
			||||||
 | 
					                            <RadzenLabel Text="处方时间" Component="OrderDate" />
 | 
				
			||||||
 | 
					                        </RadzenColumn>
 | 
				
			||||||
 | 
					                        <RadzenColumn Size="8">
 | 
				
			||||||
 | 
					                            <RadzenDatePicker DateFormat="yyyy-MM-dd" CurrentDateChanged="@OnCurrentDateChanged" @bind-Value="OrderDate" Style="width: 100%;" Name="OrderDate" />
 | 
				
			||||||
 | 
					                        </RadzenColumn>
 | 
				
			||||||
 | 
					                    </RadzenRow>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    <RadzenRow AlignItems="AlignItems.Center">
 | 
				
			||||||
 | 
					                        <RadzenColumn Size="12">
 | 
				
			||||||
 | 
					                            <RadzenButton Size="ButtonSize.Medium" ButtonType="ButtonType.Submit" IsBusy="isLoading" Icon="search" Text="查询" />
 | 
				
			||||||
 | 
					                            <RadzenButton Size="ButtonSize.Medium" Click="reloadGrid" IsBusy="isLoading" Icon="refresh" Text="重置" ButtonStyle="ButtonStyle.Warning" />
 | 
				
			||||||
 | 
					                        </RadzenColumn>
 | 
				
			||||||
 | 
					                    </RadzenRow>
 | 
				
			||||||
 | 
					                </RadzenStack>
 | 
				
			||||||
 | 
					            </RadzenFieldset>
 | 
				
			||||||
 | 
					            <RadzenButton Size="ButtonSize.Medium" Click="Confirm" ButtonType="ButtonType.Button" IsBusy="isLoading" Icon="check_circle" Text="确认" Style="margin:0.5rem" />
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        </form>
 | 
				
			||||||
 | 
					        <RadzenDataGrid @ref="grid" AllowRowSelectOnRowClick="@allowRowSelectOnRowClick" AllowFiltering="true" LoadData="@LoadData"
 | 
				
			||||||
 | 
					        FilterPopupRenderMode="PopupRenderMode.OnDemand" FilterCaseSensitivity="FilterCaseSensitivity.CaseInsensitive"
 | 
				
			||||||
 | 
					        Data="@orderInfos" ColumnWidth="200px" IsLoading="@isLoading" Count="@count" EmptyText="无数据"
 | 
				
			||||||
 | 
					        SelectionMode="DataGridSelectionMode.Multiple" @bind-Value=@selectedOrderInfos
 | 
				
			||||||
 | 
					        AllowPaging="true" PageSize="10" PagerHorizontalAlign="HorizontalAlign.Left" ShowPagingSummary="true" PagingSummaryFormat="{0}/{1} 共{2}条数据">
 | 
				
			||||||
 | 
					            <Columns>
 | 
				
			||||||
 | 
					                <RadzenDataGridColumn Sortable="false" Filterable="false" Width="4rem">
 | 
				
			||||||
 | 
					                    <HeaderTemplate>
 | 
				
			||||||
 | 
					                        <RadzenCheckBox TabIndex="-1" TriState="false" TValue="bool?" InputAttributes="@(new Dictionary<string,object>(){ { "aria-label", "Select all items" }})"
 | 
				
			||||||
 | 
					                        Value="@(selectedOrderInfos == null || selectedOrderInfos?.Any() != true ? false : !orderInfos.All(i => selectedOrderInfos.Contains(i)) ? null : orderInfos.Any(i => selectedOrderInfos.Contains(i)))"
 | 
				
			||||||
 | 
					                                        Change="@(args => selectedOrderInfos = args == true ? orderInfos.ToList() : null)" />
 | 
				
			||||||
 | 
					                    </HeaderTemplate>
 | 
				
			||||||
 | 
					                    <Template Context="data">
 | 
				
			||||||
 | 
					                        <RadzenCheckBox TabIndex="-1" TriState="false" Value="@(selectedOrderInfos != null && selectedOrderInfos.Contains(data))" InputAttributes="@(new Dictionary<string,object>(){ { "aria-label", "Select item" }})"
 | 
				
			||||||
 | 
					                                        TValue="bool" Change="@(args => { if (!allowRowSelectOnRowClick) { grid.SelectRow(data); } })" />
 | 
				
			||||||
 | 
					                    </Template>
 | 
				
			||||||
 | 
					                </RadzenDataGridColumn>
 | 
				
			||||||
 | 
					                <RadzenDataGridColumn Property="PatientName" Title="姓名" Sortable="false" Filterable="false" Width="4rem" />
 | 
				
			||||||
 | 
					                <RadzenDataGridColumn Property="Sex" Title="性别" Sortable="false" Filterable="false" Width="2rem" />
 | 
				
			||||||
 | 
					                <RadzenDataGridColumn Property="OrderNo" Title="单号" Sortable="false" Filterable="false" Width="8rem" />
 | 
				
			||||||
 | 
					                <RadzenDataGridColumn Property="Detail.Drug.DrugName" Title="药品名称" FormatString="{0:d}" Sortable="false" Filterable="false" Width="8rem" />
 | 
				
			||||||
 | 
					                <RadzenDataGridColumn Property="Detail.SetManuNo" Title="药品批次" Sortable="false" Filterable="false" Width="8rem" />
 | 
				
			||||||
 | 
					                <RadzenDataGridColumn Property="Detail.Quantity" Title="数量" Sortable="false" Filterable="false" Width="2rem" />
 | 
				
			||||||
 | 
					            </Columns>
 | 
				
			||||||
 | 
					        </RadzenDataGrid>
 | 
				
			||||||
 | 
					    </div>
 | 
				
			||||||
 | 
					</RadzenStack>
 | 
				
			||||||
 | 
					@code {
 | 
				
			||||||
 | 
					    @inject IOrderInfoDao orderInfoDao;
 | 
				
			||||||
 | 
					    @inject DialogService dialogService;
 | 
				
			||||||
 | 
					    @inject Microsoft.Extensions.Options.IOptions<Pojo.Config.SettingConfig> setting;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    bool allowRowSelectOnRowClick = true;
 | 
				
			||||||
 | 
					    IEnumerable<OrderInfo> orderInfos;
 | 
				
			||||||
 | 
					    IList<OrderInfo> selectedOrderInfos;
 | 
				
			||||||
 | 
					    RadzenDataGrid<OrderInfo> grid;
 | 
				
			||||||
 | 
					    bool isLoading;
 | 
				
			||||||
 | 
					    int count;
 | 
				
			||||||
 | 
					    int[] DrawerNos = new int[] { 1, 2, 3, 4, 5, 6, 7, 8 };
 | 
				
			||||||
 | 
					    int status = 0;
 | 
				
			||||||
 | 
					    int drawerNo = 1;
 | 
				
			||||||
 | 
					    string OrderNo;
 | 
				
			||||||
 | 
					    DateTime OrderDate;
 | 
				
			||||||
 | 
					    void SelectDrawer(int drawerNo)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        this.drawerNo = drawerNo;
 | 
				
			||||||
 | 
					        grid.Reload();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    void OnCurrentDateChanged(DateTime args)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        OrderDate = new DateTime(args.Year, args.Month, args.Day);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    //重置
 | 
				
			||||||
 | 
					    async Task reloadGrid()
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        OrderNo = "";
 | 
				
			||||||
 | 
					        OrderDate = DateTime.MinValue;
 | 
				
			||||||
 | 
					        await grid.Reload();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    //确认
 | 
				
			||||||
 | 
					    async Task Confirm()
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        orderInfoDao.CheckOrderInfo(selectedOrderInfos, drawerNo);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    async Task LoadData(LoadDataArgs args)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        isLoading = true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        var result = await orderInfoDao.GetAllOrderInfoByBox(drawerNo, OrderNo, OrderDate, args.Top, args.Skip);
 | 
				
			||||||
 | 
					        // Update the Data property
 | 
				
			||||||
 | 
					        orderInfos = result.Desserts;
 | 
				
			||||||
 | 
					        // Update the count
 | 
				
			||||||
 | 
					        count = result.TotalDesserts;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        isLoading = false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        DrawerNos = await orderInfoDao.GetDrawerNum(setting.Value.boxMachineId);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    // protected override async Task OnInitializedAsync()
 | 
				
			||||||
 | 
					    // {
 | 
				
			||||||
 | 
					    //     await base.OnInitializedAsync();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    //     // orderInfos = dbContext.Employees;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    //     var result = await orderInfoDao.GetAllOrderInfo(OrderNo, OrderDate, args.Top, args.Skip);
 | 
				
			||||||
 | 
					    //     // Update the Data property
 | 
				
			||||||
 | 
					    //     orderInfos = result.Desserts;
 | 
				
			||||||
 | 
					    //     // Update the count
 | 
				
			||||||
 | 
					    //     count = result.TotalDesserts;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    //     isLoading = false;
 | 
				
			||||||
 | 
					    // }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -289,7 +289,7 @@
 | 
				
			||||||
    void CancelEdit(DrugManuNo drugManuNo)
 | 
					    void CancelEdit(DrugManuNo drugManuNo)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        Reset(drugManuNo);
 | 
					        Reset(drugManuNo);
 | 
				
			||||||
 | 
					        SelectedDrugs.FirstOrDefault().Manus.Remove(drugManuNo);
 | 
				
			||||||
        ManusGrid.CancelEditRow(drugManuNo);
 | 
					        ManusGrid.CancelEditRow(drugManuNo);
 | 
				
			||||||
        ManusGrid.Reload();
 | 
					        ManusGrid.Reload();
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
| 
						 | 
					@ -308,6 +308,7 @@
 | 
				
			||||||
            );
 | 
					            );
 | 
				
			||||||
            if(b)
 | 
					            if(b)
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
 | 
					                SelectedDrugs.FirstOrDefault().Manus.Remove(drugManuNo);
 | 
				
			||||||
                // 数据库删除
 | 
					                // 数据库删除
 | 
				
			||||||
                drugManuNoDao.DeleteDrugManuNo(drugManuNo.Id);
 | 
					                drugManuNoDao.DeleteDrugManuNo(drugManuNo.Id);
 | 
				
			||||||
                await ManusGrid.Reload();
 | 
					                await ManusGrid.Reload();
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,119 @@
 | 
				
			||||||
 | 
					@page "/manage/setting/Fridge"
 | 
				
			||||||
 | 
					@using MasaBlazorApp3.Util
 | 
				
			||||||
 | 
					@using Newtonsoft.Json.Linq
 | 
				
			||||||
 | 
					@using log4net
 | 
				
			||||||
 | 
					@layout SettingLayout
 | 
				
			||||||
 | 
					<div class="main">
 | 
				
			||||||
 | 
					    <div class="top-row px-4">
 | 
				
			||||||
 | 
					        <RadzenButton Icon="account_circle" Style="margin-left: auto;" Click="@SaveMethod">
 | 
				
			||||||
 | 
					            <ChildContent>
 | 
				
			||||||
 | 
					                保存设置
 | 
				
			||||||
 | 
					            </ChildContent>
 | 
				
			||||||
 | 
					        </RadzenButton>
 | 
				
			||||||
 | 
					    </div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <div class="content px-4">
 | 
				
			||||||
 | 
					        <RadzenCard class="rz-my-6">
 | 
				
			||||||
 | 
					            <RadzenStack Orientation="Orientation.Horizontal" AlignItems="AlignItems.Start" Wrap="FlexWrap.Wrap">
 | 
				
			||||||
 | 
					                <RadzenStack Orientation="Orientation.Vertical" Gap="4px">
 | 
				
			||||||
 | 
					                    冰箱温度区间
 | 
				
			||||||
 | 
					                    <RadzenTextBox Placeholder="2-8" Value="@temperatureRange" Change="@(args=>temperatureRange=args)"></RadzenTextBox>
 | 
				
			||||||
 | 
					                </RadzenStack>
 | 
				
			||||||
 | 
					                <RadzenStack Orientation="Orientation.Vertical" Gap="4px">
 | 
				
			||||||
 | 
					                    冰箱状态
 | 
				
			||||||
 | 
					                    <RadzenRadioButtonList Value=@fridgeStateValue TValue="int" Change=@(args => fridgeStateValue = args)>
 | 
				
			||||||
 | 
					                        <Items>
 | 
				
			||||||
 | 
					                            <RadzenRadioButtonListItem Text="开" Value="0" />
 | 
				
			||||||
 | 
					                            <RadzenRadioButtonListItem Text="关" Value="1" />
 | 
				
			||||||
 | 
					                        </Items>
 | 
				
			||||||
 | 
					                    </RadzenRadioButtonList>
 | 
				
			||||||
 | 
					                </RadzenStack>
 | 
				
			||||||
 | 
					                <RadzenStack Orientation="Orientation.Vertical" Gap="4px">
 | 
				
			||||||
 | 
					                    报警状态
 | 
				
			||||||
 | 
					                    <RadzenRadioButtonList Value="@alertStateValue" TValue="int" Change="@(args=>alertStateValue=args)">
 | 
				
			||||||
 | 
					                        <Items>
 | 
				
			||||||
 | 
					                            <RadzenRadioButtonListItem Text="开" Value="0"/>
 | 
				
			||||||
 | 
					                            <RadzenRadioButtonListItem Text="关" Value="1"/>
 | 
				
			||||||
 | 
					                        </Items>
 | 
				
			||||||
 | 
					                    </RadzenRadioButtonList>
 | 
				
			||||||
 | 
					                </RadzenStack>
 | 
				
			||||||
 | 
					            </RadzenStack>
 | 
				
			||||||
 | 
					        </RadzenCard>
 | 
				
			||||||
 | 
					    </div>
 | 
				
			||||||
 | 
					</div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@inject Microsoft.Extensions.Options.IOptions<Pojo.Config.fridgeConfig> setting;
 | 
				
			||||||
 | 
					@inject PortUtil port;
 | 
				
			||||||
 | 
					@inject NotificationService _message
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@code {
 | 
				
			||||||
 | 
					    private readonly ILog logger = LogManager.GetLogger(typeof(LoginDialog));
 | 
				
			||||||
 | 
					    int fridgeStateValue = 1;
 | 
				
			||||||
 | 
					    int alertStateValue = 1;
 | 
				
			||||||
 | 
					    string temperatureRange = "2-8";
 | 
				
			||||||
 | 
					    protected override void OnInitialized()
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        fridgeStateValue = setting.Value.fridgeState;
 | 
				
			||||||
 | 
					        alertStateValue = setting.Value.alertState;
 | 
				
			||||||
 | 
					        temperatureRange = setting.Value.temperatureRange;
 | 
				
			||||||
 | 
					        base.OnInitialized();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    //保存
 | 
				
			||||||
 | 
					    async Task SaveMethod()
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        // 获取当前工作目录
 | 
				
			||||||
 | 
					        string currentDirectory = Directory.GetCurrentDirectory();
 | 
				
			||||||
 | 
					        // setting.Value.fridgeState = fridgeStateValue;
 | 
				
			||||||
 | 
					        // setting.Value.alertState = alertStateValue;
 | 
				
			||||||
 | 
					        // setting.Value.temperatureRange = temperatureRange;
 | 
				
			||||||
 | 
					        string filePath =Path.Combine(currentDirectory, "appsettings.json");
 | 
				
			||||||
 | 
					        string jsonString= File.ReadAllText(filePath);
 | 
				
			||||||
 | 
					        var jsonNode = JObject.Parse(jsonString);
 | 
				
			||||||
 | 
					        jsonNode["fridge"]["temperatureRange"] = temperatureRange;
 | 
				
			||||||
 | 
					        jsonNode["fridge"]["fridgeState"]= fridgeStateValue;
 | 
				
			||||||
 | 
					        jsonNode["fridge"]["alertState"] = alertStateValue;
 | 
				
			||||||
 | 
					        var options = new JsonSerializerOptions { WriteIndented = true };
 | 
				
			||||||
 | 
					        File.WriteAllText(filePath, jsonNode.ToString(Newtonsoft.Json.Formatting.Indented));
 | 
				
			||||||
 | 
					        if (fridgeStateValue==0)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            await port.FridegOpen(1);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        else
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            await port.FridgeOff(1);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        if (alertStateValue==0)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            await port.FridgeAlarmOn(1);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        else
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            await port.FridgeAlarmOff(1);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        string[] newRange = temperatureRange.Split('-');
 | 
				
			||||||
 | 
					        if(newRange.Length>=2)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            string[] range= setting.Value.temperatureRange.Split('-');
 | 
				
			||||||
 | 
					            bool bMix = float.TryParse(newRange[0], out float Min);
 | 
				
			||||||
 | 
					            bool bMax = float.TryParse(newRange[1], out float Max);
 | 
				
			||||||
 | 
					            if (bMix && bMax)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                if (range == null || range[0] == null||(range != null && range[0] != null && range[0] != newRange[0]))
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    //设定冰箱温度最小值
 | 
				
			||||||
 | 
					                    await port.FridgeMinSetting(Min, 1);
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                if (range == null || range[0] == null || (range != null && range[1] != null && range[1] != newRange[1]))
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    //设定冰箱温度最大值
 | 
				
			||||||
 | 
					                    await port.FridgeMaxSetting(Max, 1);
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        _message.Notify(
 | 
				
			||||||
 | 
					             new NotificationMessage { Severity = NotificationSeverity.Success, Summary = "提示", Detail = $"保存成功", Duration = 4000 }
 | 
				
			||||||
 | 
					         );
 | 
				
			||||||
 | 
					        logger.Info($"修改冰箱设置");
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -120,7 +120,7 @@
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                </RadzenStack>
 | 
					                </RadzenStack>
 | 
				
			||||||
                <RadzenStack class="home-menu rz-background-color-success-lighter rz-text-white rz-ripple" JustifyContent="JustifyContent.Center" @onclick="@(() => jump2Page(5))" Style="height: 100%;width:50%">
 | 
					                <RadzenStack class="home-menu rz-background-color-success-lighter rz-text-white rz-ripple" JustifyContent="JustifyContent.Center" @onclick="@(() => jump2Page(5))" Style="height: 100%;width:50%">
 | 
				
			||||||
                    <RadzenText class="rz-color-white" TextStyle="TextStyle.H2" TextAlign="TextAlign.Center">系统设置</RadzenText>
 | 
					                    <RadzenText class="rz-color-white" TextStyle="TextStyle.H2" TextAlign="TextAlign.Center">系统管理</RadzenText>
 | 
				
			||||||
                    @if (globalStateService.Operator != null)
 | 
					                    @if (globalStateService.Operator != null)
 | 
				
			||||||
                    {
 | 
					                    {
 | 
				
			||||||
                        @if (!globalStateService.Operator.role.permissionIds.Any(id => id - 50 > 0 && id - 50 < 10))
 | 
					                        @if (!globalStateService.Operator.role.permissionIds.Any(id => id - 50 > 0 && id - 50 < 10))
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -20,6 +20,7 @@
 | 
				
			||||||
    @inject PortUtil PortUtil;
 | 
					    @inject PortUtil PortUtil;
 | 
				
			||||||
    @inject FingerprintUtil FingerprintUtil;
 | 
					    @inject FingerprintUtil FingerprintUtil;
 | 
				
			||||||
    @inject GlobalStateService globalStateService;
 | 
					    @inject GlobalStateService globalStateService;
 | 
				
			||||||
 | 
					    @inject IOptions<PortConfig> portSetting;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    string msg;
 | 
					    string msg;
 | 
				
			||||||
| 
						 | 
					@ -106,6 +107,22 @@
 | 
				
			||||||
                errMsg += "【条码扫描模块连接失败】";
 | 
					                errMsg += "【条码扫描模块连接失败】";
 | 
				
			||||||
                InvokeAsync(StateHasChanged);
 | 
					                InvokeAsync(StateHasChanged);
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					            if (portSetting.Value.fridgePortExist)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                try
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    PortUtil.fridgeSerial.Open();
 | 
				
			||||||
 | 
					                    logger.Info($"冰箱串口打开结果【{PortUtil.fridgeSerial.IsOpen}】");
 | 
				
			||||||
 | 
					                    msg = "冰箱串口连接成功";
 | 
				
			||||||
 | 
					                    InvokeAsync(StateHasChanged);
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                catch (Exception)
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    msg = "冰箱串口打开失败";
 | 
				
			||||||
 | 
					                    errMsg += "【冰箱串口打开失败】";
 | 
				
			||||||
 | 
					                    InvokeAsync(StateHasChanged);
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
            globalStateService.isInit = true;
 | 
					            globalStateService.isInit = true;
 | 
				
			||||||
            dialogService.Close();
 | 
					            dialogService.Close();
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,74 @@
 | 
				
			||||||
 | 
					@page "/manage/setting/login"
 | 
				
			||||||
 | 
					@page "/manage/setting"
 | 
				
			||||||
 | 
					@using Newtonsoft.Json.Linq
 | 
				
			||||||
 | 
					@using log4net
 | 
				
			||||||
 | 
					@layout SettingLayout
 | 
				
			||||||
 | 
					<div class="main">
 | 
				
			||||||
 | 
					    <div class="top-row px-4">
 | 
				
			||||||
 | 
					        <RadzenButton Icon="account_circle" Style="margin-left: auto;" Click="@SaveMethod">
 | 
				
			||||||
 | 
					            <ChildContent>
 | 
				
			||||||
 | 
					                保存设置
 | 
				
			||||||
 | 
					            </ChildContent>
 | 
				
			||||||
 | 
					        </RadzenButton>
 | 
				
			||||||
 | 
					    </div>
 | 
				
			||||||
 | 
					    <div class="content px-4">
 | 
				
			||||||
 | 
					        <RadzenCard class="rz-my-6">
 | 
				
			||||||
 | 
					            <RadzenStack Orientation="Orientation.Horizontal" AlignItems="AlignItems.Start" Wrap="FlexWrap.Wrap">
 | 
				
			||||||
 | 
					                <RadzenStack Orientation="Orientation.Vertical" Gap="4px">
 | 
				
			||||||
 | 
					                    登录模式
 | 
				
			||||||
 | 
					                    <RadzenRadioButtonList Value=@loginValue TValue="int" Change=@(args => loginValue = args)>
 | 
				
			||||||
 | 
					                        <Items>
 | 
				
			||||||
 | 
					                            <RadzenRadioButtonListItem Text="单人登录" Value="1" />
 | 
				
			||||||
 | 
					                            <RadzenRadioButtonListItem Text="双人登录" Value="2" />
 | 
				
			||||||
 | 
					                        </Items>
 | 
				
			||||||
 | 
					                    </RadzenRadioButtonList>
 | 
				
			||||||
 | 
					                </RadzenStack>
 | 
				
			||||||
 | 
					                @*  <RadzenStack Orientation="Orientation.Vertical" Gap="4px">
 | 
				
			||||||
 | 
					                    优先登录
 | 
				
			||||||
 | 
					                    <RadzenRadioButtonList Value=@preValue TValue="int" Change=@(args => preValue = args)>
 | 
				
			||||||
 | 
					                        <Items>
 | 
				
			||||||
 | 
					                            <RadzenRadioButtonListItem Text="操作人" Value="1" />
 | 
				
			||||||
 | 
					                            <RadzenRadioButtonListItem Text="审核人" Value="2" />
 | 
				
			||||||
 | 
					                        </Items>
 | 
				
			||||||
 | 
					                    </RadzenRadioButtonList>
 | 
				
			||||||
 | 
					                </RadzenStack> *@
 | 
				
			||||||
 | 
					            </RadzenStack>
 | 
				
			||||||
 | 
					        </RadzenCard>
 | 
				
			||||||
 | 
					    </div>
 | 
				
			||||||
 | 
					</div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@inject Microsoft.Extensions.Options.IOptions<Pojo.Config.setting> setting;
 | 
				
			||||||
 | 
					@inject Microsoft.Extensions.Options.IOptions<Pojo.Config.SettingConfig> setting;
 | 
				
			||||||
 | 
					@inject NotificationService _message
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@code {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private readonly ILog logger = LogManager.GetLogger(typeof(LoginDialog));
 | 
				
			||||||
 | 
					    int loginValue = 1;
 | 
				
			||||||
 | 
					    // int preValue = 1;
 | 
				
			||||||
 | 
					    protected override void OnInitialized()
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        loginValue = setting.Value.loginMode;
 | 
				
			||||||
 | 
					        base.OnInitialized();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    //保存
 | 
				
			||||||
 | 
					    async Task SaveMethod()
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        // 获取当前工作目录
 | 
				
			||||||
 | 
					        string currentDirectory = Directory.GetCurrentDirectory();
 | 
				
			||||||
 | 
					        // setting.Value.fridgeState = fridgeStateValue;
 | 
				
			||||||
 | 
					        // setting.Value.alertState = alertStateValue;
 | 
				
			||||||
 | 
					        // setting.Value.temperatureRange = temperatureRange;
 | 
				
			||||||
 | 
					        string filePath = Path.Combine(currentDirectory, "appsettings.json");
 | 
				
			||||||
 | 
					        string jsonString = File.ReadAllText(filePath);
 | 
				
			||||||
 | 
					        var jsonNode = JObject.Parse(jsonString);
 | 
				
			||||||
 | 
					        jsonNode["setting"]["loginMode"] = loginValue;
 | 
				
			||||||
 | 
					        var options = new JsonSerializerOptions { WriteIndented = true };
 | 
				
			||||||
 | 
					        File.WriteAllText(filePath, jsonNode.ToString(Newtonsoft.Json.Formatting.Indented));
 | 
				
			||||||
 | 
					        _message.Notify(
 | 
				
			||||||
 | 
					              new NotificationMessage { Severity = NotificationSeverity.Success, Summary = "提示", Detail = $"保存成功", Duration = 4000 }
 | 
				
			||||||
 | 
					          );
 | 
				
			||||||
 | 
					        logger.Info($"修改用户登录设置");
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,431 @@
 | 
				
			||||||
 | 
					@page "/Box/Plan"
 | 
				
			||||||
 | 
					<style>
 | 
				
			||||||
 | 
					    .rz-custom-header {
 | 
				
			||||||
 | 
					        width: 100%;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					</style>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<div class="container-fluid">
 | 
				
			||||||
 | 
					    <div class="row">
 | 
				
			||||||
 | 
					        <div class="col-12  mb-4">
 | 
				
			||||||
 | 
					            <RadzenFieldset>
 | 
				
			||||||
 | 
					                <RadzenStack Orientation="Orientation.Horizontal" Gap="1rem">
 | 
				
			||||||
 | 
					                    <RadzenRow AlignItems="AlignItems.Center">
 | 
				
			||||||
 | 
					                        <RadzenColumn Size="12" Style="margin-top:12px">
 | 
				
			||||||
 | 
					                            <RadzenButton Size="ButtonSize.Large" Click="reloadGrid" IsBusy="isLoading" Icon="refresh" Text="刷新" ButtonStyle="ButtonStyle.Warning" />
 | 
				
			||||||
 | 
					                            <RadzenButton Size="ButtonSize.Large" ButtonStyle="ButtonStyle.Success" Icon="add_circle_outline" Click="@InsertPlanRow" Text="新增套餐" />
 | 
				
			||||||
 | 
					                        </RadzenColumn>
 | 
				
			||||||
 | 
					                    </RadzenRow>
 | 
				
			||||||
 | 
					                </RadzenStack>
 | 
				
			||||||
 | 
					            </RadzenFieldset>
 | 
				
			||||||
 | 
					        </div>
 | 
				
			||||||
 | 
					        <div class="col-6  mb-4">
 | 
				
			||||||
 | 
					            <RadzenDataGrid @ref="grid"
 | 
				
			||||||
 | 
					                            LoadData="@LoadData"
 | 
				
			||||||
 | 
					                            @bind-Value="@SelectedPlan"
 | 
				
			||||||
 | 
					                            IsLoading="@isLoading"
 | 
				
			||||||
 | 
					                            Count="@count"
 | 
				
			||||||
 | 
					                            EmptyText="无数据"
 | 
				
			||||||
 | 
					                            Data="@_forecasts"
 | 
				
			||||||
 | 
					                            AllowColumnResize="true" AllowAlternatingRows="false"
 | 
				
			||||||
 | 
					                            SelectionMode="DataGridSelectionMode.Single" RowUpdate="@((Plan di)=>{OnUpdatePlanRow(di);})" RowCreate="@((Plan di)=>{OnCreatePlanRow(di);})"
 | 
				
			||||||
 | 
					                            AllowPaging="true" PageSize="10" PagerHorizontalAlign="HorizontalAlign.Left" ColumnWidth="100px" ShowPagingSummary="true" PagingSummaryFormat="{0}/{1} 共{2}条数据">
 | 
				
			||||||
 | 
					                <Columns>
 | 
				
			||||||
 | 
					                    <RadzenDataGridColumn Frozen="true" Title="套餐名称" Property="Name">
 | 
				
			||||||
 | 
					                        <EditTemplate Context="planInfo">
 | 
				
			||||||
 | 
					                            <RadzenTextBox Name="Name" @bind-Value="planInfo.Name" Style="width:100%; display: block;" />
 | 
				
			||||||
 | 
					                            <RadzenRequiredValidator Text="请填写套餐名称" Component="Name" Popup="true" />
 | 
				
			||||||
 | 
					                        </EditTemplate>
 | 
				
			||||||
 | 
					                    </RadzenDataGridColumn>
 | 
				
			||||||
 | 
					                    <RadzenDataGridColumn Width="200px" Title="套餐描述" Property="Description">
 | 
				
			||||||
 | 
					                        <EditTemplate Context="planInfo">
 | 
				
			||||||
 | 
					                            <RadzenTextBox Name="Description" @bind-Value="planInfo.Description" Style="width:100%;display:block;" />
 | 
				
			||||||
 | 
					                            <RadzenRequiredValidator Text="请填写套餐描述" Component="Description" Popup="true" />
 | 
				
			||||||
 | 
					                        </EditTemplate>
 | 
				
			||||||
 | 
					                    </RadzenDataGridColumn>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    <RadzenDataGridColumn Context="planInfo" Title="操作" Filterable="false" Sortable="false" TextAlign="TextAlign.Left" Frozen="true" FrozenPosition="FrozenColumnPosition.Right" Width="8rem">
 | 
				
			||||||
 | 
					                        <Template Context="planInfo">
 | 
				
			||||||
 | 
					                            <RadzenButton Icon="edit" ButtonStyle="ButtonStyle.Light" Variant="Variant.Flat" Size="ButtonSize.Medium" Click="@(args => EditPlanRow(planInfo))" @onclick:stopPropagation="true">
 | 
				
			||||||
 | 
					                            </RadzenButton>
 | 
				
			||||||
 | 
					                            <RadzenButton ButtonStyle="ButtonStyle.Danger" Icon="delete" Variant="Variant.Flat" Shade="Shade.Lighter" Size="ButtonSize.Medium" class="my-1 ms-1" Click="@(args => DeletePlanRow(planInfo))" @onclick:stopPropagation="true">
 | 
				
			||||||
 | 
					                            </RadzenButton>
 | 
				
			||||||
 | 
					                        </Template>
 | 
				
			||||||
 | 
					                        <EditTemplate Context="planInfo">
 | 
				
			||||||
 | 
					                            <RadzenButton Icon="check" ButtonStyle="ButtonStyle.Success" Variant="Variant.Flat" Size="ButtonSize.Medium" Click="@((args) => SavePlanRow(planInfo))" aria-label="Save">
 | 
				
			||||||
 | 
					                            </RadzenButton>
 | 
				
			||||||
 | 
					                            <RadzenButton Icon="close" ButtonStyle="ButtonStyle.Light" Variant="Variant.Flat" Size="ButtonSize.Medium" class="my-1 ms-1" Click="@((args) => CancelPlanEdit(planInfo))" aria-label="Cancel">
 | 
				
			||||||
 | 
					                            </RadzenButton>
 | 
				
			||||||
 | 
					                            <RadzenButton ButtonStyle="ButtonStyle.Danger" Icon="delete" Variant="Variant.Flat" Shade="Shade.Lighter" Size="ButtonSize.Medium" class="my-1 ms-1" Click="@(args => DeletePlanRow(planInfo))" aria-label="Delete">
 | 
				
			||||||
 | 
					                            </RadzenButton>
 | 
				
			||||||
 | 
					                        </EditTemplate>
 | 
				
			||||||
 | 
					                    </RadzenDataGridColumn>
 | 
				
			||||||
 | 
					                </Columns>
 | 
				
			||||||
 | 
					            </RadzenDataGrid>
 | 
				
			||||||
 | 
					        </div>
 | 
				
			||||||
 | 
					        <div class="col-6  mb-4">
 | 
				
			||||||
 | 
					            <RadzenDataGrid @ref="PlanDetailsGrid" EmptyText="无数据"
 | 
				
			||||||
 | 
					                            Data="@(SelectedPlan?.FirstOrDefault()?._PlanDetails)"
 | 
				
			||||||
 | 
					                            RowUpdate="@((PlanDetails pd) => { OnUpdateRow(pd); })"
 | 
				
			||||||
 | 
					                            RowCreate="@((PlanDetails pd) => { OnCreateRow(pd); })"
 | 
				
			||||||
 | 
					                            KeyProperty="Id"
 | 
				
			||||||
 | 
					                            AllowColumnResize="true" AllowAlternatingRows="false">
 | 
				
			||||||
 | 
					                @* <HeaderTemplate>
 | 
				
			||||||
 | 
					                        <RadzenRow JustifyContent="JustifyContent.End" AlignItems="AlignItems.Center">
 | 
				
			||||||
 | 
					                            <RadzenButton Icon="download" Text="添加" Variant="Variant.Outlined" />
 | 
				
			||||||
 | 
					                        </RadzenRow>
 | 
				
			||||||
 | 
					                    </HeaderTemplate> *@
 | 
				
			||||||
 | 
					                <Columns>
 | 
				
			||||||
 | 
					                    <RadzenDataGridColumn Title="序号" Property="index" Width="5rem">
 | 
				
			||||||
 | 
					                        <Template Context="data">
 | 
				
			||||||
 | 
					                            @(SelectedPlan.FirstOrDefault()?._PlanDetails.IndexOf(data) + 1)
 | 
				
			||||||
 | 
					                        </Template>
 | 
				
			||||||
 | 
					                    </RadzenDataGridColumn>
 | 
				
			||||||
 | 
					                    <RadzenDataGridColumn Title="药品" Property="_DrugInfo.DrugName" Width="25rem">
 | 
				
			||||||
 | 
					                        <Template Context="data">
 | 
				
			||||||
 | 
					                            <RadzenText TextStyle="TextStyle.Body1"><b>@(data._DrugInfo?.DrugName)</b></RadzenText>
 | 
				
			||||||
 | 
					                            <RadzenText TextStyle="TextStyle.Body1"><b>@(data._DrugInfo?.DrugSpec)</b></RadzenText>
 | 
				
			||||||
 | 
					                        </Template>
 | 
				
			||||||
 | 
					                        <EditTemplate Context="planDetails">
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                            <RadzenDropDownDataGrid AllowVirtualization="true" Name="drugName" TValue="DrugInfo" @bind-Value="planDetails._DrugInfo" Data="@drugInfos"
 | 
				
			||||||
 | 
					                                                    Style="width:100%; display: block;" AllowFilteringByAllStringColumns="true" TextProperty="DrugName">
 | 
				
			||||||
 | 
					                                <Columns>
 | 
				
			||||||
 | 
					                                    <RadzenDropDownDataGridColumn Property="DrugId" Title="药品编码" />
 | 
				
			||||||
 | 
					                                    <RadzenDropDownDataGridColumn Property="DrugName" Width="120px" Title="名称" />
 | 
				
			||||||
 | 
					                                    <RadzenDropDownDataGridColumn Property="DrugSpec" Title="规格" />
 | 
				
			||||||
 | 
					                                </Columns>
 | 
				
			||||||
 | 
					                            </RadzenDropDownDataGrid>
 | 
				
			||||||
 | 
					                            <RadzenCustomValidator Component="drugName" Validator="@(()=>(planDetails._DrugInfo.DrugId!=null))" Text="请选择药品" Popup=true />
 | 
				
			||||||
 | 
					                            <RadzenCustomValidator Component="drugName" Validator="@(()=>ValidatroDrug(planDetails))" Text="套餐中已包含该药品" Popup=true />
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                        </EditTemplate>
 | 
				
			||||||
 | 
					                    </RadzenDataGridColumn>
 | 
				
			||||||
 | 
					                    <RadzenDataGridColumn Title="基数" Property="BaseQuantity" Width="5rem">
 | 
				
			||||||
 | 
					                        <EditTemplate Context="planDetails">
 | 
				
			||||||
 | 
					                            <RadzenNumeric Name="BaseQuantity" @bind-Value="planDetails.BaseQuantity" Style="width:100%; display: block;" />
 | 
				
			||||||
 | 
					                            <RadzenNumericRangeValidator Style="position: absolute;z-index: 9999;" Min="0" Text="请填写正确的添加数量" Component="BaseQuantity" Popup="true" />
 | 
				
			||||||
 | 
					                        </EditTemplate>
 | 
				
			||||||
 | 
					                    </RadzenDataGridColumn>
 | 
				
			||||||
 | 
					                    <RadzenDataGridColumn Title="操作" Filterable="false" Sortable="false" TextAlign="TextAlign.Left" Frozen="true" FrozenPosition="FrozenColumnPosition.Right" Width="8rem">
 | 
				
			||||||
 | 
					                        <Template Context="planDetails">
 | 
				
			||||||
 | 
					                            <RadzenButton Icon="edit" ButtonStyle="ButtonStyle.Light" Variant="Variant.Flat" Size="ButtonSize.Medium" Click="@(args => EditRow(planDetails))" @onclick:stopPropagation="true">
 | 
				
			||||||
 | 
					                            </RadzenButton>
 | 
				
			||||||
 | 
					                            <RadzenButton ButtonStyle="ButtonStyle.Danger" Icon="delete" Variant="Variant.Flat" Shade="Shade.Lighter" Size="ButtonSize.Medium" class="my-1 ms-1" Click="@(args => DeleteRow(planDetails))" @onclick:stopPropagation="true">
 | 
				
			||||||
 | 
					                            </RadzenButton>
 | 
				
			||||||
 | 
					                        </Template>
 | 
				
			||||||
 | 
					                        <EditTemplate Context="planDetails">
 | 
				
			||||||
 | 
					                            <RadzenButton Icon="check" ButtonStyle="ButtonStyle.Success" Variant="Variant.Flat" Size="ButtonSize.Medium" Click="@((args) => InsertRow(planDetails))" aria-label="Save">
 | 
				
			||||||
 | 
					                            </RadzenButton>
 | 
				
			||||||
 | 
					                            <RadzenButton Icon="close" ButtonStyle="ButtonStyle.Light" Variant="Variant.Flat" Size="ButtonSize.Medium" class="my-1 ms-1" Click="@((args) => CancelEdit(planDetails))" aria-label="Cancel">
 | 
				
			||||||
 | 
					                            </RadzenButton>
 | 
				
			||||||
 | 
					                            <RadzenButton ButtonStyle="ButtonStyle.Danger" Icon="delete" Variant="Variant.Flat" Shade="Shade.Lighter" Size="ButtonSize.Medium" class="my-1 ms-1" Click="@(args => DeleteRow(planDetails))" aria-label="Delete">
 | 
				
			||||||
 | 
					                            </RadzenButton>
 | 
				
			||||||
 | 
					                        </EditTemplate>
 | 
				
			||||||
 | 
					                    </RadzenDataGridColumn>
 | 
				
			||||||
 | 
					                </Columns>
 | 
				
			||||||
 | 
					            </RadzenDataGrid>
 | 
				
			||||||
 | 
					            <div style="margin-top:5px">
 | 
				
			||||||
 | 
					                <RadzenButton Size="ButtonSize.Medium" ButtonStyle="ButtonStyle.Success" Icon="add_circle_outline" Click="@InsertRow" Text="新增药品" />
 | 
				
			||||||
 | 
					            </div>
 | 
				
			||||||
 | 
					        </div>
 | 
				
			||||||
 | 
					    </div>
 | 
				
			||||||
 | 
					</div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@code {
 | 
				
			||||||
 | 
					    @inject IPlanDao planDao;
 | 
				
			||||||
 | 
					    @inject DialogService dialogService;
 | 
				
			||||||
 | 
					    @inject NotificationService _message
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    RadzenDataGrid<Plan> grid;
 | 
				
			||||||
 | 
					    RadzenDataGrid<PlanDetails> PlanDetailsGrid;
 | 
				
			||||||
 | 
					    bool isLoading;
 | 
				
			||||||
 | 
					    int count;
 | 
				
			||||||
 | 
					    private IEnumerable<Plan>? _forecasts;
 | 
				
			||||||
 | 
					    IList<Plan>? SelectedPlan { get; set; } = new List<Plan>();
 | 
				
			||||||
 | 
					    List<PlanDetails> SelectedPlanDetails = new List<PlanDetails>();
 | 
				
			||||||
 | 
					    List<DrugInfo> drugInfos;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    async Task LoadData(LoadDataArgs args)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        isLoading = true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        var result = await planDao.GetAllPlanInfo();
 | 
				
			||||||
 | 
					        // Update the Data property
 | 
				
			||||||
 | 
					        _forecasts = result.Desserts;
 | 
				
			||||||
 | 
					        count = result.TotalDesserts;
 | 
				
			||||||
 | 
					        SelectedPlan = new List<Plan>() { _forecasts.FirstOrDefault() };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        isLoading = false;
 | 
				
			||||||
 | 
					        drugInfos = result.Other;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    // async Task LoadDetailDate(LoadDataArgs args)
 | 
				
			||||||
 | 
					    // {
 | 
				
			||||||
 | 
					    //     // SelectedPlan = new List<Plan>() { await planDao.GetPlanById(SelectedPlan.FirstOrDefault().Id) };
 | 
				
			||||||
 | 
					    // }
 | 
				
			||||||
 | 
					    async Task reloadGrid()
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        await grid.Reload();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    void OnUpdatePlanRow(Plan dl)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        // Reset(dl);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // 数据库更新
 | 
				
			||||||
 | 
					        planDao.UpdatePlanInfo(dl);
 | 
				
			||||||
 | 
					        grid.Reload();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    void OnCreatePlanRow(Plan dl)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        // 数据库添加套餐
 | 
				
			||||||
 | 
					        planDao.InsertPlanInfo(dl);
 | 
				
			||||||
 | 
					        SelectedPlan.Remove(dl);
 | 
				
			||||||
 | 
					        grid.Reload();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    //新增套餐
 | 
				
			||||||
 | 
					    async Task InsertPlanRow()
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        var planInfo = new Plan();
 | 
				
			||||||
 | 
					        if (_forecasts.Count() <= 0)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            _forecasts = new List<Plan>
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                new Plan()
 | 
				
			||||||
 | 
					            };
 | 
				
			||||||
 | 
					            await grid.InsertRow(_forecasts.FirstOrDefault());
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        else
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            await grid.InsertRow(planInfo);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    //修改套餐
 | 
				
			||||||
 | 
					    async Task EditPlanRow(Plan planInfo)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        await grid.EditRow(planInfo);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    //删除套餐
 | 
				
			||||||
 | 
					    async Task DeletePlanRow(Plan planInfo)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        if (planInfo.Id > 0)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            //弹出确认提示框
 | 
				
			||||||
 | 
					            var b = await dialogService.OpenAsync<ConfirmDialog>(
 | 
				
			||||||
 | 
					               $"删除确认",
 | 
				
			||||||
 | 
					             new Dictionary<string, object>() { { "confirmInfo", "确认要删除套餐:" + planInfo.Name + "吗?" } },
 | 
				
			||||||
 | 
					             new DialogOptions() { Width = "45vw", Resizable = true, Draggable = true, ShowClose = false });
 | 
				
			||||||
 | 
					            if (b)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                // 数据库删除
 | 
				
			||||||
 | 
					                if (await planDao.DeletePlanInfo(planInfo.Id))
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    _message.Notify
 | 
				
			||||||
 | 
					                    (
 | 
				
			||||||
 | 
					                        new NotificationMessage
 | 
				
			||||||
 | 
					                            {
 | 
				
			||||||
 | 
					                                Severity = NotificationSeverity.Success,
 | 
				
			||||||
 | 
					                                Summary = "提示",
 | 
				
			||||||
 | 
					                                Detail = $"删除成功",
 | 
				
			||||||
 | 
					                                Duration = 4000
 | 
				
			||||||
 | 
					                            }
 | 
				
			||||||
 | 
					                    );
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                else
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    _message.Notify
 | 
				
			||||||
 | 
					                    (
 | 
				
			||||||
 | 
					                        new NotificationMessage
 | 
				
			||||||
 | 
					                            {
 | 
				
			||||||
 | 
					                                Severity = NotificationSeverity.Error,
 | 
				
			||||||
 | 
					                                Summary = "提示",
 | 
				
			||||||
 | 
					                                Detail = "删除失败",
 | 
				
			||||||
 | 
					                                Duration = 4000
 | 
				
			||||||
 | 
					                            }
 | 
				
			||||||
 | 
					                    );
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            await grid.Reload();
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        else
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            grid.CancelEditRow(planInfo);
 | 
				
			||||||
 | 
					            await grid.Reload();
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    //保存套餐信息
 | 
				
			||||||
 | 
					    async Task SavePlanRow(Plan planInfo)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        await grid.UpdateRow(planInfo);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    async Task CancelPlanEdit(Plan planInfo)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        grid.CancelEditRow(planInfo);
 | 
				
			||||||
 | 
					        await grid.Reload();
 | 
				
			||||||
 | 
					        await PlanDetailsGrid.Reload();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    void Reset(PlanDetails pd)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        SelectedPlanDetails.Remove(pd);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    //修改药品
 | 
				
			||||||
 | 
					    async Task EditRow(PlanDetails planDetail)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        // planDetail.DrugId = null;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        await PlanDetailsGrid.EditRow(planDetail);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    //保存修改药品
 | 
				
			||||||
 | 
					    async Task InsertRow(PlanDetails planDetail)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        await PlanDetailsGrid.UpdateRow(planDetail);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    //取消修改药品
 | 
				
			||||||
 | 
					    async Task CancelEdit(PlanDetails planDetail)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        PlanDetailsGrid.CancelEditRow(planDetail);
 | 
				
			||||||
 | 
					        SelectedPlan.FirstOrDefault()._PlanDetails.RemoveAll(pd => pd.Id == 0);
 | 
				
			||||||
 | 
					        await PlanDetailsGrid.Reload();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    //删除药品
 | 
				
			||||||
 | 
					    async Task DeleteRow(PlanDetails planDetail)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        // Reset(planDetail);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (planDetail.Id > 0)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            //弹出确认提示框
 | 
				
			||||||
 | 
					            var b = await dialogService.OpenAsync<ConfirmDialog>(
 | 
				
			||||||
 | 
					               $"确认删除",
 | 
				
			||||||
 | 
					             new Dictionary<string, object>() { { "confirmInfo", "确认要删除药品:" + planDetail._DrugInfo.DrugName + "吗?" } },
 | 
				
			||||||
 | 
					             new DialogOptions() { Width = "45vw", Resizable = true, Draggable = true, ShowClose = false }
 | 
				
			||||||
 | 
					           );
 | 
				
			||||||
 | 
					            if (b)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                SelectedPlan.FirstOrDefault()._PlanDetails.Remove(planDetail);
 | 
				
			||||||
 | 
					                // 数据库删除
 | 
				
			||||||
 | 
					                if (await planDao.DeletePlanDetail(planDetail))
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    _message.Notify(new NotificationMessage
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            Severity = NotificationSeverity.Success,
 | 
				
			||||||
 | 
					                            Summary = "提示",
 | 
				
			||||||
 | 
					                            Detail = "删除成功",
 | 
				
			||||||
 | 
					                            Duration = 4000
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                    );
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                else
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    _message.Notify(new NotificationMessage
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            Severity = NotificationSeverity.Error,
 | 
				
			||||||
 | 
					                            Summary = "提示",
 | 
				
			||||||
 | 
					                            Detail = "删除失败",
 | 
				
			||||||
 | 
					                            Duration = 4000
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                    );
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                await PlanDetailsGrid.Reload();
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        else
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            PlanDetailsGrid.CancelEditRow(planDetail);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        SelectedPlan.FirstOrDefault()._PlanDetails.RemoveAll(pd => pd.Id == 0);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    async void OnUpdateRow(PlanDetails planDetail)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        // Reset(planDetail);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        SelectedPlanDetails.Add(planDetail);
 | 
				
			||||||
 | 
					        // 数据库更新
 | 
				
			||||||
 | 
					        if (await planDao.UpdatePlanDetail(planDetail))
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            _message.Notify(new NotificationMessage
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    Severity = NotificationSeverity.Success,
 | 
				
			||||||
 | 
					                    Summary = "提示",
 | 
				
			||||||
 | 
					                    Detail = "修改成功",
 | 
				
			||||||
 | 
					                    Duration = 4000
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					               );
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        else
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            _message.Notify(new NotificationMessage
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    Severity = NotificationSeverity.Error,
 | 
				
			||||||
 | 
					                    Summary = "提示",
 | 
				
			||||||
 | 
					                    Detail = "修改失败",
 | 
				
			||||||
 | 
					                    Duration = 4000
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					               );
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        await PlanDetailsGrid.Reload();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    //保存套餐下添加的药品
 | 
				
			||||||
 | 
					    async void OnCreateRow(PlanDetails planDetail)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        if (SelectedPlan.FirstOrDefault() != null)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            planDetail.PlanId = SelectedPlan.FirstOrDefault().Id;
 | 
				
			||||||
 | 
					            planDetail.DrugId = planDetail.DrugId == null ? planDetail._DrugInfo.DrugId : planDetail.DrugId;
 | 
				
			||||||
 | 
					            if (await planDao.AddPlanDetail(planDetail))
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                _message.Notify(new NotificationMessage
 | 
				
			||||||
 | 
					                    {
 | 
				
			||||||
 | 
					                        Severity = NotificationSeverity.Success,
 | 
				
			||||||
 | 
					                        Summary = "提示",
 | 
				
			||||||
 | 
					                        Detail = "保存成功",
 | 
				
			||||||
 | 
					                        Duration = 4000
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            else
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                _message.Notify(new NotificationMessage
 | 
				
			||||||
 | 
					                    {
 | 
				
			||||||
 | 
					                        Severity = NotificationSeverity.Error,
 | 
				
			||||||
 | 
					                        Summary = "提示",
 | 
				
			||||||
 | 
					                        Detail = "保存失败",
 | 
				
			||||||
 | 
					                        Duration = 4000
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                );
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        // await grid.Reload();
 | 
				
			||||||
 | 
					        await PlanDetailsGrid.Reload();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    //新增药品
 | 
				
			||||||
 | 
					    async Task InsertRow()
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        var detail = new Pojo.PlanDetails()
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                PlanId = SelectedPlan.FirstOrDefault().Id
 | 
				
			||||||
 | 
					            };
 | 
				
			||||||
 | 
					        SelectedPlan.FirstOrDefault()._PlanDetails.Add(detail);
 | 
				
			||||||
 | 
					        await PlanDetailsGrid.InsertRow(detail);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    //验证药品是否已存在套餐中
 | 
				
			||||||
 | 
					    bool ValidatroDrug(PlanDetails planDetail)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        if (planDetail.PlanId == 0)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            //新增的
 | 
				
			||||||
 | 
					            planDetail.PlanId = SelectedPlan.FirstOrDefault().Id;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        return planDao.CheckDrugById(planDetail);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -144,9 +144,9 @@
 | 
				
			||||||
                                    <RadzenDropDownDataGrid Change="@((args) => { channel.drugManuNo = null; })" AllowVirtualization="true" Name="@("Drug_" + channel.Id)" TValue="DrugInfo" @bind-Value="channel.Drug" Data="@drugInfos"
 | 
					                                    <RadzenDropDownDataGrid Change="@((args) => { channel.drugManuNo = null; })" AllowVirtualization="true" Name="@("Drug_" + channel.Id)" TValue="DrugInfo" @bind-Value="channel.Drug" Data="@drugInfos"
 | 
				
			||||||
                                    Style="width:100%; display: block;" AllowFilteringByAllStringColumns="true" TextProperty="DrugName">
 | 
					                                    Style="width:100%; display: block;" AllowFilteringByAllStringColumns="true" TextProperty="DrugName">
 | 
				
			||||||
                                        <Columns>
 | 
					                                        <Columns>
 | 
				
			||||||
                                            <RadzenDropDownDataGridColumn Property="DrugId" Title="药品编码" />
 | 
					                                            <RadzenDropDownDataGridColumn Property="DrugId" Title="药品编码" Sortable="false" />
 | 
				
			||||||
                                            <RadzenDropDownDataGridColumn Property="DrugName" Width="120px" Title="名称" />
 | 
					                                            <RadzenDropDownDataGridColumn Property="DrugName" Width="120px" Title="名称" Sortable="false" />
 | 
				
			||||||
                                            <RadzenDropDownDataGridColumn Property="DrugSpec" Title="规格" />
 | 
					                                            <RadzenDropDownDataGridColumn Property="DrugSpec" Title="规格" Sortable="false" />
 | 
				
			||||||
                                        </Columns>
 | 
					                                        </Columns>
 | 
				
			||||||
                                    </RadzenDropDownDataGrid>
 | 
					                                    </RadzenDropDownDataGrid>
 | 
				
			||||||
                                } else
 | 
					                                } else
 | 
				
			||||||
| 
						 | 
					@ -161,8 +161,8 @@
 | 
				
			||||||
                                    {
 | 
					                                    {
 | 
				
			||||||
                                        <RadzenDropDownDataGrid @bind-Value=@channel.drugManuNo Data=@channel.Drug?.Manus Disabled="@(channel.Drug == null)" TValue="DrugManuNo" Name="@("Drugmanu_" + channel.Id)" TextProperty="ManuNo">
 | 
					                                        <RadzenDropDownDataGrid @bind-Value=@channel.drugManuNo Data=@channel.Drug?.Manus Disabled="@(channel.Drug == null)" TValue="DrugManuNo" Name="@("Drugmanu_" + channel.Id)" TextProperty="ManuNo">
 | 
				
			||||||
                                            <Columns>
 | 
					                                            <Columns>
 | 
				
			||||||
                                                <RadzenDropDownDataGridColumn Property="ManuNo" Title="批次" />
 | 
					                                                <RadzenDropDownDataGridColumn Property="ManuNo" Title="批次" Sortable="false" />
 | 
				
			||||||
                                                <RadzenDropDownDataGridColumn Property="EffDate" Title="效期" />
 | 
					                                                <RadzenDropDownDataGridColumn Property="EffDate" Title="效期" Sortable="false" />
 | 
				
			||||||
                                            </Columns>
 | 
					                                            </Columns>
 | 
				
			||||||
                                        </RadzenDropDownDataGrid>
 | 
					                                        </RadzenDropDownDataGrid>
 | 
				
			||||||
                                    }
 | 
					                                    }
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -95,14 +95,15 @@
 | 
				
			||||||
            </RadzenDataGridColumn>
 | 
					            </RadzenDataGridColumn>
 | 
				
			||||||
            <RadzenDataGridColumn MinWidth="120px" Title="盘点数量" Property="CheckQuantity">
 | 
					            <RadzenDataGridColumn MinWidth="120px" Title="盘点数量" Property="CheckQuantity">
 | 
				
			||||||
                <EditTemplate Context="cs">
 | 
					                <EditTemplate Context="cs">
 | 
				
			||||||
                    @if (cs.BoardType == 2)
 | 
					                    @if (cs.BoardType.ToString().Contains("2") || cs.BoardType.ToString().Contains("3"))
 | 
				
			||||||
                    {
 | 
					                    {
 | 
				
			||||||
                        @cs.CheckQuantity
 | 
					                        @cs.CheckQuantity
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                    else
 | 
					                    else
 | 
				
			||||||
                    {
 | 
					                    {
 | 
				
			||||||
                        <RadzenNumeric Min="0" Style="display: block" Name="CheckQuantity" @bind-Value=@cs.CheckQuantity />
 | 
					                        <RadzenNumeric Style="display: block" Name="CheckQuantity" @bind-Value=@cs.CheckQuantity>
 | 
				
			||||||
                        <RadzenNumericRangeValidator Style="position: absolute;z-index: 9999;" Min="0" Text="请填写正确的盘点数量" Component="CheckQuantity" Popup="true" />
 | 
					                            <RadzenNumericRangeValidator Style="position: absolute;z-index: 9999;" Min="1" Max="100" Text="请填写正确的取出数量" Component="CheckQuantity" />
 | 
				
			||||||
 | 
					                        </RadzenNumeric>
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                </EditTemplate>
 | 
					                </EditTemplate>
 | 
				
			||||||
            </RadzenDataGridColumn>
 | 
					            </RadzenDataGridColumn>
 | 
				
			||||||
| 
						 | 
					@ -243,7 +244,6 @@
 | 
				
			||||||
        this.BeforeQuantity = new int[9];
 | 
					        this.BeforeQuantity = new int[9];
 | 
				
			||||||
        this.AfterQuantity = new int[9];
 | 
					        this.AfterQuantity = new int[9];
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					 | 
				
			||||||
    async Task CheckFinish()
 | 
					    async Task CheckFinish()
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        if (channels.Any(cl => cl.CheckQuantity != cl.Quantity && cl.DrugId != null && cl.drugManuNo != null))
 | 
					        if (channels.Any(cl => cl.CheckQuantity != cl.Quantity && cl.DrugId != null && cl.drugManuNo != null))
 | 
				
			||||||
| 
						 | 
					@ -257,7 +257,7 @@
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            else
 | 
					            else
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                _message.Notify(new NotificationMessage { Severity = NotificationSeverity.Info, Summary = "提示", Detail = $"盘点完成", Duration = 4000 });
 | 
					                _message.Notify(new NotificationMessage { Severity = NotificationSeverity.Success, Summary = "提示", Detail = $"盘点完成", Duration = 4000 });
 | 
				
			||||||
                logger.Info($"盘点完成");
 | 
					                logger.Info($"盘点完成");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,8 +1,21 @@
 | 
				
			||||||
@page "/stock/list"
 | 
					@page "/stock/list"
 | 
				
			||||||
<style>
 | 
					<style>
 | 
				
			||||||
 | 
					    @@keyframes shake {
 | 
				
			||||||
 | 
					    0% { opacity:1;color:red; }
 | 
				
			||||||
 | 
					    25%{opacity:1;color:orange;}
 | 
				
			||||||
 | 
					    50% { opacity:0;color:yellow;}
 | 
				
			||||||
 | 
					    75%{opacity:1;color:crimson;}
 | 
				
			||||||
 | 
					    100% { opacity:1;color:red;  }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
    .rz-custom-header {
 | 
					    .rz-custom-header {
 | 
				
			||||||
    width: 100%;
 | 
					    width: 100%;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					    .shaky-text {
 | 
				
			||||||
 | 
					    animation: shake 2s infinite ease-in-out;
 | 
				
			||||||
 | 
					    /* 你可以根据需要调整动画的持续时间和迭代次数 */
 | 
				
			||||||
 | 
					    transition:color 0.5s linear,opacity 0.5s linear;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
</style>
 | 
					</style>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<div class="container-fluid">
 | 
					<div class="container-fluid">
 | 
				
			||||||
| 
						 | 
					@ -17,8 +30,8 @@
 | 
				
			||||||
    ExpandMode="DataGridExpandMode.Multiple">
 | 
					    ExpandMode="DataGridExpandMode.Multiple">
 | 
				
			||||||
        <HeaderTemplate>
 | 
					        <HeaderTemplate>
 | 
				
			||||||
            <RadzenRow JustifyContent="JustifyContent.End" AlignItems="AlignItems.Center">
 | 
					            <RadzenRow JustifyContent="JustifyContent.End" AlignItems="AlignItems.Center">
 | 
				
			||||||
                <RadzenButton Icon="download" Text="库存导出" Variant="Variant.Outlined" />
 | 
					                <RadzenButton Icon="download" Text="库存导出" Variant="Variant.Outlined" Click="StockExport" />
 | 
				
			||||||
                <RadzenButton Icon="download" Text="专用账册导出" Variant="Variant.Outlined" />
 | 
					                <RadzenButton Icon="download" Text="专用账册导出" Variant="Variant.Outlined" Click="AccountBookExport" />
 | 
				
			||||||
            </RadzenRow>
 | 
					            </RadzenRow>
 | 
				
			||||||
        </HeaderTemplate>
 | 
					        </HeaderTemplate>
 | 
				
			||||||
        <Template Context="di">
 | 
					        <Template Context="di">
 | 
				
			||||||
| 
						 | 
					@ -29,16 +42,44 @@
 | 
				
			||||||
                            @s.DrawerNo - @s.ColNo
 | 
					                            @s.DrawerNo - @s.ColNo
 | 
				
			||||||
                        </Template>
 | 
					                        </Template>
 | 
				
			||||||
                    </RadzenDataGridColumn>
 | 
					                    </RadzenDataGridColumn>
 | 
				
			||||||
                    <RadzenDataGridColumn Title="数量" Property="Quantity"></RadzenDataGridColumn>
 | 
					                    <RadzenDataGridColumn Title="数量" Property="Quantity">
 | 
				
			||||||
 | 
					                    </RadzenDataGridColumn>
 | 
				
			||||||
                    <RadzenDataGridColumn Title="Åú´Î" Property="ManuNo"></RadzenDataGridColumn>
 | 
					                    <RadzenDataGridColumn Title="Åú´Î" Property="ManuNo"></RadzenDataGridColumn>
 | 
				
			||||||
                    <RadzenDataGridColumn Title="效期" Property="EffDate"></RadzenDataGridColumn>
 | 
					                    <RadzenDataGridColumn Title="效期" Property="EffDate">
 | 
				
			||||||
 | 
					                        <Template Context="s">
 | 
				
			||||||
 | 
					                            @{
 | 
				
			||||||
 | 
					                                DateTime dateTime;
 | 
				
			||||||
 | 
					                                bool success = DateTime.TryParse(s.EffDate, out dateTime);
 | 
				
			||||||
 | 
					                                if(success&&dateTime<=DateTime.Now.AddMonths(3))
 | 
				
			||||||
 | 
					                                {
 | 
				
			||||||
 | 
					                                    @s.EffDate<p class="shaky-text">近效期药品!</p>
 | 
				
			||||||
 | 
					                                }
 | 
				
			||||||
 | 
					                                else
 | 
				
			||||||
 | 
					                                {
 | 
				
			||||||
 | 
					                                    @s.EffDate
 | 
				
			||||||
 | 
					                                }
 | 
				
			||||||
 | 
					                            }
 | 
				
			||||||
 | 
					                        </Template>
 | 
				
			||||||
 | 
					                    </RadzenDataGridColumn>
 | 
				
			||||||
                </Columns>
 | 
					                </Columns>
 | 
				
			||||||
            </RadzenDataGrid>
 | 
					            </RadzenDataGrid>
 | 
				
			||||||
        </Template>
 | 
					        </Template>
 | 
				
			||||||
        <Columns>
 | 
					        <Columns>
 | 
				
			||||||
            <RadzenDataGridColumn Frozen="true" Width="200px" Title="Ò©Æ·Ãû³Æ" Property="DrugName"></RadzenDataGridColumn>
 | 
					            <RadzenDataGridColumn Frozen="true" Width="200px" Title="Ò©Æ·Ãû³Æ" Property="DrugName"></RadzenDataGridColumn>
 | 
				
			||||||
            <RadzenDataGridColumn Title="¹æ¸ñ" Property="DrugSpec"></RadzenDataGridColumn>
 | 
					            <RadzenDataGridColumn Title="¹æ¸ñ" Property="DrugSpec"></RadzenDataGridColumn>
 | 
				
			||||||
            <RadzenDataGridColumn Title="总库存" Property="StockQuantity"></RadzenDataGridColumn>
 | 
					            <RadzenDataGridColumn Title="总库存" Property="StockQuantity">                
 | 
				
			||||||
 | 
					                <Template Context="s">
 | 
				
			||||||
 | 
					                    @if(s.StockQuantity<10)
 | 
				
			||||||
 | 
					                    {
 | 
				
			||||||
 | 
					                        @s.StockQuantity<p class="shaky-text">库存预警!</p>
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                    else
 | 
				
			||||||
 | 
					                    {
 | 
				
			||||||
 | 
					                        @s.StockQuantity
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                </Template>
 | 
				
			||||||
 | 
					            </RadzenDataGridColumn>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        </Columns>
 | 
					        </Columns>
 | 
				
			||||||
    </RadzenDataGrid>
 | 
					    </RadzenDataGrid>
 | 
				
			||||||
</div>
 | 
					</div>
 | 
				
			||||||
| 
						 | 
					@ -83,7 +124,15 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    async void StockExport()
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    async void AccountBookExport()
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,153 @@
 | 
				
			||||||
 | 
					using LinqToDB.Mapping;
 | 
				
			||||||
 | 
					namespace MasaBlazorApp3.Pojo
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    [Table("account_book_g2")]
 | 
				
			||||||
 | 
					    public class AccountBookG2
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        /// <summary>
 | 
				
			||||||
 | 
					        /// 主键
 | 
				
			||||||
 | 
					        /// </summary>
 | 
				
			||||||
 | 
					        [Column("id")]
 | 
				
			||||||
 | 
					        public int Id { get; set; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /// <summary>
 | 
				
			||||||
 | 
					        /// 药品id
 | 
				
			||||||
 | 
					        /// </summary>
 | 
				
			||||||
 | 
					        [Column("drug_id")]
 | 
				
			||||||
 | 
					        public string DrugId { get; set; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /// <summary>
 | 
				
			||||||
 | 
					        /// 1领入2发出3日结4总结5转结
 | 
				
			||||||
 | 
					        /// </summary>
 | 
				
			||||||
 | 
					        [Column("type")]
 | 
				
			||||||
 | 
					        public int Type { get; set; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /// <summary>
 | 
				
			||||||
 | 
					        /// 科室
 | 
				
			||||||
 | 
					        /// </summary>
 | 
				
			||||||
 | 
					        [Column("department")]
 | 
				
			||||||
 | 
					        public string Department { get; set; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /// <summary>
 | 
				
			||||||
 | 
					        /// 设备内记录凭证
 | 
				
			||||||
 | 
					        /// </summary>
 | 
				
			||||||
 | 
					        [Column("invoice_no")]
 | 
				
			||||||
 | 
					        public string InvoiceNo { get; set; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /// <summary>
 | 
				
			||||||
 | 
					        /// 处方号或凭证号
 | 
				
			||||||
 | 
					        /// </summary>
 | 
				
			||||||
 | 
					        [Column("order_no")]
 | 
				
			||||||
 | 
					        public string OrderNo { get; set; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /// <summary>
 | 
				
			||||||
 | 
					        /// 批次
 | 
				
			||||||
 | 
					        /// </summary>
 | 
				
			||||||
 | 
					        [Column("manu_no")]
 | 
				
			||||||
 | 
					        public string ManuNo { get; set; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /// <summary>
 | 
				
			||||||
 | 
					        /// 效期
 | 
				
			||||||
 | 
					        /// </summary>
 | 
				
			||||||
 | 
					        [Column("eff_date")]
 | 
				
			||||||
 | 
					        public string EffDate { get; set; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /// <summary>
 | 
				
			||||||
 | 
					        /// 上日结存
 | 
				
			||||||
 | 
					        /// </summary>
 | 
				
			||||||
 | 
					        [Column("yesterday_quantity")]
 | 
				
			||||||
 | 
					        public int YQuantity { get; set; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /// <summary>
 | 
				
			||||||
 | 
					        /// 收入
 | 
				
			||||||
 | 
					        /// </summary>
 | 
				
			||||||
 | 
					        [Column("add_quantity")]
 | 
				
			||||||
 | 
					        public int AddQuantity { get; set; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /// <summary>
 | 
				
			||||||
 | 
					        /// 发出
 | 
				
			||||||
 | 
					        /// </summary>
 | 
				
			||||||
 | 
					        [Column("out_quantity")]
 | 
				
			||||||
 | 
					        public int OutQuantity { get; set; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /// <summary>
 | 
				
			||||||
 | 
					        /// 批次结存
 | 
				
			||||||
 | 
					        /// </summary>
 | 
				
			||||||
 | 
					        [Column("manu_stock")]
 | 
				
			||||||
 | 
					        public int ManuStock { get; set; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /// <summary>
 | 
				
			||||||
 | 
					        /// 总结存
 | 
				
			||||||
 | 
					        /// </summary>
 | 
				
			||||||
 | 
					        [Column("total_stock")]
 | 
				
			||||||
 | 
					        public int TotalStock { get; set; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /// <summary>
 | 
				
			||||||
 | 
					        ///  发药领药人id
 | 
				
			||||||
 | 
					        /// </summary>
 | 
				
			||||||
 | 
					        [Column("user_id1")]
 | 
				
			||||||
 | 
					        public int? UserId1 { get; set; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /// <summary>
 | 
				
			||||||
 | 
					        /// 复核人id
 | 
				
			||||||
 | 
					        /// </summary>
 | 
				
			||||||
 | 
					        [Column("user_id2")]
 | 
				
			||||||
 | 
					        public int? UserId2 { get; set; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /// <summary>
 | 
				
			||||||
 | 
					        /// 设备id
 | 
				
			||||||
 | 
					        /// </summary>
 | 
				
			||||||
 | 
					        [Column("machine_id")]
 | 
				
			||||||
 | 
					        public string MachineId { get; set; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /// <summary>
 | 
				
			||||||
 | 
					        /// 日期
 | 
				
			||||||
 | 
					        /// </summary>
 | 
				
			||||||
 | 
					        [Column("create_date")]
 | 
				
			||||||
 | 
					        public string CreateDate { get; set; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /// <summary>
 | 
				
			||||||
 | 
					        /// 插入更新时间(当前时间戳)
 | 
				
			||||||
 | 
					        /// </summary>
 | 
				
			||||||
 | 
					        [Column("create_time")]
 | 
				
			||||||
 | 
					        public DateTime CreateTime { get; set; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /// <summary>
 | 
				
			||||||
 | 
					        /// 药品名称
 | 
				
			||||||
 | 
					        /// </summary>
 | 
				
			||||||
 | 
					        [Column(IsColumn = false)]
 | 
				
			||||||
 | 
					        public string DrugName { get; set; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /// <summary>
 | 
				
			||||||
 | 
					        /// 规格
 | 
				
			||||||
 | 
					        /// </summary>
 | 
				
			||||||
 | 
					        [Column(IsColumn = false)]
 | 
				
			||||||
 | 
					        public string DrugSpec { get; set; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /// <summary>
 | 
				
			||||||
 | 
					        /// 厂家
 | 
				
			||||||
 | 
					        /// </summary>
 | 
				
			||||||
 | 
					        [Column(IsColumn = false)]
 | 
				
			||||||
 | 
					        public string Manufactory { get; set; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /// <summary>
 | 
				
			||||||
 | 
					        /// 发药人
 | 
				
			||||||
 | 
					        /// </summary>
 | 
				
			||||||
 | 
					        [Column(IsColumn = false)]
 | 
				
			||||||
 | 
					        public string OperatorName { get; set; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /// <summary>
 | 
				
			||||||
 | 
					        /// 复核人
 | 
				
			||||||
 | 
					        /// </summary>
 | 
				
			||||||
 | 
					        [Column(IsColumn = false)]
 | 
				
			||||||
 | 
					        public string ReviewerName { get; set; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /// <summary>
 | 
				
			||||||
 | 
					        /// 手术间
 | 
				
			||||||
 | 
					        /// </summary>
 | 
				
			||||||
 | 
					        [Column("shoushuJian")]
 | 
				
			||||||
 | 
					        public string ShoushuJian { get; set; }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -44,5 +44,11 @@ namespace MasaBlazorApp3.Pojo
 | 
				
			||||||
        [Association(ThisKey = nameof(DrugId), OtherKey = nameof(DrugInfo.DrugId))]
 | 
					        [Association(ThisKey = nameof(DrugId), OtherKey = nameof(DrugInfo.DrugId))]
 | 
				
			||||||
        public DrugInfo Drug { get; set; } = new();
 | 
					        public DrugInfo Drug { get; set; } = new();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        //关联药品中的套餐信息表
 | 
				
			||||||
 | 
					        [Association(ThisKey =nameof(DrugId),OtherKey = nameof(Plan.Id))]
 | 
				
			||||||
 | 
					        public Plan PlanInfo { get; set; }=new();
 | 
				
			||||||
 | 
					        //手术室药箱中的库存总数
 | 
				
			||||||
 | 
					        [Column("stock_quantity")]
 | 
				
			||||||
 | 
					        public int TotalQuantity { get; set; }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,10 +1,4 @@
 | 
				
			||||||
using LinqToDB.Common.Internal.Cache;
 | 
					using LinqToDB.Mapping;
 | 
				
			||||||
using LinqToDB.Mapping;
 | 
					 | 
				
			||||||
using System;
 | 
					 | 
				
			||||||
using System.Collections.Generic;
 | 
					 | 
				
			||||||
using System.Linq;
 | 
					 | 
				
			||||||
using System.Text;
 | 
					 | 
				
			||||||
using System.Threading.Tasks;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace MasaBlazorApp3.Pojo
 | 
					namespace MasaBlazorApp3.Pojo
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
| 
						 | 
					@ -37,7 +31,9 @@ namespace MasaBlazorApp3.Pojo
 | 
				
			||||||
        [Column("drawer_type")]
 | 
					        [Column("drawer_type")]
 | 
				
			||||||
        public int DrawerType { get; set; }
 | 
					        public int DrawerType { get; set; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /// <summary>
 | 
				
			||||||
 | 
					        /// 1物理隔板;2单支计数;3管控药盒;4储物箱;5智能显示;6称重计数;63称重计数药盒;653称重计数药盒智能显示;
 | 
				
			||||||
 | 
					        /// </summary>
 | 
				
			||||||
        [Column("board_type")]
 | 
					        [Column("board_type")]
 | 
				
			||||||
        public int BoardType { get; set; }
 | 
					        public int BoardType { get; set; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -47,7 +43,7 @@ namespace MasaBlazorApp3.Pojo
 | 
				
			||||||
        [Column("eff_date")]
 | 
					        [Column("eff_date")]
 | 
				
			||||||
        public string EffDate { get; set; }
 | 
					        public string EffDate { get; set; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        [Association(ThisKey = nameof(DrugId), OtherKey = nameof(DrugInfo.DrugId))]
 | 
					        [LinqToDB.Mapping.Association(ThisKey = nameof(DrugId), OtherKey = nameof(DrugInfo.DrugId))]
 | 
				
			||||||
        public DrugInfo? Drug { get; set; }
 | 
					        public DrugInfo? Drug { get; set; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -62,7 +58,7 @@ namespace MasaBlazorApp3.Pojo
 | 
				
			||||||
        [Column("dmnguid")]
 | 
					        [Column("dmnguid")]
 | 
				
			||||||
        public string Dmnguid { get; set; }
 | 
					        public string Dmnguid { get; set; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        [Association(ThisKey = nameof(Dmnguid), OtherKey = nameof(DrugManuNo.Id))]
 | 
					        [LinqToDB.Mapping.Association(ThisKey = nameof(Dmnguid), OtherKey = nameof(DrugManuNo.Id))]
 | 
				
			||||||
        public DrugManuNo? drugManuNo { get; set; }
 | 
					        public DrugManuNo? drugManuNo { get; set; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -72,7 +68,6 @@ namespace MasaBlazorApp3.Pojo
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        [Column(IsColumn = false)]
 | 
					        [Column(IsColumn = false)]
 | 
				
			||||||
        public int CanReturnQuantity { get; set; }
 | 
					        public int CanReturnQuantity { get; set; }
 | 
				
			||||||
 | 
					 | 
				
			||||||
        [Column(IsColumn = false)]
 | 
					        [Column(IsColumn = false)]
 | 
				
			||||||
        public int CheckQuantity
 | 
					        public int CheckQuantity
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
| 
						 | 
					@ -81,5 +76,18 @@ namespace MasaBlazorApp3.Pojo
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        [Column("Pos_No")]
 | 
					        [Column("Pos_No")]
 | 
				
			||||||
        public int BiaoDingStatus { get; set; }
 | 
					        public int BiaoDingStatus { get; set; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        //手术室药箱中的药品基数
 | 
				
			||||||
 | 
					        [Column("Check_Quantity")]
 | 
				
			||||||
 | 
					        public int BaseQuantity { get; set; }
 | 
				
			||||||
 | 
					        //手术室药箱中某药品全部批次的需要加药数
 | 
				
			||||||
 | 
					        [Column("col_no2")]
 | 
				
			||||||
 | 
					        public int NeedQuantity { get; set; }
 | 
				
			||||||
 | 
					        //手术室药箱中某药品全部批次的已取药待入库数
 | 
				
			||||||
 | 
					        [Column("col_no1")]
 | 
				
			||||||
 | 
					        public int AddToQuantity { get; set; }
 | 
				
			||||||
 | 
					        //手术室药箱中药品补药状态(1需补药2已补药待入库0满库状态)
 | 
				
			||||||
 | 
					        [Column("state")]
 | 
				
			||||||
 | 
					        public int BoxState { get; set; }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -19,5 +19,9 @@ namespace MasaBlazorApp3.Pojo.Config
 | 
				
			||||||
        public bool canBusExsit { get; set; }
 | 
					        public bool canBusExsit { get; set; }
 | 
				
			||||||
        public int doorAddr { get; set; }
 | 
					        public int doorAddr { get; set; }
 | 
				
			||||||
        public int storageBoxAddr { get; set; }
 | 
					        public int storageBoxAddr { get; set; }
 | 
				
			||||||
 | 
					        //存在冰箱串口
 | 
				
			||||||
 | 
					        public bool fridgePortExist { get; set; }
 | 
				
			||||||
 | 
					        //冰箱串口号
 | 
				
			||||||
 | 
					        public string fridgePortPath { get; set; }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -14,6 +14,8 @@ namespace MasaBlazorApp3.Pojo.Config
 | 
				
			||||||
        public bool opFirst { get; set; }
 | 
					        public bool opFirst { get; set; }
 | 
				
			||||||
        //自动退出登录时间,单位秒(0不自动退出)
 | 
					        //自动退出登录时间,单位秒(0不自动退出)
 | 
				
			||||||
        public int autoOutLog { get; set; }
 | 
					        public int autoOutLog { get; set; }
 | 
				
			||||||
 | 
					        //手术室药盒的设备id
 | 
				
			||||||
 | 
					        public string boxMachineId { get; set; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,16 @@
 | 
				
			||||||
 | 
					using System;
 | 
				
			||||||
 | 
					using System.Collections.Generic;
 | 
				
			||||||
 | 
					using System.Linq;
 | 
				
			||||||
 | 
					using System.Text;
 | 
				
			||||||
 | 
					using System.Threading.Tasks;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace MasaBlazorApp3.Pojo.Config
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    //冰箱配置文件
 | 
				
			||||||
 | 
					    public class fridgeConfig
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        public string temperatureRange { get; set; }
 | 
				
			||||||
 | 
					        public int fridgeState { get; set; }
 | 
				
			||||||
 | 
					        public int alertState { get; set; }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,26 @@
 | 
				
			||||||
 | 
					using LinqToDB.Mapping;
 | 
				
			||||||
 | 
					using System;
 | 
				
			||||||
 | 
					using System.Collections.Generic;
 | 
				
			||||||
 | 
					using System.Linq;
 | 
				
			||||||
 | 
					using System.Text;
 | 
				
			||||||
 | 
					using System.Threading.Tasks;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace MasaBlazorApp3.Pojo
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    /// <summary>
 | 
				
			||||||
 | 
					    /// 药品基数
 | 
				
			||||||
 | 
					    /// </summary>
 | 
				
			||||||
 | 
					    [Table("drug_base")]
 | 
				
			||||||
 | 
					    public class DrugBase
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        [PrimaryKey]
 | 
				
			||||||
 | 
					        [Column("drugid")]
 | 
				
			||||||
 | 
					        public string DrugId { get; set; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        [Column("machine_id")]
 | 
				
			||||||
 | 
					        public string MachineId { get; set; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        [Column("baseQuantity")]
 | 
				
			||||||
 | 
					        public int BaseQuantity { get; set; }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,35 @@
 | 
				
			||||||
 | 
					using LinqToDB.Mapping;
 | 
				
			||||||
 | 
					using System;
 | 
				
			||||||
 | 
					using System.Collections.Generic;
 | 
				
			||||||
 | 
					using System.Linq;
 | 
				
			||||||
 | 
					using System.Text;
 | 
				
			||||||
 | 
					using System.Threading.Tasks;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace MasaBlazorApp3.Pojo
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    //交接班表
 | 
				
			||||||
 | 
					    [Table("hkc_changeshifts")]
 | 
				
			||||||
 | 
					    public class HkcChangeShifts
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        [Column("Id")]
 | 
				
			||||||
 | 
					        public int Id { get; set; }
 | 
				
			||||||
 | 
					        [Column("optDate")]
 | 
				
			||||||
 | 
					        public DateTime optDate { get; set; }
 | 
				
			||||||
 | 
					        [Column("FromOperator")]
 | 
				
			||||||
 | 
					        public string FromOperator { get; set; }
 | 
				
			||||||
 | 
					        [Column("FromRviewer")]
 | 
				
			||||||
 | 
					        public string FromRviewer { get; set; }
 | 
				
			||||||
 | 
					        [Column("ToOperator")]
 | 
				
			||||||
 | 
					        public string ToOperator { get; set; }
 | 
				
			||||||
 | 
					        [Column("ToReviewer")]
 | 
				
			||||||
 | 
					        public string ToReviewer { get; set; }
 | 
				
			||||||
 | 
					        [Column("ToDate")]
 | 
				
			||||||
 | 
					        public DateTime ToDate { get; set; }
 | 
				
			||||||
 | 
					        [Column("State")]
 | 
				
			||||||
 | 
					        public string State { get; set; }
 | 
				
			||||||
 | 
					        [Column("optState")]
 | 
				
			||||||
 | 
					        public string optState { get; set; }
 | 
				
			||||||
 | 
					        [Column("machine_id")]
 | 
				
			||||||
 | 
					        public string MachineId { get; set; }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -154,6 +154,14 @@ namespace MasaBlazorApp3.Pojo
 | 
				
			||||||
        [Column("state")]
 | 
					        [Column("state")]
 | 
				
			||||||
        public int state { get; set; } = 0;
 | 
					        public int state { get; set; } = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        [Association(ThisKey = nameof(OrderNo), OtherKey = nameof(OrderDetail.OrderNo))]
 | 
				
			||||||
 | 
					        public OrderDetail Detail { get; set; } = new();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /// <summary>
 | 
				
			||||||
 | 
					        /// 是否选中
 | 
				
			||||||
 | 
					        /// </summary>
 | 
				
			||||||
 | 
					        [Column(IsColumn =false)]
 | 
				
			||||||
 | 
					        public bool ItemIsChecked { get; set; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,37 @@
 | 
				
			||||||
 | 
					using LinqToDB.Mapping;
 | 
				
			||||||
 | 
					using System;
 | 
				
			||||||
 | 
					using System.Collections.Generic;
 | 
				
			||||||
 | 
					using System.Linq;
 | 
				
			||||||
 | 
					using System.Text;
 | 
				
			||||||
 | 
					using System.Threading.Tasks;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace MasaBlazorApp3.Pojo
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    [Table("Plan")]
 | 
				
			||||||
 | 
					    public class Plan
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        //主键
 | 
				
			||||||
 | 
					        [Column("Id")]
 | 
				
			||||||
 | 
					        public int Id { get; set; }
 | 
				
			||||||
 | 
					        //套餐名
 | 
				
			||||||
 | 
					        [Column("Name")]
 | 
				
			||||||
 | 
					        public string Name { get; set; }
 | 
				
			||||||
 | 
					        //套餐描述
 | 
				
			||||||
 | 
					        [Column("Description")]
 | 
				
			||||||
 | 
					        public string Description { get; set; }
 | 
				
			||||||
 | 
					        [Association(ThisKey = nameof(Id), OtherKey = nameof(PlanDetails.PlanId))]
 | 
				
			||||||
 | 
					        public List<PlanDetails> _PlanDetails { get; set; } = new();
 | 
				
			||||||
 | 
					        //添加时间
 | 
				
			||||||
 | 
					        [Column("AddTime")]
 | 
				
			||||||
 | 
					        public DateTime AddTime { get; set; }
 | 
				
			||||||
 | 
					        //可用状态:0不可用1可用
 | 
				
			||||||
 | 
					        [Column("usestate")]
 | 
				
			||||||
 | 
					        public int UseState { get; set; }
 | 
				
			||||||
 | 
					        //操作人
 | 
				
			||||||
 | 
					        [Column("operatorUser")]
 | 
				
			||||||
 | 
					        public int OperatorUser { get; set; }
 | 
				
			||||||
 | 
					        //审核人
 | 
				
			||||||
 | 
					        [Column("reviewerUser")]
 | 
				
			||||||
 | 
					        public int ReviewerUser { get; set; }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,41 @@
 | 
				
			||||||
 | 
					using LinqToDB.Mapping;
 | 
				
			||||||
 | 
					using System;
 | 
				
			||||||
 | 
					using System.Collections.Generic;
 | 
				
			||||||
 | 
					using System.Linq;
 | 
				
			||||||
 | 
					using System.Text;
 | 
				
			||||||
 | 
					using System.Threading.Tasks;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace MasaBlazorApp3.Pojo
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    [Table("Plan_Details")]
 | 
				
			||||||
 | 
					    public class PlanDetails
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        //主键
 | 
				
			||||||
 | 
					        [Column("Id")]
 | 
				
			||||||
 | 
					        public int Id { get; set; }
 | 
				
			||||||
 | 
					        //套餐外键
 | 
				
			||||||
 | 
					        [Column("Plan_Id")]
 | 
				
			||||||
 | 
					        public int PlanId { get; set; }
 | 
				
			||||||
 | 
					        //药品基数
 | 
				
			||||||
 | 
					        [Column("Base_Quantity")]
 | 
				
			||||||
 | 
					        public int BaseQuantity { get; set; }
 | 
				
			||||||
 | 
					        //药品ID
 | 
				
			||||||
 | 
					        [Column("Drug_Id")]
 | 
				
			||||||
 | 
					        public string DrugId { get; set; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        [Association(ThisKey = nameof(Id), OtherKey = nameof(PlanDetails.DrugId))]
 | 
				
			||||||
 | 
					        public DrugInfo _DrugInfo { get; set; } = new(); 
 | 
				
			||||||
 | 
					        //添加时间
 | 
				
			||||||
 | 
					        [Column("AddTime")]
 | 
				
			||||||
 | 
					        public DateTime AddTime { get; set; }
 | 
				
			||||||
 | 
					        //可用状态:0不可用1可用
 | 
				
			||||||
 | 
					        [Column("usestate")]
 | 
				
			||||||
 | 
					        public int UseState { get; set; }
 | 
				
			||||||
 | 
					        //操作人
 | 
				
			||||||
 | 
					        [Column("operatorUser")]
 | 
				
			||||||
 | 
					        public int OperatorUser { get; set; }
 | 
				
			||||||
 | 
					        //审核人
 | 
				
			||||||
 | 
					        [Column("reviewerUser")]
 | 
				
			||||||
 | 
					        public int ReviewerUser { get; set; }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -195,13 +195,70 @@ namespace MasaBlazorApp3.Pojo
 | 
				
			||||||
                PremissionName = "权限管理",
 | 
					                PremissionName = "权限管理",
 | 
				
			||||||
                PremissionPath = "/manage/role"
 | 
					                PremissionPath = "/manage/role"
 | 
				
			||||||
            });
 | 
					            });
 | 
				
			||||||
 | 
					            Premission set = new Premission()
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                Id = 53,
 | 
				
			||||||
 | 
					                PremissionName = "系统设置",
 | 
				
			||||||
 | 
					                PremissionPath = "/manage/setting"
 | 
				
			||||||
 | 
					                //PremissionPath = "/Box/Plan"
 | 
				
			||||||
 | 
					            };
 | 
				
			||||||
 | 
					            set.AddChild(new Premission()
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                Id = 531,
 | 
				
			||||||
 | 
					                PremissionName = "登录设置",
 | 
				
			||||||
 | 
					                PremissionPath = "/manage/setting/login"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            });
 | 
				
			||||||
 | 
					            set.AddChild(new Premission()
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                Id = 532,
 | 
				
			||||||
 | 
					                PremissionName = "冰箱设置",
 | 
				
			||||||
 | 
					                PremissionPath = "/manage/setting/Fridge"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            });
 | 
				
			||||||
 | 
					            x.AddChild(new Premission()
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                Id = 54,
 | 
				
			||||||
 | 
					                PremissionName = "套餐管理",
 | 
				
			||||||
 | 
					                PremissionPath = "/Box/Plan"
 | 
				
			||||||
 | 
					            });
 | 
				
			||||||
 | 
					            x.AddChild(new Premission()
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                Id = 55,
 | 
				
			||||||
 | 
					                PremissionName = "绑定药箱",
 | 
				
			||||||
 | 
					                PremissionPath = "/Box/BoxBindings"
 | 
				
			||||||
 | 
					            });
 | 
				
			||||||
 | 
					            x.AddChild(new Premission()
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                Id = 56,
 | 
				
			||||||
 | 
					                PremissionName = "药箱核对",
 | 
				
			||||||
 | 
					                PremissionPath = "/Box/Check"
 | 
				
			||||||
 | 
					            });
 | 
				
			||||||
 | 
					            x.AddChild(new Premission()
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                Id = 57,
 | 
				
			||||||
 | 
					                PremissionName = "药箱加药",
 | 
				
			||||||
 | 
					                PremissionPath = "/Box/BoxAdd"
 | 
				
			||||||
 | 
					            });
 | 
				
			||||||
 | 
					            x.AddChild(new Premission()
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                Id = 58,
 | 
				
			||||||
 | 
					                PremissionName = "药箱入库",
 | 
				
			||||||
 | 
					                PremissionPath = "/Box/BoxAddBox"
 | 
				
			||||||
 | 
					            });
 | 
				
			||||||
            list.Add(q);
 | 
					            list.Add(q);
 | 
				
			||||||
            list.Add(j);
 | 
					            list.Add(j);
 | 
				
			||||||
            list.Add(h);
 | 
					            list.Add(h);
 | 
				
			||||||
            list.Add(k);
 | 
					            list.Add(k);
 | 
				
			||||||
 | 
					            x.AddChild(set);
 | 
				
			||||||
            list.Add(x);
 | 
					            list.Add(x);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            return list;
 | 
					            return list;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        public bool HasChild()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            return this.Items.Count() > 0;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,21 @@
 | 
				
			||||||
 | 
					using LinqToDB.Mapping;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace MasaBlazorApp3.Pojo
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    //系统设置中的菜单
 | 
				
			||||||
 | 
					    [Table("SettingManu")]
 | 
				
			||||||
 | 
					    public class SettingManu
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        [PrimaryKey, Identity]
 | 
				
			||||||
 | 
					        [Column("id")]
 | 
				
			||||||
 | 
					        public int Id { get; set; }
 | 
				
			||||||
 | 
					        [Column("Manu_Name")]
 | 
				
			||||||
 | 
					        public string Name { get; set; }
 | 
				
			||||||
 | 
					        [Column("Manu_Icon")]
 | 
				
			||||||
 | 
					        public string Icon { get; set; }
 | 
				
			||||||
 | 
					        [Column("Path")]
 | 
				
			||||||
 | 
					        public string Path { get; set; }
 | 
				
			||||||
 | 
					        [Column(IsColumn = false)]
 | 
				
			||||||
 | 
					        public List<SettingManu> Children { get; set; } = new();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,32 @@
 | 
				
			||||||
 | 
					using System;
 | 
				
			||||||
 | 
					using System.Collections.Generic;
 | 
				
			||||||
 | 
					using System.Linq;
 | 
				
			||||||
 | 
					using System.Text;
 | 
				
			||||||
 | 
					using System.Threading.Tasks;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace MasaBlazorApp3.Pojo.Vo
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    public class BoxTakeVo
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        public DrugInfo Drug { get; set; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        public ChannelStock BoxDetail { get; set; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        public ChannelStock ChannelStock { get; set; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        public int StockQuantity { get; set; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        public int Quantity { get; set; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        public int GetQuantity { get; set; } = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        public int Status { get; set; } = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        public int[] BeforeQuantity { get; set; } = new int[] { 0, 0, 0, 0, 0, 0, 0, 0, 0 };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        public int[] AfterQuantity { get; set; } = new int[] { 0, 0, 0, 0, 0, 0, 0, 0, 0 };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        public int AddQuantity { get; set; } = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -18,6 +18,7 @@ using System.Reflection;
 | 
				
			||||||
using MasaBlazorApp3.Pojo.Config;
 | 
					using MasaBlazorApp3.Pojo.Config;
 | 
				
			||||||
using Microsoft.Extensions.Options;
 | 
					using Microsoft.Extensions.Options;
 | 
				
			||||||
using LinqToDB.Common;
 | 
					using LinqToDB.Common;
 | 
				
			||||||
 | 
					using MasaBlazorApp3.Util;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace MasaBlazorApp3.Port
 | 
					namespace MasaBlazorApp3.Port
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
| 
						 | 
					@ -32,6 +33,9 @@ namespace MasaBlazorApp3.Port
 | 
				
			||||||
        // 条码枪串口
 | 
					        // 条码枪串口
 | 
				
			||||||
        public SerialPort scanCodeSerial;
 | 
					        public SerialPort scanCodeSerial;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        //冰箱串口
 | 
				
			||||||
 | 
					        public SerialPort fridgeSerial;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        public bool Operate { get; set; }
 | 
					        public bool Operate { get; set; }
 | 
				
			||||||
        public DateTime dateTime { get; set; } = DateTime.Now;
 | 
					        public DateTime dateTime { get; set; } = DateTime.Now;
 | 
				
			||||||
| 
						 | 
					@ -95,7 +99,21 @@ namespace MasaBlazorApp3.Port
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                
 | 
					                
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            
 | 
					            if (_portConfig.fridgePortExist)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                try
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    string FridgePortPath = _portConfig.fridgePortPath;
 | 
				
			||||||
 | 
					                    logger.Info($"打开冰箱串口【{FridgePortPath}】");
 | 
				
			||||||
 | 
					                    fridgeSerial = new SerialPort(FridgePortPath, 9600, Parity.None, 8);
 | 
				
			||||||
 | 
					                    //fridgeSerial.Open();
 | 
				
			||||||
 | 
					                    //logger.Info($"冰箱串口打开结果【{fridgeSerial.IsOpen}】");
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                catch (Exception e)
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    logger.Error("冰箱串口打开错误" + e.Message);
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1001,5 +1019,382 @@ namespace MasaBlazorApp3.Port
 | 
				
			||||||
        #endregion  称重操作
 | 
					        #endregion  称重操作
 | 
				
			||||||
        #endregion
 | 
					        #endregion
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        #region 冰箱
 | 
				
			||||||
 | 
					        /// <summary>
 | 
				
			||||||
 | 
					        /// 冰箱使能
 | 
				
			||||||
 | 
					        /// </summary>
 | 
				
			||||||
 | 
					        /// <returns></returns>
 | 
				
			||||||
 | 
					        public async Task FridegOpen(int iIndex)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            try
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                fridgeSerial.DiscardInBuffer();
 | 
				
			||||||
 | 
					                byte bAddress;
 | 
				
			||||||
 | 
					                if (iIndex == 1)
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    bAddress = 0x01;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                else
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    bAddress = 0x02;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                byte[] buffer = new byte[] { bAddress, 0x06, 0x10, 0xD4, 0x00, 0x01, 0x0C, 0xF2 };
 | 
				
			||||||
 | 
					                //byte[] buffer = new byte[] { 0x01, 0x06, 0x10, 0xD4, 0x00, 0x01 };
 | 
				
			||||||
 | 
					                ////获取数组CRC校验码
 | 
				
			||||||
 | 
					                //byte[] byteDate = CRC16MODBUS.CrcModBus(buffer);
 | 
				
			||||||
 | 
					                ////Array.Reverse(byteDate);
 | 
				
			||||||
 | 
					                //int dataLength = buffer.Length;
 | 
				
			||||||
 | 
					                //Array.Resize(ref buffer, dataLength + byteDate.Length);
 | 
				
			||||||
 | 
					                //for (int i = 0; i < byteDate.Length; i++)
 | 
				
			||||||
 | 
					                //{
 | 
				
			||||||
 | 
					                //    buffer[dataLength + i] = byteDate[i];
 | 
				
			||||||
 | 
					                //}
 | 
				
			||||||
 | 
					                logger.Info($"冰箱使能【{Convert.ToHexString(buffer)}】");
 | 
				
			||||||
 | 
					                fridgeSerial.Write(buffer, 0, 8);
 | 
				
			||||||
 | 
					                await Task.Delay(80);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            catch (Exception ex)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                logger.Info($"冰箱使能发生异常:ex:{ex.Message}");
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        /// <summary>
 | 
				
			||||||
 | 
					        /// 冰箱失能
 | 
				
			||||||
 | 
					        /// </summary>
 | 
				
			||||||
 | 
					        /// <returns></returns>
 | 
				
			||||||
 | 
					        public async Task FridgeOff(int iIndex)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            try
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                fridgeSerial.DiscardInBuffer();
 | 
				
			||||||
 | 
					                byte bAddress;
 | 
				
			||||||
 | 
					                if (iIndex == 1)
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    bAddress = 0x01;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                else
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    bAddress = 0x02;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                byte[] buffer = new byte[] { bAddress, 0x06, 0x10, 0xD4, 0x00, 0x00, 0xCD, 0x32 };
 | 
				
			||||||
 | 
					                //byte[] buffer = new byte[] { 0x01, 0x06, 0x10, 0xD4, 0x00, 0x01 };
 | 
				
			||||||
 | 
					                ////获取数组CRC校验码
 | 
				
			||||||
 | 
					                //byte[] byteDate = CRC16MODBUS.CrcModBus(buffer);
 | 
				
			||||||
 | 
					                ////Array.Reverse(byteDate);
 | 
				
			||||||
 | 
					                //int dataLength = buffer.Length;
 | 
				
			||||||
 | 
					                //Array.Resize(ref buffer, dataLength + byteDate.Length);
 | 
				
			||||||
 | 
					                //for (int i = 0; i < byteDate.Length; i++)
 | 
				
			||||||
 | 
					                //{
 | 
				
			||||||
 | 
					                //    buffer[dataLength + i] = byteDate[i];
 | 
				
			||||||
 | 
					                //}
 | 
				
			||||||
 | 
					                logger.Info($"冰箱失能【{Convert.ToHexString(buffer)}】");
 | 
				
			||||||
 | 
					                fridgeSerial.Write(buffer, 0, 8);
 | 
				
			||||||
 | 
					                await Task.Delay(80);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            catch (Exception ex)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                logger.Info($"冰箱失能发生异常:ex:{ex.Message}");
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        /// <summary>
 | 
				
			||||||
 | 
					        /// 冰箱报警使能
 | 
				
			||||||
 | 
					        /// </summary>
 | 
				
			||||||
 | 
					        /// <returns></returns>
 | 
				
			||||||
 | 
					        public async Task FridgeAlarmOn(int iIndex)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            try
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                fridgeSerial.DiscardInBuffer();
 | 
				
			||||||
 | 
					                byte bAddress;
 | 
				
			||||||
 | 
					                if (iIndex == 1)
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    bAddress = 0x01;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                else
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    bAddress = 0x02;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                byte[] buffer = new byte[] { bAddress, 0x06, 0x10, 0xD5, 0x00, 0x01, 0x5D, 0x32 };
 | 
				
			||||||
 | 
					                //byte[] buffer = new byte[] { 0x01, 0x06, 0x10, 0xD5, 0x00, 0x01 };
 | 
				
			||||||
 | 
					                ////获取数组CRC校验码
 | 
				
			||||||
 | 
					                //byte[] byteDate = CRC16MODBUS.CrcModBus(buffer);
 | 
				
			||||||
 | 
					                ////Array.Reverse(byteDate);
 | 
				
			||||||
 | 
					                //int dataLength = buffer.Length;
 | 
				
			||||||
 | 
					                //Array.Resize(ref buffer, dataLength + byteDate.Length);
 | 
				
			||||||
 | 
					                //for (int i = 0; i < byteDate.Length; i++)
 | 
				
			||||||
 | 
					                //{
 | 
				
			||||||
 | 
					                //    buffer[dataLength + i] = byteDate[i];
 | 
				
			||||||
 | 
					                //}
 | 
				
			||||||
 | 
					                logger.Info($"冰箱报警使能【{Convert.ToHexString(buffer)}】");
 | 
				
			||||||
 | 
					                fridgeSerial.Write(buffer, 0, 8);
 | 
				
			||||||
 | 
					                await Task.Delay(80);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            catch (Exception ex)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                logger.Info($"冰箱报警使能发生异常:ex:{ex.Message}");
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /// <summary>
 | 
				
			||||||
 | 
					        /// 冰箱报警失能
 | 
				
			||||||
 | 
					        /// </summary>
 | 
				
			||||||
 | 
					        /// <returns></returns>
 | 
				
			||||||
 | 
					        public async Task FridgeAlarmOff(int iIndex)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            try
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                fridgeSerial.DiscardInBuffer();
 | 
				
			||||||
 | 
					                byte bAddress;
 | 
				
			||||||
 | 
					                if (iIndex == 1)
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    bAddress = 0x01;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                else
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    bAddress = 0x02;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                byte[] buffer = new byte[] { bAddress, 0x06, 0x10, 0xD5, 0x00, 0x00, 0x9C, 0xF2 };
 | 
				
			||||||
 | 
					                //byte[] buffer = new byte[] { 0x01, 0x06, 0x10, 0xD5, 0x00, 0x00 };
 | 
				
			||||||
 | 
					                ////获取数组CRC校验码
 | 
				
			||||||
 | 
					                //byte[] byteDate = CRC16MODBUS.CrcModBus(buffer);
 | 
				
			||||||
 | 
					                ////Array.Reverse(byteDate);
 | 
				
			||||||
 | 
					                //int dataLength = buffer.Length;
 | 
				
			||||||
 | 
					                //Array.Resize(ref buffer, dataLength + byteDate.Length);
 | 
				
			||||||
 | 
					                //for (int i = 0; i < byteDate.Length; i++)
 | 
				
			||||||
 | 
					                //{
 | 
				
			||||||
 | 
					                //    buffer[dataLength + i] = byteDate[i];
 | 
				
			||||||
 | 
					                //}
 | 
				
			||||||
 | 
					                logger.Info($"冰箱报警失能【{Convert.ToHexString(buffer)}】");
 | 
				
			||||||
 | 
					                fridgeSerial.Write(buffer, 0, 8);
 | 
				
			||||||
 | 
					                await Task.Delay(80);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            catch (Exception ex)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                logger.Info($"冰箱报警失能发生异常:ex:{ex.Message}");
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        /// <summary>
 | 
				
			||||||
 | 
					        /// 冰箱温度设定最小
 | 
				
			||||||
 | 
					        /// </summary>
 | 
				
			||||||
 | 
					        /// <returns></returns>
 | 
				
			||||||
 | 
					        public async Task FridgeMinSetting(float min, int iIndex)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            try
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                int iMix = Convert.ToInt32(min * 10);
 | 
				
			||||||
 | 
					                fridgeSerial.DiscardInBuffer();
 | 
				
			||||||
 | 
					                //byte[] bufferMin = new byte[] { 0x01, 0x06, 0x10, 0xC9, 0x00, 0x15, 0x9C, 0xFB };
 | 
				
			||||||
 | 
					                byte bAddress;
 | 
				
			||||||
 | 
					                if (iIndex == 1)
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    bAddress = 0x01;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                else
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    bAddress = 0x02;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                byte[] bufferMin = new byte[] { bAddress, 0x06, 0x10, 0xC9, 0x00, (byte)(iMix & 0xff) };
 | 
				
			||||||
 | 
					                //获取数组CRC校验码
 | 
				
			||||||
 | 
					                byte[] byteDate = CRC16MODBUS.CrcModBus(bufferMin);
 | 
				
			||||||
 | 
					                //Array.Reverse(byteDate);
 | 
				
			||||||
 | 
					                int dataLength = bufferMin.Length;
 | 
				
			||||||
 | 
					                Array.Resize(ref bufferMin, dataLength + byteDate.Length);
 | 
				
			||||||
 | 
					                for (int i = 0; i < byteDate.Length; i++)
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    bufferMin[dataLength + i] = byteDate[i];
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                logger.Info($"冰箱温度设定Min:【{Convert.ToHexString(bufferMin)}】");
 | 
				
			||||||
 | 
					                fridgeSerial.Write(bufferMin, 0, 8);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            catch (Exception ex)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                logger.Info($"获取冰箱温度发生异常:ex:{ex.Message}");
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        /// <summary>
 | 
				
			||||||
 | 
					        /// 冰箱温度设定最大
 | 
				
			||||||
 | 
					        /// </summary>
 | 
				
			||||||
 | 
					        /// <returns></returns>
 | 
				
			||||||
 | 
					        public async Task FridgeMaxSetting(float max, int iIndex)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            try
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                int iMax = Convert.ToInt32(max * 10);
 | 
				
			||||||
 | 
					                fridgeSerial.DiscardInBuffer();
 | 
				
			||||||
 | 
					                //byte[] bufferMin = new byte[] { 0x01, 0x06, 0x10, 0xC9, 0x00, 0x15, 0x9C, 0xFB };
 | 
				
			||||||
 | 
					                byte bAddress;
 | 
				
			||||||
 | 
					                if (iIndex == 1)
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    bAddress = 0x01;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                else
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    bAddress = 0x02;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                byte[] bufferMax = new byte[] { bAddress, 0x06, 0x10, 0xC8, 0x00, (byte)(iMax & 0xff) };
 | 
				
			||||||
 | 
					                //获取数组CRC校验码
 | 
				
			||||||
 | 
					                byte[] byteDate = CRC16MODBUS.CrcModBus(bufferMax);
 | 
				
			||||||
 | 
					                //Array.Reverse(byteDate);
 | 
				
			||||||
 | 
					                int dataLength = bufferMax.Length;
 | 
				
			||||||
 | 
					                Array.Resize(ref bufferMax, dataLength + byteDate.Length);
 | 
				
			||||||
 | 
					                for (int i = 0; i < byteDate.Length; i++)
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    bufferMax[dataLength + i] = byteDate[i];
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                logger.Info($"冰箱温度设定Max:【{Convert.ToHexString(bufferMax)}】");
 | 
				
			||||||
 | 
					                fridgeSerial.Write(bufferMax, 0, 8);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            catch (Exception ex)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                logger.Info($"获取冰箱温度发生异常:ex:{ex.Message}");
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        /// <summary>
 | 
				
			||||||
 | 
					        /// 获取冰箱温度
 | 
				
			||||||
 | 
					        /// </summary>
 | 
				
			||||||
 | 
					        /// <returns></returns>
 | 
				
			||||||
 | 
					        public async Task<float> GetFridgeTemperature(int iIndex)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            float temperature = 0.0f;
 | 
				
			||||||
 | 
					            try
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                fridgeSerial.DiscardInBuffer();
 | 
				
			||||||
 | 
					                byte bAddress;
 | 
				
			||||||
 | 
					                if (iIndex == 1)
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    bAddress = 0x01;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                else
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    bAddress = 0x02;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                byte[] buffer = new byte[] { bAddress, 0x03, 0x10, 0x02, 0x00, 0x01, 0x21, 0x0A };
 | 
				
			||||||
 | 
					                //byte[] buffer = new byte[] { 0x01, 0x03, 0x10, 0x02, 0x00, 0x01 };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                ////获取数组CRC校验码
 | 
				
			||||||
 | 
					                //byte[] byteDate = CRC16MODBUS.CrcModBus(buffer);
 | 
				
			||||||
 | 
					                ////Array.Reverse(byteDate);
 | 
				
			||||||
 | 
					                //int dataLength = buffer.Length;
 | 
				
			||||||
 | 
					                //Array.Resize(ref buffer, dataLength + byteDate.Length);
 | 
				
			||||||
 | 
					                //for (int i = 0; i < byteDate.Length; i++)
 | 
				
			||||||
 | 
					                //{
 | 
				
			||||||
 | 
					                //    buffer[dataLength + i] = byteDate[i];
 | 
				
			||||||
 | 
					                //}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                logger.Info($"获取冰箱温度【{Convert.ToHexString(buffer)}】");
 | 
				
			||||||
 | 
					                fridgeSerial.Write(buffer, 0, 8);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                byte[] retByte = await GetBufferByPort(fridgeSerial, 7);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                logger.Info($"获取冰箱温度返回【{Convert.ToHexString(retByte)}】");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                if (retByte != null && retByte.Length >= 7)
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    var hight = retByte[3];
 | 
				
			||||||
 | 
					                    var low = retByte[4];
 | 
				
			||||||
 | 
					                    int iHight = Convert.ToInt32(hight << 8);
 | 
				
			||||||
 | 
					                    int iLow = Convert.ToInt32(retByte[4]);
 | 
				
			||||||
 | 
					                    temperature = Convert.ToSingle(iHight + iLow) / 10;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            catch (Exception ex)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                logger.Info($"获取冰箱温度发生异常:ex:{ex.Message}");
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            return temperature;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        /// <summary>
 | 
				
			||||||
 | 
					        /// 设置冰箱温度
 | 
				
			||||||
 | 
					        /// </summary>
 | 
				
			||||||
 | 
					        /// <returns></returns>
 | 
				
			||||||
 | 
					        public async Task<float> SetFridgeTemperature(float temperature, int iIndex)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            int tpt = (int)temperature * 10;
 | 
				
			||||||
 | 
					            byte Temperature = (byte)(tpt & 0xff);
 | 
				
			||||||
 | 
					            try
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                //if (!FridgeOperate)
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    fridgeSerial.DiscardInBuffer();
 | 
				
			||||||
 | 
					                    byte bAddress;
 | 
				
			||||||
 | 
					                    if (iIndex == 1)
 | 
				
			||||||
 | 
					                    {
 | 
				
			||||||
 | 
					                        bAddress = 0x01;
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                    else
 | 
				
			||||||
 | 
					                    {
 | 
				
			||||||
 | 
					                        bAddress = 0x02;
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                    //byte[] buffer = new byte[] { 0x01, 0x03, 0x10, 0x02, 0x00, 0x01, 0x21,0x0A };
 | 
				
			||||||
 | 
					                    byte[] buffer = new byte[] { bAddress, 0x06, 0x10, 0x02, 0x00, (byte)Temperature };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    //获取数组CRC校验码
 | 
				
			||||||
 | 
					                    byte[] byteDate = CRC16MODBUS.CrcModBus(buffer);
 | 
				
			||||||
 | 
					                    //Array.Reverse(byteDate);
 | 
				
			||||||
 | 
					                    int dataLength = buffer.Length;
 | 
				
			||||||
 | 
					                    Array.Resize(ref buffer, dataLength + byteDate.Length);
 | 
				
			||||||
 | 
					                    for (int i = 0; i < byteDate.Length; i++)
 | 
				
			||||||
 | 
					                    {
 | 
				
			||||||
 | 
					                        buffer[dataLength + i] = byteDate[i];
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                    logger.Info($"设置冰箱温度【{Convert.ToHexString(buffer)}】");
 | 
				
			||||||
 | 
					                    fridgeSerial.Write(buffer, 0, 8);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    await GetBufferByPort(fridgeSerial, 8);
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            catch (Exception ex)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                logger.Info($"获取冰箱温度发生异常:ex:{ex.Message}");
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            return temperature;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        /// <summary>
 | 
				
			||||||
 | 
					        /// 冰箱延迟报警
 | 
				
			||||||
 | 
					        /// </summary>
 | 
				
			||||||
 | 
					        /// <returns></returns>
 | 
				
			||||||
 | 
					        public async Task FridgeDelayWarm(int iIndex)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            try
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                //if (!FridgeOperate)
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    fridgeSerial.DiscardInBuffer();
 | 
				
			||||||
 | 
					                    byte bAddress;
 | 
				
			||||||
 | 
					                    if (iIndex == 1)
 | 
				
			||||||
 | 
					                    {
 | 
				
			||||||
 | 
					                        bAddress = 0x01;
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                    else
 | 
				
			||||||
 | 
					                    {
 | 
				
			||||||
 | 
					                        bAddress = 0x02;
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                    byte[] buffer = new byte[] { bAddress, 0x06, 0x10, 0xCD, 0x00, 0x01, 0xDD, 0x35 };
 | 
				
			||||||
 | 
					                    //byte[] buffer = new byte[] { 0x01, 0x06, 0x10, 0xCD, 0x00, 0x01 };
 | 
				
			||||||
 | 
					                    ////获取数组CRC校验码
 | 
				
			||||||
 | 
					                    //byte[] byteDate = CRC16MODBUS.CrcModBus(buffer);
 | 
				
			||||||
 | 
					                    ////Array.Reverse(byteDate);
 | 
				
			||||||
 | 
					                    //int dataLength = buffer.Length;
 | 
				
			||||||
 | 
					                    //Array.Resize(ref buffer, dataLength + byteDate.Length);
 | 
				
			||||||
 | 
					                    //for (int i = 0; i < byteDate.Length; i++)
 | 
				
			||||||
 | 
					                    //{
 | 
				
			||||||
 | 
					                    //    buffer[dataLength + i] = byteDate[i];
 | 
				
			||||||
 | 
					                    //}
 | 
				
			||||||
 | 
					                    logger.Info($"冰箱延迟报警【{Convert.ToHexString(buffer)}】");
 | 
				
			||||||
 | 
					                    fridgeSerial.Write(buffer, 0, 8);
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            catch (Exception ex)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                logger.Info($"获取冰箱温度发生异常:ex:{ex.Message}");
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        #endregion
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -47,6 +47,7 @@ internal class Program
 | 
				
			||||||
        appBuilder.Services.Configure<SettingConfig>(config.GetSection("setting"));
 | 
					        appBuilder.Services.Configure<SettingConfig>(config.GetSection("setting"));
 | 
				
			||||||
        appBuilder.Services.Configure<PortConfig>(config.GetSection("port"));
 | 
					        appBuilder.Services.Configure<PortConfig>(config.GetSection("port"));
 | 
				
			||||||
        appBuilder.Services.Configure<DrawerConfig>(config.GetSection("drawer"));
 | 
					        appBuilder.Services.Configure<DrawerConfig>(config.GetSection("drawer"));
 | 
				
			||||||
 | 
					        appBuilder.Services.Configure<fridgeConfig>(config.GetSection("fridge"));
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
        // i18n
 | 
					        // i18n
 | 
				
			||||||
        //appBuilder.Services.AddI18nText();
 | 
					        //appBuilder.Services.AddI18nText();
 | 
				
			||||||
| 
						 | 
					@ -62,6 +63,8 @@ internal class Program
 | 
				
			||||||
        appBuilder.Services.AddScoped<IDrugInfoDao, DrugInfoDao>();
 | 
					        appBuilder.Services.AddScoped<IDrugInfoDao, DrugInfoDao>();
 | 
				
			||||||
        appBuilder.Services.AddScoped<IMachineRecordDao, MachineRecordDao>();
 | 
					        appBuilder.Services.AddScoped<IMachineRecordDao, MachineRecordDao>();
 | 
				
			||||||
        appBuilder.Services.AddScoped<IInOutInvoiceDao, InOutInvoiceDao>();
 | 
					        appBuilder.Services.AddScoped<IInOutInvoiceDao, InOutInvoiceDao>();
 | 
				
			||||||
 | 
					        appBuilder.Services.AddScoped<ISettingManuDao, SettingManuDao>();
 | 
				
			||||||
 | 
					        appBuilder.Services.AddScoped<IPlanDao, PlanDao>();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        //自选取药
 | 
					        //自选取药
 | 
				
			||||||
        appBuilder.Services.AddScoped<ISelfTakeDao, SelfTakeDao>();
 | 
					        appBuilder.Services.AddScoped<ISelfTakeDao, SelfTakeDao>();
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,94 @@
 | 
				
			||||||
 | 
					@inherits LayoutComponentBase
 | 
				
			||||||
 | 
					@* @page "/manage/setting" *@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@layout MainLayout
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<div class="app-container">
 | 
				
			||||||
 | 
					    <div class="sidebar">
 | 
				
			||||||
 | 
					        <RadzenPanelMenu>
 | 
				
			||||||
 | 
					            @foreach (var menuItem in menuItems)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                @if (menuItem.Children.Any())
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    <RadzenPanelMenuItem Text="@menuItem.Name" Icon="@menuItem.Icon">
 | 
				
			||||||
 | 
					                        @foreach (var child in menuItem.Children)
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            <RadzenPanelMenuItem Text="@child.Name" Icon="@child.Icon" />
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                    </RadzenPanelMenuItem>
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                else
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    <RadzenPanelMenuItem Text="@menuItem.Name" Icon="@menuItem.Icon" Path="@menuItem.Path" />
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        </RadzenPanelMenu>
 | 
				
			||||||
 | 
					    </div>
 | 
				
			||||||
 | 
					    <!-- 右侧内容区域 -->
 | 
				
			||||||
 | 
					    <div class="main">
 | 
				
			||||||
 | 
					        <div class="content">
 | 
				
			||||||
 | 
					             @Body 
 | 
				
			||||||
 | 
					        </div>
 | 
				
			||||||
 | 
					    </div>
 | 
				
			||||||
 | 
					</div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<style>
 | 
				
			||||||
 | 
					    .app-container {
 | 
				
			||||||
 | 
					        display: flex;
 | 
				
			||||||
 | 
					        height: 100vh;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    .sidebar {
 | 
				
			||||||
 | 
					        width: 250px;
 | 
				
			||||||
 | 
					        background-color: #f8f9fa;
 | 
				
			||||||
 | 
					        border-right: 1px solid #dee2e6;
 | 
				
			||||||
 | 
					        height: 100vh;
 | 
				
			||||||
 | 
					        display: flex;
 | 
				
			||||||
 | 
					        flex-direction: column;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    .sidebar-header {
 | 
				
			||||||
 | 
					        padding: 1rem;
 | 
				
			||||||
 | 
					        border-bottom: 1px solid #dee2e6;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    .main {
 | 
				
			||||||
 | 
					        flex: 1;
 | 
				
			||||||
 | 
					        display: flex;
 | 
				
			||||||
 | 
					        flex-direction: column;
 | 
				
			||||||
 | 
					        height: 100vh;
 | 
				
			||||||
 | 
					        overflow: auto;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    .top-row {
 | 
				
			||||||
 | 
					        height: 60px;
 | 
				
			||||||
 | 
					        border-bottom: 1px solid #dee2e6;
 | 
				
			||||||
 | 
					        display: flex;
 | 
				
			||||||
 | 
					        align-items: center;
 | 
				
			||||||
 | 
					        padding: 0 1rem;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    .content {
 | 
				
			||||||
 | 
					        flex: 1;
 | 
				
			||||||
 | 
					        padding: 1rem;
 | 
				
			||||||
 | 
					        overflow-y: auto;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					</style>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@inject NavigationManager Navigation
 | 
				
			||||||
 | 
					@inject ISettingManuDao settingManuDao;
 | 
				
			||||||
 | 
					@code {
 | 
				
			||||||
 | 
					    RadzenPanelMenu panelMenu;
 | 
				
			||||||
 | 
					    List<SettingManu> menuItems = new();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    protected override async Task OnInitializedAsync()
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        menuItems = await settingManuDao.GetMenuItemsAsync();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    // async void jump2Page(string path)
 | 
				
			||||||
 | 
					    // {
 | 
				
			||||||
 | 
					    //     Navigation.NavigateTo(path);
 | 
				
			||||||
 | 
					    //     //可以在这里添加其他逻辑,例如记录导航历史或更新状态
 | 
				
			||||||
 | 
					    //     Console.WriteLine($"Navigating to: {path}");
 | 
				
			||||||
 | 
					    // }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,42 @@
 | 
				
			||||||
 | 
					using System;
 | 
				
			||||||
 | 
					using System.Collections.Generic;
 | 
				
			||||||
 | 
					using System.Linq;
 | 
				
			||||||
 | 
					using System.Text;
 | 
				
			||||||
 | 
					using System.Threading.Tasks;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace MasaBlazorApp3.Util
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    public class CRC16MODBUS
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        /// Name: CRC-16/MODBUS    x16+x15+x2+1
 | 
				
			||||||
 | 
					        /// Poly: 0x8005
 | 
				
			||||||
 | 
					        /// Init: 0xFFFF
 | 
				
			||||||
 | 
					        /// Refin: true
 | 
				
			||||||
 | 
					        /// Refout: true
 | 
				
			||||||
 | 
					        /// Xorout: 0x0000
 | 
				
			||||||
 | 
					        ///******************************添加数据CRC16MODBUS校验位*******************************************
 | 
				
			||||||
 | 
					        public static byte[] CrcModBus(byte[] buffer, int start = 0, int len = 0)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            if (buffer == null || buffer.Length == 0) return null;
 | 
				
			||||||
 | 
					            if (start < 0) return null;
 | 
				
			||||||
 | 
					            if (len == 0) len = buffer.Length - start;
 | 
				
			||||||
 | 
					            int length = start + len;
 | 
				
			||||||
 | 
					            if (length > buffer.Length) return null;
 | 
				
			||||||
 | 
					            ushort crc = 0xFFFF;// Initial value
 | 
				
			||||||
 | 
					            for (int i = start; i < length; i++)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                crc ^= buffer[i];
 | 
				
			||||||
 | 
					                for (int j = 0; j < 8; j++)
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    if ((crc & 1) > 0)
 | 
				
			||||||
 | 
					                        crc = (ushort)((crc >> 1) ^ 0xA001);// 0xA001 = reverse 0x8005
 | 
				
			||||||
 | 
					                    else
 | 
				
			||||||
 | 
					                        crc = (ushort)(crc >> 1);
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            byte[] ret = BitConverter.GetBytes(crc);
 | 
				
			||||||
 | 
					            //Array.Reverse(ret);
 | 
				
			||||||
 | 
					            return ret;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -11,7 +11,8 @@
 | 
				
			||||||
    "loginMode": 1,
 | 
					    "loginMode": 1,
 | 
				
			||||||
    "opFirst": true,
 | 
					    "opFirst": true,
 | 
				
			||||||
    //自动退出登录时间,单位秒(0不自动退出)
 | 
					    //自动退出登录时间,单位秒(0不自动退出)
 | 
				
			||||||
    "autoOutLog": 0
 | 
					    "autoOutLog": 0,
 | 
				
			||||||
 | 
					    "boxMachineId": "DM5"
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  "port": {
 | 
					  "port": {
 | 
				
			||||||
    "drawerPortPath": "COM1",
 | 
					    "drawerPortPath": "COM1",
 | 
				
			||||||
| 
						 | 
					@ -20,13 +21,23 @@
 | 
				
			||||||
    "canBusPortPath": "COM31",
 | 
					    "canBusPortPath": "COM31",
 | 
				
			||||||
    "canBusExsit": true,
 | 
					    "canBusExsit": true,
 | 
				
			||||||
    "doorAddr": 0,
 | 
					    "doorAddr": 0,
 | 
				
			||||||
    "storageBoxAddr": 0
 | 
					    "storageBoxAddr": 0,
 | 
				
			||||||
 | 
					    "fridgePortExist": false,
 | 
				
			||||||
 | 
					    "fridgePortPath": "COM3"
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  "drawer": {
 | 
					  "drawer": {
 | 
				
			||||||
    "single": [ 3 ],
 | 
					    "single": [ 3 ],
 | 
				
			||||||
    "weigh": [ 4 ],
 | 
					    "weigh": [ 4 ],
 | 
				
			||||||
    "box": [ 4 ],
 | 
					    "box": [ 4 ],
 | 
				
			||||||
    "label": [ 4 ]
 | 
					    "label": [ 4 ]
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  "fridge": {
 | 
				
			||||||
 | 
					    //冰箱温度区间
 | 
				
			||||||
 | 
					    "temperatureRange": "2-8",
 | 
				
			||||||
 | 
					    //冰箱状态1关闭;0打开
 | 
				
			||||||
 | 
					    "fridgeState": 0,
 | 
				
			||||||
 | 
					    //冰箱报警状态1关闭;0打开
 | 
				
			||||||
 | 
					    "alertState": 0
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
		Loading…
	
		Reference in New Issue