Browse Source

1

updatebug
shanji 2 years ago
parent
commit
55e70a337c
  1. 69
      BBWYB.Client/Models/PurchaseScheme/ProductSkuWithScheme.cs
  2. 8
      BBWYB.Client/Models/PurchaseScheme/PurchaseSchemeProductSku.cs
  3. 9
      BBWYB.Client/ViewModels/Order/ChoosePurchaseSchemeViewModel.cs
  4. 336
      BBWYB.Client/ViewModels/Purchase/OnlinePurchaseViewModel.cs
  5. 38
      BBWYB.Client/Views/Purchase/EditQuantityRatioWindow.xaml
  6. 43
      BBWYB.Client/Views/Purchase/EditQuantityRatioWindow.xaml.cs
  7. 245
      BBWYB.Client/Views/Purchase/OnlinePurchase.xaml
  8. 339
      BBWYB.Server.Business/PurchaseOrder/PurchaseOrderBusiness.cs
  9. 30
      BBWYB.Server.Model/Db/Order/OrderPurchaseInfo.cs
  10. 8
      BBWYB.Server.Model/Dto/Request/PurchaseOrder/CargoParamRequest.cs
  11. 6
      BBWYB.Server.Model/Dto/Request/PurchaseOrder/CreateOrderRequest.cs
  12. 15
      BBWYB.Server.Model/Dto/Request/PurchaseOrder/PreviewOrderRequest.cs
  13. 28
      BBWYB.Server.Model/Dto/Request/PurchaseOrder/PurchaseAccountRequest.cs

69
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; }
/// <summary>
/// Sku标题
/// </summary>
public string Title { get; set; }
public string Logo { get; set; }
/// <summary>
/// 京东Sku状态【1:上架 2:下架 4:删除】
/// </summary>
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<PurchaseSchemeProductSku> PurchaseSchemeProductSkuList { get; set; }
public bool IsSelected
{
get => isSelected; set { if (SetProperty(ref isSelected, value)) OnSelectChanged(); }
}
public ProductSkuWithScheme()
{
PurchaseSchemeProductSkuList = new ObservableCollection<PurchaseSchemeProductSku>();
}
private void OnSelectChanged()
{
if (IsSelected && Quantity <= 0)
Quantity = 1;
else if (!IsSelected)
Quantity = 0;
}
private void OnQuantityChanged()
{
IsSelected = Quantity > 0;
}
}
}

8
BBWYB.Client/Models/PurchaseScheme/PurchaseSchemeProductSku.cs

@ -8,6 +8,11 @@ namespace BBWYB.Client.Models
/// </summary> /// </summary>
public class PurchaseSchemeProductSku : ObservableObject public class PurchaseSchemeProductSku : ObservableObject
{ {
public PurchaseSchemeProductSku()
{
QuantityRatio = 1;
}
/// <summary> /// <summary>
/// 采购商品的SKU和采购方案的关系Id /// 采购商品的SKU和采购方案的关系Id
/// </summary> /// </summary>
@ -52,7 +57,10 @@ namespace BBWYB.Client.Models
private int itemTotal; private int itemTotal;
private decimal skuAmount; private decimal skuAmount;
private int quantityRatio;
public Action<int> OnItemTotalChanged { get; set; } public Action<int> OnItemTotalChanged { get; set; }
public int QuantityRatio { get => quantityRatio; set { SetProperty(ref quantityRatio, value); } }
} }
} }

9
BBWYB.Client/ViewModels/Order/ChoosePurchaseSchemeViewModel.cs

@ -100,9 +100,16 @@ namespace BBWYB.Client.ViewModels
return; return;
if (!isResponse) if (!isResponse)
return; return;
isResponse = false; 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; isResponse = true;
} }
} }

336
BBWYB.Client/ViewModels/Purchase/OnlinePurchaseViewModel.cs

