Browse Source

对接聚合

GOIAggregation
shanji 2 years ago
parent
commit
472b6c0505
  1. 13
      SiNan.API/Controllers/GOIController.cs
  2. 561
      SiNan.Business/AggregationBusiness.cs
  3. 295
      SiNan.Business/GOIBusiness.cs
  4. 8
      SiNan.Business/SiNan.Business.csproj
  5. 6
      SiNan.Business/TaskSchedulerManager.cs
  6. 17
      SiNan.Model/Dto/Request/Aggregation/AdGroupAggregationRequest.cs
  7. 17
      SiNan.Model/Dto/Request/Aggregation/CampaignAggregationRequest.cs
  8. 2
      SiNan.Model/Dto/Request/GOI/QueryProductGOIRequest.cs
  9. 2
      SiNan.Model/Dto/Request/GOI/QueryProductSkuGOIRequest.cs

13
SiNan.API/Controllers/GOIController.cs

@ -15,7 +15,7 @@ namespace SiNan.API.Controllers
}
/// <summary>
/// 产品维度分析-查询产品综合GOI
/// 产品维度分析-查询SPU综合GOI
/// </summary>
/// <param name="request"></param>
/// <returns></returns>
@ -25,6 +25,17 @@ namespace SiNan.API.Controllers
return goiBusiness.QueryProductGOI(request);
}
/// <summary>
/// 产品维度分析-查询SKU综合GOI
/// </summary>
/// <param name="request"></param>
/// <returns></returns>
[HttpPost]
public ListResponse<ProductSkuGOIResponse> QueryProductSkuGOI([FromBody] QueryProductSkuGOIRequest request)
{
return goiBusiness.QueryProductSkuGOI(request);
}
/// <summary>
/// 产品360推广分析
/// </summary>

561
SiNan.Business/AggregationBusiness.cs

