using BBWY.Common.Http; using BBWY.Common.Models; using BBWY.Server.Model; using BBWY.Server.Model.Db; using BBWY.Server.Model.Db.Mds; using BBWY.Server.Model.Dto; using FreeSql; using Microsoft.Extensions.Options; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Threading; using BBWY.Server.Business.Extensions; using Newtonsoft.Json; using System.Net.Http; using System.Threading.Tasks; using Org.BouncyCastle.Crypto.Signers; namespace BBWY.Server.Business { public class TestBusiness : BasePlatformRelayBusiness, IDenpendency { private FreeSqlMultiDBManager freeSqlMultiDBManager; private VenderBusiness venderBusiness; private IFreeSql fsql; private OrderSyncBusiness orderSyncBusiness; private TaskSchedulerManager taskSchedulerManager; private PurchaseOrderBusiness purchaseOrderBusiness; public TestBusiness(RestApiService restApiService, IOptions options, FreeSqlMultiDBManager freeSqlMultiDBManager, VenderBusiness venderBusiness, YunDingBusiness yunDingBusiness, IFreeSql fsql, OrderSyncBusiness orderSyncBusiness, 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() { var noVenderShops = freeSqlMultiDBManager.MDSfsql.Select().Where(s => !string.IsNullOrEmpty(s.AppToken) && !string.IsNullOrEmpty(s.ShopId) && string.IsNullOrEmpty(s.VenderId)).ToList(); //IList < IUpdate < Shops >> updateShops = new List>(); foreach (var noVenderShop in noVenderShops) { if (string.IsNullOrEmpty(noVenderShop.AppKey)) { } var venderResponse = venderBusiness.GetVenderInfo(new Model.Dto.PlatformRequest() { AppKey = noVenderShop.AppKey, AppSecret = noVenderShop.AppSecret, AppToken = noVenderShop.AppToken, Platform = (Enums.Platform)noVenderShop.PlatformId }); freeSqlMultiDBManager.MDSfsql.Update(noVenderShop.Id).Set(s => s.VenderId, venderResponse.VenderId).ExecuteAffrows(); } } public void StatisticsProduct() { var shopList = venderBusiness.GetShopList(platform: Enums.Platform.京东); var list = new List(); foreach (var shop in shopList) { long shopId = long.Parse(shop.ShopId); var productCount = fsql.Select().Where(p => p.ShopId == shopId) .Where(p => p.State == 8) .Count(); var productSkuCount = fsql.Select().Where(p => p.ShopId == shopId) .Where(p => p.State == 1) .Count(); var jpspu_sql = $"select count(1) as Count,t.ShopId from (select max(osku1.Id) as oskuId,max(osku1.CreateTime) as maxTime,osku1.ProductId,o.ShopId from OrderSku osku1 inner join `Order` o on osku1.OrderId=o.Id where o.OrderState !=6 and o.IsGift=0 and o.StartTime>='2022-05-01' and o.ShopId='{shopId}' Group By osku1.ProductId,o.ShopId order by maxTime desc,osku1.ProductId desc,o.ShopId desc) as t inner join orderSku osku on t.oskuId=osku.Id inner join `order` o on osku.OrderId=o.Id inner join product p on t.ProductId = p.Id where o.StorageType in (0,1) and p.state=8 group by t.ShopId"; //京配spu数 var jpspu = fsql.Ado.QuerySingle(jpspu_sql); var jpsku_sql = $"select count(1) as Count,t.ShopId from (select max(osku1.Id) as oskuId,max(osku1.CreateTime) as maxTime,osku1.SkuId,o.ShopId from OrderSku osku1 inner join `Order` o on osku1.OrderId=o.Id where o.OrderState !=6 and o.IsGift=0 and o.StartTime>='2022-05-01' and o.ShopId='{shopId}' Group By osku1.SkuId,o.ShopId order by maxTime desc,osku1.SkuId desc,o.ShopId desc) as t inner join orderSku osku on t.oskuId=osku.Id inner join `order` o on osku.OrderId=o.Id inner join productsku psku on t.SkuId = psku.Id where o.StorageType in (0,1) and psku.State=1 group by t.ShopId"; var jpsku = fsql.Ado.QuerySingle(jpsku_sql); //list.Add($"{shop.ShopName},{productCount},{productSkuCount},{productSkuCount}/{productCount},{jpspu?.Count ?? 0},{jpsku?.Count ?? 0},{(productCount == 0 ? 0 : Math.Round(1.0 * jpspu?.Count ?? 0 / productCount * 100, 2))}%,{(productSkuCount == 0 ? 0 : Math.Round(1.0 * jpsku?.Count ?? 0 / productSkuCount * 100, 2))}%"); var jpspuCount = jpspu?.Count ?? 0; var jpskuCount = jpsku?.Count ?? 0; var jpspuPercent = productCount == 0 ? 0 : Math.Round(1.0 * jpspuCount / productCount * 100, 2); var jpskuPercent = productSkuCount == 0 ? 0 : Math.Round(1.0 * jpskuCount / productSkuCount * 100, 2); list.Add($"{shop.ShopName},{productCount},{productSkuCount},{productSkuCount}/{productCount},{jpspuCount},{jpskuCount},{jpspuPercent}%,{jpskuPercent}%"); } list.Insert(0, "店铺,SPU数,SKU数,SKU/SPU,京配SPU数,京配SKU数,京配SPU占比,京配SKU占比"); var filePath = Path.Combine(AppContext.BaseDirectory, "result.csv"); File.WriteAllLines(filePath, list, System.Text.Encoding.UTF8); } public void XiuFu() { var st = DateTime.Parse("2023-09-01"); var orderList = fsql.Select().InnerJoin((oc, o) => oc.OrderId == o.Id) .Where((oc, o) => o.OrderState != Enums.OrderState.已取消 && o.StartTime >= st && o.PreferentialAmount == 0) .GroupBy((oc, o) => oc.OrderId) .ToList(g => new Order { Id = g.Key, PreferentialAmount = g.Sum(g.Value.Item1.CouponPrice) }); List> updateOrderList = new List>(); var totalCount = orderList.Count(); for (var i = 0; i < totalCount; i++) { var order = orderList[i]; updateOrderList.Add(fsql.Update(order.Id).Set(o => o.PreferentialAmount, order.PreferentialAmount)); if (updateOrderList.Count() == 50) { Console.WriteLine($"执行数据库更新 {i}/{totalCount}"); fsql.Transaction(() => { foreach (var update in updateOrderList) update.ExecuteAffrows(); }); updateOrderList.Clear(); } } if (updateOrderList.Count() > 0) { fsql.Transaction(() => { foreach (var update in updateOrderList) update.ExecuteAffrows(); }); updateOrderList.Clear(); } Console.WriteLine("更新完毕"); } public void RepairSkuDetailAndSkuGriooProfit(RepairSkuDetailAndSkuGriooProfit request) { request.EndTime = request.EndTime.Date.AddDays(1).AddSeconds(-1); var banedList = new List() { "森王汽车用品专营店", "森王玩具专营店", "广发玩具专营店", "广发汽车用品专营店", "言义汽车用品专营店", "杰博玩具专营店", "安吉玩具专营店", "布莱特玩具专营店", "畅阳汽车用品专营店", "熊猴汽车用品专营店", "布莱特汽车用品专营店", "越驭玩具专营店", "言义玩具专营店", "瑞源汽车用品专营店", "熊猴玩具专营店", "奥德汽车用品专营店", "创天户外专营店", "桑妮玩具专营店", "瑞源玩具专营店" }; var shopList = venderBusiness.GetShopList(request.ShopId, Enums.Platform.京东); //var shopIndex = 0; foreach (var shop in shopList) { Task.Factory.StartNew(() => { Console.WriteLine(shop.ShopName); //shopIndex++; //Console.WriteLine($"shopProgress {shopIndex}/{shopList.Count()}"); var shopId = long.Parse(shop.ShopId); if (banedList.Contains(shop.ShopName)) return; var orderIdList = fsql.Select() .Where(o => o.ShopId == shopId && o.OrderState != Enums.OrderState.已取消 && o.StorageType != null && o.StorageType != Enums.StorageType.SD && o.StartTime >= request.StartTime && o.StartTime <= request.EndTime) .WhereIf(!string.IsNullOrEmpty(request.OrderId), o => o.Id == request.OrderId) .WhereIf(request.OrderIdList != null && request.OrderIdList.Count() > 0, o => request.OrderIdList.Contains(o.Id)) .OrderByDescending(o => o.StartTime) .ToList(o => o.Id); if (orderIdList.Count() == 0) return; fsql.Transaction(() => { fsql.Delete(orderIdList).ExecuteAffrows(); fsql.Delete().Where(on => orderIdList.Contains(on.OrderId)).ExecuteAffrows(); fsql.Delete().Where(op => orderIdList.Contains(op.OrderId)).ExecuteAffrows(); fsql.Update().Set(osku => osku.ShouldPay, 0).Where(osku => orderIdList.Contains(osku.OrderId)).ExecuteAffrows(); }); for (var i = 0; i < orderIdList.Count(); i++) { var orderId = orderIdList[i]; orderSyncBusiness.SyncOrder(shop, orderId); Console.WriteLine($"SyncOrder {shop.ShopName},SyncProgress {i + 1}/{orderIdList.Count()}"); } var orderList = fsql.Select(orderIdList).ToList(); var orderSkuList = fsql.Select().Where(osku => osku.Price > 0 && orderIdList.Contains(osku.OrderId)).ToList(); var orderCostDetailList = fsql.Select().Where(ocd => orderIdList.Contains(ocd.OrderId) && ocd.IsEnabled == true).ToList(); var orderCostList = fsql.Select(orderIdList).ToList(); var afterOrderList = fsql.Select().Where(af => orderIdList.Contains(af.OrderId)).ToList(); var orderTotalList = fsql.Select().Where(on => orderIdList.Contains(on.Id)).ToList(); var orderIndex = 0; foreach (var order in orderList) { orderIndex++; Console.WriteLine($"Calculation {shop.ShopName}, CalculationProgress {orderIndex}/{orderList.Count()}"); var currentOrderCostDetailList = orderCostDetailList.Where(ocd => ocd.OrderId == order.Id).ToList(); if (currentOrderCostDetailList.Count() > 0) { List> updateOrderCostDetailList = new List>(); var currentOrderSkuList = orderSkuList.Where(osku => osku.OrderId == order.Id).ToList(); foreach (var orderSku in currentOrderSkuList) { var ocd = currentOrderCostDetailList.FirstOrDefault(x => x.SkuId == orderSku.SkuId); if (ocd != null) { ocd.CalculationSkuGrossProfit(orderSku.ShouldPay ?? 0M, orderSku.PingTaiChengDanYouHuiQuan ?? 0M, orderSku.SuperRedEnvelope ?? 0M, orderSku.XianPinLeiDongQuan ?? 0M, orderSku.VenderFee ?? 0M, orderSku.JingDou ?? 0M, orderSku.DongQuan ?? 0M, orderSku.Balance ?? 0M, shop.PlatformCommissionRatio ?? 0.05M); var update = fsql.Update(ocd.Id).Set(x => x.SkuGrossProfit, ocd.SkuGrossProfit); updateOrderCostDetailList.Add(update); } } var currentAfterOrderList = afterOrderList.Where(af => af.OrderId == order.Id).ToList(); var orderTotal = orderTotalList.FirstOrDefault(on => on.Id == order.Id); var orderCost = orderCostList.FirstOrDefault(oc => oc.OrderId == order.Id); if (orderCost != null && orderTotal != null) { var actualAmount = order.OrderSellerPrice + order.FreightPrice + (order.PingTaiChengDanYouHuiQuan ?? 0M); orderCost.CalculationOrderProfitAndCost(actualAmount, currentAfterOrderList); if (updateOrderCostDetailList.Count() > 0) { fsql.Transaction(() => { foreach (var update in updateOrderCostDetailList) update.ExecuteAffrows(); fsql.Update(orderCost.OrderId).Set(oc => oc.Profit, orderCost.Profit) .Set(oc => oc.PlatformCommissionAmount, orderCost.PlatformCommissionAmount).ExecuteAffrows(); }); } } } } }, CancellationToken.None, TaskCreationOptions.LongRunning, taskSchedulerManager.RepairOrderTaskScheduler); } } public void RepairOrderProfit() { var startTime = DateTime.Parse("2023-12-12"); var orderList = fsql.Select().Where(o => o.IsGift == false && o.OrderState != Enums.OrderState.已取消 && 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) { index++; Console.WriteLine($"{DateTime.Now} OrderProgress {index}/{orderCostList.Count()}"); 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.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} 执行数据库更新"); fsql.Transaction(() => { foreach (var update in updateList) update.ExecuteAffrows(); foreach (var update in updateDetailList) update.ExecuteAffrows(); }); updateList.Clear(); updateDetailList.Clear(); } } if (updateList.Count() > 0) { Console.WriteLine($"{DateTime.Now} 最后执行数据库更新"); fsql.Transaction(() => { foreach (var update in updateList) update.ExecuteAffrows(); foreach (var update in updateDetailList) update.ExecuteAffrows(); }); updateList.Clear(); updateDetailList.Clear(); } } public void DeleteJDTask() { var appKey = "E1AA9247D5583A6D87449CE6AB290185"; var appSecret = "e479558ddd9e40f8929cfc00c6cbbc9c"; var appToken = "578d4074d5c04272af72de7f5fbe0ff2qwnz"; var promotionId = 6106235467; var httpResult = restApiService.SendRequest(GetPlatformRelayAPIHost(Enums.Platform.京东), "api/platformsdk/DeleteJDPromotionTask", new DeleteJDPromotionTaskRequest() { AppKey = appKey, AppSecret = appSecret, AppToken = appToken, Platform = Enums.Platform.京东, PromotionId = promotionId }, GetYunDingRequestHeader(), HttpMethod.Post); if (httpResult.StatusCode != System.Net.HttpStatusCode.OK) throw new BusinessException(httpResult.Content); var response = JsonConvert.DeserializeObject(httpResult.Content); 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 == 11817258 && 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 class JPCount { public int Count { get; set; } public long ShopId { get; set; } } }