@ -20,7 +20,15 @@ namespace BBWYB.Client.ViewModels
public ICommand FastCreateOrderCommand { get; set; } public ICommand FastCreateOrderCommand { get; set; }
public ICommand PreviewOrderCommand { get; set; } public ICommand PreviewOrderCommand { get; set; }
public IList<PurchaseSchemeProductSku> PurchaseSchemeProductSkuList { get; set; } public ICommand EditQuantityRatioCommand { get; set; }
public ICommand AddQuantityCommand { get; set; }
public ICommand SubtractQuantityCommand { get; set; }
//public IList<PurchaseSchemeProductSku> PurchaseSchemeProductSkuList { get; set; }
public IList<ProductSkuWithScheme> ProductSkuWithSchemeList { get; set; }
public bool IsLoading { get => isLoading; set { SetProperty(ref isLoading, value); } } public bool IsLoading { get => isLoading; set { SetProperty(ref isLoading, value); } }
@ -70,6 +78,8 @@ namespace BBWYB.Client.ViewModels
private string town; private string town;
private string prucahseRemark; private string prucahseRemark;
private PurchaseOrderMode purchaseOrderMode = PurchaseOrderMode.; private PurchaseOrderMode purchaseOrderMode = PurchaseOrderMode.;
private IList<PurchaseScheme> schemeList;
/// <summary> /// <summary>
/// 扩展数据,暂用于拳探 /// 扩展数据,暂用于拳探
/// </summary> /// </summary>
@ -86,10 +96,13 @@ namespace BBWYB.Client.ViewModels
this.purchaseService = purchaseService; this.purchaseService = purchaseService;
this.delayTrigger = new DelayTrigger(); this.delayTrigger = new DelayTrigger();
this.delayTrigger.OnExecute = OnDelayTriggerExecute; this.delayTrigger.OnExecute = OnDelayTriggerExecute;
PurchaseSchemeProductSkuList = new ObservableCollection<PurchaseSchemeProductSku>(); ProductSkuWithSchemeList = new ObservableCollection<ProductSkuWithScheme>();
purchaseSchemeList = new List<PurchaseScheme>(); purchaseSchemeList = new List<PurchaseScheme>();
FastCreateOrderCommand = new RelayCommand(FastCreateOrder); FastCreateOrderCommand = new RelayCommand(FastCreateOrder);
PreviewOrderCommand = new RelayCommand(PreviewOrder); PreviewOrderCommand = new RelayCommand(PreviewOrder);
EditQuantityRatioCommand = new RelayCommand<object>(EditQuantityRatio);
AddQuantityCommand = new RelayCommand<PurchaseSchemeProductSku>(AddQuantity);
SubtractQuantityCommand = new RelayCommand<PurchaseSchemeProductSku>(SubtractQuantity);
this.globalContext = globalContext; this.globalContext = globalContext;
this.orderVM = orderVM; this.orderVM = orderVM;
//PurchaseOrderMode = PurchaseOrderMode.代发; //PurchaseOrderMode = PurchaseOrderMode.代发;
@ -100,7 +113,7 @@ namespace BBWYB.Client.ViewModels
this.order = order; this.order = order;
//this.purchaser = purchaser; //this.purchaser = purchaser;
//this.purchaseAccount = purchaseAccount; //this.purchaseAccount = purchaseAccount;
this.schemeList = schemeList;
this.ContactName = order.Consignee.ContactName; this.ContactName = order.Consignee.ContactName;
this.Address = order.Consignee.Address; this.Address = order.Consignee.Address;
this.Province = order.Consignee.Province; this.Province = order.Consignee.Province;
@ -113,83 +126,116 @@ namespace BBWYB.Client.ViewModels
protected override void Load() protected override void Load()
{ {
IsLoading = true; IsLoading = true;
var waitList = new List<EventWaitHandle>();
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)) var ewh = new ManualResetEvent(false);
.ContinueWith(r => waitList.Add(ewh);
{ Task.Factory.StartNew(() => LoadPurchaseScheme(productSkuWithScheme, scheme, ewh));
var purchaseSchemeResponse = r.Result; }
if (!purchaseSchemeResponse.Success)
{
IsLoading = false;
App.Current.Dispatcher.Invoke(() => MessageBox.Show(purchaseSchemeResponse.Msg, "获取采购方案"));
return;
}
var waitList = new List<WaitHandle>(); Task.Factory.StartNew(() =>
foreach (var purchaseSchemeApiModel in purchaseSchemeResponse.Data) {
{ WaitHandle.WaitAll(waitList.ToArray());
var purchaseScheme = PurchaseScheme.Convert(purchaseSchemeApiModel); PreviewOrder(); //预览订单
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()); //Task.Factory.StartNew(() => purchaseService.GetPurchaseSchemeList(order.ItemList.Select(osku => osku.SkuId).ToList(), purchaser.Id, globalContext.User.Shop.ShopId))
//IsLoading = false; // .ContinueWith(r =>
if (PurchaseSchemeProductSkuList.Count() > 0) // {
OnDelayTriggerExecute(Guid.NewGuid().ToString()); // var purchaseSchemeResponse = r.Result;
else // if (!purchaseSchemeResponse.Success)
{ // {
IsLoading = false; // IsLoading = false;
App.Current.Dispatcher.Invoke(() => MessageBox.Show("采购方案商品加载失败,请重新打开预览窗口", "提示")); // App.Current.Dispatcher.Invoke(() => MessageBox.Show(purchaseSchemeResponse.Msg, "获取采购方案"));
} // return;
}); // }
}
protected override void Unload() // var waitList = new List<WaitHandle>();
{ // foreach (var purchaseSchemeApiModel in purchaseSchemeResponse.Data)
order = null; // {
purchaser = null; // var purchaseScheme = PurchaseScheme.Convert(purchaseSchemeApiModel);
purchaseAccount = null; // purchaseSchemeList.Add(purchaseScheme);
// foreach (var purchaseSchemeProduct in purchaseScheme.PurchaseSchemeProductList)
purchaseSchemeList.Clear(); // {
PurchaseSchemeProductSkuList.Clear(); // var ewh = new ManualResetEvent(false);
extensions = string.Empty; // waitList.Add(ewh);
ProductAmount = FreightAmount = TotalAmount = 0; // var orderSku = order.ItemList.FirstOrDefault(osku => osku.SkuId == purchaseScheme.SkuId);
ContactName = Address = Mobile = Province = City = County = Town = PrucahseRemark = string.Empty; // 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, try
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(() => #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); foreach (var purchaseSchemeProductSku in data.Value.purchaseSchemeProductSkus)
purchaseSchemeProductSku.ItemTotal = orderSku.ItemTotal; {
purchaseSchemeProductSku.OnItemTotalChanged = OnItemTotalChanged; 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; return;
} }
IsLoading = true; //IsLoading = true;
Task.Factory.StartNew(() => purchaseOrderService.PreviewPurchaseOrder(new Consignee() //Task.Factory.StartNew(() => purchaseOrderService.PreviewPurchaseOrder(new Consignee()
{ //{
Address = Address, // Address = Address,
City = City, // City = City,
ContactName = ContactName, // ContactName = ContactName,
County = County, // County = County,
Mobile = Mobile, // Mobile = Mobile,
Province = Province, // Province = Province,
TelePhone = Mobile, // TelePhone = Mobile,
Town = Town // Town = Town
}, PurchaseSchemeProductSkuList, purchaseAccount.PurchasePlatformId, purchaseAccount, PurchaseOrderMode)) //}, PurchaseSchemeProductSkuList, purchaseAccount.PurchasePlatformId, purchaseAccount, PurchaseOrderMode))
.ContinueWith(t => // .ContinueWith(t =>
{ // {
IsLoading = false; // IsLoading = false;
var r = t.Result; // var r = t.Result;
if (!r.Success) // if (!r.Success)
{ // {
ProductAmount = FreightAmount = TotalAmount = 0; // ProductAmount = FreightAmount = TotalAmount = 0;
extensions = string.Empty; // extensions = string.Empty;
App.Current.Dispatcher.Invoke(() => MessageBox.Show(r.Msg, "预览订单报价")); // App.Current.Dispatcher.Invoke(() => MessageBox.Show(r.Msg, "预览订单报价"));
return; // return;
} // }
ProductAmount = r.Data.ProductAmount; // ProductAmount = r.Data.ProductAmount;
FreightAmount = r.Data.FreightAmount; // FreightAmount = r.Data.FreightAmount;
TotalAmount = r.Data.TotalAmount; // TotalAmount = r.Data.TotalAmount;
//tradeMode = r.Data.OrderTradeType?.Code; // //tradeMode = r.Data.OrderTradeType?.Code;
extensions = r.Data.Extensions; // extensions = r.Data.Extensions;
}); // });
} }
private void FastCreateOrder() private void FastCreateOrder()
@ -276,48 +322,74 @@ namespace BBWYB.Client.ViewModels
return; return;
} }
IsLoading = true; //IsLoading = true;
Task.Factory.StartNew(() => purchaseOrderService.FastCreateOrder(new Consignee() //Task.Factory.StartNew(() => purchaseOrderService.FastCreateOrder(new Consignee()
{ //{
Address = Address, // Address = Address,
City = City, // City = City,
ContactName = ContactName, // ContactName = ContactName,
County = County, // County = County,
Mobile = Mobile, // Mobile = Mobile,
Province = Province, // Province = Province,
TelePhone = Mobile, // TelePhone = Mobile,
Town = Town // Town = Town
}, PurchaseSchemeProductSkuList, //}, PurchaseSchemeProductSkuList,
purchaseAccount.PurchasePlatformId, // purchaseAccount.PurchasePlatformId,
purchaseAccount, // purchaseAccount,
PurchaseOrderMode, // PurchaseOrderMode,
PrucahseRemark, // PrucahseRemark,
order.Id, // order.Id,
globalContext.User.Shop.ShopId, // globalContext.User.Shop.ShopId,
purchaseSchemeList[0].PurchaserName, // purchaseSchemeList[0].PurchaserName,
extensions)).ContinueWith(t => // extensions)).ContinueWith(t =>
{ // {
IsLoading = false; // IsLoading = false;
var r = t.Result; // var r = t.Result;
if (!r.Success) // if (!r.Success)
{ // {
App.Current.Dispatcher.Invoke(() => MessageBox.Show(r.Msg, "下单")); // App.Current.Dispatcher.Invoke(() => MessageBox.Show(r.Msg, "下单"));
return; // return;
} // }
//刷新订单列表 // //刷新订单列表
//orderListViewModel.RefreshOrder(order.Id); // //orderListViewModel.RefreshOrder(order.Id);
orderVM.RefreshOrder(order.Id); // orderVM.RefreshOrder(order.Id);
//关闭当前窗口 // //关闭当前窗口
//GalaSoft.MvvmLight.Messaging.Messenger.Default.Send<object>(null, "OnlinePurchase_Close"); // //GalaSoft.MvvmLight.Messaging.Messenger.Default.Send<object>(null, "OnlinePurchase_Close");
WeakReferenceMessenger.Default.Send(new Message_OnlinePurchase_Close(null)); // WeakReferenceMessenger.Default.Send(new Message_OnlinePurchase_Close(null));
}); // });
} }
private void PreviewOrder() private void PreviewOrder()
{ {
OnDelayTriggerExecute(Guid.NewGuid().ToString()); 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--;
}
} }
} }

