using BBWYB.Common.Log; using BBWYB.Common.Models; using BBWYB.Server.Model; using BBWYB.Server.Model.Db; using FreeSql; using Yitter.IdGenerator; namespace BBWYB.Server.Business { public class AggregionPurchaseSchemeBusiness : BaseBusiness, IDenpendency { private TaskSchedulerManager taskSchedulerManager; public AggregionPurchaseSchemeBusiness(IFreeSql fsql, NLogManager nLogManager, IIdGenerator idGenerator, TaskSchedulerManager taskSchedulerManager) : base(fsql, nLogManager, idGenerator) { this.taskSchedulerManager = taskSchedulerManager; } public void AutoAggregion() { var startTime = DateTime.Now.Date.AddDays(-2); //查询最近有采购的采购方案 var schemeIdList = fsql.Select() .InnerJoin((opi, opri) => opi.OrderId == opri.OrderId && opi.PurchaseOrderId == opri.PurchaseOrderId) .Where((opi, opri) => opi.IsEnabled == true && opi.UpdateTime >= startTime && opri.SchemeId != null) .Distinct().ToList((opi, opri) => opri.SchemeId.Value); Task.Factory.StartNew(() => AggregionByGroup(schemeIdList), CancellationToken.None, TaskCreationOptions.LongRunning, taskSchedulerManager.AggregationPurchaserTaskScheduler); } public void AggregionBySchemeIdList(IList schemeIdList) { Task.Factory.StartNew(() => AggregionByGroup(schemeIdList), CancellationToken.None, TaskCreationOptions.LongRunning, taskSchedulerManager.AggregationPurchaserTaskScheduler); } public void AggregionAllScheme() { var schemeIdList = fsql.Select().ToList(ps => ps.Id); Task.Factory.StartNew(() => AggregionByGroup(schemeIdList), CancellationToken.None, TaskCreationOptions.LongRunning, taskSchedulerManager.AggregationPurchaserTaskScheduler); } private void AggregionByGroup(IList schemeIdList) { var tempSchemeIdList = new List(); for (var i = 0; i < schemeIdList.Count(); i++) { tempSchemeIdList.Add(schemeIdList[i]); if (i != 0 && i % 30 == 0) { Console.WriteLine($"聚合{i + 1}/{schemeIdList.Count()}"); Aggregion(tempSchemeIdList); tempSchemeIdList.Clear(); Thread.Sleep(2000); } } if (tempSchemeIdList.Count() > 0) { Console.WriteLine($"最后聚合"); Aggregion(tempSchemeIdList); tempSchemeIdList.Clear(); } } private void Aggregion(IList schemeIdList) { var pssIdList = fsql.Select() .Where(pss => schemeIdList.Contains(pss.SkuPurchaseSchemeId)) .Distinct() .ToList(pss => pss.PurchaseSkuId); #region 配件 var dbStatisticList = fsql.Select(pssIdList).ToList(); List insertStatisticList = new List(); List> updateStatisticList = new List>(); #region 采购件数/采购金额 var aggregationItemCountAndAmountList = fsql.Select() .InnerJoin((opi, opsi) => opi.OrderId == opsi.OrderId && opi.PurchaseOrderId == opsi.PurchaseOrderId) .Where((opi, opsi) => opi.IsEnabled == true && pssIdList.Contains(opsi.PurchaseSkuId)) .GroupBy((opi, opsi) => opsi.PurchaseSkuId) .ToList(g => new { PurchaseSkuId = g.Key, PurchasedItemCount = g.Sum(g.Value.Item2.PurchasedItemCount), PurchasedAmount = g.Sum(g.Value.Item2.PurchasedAmount) }); #endregion #region 最近采购单价 var recentPurchaseSkuList = fsql.Select() .InnerJoin((opi, opsi) => opi.OrderId == opsi.OrderId && opi.PurchaseOrderId == opsi.PurchaseOrderId) .Where((opi, opsi) => opi.IsEnabled == true && pssIdList.Contains(opsi.PurchaseSkuId)) .GroupBy((opi, opsi) => opsi.PurchaseSkuId) .WithTempQuery(g => new { MaxId = g.Max(g.Value.Item2.Id) }) .From() .InnerJoin((opsi, opsi2) => opsi.MaxId == opsi2.Id) .ToList((opsi, opsi2) => opsi2); #endregion foreach (var purchaseSkuId in pssIdList) { var statistic = dbStatisticList.FirstOrDefault(x => x.PurchaseSkuId == purchaseSkuId); var aggregation = aggregationItemCountAndAmountList.FirstOrDefault(x => x.PurchaseSkuId == purchaseSkuId); var recent = recentPurchaseSkuList.FirstOrDefault(x => x.PurchaseSkuId == purchaseSkuId); if (statistic == null) { insertStatisticList.Add(new PurchaseSchemeProductSkuStatistic() { PurchaseSkuId = purchaseSkuId, CreateTime = DateTime.Now, PurchasedAmount = aggregation?.PurchasedAmount ?? 0M, PurchasedItemCount = Convert.ToInt32(aggregation?.PurchasedItemCount ?? 0M), LastPurchasedPrice = recent?.PurchasedPrice, LastPurchasedTime = recent?.CreateTime }); } else { if (aggregation != null || recent != null) { var update = fsql.Update(purchaseSkuId) .SetIf(aggregation != null, x => x.PurchasedAmount, aggregation?.PurchasedAmount ?? 0M) .SetIf(aggregation != null, x => x.PurchasedItemCount, Convert.ToInt32(aggregation?.PurchasedItemCount ?? 0)) .SetIf(recent != null, x => x.LastPurchasedPrice, recent.PurchasedPrice) .SetIf(recent != null, x => x.LastPurchasedTime, recent.CreateTime); updateStatisticList.Add(update); } } } #endregion #region 采购方案 //List dbSchemeList = fsql.Select(schemeIdList).ToList(); //#region 最近采购成本/采购时间 //var recentPurchaseRecordList = fsql.Select() // .InnerJoin((opi, opri, opsi) => opi.OrderId == opri.OrderId && // opi.PurchaseOrderId == opri.PurchaseOrderId) // .InnerJoin((opi, opri, opsi) => opri.PurchaseOrderId == opsi.PurchaseOrderId && // opri.PurchaseSkuId == opsi.PurchaseSkuId) // .Where((opi, opri, opsi) => opi.IsEnabled == true && // schemeIdList.Contains(opri.SchemeId.Value)) // .OrderByDescending((opi, opri, opsi) => opri.CreateTime) // .Page(1, 1000) // .ToList((opi, opri, opsi) => new // { // opi.OrderId, // opi.PurchaseOrderId, // opri.SchemeId, // opsi.PurchasedPrice, // opsi.CreateTime // }); //var recentPurchaseRecordGroups = recentPurchaseRecordList.GroupBy(x => x.SchemeId); //foreach (var relationGroup in recentPurchaseRecordGroups) //{ // var scheme = dbSchemeList.FirstOrDefault(s => s.Id == relationGroup.Key.Value); // if (scheme == null) // continue; // //取最近一笔订单,最大的订单号 // var recentOrderId = relationGroup.Max(x => x.OrderId); // var recentOrderRelationRecordList = relationGroup.Where(x => x.OrderId == recentOrderId); // scheme.LastPurchasePriceCost = recentOrderRelationRecordList.Sum(x=>x.PurchasedPrice); // scheme.LastBargainingTime = recentOrderRelationRecordList.FirstOrDefault()?.CreateTime; //} //#endregion #region 采购次数 #endregion #region 采购件数 #endregion #region 采购金额 #endregion #endregion fsql.Transaction(() => { if (insertStatisticList.Count() > 0) fsql.Insert(insertStatisticList).ExecuteAffrows(); if (updateStatisticList.Count() > 0) { foreach (var update in updateStatisticList) update.ExecuteAffrows(); } }); } } }