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); } private List? _channelLists; public List? _ChannelLists { get => _channelLists; set => SetProperty(ref _channelLists, value); } private ChannelList? _channelList; public ChannelList? _ChannelList { get => _channelList; set => SetProperty(ref _channelList, value); } List selectedStock = new List(); private object _finishStatus = Visibility.Collapsed; public object FinishStatus { get => _finishStatus; set => SetProperty(ref _finishStatus, value); } private bool _openStatusBtn = false; public bool OpenStatusBtn { get => _openStatusBtn; set => SetProperty(ref _openStatusBtn, value); } IDialogService _dialogService; IEventAggregator _eventAggregator; //private PortUtil _portUtil; SocketHelper _socketHelper; private static readonly DateTime Jan1st1970 = new DateTime (1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); 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() { _ChannelLists?.Clear(); ChannelStocks?.Clear(); 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(); if (ChannelStocks != null && ChannelStocks.Count > 0) { //2)查询channel_list将1)中查询的添加到channel_list的channel_stock里供页面呈现显示 List DrawerNoList = ChannelStocks.Select(cs => cs.DrawerNo).Distinct().ToList(); List channelLists = new List(); for (int i = 0; i < DrawerNoList.Count; i++) { ChannelList channelList = SqlSugarHelper.Db.Queryable() .Where(cl => cl.MachineId == (ConfigurationManager.AppSettings["jj_machineId"] ?? "DM5") && cl.DrawerNo == DrawerNoList[i]) .OrderBy(cl => cl.Id) .OrderBy(cl => cl.DrawerNo) .First(); if (channelList.channelStocks == null) { channelList.channelStocks = new List(); } channelList.channelStocks.AddRange(ChannelStocks.Where(cs => cs.DrawerNo == DrawerNoList[i]).ToList()); //if (channelList != null) //{ // channelList.State = 1;//统一将所有的状态设置为已取药待入库 channelLists.Add(channelList); //} } _ChannelLists = channelLists; } else { _ChannelLists = null; } } //开药箱放入药品 public DelegateCommand OpenBoxCommand { get => new DelegateCommand(() => { if (_ChannelList == null || _ChannelList.channelStocks == null) { AlertMsg alertMsg = new AlertMsg { Message = "请先选择数据行", Type = MsgType.ERROR, }; _eventAggregator.GetEvent().Publish(alertMsg); return; } //selectedStock = ChannelStocks.FindAll(cs => cs.ChannelLst.IsSelected).ToList(); selectedStock = _ChannelList.channelStocks.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.OpenStatus = true; //_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}"); _socketHelper.OpenStatus = false; return; } Thread.Sleep(100); } } int iException = 0; Thread.Sleep(200); new PromiseUtil().taskAsyncLoop(200, 0, async (options, next, stop) => { _socketHelper.IsMultiThread = true; try { if (_socketHelper.OpenStatus) { //bool[] boolsl = ModbusHelper.GetInstance().GetAllBoxState(); _socketHelper.SendMessage(new MyBaseMessage() { lockNo = 0x33, functionCode = 4, delay = 2 }); //ModbusHelper.SpeakAsync($"i为{i};状态为:{_socketHelper.OpenStatus}"); //bool state = Array.TrueForAll(boolsl, b => b == false); if (_socketHelper.OpenStatus) { logger.Info($"OpenStatus:{_socketHelper.OpenStatus}"); //if (i == 0) //{ // //ModbusHelper.SpeakAsync("请及时关闭药箱"); // i = 10; //} OpenStatusBtn = true; next(); } else { logger.Info($"OpenStatus:{_socketHelper.OpenStatus}"); _socketHelper.dateTime = DateTime.Now; _socketHelper.IsMultiThread = false; FinishStatus = Visibility.Visible; OpenStatusBtn = false; stop(); } } else { _socketHelper.dateTime = DateTime.Now; _socketHelper.IsMultiThread = false; FinishStatus = Visibility.Visible; OpenStatusBtn = false; stop(); } iException = 0; } catch (Exception ex) { iException++; if (iException >= 3) { _socketHelper.OpenStatus = false; FinishStatus = Visibility.Visible; OpenStatusBtn = false; } // _socketHelper.OpenStatus = false; AlertMsg alertMsg = new AlertMsg { Message = $"网口连接异常,正在重试{ex.Message}", Type = MsgType.ERROR, }; _eventAggregator.GetEvent().Publish(alertMsg); logger.Info($"网口连接异常,正在重试{ex.Message}"); next(); } }); } 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(); //} // 更新交接柜状态为 已取药未入库 //SqlSugarHelper.Db.Updateable(new ChannelList() //{ // State = 0 //}).UpdateColumns(it => it.State).Where(it => it.DrawerNo == _ChannelList.DrawerNo).ExecuteCommand(); for (int i = 0; i < selectedStock.Count; i++) { int iUpdateResult = SqlSugarHelper.Db.Updateable() .SetColumns(cs => new ChannelStock() { State = 0 }) .Where(cs => cs.DrawerNo == selectedStock[i].DrawerNo && cs.DrugId == selectedStock[i].DrugId && cs.MachineId == selectedStock[i].MachineId) .ExecuteCommand(); string InvoiceId = "AddJiaoJieFromDM_" + CurrentTimeMillis(); // 保存记录 SqlSugarHelper.Db.Insertable(new MachineRecord() { MachineId = selectedStock[i].MachineId, DrawerNo = selectedStock[i].DrawerNo, ColNo = selectedStock[i].ColNo, DrugId = selectedStock[i].DrugId, ManuNo = selectedStock[i].ManuNo, EffDate = !String.IsNullOrEmpty(selectedStock[i].EffDate) ? DateTime.ParseExact(selectedStock[i].EffDate, "yyyy-MM-dd", System.Globalization.CultureInfo.CurrentCulture) : null, Operator = HomeWindowViewModel.Operator?.Id, Reviewer = HomeWindowViewModel.Reviewer?.Id, OperationTime = DateTime.Now, Quantity = selectedStock[i].Quantity, Type = 2, InvoiceId =$"交接柜药品入库{selectedStock[i].DrugId}-{selectedStock[i].AddToJJNum}" //,StockQuantity = nowChannels.Sum(it => it.Quantity), //CheckQuantity = it.CheckQuantity }).ExecuteCommand(); } selectedStock.ForEach(cs => { cs.Quantity = cs.Quantity + cs.AddToJJNum; //cs.NeedNum = 0; cs.AddToJJNum = 0; cs.State = 0; }); SqlSugarHelper.Db.Updateable(selectedStock).ExecuteCommand(); //List jiaojie = selectedStock.GroupBy(cs => cs.DrugId).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) { FinishStatus = Visibility.Collapsed; 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 long CurrentTimeMillis() { return (long)(DateTime.UtcNow - Jan1st1970).TotalMilliseconds; } //刷新 public DelegateCommand QueryCommand { get => new DelegateCommand(() => RequestData()); } //设置选中药箱的复选框状态 private void SetIsSelected(ChannelStock channelStock) { if (channelStock != null) { if (channelStock.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")); } } } }