4 changed files with 182 additions and 5 deletions
@ -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<long> schemeIdList) |
||||
|
{ |
||||
|
aggregionPurchaseSchemeBusiness.AggregionBySchemeIdList(schemeIdList); |
||||
|
} |
||||
|
|
||||
|
[HttpPost] |
||||
|
public void AggregionAllScheme() |
||||
|
{ |
||||
|
aggregionPurchaseSchemeBusiness.AggregionAllScheme(); |
||||
|
} |
||||
|
} |
||||
|
} |
@ -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<OrderPurchaseInfo, OrderPurchaseRelationInfo>() |
||||
|
.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<long> schemeIdList) |
||||
|
{ |
||||
|
Task.Factory.StartNew(() => AggregionByGroup(schemeIdList), CancellationToken.None, TaskCreationOptions.LongRunning, taskSchedulerManager.AggregationPurchaserTaskScheduler); |
||||
|
} |
||||
|
|
||||
|
public void AggregionAllScheme() |
||||
|
{ |
||||
|
var schemeIdList = fsql.Select<PurchaseScheme>().ToList(ps => ps.Id); |
||||
|
Task.Factory.StartNew(() => AggregionByGroup(schemeIdList), CancellationToken.None, TaskCreationOptions.LongRunning, taskSchedulerManager.AggregationPurchaserTaskScheduler); |
||||
|
} |
||||
|
|
||||
|
private void AggregionByGroup(IList<long> schemeIdList) |
||||
|
{ |
||||
|
var tempSchemeIdList = new List<long>(); |
||||
|
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<long> schemeIdList) |
||||
|
{ |
||||
|
var pssIdList = fsql.Select<PurchaseSchemeProductSku>() |
||||
|
.Where(pss => schemeIdList.Contains(pss.SkuPurchaseSchemeId)) |
||||
|
.Distinct() |
||||
|
.ToList(pss => pss.PurchaseSkuId); |
||||
|
|
||||
|
var dbStatisticList = fsql.Select<PurchaseSchemeProductSkuStatistic>(pssIdList).ToList(); |
||||
|
|
||||
|
List<PurchaseSchemeProductSkuStatistic> insertStatisticList = new List<PurchaseSchemeProductSkuStatistic>(); |
||||
|
List<IUpdate<PurchaseSchemeProductSkuStatistic>> updateStatisticList = new List<IUpdate<PurchaseSchemeProductSkuStatistic>>(); |
||||
|
|
||||
|
#region 采购件数/采购金额
|
||||
|
var aggregationItemCountAndAmountList = fsql.Select<OrderPurchaseInfo, OrderPurchaseSkuInfo>() |
||||
|
.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<OrderPurchaseInfo, OrderPurchaseSkuInfo>() |
||||
|
.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<OrderPurchaseSkuInfo>() |
||||
|
.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<PurchaseSchemeProductSkuStatistic>(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(); |
||||
|
} |
||||
|
}); |
||||
|
} |
||||
|
} |
||||
|
} |
Loading…
Reference in new issue