186 lines
		
	
	
		
			6.2 KiB
		
	
	
	
		
			C#
		
	
	
	
		
		
			
		
	
	
			186 lines
		
	
	
		
			6.2 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.Configuration;
							 | 
						|||
| 
								 | 
							
								using System.Linq;
							 | 
						|||
| 
								 | 
							
								using System.Text;
							 | 
						|||
| 
								 | 
							
								using System.Threading;
							 | 
						|||
| 
								 | 
							
								using System.Threading.Tasks;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								namespace DM_Weight.ViewModels
							 | 
						|||
| 
								 | 
							
								{
							 | 
						|||
| 
								 | 
							
								    public class OrderTakeNewDialogViewModel : BindableBase, IDialogAware, IRegionMemberLifetime
							 | 
						|||
| 
								 | 
							
								    {
							 | 
						|||
| 
								 | 
							
								        private readonly ILog logger = LogManager.GetLogger(typeof(OrderTakeDialogViewModel));
							 | 
						|||
| 
								 | 
							
								        public string Title => "处方取药";
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        public event Action<IDialogResult> RequestClose;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        private static readonly DateTime Jan1st1970 = new DateTime
							 | 
						|||
| 
								 | 
							
								   (1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        IDialogService _dialogService;
							 | 
						|||
| 
								 | 
							
								        public OrderTakeNewDialogViewModel(IDialogService DialogService)
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            _dialogService = DialogService;
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        private int _status = 0;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        public int Status
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            get => _status; set => SetProperty(ref _status, value);
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        private OrderInfo? _orderInfo;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        public OrderInfo? OrderInfo
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            get => _orderInfo;
							 | 
						|||
| 
								 | 
							
								            set => SetProperty(ref _orderInfo, value);
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        private List<OrderDetail> orderDetails { get; set; }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        private List<ChannelStock> _channelStocks;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        public List<ChannelStock> ChannelStocks
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            get => _channelStocks;
							 | 
						|||
| 
								 | 
							
								            set => SetProperty(ref _channelStocks, value);
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        private IEnumerable<IGrouping<int, ChannelStock>> enumerable;
							 | 
						|||
| 
								 | 
							
								        private IEnumerator<IGrouping<int, ChannelStock>> enumerator;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        public bool CanCloseDialog()
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            return Status == 0;
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        public void OnDialogClosed()
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        public void OnDialogOpened(IDialogParameters parameters)
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            OrderInfo o = parameters.GetValue<OrderInfo>("orderInfo");
							 | 
						|||
| 
								 | 
							
								            OrderInfo = o;
							 | 
						|||
| 
								 | 
							
								            RequestData();
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								        public async void RequestData()
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            orderDetails = SqlSugarHelper.Db.Queryable<OrderDetail>()
							 | 
						|||
| 
								 | 
							
								                .Includes<DrugInfo>(od => od.DrugInfo)
							 | 
						|||
| 
								 | 
							
								                .InnerJoin(SqlSugarHelper.Db.Queryable<ChannelStock>().Where(cs => cs.DrawerType == 1).Where(cs => cs.MachineId.Equals(ConfigurationManager.AppSettings["machineId"] ?? "DM3")).GroupBy(cs => cs.DrugId), (od, t) => od.DrugId == t.DrugId)
							 | 
						|||
| 
								 | 
							
								                .Where(od => od.OrderNo == OrderInfo.OrderNo)
							 | 
						|||
| 
								 | 
							
								                .ToList();
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								            List<ChannelStock> channelStocks = new List<ChannelStock>();
							 | 
						|||
| 
								 | 
							
								            List<string> msg = new List<string>();
							 | 
						|||
| 
								 | 
							
								            for (int i = 0; i < orderDetails.Count; i++)
							 | 
						|||
| 
								 | 
							
								            {
							 | 
						|||
| 
								 | 
							
								                OrderDetail orderDetail = orderDetails[i];
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								                List<ChannelStock> HasQChannels = SqlSugarHelper.Db.Queryable<ChannelStock>()
							 | 
						|||
| 
								 | 
							
								                    .Includes<DrugInfo>(cs => cs.DrugInfo)
							 | 
						|||
| 
								 | 
							
								                    .Where(cs => cs.Quantity > 0)
							 | 
						|||
| 
								 | 
							
								                    .Where(cs => cs.DrawerType == 1)
							 | 
						|||
| 
								 | 
							
								                    .Where(cs => cs.MachineId.Equals(ConfigurationManager.AppSettings["machineId"] ?? "DM3"))
							 | 
						|||
| 
								 | 
							
								                    .WhereIF(!string.IsNullOrEmpty(orderDetail.SetEffDate), cs => cs.EffDate.Equals(orderDetail.SetEffDate))
							 | 
						|||
| 
								 | 
							
								                    .WhereIF(!string.IsNullOrEmpty(orderDetail.SetManuNo), cs => cs.ManuNo.Equals(orderDetail.SetManuNo))
							 | 
						|||
| 
								 | 
							
								                    .Where(cs => cs.DrugId == orderDetail.DrugId)
							 | 
						|||
| 
								 | 
							
								                    .OrderBy(cs => cs.EffDate)
							 | 
						|||
| 
								 | 
							
								                    .OrderBy(cs => cs.DrawerNo)
							 | 
						|||
| 
								 | 
							
								                    .ToList();
							 | 
						|||
| 
								 | 
							
								                int total = HasQChannels.Sum(it => it.Quantity);
							 | 
						|||
| 
								 | 
							
								                int TakeQ = orderDetail.Quantity;
							 | 
						|||
| 
								 | 
							
								                // 说明数量足够
							 | 
						|||
| 
								 | 
							
								                if (total >= TakeQ)
							 | 
						|||
| 
								 | 
							
								                {
							 | 
						|||
| 
								 | 
							
								                    for (int j = 0; TakeQ > 0; j++)
							 | 
						|||
| 
								 | 
							
								                    {
							 | 
						|||
| 
								 | 
							
								                        ChannelStock stock = HasQChannels[j];
							 | 
						|||
| 
								 | 
							
								                        if (TakeQ > stock.Quantity)
							 | 
						|||
| 
								 | 
							
								                        {
							 | 
						|||
| 
								 | 
							
								                            stock.TakeQuantity = stock.Quantity;
							 | 
						|||
| 
								 | 
							
								                            channelStocks.Add(stock);
							 | 
						|||
| 
								 | 
							
								                            TakeQ -= stock.Quantity;
							 | 
						|||
| 
								 | 
							
								                        }
							 | 
						|||
| 
								 | 
							
								                        else
							 | 
						|||
| 
								 | 
							
								                        {
							 | 
						|||
| 
								 | 
							
								                            stock.TakeQuantity = TakeQ;
							 | 
						|||
| 
								 | 
							
								                            channelStocks.Add(stock);
							 | 
						|||
| 
								 | 
							
								                            TakeQ = 0;
							 | 
						|||
| 
								 | 
							
								                        }
							 | 
						|||
| 
								 | 
							
								                    }
							 | 
						|||
| 
								 | 
							
								                }
							 | 
						|||
| 
								 | 
							
								                else
							 | 
						|||
| 
								 | 
							
								                {
							 | 
						|||
| 
								 | 
							
								                    msg.Add($"药品【{orderDetail.DrugInfo.DrugName}】库存不足,应取【{TakeQ}】库存【{total}】");
							 | 
						|||
| 
								 | 
							
								                }
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								            if (msg.Count > 0)
							 | 
						|||
| 
								 | 
							
								            {
							 | 
						|||
| 
								 | 
							
								                RequestClose?.Invoke(new DialogResult(ButtonResult.Cancel));
							 | 
						|||
| 
								 | 
							
								                //MessageBox.Show(string.Join("\n", msg));
							 | 
						|||
| 
								 | 
							
								                DialogParameters dialogParameters = new DialogParameters();
							 | 
						|||
| 
								 | 
							
								                dialogParameters.Add("msgInfo", msg);
							 | 
						|||
| 
								 | 
							
								                DialogServiceExtensions.ShowDialogHost(_dialogService, "ShowMessageDialog", dialogParameters, "RootDialog");
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								            else
							 | 
						|||
| 
								 | 
							
								            {
							 | 
						|||
| 
								 | 
							
								                channelStocks.Sort((a, b) =>
							 | 
						|||
| 
								 | 
							
								                {
							 | 
						|||
| 
								 | 
							
								                    if ((a.DrawerNo - b.DrawerNo) == 0)
							 | 
						|||
| 
								 | 
							
								                    {
							 | 
						|||
| 
								 | 
							
								                        return a.ColNo - b.ColNo;
							 | 
						|||
| 
								 | 
							
								                    }
							 | 
						|||
| 
								 | 
							
								                    return a.DrawerNo - b.DrawerNo;
							 | 
						|||
| 
								 | 
							
								                });
							 | 
						|||
| 
								 | 
							
								                ChannelStocks = channelStocks;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								        private bool _isFinishClick = false;
							 | 
						|||
| 
								 | 
							
								       
							 | 
						|||
| 
								 | 
							
								        public long CurrentTimeMillis()
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            return (long)(DateTime.UtcNow - Jan1st1970).TotalMilliseconds;
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        public DelegateCommand BtnCloseCommand
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            get => new DelegateCommand(() =>
							 | 
						|||
| 
								 | 
							
								            {
							 | 
						|||
| 
								 | 
							
								                if (Status != 0)
							 | 
						|||
| 
								 | 
							
								                {
							 | 
						|||
| 
								 | 
							
								                    Status = 0;
							 | 
						|||
| 
								 | 
							
								                }
							 | 
						|||
| 
								 | 
							
								                //DialogParameters parameters = new DialogParameters();
							 | 
						|||
| 
								 | 
							
								                //parameters.Add("",);
							 | 
						|||
| 
								 | 
							
								                // 关闭当前窗口
							 | 
						|||
| 
								 | 
							
								                RequestClose?.Invoke(new DialogResult(ButtonResult.Cancel));
							 | 
						|||
| 
								 | 
							
								            });
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        public bool KeepAlive => false;
							 | 
						|||
| 
								 | 
							
								    }
							 | 
						|||
| 
								 | 
							
								}
							 |