diff --git a/BBWYB.Server.API/Controllers/AggregationPurchaseSchemeController.cs b/BBWYB.Server.API/Controllers/AggregationPurchaseSchemeController.cs new file mode 100644 index 0000000..65f49e5 --- /dev/null +++ b/BBWYB.Server.API/Controllers/AggregationPurchaseSchemeController.cs @@ -0,0 +1,33 @@ +using BBWYB.Server.Business; +using Microsoft.AspNetCore.Mvc; + +namespace BBWYB.Server.API.Controllers +{ + + public class AggregationPurchaseSchemeController : BaseApiController + { + private AggregionPurchaseSchemeBusiness aggregionPurchaseSchemeBusiness; + public AggregationPurchaseSchemeController(IHttpContextAccessor httpContextAccessor, AggregionPurchaseSchemeBusiness aggregionPurchaseSchemeBusiness) : base(httpContextAccessor) + { + this.aggregionPurchaseSchemeBusiness = aggregionPurchaseSchemeBusiness; + } + + [HttpPost] + public void AutoAggregion() + { + aggregionPurchaseSchemeBusiness.AutoAggregion(); + } + + [HttpPost] + public void AggregionBySchemeIdList([FromBody]IList schemeIdList) + { + aggregionPurchaseSchemeBusiness.AggregionBySchemeIdList(schemeIdList); + } + + [HttpPost] + public void AggregionAllScheme() + { + aggregionPurchaseSchemeBusiness.AggregionAllScheme(); + } + } +} diff --git a/BBWYB.Server.Business/Aggregion/AggregionPurchaseSchemeBusiness.cs b/BBWYB.Server.Business/Aggregion/AggregionPurchaseSchemeBusiness.cs new file mode 100644 index 0000000..1ced1ad --- /dev/null +++ b/BBWYB.Server.Business/Aggregion/AggregionPurchaseSchemeBusiness.cs @@ -0,0 +1,147 @@ +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); + + 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); + } + } + } + + fsql.Transaction(() => + { + if (insertStatisticList.Count() > 0) + fsql.Insert(insertStatisticList).ExecuteAffrows(); + if (updateStatisticList.Count() > 0) + { + foreach (var update in updateStatisticList) + update.ExecuteAffrows(); + } + }); + } + } +} diff --git a/BBWYB.Server.Business/PurchaseOrder/PurchaseOrderBusiness.cs b/BBWYB.Server.Business/PurchaseOrder/PurchaseOrderBusiness.cs index 1c36622..f6aa39a 100644 --- a/BBWYB.Server.Business/PurchaseOrder/PurchaseOrderBusiness.cs +++ b/BBWYB.Server.Business/PurchaseOrder/PurchaseOrderBusiness.cs @@ -458,7 +458,7 @@ namespace BBWYB.Server.Business BelongSkuIds = string.Join(",", belongSkuIdList), IsEnabled = true, Remark = !string.IsNullOrEmpty(cargoParamGroup.Remark) ? cargoParamGroup.Remark : request.Remark, - UpadteTime = DateTime.Now + UpdateTime = DateTime.Now }; insertOrderPurchaseInfos.Add(orderPurchaserInfo); #endregion @@ -1117,7 +1117,7 @@ namespace BBWYB.Server.Business PurchaserId = purchaseOrder.PurchaserId, PurchaserName = purchaseOrder.PurchaserName, ShopId = request.ShopId, - UpadteTime = DateTime.Now + UpdateTime = DateTime.Now }; insertOrderPurchaseInfoList.Add(dbPurchaserOrder); #endregion diff --git a/BBWYB.Server.Model/Db/PurchaseScheme/PurchaseSchemeProductSkuStatistic.cs b/BBWYB.Server.Model/Db/PurchaseScheme/PurchaseSchemeProductSkuStatistic.cs index 95b1336..8f2a8eb 100644 --- a/BBWYB.Server.Model/Db/PurchaseScheme/PurchaseSchemeProductSkuStatistic.cs +++ b/BBWYB.Server.Model/Db/PurchaseScheme/PurchaseSchemeProductSkuStatistic.cs @@ -37,9 +37,6 @@ namespace BBWYB.Server.Model.Db [Column(DbType = "int")] public int? PurchasedItemCount { get; set; } = 0; - [Column(StringLength = 50)] - public string PurchaseSkuSpecId { get; set; } - } }