@ -1,6 +1,7 @@
using FreeSql;
using SiNan.Common.Log;
using SiNan.Common.Models;
using SiNan.Model.Core;
using SiNan.Model.Db;
using SiNan.Model.Dto;
using Yitter.IdGenerator;
@ -25,7 +26,7 @@ namespace SiNan.Business
this.taskSchedulerManager = taskSchedulerManager;
}
#region SPU聚合任务
#region SPU/SKU聚合任务
public void StartSpuAggregationTask()
{
StartSpuAggregationTaskByCondition(new SpuAggregationRequest()
@ -45,16 +46,18 @@ namespace SiNan.Business
}
}
private void SpuAggregation(long shopId, string spu, DateTime aggregationDate)
private void SpuAggregation(long shopId, string querySpu, DateTime aggregationDate)
{
var aggregationStartDate = aggregationDate.Date;
var aggregationEndDate = aggregationDate.Date.AddDays(1).AddSeconds(-1);
var spuIdList = fsql.Select<Model.Db.Product>().Where(p => p.ShopId == shopId && p.State == 8)
.WhereIf(!string.IsNullOrEmpty(spu), p => p.Id == spu)
aggregationDate = aggregationDate.Date;
var startDate_aggregationDate = aggregationDate;
var endDate_aggregationDate = aggregationDate.AddDays(1).AddSeconds(-1);
var IsAggregationDateEqualsYesterDay = (DateTime.Now.Date - aggregationDate).TotalDays == 1;
var spuIdList = fsql.Select<Product>().Where(p => p.ShopId == shopId && p.State == 8)
.WhereIf(!string.IsNullOrEmpty(querySpu), p => p.Id == querySpu)
.OrderBy(p => p.CreateTime)
.ToList(p => p.Id);
var skuList = fsql.Select<Model.Db.ProductSku>().Where(ps => ps.ShopId == shopId && ps.State == 1)
.WhereIf(!string.IsNullOrEmpty(spu), ps => ps.ProductId == spu)
var skuList = fsql.Select<ProductSku>().Where(ps => ps.ShopId == shopId && ps.State == 1)
.WhereIf(!string.IsNullOrEmpty(querySpu), ps => ps.ProductId == querySpu)
.OrderBy(ps => ps.CreateTime)
.ToList(ps => new
{
@ -65,7 +68,13 @@ namespace SiNan.Business
var dbAggregationJDPopularizeSpuList = fsql.Select<AggregationJDPopularizeSpu, Product>()
.InnerJoin((aspu, p) => aspu.Id == p.Id)
.Where((aspu, p) => p.ShopId == shopId && p.State == 8)
.WhereIf(!string.IsNullOrEmpty(spu), (aspu, p) => p.Id == spu)
.WhereIf(!string.IsNullOrEmpty(querySpu), (aspu, p) => p.Id == querySpu)
.ToList();
var dbAggregationJDPopularizeSkuList = fsql.Select<AggregationJDPopularizeSku, ProductSku>()
.InnerJoin((asku, ps) => asku.Id == ps.Id)
.Where((asku, ps) => ps.ShopId == shopId && ps.State == 1)
.WhereIf(!string.IsNullOrEmpty(querySpu), (asku, ps) => ps.ProductId == querySpu)
.ToList();
var i = 0;
@ -83,24 +92,546 @@ namespace SiNan.Business
List<AggregationJDPopularizeSkuDaily> insertAggregationSkuDailyList = new List<AggregationJDPopularizeSkuDaily>();
List<AggregationJDPopularizeSpu> insertAggregationSpuList = new List<AggregationJDPopularizeSpu>();
List<AggregationJDPopularizeSku> insertAggregationSkuList = new List<AggregationJDPopularizeSku>();
IDictionary<string, IUpdate<AggregationJDPopularizeSpu>> updateAggregationSpuDictionary = new Dictionary<string, IUpdate<AggregationJDPopularizeSpu>>();
IDictionary<string, IUpdate<AggregationJDPopularizeSku>> updateAggregationSkuDictionary = new Dictionary<string, IUpdate<AggregationJDPopularizeSku>>();
List<IUpdate<AggregationJDPopularizeSpu>> updateAggregationSpuList = new List<IUpdate<AggregationJDPopularizeSpu>>();
List<IUpdate<AggregationJDPopularizeSku>> updateAggregationSkuList = new List<IUpdate<AggregationJDPopularizeSku>>();
var aggregationDate_ProductLevelList = goiBusiness.StatisticsProductLevelGOI(currentGroupSkuIdList, startDate_aggregationDate, endDate_aggregationDate);
var aggregationDate_PopularizeLevelList = goiBusiness.StatisticsPopularizeLevelGOI(currentGroupSkuIdList, startDate_aggregationDate, endDate_aggregationDate);
IList<GOIBySku> recent7d_ProductLevelList = null;
IList<GOIBySku> recent7d_PopularizeLevelList = null;
IList<GOIBySku> recent30d_ProductLevelList = null;
IList<GOIBySku> recent30d_PopularizeLevelList = null;
if ((DateTime.Now.Date - startDate_aggregationDate).TotalDays <= 31)
{
var startDate_Recent7day = DateTime.Now.Date.AddDays(-7);
var endDate_Recent7day = DateTime.Now.Date.AddSeconds(-1);
var startDate_Recent30day = DateTime.Now.Date.AddDays(-30);
var endDate_Recent30day = DateTime.Now.Date.AddSeconds(-1);
recent7d_ProductLevelList = goiBusiness.StatisticsProductLevelGOI(currentGroupSkuIdList, startDate_Recent7day, endDate_Recent7day);
recent7d_PopularizeLevelList = goiBusiness.StatisticsPopularizeLevelGOI(currentGroupSkuIdList, startDate_Recent7day, endDate_Recent7day);
recent30d_ProductLevelList = goiBusiness.StatisticsProductLevelGOI(currentGroupSkuIdList, startDate_Recent30day, endDate_Recent30day); ;
recent30d_PopularizeLevelList = goiBusiness.StatisticsPopularizeLevelGOI(currentGroupSkuIdList, startDate_Recent30day, endDate_Recent30day);
}
foreach (var spuId in spuGroup)
{
var currentSpuSkuIdList = currentGroupSkuList.Where(ps => ps.ProductId == spuId).Select(ps => ps.Id).ToList();
var currentSpu_AggregationDate_ProductLevelList = aggregationDate_ProductLevelList.Where(x => currentSpuSkuIdList.Contains(x.Sku)).ToList();
var currentSpu_AggregationDate_PopularizeLevelList = aggregationDate_PopularizeLevelList.Where(x => currentSpuSkuIdList.Contains(x.Sku)).ToList();
IList<GOIBySku> currentSpu_Recent7d_ProductLevelList = recent7d_ProductLevelList?.Where(x => currentSpuSkuIdList.Contains(x.Sku)).ToList();
IList<GOIBySku> currentSpu_Recent7d_PopularizeLevelList = recent7d_PopularizeLevelList?.Where(x => currentSpuSkuIdList.Contains(x.Sku)).ToList();
IList<GOIBySku> currentSpu_Recent30d_ProductLevelList = recent30d_ProductLevelList?.Where(x => currentSpuSkuIdList.Contains(x.Sku)).ToList();
IList<GOIBySku> currentSpu_Recent30d_PopularizeLevelList = recent30d_PopularizeLevelList?.Where(x => currentSpuSkuIdList.Contains(x.Sku)).ToList();
#region 处理SPU每日聚合
var spugoi_AggregationDate_ProductLevel = new GOIBySpu()
{
Spu = spuId,
Cost = currentSpu_AggregationDate_ProductLevelList.Sum(x => x.Cost),
Profit = currentSpu_AggregationDate_ProductLevelList.Sum(x => x.Profit),
};
var spugoi_AggregationDate_PopularizeLevel = new GOIBySpu()
{
Spu = spuId,
Cost = currentSpu_AggregationDate_PopularizeLevelList.Sum(x => x.Cost),
Profit = currentSpu_AggregationDate_PopularizeLevelList.Sum(x => x.Profit),
};
var spuDailyAggregation = new AggregationJDPopularizeSpuDaily()
{
Id = idGenerator.NewLong(),
CreateTime = DateTime.Now,
Date = aggregationDate,
ProductId = spuId,
ShopId = shopId,
Cost = spugoi_AggregationDate_ProductLevel?.Cost ?? 0M,
ProductLevelProfit = spugoi_AggregationDate_ProductLevel?.Profit ?? 0M,
ProductLevelGOI = spugoi_AggregationDate_ProductLevel?.GOI ?? 0M,
PopularizeLevelProfit = spugoi_AggregationDate_PopularizeLevel?.Profit ?? 0M,
PopularizeLevelGOI = spugoi_AggregationDate_PopularizeLevel?.GOI ?? 0M
};
insertAggregationSpuDailyList.Add(spuDailyAggregation);
#endregion
#region 处理SPU聚合
GOIBySpu spugoi_Recent7d_ProductLevel = currentSpu_Recent7d_ProductLevelList == null ? null : new GOIBySpu()
{
Spu = spuId,
Cost = currentSpu_Recent7d_ProductLevelList.Sum(x => x.Cost),
Profit = currentSpu_Recent7d_ProductLevelList.Sum(x => x.Profit),
};
GOIBySpu spugoi_Recent7d_PopularizeLevel = currentSpu_Recent7d_PopularizeLevelList == null ? null : new GOIBySpu()
{
Spu = spuId,
Cost = currentSpu_Recent7d_PopularizeLevelList.Sum(x => x.Cost),
Profit = currentSpu_Recent7d_PopularizeLevelList.Sum(x => x.Profit),
};
var aggregationDate_ProductLevelList = goiBusiness.StatisticsProductLevelGOI(currentGroupSkuIdList, aggregationStartDate, aggregationEndDate);
var aggregationDate_PopularizeLevelList = goiBusiness.StatisticsPopularizeLevelGOI(currentGroupSkuIdList, aggregationStartDate, aggregationEndDate);
GOIBySpu spugoi_Recent30d_ProductLevel = currentSpu_Recent30d_ProductLevelList == null ? null : new GOIBySpu()
{
Spu = spuId,
Cost = currentSpu_Recent30d_ProductLevelList.Sum(x => x.Cost),
Profit = currentSpu_Recent30d_ProductLevelList.Sum(x => x.Profit),
};
GOIBySpu spugoi_Recent30d_PopularizeLevel = currentSpu_Recent30d_PopularizeLevelList == null ? null : new GOIBySpu()
{
Spu = spuId,
Cost = currentSpu_Recent30d_PopularizeLevelList.Sum(x => x.Cost),
Profit = currentSpu_Recent30d_PopularizeLevelList.Sum(x => x.Profit),
};
if (!dbAggregationJDPopularizeSpuList.Any(x => x.Id == spuId))
{
insertAggregationSpuList.Add(new AggregationJDPopularizeSpu()
{
Id = spuId,
CreateTime = DateTime.Now,
Date = DateTime.Now.Date,
UpdateTime = DateTime.Now,
ShopId = shopId,
YestodayCost = IsAggregationDateEqualsYesterDay ? spugoi_AggregationDate_ProductLevel.Cost : 0M,
YestodayProductLevelProfit = IsAggregationDateEqualsYesterDay ? spugoi_AggregationDate_ProductLevel.Profit : 0M,
YestodayProductLevelGOI = IsAggregationDateEqualsYesterDay ? spugoi_AggregationDate_ProductLevel.GOI : 0M,
YestodayPopularizeLevelProfit = IsAggregationDateEqualsYesterDay ? spugoi_AggregationDate_PopularizeLevel.Profit : 0M,
YestodayPopularizeLevelGOI = IsAggregationDateEqualsYesterDay ? spugoi_AggregationDate_PopularizeLevel.GOI : 0M,
Recent7dCost = spugoi_Recent7d_ProductLevel?.Cost ?? 0M,
Recent7dProductLevelProfit = spugoi_Recent7d_ProductLevel?.Profit ?? 0M,
Recent7dProductLevelGOI = spugoi_Recent7d_ProductLevel?.GOI ?? 0M,
Recent7dPopularizeLevelProfit = spugoi_Recent7d_PopularizeLevel?.Profit ?? 0M,
Recent7dPopularizeLevelGOI = spugoi_Recent7d_PopularizeLevel?.GOI ?? 0M,
Recent30dCost = spugoi_Recent30d_ProductLevel?.Cost ?? 0M,
Recent30dProductLevelProfit = spugoi_Recent30d_ProductLevel?.Profit ?? 0M,
Recent30dProductLevelGOI = spugoi_Recent30d_ProductLevel?.GOI ?? 0M,
Recent30dPopularizeLevelProfit = spugoi_Recent30d_PopularizeLevel?.Profit ?? 0M,
Recent30dPopularizeLevelGOI = spugoi_Recent30d_PopularizeLevel?.GOI ?? 0M
});
}
else
{
var updateSpuAggregation = fsql.Update<AggregationJDPopularizeSpu>(spuId)
.Set(s => s.Date, DateTime.Now.Date)
.Set(s => s.UpdateTime, DateTime.Now)
.SetIf(IsAggregationDateEqualsYesterDay, s => s.YestodayCost, spugoi_AggregationDate_ProductLevel?.Cost ?? 0M)
.SetIf(IsAggregationDateEqualsYesterDay, s => s.YestodayProductLevelProfit, spugoi_AggregationDate_ProductLevel?.Profit ?? 0M)
.SetIf(IsAggregationDateEqualsYesterDay, s => s.YestodayProductLevelGOI, spugoi_AggregationDate_ProductLevel?.GOI ?? 0M)
.SetIf(IsAggregationDateEqualsYesterDay, s => s.YestodayPopularizeLevelProfit, spugoi_AggregationDate_PopularizeLevel?.Profit ?? 0M)
.SetIf(IsAggregationDateEqualsYesterDay, s => s.YestodayPopularizeLevelGOI, spugoi_AggregationDate_PopularizeLevel?.GOI ?? 0M)
.SetIf(spugoi_Recent7d_ProductLevel != null, s => s.Recent7dCost, spugoi_Recent7d_ProductLevel?.Cost ?? 0M)
.SetIf(spugoi_Recent7d_ProductLevel != null, s => s.Recent7dProductLevelProfit, spugoi_Recent7d_ProductLevel?.Profit ?? 0M)
.SetIf(spugoi_Recent7d_ProductLevel != null, s => s.Recent7dProductLevelGOI, spugoi_Recent7d_ProductLevel?.GOI ?? 0M)
.SetIf(spugoi_Recent7d_PopularizeLevel != null, s => s.Recent7dPopularizeLevelProfit, spugoi_Recent7d_PopularizeLevel?.Profit ?? 0M)
.SetIf(spugoi_Recent7d_PopularizeLevel != null, s => s.Recent7dPopularizeLevelGOI, spugoi_Recent7d_PopularizeLevel?.GOI ?? 0M)
.SetIf(spugoi_Recent30d_ProductLevel != null, s => s.Recent30dCost, spugoi_Recent30d_ProductLevel?.Cost ?? 0M)
.SetIf(spugoi_Recent30d_ProductLevel != null, s => s.Recent30dProductLevelProfit, spugoi_Recent30d_ProductLevel?.Profit ?? 0M)
.SetIf(spugoi_Recent30d_ProductLevel != null, s => s.Recent30dProductLevelGOI, spugoi_Recent30d_ProductLevel?.GOI ?? 0M)
.SetIf(spugoi_Recent30d_PopularizeLevel != null, s => s.Recent30dPopularizeLevelProfit, spugoi_Recent30d_PopularizeLevel?.Profit ?? 0M)
.SetIf(spugoi_Recent30d_PopularizeLevel != null, s => s.Recent30dPopularizeLevelGOI, spugoi_Recent30d_PopularizeLevel?.GOI ?? 0M);
if ((DateTime.Now.Date - aggregationStartDate).TotalDays <= 31)
updateAggregationSpuList.Add(updateSpuAggregation);
}
#endregion
foreach (var skuId in currentSpuSkuIdList)
{
#region 处理SKU每日聚合
var skugoi_AggregationDate_ProductLevel = currentSpu_AggregationDate_ProductLevelList.FirstOrDefault(x => x.Sku == skuId);
var skugoi_AggregationDate_PopularizeLevel = currentSpu_AggregationDate_PopularizeLevelList.FirstOrDefault(x => x.Sku == skuId);
var skugoi_Recent7d_ProductLevel = currentSpu_Recent7d_ProductLevelList?.FirstOrDefault(x => x.Sku == skuId);
var skugoi_Recent7d_PopularizeLevel = currentSpu_Recent7d_PopularizeLevelList?.FirstOrDefault(x => x.Sku == skuId);
var skugoi_Recent30d_ProductLevel = currentSpu_Recent30d_ProductLevelList?.FirstOrDefault(x => x.Sku == skuId);
var skugoi_Recent30d_PopularizeLevel = currentSpu_Recent30d_PopularizeLevelList?.FirstOrDefault(x => x.Sku == skuId);
var skuDailyAggregation = new AggregationJDPopularizeSkuDaily()
{
Id = idGenerator.NewLong(),
CreateTime = DateTime.Now,
Date = aggregationDate,
SkuId = skuId,
ProductId = spuId,
ShopId = shopId,
Cost = skugoi_AggregationDate_ProductLevel?.Cost ?? 0M,
ProductLevelProfit = skugoi_AggregationDate_ProductLevel?.Profit ?? 0M,
ProductLevelGOI = skugoi_AggregationDate_ProductLevel?.GOI ?? 0M,
PopularizeLevelProfit = skugoi_AggregationDate_PopularizeLevel?.Profit ?? 0M,
PopularizeLevelGOI = skugoi_AggregationDate_PopularizeLevel?.GOI ?? 0M
};
insertAggregationSkuDailyList.Add(skuDailyAggregation);
#endregion
#region 处理SKU聚合
if (!dbAggregationJDPopularizeSkuList.Any(x => x.Id == skuId))
{
insertAggregationSkuList.Add(new AggregationJDPopularizeSku()
{
Id = skuId,
ProductId = spuId,
CreateTime = DateTime.Now,
Date = DateTime.Now.Date,
UpdateTime = DateTime.Now,
ShopId = shopId,
YestodayCost = IsAggregationDateEqualsYesterDay ? skugoi_AggregationDate_ProductLevel.Cost : 0M,
YestodayProductLevelProfit = IsAggregationDateEqualsYesterDay ? skugoi_AggregationDate_ProductLevel.Profit : 0M,
YestodayProductLevelGOI = IsAggregationDateEqualsYesterDay ? skugoi_AggregationDate_ProductLevel.GOI : 0M,
YestodayPopularizeLevelProfit = IsAggregationDateEqualsYesterDay ? skugoi_AggregationDate_PopularizeLevel.Profit : 0M,
YestodayPopularizeLevelGOI = IsAggregationDateEqualsYesterDay ? skugoi_AggregationDate_PopularizeLevel.GOI : 0M,
Recent7dCost = skugoi_Recent7d_ProductLevel?.Cost ?? 0M,
Recent7dProductLevelProfit = skugoi_Recent7d_ProductLevel?.Profit ?? 0M,
Recent7dProductLevelGOI = skugoi_Recent7d_ProductLevel?.GOI ?? 0M,
Recent7dPopularizeLevelProfit = skugoi_Recent7d_PopularizeLevel?.Profit ?? 0M,
Recent7dPopularizeLevelGOI = skugoi_Recent7d_PopularizeLevel?.GOI ?? 0M,
Recent30dCost = skugoi_Recent30d_ProductLevel?.Cost ?? 0M,
Recent30dProductLevelProfit = skugoi_Recent30d_ProductLevel?.Profit ?? 0M,
Recent30dProductLevelGOI = skugoi_Recent30d_ProductLevel?.GOI ?? 0M,
Recent30dPopularizeLevelProfit = skugoi_Recent30d_PopularizeLevel?.Profit ?? 0M,
Recent30dPopularizeLevelGOI = skugoi_Recent30d_PopularizeLevel?.GOI ?? 0M
});
}
else
{
var updateSkuAggregation = fsql.Update<AggregationJDPopularizeSku>(skuId)
.Set(s => s.Date, DateTime.Now.Date)
.Set(s => s.UpdateTime, DateTime.Now)
.SetIf(IsAggregationDateEqualsYesterDay, s => s.YestodayCost, skugoi_AggregationDate_ProductLevel?.Cost ?? 0M)
.SetIf(IsAggregationDateEqualsYesterDay, s => s.YestodayProductLevelProfit, skugoi_AggregationDate_ProductLevel?.Profit ?? 0M)
.SetIf(IsAggregationDateEqualsYesterDay, s => s.YestodayProductLevelGOI, skugoi_AggregationDate_ProductLevel?.GOI ?? 0M)
.SetIf(IsAggregationDateEqualsYesterDay, s => s.YestodayPopularizeLevelProfit, skugoi_AggregationDate_PopularizeLevel?.Profit ?? 0M)
.SetIf(IsAggregationDateEqualsYesterDay, s => s.YestodayPopularizeLevelGOI, skugoi_AggregationDate_PopularizeLevel?.GOI ?? 0M)
.SetIf(skugoi_Recent7d_ProductLevel != null, s => s.Recent7dCost, skugoi_Recent7d_ProductLevel?.Cost ?? 0M)
.SetIf(skugoi_Recent7d_ProductLevel != null, s => s.Recent7dProductLevelProfit, skugoi_Recent7d_ProductLevel?.Profit ?? 0M)
.SetIf(skugoi_Recent7d_ProductLevel != null, s => s.Recent7dProductLevelGOI, skugoi_Recent7d_ProductLevel?.GOI ?? 0M)
.SetIf(skugoi_Recent7d_PopularizeLevel != null, s => s.Recent7dPopularizeLevelProfit, skugoi_Recent7d_PopularizeLevel?.Profit ?? 0M)
.SetIf(skugoi_Recent7d_PopularizeLevel != null, s => s.Recent7dPopularizeLevelGOI, skugoi_Recent7d_PopularizeLevel?.GOI ?? 0M)
.SetIf(skugoi_Recent30d_ProductLevel != null, s => s.Recent30dCost, skugoi_Recent30d_ProductLevel?.Cost ?? 0M)
.SetIf(skugoi_Recent30d_ProductLevel != null, s => s.Recent30dProductLevelProfit, skugoi_Recent30d_ProductLevel?.Profit ?? 0M)
.SetIf(skugoi_Recent30d_ProductLevel != null, s => s.Recent30dProductLevelGOI, skugoi_Recent30d_ProductLevel?.GOI ?? 0M)
.SetIf(skugoi_Recent30d_PopularizeLevel != null, s => s.Recent30dPopularizeLevelProfit, skugoi_Recent30d_PopularizeLevel?.Profit ?? 0M)
.SetIf(skugoi_Recent30d_PopularizeLevel != null, s => s.Recent30dPopularizeLevelGOI, skugoi_Recent30d_PopularizeLevel?.GOI ?? 0M);
updateAggregationSkuList.Add(updateSkuAggregation);
}
#endregion
}
}
fsql.Transaction(() =>
{
fsql.Delete<AggregationJDPopularizeSpuDaily>().Where(s => s.Date == aggregationDate && spuGroup.Contains(s.ProductId)).ExecuteAffrows();
fsql.Delete<AggregationJDPopularizeSkuDaily>().Where(s => s.Date == aggregationDate && spuGroup.Contains(s.ProductId)).ExecuteAffrows();
if (insertAggregationSpuDailyList.Count() > 0)
fsql.Insert(insertAggregationSpuDailyList).ExecuteAffrows();
if (insertAggregationSkuDailyList.Count() > 0)
fsql.Insert(insertAggregationSkuDailyList).ExecuteAffrows();
if (insertAggregationSpuList.Count() > 0)
fsql.Insert(insertAggregationSpuList).ExecuteAffrows();
if (insertAggregationSkuList.Count() > 0)
fsql.Insert(insertAggregationSkuList).ExecuteAffrows();
if (updateAggregationSpuList.Count() > 0)
{
foreach (var update in updateAggregationSpuList)
update.ExecuteAffrows();
}
if (updateAggregationSkuList.Count() > 0)
{
foreach (var update in updateAggregationSkuList)
update.ExecuteAffrows();
}
});
}
}
#endregion
#region 计划聚合任务
public void StartCampaignAggregationTask()
{
StartCampaginAggregationTaskByCondition(new CampaignAggregationRequest()
{
AggregationDate = DateTime.Now.Date.AddDays(-1),
ShopId = null,
CampaignId = null
});
}
public void StartCampaginAggregationTaskByCondition(CampaignAggregationRequest request)
{
var shopList = venderBusiness.GetShopList(request.ShopId);
foreach (var shop in shopList)
{
Task.Factory.StartNew(() => CampaignAggregation(long.Parse(shop.ShopId), request.CampaignId, request.AggregationDate), CancellationToken.None, TaskCreationOptions.LongRunning, taskSchedulerManager.AggregationCampaignGOIScheduler);
}
}
private void CampaignAggregation(long shopId, long? campaignId, DateTime aggregationDate)
{
aggregationDate = aggregationDate.Date;
var startDate_aggregationDate = aggregationDate;
var endDate_aggregationDate = aggregationDate.AddDays(1).AddSeconds(-1);
var IsAggregationDateEqualsYesterDay = (DateTime.Now.Date - aggregationDate).TotalDays == 1;
var campaignList = fsql.Select<JDPopularizeCampaign>().Where(c => c.ShopId == shopId && c.Date == aggregationDate)
.WhereIf(campaignId != null, c => c.CampaignId == campaignId)
//.GroupBy(c => new { c.CampaignId, c.BusinessType })
.ToList();
var campaignIdList = campaignList.Select(j => j.CampaignId).Distinct().ToArray();
if (campaignIdList.Count() == 0)
return;
var dbAggregationJDPopularizeCampaignList = fsql.Select<AggregationJDPopularizeCampaign>(campaignIdList).ToList();
List<AggregationJDPopularizeCampaignDaily> insertAggregationCampaignDailyList = new List<AggregationJDPopularizeCampaignDaily>();
List<AggregationJDPopularizeCampaign> insertAggregationCampaignList = new List<AggregationJDPopularizeCampaign>();
List<IUpdate<AggregationJDPopularizeCampaign>> updateAggregationCampaignList = new List<IUpdate<AggregationJDPopularizeCampaign>>();
var aggregationDate_PopularizeLevelList = goiBusiness.CalculationCampaignLevelGOI(campaignIdList, startDate_aggregationDate, endDate_aggregationDate);
IList<GOIByLevel> recent7d_PopularizeLevelList = null;
IList<GOIByLevel> recent30d_PopularizeLevelList = null;
if ((DateTime.Now.Date - startDate_aggregationDate).TotalDays <= 31)
{
var startDate_Recent7day = DateTime.Now.Date.AddDays(-7);
var endDate_Recent7day = DateTime.Now.Date.AddSeconds(-1);
var startDate_Recent30day = DateTime.Now.Date.AddDays(-30);
var endDate_Recent30day = DateTime.Now.Date.AddSeconds(-1);
recent7d_PopularizeLevelList = goiBusiness.CalculationCampaignLevelGOI(campaignIdList, startDate_Recent7day, endDate_Recent7day);
recent30d_PopularizeLevelList = goiBusiness.CalculationCampaignLevelGOI(campaignIdList, startDate_Recent30day, endDate_Recent30day);
}
foreach (var campaign in campaignList)
{
#region 处理计划每日聚合
var campaginGoi_AggregationDate_PopularizeLevel = aggregationDate_PopularizeLevelList.FirstOrDefault(x => x.LevelId == campaign.CampaignId);
if (campaginGoi_AggregationDate_PopularizeLevel != null)
{
var campaignDailyAggregation = new AggregationJDPopularizeCampaignDaily()
{
Id = idGenerator.NewLong(),
CreateTime = DateTime.Now,
Date = aggregationDate,
ShopId = shopId,
Cost = campaginGoi_AggregationDate_PopularizeLevel?.Cost ?? 0M,
PopularizeLevelProfit = campaginGoi_AggregationDate_PopularizeLevel?.Profit ?? 0M,
PopularizeLevelGOI = campaginGoi_AggregationDate_PopularizeLevel?.GOI ?? 0M,
BusinessType = campaign.BusinessType,
CampaignId = campaign.CampaignId,
CampaignName = campaign.CampaignName
};
insertAggregationCampaignDailyList.Add(campaignDailyAggregation);
}
#endregion
#region 处理sku
#region 处理计划聚合
var campaginGoi_7d_PopularizeLevel = recent7d_PopularizeLevelList?.FirstOrDefault(x => x.LevelId == campaign.CampaignId);
var campaginGoi_30d_PopularizeLevel = recent30d_PopularizeLevelList?.FirstOrDefault(x => x.LevelId == campaign.CampaignId);
if (!dbAggregationJDPopularizeCampaignList.Any(c => c.Id == campaign.CampaignId))
{
insertAggregationCampaignList.Add(new AggregationJDPopularizeCampaign()
{
Id = campaign.CampaignId.Value,
BusinessType = campaign.BusinessType.Value,
CampaignName = campaign.CampaignName,
CreateTime = DateTime.Now,
Date = DateTime.Now.Date,
ShopId = shopId,
UpdateTime = DateTime.Now,
YestodayCost = IsAggregationDateEqualsYesterDay ? campaginGoi_AggregationDate_PopularizeLevel.Cost : 0M,
YestodayPopularizeLevelProfit = IsAggregationDateEqualsYesterDay ? campaginGoi_AggregationDate_PopularizeLevel.Profit : 0M,
YestodayPopularizeLevelGOI = IsAggregationDateEqualsYesterDay ? campaginGoi_AggregationDate_PopularizeLevel.GOI : 0M,
Recent7dCost = campaginGoi_7d_PopularizeLevel?.Cost ?? 0M,
Recent7dPopularizeLevelProfit = campaginGoi_7d_PopularizeLevel?.Profit ?? 0M,
Recent7dPopularizeLevelGOI = campaginGoi_7d_PopularizeLevel?.GOI ?? 0M,
Recent30dCost = campaginGoi_30d_PopularizeLevel?.Cost ?? 0M,
Recent30dPopularizeLevelProfit = campaginGoi_30d_PopularizeLevel?.Profit ?? 0M,
Recent30dPopularizeLevelGOI = campaginGoi_30d_PopularizeLevel?.GOI ?? 0M
});
}
else
{
var updateCampaignAggregation = fsql.Update<AggregationJDPopularizeCampaign>(campaign.CampaignId.Value)
.Set(s => s.Date, DateTime.Now.Date)
.Set(s => s.UpdateTime, DateTime.Now)
.SetIf(IsAggregationDateEqualsYesterDay, s => s.YestodayCost, campaginGoi_AggregationDate_PopularizeLevel?.Cost ?? 0M)
.SetIf(IsAggregationDateEqualsYesterDay, s => s.YestodayPopularizeLevelProfit, campaginGoi_AggregationDate_PopularizeLevel?.Profit ?? 0M)
.SetIf(IsAggregationDateEqualsYesterDay, s => s.YestodayPopularizeLevelGOI, campaginGoi_AggregationDate_PopularizeLevel?.GOI ?? 0M)
.SetIf(campaginGoi_7d_PopularizeLevel != null, s => s.Recent7dCost, campaginGoi_7d_PopularizeLevel?.Cost ?? 0M)
.SetIf(campaginGoi_7d_PopularizeLevel != null, s => s.Recent7dPopularizeLevelProfit, campaginGoi_7d_PopularizeLevel?.Profit ?? 0M)
.SetIf(campaginGoi_7d_PopularizeLevel != null, s => s.Recent7dPopularizeLevelGOI, campaginGoi_7d_PopularizeLevel?.GOI ?? 0M)
.SetIf(campaginGoi_30d_PopularizeLevel != null, s => s.Recent30dCost, campaginGoi_30d_PopularizeLevel?.Cost ?? 0M)
.SetIf(campaginGoi_30d_PopularizeLevel != null, s => s.Recent30dPopularizeLevelProfit, campaginGoi_30d_PopularizeLevel?.Profit ?? 0M)
.SetIf(campaginGoi_30d_PopularizeLevel != null, s => s.Recent30dPopularizeLevelGOI, campaginGoi_30d_PopularizeLevel?.GOI ?? 0M);
updateAggregationCampaignList.Add(updateCampaignAggregation);
}
#endregion
}
fsql.Transaction(() =>
{
fsql.Delete<AggregationJDPopularizeCampaignDaily>().Where(s => s.Date == aggregationDate && campaignIdList.Contains(s.CampaignId)).ExecuteAffrows();
if (insertAggregationCampaignDailyList.Count() > 0)
fsql.Insert(insertAggregationCampaignDailyList).ExecuteAffrows();
if (insertAggregationCampaignList.Count() > 0)
fsql.Insert(insertAggregationCampaignList).ExecuteAffrows();
if (updateAggregationCampaignList.Count() > 0)
{
foreach (var update in updateAggregationCampaignList)
update.ExecuteAffrows();
}
});
}
#endregion
#region 单元聚合任务
public void StartAdGroupAggregationTask()
{
StartAdGroupAggregationTaskByCondition(new AdGroupAggregationRequest()
{
AggregationDate = DateTime.Now.Date.AddDays(-1),
ShopId = null,
AdGroupId = null
});
}
public void StartAdGroupAggregationTaskByCondition(AdGroupAggregationRequest request)
{
var shopList = venderBusiness.GetShopList(request.ShopId);
foreach (var shop in shopList)
{
Task.Factory.StartNew(() => AdGroupAggregation(long.Parse(shop.ShopId), request.AdGroupId, request.AggregationDate), CancellationToken.None, TaskCreationOptions.LongRunning, taskSchedulerManager.AggregationCampaignGOIScheduler);
}
}
private void AdGroupAggregation(long shopId, long? adGroupId, DateTime aggregationDate)
{
aggregationDate = aggregationDate.Date;
var startDate_aggregationDate = aggregationDate;
var endDate_aggregationDate = aggregationDate.AddDays(1).AddSeconds(-1);
var IsAggregationDateEqualsYesterDay = (DateTime.Now.Date - aggregationDate).TotalDays == 1;
var adGroupList = fsql.Select<JDPopularizeAdGroup>().Where(c => c.ShopId == shopId && c.Date == aggregationDate)
.WhereIf(adGroupId != null, c => c.AdGroupId == adGroupId)
//.GroupBy(c => new { c.CampaignId, c.BusinessType })
.ToList();
var adGroupIdList = adGroupList.Select(j => j.AdGroupId).Distinct().ToArray();
if (adGroupIdList.Count() == 0)
return;
var dbAggregationJDPopularizeAdGroupList = fsql.Select<AggregationJDPopularizeAdGroup>(adGroupIdList).ToList();
List<AggregationJDPopularizeAdGroupDaily> insertAggregationAdGroupDailyList = new List<AggregationJDPopularizeAdGroupDaily>();
List<AggregationJDPopularizeAdGroup> insertAggregationAdGroupList = new List<AggregationJDPopularizeAdGroup>();
List<IUpdate<AggregationJDPopularizeAdGroup>> updateAggregationAdGroupList = new List<IUpdate<AggregationJDPopularizeAdGroup>>();
var aggregationDate_PopularizeLevelList = goiBusiness.CalculationAdGroupLevelGOI(adGroupIdList, startDate_aggregationDate, endDate_aggregationDate);
IList<GOIByLevel> recent7d_PopularizeLevelList = null;
IList<GOIByLevel> recent30d_PopularizeLevelList = null;
if ((DateTime.Now.Date - startDate_aggregationDate).TotalDays <= 31)
{
var startDate_Recent7day = DateTime.Now.Date.AddDays(-7);
var endDate_Recent7day = DateTime.Now.Date.AddSeconds(-1);
var startDate_Recent30day = DateTime.Now.Date.AddDays(-30);
var endDate_Recent30day = DateTime.Now.Date.AddSeconds(-1);
recent7d_PopularizeLevelList = goiBusiness.CalculationAdGroupLevelGOI(adGroupIdList, startDate_Recent7day, endDate_Recent7day);
recent30d_PopularizeLevelList = goiBusiness.CalculationAdGroupLevelGOI(adGroupIdList, startDate_Recent30day, endDate_Recent30day);
}
foreach (var adGroup in adGroupList)
{
#region 处理计划每日聚合
var adGroupGoi_AggregationDate_PopularizeLevel = aggregationDate_PopularizeLevelList.FirstOrDefault(x => x.LevelId == adGroup.CampaignId);
if (adGroupGoi_AggregationDate_PopularizeLevel != null)
{
var adGroupDailyAggregation = new AggregationJDPopularizeAdGroupDaily()
{
Id = idGenerator.NewLong(),
CreateTime = DateTime.Now,
Date = aggregationDate,
ShopId = shopId,
Cost = adGroupGoi_AggregationDate_PopularizeLevel?.Cost ?? 0M,
PopularizeLevelProfit = adGroupGoi_AggregationDate_PopularizeLevel?.Profit ?? 0M,
PopularizeLevelGOI = adGroupGoi_AggregationDate_PopularizeLevel?.GOI ?? 0M,
AdGroupId = adGroup.AdGroupId,
CampaignId = adGroup.CampaignId,
AdGroupName = adGroup.AdGroupName
};
insertAggregationAdGroupDailyList.Add(adGroupDailyAggregation);
}
#endregion
#region 处理计划聚合
var adGroupGoi_7d_PopularizeLevel = recent7d_PopularizeLevelList?.FirstOrDefault(x => x.LevelId == adGroup.AdGroupId);
var adGroupGoi_30d_PopularizeLevel = recent30d_PopularizeLevelList?.FirstOrDefault(x => x.LevelId == adGroup.AdGroupId);
if (!dbAggregationJDPopularizeAdGroupList.Any(c => c.Id == adGroup.AdGroupId))
{
insertAggregationAdGroupList.Add(new AggregationJDPopularizeAdGroup()
{
Id = adGroup.AdGroupId.Value,
AdGroupName = adGroup.AdGroupName,
CreateTime = DateTime.Now,
Date = DateTime.Now.Date,
ShopId = shopId,
UpdateTime = DateTime.Now,
YestodayCost = IsAggregationDateEqualsYesterDay ? (adGroupGoi_AggregationDate_PopularizeLevel?.Cost ?? 0M) : 0M,
YestodayPopularizeLevelProfit = IsAggregationDateEqualsYesterDay ? (adGroupGoi_AggregationDate_PopularizeLevel?.Profit ?? 0M) : 0M,
YestodayPopularizeLevelGOI = IsAggregationDateEqualsYesterDay ? (adGroupGoi_AggregationDate_PopularizeLevel?.GOI ?? 0M) : 0M,
Recent7dCost = adGroupGoi_7d_PopularizeLevel?.Cost ?? 0M,
Recent7dPopularizeLevelProfit = adGroupGoi_7d_PopularizeLevel?.Profit ?? 0M,
Recent7dPopularizeLevelGOI = adGroupGoi_7d_PopularizeLevel?.GOI ?? 0M,
Recent30dCost = adGroupGoi_30d_PopularizeLevel?.Cost ?? 0M,
Recent30dPopularizeLevelProfit = adGroupGoi_30d_PopularizeLevel?.Profit ?? 0M,
Recent30dPopularizeLevelGOI = adGroupGoi_30d_PopularizeLevel?.GOI ?? 0M
});
}
else
{
var updateAdGroupAggregation = fsql.Update<AggregationJDPopularizeAdGroup>(adGroup.AdGroupId.Value)
.Set(s => s.Date, DateTime.Now.Date)
.Set(s => s.UpdateTime, DateTime.Now)
.SetIf(IsAggregationDateEqualsYesterDay, s => s.YestodayCost, adGroupGoi_AggregationDate_PopularizeLevel?.Cost ?? 0M)
.SetIf(IsAggregationDateEqualsYesterDay, s => s.YestodayPopularizeLevelProfit, adGroupGoi_AggregationDate_PopularizeLevel?.Profit ?? 0M)
.SetIf(IsAggregationDateEqualsYesterDay, s => s.YestodayPopularizeLevelGOI, adGroupGoi_AggregationDate_PopularizeLevel?.GOI ?? 0M)
.SetIf(adGroupGoi_7d_PopularizeLevel != null, s => s.Recent7dCost, adGroupGoi_7d_PopularizeLevel?.Cost ?? 0M)
.SetIf(adGroupGoi_7d_PopularizeLevel != null, s => s.Recent7dPopularizeLevelProfit, adGroupGoi_7d_PopularizeLevel?.Profit ?? 0M)
.SetIf(adGroupGoi_7d_PopularizeLevel != null, s => s.Recent7dPopularizeLevelGOI, adGroupGoi_7d_PopularizeLevel?.GOI ?? 0M)
.SetIf(adGroupGoi_30d_PopularizeLevel != null, s => s.Recent30dCost, adGroupGoi_30d_PopularizeLevel?.Cost ?? 0M)
.SetIf(adGroupGoi_30d_PopularizeLevel != null, s => s.Recent30dPopularizeLevelProfit, adGroupGoi_30d_PopularizeLevel?.Profit ?? 0M)
.SetIf(adGroupGoi_30d_PopularizeLevel != null, s => s.Recent30dPopularizeLevelGOI, adGroupGoi_30d_PopularizeLevel?.GOI ?? 0M);
updateAggregationAdGroupList.Add(updateAdGroupAggregation);
}
#endregion
}
fsql.Transaction(() =>
{
fsql.Delete<AggregationJDPopularizeAdGroupDaily>().Where(s => s.Date == aggregationDate && adGroupIdList.Contains(s.AdGroupId)).ExecuteAffrows();
if (insertAggregationAdGroupDailyList.Count() > 0)
fsql.Insert(insertAggregationAdGroupDailyList).ExecuteAffrows();
if (insertAggregationAdGroupList.Count() > 0)
fsql.Insert(insertAggregationAdGroupList).ExecuteAffrows();
if (updateAggregationAdGroupList.Count() > 0)
{
foreach (var update in updateAggregationAdGroupList)
update.ExecuteAffrows();
}
});
}
#endregion
#region SKU创意维度聚合任务
#endregion
#region SKU智能投放维度聚合任务
#endregion
}
}

