using DM_Weight.Models; using DM_Weight.msg; using DM_Weight.Port; using DM_Weight.util; using log4net; using Prism.Commands; using Prism.Events; using Prism.Mvvm; using Prism.Regions; using Prism.Services.Dialogs; using System; using System.Collections.Generic; using System.ComponentModel; using System.Configuration; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows; using System.Windows.Data; namespace DM_Weight.ViewModels { public class AdditionWindowViewModel : BindableBase, INavigationAware, IRegionMemberLifetime { public bool KeepAlive => false; private readonly ILog logger = LogManager.GetLogger(typeof(AdditionWindowViewModel)); private List channelStocks; public List ChannelStocks { get => channelStocks; set => SetProperty(ref channelStocks, value); } List selectedStock = new List(); private object _finishStatus = Visibility.Collapsed; public object FinishStatus { get => _finishStatus; set => SetProperty(ref _finishStatus, value); } IDialogService _dialogService; IEventAggregator _eventAggregator; //private PortUtil _portUtil; SocketHelper _socketHelper; public AdditionWindowViewModel(IEventAggregator eventAggregator,SocketHelper socketHelper) { //_dialogService = dialogService; _eventAggregator = eventAggregator; //_portUtil = portUtil; _socketHelper= socketHelper; } public bool IsNavigationTarget(NavigationContext navigationContext) { return true; } public void OnNavigatedFrom(NavigationContext navigationContext) { _eventAggregator.GetEvent().Unsubscribe(SetIsSelected); } public void OnNavigatedTo(NavigationContext navigationContext) { _eventAggregator.GetEvent().Subscribe(SetIsSelected); RequestData(); } private void RequestData() { ChannelStocks = SqlSugarHelper.Db.Queryable() .Includes(cs => cs.ChannelLst) .Includes(cs => cs.DrugInfo) .Where(cs => cs.MachineId == (ConfigurationManager.AppSettings["machineId"] ?? "DM5") && cs.AddToJJNum > 0) .OrderBy(cs => cs.DrawerNo) .OrderBy(cs => cs.DrugId) .ToList(); //ChannelStocks= ChannelStocks.GroupBy(it=>new {it.DrawerNo,it.DrugId}) // .Select(it=> // { // var ret = it.First(); // ret.Quantity = it.Sum(itx => itx.Quantity); // return ret; // }).ToList(); //ChannelStocks.ForEach(cs => cs.AddQuantity = cs.BaseQuantity - cs.Quantity); } //开药箱放入药品 public DelegateCommand OpenBoxCommand { get => new DelegateCommand(() => { selectedStock = ChannelStocks.FindAll(cs => cs.ChannelLst.IsSelected).ToList(); if (selectedStock != null && selectedStock.Count > 0) { selectedStock.ForEach(cs => cs.ChannelLst.State = 2); int drawerNo = -1; for (int i = 0; i < selectedStock.Count; i++) { if (!(drawerNo == selectedStock[i].DrawerNo)) { drawerNo = selectedStock[i].DrawerNo; // 保存数据 入库记录 SqlSugarHelper.Db.Insertable(new MachineRecord() { MachineId = "DM5", DrawerNo = drawerNo, Operator = HomeWindowViewModel.Operator?.Id, OperationTime = DateTime.Now, Type = 55, InvoiceId = "手术间补药", }).ExecuteCommand(); _socketHelper.speechSynthesizer.SpeakAsyncCancelAll(); _socketHelper.speechSynthesizer.Resume(); _socketHelper.SpeakAsync($"正在打开{selectedStock[i].DrawerNo}号手术间"); //ModbusHelper.GetInstance().OpenBoxDoor(selectedStock[i].DrawerNo - 1); try { _socketHelper.SendMessage(new MyBaseMessage() { lockNo = (short)(selectedStock[i].DrawerNo - 1) }); } catch (Exception ex) { AlertMsg alertMsg = new AlertMsg { Message = $"网口连接异常,正在重试{ex.Message}", Type = MsgType.ERROR, }; _eventAggregator.GetEvent().Publish(alertMsg); logger.Info($"网口连接异常,正在重试{ex.Message}"); return; } Thread.Sleep(100); } } //Task.Factory.StartNew(async () => //{ // bool loop = true; // while (loop) // { // await Task.Delay(1000); // bool[] boolsl = ModbusHelper.GetInstance().GetAllBoxState(); // bool state = Array.TrueForAll(boolsl, b => b == false); // if (state) // { // loop = false; // ModbusHelper.BoxOperate = false; // } // else // { // ModbusHelper.BoxOperate = true; // //ModbusHelper.SpeakAsync("药箱已打开,请及时关闭"); // } // } //}); } else { AlertMsg alertMsg = new AlertMsg { Message = $"未选择手术间,请先选择手术间", Type = MsgType.ERROR, }; _eventAggregator.GetEvent().Publish(alertMsg); return; } FinishStatus = Visibility.Visible; }); } //完成按钮 public DelegateCommand AddFinish { get => new DelegateCommand(() => { var f = SqlSugarHelper.Db.UseTran(() => { //更新 交接柜 库存信息 if (selectedStock != null && selectedStock.Count > 0) { //for (int j = 0; j < selectedStock.Count; j++) //{ // // 更新数据 交接柜 库存信息 // ChannelStock jiaojie_it = selectedStock[j]; // jiaojie_it.Quantity = jiaojie_it.AddToJJNum; // jiaojie_it.NeedNum = 0; // jiaojie_it.AddToJJNum = 0; //SqlSugarHelper.Db.Updateable(new ChannelStock() //{ // Quantity = jiaojie_it.AddToJJNum, // ManuNo = jiaojie_it.ManuNo, // //EffDate = it.EffDate, // //Id = jiaojie_it.Id, // DrugId=jiaojie_it.DrugId, // DrawerNo=jiaojie_it.DrawerNo, // MachineId=jiaojie_it.MachineId, //}).UpdateColumns(jiaojie_it => new { jiaojie_it.Quantity }).WhereColumns(jiaojie_it=>new { jiaojie_it.DrugId, jiaojie_it.DrawerNo, jiaojie_it.MachineId }).ExecuteCommand(); //} selectedStock.ForEach(cs => { cs.Quantity = cs.Quantity+cs.AddToJJNum; cs.NeedNum= 0; cs.AddToJJNum = 0; }); SqlSugarHelper.Db.Updateable(selectedStock).ExecuteCommand(); List jiaojie = selectedStock.GroupBy(cs => cs.DrawerNo).Select(cs => cs.FirstOrDefault()).ToList(); if (jiaojie != null && jiaojie.Count > 0) { for (int j = 0; j < jiaojie.Count; j++) { ChannelStock jiaojie_it = jiaojie[j]; ChannelList jiaojieList = new ChannelList(); jiaojieList.State = 0; jiaojieList.Id = jiaojie_it.ChannelLst.Id; //更新交接柜状态为0 var result = SqlSugarHelper.Db.Updateable(jiaojieList) .UpdateColumns(it => new { it.State, it.Id }).ExecuteCommand(); } } } }); 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); } }); } //刷新 public DelegateCommand QueryCommand { get => new DelegateCommand(() => RequestData()); } //设置选中药箱的复选框状态 private void SetIsSelected(ChannelStock channelStock) { if (channelStock != null) { if (channelStock.ChannelLst.State == 1) { channelStock.ChannelLst.IsSelected = !channelStock.ChannelLst.IsSelected; } else { return; } if (channelStock != null && ChannelStocks != null) { ChannelStocks = ChannelStocks.Select(x => { for (int i = 0; i < ChannelStocks.Count; i++) { if (ChannelStocks[i].DrawerNo == channelStock.DrawerNo) { ChannelStocks[i].ChannelLst = channelStock.ChannelLst; } } return x; }).ToList(); } ICollectionView vw = CollectionViewSource.GetDefaultView(ChannelStocks); vw.GroupDescriptions.Add(new PropertyGroupDescription("ChannelLst")); } } } }