diff --git a/BBWY.Client/GlobalContext.cs b/BBWY.Client/GlobalContext.cs index aa0d5b61..e14d54df 100644 --- a/BBWY.Client/GlobalContext.cs +++ b/BBWY.Client/GlobalContext.cs @@ -13,7 +13,7 @@ namespace BBWY.Client { ShopServiceGroupList = new List(); ShopServiceGroupLowerList = new List(); - ClientVersion = "10203"; + ClientVersion = "10205"; } diff --git a/BBWY.Client/Models/APIModel/Response/Order/OrderResponse.cs b/BBWY.Client/Models/APIModel/Response/Order/OrderResponse.cs index e10499ea..99c4507c 100644 --- a/BBWY.Client/Models/APIModel/Response/Order/OrderResponse.cs +++ b/BBWY.Client/Models/APIModel/Response/Order/OrderResponse.cs @@ -64,6 +64,16 @@ namespace BBWY.Client.Models /// public decimal OrderSellerPrice { get; set; } + /// + /// 订单实收货款 (orderSellerPrice)+平台承担优惠券(PingTaiChengDanYouHuiQuan) + /// + public decimal? ActualProductAmount { get; set; } = 0.00M; + + /// + /// 平台承担优惠券 + /// + public decimal? PingTaiChengDanYouHuiQuan { get; set; } = 0.00M; + /// /// 用户应付金额 /// diff --git a/BBWY.Client/Models/Order/Order.cs b/BBWY.Client/Models/Order/Order.cs index a93c95dd..a53f660f 100644 --- a/BBWY.Client/Models/Order/Order.cs +++ b/BBWY.Client/Models/Order/Order.cs @@ -82,13 +82,30 @@ namespace BBWY.Client.Models /// public decimal FreightPrice { get; set; } + /// + /// 订单实收货款 (orderSellerPrice)+平台承担优惠券(PingTaiChengDanYouHuiQuan) + /// + public decimal? ActualProductAmount { get; set; } = 0.00M; + + /// + /// 平台承担优惠券 + /// + public decimal? PingTaiChengDanYouHuiQuan { get; set; } = 0.00M; + /// /// 实收金额 /// - public decimal ActualAmount { get { return OrderSellerPrice + FreightPrice; } } + public decimal ActualAmount + { + get + { + //return OrderSellerPrice + FreightPrice; + return OrderSellerPrice + FreightPrice + (PingTaiChengDanYouHuiQuan ?? 0M); + } + } /// - /// 商家优惠金额 + /// 平台优惠金额 /// public decimal PreferentialAmount { get; set; } @@ -223,7 +240,7 @@ namespace BBWY.Client.Models var beforeTotalCost = OrderCost?.BeforeTotalCost ?? 0M; return OrderState != OrderState.已取消 && StorageType != Models.StorageType.SD && ((StorageType != null && beforeTotalCost == 0M) || - (beforeTotalCost > OrderSellerPrice + FreightPrice) || + (beforeTotalCost > OrderSellerPrice + FreightPrice + PingTaiChengDanYouHuiQuan) || (StorageType == null && OrderState != OrderState.等待采购 && OrderState != OrderState.待付款)); } } diff --git a/BBWY.Client/Views/Order/OrderListControl.xaml b/BBWY.Client/Views/Order/OrderListControl.xaml index a7c5864f..7d2ca3d5 100644 --- a/BBWY.Client/Views/Order/OrderListControl.xaml +++ b/BBWY.Client/Views/Order/OrderListControl.xaml @@ -330,12 +330,16 @@ - + - - + + + + + + diff --git a/BBWY.Server.API/Controllers/TestController.cs b/BBWY.Server.API/Controllers/TestController.cs index 6a5d2d0c..c706ab87 100644 --- a/BBWY.Server.API/Controllers/TestController.cs +++ b/BBWY.Server.API/Controllers/TestController.cs @@ -1,5 +1,6 @@ using BBWY.Server.Business; using BBWY.Server.Model.Db; +using BBWY.Server.Model.Dto; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using System; @@ -25,9 +26,9 @@ namespace BBWY.Server.API.Controllers } [HttpPost] - public void XiuFu() + public void RepairSkuDetailAndSkuGriooProfit([FromBody] RepairSkuDetailAndSkuGriooProfit request) { - testBusiness.XiuFu(); + testBusiness.RepairSkuDetailAndSkuGriooProfit(request); } } } diff --git a/BBWY.Server.Business/Extensions/OrderCostExtension.cs b/BBWY.Server.Business/Extensions/OrderCostExtension.cs index 56fb2b72..43d32c6a 100644 --- a/BBWY.Server.Business/Extensions/OrderCostExtension.cs +++ b/BBWY.Server.Business/Extensions/OrderCostExtension.cs @@ -13,26 +13,45 @@ namespace BBWY.Server.Business.Extensions orderCost.RefundPurchaseAmount = afterSaleOrders == null || afterSaleOrders.Count == 0M ? 0M : afterSaleOrders.Sum(aso => aso.RefundPurchaseAmount ?? 0); //退款之后平台扣点 - orderCost.PlatformCommissionAmount = (order.OrderSellerPrice - orderCost.RefundAmount) * (orderCost.PlatformCommissionRatio); + //orderCost.PlatformCommissionAmount = (order.OrderPayment - order.FreightPrice - orderCost.RefundAmount) * (orderCost.PlatformCommissionRatio); + + orderCost.PlatformCommissionAmount = (order.OrderSellerPrice + (order.PingTaiChengDanYouHuiQuan ?? 0M) - orderCost.RefundAmount) * orderCost.PlatformCommissionRatio; + //orderCost.Profit = order.OrderSellerPrice + order.FreightPrice - orderCost.RefundAmount - + // orderCost.PurchaseAmount - + // orderCost.DeliveryExpressFreight - + // orderCost.PlatformCommissionAmount - + // orderCost.AfterTotalCost + + // orderCost.RefundPurchaseAmount; - orderCost.Profit = order.OrderSellerPrice + order.FreightPrice - orderCost.RefundAmount - + orderCost.Profit = (order.ActualProductAmount ?? 0M) - + orderCost.RefundAmount - orderCost.PurchaseAmount - orderCost.DeliveryExpressFreight - orderCost.PlatformCommissionAmount - orderCost.AfterTotalCost + orderCost.RefundPurchaseAmount; + } - public static void CalculationOrderProfitAndCost(this OrderCost orderCost, decimal orderSellerPrice,decimal freightPrice, IList afterSaleOrders) + public static void CalculationOrderProfitAndCost(this OrderCost orderCost, decimal actualAmountProduct, decimal orderSellerPrice, decimal pingtaichengdanyouhuiquan, IList afterSaleOrders) { orderCost.AfterTotalCost = afterSaleOrders == null || afterSaleOrders.Count == 0 ? 0M : afterSaleOrders.Sum(aso => aso.AfterTotalCost); orderCost.RefundAmount = afterSaleOrders == null || afterSaleOrders.Count == 0 ? 0M : afterSaleOrders.Sum(aso => aso.RefundAmount ?? 0M); orderCost.RefundPurchaseAmount = afterSaleOrders == null || afterSaleOrders.Count == 0M ? 0M : afterSaleOrders.Sum(aso => aso.RefundPurchaseAmount ?? 0); //退款之后平台扣点 - orderCost.PlatformCommissionAmount = (orderSellerPrice - orderCost.RefundAmount) * (orderCost.PlatformCommissionRatio); + //orderCost.PlatformCommissionAmount = (orderPayment - freightPrice - orderCost.RefundAmount) * (orderCost.PlatformCommissionRatio); + orderCost.PlatformCommissionAmount = (orderSellerPrice + pingtaichengdanyouhuiquan - orderCost.RefundAmount) * orderCost.PlatformCommissionRatio; + + //orderCost.Profit = orderSellerPrice + freightPrice - orderCost.RefundAmount - + // orderCost.PurchaseAmount - + // orderCost.DeliveryExpressFreight - + // orderCost.PlatformCommissionAmount - + // orderCost.AfterTotalCost + + // orderCost.RefundPurchaseAmount; - orderCost.Profit = orderSellerPrice + freightPrice - orderCost.RefundAmount - + orderCost.Profit = actualAmountProduct - + orderCost.RefundAmount - orderCost.PurchaseAmount - orderCost.DeliveryExpressFreight - orderCost.PlatformCommissionAmount - @@ -52,5 +71,29 @@ namespace BBWY.Server.Business.Extensions orderCost.PlatformCommissionAmount = (order.OrderSellerPrice - orderCost.RefundAmount) * (orderCost.PlatformCommissionRatio); orderCost.Profit = (orderCost.SDCommissionAmount + orderCost.SDOrderAmount + orderCost.DeliveryExpressFreight + orderCost.PlatformCommissionAmount + orderCost.AfterTotalCost) * -1; } + + /// + /// 计算SKU毛利 + /// + /// + /// + /// + /// + /// + /// + /// + public static void CalculationSkuGrossProfit(this OrderCostDetail ocd, + decimal skuShouldPay, + decimal pingTaiChengDanYouHuiQuan, + decimal superRedEnvelope, + decimal xianPinLeiDongQuan, + decimal skuVenderFee, + decimal platformCommissionRatio) + { + var pingTaiBuTie = pingTaiChengDanYouHuiQuan + superRedEnvelope + xianPinLeiDongQuan; + var koudian = (skuShouldPay + pingTaiBuTie - skuVenderFee) * ocd.DeductionQuantity * platformCommissionRatio; + ocd.SkuGrossProfit = (skuShouldPay + pingTaiBuTie) * ocd.DeductionQuantity - + ocd.TotalCost - ocd.DeliveryExpressFreight - koudian; + } } } diff --git a/BBWY.Server.Business/Order/OrderBusiness.cs b/BBWY.Server.Business/Order/OrderBusiness.cs index 23a17714..a01dbbb8 100644 --- a/BBWY.Server.Business/Order/OrderBusiness.cs +++ b/BBWY.Server.Business/Order/OrderBusiness.cs @@ -131,6 +131,7 @@ namespace BBWY.Server.Business IsAfterSaleOrder = o.IsAfterSaleOrder, SellerPreferentialAmount = o.SellerPreferentialAmount, PreferentialAmount = o.PreferentialAmount, + PingTaiChengDanYouHuiQuan = o.PingTaiChengDanYouHuiQuan, ContactName = ocs.ContactName, Address = ocs.Address, @@ -592,7 +593,25 @@ namespace BBWY.Server.Business SkuAmount = purchaseOrder.SingleSkuAmount * deductionQuantity, StorageAmount = purchaseOrder.SingleStorageAmount * deductionQuantity }; - orderCostDetail.SkuGrossProfit = orderSku.Price.Value * deductionQuantity - avgPreferential - (orderCostDetail.TotalCost + orderCostDetail.DeliveryExpressFreight) - orderSku.Price.Value * deductionQuantity * autoCalculationCostRequest.PlatformCommissionRatio; + //orderCostDetail.SkuGrossProfit = orderSku.Price.Value * deductionQuantity - avgPreferential - (orderCostDetail.TotalCost + orderCostDetail.DeliveryExpressFreight) - orderSku.Price.Value * deductionQuantity * autoCalculationCostRequest.PlatformCommissionRatio; + + + //var shouldPay = orderSku.ShouldPay ?? 0M; + //var pingTaiCoupon = orderSku.PingTaiChengDanYouHuiQuan ?? 0M; + //var venderFee = orderSku.VenderFee ?? 0M; + + //var koudian = (shouldPay - venderFee) * deductionQuantity * autoCalculationCostRequest.PlatformCommissionRatio; + //orderCostDetail.SkuGrossProfit = (shouldPay + pingTaiCoupon) * deductionQuantity - + // orderCostDetail.TotalCost - orderCostDetail.DeliveryExpressFreight - + // koudian; + + orderCostDetail.CalculationSkuGrossProfit(orderSku.ShouldPay ?? 0M, + orderSku.PingTaiChengDanYouHuiQuan ?? 0M, + orderSku.SuperRedEnvelope ?? 0M, + orderSku.XianPinLeiDongQuan ?? 0M, + orderSku.VenderFee ?? 0M, + autoCalculationCostRequest.PlatformCommissionRatio); + insertOrderCostDetailList.Add(orderCostDetail); } } @@ -660,7 +679,12 @@ namespace BBWY.Server.Business { osku.SkuId, osku.Price, - osku.ItemTotal + osku.ItemTotal, + osku.ShouldPay, + osku.PingTaiChengDanYouHuiQuan, + osku.SuperRedEnvelope, + osku.XianPinLeiDongQuan, + osku.VenderFee }); var avgPreferential = dbOrder.PreferentialAmount / orderSkuList.Count(); @@ -682,9 +706,18 @@ namespace BBWY.Server.Business var osku = orderSkuList.FirstOrDefault(o => o.SkuId == orderCostDetail.SkuId); if (osku != null) { - orderCostDetail.SkuGrossProfit = osku.Price.Value * orderCostDetail.DeductionQuantity - avgPreferential - - (orderCostDetail.TotalCost + orderCostDetail.DeliveryExpressFreight) - - osku.Price.Value * orderCostDetail.DeductionQuantity * manualCalculationCostRequest.PlatformCommissionRatio; + //orderCostDetail.SkuGrossProfit = osku.Price.Value * orderCostDetail.DeductionQuantity - avgPreferential - + // (orderCostDetail.TotalCost + orderCostDetail.DeliveryExpressFreight) - + // osku.Price.Value * orderCostDetail.DeductionQuantity * manualCalculationCostRequest.PlatformCommissionRatio; + + //orderCostDetail.SkuGrossProfit = ((osku.ShouldPay ?? 0M) + (osku.Coupon ?? 0M)) * orderCostDetail.DeductionQuantity - orderCostDetail.TotalCost - orderCostDetail.DeliveryExpressFreight; + + orderCostDetail.CalculationSkuGrossProfit(osku.ShouldPay ?? 0M, + osku.PingTaiChengDanYouHuiQuan ?? 0M, + osku.SuperRedEnvelope ?? 0M, + osku.XianPinLeiDongQuan ?? 0M, + osku.VenderFee ?? 0M, + manualCalculationCostRequest.PlatformCommissionRatio); } } @@ -940,9 +973,16 @@ namespace BBWY.Server.Business var dbOrderSku = dbOrderSkuList.FirstOrDefault(dbosku => dbosku.SkuId == relationOrderSku.SkuId); if (dbOrderSku != null) { - orderCostDetail.SkuGrossProfit = dbOrderSku.Price.Value * orderCostDetail.DeductionQuantity - avgPreferential - - (orderCostDetail.TotalCost + orderCostDetail.DeliveryExpressFreight) - - dbOrderSku.Price.Value * orderCostDetail.DeductionQuantity * relationPurchaseOrderRequestV2.PlatformCommissionRatio; + //orderCostDetail.SkuGrossProfit = dbOrderSku.Price.Value * orderCostDetail.DeductionQuantity - avgPreferential - + // (orderCostDetail.TotalCost + orderCostDetail.DeliveryExpressFreight) - + // dbOrderSku.Price.Value * orderCostDetail.DeductionQuantity * relationPurchaseOrderRequestV2.PlatformCommissionRatio; + //orderCostDetail.SkuGrossProfit = ((dbOrderSku.ShouldPay ?? 0M) + dbOrderSku.Coupon ?? 0M) * orderCostDetail.DeductionQuantity - orderCostDetail.TotalCost - orderCostDetail.DeliveryExpressFreight; + orderCostDetail.CalculationSkuGrossProfit(dbOrderSku.ShouldPay ?? 0M, + dbOrderSku.PingTaiChengDanYouHuiQuan ?? 0M, + dbOrderSku.SuperRedEnvelope ?? 0M, + dbOrderSku.XianPinLeiDongQuan ?? 0M, + dbOrderSku.VenderFee ?? 0M, + relationPurchaseOrderRequestV2.PlatformCommissionRatio); } #endregion } diff --git a/BBWY.Server.Business/PlatformSDK/JDBusiness.cs b/BBWY.Server.Business/PlatformSDK/JDBusiness.cs index e3cdea4f..923740e4 100644 --- a/BBWY.Server.Business/PlatformSDK/JDBusiness.cs +++ b/BBWY.Server.Business/PlatformSDK/JDBusiness.cs @@ -138,7 +138,10 @@ namespace BBWY.Server.Business var pageSize = 20; var totalPageSize = 1; if (!string.IsNullOrEmpty(searchProductSkuRequest.Spu)) + { totalPageSize = 1; + searchProductSkuRequest.IsCheckSkuCount = false; + } else if (!string.IsNullOrEmpty(searchProductSkuRequest.Sku)) { skuIdList = searchProductSkuRequest.Sku.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries); @@ -182,7 +185,9 @@ namespace BBWY.Server.Business { var targetSkuIdList = skuList.Select(s => s.Id); var exceptSkuIdList = skuIdList.Except(targetSkuIdList); - throw new BusinessException($"{searchProductSkuRequest.CheckStep}-sku条件数量和查询结果数量不一致\r\n{string.Join(",", exceptSkuIdList)}"); + // throw new BusinessException($"{searchProductSkuRequest.CheckStep}-sku条件数量和查询结果数量不一致\r\n{string.Join(",", exceptSkuIdList)}"); + //throw new BusinessException($"{JsonConvert.SerializeObject(skuIdList)} 以上SKU可能已下架,请修改任务将该SKU移除奶妈列表"); + throw new BusinessException($"以上{searchProductSkuRequest.CheckStep}状态异常,可能被系统自动下架,请检查任务的精简标题是否正确\r\n{string.Join(",", exceptSkuIdList)}"); } return skuList; @@ -852,6 +857,15 @@ namespace BBWY.Server.Business } } + private string SkuShangJiaFanYi(string errorMsg) + { + if (errorMsg.Contains("销售属性值组合重复") && errorMsg.Contains("业务要求唯一性")) + errorMsg = "该任务已上架赠品,请手动下架赠品,系统10分钟后将自动重新启动该任务"; + if (errorMsg.Contains("属性[产品尺寸]扩展值数量与值数量不一致")) + errorMsg = "上架赠品失败,评价助手暂无法上架带有[产品尺寸]的商品,请手动上架赠品后在评价助手创建已上架赠品模式"; + return errorMsg; + } + public override StartPromotionTaskResponse StartJDPromotionTask(StartPromotionTaskRequest2 request) { var stepText = string.Empty; @@ -886,7 +900,7 @@ namespace BBWY.Server.Business { stepText = "查询奶妈模板SKU"; searchProductSkuRequest.Sku = request.MotherTemplateSku; - searchProductSkuRequest.CheckStep = "奶妈模板"; + searchProductSkuRequest.CheckStep = "奶妈模板SKU"; motherTemplateSkuList = GetProductSkuList(searchProductSkuRequest); } #endregion @@ -896,7 +910,7 @@ namespace BBWY.Server.Business { stepText = "查询自定义奶妈SKU"; searchProductSkuRequest.Sku = request.CustomMotherSku; - searchProductSkuRequest.CheckStep = "自定义奶妈"; + searchProductSkuRequest.CheckStep = "自定义奶妈SKU"; customerMotherSkuList = GetProductSkuList(searchProductSkuRequest); } #endregion @@ -906,7 +920,7 @@ namespace BBWY.Server.Business { stepText = "查询主商品SKU"; searchProductSkuRequest.Sku = request.MainProductSku; - searchProductSkuRequest.CheckStep = "主商品"; + searchProductSkuRequest.CheckStep = "主商品SKU"; mainProductSkuList = GetProductSkuList(searchProductSkuRequest); if (mainProductSkuList != null && mainProductSkuList.Any(s => s.ProductId != request.MainProductSpu)) throw new BusinessException("主商品SKU归属有误"); @@ -918,7 +932,7 @@ namespace BBWY.Server.Business { stepText = "查询主商品赠品SKU"; searchProductSkuRequest.Sku = request.MainProductGiftSku; - searchProductSkuRequest.CheckStep = "主商品赠品"; + searchProductSkuRequest.CheckStep = "赠品SKU"; giftSkuList = GetProductSkuList(searchProductSkuRequest); giftSkuIdList = giftSkuList.Select(gs => gs.Id).ToList(); @@ -1137,12 +1151,14 @@ namespace BBWY.Server.Business errorMsg = res.Body.Contains("en_desc") ? res.Json["error_response"].Value("en_desc") : (string.IsNullOrEmpty(res.ErrorMsg) ? res.ErrMsg : res.ErrorMsg); + errorMsg = SkuShangJiaFanYi(errorMsg); RollBackWhenStartPromotionError(request.AppKey, request.AppSecret, request.AppToken, null, request.MainProductSpu, request.FullTitle, brandName, false); throw new BusinessException($"上架sku失败-{errorMsg}"); } } else { + errorMsg = SkuShangJiaFanYi(errorMsg); RollBackWhenStartPromotionError(request.AppKey, request.AppSecret, request.AppToken, null, request.MainProductSpu, request.FullTitle, brandName, false); throw new BusinessException($"上架sku失败-{errorMsg}"); } @@ -1424,6 +1440,9 @@ namespace BBWY.Server.Business ddMsg.AppendLine($"任务奶妈数:{request.JoinSkuCount}"); ddMsg.AppendLine($"参与奶妈数:{lastQueryJoinCount}"); ddMsg.AppendLine("参与任务的奶妈数异常请检查"); + //ddMsg.AppendLine("以上SKU可能已下架或同时参与多个赠品促销活动"); + //ddMsg.AppendLine("1.如已下架请将对应的SKU移除奶妈列表"); + //ddMsg.AppendLine("2.系统会自动剔除同时参与多个赠品促销的SKU,请检查以上SKU是否在失效的促销活动,请及时删除,已暂停或已停止的促销活动"); } if (!string.IsNullOrEmpty(request.PJZSDingDingKey) && !string.IsNullOrEmpty(request.PJZSDingDingWebHook)) dingDingBusiness.SendDingDingBotMessage(request.PJZSDingDingKey, request.PJZSDingDingWebHook, ddMsg.ToString()); @@ -1693,10 +1712,10 @@ namespace BBWY.Server.Business public override JToken GetOrderCouponDetail(QueryOrderCouponDetailRequest request) { var jdClient = GetJdClient(request.AppKey, request.AppSecret); - var req = new PopOrderCoupondetailRequest(); - - req.orderId = Convert.ToInt64(request.OrderId); + //var req = new PopOrderCoupondetailRequest(); + var req = new PopOrderQueryCouponDetaiRequest(); + req.orderId = request.OrderId; var res = jdClient.Execute(req, request.AppToken, DateTime.Now.ToLocalTime()); if (res.Json == null) @@ -1762,7 +1781,7 @@ namespace BBWY.Server.Business public override JToken GetProductById(GetProductByIdRequest request) { var jdClient = GetJdClient(request.AppKey, request.AppSecret); - var req = new WareReadFindWareByIdRequest() { wareId = request.SpuId}; + var req = new WareReadFindWareByIdRequest() { wareId = request.SpuId }; if (request.Field != null) req.field = request.Field; @@ -1777,9 +1796,9 @@ namespace BBWY.Server.Business public override JToken GetAttrsByCategoryId(GetAttrsByCategoryIdRequest request) { var jdClient = GetJdClient(request.AppKey, request.AppSecret); - var req = new CategoryReadFindAttrsByCategoryIdUnlimitCateRequest() { cid=request.CatId}; + var req = new CategoryReadFindAttrsByCategoryIdUnlimitCateRequest() { cid = request.CatId }; - if(request.AttributeType!=null) + if (request.AttributeType != null) req.attributeType = request.AttributeType; if (request.Field != null) req.field = request.Field; diff --git a/BBWY.Server.Business/PurchaseOrder/PurchaseOrderBusiness.cs b/BBWY.Server.Business/PurchaseOrder/PurchaseOrderBusiness.cs index 20d76e54..a67ca7fb 100644 --- a/BBWY.Server.Business/PurchaseOrder/PurchaseOrderBusiness.cs +++ b/BBWY.Server.Business/PurchaseOrder/PurchaseOrderBusiness.cs @@ -13,7 +13,7 @@ using System.Linq; using System.Threading; using System.Threading.Tasks; using Yitter.IdGenerator; - +using BBWY.Server.Business.Extensions; namespace BBWY.Server.Business { public class PurchaseOrderBusiness : BaseBusiness, IDenpendency @@ -263,7 +263,16 @@ namespace BBWY.Server.Business //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; + //orderCostDetail.SkuGrossProfit = orderSku.Price.Value * orderCostDetail.DeductionQuantity - avgPreferential - (orderCostDetail.TotalCost + orderCostDetail.DeliveryExpressFreight) - orderSku.Price.Value * orderCostDetail.DeductionQuantity * createOnlinePurchaseOrderRequest.PlatformCommissionRatio; + + //orderCostDetail.SkuGrossProfit = ((orderSku.ShouldPay ?? 0M) + orderSku.Coupon ?? 0M) * orderCostDetail.DeductionQuantity - orderCostDetail.TotalCost - orderCostDetail.DeliveryExpressFreight; + + orderCostDetail.CalculationSkuGrossProfit(orderSku.ShouldPay ?? 0M, + orderSku.PingTaiChengDanYouHuiQuan ?? 0M, + orderSku.SuperRedEnvelope ?? 0M, + orderSku.XianPinLeiDongQuan ?? 0M, + orderSku.VenderFee ?? 0M, + createOnlinePurchaseOrderRequest.PlatformCommissionRatio); insertOrderCostDetails.Add(orderCostDetail); #endregion } diff --git a/BBWY.Server.Business/Statistics/StatisticsBusiness.cs b/BBWY.Server.Business/Statistics/StatisticsBusiness.cs index 8e5c9b8f..a99d7736 100644 --- a/BBWY.Server.Business/Statistics/StatisticsBusiness.cs +++ b/BBWY.Server.Business/Statistics/StatisticsBusiness.cs @@ -144,7 +144,8 @@ namespace BBWY.Server.Business return list; } - private void XingXiangCumulative(IList detailList, string spuId, bool isSD, decimal profit, decimal spuProductAmount, decimal sdProductAmount, decimal sdCost) + private void XingXiangCumulative(IList detailList, + string spuId, bool isSD, decimal profit, decimal actualAmount, decimal sdCost) { var xxRespose = detailList.FirstOrDefault(xx => xx.Spu == spuId); if (xxRespose == null) @@ -153,11 +154,11 @@ namespace BBWY.Server.Business detailList.Add(xxRespose); } xxRespose.Profit += profit; - xxRespose.ActualAmount += spuProductAmount; + xxRespose.ActualAmount += actualAmount; if (isSD) { xxRespose.SDOrderCount++; - xxRespose.SDOrderAmount += sdProductAmount; + xxRespose.SDOrderAmount += actualAmount; xxRespose.SDOrderCost += sdCost; } } @@ -207,6 +208,7 @@ namespace BBWY.Server.Business var spuIdList = orderSkuList.Select(osku => osku.ProductId).Distinct().ToList(); List spuGoiList = null; GOIByShop shopGoi = null; + #region spu goi { var httpResult = restApiService.SendRequest("http://snapi.qiyue666.com/", "Api/GOI/QueryPopularizeLevelGOIBySpuId", new @@ -246,45 +248,49 @@ namespace BBWY.Server.Business if (order.StorageType == Enums.StorageType.SD) { - XingXiangCumulative(detailList, currentOrderSkuList[0].ProductId, true, order.Profit ?? 0M, order.OrderSellerPrice, order.OrderSellerPrice + order.FreightPrice, Math.Abs(order.Profit ?? 0M)); + //XingXiangCumulative(detailList, currentOrderSkuList[0].ProductId, true, order.Profit ?? 0M, order.OrderSellerPrice, order.OrderSellerPrice + order.FreightPrice, Math.Abs(order.Profit ?? 0M)); + XingXiangCumulative(detailList, currentOrderSkuList[0].ProductId, true, order.Profit ?? 0M, order.OrderSellerPrice + order.FreightPrice, Math.Abs(order.Profit ?? 0M)); continue; } var currentOrderCostDetailList = orderCostDetailList.Where(ocd => ocd.OrderId == order.Id); var spuGroups = currentOrderSkuList.GroupBy(osku => osku.ProductId); - var tempOrderProdcutAmount = currentOrderSkuList.Sum(osku => osku.ItemTotal * osku.Price) ?? 0M; - var tempOrderCost = currentOrderCostDetailList.Count() > 0 ? currentOrderCostDetailList.Sum(ocd => ocd.TotalCost) : 0M; - var tempOrderProfit = tempOrderProdcutAmount - tempOrderCost; + //var tempOrderProdcutAmount = currentOrderSkuList.Sum(osku => osku.ItemTotal * osku.Price) ?? 0M; + //var tempOrderCost = currentOrderCostDetailList.Count() > 0 ? currentOrderCostDetailList.Sum(ocd => ocd.TotalCost) : 0M; + //var tempOrderProfit = tempOrderProdcutAmount - tempOrderCost; foreach (var spuGroup in spuGroups) { var currentSpuCostDetailList = currentOrderCostDetailList.Where(ocd => ocd.ProductId == spuGroup.Key); + var currentSkuOrderSkuList = currentOrderSkuList.Where(osku => osku.ProductId == spuGroup.Key); + + var totalActualAmount = currentSkuOrderSkuList.Sum(osku => osku.ShouldPay ?? 0M); + var totalProfit = currentSpuCostDetailList.Sum(ocd => ocd.SkuGrossProfit); - var tempSpuProductAmount = spuGroup.Sum(osku => osku.Price * osku.ItemTotal) ?? 0M; - var tempSpuCost = currentSpuCostDetailList.Count() > 0 ? currentSpuCostDetailList.Sum(ocd => ocd.TotalCost) : 0M; - var tempSpuProfit = tempSpuProductAmount - tempSpuCost; - var spuProfitPercent = tempOrderProfit == 0M ? 0M : tempSpuProfit / tempOrderProfit; + XingXiangCumulative(detailList, spuGroup.Key, false, totalProfit, totalActualAmount, 0); - var realSpuProfit = (order.Profit ?? 0M) * spuProfitPercent; - XingXiangCumulative(detailList, spuGroup.Key, false, realSpuProfit, tempSpuProductAmount, 0, 0); + //var tempSpuProductAmount = spuGroup.Sum(osku => osku.Price * osku.ItemTotal) ?? 0M; + //var tempSpuCost = currentSpuCostDetailList.Count() > 0 ? currentSpuCostDetailList.Sum(ocd => ocd.TotalCost) : 0M; + //var tempSpuProfit = tempSpuProductAmount - tempSpuCost; + //var spuProfitPercent = tempOrderProfit == 0M ? 0M : tempSpuProfit / tempOrderProfit; + + //var realSpuProfit = (order.Profit ?? 0M) * spuProfitPercent; + //XingXiangCumulative(detailList, spuGroup.Key, false, realSpuProfit, tempSpuProductAmount, 0, 0); } } - var shopProductAmount = orderSkuList.Sum(osku => osku.ItemTotal * osku.Price); + //var shopProductAmount = orderSkuList.Sum(osku => osku.ItemTotal * osku.Price); + var shopActualAmount = orderSkuList.Sum(osku => osku.ShouldPay ?? 0M); foreach (var d in detailList) { var spuGoi = spuGoiList?.FirstOrDefault(x => x.Spu == d.Spu); if (spuGoi != null) { - var productAmount = orderSkuList.Where(osku => osku.ProductId == d.Spu).Sum(osku => osku.ItemTotal * osku.Price); - d.SpuYingLiRatio = Math.Round((spuGoi.Profit - spuGoi.Cost) / productAmount.Value, 2); - //d.SpuYingLiRatio = Math.Round((d.Profit - spuGoi.Cost) / productAmount.Value, 2); + //var spuActualAmount = orderSkuList.Where(osku => osku.ProductId == d.Spu).Sum(osku => osku.ShouldPay ?? 0M); + d.SpuYingLiRatio = d.ActualAmount == 0 ? 0 : Math.Round((spuGoi.Profit - spuGoi.Cost) / d.ActualAmount, 2); } - - d.ShopYingLiRatio = shopProductAmount == 0 ? 0 : Math.Round((shopGoi.Profit - shopGoi.Cost) / shopProductAmount.Value, 2); - d.ShopProfitRatio = shopProductAmount == 0 ? 0 : Math.Round(shopGoi.Profit / shopProductAmount.Value, 2); } @@ -297,8 +303,9 @@ namespace BBWY.Server.Business TotalSDOrderCount = sdOrderList.Count(), TotalSDOrderCost = detailList.Sum(xx => xx.SDOrderCost), TotalProfit = detailList.Sum(xx => xx.Profit), - ShopYingLiRatio = detailList.FirstOrDefault()?.ShopYingLiRatio, - ShopProfitRatio = detailList.FirstOrDefault()?.ShopProfitRatio + ShopYingLiRatio = shopActualAmount == 0 ? 0 : Math.Round((shopGoi.Profit - shopGoi.Cost) / shopActualAmount, 2), + ShopProfitRatio = shopActualAmount == 0 ? 0 : Math.Round(shopGoi.Profit / shopActualAmount, 2), + ShopActualAmount = shopActualAmount }; } diff --git a/BBWY.Server.Business/Sync/OrderSyncBusiness.cs b/BBWY.Server.Business/Sync/OrderSyncBusiness.cs index 4f6f9513..e60ea19b 100644 --- a/BBWY.Server.Business/Sync/OrderSyncBusiness.cs +++ b/BBWY.Server.Business/Sync/OrderSyncBusiness.cs @@ -10,13 +10,10 @@ using Microsoft.Extensions.Caching.Memory; using Microsoft.Extensions.Options; using Newtonsoft.Json; using Newtonsoft.Json.Linq; -using NLog; using System; -using System.Collections.Concurrent; using System.Collections.Generic; using System.Linq; using System.Net.Http; -using System.Security.Cryptography; using System.Threading; using System.Threading.Tasks; using Yitter.IdGenerator; @@ -98,7 +95,7 @@ namespace BBWY.Server.Business } - private void SyncOrder(ShopResponse shop, string orderId, DateTime? startTime = null, DateTime? endTime = null, bool isAuto = false, Enums.SortTimeType? sortTimeType = null) + public void SyncOrder(ShopResponse shop, string orderId, DateTime? startTime = null, DateTime? endTime = null, bool isAuto = false, Enums.SortTimeType? sortTimeType = null) { try { @@ -211,6 +208,8 @@ namespace BBWY.Server.Business List insertOrderSkuList = new List(); List insertOrderCouponList = new List(); List insertOrderTotalInfoList = new List(); + List insertOrderCouponNewList = new List(); + List insertOrderPromotionList = new List(); IList> updateOrderList = new List>(); Dictionary> updateOrderSkuDictionary = new Dictionary>(); @@ -220,7 +219,7 @@ namespace BBWY.Server.Business var interfaceOrderIdList = validOrders.Select(orderJToken => orderJToken.Value("orderId")); var interfaceCanceledOrderIdList = validOrders.Where(orderJToken => orderJToken.Value("orderState").Equals("TRADE_CANCELED")) - .Select(orderJToken => orderJToken.Value("orderId")); //接口查询结果中取消状态的订单Id + .Select(orderJToken => orderJToken.Value("orderId")); //接口查询结果中取消状态的订单Id var dbOrderList = fsql.Select().Where(o => interfaceOrderIdList.Contains(o.Id)).ToList(o => new Order @@ -259,6 +258,8 @@ namespace BBWY.Server.Business //var dbOrderCouponNewList = fsql.Select().Where(ocn => interfaceOrderIdList.Contains(ocn.OrderId)).ToList(); //var dbOrderPromotionList = fsql.Select().Where(op => interfaceOrderIdList.Contains(op.OrderId)).ToList(); var dbOrderTotalList = fsql.Select().Where(ot => interfaceOrderIdList.Contains(ot.Id)).ToList(); + + var orderSkuCFDetailList = new List(); #endregion var orderSkuIds = new List(); @@ -278,387 +279,694 @@ namespace BBWY.Server.Business foreach (var orderJToken in validOrders) { var orderId = orderJToken.Value("orderId"); - if (insertOrderList.Any(o => o.Id == orderId)) - continue; - var dbOrder = dbOrderList.FirstOrDefault(o => o.Id == orderId); - var isNewOrder = dbOrder == null; - SDCalculationCostRequest sDCalculationCostRequest = null; //SD信息埋点 - - #region 订单基本信息 - var buyerRemark = orderJToken.Value("orderRemark"); - var venderRemark = orderJToken.Value("venderRemark"); - var modifyTime = orderJToken.Value("modified"); - var endTime = orderJToken.Value("orderEndTime"); - var waybillNo = orderJToken.Value("waybill"); - var freightPrice = orderJToken.Value("freightPrice"); - var orderPayment = orderJToken.Value("orderPayment"); - var sellerPreferentialAmount = orderJToken.Value("sellerDiscount"); - var orderSellerPrice = orderJToken.Value("orderSellerPrice"); - var orderTotalPrice = orderJToken.Value("orderTotalPrice"); - var storeOrder = orderJToken.Value("storeOrder") ?? string.Empty; - var storeId = orderJToken.Value("storeId"); - var storageType = ConvertStoreOrder(storeOrder); - var preferentialAmount = 0M; - if (dbOrder == null) + try { - dbOrder = new Order() - { - Id = orderId, - BuyerRemark = buyerRemark, - VenderRemark = venderRemark, - FreightPrice = freightPrice, - EndTime = endTime, - StartTime = orderJToken.Value("orderStartTime"), - ModifyTime = modifyTime, - OrderPayment = orderPayment, - SellerPreferentialAmount = sellerPreferentialAmount, - OrderSellerPrice = orderSellerPrice, - OrderTotalPrice = orderTotalPrice, - OrderType = (Enums.OrderType)orderJToken.Value("orderType"), - Platform = Enums.Platform.京东, - ShopId = shopId, - //VenderId = orderJToken.Value("venderId"), - WaybillNo = waybillNo, - StoreOrder = storeOrder, - StoreId = storeId, - IsGift = orderSellerPrice == 0M, - StorageType = storageType - }; - - if (memoryCache.TryGetValue(orderId, out sDCalculationCostRequest)) - { - dbOrder.StorageType = Enums.StorageType.SD; - dbOrder.SDType = sDCalculationCostRequest.SDType; - dbOrder.Flag = sDCalculationCostRequest.Flag; - if (!string.IsNullOrEmpty(sDCalculationCostRequest.VenderRemark)) - dbOrder.VenderRemark = sDCalculationCostRequest.VenderRemark; - dbOrder.SDKey = sDCalculationCostRequest.SDKey; - dbOrder.SDPayBillNo = sDCalculationCostRequest.SDPayBillNo; - dbOrder.SDOperator = sDCalculationCostRequest.SDOperator; - dbOrder.SDPayChannel = sDCalculationCostRequest.SDPayChannel; - } - - var payType = orderJToken.Value("payType"); - if (payType.Contains("-")) - dbOrder.PayType = (Enums.PayType)Convert.ToInt32(payType.Substring(0, 1)); - - insertOrderList.Add(dbOrder); + if (insertOrderList.Any(o => o.Id == orderId)) + continue; + var dbOrder = dbOrderList.FirstOrDefault(o => o.Id == orderId); + var dbOrderTotal = dbOrderTotalList.FirstOrDefault(o => o.Id == orderId); + var isNewOrder = dbOrder == null; + SDCalculationCostRequest sDCalculationCostRequest = null; //SD信息埋点 - #region OrderSku - var itemInfoList = orderJToken["itemInfoList"] as JArray; - foreach (var orderSkuJToken in itemInfoList) + #region 优惠券/促销/拆分明细 + if (!dbOrderTotalList.Any(ot => ot.Id == orderId)) { - var itemTotal = orderSkuJToken.Value("itemTotal"); - var jdPrice = orderSkuJToken.Value("jdPrice"); - var wareId = orderSkuJToken.Value("wareId"); - var skuId = orderSkuJToken.Value("skuId"); - - //if (orderSkuJToken.Value("jdPrice") != 0M) - //{ - var osku = new OrderSku() + Thread.Sleep(2000); + var orderCouponDetailHttpResult = restApiService.SendRequest("http://yunding.qiyue666.com", "api/PlatformSDK/GetOrderCouponDetail", new { - Id = idGenerator.NewLong(), - ItemTotal = itemTotal, - Price = jdPrice, - ProductId = wareId, - Title = orderSkuJToken.Value("skuName").SimplifySkuName(), - ProductNo = orderSkuJToken.Value("productNo"), - CreateTime = DateTime.Now, OrderId = orderId, - SkuId = skuId - }; - insertOrderSkuList.Add(osku); - //} - //CumulativeSkuDailySalesDetail(skuDailySalesDetailDictionary, dbOrder.StartTime.Value, shopId, skuId, wareId, jdPrice, itemTotal); + AppKey = appKey, + AppSecret = appSecret, + AppToken = appToken, + Platform = Enums.Platform.京东 + }, null, HttpMethod.Post); + if (orderCouponDetailHttpResult.StatusCode == System.Net.HttpStatusCode.OK) + { + var orderCouponDetailResponse = JsonConvert.DeserializeObject>(orderCouponDetailHttpResult.Content); + if (orderCouponDetailResponse.Success) + { + var jtoken = orderCouponDetailResponse.Data["jingdong_pop_order_queryCouponDetai_responce"]["couponDetailExternal"]["couponDetailVo"]; - } - #endregion - } - else - { - //preferentialAmount = dbOrder.PreferentialAmount; - if (storageType != null && dbOrder.StorageType != storageType) - dbOrder.StorageType = storageType; + #region 订单合计信息 + var orderTotal = new OrderTotalInfo() + { + CreateTime = DateTime.Now, + Id = orderId, + TotalBalance = jtoken.Value("totalBalance"), + TotalBaseDiscount = jtoken.Value("TotalBaseDiscount"), + TotalBaseFee = jtoken.Value("totalBaseFee"), + TotalCoupon = jtoken.Value("totalCoupon"), + TotalDongQuan = jtoken.Value("totalDongQuan"), + TotalExpiryGiftDiscount = jtoken.Value("totalExpiryGiftDiscount"), + TotalGlobalGeneralIncludeTax = jtoken.Value("totalGlobalGeneralIncludeTax"), + TotalGlobalGeneralTax = jtoken.Value("totalGlobalGeneralTax"), + TotalItemPrice = jtoken.Value("totalItemPrice"), + TotalJdZhiFuYouHui = jtoken.Value("totalJdZhiFuYouHui"), + TotalJingDou = jtoken.Value("totalJingDou"), + TotalJingQuan = jtoken.Value("totalJingQuan"), + TotalJingXiangLiJin = jtoken.Value("totalJingXiangLiJin"), + TotalLiJinYouHui = jtoken.Value("totalLiJinYouHui"), + TotalLuoDiPeiService = jtoken.Value("totalLuoDiPeiService"), + TotalManJian = jtoken.Value("totalManJian"), + TotalPingTaiChengDanYouHuiQuan = jtoken.Value("totalPingTaiChengDanYouHuiQuan"), + TotalPlus95 = jtoken.Value("totalPlus95"), + TotalPromotionDiscount = jtoken.Value("totalPromotionDiscount"), + TotalRemoteFee = jtoken.Value("totalRemoteFee"), + TotalShouldPay = jtoken.Value("totalShouldPay"), + TotalSuperRedEnvelope = jtoken.Value("totalSuperRedEnvelope"), + TotalTaxFee = jtoken.Value("totalTaxFee"), + TotalTuiHuanHuoWuYou = jtoken.Value("totalTuiHuanHuoWuYou"), + TotalVenderFee = jtoken.Value("totalVenderFee"), + TotalXianPinLeiDongQuan = jtoken.Value("totalXianPinLeiDongQuan"), + TotalXianPinLeiJingQuan = jtoken.Value("totalXianPinLeiJingQuan"), + TotalZhiFuYingXiaoYouHui = jtoken.Value("totalZhiFuYingXiaoYouHui") + }; + insertOrderTotalInfoList.Add(orderTotal); + #endregion - var currentDbOrderSkuList = dbOrderSkuList.Where(osku => osku.OrderId == orderId).ToList(); + #region 订单优惠券信息 + var couponJArray = jtoken["couponList"] as JArray; + if (couponJArray != null && couponJArray.Count() > 0) + { + insertOrderCouponNewList.AddRange(couponJArray.Select(j => new OrderCoupon_New() + { + Id = idGenerator.NewLong(), + CouponId = j.Value("couponId"), + CouponName = j.Value("couponName"), + CouponNum = j.Value("couponNum"), + CouponPrice = j.Value("couponPrice"), + CouponTypeDesc = j.Value("couponTypeDesc"), + CreateTime = DateTime.Now, + JdCouponId = j.Value("jdCouponId"), + JdDivideMoney = j.Value("jdDivideMoney"), + OrderId = orderId, + PriceDivide = j.Value("priceDivide"), + VenderDivideMoney = j.Value("venderDivideMoney") + })); + } + #endregion - var itemInfoList = orderJToken["itemInfoList"] as JArray; - foreach (var orderSkuJToken in itemInfoList) - { - //var itemTotal = orderSkuJToken.Value("itemTotal"); - //var jdPrice = orderSkuJToken.Value("jdPrice"); - var wareId = orderSkuJToken.Value("wareId"); - var skuId = orderSkuJToken.Value("skuId"); - var dbOsku = currentDbOrderSkuList.FirstOrDefault(osku => osku.SkuId == skuId); - var skuUpdateKey = $""; - if (dbOsku != null && dbOsku.ProductId != wareId && !updateOrderSkuDictionary.ContainsKey(skuUpdateKey)) - { - var update = fsql.Update(dbOsku.Id).Set(osku => osku.ProductId, wareId); - updateOrderSkuDictionary.Add(skuUpdateKey, update); + #region 订单活动信息 + var promotionJArray = jtoken["promotionList"] as JArray; + if (promotionJArray != null && promotionJArray.Count() > 0) + { + insertOrderPromotionList.AddRange(promotionJArray.Select(j => new OrderPromotion() + { + Id = idGenerator.NewLong(), + BeginTime = j.Value("beginTime"), + EndTime = j.Value("endTime"), + CreateTime = DateTime.Now, + OrderId = orderId, + PromotionId = j.Value("promotionId"), + PromotionName = j.Value("promotionName"), + SalePrice = j.Value("salePrice"), + SaleTypeDesc = j.Value("saleTypeDesc") + })); + } + #endregion + + #region 订单sku金额明细 + var skuJArray = jtoken["skuList"] as JArray; + if (skuJArray != null && skuJArray.Count() > 0) + { + foreach (var oskuJtoken in skuJArray) + { + var skuDiscountInfoList = oskuJtoken["skuDiscountInfoList"] as JArray; + decimal? xianPinLeiDongQuan = 0M; + if (skuDiscountInfoList != null && skuDiscountInfoList.Count > 0) + { + foreach (var item1 in skuDiscountInfoList) + { + var discountTypeList = item1["discountTypeList"] as JArray; + if (discountTypeList != null && discountTypeList.Count() > 0) + { + foreach (var discountType in discountTypeList) + { + if (discountType.Value("type") == 6) + xianPinLeiDongQuan += discountType.Value("amount"); + } + } + } + } + + if (xianPinLeiDongQuan == 0M) + xianPinLeiDongQuan = oskuJtoken.Value("xianPinLeiDongQuan"); + + var oskuCF = new OrderSkuCFDetail() + { + OrderId = orderId, + SkuId = oskuJtoken.Value("skuCode"), + Balance = oskuJtoken.Value("balance"), + BaseDiscount = oskuJtoken.Value("baseDiscount"), + BaseFee = oskuJtoken.Value("baseFee"), + Coupon = oskuJtoken.Value("coupon"), + DongQuan = oskuJtoken.Value("dongQuan"), + ExpiryGiftDiscount = oskuJtoken.Value("expiryGiftDiscount"), + GlobalGeneralIncludeTax = oskuJtoken.Value("globalGeneralIncludeTax"), + GlobalGeneralTax = oskuJtoken.Value("globalGeneralTax"), + JdZhiFuYouHui = oskuJtoken.Value("jdZhiFuYouHui"), + JingDou = oskuJtoken.Value("jingDou"), + JingQuan = oskuJtoken.Value("jingQuan"), + JingXiangLiJin = oskuJtoken.Value("jingXiangLiJin"), + LiJinYouHui = oskuJtoken.Value("liJinYouHui"), + LuoDiPeiService = oskuJtoken.Value("luoDiPeiService"), + ManJian = oskuJtoken.Value("manJian"), + PingTaiChengDanYouHuiQuan = oskuJtoken.Value("pingTaiChengDanYouHuiQuan"), + Plus95 = oskuJtoken.Value("plus95"), + PromotionDiscount = oskuJtoken.Value("promotionDiscount"), + RemoteFee = oskuJtoken.Value("remoteFee"), + ShouldPay = oskuJtoken.Value("shouldPay"), + SuperRedEnvelope = oskuJtoken.Value("superRedEnvelope"), + TaxFee = oskuJtoken.Value("taxFee"), + TuiHuanHuoWuYou = oskuJtoken.Value("tuiHuanHuoWuYou"), + VenderFee = oskuJtoken.Value("venderFee"), + XianPinLeiDongQuan = xianPinLeiDongQuan, //数据不齐 + XianPinLeiJingQuan = oskuJtoken.Value("xianPinLeiJingQuan"), + ZhiFuYingXiaoYouHui = oskuJtoken.Value("zhiFuYingXiaoYouHui") + }; + orderSkuCFDetailList.Add(oskuCF); + } + } + #endregion + + } } } - } - #endregion + #endregion - #region 收货人信息 - if (dbOrderConsigneeList.FirstOrDefault(oc => oc.OrderId == orderId) == null) - { - var orderConsignee = new OrderConsignee() + #region 订单基本信息 + var buyerRemark = orderJToken.Value("orderRemark"); + var venderRemark = orderJToken.Value("venderRemark"); + var modifyTime = orderJToken.Value("modified"); + var endTime = orderJToken.Value("orderEndTime"); + var waybillNo = orderJToken.Value("waybill"); + var freightPrice = orderJToken.Value("freightPrice"); + var orderPayment = orderJToken.Value("orderPayment"); + var sellerPreferentialAmount = orderJToken.Value("sellerDiscount"); + var orderSellerPrice = orderJToken.Value("orderSellerPrice"); + var orderTotalPrice = orderJToken.Value("orderTotalPrice"); + var storeOrder = orderJToken.Value("storeOrder") ?? string.Empty; + var storeId = orderJToken.Value("storeId"); + var storageType = ConvertStoreOrder(storeOrder); + + decimal? actualProductAmount = 0M; + decimal? preferentialAmount = 0M; + decimal? pingtaiChengDanYouHuiQuan = 0M; + + if (dbOrder == null) { - OrderId = orderId, - City = orderJToken["consigneeInfo"].Value("city"), - Province = orderJToken["consigneeInfo"].Value("province"), - County = orderJToken["consigneeInfo"].Value("county"), - Town = orderJToken["consigneeInfo"].Value("town"), - IsDecode = false, - CreateTime = DateTime.Now - }; - insertOrderConsigneeList.Add(orderConsignee); - } - #endregion + var orderTotalInfo = insertOrderTotalInfoList.FirstOrDefault(x => x.Id == orderId); + //actualProductAmount = orderPayment - freightPrice + pingtaibutie; + pingtaiChengDanYouHuiQuan = (orderTotalInfo?.TotalPingTaiChengDanYouHuiQuan ?? 0M); + actualProductAmount = orderSellerPrice + pingtaiChengDanYouHuiQuan; + //preferentialAmount = orderTotalPrice - (actualProductAmount ?? 0M) - freightPrice; + preferentialAmount = orderTotalPrice - (actualProductAmount ?? 0M); + dbOrder = new Order() + { + Id = orderId, + BuyerRemark = buyerRemark, + VenderRemark = venderRemark, + FreightPrice = freightPrice, + EndTime = endTime, + StartTime = orderJToken.Value("orderStartTime"), + ModifyTime = modifyTime, + OrderPayment = orderPayment, //(orderTotalInfo?.TotalShouldPay) ?? orderPayment, + SellerPreferentialAmount = sellerPreferentialAmount, + OrderSellerPrice = orderSellerPrice, + OrderTotalPrice = orderTotalPrice, + OrderType = (Enums.OrderType)orderJToken.Value("orderType"), + Platform = Enums.Platform.京东, + ShopId = shopId, + //VenderId = orderJToken.Value("venderId"), + WaybillNo = waybillNo, + StoreOrder = storeOrder, + StoreId = storeId, + IsGift = orderSellerPrice == 0M, + StorageType = storageType, + //PreferentialAmount = (orderTotalInfo?.TotalPingTaiChengDanYouHuiQuan) ?? 0M, + ActualProductAmount = actualProductAmount ?? 0M, + PreferentialAmount = preferentialAmount ?? 0M, + PingTaiChengDanYouHuiQuan = pingtaiChengDanYouHuiQuan ?? 0M + }; + + if (memoryCache.TryGetValue(orderId, out sDCalculationCostRequest)) + { + dbOrder.StorageType = Enums.StorageType.SD; + dbOrder.SDType = sDCalculationCostRequest.SDType; + dbOrder.Flag = sDCalculationCostRequest.Flag; + if (!string.IsNullOrEmpty(sDCalculationCostRequest.VenderRemark)) + dbOrder.VenderRemark = sDCalculationCostRequest.VenderRemark; + dbOrder.SDKey = sDCalculationCostRequest.SDKey; + dbOrder.SDPayBillNo = sDCalculationCostRequest.SDPayBillNo; + dbOrder.SDOperator = sDCalculationCostRequest.SDOperator; + dbOrder.SDPayChannel = sDCalculationCostRequest.SDPayChannel; + } - #region 订单优惠 + var payType = orderJToken.Value("payType"); + if (payType.Contains("-")) + dbOrder.PayType = (Enums.PayType)Convert.ToInt32(payType.Substring(0, 1)); - var orderCouponJArray = (JArray)orderJToken["couponDetailList"]; - if (orderCouponJArray.HasValues) - { - foreach (var orderCouponJToken in orderCouponJArray) - { - var couponType = orderCouponJToken.Value("couponType"); - if (string.IsNullOrEmpty(couponType)) - continue; - //dbOrder.PreferentialAmount += orderCouponJToken.Value("couponPrice"); - preferentialAmount += orderCouponJToken.Value("couponPrice"); - if (!dbOrderCouponList.Any(oc => oc.OrderId == orderId)) + insertOrderList.Add(dbOrder); + + #region OrderSku + var itemInfoList = orderJToken["itemInfoList"] as JArray; + foreach (var orderSkuJToken in itemInfoList) { - insertOrderCouponList.Add(new OrderCoupon() + var itemTotal = orderSkuJToken.Value("itemTotal"); + var jdPrice = orderSkuJToken.Value("jdPrice"); + var wareId = orderSkuJToken.Value("wareId"); + var skuId = orderSkuJToken.Value("skuId"); + + //if (orderSkuJToken.Value("jdPrice") != 0M) + //{ + var oskuCF = orderSkuCFDetailList.FirstOrDefault(x => x.OrderId == orderId && x.SkuId == skuId); + + var osku = new OrderSku() { Id = idGenerator.NewLong(), - SkuId = orderCouponJToken.Value("skuId"), - OrderId = orderId, + ItemTotal = itemTotal, + Price = jdPrice, + ProductId = wareId, + Title = orderSkuJToken.Value("skuName").SimplifySkuName(), + ProductNo = orderSkuJToken.Value("productNo"), CreateTime = DateTime.Now, - CouponType = couponType, - CouponPrice = orderCouponJToken.Value("couponPrice") - }); + OrderId = orderId, + SkuId = skuId, + Balance = oskuCF?.Balance ?? 0M, + BaseDiscount = oskuCF?.BaseFee ?? 0M, + BaseFee = oskuCF?.BaseFee ?? 0M, + Coupon = oskuCF?.Coupon ?? 0M, + DongQuan = oskuCF?.DongQuan ?? 0M, + ExpiryGiftDiscount = oskuCF?.ExpiryGiftDiscount ?? 0M, + GlobalGeneralIncludeTax = oskuCF?.GlobalGeneralIncludeTax ?? 0M, + GlobalGeneralTax = oskuCF?.GlobalGeneralTax ?? 0M, + JdZhiFuYouHui = oskuCF?.JdZhiFuYouHui ?? 0M, + JingDou = oskuCF?.JingDou ?? 0M, + JingQuan = oskuCF?.JingQuan ?? 0M, + JingXiangLiJin = oskuCF?.JingXiangLiJin ?? 0M, + LiJinYouHui = oskuCF?.LiJinYouHui ?? 0M, + LuoDiPeiService = oskuCF?.LuoDiPeiService ?? 0M, + ManJian = oskuCF?.ManJian ?? 0M, + PingTaiChengDanYouHuiQuan = oskuCF?.PingTaiChengDanYouHuiQuan ?? 0M, + Plus95 = oskuCF?.Plus95 ?? 0M, + PromotionDiscount = oskuCF?.PromotionDiscount ?? 0M, + RemoteFee = oskuCF?.RemoteFee ?? 0M, + ShouldPay = oskuCF?.ShouldPay ?? 0M, + SuperRedEnvelope = oskuCF?.SuperRedEnvelope ?? 0M, + TaxFee = oskuCF?.TaxFee ?? 0M, + TuiHuanHuoWuYou = oskuCF?.TuiHuanHuoWuYou ?? 0M, + VenderFee = oskuCF?.VenderFee ?? 0M, + XianPinLeiDongQuan = oskuCF?.XianPinLeiDongQuan ?? 0M, + XianPinLeiJingQuan = oskuCF?.XianPinLeiJingQuan ?? 0M, + ZhiFuYingXiaoYouHui = oskuCF?.ZhiFuYingXiaoYouHui ?? 0M + }; + insertOrderSkuList.Add(osku); + //} + //CumulativeSkuDailySalesDetail(skuDailySalesDetailDictionary, dbOrder.StartTime.Value, shopId, skuId, wareId, jdPrice, itemTotal); + } + #endregion } - } - #endregion - - #region 订单状态转换 - var orderState = ConvertOrderState(orderJToken, dbOrder.StorageType); - #endregion - - #region 取消订单恢复库存 - if (orderState == Enums.OrderState.已取消 && - !isNewOrder && - dbOrder.OrderState != Enums.OrderState.已取消 && - dbOrder.StorageType != Enums.StorageType.SD && - dbOrder.StorageType != Enums.StorageType.代发) - { - var currentOrderCostDetailList = dbOrderCostDetailList.Where(ocd => ocd.OrderId == orderId); - if (currentOrderCostDetailList.Count() > 0) + else { - foreach (var orderCostDetail in currentOrderCostDetailList) + var orderTotalInfo = insertOrderTotalInfoList.FirstOrDefault(x => x.Id == orderId); + if (orderTotalInfo == null) + orderTotalInfo = dbOrderTotalList.FirstOrDefault(x => x.Id == orderId); + + pingtaiChengDanYouHuiQuan = (orderTotalInfo?.TotalPingTaiChengDanYouHuiQuan ?? 0M); + actualProductAmount = orderSellerPrice + pingtaiChengDanYouHuiQuan; + //preferentialAmount = orderTotalPrice - (actualProductAmount ?? 0M) - freightPrice; + preferentialAmount = orderTotalPrice - (actualProductAmount ?? 0M); + + //preferentialAmount = dbOrder.PreferentialAmount; + if (storageType != null && dbOrder.StorageType != storageType) + dbOrder.StorageType = storageType; + + var currentDbOrderSkuList = dbOrderSkuList.Where(osku => osku.OrderId == orderId).ToList(); + + + var itemInfoList = orderJToken["itemInfoList"] as JArray; + foreach (var orderSkuJToken in itemInfoList) { - var updateSql = fsql.Update(orderCostDetail.PurchaseOrderPKId) - .Set(po => po.RemainingQuantity + orderCostDetail.DeductionQuantity); - updatePurchaseOrderList.Add(updateSql); + //var itemTotal = orderSkuJToken.Value("itemTotal"); + //var jdPrice = orderSkuJToken.Value("jdPrice"); + var wareId = orderSkuJToken.Value("wareId"); + var skuId = orderSkuJToken.Value("skuId"); + var dbOsku = currentDbOrderSkuList.FirstOrDefault(osku => osku.SkuId == skuId); + var skuUpdateKey = $"{orderId}_{skuId}"; + if (dbOsku != null) + { + var oskuCF = orderSkuCFDetailList.FirstOrDefault(x => x.OrderId == orderId && x.SkuId == dbOsku.SkuId); + var isDetailChanged = (dbOsku.ShouldPay == 0 || dbOsku.ShouldPay == null) && oskuCF != null && oskuCF.ShouldPay != 0; + if (dbOsku.ProductId != wareId || isDetailChanged) + { + var update = fsql.Update(dbOsku.Id) + .SetIf(dbOsku.ProductId != wareId, osku => osku.ProductId, wareId) + .SetIf(isDetailChanged, osku => osku.ShouldPay, oskuCF?.ShouldPay) + .SetIf(isDetailChanged, osku => osku.Balance, oskuCF?.Balance) + .SetIf(isDetailChanged, osku => osku.BaseDiscount, oskuCF?.BaseDiscount) + .SetIf(isDetailChanged, osku => osku.BaseFee, oskuCF?.BaseFee) + .SetIf(isDetailChanged, osku => osku.Coupon, oskuCF?.Coupon) + .SetIf(isDetailChanged, osku => osku.DongQuan, oskuCF?.DongQuan) + .SetIf(isDetailChanged, osku => osku.ExpiryGiftDiscount, oskuCF?.ExpiryGiftDiscount) + .SetIf(isDetailChanged, osku => osku.GlobalGeneralIncludeTax, oskuCF?.GlobalGeneralIncludeTax) + .SetIf(isDetailChanged, osku => osku.GlobalGeneralTax, oskuCF?.GlobalGeneralTax) + .SetIf(isDetailChanged, osku => osku.JdZhiFuYouHui, oskuCF?.JdZhiFuYouHui) + .SetIf(isDetailChanged, osku => osku.JingDou, oskuCF?.JingDou) + .SetIf(isDetailChanged, osku => osku.JingQuan, oskuCF?.JingQuan) + .SetIf(isDetailChanged, osku => osku.JingXiangLiJin, oskuCF?.JingXiangLiJin) + .SetIf(isDetailChanged, osku => osku.LiJinYouHui, oskuCF?.LiJinYouHui) + .SetIf(isDetailChanged, osku => osku.LuoDiPeiService, oskuCF?.LuoDiPeiService) + .SetIf(isDetailChanged, osku => osku.ManJian, oskuCF?.ManJian) + .SetIf(isDetailChanged, osku => osku.PingTaiChengDanYouHuiQuan, oskuCF?.PingTaiChengDanYouHuiQuan) + .SetIf(isDetailChanged, osku => osku.Plus95, oskuCF?.Plus95) + .SetIf(isDetailChanged, osku => osku.PromotionDiscount, oskuCF?.PromotionDiscount) + .SetIf(isDetailChanged, osku => osku.RemoteFee, oskuCF?.RemoteFee) + .SetIf(isDetailChanged, osku => osku.SuperRedEnvelope, oskuCF?.SuperRedEnvelope) + .SetIf(isDetailChanged, osku => osku.TaxFee, oskuCF?.TaxFee) + .SetIf(isDetailChanged, osku => osku.TuiHuanHuoWuYou, oskuCF?.TuiHuanHuoWuYou) + .SetIf(isDetailChanged, osku => osku.VenderFee, oskuCF?.VenderFee) + .SetIf(isDetailChanged, osku => osku.XianPinLeiDongQuan, oskuCF?.XianPinLeiDongQuan) + .SetIf(isDetailChanged, osku => osku.XianPinLeiJingQuan, oskuCF?.XianPinLeiJingQuan) + .SetIf(isDetailChanged, osku => osku.ZhiFuYingXiaoYouHui, oskuCF?.ZhiFuYingXiaoYouHui); + ; + updateOrderSkuDictionary.Add(skuUpdateKey, update); + } + } } } - } - #endregion - - #region 扣减库存, 计算成本 - if (dbOrder.StorageType != null && - dbOrder.StorageType != Enums.StorageType.代发 && - orderState != null && - orderState != Enums.OrderState.待付款 && - orderState != Enums.OrderState.已取消) - { - var orderCost = dbOrderCostList.FirstOrDefault(oc => oc.OrderId == dbOrder.Id); - if (orderCost == null && orderSellerPrice > 0M) + #endregion + + #region 收货人信息 + if (dbOrderConsigneeList.FirstOrDefault(oc => oc.OrderId == orderId) == null) + { + var orderConsignee = new OrderConsignee() + { + OrderId = orderId, + City = orderJToken["consigneeInfo"].Value("city"), + Province = orderJToken["consigneeInfo"].Value("province"), + County = orderJToken["consigneeInfo"].Value("county"), + Town = orderJToken["consigneeInfo"].Value("town"), + IsDecode = false, + CreateTime = DateTime.Now + }; + insertOrderConsigneeList.Add(orderConsignee); + } + #endregion + + //#region 订单优惠 + + //var orderCouponJArray = (JArray)orderJToken["couponDetailList"]; + //if (orderCouponJArray.HasValues) + //{ + // foreach (var orderCouponJToken in orderCouponJArray) + // { + // var couponType = orderCouponJToken.Value("couponType"); + // if (string.IsNullOrEmpty(couponType)) + // continue; + // //dbOrder.PreferentialAmount += orderCouponJToken.Value("couponPrice"); + // preferentialAmount += orderCouponJToken.Value("couponPrice"); + // if (!dbOrderCouponList.Any(oc => oc.OrderId == orderId)) + // { + // insertOrderCouponList.Add(new OrderCoupon() + // { + // Id = idGenerator.NewLong(), + // SkuId = orderCouponJToken.Value("skuId"), + // OrderId = orderId, + // CreateTime = DateTime.Now, + // CouponType = couponType, + // CouponPrice = orderCouponJToken.Value("couponPrice") + // }); + // } + // } + //} + //#endregion + + #region 订单状态转换 + var orderState = ConvertOrderState(orderJToken, dbOrder.StorageType); + #endregion + + #region 取消订单恢复库存 + if (orderState == Enums.OrderState.已取消 && + !isNewOrder && + dbOrder.OrderState != Enums.OrderState.已取消 && + dbOrder.StorageType != Enums.StorageType.SD && + dbOrder.StorageType != Enums.StorageType.代发) { - if (isNewOrder && dbOrder.StorageType == Enums.StorageType.SD && sDCalculationCostRequest != null) + var currentOrderCostDetailList = dbOrderCostDetailList.Where(ocd => ocd.OrderId == orderId); + if (currentOrderCostDetailList.Count() > 0) { - //检查SD埋点 - if (sDCalculationCostRequest.PlatformCommissionRatio == 0M) - sDCalculationCostRequest.PlatformCommissionRatio = 0.05M; - orderCost = new OrderCost() + foreach (var orderCostDetail in currentOrderCostDetailList) { - OrderId = sDCalculationCostRequest.OrderId, - PlatformCommissionRatio = sDCalculationCostRequest.PlatformCommissionRatio, - PreferentialAmount = preferentialAmount, - Profit = 0, - DeliveryExpressFreight = sDCalculationCostRequest.DeliveryExpressFreight, - CreateTime = DateTime.Now, - IsManualEdited = true, - SDCommissionAmount = sDCalculationCostRequest.SDCommissionAmount, - SDOrderAmount = sDCalculationCostRequest.SDOrderAmount - }; - orderCost.CalculationSDOrderProfitAndCost(dbOrder, null); - insertOrderCostList.Add(orderCost); + var updateSql = fsql.Update(orderCostDetail.PurchaseOrderPKId) + .Set(po => po.RemainingQuantity + orderCostDetail.DeductionQuantity); + updatePurchaseOrderList.Add(updateSql); + } } - else if (!fsql.Select(dbOrder.Id).Any()) //再查询一次数据库,以防同步开始执行后被人为操作扣减库存,造成重复扣减库存 + } + #endregion + + #region 扣减库存, 计算成本 + if (dbOrder.StorageType != null && + dbOrder.StorageType != Enums.StorageType.代发 && + orderState != null && + orderState != Enums.OrderState.待付款 && + orderState != Enums.OrderState.已取消) + { + var orderCost = dbOrderCostList.FirstOrDefault(oc => oc.OrderId == dbOrder.Id); + if (orderCost == null && orderSellerPrice > 0M) { - var orderSkuJArray = orderJToken["itemInfoList"].Where(skuJToken => skuJToken.Value("jdPrice") != 0M); - if (orderSkuJArray != null && orderSkuJArray.Count() > 0) + if (isNewOrder && dbOrder.StorageType == Enums.StorageType.SD && sDCalculationCostRequest != null) { - var orderCostPurchaseAmount = 0M; - var orderDeliveryExpressFreight = 0M; //发货总运费,sku购买数量第二个开始半价 + //检查SD埋点 + if (sDCalculationCostRequest.PlatformCommissionRatio == 0M) + sDCalculationCostRequest.PlatformCommissionRatio = 0.05M; + orderCost = new OrderCost() + { + OrderId = sDCalculationCostRequest.OrderId, + PlatformCommissionRatio = sDCalculationCostRequest.PlatformCommissionRatio, + PreferentialAmount = (dbOrderTotal?.TotalPingTaiChengDanYouHuiQuan) ?? dbOrder.PreferentialAmount, + Profit = 0, + DeliveryExpressFreight = sDCalculationCostRequest.DeliveryExpressFreight, + CreateTime = DateTime.Now, + IsManualEdited = true, + SDCommissionAmount = sDCalculationCostRequest.SDCommissionAmount, + SDOrderAmount = sDCalculationCostRequest.SDOrderAmount + }; + orderCost.CalculationSDOrderProfitAndCost(dbOrder, null); + insertOrderCostList.Add(orderCost); + } + else if (!fsql.Select(dbOrder.Id).Any()) //再查询一次数据库,以防同步开始执行后被人为操作扣减库存,造成重复扣减库存 + { + var orderSkuJArray = orderJToken["itemInfoList"].Where(skuJToken => skuJToken.Value("jdPrice") != 0M); + if (orderSkuJArray != null && orderSkuJArray.Count() > 0) + { + var orderCostPurchaseAmount = 0M; + var orderDeliveryExpressFreight = 0M; //发货总运费,sku购买数量第二个开始半价 - var avgPreferential = preferentialAmount / orderSkuJArray.Count(); + //var avgPreferential = preferentialAmount / orderSkuJArray.Count(); - #region 扣减库存 - foreach (var orderSkuJToken in orderSkuJArray) - { - var orderSkuId = orderSkuJToken.Value("skuId"); - var itemTotal = orderSkuJToken.Value("itemTotal"); //sku购买数量 - var itemPrice = orderSkuJToken.Value("jdPrice"); //sku单价 - var isReduceMultiTimes = false; //是否多次扣减库存 - while (itemTotal != 0) + #region 扣减库存 + foreach (var orderSkuJToken in orderSkuJArray) { - var purchaseOrder = dbPurchaseOrderList.FirstOrDefault(po => po.StorageType == dbOrder.StorageType && - po.RemainingQuantity != 0 && - po.SkuId == orderSkuId); - if (purchaseOrder == null) - break; //没有库存了 - - //本次扣减量 - var deductionQuantity = purchaseOrder.RemainingQuantity >= itemTotal ? itemTotal : purchaseOrder.RemainingQuantity; - //本次扣减量的采购成本 - var currentPurchaseAmount = purchaseOrder.UnitCost * deductionQuantity; - //本次扣减量的发货运费 - var currentSkuDeliveryFreight = isReduceMultiTimes ? - (purchaseOrder.SingleDeliveryFreight / 2 * deductionQuantity) : - (purchaseOrder.SingleDeliveryFreight + purchaseOrder.SingleDeliveryFreight / 2 * (deductionQuantity - 1)); - - purchaseOrder.RemainingQuantity -= deductionQuantity; - itemTotal -= deductionQuantity; - - //累计采购成本 - orderCostPurchaseAmount += currentPurchaseAmount; - //累计发货运费(销售运费) - orderDeliveryExpressFreight += currentSkuDeliveryFreight; - isReduceMultiTimes = true; - - var updateSql = fsql.Update(purchaseOrder.Id).Set(po => po.RemainingQuantity - deductionQuantity); - updatePurchaseOrderList.Add(updateSql); - - var orderCostDetail = new OrderCostDetail() + var orderSkuId = orderSkuJToken.Value("skuId"); + var itemTotal = orderSkuJToken.Value("itemTotal"); //sku购买数量 + + #region sku拆分明细 + decimal? skuShouldPay = orderSkuCFDetailList.FirstOrDefault(x => x.OrderId == orderId && x.SkuId == orderSkuId)?.ShouldPay; + if (skuShouldPay == null) + skuShouldPay = insertOrderSkuList.FirstOrDefault(x => x.OrderId == orderId && x.SkuId == orderSkuId)?.ShouldPay; + if (skuShouldPay == null) + skuShouldPay = dbOrderSkuList.FirstOrDefault(x => x.OrderId == orderId && x.SkuId == orderSkuId)?.ShouldPay; + + + decimal? skuPingTaiChengDanYouHuiQuan = orderSkuCFDetailList.FirstOrDefault(x => x.OrderId == orderId && + x.SkuId == orderSkuId)?.PingTaiChengDanYouHuiQuan; + if (skuPingTaiChengDanYouHuiQuan == null) + skuPingTaiChengDanYouHuiQuan = insertOrderSkuList.FirstOrDefault(x => x.OrderId == orderId && x.SkuId == orderSkuId)?.PingTaiChengDanYouHuiQuan; + if (skuPingTaiChengDanYouHuiQuan == null) + skuPingTaiChengDanYouHuiQuan = dbOrderSkuList.FirstOrDefault(x => x.OrderId == orderId && x.SkuId == orderSkuId)?.PingTaiChengDanYouHuiQuan; + + decimal? skuSuperRedEnvelope = orderSkuCFDetailList.FirstOrDefault(x => x.OrderId == orderId && + x.SkuId == orderSkuId)?.SuperRedEnvelope; + if (skuSuperRedEnvelope == null) + skuSuperRedEnvelope = insertOrderSkuList.FirstOrDefault(x => x.OrderId == orderId && x.SkuId == orderSkuId)?.SuperRedEnvelope; + if (skuSuperRedEnvelope == null) + skuSuperRedEnvelope = dbOrderSkuList.FirstOrDefault(x => x.OrderId == orderId && x.SkuId == orderSkuId)?.SuperRedEnvelope; + + decimal? skuXianPinLeiDongQuan = orderSkuCFDetailList.FirstOrDefault(x => x.OrderId == orderId && + x.SkuId == orderSkuId)?.XianPinLeiDongQuan; + if (skuXianPinLeiDongQuan == null) + skuXianPinLeiDongQuan = insertOrderSkuList.FirstOrDefault(x => x.OrderId == orderId && x.SkuId == orderSkuId)?.XianPinLeiDongQuan; + if (skuXianPinLeiDongQuan == null) + skuXianPinLeiDongQuan = dbOrderSkuList.FirstOrDefault(x => x.OrderId == orderId && x.SkuId == orderSkuId)?.XianPinLeiDongQuan; + + decimal? skuVenderFee = orderSkuCFDetailList.FirstOrDefault(x => x.OrderId == orderId && + x.SkuId == orderSkuId)?.VenderFee; + if (skuVenderFee == null) + skuVenderFee = insertOrderSkuList.FirstOrDefault(x => x.OrderId == orderId && x.SkuId == orderSkuId)?.VenderFee; + if (skuVenderFee == null) + skuVenderFee = dbOrderSkuList.FirstOrDefault(x => x.OrderId == orderId && x.SkuId == orderSkuId)?.VenderFee; + #endregion + + //var itemPrice = orderSkuJToken.Value("jdPrice"); //sku单价 + var isReduceMultiTimes = false; //是否多次扣减库存 + while (itemTotal != 0) { - Id = idGenerator.NewLong(), - OrderId = orderId, - ProductId = orderSkuJToken.Value("wareId"), - SkuId = orderSkuId, - CreateTime = DateTime.Now, - PurchaseOrderPKId = purchaseOrder.Id, - //UnitCost = purchaseOrder.UnitCost, - DeductionQuantity = deductionQuantity, - DeliveryExpressFreight = currentSkuDeliveryFreight, - //TotalCost = currentPurchaseAmount, - ConsumableAmount = purchaseOrder.SingleConsumableAmount * deductionQuantity, - FirstFreight = purchaseOrder.SingleFirstFreight * deductionQuantity, - //OperationAmount = purchaseOrder.SingleOperationAmount * deductionQuantity, - InStorageAmount = purchaseOrder.SingleInStorageAmount * deductionQuantity, - OutStorageAmount = purchaseOrder.SingleOutStorageAmount * deductionQuantity, - PurchaseFreight = purchaseOrder.SingleFreight * deductionQuantity, - SkuAmount = purchaseOrder.SingleSkuAmount * deductionQuantity, - StorageAmount = purchaseOrder.SingleStorageAmount * deductionQuantity, - IsEnabled = true - }; - orderCostDetail.SkuGrossProfit = itemPrice * deductionQuantity - avgPreferential - - (orderCostDetail.TotalCost + orderCostDetail.DeliveryExpressFreight) - - itemPrice * deductionQuantity * platformCommissionRatio; - insertOrderCostDetailList.Add(orderCostDetail); + var purchaseOrder = dbPurchaseOrderList.FirstOrDefault(po => po.StorageType == dbOrder.StorageType && + po.RemainingQuantity != 0 && + po.SkuId == orderSkuId); + if (purchaseOrder == null) + break; //没有库存了 + + //本次扣减量 + var deductionQuantity = purchaseOrder.RemainingQuantity >= itemTotal ? itemTotal : purchaseOrder.RemainingQuantity; + //var deductionQuantity = itemTotal; + //本次扣减量的采购成本 + var currentPurchaseAmount = purchaseOrder.UnitCost * deductionQuantity; + //本次扣减量的发货运费 + var currentSkuDeliveryFreight = isReduceMultiTimes ? + (purchaseOrder.SingleDeliveryFreight / 2 * deductionQuantity) : + (purchaseOrder.SingleDeliveryFreight + purchaseOrder.SingleDeliveryFreight / 2 * (deductionQuantity - 1)); + + purchaseOrder.RemainingQuantity -= deductionQuantity; + itemTotal -= deductionQuantity; + + //累计采购成本 + orderCostPurchaseAmount += currentPurchaseAmount; + //累计发货运费(销售运费) + orderDeliveryExpressFreight += currentSkuDeliveryFreight; + isReduceMultiTimes = true; + + var updateSql = fsql.Update(purchaseOrder.Id).Set(po => po.RemainingQuantity - deductionQuantity); + updatePurchaseOrderList.Add(updateSql); + + var orderCostDetail = new OrderCostDetail() + { + Id = idGenerator.NewLong(), + OrderId = orderId, + ProductId = orderSkuJToken.Value("wareId"), + SkuId = orderSkuId, + CreateTime = DateTime.Now, + PurchaseOrderPKId = purchaseOrder.Id, + //UnitCost = purchaseOrder.UnitCost, + DeductionQuantity = deductionQuantity, + DeliveryExpressFreight = currentSkuDeliveryFreight, + //TotalCost = currentPurchaseAmount, + ConsumableAmount = purchaseOrder.SingleConsumableAmount * deductionQuantity, + FirstFreight = purchaseOrder.SingleFirstFreight * deductionQuantity, + //OperationAmount = purchaseOrder.SingleOperationAmount * deductionQuantity, + InStorageAmount = purchaseOrder.SingleInStorageAmount * deductionQuantity, + OutStorageAmount = purchaseOrder.SingleOutStorageAmount * deductionQuantity, + PurchaseFreight = purchaseOrder.SingleFreight * deductionQuantity, + SkuAmount = purchaseOrder.SingleSkuAmount * deductionQuantity, + StorageAmount = purchaseOrder.SingleStorageAmount * deductionQuantity, + IsEnabled = true + }; + + //orderCostDetail.SkuGrossProfit = itemPrice * deductionQuantity - avgPreferential - + // (orderCostDetail.TotalCost + orderCostDetail.DeliveryExpressFreight) - + // itemPrice * deductionQuantity * platformCommissionRatio; + + //var koudian = (skuShouldPay.Value - venderFee.Value) * deductionQuantity * platformCommissionRatio; + //orderCostDetail.SkuGrossProfit = (skuShouldPay.Value + pingtaiCoupon.Value) * deductionQuantity - + // orderCostDetail.TotalCost - orderCostDetail.DeliveryExpressFreight - + // koudian; + + orderCostDetail.CalculationSkuGrossProfit(skuShouldPay ?? 0M, + skuPingTaiChengDanYouHuiQuan ?? 0M, + skuSuperRedEnvelope ?? 0M, + skuXianPinLeiDongQuan ?? 0M, + skuVenderFee ?? 0M, platformCommissionRatio); + insertOrderCostDetailList.Add(orderCostDetail); + } } - } - #endregion + #endregion - #region 计算成本 - orderCost = new OrderCost() - { - OrderId = orderId, - PlatformCommissionRatio = platformCommissionRatio, - PreferentialAmount = preferentialAmount, - Profit = 0, - PurchaseAmount = orderCostPurchaseAmount, - DeliveryExpressFreight = orderDeliveryExpressFreight, - CreateTime = DateTime.Now - }; - if (dbOrder.OrderTotalPrice != 0) - orderCost.CalculationOrderProfitAndCost(dbOrder, null); - else - orderCost.CalculationOrderProfitAndCost(orderSellerPrice, freightPrice, null); - - insertOrderCostList.Add(orderCost); - #endregion + #region 计算成本 + orderCost = new OrderCost() + { + OrderId = orderId, + PlatformCommissionRatio = platformCommissionRatio, + PreferentialAmount = (dbOrderTotal?.TotalPingTaiChengDanYouHuiQuan) ?? dbOrder.PreferentialAmount, + Profit = 0, + PurchaseAmount = orderCostPurchaseAmount, + DeliveryExpressFreight = orderDeliveryExpressFreight, + CreateTime = DateTime.Now + }; + if (dbOrder.OrderTotalPrice != 0) + orderCost.CalculationOrderProfitAndCost(dbOrder, null); + else + orderCost.CalculationOrderProfitAndCost(actualProductAmount ?? 0M, orderSellerPrice, pingtaiChengDanYouHuiQuan ?? 0M, null); + + insertOrderCostList.Add(orderCost); + #endregion + } } } } - } - #endregion + #endregion - #region 检查订单信息是否变化 - if (isNewOrder) - { - dbOrder.OrderState = orderState; - dbOrder.PreferentialAmount = preferentialAmount; - } - else if ((orderState != null && orderState != dbOrder.OrderState) || - buyerRemark != dbOrder.BuyerRemark || - venderRemark != dbOrder.VenderRemark || - modifyTime != dbOrder.ModifyTime || - endTime != dbOrder.EndTime || - waybillNo != dbOrder.WaybillNo || - freightPrice != dbOrder.FreightPrice || - orderPayment != dbOrder.OrderPayment || - sellerPreferentialAmount != dbOrder.SellerPreferentialAmount || - orderSellerPrice != dbOrder.OrderSellerPrice || - (orderSellerPrice > 0M && dbOrder.IsGift) || - orderTotalPrice != dbOrder.OrderTotalPrice || - storeOrder != dbOrder.StoreOrder || - preferentialAmount != dbOrder.PreferentialAmount || - storeId != dbOrder.StoreId) - { - var updateSql = fsql.Update(orderId).SetIf(orderState != null && orderState != dbOrder.OrderState, o => o.OrderState, orderState) - .SetIf(buyerRemark != dbOrder.BuyerRemark, o => o.BuyerRemark, buyerRemark) - .SetIf(venderRemark != dbOrder.VenderRemark, o => o.VenderRemark, venderRemark) - .SetIf(modifyTime != dbOrder.ModifyTime, o => o.ModifyTime, modifyTime) - .SetIf(endTime != dbOrder.EndTime, o => o.EndTime, modifyTime) - .SetIf(waybillNo != dbOrder.WaybillNo, o => o.WaybillNo, waybillNo) - .SetIf(freightPrice != dbOrder.FreightPrice, o => o.FreightPrice, freightPrice) - .SetIf(orderPayment != dbOrder.OrderPayment, o => o.OrderPayment, orderPayment) - .SetIf(sellerPreferentialAmount != dbOrder.SellerPreferentialAmount, o => o.SellerPreferentialAmount, sellerPreferentialAmount) - .SetIf(orderSellerPrice != dbOrder.OrderSellerPrice, o => o.OrderSellerPrice, orderSellerPrice) - .SetIf(orderTotalPrice != dbOrder.OrderTotalPrice, o => o.OrderTotalPrice, orderTotalPrice) - .SetIf(orderSellerPrice > 0M && dbOrder.IsGift == true, o => o.IsGift, false) - .SetIf(storeOrder != dbOrder.StoreOrder, o => o.StoreOrder, storeOrder) - .SetIf(storeOrder != dbOrder.StoreOrder, o => o.StorageType, storageType) - .SetIf(preferentialAmount != dbOrder.PreferentialAmount, o => o.PreferentialAmount, preferentialAmount) - .SetIf(storeId != dbOrder.StoreId, o => o.StoreId, storeId); - updateOrderList.Add(updateSql); - } - #endregion + #region 检查订单信息是否变化 + if (isNewOrder) + { + dbOrder.OrderState = orderState; + //dbOrder.PreferentialAmount = preferentialAmount; + } + else if ((orderState != null && orderState != dbOrder.OrderState) || + buyerRemark != dbOrder.BuyerRemark || + venderRemark != dbOrder.VenderRemark || + modifyTime != dbOrder.ModifyTime || + endTime != dbOrder.EndTime || + waybillNo != dbOrder.WaybillNo || + freightPrice != dbOrder.FreightPrice || + orderPayment != dbOrder.OrderPayment || + sellerPreferentialAmount != dbOrder.SellerPreferentialAmount || + orderSellerPrice != dbOrder.OrderSellerPrice || + (orderSellerPrice > 0M && dbOrder.IsGift) || + orderTotalPrice != dbOrder.OrderTotalPrice || + storeOrder != dbOrder.StoreOrder || + storeId != dbOrder.StoreId || + actualProductAmount != dbOrder.ActualProductAmount || + preferentialAmount != dbOrder.PreferentialAmount || + pingtaiChengDanYouHuiQuan != dbOrder.PingTaiChengDanYouHuiQuan) + { + var updateSql = fsql.Update(orderId).SetIf(orderState != null && orderState != dbOrder.OrderState, o => o.OrderState, orderState) + .SetIf(buyerRemark != dbOrder.BuyerRemark, o => o.BuyerRemark, buyerRemark) + .SetIf(venderRemark != dbOrder.VenderRemark, o => o.VenderRemark, venderRemark) + .SetIf(modifyTime != dbOrder.ModifyTime, o => o.ModifyTime, modifyTime) + .SetIf(endTime != dbOrder.EndTime, o => o.EndTime, modifyTime) + .SetIf(waybillNo != dbOrder.WaybillNo, o => o.WaybillNo, waybillNo) + .SetIf(freightPrice != dbOrder.FreightPrice, o => o.FreightPrice, freightPrice) + .SetIf(orderPayment != dbOrder.OrderPayment, o => o.OrderPayment, orderPayment) + .SetIf(sellerPreferentialAmount != dbOrder.SellerPreferentialAmount, o => o.SellerPreferentialAmount, sellerPreferentialAmount) + .SetIf(orderSellerPrice != dbOrder.OrderSellerPrice, o => o.OrderSellerPrice, orderSellerPrice) + .SetIf(orderTotalPrice != dbOrder.OrderTotalPrice, o => o.OrderTotalPrice, orderTotalPrice) + .SetIf(orderSellerPrice > 0M && dbOrder.IsGift == true, o => o.IsGift, false) + .SetIf(storeOrder != dbOrder.StoreOrder, o => o.StoreOrder, storeOrder) + .SetIf(storeOrder != dbOrder.StoreOrder, o => o.StorageType, storageType) + .SetIf(storeId != dbOrder.StoreId, o => o.StoreId, storeId) + .SetIf(actualProductAmount != dbOrder.ActualProductAmount, o => o.ActualProductAmount, actualProductAmount) + .SetIf(preferentialAmount != dbOrder.PreferentialAmount, o => o.PreferentialAmount, preferentialAmount) + .SetIf(pingtaiChengDanYouHuiQuan != dbOrder.PingTaiChengDanYouHuiQuan, o => o.PingTaiChengDanYouHuiQuan, pingtaiChengDanYouHuiQuan); + updateOrderList.Add(updateSql); + } + #endregion - #region 删除SD埋点 - try - { - if (sDCalculationCostRequest != null) - memoryCache.Remove(orderId); + #region 删除SD埋点 + try + { + if (sDCalculationCostRequest != null) + memoryCache.Remove(orderId); + } + catch { } + #endregion } - catch { } - #endregion - - #region 优惠券/促销/拆分明细 - if (orderState != Enums.OrderState.暂停 && - orderState != Enums.OrderState.待付款 && - !dbOrderTotalList.Any(ot => ot.Id == orderId)) + catch (Exception ex) { - + nLogManager.Default().Error(ex, $"SyncOrder OrderLevel Error, OrderId:{orderId}, ShopId:{shopId}"); } - #endregion } #region 补齐sku logo @@ -696,8 +1004,25 @@ namespace BBWY.Server.Business } #endregion + #region 需要清理的数据 + var orderCouponDetailOrderIdList = insertOrderTotalInfoList.Select(x => x.Id).ToList(); + #endregion + fsql.Transaction(() => { + if (orderCouponDetailOrderIdList.Count() > 0) + { + fsql.Delete(orderCouponDetailOrderIdList).ExecuteAffrows(); + fsql.Delete().Where(on => orderCouponDetailOrderIdList.Contains(on.OrderId)).ExecuteAffrows(); + fsql.Delete().Where(op => orderCouponDetailOrderIdList.Contains(op.OrderId)).ExecuteAffrows(); + } + if (insertOrderTotalInfoList.Count() > 0) + fsql.Insert(insertOrderTotalInfoList).ExecuteAffrows(); + if (insertOrderCouponNewList.Count() > 0) + fsql.Insert(insertOrderCouponNewList).ExecuteAffrows(); + if (insertOrderPromotionList.Count() > 0) + fsql.Insert(insertOrderPromotionList).ExecuteAffrows(); + if (insertOrderList.Count() > 0) fsql.Insert(insertOrderList).ExecuteAffrows(); if (insertOrderSkuList.Count() > 0) @@ -946,6 +1271,7 @@ namespace BBWY.Server.Business deleteJdPublishOrder?.ExecuteAffrows(); }); } + #endregion /// /// 修复订单Sku缺少的spu @@ -977,6 +1303,5 @@ namespace BBWY.Server.Business } }); } - #endregion } } diff --git a/BBWY.Server.Business/TestBusiness.cs b/BBWY.Server.Business/TestBusiness.cs index c4398cee..1850e817 100644 --- a/BBWY.Server.Business/TestBusiness.cs +++ b/BBWY.Server.Business/TestBusiness.cs @@ -3,12 +3,15 @@ using BBWY.Common.Models; using BBWY.Server.Model; using BBWY.Server.Model.Db; using BBWY.Server.Model.Db.Mds; +using BBWY.Server.Model.Dto; using FreeSql; using Microsoft.Extensions.Options; using System; using System.Collections.Generic; using System.IO; using System.Linq; +using System.Threading; +using BBWY.Server.Business.Extensions; namespace BBWY.Server.Business { @@ -17,14 +20,19 @@ namespace BBWY.Server.Business private FreeSqlMultiDBManager freeSqlMultiDBManager; private VenderBusiness venderBusiness; private IFreeSql fsql; + private OrderSyncBusiness orderSyncBusiness; public TestBusiness(RestApiService restApiService, IOptions options, FreeSqlMultiDBManager freeSqlMultiDBManager, - VenderBusiness venderBusiness, YunDingBusiness yunDingBusiness, IFreeSql fsql) : base(restApiService, options, yunDingBusiness) + VenderBusiness venderBusiness, + YunDingBusiness yunDingBusiness, + IFreeSql fsql, + OrderSyncBusiness orderSyncBusiness) : base(restApiService, options, yunDingBusiness) { this.freeSqlMultiDBManager = freeSqlMultiDBManager; this.venderBusiness = venderBusiness; this.fsql = fsql; + this.orderSyncBusiness = orderSyncBusiness; } public void SyncVenderId() @@ -129,6 +137,129 @@ namespace BBWY.Server.Business } Console.WriteLine("更新完毕"); } + + public void RepairSkuDetailAndSkuGriooProfit(RepairSkuDetailAndSkuGriooProfit request) + { + request.EndTime = request.EndTime.Date.AddDays(1).AddSeconds(-1); + var banedList = new List() + { + "森王汽车用品专营店", + "森王玩具专营店", + "广发玩具专营店", + "广发汽车用品专营店", + "言义汽车用品专营店", + "杰博玩具专营店", + "安吉玩具专营店", + "布莱特玩具专营店", + "畅阳汽车用品专营店", + "熊猴汽车用品专营店", + "布莱特汽车用品专营店", + "越驭玩具专营店", + "言义玩具专营店", + "瑞源汽车用品专营店", + "熊猴玩具专营店", + "奥德汽车用品专营店", + "创天户外专营店", + "桑妮玩具专营店", + "瑞源玩具专营店" + }; + var shopList = venderBusiness.GetShopList(request.ShopId, Enums.Platform.京东); + var shopIndex = 0; + + foreach (var shop in shopList) + { + shopIndex++; + Console.WriteLine($"shopProgress {shopIndex}/{shopList.Count()}"); + var shopId = long.Parse(shop.ShopId); + if (banedList.Contains(shop.ShopName)) + continue; + var orderIdList = fsql.Select() + .Where(o => o.ShopId == shopId && + o.OrderState != Enums.OrderState.已取消 && + o.StorageType != Enums.StorageType.SD && + o.StartTime >= request.StartTime && + o.StartTime <= request.EndTime) + .WhereIf(!string.IsNullOrEmpty(request.OrderId), o => o.Id == request.OrderId) + .ToList(o => o.Id); + + fsql.Transaction(() => + { + fsql.Delete(orderIdList).ExecuteAffrows(); + fsql.Delete().Where(on => orderIdList.Contains(on.OrderId)).ExecuteAffrows(); + fsql.Delete().Where(op => orderIdList.Contains(op.OrderId)).ExecuteAffrows(); + fsql.Update().Set(osku => osku.ShouldPay, 0).Where(osku => orderIdList.Contains(osku.OrderId)).ExecuteAffrows(); + }); + + for (var i = 0; i < orderIdList.Count(); i++) + { + var orderId = orderIdList[i]; + orderSyncBusiness.SyncOrder(shop, orderId); + Console.WriteLine($"shopProgress {shopIndex}/{shopList.Count()} {shop.ShopName},orderProgress {i + 1}/{orderIdList.Count()}"); + } + // foreach (var orderId in orderIdList) + // { + // orderSyncBusiness.SyncOrder(shop, orderId); + // Thread.Sleep(1000); + // } + + var orderList = fsql.Select(orderIdList).ToList(); + var orderSkuList = fsql.Select().Where(osku => osku.Price > 0 && orderIdList.Contains(osku.OrderId)).ToList(); + var orderCostDetailList = fsql.Select().Where(ocd => orderIdList.Contains(ocd.OrderId) && ocd.IsEnabled == true).ToList(); + var orderCostList = fsql.Select(orderIdList).ToList(); + var afterOrderList = fsql.Select().Where(af => orderIdList.Contains(af.OrderId)).ToList(); + var orderTotalList = fsql.Select().Where(on => orderIdList.Contains(on.Id)).ToList(); + var orderIndex = 0; + foreach (var order in orderList) + { + orderIndex++; + Console.WriteLine($"shopProgress {shopIndex}/{shopList.Count()}, orderProgress {orderIndex}/{orderList.Count()}"); + + var currentOrderCostDetailList = orderCostDetailList.Where(ocd => ocd.OrderId == order.Id).ToList(); + + if (currentOrderCostDetailList.Count() > 0) + { + List> updateOrderCostDetailList = new List>(); + var currentOrderSkuList = orderSkuList.Where(osku => osku.OrderId == order.Id).ToList(); + foreach (var orderSku in currentOrderSkuList) + { + var ocd = currentOrderCostDetailList.FirstOrDefault(x => x.SkuId == orderSku.SkuId); + if (ocd != null) + { + ocd.CalculationSkuGrossProfit(orderSku.ShouldPay ?? 0M, + orderSku.PingTaiChengDanYouHuiQuan ?? 0M, + orderSku.SuperRedEnvelope ?? 0M, + orderSku.XianPinLeiDongQuan ?? 0M, + orderSku.VenderFee ?? 0M, + shop.PlatformCommissionRatio ?? 0.05M); + var update = fsql.Update(ocd.Id).Set(x => x.SkuGrossProfit, ocd.SkuGrossProfit); + updateOrderCostDetailList.Add(update); + } + } + var currentAfterOrderList = afterOrderList.Where(af => af.OrderId == order.Id).ToList(); + var orderTotal = orderTotalList.FirstOrDefault(on => on.Id == order.Id); + var orderCost = orderCostList.FirstOrDefault(oc => oc.OrderId == order.Id); + if (orderCost != null && orderTotal != null) + { + orderCost.CalculationOrderProfitAndCost(order.ActualProductAmount ?? 0M, + orderTotal.TotalPingTaiChengDanYouHuiQuan ?? 0M, + orderTotal.TotalVenderFee ?? 0M, + currentAfterOrderList); + if (updateOrderCostDetailList.Count() > 0) + { + fsql.Transaction(() => + { + foreach (var update in updateOrderCostDetailList) + update.ExecuteAffrows(); + fsql.Update(orderCost.OrderId).Set(oc => oc.Profit, orderCost.Profit) + .Set(oc => oc.PlatformCommissionAmount, orderCost.PlatformCommissionAmount).ExecuteAffrows(); + }); + } + } + + } + } + } + } } public class JPCount diff --git a/BBWY.Server.Model/Db/Order/Order.cs b/BBWY.Server.Model/Db/Order/Order.cs index e6649953..0fc9fbd0 100644 --- a/BBWY.Server.Model/Db/Order/Order.cs +++ b/BBWY.Server.Model/Db/Order/Order.cs @@ -52,13 +52,13 @@ namespace BBWY.Server.Model.Db public decimal OrderSellerPrice { get; set; } = 0.00M; /// - /// 平台补贴 + /// 优惠金额(订单总价-订单实收货款-用户支付运费) /// [Column(DbType = "decimal(20,2)")] public decimal PreferentialAmount { get; set; } = 0.00M; /// - /// 商家优惠金额(商家承担) + /// 商家优惠金额(商家承担)(废弃) /// [Column(DbType = "decimal(20,2)")] public decimal SellerPreferentialAmount { get; set; } = 0.00M; @@ -185,6 +185,18 @@ namespace BBWY.Server.Model.Db [Column(DbType = "bit")] public bool IsGift { get; set; } = false; + /// + /// 订单实收货款 (orderSellerPrice)+平台承担优惠券(PingTaiChengDanYouHuiQuan) + /// + [Column(DbType = "decimal(18, 2)")] + public decimal? ActualProductAmount { get; set; } = 0.00M; + + /// + /// 平台承担优惠券 + /// + [Column(DbType = "decimal(18, 2)")] + public decimal? PingTaiChengDanYouHuiQuan { get; set; } = 0.00M; + #region 订单成本 /// /// 平台扣点金额 diff --git a/BBWY.Server.Model/Db/Order/OrderCoupon_New.cs b/BBWY.Server.Model/Db/Order/OrderCoupon_New.cs index a608c5e7..e58390c6 100644 --- a/BBWY.Server.Model/Db/Order/OrderCoupon_New.cs +++ b/BBWY.Server.Model/Db/Order/OrderCoupon_New.cs @@ -14,14 +14,12 @@ namespace BBWY.Server.Model.Db /// /// 优惠券数量/发行量 /// - [Column(DbType = "int")] - public int? CouponNum { get; set; } = 0; + public long? CouponNum { get; set; } = 0; /// /// POP优惠券ID /// - [Column(DbType = "int")] - public int? CouponId { get; set; } + public long? CouponId { get; set; } /// /// 活动名称 diff --git a/BBWY.Server.Model/Db/Order/OrderPromotion.cs b/BBWY.Server.Model/Db/Order/OrderPromotion.cs index 8b602bc4..5a2f9c5e 100644 --- a/BBWY.Server.Model/Db/Order/OrderPromotion.cs +++ b/BBWY.Server.Model/Db/Order/OrderPromotion.cs @@ -35,8 +35,7 @@ namespace BBWY.Server.Model.Db /// /// pop促销ID /// - [Column(DbType = "int")] - public int? PromotionId { get; set; } + public long? PromotionId { get; set; } /// /// 活动名称 diff --git a/BBWY.Server.Model/Dto/Request/Test/RepairSkuDetailAndSkuGriooProfit.cs b/BBWY.Server.Model/Dto/Request/Test/RepairSkuDetailAndSkuGriooProfit.cs new file mode 100644 index 00000000..3f13cd05 --- /dev/null +++ b/BBWY.Server.Model/Dto/Request/Test/RepairSkuDetailAndSkuGriooProfit.cs @@ -0,0 +1,15 @@ +using System; + +namespace BBWY.Server.Model.Dto +{ + public class RepairSkuDetailAndSkuGriooProfit + { + public DateTime StartTime { get; set; } + + public DateTime EndTime { get; set; } + + public long? ShopId { get; set; } + + public string OrderId { get; set; } + } +} diff --git a/BBWY.Server.Model/Dto/Response/JD/OrderSkuCFDetail.cs b/BBWY.Server.Model/Dto/Response/JD/OrderSkuCFDetail.cs new file mode 100644 index 00000000..58de2a2d --- /dev/null +++ b/BBWY.Server.Model/Dto/Response/JD/OrderSkuCFDetail.cs @@ -0,0 +1,150 @@ +namespace BBWY.Server.Model.Dto +{ + /// + /// 订单Sku拆分明细对象 + /// + public class OrderSkuCFDetail + { + public string OrderId { get; set; } + + public string SkuId { get; set; } + + /// + /// 京东支付优惠,计价单位:元 + /// + public decimal? JdZhiFuYouHui { get; set; } = 0.00M; + + /// + /// plus会员95折优惠,计价单位:元 + /// + public decimal? Plus95 { get; set; } = 0.00M; + + /// + /// 余额,计价单位:元 + /// + public decimal? Balance { get; set; } = 0.00M; + + /// + /// 基础优惠,计价单位:元 + /// + public decimal? BaseDiscount { get; set; } = 0.00M; + + /// + /// 基础运费,计价单位:元 + /// + public decimal? BaseFee { get; set; } = 0.00M; + + /// + /// 优惠券,计价单位:元 + /// + public decimal? Coupon { get; set; } = 0.00M; + + /// + /// 东券,计价单位:元 + /// + public decimal? DongQuan { get; set; } = 0.00M; + + /// + /// 满期赠促销 + /// + public decimal? ExpiryGiftDiscount { get; set; } = 0.00M; + + /// + /// 全球购一般贸易税(包税),计价单位:元 + /// + public decimal? GlobalGeneralIncludeTax { get; set; } = 0.00M; + + /// + /// 全球购一般贸易税,计价单位:元 + /// + public decimal? GlobalGeneralTax { get; set; } = 0.00M; + + + /// + /// 京豆,计价单位:元 + /// + public decimal? JingDou { get; set; } = 0.00M; + + /// + /// 京券,计价单位:元 + /// + public decimal? JingQuan { get; set; } = 0.00M; + + /// + /// 京享礼金(首单礼金或重逢礼金),计价单位:元 + /// + public decimal? JingXiangLiJin { get; set; } = 0.00M; + + /// + /// 礼金优惠,计价单位:元 + /// + public decimal? LiJinYouHui { get; set; } = 0.00M; + + /// + /// 落地配服务,计价单位:元 + /// + public decimal? LuoDiPeiService { get; set; } = 0.00M; + + /// + /// 满减,计价单位:元 + /// + public decimal? ManJian { get; set; } = 0.00M; + + + /// + /// 按比例平台承担优惠券,计价单位:元 + /// + public decimal? PingTaiChengDanYouHuiQuan { get; set; } = 0.00M; + + + /// + /// 跨店满减促销 + /// + public decimal? PromotionDiscount { get; set; } = 0.00M; + + /// + /// 偏远运费,计价单位:元 + /// + public decimal? RemoteFee { get; set; } = 0.00M; + + /// + /// 应付金额,计价单位:元 + /// + public decimal? ShouldPay { get; set; } = 0.00M; + + /// + /// 超级红包,计价单位:元 + /// + public decimal? SuperRedEnvelope { get; set; } = 0.00M; + + /// + /// 全球购税费,计价单位:元 + /// + public decimal? TaxFee { get; set; } = 0.00M; + + /// + /// 退换货无忧,计价单位:元 + /// + public decimal? TuiHuanHuoWuYou { get; set; } = 0.00M; + + /// + /// 商家运费,计价单位:元 + /// + public decimal? VenderFee { get; set; } = 0.00M; + + /// + /// 限品类东券,计价单位:元 + /// + public decimal? XianPinLeiDongQuan { get; set; } = 0.00M; + + /// + /// 限品类京券,计价单位:元 + /// + public decimal? XianPinLeiJingQuan { get; set; } = 0.00M; + + /// + /// 支付营销优惠,计价单位:元 + /// + public decimal? ZhiFuYingXiaoYouHui { get; set; } = 0.00M; + } +} diff --git a/BBWY.Server.Model/Dto/Response/Order/OrderResponse.cs b/BBWY.Server.Model/Dto/Response/Order/OrderResponse.cs index 6cd6bf12..5e732835 100644 --- a/BBWY.Server.Model/Dto/Response/Order/OrderResponse.cs +++ b/BBWY.Server.Model/Dto/Response/Order/OrderResponse.cs @@ -72,13 +72,23 @@ namespace BBWY.Server.Model.Dto /// public decimal OrderPayment { get; set; } + /// + /// 订单实收货款 (orderSellerPrice)+平台承担优惠券(PingTaiChengDanYouHuiQuan) + /// + public decimal? ActualProductAmount { get; set; } = 0.00M; + + /// + /// 平台承担优惠券 + /// + public decimal? PingTaiChengDanYouHuiQuan { get; set; } = 0.00M; + /// /// 商品运费(用户付) /// public decimal FreightPrice { get; set; } /// - /// 平台补贴 + /// 优惠金额 订单总价-订单实收货款-用户支付运费 /// public decimal PreferentialAmount { get; set; } diff --git a/BBWY.Server.Model/Dto/Response/Order/XingXinagSearchResponse.cs b/BBWY.Server.Model/Dto/Response/Order/XingXinagSearchResponse.cs index fb790e6f..bf08aee3 100644 --- a/BBWY.Server.Model/Dto/Response/Order/XingXinagSearchResponse.cs +++ b/BBWY.Server.Model/Dto/Response/Order/XingXinagSearchResponse.cs @@ -39,6 +39,11 @@ namespace BBWY.Server.Model.Dto /// 店铺盈利率 /// public decimal? ShopYingLiRatio { get; set; } + + /// + /// 店铺实收金额 + /// + public decimal ShopActualAmount { get; set; } } public class XingXiangItemResponse @@ -64,7 +69,7 @@ namespace BBWY.Server.Model.Dto { get { - return ActualAmount == 0 ? 0 : Math.Round(Profit / ActualAmount * 100, 2); + return ActualAmount == 0 ? 0 : Math.Round(Profit / ActualAmount, 2); //*100 } } @@ -83,19 +88,11 @@ namespace BBWY.Server.Model.Dto /// public decimal SDOrderAmount { get; set; } - /// - /// 店铺毛利率 - /// - public decimal? ShopProfitRatio { get; set; } - - /// - /// 店铺盈利率 - /// - public decimal? ShopYingLiRatio { get; set; } - /// /// SPU盈利率 /// public decimal? SpuYingLiRatio { get; set; } + + } } diff --git a/JD.API/Middlewares/CustomExceptionMiddleWare.cs b/JD.API/Middlewares/CustomExceptionMiddleWare.cs index da17e1db..60a9627e 100644 --- a/JD.API/Middlewares/CustomExceptionMiddleWare.cs +++ b/JD.API/Middlewares/CustomExceptionMiddleWare.cs @@ -59,6 +59,7 @@ namespace JD.API.Middlewares context.Response.Clear(); context.Response.StatusCode = 500; //发生未捕获的异常,手动设置状态码 nLogManager.Default().Error(ex); //记录错误 + //await ErrorHandle(context, context.Response.StatusCode, ex.Message); } } finally