using BBWYB.Common.Extensions; using BBWYB.Common.Log; using BBWYB.Common.Models; using BBWYB.Server.Model; using BBWYB.Server.Model.Db; using BBWYB.Server.Model.Dto; using FreeSql; using SDKAdapter; using SDKAdapter.OperationPlatform.Client; using SDKAdapter.OperationPlatform.Models; using System.Net.Http.Headers; using Yitter.IdGenerator; namespace BBWYB.Server.Business { public class DataRepairBusiness : BaseBusiness, IDenpendency { private KuaiDi100Manager kuaiDi100Manager; private PurchaseSchemeBusiness purchaseSchemeBusiness; private PurchaseOrderBusiness purchaseOrderBusiness; private FreeSqlMultiDBManager freeSqlMultiDBManager; private VenderBusiness venderBusiness; private OP_PlatformClientFactory opPlatformClientFactory; public DataRepairBusiness(IFreeSql fsql, NLogManager nLogManager, IIdGenerator idGenerator, KuaiDi100Manager kuaiDi100Manager, PurchaseSchemeBusiness purchaseSchemeBusiness, PurchaseOrderBusiness purchaseOrderBusiness, FreeSqlMultiDBManager freeSqlMultiDBManager, VenderBusiness venderBusiness, OP_PlatformClientFactory opPlatformClientFactory) : base(fsql, nLogManager, idGenerator) { this.kuaiDi100Manager = kuaiDi100Manager; this.purchaseSchemeBusiness = purchaseSchemeBusiness; this.purchaseOrderBusiness = purchaseOrderBusiness; this.freeSqlMultiDBManager = freeSqlMultiDBManager; this.venderBusiness = venderBusiness; this.opPlatformClientFactory = opPlatformClientFactory; } public void SubscribeKD100(string waybillNo, string targetCompanyCode) { kuaiDi100Manager.SubscribeKuaiDi100(waybillNo, targetCompanyCode, "http://bbwyb.qiyue666.com/api/purchaseorder/kuaidi100publish"); } public void SupplementOrderSkuCost() { var orderSkuCostList = fsql.Select().InnerJoin((ocd, o) => ocd.OrderId == o.Id) .Where((ocd, o) => ocd.IsEnabled == true && o.IsPurchased == true && o.OrderState != Enums.OrderState.已取消 && !fsql.Select().As("osc").Where(osc => osc.OrderId == o.Id).Any()) .GroupBy((ocd, o) => new { ocd.OrderId, ocd.SkuId }) .ToList(g => new { OrderId = g.Key.OrderId, SkuId = g.Key.SkuId, SkuAmount = g.Sum(g.Value.Item1.SkuAmount), PurchaseFreight = g.Sum(g.Value.Item1.PurchaseFreight) }); var orderIds = orderSkuCostList.Select(x => x.OrderId).Distinct().ToList(); var orderSkuList = fsql.Select().Where(osku => orderIds.Contains(osku.OrderId)).ToList(); var insertOrderSkuCostList = new List(); foreach (var osc in orderSkuCostList) { var osku = orderSkuList.FirstOrDefault(osku => osku.SkuId == osc.SkuId && osku.OrderId == osc.OrderId); var insert = new OrderSkuCost() { Id = idGenerator.NewLong(), CreateTime = DateTime.Now, DeliveryExpressFreight = 0M, OrderId = osc.OrderId, SkuId = osc.SkuId, OutPackAmount = 0M, PurchaseFreight = osc.PurchaseFreight, SkuAmount = osc.SkuAmount, TotalCost = osc.PurchaseFreight + osc.SkuAmount, Profit = ((osku.Price * osku.ItemTotal) ?? 0M) + osku.BuyerPayFreight - osc.PurchaseFreight - osc.SkuAmount }; insertOrderSkuCostList.Add(insert); } fsql.Transaction(() => { fsql.Insert(insertOrderSkuCostList).ExecuteAffrows(); }); } public void SupplementPurchaserInfo() { var purlList = fsql.Select() .InnerJoin((psp, p) => psp.PurchaserId == p.Id) .Where((psp, p) => p.Platform == Enums.Platform.阿里巴巴 && string.IsNullOrEmpty(p.MemberId)) .ToList((psp, p) => new { //psp.PurchaseUrl, psp.PurchaseProductId, p.Id }); var groups = purlList.GroupBy(p => p.Id); Console.WriteLine(groups.Count()); IList> updatePurchaserList = new List>(); int i = 1; foreach (var group in groups) { var purchaseId = group.Key; var productId = group.Max(p => p.PurchaseProductId); Thread.Sleep(1000); Console.WriteLine(); Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine($"index {i}"); Console.ResetColor(); Console.WriteLine(); var response = purchaseSchemeBusiness.GetPurchaseSkuBasicInfo(new PurchaseSkuBasicInfoRequest() { FirstApiMode = Enums.PurchaseProductAPIMode.Spider, Platform = Enums.Platform.阿里巴巴, PriceMode = Enums.PurchaseOrderMode.批发, PurchaseProductId = productId }); if (!string.IsNullOrEmpty(response?.Purchaser?.MemberId)) { if (response.Purchaser.MemberId.Length > 5) Console.WriteLine(response.Purchaser.MemberId); var update = fsql.Update(purchaseId).Set(p => p.MemberId, response.Purchaser.MemberId); updatePurchaserList.Add(update); } i++; if (updatePurchaserList.Count >= 10) { fsql.Transaction(() => { foreach (var update in updatePurchaserList) update.ExecuteAffrows(); }); updatePurchaserList.Clear(); Console.WriteLine(); Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine("更新数据库更新"); Console.ResetColor(); Console.WriteLine(); } } if (updatePurchaserList.Count() > 0) { fsql.Transaction(() => { foreach (var update in updatePurchaserList) update.ExecuteAffrows(); }); } } public void SupplementPurchaseSchemeGroup() { fsql.Transaction(() => { fsql.Delete().Where(psg => 1 == 1).ExecuteAffrows(); fsql.Delete().Where(psgi => 1 == 1).ExecuteAffrows(); fsql.Update().Set(ps => ps.SchemeGroupId == 0).Where(ps => 1 == 1).ExecuteAffrows(); }); List insertSchemeGroups = new List(); List insertSchemeGroupIndexs = new List(); Queue> updatePurchaseSchemeQueue = new Queue>(); var purchaseSchemeList = fsql.Select().OrderBy(ps => ps.Id).ToList(); var purchaseSchemeSpuGroups = purchaseSchemeList.GroupBy(ps => ps.ProductId); foreach (var purchaseSchemeSpuGroup in purchaseSchemeSpuGroups) { Console.WriteLine($"正在处理spu {purchaseSchemeSpuGroup.Key}"); var purchaseSchemeSkuGroups = purchaseSchemeSpuGroup.GroupBy(ps => ps.SkuId); var maxPsGroupCount = purchaseSchemeSkuGroups.Max(g => g.Count()); //该spu最大的采购分组数 var groupIndex = new PurchaseSchemeGroupIndex() { CreateTime = DateTime.Now, Index = maxPsGroupCount, ShopId = purchaseSchemeSpuGroup.First().ShopId, ProductId = purchaseSchemeSpuGroup.First().ProductId }; insertSchemeGroupIndexs.Add(groupIndex); for (var i = 0; i < maxPsGroupCount; i++) { Console.WriteLine($"正在处理第{i + 1}组"); IList currentIndexSchemeList = new List(); //取每个sku的第i个方案 foreach (var purchaseSchemeSkuGroup in purchaseSchemeSkuGroups) { var currentSkuPurchaseSchemeList = purchaseSchemeSkuGroup.ToList(); if (currentSkuPurchaseSchemeList.Count() >= (i + 1)) { var scheme = currentSkuPurchaseSchemeList[i]; currentIndexSchemeList.Add(scheme); } } var schemeGroupId = idGenerator.NewLong(); var insertSchemeGroup = new PurchaseSchemeGroup() { Id = schemeGroupId, //GroupName = schemeGroupId.Value.ToString(), GroupName = $"{purchaseSchemeSpuGroup.Key}-{i + 1}", CreateTime = DateTime.Now, ProductId = currentIndexSchemeList.First().ProductId, ShopId = currentIndexSchemeList.First().ShopId }; insertSchemeGroups.Add(insertSchemeGroup); foreach (var purchaseScheme in currentIndexSchemeList) { if (purchaseScheme.SchemeGroupId != schemeGroupId) { var update = fsql.Update(purchaseScheme.Id).Set(ps => ps.SchemeGroupId, schemeGroupId); updatePurchaseSchemeQueue.Enqueue(update); } } } } Console.WriteLine("数据库处理中"); fsql.Transaction(() => { if (insertSchemeGroups.Count() > 0) fsql.Insert(insertSchemeGroups).ExecuteAffrows(); if (insertSchemeGroupIndexs.Count() > 0) fsql.Insert(insertSchemeGroupIndexs).ExecuteAffrows(); }); var updatePurchaseSchemeList = new List>(); while (true) { if (updatePurchaseSchemeQueue.TryDequeue(out var update)) updatePurchaseSchemeList.Add(update); else break; if (updatePurchaseSchemeList.Count() == 10) { Console.WriteLine($"执行数据库 {DateTime.Now}"); fsql.Transaction(() => { foreach (var _update in updatePurchaseSchemeList) _update.ExecuteAffrows(); }); updatePurchaseSchemeList.Clear(); } } if (updatePurchaseSchemeList.Count() > 0) { Console.WriteLine($"最后执行数据库 {DateTime.Now}"); fsql.Transaction(() => { foreach (var _update in updatePurchaseSchemeList) _update.ExecuteAffrows(); }); } } public void RepairOrderStateToCheckComputation() { List insertComputationTaskList = new List(); var time = DateTime.Parse("2023-09-01"); var orderList = fsql.Select().Where(o => o.StartTime <= time && o.OrderState == Enums.OrderState.待验收).ToList(); var orderIdsList = orderList.Select(o => o.Id).ToList(); var checmComputationTaskList = fsql.Select().Where(t => t.TaskType == Enums.TimeLimitTaskType.待核算任务 && orderIdsList.Contains(t.OrderId)).ToList(); foreach (var order in orderList) { if (!checmComputationTaskList.Any(x => x.OrderId == order.Id)) { insertComputationTaskList.Add(new TimeLimitTask() { Id = idGenerator.NewLong(), OrderId = order.Id, CreateTme = DateTime.Now, ExpirationTime = DateTime.Now.AddDays(1), OrderSn = order.OrderSn, Remark = "手工处理待核算", ShopId = order.ShopId, TaskType = Enums.TimeLimitTaskType.待核算任务 }); } } fsql.Transaction(() => { if (insertComputationTaskList.Count() > 0) fsql.Insert(insertComputationTaskList).ExecuteAffrows(); fsql.Update().Set(o => o.OrderState, Enums.OrderState.待核算) .Where(o => o.StartTime <= time && o.OrderState == Enums.OrderState.待验收) .ExecuteAffrows(); }); } public void RepairOrderState() { var orderStateList = new List() { Enums.OrderState.待发货, Enums.OrderState.部分发货 }; var orderList = fsql.Select().Where(o => orderStateList.Contains(o.OrderState)).OrderByDescending(o => o.StartTime).ToList(); var orderIdLIst = orderList.Select(o => o.Id).ToList(); var orderSkuList = fsql.Select().Where(osku => orderIdLIst.Contains(osku.OrderId)).ToList(); var poList = fsql.Select().Where(opi => orderIdLIst.Contains(opi.OrderId) && opi.IsEnabled == true).ToList(); var purchaseExpressOrderList = fsql.Select() .InnerJoin((eori, peo) => eori.WayBillNo == peo.WaybillNo) .Where((eori, peo) => orderIdLIst.Contains(eori.OrderId)).ToList((eori, peo) => new PurchaseExpressOrder { CreateTime = peo.CreateTime, ExpressContent = peo.ExpressContent, ExpressChangedTime = peo.ExpressChangedTime, ExpressState = peo.ExpressState, IsSubscribeKD100 = peo.IsSubscribeKD100, OrderId = eori.OrderId, PurchaseOrderId = eori.PurchaseOrderId, ShopId = eori.ShopId.Value, SourceExpressId = peo.SourceExpressId, SourceExpressName = peo.SourceExpressName, TargetExpressId = peo.TargetExpressId, TargetExpressName = peo.TargetExpressName, WaybillNo = peo.WaybillNo }); var updateOrderQueue = new Queue>(); foreach (var order in orderList) { if (order.IntoStoreType == null) order.IntoStoreType = Enums.IntoStoreType.发回齐越; var oskuList = orderSkuList.Where(osku => osku.OrderId == order.Id).ToList(); var polist1 = poList.Where(p => p.OrderId == order.Id).ToList(); foreach (var po in polist1) { if (po.OrderState == null) { var peoList = purchaseExpressOrderList.Where(peo => peo.OrderId == po.OrderId && po.PurchaseOrderId == po.PurchaseOrderId).ToList(); if (peoList.Count() > 0 && peoList.Count(peo => peo.ExpressState == "QianShou") == peoList.Count()) { po.OrderState = Enums.PurchaseOrderState.已签收; } } } var oldState = order.OrderState; order.CalculationOrderState(fsql, oskuList, polist1); if (oldState != order.OrderState) { updateOrderQueue.Enqueue(fsql.Update(order.Id).Set(o => o.OrderState, order.OrderState)); Console.WriteLine($"{order.Id},{order.StartTime},计算状态:{order.OrderState}"); } } var updateOrderList = new List>(); while (true) { if (updateOrderQueue.TryDequeue(out var update)) { updateOrderList.Add(update); } else { break; } if (updateOrderList.Count() > 50) { fsql.Transaction(() => { foreach (var u in updateOrderList) u.ExecuteAffrows(); }); Console.WriteLine($"执行数据库 {DateTime.Now}"); updateOrderList.Clear(); } } if (updateOrderList.Count() > 0) { fsql.Transaction(() => { foreach (var u in updateOrderList) u.ExecuteAffrows(); }); updateOrderList.Clear(); Console.WriteLine($"最后执行数据库 {DateTime.Now}"); } } public void SyncCCancelOrder() { var c_cancel_orderlist = freeSqlMultiDBManager.BBWYCfsql.Select().Where(p => p.OrderState == Enums.OrderState.已取消).ToList(); var c_cancel_orderIdlist = c_cancel_orderlist.Select(p => p.Id).ToList(); if (c_cancel_orderIdlist.Count() > 0) { fsql.Transaction(() => { fsql.Update(c_cancel_orderIdlist).Set(o => o.OrderState, Enums.OrderState.已取消).ExecuteAffrows(); }); } } public void SelectBExistsAndCNotExists() { var cIds = freeSqlMultiDBManager.BBWYCfsql.Select().OrderByDescending(p => p.Id).ToList(p => p.Id); var bIds = fsql.Select().OrderByDescending(o => o.Id).ToList(o => o.Id); var bexceptIdList = bIds.Except(cIds).ToList(); var cexceptIdList = cIds.Except(bIds).ToList(); Console.WriteLine($"B端在而C端不在的数量有 {bexceptIdList.Count()}"); Console.WriteLine($"C端在而B端不在的数量有 {cexceptIdList.Count()}"); } public void SyncHistoryPurchaseScheme() { var qtShops = venderBusiness.GetShopList(platform: Enums.Platform.拳探); foreach (var shop in qtShops) { var psList = purchaseSchemeBusiness.GetPurchaseSchemeList(new QuerySchemeRequest() { ShopId = long.Parse(shop.ShopId) }); List insertHistoryPSList = new List(); List insertHistoryPSPList = new List(); List insertHistoryPSSList = new List(); foreach (var ps in psList) { //var newVersion = ps.Version + 1; var newVersion = ps.Version; foreach (var psp in ps.PurchaseSchemeProductList) { foreach (var pss in psp.PurchaseSchemeProductSkuList) { #region 处理历史版本 var historyPss = pss.Map(); historyPss.HistoryId = idGenerator.NewLong(); historyPss.Version = newVersion; insertHistoryPSSList.Add(historyPss); #endregion } #region 处理历史版本 var historyPsp = psp.Map(); historyPsp.HistoryId = idGenerator.NewLong(); historyPsp.Version = newVersion; insertHistoryPSPList.Add(historyPsp); #endregion } #region 处理历史版本 var historyPs = ps.Map(); historyPs.HistoryId = idGenerator.NewLong(); historyPs.Version = newVersion; insertHistoryPSList.Add(historyPs); //updatePurchaseSchemeIdList.Add(ps.Id); #endregion } fsql.Transaction(() => { if (insertHistoryPSList.Count() > 0) fsql.Insert(insertHistoryPSList).ExecuteAffrows(); if (insertHistoryPSPList.Count() > 0) fsql.Insert(insertHistoryPSPList).ExecuteAffrows(); if (insertHistoryPSSList.Count() > 0) fsql.Insert(insertHistoryPSSList).ExecuteAffrows(); //if (updatePurchaseSchemeIdList.Count() > 0) // fsql.Update(updatePurchaseSchemeIdList).Set(ps => ps.Version + 1).ExecuteAffrows(); }); } } public void BatchCompleteOrder() { var time = DateTime.Parse("2023-09-01"); //var orderStateList = new List() { Enums.OrderState.待付款, Enums.OrderState.已取消, Enums.OrderState.已完成 }; //var orderList = fsql.Select().Where(o => o.StartTime < time && !orderStateList.Contains(o.OrderState)).ToList(); var orderList = fsql.Select().Where(o => o.StartTime < time && o.OrderState == Enums.OrderState.待付款).ToList(); var shops = venderBusiness.GetShopList(platform: Enums.Platform.拳探); var count = orderList.Count(); var i = 1; Queue> updateOrderQueue = new Queue>(); List> updateOrderList = new List>(); foreach (var order in orderList) { Console.WriteLine($"{i}/{count},{order.Id}"); try { var shop = shops.FirstOrDefault(s => s.ShopId == order.ShopId.ToString()); if (shop == null) { i++; continue; } var qtOrderList = opPlatformClientFactory.GetClient(AdapterEnums.PlatformType.拳探).GetOrderList(new OP_QueryOrderRequest() { AppKey = shop.AppKey, AppSecret = shop.AppSecret, AppToken = shop.AppToken, OrderId = order.Id, PageIndex = 1, PageSize = 100, Platform = AdapterEnums.PlatformType.拳探, SortTimeField = AdapterEnums.SortTimeField.Modify, SortType = AdapterEnums.SortType.Desc, StartDate = null, EndDate = null }); if (qtOrderList.Count == 0) { var update = fsql.Update(order.Id).Set(o => o.OrderState, Enums.OrderState.已取消); updateOrderQueue.Enqueue(update); i++; continue; } var qtOrder = qtOrderList.Items[0]; if (qtOrder.OrderState != "-1" && qtOrder.IsPay) { var update = fsql.Update(order.Id).Set(o => o.OrderState, Enums.OrderState.已完成); updateOrderQueue.Enqueue(update); } if ((qtOrder.OrderState == "-1" || !qtOrder.IsPay) && order.OrderState != Enums.OrderState.已取消) { var update = fsql.Update(order.Id).Set(o => o.OrderState, Enums.OrderState.已取消); updateOrderQueue.Enqueue(update); } } catch { } finally { i++; } } if (updateOrderQueue.Count() > 0) { while (true) { if (updateOrderQueue.TryDequeue(out var update)) updateOrderList.Add(update); else break; if (updateOrderList.Count() == 10) { Console.Write($"执行数据库 {DateTime.Now}"); fsql.Transaction(() => { foreach (var u in updateOrderList) { u.ExecuteAffrows(); } }); updateOrderList.Clear(); } } if (updateOrderList.Count() > 0) { Console.Write($"最后执行数据库 {DateTime.Now}"); fsql.Transaction(() => { foreach (var u in updateOrderList) { u.ExecuteAffrows(); } }); updateOrderList.Clear(); } } } } }