You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
206 lines
11 KiB
206 lines
11 KiB
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);
|
|
|
|
#region 配件
|
|
|
|
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);
|
|
}
|
|
}
|
|
}
|
|
#endregion
|
|
|
|
#region 采购方案
|
|
//List<PurchaseScheme> dbSchemeList = fsql.Select<PurchaseScheme>(schemeIdList).ToList();
|
|
|
|
//#region 最近采购成本/采购时间
|
|
|
|
|
|
//var recentPurchaseRecordList = fsql.Select<OrderPurchaseInfo, OrderPurchaseRelationInfo, OrderPurchaseSkuInfo>()
|
|
// .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();
|
|
}
|
|
});
|
|
}
|
|
}
|
|
}
|
|
|