using BBWY.Common.Extensions; using BBWY.Common.Models; using BBWY.Server.Model.Db; using BBWY.Server.Model.Dto; using FreeSql; using System; using System.Collections.Generic; using System.Linq; using Yitter.IdGenerator; namespace BBWY.Server.Business { public class PurchaseOrderBusiness : BaseBusiness, IDenpendency { private IEnumerable platformSDKBusinessList; public PurchaseOrderBusiness(IFreeSql fsql, NLog.ILogger logger, IIdGenerator idGenerator, IEnumerable platformSDKBusinessList) : base(fsql, logger, idGenerator) { this.platformSDKBusinessList = platformSDKBusinessList; } public void AddPurchaseOrder(AddPurchaseOrderRequest addPurchaseOrderRequest) { if (string.IsNullOrEmpty(addPurchaseOrderRequest.PurchaseOrderId) || string.IsNullOrEmpty(addPurchaseOrderRequest.SkuId) || string.IsNullOrEmpty(addPurchaseOrderRequest.ProductId)) throw new BusinessException("缺少采购单必要信息"); if (fsql.Select().Where(po => po.SkuId == addPurchaseOrderRequest.SkuId && po.PurchaseOrderId == addPurchaseOrderRequest.PurchaseOrderId && po.StorageType == addPurchaseOrderRequest.StorageType).Any()) throw new BusinessException("同一个SkuId和同一种仓储类型中不能存在重复的采购单号"); var purchaseOrder = addPurchaseOrderRequest.Map(); purchaseOrder.Id = idGenerator.NewLong(); purchaseOrder.CreateTime = DateTime.Now; fsql.Insert(purchaseOrder).ExecuteAffrows(); } public void EditPurchaseOrder(EditPurchaseOrderRequest editPurchaseOrderRequest) { fsql.Update(editPurchaseOrderRequest.Id).Set(po => po.PurchaseQuantity, editPurchaseOrderRequest.PurchaseQuantity) .Set(po => po.RemainingQuantity, editPurchaseOrderRequest.RemainingQuantity) .Set(po => po.SingleSkuAmount, editPurchaseOrderRequest.SingleSkuAmount) .Set(po => po.SingleFreight, editPurchaseOrderRequest.SingleFreight) .Set(po => po.SingleFirstFreight, editPurchaseOrderRequest.SingleFirstFreight) .Set(po => po.SingleOperationAmount, editPurchaseOrderRequest.SingleOperationAmount) .Set(po => po.SingleConsumableAmount, editPurchaseOrderRequest.SingleConsumableAmount) .Set(po => po.SingleStorageAmount, editPurchaseOrderRequest.SingleStorageAmount) .Set(po => po.SingleDeliveryFreight, editPurchaseOrderRequest.SingleDeliveryFreight) .ExecuteAffrows(); } public IList GetList(QueryPurchaseOrderRequest queryPurchaseOrderRequest) { return fsql.Select().Where(po => po.ShopId == queryPurchaseOrderRequest.ShopId && queryPurchaseOrderRequest.SkuIdList.Contains(po.SkuId) && po.StorageType == queryPurchaseOrderRequest.StorageType) .ToList() .Map>(); } public void DeletePurchaseOrder(long id) { fsql.Delete(id).ExecuteAffrows(); } public PreviewOrderResponse PreviewPurchaseOrder(PreviewOrderReuqest previewOrderReuqest) { if (previewOrderReuqest.Platform != Model.Enums.Platform.阿里巴巴) throw new NotImplementedException(); return platformSDKBusinessList.FirstOrDefault(p => p.Platform == previewOrderReuqest.Platform).PreviewOrder(previewOrderReuqest); } public void FastCreateOrder(CreateOnlinePurchaseOrderRequest createOnlinePurchaseOrderRequest) { if (createOnlinePurchaseOrderRequest.Platform != Model.Enums.Platform.阿里巴巴) throw new NotImplementedException(); var dbOrder = fsql.Select(createOnlinePurchaseOrderRequest.OrderId).ToOne(); if (dbOrder == null) throw new BusinessException("订单不存在"); if (dbOrder.OrderState != Model.Enums.OrderState.等待采购) throw new BusinessException("只能为等待采购的订单进行采购"); var orderSku = fsql.Select().Where(osku => osku.OrderId == createOnlinePurchaseOrderRequest.OrderId).ToOne(); if (orderSku == null) throw new BusinessException("订单Sku不存在"); var createOrderResponse = platformSDKBusinessList.FirstOrDefault(p => p.Platform == createOnlinePurchaseOrderRequest.Platform) .FastCreateOrder(createOnlinePurchaseOrderRequest); IInsert insertPurchaseOrder = null; IInsert insertOrderCostDetail = null; IInsert insertOrderCost = null; IInsert insertOrderDropShipping = null; #region 采购单 var purchaseOrder = new PurchaseOrder() { Id = idGenerator.NewLong(), CreateTime = DateTime.Now, ProductId = orderSku.ProductId, SkuId = orderSku.SkuId, PurchaseMethod = Model.Enums.PurchaseMethod.线上采购, PurchaseOrderId = createOrderResponse.PurchaseOrderId, PurchasePlatform = createOnlinePurchaseOrderRequest.Platform, PurchaseQuantity = orderSku.ItemTotal.Value, RemainingQuantity = 0, ShopId = createOnlinePurchaseOrderRequest.ShopId, SingleConsumableAmount = 0, SingleDeliveryFreight = 0, SingleFirstFreight = 0, SingleStorageAmount = 0, SingleOperationAmount = 0, SingleSkuAmount = createOrderResponse.ProductAmount / orderSku.ItemTotal.Value, SingleFreight = createOrderResponse.FreightAmount / orderSku.ItemTotal.Value, StorageType = Model.Enums.StorageType.代发 }; insertPurchaseOrder = fsql.Insert(purchaseOrder); #endregion #region 成本明细 var orderCostDetail = new OrderCostDetail() { Id = idGenerator.NewLong(), ConsumableAmount = 0, CreateTime = DateTime.Now, DeductionQuantity = orderSku.ItemTotal.Value, DeliveryExpressFreight = 0, FirstFreight = 0, OperationAmount = 0, OrderId = createOnlinePurchaseOrderRequest.OrderId, ProductId = orderSku.ProductId, PurchaseFreight = createOrderResponse.FreightAmount, PurchaseOrderPKId = purchaseOrder.Id, SkuAmount = createOrderResponse.ProductAmount, SkuId = orderSku.SkuId, StorageAmount = 0, UnitCost = purchaseOrder.UnitCost, TotalCost = createOrderResponse.TotalAmount //purchaseOrder.UnitCost * orderSku.ItemTotal.Value }; insertOrderCostDetail = fsql.Insert(orderCostDetail); #endregion #region 订单成本 var orderCost = new OrderCost() { OrderId = orderSku.OrderId, CreateTime = DateTime.Now, DeliveryExpressFreight = 0, IsManualEdited = false, PlatformCommissionRatio = 0.05M, PreferentialAmount = dbOrder.PreferentialAmount, SDCommissionAmount = 0, PurchaseAmount = createOrderResponse.TotalAmount }; orderCost.PlatformCommissionAmount = dbOrder.OrderSellerPrice * orderCost.PlatformCommissionRatio; orderCost.Profit = dbOrder.OrderSellerPrice + dbOrder.FreightPrice - orderCost.PurchaseAmount - orderCost.DeliveryExpressFreight - orderCost.PlatformCommissionAmount; insertOrderCost = fsql.Insert(orderCost); #endregion #region 采购信息 var orderDropShipping = new OrderDropShipping() { OrderId = createOnlinePurchaseOrderRequest.OrderId, BuyerAccount = createOnlinePurchaseOrderRequest.BuyerAccount, SellerAccount = createOnlinePurchaseOrderRequest.SellerAccount, CreateTime = DateTime.Now, DeliveryFreight = 0, PurchaseAmount = createOrderResponse.TotalAmount, PurchaseOrderId = createOrderResponse.PurchaseOrderId, PurchasePlatform = createOnlinePurchaseOrderRequest.Platform }; insertOrderDropShipping = fsql.Insert(orderDropShipping); #endregion fsql.Transaction(() => { insertPurchaseOrder.ExecuteAffrows(); insertOrderCostDetail.ExecuteAffrows(); insertOrderCost.ExecuteAffrows(); insertOrderDropShipping.ExecuteAffrows(); fsql.Update(createOnlinePurchaseOrderRequest.OrderId).Set(o => o.OrderState, Model.Enums.OrderState.待出库) .Set(o => o.StorageType, Model.Enums.StorageType.代发) .ExecuteAffrows(); }); } } }