295
SiNan.Business/GOIBusiness.cs

@ -193,157 +193,156 @@ namespace SiNan.Business
return list;
}
//public ListResponse<ProductGOIResponse> QueryProductGOI(QueryProductGOIRequest request)
//{
// if (request.ShopId == 0)
// throw new BusinessException("缺少店铺Id");
// if (request.PageSize > 5)
// request.PageSize = 5;
// var productList = fsql.Select<Product>().Where(p => p.ShopId == request.ShopId)
// .WhereIf(!string.IsNullOrEmpty(request.SpuTitle), p => p.Title.Contains(request.SpuTitle))
// .WhereIf(!string.IsNullOrEmpty(request.Spu), p => p.Id == request.Spu)
// .Where(p => fsql.Select<ProductSku, JDPopularizeAdSku>()
// .InnerJoin((ps, jas) => ps.Id == jas.Sku)
// .WhereIf(!string.IsNullOrEmpty(request.Sku), (ps, jas) => ps.Id == request.Sku)
// .Where((ps, jas) => jas.ShopId == request.ShopId && ps.ProductId == p.Id)
// .Any())
// .OrderByDescending(p => p.CreateTime)
// .Page(request.PageIndex, request.PageSize)
// .Count(out var productCount)
// .ToList<ProductResponse>();
// if (productList.Count == 0)
// return new ListResponse<ProductGOIResponse>() { ItemList = new List<ProductGOIResponse>() };
// var productIdList = productList.Select(p => p.Id).ToList();
// var skuList = fsql.Select<ProductSku>().Where(ps => productIdList.Contains(ps.ProductId)).ToList<ProductSkuResponse>();
// var skuIdList = skuList.Select(s => s.Id).ToList();
// var startDate_yestoday = DateTime.Now.Date.AddDays(-1);
// var endDate_yestoday = DateTime.Now.Date.AddSeconds(-1);
// var startDate_Recent7day = DateTime.Now.Date.AddDays(-7);
// var endDate_Recent7day = DateTime.Now.Date.AddSeconds(-1);
// var startDate_Recent30day = DateTime.Now.Date.AddDays(-30);
// var endDate_Recent30day = DateTime.Now.Date.AddSeconds(-1);
// #region 商品维度
// //昨天
// var yestodayProductLevelGOIList = StatisticsProductLevelGOI(skuIdList, startDate_yestoday, endDate_yestoday);
// //近7天
// var recent7dayProductLevelGOIList = StatisticsProductLevelGOI(skuIdList, startDate_Recent7day, endDate_Recent7day);
// //近30天
// var recent30dayProductLevelGOIList = StatisticsProductLevelGOI(skuIdList, startDate_Recent30day, endDate_Recent30day);
// #endregion
// #region 推广维度
// //昨天
// var yestodayPopularizeLevelGOIList = StatisticsPopularizeLevelGOI(skuIdList, startDate_yestoday, endDate_yestoday);
// //近7天
// var recent7dayPopularizeLevelGOIList = StatisticsPopularizeLevelGOI(skuIdList, startDate_Recent7day, endDate_Recent7day);
// //近30天
// var recent30dayPopularizeLevelGOIList = StatisticsPopularizeLevelGOI(skuIdList, startDate_Recent30day, endDate_Recent30day);
// #endregion
// #region 累计花费/累计亏损
// var historyPopularizeLevelGOIList = StatisticsPopularizeLevelGOI(skuIdList, null, null);
// #endregion
// List<ProductGOIResponse> productGOIList = new List<ProductGOIResponse>();
// foreach (var product in productList)
// {
// var productGoi = product.Map<ProductGOIResponse>();
// productGOIList.Add(productGoi);
// productGoi.ProductSkuGOIList = skuList.Where(ps => ps.ProductId == product.Id).Map<List<ProductSkuGOIResponse>>();
// productGoi.Logo = productGoi.ProductSkuGOIList.FirstOrDefault()?.Logo;
// foreach (var productSku in productGoi.ProductSkuGOIList)
// {
// productSku.ProductGOI_Yestoday = yestodayProductLevelGOIList.FirstOrDefault(x => x.Sku == productSku.Id);
// productSku.ProductGOI_Recent7Day = recent7dayProductLevelGOIList.FirstOrDefault(x => x.Sku == productSku.Id);
// productSku.ProductGOI_Recent30Day = recent30dayProductLevelGOIList.FirstOrDefault(x => x.Sku == productSku.Id);
// productSku.PromotionGOI_Yestoday = yestodayPopularizeLevelGOIList.FirstOrDefault(x => x.Sku == productSku.Id);
// productSku.PromotionGOI_Recent7Day = recent7dayPopularizeLevelGOIList.FirstOrDefault(x => x.Sku == productSku.Id);
// productSku.PromotionGOI_Recent30Day = recent30dayPopularizeLevelGOIList.FirstOrDefault(x => x.Sku == productSku.Id);
// var historyPopularizeLevelGOI = historyPopularizeLevelGOIList.FirstOrDefault(x => x.Sku == productSku.Id);
// productSku.TotalCost = historyPopularizeLevelGOI?.Cost ?? 0M;
// productSku.TotalDeficit = (historyPopularizeLevelGOI?.Profit ?? 0M) - (historyPopularizeLevelGOI?.Cost ?? 0M);
// }
// productGoi.ProductGOI_Yestoday = new GOIResponse()
// {
// Cost = productGoi.ProductSkuGOIList.Sum(x => x.ProductGOI_Yestoday?.Cost ?? 0M),
// Profit = productGoi.ProductSkuGOIList.Sum(x => x.ProductGOI_Yestoday?.Profit ?? 0M)
// };
// productGoi.ProductGOI_Recent7Day = new GOIResponse()
// {
// Cost = productGoi.ProductSkuGOIList.Sum(x => x.ProductGOI_Recent7Day?.Cost ?? 0M),
// Profit = productGoi.ProductSkuGOIList.Sum(x => x.ProductGOI_Recent7Day?.Profit ?? 0M)
// };
// productGoi.ProductGOI_Recent30Day = new GOIResponse()
// {
// Cost = productGoi.ProductSkuGOIList.Sum(x => x.ProductGOI_Recent30Day?.Cost ?? 0M),
// Profit = productGoi.ProductSkuGOIList.Sum(x => x.ProductGOI_Recent30Day?.Profit ?? 0M)
// };
// productGoi.PromotionGOI_Yestoday = new GOIResponse()
// {
// Cost = productGoi.ProductSkuGOIList.Sum(x => x.PromotionGOI_Yestoday?.Cost ?? 0M),
// Profit = productGoi.ProductSkuGOIList.Sum(x => x.PromotionGOI_Yestoday?.Profit ?? 0M)
// };
// productGoi.PromotionGOI_Recent7Day = new GOIResponse()
// {
// Cost = productGoi.ProductSkuGOIList.Sum(x => x.PromotionGOI_Recent7Day?.Cost ?? 0M),
// Profit = productGoi.ProductSkuGOIList.Sum(x => x.PromotionGOI_Recent7Day?.Profit ?? 0M)
// };
// productGoi.PromotionGOI_Recent30Day = new GOIResponse()
// {
// Cost = productGoi.ProductSkuGOIList.Sum(x => x.PromotionGOI_Recent30Day?.Cost ?? 0M),
// Profit = productGoi.ProductSkuGOIList.Sum(x => x.PromotionGOI_Recent30Day?.Profit ?? 0M)
// };
// productGoi.TotalCost = productGoi.ProductSkuGOIList.Sum(x => x.TotalCost);
// productGoi.TotalDeficit = productGoi.ProductSkuGOIList.Sum(x => x.TotalDeficit);
// for (var i = 0; i < productGoi.ProductSkuGOIList.Count(); i++)
// {
// var productSku = productGoi.ProductSkuGOIList[i];
// if (productSku.TotalCost == 0)
// {
// productGoi.ProductSkuGOIList.RemoveAt(i);
// i--;
// }
// }
// }
// return new ListResponse<ProductGOIResponse>()
// {
// Count = productCount,
// ItemList = productGOIList
// };
//}
public ListResponse<ProductGOIResponse> QueryProductGOI(QueryProductGOIRequest request)
{
if (request.ShopId == 0)
throw new BusinessException("缺少店铺Id");
if (request.PageSize > 5)
request.PageSize = 5;
//ISelect<ProductSku>? skuChildSelect = string.IsNullOrEmpty(request.Sku) ?
// null :
// fsql.Select<ProductSku>().As("ps").Where(ps => ps.ShopId == request.ShopId && ps.Id == request.Sku);
//var productList = fsql.Select<Product>().Where(p => p.ShopId == request.ShopId)
// .WhereIf(!string.IsNullOrEmpty(request.Spu), p => p.Id == request.Spu)
// .WhereIf(skuChildSelect != null, p => skuChildSelect.Where(ps => ps.ProductId == p.Id).Any())
// .OrderByDescending(p => p.CreateTime)
// .Page(request.PageIndex, request.PageSize)
// .Count(out var productCount)
// .ToList<ProductResponse>();
var productList = fsql.Select<Product>().Where(p => p.ShopId == request.ShopId)
.WhereIf(!string.IsNullOrEmpty(request.SpuTitle), p => p.Title.Contains(request.SpuTitle))
.WhereIf(!string.IsNullOrEmpty(request.Spu), p => p.Id == request.Spu)
.Where(p => fsql.Select<ProductSku, JDPopularizeAdSku>()
.InnerJoin((ps, jas) => ps.Id == jas.Sku)
.WhereIf(!string.IsNullOrEmpty(request.Sku), (ps, jas) => ps.Id == request.Sku)
.Where((ps, jas) => jas.ShopId == request.ShopId && ps.ProductId == p.Id)
.Any())
.OrderByDescending(p => p.CreateTime)
.Page(request.PageIndex, request.PageSize)
.Count(out var productCount)
.ToList<ProductResponse>();
if (productList.Count == 0)
return new ListResponse<ProductGOIResponse>() { ItemList = new List<ProductGOIResponse>() };
var productIdList = productList.Select(p => p.Id).ToList();
var skuList = fsql.Select<ProductSku>().Where(ps => productIdList.Contains(ps.ProductId)).ToList<ProductSkuResponse>();
var skuIdList = skuList.Select(s => s.Id).ToList();
var startDate_yestoday = DateTime.Now.Date.AddDays(-1);
var endDate_yestoday = DateTime.Now.Date.AddSeconds(-1);
var startDate_Recent7day = DateTime.Now.Date.AddDays(-7);
var endDate_Recent7day = DateTime.Now.Date.AddSeconds(-1);
var startDate_Recent30day = DateTime.Now.Date.AddDays(-30);
var endDate_Recent30day = DateTime.Now.Date.AddSeconds(-1);
#region 商品维度
//昨天
var yestodayProductLevelGOIList = StatisticsProductLevelGOI(skuIdList, startDate_yestoday, endDate_yestoday);
//近7天
var recent7dayProductLevelGOIList = StatisticsProductLevelGOI(skuIdList, startDate_Recent7day, endDate_Recent7day);
//近30天
var recent30dayProductLevelGOIList = StatisticsProductLevelGOI(skuIdList, startDate_Recent30day, endDate_Recent30day);
#endregion
#region 推广维度
//昨天
var yestodayPopularizeLevelGOIList = StatisticsPopularizeLevelGOI(skuIdList, startDate_yestoday, endDate_yestoday);
//近7天
var recent7dayPopularizeLevelGOIList = StatisticsPopularizeLevelGOI(skuIdList, startDate_Recent7day, endDate_Recent7day);
//近30天
var recent30dayPopularizeLevelGOIList = StatisticsPopularizeLevelGOI(skuIdList, startDate_Recent30day, endDate_Recent30day);
#endregion
#region 累计花费/累计亏损
var historyPopularizeLevelGOIList = StatisticsPopularizeLevelGOI(skuIdList, null, null);
#endregion
List<ProductGOIResponse> productGOIList = new List<ProductGOIResponse>();
foreach (var product in productList)
{
var productGoi = product.Map<ProductGOIResponse>();
productGOIList.Add(productGoi);
productGoi.ProductSkuGOIList = skuList.Where(ps => ps.ProductId == product.Id).Map<List<ProductSkuGOIResponse>>();
productGoi.Logo = productGoi.ProductSkuGOIList.FirstOrDefault()?.Logo;
foreach (var productSku in productGoi.ProductSkuGOIList)
{
productSku.ProductGOI_Yestoday = yestodayProductLevelGOIList.FirstOrDefault(x => x.Sku == productSku.Id);
productSku.ProductGOI_Recent7Day = recent7dayProductLevelGOIList.FirstOrDefault(x => x.Sku == productSku.Id);
productSku.ProductGOI_Recent30Day = recent30dayProductLevelGOIList.FirstOrDefault(x => x.Sku == productSku.Id);
productSku.PromotionGOI_Yestoday = yestodayPopularizeLevelGOIList.FirstOrDefault(x => x.Sku == productSku.Id);
productSku.PromotionGOI_Recent7Day = recent7dayPopularizeLevelGOIList.FirstOrDefault(x => x.Sku == productSku.Id);
productSku.PromotionGOI_Recent30Day = recent30dayPopularizeLevelGOIList.FirstOrDefault(x => x.Sku == productSku.Id);
var historyPopularizeLevelGOI = historyPopularizeLevelGOIList.FirstOrDefault(x => x.Sku == productSku.Id);
productSku.TotalCost = historyPopularizeLevelGOI?.Cost ?? 0M;
productSku.TotalDeficit = (historyPopularizeLevelGOI?.Profit ?? 0M) - (historyPopularizeLevelGOI?.Cost ?? 0M);
}
productGoi.ProductGOI_Yestoday = new GOIResponse()
{
Cost = productGoi.ProductSkuGOIList.Sum(x => x.ProductGOI_Yestoday?.Cost ?? 0M),
Profit = productGoi.ProductSkuGOIList.Sum(x => x.ProductGOI_Yestoday?.Profit ?? 0M)
};
productGoi.ProductGOI_Recent7Day = new GOIResponse()
{
Cost = productGoi.ProductSkuGOIList.Sum(x => x.ProductGOI_Recent7Day?.Cost ?? 0M),
Profit = productGoi.ProductSkuGOIList.Sum(x => x.ProductGOI_Recent7Day?.Profit ?? 0M)
};
productGoi.ProductGOI_Recent30Day = new GOIResponse()
{
Cost = productGoi.ProductSkuGOIList.Sum(x => x.ProductGOI_Recent30Day?.Cost ?? 0M),
Profit = productGoi.ProductSkuGOIList.Sum(x => x.ProductGOI_Recent30Day?.Profit ?? 0M)
};
productGoi.PromotionGOI_Yestoday = new GOIResponse()
{
Cost = productGoi.ProductSkuGOIList.Sum(x => x.PromotionGOI_Yestoday?.Cost ?? 0M),
Profit = productGoi.ProductSkuGOIList.Sum(x => x.PromotionGOI_Yestoday?.Profit ?? 0M)
};
productGoi.PromotionGOI_Recent7Day = new GOIResponse()
{
Cost = productGoi.ProductSkuGOIList.Sum(x => x.PromotionGOI_Recent7Day?.Cost ?? 0M),
Profit = productGoi.ProductSkuGOIList.Sum(x => x.PromotionGOI_Recent7Day?.Profit ?? 0M)
};
productGoi.PromotionGOI_Recent30Day = new GOIResponse()
{
Cost = productGoi.ProductSkuGOIList.Sum(x => x.PromotionGOI_Recent30Day?.Cost ?? 0M),
Profit = productGoi.ProductSkuGOIList.Sum(x => x.PromotionGOI_Recent30Day?.Profit ?? 0M)
};
productGoi.TotalCost = productGoi.ProductSkuGOIList.Sum(x => x.TotalCost);
productGoi.TotalDeficit = productGoi.ProductSkuGOIList.Sum(x => x.TotalDeficit);
for (var i = 0; i < productGoi.ProductSkuGOIList.Count(); i++)
{
var productSku = productGoi.ProductSkuGOIList[i];
if (productSku.TotalCost == 0)
{
productGoi.ProductSkuGOIList.RemoveAt(i);
i--;
}
}
}
return new ListResponse<ProductGOIResponse>();
}
return new ListResponse<ProductGOIResponse>()
{
Count = productCount,
ItemList = productGOIList
};
public ListResponse<ProductSkuGOIResponse> QueryProductSkuGOI(QueryProductSkuGOIRequest request)
{
return new ListResponse<ProductSkuGOIResponse>();
}
public ListResponse<Product360PopularizeAnalysisCampaginRepsonse> QueryProduct360PopularizeGOI(Product360PopularizeAnalysisRequest request)