38
BBWYB.Client/Views/Purchase/EditQuantityRatioWindow.xaml

@ -0,0 +1,38 @@
<c:BWindow x:Class="BBWYB.Client.Views.Purchase.EditQuantityRatioWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
xmlns:c="clr-namespace:SJ.Controls;assembly=SJ.Controls"
Title="EditQuantityRatioWindow" Height="150" Width="300"
Style="{StaticResource bwstyle}"
MinButtonVisibility="Collapsed"
MaxButtonVisibility="Collapsed">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="30"/>
<RowDefinition/>
<RowDefinition Height="40"/>
</Grid.RowDefinitions>
<Border BorderThickness="0,0,0,1" BorderBrush="{StaticResource MainMenu.BorderBrush}"
Background="{StaticResource Border.Background}">
<TextBlock Text="组合配置" HorizontalAlignment="Center" VerticalAlignment="Center"/>
</Border>
<StackPanel Grid.Row="1" VerticalAlignment="Center" HorizontalAlignment="Center">
<StackPanel Orientation="Horizontal">
<TextBlock VerticalAlignment="Center">
<Run Text="1件" Foreground="{StaticResource Text.Pink}"/>
<Run Text="店铺SKU需要配置的数量"/>
</TextBlock>
<c:BTextBox x:Name="txt_quantityRatio" Width="55" Margin="5,0,0,0"/>
</StackPanel>
<TextBlock Text="该数量为组合配置比例,非实际采购数量" Margin="0,10,0,0"
Foreground="Gray"/>
</StackPanel>
<c:BButton x:Name="btn_Save" Content="保存" Grid.Row="2" Width="60" HorizontalAlignment="Right" Margin="0,0,8,0"
Click="btn_Save_Click"/>
</Grid>
</c:BWindow>

43
BBWYB.Client/Views/Purchase/EditQuantityRatioWindow.xaml.cs

@ -0,0 +1,43 @@
using SJ.Controls;
using System.Windows;
namespace BBWYB.Client.Views.Purchase
{
/// <summary>
/// EditQuantityRatioWindow.xaml 的交互逻辑
/// </summary>
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();
}
}
}

245
BBWYB.Client/Views/Purchase/OnlinePurchase.xaml

