diff --git a/BBWY.Client/APIServices/OrderService.cs b/BBWY.Client/APIServices/OrderService.cs index 1021ba78..8baa7196 100644 --- a/BBWY.Client/APIServices/OrderService.cs +++ b/BBWY.Client/APIServices/OrderService.cs @@ -126,7 +126,8 @@ namespace BBWY.Client.APIServices osku.PurchaseFreight, osku.ProductId, osku.SkuAmount, - osku.StorageAmount, + //osku.StorageAmount, + osku.PackagingLaborAmount, osku.TotalCost, osku.UnitCost }), diff --git a/BBWY.Client/APIServices/PurchaseOrderService.cs b/BBWY.Client/APIServices/PurchaseOrderService.cs index cfda899b..27893f6f 100644 --- a/BBWY.Client/APIServices/PurchaseOrderService.cs +++ b/BBWY.Client/APIServices/PurchaseOrderService.cs @@ -57,20 +57,13 @@ namespace BBWY.Client.APIServices /// /// /// - public ApiResponse PreviewPurchaseOrder(Consignee consignee, IList purchaseSchemeProductSkuList, Platform purchasePlatform, PurchaseAccount purchaseAccount, PurchaseOrderMode purchaseOrderMode) + public ApiResponse PreviewPurchaseOrder(Consignee consignee, List cargoParamList, Platform purchasePlatform, PurchaseAccount purchaseAccount, PurchaseOrderMode purchaseOrderMode) { return SendRequest(globalContext.BBYWApiHost, "api/purchaseOrder/PreviewPurchaseOrder", new { purchaseOrderMode, consignee, - CargoParamList = purchaseSchemeProductSkuList.Select(sku => new - { - ProductId = sku.PurchaseProductId, - SkuId = sku.PurchaseSkuId, - SpecId = sku.PurchaseSkuSpecId, - Quantity = sku.ItemTotal, - BelongSkuId = sku.SkuId - }), + CargoParamList = cargoParamList, Platform = purchasePlatform, AppKey = purchaseAccount.AppKey, AppSecret = purchaseAccount.AppSecret, @@ -99,7 +92,7 @@ namespace BBWY.Client.APIServices /// /// public ApiResponse FastCreateOrder(Consignee consignee, - IList purchaseSchemeProductSkuList, + List cargoParamList, Platform purchasePlatform, PurchaseAccount purchaseAccount, PurchaseOrderMode purchaseOrderMode, @@ -118,15 +111,7 @@ namespace BBWY.Client.APIServices { purchaseOrderMode, consignee, - CargoParamList = purchaseSchemeProductSkuList.Select(sku => new - { - ProductId = sku.PurchaseProductId, - SkuId = sku.PurchaseSkuId, - SpecId = sku.PurchaseSkuSpecId, - Quantity = sku.ItemTotal, - BelongSkuId = sku.SkuId, - SchemeId = sku.SkuPurchaseSchemeId - }), + CargoParamList = cargoParamList, Platform = purchasePlatform, purchaseAccount.AppKey, purchaseAccount.AppSecret, diff --git a/BBWY.Client/APIServices/PurchaseProductAPIService.cs b/BBWY.Client/APIServices/PurchaseProductAPIService.cs index ab80e86d..e6aa0925 100644 --- a/BBWY.Client/APIServices/PurchaseProductAPIService.cs +++ b/BBWY.Client/APIServices/PurchaseProductAPIService.cs @@ -25,6 +25,9 @@ namespace BBWY.Client.APIServices private string qtAppId = "BBWY2023022001"; private string qtAppSecret = "908e131365d5448ca651ba20ed7ddefe"; + private List locationIdList; + private List priceIdList; + private TimeSpan purchaseProductCacheTimeSpan; //private TimeSpan _1688SessionIdTimeSpan; @@ -48,6 +51,17 @@ namespace BBWY.Client.APIServices }; purchaseProductCacheTimeSpan = TimeSpan.FromDays(1); this.quanTanProductClient = quanTanProductClient; + locationIdList = new List() + { + "300252630336272", + "1081181309101", + "16347413030323" + }; + priceIdList = new List() { + "300252630336263", + "1081181309582", + "16347413030316" + }; } public (Purchaser purchaser, IList purchaseSchemeProductSkus)? GetProductInfo(Platform platform, string productId, string skuId, string purchaseProductId, PurchaseOrderMode priceMode, PurchaseProductAPIMode apiMode) @@ -189,7 +203,7 @@ namespace BBWY.Client.APIServices if (_1688pageResult.StatusCode != System.Net.HttpStatusCode.OK) return null; - var match = Regex.Match(_1688pageResult.Content, @"(window\.__INIT_DATA=)(.*)(\r*\n*\s*)"); + var match = Regex.Match(_1688pageResult.Content, @"(window\.__INIT_DATA\s?=)(.*)(\r*\n*\s*)"); if (!match.Success) return null; @@ -200,11 +214,18 @@ namespace BBWY.Client.APIServices var purchaser = new Purchaser() { Id = jobject["globalData"]["tempModel"]["sellerUserId"].ToString(), - Name = jobject["globalData"]["tempModel"]["companyName"].ToString(), - Location = jobject["data"]["1081181309101"] != null ? - jobject["data"]["1081181309101"]["data"]["location"].ToString() : - jobject["data"]["16347413030323"]["data"]["location"].ToString() + Name = jobject["globalData"]["tempModel"]["companyName"].ToString() }; + foreach (var lid in locationIdList) + { + if (jobject["data"][lid] != null) + { + purchaser.Location = jobject["data"][lid]["data"]["location"].ToString(); + break; + } + } + + var colorsProperty = jobject["globalData"]["skuModel"]["skuProps"].FirstOrDefault(j => j.Value("fid") == 3216 || j.Value("fid") == 1627207 || @@ -217,9 +238,18 @@ namespace BBWY.Client.APIServices imageUrl = j.Value("imageUrl") }).ToList(); - var firstPrice = jobject["data"]["1081181309582"] != null ? - jobject["data"]["1081181309582"]["data"]["priceModel"]["currentPrices"][0].Value("price") : - jobject["data"]["16347413030316"]["data"]["priceModel"]["currentPrices"][0].Value("price"); + //var firstPrice = jobject["data"]["1081181309582"] != null ? + // jobject["data"]["1081181309582"]["data"]["priceModel"]["currentPrices"][0].Value("price") : + // jobject["data"]["16347413030316"]["data"]["priceModel"]["currentPrices"][0].Value("price"); + var firstPrice = 0M; + foreach (var pid in priceIdList) + { + if (jobject["data"][pid] != null) + { + firstPrice = jobject["data"][pid]["data"]["priceModel"]["currentPrices"][0].Value("price"); + break; + } + } var purchaseSchemeProductSkus = new List(); @@ -238,7 +268,7 @@ namespace BBWY.Client.APIServices SkuId = skuId, PurchaseProductId = purchaseProductId, Price = skuPrice == 0M ? firstPrice : skuPrice, - Title = name, + Title = matchName, PurchaseSkuId = value.Value("skuId"), PurchaseSkuSpecId = value.Value("specId"), Logo = colorsProperty.FirstOrDefault(c => c.name == matchName)?.imageUrl ?? "pack://application:,,,/Resources/Images/defaultItem.png" diff --git a/BBWY.Client/Converters/InputNumberConverter.cs b/BBWY.Client/Converters/InputNumberConverter.cs index ce9c2890..3c7e2f50 100644 --- a/BBWY.Client/Converters/InputNumberConverter.cs +++ b/BBWY.Client/Converters/InputNumberConverter.cs @@ -1,4 +1,5 @@ -using System; +using MathNet.Numerics; +using System; using System.Globalization; using System.Windows; using System.Windows.Data; @@ -16,14 +17,44 @@ namespace BBWY.Client.Converters { string strValue = value as string; if (string.IsNullOrEmpty(strValue)) + { return null; + } decimal result; - var dotIndex = strValue.IndexOf('.'); - if (dotIndex == strValue.Length - 1 || - (dotIndex != -1 && strValue.EndsWith("0")) || - !decimal.TryParse(strValue, out result)) + if (strValue.IndexOf('.') == strValue.Length - 1 || (strValue.IndexOf('0') == strValue.Length - 1 && strValue.IndexOf('.') != -1) || !decimal.TryParse(strValue, out result)) + { return DependencyProperty.UnsetValue; + } return result; + + //if (string.IsNullOrEmpty(strValue)) + // return DependencyProperty.UnsetValue; + //if (strValue.EndsWith(".")) + // return DependencyProperty.UnsetValue; + //decimal result = 0M; + //var dotIndex = strValue.IndexOf('.'); + //if (dotIndex == -1) + // decimal.TryParse(strValue, out result); + //else + //{ + // //var intValueStr = strValue.Substring(0, dotIndex); + // var decimalValueStr = strValue.Substring(dotIndex + 1); + + // var n = 1M; + // if (decimalValueStr.Length == 1) + // n = 1.0M; + // if (decimalValueStr.Length == 2) + // n = 1.00M; + // if (decimalValueStr.Length == 3) + // n = 1.000M; + // if (decimalValueStr.Length == 4) + // n = 1.0000M; + // if (decimal.TryParse(strValue, out result)) + // result = decimal.Round(result * n, decimalValueStr.Length); + // else + // return DependencyProperty.UnsetValue; + //} + //return result; } } } diff --git a/BBWY.Client/GlobalContext.cs b/BBWY.Client/GlobalContext.cs index 7aad82ad..125e4843 100644 --- a/BBWY.Client/GlobalContext.cs +++ b/BBWY.Client/GlobalContext.cs @@ -14,7 +14,7 @@ namespace BBWY.Client { ShopServiceGroupList = new List(); ShopServiceGroupLowerList = new List(); - ClientVersion = "10211"; + ClientVersion = "10229"; } diff --git a/BBWY.Client/Models/APIModel/Response/BillCorrection/BillCorrectionOrderResponse.cs b/BBWY.Client/Models/APIModel/Response/BillCorrection/BillCorrectionOrderResponse.cs index 42cea562..16bf3ce8 100644 --- a/BBWY.Client/Models/APIModel/Response/BillCorrection/BillCorrectionOrderResponse.cs +++ b/BBWY.Client/Models/APIModel/Response/BillCorrection/BillCorrectionOrderResponse.cs @@ -61,10 +61,15 @@ namespace BBWY.Client.Models /// public decimal ConsumableAmount { get; set; } = 0.00M; + ///// + ///// 仓储费 + ///// + //public decimal StorageAmount { get; set; } = 0.00M; + /// - /// 仓储费 + /// 包装人工费 /// - public decimal StorageAmount { get; set; } = 0.00M; + public decimal PackagingLaborAmount { get; set; } = 0.00M; /// /// 售后费用 diff --git a/BBWY.Client/Models/APIModel/Response/Order/ExportOrderResponse.cs b/BBWY.Client/Models/APIModel/Response/Order/ExportOrderResponse.cs index d8fe471d..f660405d 100644 --- a/BBWY.Client/Models/APIModel/Response/Order/ExportOrderResponse.cs +++ b/BBWY.Client/Models/APIModel/Response/Order/ExportOrderResponse.cs @@ -37,10 +37,15 @@ namespace BBWY.Client.Models /// public decimal FirstFreight { get; set; } + ///// + ///// 仓储费 + ///// + //public decimal StorageAmount { get; set; } + /// - /// 仓储费 + /// 包装人工费 /// - public decimal StorageAmount { get; set; } + public decimal PackagingLaborAmount { get; set; } /// /// 发货快递费 @@ -111,8 +116,8 @@ namespace BBWY.Client.Models public override string ToString() { - //日期,店铺订单号,SKU编码,订单状态,仓储类型,代发下单单号,售价,商品成本,采购运费,头程费用,仓储服务费,快递费,耗材费,入仓操作费,出仓操作费,刷单/空单号费,平台扣点,补差金额,应付金额,实收金额,利润,利润率,收件人联系方式,商家备注,售后类型,售后与特殊情况备注 - return $"{OrderStartTime:yyyy-MM-dd HH:mm:ss},{OrderId},{SkuIds},{OrderState},{StorageType},{PurchaseOrderIds},{OrderTotalPrice},{PurchaseSkuAmount},{PurchaseFreight},{FirstFreight},{StorageAmount},{DeliveryExpressFreight},{ConsumableAmount},{InStorageAmount},{OutStorageAmount},{SDOrderAmount},{PlatformCommissionAmount},{FreightPrice},{OrderPayment},{ActualAmount},{Profit},{ProfitRatio},{ConsigneeStr},{VenderRemark}"; + //日期,店铺订单号,SKU编码,订单状态,仓储类型,代发下单单号,售价,商品成本,采购运费,头程费用,包装人工费,快递费,耗材费,入仓操作费,出仓操作费,刷单/空单号费,平台扣点,补差金额,应付金额,实收金额,利润,利润率,收件人联系方式,商家备注,售后类型,售后与特殊情况备注 + return $"{OrderStartTime:yyyy-MM-dd HH:mm:ss},{OrderId},{SkuIds},{OrderState},{StorageType},{PurchaseOrderIds},{OrderTotalPrice},{PurchaseSkuAmount},{PurchaseFreight},{FirstFreight},{PackagingLaborAmount},{DeliveryExpressFreight},{ConsumableAmount},{InStorageAmount},{OutStorageAmount},{SDOrderAmount},{PlatformCommissionAmount},{FreightPrice},{OrderPayment},{ActualAmount},{Profit},{ProfitRatio},{ConsigneeStr},{VenderRemark}"; } } } diff --git a/BBWY.Client/Models/APIModel/Response/Order/OrderCostDetailResponse.cs b/BBWY.Client/Models/APIModel/Response/Order/OrderCostDetailResponse.cs index 90db238b..23cf929a 100644 --- a/BBWY.Client/Models/APIModel/Response/Order/OrderCostDetailResponse.cs +++ b/BBWY.Client/Models/APIModel/Response/Order/OrderCostDetailResponse.cs @@ -70,10 +70,15 @@ namespace BBWY.Client.Models /// public decimal ConsumableAmount { get; set; } = 0.00M; + ///// + ///// 仓储费 + ///// + //public decimal StorageAmount { get; set; } = 0.00M; + /// - /// 仓储费 + /// 包装人工费 /// - public decimal StorageAmount { get; set; } = 0.00M; + public decimal PackagingLaborAmount { get; set; } = 0.00M; /// /// 总计(不含销售运费 历史遗留) @@ -84,5 +89,10 @@ namespace BBWY.Client.Models /// 总计 包含销售运费 /// public decimal TotalCost2 { get; set; } = 0.00M; + + /// + /// 是否为预估成本 + /// + public bool IsEstimateCost { get; set; } = false; } } diff --git a/BBWY.Client/Models/APIModel/Response/Order/OrderCostResponse.cs b/BBWY.Client/Models/APIModel/Response/Order/OrderCostResponse.cs index ef969c54..a01f346c 100644 --- a/BBWY.Client/Models/APIModel/Response/Order/OrderCostResponse.cs +++ b/BBWY.Client/Models/APIModel/Response/Order/OrderCostResponse.cs @@ -53,6 +53,11 @@ namespace BBWY.Client.Models /// public bool IsManualEdited { get; set; } + /// + /// 是否为预估成本 + /// + public bool IsEstimateCost { get; set; } = false; + /// /// 刷单佣金 /// diff --git a/BBWY.Client/Models/APIModel/Response/PurchaseOrder/PurchaseOrderResponse.cs b/BBWY.Client/Models/APIModel/Response/PurchaseOrder/PurchaseOrderResponse.cs index 6464e3f5..79400e9f 100644 --- a/BBWY.Client/Models/APIModel/Response/PurchaseOrder/PurchaseOrderResponse.cs +++ b/BBWY.Client/Models/APIModel/Response/PurchaseOrder/PurchaseOrderResponse.cs @@ -55,10 +55,15 @@ namespace BBWY.Client.Models /// public decimal SingleConsumableAmount { get; set; } = 0.00M; + ///// + ///// 单件仓储费 + ///// + //public decimal SingleStorageAmount { get; set; } = 0.00M; + /// - /// 单件仓储费 + /// 包装人工费 /// - public decimal SingleStorageAmount { get; set; } = 0.00M; + public decimal SinglePackagingLaborAmount { get; set; } = 0.00M; /// /// 单件Sku成本 diff --git a/BBWY.Client/Models/BillCorrection/BillCorrectionOrder.cs b/BBWY.Client/Models/BillCorrection/BillCorrectionOrder.cs index 9b69e50d..8e25abec 100644 --- a/BBWY.Client/Models/BillCorrection/BillCorrectionOrder.cs +++ b/BBWY.Client/Models/BillCorrection/BillCorrectionOrder.cs @@ -65,10 +65,15 @@ namespace BBWY.Client.Models /// public decimal ConsumableAmount { get; set; } = 0.00M; + ///// + ///// 仓储费 + ///// + //public decimal StorageAmount { get; set; } = 0.00M; + /// - /// 仓储费 + /// 包装人工费 /// - public decimal StorageAmount { get; set; } = 0.00M; + public decimal PackagingLaborAmount { get; set; }=0.00M; /// /// 售后费用 diff --git a/BBWY.Client/Models/Order/ManualEditCostOrderSku.cs b/BBWY.Client/Models/Order/ManualEditCostOrderSku.cs index c46023fc..8d93bb51 100644 --- a/BBWY.Client/Models/Order/ManualEditCostOrderSku.cs +++ b/BBWY.Client/Models/Order/ManualEditCostOrderSku.cs @@ -46,11 +46,14 @@ namespace BBWY.Client.Models private decimal consumableAmount; private string consumableAmountStr; - /// - /// 仓储费 - /// - private decimal storageAmount; - private string storageAmountStr; + ///// + ///// 仓储费 + ///// + //private decimal storageAmount; + //private string storageAmountStr; + + private decimal packagingLaborAmount; + private string packagingLaborAmountStr; /// /// 总计(不含发货运费) @@ -100,7 +103,7 @@ namespace BBWY.Client.Models public decimal PurchaseFreight { get => purchaseFreight; set { if (Set(ref purchaseFreight, value)) { CalculationCost(); } } } public decimal FirstFreight { get => firstFreight; set { if (Set(ref firstFreight, value)) { CalculationCost(); } } } public decimal ConsumableAmount { get => consumableAmount; set { if (Set(ref consumableAmount, value)) { CalculationCost(); } } } - public decimal StorageAmount { get => storageAmount; set { if (Set(ref storageAmount, value)) { CalculationCost(); } } } + //public decimal StorageAmount { get => storageAmount; set { if (Set(ref storageAmount, value)) { CalculationCost(); } } } public decimal TotalCost { get => totalCost; set @@ -114,7 +117,7 @@ namespace BBWY.Client.Models private void CalculationCost() { - TotalCost = SkuAmount + PurchaseFreight + FirstFreight + InStorageAmount + OutStorageAmount + ConsumableAmount + StorageAmount; + TotalCost = SkuAmount + PurchaseFreight + FirstFreight + InStorageAmount + OutStorageAmount + ConsumableAmount + PackagingLaborAmount; UnitCost = ItemTotal == 0 ? 0 : TotalCost / ItemTotal; } @@ -164,17 +167,17 @@ namespace BBWY.Client.Models } } } - public string StorageAmountStr - { - get => storageAmountStr; set - { - if (Set(ref storageAmountStr, value)) - { - if (decimal.TryParse(storageAmountStr, out decimal d)) - StorageAmount = d; - } - } - } + //public string StorageAmountStr + //{ + // get => storageAmountStr; set + // { + // if (Set(ref storageAmountStr, value)) + // { + // if (decimal.TryParse(storageAmountStr, out decimal d)) + // StorageAmount = d; + // } + // } + //} public string DeliveryExpressFreightStr { @@ -225,5 +228,25 @@ namespace BBWY.Client.Models OutStorageAmount = d; } } + + public decimal PackagingLaborAmount + { + get => packagingLaborAmount; + set + { + if (Set(ref packagingLaborAmount, value)) + CalculationCost(); + } + } + public string PackagingLaborAmountStr + { + get => packagingLaborAmountStr; + set + { + if (Set(ref packagingLaborAmountStr, value)) + if (decimal.TryParse(packagingLaborAmountStr, out decimal d)) + packagingLaborAmount = d; + } + } } } diff --git a/BBWY.Client/Models/Order/Order.cs b/BBWY.Client/Models/Order/Order.cs index a53f660f..d8063ca8 100644 --- a/BBWY.Client/Models/Order/Order.cs +++ b/BBWY.Client/Models/Order/Order.cs @@ -237,11 +237,22 @@ namespace BBWY.Client.Models { get { + //var beforeTotalCost = OrderCost?.BeforeTotalCost ?? 0M; + //return OrderState != OrderState.已取消 && StorageType != Models.StorageType.SD && + // ((StorageType != null && beforeTotalCost == 0M) || + // (beforeTotalCost > OrderSellerPrice + FreightPrice + PingTaiChengDanYouHuiQuan) || + // (StorageType == null && OrderState != OrderState.等待采购 && OrderState != OrderState.待付款)); + var beforeTotalCost = OrderCost?.BeforeTotalCost ?? 0M; - return OrderState != OrderState.已取消 && StorageType != Models.StorageType.SD && - ((StorageType != null && beforeTotalCost == 0M) || - (beforeTotalCost > OrderSellerPrice + FreightPrice + PingTaiChengDanYouHuiQuan) || - (StorageType == null && OrderState != OrderState.等待采购 && OrderState != OrderState.待付款)); + var profit = OrderCost?.Profit ?? 0M; + return (OrderState != OrderState.已取消 && + StorageType != Models.StorageType.SD && + StorageType != null && + (beforeTotalCost == 0M || profit < 0M)) || + (StorageType == null && + OrderState != OrderState.等待采购 && + OrderState != OrderState.待付款 && + OrderState != OrderState.已取消); } } diff --git a/BBWY.Client/Models/Order/OrderCost.cs b/BBWY.Client/Models/Order/OrderCost.cs index eaf904f7..5626e2f9 100644 --- a/BBWY.Client/Models/Order/OrderCost.cs +++ b/BBWY.Client/Models/Order/OrderCost.cs @@ -53,6 +53,11 @@ /// public bool IsManualEdited { get; set; } + /// + /// 是否为预估成本 + /// + public bool IsEstimateCost { get; set; } = false; + /// /// 退款金额 /// diff --git a/BBWY.Client/Models/PurchaseOrder/CargoParam.cs b/BBWY.Client/Models/PurchaseOrder/CargoParam.cs new file mode 100644 index 00000000..7d07f421 --- /dev/null +++ b/BBWY.Client/Models/PurchaseOrder/CargoParam.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace BBWY.Client.Models +{ + public class CargoParam + { + public string ProductId { get; set; } + public string SkuId { get; set; } + public string SpecId { get; set; } + public int Quantity { get; set; } + public string BelongSkuId { get; set; } + + public long SchemeId { get; set; } + } +} diff --git a/BBWY.Client/Models/PurchaseOrder/PurchaseOrder.cs b/BBWY.Client/Models/PurchaseOrder/PurchaseOrder.cs index 9c104a07..ffe017b4 100644 --- a/BBWY.Client/Models/PurchaseOrder/PurchaseOrder.cs +++ b/BBWY.Client/Models/PurchaseOrder/PurchaseOrder.cs @@ -119,18 +119,18 @@ namespace BBWY.Client.Models } } - /// - /// 单件仓储费 - /// - public decimal SingleStorageAmount - { - get => singleStorageAmount; - set - { - if (Set(ref singleStorageAmount, value)) - RefreshUnitCost(); - } - } + ///// + ///// 单件仓储费 + ///// + //public decimal SingleStorageAmount + //{ + // get => singleStorageAmount; + // set + // { + // if (Set(ref singleStorageAmount, value)) + // RefreshUnitCost(); + // } + //} public decimal SingleInStorageAmount { @@ -153,9 +153,19 @@ namespace BBWY.Client.Models public decimal SingleRefundInStorageAmount { get => singleRefundInStorageAmount; set { Set(ref singleRefundInStorageAmount, value); } } + public decimal SinglePackagingLaborAmount + { + get => singlePackagingLaborAmount; + set + { + if (Set(ref singlePackagingLaborAmount, value)) + RefreshUnitCost(); + } + } + public void RefreshUnitCost() { - UnitCost = SingleSkuAmount + SingleFreight + SingleFirstFreight + SingleInStorageAmount + SingleOutStorageAmount + SingleConsumableAmount + SingleStorageAmount; + UnitCost = SingleSkuAmount + SingleFreight + SingleFirstFreight + SingleInStorageAmount + SingleOutStorageAmount + SingleConsumableAmount + SinglePackagingLaborAmount; } private bool isEdit; @@ -168,7 +178,8 @@ namespace BBWY.Client.Models private decimal singleDeliveryFreight; //private decimal singleOperationAmount; private decimal singleConsumableAmount; - private decimal singleStorageAmount; + //private decimal singleStorageAmount; + private decimal singlePackagingLaborAmount; private decimal singleInStorageAmount; private decimal singleOutStorageAmount; private decimal singleRefundInStorageAmount; diff --git a/BBWY.Client/ViewModels/Order/OrderListViewModel.cs b/BBWY.Client/ViewModels/Order/OrderListViewModel.cs index dcf743a0..b62f6348 100644 --- a/BBWY.Client/ViewModels/Order/OrderListViewModel.cs +++ b/BBWY.Client/ViewModels/Order/OrderListViewModel.cs @@ -811,7 +811,8 @@ namespace BBWY.Client.ViewModels manualEditCostOrderSku.OutStorageAmount = orderCostDetailList.Sum(ocd => ocd.OutStorageAmount); manualEditCostOrderSku.PurchaseFreight = orderCostDetailList.Sum(ocd => ocd.PurchaseFreight); manualEditCostOrderSku.SkuAmount = orderCostDetailList.Sum(ocd => ocd.SkuAmount); - manualEditCostOrderSku.StorageAmount = orderCostDetailList.Sum(ocd => ocd.StorageAmount); + //manualEditCostOrderSku.StorageAmount = orderCostDetailList.Sum(ocd => ocd.StorageAmount); + manualEditCostOrderSku.PackagingLaborAmount = orderCostDetailList.Sum(ocd => ocd.PackagingLaborAmount); manualEditCostOrderSku.TotalCost = orderCostDetailList.Sum(ocd => ocd.TotalCost); manualEditCostOrderSku.UnitCost = orderCostDetailList.FirstOrDefault().UnitCost; } @@ -823,7 +824,8 @@ namespace BBWY.Client.ViewModels manualEditCostOrderSku.OutStorageAmountStr = manualEditCostOrderSku.OutStorageAmount.ToString(); manualEditCostOrderSku.PurchaseFreightStr = manualEditCostOrderSku.PurchaseFreight.ToString(); manualEditCostOrderSku.SkuAmountStr = manualEditCostOrderSku.SkuAmount.ToString(); - manualEditCostOrderSku.StorageAmountStr = manualEditCostOrderSku.StorageAmount.ToString(); + //manualEditCostOrderSku.StorageAmountStr = manualEditCostOrderSku.StorageAmount.ToString(); + manualEditCostOrderSku.PackagingLaborAmountStr = manualEditCostOrderSku.PackagingLaborAmount.ToString(); } var manualCalculationCost = new ManualCalculationCost(orderId, isSetStorageType, storageType, orderSkuList); @@ -990,7 +992,7 @@ namespace BBWY.Client.ViewModels try { var list = r.Data.Select(x => x.ToString()).ToList(); - list.Insert(0, "日期,店铺订单号,SKU编码,订单状态,仓储类型,代发下单单号,售价,商品成本,采购运费,头程费用,仓储服务费,快递费,耗材费,入仓操作费,出仓操作费,刷单/空单号费,平台扣点,补差金额,应付金额,实收金额,利润,利润率,收件人联系方式,商家备注,售后类型,售后与特殊情况备注"); + list.Insert(0, "日期,店铺订单号,SKU编码,订单状态,仓储类型,代发下单单号,售价,商品成本,采购运费,头程费用,包装人工费,快递费,耗材费,入仓操作费,出仓操作费,刷单/空单号费,平台扣点,补差金额,应付金额,实收金额,利润,利润率,收件人联系方式,商家备注,售后类型,售后与特殊情况备注"); System.IO.File.WriteAllLines(ssaveFileName, list, Encoding.UTF8); App.Current.Dispatcher.Invoke(() => MessageBox.Show("导出完成", "导出")); } diff --git a/BBWY.Client/ViewModels/PackTask/WareHouseListViewModel.cs b/BBWY.Client/ViewModels/PackTask/WareHouseListViewModel.cs index cac5a45d..0331aa4b 100644 --- a/BBWY.Client/ViewModels/PackTask/WareHouseListViewModel.cs +++ b/BBWY.Client/ViewModels/PackTask/WareHouseListViewModel.cs @@ -39,6 +39,7 @@ using BBWY.Client.Extensions; using BBWY.Client.Views.PackTaskAbort; using System.Windows.Controls; using BBWY.Client.Views.SomeArrival; +using BBWY.Client.Views.PackTask; namespace BBWY.Client.ViewModels.PackTask { @@ -1565,6 +1566,21 @@ namespace BBWY.Client.ViewModels.PackTask { var model = (SealBoxModel)obj; + var datas = sealBoxService.GetWareSealBoxList(null, null, null, model.SealBoxId, 1, 10); + if (datas != null && datas.Data != null && datas.Success) + { + var dataModel = datas.Data; + + + var flashModel = dataModel.WaitSealBoxModels.SingleOrDefault(w => w.SealBoxId == model.SealBoxId); + + if (flashModel != null) + { + model.SealBoxSkus = flashModel.SealBoxSkus; + } + + + } SealBoxPrintDetailsWindow printDetailsWindow = new SealBoxPrintDetailsWindow(model, sealBoxService); printDetailsWindow.ShowDialog(); } diff --git a/BBWY.Client/ViewModels/Purchase/1688PreviewPurchaseViewModel.cs b/BBWY.Client/ViewModels/Purchase/1688PreviewPurchaseViewModel.cs index fef1fb33..878d5aea 100644 --- a/BBWY.Client/ViewModels/Purchase/1688PreviewPurchaseViewModel.cs +++ b/BBWY.Client/ViewModels/Purchase/1688PreviewPurchaseViewModel.cs @@ -11,6 +11,7 @@ using System.Linq; using System.Threading.Tasks; using System.Windows; using System.Windows.Input; +using Newtonsoft.Json; namespace BBWY.Client.ViewModels { @@ -75,6 +76,7 @@ namespace BBWY.Client.ViewModels /// 扩展数据,暂用于拳探 /// private string extensions; + private bool isSkuMatchError; public _1688PreviewPurchaseViewModel(OneBoundAPIService oneBoundAPIService, PurchaseService purchaseService, @@ -116,7 +118,7 @@ namespace BBWY.Client.ViewModels protected override void Load() { IsLoading = true; - + isSkuMatchError = false; Task.Factory.StartNew(() => purchaseService.GetPurchaseSchemeList(order.ItemList.Select(osku => osku.Id).ToList(), purchaser.Id, globalContext.User.Shop.ShopId)) .ContinueWith(r => { @@ -149,7 +151,10 @@ namespace BBWY.Client.ViewModels else { IsLoading = false; - App.Current.Dispatcher.Invoke(() => MessageBox.Show("采购方案商品加载失败,请重新打开预览窗口", "提示")); + if (isSkuMatchError) + App.Current.Dispatcher.Invoke(() => MessageBox.Show("采购方案与当前商品页的数据匹配失败,请删除旧采购方案后重新绑定采购方案", "提示")); + else + App.Current.Dispatcher.Invoke(() => MessageBox.Show("采购方案商品加载失败,请重新打开预览窗口", "提示")); } }); } @@ -182,15 +187,23 @@ namespace BBWY.Client.ViewModels { foreach (var purchaseSchemeProductSku in data.Value.purchaseSchemeProductSkus) { - purchaseSchemeProductSku.SkuPurchaseSchemeId = purchaseSchemeProduct.SkuPurchaseSchemeId; - if (purchaseSchemeProduct.SelectedSkuIdList.Any(s => s == purchaseSchemeProductSku.PurchaseSkuId)) + if (orderSku != null && purchaseSchemeProductSku.SkuId == orderSku.Id) { - PurchaseSchemeProductSkuList.Add(purchaseSchemeProductSku); - purchaseSchemeProductSku.ItemTotal = orderSku.ItemTotal; - purchaseSchemeProductSku.OnItemTotalChanged = OnItemTotalChanged; + purchaseSchemeProductSku.SkuPurchaseSchemeId = purchaseSchemeProduct.SkuPurchaseSchemeId; + if (purchaseSchemeProduct.SelectedSkuIdList.Any(s => s == purchaseSchemeProductSku.PurchaseSkuId)) + { + PurchaseSchemeProductSkuList.Add(purchaseSchemeProductSku); + purchaseSchemeProductSku.ItemTotal = orderSku.ItemTotal; + purchaseSchemeProductSku.OnItemTotalChanged = OnItemTotalChanged; + } } } }); + + if (purchaseSchemeProduct.SelectedSkuIdList.Any(s => !data.Value.purchaseSchemeProductSkus.Any(s1 => s1.PurchaseSkuId == s))) + { + isSkuMatchError = true; + } } ewh.Set(); @@ -224,6 +237,33 @@ namespace BBWY.Client.ViewModels return; } + #region 由于未知原因,会存在不属于当前订单的配件sku,预览时清理一次 + for (var i = 0; i < PurchaseSchemeProductSkuList.Count(); i++) + { + var pss = PurchaseSchemeProductSkuList[i]; + if (!order.ItemList.Any(osku => osku.Id == pss.SkuId)) + { + //这个采购配件不属于这笔订单 + PurchaseSchemeProductSkuList.RemoveAt(i); + i--; + } + } + if (PurchaseSchemeProductSkuList.Count() == 0) + { + MessageBox.Show("采购配件数量为0"); + return; + } + #endregion + + var cargoParamList = PurchaseSchemeProductSkuList.Select(sku => new CargoParam + { + ProductId = sku.PurchaseProductId, + SkuId = sku.PurchaseSkuId, + SpecId = sku.PurchaseSkuSpecId, + Quantity = sku.ItemTotal, + BelongSkuId = sku.SkuId + }).ToList(); + IsLoading = true; Task.Factory.StartNew(() => purchaseOrderService.PreviewPurchaseOrder(new Consignee() { @@ -235,7 +275,7 @@ namespace BBWY.Client.ViewModels Province = Province, TelePhone = Mobile, Town = Town - }, PurchaseSchemeProductSkuList, purchaseAccount.PurchasePlatformId, purchaseAccount, PurchaseOrderMode)) + }, cargoParamList, purchaseAccount.PurchasePlatformId, purchaseAccount, PurchaseOrderMode)) .ContinueWith(t => { IsLoading = false; @@ -275,6 +315,15 @@ namespace BBWY.Client.ViewModels MessageBox.Show("收货人信息不全", "下单"); return; } + var cargoParamList = PurchaseSchemeProductSkuList.Select(sku => new CargoParam + { + ProductId = sku.PurchaseProductId, + SkuId = sku.PurchaseSkuId, + SpecId = sku.PurchaseSkuSpecId, + Quantity = sku.ItemTotal, + BelongSkuId = sku.SkuId, + SchemeId = sku.SkuPurchaseSchemeId + }).ToList(); IsLoading = true; Task.Factory.StartNew(() => purchaseOrderService.FastCreateOrder(new Consignee() @@ -287,7 +336,7 @@ namespace BBWY.Client.ViewModels Province = Province, TelePhone = Mobile, Town = Town - }, PurchaseSchemeProductSkuList, + }, cargoParamList, purchaseAccount.PurchasePlatformId, purchaseAccount, PurchaseOrderMode, diff --git a/BBWY.Client/ViewModels/QualityTask/QualityViewModel.cs b/BBWY.Client/ViewModels/QualityTask/QualityViewModel.cs index 2b26481f..58d9e54c 100644 --- a/BBWY.Client/ViewModels/QualityTask/QualityViewModel.cs +++ b/BBWY.Client/ViewModels/QualityTask/QualityViewModel.cs @@ -535,29 +535,29 @@ namespace BBWY.Client.ViewModels } request.BarcodeId = BarCodeModel.Id; } - IsNeedPrintCer = Need.不需要; - if (PurchaseSkuList != null && PurchaseSkuList.Count > 0 && purchaseSkuList.Any(p => p.IsNeedCer)) - { - if (PurchaseSkuList.Where(p => p.IsSetCertificate).Count() > 0) + if (IsNeedPrintCer == Need.需要) + if (PurchaseSkuList != null && PurchaseSkuList.Count > 0 && purchaseSkuList.Any(p => p.IsNeedCer)) { - MessageBox.Show("存在未确认的合格证,请先完成确认!"); - return; - } + if (PurchaseSkuList.Where(p => p.IsSetCertificate).Count() > 0) + { + MessageBox.Show("存在未确认的合格证,请先完成确认!"); + return; + } - if (purchaseSkuList.Any(p => p.IsNeedCer && p.CerDTO == null)) - { - MessageBox.Show("有未设置的合格证,请设置完所有的合格证再保存"); - return; - } - if (PurchaseSkuList.Where(p => p.IsNeedCer && p.CerDTO.Id > 0).Count() <= 0) - { - MessageBox.Show("无可选的合格证打印!"); - return; + if (purchaseSkuList.Any(p => p.IsNeedCer && p.CerDTO == null)) + { + MessageBox.Show("有未设置的合格证,请设置完所有的合格证再保存"); + return; + } + if (PurchaseSkuList.Where(p => p.IsNeedCer && p.CerDTO.Id > 0).Count() <= 0) + { + MessageBox.Show("无可选的合格证打印!"); + return; + } + request.CerId = string.Join(",", PurchaseSkuList.Where(p => p.IsNeedCer && p.CerDTO.Id > 0).Select(p => p.CerDTO.Id)); + } - request.CerId = string.Join(",", PurchaseSkuList.Where(p => p.IsNeedCer && p.CerDTO.Id > 0).Select(p => p.CerDTO.Id)); - IsNeedPrintCer = Need.需要; - } - + try { diff --git a/BBWY.Client/ViewModels/TotalPackTask/ShopPackTaskTotalViewModel.cs b/BBWY.Client/ViewModels/TotalPackTask/ShopPackTaskTotalViewModel.cs index f80602a9..ae51bc99 100644 --- a/BBWY.Client/ViewModels/TotalPackTask/ShopPackTaskTotalViewModel.cs +++ b/BBWY.Client/ViewModels/TotalPackTask/ShopPackTaskTotalViewModel.cs @@ -134,7 +134,7 @@ namespace BBWY.Client.ViewModels.TotalPackTask if (res.Success) { //string title = "任务ID,日期,是否结清,部门,店铺,对接人,sku名称,sku数量,增值服务,打包服务,耗材服务,原价,促销折扣,结算价格,对接备注"; - string title = "任务ID,日期,是否结清,所属部门,所属店铺,包装数量,收货数量,耗材总价,工序类型,工序套餐,工序单价,包装原价,包装折扣系数,包装折扣价,总收费"; + string title = "任务ID,日期,是否结清,所属部门,所属店铺,包装数量,收货数量,耗材明细,耗材总价,工序类型,工序套餐,工序单价,包装原价,包装折扣系数,包装折扣价,总收费"; var excelList = res.Data.ShopTotals.Select(x => x.ToString()).ToList(); excelList.Insert(0, title); System.IO.File.WriteAllLines(fileName, excelList, Encoding.UTF8); diff --git a/BBWY.Client/Views/BillCorrection/BillCorrectionView.xaml b/BBWY.Client/Views/BillCorrection/BillCorrectionView.xaml index e26f51e6..95e0635c 100644 --- a/BBWY.Client/Views/BillCorrection/BillCorrectionView.xaml +++ b/BBWY.Client/Views/BillCorrection/BillCorrectionView.xaml @@ -219,15 +219,15 @@ ElementStyle="{StaticResource verticalCenterTextBlock}"/> - - - - - diff --git a/BBWY.Client/Views/Order/ManualCalculationCost.xaml b/BBWY.Client/Views/Order/ManualCalculationCost.xaml index 4fe1a555..cd8d0a50 100644 --- a/BBWY.Client/Views/Order/ManualCalculationCost.xaml +++ b/BBWY.Client/Views/Order/ManualCalculationCost.xaml @@ -98,15 +98,15 @@ - - + - @@ -114,7 +114,7 @@ - @@ -130,7 +130,7 @@ - diff --git a/BBWY.Client/Views/Order/OrderListControl.xaml b/BBWY.Client/Views/Order/OrderListControl.xaml index 7d2ca3d5..60967cce 100644 --- a/BBWY.Client/Views/Order/OrderListControl.xaml +++ b/BBWY.Client/Views/Order/OrderListControl.xaml @@ -178,7 +178,7 @@ Margin=" 5,0,0,0"/> - @@ -188,7 +188,7 @@ - + --> @@ -476,7 +476,7 @@ - + @@ -485,7 +485,7 @@ - + @@ -538,8 +538,8 @@ Visibility="{Binding InStorageAmount,ConverterParameter=0|0.0|0.00:Collapsed:Visible,Converter={StaticResource objConverter}}"/> - + @@ -806,6 +806,7 @@ + - + - + diff --git a/BBWY.Client/Views/PackTask/PrintWindow.xaml.cs b/BBWY.Client/Views/PackTask/PrintWindow.xaml.cs index 0eb7a853..ce4d0ab1 100644 --- a/BBWY.Client/Views/PackTask/PrintWindow.xaml.cs +++ b/BBWY.Client/Views/PackTask/PrintWindow.xaml.cs @@ -9,6 +9,8 @@ using System.Threading.Tasks; using System.Windows; using System.Collections.ObjectModel; using BBWY.Client.Extensions; +using System.Reflection; +using System.IO; namespace BBWY.Client.Views.PackTask { @@ -20,21 +22,17 @@ namespace BBWY.Client.Views.PackTask public PrintWindow() { InitializeComponent(); - this.Loaded += PrintWindow_Loaded; - - - } + InitPrintList(); + this.DataContext = this; - private void PrintWindow_Loaded(object sender, RoutedEventArgs e) - { - LoadPrints(); } - /// /// 获取打印机名称 /// - private void LoadPrints() + public void InitPrintList() { + + PrintList = new ObservableCollection(); var printingNames = PrinterSettings.InstalledPrinters;//获取本机的打印机数据 int index = -1; int selectIndex = 0; @@ -49,12 +47,30 @@ namespace BBWY.Client.Views.PackTask { selectIndex = index; } - cbPrints.Items.Add(name); + PrintList.Add(name); + } + try + { + var applicationPath = System.IO.Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); + string printNames = System.IO.Path.Combine(applicationPath, "handPrintBarCerName.init"); + if (File.Exists(printNames)) + { + PrintName = File.ReadAllText(printNames); + } + else + { + if (PrintList.Count > 0) + { + PrintName = PrintList[0].ToString(); + } + } } - if (cbPrints.Items.Count > selectIndex) + catch (Exception) { - cbPrints.SelectedIndex = selectIndex; + + } + } @@ -81,43 +97,59 @@ namespace BBWY.Client.Views.PackTask cer.Visibility = Visibility.Collapsed; bar.Visibility = Visibility.Visible; } - this.DataContext = this; + } - public CertificateModel[] CertificateModel { get; set; } + private CertificateModel[] certificateModel; + public CertificateModel[] CertificateModel { get => certificateModel; set { Set(ref certificateModel, value); } } - public BarCodeModel BarCodeModel { get; set; } + private BarCodeModel barCodeModel; + public BarCodeModel BarCodeModel { get=> barCodeModel; set {Set(ref barCodeModel,value); } } - private void BButton_Click(object sender, RoutedEventArgs e) - { - int printCount = 0; - try - { - printCount = Convert.ToInt32(tbCount.Text); - } - catch - { - new TipsWindow("请输入打印份数", 1).ShowDialog(); - return; - } - string printName = cbPrints.Text;//选择的要打印的打印机名称 + /// + /// 打印机列表 + /// + public ObservableCollection PrintList { get; set; } + public string PrintName { get; set; } + public int PrintCount { get => printCount; set { Set(ref printCount, value); } } + private int printCount = 1; + + private void BButton_Click(object sender, RoutedEventArgs e) + { Task.Factory.StartNew(() => { if (BarCodeModel != null) { - PrintData(printCount, printName,BarCodeModel); + PrintData(PrintCount, PrintName,BarCodeModel); //MyPrintHelper.PrintBarcode(ref args, BarCodeModel, font); } if (CertificateModel != null&& CertificateModel.Count()>0) { foreach (var cer in CertificateModel) { - PrintData(printCount, printName,null,cer); + PrintData(PrintCount, PrintName,null,cer); System.Threading.Thread.Sleep(100); } } + + var applicationPath = System.IO.Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); + string printNames = System.IO.Path.Combine(applicationPath, "handPrintBarCerName.init"); + try + { + if (File.Exists(printNames)) + { + File.Delete(printNames); + } + } + catch + { + + + } + + File.WriteAllText(printNames, PrintName); }); } diff --git a/BBWY.Client/Views/PackagingTask/PrintPackDetailWindow.xaml.cs b/BBWY.Client/Views/PackagingTask/PrintPackDetailWindow.xaml.cs index 655e135f..c543d504 100644 --- a/BBWY.Client/Views/PackagingTask/PrintPackDetailWindow.xaml.cs +++ b/BBWY.Client/Views/PackagingTask/PrintPackDetailWindow.xaml.cs @@ -71,7 +71,7 @@ namespace BBWY.Client.Views.PackagingTask try { var applicationPath = System.IO.Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); - string printNames = System.IO.Path.Combine(applicationPath, "printName.init"); + string printNames = System.IO.Path.Combine(applicationPath, "printPackDetailName.init"); if (File.Exists(printNames)) { PrintName = File.ReadAllText(printNames); @@ -93,13 +93,6 @@ namespace BBWY.Client.Views.PackagingTask } private void BButton_Click(object sender, System.Windows.RoutedEventArgs e) { - - - - - - - if (PrintName.IsNullOrEmpty()) { MessageBox.Show("请选择打印设备"); @@ -121,8 +114,23 @@ namespace BBWY.Client.Views.PackagingTask for (int i = 0; i < PrintCount; i++) { printWindow.PrintBox(PrintName); + } + var applicationPath = System.IO.Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); + string printNames = System.IO.Path.Combine(applicationPath, "printPackDetailName.init"); + try + { + if (File.Exists(printNames)) + { + File.Delete(printNames); + } + } + catch + { + + } + File.WriteAllText(printNames, PrintName); this.Close(); diff --git a/BBWY.Client/Views/PackagingTask/ShopWaitPackingTaskControl.xaml b/BBWY.Client/Views/PackagingTask/ShopWaitPackingTaskControl.xaml index 3451f01d..fda73be0 100644 --- a/BBWY.Client/Views/PackagingTask/ShopWaitPackingTaskControl.xaml +++ b/BBWY.Client/Views/PackagingTask/ShopWaitPackingTaskControl.xaml @@ -267,7 +267,7 @@ - @@ -54,21 +54,21 @@ + + + + + + - - - - - - - - + + + - - + - + @@ -93,12 +93,11 @@ - - @@ -112,9 +111,9 @@ - + @@ -129,21 +128,23 @@ - - - - - - - - - + + + + + + + + + + + - - + + - + @@ -207,11 +208,11 @@ + - @@ -221,32 +222,170 @@ - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - + + + @@ -265,7 +404,6 @@ - diff --git a/BBWY.JDSDK/Request/AttrValueAliasJson.cs b/BBWY.JDSDK/Request/AttrValueAliasJson.cs index 7c326401..be14914c 100644 --- a/BBWY.JDSDK/Request/AttrValueAliasJson.cs +++ b/BBWY.JDSDK/Request/AttrValueAliasJson.cs @@ -9,5 +9,7 @@ public string value { get; set; } public int? valueId { get; set; } + + public bool isReName { get; set; } } } diff --git a/BBWY.Server.API/BBWY.Server.API.csproj b/BBWY.Server.API/BBWY.Server.API.csproj index 65f647df..1a20a366 100644 --- a/BBWY.Server.API/BBWY.Server.API.csproj +++ b/BBWY.Server.API/BBWY.Server.API.csproj @@ -6,8 +6,8 @@ - - + + diff --git a/BBWY.Server.API/Controllers/OrderEstimateCostSyncController.cs b/BBWY.Server.API/Controllers/OrderEstimateCostSyncController.cs new file mode 100644 index 00000000..1ffe7b34 --- /dev/null +++ b/BBWY.Server.API/Controllers/OrderEstimateCostSyncController.cs @@ -0,0 +1,56 @@ +using BBWY.Server.Business; +using BBWY.Server.Model.Dto; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; + +namespace BBWY.Server.API.Controllers +{ + + public class OrderEstimateCostSyncController : BaseApiController + { + private OrderEstimateCostSyncBusiness orderEstimateCostSyncBusiness; + + public OrderEstimateCostSyncController(IHttpContextAccessor httpContextAccessor, OrderEstimateCostSyncBusiness orderEstimateCostSyncBusiness) : base(httpContextAccessor) + { + this.orderEstimateCostSyncBusiness = orderEstimateCostSyncBusiness; + } + + /// + /// 同步所有店铺的SKU最近成本 + /// + [HttpPost] + public void SyncAllShopOrderSkuRecentCost() + { + orderEstimateCostSyncBusiness.SyncAllShopOrderSkuRecentCost(); + } + + /// + /// 同步指定条件的SKU最近成本 + /// + /// + [HttpPost] + public void SyncOrderSkuRecentCost([FromBody] SkuRecentCostRequest request) + { + orderEstimateCostSyncBusiness.SyncOrderSkuRecentCost(request); + } + + /// + /// 为所有店铺没有成本的订单预估成本和毛利 + /// + [HttpPost] + public void EstimateCostForAllShopNoCostOrder() + { + orderEstimateCostSyncBusiness.EstimateCostForAllShopNoCostOrder(); + } + + /// + /// 按指定条件预估成本和毛利 + /// + /// + [HttpPost] + public void EstimateCostForNoCostOrder([FromBody] SkuRecentCostRequest request) + { + orderEstimateCostSyncBusiness.EstimateCostForNoCostOrder(request); + } + } +} diff --git a/BBWY.Server.API/Controllers/TestController.cs b/BBWY.Server.API/Controllers/TestController.cs index edbdf8b6..c05c2808 100644 --- a/BBWY.Server.API/Controllers/TestController.cs +++ b/BBWY.Server.API/Controllers/TestController.cs @@ -42,5 +42,17 @@ namespace BBWY.Server.API.Controllers { testBusiness.RepairOrderProfit(); } + + [HttpPost] + public void RepairDFOrder() + { + testBusiness.RepairDFOrder(); + } + + [HttpPost] + public void Test_20231221() + { + testBusiness.Test_20231221(); + } } } diff --git a/BBWY.Server.API/Startup.cs b/BBWY.Server.API/Startup.cs index 84746551..ccdcc052 100644 --- a/BBWY.Server.API/Startup.cs +++ b/BBWY.Server.API/Startup.cs @@ -19,6 +19,7 @@ using System.Collections.Generic; using System.Configuration; using System.IO; using System.Linq; +using System.Net.Http; using System.Reflection; using System.Text; using Yitter.IdGenerator; @@ -65,6 +66,10 @@ namespace BBWY.Server.API services.AddControllers(); services.AddHttpContextAccessor(); services.AddHttpClient(); + services.AddHttpClient("gzip").ConfigurePrimaryHttpMessageHandler(handler => new HttpClientHandler() + { + AutomaticDecompression = System.Net.DecompressionMethods.GZip + }); services.AddCors(options => { options.AddPolicy("cors", p => diff --git a/BBWY.Server.Business/AfterSaleOrder/AfterSaleOrderBusiness.cs b/BBWY.Server.Business/AfterSaleOrder/AfterSaleOrderBusiness.cs index 55518038..5660e79a 100644 --- a/BBWY.Server.Business/AfterSaleOrder/AfterSaleOrderBusiness.cs +++ b/BBWY.Server.Business/AfterSaleOrder/AfterSaleOrderBusiness.cs @@ -170,7 +170,7 @@ namespace BBWY.Server.Business dbAfterSaleOrder.FirstFreight = dbOrderCostDetail.FirstFreight; dbAfterSaleOrder.ReissueProductAmount = dbOrderCostDetail.SkuAmount; dbAfterSaleOrder.ReissueFreight = dbOrderCostDetail.PurchaseFreight; - dbAfterSaleOrder.StorageAmount = dbOrderCostDetail.StorageAmount; + //dbAfterSaleOrder.StorageAmount = dbOrderCostDetail.StorageAmount; dbAfterSaleOrder.InStorageAmount = dbOrderCostDetail.InStorageAmount; dbAfterSaleOrder.OutStorageAmount = dbOrderCostDetail.OutStorageAmount; } diff --git a/BBWY.Server.Business/BBWY.Server.Business.csproj b/BBWY.Server.Business/BBWY.Server.Business.csproj index 2fbbac4b..d872e01e 100644 --- a/BBWY.Server.Business/BBWY.Server.Business.csproj +++ b/BBWY.Server.Business/BBWY.Server.Business.csproj @@ -6,8 +6,8 @@ - - + + diff --git a/BBWY.Server.Business/BillCorrection/BillCorrectionBusiness.cs b/BBWY.Server.Business/BillCorrection/BillCorrectionBusiness.cs index c7808e19..8d1b8d4a 100644 --- a/BBWY.Server.Business/BillCorrection/BillCorrectionBusiness.cs +++ b/BBWY.Server.Business/BillCorrection/BillCorrectionBusiness.cs @@ -68,7 +68,8 @@ namespace BBWY.Server.Business InStorageAmount = g.Sum(g.Value.Item1.InStorageAmount), OutStorageAmount = g.Sum(g.Value.Item1.OutStorageAmount), ConsumableAmount = g.Sum(g.Value.Item1.ConsumableAmount), - StorageAmount = g.Sum(g.Value.Item1.StorageAmount) + PackagingLaborAmount = g.Sum(g.Value.Item1.PackagingLaborAmount), + //StorageAmount = g.Sum(g.Value.Item1.StorageAmount) }); @@ -99,7 +100,8 @@ namespace BBWY.Server.Business order.InStorageAmount = orderCostDetail?.InStorageAmount ?? 0M; order.OutStorageAmount = orderCostDetail?.OutStorageAmount ?? 0M; order.ConsumableAmount = orderCostDetail?.ConsumableAmount ?? 0M; - order.StorageAmount = orderCostDetail?.StorageAmount ?? 0M; + order.PackagingLaborAmount = orderCostDetail?.PackagingLaborAmount ?? 0M; + //order.StorageAmount = orderCostDetail?.StorageAmount ?? 0M; order.AfterTotalCost = afterOrder?.AfterTotalCost ?? 0M; if (order.StorageType == Model.Enums.StorageType.SD) diff --git a/BBWY.Server.Business/EvaluationAssistant/EvaluationAssistantBusiness.cs b/BBWY.Server.Business/EvaluationAssistant/EvaluationAssistantBusiness.cs index af3e3369..9c5aca76 100644 --- a/BBWY.Server.Business/EvaluationAssistant/EvaluationAssistantBusiness.cs +++ b/BBWY.Server.Business/EvaluationAssistant/EvaluationAssistantBusiness.cs @@ -148,6 +148,13 @@ namespace BBWY.Server.Business #region 评价助手任务 public void AddOrEditPromotionTask(AddOrEditPromotionTaskRequest request) { + var shop = venderBusiness.GetShopList(request.ShopId).FirstOrDefault(); + if (shop == null) + throw new BusinessException("缺少店铺Id"); + var loggerName = $"评价助手-{shop.ShopName}"; + nLogManager.GetLogger(loggerName).Info($"发布任务-{JsonConvert.SerializeObject(request)}"); + + if (string.IsNullOrEmpty(request.MainProductSpu)) throw new BusinessException("缺少主商品SPU"); @@ -160,6 +167,9 @@ namespace BBWY.Server.Business if (string.IsNullOrEmpty(request.FullTitle)) throw new BusinessException("缺少完整标题"); + if (string.IsNullOrEmpty(request.SimpleTitle)) + throw new BusinessException("缺少精简标题"); + if (string.IsNullOrEmpty(request.ActivityName)) throw new BusinessException("缺少任务名称"); @@ -347,7 +357,7 @@ namespace BBWY.Server.Business if (prpt.Status != Enums.PromitionTaskStatus.等待 && prpt.Status != Enums.PromitionTaskStatus.进行中) throw new BusinessException("前置任务状态必须为等待或进行中"); - var nextPromotionTaskList = fsql.Select().Where(pt1 => pt1.PreTaskId == request.PreTaskId).ToList(); + var nextPromotionTaskList = fsql.Select().Where(pt1 => pt1.PreTaskId == request.PreTaskId && pt1.IsEnabled == true).ToList(); if (nextPromotionTaskList.Count() > 0) { CheckSkuRepeat(pt, nextPromotionTaskList); diff --git a/BBWY.Server.Business/Order/OrderBusiness.cs b/BBWY.Server.Business/Order/OrderBusiness.cs index 3a55f086..709230e1 100644 --- a/BBWY.Server.Business/Order/OrderBusiness.cs +++ b/BBWY.Server.Business/Order/OrderBusiness.cs @@ -39,6 +39,8 @@ namespace BBWY.Server.Business private IMemoryCache memoryCache; private static TimeSpan sdGroupExpirationTimeSpan = TimeSpan.FromMinutes(20); + private List filterExceptionStateList; + public OrderBusiness(RestApiService restApiService, IFreeSql fsql, IIdGenerator idGenerator, @@ -52,6 +54,12 @@ namespace BBWY.Server.Business freeSqlMultiDBManagerLazy = new Lazy(() => serviceProvider.GetService()); productBusinessLazy = new Lazy(() => serviceProvider.GetService()); venderBusinessLazy = new Lazy(() => serviceProvider.GetService()); + + filterExceptionStateList = new List() { + Enums.OrderState.等待采购, + Enums.OrderState.待付款, + Enums.OrderState.已取消 + }; } private ISelect GetOrderListQueryConditions(SearchOrderRequest searchOrderRequest) @@ -78,10 +86,12 @@ namespace BBWY.Server.Business .WhereIf(searchOrderRequest.StartDate != null, (o, ocs, oct, sh) => o.StartTime >= searchOrderRequest.StartDate) .WhereIf(searchOrderRequest.EndDate != null, (o, ocs, oct, sh) => o.StartTime <= searchOrderRequest.EndDate) .WhereIf(searchOrderRequest.IncludeExceptionOrder, - (o, ocs, oct, sh) => o.OrderState != Enums.OrderState.已取消 && - ((o.StorageType != Enums.StorageType.SD && o.StorageType != null && oct.PurchaseAmount == 0M) || - (o.StorageType != Enums.StorageType.SD && oct.PurchaseAmount + oct.DeliveryExpressFreight > o.OrderSellerPrice + o.FreightPrice + o.PingTaiChengDanYouHuiQuan) || - (o.StorageType == null && o.OrderState != Enums.OrderState.等待采购))) + (o, ocs, oct, sh) => (o.OrderState != Enums.OrderState.已取消 && + o.StorageType != Enums.StorageType.SD && + o.StorageType != null && + (oct.PurchaseAmount == 0M || oct.Profit < 0)) || + (o.StorageType == null && + !filterExceptionStateList.Contains(o.OrderState))) .WhereIf(searchOrderRequest.OnlyDF, (o, ocs, oct, sh) => o.StorageType == Enums.StorageType.代发) .WhereIf(searchOrderRequest.ExcludeCanceled, (o, ocs, oct, sh) => o.OrderState != Enums.OrderState.已取消) .WhereIf(searchOrderRequest.ExcludeSD && !searchOrderRequest.OnlyDF, (o, ocs, oct, sh) => o.StorageType == null || o.StorageType != Enums.StorageType.SD) @@ -150,6 +160,7 @@ namespace BBWY.Server.Business Profit = oct.Profit, PurchaseAmount = oct.PurchaseAmount, IsManualEdited = oct.IsManualEdited, + IsEstimateCost = oct.IsEstimateCost, SDCommissionAmount = oct.SDCommissionAmount, SDOrderAmount = oct.SDOrderAmount, RefundAmount = oct.RefundAmount, @@ -340,7 +351,8 @@ namespace BBWY.Server.Business OrderId = g.Key, SkuAmount = g.Sum(g.Value.SkuAmount), FirstFreight = g.Sum(g.Value.FirstFreight), - StorageAmount = g.Sum(g.Value.StorageAmount), + //StorageAmount = g.Sum(g.Value.StorageAmount), + PackagingLaborAmount = g.Sum(g.Value.PackagingLaborAmount), PurchaseFreight = g.Sum(g.Value.PurchaseFreight), ConsumableAmount = g.Sum(g.Value.ConsumableAmount), InStorageAmount = g.Sum(g.Value.InStorageAmount), @@ -359,7 +371,8 @@ namespace BBWY.Server.Business OrderId = g.Key, SkuAmount = g.Sum(g.Value.Item1.SkuAmount), FirstFreight = g.Sum(g.Value.Item1.FirstFreight), - StorageAmount = g.Sum(g.Value.Item1.StorageAmount), + //StorageAmount = g.Sum(g.Value.Item1.StorageAmount), + PackagingLaborAmount = g.Sum(g.Value.Item1.PackagingLaborAmount), PurchaseFreight = g.Sum(g.Value.Item1.PurchaseFreight), ConsumableAmount = g.Sum(g.Value.Item1.ConsumableAmount), InStorageAmount = g.Sum(g.Value.Item1.InStorageAmount), @@ -376,7 +389,8 @@ namespace BBWY.Server.Business order.FirstFreight = statistics?.FirstFreight ?? 0M; order.PurchaseSkuAmount = statistics?.SkuAmount ?? 0M; order.PurchaseFreight = statistics?.PurchaseFreight ?? 0M; - order.StorageAmount = statistics?.StorageAmount ?? 0M; + //order.StorageAmount = statistics?.StorageAmount ?? 0M; + order.PackagingLaborAmount = statistics?.PackagingLaborAmount ?? 0M; order.SkuIds = string.Join("|", orderSkuList.Where(osku => osku.OrderId == order.OrderId).Select(osku => osku.SkuId)); order.ProfitRatio = order.TotalCost == 0 ? 0 : Math.Round(order.Profit / order.TotalCost * 100, 2); order.ConsumableAmount = statistics?.ConsumableAmount ?? 0M; @@ -509,7 +523,9 @@ namespace BBWY.Server.Business var dbAfterSaleOrderList = fsql.Select().Where(aso => aso.OrderId == autoCalculationCostRequest.OrderId).ToList(); var orderCost = fsql.Select(autoCalculationCostRequest.OrderId).ToOne(); - var orderCostDetails = fsql.Select().Where(ocd => ocd.OrderId == autoCalculationCostRequest.OrderId && ocd.IsEnabled == true).ToList(); + var orderCostDetails = fsql.Select().Where(ocd => ocd.OrderId == autoCalculationCostRequest.OrderId && + ocd.IsEnabled == true && + ocd.IsEstimateCost == false).ToList(); IUpdate orderUpdate = null; IUpdate updateOrderCost = null; @@ -591,19 +607,9 @@ namespace BBWY.Server.Business //OperationAmount = purchaseOrder.SingleOperationAmount * deductionQuantity, PurchaseFreight = purchaseOrder.SingleFreight * deductionQuantity, SkuAmount = purchaseOrder.SingleSkuAmount * deductionQuantity, - StorageAmount = purchaseOrder.SingleStorageAmount * deductionQuantity + //StorageAmount = purchaseOrder.SingleStorageAmount * deductionQuantity + PackagingLaborAmount = purchaseOrder.SinglePackagingLaborAmount * deductionQuantity }; - //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, @@ -630,7 +636,8 @@ namespace BBWY.Server.Business Profit = 0, PurchaseAmount = orderCostPurchaseAmount, DeliveryExpressFreight = orderDeliveryExpressFreight, - CreateTime = DateTime.Now + CreateTime = DateTime.Now, + IsEstimateCost = false }; orderCost.CalculationOrderProfitAndCost(dbOrder, dbAfterSaleOrderList); insertOrderCost = fsql.Insert(orderCost); @@ -638,6 +645,12 @@ namespace BBWY.Server.Business } else { + if (orderCost.IsEstimateCost == true) + { + orderCost.IsEstimateCost = false; + orderCost.PurchaseAmount = 0M; + orderCost.DeliveryExpressFreight = 0M; + } orderCost.PurchaseAmount += orderCostPurchaseAmount; orderCost.DeliveryExpressFreight += orderDeliveryExpressFreight; orderCost.CalculationOrderProfitAndCost(dbOrder, dbAfterSaleOrderList); @@ -654,6 +667,12 @@ namespace BBWY.Server.Business foreach (var update in updatePurchaseOrderList) update.ExecuteAffrows(); } + fsql.Update() + .Set(ocd => ocd.IsEnabled, false) + .Where(ocd => ocd.OrderId == autoCalculationCostRequest.OrderId && + ocd.IsEnabled == true && + ocd.IsEstimateCost == true) + .ExecuteAffrows(); if (insertOrderCostDetailList.Count > 0) fsql.Insert(insertOrderCostDetailList).ExecuteAffrows(); }); @@ -708,7 +727,7 @@ namespace BBWY.Server.Business orderCostDetail.CreateTime = DateTime.Now; orderCostDetail.OrderId = manualCalculationCostRequest.OrderId; orderCostDetail.PurchaseOrderPKId = 0; - + orderCostDetail.IsEstimateCost = false; var osku = orderSkuList.FirstOrDefault(o => o.SkuId == orderCostDetail.SkuId); if (osku != null) { @@ -745,7 +764,8 @@ namespace BBWY.Server.Business PurchaseAmount = totalPurchaseCost, DeliveryExpressFreight = totalDeliveryExpressFreight, CreateTime = DateTime.Now, - IsManualEdited = true + IsManualEdited = true, + IsEstimateCost = false }; //orderCost.PlatformCommissionAmount = dbOrder.OrderSellerPrice * orderCost.PlatformCommissionRatio; //orderCost.Profit = dbOrder.OrderSellerPrice + @@ -767,6 +787,7 @@ namespace BBWY.Server.Business // orderCost.PlatformCommissionAmount; orderCost.CalculationOrderProfitAndCost(dbOrder, dbAfterSaleOrderList); orderCost.IsManualEdited = true; + orderCost.IsEstimateCost = false; updateOrderCost = fsql.Update().SetSource(orderCost); } @@ -855,6 +876,7 @@ namespace BBWY.Server.Business } else { + orderCost.IsEstimateCost = false; orderCost.SDCommissionAmount = sdCalculationCostRequest.SDCommissionAmount; orderCost.SDOrderAmount = sdCalculationCostRequest.SDOrderAmount; orderCost.DeliveryExpressFreight = sdCalculationCostRequest.DeliveryExpressFreight; @@ -866,6 +888,7 @@ namespace BBWY.Server.Business fsql.Transaction(() => { + fsql.Update().Set(ocd => ocd.IsEnabled, false).Where(ocd => ocd.OrderId == sdCalculationCostRequest.OrderId).ExecuteAffrows(); orderUpdate?.ExecuteAffrows(); updateOrderCost?.ExecuteAffrows(); insertOrderCost?.ExecuteAffrows(); @@ -948,7 +971,8 @@ namespace BBWY.Server.Business //SingleOperationAmount = 0, SingleInStorageAmount = 0, SingleOutStorageAmount = 0, - SingleStorageAmount = 0, + SinglePackagingLaborAmount = 0M, + //SingleStorageAmount = 0, SingleSkuAmount = relationOrderSku.SingleSkuAmount, SingleDeliveryFreight = 0 }; @@ -972,7 +996,8 @@ namespace BBWY.Server.Business PurchaseFreight = odsRequest.PurchaseFreight / odsRequest.RelationPurchaseOrderSkuList.Count(), SkuAmount = relationOrderSku.SingleSkuAmount * relationOrderSku.Quantity, SkuId = relationOrderSku.SkuId, - StorageAmount = 0, + PackagingLaborAmount = 0, + //StorageAmount = 0, //TotalCost = relationOrderSku.SingleSkuAmount * relationOrderSku.Quantity + odsRequest.PurchaseFreight / odsRequest.RelationPurchaseOrderSkuList.Count(), //UnitCost = purchaseOrder.UnitCost, PurchaseOrderPKId = purchaseOrder.Id @@ -1006,14 +1031,17 @@ namespace BBWY.Server.Business if (orderCost != null) { orderCost.PlatformCommissionRatio = relationPurchaseOrderRequestV2.PlatformCommissionRatio; - orderCost.PlatformCommissionAmount = dbOrder.OrderSellerPrice * 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; + orderCost.CalculationOrderProfitAndCost(dbOrder, null); + //orderCost.Profit = dbOrder.OrderSellerPrice + + // dbOrder.FreightPrice - + // orderCost.PurchaseAmount - + // orderCost.DeliveryExpressFreight - + // orderCost.PlatformCommissionAmount; + orderCost.IsEstimateCost = false; + orderCost.IsManualEdited = true; updateOrderCost = fsql.Update().SetSource(orderCost).IgnoreColumns(oc => new { oc.CreateTime, @@ -1036,16 +1064,15 @@ namespace BBWY.Server.Business SDCommissionAmount = 0, SDOrderAmount = 0, PurchaseAmount = totalPurchaseAmount, - PlatformCommissionAmount = dbOrder.OrderSellerPrice * relationPurchaseOrderRequestV2.PlatformCommissionRatio, PreferentialAmount = preferentialAmount, IsManualEdited = true }; - - orderCost.Profit = dbOrder.OrderSellerPrice + - dbOrder.FreightPrice - - orderCost.PurchaseAmount - - orderCost.DeliveryExpressFreight - - orderCost.PlatformCommissionAmount; + orderCost.CalculationOrderProfitAndCost(dbOrder, null); + //orderCost.Profit = dbOrder.OrderSellerPrice + + // dbOrder.FreightPrice - + // orderCost.PurchaseAmount - + // orderCost.DeliveryExpressFreight - + // orderCost.PlatformCommissionAmount; insertOrderCost = fsql.Insert(orderCost); } #endregion diff --git a/BBWY.Server.Business/PlatformSDK/JDBusiness.cs b/BBWY.Server.Business/PlatformSDK/JDBusiness.cs index f080ddf6..e179ae9d 100644 --- a/BBWY.Server.Business/PlatformSDK/JDBusiness.cs +++ b/BBWY.Server.Business/PlatformSDK/JDBusiness.cs @@ -125,12 +125,49 @@ namespace BBWY.Server.Business private string GetSkuTitle(JToken s) { - var title = s["saleAttrs"] != null ? string.Join("-", s["saleAttrs"].Select(a => a["attrValueAlias"][0].ToString())) : string.Empty; - if (!string.IsNullOrEmpty(title) && title.Contains("id") && title.Contains("value")) + if (s["saleAttrs"] == null) + throw new BusinessException($"{s["skuId"]}没有名字"); + StringBuilder titleBuilder = new StringBuilder(); + List attrValueAliasList = new List(); + + attrValueAliasList.AddRange(s["saleAttrs"].Select(a => a["attrValueAlias"][0].ToString())); + /* + [{\"unit\":\"\",\"valueId\":\"1120738\",\"id\":8488,\"value\":\"手动\"},{\"unit\":\"个\",\"id\":8489,\"value\":\"30\"},{\"unit\":\"\",\"id\":8490,\"value\":\"大号M416火焰红\"}]-8弹壳+40软弹+复位标靶AWM软弹枪 + */ + + foreach (var attrValueAlias in attrValueAliasList) { - title = string.Join("", JArray.Parse(title).Select(j => $"{j.Value("value")}{j.Value("unit")}")); + if (attrValueAlias.Contains("{") && attrValueAlias.Contains("}")) + { + titleBuilder.Append(string.Join(string.Empty, JArray.Parse(attrValueAlias).Select(j => $"{j.Value("value")}{j.Value("unit")}"))); + } + else + { + titleBuilder.Append(attrValueAlias); + } } - return title; + return titleBuilder.ToString(); + + //var title = s["saleAttrs"] != null ? string.Join("-", s["saleAttrs"].Select(a => a["attrValueAlias"][0].ToString())) : string.Empty; + //if (!string.IsNullOrEmpty(title) && title.Contains("id") && title.Contains("value")) + //{ + // if (title.Contains("]-[")) + // { + // title = title.Replace("]-[", "]^["); + // var titleArray = title.Split(new char[] { '^' }, StringSplitOptions.RemoveEmptyEntries); + // StringBuilder sb = new StringBuilder(); + // foreach (var titleStr in titleArray) + // { + // sb.Append(string.Join("", JArray.Parse(titleStr).Select(j => $"{j.Value("value")}{j.Value("unit")}"))); + // } + // title = sb.ToString(); + // } + // else + // { + // title = string.Join("", JArray.Parse(title).Select(j => $"{j.Value("value")}{j.Value("unit")}")); + // } + //} + //return title; } public override IList GetProductSkuList(SearchProductSkuRequest searchProductSkuRequest) @@ -1011,7 +1048,7 @@ namespace BBWY.Server.Business // } // colorSaleAttrs = colorProperty["attrValueList"].ToList(); //} - List strutsSaleAttrValueList = new List(); + List> strutsSaleAttrValueList = new List>(); var isStruts = false; { var req = new CategoryReadFindSaleAttrTemplatesRequest(); @@ -1053,20 +1090,95 @@ namespace BBWY.Server.Business attrId = tempDataJToken.Value("attrId"); var tempDataValuesJToken = JObject.Parse(tempDataJToken["valueRules"].ToString()); var tempDataValues_Level1_JToken = tempDataValuesJToken["items"][0]; - if (tempDataValues_Level1_JToken["properties"]["id"]["type"].ToString() == "model") + if (tempDataValuesJToken["items"].Count() == 3 && + tempDataValuesJToken["items"][0]["properties"]["id"]["type"].ToString() == "model" && + tempDataValuesJToken["items"][1]["properties"]["id"]["type"].ToString() == "number" && + tempDataValuesJToken["items"][1]["properties"]["value"]["type"].ToString() == "number" && + tempDataValuesJToken["items"][2]["properties"]["id"]["type"].ToString() == "number" && + tempDataValuesJToken["items"][2]["properties"]["value"]["type"].ToString() == "string") + { + var f_id = int.Parse(tempDataValuesJToken["items"][0]["properties"]["id"]["enum"][0].ToString()); + var f_tempJarray = tempDataValuesJToken["items"][0]["properties"]["value"]["enum"][0]["preprocessingSaleAttrValTemplateValueList"] as JArray; + var f_value = f_tempJarray.FirstOrDefault().Value("name"); + var f_valueId = f_tempJarray.FirstOrDefault().Value("id"); + + var s_id = int.Parse(tempDataValuesJToken["items"][1]["properties"]["id"]["enum"][0].ToString()); + var s_unit = tempDataValuesJToken["items"][1]["properties"]["unit"]["enum"][0].ToString(); + //var s_value = "1"; + + var t_id = int.Parse(tempDataValuesJToken["items"][2]["properties"]["id"]["enum"][0].ToString()); + var t_value = "待替换的备注"; + + for (var i = 0; i < request.GiftTemplateSkuList.Count(); i++) + { + strutsSaleAttrValueList.Add(new List() + { + new AttrValueAliasJson() + { + id = f_id, + value = f_value, + valueId = f_valueId, + unit = string.Empty + }, + new AttrValueAliasJson() + { + id = s_id, + value = "1", + unit = s_unit + }, + new AttrValueAliasJson() + { + id = t_id, + value = t_value, + isReName = true + } + }); + } + } + else if (tempDataValues_Level1_JToken["properties"]["id"]["type"].ToString() == "model") { //[{\"id\":5,\"unit\":\"\",\"value\":\"红色\","valueId":1234567}] var tempJarray = tempDataValues_Level1_JToken["properties"]["value"]["enum"][0]["preprocessingSaleAttrValTemplateValueList"] as JArray; - strutsSaleAttrValueList.AddRange(tempJarray.Select(j => new AttrValueAliasJson + strutsSaleAttrValueList.AddRange(tempJarray.Select(j => new List() { - id = int.Parse(tempDataValues_Level1_JToken["properties"]["id"]["enum"][0].ToString()), - value = j.Value("name"), - valueId = j.Value("id"), - unit = string.Empty + new AttrValueAliasJson + { + id = int.Parse(tempDataValues_Level1_JToken["properties"]["id"]["enum"][0].ToString()), + value = j.Value("name"), + valueId = j.Value("id"), + unit = string.Empty, + isReName = true + } })); } + else if (tempDataValues_Level1_JToken["properties"]["id"]["type"].ToString() == "number" && + tempDataValues_Level1_JToken["properties"]["value"]["type"].ToString() == "number" && + tempDataValuesJToken["items"][1]["properties"]["id"]["type"].ToString() == "number" && + tempDataValuesJToken["items"][1]["properties"]["value"]["type"].ToString() == "string") + { + var f_id = int.Parse(tempDataValues_Level1_JToken["properties"]["id"]["enum"][0].ToString()); + var f_unit = tempDataValues_Level1_JToken["properties"]["unit"]["enum"][0].ToString(); + var s_id = int.Parse(tempDataValuesJToken["items"][1]["properties"]["id"]["enum"][0].ToString()); + + strutsSaleAttrValueList.AddRange(request.GiftTemplateSkuList.Select(x => new List() + { + new AttrValueAliasJson() + { + id = f_id, + value = "1", + unit = f_unit + }, + new AttrValueAliasJson() + { + id = s_id, + value = "待替换的备注", + isReName = true + } + })); + + } else - throw new BusinessException($"不支持的properties.id.type {tempDataValues_Level1_JToken["properties"]["id"]["type"]}"); + throw new BusinessException($"不支持的properties.id.type {tempDataValues_Level1_JToken["properties"]["id"]["type"]} 或取其分支情况"); } } #endregion @@ -1131,9 +1243,9 @@ namespace BBWY.Server.Business var attrValueAlias = string.Empty; if (isStruts) { - var value = strutsSaleAttrValueList[skuIndex]; - value.value = giftSku.Title; - attrValueAlias = JsonConvert.SerializeObject(new object[] { value }); + var values = strutsSaleAttrValueList[skuIndex]; + values.FirstOrDefault(v => v.isReName).value = giftSku.Title; + attrValueAlias = JsonConvert.SerializeObject(values); } else { diff --git a/BBWY.Server.Business/PurchaseOrder/PurchaseOrderBusiness.cs b/BBWY.Server.Business/PurchaseOrder/PurchaseOrderBusiness.cs index ca2b873d..5ac3f230 100644 --- a/BBWY.Server.Business/PurchaseOrder/PurchaseOrderBusiness.cs +++ b/BBWY.Server.Business/PurchaseOrder/PurchaseOrderBusiness.cs @@ -94,9 +94,10 @@ namespace BBWY.Server.Business .Set(po => po.SingleFirstFreight, editPurchaseOrderRequest.SingleFirstFreight) .Set(po => po.SingleInStorageAmount, editPurchaseOrderRequest.SingleInStorageAmount) .Set(po => po.SingleOutStorageAmount, editPurchaseOrderRequest.SingleOutStorageAmount) - .Set(po => po.SingleRefundInStorageAmount, editPurchaseOrderRequest.SingleRefundInStorageAmount) + //.Set(po => po.SingleRefundInStorageAmount, editPurchaseOrderRequest.SingleRefundInStorageAmount) .Set(po => po.SingleConsumableAmount, editPurchaseOrderRequest.SingleConsumableAmount) - .Set(po => po.SingleStorageAmount, editPurchaseOrderRequest.SingleStorageAmount) + //.Set(po => po.SingleStorageAmount, editPurchaseOrderRequest.SingleStorageAmount) + .Set(po => po.SinglePackagingLaborAmount, editPurchaseOrderRequest.SinglePackagingLaborAmount) .Set(po => po.SingleDeliveryFreight, editPurchaseOrderRequest.SingleDeliveryFreight) .ExecuteAffrows(); } @@ -131,6 +132,33 @@ namespace BBWY.Server.Business throw new BusinessException("订单不存在"); if (dbOrder.OrderState != Enums.OrderState.等待采购 && dbOrder.OrderState != Enums.OrderState.待出库) throw new BusinessException("只能为等待采购或待出库的订单进行采购"); + if (createOnlinePurchaseOrderRequest.CargoParamList == null || createOnlinePurchaseOrderRequest.CargoParamList.Count() == 0) + throw new BusinessException("缺少下单参数"); + + //拦截不要属于当前订单的请求 + var orderSkus = fsql.Select().Where(osku => osku.Price != 0 && osku.OrderId == createOnlinePurchaseOrderRequest.OrderId).ToList(); + + if (createOnlinePurchaseOrderRequest.CargoParamList.Any(c => !orderSkus.Any(osku => osku.SkuId == c.BelongSkuId))) + { + nLogManager.Default().Info($"NewFastCreateOrder\r\n非法请求\r\n{JsonConvert.SerializeObject(createOnlinePurchaseOrderRequest)}"); + //移除不属于当前订单的采购配件 + for (var i = 0; i < createOnlinePurchaseOrderRequest.CargoParamList.Count(); i++) + { + var cp = createOnlinePurchaseOrderRequest.CargoParamList[i]; + if (!orderSkus.Any(osku => osku.SkuId == cp.BelongSkuId)) + { + createOnlinePurchaseOrderRequest.CargoParamList.RemoveAt(i); + i--; + } + } + + if (createOnlinePurchaseOrderRequest.CargoParamList.Count() == 0) + throw new BusinessException("经过采购配件的订单sku归属关系过滤之后,剩余采购配件数量为0,请先联系技术人员排查问题之后再手动关联"); + + //throw new BusinessException("非法sku参数,下单sku中存在不属于该笔订单的sku"); + } + + var oldPourchaseIdList = fsql.Select().Where(ocd => ocd.OrderId == dbOrder.Id) .ToList(ocd => ocd.PurchaseOrderPKId); @@ -138,7 +166,6 @@ namespace BBWY.Server.Business var deletePurchaseOrder = fsql.Delete().Where(po => oldPourchaseIdList.Contains(po.Id)); var deleteOrderCostDetail = fsql.Delete().Where(ocd => ocd.OrderId == dbOrder.Id); var isRepurchase = fsql.Select(dbOrder.Id).Any(); - var orderSkus = fsql.Select().Where(osku => osku.Price != 0 && osku.OrderId == createOnlinePurchaseOrderRequest.OrderId).ToList(); var orderSkuIds = orderSkus.Select(osku => osku.Id).ToList(); #region 合并重复的采购sku @@ -218,7 +245,8 @@ namespace BBWY.Server.Business SingleConsumableAmount = 0, SingleDeliveryFreight = 0, SingleFirstFreight = 0, - SingleStorageAmount = 0, + SinglePackagingLaborAmount = 0, + //SingleStorageAmount = 0, //SingleOperationAmount = 0, SingleOutStorageAmount = 0, SingleInStorageAmount = 0, @@ -259,7 +287,8 @@ namespace BBWY.Server.Business PurchaseOrderPKId = purchaseOrder.Id, SkuAmount = currentOrderSkuProductAmount, SkuId = orderSku.SkuId, - StorageAmount = 0, + //StorageAmount = 0, + IsEstimateCost = false, //UnitCost = purchaseOrder.UnitCost, //TotalCost = currentOrderSkuProductAmount + currentOrderSkuFreightAmount//purchaseOrder.UnitCost * orderSku.ItemTotal.Value }; @@ -291,7 +320,8 @@ namespace BBWY.Server.Business PreferentialAmount = dbOrder.PreferentialAmount, SDCommissionAmount = 0, SDOrderAmount = 0, - PurchaseAmount = purchaseOrderSimpleInfo.TotalAmount + PurchaseAmount = purchaseOrderSimpleInfo.TotalAmount, + IsEstimateCost = false }; //orderCost.PlatformCommissionAmount = dbOrder.OrderSellerPrice * orderCost.PlatformCommissionRatio; //orderCost.Profit = dbOrder.OrderSellerPrice + @@ -649,7 +679,7 @@ namespace BBWY.Server.Business #region 查询成本明细 currentProgress = "查询成本明细"; - var orderCostDetailList = fsql.Select().Where(ocd => ocd.OrderId == orderDropshipping.OrderId).ToList(); + var orderCostDetailList = fsql.Select().Where(ocd => ocd.OrderId == orderDropshipping.OrderId && ocd.IsEnabled == true).ToList(); if (orderCostDetailList == null || orderCostDetailList.Count() == 0) throw new BusinessException("订单成本明细不存在"); #endregion diff --git a/BBWY.Server.Business/PurchaseScheme/PurchaseProductAPIService.cs b/BBWY.Server.Business/PurchaseScheme/PurchaseProductAPIService.cs index 3387715b..51b8c2ee 100644 --- a/BBWY.Server.Business/PurchaseScheme/PurchaseProductAPIService.cs +++ b/BBWY.Server.Business/PurchaseScheme/PurchaseProductAPIService.cs @@ -25,6 +25,9 @@ namespace BBWY.Server.Business private string qtAppId = "BBWY2023022001"; private string qtAppSecret = "908e131365d5448ca651ba20ed7ddefe"; + private List locationIdList; + private List priceIdList; + private TimeSpan purchaseProductCacheTimeSpan; //private TimeSpan _1688SessionIdTimeSpan; @@ -40,7 +43,7 @@ namespace BBWY.Server.Business this.restApiService = restApiService; _1688ProductDetailRequestHeader = new Dictionary() { - { "Host","detail.1688.com"}, + //{ "Host","detail.1688.com"}, { "User-Agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.5112.102 Safari/537.36 Edg/104.0.1293.70"}, { "Accept","text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9"}, { "Accept-Encoding","gzip, deflate, br"}, @@ -48,6 +51,17 @@ namespace BBWY.Server.Business }; purchaseProductCacheTimeSpan = TimeSpan.FromDays(1); this.quanTanProductClient = quanTanProductClient; + locationIdList = new List() + { + "300252630336272", + "1081181309101", + "16347413030323" + }; + priceIdList = new List() { + "300252630336263", + "1081181309582", + "16347413030316" + }; } public PurchaseSkuBasicInfoResponse GetProductInfo(PurchaseSkuBasicInfoRequest request) @@ -193,12 +207,13 @@ namespace BBWY.Server.Business $"clickid={Guid.NewGuid().ToString().Md5Encrypt()}&sessionid={Guid.NewGuid().ToString().Md5Encrypt()}&sk={(request.PriceMode == Enums.PurchaseOrderMode.批发 ? "order" : "consign")}", _1688ProductDetailRequestHeader, HttpMethod.Get, - httpClientName: "gzip"); + httpClientName: "gzip", + getResponseHeader: true); if (_1688pageResult.StatusCode != System.Net.HttpStatusCode.OK) return null; - var match = Regex.Match(_1688pageResult.Content, @"(window\.__INIT_DATA=)(.*)(\r*\n*\s*)"); + var match = Regex.Match(_1688pageResult.Content, @"(window\.__INIT_DATA\s?=)(.*)(\r*\n*\s*)"); if (!match.Success) return null; @@ -209,12 +224,16 @@ namespace BBWY.Server.Business var purchaser = new Purchaser() { Id = jobject["globalData"]["tempModel"]["sellerUserId"].ToString(), - Name = jobject["globalData"]["tempModel"]["companyName"].ToString(), - Location = jobject["data"]["1081181309101"] != null ? - jobject["data"]["1081181309101"]["data"]["location"].ToString() : - jobject["data"]["16347413030323"]["data"]["location"].ToString(), - Platform = Enums.Platform.阿里巴巴 + Name = jobject["globalData"]["tempModel"]["companyName"].ToString() }; + foreach (var lid in locationIdList) + { + if (jobject["data"][lid] != null) + { + purchaser.Location = jobject["data"][lid]["data"]["location"].ToString(); + break; + } + } var colorsProperty = jobject["globalData"]["skuModel"]["skuProps"].FirstOrDefault(j => j.Value("fid") == 3216 || j.Value("fid") == 1627207 || @@ -227,9 +246,15 @@ namespace BBWY.Server.Business imageUrl = j.Value("imageUrl") }).ToList(); - var firstPrice = jobject["data"]["1081181309582"] != null ? - jobject["data"]["1081181309582"]["data"]["priceModel"]["currentPrices"][0].Value("price") : - jobject["data"]["16347413030316"]["data"]["priceModel"]["currentPrices"][0].Value("price"); + var firstPrice = 0M; + foreach (var pid in priceIdList) + { + if (jobject["data"][pid] != null) + { + firstPrice = jobject["data"][pid]["data"]["priceModel"]["currentPrices"][0].Value("price"); + break; + } + } var list = new List(); @@ -246,7 +271,7 @@ namespace BBWY.Server.Business { PurchaseProductId = request.PurchaseProductId, Price = skuPrice == 0M ? firstPrice : skuPrice, - Title = name, + Title = matchName, //name PurchaseSkuId = value.Value("skuId"), PurchaseSkuSpecId = value.Value("specId"), Logo = colorsProperty.FirstOrDefault(c => c.name == matchName)?.imageUrl ?? "pack://application:,,,/Resources/Images/defaultItem.png" diff --git a/BBWY.Server.Business/ServiceOrder/ServiceOrderBusiness.cs b/BBWY.Server.Business/ServiceOrder/ServiceOrderBusiness.cs index 44fd5375..a917172d 100644 --- a/BBWY.Server.Business/ServiceOrder/ServiceOrderBusiness.cs +++ b/BBWY.Server.Business/ServiceOrder/ServiceOrderBusiness.cs @@ -148,7 +148,7 @@ namespace BBWY.Server.Business dbso.FirstFreight = dbOrderCostDetail.FirstFreight; dbso.ReissueProductAmount = dbOrderCostDetail.SkuAmount; dbso.ReissueFreight = dbOrderCostDetail.PurchaseFreight; - dbso.StorageAmount = dbOrderCostDetail.StorageAmount; + //dbso.StorageAmount = dbOrderCostDetail.StorageAmount; dbso.InStorageAmount = dbOrderCostDetail.InStorageAmount; dbso.OutStorageAmount = dbOrderCostDetail.OutStorageAmount; } diff --git a/BBWY.Server.Business/Statistics/StatisticsBusiness.cs b/BBWY.Server.Business/Statistics/StatisticsBusiness.cs index 79677e74..66ac0bf4 100644 --- a/BBWY.Server.Business/Statistics/StatisticsBusiness.cs +++ b/BBWY.Server.Business/Statistics/StatisticsBusiness.cs @@ -9,6 +9,7 @@ using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Linq; +using System.Net.Http.Headers; using Yitter.IdGenerator; namespace BBWY.Server.Business @@ -19,11 +20,18 @@ namespace BBWY.Server.Business private FreeSqlMultiDBManager freeSqlMultiDBManager; private RestApiService restApiService; + private List filterExceptionStateList; + public StatisticsBusiness(IFreeSql fsql, NLogManager nLogManager, IIdGenerator idGenerator, FreeSqlMultiDBManager freeSqlMultiDBManager, RestApiService restApiService) : base(fsql, nLogManager, idGenerator) { invalidOrderStateList = new List() { Enums.OrderState.待付款, Enums.OrderState.已取消 }; this.freeSqlMultiDBManager = freeSqlMultiDBManager; this.restApiService = restApiService; + filterExceptionStateList = new List() { + Enums.OrderState.等待采购, + Enums.OrderState.待付款, + Enums.OrderState.已取消 + }; } public OrderAchievementResponse GetOrderAchievementStatistics(OrderAchievementRequest request) @@ -364,6 +372,8 @@ namespace BBWY.Server.Business { //startDate = startDate.Date; //endDate = endDate.Date.AddDays(1).AddSeconds(-1); + + var dt = DateTime.Parse("2022-05-01"); var afterDt = DateTime.Parse("2022-10-01"); var response = new OrderCountStatisticsResponse(); @@ -372,12 +382,15 @@ namespace BBWY.Server.Business o.OrderState == Enums.OrderState.等待采购 && o.StartTime >= dt).Count(); response.ExceptionCount = fsql.Select().LeftJoin((o, oc) => o.Id == oc.OrderId) - .Where((o, oc) => o.ShopId == shopId && o.StartTime >= dt && + .Where((o, oc) => o.ShopId == shopId && + o.StartTime >= dt && o.IsGift == false && - o.OrderState != Enums.OrderState.已取消 && - ((o.StorageType != Enums.StorageType.SD && o.StorageType != null && oc.PurchaseAmount == 0M) || - (o.StorageType != Enums.StorageType.SD && oc.PurchaseAmount + oc.DeliveryExpressFreight > o.OrderSellerPrice + o.FreightPrice + o.PingTaiChengDanYouHuiQuan) || - (o.StorageType == null && o.OrderState != Enums.OrderState.等待采购))).Count(); + ((o.OrderState != Enums.OrderState.已取消 && + o.StorageType != Enums.StorageType.SD && + o.StorageType != null && + (oc.PurchaseAmount == 0M || oc.Profit < 0)) || + (o.StorageType == null && + !filterExceptionStateList.Contains(o.OrderState)))).Count(); response.WaitOutStoreCount = fsql.Select().Where(o => o.ShopId == shopId && o.OrderState == Enums.OrderState.待出库 && o.StartTime >= dt && o.IsGift == false).Count(); diff --git a/BBWY.Server.Business/Sync/JD/JDPopularizeReportFormAdGroupLevelSyncBusiness.cs b/BBWY.Server.Business/Sync/JD/JDPopularizeReportFormAdGroupLevelSyncBusiness.cs index a592b94d..7e1bc996 100644 --- a/BBWY.Server.Business/Sync/JD/JDPopularizeReportFormAdGroupLevelSyncBusiness.cs +++ b/BBWY.Server.Business/Sync/JD/JDPopularizeReportFormAdGroupLevelSyncBusiness.cs @@ -132,6 +132,7 @@ namespace BBWY.Server.Business.Sync var insertList = new List(); foreach (var j in jArray) { + var r0 = j["retrievalType0"]; insertList.Add(new JDPopularizeAdGroup() { Id = idGenerator.NewLong(), @@ -142,11 +143,38 @@ namespace BBWY.Server.Business.Sync AdGroupId = j.Value("adGroupId"), AdGroupName = j.Value("adGroupName"), Date = DateTime.ParseExact(j.Value("date"), "yyyyMMdd", System.Globalization.CultureInfo.CurrentCulture), - Cost = j["retrievalType0"].Value("cost"), - Clicks = j["retrievalType0"].Value("clicks") ?? 0, - Impressions = j["retrievalType0"].Value("impressions") ?? 0, - TotalCartCnt = j["retrievalType0"].Value("totalCartCnt") ?? 0, - TotalOrderCnt = j["retrievalType0"].Value("totalOrderCnt") ?? 0 + Cost = r0.Value("cost"), + Clicks = r0.Value("clicks") ?? 0, + Impressions = r0.Value("impressions") ?? 0, + TotalCartCnt = r0.Value("totalCartCnt") ?? 0, + TotalOrderCnt = r0.Value("totalOrderCnt") ?? 0, + TotalOrderCVS = r0.Value("totalOrderCVS") ?? 0M, + CouponCnt = r0.Value("couponCnt") ?? 0, + CPA = r0.Value("CPA") ?? 0.00M, + CPC = r0.Value("CPC") ?? 0.00M, + CPM = r0.Value("CPM") ?? 0.00M, + CTR = r0.Value("CTR") ?? 0.00M, + DepthPassengerCnt = r0.Value("depthPassengerCnt") ?? 0, + DirectCartCnt = r0.Value("directCartCnt") ?? 0, + DirectOrderCnt = r0.Value("directOrderCnt") ?? 0, + DirectOrderSum = r0.Value("directOrderSum") ?? 0M, + GoodsAttentionCnt = r0.Value("goodsAttentionCnt") ?? 0, + IndirectCartCnt = r0.Value("indirectCartCnt") ?? 0, + IndirectOrderCnt = r0.Value("indirectOrderCnt") ?? 0, + IndirectOrderSum = r0.Value("indirectOrderSum") ?? 0, + NewCustomersCnt = r0.Value("newCustomersCnt") ?? 0, + OrderDate = DateTime.ParseExact(r0.Value("orderDate"), "yyyyMMdd", System.Globalization.CultureInfo.CurrentCulture), + Pin = r0.Value("pin"), + PreorderCnt = r0.Value("preorderCnt") ?? 0, + ShopAttentionCnt = r0.Value("shopAttentionCnt") ?? 0, + TotalCartCost = r0.Value("totalCartCost") ?? 0M, + TotalOrderROI = r0.Value("totalOrderROI") ?? 0M, + TotalOrderSum = r0.Value("totalOrderSum") ?? 0M, + TotalPresaleOrderCnt = r0.Value("totalPresaleOrderCnt") ?? 0, + TotalPresaleOrderSum = r0.Value("totalPresaleOrderSum") ?? 0M, + VisitorCnt = r0.Value("visitorCnt") ?? 0, + VisitPageCnt = r0.Value("visitPageCnt") ?? 0, + VisitTimeAverage = r0.Value("visitTimeAverage") ?? 0M }); } if (insertList.Count > 0) diff --git a/BBWY.Server.Business/Sync/JD/JDPopularizeReportFormAdLevelSyncBusiness.cs b/BBWY.Server.Business/Sync/JD/JDPopularizeReportFormAdLevelSyncBusiness.cs index 00e3594b..03cc414f 100644 --- a/BBWY.Server.Business/Sync/JD/JDPopularizeReportFormAdLevelSyncBusiness.cs +++ b/BBWY.Server.Business/Sync/JD/JDPopularizeReportFormAdLevelSyncBusiness.cs @@ -159,7 +159,7 @@ namespace BBWY.Server.Business.Sync nLogManager.GetLogger($"创意维度-{shopName}").Info($"创意名称识别失败 adId {adId} adName {adName} 提取的[sku]与创意Id相同"); continue; } - + var r0 = j["retrievalType0"]; insertList.Add(new JDPopularizeAdSku() { Id = idGenerator.NewLong(), @@ -170,15 +170,44 @@ namespace BBWY.Server.Business.Sync AdGroupId = j.Value("adGroupId"), AdId = long.Parse(adId), AdName = adName, - Date = DateTime.ParseExact(j.Value("date"), "yyyyMMdd", System.Globalization.CultureInfo.CurrentCulture), - Cost = j["retrievalType0"].Value("cost"), - Clicks = j["retrievalType0"].Value("clicks") ?? 0, - Impressions = j["retrievalType0"].Value("impressions") ?? 0, - TotalCartCnt = j["retrievalType0"].Value("totalCartCnt") ?? 0, - TotalOrderCnt = j["retrievalType0"].Value("totalOrderCnt") ?? 0, + Date = DateTime.ParseExact(r0.Value("date"), "yyyyMMdd", System.Globalization.CultureInfo.CurrentCulture), + Cost = r0.Value("cost"), + Clicks = r0.Value("clicks") ?? 0, + Impressions = r0.Value("impressions") ?? 0, + TotalCartCnt = r0.Value("totalCartCnt") ?? 0, + TotalOrderCnt = r0.Value("totalOrderCnt") ?? 0, Sku = sku, - VisitorCnt = j["retrievalType0"].Value("visitorCnt") ?? 0, - TotalOrderSum = j["retrievalType0"].Value("totalOrderSum") + VisitorCnt = r0.Value("visitorCnt") ?? 0, + TotalOrderSum = r0.Value("totalOrderSum"), + TotalOrderCVS = r0.Value("totalOrderCVS") ?? 0M, + CouponCnt = r0.Value("couponCnt") ?? 0, + CPA = r0.Value("CPA") ?? 0.00M, + CPC = r0.Value("CPC") ?? 0.00M, + CPM = r0.Value("CPM") ?? 0.00M, + CTR = r0.Value("CTR") ?? 0.00M, + DepthPassengerCnt = r0.Value("depthPassengerCnt") ?? 0, + DirectCartCnt = r0.Value("directCartCnt") ?? 0, + DirectOrderCnt = r0.Value("directOrderCnt") ?? 0, + DirectOrderSum = r0.Value("directOrderSum") ?? 0M, + GoodsAttentionCnt = r0.Value("goodsAttentionCnt") ?? 0, + IndirectCartCnt = r0.Value("indirectCartCnt") ?? 0, + IndirectOrderCnt = r0.Value("indirectOrderCnt") ?? 0, + IndirectOrderSum = r0.Value("indirectOrderSum") ?? 0, + NewCustomersCnt = r0.Value("newCustomersCnt") ?? 0, + OrderDate = DateTime.ParseExact(r0.Value("orderDate"), "yyyyMMdd", System.Globalization.CultureInfo.CurrentCulture), + Pin = r0.Value("pin"), + PreorderCnt = r0.Value("preorderCnt") ?? 0, + ShopAttentionCnt = r0.Value("shopAttentionCnt") ?? 0, + TotalCartCost = r0.Value("totalCartCost") ?? 0M, + TotalOrderROI = r0.Value("totalOrderROI") ?? 0M, + TotalPresaleOrderCnt = r0.Value("totalPresaleOrderCnt") ?? 0, + TotalPresaleOrderSum = r0.Value("totalPresaleOrderSum") ?? 0M, + VisitPageCnt = r0.Value("visitPageCnt") ?? 0, + VisitTimeAverage = r0.Value("visitTimeAverage") ?? 0M, + AdCreativeType = r0.Value("adCreativeType"), + AdCustomTitle = r0.Value("adCustomTitle"), + MaterialId = r0.Value("MaterialId") ?? 0, + MaterialSize = r0.Value("materialSize"), }); //Console.WriteLine(insertList.Count()); } diff --git a/BBWY.Server.Business/Sync/JD/JDPopularizeReportFormCampaignLevelSyncBusiness.cs b/BBWY.Server.Business/Sync/JD/JDPopularizeReportFormCampaignLevelSyncBusiness.cs index 63eec634..ef9049e9 100644 --- a/BBWY.Server.Business/Sync/JD/JDPopularizeReportFormCampaignLevelSyncBusiness.cs +++ b/BBWY.Server.Business/Sync/JD/JDPopularizeReportFormCampaignLevelSyncBusiness.cs @@ -154,7 +154,38 @@ namespace BBWY.Server.Business.Sync Clicks = j.Value("clicks") ?? 0, Impressions = j.Value("impressions") ?? 0, TotalCartCnt = j.Value("totalCartCnt") ?? 0, - TotalOrderCnt = j.Value("totalOrderCnt") ?? 0 + TotalOrderCnt = j.Value("totalOrderCnt") ?? 0, + CampaignPutType = j.Value("campaignPutType"), + CampaignType = j.Value("campaignType"), + CampaignTypeExpand = j.Value("campaignTypeExpand"), + CouponCnt = j.Value("couponCnt") ?? 0, + CPA = j.Value("CPA") ?? 0.00M, + CPC = j.Value("CPC") ?? 0.00M, + CPM = j.Value("CPM") ?? 0.00M, + CTR = j.Value("CTR") ?? 0.00M, + DepthPassengerCnt = j.Value("depthPassengerCnt") ?? 0, + DirectCartCnt = j.Value("directCartCnt") ?? 0, + DirectOrderCnt = j.Value("directOrderCnt") ?? 0, + DirectOrderSum = j.Value("directOrderSum") ?? 0M, + GoodsAttentionCnt = j.Value("goodsAttentionCnt") ?? 0, + IndirectCartCnt = j.Value("indirectCartCnt") ?? 0, + IndirectOrderCnt = j.Value("indirectOrderCnt") ?? 0, + IndirectOrderSum = j.Value("indirectOrderSum") ?? 0, + NewCustomersCnt = j.Value("newCustomersCnt") ?? 0, + OrderDate = DateTime.ParseExact(j.Value("orderDate"), "yyyyMMdd", System.Globalization.CultureInfo.CurrentCulture), + Pin = j.Value("pin"), + PreorderCnt = j.Value("preorderCnt") ?? 0, + PutType = j.Value("putType"), + ShopAttentionCnt = j.Value("shopAttentionCnt") ?? 0, + TotalCartCost = j.Value("totalCartCost") ?? 0M, + TotalOrderCVS = j.Value("totalOrderCVS") ?? 0M, + TotalOrderROI = j.Value("totalOrderROI") ?? 0M, + TotalOrderSum = j.Value("totalOrderSum") ?? 0M, + TotalPresaleOrderCnt = j.Value("totalPresaleOrderCnt") ?? 0, + TotalPresaleOrderSum = j.Value("totalPresaleOrderSum") ?? 0M, + VisitorCnt = j.Value("visitorCnt") ?? 0, + VisitPageCnt = j.Value("visitPageCnt") ?? 0, + VisitTimeAverage = j.Value("visitTimeAverage") ?? 0M }); } if (insertList.Count > 0) diff --git a/BBWY.Server.Business/Sync/JD/JDPopularizeReportFormSkuLevelSyncBusiness.cs b/BBWY.Server.Business/Sync/JD/JDPopularizeReportFormSkuLevelSyncBusiness.cs index 4c7a957d..5f49a135 100644 --- a/BBWY.Server.Business/Sync/JD/JDPopularizeReportFormSkuLevelSyncBusiness.cs +++ b/BBWY.Server.Business/Sync/JD/JDPopularizeReportFormSkuLevelSyncBusiness.cs @@ -149,7 +149,33 @@ namespace BBWY.Server.Business.Sync TotalCartCnt = j.Value("totalCartCnt") ?? 0, TotalOrderCnt = j.Value("totalOrderCnt") ?? 0, TotalOrderSum = j.Value("totalOrderSum"), - VisitorCnt = 0 + VisitorCnt = 0, + CTR = j.Value("CTR") ?? 0.00M, + DepthPassengerCnt = j.Value("depthPassengerCnt") ?? 0, + CPM = j.Value("CPM") ?? 0.00M, + SkuBrandId = j.Value("skuBrandId"), + PreorderCnt = j.Value("preorderCnt") ?? 0, + IndirectOrderCnt = j.Value("indirectOrderCnt") ?? 0, + DirectOrderCnt = j.Value("directOrderCnt") ?? 0, + IndirectCartCnt = j.Value("indirectCartCnt") ?? 0, + VisitPageCnt = j.Value("visitPageCnt") ?? 0, + VisitTimeAverage = j.Value("visitTimeAverage") ?? 0M, + TotalPresaleOrderSum = j.Value("totalPresaleOrderSum") ?? 0M, + TotalCartCost = j.Value("totalCartCost") ?? 0M, + DirectCartCnt = j.Value("directCartCnt") ?? 0, + SkuCid3 = j.Value("skuCid3"), + CouponCnt = j.Value("couponCnt") ?? 0, + SkuBrandName = j.Value("skuBrandName"), + NewCustomersCnt = j.Value("newCustomersCnt") ?? 0, + TotalOrderROI = j.Value("totalOrderROI") ?? 0M, + IndirectOrderSum = j.Value("indirectOrderSum") ?? 0, + DirectOrderSum = j.Value("directOrderSum") ?? 0M, + GoodsAttentionCnt = j.Value("goodsAttentionCnt") ?? 0, + TotalOrderCVS = j.Value("totalOrderCVS") ?? 0M, + CPC = j.Value("CPC") ?? 0.00M, + TotalPresaleOrderCnt = j.Value("totalPresaleOrderCnt") ?? 0, + ShopAttentionCnt = j.Value("shopAttentionCnt") ?? 0, + OrderDate = DateTime.ParseExact(j.Value("orderDate"), "yyyyMMdd", System.Globalization.CultureInfo.CurrentCulture) }).ToList(); fsql.Insert(insertList).ExecuteAffrows(); } diff --git a/BBWY.Server.Business/Sync/OrderEstimateCostSyncBusiness.cs b/BBWY.Server.Business/Sync/OrderEstimateCostSyncBusiness.cs new file mode 100644 index 00000000..acd8133d --- /dev/null +++ b/BBWY.Server.Business/Sync/OrderEstimateCostSyncBusiness.cs @@ -0,0 +1,397 @@ +using BBWY.Common.Extensions; +using BBWY.Common.Models; +using BBWY.Server.Business.Extensions; +using BBWY.Server.Model; +using BBWY.Server.Model.Db; +using BBWY.Server.Model.Dto; +using FreeSql; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using Yitter.IdGenerator; + +namespace BBWY.Server.Business +{ + public class OrderEstimateCostSyncBusiness : BaseBusiness, IDenpendency + { + private TaskSchedulerManager taskSchedulerManager; + private VenderBusiness venderBusiness; + private List invalidOrderStateList; + public OrderEstimateCostSyncBusiness(IFreeSql fsql, + NLogManager nLogManager, + IIdGenerator idGenerator, + TaskSchedulerManager taskSchedulerManager, + VenderBusiness venderBusiness) : base(fsql, nLogManager, idGenerator) + { + this.taskSchedulerManager = taskSchedulerManager; + this.venderBusiness = venderBusiness; + invalidOrderStateList = new List() { + Enums.OrderState.待付款, + Enums.OrderState.已取消, + Enums.OrderState.暂停 + }; + } + + #region 同步SKU最近成本 + + public void SyncAllShopOrderSkuRecentCost() + { + var date = DateTime.Now.Date.AddDays(-1); + SyncOrderSkuRecentCost(new SkuRecentCostRequest() + { + ShopId = null, + StartDate = date, + EndDate = date + }); + } + + /// + /// 同步昨天SKU的采购成本 + /// + /// + public void SyncOrderSkuRecentCost(SkuRecentCostRequest request) + { + var shopList = venderBusiness.GetShopList(request.ShopId, Model.Enums.Platform.京东); + request.EndDate = request.EndDate.Date.AddDays(1).AddSeconds(-1); + foreach (var shop in shopList) + { + var _shopId = long.Parse(shop.ShopId); + Task.Factory.StartNew(() => SyncOrderSkuRecentCost(shop, request.StartDate, request.EndDate), CancellationToken.None, TaskCreationOptions.LongRunning, taskSchedulerManager.SyncSkuYesterdayCostTaskScheduler); + } + } + + private void SyncOrderSkuRecentCost(ShopResponse shop, DateTime startDate, DateTime endDate) + { + try + { + var shopId = long.Parse(shop.ShopId); + + + var yesterdaycostDetailist = fsql.Select() + .InnerJoin((ocd, o) => ocd.OrderId == o.Id) + .Where((ocd, o) => o.ShopId == shopId && + o.StartTime >= startDate && + o.StartTime <= endDate && + !invalidOrderStateList.Contains(o.OrderState) && + o.IsGift == false && + o.StorageType != Enums.StorageType.SD && + ocd.IsEnabled == true && + ocd.IsEstimateCost == false) + .GroupBy((ocd, o) => ocd.SkuId) + .WithTempQuery(g => new { MaxId = g.Max(g.Value.Item1.Id), SkuId = g.Key }) + .From() + .InnerJoin((ocd1, ocd2) => ocd1.MaxId == ocd2.Id) + .ToList((ocd1, ocd2) => ocd2); + Console.WriteLine($"SKU最近成本同步-{shop.ShopName},有销量的订单sku一共{yesterdaycostDetailist.Count()}个"); + if (yesterdaycostDetailist.Count() == 0) + return; + + var skuIdList = yesterdaycostDetailist.Select(ocd => ocd.SkuId).Distinct().ToList(); + var dbSkuRecentCostList = fsql.Select(skuIdList).ToList(); + + List insertSkuRecetCostList = new List(); + List> updateSkuRecentCostList = new List>(); + foreach (var yesocd in yesterdaycostDetailist) + { + var q = yesocd.DeductionQuantity; + if (q <= 0) + q = 1; + var singleConsumableAmount = yesocd.ConsumableAmount / q; + var singleDeliveryFreight = yesocd.DeliveryExpressFreight / q; + var singleFirstFreight = yesocd.FirstFreight / q; + var singleFreight = yesocd.PurchaseFreight / q; + var singleInStorageAmount = yesocd.InStorageAmount / q; + var singleOutStorageAmount = yesocd.OutStorageAmount / q; + var singleSkuAmount = yesocd.SkuAmount / q; + //var singleStorageAmount = yesocd.StorageAmount / q; + var singlePackagingLaborAmount = yesocd.PackagingLaborAmount / q; + + var skuRecentCost = dbSkuRecentCostList.FirstOrDefault(x => x.SkuId == yesocd.SkuId); + if (skuRecentCost != null) + { + if (skuRecentCost.SingleConsumableAmount != singleConsumableAmount || + skuRecentCost.SingleDeliveryFreight != singleDeliveryFreight || + skuRecentCost.SingleFirstFreight != singleFirstFreight || + skuRecentCost.SingleFreight != singleFreight || + skuRecentCost.SingleInStorageAmount != singleInStorageAmount || + skuRecentCost.SingleOutStorageAmount != singleOutStorageAmount || + skuRecentCost.SingleSkuAmount != singleSkuAmount || + skuRecentCost.SinglePackagingLaborAmount != singlePackagingLaborAmount) + //skuRecentCost.SingleStorageAmount != singleStorageAmount) + { + skuRecentCost.UpdateTime = DateTime.Now; + var update = fsql.Update(yesocd.SkuId) + .SetIf(skuRecentCost.SingleConsumableAmount != singleConsumableAmount, s => s.SingleConsumableAmount, singleConsumableAmount) + .SetIf(skuRecentCost.SingleDeliveryFreight != singleDeliveryFreight, s => s.SingleDeliveryFreight, singleDeliveryFreight) + .SetIf(skuRecentCost.SingleFirstFreight != singleFirstFreight, s => s.SingleFirstFreight, singleFirstFreight) + .SetIf(skuRecentCost.SingleFreight != singleFreight, s => s.SingleFreight, singleFreight) + .SetIf(skuRecentCost.SingleInStorageAmount != singleInStorageAmount, s => s.SingleInStorageAmount, singleInStorageAmount) + .SetIf(skuRecentCost.SingleOutStorageAmount != singleOutStorageAmount, s => s.SingleOutStorageAmount, singleOutStorageAmount) + .SetIf(skuRecentCost.SingleSkuAmount != singleSkuAmount, s => s.SingleSkuAmount, singleSkuAmount) + //.SetIf(skuRecentCost.SingleStorageAmount != singleStorageAmount, s => s.SingleStorageAmount, singleStorageAmount) + .SetIf(skuRecentCost.SinglePackagingLaborAmount != singlePackagingLaborAmount, s => s.SinglePackagingLaborAmount, singlePackagingLaborAmount) + .Set(s => s.UpdateTime, DateTime.Now); + updateSkuRecentCostList.Add(update); + } + } + else + { + skuRecentCost = new SkuRecentCost() + { + SkuId = yesocd.SkuId, + CreateTime = DateTime.Now, + UpdateTime = DateTime.Now, + ProductId = yesocd.ProductId, + RecentOrderId = yesocd.OrderId, + ShopId = shopId, + SingleConsumableAmount = singleConsumableAmount, + SingleDeliveryFreight = singleDeliveryFreight, + SingleFirstFreight = singleFirstFreight, + SingleFreight = singleFreight, + SingleInStorageAmount = singleInStorageAmount, + SingleOutStorageAmount = singleOutStorageAmount, + SingleSkuAmount = singleSkuAmount, + SinglePackagingLaborAmount = singlePackagingLaborAmount + //SingleStorageAmount = singleStorageAmount + }; + insertSkuRecetCostList.Add(skuRecentCost); + } + } + + if (insertSkuRecetCostList.Count() > 0) + { + var insertList = new List(); + var index = 0; + foreach (var insert in insertSkuRecetCostList) + { + insertList.Add(insert); + if (insertList.Count() == 50) + { + index++; + Console.WriteLine($"SKU最近成本同步-{shop.ShopName},执行插入{index}"); + fsql.Transaction(() => + { + fsql.Insert(insertList).ExecuteAffrows(); + }); + insertList.Clear(); + } + } + + if (insertList.Count() > 0) + { + index++; + Console.WriteLine($"SKU最近成本同步-{shop.ShopName},执行最后插入{index}"); + fsql.Transaction(() => + { + fsql.Insert(insertList).ExecuteAffrows(); + }); + insertList.Clear(); + } + insertSkuRecetCostList.Clear(); + } + + if (updateSkuRecentCostList.Count() > 0) + { + List> updateList = new List>(); + var index = 0; + foreach (var update in updateSkuRecentCostList) + { + updateList.Add(update); + if (updateList.Count == 20) + { + index++; + Console.WriteLine($"SKU最近成本同步-{shop.ShopName},执行更新{index}"); + fsql.Transaction(() => + { + foreach (var _update in updateList) + _update.ExecuteAffrows(); + }); + updateList.Clear(); + } + } + + if (updateList.Count > 0) + { + index++; + Console.WriteLine($"SKU最近成本同步-{shop.ShopName},执行最后更新{index}"); + fsql.Transaction(() => + { + foreach (var _update in updateList) + _update.ExecuteAffrows(); + }); + updateList.Clear(); + } + updateSkuRecentCostList.Clear(); + } + + //fsql.Transaction(() => + //{ + // if (insertSkuRecetCostList.Count() > 0) + // fsql.Insert(insertSkuRecetCostList).ExecuteAffrows(); + // if (updateSkuRecentCostList.Count() > 0) + // { + // foreach (var update in updateSkuRecentCostList) + // update.ExecuteAffrows(); + // } + //}); + } + catch (Exception ex) + { + Console.WriteLine($"{shop.ShopName},{ex.Message}"); + nLogManager.GetLogger($"SKU最近成本-{shop.ShopName}").Error(ex); + } + } + + #endregion + + #region 预估成本 + public void EstimateCostForAllShopNoCostOrder() + { + EstimateCostForNoCostOrder(new SkuRecentCostRequest() + { + ShopId = null, + StartDate = DateTime.Now.AddHours(-3), + EndDate = DateTime.Now + }); + } + + public void EstimateCostForNoCostOrder(SkuRecentCostRequest request) + { + var shopList = venderBusiness.GetShopList(request.ShopId, Model.Enums.Platform.京东); + //request.EndDate = request.EndDate.Date.AddDays(1).AddSeconds(-1); + foreach (var shop in shopList) + { + Task.Factory.StartNew(() => EstimateCostForNoCostOrder(shop, request.StartDate, request.EndDate), CancellationToken.None, TaskCreationOptions.LongRunning, taskSchedulerManager.SyncSkuYesterdayCostTaskScheduler); + } + } + + private void EstimateCostForNoCostOrder(ShopResponse shop, DateTime startTime, DateTime endTime) + { + try + { + var jcycStorageTypeList = new List() { Enums.StorageType.京仓, Enums.StorageType.云仓 }; + var shopId = long.Parse(shop.ShopId); + var orderList = fsql.Select().Where(o => o.ShopId == shopId && + o.ModifyTime >= startTime && + o.ModifyTime <= endTime && + !invalidOrderStateList.Contains(o.OrderState) && + o.IsGift == false && + (o.StorageType == null || jcycStorageTypeList.Contains(o.StorageType)) && + !fsql.Select().Where(oc => oc.OrderId == o.Id).Any()) + .ToList(); + Console.WriteLine($"预估成本-{shop.ShopName},符合条件且没有成本的订单一共{orderList.Count()}个"); + if (orderList.Count() == 0) + return; + var orderIdList = orderList.Select(o => o.Id).ToList(); + + List insertOrderCostDetailList = new List(); + List insertOrderCostList = new List(); + + var orderSkuAndRecentList = fsql.Select() + .LeftJoin((osku, src) => osku.SkuId == src.SkuId) + .Where((osku, src) => orderIdList.Contains(osku.OrderId) && osku.Price > 0) + .ToList((osku, src) => new + { + osku.Id, + osku.OrderId, + osku.SkuId, + osku.ProductId, + osku.ShouldPay, + osku.PingTaiChengDanYouHuiQuan, + osku.SuperRedEnvelope, + osku.XianPinLeiDongQuan, + osku.VenderFee, + osku.JingDou, + osku.DongQuan, + osku.Balance, + osku.ItemTotal, + src.SingleConsumableAmount, + src.SingleSkuAmount, + src.SingleDeliveryFreight, + src.SingleFirstFreight, + src.SingleFreight, + src.SingleInStorageAmount, + src.SingleOutStorageAmount, + src.SinglePackagingLaborAmount + //src.SingleStorageAmount + }); + foreach (var order in orderList) + { + var currentOrderSkuList = orderSkuAndRecentList.Where(osku => osku.OrderId == order.Id).ToList(); + if (currentOrderSkuList.Any(osku => osku.ShouldPay == null || + osku.ShouldPay == 0 || + osku.SingleSkuAmount == null || + osku.SingleSkuAmount == 0)) + continue; //预估成本和毛利,必须订单下的每一笔sku都具备最近成本 + + List currentOrderInsertOcdList = new List(); + foreach (var osku in currentOrderSkuList) + { + var ocd = new OrderCostDetail() + { + Id = idGenerator.NewLong(), + ConsumableAmount = (osku.SingleConsumableAmount * osku.ItemTotal) ?? 0M, + DeductionQuantity = osku.ItemTotal ?? 1, + CreateTime = DateTime.Now, + DeliveryExpressFreight = (osku.SingleDeliveryFreight * osku.ItemTotal) ?? 0M, + FirstFreight = (osku.SingleFirstFreight * osku.ItemTotal) ?? 0M, + InStorageAmount = (osku.SingleInStorageAmount * osku.ItemTotal) ?? 0M, + OutStorageAmount = (osku.SingleOutStorageAmount * osku.ItemTotal) ?? 0M, + OrderId = order.Id, + ProductId = osku.ProductId, + PurchaseFreight = (osku.SingleFreight * osku.ItemTotal) ?? 0M, + PurchaseOrderPKId = 0, + SkuAmount = (osku.SingleSkuAmount * osku.ItemTotal) ?? 0M, + SkuId = osku.SkuId, + //StorageAmount = (osku.SingleStorageAmount * osku.ItemTotal) ?? 0M, + PackagingLaborAmount = (osku.SinglePackagingLaborAmount * osku.ItemTotal) ?? 0M, + IsEnabled = true, + IsEstimateCost = true + }; + ocd.CalculationSkuGrossProfit(osku.ShouldPay ?? 0M, + osku.PingTaiChengDanYouHuiQuan ?? 0M, + osku.SuperRedEnvelope ?? 0M, + osku.XianPinLeiDongQuan ?? 0M, + osku.VenderFee ?? 0M, + osku.JingDou ?? 0M, + osku.DongQuan ?? 0M, + osku.Balance ?? 0M, + shop.PlatformCommissionRatio ?? 0.05M); + currentOrderInsertOcdList.Add(ocd); + } + + var orderCost = new OrderCost() + { + OrderId = order.Id, + CreateTime = DateTime.Now, + AfterTotalCost = 0M, + DeliveryExpressFreight = currentOrderInsertOcdList.Sum(ocd => ocd.DeliveryExpressFreight), + IsEstimateCost = true, + IsManualEdited = false, + PlatformCommissionRatio = shop.PlatformCommissionRatio ?? 0.05M, + PurchaseAmount = currentOrderInsertOcdList.Sum(ocd => ocd.TotalCost), + PreferentialAmount = order.PreferentialAmount + }; + orderCost.CalculationOrderProfitAndCost(order, null); + insertOrderCostDetailList.AddRange(currentOrderInsertOcdList); + insertOrderCostList.Add(orderCost); + } + + fsql.Transaction(() => + { + if (insertOrderCostDetailList.Count() > 0) + fsql.Insert(insertOrderCostDetailList).ExecuteAffrows(); + if (insertOrderCostList.Count() > 0) + fsql.Insert(insertOrderCostList).ExecuteAffrows(); + }); + } + catch (Exception ex) + { + nLogManager.GetLogger($"预估成本-{shop.ShopName}").Error(ex); + } + } + #endregion + } +} \ No newline at end of file diff --git a/BBWY.Server.Business/Sync/OrderSyncBusiness.cs b/BBWY.Server.Business/Sync/OrderSyncBusiness.cs index bedc4441..249480e1 100644 --- a/BBWY.Server.Business/Sync/OrderSyncBusiness.cs +++ b/BBWY.Server.Business/Sync/OrderSyncBusiness.cs @@ -99,14 +99,16 @@ namespace BBWY.Server.Business { try { - //logger.Info($"订单同步 {shop.ShopName} isAuto {isAuto}"); + if (shop.ShopName == "创艺家居日用专营店") + nLogManager.Default().Info($"订单同步 {shop.ShopName} isAuto {isAuto}"); + if (!syncOrderMethodDic.ContainsKey(shop.PlatformId)) throw new Exception("不支持的平台"); var shopId = long.Parse(shop.ShopId); var relayAPIHost = GetPlatformRelayAPIHost(shop.PlatformId); var orderListApiResult = restApiService.SendRequest(relayAPIHost, "api/PlatformSDK/GetOrderList", new SearchPlatformOrderRequest() { - StartDate = startTime ?? DateTime.Now.AddHours(shop.ShopName.Contains("腾奇") ? -0.5 : -3), + StartDate = startTime ?? DateTime.Now.AddHours(-3), EndDate = endTime ?? DateTime.Now, AppKey = shop.AppKey, AppSecret = shop.AppSecret, @@ -142,19 +144,19 @@ namespace BBWY.Server.Business { //if (fsql.Select().Where(ost => ost.ShopId == syncOrderByDateRequest.ShopId && ost.State == Enums.OrderSyncState.Running).Any()) // throw new BusinessException("存在未结束的同步任务,请稍后同步"); - //syncOrderByDateRequest.EndTime = syncOrderByDateRequest.EndTime.Date.AddDays(1).AddSeconds(-1); - //if ((syncOrderByDateRequest.EndTime - syncOrderByDateRequest.StartTime).Days > 7) - // throw new BusinessException("同步任务时差最长7天"); - - var orderSyncTask = new OrderSyncTask() - { - Id = idGenerator.NewLong(), - ShopId = syncOrderByDateRequest.ShopId, - State = Enums.OrderSyncState.Running, - SyncStartTime = syncOrderByDateRequest.StartTime, - SyncEndTime = syncOrderByDateRequest.EndTime - }; - fsql.Insert(orderSyncTask).ExecuteAffrows(); + syncOrderByDateRequest.EndTime = syncOrderByDateRequest.EndTime.Date.AddDays(1).AddSeconds(-1); + if ((syncOrderByDateRequest.EndTime - syncOrderByDateRequest.StartTime).Days > 7) + throw new BusinessException("同步任务时差最长7天"); + + //var orderSyncTask = new OrderSyncTask() + //{ + // Id = idGenerator.NewLong(), + // ShopId = syncOrderByDateRequest.ShopId, + // State = Enums.OrderSyncState.Running, + // SyncStartTime = syncOrderByDateRequest.StartTime, + // SyncEndTime = syncOrderByDateRequest.EndTime + //}; + //fsql.Insert(orderSyncTask).ExecuteAffrows(); Task.Factory.StartNew(() => { var currentStartTime = syncOrderByDateRequest.StartTime; @@ -186,11 +188,11 @@ namespace BBWY.Server.Business } } } - try - { - fsql.Update(orderSyncTask.Id).Set(ost => ost.State, Enums.OrderSyncState.End).ExecuteAffrows(); - } - catch (Exception ex) { } + //try + //{ + // fsql.Update(orderSyncTask.Id).Set(ost => ost.State, Enums.OrderSyncState.End).ExecuteAffrows(); + //} + //catch (Exception ex) { } }, System.Threading.CancellationToken.None, TaskCreationOptions.LongRunning, taskSchedulerManager.SyncOrderTaskScheduler); } @@ -306,150 +308,156 @@ namespace BBWY.Server.Business if (orderCouponDetailResponse.Success) { var jtoken = orderCouponDetailResponse.Data["jingdong_pop_order_queryCouponDetai_responce"]["couponDetailExternal"]["couponDetailVo"]; - - #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 - - #region 订单优惠券信息 - var couponJArray = jtoken["couponList"] as JArray; - if (couponJArray != null && couponJArray.Count() > 0) + if (jtoken.Value("totalShouldPay") > 0M || + jtoken.Value("totalSuperRedEnvelope") > 0M || + jtoken.Value("totalDongQuan") > 0M || + jtoken.Value("totalJingDou") > 0M || + jtoken.Value("totalXianPinLeiDongQuan") > 0M || + jtoken.Value("totalPingTaiChengDanYouHuiQuan") > 0M ) { - insertOrderCouponNewList.AddRange(couponJArray.Select(j => new OrderCoupon_New() + #region 订单合计信息 + var orderTotal = new OrderTotalInfo() { - 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") - })); - } + 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 - #endregion + #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") + })); + } - #region 订单活动信息 - var promotionJArray = jtoken["promotionList"] as JArray; - if (promotionJArray != null && promotionJArray.Count() > 0) - { - insertOrderPromotionList.AddRange(promotionJArray.Select(j => new OrderPromotion() + #endregion + + #region 订单活动信息 + var promotionJArray = jtoken["promotionList"] as JArray; + if (promotionJArray != null && promotionJArray.Count() > 0) { - 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 + 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) + #region 订单sku金额明细 + var skuJArray = jtoken["skuList"] as JArray; + if (skuJArray != null && skuJArray.Count() > 0) { - var skuDiscountInfoList = oskuJtoken["skuDiscountInfoList"] as JArray; - decimal? xianPinLeiDongQuan = 0M; - if (skuDiscountInfoList != null && skuDiscountInfoList.Count > 0) + foreach (var oskuJtoken in skuJArray) { - foreach (var item1 in skuDiscountInfoList) + var skuDiscountInfoList = oskuJtoken["skuDiscountInfoList"] as JArray; + decimal? xianPinLeiDongQuan = 0M; + if (skuDiscountInfoList != null && skuDiscountInfoList.Count > 0) { - var discountTypeList = item1["discountTypeList"] as JArray; - if (discountTypeList != null && discountTypeList.Count() > 0) + foreach (var item1 in skuDiscountInfoList) { - foreach (var discountType in discountTypeList) + var discountTypeList = item1["discountTypeList"] as JArray; + if (discountTypeList != null && discountTypeList.Count() > 0) { - if (discountType.Value("type") == 6) - xianPinLeiDongQuan += discountType.Value("amount"); + foreach (var discountType in discountTypeList) + { + if (discountType.Value("type") == 6) + xianPinLeiDongQuan += discountType.Value("amount"); + } } } } - } - if (xianPinLeiDongQuan == 0M) - xianPinLeiDongQuan = oskuJtoken.Value("xianPinLeiDongQuan"); + 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); + 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 - } } } @@ -629,7 +637,13 @@ namespace BBWY.Server.Business 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; + var isDetailChanged = oskuCF != null && (dbOsku.ShouldPay != oskuCF.ShouldPay || + dbOsku.Balance != oskuCF.Balance|| + dbOsku.PingTaiChengDanYouHuiQuan != oskuCF.PingTaiChengDanYouHuiQuan|| + dbOsku.SuperRedEnvelope != oskuCF.SuperRedEnvelope || + dbOsku.XianPinLeiDongQuan != oskuCF.XianPinLeiDongQuan || + dbOsku.JingDou != oskuCF.JingDou || + dbOsku.DongQuan != oskuCF.DongQuan); if (dbOsku.ProductId != wareId || isDetailChanged) { var skuActualAmount = oskuCF?.ShouldPay ?? 0M + @@ -726,199 +740,218 @@ namespace BBWY.Server.Business orderState != Enums.OrderState.待付款 && orderState != Enums.OrderState.已取消) { - var orderCost = dbOrderCostList.FirstOrDefault(oc => oc.OrderId == dbOrder.Id); - if (orderCost == null && orderSellerPrice > 0M) + bool checkOrderTotal = true; + if (dbOrder.StorageType == Enums.StorageType.京仓 || dbOrder.StorageType == Enums.StorageType.云仓) + { + var orderTotalInfo = insertOrderTotalInfoList.FirstOrDefault(x => x.Id == dbOrder.Id); + if (orderTotalInfo == null) + orderTotalInfo = dbOrderTotalList.FirstOrDefault(x => x.Id == dbOrder.Id); + if (orderTotalInfo == null || orderTotalInfo.TotalShouldPay == 0M) + checkOrderTotal = false; + } + if (checkOrderTotal) { - if (isNewOrder && dbOrder.StorageType == Enums.StorageType.SD && sDCalculationCostRequest != null) + var orderCost = dbOrderCostList.FirstOrDefault(oc => oc.OrderId == dbOrder.Id); + if (orderCost == null && orderSellerPrice > 0M) { - //检查SD埋点 - if (sDCalculationCostRequest.PlatformCommissionRatio == 0M) - sDCalculationCostRequest.PlatformCommissionRatio = 0.05M; - orderCost = new OrderCost() + if (isNewOrder && dbOrder.StorageType == Enums.StorageType.SD && sDCalculationCostRequest != null) { - 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) + //检查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 orderCostPurchaseAmount = 0M; - var orderDeliveryExpressFreight = 0M; //发货总运费,sku购买数量第二个开始半价 + 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购买数量 - - #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; - - decimal? skuJingDou = orderSkuCFDetailList.FirstOrDefault(x => x.OrderId == orderId && - x.SkuId == orderSkuId)?.JingDou; - if (skuJingDou == null) - skuJingDou = insertOrderSkuList.FirstOrDefault(x => x.OrderId == orderId && x.SkuId == orderSkuId)?.JingDou; - if (skuJingDou == null) - skuJingDou = dbOrderSkuList.FirstOrDefault(x => x.OrderId == orderId && x.SkuId == orderSkuId)?.JingDou; - - decimal? skuDongQuan = orderSkuCFDetailList.FirstOrDefault(x => x.OrderId == orderId && - x.SkuId == orderSkuId)?.DongQuan; - if (skuDongQuan == null) - skuDongQuan = insertOrderSkuList.FirstOrDefault(x => x.OrderId == orderId && x.SkuId == orderSkuId)?.DongQuan; - if (skuDongQuan == null) - skuDongQuan = dbOrderSkuList.FirstOrDefault(x => x.OrderId == orderId && x.SkuId == orderSkuId)?.DongQuan; - - decimal? skuBalnace = orderSkuCFDetailList.FirstOrDefault(x => x.OrderId == orderId && - x.SkuId == orderSkuId)?.Balance; - if (skuBalnace == null) - skuBalnace = insertOrderSkuList.FirstOrDefault(x => x.OrderId == orderId && x.SkuId == orderSkuId)?.Balance; - if (skuBalnace == null) - skuBalnace = dbOrderSkuList.FirstOrDefault(x => x.OrderId == orderId && x.SkuId == orderSkuId)?.Balance; + #region 扣减库存 + foreach (var orderSkuJToken in orderSkuJArray) + { + 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; + + decimal? skuJingDou = orderSkuCFDetailList.FirstOrDefault(x => x.OrderId == orderId && + x.SkuId == orderSkuId)?.JingDou; + if (skuJingDou == null) + skuJingDou = insertOrderSkuList.FirstOrDefault(x => x.OrderId == orderId && x.SkuId == orderSkuId)?.JingDou; + if (skuJingDou == null) + skuJingDou = dbOrderSkuList.FirstOrDefault(x => x.OrderId == orderId && x.SkuId == orderSkuId)?.JingDou; + + decimal? skuDongQuan = orderSkuCFDetailList.FirstOrDefault(x => x.OrderId == orderId && + x.SkuId == orderSkuId)?.DongQuan; + if (skuDongQuan == null) + skuDongQuan = insertOrderSkuList.FirstOrDefault(x => x.OrderId == orderId && x.SkuId == orderSkuId)?.DongQuan; + if (skuDongQuan == null) + skuDongQuan = dbOrderSkuList.FirstOrDefault(x => x.OrderId == orderId && x.SkuId == orderSkuId)?.DongQuan; + + decimal? skuBalnace = orderSkuCFDetailList.FirstOrDefault(x => x.OrderId == orderId && + x.SkuId == orderSkuId)?.Balance; + if (skuBalnace == null) + skuBalnace = insertOrderSkuList.FirstOrDefault(x => x.OrderId == orderId && x.SkuId == orderSkuId)?.Balance; + if (skuBalnace == null) + skuBalnace = dbOrderSkuList.FirstOrDefault(x => x.OrderId == orderId && x.SkuId == orderSkuId)?.Balance; + #endregion + + //var itemPrice = orderSkuJToken.Value("jdPrice"); //sku单价 + var isReduceMultiTimes = false; //是否多次扣减库存 + while (itemTotal != 0) + { + 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, + PackagingLaborAmount = purchaseOrder.SinglePackagingLaborAmount * deductionQuantity, + IsEnabled = true, + IsEstimateCost = false + }; + + //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, + skuJingDou ?? 0M, + skuDongQuan ?? 0M, + skuBalnace ?? 0M, + platformCommissionRatio); + insertOrderCostDetailList.Add(orderCostDetail); + } + } #endregion - //var itemPrice = orderSkuJToken.Value("jdPrice"); //sku单价 - var isReduceMultiTimes = false; //是否多次扣减库存 - while (itemTotal != 0) + #region 计算成本 + //当具备订单明细成本的时候,才为其创建订单成本 + if (insertOrderCostDetailList.Any(iocd => iocd.OrderId == orderId)) { - 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() + orderCost = new OrderCost() { - Id = idGenerator.NewLong(), OrderId = orderId, - ProductId = orderSkuJToken.Value("wareId"), - SkuId = orderSkuId, + PlatformCommissionRatio = platformCommissionRatio, + PreferentialAmount = (dbOrderTotal?.TotalPingTaiChengDanYouHuiQuan) ?? dbOrder.PreferentialAmount, + Profit = 0, + PurchaseAmount = orderCostPurchaseAmount, + DeliveryExpressFreight = orderDeliveryExpressFreight, 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 + IsEstimateCost = false }; + if (dbOrder.OrderTotalPrice != 0) + orderCost.CalculationOrderProfitAndCost(dbOrder, null); + else + orderCost.CalculationOrderProfitAndCost(actualAmount, null); - //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, - skuJingDou ?? 0M, - skuDongQuan ?? 0M, - skuBalnace ?? 0M, - platformCommissionRatio); - insertOrderCostDetailList.Add(orderCostDetail); + insertOrderCostList.Add(orderCost); } + #endregion } - #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(actualAmount, null); - - insertOrderCostList.Add(orderCost); - #endregion } } } @@ -1090,6 +1123,7 @@ namespace BBWY.Server.Business public void SyncAllShopOrder() { var shopList = venderBusiness.GetShopList(platform: Enums.Platform.京东); + //var a = shopList.FirstOrDefault(s => s.ShopName == "创艺家居日用专营店"); foreach (var shop in shopList) { Task.Factory.StartNew(() => SyncOrder(shop, string.Empty, isAuto: true), CancellationToken.None, TaskCreationOptions.LongRunning, taskSchedulerManager.SyncOrderTaskScheduler); diff --git a/BBWY.Server.Business/TaskSchedulerManager.cs b/BBWY.Server.Business/TaskSchedulerManager.cs index 572f021a..4e2df060 100644 --- a/BBWY.Server.Business/TaskSchedulerManager.cs +++ b/BBWY.Server.Business/TaskSchedulerManager.cs @@ -34,6 +34,8 @@ namespace BBWY.Server.Business public LimitedConcurrencyLevelTaskScheduler JDPromotionAutoStartTaskScheduler { get; private set; } + public LimitedConcurrencyLevelTaskScheduler SyncSkuYesterdayCostTaskScheduler { get; private set; } + public TaskSchedulerManager() { RepairOrderTaskScheduler = new LimitedConcurrencyLevelTaskScheduler(5); @@ -55,6 +57,8 @@ namespace BBWY.Server.Business JDPromotionAutoStartTaskScheduler = new LimitedConcurrencyLevelTaskScheduler(10); SyncPauseOrderTaskScheduler = new LimitedConcurrencyLevelTaskScheduler(10); + + SyncSkuYesterdayCostTaskScheduler = new LimitedConcurrencyLevelTaskScheduler(10); } } } diff --git a/BBWY.Server.Business/TestBusiness.cs b/BBWY.Server.Business/TestBusiness.cs index 848d4938..ac9fa485 100644 --- a/BBWY.Server.Business/TestBusiness.cs +++ b/BBWY.Server.Business/TestBusiness.cs @@ -1,19 +1,20 @@ using BBWY.Common.Http; using BBWY.Common.Models; +using BBWY.Server.Business.Extensions; 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 Newtonsoft.Json; using System; using System.Collections.Generic; using System.IO; using System.Linq; -using System.Threading; -using BBWY.Server.Business.Extensions; -using Newtonsoft.Json; using System.Net.Http; +using System.Reflection; +using System.Threading; using System.Threading.Tasks; namespace BBWY.Server.Business @@ -25,6 +26,7 @@ namespace BBWY.Server.Business private IFreeSql fsql; private OrderSyncBusiness orderSyncBusiness; private TaskSchedulerManager taskSchedulerManager; + private PurchaseOrderBusiness purchaseOrderBusiness; public TestBusiness(RestApiService restApiService, IOptions options, FreeSqlMultiDBManager freeSqlMultiDBManager, @@ -32,13 +34,15 @@ namespace BBWY.Server.Business YunDingBusiness yunDingBusiness, IFreeSql fsql, OrderSyncBusiness orderSyncBusiness, - TaskSchedulerManager taskSchedulerManager) : base(restApiService, options, yunDingBusiness) + TaskSchedulerManager taskSchedulerManager, + PurchaseOrderBusiness purchaseOrderBusiness) : base(restApiService, options, yunDingBusiness) { this.freeSqlMultiDBManager = freeSqlMultiDBManager; this.venderBusiness = venderBusiness; this.fsql = fsql; this.orderSyncBusiness = orderSyncBusiness; this.taskSchedulerManager = taskSchedulerManager; + this.purchaseOrderBusiness = purchaseOrderBusiness; } public void SyncVenderId() @@ -274,18 +278,20 @@ namespace BBWY.Server.Business public void RepairOrderProfit() { - var startTime = DateTime.Parse("2023-10-16"); - var orderList = fsql.Select().Where(o => o.FreightPrice > 0 && - o.IsGift == false && + var startTime = DateTime.Parse("2023-12-12"); + var orderList = fsql.Select().Where(o => o.IsGift == false && o.OrderState != Enums.OrderState.已取消 && - o.StorageType != null && - o.StorageType != Enums.StorageType.SD && + o.StorageType == Enums.StorageType.本地自发 && o.StartTime >= startTime) .ToList(); - + var shopList = venderBusiness.GetShopList(platform: Enums.Platform.京东); var orderIdList = orderList.Select(o => o.Id).ToList(); var orderCostList = fsql.Select(orderIdList).ToList(); + var orderSkuList = fsql.Select().Where(osku => orderIdList.Contains(osku.OrderId) && osku.Price > 0).ToList(); + var orderCostDetailList = fsql.Select().Where(ocd => orderIdList.Contains(ocd.OrderId) && ocd.IsEnabled == true && ocd.IsEstimateCost == false).ToList(); + List> updateList = new List>(); + List> updateDetailList = new List>(); int index = 0; foreach (var orderCost in orderCostList) { @@ -294,9 +300,41 @@ namespace BBWY.Server.Business var order = orderList.FirstOrDefault(o => o.Id == orderCost.OrderId); if (order == null) continue; + + var shop = shopList.FirstOrDefault(s => s.ShopId == order.ShopId.ToString()); + + var currentOCDList = orderCostDetailList.Where(ocd => ocd.OrderId == orderCost.OrderId).ToList(); + var currentOrderSkuList = orderSkuList.Where(osku => osku.OrderId == orderCost.OrderId).ToList(); + foreach (var ocd in currentOCDList) + { + var osku = currentOrderSkuList.FirstOrDefault(x => x.SkuId == ocd.SkuId); + if (osku == null) + continue; + ocd.CalculationSkuGrossProfit(osku.ShouldPay ?? 0M, + osku.PingTaiChengDanYouHuiQuan ?? 0M, + osku.SuperRedEnvelope ?? 0M, + osku.XianPinLeiDongQuan ?? 0M, + osku.VenderFee ?? 0M, + osku.JingDou ?? 0M, + osku.DongQuan ?? 0M, + osku.Balance ?? 0M, + shop.PlatformCommissionRatio ?? 0.05M); + var update = fsql.Update().SetSource(ocd); + updateDetailList.Add(update); + } + + orderCost.PurchaseAmount = currentOCDList.Sum(ocd => ocd.TotalCost); + orderCost.DeliveryExpressFreight = currentOCDList.Sum(ocd => ocd.DeliveryExpressFreight); + orderCost.CalculationOrderProfitAndCost(order, null); - updateList.Add(fsql.Update(orderCost.OrderId).Set(oc => oc.Profit, orderCost.Profit) - .Set(oc => oc.PlatformCommissionAmount, orderCost.PlatformCommissionAmount)); + updateList.Add(fsql.Update(orderCost.OrderId) + .Set(oc => oc.PurchaseAmount, orderCost.PurchaseAmount) + .Set(oc => oc.DeliveryExpressFreight, orderCost.DeliveryExpressFreight) + .Set(oc => oc.Profit, orderCost.Profit) + .Set(oc => oc.PlatformCommissionAmount, orderCost.PlatformCommissionAmount)); + + + if (updateList.Count() > 10) { Console.WriteLine($"{DateTime.Now} 执行数据库更新"); @@ -304,8 +342,11 @@ namespace BBWY.Server.Business { foreach (var update in updateList) update.ExecuteAffrows(); + foreach (var update in updateDetailList) + update.ExecuteAffrows(); }); updateList.Clear(); + updateDetailList.Clear(); } } @@ -316,8 +357,11 @@ namespace BBWY.Server.Business { foreach (var update in updateList) update.ExecuteAffrows(); + foreach (var update in updateDetailList) + update.ExecuteAffrows(); }); updateList.Clear(); + updateDetailList.Clear(); } } @@ -345,6 +389,171 @@ namespace BBWY.Server.Business if (!response.Success) throw new BusinessException(response.Msg); } + + public void RepairDFOrder() + { + var st = DateTime.Parse("2023-11-01"); + var et = DateTime.Parse("2023-11-30 23:59:59"); + var list = fsql.Select() + .InnerJoin((o, ods, ocd) => o.Id == ods.OrderId) + .InnerJoin((o, ods, ocd) => o.Id == ocd.OrderId) + .Where((o, ods, ocd) => o.ShopId == 12897067 && o.OrderState != Enums.OrderState.已取消 && o.StartTime >= st && o.StartTime <= et && o.StorageType == Enums.StorageType.代发 && ocd.IsEnabled == true && ocd.SkuAmount == 0) + .ToList((o, ods, ocd) => ods.PurchaseOrderId).Distinct().ToList(); + + for (var i = 0; i < list.Count; i++) + { + Console.WriteLine($"{i + 1}/{list.Count()},{list[i]}"); + var param = new { type = "ORDER_BUYER_VIEW_ORDER_PRICE_MODIFY", data = new { orderId = list[i] } }; + purchaseOrderBusiness.CallbackFrom1688(JsonConvert.SerializeObject(param)); + Thread.Sleep(1000); + } + } + + public void Test_20231221() + { + var invalidOrderStateList = new List() { Enums.OrderState.已取消, Enums.OrderState.待付款 }; + var shopList = venderBusiness.GetShopList(10224131, Enums.Platform.京东); + var objList = new List<(string id, string shopName, DateTime sjtime, decimal? lastOrderAmount, decimal fto20SearchUv, decimal fto50SearchUv, decimal fto100SearchUv, decimal fto200SearchUv, decimal fto30SearchUv, decimal fto500SearchUv)>(); + var result = new List() { "店铺名,SPU,上架时间,最后一单成交价,推荐访客首次到达20时的搜索访客,推荐访客首次到达50时的搜索访客,推荐访客首次到达100时的搜索访客,推荐访客首次到达200时的搜索访客,推荐访客首次到达300时的搜索访客,推荐访客首次到达50时的搜索访客" }; + foreach (var shop in shopList) + { + Console.WriteLine(shop.ShopName); + var shopId = long.Parse(shop.ShopId); + var productList = fsql.Select().Where(p => p.ShopId == shopId).ToList(); + var productIdList = productList.Select(p => p.Id).ToList(); + + var skuList = fsql.Select() + .InnerJoin((osku, o) => osku.OrderId == o.Id) + .Where((osku, o) => o.ShopId == shopId && + !invalidOrderStateList.Contains(o.OrderState) && + o.IsGift == false && + o.StorageType != Enums.StorageType.SD && + osku.Price > 0) + .GroupBy((osku, o) => osku.ProductId) + .WithTempQuery(g => new { MaxId = g.Max(g.Value.Item1.Id), ProductId = g.Key }) + .From() + .InnerJoin((osku, osku1) => osku1.Id == osku.MaxId) + .ToList((osku, osku1) => new { osku1.ProductId, osku1.OrderId }); + var orderIdList = skuList.Select(s => s.OrderId).Distinct().ToList(); + var orderList = fsql.Select(orderIdList).ToList(o => new Order() { Id = o.Id, ShopId = o.ShopId, OrderTotalPrice = o.OrderTotalPrice }); + + + #region 20 + var _20list = freeSqlMultiDBManager.JDXXfsql.Select() + .Where(s => productIdList.Contains(s.Spu)) + .GroupBy(s => new { s.Spu, s.CreateTime }) + .Having(g => g.Sum(g.Value.StarUv) >= 50) + .OrderBy(g => g.Value.CreateTime) + .ToList(g => new + { + spu = g.Key, + g.Value.CreateTime, + sumSearchUv = g.Sum(g.Value.SearchUv), + sumStarUv = g.Sum(g.Value.StarUv) + }); + + #endregion + + #region 50 + var _50list = freeSqlMultiDBManager.JDXXfsql.Select() + .Where(s => productIdList.Contains(s.Spu)) + .GroupBy(s => new { s.Spu, s.CreateTime }) + .Having(g => g.Sum(g.Value.StarUv) >= 50) + .OrderBy(g => g.Value.CreateTime) + .ToList(g => new + { + spu = g.Key, + g.Value.CreateTime, + sumSearchUv = g.Sum(g.Value.SearchUv), + sumStarUv = g.Sum(g.Value.StarUv) + }); + + #endregion + + #region 100 + var _100list = freeSqlMultiDBManager.JDXXfsql.Select() + .Where(s => productIdList.Contains(s.Spu)) + .GroupBy(s => new { s.Spu, s.CreateTime }) + .Having(g => g.Sum(g.Value.StarUv) >= 100) + .OrderBy(g => g.Value.CreateTime) + .ToList(g => new + { + spu = g.Key, + g.Value.CreateTime, + sumSearchUv = g.Sum(g.Value.SearchUv), + sumStarUv = g.Sum(g.Value.StarUv) + }); + + #endregion + + #region 200 + var _200list = freeSqlMultiDBManager.JDXXfsql.Select() + .Where(s => productIdList.Contains(s.Spu)) + .GroupBy(s => new { s.Spu, s.CreateTime }) + .Having(g => g.Sum(g.Value.StarUv) >= 200) + .OrderBy(g => g.Value.CreateTime) + .ToList(g => new + { + spu = g.Key, + g.Value.CreateTime, + sumSearchUv = g.Sum(g.Value.SearchUv), + sumStarUv = g.Sum(g.Value.StarUv) + }); + + #endregion + + #region 300 + var _300list = freeSqlMultiDBManager.JDXXfsql.Select() + .Where(s => productIdList.Contains(s.Spu)) + .GroupBy(s => new { s.Spu, s.CreateTime }) + .Having(g => g.Sum(g.Value.StarUv) >= 300) + .OrderBy(g => g.Value.CreateTime) + .ToList(g => new + { + spu = g.Key, + g.Value.CreateTime, + sumSearchUv = g.Sum(g.Value.SearchUv), + sumStarUv = g.Sum(g.Value.StarUv) + }); + + #endregion + + #region 500 + var _500list = freeSqlMultiDBManager.JDXXfsql.Select() + .Where(s => productIdList.Contains(s.Spu)) + .GroupBy(s => new { s.Spu, s.CreateTime }) + .Having(g => g.Sum(g.Value.StarUv) >= 500) + .OrderBy(g => g.Value.CreateTime) + .ToList(g => new + { + spu = g.Key, + g.Value.CreateTime, + sumSearchUv = g.Sum(g.Value.SearchUv), + sumStarUv = g.Sum(g.Value.StarUv) + }); + + #endregion + + foreach (var product in productList) + { + var orderTotalPrice = orderList.FirstOrDefault(o => o.Id == (skuList.FirstOrDefault(s => s.ProductId == product.Id)?.OrderId))?.OrderTotalPrice ?? 0M; + var shopName = shop.ShopName; + var sjtime = product.CreateTime; + var fto20SearchUv = _20list.FirstOrDefault(s => s.spu.Spu == product.Id)?.sumSearchUv ?? 0M; + var fto50SearchUv = _50list.FirstOrDefault(s => s.spu.Spu == product.Id)?.sumSearchUv ?? 0M; + var fto100SearchUv = _100list.FirstOrDefault(s => s.spu.Spu == product.Id)?.sumSearchUv ?? 0M; + var fto200SearchUv = _200list.FirstOrDefault(s => s.spu.Spu == product.Id)?.sumSearchUv ?? 0M; + var fto300SearchUv = _300list.FirstOrDefault(s => s.spu.Spu == product.Id)?.sumSearchUv ?? 0M; + var fto500SearchUv = _500list.FirstOrDefault(s => s.spu.Spu == product.Id)?.sumSearchUv ?? 0M; + result.Add($"{shopName},{product.Id},{sjtime},{orderTotalPrice},{fto20SearchUv},{fto50SearchUv},{fto100SearchUv},{fto200SearchUv},{fto300SearchUv},{fto500SearchUv}"); + } + } + + System.IO.File.WriteAllLines(Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "result.csv"), result, System.Text.Encoding.UTF8); + Console.WriteLine("结束"); + } + + } public class JPCount diff --git a/BBWY.Server.Business/Vender/VenderBusiness.cs b/BBWY.Server.Business/Vender/VenderBusiness.cs index 5ad45bd3..9eb61897 100644 --- a/BBWY.Server.Business/Vender/VenderBusiness.cs +++ b/BBWY.Server.Business/Vender/VenderBusiness.cs @@ -293,14 +293,14 @@ namespace BBWY.Server.Business return departmentList; } - public IList GetShopList(long? shopId = null, Enums.Platform? platform = null, bool filterTurnoverDays = false, bool filterSiNan = false) + public IList GetShopList(long? shopId = null, Enums.Platform? platform = null, bool filterTurnoverDays = false, bool filterSiNan = false, bool? isEnabled = true) { return freeSqlMultiDBManager.MDSfsql.Select().Where(s => !string.IsNullOrEmpty(s.ShopId)) .WhereIf(shopId != null, s => s.ShopId == shopId.ToString()) .WhereIf(platform != null, s => s.PlatformId == (int)platform) .WhereIf(filterTurnoverDays, s => s.SkuSafeTurnoverDays != 0) .WhereIf(filterSiNan, s => !string.IsNullOrEmpty(s.SiNanDingDingWebHook)) - .Where(s => s.IsEnabled == true) + .WhereIf(isEnabled != null, s => s.IsEnabled == isEnabled) .ToList(); } diff --git a/BBWY.Server.Model/BBWY.Server.Model.csproj b/BBWY.Server.Model/BBWY.Server.Model.csproj index 9bee62e6..754c33d1 100644 --- a/BBWY.Server.Model/BBWY.Server.Model.csproj +++ b/BBWY.Server.Model/BBWY.Server.Model.csproj @@ -7,7 +7,7 @@ - + diff --git a/BBWY.Server.Model/Db/JD/JDPopularizeAdGroup.cs b/BBWY.Server.Model/Db/JD/JDPopularizeAdGroup.cs index b7aa57f2..a8718bf6 100644 --- a/BBWY.Server.Model/Db/JD/JDPopularizeAdGroup.cs +++ b/BBWY.Server.Model/Db/JD/JDPopularizeAdGroup.cs @@ -1,4 +1,4 @@ -using FreeSql.DataAnnotations; +using FreeSql.DataAnnotations; using System; namespace BBWY.Server.Model.Db @@ -11,56 +11,149 @@ namespace BBWY.Server.Model.Db public partial class JDPopularizeAdGroup { - [Column(IsPrimary = true)] + [Column(DbType = "bigint", IsPrimary = true)] public long Id { get; set; } /// /// 单元Id /// - + [Column(DbType = "bigint")] public long? AdGroupId { get; set; } + /// + /// 单元名称 + /// [Column(StringLength = 100)] public string AdGroupName { get; set; } /// /// 业务线(快车:2 京速推:134217728) /// - + [Column(DbType = "int")] public int? BusinessType { get; set; } /// /// 计划Id /// - + [Column(DbType = "bigint")] public long? CampaignId { get; set; } /// /// 点击数 /// - [Column(Name = "clicks")] - public int? Clicks { get; set; } + [Column(Name = "clicks", DbType = "int")] + public int? Clicks { get; set; } = 0; /// /// 总花费 /// [Column(DbType = "decimal(18,2)")] - public decimal? Cost { get; set; } + public decimal? Cost { get; set; } = 0.00M; + + /// + /// 领券数 + /// + [Column(Name = "couponCnt", DbType = "int")] + public int? CouponCnt { get; set; } = 0; + + /// + /// CPA + /// + [Column(DbType = "decimal(18,2)")] + public decimal? CPA { get; set; } = 0.00M; + + /// + /// 平均点击成本 + /// + [Column(DbType = "decimal(18,2)")] + public decimal? CPC { get; set; } = 0.00M; + + /// + /// 千次展现成本 + /// + [Column(DbType = "decimal(18,2)")] + public decimal? CPM { get; set; } = 0.00M; [Column(DbType = "datetime")] public DateTime? CreateTime { get; set; } + /// + /// 点击率 + /// + [Column(DbType = "decimal(18,2)")] + public decimal? CTR { get; set; } = 0.00M; + /// /// 计费日期 /// [Column(DbType = "datetime")] public DateTime? Date { get; set; } + /// + /// 深度进店数 + /// + [Column(Name = "depthPassengerCnt", DbType = "int")] + public int? DepthPassengerCnt { get; set; } = 0; + + /// + /// 直接购物车数 + /// + [Column(Name = "directCartCnt", DbType = "int")] + public int? DirectCartCnt { get; set; } = 0; + + /// + /// 直接订单行 + /// + [Column(Name = "directOrderCnt", DbType = "int")] + public int? DirectOrderCnt { get; set; } = 0; + + /// + /// 直接订单金额 + /// + [Column(Name = "directOrderSum", DbType = "decimal(18,2)")] + public decimal? DirectOrderSum { get; set; } = 0.00M; + + /// + /// 商品关注数 + /// + [Column(Name = "goodsAttentionCnt", DbType = "int")] + public int? GoodsAttentionCnt { get; set; } = 0; + /// /// 展现次数 /// - [Column(Name = "impressions")] - public int? Impressions { get; set; } + [Column(Name = "impressions", DbType = "int")] + public int? Impressions { get; set; } = 0; + + /// + /// 间接购物车数 + /// + [Column(Name = "indirectCartCnt", DbType = "int")] + public int? IndirectCartCnt { get; set; } = 0; + + /// + /// 间接订单行 + /// + [Column(Name = "indirectOrderCnt", DbType = "int")] + public int? IndirectOrderCnt { get; set; } = 0; + + /// + /// 间接订单金额 + /// + [Column(Name = "indirectOrderSum", DbType = "decimal(18,2)")] + public decimal? IndirectOrderSum { get; set; } = 0.00M; + + /// + /// 下单新客数 + /// + [Column(Name = "newCustomersCnt", DbType = "int")] + public int? NewCustomersCnt { get; set; } = 0; + + /// + /// 下单日期 + /// + [Column(Name = "orderDate", DbType = "datetime")] + public DateTime? OrderDate { get; set; } /// /// 账号归属 @@ -68,20 +161,86 @@ namespace BBWY.Server.Model.Db [Column(Name = "pin")] public string Pin { get; set; } + /// + /// 预约数 + /// + [Column(Name = "preorderCnt", DbType = "int")] + public int? PreorderCnt { get; set; } = 0; + + /// + /// 店铺关注数 + /// + [Column(Name = "shopAttentionCnt", DbType = "int")] + public int? ShopAttentionCnt { get; set; } = 0; + [Column(DbType = "bigint")] public long? ShopId { get; set; } /// /// 总加购人数 /// - [Column(Name = "totalCartCnt")] - public int? TotalCartCnt { get; set; } + [Column(Name = "totalCartCnt", DbType = "int")] + public int? TotalCartCnt { get; set; } = 0; + + /// + /// 总加购成本 + /// + [Column(Name = "totalCartCost", DbType = "decimal(18,2)")] + public decimal? TotalCartCost { get; set; } = 0.00M; /// /// 总订单数 /// - [Column(Name = "totalOrderCnt")] - public int? TotalOrderCnt { get; set; } + [Column(Name = "totalOrderCnt", DbType = "int")] + public int? TotalOrderCnt { get; set; } = 0; + + /// + /// 点击转化率 + /// + [Column(Name = "totalOrderCVS", DbType = "decimal(18,2)")] + public decimal? TotalOrderCVS { get; set; } = 0.00M; + + /// + /// ROI + /// + [Column(Name = "totalOrderROI", DbType = "decimal(18,2)")] + public decimal? TotalOrderROI { get; set; } = 0.00M; + + /// + /// 总订单金额 + /// + [Column(Name = "totalOrderSum", DbType = "decimal(18,2)")] + public decimal? TotalOrderSum { get; set; } = 0.00M; + + /// + /// 预售订单行 + /// + [Column(Name = "totalPresaleOrderCnt", DbType = "int")] + public int? TotalPresaleOrderCnt { get; set; } = 0; + + /// + /// 预售订单金额 + /// + [Column(Name = "totalPresaleOrderSum", DbType = "decimal(18,2)")] + public decimal? TotalPresaleOrderSum { get; set; } = 0.00M; + + /// + /// 访客数 + /// + [Column(Name = "visitorCnt", DbType = "int")] + public int? VisitorCnt { get; set; } = 0; + + /// + /// 访问页面数 + /// + [Column(Name = "visitPageCnt", DbType = "int")] + public int? VisitPageCnt { get; set; } = 0; + + /// + /// 访问时长 + /// + [Column(Name = "visitTimeAverage", DbType = "decimal(18,2)")] + public decimal? VisitTimeAverage { get; set; } = 0.00M; } diff --git a/BBWY.Server.Model/Db/JD/JDPopularizeAdSku.cs b/BBWY.Server.Model/Db/JD/JDPopularizeAdSku.cs index 6303915b..69baf11e 100644 --- a/BBWY.Server.Model/Db/JD/JDPopularizeAdSku.cs +++ b/BBWY.Server.Model/Db/JD/JDPopularizeAdSku.cs @@ -1,4 +1,4 @@ -using FreeSql.DataAnnotations; +using FreeSql.DataAnnotations; using System; namespace BBWY.Server.Model.Db @@ -11,62 +11,179 @@ namespace BBWY.Server.Model.Db public partial class JDPopularizeAdSku { - [Column(IsPrimary = true)] + [Column(DbType = "bigint", IsPrimary = true)] public long Id { get; set; } /// - /// 单元Id + /// 文档无解释 + /// + [Column(Name = "adCreativeType", StringLength = 50)] + public string AdCreativeType { get; set; } = "0"; + + /// + /// adCustomTitle无文档解释 /// + [Column(Name = "adCustomTitle")] + public string AdCustomTitle { get; set; } + /// + /// 单元Id + /// + [Column(DbType = "bigint")] public long? AdGroupId { get; set; } /// /// 创意Id /// - + [Column(DbType = "bigint")] public long? AdId { get; set; } + /// + /// 创意名称 + /// [Column(StringLength = 100)] public string AdName { get; set; } /// /// 业务线(快车:2 京速推:134217728) /// - + [Column(DbType = "int")] public int? BusinessType { get; set; } /// /// 计划Id /// - + [Column(DbType = "bigint")] public long? CampaignId { get; set; } /// /// 点击数 /// - [Column(Name = "clicks")] - public int? Clicks { get; set; } + [Column(Name = "clicks", DbType = "int")] + public int? Clicks { get; set; } = 0; /// /// 总花费 /// [Column(DbType = "decimal(18,2)")] - public decimal? Cost { get; set; } + public decimal? Cost { get; set; } = 0.00M; + + /// + /// 领券数 + /// + [Column(Name = "couponCnt", DbType = "int")] + public int? CouponCnt { get; set; } = 0; + + /// + /// CPA + /// + [Column(DbType = "decimal(18,2)")] + public decimal? CPA { get; set; } = 0.00M; + + /// + /// 平均点击成本 + /// + [Column(DbType = "decimal(18,2)")] + public decimal? CPC { get; set; } = 0.00M; + + /// + /// 千次展现成本 + /// + [Column(DbType = "decimal(18,2)")] + public decimal? CPM { get; set; } = 0.00M; [Column(DbType = "datetime")] public DateTime? CreateTime { get; set; } + /// + /// 点击率 + /// + [Column(DbType = "decimal(18,2)")] + public decimal? CTR { get; set; } = 0.00M; + /// /// 计费日期 /// [Column(DbType = "datetime")] public DateTime? Date { get; set; } + /// + /// 深度进店数 + /// + [Column(Name = "depthPassengerCnt", DbType = "int")] + public int? DepthPassengerCnt { get; set; } = 0; + + /// + /// 直接购物车数 + /// + [Column(Name = "directCartCnt", DbType = "int")] + public int? DirectCartCnt { get; set; } = 0; + + /// + /// 直接订单行 + /// + [Column(Name = "directOrderCnt", DbType = "int")] + public int? DirectOrderCnt { get; set; } = 0; + + /// + /// 直接订单金额 + /// + [Column(Name = "directOrderSum", DbType = "decimal(18,2)")] + public decimal? DirectOrderSum { get; set; } = 0.00M; + + /// + /// 商品关注数 + /// + [Column(Name = "goodsAttentionCnt", DbType = "int")] + public int? GoodsAttentionCnt { get; set; } = 0; + /// /// 展现次数 /// - [Column(Name = "impressions")] - public int? Impressions { get; set; } + [Column(Name = "impressions", DbType = "int")] + public int? Impressions { get; set; } = 0; + + /// + /// 间接购物车数 + /// + [Column(Name = "indirectCartCnt", DbType = "int")] + public int? IndirectCartCnt { get; set; } = 0; + + /// + /// 间接订单行 + /// + [Column(Name = "indirectOrderCnt", DbType = "int")] + public int? IndirectOrderCnt { get; set; } = 0; + + /// + /// 间接订单金额 + /// + [Column(Name = "indirectOrderSum", DbType = "decimal(18,2)")] + public decimal? IndirectOrderSum { get; set; } = 0.00M; + + /// + /// materialId无文档解释 + /// + [Column(Name = "materialId", DbType = "bigint")] + public long? MaterialId { get; set; } = 0; + + /// + /// materialSize文档无解释 + /// + [Column(Name = "materialSize", StringLength = 100)] + public string MaterialSize { get; set; } + + /// + /// 下单新客数 + /// + [Column(Name = "newCustomersCnt", DbType = "int")] + public int? NewCustomersCnt { get; set; } = 0; + + /// + /// 下单日期 + /// + [Column(Name = "orderDate", DbType = "datetime")] + public DateTime? OrderDate { get; set; } /// /// 账号归属 @@ -74,38 +191,111 @@ namespace BBWY.Server.Model.Db [Column(Name = "pin")] public string Pin { get; set; } + /// + /// 预约数 + /// + [Column(Name = "preorderCnt", DbType = "int")] + public int? PreorderCnt { get; set; } = 0; + + [Column(StringLength = 50)] + public string ProductId { get; set; } + + /// + /// 店铺关注数 + /// + [Column(Name = "shopAttentionCnt", DbType = "int")] + public int? ShopAttentionCnt { get; set; } = 0; + [Column(DbType = "bigint")] public long? ShopId { get; set; } [Column(StringLength = 50)] public string Sku { get; set; } - [Column(StringLength = 50)] - public string ProductId { get; set; } + /// + /// 品牌ID + /// + [Column(Name = "skuBrandId", StringLength = 50)] + public string SkuBrandId { get; set; } + + /// + /// sku品牌名称 + /// + [Column(Name = "skuBrandName", StringLength = 50)] + public string SkuBrandName { get; set; } + + /// + /// SKU三级类目Id + /// + [Column(Name = "skuCid3", StringLength = 50)] + public string SkuCid3 { get; set; } /// /// 总加购人数 /// - [Column(Name = "totalCartCnt")] - public int? TotalCartCnt { get; set; } + [Column(Name = "totalCartCnt", DbType = "int")] + public int? TotalCartCnt { get; set; } = 0; + + /// + /// 总加购成本 + /// + [Column(Name = "totalCartCost", DbType = "decimal(18,2)")] + public decimal? TotalCartCost { get; set; } = 0.00M; /// /// 总订单数 /// - [Column(Name = "totalOrderCnt")] - public int? TotalOrderCnt { get; set; } + [Column(Name = "totalOrderCnt", DbType = "int")] + public int? TotalOrderCnt { get; set; } = 0; + + /// + /// 点击转化率 + /// + [Column(Name = "totalOrderCVS", DbType = "decimal(18,2)")] + public decimal? TotalOrderCVS { get; set; } = 0.00M; + + /// + /// ROI + /// + [Column(Name = "totalOrderROI", DbType = "decimal(18,2)")] + public decimal? TotalOrderROI { get; set; } = 0.00M; /// /// 总订单金额 /// - [Column(Name = "totalOrderSum")] - public decimal TotalOrderSum { get; set; } + [Column(Name = "totalOrderSum", DbType = "decimal(11,2)")] + public decimal? TotalOrderSum { get; set; } = 0.00M; + + /// + /// 预售订单行 + /// + [Column(Name = "totalPresaleOrderCnt", DbType = "int")] + public int? TotalPresaleOrderCnt { get; set; } = 0; + + /// + /// 预售订单金额 + /// + [Column(Name = "totalPresaleOrderSum", DbType = "decimal(18,2)")] + public decimal? TotalPresaleOrderSum { get; set; } = 0.00M; /// /// 访客数 /// - [Column(Name = "visitorCnt")] - public int VisitorCnt { get; set; } + [Column(Name = "visitorCnt", DbType = "int")] + public int? VisitorCnt { get; set; } = 0; + + /// + /// 访问页面数 + /// + [Column(Name = "visitPageCnt", DbType = "int")] + public int? VisitPageCnt { get; set; } = 0; + + /// + /// 访问时长 + /// + [Column(Name = "visitTimeAverage", DbType = "decimal(18,2)")] + public decimal? VisitTimeAverage { get; set; } = 0.00M; + } } diff --git a/BBWY.Server.Model/Db/JD/JDPopularizeCampaign.cs b/BBWY.Server.Model/Db/JD/JDPopularizeCampaign.cs index 946dd97e..bf6e19bb 100644 --- a/BBWY.Server.Model/Db/JD/JDPopularizeCampaign.cs +++ b/BBWY.Server.Model/Db/JD/JDPopularizeCampaign.cs @@ -1,4 +1,4 @@ -using FreeSql.DataAnnotations; +using FreeSql.DataAnnotations; using System; namespace BBWY.Server.Model.Db @@ -11,28 +11,50 @@ namespace BBWY.Server.Model.Db public partial class JDPopularizeCampaign { - [Column(IsPrimary = true)] + [Column(DbType = "bigint", IsPrimary = true)] public long Id { get; set; } /// /// 业务线(快车:2 京速推:134217728) /// - + [Column(DbType = "int")] public int? BusinessType { get; set; } /// /// 计划Id /// + [Column(DbType = "bigint")] public long? CampaignId { get; set; } + /// + /// 计划名称 + /// [Column(StringLength = 100)] public string CampaignName { get; set; } + /// + /// 文档无解释 + /// + [Column(Name = "campaignPutType", DbType = "int")] + public int? CampaignPutType { get; set; } + + /// + /// 计划类型 + /// + [Column(Name = "campaignType", DbType = "int")] + public int? CampaignType { get; set; } = 0; + + /// + /// 计划类型 + /// + [Column(Name = "campaignTypeExpand", DbType = "int")] + public int? CampaignTypeExpand { get; set; } = 0; + /// /// 点击数 /// - [Column(Name = "clicks")] - public int? Clicks { get; set; } + [Column(Name = "clicks", DbType = "int")] + public int? Clicks { get; set; } = 0; /// /// 总花费 @@ -40,20 +62,110 @@ namespace BBWY.Server.Model.Db [Column(DbType = "decimal(18,2)")] public decimal? Cost { get; set; } + /// + /// 领券数 + /// + [Column(Name = "couponCnt", DbType = "int")] + public int? CouponCnt { get; set; } = 0; + + /// + /// CPA + /// + [Column(DbType = "decimal(18,2)")] + public decimal? CPA { get; set; } = 0.00M; + + /// + /// 平均点击成本 + /// + [Column(DbType = "decimal(18,2)")] + public decimal? CPC { get; set; } = 0.00M; + + /// + /// 千次展现成本 + /// + [Column(DbType = "decimal(18,2)")] + public decimal? CPM { get; set; } = 0.00M; + [Column(DbType = "datetime")] public DateTime? CreateTime { get; set; } + /// + /// 点击率 + /// + [Column(DbType = "decimal(18,2)")] + public decimal? CTR { get; set; } = 0.00M; + /// /// 计费日期 /// [Column(DbType = "datetime")] public DateTime? Date { get; set; } + /// + /// 深度进店数 + /// + [Column(Name = "depthPassengerCnt", DbType = "int")] + public int? DepthPassengerCnt { get; set; } = 0; + + /// + /// 直接购物车数 + /// + [Column(Name = "directCartCnt", DbType = "int")] + public int? DirectCartCnt { get; set; } = 0; + + /// + /// 直接订单行 + /// + [Column(Name = "directOrderCnt", DbType = "int")] + public int? DirectOrderCnt { get; set; } = 0; + + /// + /// 直接订单金额 + /// + [Column(Name = "directOrderSum", DbType = "decimal(18,2)")] + public decimal? DirectOrderSum { get; set; } = 0.00M; + + /// + /// 商品关注数 + /// + [Column(Name = "goodsAttentionCnt", DbType = "int")] + public int? GoodsAttentionCnt { get; set; } = 0; + /// /// 展现次数 /// - [Column(Name = "impressions")] - public int? Impressions { get; set; } + [Column(Name = "impressions", DbType = "int")] + public int? Impressions { get; set; } = 0; + + /// + /// 间接购物车数 + /// + [Column(Name = "indirectCartCnt", DbType = "int")] + public int? IndirectCartCnt { get; set; } = 0; + + /// + /// 间接订单行 + /// + [Column(Name = "indirectOrderCnt", DbType = "int")] + public int? IndirectOrderCnt { get; set; } = 0; + + /// + /// 间接订单金额 + /// + [Column(Name = "indirectOrderSum", DbType = "decimal(18,2)")] + public decimal? IndirectOrderSum { get; set; } = 0.00M; + + /// + /// 下单新客数 + /// + [Column(Name = "newCustomersCnt", DbType = "int")] + public int? NewCustomersCnt { get; set; } = 0; + + /// + /// 下单日期 + /// + [Column(Name = "orderDate", DbType = "datetime")] + public DateTime? OrderDate { get; set; } /// /// 账号归属 @@ -61,20 +173,92 @@ namespace BBWY.Server.Model.Db [Column(Name = "pin")] public string Pin { get; set; } + /// + /// 预约数 + /// + [Column(Name = "preorderCnt", DbType = "int")] + public int? PreorderCnt { get; set; } = 0; + + /// + /// 文档无解释 + /// + [Column(Name = "putType", StringLength = 100)] + public string PutType { get; set; } + + /// + /// 店铺关注数 + /// + [Column(Name = "shopAttentionCnt", DbType = "int")] + public int? ShopAttentionCnt { get; set; } = 0; + [Column(DbType = "bigint")] public long? ShopId { get; set; } /// /// 总加购人数 /// - [Column(Name = "totalCartCnt")] - public int? TotalCartCnt { get; set; } + [Column(Name = "totalCartCnt", DbType = "int")] + public int? TotalCartCnt { get; set; } = 0; + + /// + /// 总加购成本 + /// + [Column(Name = "totalCartCost", DbType = "decimal(18,2)")] + public decimal? TotalCartCost { get; set; } = 0.00M; /// /// 总订单数 /// - [Column(Name = "totalOrderCnt")] - public int? TotalOrderCnt { get; set; } + [Column(Name = "totalOrderCnt", DbType = "int")] + public int? TotalOrderCnt { get; set; } = 0; + + /// + /// 点击转化率 + /// + [Column(Name = "totalOrderCVS", DbType = "decimal(18,2)")] + public decimal? TotalOrderCVS { get; set; } = 0.00M; + + /// + /// ROI + /// + [Column(Name = "totalOrderROI", DbType = "decimal(18,2)")] + public decimal? TotalOrderROI { get; set; } = 0.00M; + + /// + /// 总订单金额 + /// + [Column(Name = "totalOrderSum", DbType = "decimal(18,2)")] + public decimal? TotalOrderSum { get; set; } = 0.00M; + + /// + /// 预售订单行 + /// + [Column(Name = "totalPresaleOrderCnt", DbType = "int")] + public int? TotalPresaleOrderCnt { get; set; } = 0; + + /// + /// 预售订单金额 + /// + [Column(Name = "totalPresaleOrderSum", DbType = "decimal(18,2)")] + public decimal? TotalPresaleOrderSum { get; set; } = 0.00M; + + /// + /// 访客数 + /// + [Column(Name = "visitorCnt", DbType = "int")] + public int? VisitorCnt { get; set; } = 0; + + /// + /// 访问页面数 + /// + [Column(Name = "visitPageCnt", DbType = "int")] + public int? VisitPageCnt { get; set; } = 0; + + /// + /// 访问时长 + /// + [Column(Name = "visitTimeAverage", DbType = "decimal(18,2)")] + public decimal? VisitTimeAverage { get; set; } = 0.00M; } diff --git a/BBWY.Server.Model/Db/JDXX/Newskus.cs b/BBWY.Server.Model/Db/JDXX/Newskus.cs new file mode 100644 index 00000000..3cf75553 --- /dev/null +++ b/BBWY.Server.Model/Db/JDXX/Newskus.cs @@ -0,0 +1,426 @@ +using FreeSql.DataAnnotations; +using System; + +namespace JDXX.Model.Db +{ + [Table(Name = "newskus", DisableSyncStructure = true)] + public partial class Newskus + { + + /// + /// Id + /// + [Column(StringLength = 50, IsPrimary = true, IsNullable = false)] + public string Id { get; set; } + + /// + /// 加购物车数量 + /// + [Column(DbType = "int")] + public int? AddCardCount { get; set; } + + /// + /// 加购人数 + /// + [Column(DbType = "int")] + public int? AddCardMember { get; set; } + + /// + /// 加购率 + /// + [Column(DbType = "decimal(11,2)")] + public decimal? AddCardRate { get; set; } + + /// + /// 点击次数 + /// + [Column(DbType = "int")] + public int? ClickCount { get; set; } + + /// + /// 点击率 + /// + [Column(DbType = "decimal(11,2)")] + public decimal? ClickRate { get; set; } + + /// + /// 栏目订单 + /// + [Column(DbType = "int")] + public int? ColumnOrder { get; set; } + + /// + /// 转化率 + /// + [Column(DbType = "decimal(11,2)")] + public decimal? ConversionRate { get; set; } + + /// + /// 收费流量 + /// + [Column(DbType = "int")] + public int? CostUv { get; set; } + + /// + /// 创建时间 + /// + [Column(DbType = "datetime")] + public DateTime CreateTime { get; set; } + + /// + /// 盈亏小节 + /// + [Column(DbType = "decimal(19,4)")] + public decimal? EarningsPrice { get; set; } + + /// + /// 曝光量 + /// + [Column(DbType = "int")] + public int? Exposure { get; set; } + + /// + /// 快车点击率 + /// + [Column(DbType = "decimal(11,2)")] + public decimal? ExposureClickRate { get; set; } + + /// + /// 快车点击 + /// + [Column(DbType = "int")] + public int? ExpressClick { get; set; } + + /// + /// 快车花费 + /// + [Column(DbType = "decimal(19,4)")] + public decimal? ExpressCost { get; set; } + + /// + /// 快车展现 + /// + + public decimal? ExpressExposure { get; set; } + + /// + /// 快车订单 + /// + [Column(DbType = "int")] + public int? ExpressOrder { get; set; } + + /// + /// 快车成交额 + /// + [Column(DbType = "decimal(19,4)")] + public decimal? ExpressPayPrice { get; set; } + + /// + /// 快车人均点击 + /// + [Column(DbType = "decimal(11,4)")] + public decimal? ExpressPeopleClick { get; set; } + + /// + /// 快车访客 + /// + [Column(DbType = "int")] + public int? ExpressUv { get; set; } + + /// + /// 免费订单 + /// + [Column(DbType = "int")] + public int? FreeOrder { get; set; } + + /// + /// 免费成交额 + /// + [Column(DbType = "decimal(19,4)")] + public decimal? FreePayPrice { get; set; } + + /// + /// 免费流量 + /// + [Column(DbType = "int")] + public int? FreeUv { get; set; } + + /// + /// 首页访客 + /// + [Column(DbType = "int")] + public int? IndexUv { get; set; } + + /// + /// 是否收藏 + /// + [Column(DbType = "tinyint")] + public sbyte? IsStar { get; set; } + + /// + /// 新品交易榜单 + /// + [Column(DbType = "int")] + public int? NewSaleTopIndex { get; set; } + + /// + /// 新品人气榜单 + /// + [Column(DbType = "int")] + public int? NewUvTopIndex { get; set; } + + /// + /// 一级类目 + /// + [Column(StringLength = 50)] + public string OneCatId { get; set; } + + /// + /// 其他订单 + /// + [Column(DbType = "int")] + public int? OtherOrder { get; set; } + + /// + /// 其他成交额 + /// + [Column(DbType = "decimal(19,4)")] + public decimal? OtherPrice { get; set; } + + /// + /// 其他访客 + /// + [Column(DbType = "int")] + public int? OtherUv { get; set; } + + /// + /// 流量路径 + /// + [Column(StringLength = -2)] + public string PathList { get; set; } + + /// + /// 下单商品件数 + /// + [Column(DbType = "int")] + public int? PayItemCount { get; set; } + + /// + /// 下单客户数 + /// + [Column(DbType = "int")] + public int? PayMember { get; set; } + + /// + /// 下单数 + /// + [Column(DbType = "int")] + public int? PayOrder { get; set; } + + /// + /// 下单金额 + /// + [Column(DbType = "decimal(19,4)")] + public decimal? PayPrice { get; set; } + + /// + /// 下单转化率 + /// + [Column(DbType = "decimal(11,2)")] + public decimal? PayRate { get; set; } + + /// + /// 毛利 + /// + [Column(DbType = "decimal(19,4)")] + public decimal? Profits { get; set; } + + /// + /// 流量 + /// + [Column(DbType = "int")] + public int? Pv { get; set; } + + /// + /// 真实转化率 + /// + [Column(DbType = "decimal(11,2)")] + public decimal? RealConversionRate { get; set; } + + /// + /// 真实成交额 + /// + [Column(DbType = "decimal(19,4)")] + public decimal? RealPrice { get; set; } + + /// + /// 成交客户数 + /// + [Column(DbType = "int")] + public int? SaleMember { get; set; } + + /// + /// 成交金额 + /// + [Column(DbType = "decimal(19,4)")] + public decimal? SalePrice { get; set; } + + /// + /// 成交转化率 + /// + [Column(DbType = "decimal(11,2)")] + public decimal? SaleRate { get; set; } + + /// + /// 成交件数 + /// + [Column(DbType = "int")] + public int? Sales { get; set; } + + /// + /// 交易榜单排名 + /// + [Column(DbType = "int")] + public int? SaleTopIndex { get; set; } + + /// + /// 风向标 + /// + [Column(DbType = "decimal(11,2)")] + public decimal? ScoreRank { get; set; } + + /// + /// 刷单花费 + /// + [Column(DbType = "decimal(19,4)")] + public decimal? SdCost { get; set; } + + /// + /// 刷单单量 + /// + [Column(DbType = "int")] + public int? SdOrder { get; set; } + + /// + /// 刷单成交额 + /// + [Column(DbType = "decimal(19,4)")] + public decimal? SdPrice { get; set; } + + /// + /// 搜索访客 + /// + [Column(DbType = "int")] + public int? SearchUv { get; set; } + + /// + /// 二级类目 + /// + [Column(StringLength = 50)] + public string SecondCatId { get; set; } + + /// + /// 自主订单 + /// + [Column(DbType = "int")] + public int? SelfOrder { get; set; } + + /// + /// 店铺ID + /// + [Column(StringLength = 50)] + public string ShopId { get; set; } + + /// + /// 海投点击 + /// + [Column(DbType = "int")] + public int? ShotgunClick { get; set; } + + /// + /// 海投点击率 + /// + [Column(DbType = "decimal(11,2)")] + public decimal? ShotgunClickRate { get; set; } + + /// + /// 海投花费 + /// + [Column(DbType = "decimal(19,4)")] + public decimal? ShotgunCost { get; set; } + + /// + /// 海投展现 + /// + [Column(DbType = "decimal(11,2)")] + public decimal? ShotgunExposure { get; set; } + + /// + /// 海投订单 + /// + [Column(DbType = "int")] + public int? ShotgunOrder { get; set; } + + /// + /// 海投成交额 + /// + [Column(DbType = "decimal(19,4)")] + public decimal? ShotgunPayPrice { get; set; } + + /// + /// 海投人均点击 + /// + [Column(DbType = "decimal(11,4)")] + public decimal? ShotgunPeopleClick { get; set; } + + /// + /// 海投访客 + /// + [Column(DbType = "int")] + public int? ShotgunUv { get; set; } + + /// + /// sku + /// + [Column(StringLength = 50)] + public string Sku { get; set; } + + /// + /// Spu + /// + [Column(StringLength = 50)] + public string Spu { get; set; } + + /// + /// 推荐访客 + /// + [Column(DbType = "int")] + public int? StarUv { get; set; } + + /// + /// 三级类目 + /// + [Column(StringLength = 50)] + public string ThirdCatId { get; set; } + + /// + /// 总花费 + /// + [Column(DbType = "decimal(19,4)")] + public decimal? TotalCost { get; set; } + + /// + /// 访客 + /// + [Column(DbType = "int")] + public int? Uv { get; set; } + + /// + /// 人气榜单排名 + /// + [Column(DbType = "int")] + public int? UvTopIndex { get; set; } + + } + +} diff --git a/BBWY.Server.Model/Db/Order/Order.cs b/BBWY.Server.Model/Db/Order/Order.cs index 0fc9fbd0..ae2beaaf 100644 --- a/BBWY.Server.Model/Db/Order/Order.cs +++ b/BBWY.Server.Model/Db/Order/Order.cs @@ -246,6 +246,12 @@ namespace BBWY.Server.Model.Db [Column(IsIgnore = true)] public bool IsManualEdited { get; set; } = false; + /// + /// 是否预估成本 + /// + [Column(IsIgnore = true)] + public bool IsEstimateCost { get; set; } = false; + /// /// 退款金额 /// diff --git a/BBWY.Server.Model/Db/Order/OrderCost.cs b/BBWY.Server.Model/Db/Order/OrderCost.cs index c02bc436..addd12ae 100644 --- a/BBWY.Server.Model/Db/Order/OrderCost.cs +++ b/BBWY.Server.Model/Db/Order/OrderCost.cs @@ -84,6 +84,12 @@ namespace BBWY.Server.Model.Db /// [Column(DbType = "decimal(20,2)")] public decimal AfterTotalCost { get; set; } = 0.0M; + + /// + /// 是否为预估成本 + /// + [Column(DbType = "bit")] + public bool IsEstimateCost { get; set; } = false; } } diff --git a/BBWY.Server.Model/Db/Order/OrderCostDetail.cs b/BBWY.Server.Model/Db/Order/OrderCostDetail.cs index 19f8b9a8..e2f4c552 100644 --- a/BBWY.Server.Model/Db/Order/OrderCostDetail.cs +++ b/BBWY.Server.Model/Db/Order/OrderCostDetail.cs @@ -90,11 +90,11 @@ namespace BBWY.Server.Model.Db [Column(DbType = "decimal(20,2)")] public decimal ConsumableAmount { get; set; } = 0.00M; - /// - /// 仓储费 - /// - [Column(DbType = "decimal(20,2)")] - public decimal StorageAmount { get; set; } = 0.00M; + ///// + ///// 仓储费 + ///// + //[Column(DbType = "decimal(20,2)")] + //public decimal StorageAmount { get; set; } = 0.00M; [Column(DbType = "bit")] public bool IsEnabled { get; set; } = true; @@ -104,19 +104,30 @@ namespace BBWY.Server.Model.Db /// [Column(DbType = "decimal(20,2)")] public decimal SkuGrossProfit { get; set; } = 0.00M; + + /// + /// 包装人工费 + /// + [Column(DbType = "decimal(20,2)")] + public decimal PackagingLaborAmount { get; set; } = 0.00M; + /// - /// 总计 + /// 总计(不含发货运费) /// [Column(IsIgnore = true)] public decimal TotalCost { get { - return SkuAmount + PurchaseFreight + FirstFreight + InStorageAmount + OutStorageAmount + StorageAmount + ConsumableAmount; + return SkuAmount + PurchaseFreight + FirstFreight + InStorageAmount + OutStorageAmount + PackagingLaborAmount + ConsumableAmount; } } - //[Column(DbType = "decimal(20,2)")] - //public decimal TotalCost { get; set; } = 0.00M; + + /// + /// 是否为预估成本 + /// + [Column(DbType = "bit")] + public bool IsEstimateCost { get; set; } = false; } } diff --git a/BBWY.Server.Model/Db/Order/SkuRecentCost.cs b/BBWY.Server.Model/Db/Order/SkuRecentCost.cs new file mode 100644 index 00000000..eb3cea6b --- /dev/null +++ b/BBWY.Server.Model/Db/Order/SkuRecentCost.cs @@ -0,0 +1,100 @@ +using FreeSql.DataAnnotations; +using System; + +namespace BBWY.Server.Model.Db +{ + + [Table(Name = "skurecentcost", DisableSyncStructure = true)] + public partial class SkuRecentCost + { + + [Column(StringLength = 50, IsPrimary = true, IsNullable = false)] + public string SkuId { get; set; } + + [Column(DbType = "datetime")] + public DateTime? CreateTime { get; set; } + + [Column(StringLength = 50)] + public string ProductId { get; set; } + + /// + /// 最近一笔订单来源 + /// + [Column(StringLength = 50)] + public string RecentOrderId { get; set; } + + [Column(DbType = "bigint")] + public long? ShopId { get; set; } + + /// + /// 耗材费(单件) + /// + [Column(DbType = "decimal(20,2)")] + public decimal? SingleConsumableAmount { get; set; } = 0.00M; + + /// + /// 发货运费(单件) + /// + [Column(DbType = "decimal(20,2)")] + public decimal? SingleDeliveryFreight { get; set; } = 0.00M; + + /// + /// 头程运费(单件) + /// + [Column(DbType = "decimal(20,2)")] + public decimal? SingleFirstFreight { get; set; } + + /// + /// 采购运费(单件) + /// + [Column(DbType = "decimal(20,2)")] + public decimal? SingleFreight { get; set; } = 0.00M; + + /// + /// 入仓操作费(单件) + /// + [Column(DbType = "decimal(20,2)")] + public decimal? SingleInStorageAmount { get; set; } = 0.00M; + + /// + /// 操作费(单件) + /// + [Column(DbType = "decimal(20,2)")] + public decimal? SingleOperationAmount { get; set; } = 0.00M; + + /// + /// 出仓操作费(单件) + /// + [Column(DbType = "decimal(20,2)")] + public decimal? SingleOutStorageAmount { get; set; } = 0.00M; + + ///// + ///// 退货入仓操作费(单件) + ///// + //[Column(DbType = "decimal(20,2)")] + //public decimal? SingleRefundInStorageAmount { get; set; } = 0.00M; + + /// + /// SKU成本(单件) + /// + [Column(DbType = "decimal(20,2)")] + public decimal? SingleSkuAmount { get; set; } + + ///// + ///// 仓储费(单件) + ///// + //[Column(DbType = "decimal(20,2)")] + //public decimal? SingleStorageAmount { get; set; } = 0.00M; + + [Column(DbType = "datetime")] + public DateTime? UpdateTime { get; set; } + + /// + /// 包装人工单价 + /// + [Column(DbType = "decimal(20,2)")] + public decimal SinglePackagingLaborAmount { get; set; } = 0.00M; + + } + +} diff --git a/BBWY.Server.Model/Db/PurchaseOrder/PurchaseOrder.cs b/BBWY.Server.Model/Db/PurchaseOrder/PurchaseOrder.cs index af005148..f7ddaaf5 100644 --- a/BBWY.Server.Model/Db/PurchaseOrder/PurchaseOrder.cs +++ b/BBWY.Server.Model/Db/PurchaseOrder/PurchaseOrder.cs @@ -17,29 +17,13 @@ namespace BBWY.Server.Model.Db [Column(DbType = "datetime")] public DateTime? CreateTime { get; set; } - /// - /// 头程运费 - /// - //[Column(DbType = "decimal(20,2)")] - //public decimal FirstFreight { get; set; } = 0.00M; - - /// - /// 采购运费 - /// - //[Column(DbType = "decimal(20,2)")] - //public decimal Freight { get; set; } = 0.00M; - + /// /// 产品Id /// [Column(StringLength = 50)] public string ProductId { get; set; } - /// - /// 采购金额 - /// - //[Column(DbType = "decimal(20,2)")] - //public decimal PurchaseAmount { get; set; } = 0.00M; /// /// 采购方式 @@ -106,11 +90,6 @@ namespace BBWY.Server.Model.Db [Column(DbType = "decimal(20,2)")] public decimal SingleFirstFreight { get; set; } = 0.00M; - /// - /// 单件操作费 - /// - //[Column(DbType = "decimal(20,2)")] - //public decimal SingleOperationAmount { get; set; } = 0.00M; /// /// 单件入仓操作费 @@ -136,17 +115,23 @@ namespace BBWY.Server.Model.Db [Column(DbType = "decimal(20,2)")] public decimal SingleConsumableAmount { get; set; } = 0.00M; + ///// + ///// 单件仓储费 + ///// + //[Column(DbType = "decimal(20,2)")] + //public decimal SingleStorageAmount { get; set; } = 0.00M; + /// - /// 单件仓储费 + /// 单件销售(尾程)运费(不参与均价计算) /// [Column(DbType = "decimal(20,2)")] - public decimal SingleStorageAmount { get; set; } = 0.00M; + public decimal SingleDeliveryFreight { get; set; } = 0.00M; /// - /// 单件销售运费(不参与均价计算) + /// 包装人工单价 /// [Column(DbType = "decimal(20,2)")] - public decimal SingleDeliveryFreight { get; set; } = 0.00M; + public decimal SinglePackagingLaborAmount { get; set; } = 0.00M; /// @@ -157,7 +142,7 @@ namespace BBWY.Server.Model.Db { get { - return SingleSkuAmount + SingleFreight + SingleFirstFreight + SingleInStorageAmount + SingleOutStorageAmount + SingleConsumableAmount + SingleStorageAmount; + return SingleSkuAmount + SingleFreight + SingleFirstFreight + SingleInStorageAmount + SingleOutStorageAmount + SingleConsumableAmount + SinglePackagingLaborAmount; } } } diff --git a/BBWY.Server.Model/Dto/Request/Order/ManualCalculationCostRequest.cs b/BBWY.Server.Model/Dto/Request/Order/ManualCalculationCostRequest.cs index 7db49a37..8b65b12e 100644 --- a/BBWY.Server.Model/Dto/Request/Order/ManualCalculationCostRequest.cs +++ b/BBWY.Server.Model/Dto/Request/Order/ManualCalculationCostRequest.cs @@ -63,12 +63,18 @@ namespace BBWY.Server.Model.Dto /// public decimal ConsumableAmount { get; set; } = 0.00M; + ///// + ///// 仓储费 + ///// + //public decimal StorageAmount { get; set; } = 0.00M; + /// - /// 仓储费 + /// 打包费 /// - public decimal StorageAmount { get; set; } = 0.00M; + public decimal PackagingLaborAmount { get; set; } = 0.00M; + - public decimal TotalCost { get; set; } = 0M; + public decimal TotalCost { get; set; } = 0M; public decimal UnitCost { get; set; } = 0M; } diff --git a/BBWY.Server.Model/Dto/Request/PurchaseOrder/AddPurchaseOrderRequest.cs b/BBWY.Server.Model/Dto/Request/PurchaseOrder/AddPurchaseOrderRequest.cs index e1721e81..0f635a21 100644 --- a/BBWY.Server.Model/Dto/Request/PurchaseOrder/AddPurchaseOrderRequest.cs +++ b/BBWY.Server.Model/Dto/Request/PurchaseOrder/AddPurchaseOrderRequest.cs @@ -60,13 +60,13 @@ /// public decimal SingleConsumableAmount { get; set; } = 0.00M; - /// - /// 单件仓储费 - /// - public decimal SingleStorageAmount { get; set; } + ///// + ///// 单件仓储费 + ///// + //public decimal SingleStorageAmount { get; set; } /// - /// 单件销售运费(不参与均价计算) + /// 单件尾程销售运费(不参与均价计算) /// public decimal SingleDeliveryFreight { get; set; } @@ -82,8 +82,13 @@ public decimal SingleOutStorageAmount { get; set; } = 0.00M; /// - /// 退货入仓操作费 + /// 单间包装人工费 /// - public decimal SingleRefundInStorageAmount { get; set; } = 0.00M; + public decimal SinglePackagingLaborAmount { get; set; } = 0.00M; + + ///// + ///// 退货入仓操作费 + ///// + //public decimal SingleRefundInStorageAmount { get; set; } = 0.00M; } } diff --git a/BBWY.Server.Model/Dto/Request/PurchaseOrder/EditPurchaseOrderRequest.cs b/BBWY.Server.Model/Dto/Request/PurchaseOrder/EditPurchaseOrderRequest.cs index 1c021027..a12e0ca5 100644 --- a/BBWY.Server.Model/Dto/Request/PurchaseOrder/EditPurchaseOrderRequest.cs +++ b/BBWY.Server.Model/Dto/Request/PurchaseOrder/EditPurchaseOrderRequest.cs @@ -34,13 +34,13 @@ /// public decimal SingleConsumableAmount { get; set; } = 0.00M; - /// - /// 单件仓储费 - /// - public decimal SingleStorageAmount { get; set; } = 0.00M; + ///// + ///// 单件仓储费 + ///// + //public decimal SingleStorageAmount { get; set; } = 0.00M; /// - /// 单件销售运费(不参与均价计算) + /// 单件尾程销售运费(不参与均价计算) /// public decimal SingleDeliveryFreight { get; set; } = 0.00M; @@ -56,8 +56,13 @@ public decimal SingleOutStorageAmount { get; set; } = 0.00M; /// - /// 退货入仓费 + /// 单间包装人工费 /// - public decimal SingleRefundInStorageAmount { get; set; } = 0.00M; + public decimal SinglePackagingLaborAmount { get; set; } = 0.00M; + + ///// + ///// 退货入仓费 + ///// + //public decimal SingleRefundInStorageAmount { get; set; } = 0.00M; } } \ No newline at end of file diff --git a/BBWY.Server.Model/Dto/Request/PurchaseOrder/OnlinePurchase/PreviewOrderReuqest.cs b/BBWY.Server.Model/Dto/Request/PurchaseOrder/OnlinePurchase/PreviewOrderReuqest.cs index 23d13394..c0d0a210 100644 --- a/BBWY.Server.Model/Dto/Request/PurchaseOrder/OnlinePurchase/PreviewOrderReuqest.cs +++ b/BBWY.Server.Model/Dto/Request/PurchaseOrder/OnlinePurchase/PreviewOrderReuqest.cs @@ -12,6 +12,6 @@ namespace BBWY.Server.Model.Dto public ConsigneeRequest Consignee { get; set; } - public IList CargoParamList { get; set; } + public List CargoParamList { get; set; } } } diff --git a/BBWY.Server.Model/Dto/Request/Sync/SkuRecentCostRequest.cs b/BBWY.Server.Model/Dto/Request/Sync/SkuRecentCostRequest.cs new file mode 100644 index 00000000..4c16bdb9 --- /dev/null +++ b/BBWY.Server.Model/Dto/Request/Sync/SkuRecentCostRequest.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace BBWY.Server.Model.Dto +{ + public class SkuRecentCostRequest + { + public long? ShopId { get; set; } + + public DateTime StartDate { get; set; } + + public DateTime EndDate { get; set; } + } +} diff --git a/BBWY.Server.Model/Dto/Response/BillCorrection/BillCorrectionOrderResponse.cs b/BBWY.Server.Model/Dto/Response/BillCorrection/BillCorrectionOrderResponse.cs index 2cdae37c..b0bf323b 100644 --- a/BBWY.Server.Model/Dto/Response/BillCorrection/BillCorrectionOrderResponse.cs +++ b/BBWY.Server.Model/Dto/Response/BillCorrection/BillCorrectionOrderResponse.cs @@ -61,6 +61,8 @@ namespace BBWY.Server.Model.Dto /// public decimal ConsumableAmount { get; set; } = 0.00M; + public decimal PackagingLaborAmount { get; set; } = 0.00M; + /// /// 仓储费 /// diff --git a/BBWY.Server.Model/Dto/Response/Order/ExportOrderResponse.cs b/BBWY.Server.Model/Dto/Response/Order/ExportOrderResponse.cs index 2ace70b3..d92d8ee4 100644 --- a/BBWY.Server.Model/Dto/Response/Order/ExportOrderResponse.cs +++ b/BBWY.Server.Model/Dto/Response/Order/ExportOrderResponse.cs @@ -32,11 +32,6 @@ namespace BBWY.Server.Model.Dto /// public decimal FirstFreight { get; set; } - /// - /// 仓储费 - /// - public decimal StorageAmount { get; set; } - /// /// 发货快递费 /// @@ -94,6 +89,11 @@ namespace BBWY.Server.Model.Dto /// public decimal ConsumableAmount { get; set; } + /// + /// 人工打包费 + /// + public decimal PackagingLaborAmount { get; set; } + /// /// 入仓操作费 /// diff --git a/BBWY.Server.Model/MappingProfiles.cs b/BBWY.Server.Model/MappingProfiles.cs index e7db91b6..1a320ad0 100644 --- a/BBWY.Server.Model/MappingProfiles.cs +++ b/BBWY.Server.Model/MappingProfiles.cs @@ -52,6 +52,7 @@ namespace BBWY.Server.Model .ForPath(t => t.OrderCost.PlatformCommissionRatio, opt => opt.MapFrom(f => f.PlatformCommissionRatio ?? 0)) .ForPath(t => t.OrderCost.PreferentialAmount, opt => opt.MapFrom(f => f.PreferentialAmount)) .ForPath(t => t.OrderCost.IsManualEdited, opt => opt.MapFrom(f => f.IsManualEdited)) + .ForPath(t => t.OrderCost.IsEstimateCost, opt => opt.MapFrom(f => f.IsEstimateCost)) .ForPath(t => t.OrderCost.SDCommissionAmount, opt => opt.MapFrom(f => f.SDCommissionAmount)) .ForPath(t => t.OrderCost.SDOrderAmount, opt => opt.MapFrom(f => f.SDOrderAmount)) .ForPath(t => t.OrderCost.RefundAmount, opt => opt.MapFrom(f => f.RefundAmount)) diff --git a/BBWY.Test/BBWY.Test.csproj b/BBWY.Test/BBWY.Test.csproj index bd90d253..7ede10c4 100644 --- a/BBWY.Test/BBWY.Test.csproj +++ b/BBWY.Test/BBWY.Test.csproj @@ -18,8 +18,8 @@ - - + + diff --git a/BBWY.Test/Program.cs b/BBWY.Test/Program.cs index af0464aa..eec7bc71 100644 --- a/BBWY.Test/Program.cs +++ b/BBWY.Test/Program.cs @@ -68,49 +68,51 @@ namespace BBWY.Test //var token = "50a4c0f5c55848b5a8a715709e8d6fe0jntb"; //卿卿玩具专营店 var fsql = new FreeSql.FreeSqlBuilder().UseConnectionString(FreeSql.DataType.MySql, "data source=rm-bp1508okrh23710yfao.mysql.rds.aliyuncs.com;port=3306;user id=qyroot;password=kaicn1132+-;initial catalog=bbwy_test;charset=utf8;sslmode=none;").Build(); - var sercvice = new ServiceCollection(); - sercvice.AddHttpClient(); - var servicePriovder = sercvice.BuildServiceProvider(); - var restApiService = new Common.Http.RestApiService(servicePriovder.GetRequiredService()); + //var sercvice = new ServiceCollection(); + //sercvice.AddHttpClient(); + //var servicePriovder = sercvice.BuildServiceProvider(); + //var restApiService = new Common.Http.RestApiService(servicePriovder.GetRequiredService()); + + //var files = System.IO.Directory.GetFiles(@"C:\Users\pengcong001\Desktop\bbwylog"); + //var startTime = DateTime.Parse("2023-10-16"); + //var endTime = DateTime.Parse("2023-11-22"); + //foreach (var file in files) + //{ + // var fileName = file.Substring(file.LastIndexOf("\\") + 1); + // Console.WriteLine(file); + + // var lines = System.IO.File.ReadAllLines(file); + // var priceModifyMsgList = lines.Where(l => !string.IsNullOrEmpty(l) && l.Contains("ORDER_BUYER_VIEW_ORDER_PRICE_MODIFY")).ToList(); + // var orderIndex = 0; + // foreach (var priceModifyMsg in priceModifyMsgList) + // { + // orderIndex++; + // var poId = JObject.Parse(priceModifyMsg)["data"]["orderId"].ToString(); + // var orderDropshipping = fsql.Select().Where(o => o.PurchaseOrderId == poId).ToOne(); + // if (orderDropshipping == null) + // continue; + // var orderId = orderDropshipping.OrderId; + // var shopId = orderDropshipping.ShopId; + + // var result = restApiService.SendRequest("http://bbwytest.qiyue666.com/", "api/test/RepairSkuDetailAndSkuGriooProfit", new + // { + // StartTime = startTime, + // EndTime = endTime, + // ShopId = shopId, + // OrderId = orderId, + // OrderIdList = new List() + // }, null, HttpMethod.Post); + // Console.WriteLine($"{DateTime.Now} {fileName} {orderIndex}/{priceModifyMsgList.Count()} HttpResult{result.StatusCode}"); + // Thread.Sleep(2000); + // } + // try + // { + // System.IO.File.Delete(file); + // } + // catch { } + //} + - var files = System.IO.Directory.GetFiles(@"C:\Users\pengcong001\Desktop\bbwylog"); - var startTime = DateTime.Parse("2023-10-16"); - var endTime = DateTime.Parse("2023-11-22"); - foreach (var file in files) - { - var fileName = file.Substring(file.LastIndexOf("\\") + 1); - Console.WriteLine(file); - - var lines = System.IO.File.ReadAllLines(file); - var priceModifyMsgList = lines.Where(l => !string.IsNullOrEmpty(l) && l.Contains("ORDER_BUYER_VIEW_ORDER_PRICE_MODIFY")).ToList(); - var orderIndex = 0; - foreach (var priceModifyMsg in priceModifyMsgList) - { - orderIndex++; - var poId = JObject.Parse(priceModifyMsg)["data"]["orderId"].ToString(); - var orderDropshipping = fsql.Select().Where(o => o.PurchaseOrderId == poId).ToOne(); - if (orderDropshipping == null) - continue; - var orderId = orderDropshipping.OrderId; - var shopId = orderDropshipping.ShopId; - - var result = restApiService.SendRequest("http://bbwytest.qiyue666.com/", "api/test/RepairSkuDetailAndSkuGriooProfit", new - { - StartTime = startTime, - EndTime = endTime, - ShopId = shopId, - OrderId = orderId, - OrderIdList = new List() - }, null, HttpMethod.Post); - Console.WriteLine($"{DateTime.Now} {fileName} {orderIndex}/{priceModifyMsgList.Count()} HttpResult{result.StatusCode}"); - Thread.Sleep(2000); - } - try - { - System.IO.File.Delete(file); - } - catch { } - } diff --git a/JD.API/JD.API.csproj b/JD.API/JD.API.csproj index a8271105..6f51e6c7 100644 --- a/JD.API/JD.API.csproj +++ b/JD.API/JD.API.csproj @@ -6,8 +6,8 @@ - - + + diff --git a/QuanTan.SDK/Model/Response/Product/QuanTanProductResponse.cs b/QuanTan.SDK/Model/Response/Product/QuanTanProductResponse.cs index f809cf47..5e6cdb4f 100644 --- a/QuanTan.SDK/Model/Response/Product/QuanTanProductResponse.cs +++ b/QuanTan.SDK/Model/Response/Product/QuanTanProductResponse.cs @@ -39,7 +39,7 @@ namespace QuanTan.SDK.Model public string Logo { get; set; } public decimal Price { get; set; } //public decimal RetailPrice { get; set; } - public int Stock { get; set; } + public long Stock { get; set; } //public decimal Volume { get; set; } //public string weight { get; set; } public string BarCode { get; set; }