8
SiNan.Business/SiNan.Business.csproj

@ -7,6 +7,14 @@
<GenerateDocumentationFile>True</GenerateDocumentationFile>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
<NoWarn>1701;1702;8600</NoWarn>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
<NoWarn>1701;1702;8600</NoWarn>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="AutoMapper" Version="12.0.1" />
<PackageReference Include="FreeSql" Version="3.2.801" />

6
SiNan.Business/TaskSchedulerManager.cs

@ -7,9 +7,15 @@ namespace SiNan.Business
public LimitedConcurrencyLevelTaskScheduler AggregationSpuGOIScheduler { get; private set; }
public LimitedConcurrencyLevelTaskScheduler AggregationCampaignGOIScheduler { get; private set; }
public LimitedConcurrencyLevelTaskScheduler AggregationAdGroupGOIScheduler { get; private set; }
public TaskSchedulerManager()
{
AggregationSpuGOIScheduler = new LimitedConcurrencyLevelTaskScheduler(5);
AggregationCampaignGOIScheduler = new LimitedConcurrencyLevelTaskScheduler(5);
AggregationAdGroupGOIScheduler = new LimitedConcurrencyLevelTaskScheduler(5);
}
}
}

17
SiNan.Model/Dto/Request/Aggregation/AdGroupAggregationRequest.cs

