From 55e70a337cc5daf5803978cbfb738f31572cc04b Mon Sep 17 00:00:00 2001 From: shanj <18996038927@163.com> Date: Fri, 28 Apr 2023 02:05:38 +0800 Subject: [PATCH] 1 --- .../PurchaseScheme/ProductSkuWithScheme.cs | 69 ++++ .../PurchaseSchemeProductSku.cs | 8 + .../Order/ChoosePurchaseSchemeViewModel.cs | 9 +- .../Purchase/OnlinePurchaseViewModel.cs | 336 ++++++++++------- .../Purchase/EditQuantityRatioWindow.xaml | 38 ++ .../Purchase/EditQuantityRatioWindow.xaml.cs | 43 +++ .../Views/Purchase/OnlinePurchase.xaml | 245 ++++++++++++- .../PurchaseOrder/PurchaseOrderBusiness.cs | 339 ++++++++++-------- .../Db/Order/OrderPurchaseInfo.cs | 30 +- .../PurchaseOrder/CargoParamRequest.cs | 8 + .../PurchaseOrder/CreateOrderRequest.cs | 6 - .../PurchaseOrder/PreviewOrderRequest.cs | 15 +- .../PurchaseOrder/PurchaseAccountRequest.cs | 28 ++ 13 files changed, 849 insertions(+), 325 deletions(-) create mode 100644 BBWYB.Client/Models/PurchaseScheme/ProductSkuWithScheme.cs create mode 100644 BBWYB.Client/Views/Purchase/EditQuantityRatioWindow.xaml create mode 100644 BBWYB.Client/Views/Purchase/EditQuantityRatioWindow.xaml.cs create mode 100644 BBWYB.Server.Model/Dto/Request/PurchaseOrder/PurchaseAccountRequest.cs diff --git a/BBWYB.Client/Models/PurchaseScheme/ProductSkuWithScheme.cs b/BBWYB.Client/Models/PurchaseScheme/ProductSkuWithScheme.cs new file mode 100644 index 0000000..a283a12 --- /dev/null +++ b/BBWYB.Client/Models/PurchaseScheme/ProductSkuWithScheme.cs @@ -0,0 +1,69 @@ +using CommunityToolkit.Mvvm.ComponentModel; +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; + +namespace BBWYB.Client.Models +{ + public class ProductSkuWithScheme : ObservableObject + { + private int quantity; + private bool isSelected; + public string Id { get; set; } + + public string SkuId { get; set; } + + public string ProductId { get; set; } + + public decimal Price { get; set; } + + /// + /// Sku标题 + /// + public string Title { get; set; } + + public string Logo { get; set; } + + /// + /// 京东Sku状态【1:上架 2:下架 4:删除】 + /// + public int State { get; set; } + + public DateTime? CreateTime { get; set; } + + public long PurchaseSchemeId { get; set; } + + public string PurchaserId { get; set; } + + public string PurchaserName { get; set; } + + public Platform? PurchasePlatform { get; set; } + + public int Quantity { get => quantity; set { if (SetProperty(ref quantity, value)) OnQuantityChanged(); } } + + public IList PurchaseSchemeProductSkuList { get; set; } + + public bool IsSelected + { + get => isSelected; set { if (SetProperty(ref isSelected, value)) OnSelectChanged(); } + } + + public ProductSkuWithScheme() + { + PurchaseSchemeProductSkuList = new ObservableCollection(); + } + + private void OnSelectChanged() + { + if (IsSelected && Quantity <= 0) + Quantity = 1; + else if (!IsSelected) + Quantity = 0; + } + + private void OnQuantityChanged() + { + IsSelected = Quantity > 0; + } + } +} diff --git a/BBWYB.Client/Models/PurchaseScheme/PurchaseSchemeProductSku.cs b/BBWYB.Client/Models/PurchaseScheme/PurchaseSchemeProductSku.cs index a17e8b7..ac8fc65 100644 --- a/BBWYB.Client/Models/PurchaseScheme/PurchaseSchemeProductSku.cs +++ b/BBWYB.Client/Models/PurchaseScheme/PurchaseSchemeProductSku.cs @@ -8,6 +8,11 @@ namespace BBWYB.Client.Models /// public class PurchaseSchemeProductSku : ObservableObject { + public PurchaseSchemeProductSku() + { + QuantityRatio = 1; + } + /// /// 采购商品的SKU和采购方案的关系Id /// @@ -52,7 +57,10 @@ namespace BBWYB.Client.Models private int itemTotal; private decimal skuAmount; + private int quantityRatio; public Action OnItemTotalChanged { get; set; } + + public int QuantityRatio { get => quantityRatio; set { SetProperty(ref quantityRatio, value); } } } } diff --git a/BBWYB.Client/ViewModels/Order/ChoosePurchaseSchemeViewModel.cs b/BBWYB.Client/ViewModels/Order/ChoosePurchaseSchemeViewModel.cs index 36cdbe5..deb0168 100644 --- a/BBWYB.Client/ViewModels/Order/ChoosePurchaseSchemeViewModel.cs +++ b/BBWYB.Client/ViewModels/Order/ChoosePurchaseSchemeViewModel.cs @@ -100,9 +100,16 @@ namespace BBWYB.Client.ViewModels return; if (!isResponse) return; - isResponse = false; + var purchaserId = skuGroup.SelectedScheme.PurchaserId; + + foreach (var otherSkuGroup in SkuGroup) + { + if (otherSkuGroup.SkuId == skuGroup.SkuId) + continue; + otherSkuGroup.SelectedScheme = otherSkuGroup.SchemeList.FirstOrDefault(s => s.PurchaserId == purchaserId); + } isResponse = true; } } diff --git a/BBWYB.Client/ViewModels/Purchase/OnlinePurchaseViewModel.cs b/BBWYB.Client/ViewModels/Purchase/OnlinePurchaseViewModel.cs index 539b4c6..ea93615 100644 --- a/BBWYB.Client/ViewModels/Purchase/OnlinePurchaseViewModel.cs +++ b/BBWYB.Client/ViewModels/Purchase/OnlinePurchaseViewModel.cs @@ -20,7 +20,15 @@ namespace BBWYB.Client.ViewModels public ICommand FastCreateOrderCommand { get; set; } public ICommand PreviewOrderCommand { get; set; } - public IList PurchaseSchemeProductSkuList { get; set; } + public ICommand EditQuantityRatioCommand { get; set; } + + public ICommand AddQuantityCommand { get; set; } + + public ICommand SubtractQuantityCommand { get; set; } + + //public IList PurchaseSchemeProductSkuList { get; set; } + + public IList ProductSkuWithSchemeList { get; set; } public bool IsLoading { get => isLoading; set { SetProperty(ref isLoading, value); } } @@ -70,6 +78,8 @@ namespace BBWYB.Client.ViewModels private string town; private string prucahseRemark; private PurchaseOrderMode purchaseOrderMode = PurchaseOrderMode.代发; + + private IList schemeList; /// /// 扩展数据,暂用于拳探 /// @@ -86,10 +96,13 @@ namespace BBWYB.Client.ViewModels this.purchaseService = purchaseService; this.delayTrigger = new DelayTrigger(); this.delayTrigger.OnExecute = OnDelayTriggerExecute; - PurchaseSchemeProductSkuList = new ObservableCollection(); + ProductSkuWithSchemeList = new ObservableCollection(); purchaseSchemeList = new List(); FastCreateOrderCommand = new RelayCommand(FastCreateOrder); PreviewOrderCommand = new RelayCommand(PreviewOrder); + EditQuantityRatioCommand = new RelayCommand(EditQuantityRatio); + AddQuantityCommand = new RelayCommand(AddQuantity); + SubtractQuantityCommand = new RelayCommand(SubtractQuantity); this.globalContext = globalContext; this.orderVM = orderVM; //PurchaseOrderMode = PurchaseOrderMode.代发; @@ -100,7 +113,7 @@ namespace BBWYB.Client.ViewModels this.order = order; //this.purchaser = purchaser; //this.purchaseAccount = purchaseAccount; - + this.schemeList = schemeList; this.ContactName = order.Consignee.ContactName; this.Address = order.Consignee.Address; this.Province = order.Consignee.Province; @@ -113,83 +126,116 @@ namespace BBWYB.Client.ViewModels protected override void Load() { IsLoading = true; + var waitList = new List(); + foreach (var scheme in schemeList) + { + var orderSku = order.ItemList.FirstOrDefault(osku => osku.SkuId == scheme.SkuId); + var productSkuWithScheme = new ProductSkuWithScheme() + { + SkuId = scheme.SkuId, + Id = scheme.SkuId, + Logo = orderSku.Logo, + Price = orderSku.Price.Value, + ProductId = scheme.ProductId, + PurchasePlatform = scheme.PurchasePlatform, + PurchaserId = scheme.PurchaserId, + PurchaserName = scheme.PurchaserName, + PurchaseSchemeId = scheme.Id, + Quantity = orderSku.ItemTotal, + Title = orderSku.Title + }; + ProductSkuWithSchemeList.Add(productSkuWithScheme); - 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 ewh = new ManualResetEvent(false); + waitList.Add(ewh); + Task.Factory.StartNew(() => LoadPurchaseScheme(productSkuWithScheme, scheme, ewh)); + } - 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)); - } - } + Task.Factory.StartNew(() => + { + WaitHandle.WaitAll(waitList.ToArray()); + PreviewOrder(); //预览订单 + }); - WaitHandle.WaitAll(waitList.ToArray()); - //IsLoading = false; - if (PurchaseSchemeProductSkuList.Count() > 0) - OnDelayTriggerExecute(Guid.NewGuid().ToString()); - else - { - IsLoading = false; - App.Current.Dispatcher.Invoke(() => MessageBox.Show("采购方案商品加载失败,请重新打开预览窗口", "提示")); - } - }); - } + //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; + // } - protected override void Unload() - { - order = null; - purchaser = null; - purchaseAccount = null; - - purchaseSchemeList.Clear(); - PurchaseSchemeProductSkuList.Clear(); - extensions = string.Empty; - ProductAmount = FreightAmount = TotalAmount = 0; - ContactName = Address = Mobile = Province = City = County = Town = PrucahseRemark = string.Empty; + // 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("采购方案商品加载失败,请重新打开预览窗口", "提示")); + // } + // }); } - private void LoadPurchaseProduct(Platform platform, PurchaseSchemeProduct purchaseSchemeProduct, OrderSku orderSku, ManualResetEvent ewh) + private void LoadPurchaseScheme(ProductSkuWithScheme productSkuWithScheme, PurchaseScheme purchaseScheme, EventWaitHandle 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) + try { - App.Current.Dispatcher.Invoke(() => + #region 完善采购方案基本信息 + foreach (var purchaseSchemeProduct in purchaseScheme.PurchaseSchemeProductList) { - foreach (var purchaseSchemeProductSku in data.Value.purchaseSchemeProductSkus) + 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) { - if (purchaseSchemeProduct.SelectedSkuIdList.Any(s => s == purchaseSchemeProductSku.PurchaseSkuId)) + App.Current.Dispatcher.Invoke(() => { - PurchaseSchemeProductSkuList.Add(purchaseSchemeProductSku); - purchaseSchemeProductSku.ItemTotal = orderSku.ItemTotal; - purchaseSchemeProductSku.OnItemTotalChanged = OnItemTotalChanged; - } + foreach (var purchaseSchemeProductSku in data.Value.purchaseSchemeProductSkus) + { + if (purchaseSchemeProduct.SelectedSkuIdList.Any(s => s == purchaseSchemeProductSku.PurchaseSkuId)) + { + productSkuWithScheme.PurchaseSchemeProductSkuList.Add(purchaseSchemeProductSku); + + purchaseSchemeProductSku.ItemTotal = productSkuWithScheme.Quantity; + purchaseSchemeProductSku.OnItemTotalChanged = OnItemTotalChanged; + } + } + }); } - }); + } + #endregion } + catch + { - ewh.Set(); - ewh.Dispose(); + } + finally + { + ewh.Set(); + ewh.Dispose(); + } } @@ -219,35 +265,35 @@ namespace BBWYB.Client.ViewModels 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; - extensions = 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; - }); + //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; + // extensions = 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() @@ -276,48 +322,74 @@ namespace BBWYB.Client.ViewModels 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, - PrucahseRemark, - order.Id, - globalContext.User.Shop.ShopId, - purchaseSchemeList[0].PurchaserName, - 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); - orderVM.RefreshOrder(order.Id); - - //关闭当前窗口 - //GalaSoft.MvvmLight.Messaging.Messenger.Default.Send(null, "OnlinePurchase_Close"); - WeakReferenceMessenger.Default.Send(new Message_OnlinePurchase_Close(null)); - }); + //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, + // PrucahseRemark, + // order.Id, + // globalContext.User.Shop.ShopId, + // purchaseSchemeList[0].PurchaserName, + // 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); + // orderVM.RefreshOrder(order.Id); + + // //关闭当前窗口 + // //GalaSoft.MvvmLight.Messaging.Messenger.Default.Send(null, "OnlinePurchase_Close"); + // WeakReferenceMessenger.Default.Send(new Message_OnlinePurchase_Close(null)); + // }); } private void PreviewOrder() { OnDelayTriggerExecute(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--; + } } } diff --git a/BBWYB.Client/Views/Purchase/EditQuantityRatioWindow.xaml b/BBWYB.Client/Views/Purchase/EditQuantityRatioWindow.xaml new file mode 100644 index 0000000..b5e67b8 --- /dev/null +++ b/BBWYB.Client/Views/Purchase/EditQuantityRatioWindow.xaml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/BBWYB.Client/Views/Purchase/EditQuantityRatioWindow.xaml.cs b/BBWYB.Client/Views/Purchase/EditQuantityRatioWindow.xaml.cs new file mode 100644 index 0000000..730317d --- /dev/null +++ b/BBWYB.Client/Views/Purchase/EditQuantityRatioWindow.xaml.cs @@ -0,0 +1,43 @@ +using SJ.Controls; +using System.Windows; + +namespace BBWYB.Client.Views.Purchase +{ + /// + /// EditQuantityRatioWindow.xaml 的交互逻辑 + /// + public partial class EditQuantityRatioWindow : BWindow + { + public int QuantityRatio; + + public EditQuantityRatioWindow(int quantityRatio) + { + InitializeComponent(); + this.QuantityRatio = quantityRatio; + this.Loaded += EditQuantityRatioWindow_Loaded; + } + + private void EditQuantityRatioWindow_Loaded(object sender, RoutedEventArgs e) + { + txt_quantityRatio.Text = QuantityRatio.ToString(); + } + + private void btn_Save_Click(object sender, RoutedEventArgs e) + { + if (!int.TryParse(txt_quantityRatio.Text, out int quantityRatio)) + { + MessageBox.Show("无效数字", "提示"); + return; + } + if (quantityRatio <= 0) + { + MessageBox.Show("无效数字", "提示"); + return; + } + + this.QuantityRatio = quantityRatio; + this.DialogResult = true; + this.Close(); + } + } +} diff --git a/BBWYB.Client/Views/Purchase/OnlinePurchase.xaml b/BBWYB.Client/Views/Purchase/OnlinePurchase.xaml index 8606e76..5549eee 100644 --- a/BBWYB.Client/Views/Purchase/OnlinePurchase.xaml +++ b/BBWYB.Client/Views/Purchase/OnlinePurchase.xaml @@ -5,14 +5,20 @@ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:BBWYB.Client.Views.Purchase" xmlns:cmodel="clr-namespace:BBWYB.Client.Models" + xmlns:ctr="clr-namespace:BBWYB.Client.Converters" xmlns:c="clr-namespace:SJ.Controls;assembly=SJ.Controls" xmlns:b="http://schemas.microsoft.com/xaml/behaviors" mc:Ignorable="d" - Title="提交订单" Height="600" Width="800" + Title="提交订单" Height="768" Width="1024" Style="{StaticResource bwstyle}" MinButtonVisibility="Collapsed" MaxButtonVisibility="Collapsed" - DataContext="{Binding OnlinePurchase,Source={StaticResource Locator}}"> + DataContext="{Binding OnlinePurchase,Source={StaticResource Locator}}" + SnapsToDevicePixels="True" + UseLayoutRounding="True"> + + + @@ -23,6 +29,7 @@ + @@ -30,14 +37,232 @@ - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + --> - + @@ -98,7 +323,7 @@ - + @@ -118,12 +343,12 @@ - + - + diff --git a/BBWYB.Server.Business/PurchaseOrder/PurchaseOrderBusiness.cs b/BBWYB.Server.Business/PurchaseOrder/PurchaseOrderBusiness.cs index 725b021..765a158 100644 --- a/BBWYB.Server.Business/PurchaseOrder/PurchaseOrderBusiness.cs +++ b/BBWYB.Server.Business/PurchaseOrder/PurchaseOrderBusiness.cs @@ -10,6 +10,7 @@ using Newtonsoft.Json.Linq; using SDKAdapter; using SDKAdapter.PurchasePlatform.Client; using SDKAdapter.PurchasePlatform.Models; +using System.Text; using Yitter.IdGenerator; namespace BBWYB.Server.Business @@ -44,43 +45,82 @@ namespace BBWYB.Server.Business public PreviewOrderResponse PreviewPurchaseOrder(PreviewOrderRequest request) { nLogManager.Default().Info($"PreviewPurchaseOrder {JsonConvert.SerializeObject(request)}"); - var response = ppPlatformClientFactory.GetClient((AdapterEnums.PlatformType)request.Platform) - .PreviewOrder(new PP_PreviewOrderRequest() - { - AppKey = request.AppKey, - AppSecret = request.AppSecret, - AppToken = request.AppToken, - Consignee = new PP_ConsigneeRequest() - { - Address = request.Consignee.Address, - City = request.Consignee.City, - ContactName = request.Consignee.ContactName, - County = request.Consignee.County, - Mobile = request.Consignee.Mobile, - Province = request.Consignee.Province, - TelePhone = request.Consignee.TelePhone, - Town = request.Consignee.Town - }, - Platform = (AdapterEnums.PlatformType)request.Platform, - PurchaseMode = (AdapterEnums.PurchaseMode)request.PurchaseOrderMode, - OrderProductParamList = request.CargoParamList.Select(p => new PP_OrderProductParamRequest() - { - ProductId = p.ProductId, - Quantity = p.Quantity, - SkuId = p.SkuId, - SpecId = p.SpecId - }).ToList() - }); + if (request.Consignee == null || + string.IsNullOrEmpty(request.Consignee.Address) || + string.IsNullOrEmpty(request.Consignee.Mobile) || + string.IsNullOrEmpty(request.Consignee.ContactName)) + throw new BusinessException("缺少收货人信息"); + if (request.PurchaseAccountList == null || request.PurchaseAccountList.Count() == 0) + throw new BusinessException("缺少采购账号"); + if (request.CargoParamGroupList == null || request.CargoParamGroupList.Count() == 0) + throw new BusinessException("缺少报价参数"); + + var extJArray = new List(); + var errorBuilder = new StringBuilder(); + var freightAmount = 0M; + var productAmount = 0M; + var totalAmount = 0M; + + foreach (var cargoParamGroup in request.CargoParamGroupList) + { + var purchaseAccount = request.PurchaseAccountList.FirstOrDefault(pa => pa.PurchasePlatformId == cargoParamGroup.PurchasePlatform); + if (purchaseAccount == null) + throw new BusinessException($"缺少{cargoParamGroup.PurchasePlatform}采购平台账号,请在店铺配置中设置"); + + try + { + var response = ppPlatformClientFactory.GetClient((AdapterEnums.PlatformType)cargoParamGroup.PurchasePlatform) + .PreviewOrder(new PP_PreviewOrderRequest() + { + AppKey = purchaseAccount.AppKey, + AppSecret = purchaseAccount.AppSecret, + AppToken = purchaseAccount.AppToken, + Consignee = new PP_ConsigneeRequest() + { + Address = request.Consignee.Address, + City = request.Consignee.City, + ContactName = request.Consignee.ContactName, + County = request.Consignee.County, + Mobile = request.Consignee.Mobile, + Province = request.Consignee.Province, + TelePhone = request.Consignee.TelePhone, + Town = request.Consignee.Town + }, + Platform = (AdapterEnums.PlatformType)cargoParamGroup.PurchasePlatform, + PurchaseMode = (AdapterEnums.PurchaseMode)request.PurchaseOrderMode, + OrderProductParamList = cargoParamGroup.CargoParamList.Select(p => new PP_OrderProductParamRequest() + { + ProductId = p.ProductId, + Quantity = p.Quantity, + SkuId = p.SkuId, + SpecId = p.SpecId + }).ToList() + }); + + if (cargoParamGroup.PurchasePlatform == Enums.Platform.阿里巴巴) + extJArray.Add(new { cargoParamGroup.PurchaserId, cargoParamGroup.PurchasePlatform, OrderTradeTypeCode = response.Extensions }); + + freightAmount += response.FreightAmount; + productAmount += response.ProductAmount; + totalAmount += response.TotalAmount; + } + catch (Exception ex) + { + errorBuilder.AppendLine($"采购商:{cargoParamGroup.PurchaserName}"); + errorBuilder.AppendLine(ex.Message); + throw new BusinessException(errorBuilder.ToString()); + } + } + return new PreviewOrderResponse() { - Extensions = response.Extensions, - FreightAmount = response.FreightAmount, - ProductAmount = response.ProductAmount, - TotalAmount = response.TotalAmount + Extensions = JsonConvert.SerializeObject(extJArray), + FreightAmount = freightAmount, + ProductAmount = productAmount, + TotalAmount = totalAmount }; } - public void CreatePurchaseOrder(CreateOrderRequest request) { nLogManager.Default().Info($"CreatePurchaseOrder\r\n{JsonConvert.SerializeObject(request)}"); @@ -91,117 +131,131 @@ namespace BBWYB.Server.Business if (dbOrder.OrderState != Enums.OrderState.等待采购 && dbOrder.OrderState != Enums.OrderState.待出库) throw new BusinessException("只能为等待采购或待出库的订单进行采购"); + if (request.Consignee == null || + string.IsNullOrEmpty(request.Consignee.Address) || + string.IsNullOrEmpty(request.Consignee.Mobile) || + string.IsNullOrEmpty(request.Consignee.ContactName)) + throw new BusinessException("缺少收货人信息"); + if (request.PurchaseAccountList == null || request.PurchaseAccountList.Count() == 0) + throw new BusinessException("缺少采购账号"); + if (request.CargoParamGroupList == null || request.CargoParamGroupList.Count() == 0) + throw new BusinessException("缺少下单商品参数"); + var deleteOrderCostDetail = fsql.Delete().Where(ocd => ocd.OrderId == dbOrder.Id); var isRepurchase = fsql.Select(dbOrder.Id).Any(); - - #region 合并重复的采购sku - var repeatPurchaseSkuGroups = request.CargoParamList.GroupBy(p => p.SkuId).ToList(); - foreach (var group in repeatPurchaseSkuGroups) - { - if (group.Count() > 1) - { - var repeatSkus = group.ToList(); - foreach (var repeatSku in repeatSkus) - request.CargoParamList.Remove(repeatSku); - request.CargoParamList.Add(new CargoParamRequest() - { - BelongSkuId = repeatSkus[0].BelongSkuId, - ProductId = repeatSkus[0].ProductId, - SkuId = repeatSkus[0].SkuId, - SpecId = repeatSkus[0].SpecId, - Quantity = repeatSkus.Sum(s => s.Quantity) - }); - } - } - #endregion - var orderSkus = fsql.Select().Where(osku => osku.Price != 0 && osku.OrderId == request.OrderId).ToList(); var orderSkuIds = orderSkus.Select(osku => osku.Id).ToList(); - var client = ppPlatformClientFactory.GetClient((AdapterEnums.PlatformType)request.Platform); - - var createOrderResponse = client.CreateOrder(new PP_CreateOrderRequest() - { - AppKey = request.AppKey, - AppSecret = request.AppSecret, - AppToken = request.AppToken, - Consignee = new PP_ConsigneeRequest() - { - Address = request.Consignee.Address, - City = request.Consignee.City, - ContactName = request.Consignee.ContactName, - County = request.Consignee.County, - Mobile = request.Consignee.Mobile, - Province = request.Consignee.Province, - TelePhone = request.Consignee.TelePhone, - Town = request.Consignee.Town - }, - Platform = (AdapterEnums.PlatformType)request.Platform, - PurchaseMode = (AdapterEnums.PurchaseMode)request.PurchaseOrderMode, - Extensions = request.Extensions, - Remark = request.Remark, - OrderProductParamList = request.CargoParamList.Select(p => new PP_OrderProductParamRequest() - { - ProductId = p.ProductId, - Quantity = p.Quantity, - SkuId = p.SkuId, - SpecId = p.SpecId - }).ToList() - }); - - var purchaseOrderSimpleInfo = client.QueryOrderDetail(new PP_QueryOrderDetailRequest() - { - AppKey = request.AppKey, - AppSecret = request.AppSecret, - AppToken = request.AppToken, - OrderId = createOrderResponse.OrderId - }); - - nLogManager.Default().Info($"QueryOrderDetail\r\nShopOrderId {request.OrderId}\r\n purchaseOrderSimpleInfo\r\n{JsonConvert.SerializeObject(purchaseOrderSimpleInfo)}"); + var extJArray = JsonConvert.DeserializeObject(request.Extensions); + //IList purchaseOrderSimpleInfoList = new List(); List insertOrderCostDetails = new List(); + List insertOrderPurchaseInfos = new List(); IInsert insertOrderCost = null; IUpdate updateOrderCost = null; - IInsert insertOrderPurchaseInfo = null; - IUpdate updateOrderPurchaseInfo = null; + var totalPurchaseAmount = 0M; - foreach (var orderSku in orderSkus) + foreach (var cargoParamGroup in request.CargoParamGroupList) { - #region 计算当前sku的采购成本和采购运费 - var currentOrderSkuProductAmount = 0M; //采购成本 - var currentOrderSkuCargoParamList = request.CargoParamList.Where(p => p.BelongSkuId == orderSku.SkuId); //找当前skuId的采购skuId - currentOrderSkuProductAmount = purchaseOrderSimpleInfo.ItemList.Where(p => currentOrderSkuCargoParamList.Any(p1 => p1.SkuId == p.SkuId))?.Sum(p => p.ProductAmount) ?? 0M; + var purchaseAccount = request.PurchaseAccountList.FirstOrDefault(pa => pa.PurchasePlatformId == cargoParamGroup.PurchasePlatform); + if (purchaseAccount == null) + throw new BusinessException($"缺少{cargoParamGroup.PurchasePlatform}采购平台账号,请在店铺配置中设置"); - var currentOrderSkuFreightAmount = purchaseOrderSimpleInfo.FreightAmount / orderSkus.Count(); //采购运费(按sku数均分) - #endregion + var client = ppPlatformClientFactory.GetClient((AdapterEnums.PlatformType)cargoParamGroup.PurchasePlatform); + var extJson = extJArray.FirstOrDefault(j => j.Value("PurchaserId") == cargoParamGroup.PurchaserId); - #region 成本明细 - var orderCostDetail = new OrderCostDetail() + var createOrderResponse = client.CreateOrder(new PP_CreateOrderRequest() { - Id = idGenerator.NewLong(), - ConsumableAmount = 0, - CreateTime = DateTime.Now, - DeductionQuantity = orderSku.ItemTotal.Value, - DeliveryExpressFreight = 0, - FirstFreight = 0, - //OperationAmount = 0, - InStorageAmount = 0, - OutStorageAmount = 0, - OrderId = request.OrderId, - ProductId = orderSku.ProductId, - PurchaseFreight = currentOrderSkuFreightAmount, - //PurchaseOrderPKId = purchaseOrder.Id, - PurchaseOrderId = purchaseOrderSimpleInfo.OrderId, - SkuAmount = currentOrderSkuProductAmount, - SkuId = orderSku.SkuId, - StorageAmount = 0 - //UnitCost = purchaseOrder.UnitCost, - //TotalCost = currentOrderSkuProductAmount + currentOrderSkuFreightAmount//purchaseOrder.UnitCost * orderSku.ItemTotal.Value - }; - //orderCostDetail.SkuGrossProfit = orderSku.Price.Value * orderCostDetail.DeductionQuantity - avgPreferential - (orderCostDetail.TotalCost + orderCostDetail.DeliveryExpressFreight) - orderSku.Price.Value * orderCostDetail.DeductionQuantity * createOnlinePurchaseOrderRequest.PlatformCommissionRatio; - insertOrderCostDetails.Add(orderCostDetail); - #endregion + AppKey = purchaseAccount.AppKey, + AppSecret = purchaseAccount.AppSecret, + AppToken = purchaseAccount.AppToken, + Consignee = new PP_ConsigneeRequest() + { + Address = request.Consignee.Address, + City = request.Consignee.City, + ContactName = request.Consignee.ContactName, + County = request.Consignee.County, + Mobile = request.Consignee.Mobile, + Province = request.Consignee.Province, + TelePhone = request.Consignee.TelePhone, + Town = request.Consignee.Town + }, + Platform = (AdapterEnums.PlatformType)purchaseAccount.PurchasePlatformId, + PurchaseMode = (AdapterEnums.PurchaseMode)request.PurchaseOrderMode, + Extensions = extJson.Value("OrderTradeTypeCode"), + Remark = request.Remark, + OrderProductParamList = cargoParamGroup.CargoParamList.Select(p => new PP_OrderProductParamRequest() + { + ProductId = p.ProductId, + Quantity = p.Quantity, + SkuId = p.SkuId, + SpecId = p.SpecId + }).ToList() + }); + + var purchaseOrderSimpleInfo = client.QueryOrderDetail(new PP_QueryOrderDetailRequest() + { + AppKey = purchaseAccount.AppKey, + AppSecret = purchaseAccount.AppSecret, + AppToken = purchaseAccount.AppToken, + OrderId = createOrderResponse.OrderId + }); + + totalPurchaseAmount += purchaseOrderSimpleInfo.TotalAmount; + //purchaseOrderSimpleInfoList.Add(purchaseOrderSimpleInfo); + + var belongSkuGroups = cargoParamGroup.CargoParamList.GroupBy(p => p.BelongSkuId); + foreach (var belongSkuGroup in belongSkuGroups) + { + var belongSkuId = belongSkuGroup.Key; + var currentOrderSkuProductAmount = 0M; //采购成本 + var currentOrderSkuCargoParamList = cargoParamGroup.CargoParamList.Where(p => p.BelongSkuId == belongSkuId); //找当前skuId的采购skuId + currentOrderSkuProductAmount = purchaseOrderSimpleInfo.ItemList.Where(p => currentOrderSkuCargoParamList.Any(p1 => p1.SkuId == p.SkuId)) + ?.Sum(p => p.ProductAmount) ?? 0M; + var currentOrderSkuFreightAmount = purchaseOrderSimpleInfo.FreightAmount / belongSkuGroups.Count(); //采购运费(按sku数均分) + + #region 成本明细 + var orderSku = orderSkus.FirstOrDefault(osku => osku.SkuId == belongSkuId); + var orderCostDetail = new OrderCostDetail() + { + Id = idGenerator.NewLong(), + ConsumableAmount = 0, + CreateTime = DateTime.Now, + DeductionQuantity = orderSku.ItemTotal.Value, + DeliveryExpressFreight = 0, + FirstFreight = 0, + //OperationAmount = 0, + InStorageAmount = 0, + OutStorageAmount = 0, + OrderId = request.OrderId, + ProductId = orderSku.ProductId, + PurchaseFreight = currentOrderSkuFreightAmount, + PurchaseOrderId = purchaseOrderSimpleInfo.OrderId, + SkuAmount = currentOrderSkuProductAmount, + SkuId = belongSkuId, + StorageAmount = 0 + }; + insertOrderCostDetails.Add(orderCostDetail); + #endregion + + #region 订单采购信息 + var orderPurchaserInfo = new OrderPurchaseInfo() + { + Id = idGenerator.NewLong(), + OrderId = request.OrderId, + CreateTime = DateTime.Now, + PurchaseAccountId = purchaseAccount.Id, + PurchaseAccountName = purchaseAccount.AccountName, + PurchaseMethod = Enums.PurchaseMethod.线上采购, + PurchaseOrderId = createOrderResponse.OrderId, + PurchasePlatform = cargoParamGroup.PurchasePlatform, + PurchaserName = cargoParamGroup.PurchaserName, + ShopId = request.ShopId + }; + insertOrderPurchaseInfos.Add(orderPurchaserInfo); + #endregion + } } #region 订单成本 @@ -213,7 +267,7 @@ namespace BBWYB.Server.Business IsManualEdited = false, PlatformCommissionRatio = 0, PreferentialAmount = 0, - PurchaseAmount = purchaseOrderSimpleInfo.TotalAmount + PurchaseAmount = totalPurchaseAmount }; //orderCost.PlatformCommissionAmount = dbOrder.OrderSellerPrice * orderCost.PlatformCommissionRatio; orderCost.Profit = dbOrder.OrderSellerPrice + @@ -230,38 +284,13 @@ namespace BBWYB.Server.Business } #endregion - #region 订单采购信息 - var orderPurchaserInfo = new OrderPurchaseInfo() - { - OrderId = request.OrderId, - CreateTime = DateTime.Now, - PurchaseAccountId = request.PurchaseAccountId, - PurchaseAccountName = request.PurchaseAccountName, - PurchaseMethod = Enums.PurchaseMethod.线上采购, - PurchaseOrderId = createOrderResponse.OrderId, - PurchasePlatform = request.Platform, - PurchaserName = request.PurchaserName, - ShopId = request.ShopId - }; - - if (!isRepurchase) - { - insertOrderPurchaseInfo = fsql.Insert(orderPurchaserInfo); - } - else - { - updateOrderPurchaseInfo = fsql.Update().SetSource(orderPurchaserInfo).IgnoreColumns(a => new { a.CreateTime }); - } - #endregion - fsql.Transaction(() => { deleteOrderCostDetail.ExecuteAffrows(); fsql.Insert(insertOrderCostDetails).ExecuteAffrows(); + fsql.Insert(insertOrderPurchaseInfos).ExecuteAffrows(); updateOrderCost?.ExecuteAffrows(); insertOrderCost?.ExecuteAffrows(); - insertOrderPurchaseInfo?.ExecuteAffrows(); - updateOrderPurchaseInfo?.ExecuteAffrows(); fsql.Update(request.OrderId).SetIf(dbOrder.OrderState == Enums.OrderState.等待采购, o => o.OrderState, Model.Enums.OrderState.待出库) .Set(o => o.IsPurchased, true) .ExecuteAffrows(); diff --git a/BBWYB.Server.Model/Db/Order/OrderPurchaseInfo.cs b/BBWYB.Server.Model/Db/Order/OrderPurchaseInfo.cs index acec0c1..adfce45 100644 --- a/BBWYB.Server.Model/Db/Order/OrderPurchaseInfo.cs +++ b/BBWYB.Server.Model/Db/Order/OrderPurchaseInfo.cs @@ -4,34 +4,36 @@ namespace BBWYB.Server.Model.Db { [Table(Name = "orderpurchaseinfo", DisableSyncStructure = true)] - public partial class OrderPurchaseInfo + public partial class OrderPurchaseInfo { + [Column(IsPrimary = true, IsNullable = false)] + public long Id { get; set; } - [Column(StringLength = 50, IsPrimary = true, IsNullable = false)] - public string OrderId { get; set; } + [Column(StringLength = 50, IsNullable = false)] + public string OrderId { get; set; } - [Column(DbType = "datetime")] - public DateTime? CreateTime { get; set; } + [Column(DbType = "datetime")] + public DateTime? CreateTime { get; set; } - [Column(StringLength = 100)] - public string PurchaseAccountId { get; set; } + [Column(StringLength = 100)] + public string PurchaseAccountId { get; set; } [Column(StringLength = 100)] public string PurchaseAccountName { get; set; } [Column(MapType = typeof(int?))] - public Enums.PurchaseMethod? PurchaseMethod { get; set; } + public Enums.PurchaseMethod? PurchaseMethod { get; set; } - [Column(StringLength = 100)] - public string PurchaseOrderId { get; set; } + [Column(StringLength = 100)] + public string PurchaseOrderId { get; set; } [Column(MapType = typeof(int?))] public Enums.Platform? PurchasePlatform { get; set; } - [Column(StringLength = 100)] - public string PurchaserName { get; set; } + [Column(StringLength = 100)] + public string PurchaserName { get; set; } - public long? ShopId { get; set; } - } + public long? ShopId { get; set; } + } } diff --git a/BBWYB.Server.Model/Dto/Request/PurchaseOrder/CargoParamRequest.cs b/BBWYB.Server.Model/Dto/Request/PurchaseOrder/CargoParamRequest.cs index a9b42a8..6752807 100644 --- a/BBWYB.Server.Model/Dto/Request/PurchaseOrder/CargoParamRequest.cs +++ b/BBWYB.Server.Model/Dto/Request/PurchaseOrder/CargoParamRequest.cs @@ -18,4 +18,12 @@ /// public string BelongSkuId { get; set; } } + public class CargoParamGroupRequest + { + public string PurchaserId { get; set; } + public string PurchaserName { get; set; } + public Enums.Platform PurchasePlatform { get; set; } + + public IList CargoParamList { get; set; } + } } diff --git a/BBWYB.Server.Model/Dto/Request/PurchaseOrder/CreateOrderRequest.cs b/BBWYB.Server.Model/Dto/Request/PurchaseOrder/CreateOrderRequest.cs index 39bd5bc..9dc05e7 100644 --- a/BBWYB.Server.Model/Dto/Request/PurchaseOrder/CreateOrderRequest.cs +++ b/BBWYB.Server.Model/Dto/Request/PurchaseOrder/CreateOrderRequest.cs @@ -11,12 +11,6 @@ /// public string OrderId { get; set; } - public string PurchaseAccountId { get; set; } - - public string PurchaseAccountName { get; set; } - - public string PurchaserName { get; set; } - public long ShopId { get; set; } } } diff --git a/BBWYB.Server.Model/Dto/Request/PurchaseOrder/PreviewOrderRequest.cs b/BBWYB.Server.Model/Dto/Request/PurchaseOrder/PreviewOrderRequest.cs index cb655b5..80290a3 100644 --- a/BBWYB.Server.Model/Dto/Request/PurchaseOrder/PreviewOrderRequest.cs +++ b/BBWYB.Server.Model/Dto/Request/PurchaseOrder/PreviewOrderRequest.cs @@ -1,15 +1,16 @@ -namespace BBWYB.Server.Model.Dto +using BBWYB.Server.Model.Db.MDS; + +namespace BBWYB.Server.Model.Dto { - public class PreviewOrderRequest : PlatformRequest + public class PreviewOrderRequest { - /// - /// 订单模式 - /// 1688 general大市场订单 saleproxy分销订单 - /// + public IList PurchaseAccountList { get; set; } + public Enums.PurchaseOrderMode PurchaseOrderMode { get; set; } public ConsigneeRequest Consignee { get; set; } - public IList CargoParamList { get; set; } + public IList CargoParamGroupList { get; set; } } + } diff --git a/BBWYB.Server.Model/Dto/Request/PurchaseOrder/PurchaseAccountRequest.cs b/BBWYB.Server.Model/Dto/Request/PurchaseOrder/PurchaseAccountRequest.cs new file mode 100644 index 0000000..2787a52 --- /dev/null +++ b/BBWYB.Server.Model/Dto/Request/PurchaseOrder/PurchaseAccountRequest.cs @@ -0,0 +1,28 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace BBWYB.Server.Model.Dto +{ + public class PurchaseAccountRequest + { + public string Id { get; set; } + + + public string AccountName { get; set; } + + + public string AppKey { get; set; } + + + public string AppSecret { get; set; } + + + public string AppToken { get; set; } + + + public Enums.Platform PurchasePlatformId { get; set; } + } +}