|
|
|
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;
|
|
|
|
using Yitter.IdGenerator;
|
|
|
|
|
|
|
|
namespace BBWYB.Server.Business
|
|
|
|
{
|
|
|
|
public class PurchaseOrderBusiness : BaseBusiness, IDenpendency
|
|
|
|
{
|
|
|
|
private PP_PlatformClientFactory ppPlatformClientFactory;
|
|
|
|
public PurchaseOrderBusiness(IFreeSql fsql, NLogManager nLogManager, IIdGenerator idGenerator, PP_PlatformClientFactory ppPlatformClientFactory) : base(fsql, nLogManager, idGenerator)
|
|
|
|
{
|
|
|
|
this.ppPlatformClientFactory = ppPlatformClientFactory;
|
|
|
|
}
|
|
|
|
|
|
|
|
public PreviewOrderResponse PreviewPurchaseOrder(PreviewOrderRequest 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()
|
|
|
|
});
|
|
|
|
return new PreviewOrderResponse()
|
|
|
|
{
|
|
|
|
Extensions = response.Extensions,
|
|
|
|
FreightAmount = response.FreightAmount,
|
|
|
|
ProductAmount = response.ProductAmount,
|
|
|
|
TotalAmount = response.TotalAmount
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
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;
|
|
|
|
IInsert<OrderPurchaseInfo> insertOrderPurchaseInfo = null;
|
|
|
|
IUpdate<OrderPurchaseInfo> updateOrderPurchaseInfo = 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
|
|
|
|
|
|
|
|
#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
|
|
|
|
};
|
|
|
|
|
|
|
|
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();
|
|
|
|
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();
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|