using BBWY.Client.APIServices; using BBWY.Client.Models; using BBWY.Client.Models.QiKu; using BBWY.Client.Views.BatchPurchase; using BBWY.Common.Trigger; using GalaSoft.MvvmLight.Command; using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows; using System.Windows.Input; namespace BBWY.Client.ViewModels { public class BatchPurchaseCreateNewOrderViewModel : BaseVM { private GlobalContext globalContext; private PurchaseProductAPIService purchaseProductAPIService; private PurchaseService purchaseService; private BatchPurchaseService batchPurchaseService; private DelayTrigger delayTrigger; private bool isLoading; private decimal productAmount; private decimal freightAmount; private decimal totalAmount; private string contactName; private string address; private string mobile; private string province; private string city; private string county; private string town; private string purchaseRemark; private PurchaseOrderMode purchaseOrderMode = PurchaseOrderMode.批发; //private string tradeMode; private string extensions; public bool IsLoading { get => isLoading; set { Set(ref isLoading, value); } } public decimal ProductAmount { get => productAmount; set { Set(ref productAmount, value); } } public decimal FreightAmount { get => freightAmount; set { Set(ref freightAmount, value); } } public decimal TotalAmount { get => totalAmount; set { Set(ref totalAmount, value); } } public string ContactName { get => contactName; set { Set(ref contactName, value); } } public string Address { get => address; set { Set(ref address, value); } } public string Mobile { get => mobile; set { Set(ref mobile, value); } } public string Province { get => province; set { Set(ref province, value); } } public string City { get => city; set { Set(ref city, value); } } public string County { get => county; set { Set(ref county, value); } } public string Town { get => town; set { Set(ref town, value); } } public string PurchaseRemark { get => purchaseRemark; set { Set(ref purchaseRemark, value); } } public PurchaseOrderMode PurchaseOrderMode { get => purchaseOrderMode; set { if (Set(ref purchaseOrderMode, value)) OnDelayTriggerExecute(Guid.NewGuid().ToString()); } } public IList ProductSkuWithSchemeList { get; set; } public ICommand FastCreateOrderCommand { get; set; } public ICommand PreviewOrderCommand { get; set; } public ICommand AddProductSkuCommand { get; set; } public ICommand DeleteProductSkuWithSchemeCommand { get; set; } public ICommand EditQuantityRatioCommand { get; set; } public ICommand AddQuantityCommand { get; set; } public ICommand SubtractQuantityCommand { get; set; } public BatchPurchaseCreateNewOrderViewModel(PurchaseProductAPIService purchaseProductAPIService, PurchaseService purchaseService, GlobalContext globalContext, BatchPurchaseService batchPurchaseService) { this.globalContext = globalContext; this.purchaseProductAPIService = purchaseProductAPIService; this.purchaseService = purchaseService; this.batchPurchaseService = batchPurchaseService; ProductSkuWithSchemeList = new ObservableCollection(); FastCreateOrderCommand = new RelayCommand(FastCreateOrder); PreviewOrderCommand = new RelayCommand(PreviewOrder); AddProductSkuCommand = new RelayCommand(AddProductSku); DeleteProductSkuWithSchemeCommand = new RelayCommand(DeleteProductSkuWithScheme); EditQuantityRatioCommand = new RelayCommand(EditQuantityRatio); AddQuantityCommand = new RelayCommand(AddQuantity); SubtractQuantityCommand = new RelayCommand(SubtractQuantity); this.delayTrigger = new DelayTrigger(); this.delayTrigger.OnExecute = OnDelayTriggerExecute; } protected override void Load() { this.Province = "福建省"; this.City = "泉州市"; this.County = "鲤城区"; this.Town = "金龙街道"; this.Address = "古龙路媒人桥2号三文公寓一楼齐越中转仓";//"南环路1129号创鑫产业园3楼齐越"; this.ContactName = globalContext.User.Shop.PurchaseAccountList.FirstOrDefault(pa => pa.PurchasePlatformId == Platform.拳探)?.AccountName; } private void OnDelayTriggerExecute(string key) { if (string.IsNullOrEmpty(key)) { IsLoading = false; return; } if (ProductSkuWithSchemeList.Count() == 0) { ProductAmount = 0; FreightAmount = 0; TotalAmount = 0; IsLoading = false; return; } if (string.IsNullOrEmpty(ContactName) || string.IsNullOrEmpty(Address) || string.IsNullOrEmpty(Mobile) || string.IsNullOrEmpty(Province) || string.IsNullOrEmpty(City) || string.IsNullOrEmpty(County)) { IsLoading = false; MessageBox.Show("缺少完整的收货信息", "提示"); return; } IsLoading = true; Task.Factory.StartNew(() => batchPurchaseService.PreviewOrder(ProductSkuWithSchemeList, new Consignee() { Address = Address, City = City, ContactName = ContactName, County = County, Mobile = Mobile, Province = Province, TelePhone = Mobile, Town = Town }, this.PurchaseOrderMode, globalContext.User.Shop.PurchaseAccountList)) .ContinueWith(t => { IsLoading = false; var r = t.Result; if (!r.Success) { ProductAmount = FreightAmount = TotalAmount = 0; //tradeMode = string.Empty; App.Current.Dispatcher.Invoke(() => MessageBox.Show(r.Msg, "预览订单报价")); return; } ProductAmount = r.Data.ProductAmount; FreightAmount = r.Data.FreightAmount; TotalAmount = r.Data.TotalAmount; //tradeMode = r.Data.OrderTradeType?.Code; extensions = r.Data.Extensions; }); } private void PreviewOrder() { OnDelayTriggerExecute(Guid.NewGuid().ToString()); } private void FastCreateOrder() { if (IsLoading) return; if (TotalAmount == 0) { MessageBox.Show("总金额为0不能提交订单", "提示"); return; } if (string.IsNullOrEmpty(Mobile) || string.IsNullOrEmpty(Address) || string.IsNullOrEmpty(City) || string.IsNullOrEmpty(Province) || string.IsNullOrEmpty(County) || string.IsNullOrEmpty(Town) || string.IsNullOrEmpty(ContactName)) { MessageBox.Show("收货人信息不全", "下单"); return; } IList packSkuConfigList = null; var isContainsQT = ProductSkuWithSchemeList.Any(ps => ps.PurchasePlatform == Platform.拳探); if (isContainsQT) { var packWindow = new PackSkuConfigWindow(ProductSkuWithSchemeList.Where(ps => ps.PurchasePlatform == Platform.拳探).Select(ps => new PackSkuConfig() { Logo = ps.Logo, SkuId = ps.SkuId, Title = ps.Title, PurchaseCount = ps.Quantity }).ToList()); if (packWindow.ShowDialog() != true) return; packSkuConfigList = packWindow.GetPackSkuConfigList(); } IsLoading = true; Task.Factory.StartNew(() => batchPurchaseService.CreateOrder(ProductSkuWithSchemeList, new Consignee() { Address = Address, City = City, ContactName = ContactName, County = County, Mobile = Mobile, Province = Province, TelePhone = Mobile, Town = Town }, this.PurchaseOrderMode, globalContext.User.Shop.PurchaseAccountList, this.extensions, this.PurchaseRemark, packSkuConfigList)).ContinueWith(t => { IsLoading = false; var response = t.Result; if (!response.Success) { App.Current.Dispatcher.Invoke(() => MessageBox.Show(response.Msg, "创建采购单")); return; } if (response.Data.SuccessSkuIdList != null && response.Data.SuccessSkuIdList.Count() > 0) { //删除下单成功的订单 App.Current.Dispatcher.Invoke(() => { for (var i = 0; i < ProductSkuWithSchemeList.Count(); i++) { if (response.Data.SuccessSkuIdList.Contains(ProductSkuWithSchemeList[i].SkuId)) { ProductSkuWithSchemeList.Remove(ProductSkuWithSchemeList[i]); i--; } } }); } if (response.Data.FailSkuList != null && response.Data.FailSkuList.Count() > 0) { var errorBuilder = new StringBuilder(); foreach (var error in response.Data.FailSkuList) { errorBuilder.AppendLine($"SkuId {error.SkuId}"); errorBuilder.AppendLine($"错误信息 {error.ErrorMsg}"); errorBuilder.AppendLine(); } App.Current.Dispatcher.Invoke(() => MessageBox.Show(errorBuilder.ToString(), "创建采购单")); } else { //关闭窗口 App.Current.Dispatcher.Invoke(() => GalaSoft.MvvmLight.Messaging.Messenger.Default.Send(true, "BatchCreateNewPurchaseOrderClose")); } }); } private void AddProductSku() { var addProductSkuWindow = new BatchPurchaseAddProductSku(); if (addProductSkuWindow.ShowDialog() != true) return; var newProductSkuWithSchemeList = addProductSkuWindow.SelectedProductSkuWithSchemeList; var waitList = new List(); foreach (var newProductSkuWithScheme in newProductSkuWithSchemeList) { if (ProductSkuWithSchemeList.Any(item => item.SkuId == newProductSkuWithScheme.SkuId)) continue; ProductSkuWithSchemeList.Add(newProductSkuWithScheme); var ewh = new ManualResetEvent(false); waitList.Add(ewh); Task.Factory.StartNew(() => LoadPurchaseScheme(newProductSkuWithScheme, ewh)); } if (waitList.Count() == 0) return; IsLoading = true; Task.Factory.StartNew(() => { WaitHandle.WaitAll(waitList.ToArray()); PreviewOrder(); //预览订单 }); } private void LoadPurchaseScheme(ProductSkuWithScheme productSkuWithScheme, EventWaitHandle ewh) { try { #region 加载采购方案 var purchaseSchemeResponse = purchaseService.GetPurchaseSchemeList(shopId: globalContext.User.Shop.ShopId, schemeId: productSkuWithScheme.PurchaseSchemeId); if (!purchaseSchemeResponse.Success) { App.Current.Dispatcher.Invoke(() => MessageBox.Show($"方案Id{productSkuWithScheme.PurchaseSchemeId}\r\n{purchaseSchemeResponse.Msg}", "加载采购方案失败")); return; } var purchaseScheme = purchaseSchemeResponse.Data[0]; #endregion #region 完善采购方案基本信息 foreach (var purchaseSchemeProduct in purchaseScheme.PurchaseSchemeProductList) { var data = purchaseProductAPIService.GetProductInfo(productSkuWithScheme.PurchasePlatform.Value, productSkuWithScheme.ProductId, productSkuWithScheme.SkuId, purchaseSchemeProduct.PurchaseProductId, PurchaseOrderMode.批发, PurchaseProductAPIMode.Spider); if (data != null && data.Value.purchaseSchemeProductSkus != null && data.Value.purchaseSchemeProductSkus.Count > 0) { App.Current.Dispatcher.Invoke(() => { foreach (var purchaseSchemeProductSku in data.Value.purchaseSchemeProductSkus) { if (purchaseSchemeProduct.PurchaseSchemeProductSkuList.Any(s => s.PurchaseSkuId == purchaseSchemeProductSku.PurchaseSkuId)) { productSkuWithScheme.PurchaseSchemeProductSkuList.Add(purchaseSchemeProductSku); purchaseSchemeProductSku.ItemTotal = productSkuWithScheme.Quantity; purchaseSchemeProductSku.OnItemTotalChanged = OnItemTotalChanged; } } }); } } #endregion } catch { } finally { ewh.Set(); } } private void OnItemTotalChanged(int itemTotal) { Console.WriteLine($"OnItemTotalChanged {DateTime.Now} {itemTotal}"); this.delayTrigger.SetKey(Guid.NewGuid().ToString()); } private void DeleteProductSkuWithScheme(ProductSkuWithScheme productSkuWithScheme) { ProductSkuWithSchemeList.Remove(productSkuWithScheme); this.delayTrigger.SetKey(Guid.NewGuid().ToString()); } private void EditQuantityRatio(object param) { var paramList = (object[])param; var skuQuantity = Convert.ToInt32(paramList[0]); var purchaseSchemeProductSku = paramList[1] as PurchaseSchemeProductSku; var editWindow = new EditQuantityRatioWindow(purchaseSchemeProductSku.QuantityRatio); if (editWindow.ShowDialog() == true) { var quantityRatio = editWindow.QuantityRatio; purchaseSchemeProductSku.QuantityRatio = quantityRatio; purchaseSchemeProductSku.ItemTotal = quantityRatio * skuQuantity; } } private void AddQuantity(PurchaseSchemeProductSku purchaseSchemeProductSku) { purchaseSchemeProductSku.ItemTotal++; } private void SubtractQuantity(PurchaseSchemeProductSku purchaseSchemeProductSku) { if (purchaseSchemeProductSku.ItemTotal > 1) purchaseSchemeProductSku.ItemTotal--; } } }