|
|
@ -1,6 +1,10 @@ |
|
|
|
using BBWYB.Common.Log; |
|
|
|
using BBWYB.Common.Models; |
|
|
|
using BBWYB.Server.Model; |
|
|
|
using BBWYB.Server.Model.Db; |
|
|
|
using BBWYB.Server.Model.Dto; |
|
|
|
using FreeSql; |
|
|
|
using Newtonsoft.Json; |
|
|
|
using SDKAdapter; |
|
|
|
using SDKAdapter.PurchasePlatform.Client; |
|
|
|
using SDKAdapter.PurchasePlatform.Models; |
|
|
@ -55,5 +59,164 @@ namespace BBWYB.Server.Business |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
public void CreatePurchaseOrder(CreateOrderRequest request) |
|
|
|
{ |
|
|
|
nLogManager.Default().Info($"CreatePurchaseOrder\r\n{JsonConvert.SerializeObject(request)}"); |
|
|
|
|
|
|
|
var dbOrder = fsql.Select<Order>(request.OrderId).ToOne(); |
|
|
|
if (dbOrder == null) |
|
|
|
throw new BusinessException("订单不存在"); |
|
|
|
if (dbOrder.OrderState != Enums.OrderState.等待采购 && dbOrder.OrderState != Enums.OrderState.待出库) |
|
|
|
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)}"); |
|
|
|
|
|
|
|
|
|
|
|
List<OrderCostDetail> insertOrderCostDetails = new List<OrderCostDetail>(); |
|
|
|
IInsert<OrderCost> insertOrderCost = null; |
|
|
|
IUpdate<OrderCost> updateOrderCost = null; |
|
|
|
|
|
|
|
foreach (var orderSku in orderSkus) |
|
|
|
{ |
|
|
|
#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 currentOrderSkuFreightAmount = purchaseOrderSimpleInfo.FreightAmount / orderSkus.Count(); //采购运费(按sku数均分)
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
#region 成本明细
|
|
|
|
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, |
|
|
|
//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
|
|
|
|
} |
|
|
|
|
|
|
|
#region 订单成本
|
|
|
|
var orderCost = new OrderCost() |
|
|
|
{ |
|
|
|
OrderId = request.OrderId, |
|
|
|
CreateTime = DateTime.Now, |
|
|
|
DeliveryExpressFreight = 0, |
|
|
|
IsManualEdited = false, |
|
|
|
PlatformCommissionRatio = 0, |
|
|
|
PreferentialAmount = 0, |
|
|
|
PurchaseAmount = purchaseOrderSimpleInfo.TotalAmount |
|
|
|
}; |
|
|
|
//orderCost.PlatformCommissionAmount = dbOrder.OrderSellerPrice * orderCost.PlatformCommissionRatio;
|
|
|
|
orderCost.Profit = dbOrder.OrderSellerPrice + |
|
|
|
dbOrder.FreightPrice - |
|
|
|
orderCost.PurchaseAmount - |
|
|
|
orderCost.DeliveryExpressFreight; // -orderCost.PlatformCommissionAmount
|
|
|
|
if (!isRepurchase) |
|
|
|
{ |
|
|
|
insertOrderCost = fsql.Insert(orderCost); |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
updateOrderCost = fsql.Update<OrderCost>().SetSource(orderCost).IgnoreColumns(a => new { a.CreateTime }); |
|
|
|
} |
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
|
|
fsql.Transaction(() => |
|
|
|
{ |
|
|
|
deleteOrderCostDetail.ExecuteAffrows(); |
|
|
|
fsql.Insert(insertOrderCostDetails).ExecuteAffrows(); |
|
|
|
updateOrderCost?.ExecuteAffrows(); |
|
|
|
insertOrderCost?.ExecuteAffrows(); |
|
|
|
fsql.Update<Order>(request.OrderId).SetIf(dbOrder.OrderState == Enums.OrderState.等待采购, o => o.OrderState, Model.Enums.OrderState.待出库) |
|
|
|
.Set(o => o.IsPurchased, true) |
|
|
|
.ExecuteAffrows(); |
|
|
|
}); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|