398 lines
		
	
	
		
			17 KiB
		
	
	
	
		
			C#
		
	
	
	
			
		
		
	
	
			398 lines
		
	
	
		
			17 KiB
		
	
	
	
		
			C#
		
	
	
	
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<ChannelStock>? channelStocks;
 | 
						||
        public List<ChannelStock>? ChannelStocks
 | 
						||
        {
 | 
						||
            get => channelStocks;
 | 
						||
            set => SetProperty(ref channelStocks, value);
 | 
						||
        }
 | 
						||
        private List<ChannelList>? _channelLists;
 | 
						||
        public List<ChannelList>? _ChannelLists
 | 
						||
        {
 | 
						||
            get => _channelLists;
 | 
						||
            set => SetProperty(ref _channelLists, value);
 | 
						||
        }
 | 
						||
        private ChannelList? _channelList;
 | 
						||
        public ChannelList? _ChannelList
 | 
						||
        {
 | 
						||
            get => _channelList;
 | 
						||
            set => SetProperty(ref _channelList, value);
 | 
						||
        }
 | 
						||
 | 
						||
        List<ChannelStock> selectedStock = new List<ChannelStock>();
 | 
						||
        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;
 | 
						||
 | 
						||
        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<IsSelectedEvent>().Unsubscribe(SetIsSelected);
 | 
						||
        }
 | 
						||
 | 
						||
        public void OnNavigatedTo(NavigationContext navigationContext)
 | 
						||
        {
 | 
						||
            //_eventAggregator.GetEvent<IsSelectedEvent>().Subscribe(SetIsSelected);
 | 
						||
            RequestData();
 | 
						||
        }
 | 
						||
        private void RequestData()
 | 
						||
        {
 | 
						||
            _ChannelLists?.Clear();
 | 
						||
            ChannelStocks?.Clear();
 | 
						||
            ChannelStocks = SqlSugarHelper.Db.Queryable<ChannelStock>()
 | 
						||
                .Includes<ChannelList>(cs => cs.ChannelLst)
 | 
						||
                .Includes<DrugInfo>(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<int> DrawerNoList = ChannelStocks.Select(cs => cs.DrawerNo).Distinct().ToList();
 | 
						||
                List<ChannelList> channelLists = new List<ChannelList>();
 | 
						||
                for (int i = 0; i < DrawerNoList.Count; i++)
 | 
						||
                {
 | 
						||
                    ChannelList channelList = SqlSugarHelper.Db.Queryable<ChannelList>()
 | 
						||
                        .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<ChannelStock>();
 | 
						||
                    }
 | 
						||
                    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<SnackbarEvent>().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<SnackbarEvent>().Publish(alertMsg);
 | 
						||
                                logger.Info($"网口连接异常,正在重试{ex.Message}");
 | 
						||
                                _socketHelper.OpenStatus = false;
 | 
						||
                                return;
 | 
						||
                            }
 | 
						||
                            Thread.Sleep(100);
 | 
						||
                        }
 | 
						||
                    }
 | 
						||
                    int iException = 0;
 | 
						||
                    Thread.Sleep(200);
 | 
						||
                    new PromiseUtil<int>().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<SnackbarEvent>().Publish(alertMsg);
 | 
						||
                            logger.Info($"网口连接异常,正在重试{ex.Message}");
 | 
						||
                            next();
 | 
						||
                        }
 | 
						||
                    });
 | 
						||
                }
 | 
						||
                else
 | 
						||
                {
 | 
						||
                    AlertMsg alertMsg = new AlertMsg
 | 
						||
                    {
 | 
						||
                        Message = $"未选择手术间,请先选择手术间",
 | 
						||
                        Type = MsgType.ERROR,
 | 
						||
                    };
 | 
						||
                    _eventAggregator.GetEvent<SnackbarEvent>().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();
 | 
						||
                        // 更新交接柜状态为 已取药未入库
 | 
						||
                        SqlSugarHelper.Db.Updateable(new ChannelList()
 | 
						||
                        {
 | 
						||
                            State = 0
 | 
						||
                        }).UpdateColumns(it => it.State).Where(it => it.DrawerNo == _ChannelList.DrawerNo).ExecuteCommand();
 | 
						||
 | 
						||
                        //List<ChannelStock> 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<SnackbarEvent>().Publish(alertMsg);
 | 
						||
                }
 | 
						||
                if (!f.IsSuccess)
 | 
						||
                {
 | 
						||
                    AlertMsg alertMsg = new AlertMsg
 | 
						||
                    {
 | 
						||
                        Message = "操作失败!",
 | 
						||
                        Type = MsgType.ERROR,
 | 
						||
                    };
 | 
						||
                    _eventAggregator.GetEvent<SnackbarEvent>().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"));
 | 
						||
            }
 | 
						||
        }
 | 
						||
    }
 | 
						||
}
 |