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(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().Where(ocd => ocd.OrderId == dbOrder.Id); var isRepurchase = fsql.Select(dbOrder.Id).Any(); #region 合并重复的采购sku var repeatPurchaseSkuGroups = request.CargoParamList.GroupBy(p => p.SkuId).ToList(); foreach (var group in repeatPurchaseSkuGroups) { if (group.Count() > 1) { var repeatSkus = group.ToList(); foreach (var repeatSku in repeatSkus) request.CargoParamList.Remove(repeatSku); request.CargoParamList.Add(new CargoParamRequest() { BelongSkuId = repeatSkus[0].BelongSkuId, ProductId = repeatSkus[0].ProductId, SkuId = repeatSkus[0].SkuId, SpecId = repeatSkus[0].SpecId, Quantity = repeatSkus.Sum(s => s.Quantity) }); } } #endregion var orderSkus = fsql.Select().Where(osku => osku.Price != 0 && osku.OrderId == request.OrderId).ToList(); var orderSkuIds = orderSkus.Select(osku => osku.Id).ToList(); var client = ppPlatformClientFactory.GetClient((AdapterEnums.PlatformType)request.Platform); var createOrderResponse = client.CreateOrder(new PP_CreateOrderRequest() { AppKey = request.AppKey, AppSecret = request.AppSecret, AppToken = request.AppToken, Consignee = new PP_ConsigneeRequest() { Address = request.Consignee.Address, City = request.Consignee.City, ContactName = request.Consignee.ContactName, County = request.Consignee.County, Mobile = request.Consignee.Mobile, Province = request.Consignee.Province, TelePhone = request.Consignee.TelePhone, Town = request.Consignee.Town }, Platform = (AdapterEnums.PlatformType)request.Platform, PurchaseMode = (AdapterEnums.PurchaseMode)request.PurchaseOrderMode, Extensions = request.Extensions, Remark = request.Remark, OrderProductParamList = request.CargoParamList.Select(p => new PP_OrderProductParamRequest() { ProductId = p.ProductId, Quantity = p.Quantity, SkuId = p.SkuId, SpecId = p.SpecId }).ToList() }); var purchaseOrderSimpleInfo = client.QueryOrderDetail(new PP_QueryOrderDetailRequest() { AppKey = request.AppKey, AppSecret = request.AppSecret, AppToken = request.AppToken, OrderId = createOrderResponse.OrderId }); nLogManager.Default().Info($"QueryOrderDetail\r\nShopOrderId {request.OrderId}\r\n purchaseOrderSimpleInfo\r\n{JsonConvert.SerializeObject(purchaseOrderSimpleInfo)}"); List insertOrderCostDetails = new List(); IInsert insertOrderCost = null; IUpdate 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().SetSource(orderCost).IgnoreColumns(a => new { a.CreateTime }); } #endregion fsql.Transaction(() => { deleteOrderCostDetail.ExecuteAffrows(); fsql.Insert(insertOrderCostDetails).ExecuteAffrows(); updateOrderCost?.ExecuteAffrows(); insertOrderCost?.ExecuteAffrows(); fsql.Update(request.OrderId).SetIf(dbOrder.OrderState == Enums.OrderState.等待采购, o => o.OrderState, Model.Enums.OrderState.待出库) .Set(o => o.IsPurchased, true) .ExecuteAffrows(); }); } } }