Browse Source

SKU聚合

GOIAggregation
shanji 2 years ago
parent
commit
76f6503a4d
  1. 13
      SiNan.API/Controllers/AggregationController.cs
  2. 96
      SiNan.Business/AggregationBusiness.cs
  3. 56
      SiNan.Business/GOIBusiness.cs
  4. 7
      SiNan.Model/Core/GOI/GOIByAdSku.cs
  5. 16
      SiNan.Model/Dto/Request/Aggregation/AdSkuAggregationRequest.cs

13
SiNan.API/Controllers/AggregationController.cs

@ -49,5 +49,18 @@ namespace SiNan.API.Controllers
{
aggregationBusiness.StartAdGroupAggregationTaskByCondition(request);
}
[HttpPost]
public void StartAdSkuAggregationTask()
{
aggregationBusiness.StartAdSkuAggregationTask();
}
[HttpPost]
public void StartAdSkuAggregationTaskByCondition([FromBody]AdSkuAggregationRequest request)
{
aggregationBusiness.StartAdSkuAggregationTaskByCondition(request);
}
}
}

96
SiNan.Business/AggregationBusiness.cs

@ -574,7 +574,7 @@ namespace SiNan.Business
var shopList = venderBusiness.GetShopList(request.ShopId);
foreach (var shop in shopList)
{
Task.Factory.StartNew(() => AdGroupAggregation(shop.ShopName, long.Parse(shop.ShopId), request.AdGroupId, request.AggregationStartDate, request.AggregationEndDate), CancellationToken.None, TaskCreationOptions.LongRunning, taskSchedulerManager.AggregationCampaignGOIScheduler);
Task.Factory.StartNew(() => AdGroupAggregation(shop.ShopName, long.Parse(shop.ShopId), request.AdGroupId, request.AggregationStartDate, request.AggregationEndDate), CancellationToken.None, TaskCreationOptions.LongRunning, taskSchedulerManager.AggregationAdGroupGOIScheduler);
}
}
@ -721,12 +721,100 @@ namespace SiNan.Business
}
#endregion
#region SKU创意维度聚合任务
#region SKU创意/推广维度聚合任务
public void StartAdSkuAggregationTask()
{
StartAdSkuAggregationTaskByCondition(new AdSkuAggregationRequest()
{
AggregationStartDate = DateTime.Now.Date.AddDays(-1),
AggregationEndDate = DateTime.Now.Date.AddDays(-1),
ShopId = null
});
}
#endregion
public void StartAdSkuAggregationTaskByCondition(AdSkuAggregationRequest request)
{
var shopList = venderBusiness.GetShopList(request.ShopId);
foreach (var shop in shopList)
{
Task.Factory.StartNew(() => AdSkuAggregation(shop.ShopName, long.Parse(shop.ShopId), request.SkuId, request.AggregationStartDate, request.AggregationEndDate), CancellationToken.None, TaskCreationOptions.LongRunning, taskSchedulerManager.AggregationCampaignGOIScheduler);
}
}
private void AdSkuAggregation(string shopName, long shopId, string skuId, DateTime aggregationStartDate, DateTime aggregationEndDate)
{
DateTime startDate = aggregationStartDate.Date;
aggregationEndDate = aggregationEndDate.Date;
try
{
while (startDate <= aggregationEndDate)
{
Console.WriteLine($"{DateTime.Now} {shopName} SKU聚合 聚合日期{startDate}");
AdSkuAggregation(shopName, shopId, skuId, startDate, startDate == aggregationEndDate);
startDate = startDate.AddDays(1);
}
}
catch (Exception ex)
{
nLogManager.Default().Error(ex.Message, $"ShopId {shopId} AdGroup聚合失败");
}
}
#region SKU智能投放维度聚合任务
private void AdSkuAggregation(string shopName, long shopId, string skuId, DateTime aggregationDate, bool isLastDate)
{
aggregationDate = aggregationDate.Date;
var startDate_aggregationDate = aggregationDate;
var endDate_aggregationDate = aggregationDate.AddDays(1).AddSeconds(-1);
var IsAggregationDateEqualsYesterDay = (DateTime.Now.Date - aggregationDate).TotalDays == 1;
var adSkuList = fsql.Select<JDPopularizeAdSku>().Where(c => c.ShopId == shopId && c.Date == aggregationDate)
.WhereIf(skuId != null, c => c.Sku == skuId)
//.GroupBy(c => new { c.Sku, c.BusinessType })
.ToList();
var adSkuIdList = adSkuList.Select(j => j.Sku).Distinct().ToArray();
if (adSkuIdList.Count() == 0)
return;
List<AggregationJDPopularizeAdSkuDaily> insertAggregationAdSkuDailyList = new List<AggregationJDPopularizeAdSkuDaily>();
var aggregationDate_PopularizeLevelList = goiBusiness.CalculationAdSkuLevelGOI(adSkuIdList, startDate_aggregationDate, endDate_aggregationDate);
var adSkuIndex = 0;
foreach (var adSku in adSkuList)
{
adSkuIndex++;
Console.WriteLine($"{DateTime.Now} {shopName} SKU聚合 {adSkuIndex}/{adSkuIdList.Count()}");
#region 处理计划每日聚合
var adSkuGoi_AggregationDate_PopularizeLevel = aggregationDate_PopularizeLevelList.FirstOrDefault(x => x.Sku == adSku.Sku && x.BusinessType == adSku.BusinessType);
if (adSkuGoi_AggregationDate_PopularizeLevel != null)
{
var adSkuDailyAggregation = new AggregationJDPopularizeAdSkuDaily()
{
Id = idGenerator.NewLong(),
CreateTime = DateTime.Now,
Date = aggregationDate,
ShopId = shopId,
Cost = adSkuGoi_AggregationDate_PopularizeLevel?.Cost ?? 0M,
PopularizeLevelProfit = adSkuGoi_AggregationDate_PopularizeLevel?.Profit ?? 0M,
PopularizeLevelGOI = adSkuGoi_AggregationDate_PopularizeLevel?.GOI ?? 0M,
AdGroupId = adSku.AdGroupId,
CampaignId = adSku.CampaignId,
BusinessType = adSku.BusinessType
};
insertAggregationAdSkuDailyList.Add(adSkuDailyAggregation);
}
#endregion
}
fsql.Transaction(() =>
{
fsql.Delete<AggregationJDPopularizeAdSkuDaily>().Where(s => s.Date == aggregationDate && adSkuIdList.Contains(s.SkuId)).ExecuteAffrows();
fsql.Insert(insertAggregationAdSkuDailyList).ExecuteAffrows();
});
}
#endregion
}
}