@ -5,14 +5,20 @@
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:BBWYB.Client.Views.Purchase" xmlns:local="clr-namespace:BBWYB.Client.Views.Purchase"
xmlns:cmodel="clr-namespace:BBWYB.Client.Models" xmlns:cmodel="clr-namespace:BBWYB.Client.Models"
xmlns:ctr="clr-namespace:BBWYB.Client.Converters"
xmlns:c="clr-namespace:SJ.Controls;assembly=SJ.Controls" xmlns:c="clr-namespace:SJ.Controls;assembly=SJ.Controls"
xmlns:b="http://schemas.microsoft.com/xaml/behaviors" xmlns:b="http://schemas.microsoft.com/xaml/behaviors"
mc:Ignorable="d" mc:Ignorable="d"
Title="提交订单" Height="600" Width="800" Title="提交订单" Height="768" Width="1024"
Style="{StaticResource bwstyle}" Style="{StaticResource bwstyle}"
MinButtonVisibility="Collapsed" MinButtonVisibility="Collapsed"
MaxButtonVisibility="Collapsed" MaxButtonVisibility="Collapsed"
DataContext="{Binding OnlinePurchase,Source={StaticResource Locator}}"> DataContext="{Binding OnlinePurchase,Source={StaticResource Locator}}"
SnapsToDevicePixels="True"
UseLayoutRounding="True">
<c:BWindow.Resources>
<ctr:MultiParameterTransferConverter x:Key="mptConverter"/>
</c:BWindow.Resources>
<b:Interaction.Triggers> <b:Interaction.Triggers>
<b:EventTrigger EventName="Loaded"> <b:EventTrigger EventName="Loaded">
<b:InvokeCommandAction Command="{Binding LoadCommand}"/> <b:InvokeCommandAction Command="{Binding LoadCommand}"/>
@ -23,6 +29,7 @@
</b:Interaction.Triggers> </b:Interaction.Triggers>
<Grid> <Grid>
<Grid.RowDefinitions> <Grid.RowDefinitions>
<RowDefinition Height="30"/>
<RowDefinition Height="30"/> <RowDefinition Height="30"/>
<RowDefinition/> <RowDefinition/>
<RowDefinition Height="60"/> <RowDefinition Height="60"/>
@ -30,14 +37,232 @@
<RowDefinition Height="40"/> <RowDefinition Height="40"/>
</Grid.RowDefinitions> </Grid.RowDefinitions>
<c:RoundWaitProgress Play="{Binding IsLoading}" Panel.ZIndex="999" Grid.RowSpan="5"/> <c:RoundWaitProgress Play="{Binding IsLoading}" Panel.ZIndex="999" Grid.RowSpan="6"/>
<Border BorderThickness="0,0,0,1" BorderBrush="{StaticResource MainMenu.BorderBrush}" <Border BorderThickness="0,0,0,1" BorderBrush="{StaticResource MainMenu.BorderBrush}"
Background="{StaticResource Border.Background}"> Background="{StaticResource Border.Background}">
<TextBlock Text="提交订单" HorizontalAlignment="Center" VerticalAlignment="Center"/> <TextBlock Text="提交订单" HorizontalAlignment="Center" VerticalAlignment="Center"/>
</Border> </Border>
<DataGrid Grid.Row="1" <Border Background="{StaticResource Border.Background}"
BorderThickness="1"
BorderBrush="{StaticResource Border.Brush}"
Grid.Row="1">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="300"/>
<ColumnDefinition Width="1*"/>
<ColumnDefinition Width="80"/>
<ColumnDefinition Width="90"/>
<ColumnDefinition Width="70"/>
<ColumnDefinition Width="60"/>
</Grid.ColumnDefinitions>
<TextBlock Text="店铺商品信息" Style="{StaticResource middleTextBlock}"/>
<TextBlock Text="采购商品信息" Style="{StaticResource middleTextBlock}" Grid.Column="1"/>
<StackPanel Grid.Column="2" VerticalAlignment="Center" HorizontalAlignment="Center" Orientation="Horizontal">
<TextBlock Text="组合配置"/>
<Path Style="{StaticResource path_question}"
Width="14" Margin="5,0,0,0" Fill="{StaticResource Text.Pink}" ToolTipService.InitialShowDelay="0">
<Path.ToolTip>
<ToolTip Style="{StaticResource OrderCouponToolipStyle}">
<TextBlock Text="该数量为组合配置比例,非实际采购数量"/>
</ToolTip>
</Path.ToolTip>
</Path>
</StackPanel>
<TextBlock Text="数量" Style="{StaticResource middleTextBlock}" Grid.Column="3"/>
<TextBlock Text="单价" Style="{StaticResource middleTextBlock}" Grid.Column="4"/>
<TextBlock Text="总额" Style="{StaticResource middleTextBlock}" Grid.Column="5"/>
<Border Width="1" HorizontalAlignment="Right" Background="{StaticResource Border.Brush}"/>
<Border Width="1" HorizontalAlignment="Right" Background="{StaticResource Border.Brush}" Grid.Column="1"/>
<Border Width="1" HorizontalAlignment="Right" Background="{StaticResource Border.Brush}" Grid.Column="2"/>
<Border Width="1" HorizontalAlignment="Right" Background="{StaticResource Border.Brush}" Grid.Column="3"/>
<Border Width="1" HorizontalAlignment="Right" Background="{StaticResource Border.Brush}" Grid.Column="4"/>
</Grid>
</Border>
<ListBox x:Name="listbox_ProductSkuWithSchemeList" Grid.Row="2"
ItemContainerStyle="{StaticResource NoBgListBoxItemStyle}"
BorderThickness="1,0,1,1"
BorderBrush="{StaticResource Border.Brush}"
ItemsSource="{Binding ProductSkuWithSchemeList}">
<ListBox.ItemTemplate>
<DataTemplate>
<Grid Width="{Binding ActualWidth,ElementName=listbox_ProductSkuWithSchemeList}">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="300"/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="90"/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<c:BAsyncImage UrlSource="{Binding Logo}"
Width="80" DecodePixelWidth="80"
VerticalAlignment="Top" Margin="0,5,0,0"
Cursor="Hand"/>
<StackPanel Grid.Column="1" Orientation="Vertical" VerticalAlignment="Top" Margin="0,5,0,0">
<StackPanel Orientation="Horizontal">
<TextBlock Text="SKU:"/>
<c:BButton Content="{Binding SkuId}" Style="{StaticResource LinkButton}"
Command="{Binding DataContext.CopyTextCommand,RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Window}}}"
CommandParameter="{Binding SkuId}"
Margin=" 5,0,0,0"/>
</StackPanel>
<TextBlock TextTrimming="CharacterEllipsis"
Margin="0,17,0,0">
<Run Text="名称:"/>
<Run Text="{Binding Title}"/>
<TextBlock.ToolTip>
<ToolTip Style="{StaticResource OrderCouponToolipStyle}">
<TextBlock Text="{Binding Title}"/>
</ToolTip>
</TextBlock.ToolTip>
</TextBlock>
<StackPanel Orientation="Horizontal" Margin="0,17,0,0">
<TextBlock>
<Run Text="单价:"/>
<Run Text="{Binding Price}"/>
</TextBlock>
<TextBlock Margin="10,0,0,0">
<Run Text="数量:"/>
<Run Text="{Binding Quantity}"/>
</TextBlock>
</StackPanel>
</StackPanel>
</Grid>
<Border Width="1" HorizontalAlignment="Right" Background="{StaticResource Border.Brush}"/>
<Border Height="1" VerticalAlignment="Bottom" Background="{StaticResource Border.Brush}"/>
<ListBox x:Name="listbox_PurchaseSchemeProductSkuList" Grid.Column="1"
ItemContainerStyle="{StaticResource NoBgListBoxItemStyle}"
Style="{StaticResource NoScrollViewListBoxStyle}"
ItemsSource="{Binding PurchaseSchemeProductSkuList}">
<ListBox.ItemTemplate>
<DataTemplate>
<Grid Width="{Binding ActualWidth,ElementName=listbox_PurchaseSchemeProductSkuList}">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="1*"/>
<ColumnDefinition Width="80"/>
<ColumnDefinition Width="90"/>
<ColumnDefinition Width="70"/>
<ColumnDefinition Width="60"/>
</Grid.ColumnDefinitions>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="90"/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<c:BAsyncImage UrlSource="{Binding Logo}"
Width="80" DecodePixelWidth="80"
VerticalAlignment="Top" Margin="0,5,0,5"
Cursor="Hand"/>
<StackPanel Grid.Column="1" Orientation="Vertical" VerticalAlignment="Top" Margin="0,5,0,0">
<StackPanel Orientation="Horizontal">
<TextBlock Text="SKU:"/>
<c:BButton Content="{Binding PurchaseSkuId}" Style="{StaticResource LinkButton}"
Command="{Binding DataContext.CopyTextCommand,RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Window}}}"
CommandParameter="{Binding PurchaseSkuId}"
Margin=" 5,0,0,0"/>
</StackPanel>
<TextBlock TextTrimming="CharacterEllipsis"
Margin="0,17,0,0">
<Run Text="名称:"/>
<Run Text="{Binding Title}"/>
<TextBlock.ToolTip>
<ToolTip Style="{StaticResource OrderCouponToolipStyle}">
<TextBlock Text="{Binding Title}"/>
</ToolTip>
</TextBlock.ToolTip>
</TextBlock>
<StackPanel Orientation="Horizontal" Margin="0,17,0,0">
<TextBlock>
<Run Text="采购平台:"/>
<Run Text="{Binding DataContext.PurchasePlatform,RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type ListBox},AncestorLevel=1}}"/>
</TextBlock>
<TextBlock Margin="10,0,0,0">
<TextBlock.ToolTip>
<ToolTip Style="{StaticResource OrderCouponToolipStyle}">
<TextBlock Text="{Binding DataContext.PurchaserName,RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type ListBox},AncestorLevel=1}}"/>
</ToolTip>
</TextBlock.ToolTip>
<Run Text="采购商:"/>
<Run Text="{Binding DataContext.PurchaserName,RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type ListBox},AncestorLevel=1}}"/>
</TextBlock>
</StackPanel>
</StackPanel>
</Grid>
<Border Width="1" HorizontalAlignment="Right" Background="{StaticResource Border.Brush}" Margin="0,0,2,0"/>
<TextBlock Text="{Binding QuantityRatio}" Style="{StaticResource middleTextBlock}" Grid.Column="1" Margin="0,0,0,25"/>
<c:BButton Content="修改" Grid.Column="1" VerticalAlignment="Bottom"
Background="White"
Foreground="{StaticResource Text.Color}"
Command="{Binding DataContext.EditQuantityRatioCommand,RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type Window}}}">
<c:BButton.CommandParameter>
<MultiBinding Converter="{StaticResource mptConverter}">
<Binding Path="DataContext.Quantity" RelativeSource="{RelativeSource Mode=FindAncestor,AncestorType={x:Type ListBox},AncestorLevel=1}"/>
<Binding Path="."/>
</MultiBinding>
</c:BButton.CommandParameter>
</c:BButton>
<Border Grid.Column="1" Height="1" Background="{StaticResource Border.Brush}" VerticalAlignment="Bottom" Margin="-2,0,2,30"/>
<Border Width="1" HorizontalAlignment="Right" Background="{StaticResource Border.Brush}" Margin="0,0,2,0" Grid.Column="1"/>
<StackPanel Orientation="Horizontal" HorizontalAlignment="Center" Grid.Column="2" Margin="0,0,5,0">
<c:BButton Content="-" Background="White" Foreground="Black"
BorderBrush="{StaticResource Border.Brush}"
BorderThickness="1"
Width="15"
Height="18"
Command="{Binding DataContext.SubtractQuantityCommand,RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type Window}}}"
CommandParameter="{Binding }"/>
<c:BTextBox Text="{Binding ItemTotal,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" Margin="5,0" VerticalAlignment="Center"
Width="40" HorizontalContentAlignment="Center" Padding="0,0,3,0"
DisableBgColor="{StaticResource TextBox.Disable.BgColor}"/>
<c:BButton Content="+" Background="White" Foreground="Black"
BorderBrush="{StaticResource Border.Brush}"
BorderThickness="1"
Width="15"
Height="18"
Command="{Binding DataContext.AddQuantityCommand,RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type Window}}}"
CommandParameter="{Binding }"/>
</StackPanel>
<Border Width="1" HorizontalAlignment="Right" Background="{StaticResource Border.Brush}" Margin="0,0,2,0" Grid.Column="2"/>
<Border Width="1" HorizontalAlignment="Right" Background="{StaticResource Border.Brush}" Margin="0,0,2,0" Grid.Column="3"/>
<TextBlock Grid.Column="3" Text="{Binding Price}" Style="{StaticResource middleTextBlock}"/>
<Border Width="1" HorizontalAlignment="Right" Background="{StaticResource Border.Brush}" Margin="0,0,2,0" Grid.Column="4"/>
<TextBlock Grid.Column="4" Text="{Binding SkuAmount}" Style="{StaticResource middleTextBlock}"/>
<Border Height="1" VerticalAlignment="Bottom" Background="{StaticResource Border.Brush}" Grid.ColumnSpan="5" Margin="0,0,2,0"/>
</Grid>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</Grid>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
<!--<DataGrid Grid.Row="1"
ItemsSource="{Binding PurchaseSchemeProductSkuList}" ItemsSource="{Binding PurchaseSchemeProductSkuList}"
RowHeight="90"> RowHeight="90">
<DataGrid.Columns> <DataGrid.Columns>
@ -50,7 +275,7 @@
<ColumnDefinition/> <ColumnDefinition/>
</Grid.ColumnDefinitions> </Grid.ColumnDefinitions>
<!--{Binding Logo}--> --><!--{Binding Logo}--><!--
<c:BAsyncImage UrlSource="{Binding Logo}" <c:BAsyncImage UrlSource="{Binding Logo}"
Width="80" DecodePixelWidth="80" Width="80" DecodePixelWidth="80"
VerticalAlignment="Top" Margin="0,5,0,0"/> VerticalAlignment="Top" Margin="0,5,0,0"/>
@ -74,9 +299,9 @@
Binding="{Binding SkuAmount,Mode=OneWay,UpdateSourceTrigger=PropertyChanged}" Binding="{Binding SkuAmount,Mode=OneWay,UpdateSourceTrigger=PropertyChanged}"
ElementStyle="{StaticResource middleTextBlock}"/> ElementStyle="{StaticResource middleTextBlock}"/>
</DataGrid.Columns> </DataGrid.Columns>
</DataGrid> </DataGrid>-->
<Grid Grid.Row="2" Margin="5,0"> <Grid Grid.Row="3" Margin="5,0">
<Grid.ColumnDefinitions> <Grid.ColumnDefinitions>
<ColumnDefinition Width="0.8*"/> <ColumnDefinition Width="0.8*"/>
<ColumnDefinition Width="0.2*"/> <ColumnDefinition Width="0.2*"/>
@ -98,7 +323,7 @@
</TextBlock> </TextBlock>
</Grid> </Grid>
<StackPanel HorizontalAlignment="Stretch" VerticalAlignment="Center" Grid.Row="3" Margin="5,0"> <StackPanel HorizontalAlignment="Stretch" VerticalAlignment="Center" Grid.Row="4" Margin="5,0">
<c:BTextBox Text="{Binding ContactName,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" WaterRemark="收货人"/> <c:BTextBox Text="{Binding ContactName,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" WaterRemark="收货人"/>
<Grid> <Grid>
<Grid.ColumnDefinitions> <Grid.ColumnDefinitions>
@ -118,12 +343,12 @@
<c:BTextBox Text="{Binding Mobile,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" WaterRemark="电话"/> <c:BTextBox Text="{Binding Mobile,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" WaterRemark="电话"/>
</StackPanel> </StackPanel>
<TextBlock Grid.Row="4" HorizontalAlignment="Left" VerticalAlignment="Center" Margin="5,0,0,0" FontSize="16"> <TextBlock Grid.Row="5" HorizontalAlignment="Left" VerticalAlignment="Center" Margin="5,0,0,0" FontSize="16">
<Run Text="应付总额(含运费)"/> <Run Text="应付总额(含运费)"/>
<Run Text="{Binding TotalAmount,Mode=OneWay,UpdateSourceTrigger=PropertyChanged}" Foreground="#EC808D"/> <Run Text="{Binding TotalAmount,Mode=OneWay,UpdateSourceTrigger=PropertyChanged}" Foreground="#EC808D"/>
<Run Text="元"/> <Run Text="元"/>
</TextBlock> </TextBlock>
<StackPanel Orientation="Horizontal" Grid.Row="4" VerticalAlignment="Center" HorizontalAlignment="Right"> <StackPanel Orientation="Horizontal" Grid.Row="6" VerticalAlignment="Center" HorizontalAlignment="Right">
<RadioButton Content="批发" Padding="0" VerticalContentAlignment="Center" <RadioButton Content="批发" Padding="0" VerticalContentAlignment="Center"
GroupName="OrderMode" GroupName="OrderMode"
IsChecked="{Binding PurchaseOrderMode,Converter={StaticResource enumToBooleanConverter},ConverterParameter={x:Static cmodel:PurchaseOrderMode.批发}}"/> IsChecked="{Binding PurchaseOrderMode,Converter={StaticResource enumToBooleanConverter},ConverterParameter={x:Static cmodel:PurchaseOrderMode.批发}}"/>

