diff --git a/BBWYB.Client/App.xaml.cs b/BBWYB.Client/App.xaml.cs index 8a1a738..5a4d83d 100644 --- a/BBWYB.Client/App.xaml.cs +++ b/BBWYB.Client/App.xaml.cs @@ -1,5 +1,6 @@ using BBWYB.Client.Helpers; using BBWYB.Client.Models; +using BBWYB.Client.ViewModels; using BBWYB.Common.Extensions; using BBWYB.Common.Http; using BBWYB.Common.Models; @@ -72,6 +73,8 @@ namespace BBWYB.Client serviceCollection.AddSingleton(); serviceCollection.AddSingleton(gl); serviceCollection.BatchRegisterServices(new Assembly[] { Assembly.Load("BBWYB.Client") }, typeof(IDenpendency)); + serviceCollection.AddTransient(); + serviceCollection.AddTransient(); serviceCollection.AddMapper(new MappingProfile()); ServiceProvider = serviceCollection.BuildServiceProvider(); base.OnStartup(e); diff --git a/BBWYB.Client/ViewModels/Order/ChoosePurchaseSchemeViewModel.cs b/BBWYB.Client/ViewModels/Order/ChoosePurchaseSchemeViewModel.cs index d982d2d..c39638d 100644 --- a/BBWYB.Client/ViewModels/Order/ChoosePurchaseSchemeViewModel.cs +++ b/BBWYB.Client/ViewModels/Order/ChoosePurchaseSchemeViewModel.cs @@ -1,7 +1,9 @@ using BBWYB.Client.APIServices; using BBWYB.Client.Models; -using BBWYB.Common.Models; +using BBWYB.Client.Views.Order; +using BBWYB.Client.Views.Purchase; using CommunityToolkit.Mvvm.Input; +using CommunityToolkit.Mvvm.Messaging; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Linq; @@ -11,7 +13,7 @@ using System.Windows.Input; namespace BBWYB.Client.ViewModels { - public class ChoosePurchaseSchemeViewModel : BaseVM, IDenpendency + public class ChoosePurchaseSchemeViewModel : BaseVM { private PurchaseService purchaseService; private GlobalContext globalContext; @@ -39,17 +41,9 @@ namespace BBWYB.Client.ViewModels protected override void Load() { - PurchaserList.Clear(); Task.Factory.StartNew(() => LoadPurchaser()); } - protected override void Unload() - { - this.order = null; - this.NoPurchaser = false; - PurchaserList.Clear(); - } - public void SetData(Order order) { this.order = order; @@ -84,9 +78,10 @@ namespace BBWYB.Client.ViewModels return; } - var p = new _1688Purchase(order, purchaser, purchaseAccount); + var p = new OnlinePurchase(order, purchaser, purchaseAccount); p.ShowDialog(); - GalaSoft.MvvmLight.Messaging.Messenger.Default.Send(null, "ChoosePurchaseScheme_Close"); + // GalaSoft.MvvmLight.Messaging.Messenger.Default.Send(null, "ChoosePurchaseScheme_Close"); + WeakReferenceMessenger.Default.Send(new Message_ChoosePurchaseSchemeClose(null)); } } diff --git a/BBWYB.Client/ViewModels/Order/OrderViewModel.cs b/BBWYB.Client/ViewModels/Order/OrderViewModel.cs index 38eb84c..167e70e 100644 --- a/BBWYB.Client/ViewModels/Order/OrderViewModel.cs +++ b/BBWYB.Client/ViewModels/Order/OrderViewModel.cs @@ -58,6 +58,8 @@ namespace BBWYB.Client.ViewModels public ICommand OrderPageIndexChangedCommand { get; set; } public ICommand SearchOrderCommand { get; set; } + public ICommand OnlinePurchaseCommand { get; set; } + public OrderViewModel(GlobalContext globalContext, OrderService orderService) { OrderList = new ObservableCollection(); @@ -78,6 +80,7 @@ namespace BBWYB.Client.ViewModels { Task.Factory.StartNew(() => LoadOrder(p.PageIndex)); }); + OnlinePurchaseCommand = new RelayCommand(OnlinePurchase); PageIndex = 1; PageSize = 10; EndDate = DateTime.Now; @@ -102,41 +105,9 @@ namespace BBWYB.Client.ViewModels }); } IsLoading = false; - //OrderCount = response.Data.Count; - //if (response.Data.Items == null || response.Data.Items.Count() == 0) - // return; - - //response.Data.Items = new List() - //{ - // new OrderResponse() - // { - // Id = "3213213121", - // StartTime = DateTime.Now, - // OrderState = Models.OrderState.等待采购, - // OrderSellerPrice=100, - // OrderCost = new OrderCostResponse(){ - // DeliveryExpressFreight=50, - // Profit=100, - // TotalCost=120, - // PurchaseAmount=150 - // }, - // BuyerRemark="12312fffff", - // Consignee = new ConsigneeResponse(){ - // Mobile="18996038927", - // Province="重庆", - // ContactName="山鸡" - // }, - // ItemList = new List(){ - // new OrderSkuResponse(){ - // ItemTotal=2, - // Logo="https://img13.360buyimg.com/n9/s80x80_jfs/t1/87954/9/35896/95921/6431716fFa3d09cae/e1f687d25af0ddf1.jpg", - // Price=15, - // ProductId="10023985258330", - // SkuId="10072665703169", Title="特大绿色托盘熊50CM" - // } - // } - // } - //}; + OrderCount = response.Data.Count; + if (response.Data.Items == null || response.Data.Items.Count() == 0) + return; var list = response.Data.Items.Map>(); App.Current.Dispatcher.Invoke(() => @@ -185,6 +156,12 @@ namespace BBWYB.Client.ViewModels } PageIndex = 1; } + + private void OnlinePurchase(Order order) + { + var choosePurchaseScheme = new ChoosePurchaseScheme(order); + choosePurchaseScheme.ShowDialog(); + } } } diff --git a/BBWYB.Client/ViewModels/Purchase/OnlinePurchaseViewModel.cs b/BBWYB.Client/ViewModels/Purchase/OnlinePurchaseViewModel.cs new file mode 100644 index 0000000..c46cbf1 --- /dev/null +++ b/BBWYB.Client/ViewModels/Purchase/OnlinePurchaseViewModel.cs @@ -0,0 +1,321 @@ +using BBWYB.Client.APIServices; +using BBWYB.Client.Models; +using BBWYB.Common.Trigger; +using CommunityToolkit.Mvvm.Input; +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Input; + +namespace BBWYB.Client.ViewModels +{ + public class OnlinePurchaseViewModel : BaseVM + { + public ICommand FastCreateOrderCommand { get; set; } + public ICommand PreviewOrderCommand { get; set; } + + public IList PurchaseSchemeProductSkuList { get; set; } + + public bool IsLoading { get => isLoading; set { SetProperty(ref isLoading, value); } } + + public decimal ProductAmount { get => productAmount; set { SetProperty(ref productAmount, value); } } + public decimal FreightAmount { get => freightAmount; set { SetProperty(ref freightAmount, value); } } + public decimal TotalAmount { get => totalAmount; set { SetProperty(ref totalAmount, value); } } + public string ContactName { get => contactName; set { SetProperty(ref contactName, value); } } + public string Address { get => address; set { SetProperty(ref address, value); } } + public string Mobile { get => mobile; set { SetProperty(ref mobile, value); } } + public string Province { get => province; set { SetProperty(ref province, value); } } + public string City { get => city; set { SetProperty(ref city, value); } } + public string County { get => county; set { SetProperty(ref county, value); } } + public string Town { get => town; set { SetProperty(ref town, value); } } + public string PrucahseRemark { get => prucahseRemark; set { SetProperty(ref prucahseRemark, value); } } + + public PurchaseOrderMode PurchaseOrderMode + { + get => purchaseOrderMode; set + { + if (SetProperty(ref purchaseOrderMode, value)) + OnDelayTriggerExecute(Guid.NewGuid().ToString()); + } + } + + private Purchaser purchaser; + private Order order; + private PurchaseAccount purchaseAccount; + + private IList purchaseSchemeList; + private OrderViewModel orderListViewModel; + private GlobalContext globalContext; + private bool isLoading; + private PurchaseService purchaseService; + private PurchaseOrderService purchaseOrderService; + private PurchaseProductAPIService purchaseProductAPIService; + private DelayTrigger delayTrigger; + + 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 prucahseRemark; + private PurchaseOrderMode purchaseOrderMode = PurchaseOrderMode.代发; + private string tradeMode; + /// + /// 扩展数据,暂用于拳探 + /// + private string extensions; + + public OnlinePurchaseViewModel(PurchaseService purchaseService, + PurchaseOrderService purchaseOrderService, + PurchaseProductAPIService purchaseProductAPIService, + GlobalContext globalContext, + OrderViewModel orderListViewModel) + { + this.purchaseOrderService = purchaseOrderService; + this.purchaseProductAPIService = purchaseProductAPIService; + this.purchaseService = purchaseService; + this.delayTrigger = new DelayTrigger(); + this.delayTrigger.OnExecute = OnDelayTriggerExecute; + PurchaseSchemeProductSkuList = new ObservableCollection(); + purchaseSchemeList = new List(); + FastCreateOrderCommand = new RelayCommand(FastCreateOrder); + PreviewOrderCommand = new RelayCommand(PreviewOrder); + this.globalContext = globalContext; + this.orderListViewModel = orderListViewModel; + //PurchaseOrderMode = PurchaseOrderMode.代发; + } + + public void SetData(Order order, Purchaser purchaser, PurchaseAccount purchaseAccount) + { + this.order = order; + this.purchaser = purchaser; + this.purchaseAccount = purchaseAccount; + + this.ContactName = order.Consignee.ContactName; + this.Address = order.Consignee.Address; + this.Province = order.Consignee.Province; + this.City = order.Consignee.City; + this.County = order.Consignee.County; + this.Town = order.Consignee.Town; + this.Mobile = order.Consignee.Mobile; + } + + protected override void Load() + { + IsLoading = true; + + Task.Factory.StartNew(() => purchaseService.GetPurchaseSchemeList(order.ItemList.Select(osku => osku.SkuId).ToList(), purchaser.Id, globalContext.User.Shop.ShopId)) + .ContinueWith(r => + { + var purchaseSchemeResponse = r.Result; + if (!purchaseSchemeResponse.Success) + { + IsLoading = false; + App.Current.Dispatcher.Invoke(() => MessageBox.Show(purchaseSchemeResponse.Msg, "获取采购方案")); + return; + } + + var waitList = new List(); + foreach (var purchaseSchemeApiModel in purchaseSchemeResponse.Data) + { + var purchaseScheme = PurchaseScheme.Convert(purchaseSchemeApiModel); + purchaseSchemeList.Add(purchaseScheme); + foreach (var purchaseSchemeProduct in purchaseScheme.PurchaseSchemeProductList) + { + var ewh = new ManualResetEvent(false); + waitList.Add(ewh); + var orderSku = order.ItemList.FirstOrDefault(osku => osku.SkuId == purchaseScheme.SkuId); + Task.Factory.StartNew(() => LoadPurchaseProduct(purchaseScheme.PurchasePlatform, purchaseSchemeProduct, orderSku, ewh)); + } + } + + WaitHandle.WaitAll(waitList.ToArray()); + //IsLoading = false; + if (PurchaseSchemeProductSkuList.Count() > 0) + OnDelayTriggerExecute(Guid.NewGuid().ToString()); + else + { + IsLoading = false; + App.Current.Dispatcher.Invoke(() => MessageBox.Show("采购方案商品加载失败,请重新打开预览窗口", "提示")); + } + }); + } + + protected override void Unload() + { + order = null; + purchaser = null; + purchaseAccount = null; + + purchaseSchemeList.Clear(); + PurchaseSchemeProductSkuList.Clear(); + tradeMode = string.Empty; + extensions = string.Empty; + ProductAmount = FreightAmount = TotalAmount = 0; + ContactName = Address = Mobile = Province = City = County = Town = PrucahseRemark = string.Empty; + } + + private void LoadPurchaseProduct(Platform platform, PurchaseSchemeProduct purchaseSchemeProduct, OrderSku orderSku, ManualResetEvent ewh) + { + var data = purchaseProductAPIService.GetProductInfo(platform, + purchaseSchemeProduct.ProductId, + purchaseSchemeProduct.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.SelectedSkuIdList.Any(s => s == purchaseSchemeProductSku.PurchaseSkuId)) + { + PurchaseSchemeProductSkuList.Add(purchaseSchemeProductSku); + purchaseSchemeProductSku.ItemTotal = orderSku.ItemTotal; + purchaseSchemeProductSku.OnItemTotalChanged = OnItemTotalChanged; + } + } + }); + } + + ewh.Set(); + ewh.Dispose(); + } + + + private void OnItemTotalChanged(int itemTotal) + { + Console.WriteLine($"OnItemTotalChanged {DateTime.Now} {itemTotal}"); + this.delayTrigger.SetKey(itemTotal.ToString()); + } + + private void OnDelayTriggerExecute(string key) + { + if (string.IsNullOrEmpty(key)) + { + 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(() => purchaseOrderService.PreviewPurchaseOrder(new Consignee() + { + Address = Address, + City = City, + ContactName = ContactName, + County = County, + Mobile = Mobile, + Province = Province, + TelePhone = Mobile, + Town = Town + }, PurchaseSchemeProductSkuList, purchaseAccount.PurchasePlatformId, purchaseAccount, PurchaseOrderMode)) + .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 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; + } + + IsLoading = true; + Task.Factory.StartNew(() => purchaseOrderService.FastCreateOrder(new Consignee() + { + Address = Address, + City = City, + ContactName = ContactName, + County = County, + Mobile = Mobile, + Province = Province, + TelePhone = Mobile, + Town = Town + }, PurchaseSchemeProductSkuList, + purchaseAccount.PurchasePlatformId, + purchaseAccount, + PurchaseOrderMode, + tradeMode, + PrucahseRemark, + order.Id, + globalContext.User.Shop.ShopId, + purchaseAccount.Id, + purchaseAccount.AccountName, + purchaseSchemeList[0].PurchaserName, + purchaser.Id, + globalContext.User.Shop.PlatformCommissionRatio ?? 0.05M, + extensions)).ContinueWith(t => + { + IsLoading = false; + var r = t.Result; + if (!r.Success) + { + App.Current.Dispatcher.Invoke(() => MessageBox.Show(r.Msg, "下单")); + return; + } + + //刷新订单列表 + //orderListViewModel.RefreshOrder(order.Id); + + //关闭当前窗口 + //GalaSoft.MvvmLight.Messaging.Messenger.Default.Send(null, "OnlinePurchase_Close"); + }); + } + + private void PreviewOrder() + { + OnDelayTriggerExecute(Guid.NewGuid().ToString()); + } + } +} diff --git a/BBWYB.Client/ViewModels/ViewModelLocator.cs b/BBWYB.Client/ViewModels/ViewModelLocator.cs index e82d174..3a288df 100644 --- a/BBWYB.Client/ViewModels/ViewModelLocator.cs +++ b/BBWYB.Client/ViewModels/ViewModelLocator.cs @@ -75,5 +75,27 @@ namespace BBWYB.Client.ViewModels } } } + + public ChoosePurchaseSchemeViewModel ChoosePurchaseScheme + { + get + { + using (var s = sp.CreateScope()) + { + return s.ServiceProvider.GetRequiredService(); + } + } + } + + public OnlinePurchaseViewModel OnlinePurchase + { + get + { + using (var s = sp.CreateScope()) + { + return s.ServiceProvider.GetRequiredService(); + } + } + } } } diff --git a/BBWYB.Client/Views/Order/ChoosePurchaseScheme.xaml.cs b/BBWYB.Client/Views/Order/ChoosePurchaseScheme.xaml.cs index 5d1423e..3d90eb8 100644 --- a/BBWYB.Client/Views/Order/ChoosePurchaseScheme.xaml.cs +++ b/BBWYB.Client/Views/Order/ChoosePurchaseScheme.xaml.cs @@ -1,4 +1,6 @@ -using CommunityToolkit.Mvvm.Messaging; +using BBWYB.Client.ViewModels; +using CommunityToolkit.Mvvm.Messaging; +using CommunityToolkit.Mvvm.Messaging.Messages; using SJ.Controls; namespace BBWYB.Client.Views.Order @@ -8,9 +10,10 @@ namespace BBWYB.Client.Views.Order /// public partial class ChoosePurchaseScheme : BWindow { - public ChoosePurchaseScheme() + public ChoosePurchaseScheme(Models.Order order) { InitializeComponent(); + (this.DataContext as ChoosePurchaseSchemeViewModel).SetData(order); this.Loaded += ChoosePurchaseScheme_Loaded; this.Unloaded += ChoosePurchaseScheme_Unloaded; } @@ -23,6 +26,21 @@ namespace BBWYB.Client.Views.Order private void ChoosePurchaseScheme_Loaded(object sender, System.Windows.RoutedEventArgs e) { //Messenger.Default.Register(this, "ChoosePurchaseScheme_Close", (x) => this.Close()); + + WeakReferenceMessenger.Default.Register(this, (o, x) => + { + this.Dispatcher.Invoke(() => + { + this.Close(); + }); + }); + } + } + + public class Message_ChoosePurchaseSchemeClose : ValueChangedMessage + { + public Message_ChoosePurchaseSchemeClose(object value) : base(value) + { } } } diff --git a/BBWYB.Client/Views/Order/OrderList.xaml b/BBWYB.Client/Views/Order/OrderList.xaml index a53334f..55207c5 100644 --- a/BBWYB.Client/Views/Order/OrderList.xaml +++ b/BBWYB.Client/Views/Order/OrderList.xaml @@ -462,6 +462,8 @@ diff --git a/BBWYB.Client/Views/Purchase/OnlinePurchase.xaml b/BBWYB.Client/Views/Purchase/OnlinePurchase.xaml new file mode 100644 index 0000000..8606e76 --- /dev/null +++ b/BBWYB.Client/Views/Purchase/OnlinePurchase.xaml @@ -0,0 +1,140 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/BBWYB.Client/Views/Purchase/OnlinePurchase.xaml.cs b/BBWYB.Client/Views/Purchase/OnlinePurchase.xaml.cs new file mode 100644 index 0000000..938b560 --- /dev/null +++ b/BBWYB.Client/Views/Purchase/OnlinePurchase.xaml.cs @@ -0,0 +1,47 @@ +using BBWYB.Client.Models; +using BBWYB.Client.ViewModels; +using CommunityToolkit.Mvvm.Messaging; +using CommunityToolkit.Mvvm.Messaging.Messages; +using SJ.Controls; + +namespace BBWYB.Client.Views.Purchase +{ + /// + /// _1688Purchase.xaml 的交互逻辑 + /// + public partial class OnlinePurchase : BWindow + { + public OnlinePurchase(Models.Order order, Purchaser purchaser, PurchaseAccount purchaseAccount) + { + InitializeComponent(); + (this.DataContext as OnlinePurchaseViewModel).SetData(order, purchaser, purchaseAccount); + this.Loaded += _1688Purchase_Loaded; + this.Unloaded += _1688Purchase_Unloaded; + } + + private void _1688Purchase_Unloaded(object sender, System.Windows.RoutedEventArgs e) + { + //Messenger.Default.Unregister(this); + WeakReferenceMessenger.Default.UnregisterAll(this); + } + + private void _1688Purchase_Loaded(object sender, System.Windows.RoutedEventArgs e) + { + //Messenger.Default.Register(this, "OnlinePurchase_Close", (x) => this.Dispatcher.Invoke(() => this.Close())); + WeakReferenceMessenger.Default.Register(this, (o, x) => + { + this.Dispatcher.Invoke(() => + { + this.Dispatcher.Invoke(() => this.Close()); + }); + }); + } + } + + public class Message_OnlinePurchase_Close : ValueChangedMessage + { + public Message_OnlinePurchase_Close(object value) : base(value) + { + } + } +} diff --git a/SDKAdapter/OperationPlatform/Client/Impl/OP_QuanTanClient.cs b/SDKAdapter/OperationPlatform/Client/Impl/OP_QuanTanClient.cs index 5557996..18b2f8d 100644 --- a/SDKAdapter/OperationPlatform/Client/Impl/OP_QuanTanClient.cs +++ b/SDKAdapter/OperationPlatform/Client/Impl/OP_QuanTanClient.cs @@ -54,7 +54,8 @@ namespace SDKAdapter.OperationPlatform.Client page = request.PageIndex, pageSize = request.PageSize, storeId = request.AppToken, - productId = request.Spu + productId = request.Spu, + productSku = request.Sku }, request.AppKey, request.AppSecret); if (qtResponse.Status != 200)