56
SiNan.Business/GOIBusiness.cs

@ -197,6 +197,62 @@ namespace SiNan.Business
return list;
}
public IList<GOIByAdSku> CalculationAdSkuLevelGOI(IList<string> skuIdList, DateTime startDate, DateTime endDate)
{
var costs = fsql.Select<JDPopularizeAdSku>()
.Where(jas => skuIdList.Contains(jas.Sku) && jas.Date >= startDate && jas.Date <= endDate)
.GroupBy(jas => new { jas.Sku, jas.BusinessType })
.ToList(g => new
{
Cost = g.Sum(g.Value.Cost),
Sku = g.Key.Sku,
BusinessType = g.Key.BusinessType
});
var profits = fsql.Select<JDOrderPopularizeRelation, OrderCostDetail, Order>()
.InnerJoin((jr, ocd, o) => jr.OrderId == ocd.OrderId)
.InnerJoin((jr, ocd, o) => jr.OrderId == o.Id)
.Where((jr, ocd, o) => skuIdList.Contains(jr.PopularizeSku) &&
jr.CookieTime >= startDate && jr.CookieTime <= endDate &&
ocd.IsEnabled == true &&
o.OrderState != Enums.OrderState.)
.GroupBy((jr, ocd, o) => new { jr.PopularizeSku, jr.BusinessType })
.ToList(g => new
{
Profit = g.Sum(g.Value.Item2.SkuGrossProfit),
Sku = g.Key.PopularizeSku,
BusinessType = g.Key.BusinessType
});
IList<GOIByAdSku> list = new List<GOIByAdSku>();
foreach (var skuId in skuIdList)
{
{
var cost = costs.FirstOrDefault(x => x.Sku == skuId && x.BusinessType == 2)?.Cost ?? 0M;
var profit = profits.FirstOrDefault(x => x.Sku == skuId && x.BusinessType == 2)?.Profit ?? 0M;
if (cost != 0 || profit != 0)
{
var adskuGoi = new GOIByAdSku() { Sku = skuId, Cost = cost, Profit = profit, BusinessType = 2 };
list.Add(adskuGoi);
}
}
{
var cost = costs.FirstOrDefault(x => x.Sku == skuId && x.BusinessType == 134217728)?.Cost ?? 0M;
var profit = profits.FirstOrDefault(x => x.Sku == skuId && x.BusinessType == 134217728)?.Profit ?? 0M;
if (cost != 0 || profit != 0)
{
var adskuGoi = new GOIByAdSku() { Sku = skuId, Cost = cost, Profit = profit, BusinessType = 134217728 };
list.Add(adskuGoi);
}
}
}
return list;
}
//public ListResponse<ProductGOIResponse> QueryProductGOI(QueryProductGOIRequest request)
//{
// if (request.ShopId == 0)

7
SiNan.Model/Core/GOI/GOIByAdSku.cs

@ -0,0 +1,7 @@
namespace SiNan.Model.Core
{
public class GOIByAdSku : GOIBySku
{
public int BusinessType { get; set; }
}
}

16
SiNan.Model/Dto/Request/Aggregation/AdSkuAggregationRequest.cs

@ -0,0 +1,16 @@
namespace SiNan.Model.Dto
{
public class AdSkuAggregationRequest
{
/// <summary>
/// ShopId可空
/// </summary>
public long? ShopId { get; set; }
public DateTime AggregationStartDate { get; set; }
public DateTime AggregationEndDate { get; set; }
public string SkuId { get; set; }
}
}
Loading…
Cancel
Save