using DM_Weight.Models; using DM_Weight.msg; using DM_Weight.Port; using DM_Weight.select; using DM_Weight.util; using log4net; using log4net.Repository.Hierarchy; using Prism.Commands; using Prism.Events; using Prism.Mvvm; using Prism.Regions; using Prism.Services.Dialogs; using System; using System.Collections.Generic; using System.Configuration; using System.Linq; using System.Linq.Expressions; using System.Text; using System.Threading.Tasks; namespace DM_Weight.ViewModels { public class CheckOrderNewWindowViewModel : BindableBase, INavigationAware, IRegionMemberLifetime { private readonly ILog logger = LogManager.GetLogger(typeof(CheckOrderNewWindowViewModel)); private int _pageNum = 1; public int PageNum { get => _pageNum; set { SetProperty(ref _pageNum, value); RequestData(); } } private int _pageCount = 1; public int PageCount { get => _pageCount; set { SetProperty(ref _pageCount, value); } } private int _pageSize = 10; public int PageSize { get => _pageSize; set { SetProperty(ref _pageSize, value); } } private int _totalCount = 0; public int TotalCount { get => _totalCount; set { SetProperty(ref _totalCount, value); } } //所选药箱号 private int _drawerNo = 0; public int DrawerNo { get => _drawerNo; set => SetProperty(ref _drawerNo, value); } private string _orderDate = DateTime.Now.ToString("yyyy-MM-dd"); /// /// 查询条件 处方日期 /// public string OrderDate { get { return _orderDate; } set { if (!String.IsNullOrEmpty(value)) { SetProperty(ref _orderDate, DateTime.Parse(value).ToString("yyyy-MM-dd")); } else { SetProperty(ref _orderDate, value); } RequestData(); } } private bool _isEnable = true; public bool IsEnable { get => _isEnable; set => SetProperty(ref _isEnable, value); } private int _status = 0; public int Status { get => _status; set { SetProperty(ref _status, value); } } private List _ordersList = new List(); public List OrderInfoList { get => _ordersList; set => SetProperty(ref _ordersList, value); } private List? _totalDrugList; public List? TotalDrugList { get => _totalDrugList; set => SetProperty(ref _totalDrugList, value); } private OrderInfo _selectOrderInfo; public OrderInfo selectOrderInfo { get => _selectOrderInfo; set => SetProperty(ref _selectOrderInfo, value); } IEventAggregator _eventAggregator; private PortUtil _portUtil; public CheckOrderNewWindowViewModel(PortUtil portUtil, IEventAggregator eventAggregator) { _portUtil = portUtil; _eventAggregator = eventAggregator; } private string? _searchValue; /// /// 查询条件 查询字段值 /// public string? SearchValue { get { return _searchValue; } set { SetProperty(ref _searchValue, value); RequestData(); } } void RequestData() { int totalCount = 0; if (DrawerNo > 0) { //查询当前药箱归属的药师 string currentDrawerUser = SqlSugarHelper.Db.Queryable().Where(cl => cl.DrawerNo == DrawerNo && cl.MachineId == "DM5").Select(cl => cl.BelongUser).First(); OrderInfoList = SqlSugarHelper.Db.Queryable() .Includes(oi=>oi._OrderDetail,od=>od.DrugInfo) //.Includes(cl => cl.channelStocks, cs => cs.DrugInfo,di=>di.drugBase) //.InnerJoin((oi, od) => oi.OrderNo == od.OrderNo) //.InnerJoin((oi, od, di) => od.DrugId == di.DrugId.ToString()) .WhereIF(OrderDate != null, oi => oi.RecvDate.ToString("yyyy-MM-dd") == OrderDate) .WhereIF(!String.IsNullOrEmpty(ConfigurationManager.AppSettings["storage"]), oi => oi.Pharmacy == ConfigurationManager.AppSettings["storage"]) .Where(oi => oi.DmStatus == 0) .Where(oi => oi.HisDispFlag == 0) .Where(oi => oi.CancelFlag == 0) .WhereIF(currentDrawerUser != null, oi => oi.DoctorCode == currentDrawerUser) .OrderBy(oi => oi.OrderId) .ToPageList(PageNum, PageSize, ref totalCount); if (OrderInfoList != null && OrderInfoList.Count() > 0) { OrderInfoList.ForEach(oi => oi.ItemIsChecked = true); TotalDrugList = OrderInfoList.Where(oi => oi.ItemIsChecked).GroupBy(oi => oi._OrderDetail.DrugInfo.DrugName).Select(oi => new TotalDrug { DrugName = oi.Key, TotalCount = oi.Sum(item => item._OrderDetail.Quantity) }).ToList(); } else { TotalDrugList = null; } TotalCount = totalCount; PageCount = (int)Math.Ceiling((double)TotalCount / PageSize); } } public DelegateCommand RowSelected { get => new DelegateCommand(() => { if (selectOrderInfo != null) { OrderInfoList = OrderInfoList.Select(x => { if (x.OrderNo == selectOrderInfo.OrderNo) { x.ItemIsChecked = !x.ItemIsChecked; } return x; }).ToList(); if (OrderInfoList != null && OrderInfoList.Count() > 0) { TotalDrugList = OrderInfoList.Where(oi => oi.ItemIsChecked).GroupBy(oi => oi._OrderDetail.DrugInfo.DrugName).Select(oi => new TotalDrug { DrugName = oi.Key, TotalCount = oi.Sum(item => item._OrderDetail.Quantity) }).ToList(); } } }); } public DelegateCommand Query { get => new DelegateCommand(() => { RequestData(); }); } //确认 public DelegateCommand CheckOrder { get => new DelegateCommand(() => { CheckOrderAction(); }); } void CheckOrderAction() { var confirmData = OrderInfoList.Where(oi => oi.ItemIsChecked == true).ToList(); if (confirmData.Count > 0) { var f = SqlSugarHelper.Db.UseTran(() => { string empChannelStock = string.Empty; for (int i = 0; i < confirmData.Count; i++) { OrderInfo oi = confirmData[i]; //更新处方状态 if (oi.DmStatus == 0) { SqlSugarHelper.Db.Updateable(new OrderInfo() { DmStatus = 1, OrderNo = oi.OrderNo }).UpdateColumns(it => new { it.DmStatus }).WhereColumns(it => new { it.OrderNo }).ExecuteCommand(); SqlSugarHelper.Db.Insertable(new OrderFinish() { OrderNo = oi.OrderNo, PatientId = oi.PatientId, Pharmacy = oi.Pharmacy, State = 1, Operator = HomeWindowViewModel.Operator?.Nickname, }); } Expression> updateExp = it => it.ManuNo == oi._OrderDetail.SetManuNo && it.EffDate == oi._OrderDetail.SetEffDate; ChannelStock cs = SqlSugarHelper.Db.Queryable().Where(cs => cs.DrugId == oi._OrderDetail.DrugId && cs.ManuNo == oi._OrderDetail.SetManuNo && cs.EffDate == oi._OrderDetail.SetEffDate && cs.MachineId.Equals(ConfigurationManager.AppSettings["machineId"] ?? "DM5")&&cs.DrawerNo==DrawerNo).First(); if (cs == null) { empChannelStock += $"{oi.OrderNo},{oi._OrderDetail.DrugId},{oi._OrderDetail.SetManuNo},{oi._OrderDetail.SetEffDate}"; continue; } cs.Quantity = cs.Quantity - oi._OrderDetail.Quantity; // 更新数据 库存信息 SqlSugarHelper.Db.Updateable(cs).UpdateColumns(it => new { it.Quantity }).ExecuteCommand(); if (cs != null) { SqlSugarHelper.Db.Insertable(new MachineRecord() { MachineId = ConfigurationManager.AppSettings["machineId"].ToString(), 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 = HomeWindowViewModel.Operator?.Id, Reviewer = HomeWindowViewModel.Reviewer?.Id, OperationTime = DateTime.Now, Quantity = oi._OrderDetail.Quantity, Type = 2, InvoiceId = oi.OrderNo //, StockQuantity = nowChannels.Sum(it => it.Quantity) }).ExecuteCommand(); } //保存账册 int iInsertResult = SqlSugarHelper.Db.Insertable(new AccountBookG2() { DrugId = oi._OrderDetail.DrugId, Type = 2, Department = oi.DeptName, OrderNo = oi.OrderNo, ManuNo = cs.ManuNo, EffDate = cs.EffDate, OutQuantity = oi._OrderDetail.Quantity, UserId1 = HomeWindowViewModel.Operator?.Id, UserId2 = HomeWindowViewModel.Reviewer?.Id, MachineId = ConfigurationManager.AppSettings["machineId"].ToString(), CreateDate = DateTime.Now.ToString("yyyy-MM-dd"), CreateTime = DateTime.Now, InvoiceNo = oi.OrderNo }).ExecuteCommand(); //修改凌晨生成的日结存与总结存数据 AccountBookG2 accountBookG2Day = SqlSugarHelper.Db.Queryable() .Where(ab => ab.MachineId.Equals(ConfigurationManager.AppSettings["machineId"].ToString())) .Where(ab => ab.Type == 3) .Where(ab => ab.DrugId == oi._OrderDetail.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._OrderDetail.Quantity; SqlSugarHelper.Db.Updateable(accountBookG2Day).ExecuteCommand(); } else { //生成日结存时可能没有该库位的绑定信息,需要写入日结存 int iDayResult = SqlSugarHelper.Db.Insertable(new AccountBookG2() { DrugId = oi._OrderDetail.DrugId, Type = 3, ManuNo = cs.ManuNo, EffDate = cs.EffDate, YQuantity = 0, ManuStock = oi._OrderDetail.Quantity, TotalStock = oi._OrderDetail.Quantity, UserId1 = HomeWindowViewModel.Operator?.Id, UserId2 = HomeWindowViewModel.Reviewer?.Id, MachineId = ConfigurationManager.AppSettings["machineId"].ToString(), CreateDate = DateTime.Now.ToString("yyyy-MM-dd"), InvoiceNo = "日结存" }).ExecuteCommand(); if (iDayResult <= 0) { logger.Info($"未写入日结存数据{oi._OrderDetail.DrugId}-{cs.ManuNo}-{cs.EffDate}-{cs.Quantity}"); } } //修改凌晨生成的日结存与总结存数据 AccountBookG2 accountBookG2Total = SqlSugarHelper.Db.Queryable() .Where(ab => ab.MachineId.Equals(ConfigurationManager.AppSettings["machineId"].ToString())) .Where(ab => ab.Type == 4) .Where(ab => ab.DrugId == oi._OrderDetail.DrugId) .Where(ab => ab.CreateDate == DateTime.Now.ToString("yyyy-MM-dd")).First(); if (accountBookG2Total != null) { accountBookG2Total.TotalStock = accountBookG2Total.TotalStock - oi._OrderDetail.Quantity; SqlSugarHelper.Db.Updateable(accountBookG2Total).ExecuteCommand(); } else { //生成总结存时可能没有该库位的绑定信息,需要写入总结存 int iTotalResult = SqlSugarHelper.Db.Insertable(new AccountBookG2() { DrugId = oi._OrderDetail.DrugId, Type = 4, YQuantity = 0, ManuStock = oi._OrderDetail.Quantity, TotalStock = oi._OrderDetail.Quantity, UserId1 = HomeWindowViewModel.Operator?.Id, UserId2 = HomeWindowViewModel.Reviewer?.Id, MachineId = ConfigurationManager.AppSettings["machineId"].ToString(), CreateDate = DateTime.Now.ToString("yyyy-MM-dd"), InvoiceNo = "总结存" }).ExecuteCommand(); if (iTotalResult <= 0) { logger.Info($"未写入总结存数据{oi._OrderDetail.DrugId}-{oi._OrderDetail.Quantity}"); } } } if (!string.IsNullOrEmpty(empChannelStock)) { AlertMsg alertMsg = new AlertMsg { Message = $"所选处方对应药品批次效期无库存{empChannelStock}", Type = MsgType.ERROR, }; _eventAggregator.GetEvent().Publish(alertMsg); logger.Info($"所选处方对应药品批次效期无库存{empChannelStock}"); } return true; }); if (f.Data) { RequestData(); AlertMsg alertMsg = new AlertMsg { Message = "所选处方已核对完成", Type = MsgType.SUCCESS, }; _eventAggregator.GetEvent().Publish(alertMsg); } if (!f.IsSuccess) { AlertMsg alertMsg = new AlertMsg { Message = "处方核对失败!", Type = MsgType.ERROR, }; _eventAggregator.GetEvent().Publish(alertMsg); } Status = 0; } else { AlertMsg alertMsg = new AlertMsg { Message = "请勾选要核对的处方数据", Type = MsgType.ERROR }; _eventAggregator.GetEvent().Publish(alertMsg); } } /// /// 选择药箱,打开药箱 /// public DelegateCommand UpdateDrawerNo { get => new DelegateCommand(OpenBoxAction); } public bool KeepAlive => false; public async void OpenBoxAction(string strDrawerNo) { DrawerNo = Convert.ToInt32(strDrawerNo)-1; if (DrawerNo > 0) { RequestData(); IsEnable = false; Status = 1; _portUtil.SpeakAsync($"正在打开{DrawerNo}号药箱"); //记录开药箱日志 SqlSugarHelper.Db.Insertable(new MachineRecord() { MachineId = "DM5", DrawerNo = DrawerNo, Operator = HomeWindowViewModel.Operator?.Id, OperationTime = DateTime.Now, Type = 55, InvoiceId = $"打开{DrawerNo}号药箱", }).ExecuteCommand(); ModbusHelper.GetInstance().OpenBoxDoor(DrawerNo); } } public void OnNavigatedTo(NavigationContext navigationContext) { RequestData(); //_eventAggregator.GetEvent().Subscribe(DoMyPrismEvent); } public bool IsNavigationTarget(NavigationContext navigationContext) { return true; } public void OnNavigatedFrom(NavigationContext navigationContext) { // 取消消息订阅 //_eventAggregator.GetEvent().Unsubscribe(DoMyPrismEvent); } void DoMyPrismEvent(DeviceMsg msg) { switch (msg.EventType) { // 药箱打开 case EventType.DRAWEROPEN: if (Status == 1) { Status = 2; } //记录开药箱日志 SqlSugarHelper.Db.Insertable(new MachineRecord() { MachineId = "DM5", DrawerNo = _portUtil.DrawerNo, Operator = HomeWindowViewModel.Operator?.Id, OperationTime = DateTime.Now, Type = 55, InvoiceId = $"打开{DrawerNo}号药箱", }).ExecuteCommand(); _portUtil.GetBoxStatus(); break; // 药箱关闭 case EventType.DRAWERCLOSE: //记录药箱操作日志 SqlSugarHelper.Db.Insertable(new MachineRecord() { MachineId = "DM5", DrawerNo = _portUtil.DrawerNo, Operator = HomeWindowViewModel.Operator?.Id, OperationTime = DateTime.Now, Type = 55, InvoiceId = "药箱关闭", }).ExecuteCommand(); if (Status == 2) { Status = 3; } IsEnable = true; _portUtil.Operate = false; break; // 打开失败 case EventType.OPENERROR: AlertMsg alertMsg = new AlertMsg { Message = msg.Message, Type = MsgType.ERROR }; _eventAggregator.GetEvent().Publish(alertMsg); IsEnable = true; Status = 0; //记录药箱操作日志 SqlSugarHelper.Db.Insertable(new MachineRecord() { MachineId = "DM5", DrawerNo = _portUtil.DrawerNo, Operator = HomeWindowViewModel.Operator?.Id, OperationTime = DateTime.Now, Type = 55, InvoiceId = "药箱打开失败", }).ExecuteCommand(); _portUtil.Operate = false; break; } } } public class TotalDrug { public string DrugName { get; set; } public int TotalCount { get; set; } } }