860 lines
		
	
	
		
			35 KiB
		
	
	
	
		
			C#
		
	
	
	
			
		
		
	
	
			860 lines
		
	
	
		
			35 KiB
		
	
	
	
		
			C#
		
	
	
	
using DM_Weight.Models;
 | 
						||
using DM_Weight.msg;
 | 
						||
using DM_Weight.Port;
 | 
						||
using DM_Weight.select;
 | 
						||
using DM_Weight.util;
 | 
						||
using log4net;
 | 
						||
using MaterialDesignThemes.Wpf;
 | 
						||
using Newtonsoft.Json.Linq;
 | 
						||
using Prism.Commands;
 | 
						||
using Prism.Events;
 | 
						||
using Prism.Mvvm;
 | 
						||
using Prism.Regions;
 | 
						||
using Prism.Services.Dialogs;
 | 
						||
using System;
 | 
						||
using System.Collections;
 | 
						||
using System.Collections.Generic;
 | 
						||
using System.Configuration;
 | 
						||
using System.Linq;
 | 
						||
using System.Text;
 | 
						||
using System.Threading;
 | 
						||
using System.Threading.Channels;
 | 
						||
using System.Threading.Tasks;
 | 
						||
using System.Windows.Media;
 | 
						||
 | 
						||
namespace DM_Weight.ViewModels
 | 
						||
{
 | 
						||
    public class SurgeryTakeDialogViewModel : BindableBase, IDialogAware, IRegionMemberLifetime
 | 
						||
    {
 | 
						||
        private static readonly DateTime Jan1st1970 = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
 | 
						||
        private readonly ILog logger = LogManager.GetLogger(typeof(OrderTakeDialogViewModel));
 | 
						||
        public string Title => "手术核销";
 | 
						||
 | 
						||
        private SurgicalSchedule _surgicalSchedule;
 | 
						||
        public SurgicalSchedule _SurgicalSchedule { get => _surgicalSchedule; set => SetProperty(ref _surgicalSchedule, value); }
 | 
						||
 | 
						||
        private List<MachineRecord> machineRecordList;
 | 
						||
        public List<MachineRecord> MachineRecordList { get => machineRecordList; set => SetProperty(ref machineRecordList, value); }
 | 
						||
 | 
						||
 | 
						||
        private string? _searchValue;
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// 查询条件 查询字段值
 | 
						||
        /// </summary>
 | 
						||
        public string? SearchValue
 | 
						||
        {
 | 
						||
            get { return _searchValue; }
 | 
						||
            set
 | 
						||
            {
 | 
						||
                SetProperty(ref _searchValue, value);
 | 
						||
                RequestData();
 | 
						||
            }
 | 
						||
        }
 | 
						||
 | 
						||
        public static List<OrderTakeSelect> StaticSelects = new()
 | 
						||
        {
 | 
						||
            new OrderTakeSelect
 | 
						||
            {
 | 
						||
                Code = "DrugName",
 | 
						||
                Name = "药品名称"
 | 
						||
            },
 | 
						||
            new OrderTakeSelect
 | 
						||
            {
 | 
						||
                Code = "PyCode",
 | 
						||
                Name = "拼音码"
 | 
						||
            },
 | 
						||
            new OrderTakeSelect
 | 
						||
            {
 | 
						||
                Code = "DrugBarcode",
 | 
						||
                Name = "药品条码"
 | 
						||
            },
 | 
						||
            new OrderTakeSelect
 | 
						||
            {
 | 
						||
                Code = "DrugId",
 | 
						||
                Name = "药品编码"
 | 
						||
            }
 | 
						||
        };
 | 
						||
 | 
						||
 | 
						||
        private List<OrderTakeSelect> _selects = StaticSelects;
 | 
						||
 | 
						||
        public List<OrderTakeSelect> Selects
 | 
						||
        {
 | 
						||
            get { return _selects; }
 | 
						||
            set
 | 
						||
            {
 | 
						||
                SetProperty(ref _selects, value);
 | 
						||
            }
 | 
						||
        }
 | 
						||
 | 
						||
        private int _totalCount = 0;
 | 
						||
        public int TotalCount { get => _totalCount; set => SetProperty(ref _totalCount, value); }
 | 
						||
 | 
						||
        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 = 9;
 | 
						||
        public int PageSize
 | 
						||
        {
 | 
						||
            get => _pageSize;
 | 
						||
            set
 | 
						||
            {
 | 
						||
                SetProperty(ref _pageSize, value);
 | 
						||
            }
 | 
						||
        }
 | 
						||
 | 
						||
        private int _status = 0;
 | 
						||
 | 
						||
        public int Status
 | 
						||
        {
 | 
						||
            get => _status; set => SetProperty(ref _status, value);
 | 
						||
        }
 | 
						||
 | 
						||
        private SolidColorBrush _colorBrush;
 | 
						||
 | 
						||
        public SolidColorBrush SnackbarBackground
 | 
						||
        {
 | 
						||
            get => _colorBrush;
 | 
						||
            set => SetProperty(ref _colorBrush, value);
 | 
						||
        }
 | 
						||
        private ISnackbarMessageQueue _snackbarMessageQueue = new SnackbarMessageQueue(TimeSpan.FromSeconds(3));
 | 
						||
 | 
						||
        public ISnackbarMessageQueue SnackbarMessageQueue
 | 
						||
        {
 | 
						||
            get => _snackbarMessageQueue;
 | 
						||
            set => SetProperty(ref _snackbarMessageQueue, value);
 | 
						||
        }
 | 
						||
 | 
						||
        List<ChannelStock> ReturnStockLst;
 | 
						||
 | 
						||
        private IEnumerable<IGrouping<int, ChannelStock>> enumerable;
 | 
						||
        private IEnumerator<IGrouping<int, ChannelStock>> enumerator;
 | 
						||
 | 
						||
        private OrderTakeSelect _selectedItem = StaticSelects[0];
 | 
						||
        /// <summary>
 | 
						||
        /// 查询条件 查询字段
 | 
						||
        /// </summary>
 | 
						||
        public OrderTakeSelect SelectedItem
 | 
						||
        {
 | 
						||
            get { return _selectedItem; }
 | 
						||
            set
 | 
						||
            {
 | 
						||
                SetProperty(ref _selectedItem, value);
 | 
						||
                RequestData();
 | 
						||
            }
 | 
						||
        }
 | 
						||
 | 
						||
        private MachineRecord selectedRecord;
 | 
						||
        public MachineRecord SelectedRecord { get => selectedRecord; set => SetProperty(ref selectedRecord, value); }
 | 
						||
 | 
						||
        private PortUtil _portUtil;
 | 
						||
        IEventAggregator _eventAggregator;
 | 
						||
        IDialogService _dialogService;
 | 
						||
        public SurgeryTakeDialogViewModel(PortUtil portUtil, IEventAggregator eventAggregator, IDialogService DialogService)
 | 
						||
        {
 | 
						||
            _dialogService = DialogService;
 | 
						||
            _portUtil = portUtil;
 | 
						||
            _eventAggregator = eventAggregator;
 | 
						||
        }
 | 
						||
 | 
						||
        public bool KeepAlive => false;
 | 
						||
 | 
						||
        public event Action<IDialogResult> RequestClose;
 | 
						||
 | 
						||
        public bool CanCloseDialog()
 | 
						||
        {
 | 
						||
            return Status == 0;
 | 
						||
        }
 | 
						||
 | 
						||
        public void OnDialogClosed()
 | 
						||
        {
 | 
						||
            // 取消消息订阅
 | 
						||
            _eventAggregator.GetEvent<PortUtilEvent>().Unsubscribe(DoMyPrismEvent);
 | 
						||
        }
 | 
						||
 | 
						||
        public void OnDialogOpened(IDialogParameters parameters)
 | 
						||
        {
 | 
						||
            _eventAggregator.GetEvent<PortUtilEvent>().Subscribe(DoMyPrismEvent);
 | 
						||
            SurgicalSchedule ss = parameters.GetValue<SurgicalSchedule>("SurgeryInfo");
 | 
						||
            _SurgicalSchedule = ss;
 | 
						||
            RequestData();
 | 
						||
        }
 | 
						||
        public async void RequestData()
 | 
						||
        {
 | 
						||
            int totalCount = 0;
 | 
						||
            MachineRecordList = SqlSugarHelper.Db.Queryable<MachineRecord>()
 | 
						||
                .Includes<DrugInfo>(mr => mr.DrugInfo)
 | 
						||
                .Includes<UserList>(mr => mr.User)
 | 
						||
                .Includes<SurgicalScheduleDetail>(mr => mr._SurgicalScheduleDetailLst)
 | 
						||
                .Where(mr => mr.Type == 2)
 | 
						||
                .Where(mr => mr.Status < 2)
 | 
						||
                .Where(mr => mr.MachineId.Equals(ConfigurationManager.AppSettings["machineId"] ?? "DM3"))
 | 
						||
                //.WhereIF(QueryDate != null, mr => mr.OperationTime.ToString("yyyy-MM-dd") == QueryDate)
 | 
						||
                .WhereIF(!String.IsNullOrEmpty(SearchValue) && SelectedItem.Code.Equals("DrugId"), (mr) => mr.DrugInfo.DrugId.ToString().Contains(SearchValue))
 | 
						||
                .WhereIF(!String.IsNullOrEmpty(SearchValue) && SelectedItem.Code.Equals("DrugName"), (mr) => mr.DrugInfo.DrugName.Contains(SearchValue))
 | 
						||
                .WhereIF(!String.IsNullOrEmpty(SearchValue) && SelectedItem.Code.Equals("PyCode"), (mr) => mr.DrugInfo.PyCode.Contains(SearchValue))
 | 
						||
                .WhereIF(!String.IsNullOrEmpty(SearchValue) && SelectedItem.Code.Equals("DrugBarcode"), (mr) => mr.DrugInfo.DrugBarcode.Contains(SearchValue))
 | 
						||
                .OrderBy(mr => mr.OperationTime)
 | 
						||
               .ToPageList(PageNum, PageSize, ref totalCount);
 | 
						||
 | 
						||
            MachineRecordList.ForEach(mr => mr.HasCheckNum = mr._SurgicalScheduleDetailLst.Sum(sd => sd.Quantity));
 | 
						||
            TotalCount = totalCount;
 | 
						||
        }
 | 
						||
 | 
						||
        public DelegateCommand BtnCloseCommand
 | 
						||
        {
 | 
						||
            get => new DelegateCommand(() =>
 | 
						||
            {
 | 
						||
                // 关闭当前窗口
 | 
						||
                RequestClose?.Invoke(new DialogResult(ButtonResult.Cancel));
 | 
						||
            });
 | 
						||
        }
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// 选中行事件
 | 
						||
        /// </summary>
 | 
						||
        public DelegateCommand RowSelected
 | 
						||
        {
 | 
						||
            get => new DelegateCommand(() =>
 | 
						||
            {
 | 
						||
                if (SelectedRecord != null && selectedRecord.Id != null)
 | 
						||
                {
 | 
						||
                    MachineRecordList = MachineRecordList.Select(x =>
 | 
						||
                    {
 | 
						||
                        if (x.Id == SelectedRecord.Id)
 | 
						||
                        {
 | 
						||
                            x.IsSelected = !x.IsSelected;
 | 
						||
                            if (x.IsSelected)
 | 
						||
                            {
 | 
						||
                                if (SelectedRecord._SurgicalScheduleDetailLst != null && SelectedRecord._SurgicalScheduleDetailLst.Count > 0)
 | 
						||
                                {
 | 
						||
                                    //已经核销数
 | 
						||
                                    int HasCheckNum = SelectedRecord._SurgicalScheduleDetailLst.Sum(sd => sd.Quantity);
 | 
						||
                                    x.CheckQuantity = SelectedRecord.Quantity - HasCheckNum;
 | 
						||
                                    x.ReturnQuantity1 = SelectedRecord.Quantity - HasCheckNum - x.CheckQuantity;
 | 
						||
                                    x.ReturnQuantity2 = HasCheckNum + x.CheckQuantity;
 | 
						||
                                }
 | 
						||
                                else
 | 
						||
                                {
 | 
						||
                                    x.CheckQuantity = SelectedRecord.Quantity;
 | 
						||
                                    x.ReturnQuantity1 = 0;
 | 
						||
                                    x.ReturnQuantity2 = SelectedRecord.Quantity;
 | 
						||
                                }
 | 
						||
                            }
 | 
						||
                            else
 | 
						||
                            {
 | 
						||
                                x.CheckQuantity = 0;
 | 
						||
                                x.ReturnQuantity1 = 0;
 | 
						||
                                x.ReturnQuantity2 = 0;
 | 
						||
                            }
 | 
						||
                        }
 | 
						||
                        return x;
 | 
						||
                    }).ToList();
 | 
						||
 | 
						||
 | 
						||
                }
 | 
						||
            });
 | 
						||
        }
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// 确认核销
 | 
						||
        /// </summary>
 | 
						||
        public DelegateCommand AddSurgeryCommand
 | 
						||
        {
 | 
						||
            get => new DelegateCommand(() =>
 | 
						||
            {
 | 
						||
                List<MachineRecord> RecordsLst = MachineRecordList.FindAll(rl => rl.IsSelected && rl.CheckQuantity > 0).ToList();
 | 
						||
                if (_SurgicalSchedule != null && RecordsLst.Count > 0)
 | 
						||
                {
 | 
						||
                    string operationId = _SurgicalSchedule.OperationId;
 | 
						||
                    var f = SqlSugarHelper.Db.UseTran(() =>
 | 
						||
                    {
 | 
						||
                        SqlSugarHelper.Db.Updateable(new SurgicalSchedule()
 | 
						||
                        {
 | 
						||
                            DmStatus = 1,
 | 
						||
                            Id = _SurgicalSchedule.Id
 | 
						||
                        }).UpdateColumns(it => new { it.DmStatus }).WhereColumns(it => new { it.Id }).ExecuteCommand();
 | 
						||
                        for (int i = 0; i < RecordsLst.Count; i++)
 | 
						||
                        {
 | 
						||
                            SqlSugarHelper.Db.Insertable(new SurgicalScheduleDetail()
 | 
						||
                            {
 | 
						||
                                OperationId = operationId,
 | 
						||
                                GetRecordId = RecordsLst[i].Id,
 | 
						||
                                Quantity = RecordsLst[i].CheckQuantity,
 | 
						||
                                DrugId = RecordsLst[i].DrugId,
 | 
						||
                                ManuNo = RecordsLst[i].ManuNo,
 | 
						||
                                EffDate = RecordsLst[i].EffDate.ToString(),
 | 
						||
                                InsertUserId = HomeWindowViewModel.Operator?.Id,
 | 
						||
                            }).ExecuteCommand();
 | 
						||
 | 
						||
                            int hasQuantity = RecordsLst[i]._SurgicalScheduleDetailLst.Sum(sd => sd.Quantity);
 | 
						||
                            int dmStatus = 0;
 | 
						||
                            //已经全部挂上钩,修改dm_machine_record状态为完成
 | 
						||
                            //if (hasQuantity + RecordsLst[i].CheckQuantity == RecordsLst[i].Quantity)
 | 
						||
                            //{
 | 
						||
                            //    dmStatus = 2;
 | 
						||
                            //}
 | 
						||
                            //else
 | 
						||
                            {
 | 
						||
                                dmStatus = 1;
 | 
						||
                            }
 | 
						||
                            SqlSugarHelper.Db.Updateable(new MachineRecord()
 | 
						||
                            {
 | 
						||
                                Status = dmStatus,
 | 
						||
                                Id = RecordsLst[i].Id
 | 
						||
                            }).UpdateColumns(it => new { it.Status }).WhereColumns(it => new { it.Id }).ExecuteCommand();
 | 
						||
 | 
						||
 | 
						||
                        }
 | 
						||
                    });
 | 
						||
                    if (f.IsSuccess)
 | 
						||
                    {
 | 
						||
                        AlertMsg alertMsg = new AlertMsg
 | 
						||
                        {
 | 
						||
                            Message = "核销完成",
 | 
						||
                            Type = MsgType.SUCCESS,
 | 
						||
                        };
 | 
						||
                        _eventAggregator.GetEvent<SnackbarEvent>().Publish(alertMsg);
 | 
						||
                        RequestData();
 | 
						||
 | 
						||
                    }
 | 
						||
                    else
 | 
						||
                    {
 | 
						||
                        logger.Info($"核销异常");
 | 
						||
 | 
						||
                        SnackbarBackground = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#b71c1c"));
 | 
						||
                        SnackbarMessageQueue.Enqueue("核销异常!");
 | 
						||
                    }
 | 
						||
                }
 | 
						||
                else
 | 
						||
                {
 | 
						||
 | 
						||
                    SnackbarBackground = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#b71c1c"));
 | 
						||
                    SnackbarMessageQueue.Enqueue("未选中数据,或选中数据核销数量为0");
 | 
						||
                }
 | 
						||
            });
 | 
						||
        }
 | 
						||
        /// <summary>
 | 
						||
        /// 全部归还(还药、还空瓶)
 | 
						||
        /// </summary>
 | 
						||
        public DelegateCommand ReturnCommand
 | 
						||
        {
 | 
						||
            get => new DelegateCommand(() =>
 | 
						||
            {
 | 
						||
                List<MachineRecord> RecordsLst = MachineRecordList.FindAll(rl => rl.IsSelected && rl.CheckQuantity == 0).ToList();
 | 
						||
                ReturnStockLst = new List<ChannelStock>();
 | 
						||
                if (RecordsLst.Count > 0)
 | 
						||
                {
 | 
						||
 | 
						||
                    //待还药的记录
 | 
						||
                    List<MachineRecord> ReturnDrugLst = RecordsLst.Where(rl => rl.ReturnQuantity1 > 0).ToList();
 | 
						||
                    //待还空瓶的记录
 | 
						||
                    List<MachineRecord> ReturnEmptyLst = RecordsLst.Where(rl => rl.ReturnQuantity2 > 0).ToList();
 | 
						||
 | 
						||
 | 
						||
                    for (int i = 0; i < ReturnDrugLst.Count; i++)
 | 
						||
                    {
 | 
						||
                        ChannelStock queryData = SqlSugarHelper.Db.Queryable<ChannelStock>()
 | 
						||
                                               .Includes<DrugInfo>(cs => cs.DrugInfo)
 | 
						||
                                               .Where(cs => cs.DrugId == ReturnDrugLst[i].DrugId)
 | 
						||
                                               .Where(cs => cs.MachineId.Equals(ConfigurationManager.AppSettings["machineId"] ?? "DM3"))
 | 
						||
                                               .Where(cs => cs.ManuNo == ReturnDrugLst[i].ManuNo)
 | 
						||
                                               .OrderBy(cs => cs.Quantity).First();
 | 
						||
                        if (queryData != null)
 | 
						||
                        {
 | 
						||
                            queryData.AddQuantity = ReturnDrugLst[i].ReturnQuantity1;
 | 
						||
                            queryData.MachineRecordId = ReturnDrugLst[i].Id;
 | 
						||
                            ReturnStockLst.Add(queryData);
 | 
						||
                        }
 | 
						||
                    }
 | 
						||
                    for (int j = 0; j < ReturnEmptyLst.Count; j++)
 | 
						||
                    {
 | 
						||
                        ChannelStock queryData = SqlSugarHelper.Db.Queryable<ChannelStock>()
 | 
						||
                                              .Includes<DrugInfo>(cs => cs.DrugInfo)
 | 
						||
                                              .Where(cs => cs.DrugId == ReturnEmptyLst[j].DrugId)
 | 
						||
                                              .Where(cs => cs.MachineId.Equals(ConfigurationManager.AppSettings["machineId"] ?? "DM3"))
 | 
						||
                                              //.Where(cs => cs.ManuNo == ReturnEmptyLst[j].ManuNo)
 | 
						||
                                              .Where(cs => cs.DrawerType == 2)
 | 
						||
                                              .OrderBy(cs => cs.Quantity).First();
 | 
						||
                        if (queryData != null)
 | 
						||
                        {
 | 
						||
                            queryData.ReturnQuantity = ReturnEmptyLst[j].ReturnQuantity2;
 | 
						||
                            queryData.MachineRecordId = ReturnEmptyLst[j].Id;
 | 
						||
                            ReturnStockLst.Add(queryData);
 | 
						||
                        }
 | 
						||
                    }
 | 
						||
                    if (ReturnStockLst != null && ReturnStockLst.Count > 0)
 | 
						||
                    {
 | 
						||
                        ReturnStockLst = ReturnStockLst.OrderBy(cls => cls.DrawerNo).ToList();
 | 
						||
                        //还药时AddQuantity有值;还空瓶时ReturnQuantity有值
 | 
						||
                        enumerable = ReturnStockLst.GroupBy(cs => cs.DrawerNo, cs => cs);
 | 
						||
                        enumerator = enumerable.GetEnumerator();
 | 
						||
                        enumerator.MoveNext();
 | 
						||
                        Status = 1;
 | 
						||
                        OpenOneByOne();
 | 
						||
                    }
 | 
						||
                    else
 | 
						||
                    {
 | 
						||
 | 
						||
                        SnackbarBackground = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#b71c1c"));
 | 
						||
                        SnackbarMessageQueue.Enqueue("选中数据未绑定库位,请先进行绑定库位");
 | 
						||
                    }
 | 
						||
                }
 | 
						||
                else
 | 
						||
                {
 | 
						||
                    SnackbarBackground = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#b71c1c"));
 | 
						||
                    SnackbarMessageQueue.Enqueue("未选中数据,或选中数据核销数量不为0");
 | 
						||
                }
 | 
						||
            });
 | 
						||
        }
 | 
						||
        /// <summary>
 | 
						||
        /// 刷新
 | 
						||
        /// </summary>
 | 
						||
        public DelegateCommand QueryCommand
 | 
						||
        {
 | 
						||
            get => new DelegateCommand(() =>
 | 
						||
            {
 | 
						||
                RequestData();
 | 
						||
            });
 | 
						||
        }
 | 
						||
        void DoMyPrismEvent(DeviceMsg msg)
 | 
						||
        {
 | 
						||
 | 
						||
            if (msg.WindowName == "SurgeryTakeWindow")
 | 
						||
            {
 | 
						||
                IGrouping<int, ChannelStock> grouping = enumerator.Current;
 | 
						||
                int DrawerNo = grouping.Key;
 | 
						||
                List<ChannelStock> channelStocks = grouping.ToList();
 | 
						||
 | 
						||
                switch (msg.EventType)
 | 
						||
                {
 | 
						||
                    // 抽屉打开
 | 
						||
                    case EventType.DRAWEROPEN:
 | 
						||
                        if (Status == 1)
 | 
						||
                        {
 | 
						||
                            if (channelStocks[0].process == 1)
 | 
						||
                            {
 | 
						||
                                channelStocks.ForEach(it => it.process = 2);
 | 
						||
                            }
 | 
						||
                        }
 | 
						||
 | 
						||
                        break;
 | 
						||
                    // 抽屉关闭
 | 
						||
                    case EventType.DRAWERCLOSE:
 | 
						||
                        if (Status == 1)
 | 
						||
                        {
 | 
						||
                            if (channelStocks[0].process == 2)
 | 
						||
                            {
 | 
						||
                                channelStocks.ForEach(it => it.process = 3);
 | 
						||
                            }
 | 
						||
                            IGrouping<int, ChannelStock> groupingBefore = enumerator.Current;
 | 
						||
                            int DrawerNoBefore = groupingBefore.Key;
 | 
						||
                            if (enumerator.MoveNext())
 | 
						||
                            {
 | 
						||
                                IGrouping<int, ChannelStock> groupingAfter = enumerator.Current;
 | 
						||
                                int DrawerNoAfter = groupingAfter.Key;
 | 
						||
                                if (DrawerNoBefore < 9 && DrawerNoAfter > 8)
 | 
						||
                                {
 | 
						||
                                    Thread.Sleep(50);
 | 
						||
                                }
 | 
						||
                                OpenOneByOne();
 | 
						||
                            }
 | 
						||
                            // 已经全部取出
 | 
						||
                            else
 | 
						||
                            {
 | 
						||
                                Status = 3;
 | 
						||
 | 
						||
                                //保存数据
 | 
						||
 | 
						||
                                //TakeFinish();
 | 
						||
                            }
 | 
						||
                        }
 | 
						||
                        break;
 | 
						||
                    // 数量变化
 | 
						||
                    case EventType.UPDATEQUANTITY:
 | 
						||
                        if (Status == 1)
 | 
						||
                        {
 | 
						||
                            logger.Info($"抽屉【{DrawerNo}】库位取药数量【{msg.Quantitys}】");
 | 
						||
                        }
 | 
						||
                        break;
 | 
						||
                    // 打开失败
 | 
						||
                    case EventType.OPENERROR:
 | 
						||
                        AlertMsg alertMsg = new AlertMsg
 | 
						||
                        {
 | 
						||
                            Message = msg.Message,
 | 
						||
                            Type = MsgType.ERROR,
 | 
						||
                        };
 | 
						||
                        _eventAggregator.GetEvent<SnackbarEvent>().Publish(alertMsg);
 | 
						||
                        Status = 0;
 | 
						||
                        break;
 | 
						||
                }
 | 
						||
            }
 | 
						||
 | 
						||
        }
 | 
						||
 | 
						||
        private void OpenOneByOne()
 | 
						||
        {
 | 
						||
            IGrouping<int, ChannelStock> grouping = enumerator.Current;
 | 
						||
            int DrawerNo = grouping.Key;
 | 
						||
            List<ChannelStock> channelStocks = grouping.ToList();
 | 
						||
            channelStocks.ForEach(it => it.process = 1);
 | 
						||
 | 
						||
            IEnumerable<string> strDrugName = channelStocks.Select(cs => cs.DrugInfo.DrugName);
 | 
						||
            string strNames = string.Empty;
 | 
						||
            foreach (string name in strDrugName)
 | 
						||
            {
 | 
						||
                strNames += name;
 | 
						||
            }
 | 
						||
 | 
						||
 | 
						||
             
 | 
						||
 | 
						||
            int drugQuantity = channelStocks.Sum(cs => cs.AddQuantity);
 | 
						||
 | 
						||
            int emptyQuantity = channelStocks.Sum(cs => cs.ReturnQuantity);
 | 
						||
            string speakTxt = $"正在打开{DrawerNo}号抽屉,请将{strNames}的";
 | 
						||
            if (drugQuantity > 0)
 | 
						||
            {
 | 
						||
                speakTxt += $"共计{drugQuantity}个药放入抽屉!";
 | 
						||
            }
 | 
						||
            if (emptyQuantity > 0)
 | 
						||
            {
 | 
						||
                speakTxt += $"共计{emptyQuantity}个空瓶放入抽屉!";
 | 
						||
            }
 | 
						||
            _portUtil.SpeakAsync(speakTxt);
 | 
						||
 | 
						||
            //List<ChannelStock> singleChannels = channelStocks.FindAll(it => it.BoardType != 1);
 | 
						||
 | 
						||
            // 发送取药数量
 | 
						||
            //singleChannels.ForEach(it =>
 | 
						||
            //{
 | 
						||
            //    try
 | 
						||
            //    {
 | 
						||
 | 
						||
            //        _portUtil.TakeQuantity(DrawerNo, it.ColNo, it.TakeQuantity, it.Quantity - it.TakeQuantity);
 | 
						||
            //    }
 | 
						||
            //    catch (Exception ex)
 | 
						||
            //    {
 | 
						||
            //        AlertMsg alertMsg = new AlertMsg
 | 
						||
            //        {
 | 
						||
            //            Message = $"打开抽屉异常{ex.Message}",
 | 
						||
            //            Type = MsgType.ERROR,
 | 
						||
            //        };
 | 
						||
            //        _eventAggregator.GetEvent<SnackbarEvent>().Publish(alertMsg);
 | 
						||
            //    }
 | 
						||
            //});
 | 
						||
 | 
						||
            _portUtil.WindowName = "SurgeryTakeWindow";
 | 
						||
            _portUtil.BoardType = channelStocks.Count > 0 ? channelStocks[0].BoardType : 1;
 | 
						||
            _portUtil.ColNos = channelStocks.Select(it => it.ColNo).ToArray();
 | 
						||
            _portUtil.DrawerNo = DrawerNo;
 | 
						||
            _portUtil.Start();
 | 
						||
        }
 | 
						||
 | 
						||
 | 
						||
        private bool _isFinishClick = false;
 | 
						||
 | 
						||
        public bool IsFinishClick { get => _isFinishClick; set => SetProperty(ref _isFinishClick, value); }
 | 
						||
        //完成
 | 
						||
        private void TakeFinish()
 | 
						||
        {
 | 
						||
            IsFinishClick = true;
 | 
						||
            bool bRet = false;
 | 
						||
            var f = SqlSugarHelper.Db.UseTran(() =>
 | 
						||
            {
 | 
						||
                for (int i = 0; i < ReturnStockLst.Count; i++)
 | 
						||
                {
 | 
						||
                    ChannelStock it = ReturnStockLst[i];
 | 
						||
                    int quantity = 0;
 | 
						||
                    if (it.AddQuantity > 0)  //还药
 | 
						||
                    {
 | 
						||
                        quantity = it.AddQuantity;
 | 
						||
                        bRet = ReturnDrug(it);
 | 
						||
 | 
						||
                    }
 | 
						||
                    else
 | 
						||
                    {
 | 
						||
                        quantity = it.ReturnQuantity;
 | 
						||
                        bRet = ReturnEmpty(it);
 | 
						||
                    }
 | 
						||
                    if (!bRet)
 | 
						||
                    {
 | 
						||
                        break;
 | 
						||
                    }
 | 
						||
                    // 更新屏显库存
 | 
						||
                    if (it.BoardType == 5)
 | 
						||
                    {
 | 
						||
                        _portUtil.WriteQuantity(it.DrawerNo, it.ColNo, it.Quantity + quantity);
 | 
						||
                    }
 | 
						||
 | 
						||
 | 
						||
                    SnackbarBackground = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#00e676"));
 | 
						||
                    SnackbarMessageQueue.Enqueue("操作完成,库存已更新!");
 | 
						||
                }
 | 
						||
                return bRet;
 | 
						||
            });
 | 
						||
            if (!f.IsSuccess || !f.Data)
 | 
						||
            {
 | 
						||
                SnackbarBackground = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#b71c1c"));
 | 
						||
                SnackbarMessageQueue.Enqueue("库存更新失败!");
 | 
						||
            }
 | 
						||
            Status = 0;
 | 
						||
            IsFinishClick = false;
 | 
						||
            RequestClose?.Invoke(new DialogResult(ButtonResult.OK));
 | 
						||
        }
 | 
						||
        /// <summary>
 | 
						||
        /// 还药
 | 
						||
        /// </summary>
 | 
						||
        private bool ReturnDrug(ChannelStock stock)
 | 
						||
        {
 | 
						||
            try
 | 
						||
            {
 | 
						||
                var f = SqlSugarHelper.Db.UseTran(() =>
 | 
						||
                {
 | 
						||
                    string InvoiceId = "RETURN_" + CurrentTimeMillis(); 
 | 
						||
                    MachineRecord recordInfo = SqlSugarHelper.Db.Queryable<MachineRecord>().Where(rd => rd.Id == stock.MachineRecordId).First();
 | 
						||
                    // 更新数据 库存信息
 | 
						||
                    SqlSugarHelper.Db.Updateable(new ChannelStock()
 | 
						||
                    {
 | 
						||
                        Quantity = stock.Quantity + stock.AddQuantity,
 | 
						||
                        Id = stock.Id,
 | 
						||
                    }).UpdateColumns(it => new { it.Quantity }).ExecuteCommand();
 | 
						||
                    // 获取更新完库存后的药品库存
 | 
						||
                    List<ChannelStock> nowChannels = SqlSugarHelper.Db.Queryable<ChannelStock>()
 | 
						||
                        .Where(cs => cs.MachineId.Equals(stock.MachineId))
 | 
						||
                        .Where(cs => cs.DrugId.Equals(stock.DrugId))
 | 
						||
                        .Where(cs => cs.DrawerType == 1)
 | 
						||
                        .ToList();
 | 
						||
                    // 更新数据 取药记录 设置还药数量、状态 
 | 
						||
                    SqlSugarHelper.Db.Updateable(new MachineRecord()
 | 
						||
                    {
 | 
						||
                        ReturnQuantity1 = recordInfo.ReturnQuantity1 + stock.AddQuantity,
 | 
						||
                        Id = recordInfo.Id,
 | 
						||
                        Status = (recordInfo.CanReturnQuantity - stock.AddQuantity) == 0 ? 2 : 1,
 | 
						||
                    }).UpdateColumns(it => new { it.ReturnQuantity1, it.Status }).ExecuteCommand();
 | 
						||
 | 
						||
                    // 保存数据 还药记录
 | 
						||
                    SqlSugarHelper.Db.Insertable(new MachineRecord()
 | 
						||
                    {
 | 
						||
                        MachineId = stock.MachineId,
 | 
						||
                        DrawerNo = stock.DrawerNo,
 | 
						||
                        ColNo = stock.ColNo,
 | 
						||
                        DrugId = stock.DrugId,
 | 
						||
                        ManuNo = stock.ManuNo,
 | 
						||
                        EffDate = !String.IsNullOrEmpty(stock.EffDate) ? DateTime.ParseExact(stock.EffDate, "yyyy-MM-dd", System.Globalization.CultureInfo.CurrentCulture) : null,
 | 
						||
                        Operator = HomeWindowViewModel.Operator?.Id,
 | 
						||
                        OperationTime = DateTime.Now,
 | 
						||
                        Quantity = stock.AddQuantity,
 | 
						||
                        Type = 31,
 | 
						||
                        InvoiceId = InvoiceId,
 | 
						||
                        GetId = stock.MachineRecordId
 | 
						||
                        //,StockQuantity = nowChannels.Sum(it => it.Quantity)
 | 
						||
                    }).ExecuteCommand();
 | 
						||
 | 
						||
                    //保存账册
 | 
						||
                    SqlSugarHelper.Db.Insertable(new AccountBookG2()
 | 
						||
                    {
 | 
						||
                        DrugId = stock.DrugId,
 | 
						||
                        Type = 1,
 | 
						||
                        Department = ConfigurationManager.AppSettings["department"].ToString(),
 | 
						||
                        InvoiceNo = InvoiceId,
 | 
						||
                        ManuNo = stock.ManuNo,
 | 
						||
                        EffDate = stock.EffDate,
 | 
						||
                        AddQuantity = stock.AddQuantity,
 | 
						||
                        UserId1 = HomeWindowViewModel.Operator?.Id,
 | 
						||
                        UserId2 = HomeWindowViewModel.Reviewer?.Id,
 | 
						||
                        MachineId = ConfigurationManager.AppSettings["machineId"].ToString(),
 | 
						||
                        CreateDate = DateTime.Now.ToString("yyyy-MM-dd"),
 | 
						||
                        CreateTime = DateTime.Now
 | 
						||
 | 
						||
                    }).ExecuteCommand();
 | 
						||
                    //修改凌晨生成的日结存数据
 | 
						||
                    AccountBookG2 accountBookG2Day = SqlSugarHelper.Db.Queryable<AccountBookG2>()
 | 
						||
                    .Where(ab => ab.MachineId.Equals(stock.MachineId))
 | 
						||
                    .Where(ab => ab.Type == 3)
 | 
						||
                    .Where(ab => ab.DrugId == stock.DrugId)
 | 
						||
                    .Where(ab => ab.ManuNo == stock.ManuNo)
 | 
						||
                    .Where(ab => ab.CreateDate == DateTime.Now.ToString("yyyy-MM-dd")).First();
 | 
						||
                    if (accountBookG2Day != null)
 | 
						||
                    {
 | 
						||
                        accountBookG2Day.ManuStock = accountBookG2Day.ManuStock + stock.AddQuantity;
 | 
						||
                        SqlSugarHelper.Db.Updateable(accountBookG2Day).ExecuteCommand();
 | 
						||
                    }
 | 
						||
                    else
 | 
						||
                    {
 | 
						||
                        //生成日结存时可能没有该库位的绑定信息,需要写入日结存
 | 
						||
                        int iDayResult = SqlSugarHelper.Db.Insertable(new AccountBookG2()
 | 
						||
                        {
 | 
						||
                            DrugId = stock.DrugId,
 | 
						||
                            Type = 3,
 | 
						||
                            ManuNo = stock.ManuNo,
 | 
						||
                            EffDate = stock.EffDate,
 | 
						||
                            YQuantity = 0,
 | 
						||
                            ManuStock = stock.ReturnQuantity,
 | 
						||
                            TotalStock = stock.ReturnQuantity,
 | 
						||
                            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($"未写入日结存数据{stock.DrugId}-{stock.ManuNo}-{stock.EffDate}-{stock.AddQuantity}");
 | 
						||
                        }
 | 
						||
                    }
 | 
						||
                    //修改凌晨生成的总结存数据
 | 
						||
                    AccountBookG2 accountBookG2Total = SqlSugarHelper.Db.Queryable<AccountBookG2>()
 | 
						||
                    .Where(ab => ab.MachineId.Equals(stock.MachineId))
 | 
						||
                    .Where(ab => ab.Type == 4)
 | 
						||
                    .Where(ab => ab.DrugId == stock.DrugId)
 | 
						||
                    .Where(ab => ab.CreateDate == DateTime.Now.ToString("yyyy-MM-dd")).First();
 | 
						||
                    if (accountBookG2Total != null)
 | 
						||
                    {
 | 
						||
                        accountBookG2Total.TotalStock = accountBookG2Total.TotalStock + stock.AddQuantity;
 | 
						||
                        SqlSugarHelper.Db.Updateable(accountBookG2Total).ExecuteCommand();
 | 
						||
                    }
 | 
						||
                    else
 | 
						||
                    {
 | 
						||
                        //生成总结存时可能没有该库位的绑定信息,需要写入总结存
 | 
						||
                        int iTotalResult = SqlSugarHelper.Db.Insertable(new AccountBookG2()
 | 
						||
                        {
 | 
						||
                            DrugId = stock.DrugId,
 | 
						||
                            Type = 4,
 | 
						||
                            YQuantity = 0,
 | 
						||
                            ManuStock = stock.ReturnQuantity,
 | 
						||
                            TotalStock = stock.ReturnQuantity,
 | 
						||
                            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($"未写入总结存数据{stock.DrugId}-{stock.AddQuantity}");
 | 
						||
                        }
 | 
						||
                    }
 | 
						||
                });
 | 
						||
                if (f.IsSuccess)
 | 
						||
                {
 | 
						||
                    return true;
 | 
						||
                }
 | 
						||
                else
 | 
						||
                {
 | 
						||
                    return false;
 | 
						||
                }
 | 
						||
            }
 | 
						||
            catch (Exception)
 | 
						||
            {
 | 
						||
 | 
						||
                throw;
 | 
						||
            }
 | 
						||
        }
 | 
						||
        /// <summary>
 | 
						||
        /// 还空瓶
 | 
						||
        /// </summary>
 | 
						||
        private bool ReturnEmpty(ChannelStock stock)
 | 
						||
        {
 | 
						||
            string InvoiceId = "RETURN_" + CurrentTimeMillis();
 | 
						||
            var f = SqlSugarHelper.Db.UseTran(() =>
 | 
						||
            {
 | 
						||
 | 
						||
                // 更新数据 库存信息
 | 
						||
                SqlSugarHelper.Db.Updateable(new ChannelStock()
 | 
						||
                {
 | 
						||
                    Quantity = stock.Quantity + stock.ReturnQuantity,
 | 
						||
                    Id = stock.Id,
 | 
						||
                }).UpdateColumns(it => new { it.Quantity }).ExecuteCommand();
 | 
						||
 | 
						||
                // 获取更新完库存后的药品库存
 | 
						||
                List<ChannelStock> nowChannels = SqlSugarHelper.Db.Queryable<ChannelStock>()
 | 
						||
                    .Where(cs => cs.MachineId.Equals(stock.MachineId))
 | 
						||
                    .Where(cs => cs.DrugId.Equals(stock.DrugId))
 | 
						||
                    .Where(cs => cs.DrawerType == 1)
 | 
						||
                    .ToList();
 | 
						||
 | 
						||
                MachineRecord recordInfo = SqlSugarHelper.Db.Queryable<MachineRecord>().Where(rd => rd.Id == stock.MachineRecordId).First();
 | 
						||
 | 
						||
                // 更新数据 取药记录 设置还药数量、状态
 | 
						||
                SqlSugarHelper.Db.Updateable(new MachineRecord()
 | 
						||
                {
 | 
						||
                    ReturnQuantity2 = stock.ReturnQuantity,
 | 
						||
                    Id = recordInfo.Id,
 | 
						||
                    Status = 2,
 | 
						||
                }).UpdateColumns(it => new { it.ReturnQuantity2, it.Status }).ExecuteCommand();
 | 
						||
 | 
						||
                // 保存数据 还药空瓶记录
 | 
						||
                SqlSugarHelper.Db.Insertable(new MachineRecord()
 | 
						||
                {
 | 
						||
                    MachineId = stock.MachineId,
 | 
						||
                    DrawerNo = stock.DrawerNo,
 | 
						||
                    ColNo = stock.ColNo,
 | 
						||
                    DrugId = stock.DrugId,
 | 
						||
                    ManuNo = stock.ManuNo,
 | 
						||
                    EffDate = !String.IsNullOrEmpty(stock.EffDate) ? DateTime.ParseExact(stock.EffDate, "yyyy-MM-dd", System.Globalization.CultureInfo.CurrentCulture) : null,
 | 
						||
                    Operator = HomeWindowViewModel.Operator?.Id,
 | 
						||
                    Reviewer = HomeWindowViewModel.Reviewer?.Id,
 | 
						||
                    OperationTime = DateTime.Now,
 | 
						||
                    Quantity = stock.ReturnQuantity, //ReturnQuantity,
 | 
						||
                    Type = 32,
 | 
						||
                    InvoiceId = InvoiceId,
 | 
						||
                    GetId = stock.MachineRecordId
 | 
						||
                    //,StockQuantity = nowChannels.Sum(it => it.Quantity)
 | 
						||
                }).ExecuteCommand();
 | 
						||
 | 
						||
                return true;
 | 
						||
            });
 | 
						||
 | 
						||
            if (!f.IsSuccess || !f.Data)
 | 
						||
            {
 | 
						||
                return false;
 | 
						||
            }
 | 
						||
            else
 | 
						||
            {
 | 
						||
                return true;
 | 
						||
            }
 | 
						||
        }
 | 
						||
        public long CurrentTimeMillis()
 | 
						||
        {
 | 
						||
            return (long)(DateTime.UtcNow - Jan1st1970).TotalMilliseconds;
 | 
						||
        }
 | 
						||
        /// <summary>
 | 
						||
        /// 取消
 | 
						||
        /// </summary>
 | 
						||
        public DelegateCommand CancleTake
 | 
						||
        {
 | 
						||
            get => new DelegateCommand(() =>
 | 
						||
            {
 | 
						||
                _portUtil.ResetData();
 | 
						||
                Status = 0;
 | 
						||
            });
 | 
						||
        }
 | 
						||
        // 完成按钮
 | 
						||
        public DelegateCommand TakeFinishCommand
 | 
						||
        {
 | 
						||
            get => new DelegateCommand(TakeFinish);
 | 
						||
        }
 | 
						||
    }
 | 
						||
 | 
						||
}
 |