diff --git a/BBWY.Server.API/Controllers/OrderController.cs b/BBWY.Server.API/Controllers/OrderController.cs index 4fd9affc..c269630a 100644 --- a/BBWY.Server.API/Controllers/OrderController.cs +++ b/BBWY.Server.API/Controllers/OrderController.cs @@ -112,6 +112,16 @@ namespace BBWY.Server.API.Controllers orderBusiness.RelationPurchaseOrder(relationPurchaseOrderRequest); } + /// + /// 关联采购单V2 + /// + /// + [HttpPost] + public void RelationPurchaseOrderV2([FromBody]RelationPurchaseOrderRequestV2 relationPurchaseOrderRequestV2) + { + orderBusiness.RelationPurchaseOrderV2(relationPurchaseOrderRequestV2); + } + /// /// 出库 /// diff --git a/BBWY.Server.Business/Order/OrderBusiness.cs b/BBWY.Server.Business/Order/OrderBusiness.cs index 8412d4ef..ccb172d1 100644 --- a/BBWY.Server.Business/Order/OrderBusiness.cs +++ b/BBWY.Server.Business/Order/OrderBusiness.cs @@ -899,6 +899,169 @@ namespace BBWY.Server.Business }); } + /// + /// 关联外部订单 + /// + /// + public void RelationPurchaseOrderV2(RelationPurchaseOrderRequestV2 relationPurchaseOrderRequestV2) + { + var dbOrder = fsql.Select(relationPurchaseOrderRequestV2.OrderDropShippingList[0].OrderId).ToOne(); + if (dbOrder == null) + throw new BusinessException($"订单号{relationPurchaseOrderRequestV2.OrderDropShippingList[0].OrderId}不存在"); + + if (relationPurchaseOrderRequestV2.PlatformCommissionRatio == 0M) + relationPurchaseOrderRequestV2.PlatformCommissionRatio = 0.05M; + + List insertOrderDropShippingList = new List(); + List updateOrderDropShippingList = new List(); + IInsert insertOrderCost = null; + IUpdate updateOrderCost = null; + IDelete deletePurchaseOrder = null; + IDelete deleteOrderCostDetail = null; + List> updateOrderSkuList = new List>(); + List insertPurchaseOrderList = new List(); + List insertOrderCostDetailList = new List(); + + var oldPourchaseIdList = fsql.Select().Where(ocd => ocd.OrderId == dbOrder.Id) + .ToList(ocd => ocd.PurchaseOrderPKId); + + deletePurchaseOrder = fsql.Delete().Where(po => oldPourchaseIdList.Contains(po.Id)); + deleteOrderCostDetail = fsql.Delete().Where(ocd => ocd.OrderId == dbOrder.Id); + + foreach (var orderDropShipping in relationPurchaseOrderRequestV2.OrderDropShippingList) + { + #region 代发信息表 + if (orderDropShipping.Id == 0) + { + orderDropShipping.Id = idGenerator.NewLong(); + orderDropShipping.CreateTime = DateTime.Now; + orderDropShipping.ShopId = dbOrder.ShopId; + insertOrderDropShippingList.Add(orderDropShipping); + } + else + { + updateOrderDropShippingList.Add(orderDropShipping); + } + #endregion + + foreach (var relationOrderSku in orderDropShipping.RelationPurchaseOrderSkuList) + { + #region OrderSku + var updateOrderSku = fsql.Update(relationOrderSku.Id).Set(osku => osku.OrderDropShippingId, orderDropShipping.Id); + updateOrderSkuList.Add(updateOrderSku); + #endregion + + #region 采购单 + var purchaseOrder = new PurchaseOrder() + { + Id = idGenerator.NewLong(), + CreateTime = DateTime.Now, + ProductId = relationOrderSku.ProductId, + PurchaseMethod = Enums.PurchaseMethod.线下采购, + StorageType = Enums.StorageType.代发, + PurchaseOrderId = orderDropShipping.PurchaseOrderId, + PurchasePlatform = orderDropShipping.PurchasePlatform, + PurchaseQuantity = relationOrderSku.Quantity, + RemainingQuantity = 0, + ShopId = dbOrder.ShopId, + SkuId = relationOrderSku.SkuId, + SingleConsumableAmount = 0, + SingleFirstFreight = 0, + SingleFreight = orderDropShipping.PurchaseFreight / orderDropShipping.RelationPurchaseOrderSkuList.Count() / relationOrderSku.Quantity, + SingleOperationAmount = 0, + SingleStorageAmount = 0, + SingleSkuAmount = relationOrderSku.SingleSkuAmount, + SingleDeliveryFreight = 0 + }; + insertPurchaseOrderList.Add(purchaseOrder); + #endregion + + #region 明细 + insertOrderCostDetailList.Add(new OrderCostDetail() + { + Id = idGenerator.NewLong(), + ConsumableAmount = 0, + CreateTime = DateTime.Now, + DeductionQuantity = relationOrderSku.Quantity, + DeliveryExpressFreight = 0, + FirstFreight = 0, + OperationAmount = 0, + OrderId = dbOrder.Id, + ProductId = relationOrderSku.ProductId, + PurchaseFreight = orderDropShipping.PurchaseFreight / orderDropShipping.RelationPurchaseOrderSkuList.Count(), + SkuAmount = relationOrderSku.SingleSkuAmount * relationOrderSku.Quantity, + SkuId = relationOrderSku.SkuId, + StorageAmount = 0, + TotalCost = relationOrderSku.SingleSkuAmount * relationOrderSku.Quantity + orderDropShipping.PurchaseFreight / orderDropShipping.RelationPurchaseOrderSkuList.Count(), + UnitCost = purchaseOrder.UnitCost, + PurchaseOrderPKId = purchaseOrder.Id + }); + #endregion + } + + #region 订单成本 + var totalDeliveryFreight = relationPurchaseOrderRequestV2.OrderDropShippingList.Sum(ods => ods.DeliveryFreight); + var totalPurchaseAmount = relationPurchaseOrderRequestV2.OrderDropShippingList.Sum(ods => ods.PurchaseAmount); + var orderCost = fsql.Select(dbOrder.Id).ToOne(); + if (orderCost != null) + { + orderCost.PlatformCommissionRatio = relationPurchaseOrderRequestV2.PlatformCommissionRatio; + orderCost.PlatformCommissionAmount = dbOrder.OrderSellerPrice * relationPurchaseOrderRequestV2.PlatformCommissionRatio; + orderCost.DeliveryExpressFreight = totalDeliveryFreight; + orderCost.PurchaseAmount = totalPurchaseAmount; + orderCost.Profit = dbOrder.OrderSellerPrice + + dbOrder.FreightPrice - + orderCost.PurchaseAmount - + orderCost.DeliveryExpressFreight - + orderCost.PlatformCommissionAmount; + updateOrderCost = fsql.Update().SetSource(orderCost).IgnoreColumns(oc => new + { + oc.CreateTime, + oc.SDCommissionAmount, + oc.PlatformCommissionAmount, + oc.PlatformCommissionRatio + }); + } + else + { + var preferentialAmount = fsql.Select().Where(oc => oc.OrderId == dbOrder.Id) + .ToAggregate(g => g.Sum(g.Key.CouponPrice)); + orderCost = new OrderCost() + { + OrderId = dbOrder.Id, + CreateTime = DateTime.Now, + DeliveryExpressFreight = totalDeliveryFreight, + PlatformCommissionRatio = relationPurchaseOrderRequestV2.PlatformCommissionRatio, + SDCommissionAmount = 0, + PurchaseAmount = totalPurchaseAmount, + PlatformCommissionAmount = dbOrder.OrderSellerPrice * relationPurchaseOrderRequestV2.PlatformCommissionRatio, + PreferentialAmount = preferentialAmount, + IsManualEdited = true + }; + + orderCost.Profit = dbOrder.OrderSellerPrice + + dbOrder.FreightPrice - + orderCost.PurchaseAmount - + orderCost.DeliveryExpressFreight - + orderCost.PlatformCommissionAmount; + insertOrderCost = fsql.Insert(orderCost); + } + #endregion + } + + fsql.Transaction(() => + { + deletePurchaseOrder.ExecuteAffrows(); + deleteOrderCostDetail.ExecuteAffrows(); + foreach (var updateOrderSku in updateOrderSkuList) + updateOrderSku.ExecuteAffrows(); + fsql.Insert(insertPurchaseOrderList).ExecuteAffrows(); + fsql.Insert(insertOrderCostDetailList).ExecuteAffrows(); + insertOrderCost?.ExecuteAffrows(); + updateOrderCost?.ExecuteAffrows(); + }); + } + /// /// 出库 /// diff --git a/BBWY.Server.Model/Dto/Request/Order/OrderDropShippingRequest.cs b/BBWY.Server.Model/Dto/Request/Order/OrderDropShippingRequest.cs index 0e692938..b82fd82d 100644 --- a/BBWY.Server.Model/Dto/Request/Order/OrderDropShippingRequest.cs +++ b/BBWY.Server.Model/Dto/Request/Order/OrderDropShippingRequest.cs @@ -1,8 +1,24 @@ using BBWY.Server.Model.Db; +using System.Collections.Generic; namespace BBWY.Server.Model.Dto { public class OrderDropShippingRequest : OrderDropShipping { + public IList RelationPurchaseOrderSkuList { get; set; } + } + + + public class RelationPurchaseOrderSkuRequestV2 + { + public long Id { get; set; } + + public string ProductId { get; set; } + + public string SkuId { get; set; } + + public decimal SingleSkuAmount { get; set; } + + public int Quantity { get; set; } } } diff --git a/BBWY.Server.Model/Dto/Request/Order/RelationPurchaseOrderRequest.cs b/BBWY.Server.Model/Dto/Request/Order/RelationPurchaseOrderRequest.cs index e848fc07..010b5862 100644 --- a/BBWY.Server.Model/Dto/Request/Order/RelationPurchaseOrderRequest.cs +++ b/BBWY.Server.Model/Dto/Request/Order/RelationPurchaseOrderRequest.cs @@ -13,6 +13,7 @@ namespace BBWY.Server.Model.Dto public class RelationPurchaseOrderSkuRequest { + public string ProductId { get; set; } public string SkuId { get; set; } diff --git a/BBWY.Server.Model/Dto/Request/Order/RelationPurchaseOrderRequestV2.cs b/BBWY.Server.Model/Dto/Request/Order/RelationPurchaseOrderRequestV2.cs new file mode 100644 index 00000000..6ca26bdf --- /dev/null +++ b/BBWY.Server.Model/Dto/Request/Order/RelationPurchaseOrderRequestV2.cs @@ -0,0 +1,11 @@ +using System.Collections.Generic; + +namespace BBWY.Server.Model.Dto +{ + public class RelationPurchaseOrderRequestV2 + { + public IList OrderDropShippingList { get; set; } + + public decimal PlatformCommissionRatio { get; set; } + } +}