@ -0,0 +1,17 @@
namespace SiNan.Model.Dto
{
public class AdGroupAggregationRequest
{
/// <summary>
/// ShopId可空
/// </summary>
public long? ShopId { get; set; }
public DateTime AggregationDate { get; set; }
/// <summary>
/// 单元Id可空
/// </summary>
public long? AdGroupId { get; set; }
}
}

17
SiNan.Model/Dto/Request/Aggregation/CampaignAggregationRequest.cs

@ -0,0 +1,17 @@
namespace SiNan.Model.Dto
{
public class CampaignAggregationRequest
{
/// <summary>
/// ShopId可空
/// </summary>
public long? ShopId { get; set; }
public DateTime AggregationDate { get; set; }
/// <summary>
/// 计划Id可空
/// </summary>
public long? CampaignId { get; set; }
}
}

2
SiNan.Model/Dto/Request/GOI/QueryProductGOIRequest.cs

@ -32,5 +32,5 @@
public long ShopId { get; set; }
}
}

2
SiNan.Model/Dto/Request/GOI/QueryProductSkuGOIRequest.cs

@ -7,5 +7,7 @@
public DateTime StartDate { get; set; }
public DateTime EndDate { get; set; }
public long? ShopId { get; set; }
}
}

Loading…
Cancel
Save