Browse Source

采购配件聚合

liangku_skuoptimazation
shanji 1 year ago
parent
commit
8ef1bbe17d
  1. 33
      BBWYB.Server.API/Controllers/AggregationPurchaseSchemeController.cs
  2. 147
      BBWYB.Server.Business/Aggregion/AggregionPurchaseSchemeBusiness.cs
  3. 4
      BBWYB.Server.Business/PurchaseOrder/PurchaseOrderBusiness.cs
  4. 3
      BBWYB.Server.Model/Db/PurchaseScheme/PurchaseSchemeProductSkuStatistic.cs

33
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<long> schemeIdList)
{
aggregionPurchaseSchemeBusiness.AggregionBySchemeIdList(schemeIdList);
}
[HttpPost]
public void AggregionAllScheme()
{
aggregionPurchaseSchemeBusiness.AggregionAllScheme();
}
}
}

147
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<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();
}
});
}
}
}

4
BBWYB.Server.Business/PurchaseOrder/PurchaseOrderBusiness.cs

@ -458,7 +458,7 @@ namespace BBWYB.Server.Business
BelongSkuIds = string.Join(",", belongSkuIdList), BelongSkuIds = string.Join(",", belongSkuIdList),
IsEnabled = true, IsEnabled = true,
Remark = !string.IsNullOrEmpty(cargoParamGroup.Remark) ? cargoParamGroup.Remark : request.Remark, Remark = !string.IsNullOrEmpty(cargoParamGroup.Remark) ? cargoParamGroup.Remark : request.Remark,
UpadteTime = DateTime.Now UpdateTime = DateTime.Now
}; };
insertOrderPurchaseInfos.Add(orderPurchaserInfo); insertOrderPurchaseInfos.Add(orderPurchaserInfo);
#endregion #endregion
@ -1117,7 +1117,7 @@ namespace BBWYB.Server.Business
PurchaserId = purchaseOrder.PurchaserId, PurchaserId = purchaseOrder.PurchaserId,
PurchaserName = purchaseOrder.PurchaserName, PurchaserName = purchaseOrder.PurchaserName,
ShopId = request.ShopId, ShopId = request.ShopId,
UpadteTime = DateTime.Now UpdateTime = DateTime.Now
}; };
insertOrderPurchaseInfoList.Add(dbPurchaserOrder); insertOrderPurchaseInfoList.Add(dbPurchaserOrder);
#endregion #endregion

3
BBWYB.Server.Model/Db/PurchaseScheme/PurchaseSchemeProductSkuStatistic.cs

@ -37,9 +37,6 @@ namespace BBWYB.Server.Model.Db
[Column(DbType = "int")] [Column(DbType = "int")]
public int? PurchasedItemCount { get; set; } = 0; public int? PurchasedItemCount { get; set; } = 0;
[Column(StringLength = 50)]
public string PurchaseSkuSpecId { get; set; }
} }
} }

Loading…
Cancel
Save