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>
public class PurchaseSchemeProductSku : ObservableObject
{
public PurchaseSchemeProductSku()
{
QuantityRatio = 1;
}
/// <summary>
/// 采购商品的SKU和采购方案的关系Id
/// </summary>
@ -52,7 +57,10 @@ namespace BBWYB.Client.Models
private int itemTotal;
private decimal skuAmount;
private int quantityRatio;
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;
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;
}
}

336
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<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); } }
@ -70,6 +78,8 @@ namespace BBWYB.Client.ViewModels
private string town;
private string prucahseRemark;
private PurchaseOrderMode purchaseOrderMode = PurchaseOrderMode.;
private IList<PurchaseScheme> schemeList;
/// <summary>
/// 扩展数据,暂用于拳探
/// </summary>
@ -86,10 +96,13 @@ namespace BBWYB.Client.ViewModels
this.purchaseService = purchaseService;
this.delayTrigger = new DelayTrigger();
this.delayTrigger.OnExecute = OnDelayTriggerExecute;
PurchaseSchemeProductSkuList = new ObservableCollection<PurchaseSchemeProductSku>();
ProductSkuWithSchemeList = new ObservableCollection<ProductSkuWithScheme>();
purchaseSchemeList = new List<PurchaseScheme>();
FastCreateOrderCommand = new RelayCommand(FastCreateOrder);
PreviewOrderCommand = new RelayCommand(PreviewOrder);
EditQuantityRatioCommand = new RelayCommand<object>(EditQuantityRatio);
AddQuantityCommand = new RelayCommand<PurchaseSchemeProductSku>(AddQuantity);
SubtractQuantityCommand = new RelayCommand<PurchaseSchemeProductSku>(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<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))
.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<WaitHandle>();
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<WaitHandle>();
// 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<object>(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<object>(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--;
}
}
}

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: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">
<c:BWindow.Resources>
<ctr:MultiParameterTransferConverter x:Key="mptConverter"/>
</c:BWindow.Resources>
<b:Interaction.Triggers>
<b:EventTrigger EventName="Loaded">
<b:InvokeCommandAction Command="{Binding LoadCommand}"/>
@ -23,6 +29,7 @@
</b:Interaction.Triggers>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="30"/>
<RowDefinition Height="30"/>
<RowDefinition/>
<RowDefinition Height="60"/>
@ -30,14 +37,232 @@
<RowDefinition Height="40"/>
</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}"
Background="{StaticResource Border.Background}">
<TextBlock Text="提交订单" HorizontalAlignment="Center" VerticalAlignment="Center"/>
</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}"
RowHeight="90">
<DataGrid.Columns>
@ -50,7 +275,7 @@
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<!--{Binding Logo}-->
--><!--{Binding Logo}--><!--
<c:BAsyncImage UrlSource="{Binding Logo}"
Width="80" DecodePixelWidth="80"
VerticalAlignment="Top" Margin="0,5,0,0"/>
@ -74,9 +299,9 @@
Binding="{Binding SkuAmount,Mode=OneWay,UpdateSourceTrigger=PropertyChanged}"
ElementStyle="{StaticResource middleTextBlock}"/>
</DataGrid.Columns>
</DataGrid>
</DataGrid>-->
<Grid Grid.Row="2" Margin="5,0">
<Grid Grid.Row="3" Margin="5,0">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="0.8*"/>
<ColumnDefinition Width="0.2*"/>
@ -98,7 +323,7 @@
</TextBlock>
</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="收货人"/>
<Grid>
<Grid.ColumnDefinitions>
@ -118,12 +343,12 @@
<c:BTextBox Text="{Binding Mobile,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" WaterRemark="电话"/>
</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="{Binding TotalAmount,Mode=OneWay,UpdateSourceTrigger=PropertyChanged}" Foreground="#EC808D"/>
<Run Text="元"/>
</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"
GroupName="OrderMode"
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.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<object>();
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<OrderCostDetail>().Where(ocd => ocd.OrderId == dbOrder.Id);
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 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<OrderPurchaseInfo> insertOrderPurchaseInfos = new List<OrderPurchaseInfo>();
IInsert<OrderCost> insertOrderCost = null;
IUpdate<OrderCost> updateOrderCost = null;
IInsert<OrderPurchaseInfo> insertOrderPurchaseInfo = null;
IUpdate<OrderPurchaseInfo> 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<string>("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<string>("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<OrderPurchaseInfo>().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<Order>(request.OrderId).SetIf(dbOrder.OrderState == Enums.OrderState., o => o.OrderState, Model.Enums.OrderState.)
.Set(o => o.IsPurchased, true)
.ExecuteAffrows();

30
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; }
}
}

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

@ -18,4 +18,12 @@
/// </summary>
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>
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; }
}
}

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