339
BBWYB.Server.Business/PurchaseOrder/PurchaseOrderBusiness.cs

@ -10,6 +10,7 @@ using Newtonsoft.Json.Linq;
using SDKAdapter; using SDKAdapter;
using SDKAdapter.PurchasePlatform.Client; using SDKAdapter.PurchasePlatform.Client;
using SDKAdapter.PurchasePlatform.Models; using SDKAdapter.PurchasePlatform.Models;
using System.Text;
using Yitter.IdGenerator; using Yitter.IdGenerator;
namespace BBWYB.Server.Business namespace BBWYB.Server.Business
@ -44,43 +45,82 @@ namespace BBWYB.Server.Business
public PreviewOrderResponse PreviewPurchaseOrder(PreviewOrderRequest request) public PreviewOrderResponse PreviewPurchaseOrder(PreviewOrderRequest request)
{ {
nLogManager.Default().Info($"PreviewPurchaseOrder {JsonConvert.SerializeObject(request)}"); nLogManager.Default().Info($"PreviewPurchaseOrder {JsonConvert.SerializeObject(request)}");
var response = ppPlatformClientFactory.GetClient((AdapterEnums.PlatformType)request.Platform) if (request.Consignee == null ||
.PreviewOrder(new PP_PreviewOrderRequest() string.IsNullOrEmpty(request.Consignee.Address) ||
{ string.IsNullOrEmpty(request.Consignee.Mobile) ||
AppKey = request.AppKey, string.IsNullOrEmpty(request.Consignee.ContactName))
AppSecret = request.AppSecret, throw new BusinessException("缺少收货人信息");
AppToken = request.AppToken, if (request.PurchaseAccountList == null || request.PurchaseAccountList.Count() == 0)
Consignee = new PP_ConsigneeRequest() throw new BusinessException("缺少采购账号");
{ if (request.CargoParamGroupList == null || request.CargoParamGroupList.Count() == 0)
Address = request.Consignee.Address, throw new BusinessException("缺少报价参数");
City = request.Consignee.City,
ContactName = request.Consignee.ContactName, var extJArray = new List<object>();
County = request.Consignee.County, var errorBuilder = new StringBuilder();
Mobile = request.Consignee.Mobile, var freightAmount = 0M;
Province = request.Consignee.Province, var productAmount = 0M;
TelePhone = request.Consignee.TelePhone, var totalAmount = 0M;
Town = request.Consignee.Town
}, foreach (var cargoParamGroup in request.CargoParamGroupList)
Platform = (AdapterEnums.PlatformType)request.Platform, {
PurchaseMode = (AdapterEnums.PurchaseMode)request.PurchaseOrderMode, var purchaseAccount = request.PurchaseAccountList.FirstOrDefault(pa => pa.PurchasePlatformId == cargoParamGroup.PurchasePlatform);
OrderProductParamList = request.CargoParamList.Select(p => new PP_OrderProductParamRequest() if (purchaseAccount == null)
{ throw new BusinessException($"缺少{cargoParamGroup.PurchasePlatform}采购平台账号,请在店铺配置中设置");
ProductId = p.ProductId,
Quantity = p.Quantity, try
SkuId = p.SkuId, {
SpecId = p.SpecId var response = ppPlatformClientFactory.GetClient((AdapterEnums.PlatformType)cargoParamGroup.PurchasePlatform)
}).ToList() .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() return new PreviewOrderResponse()
{ {
Extensions = response.Extensions, Extensions = JsonConvert.SerializeObject(extJArray),
FreightAmount = response.FreightAmount, FreightAmount = freightAmount,
ProductAmount = response.ProductAmount, ProductAmount = productAmount,
TotalAmount = response.TotalAmount TotalAmount = totalAmount
}; };
} }
public void CreatePurchaseOrder(CreateOrderRequest request) public void CreatePurchaseOrder(CreateOrderRequest request)
{ {
nLogManager.Default().Info($"CreatePurchaseOrder\r\n{JsonConvert.SerializeObject(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.) if (dbOrder.OrderState != Enums.OrderState. && dbOrder.OrderState != Enums.OrderState.)
throw new BusinessException("只能为等待采购或待出库的订单进行采购"); 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<OrderCostDetail>().Where(ocd => ocd.OrderId == dbOrder.Id); var deleteOrderCostDetail = fsql.Delete<OrderCostDetail>().Where(ocd => ocd.OrderId == dbOrder.Id);
var isRepurchase = fsql.Select<OrderCost>(dbOrder.Id).Any(); var isRepurchase = fsql.Select<OrderCost>(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<OrderSku>().Where(osku => osku.Price != 0 && osku.OrderId == request.OrderId).ToList(); var orderSkus = fsql.Select<OrderSku>().Where(osku => osku.Price != 0 && osku.OrderId == request.OrderId).ToList();
var orderSkuIds = orderSkus.Select(osku => osku.Id).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<JArray>(request.Extensions);
//IList<PP_QueryOrderDetailResponse> purchaseOrderSimpleInfoList = new List<PP_QueryOrderDetailResponse>();
List<OrderCostDetail> insertOrderCostDetails = new List<OrderCostDetail>(); List<OrderCostDetail> insertOrderCostDetails = new List<OrderCostDetail>();
List<OrderPurchaseInfo> insertOrderPurchaseInfos = new List<OrderPurchaseInfo>();
IInsert<OrderCost> insertOrderCost = null; IInsert<OrderCost> insertOrderCost = null;
IUpdate<OrderCost> updateOrderCost = null; IUpdate<OrderCost> updateOrderCost = null;
IInsert<OrderPurchaseInfo> insertOrderPurchaseInfo = null; var totalPurchaseAmount = 0M;
IUpdate<OrderPurchaseInfo> updateOrderPurchaseInfo = null;
foreach (var orderSku in orderSkus) foreach (var cargoParamGroup in request.CargoParamGroupList)
{ {
#region 计算当前sku的采购成本和采购运费 var purchaseAccount = request.PurchaseAccountList.FirstOrDefault(pa => pa.PurchasePlatformId == cargoParamGroup.PurchasePlatform);
var currentOrderSkuProductAmount = 0M; //采购成本 if (purchaseAccount == null)
var currentOrderSkuCargoParamList = request.CargoParamList.Where(p => p.BelongSkuId == orderSku.SkuId); //找当前skuId的采购skuId throw new BusinessException($"缺少{cargoParamGroup.PurchasePlatform}采购平台账号,请在店铺配置中设置");
currentOrderSkuProductAmount = purchaseOrderSimpleInfo.ItemList.Where(p => currentOrderSkuCargoParamList.Any(p1 => p1.SkuId == p.SkuId))?.Sum(p => p.ProductAmount) ?? 0M;
var currentOrderSkuFreightAmount = purchaseOrderSimpleInfo.FreightAmount / orderSkus.Count(); //采购运费(按sku数均分) var client = ppPlatformClientFactory.GetClient((AdapterEnums.PlatformType)cargoParamGroup.PurchasePlatform);
#endregion var extJson = extJArray.FirstOrDefault(j => j.Value<string>("PurchaserId") == cargoParamGroup.PurchaserId);
#region 成本明细 var createOrderResponse = client.CreateOrder(new PP_CreateOrderRequest()
var orderCostDetail = new OrderCostDetail()
{ {
Id = idGenerator.NewLong(), AppKey = purchaseAccount.AppKey,
ConsumableAmount = 0, AppSecret = purchaseAccount.AppSecret,
CreateTime = DateTime.Now, AppToken = purchaseAccount.AppToken,
DeductionQuantity = orderSku.ItemTotal.Value, Consignee = new PP_ConsigneeRequest()
DeliveryExpressFreight = 0, {
FirstFreight = 0, Address = request.Consignee.Address,
//OperationAmount = 0, City = request.Consignee.City,
InStorageAmount = 0, ContactName = request.Consignee.ContactName,
OutStorageAmount = 0, County = request.Consignee.County,
OrderId = request.OrderId, Mobile = request.Consignee.Mobile,
ProductId = orderSku.ProductId, Province = request.Consignee.Province,
PurchaseFreight = currentOrderSkuFreightAmount, TelePhone = request.Consignee.TelePhone,
//PurchaseOrderPKId = purchaseOrder.Id, Town = request.Consignee.Town
PurchaseOrderId = purchaseOrderSimpleInfo.OrderId, },
SkuAmount = currentOrderSkuProductAmount, Platform = (AdapterEnums.PlatformType)purchaseAccount.PurchasePlatformId,
SkuId = orderSku.SkuId, PurchaseMode = (AdapterEnums.PurchaseMode)request.PurchaseOrderMode,
StorageAmount = 0 Extensions = extJson.Value<string>("OrderTradeTypeCode"),
//UnitCost = purchaseOrder.UnitCost, Remark = request.Remark,
//TotalCost = currentOrderSkuProductAmount + currentOrderSkuFreightAmount//purchaseOrder.UnitCost * orderSku.ItemTotal.Value OrderProductParamList = cargoParamGroup.CargoParamList.Select(p => new PP_OrderProductParamRequest()
}; {
//orderCostDetail.SkuGrossProfit = orderSku.Price.Value * orderCostDetail.DeductionQuantity - avgPreferential - (orderCostDetail.TotalCost + orderCostDetail.DeliveryExpressFreight) - orderSku.Price.Value * orderCostDetail.DeductionQuantity * createOnlinePurchaseOrderRequest.PlatformCommissionRatio; ProductId = p.ProductId,
insertOrderCostDetails.Add(orderCostDetail); Quantity = p.Quantity,
#endregion 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 订单成本 #region 订单成本
@ -213,7 +267,7 @@ namespace BBWYB.Server.Business
IsManualEdited = false, IsManualEdited = false,
PlatformCommissionRatio = 0, PlatformCommissionRatio = 0,
PreferentialAmount = 0, PreferentialAmount = 0,
PurchaseAmount = purchaseOrderSimpleInfo.TotalAmount PurchaseAmount = totalPurchaseAmount
}; };
//orderCost.PlatformCommissionAmount = dbOrder.OrderSellerPrice * orderCost.PlatformCommissionRatio; //orderCost.PlatformCommissionAmount = dbOrder.OrderSellerPrice * orderCost.PlatformCommissionRatio;
orderCost.Profit = dbOrder.OrderSellerPrice + orderCost.Profit = dbOrder.OrderSellerPrice +
@ -230,38 +284,13 @@ namespace BBWYB.Server.Business
} }
#endregion #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<OrderPurchaseInfo>().SetSource(orderPurchaserInfo).IgnoreColumns(a => new { a.CreateTime });
}
#endregion
fsql.Transaction(() => fsql.Transaction(() =>
{ {
deleteOrderCostDetail.ExecuteAffrows(); deleteOrderCostDetail.ExecuteAffrows();
fsql.Insert(insertOrderCostDetails).ExecuteAffrows(); fsql.Insert(insertOrderCostDetails).ExecuteAffrows();
fsql.Insert(insertOrderPurchaseInfos).ExecuteAffrows();
updateOrderCost?.ExecuteAffrows(); updateOrderCost?.ExecuteAffrows();
insertOrderCost?.ExecuteAffrows(); insertOrderCost?.ExecuteAffrows();
insertOrderPurchaseInfo?.ExecuteAffrows();
updateOrderPurchaseInfo?.ExecuteAffrows();
fsql.Update<Order>(request.OrderId).SetIf(dbOrder.OrderState == Enums.OrderState., o => o.OrderState, Model.Enums.OrderState.) fsql.Update<Order>(request.OrderId).SetIf(dbOrder.OrderState == Enums.OrderState., o => o.OrderState, Model.Enums.OrderState.)
.Set(o => o.IsPurchased, true) .Set(o => o.IsPurchased, true)
.ExecuteAffrows(); .ExecuteAffrows();

30
BBWYB.Server.Model/Db/Order/OrderPurchaseInfo.cs

@ -4,34 +4,36 @@ namespace BBWYB.Server.Model.Db
{ {
[Table(Name = "orderpurchaseinfo", DisableSyncStructure = true)] [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)] [Column(StringLength = 50, IsNullable = false)]
public string OrderId { get; set; } public string OrderId { get; set; }
[Column(DbType = "datetime")] [Column(DbType = "datetime")]
public DateTime? CreateTime { get; set; } public DateTime? CreateTime { get; set; }
[Column(StringLength = 100)] [Column(StringLength = 100)]
public string PurchaseAccountId { get; set; } public string PurchaseAccountId { get; set; }
[Column(StringLength = 100)] [Column(StringLength = 100)]
public string PurchaseAccountName { get; set; } public string PurchaseAccountName { get; set; }
[Column(MapType = typeof(int?))] [Column(MapType = typeof(int?))]
public Enums.PurchaseMethod? PurchaseMethod { get; set; } public Enums.PurchaseMethod? PurchaseMethod { get; set; }
[Column(StringLength = 100)] [Column(StringLength = 100)]
public string PurchaseOrderId { get; set; } public string PurchaseOrderId { get; set; }
[Column(MapType = typeof(int?))] [Column(MapType = typeof(int?))]
public Enums.Platform? PurchasePlatform { get; set; } public Enums.Platform? PurchasePlatform { get; set; }
[Column(StringLength = 100)] [Column(StringLength = 100)]
public string PurchaserName { get; set; } public string PurchaserName { get; set; }
public long? ShopId { get; set; } public long? ShopId { get; set; }
} }
} }

8
BBWYB.Server.Model/Dto/Request/PurchaseOrder/CargoParamRequest.cs

@ -18,4 +18,12 @@
/// </summary> /// </summary>
public string BelongSkuId { get; set; } 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<CargoParamRequest> CargoParamList { get; set; }
}
} }

6
BBWYB.Server.Model/Dto/Request/PurchaseOrder/CreateOrderRequest.cs

@ -11,12 +11,6 @@
/// </summary> /// </summary>
public string OrderId { get; set; } 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; } public long ShopId { get; set; }
} }
} }

15
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
{ {
/// <summary> public IList<PurchaseAccountRequest> PurchaseAccountList { get; set; }
/// 订单模式
/// <para>1688 general大市场订单 saleproxy分销订单</para>
/// </summary>
public Enums.PurchaseOrderMode PurchaseOrderMode { get; set; } public Enums.PurchaseOrderMode PurchaseOrderMode { get; set; }
public ConsigneeRequest Consignee { get; set; } public ConsigneeRequest Consignee { get; set; }
public IList<CargoParamRequest> CargoParamList { get; set; } public IList<CargoParamGroupRequest> CargoParamGroupList { get; set; }
} }
} }

28
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; }
}
}
Loading…
Cancel
Save