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; namespace BBWY.Server.Business { public class TestBusiness : BasePlatformRelayBusiness, IDenpendency { private FreeSqlMultiDBManager freeSqlMultiDBManager; private VenderBusiness venderBusiness; private IFreeSql fsql; private OrderSyncBusiness orderSyncBusiness; public TestBusiness(RestApiService restApiService, IOptions options, FreeSqlMultiDBManager freeSqlMultiDBManager, VenderBusiness venderBusiness, YunDingBusiness yunDingBusiness, IFreeSql fsql, OrderSyncBusiness orderSyncBusiness) : base(restApiService, options, yunDingBusiness) { this.freeSqlMultiDBManager = freeSqlMultiDBManager; this.venderBusiness = venderBusiness; this.fsql = fsql; this.orderSyncBusiness = orderSyncBusiness; } 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) { shopIndex++; Console.WriteLine($"shopProgress {shopIndex}/{shopList.Count()}"); var shopId = long.Parse(shop.ShopId); if (banedList.Contains(shop.ShopName)) continue; var orderIdList = fsql.Select() .Where(o => o.ShopId == shopId && o.OrderState != Enums.OrderState.已取消 && o.StorageType != Enums.StorageType.SD && o.StartTime >= request.StartTime && o.StartTime <= request.EndTime) .WhereIf(!string.IsNullOrEmpty(request.OrderId), o => o.Id == request.OrderId) .ToList(o => o.Id); fsql.Transaction(() => { fsql.Delete(orderIdList).ExecuteAffrows(); fsql.Delete().Where(on => orderIdList.Contains(on.OrderId)).ExecuteAffrows(); fsql.Delete().Where(op => orderIdList.Contains(op.OrderId)).ExecuteAffrows(); fsql.Update().Set(osku => osku.ShouldPay, 0).Where(osku => orderIdList.Contains(osku.OrderId)).ExecuteAffrows(); }); foreach (var orderId in orderIdList) { orderSyncBusiness.SyncOrder(shop, orderId); Thread.Sleep(1000); } var orderList = fsql.Select(orderIdList).ToList(); var orderSkuList = fsql.Select().Where(osku => osku.Price > 0 && orderIdList.Contains(osku.OrderId)).ToList(); var orderCostDetailList = fsql.Select().Where(ocd => orderIdList.Contains(ocd.OrderId) && ocd.IsEnabled == true).ToList(); var orderCostList = fsql.Select(orderIdList).ToList(); var afterOrderList = fsql.Select().Where(af => orderIdList.Contains(af.OrderId)).ToList(); var orderTotalList = fsql.Select().Where(on => orderIdList.Contains(on.Id)).ToList(); var orderIndex = 0; foreach (var order in orderList) { orderIndex++; Console.WriteLine($"shopProgress {shopIndex}/{shopList.Count()}, orderProgress {orderIndex}/{orderList.Count()}"); var currentOrderCostDetailList = orderCostDetailList.Where(ocd => ocd.OrderId == order.Id).ToList(); if (currentOrderCostDetailList.Count() > 0) { List> updateOrderCostDetailList = new List>(); var currentOrderSkuList = orderSkuList.Where(osku => osku.OrderId == order.Id).ToList(); foreach (var orderSku in currentOrderSkuList) { var ocd = currentOrderCostDetailList.FirstOrDefault(x => x.SkuId == orderSku.SkuId); ocd.CalculationSkuGrossProfit(orderSku.ShouldPay ?? 0M, orderSku.PingTaiChengDanYouHuiQuan ?? 0M, orderSku.SuperRedEnvelope ?? 0M, orderSku.XianPinLeiDongQuan ?? 0M, orderSku.VenderFee ?? 0M, shop.PlatformCommissionRatio ?? 0.05M); var update = fsql.Update(ocd.Id).Set(x => x.SkuGrossProfit, ocd.SkuGrossProfit); updateOrderCostDetailList.Add(update); } var currentAfterOrderList = afterOrderList.Where(af => af.OrderId == order.Id).ToList(); var orderTotal = orderTotalList.FirstOrDefault(on => on.Id == order.Id); var orderCost = orderCostList.FirstOrDefault(oc => oc.OrderId == order.Id); orderCost.CalculationOrderProfitAndCost(order.ActualProductAmount ?? 0M, orderTotal.TotalPingTaiChengDanYouHuiQuan ?? 0M, orderTotal.TotalVenderFee ?? 0M, currentAfterOrderList); if (updateOrderCostDetailList.Count() > 0) { fsql.Transaction(() => { foreach (var update in updateOrderCostDetailList) update.ExecuteAffrows(); fsql.Update(orderCost.OrderId).Set(oc => oc.Profit, orderCost.Profit) .Set(oc => oc.PlatformCommissionAmount, orderCost.PlatformCommissionAmount).ExecuteAffrows(); }); } } } } } } public class JPCount { public int Count { get; set; } public long ShopId { get; set; } } }