Browse Source

GOI预警

qianyi
shanji 3 years ago
parent
commit
8abf75fa88
  1. 66
      BBWY.Server.Business/DingDingBusiness.cs
  2. 65
      BBWY.Server.Business/EarlyWarning/JD/JDStockNumWarningBusiness.cs
  3. 541
      BBWY.Server.Business/SiNan/GOIWarningBusiness.cs
  4. 132
      BBWY.Server.Business/Statistics/JDReportFormStatisticsBusiness.cs
  5. 3
      BBWY.Server.Business/TaskSchedulerManager.cs
  6. 3
      BBWY.Server.Business/Vender/VenderBusiness.cs
  7. 2
      BBWY.Server.Model/Dto/Request/Statistics/GOIRequest.cs
  8. 12
      BBWY.Server.Model/Enums.cs

66
BBWY.Server.Business/DingDingBusiness.cs

@ -0,0 +1,66 @@
using BBWY.Common.Extensions;
using BBWY.Common.Http;
using BBWY.Common.Models;
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Security.Cryptography;
using System.Text;
using Yitter.IdGenerator;
namespace BBWY.Server.Business
{
public class DingDingBusiness : BaseBusiness, IDenpendency
{
private RestApiService restApiService;
public DingDingBusiness(IFreeSql fsql, NLogManager nLogManager, IIdGenerator idGenerator, RestApiService restApiService) : base(fsql, nLogManager, idGenerator)
{
this.restApiService = restApiService;
}
public void SendDingDingBotMessage(string secret, string webHook, string content)
{
var timestamp = DateTime.Now.DateTimeToStamp();
var stringToSign = timestamp + "\n" + secret;
var sign = EncryptWithSHA256(stringToSign, secret);
var url = $"{webHook}&timestamp={timestamp}&sign={sign}";
var result = restApiService.SendRequest(url, string.Empty, new
{
msgtype = "text",
text = new
{
content = content
}
}, null, HttpMethod.Post);
if (result.StatusCode != System.Net.HttpStatusCode.OK)
throw new Exception($"发送钉钉机器人消息失败 {result.Content}");
}
/// <summary>
/// Base64 SHA256
/// </summary>
/// <param name="data">待加密数据</param>
/// <param name="secret">密钥</param>
/// <returns></returns>
private string EncryptWithSHA256(string data, string secret)
{
secret = secret ?? "";
// 1、string 转换成 utf-8 的byte[]
var encoding = Encoding.UTF8;
byte[] keyByte = encoding.GetBytes(secret);
byte[] dataBytes = encoding.GetBytes(data);
// 2、 HMACSHA256加密
using (var hmac256 = new HMACSHA256(keyByte))
{
byte[] hashData = hmac256.ComputeHash(dataBytes);
// 3、转换成base64
var base64Str = Convert.ToBase64String(hashData);
// 4、urlEncode编码
return System.Web.HttpUtility.UrlEncode(base64Str, Encoding.UTF8);
}
}
}
}

65
BBWY.Server.Business/EarlyWarning/JD/JDStockNumWarningBusiness.cs

@ -22,14 +22,16 @@ namespace BBWY.Server.Business
public class JDStockNumWarningBusiness : BaseSyncBusiness, IDenpendency public class JDStockNumWarningBusiness : BaseSyncBusiness, IDenpendency
{ {
private IList<Enums.StorageType> validStorageTypeList; private IList<Enums.StorageType> validStorageTypeList;
private DingDingBusiness dingDingBusiness;
public JDStockNumWarningBusiness(RestApiService restApiService, IOptions<GlobalConfig> options, NLogManager nLogManager, IFreeSql fsql, IIdGenerator idGenerator, TaskSchedulerManager taskSchedulerManager, VenderBusiness venderBusiness, YunDingBusiness yunDingBusiness) : base(restApiService, options, nLogManager, fsql, idGenerator, taskSchedulerManager, venderBusiness, yunDingBusiness) public JDStockNumWarningBusiness(RestApiService restApiService, IOptions<GlobalConfig> options, NLogManager nLogManager, IFreeSql fsql, IIdGenerator idGenerator, TaskSchedulerManager taskSchedulerManager, VenderBusiness venderBusiness, YunDingBusiness yunDingBusiness, DingDingBusiness dingDingBusiness) : base(restApiService, options, nLogManager, fsql, idGenerator, taskSchedulerManager, venderBusiness, yunDingBusiness)
{ {
validStorageTypeList = new List<Enums.StorageType>() { validStorageTypeList = new List<Enums.StorageType>() {
Enums.StorageType., Enums.StorageType.,
Enums.StorageType., Enums.StorageType.,
Enums.StorageType. Enums.StorageType.
}; };
this.dingDingBusiness = dingDingBusiness;
} }
public void StartCheckStockNum() public void StartCheckStockNum()
@ -44,9 +46,9 @@ namespace BBWY.Server.Business
private void CheckStockNum(ShopResponse shop, IList<Storehouse> storeHouseList) private void CheckStockNum(ShopResponse shop, IList<Storehouse> storeHouseList)
{ {
var loggerName = $"库存预警-{shop.ShopName}";
try try
{ {
var loggerName = $"库存预警-{shop.ShopName}";
long shopId = long.Parse(shop.ShopId); long shopId = long.Parse(shop.ShopId);
var yesterDayDate = DateTime.Now.Date.AddDays(-1); var yesterDayDate = DateTime.Now.Date.AddDays(-1);
var ysterDayTime = DateTime.Now.Date.AddSeconds(-1); var ysterDayTime = DateTime.Now.Date.AddSeconds(-1);
@ -262,52 +264,27 @@ namespace BBWY.Server.Business
if (isSendDingTalk) if (isSendDingTalk)
{ {
var secret = shop.DingDingKey; dingDingBusiness.SendDingDingBotMessage(shop.DingDingKey, shop.DingDingWebHook, dingdingContentBuilder.ToString());
var timestamp = DateTime.Now.DateTimeToStamp(); //var secret = shop.DingDingKey;
var stringToSign = timestamp + "\n" + secret; //var timestamp = DateTime.Now.DateTimeToStamp();
var sign = EncryptWithSHA256(stringToSign, secret); //var stringToSign = timestamp + "\n" + secret;
var url = $"{shop.DingDingWebHook}&timestamp={timestamp}&sign={sign}"; //var sign = EncryptWithSHA256(stringToSign, secret);
var result = restApiService.SendRequest(url, string.Empty, new //var url = $"{shop.DingDingWebHook}&timestamp={timestamp}&sign={sign}";
{ //var result = restApiService.SendRequest(url, string.Empty, new
msgtype = "text", //{
text = new // msgtype = "text",
{ // text = new
content = dingdingContentBuilder.ToString() // {
} // content = dingdingContentBuilder.ToString()
}, null, HttpMethod.Post); // }
if (result.StatusCode != System.Net.HttpStatusCode.OK) //}, null, HttpMethod.Post);
throw new Exception($"{shop.ShopName} 发送钉钉库存预警失败 {result.Content}"); //if (result.StatusCode != System.Net.HttpStatusCode.OK)
// throw new Exception($"{shop.ShopName} 发送钉钉库存预警失败 {result.Content}");
} }
} }
catch (Exception ex) catch (Exception ex)
{ {
nLogManager.GetLogger($"库存预警-{shop.ShopName}").Error(ex, "查询sku库存失败"); nLogManager.GetLogger(loggerName).Error(ex, "查询sku库存失败");
}
}
/// <summary>
/// Base64 SHA256
/// </summary>
/// <param name="data">待加密数据</param>
/// <param name="secret">密钥</param>
/// <returns></returns>
private string EncryptWithSHA256(string data, string secret)
{
secret = secret ?? "";
// 1、string 转换成 utf-8 的byte[]
var encoding = Encoding.UTF8;
byte[] keyByte = encoding.GetBytes(secret);
byte[] dataBytes = encoding.GetBytes(data);
// 2、 HMACSHA256加密
using (var hmac256 = new HMACSHA256(keyByte))
{
byte[] hashData = hmac256.ComputeHash(dataBytes);
// 3、转换成base64
var base64Str = Convert.ToBase64String(hashData);
// 4、urlEncode编码
return System.Web.HttpUtility.UrlEncode(base64Str, Encoding.UTF8);
} }
} }
} }

541
BBWY.Server.Business/SiNan/GOIWarningBusiness.cs

@ -1,12 +1,549 @@
using BBWY.Common.Models; using BBWY.Common.Extensions;
using BBWY.Common.Http;
using BBWY.Common.Models;
using BBWY.Server.Business.Statistics;
using BBWY.Server.Model;
using BBWY.Server.Model.Db;
using BBWY.Server.Model.Dto;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using Yitter.IdGenerator; using Yitter.IdGenerator;
namespace BBWY.Server.Business.SiNan namespace BBWY.Server.Business.SiNan
{ {
public class GOIWarningBusiness : BaseBusiness, IDenpendency public class GOIWarningBusiness : BaseBusiness, IDenpendency
{ {
public GOIWarningBusiness(IFreeSql fsql, NLogManager nLogManager, IIdGenerator idGenerator) : base(fsql, nLogManager, idGenerator) private TaskSchedulerManager taskSchedulerManager;
private VenderBusiness venderBusiness;
private JDReportFormStatisticsBusiness jDReportFormStatisticsBusiness;
private DingDingBusiness dingDingBusiness;
public GOIWarningBusiness(IFreeSql fsql, NLogManager nLogManager, IIdGenerator idGenerator, TaskSchedulerManager taskSchedulerManager, VenderBusiness venderBusiness, JDReportFormStatisticsBusiness jDReportFormStatisticsBusiness, DingDingBusiness dingDingBusiness) : base(fsql, nLogManager, idGenerator)
{
this.taskSchedulerManager = taskSchedulerManager;
this.venderBusiness = venderBusiness;
this.jDReportFormStatisticsBusiness = jDReportFormStatisticsBusiness;
this.dingDingBusiness = dingDingBusiness;
}
public void StartCheckGOI()
{
var shopList = venderBusiness.GetShopList(platform: Enums.Platform., filterSiNan: true);
foreach (var shop in shopList)
{
Task.Factory.StartNew(() => CheckGOI(shop), CancellationToken.None, TaskCreationOptions.LongRunning, taskSchedulerManager.GOIWarningTaskScheduler);
}
}
public void CheckGOI(ShopResponse shop)
{ {
var loggerName = $"GOI预警-{shop.ShopName}";
try
{
var shopId = long.Parse(shop.ShopId);
var yesterday = DateTime.Now.Date.AddDays(-1);
var startQueryDay = yesterday.AddDays(-6);
var yesterdayJDpopularizeadskuList = fsql.Select<JDPopularizeAdSku, JDPopularizeCampaign, JDPopularizeAdGroup>()
.LeftJoin((s, c, adg) => s.CampaignId == c.CampaignId && s.Date == c.Date)
.LeftJoin((s, c, adg) => s.AdGroupId == adg.AdGroupId && s.Date == adg.Date)
.Where((s, c, adg) => s.ShopId == shopId && s.Date == yesterday)
.ToList((s, c, adg) => new
{
CampaignId = s.CampaignId,
CampaignName = c.CampaignName,
AdGroupId = s.AdGroupId,
AdGroupName = adg.AdGroupName,
AdId = s.AdId,
AdName = s.AdName,
BusinessType = s.BusinessType,
Sku = s.Sku
});
var adGroupIds = yesterdayJDpopularizeadskuList.Where(s => s.BusinessType == 2).Select(s => s.AdGroupId.Value).Distinct().ToList();
var adIds = yesterdayJDpopularizeadskuList.Where(s => s.BusinessType == 2).Select(s => s.AdId.Value).Distinct().ToList();
var skuIds = yesterdayJDpopularizeadskuList.Where(s => s.BusinessType == 134217728).Select(s => s.Sku).Distinct().ToList();
bool isSendDingTalk = false;
var dingdingContentBuilder = new StringBuilder();
dingdingContentBuilder.Append(shop.ShopName);
dingdingContentBuilder.AppendLine();
var growupCost = 0; //成长加速期花费阈值
var growupLevel1Cost = 0; //成长加速期第一阶段成本
var growupLevel2Cost = 0; //成长加速期第二阶段成本
var growupLevel2MinGOI = 0M; //成长加速器第二阶段最低GOI
var growupLevel2MaxGOI = 0M; //成长加速器第二阶段最大GOI
var growupLevel3Cost = 0; //成长加速期第三阶段成本
var growupLevel3MinGOI = 0M; //成长加速器第三阶段最低GOI
var growupLevel3MaxGOI = 0M; //成长加速器第三阶段最大GOI
var growupLevel4Cost = 0; //成长加速期第四阶段成本
var growupLevel4MinGOI = 0M; //成长加速器第四阶段最低GOI
var growupLevel4MaxGOI = 0M; //成长加速器第四阶段最大GOI
var matureCost = 0; //成熟期花费阈值
var mature7dCost = 0; //成熟期7天花费阈值
var matureLevel1MinGOI = 0M; //成熟期第一阶段最低GOI
var matureLevel1MaxGOI = 0M; //成熟期第一阶段最大GOI
var stableCost = 0; //稳定期花费阈值
var stable7dCost = 0; //稳定期7天花费阈值
var stableLevel1MinGOI = 0M; //稳定期第一阶段最低GOI
var stableLevel1MaxGOI = 0M; //稳定期第一阶段最大GOI
if (shop.SiNanPolicyLevel == 0) //初级策略
{
growupCost = 300;
growupLevel1Cost = 100;
growupLevel2Cost = 100;
growupLevel2MinGOI = 0.5M;
growupLevel2MaxGOI = 1.1M;
growupLevel3Cost = 200;
growupLevel3MinGOI = 0.7M;
growupLevel3MaxGOI = 1.1M;
growupLevel4Cost = 300;
growupLevel4MinGOI = 0.9M;
growupLevel4MaxGOI = 1.1M;
matureCost = 300;
mature7dCost = 150;
matureLevel1MinGOI = 0.9M;
matureLevel1MaxGOI = 1.2M;
stableCost = 300;
stable7dCost = 150;
stableLevel1MinGOI = 1.0M;
stableLevel1MaxGOI = 2;
}
else if (shop.SiNanPolicyLevel == 1) //中级策略
{
growupCost = 600;
growupLevel1Cost = 200;
growupLevel2Cost = 200;
growupLevel2MinGOI = 0.5M;
growupLevel2MaxGOI = 1.1M;
growupLevel3Cost = 400;
growupLevel3MinGOI = 0.7M;
growupLevel3MaxGOI = 1.1M;
growupLevel4Cost = 600;
growupLevel4MinGOI = 0.9M;
growupLevel4MaxGOI = 1.1M;
matureCost = 600;
mature7dCost = 300;
matureLevel1MinGOI = 0.9M;
matureLevel1MaxGOI = 1.2M;
stableCost = 600;
stable7dCost = 300;
stableLevel1MinGOI = 1.0M;
stableLevel1MaxGOI = 2;
}
else if (shop.SiNanPolicyLevel == 2) //高级策略
{
growupCost = 1000;
growupLevel1Cost = 300;
growupLevel2Cost = 300;
growupLevel2MinGOI = 0.5M;
growupLevel2MaxGOI = 1.1M;
growupLevel3Cost = 700;
growupLevel3MinGOI = 0.7M;
growupLevel3MaxGOI = 1.1M;
growupLevel4Cost = 999;
growupLevel4MinGOI = 0.9M;
growupLevel4MaxGOI = 1.1M;
matureCost = 1000;
mature7dCost = 500;
matureLevel1MinGOI = 0.9M;
matureLevel1MaxGOI = 1.2M;
stableCost = 1000;
stable7dCost = 500;
stableLevel1MinGOI = 1.0M;
stableLevel1MaxGOI = 2;
}
#region 单元
bool isAddBusinessTypeTitle = false;
var adGroupGOIList = jDReportFormStatisticsBusiness.CalculationAdGroupLevelGOI(new GOIRequest()
{
BusinessType = 2,
LevelIdList = adGroupIds,
OnlyCustomDate = true,
StartDate = yesterday,
EndDate = startQueryDay
});
foreach (var adGroupGOI in adGroupGOIList)
{
var adGroup = yesterdayJDpopularizeadskuList.FirstOrDefault(s => s.AdGroupId == adGroupGOI.LevelId);
if (adGroup == null)
continue;
var logContentBuilder = new StringBuilder();
logContentBuilder.AppendLine($"单元维度 {adGroup.CampaignName}({adGroup.CampaignId})-{adGroup.AdGroupName}({adGroup.AdGroupId})");
Enums.SiNanCycleType? siNanCycleType = Enums.SiNanCycleType.;
bool isWarning = false;
string dingdingWarningContent = string.Empty;
if (adGroupGOI.TotalCost < growupCost)
{
siNanCycleType = Enums.SiNanCycleType.;
if (adGroupGOI.TotalCost < growupLevel1Cost)
{
//不建议调整
isWarning = false;
}
else if (adGroupGOI.TotalCost >= growupLevel4Cost)
{
if (adGroupGOI.CustomDaysGOI.GOI < growupLevel4MinGOI)
{
isWarning = true;
dingdingWarningContent = $"{adGroup.CampaignName}-{adGroup.AdGroupName} 处于{siNanCycleType},近7天GOI低于{growupLevel4MinGOI},请及时优化!";
}
else if (adGroupGOI.CustomDaysGOI.GOI > growupLevel4MaxGOI)
{
isWarning = true;
dingdingWarningContent = $"{adGroup.CampaignName}-{adGroup.AdGroupName} 处于{siNanCycleType},近7天GOI低于{growupLevel4MaxGOI},舍不得孩子套不住狼,请及时优化!";
}
}
else if (adGroupGOI.TotalCost >= growupLevel3Cost)
{
if (adGroupGOI.CustomDaysGOI.GOI < growupLevel3MinGOI)
{
isWarning = true;
dingdingWarningContent = $"{adGroup.CampaignName}-{adGroup.AdGroupName} 处于{siNanCycleType},近7天GOI低于{growupLevel3MinGOI},请及时优化!";
}
else if (adGroupGOI.CustomDaysGOI.GOI < growupLevel3MaxGOI)
{
isWarning = true;
dingdingWarningContent = $"{adGroup.CampaignName}-{adGroup.AdGroupName} 处于{siNanCycleType},近7天GOI低于{growupLevel3MaxGOI},舍不得孩子套不住狼,请及时优化!";
}
}
else if (adGroupGOI.TotalCost >= growupLevel2Cost)
{
if (adGroupGOI.CustomDaysGOI.GOI < growupLevel2MinGOI)
{
isWarning = true;
dingdingWarningContent = $"{adGroup.CampaignName}-{adGroup.AdGroupName} 处于{siNanCycleType},近7天GOI低于{growupLevel2MinGOI},请及时优化!";
}
else if (adGroupGOI.CustomDaysGOI.GOI < growupLevel2MaxGOI)
{
isWarning = true;
dingdingWarningContent = $"{adGroup.CampaignName}-{adGroup.AdGroupName} 处于{siNanCycleType},近7天GOI低于{growupLevel2MaxGOI},舍不得孩子套不住狼,请及时优化!";
}
}
}
else if (adGroupGOI.TotalCost > matureCost && adGroupGOI.CustomDaysGOI.Cost > mature7dCost)
{
siNanCycleType = Enums.SiNanCycleType.;
if (adGroupGOI.CustomDaysGOI.GOI < matureLevel1MinGOI)
{
isWarning = true;
dingdingWarningContent = $"{adGroup.CampaignName}-{adGroup.AdGroupName} 处于{siNanCycleType},近7天GOI低于{matureLevel1MinGOI},请及时优化!";
}
else if (adGroupGOI.CustomDaysGOI.GOI > matureLevel1MaxGOI)
{
isWarning = true;
dingdingWarningContent = $"{adGroup.CampaignName}-{adGroup.AdGroupName} 处于{siNanCycleType},近7天GOI低于{matureLevel1MaxGOI},舍不得孩子套不住狼,请及时优化!";
}
}
else if (adGroupGOI.TotalCost > stableCost && adGroupGOI.CustomDaysGOI.Cost < stable7dCost)
{
siNanCycleType = Enums.SiNanCycleType.;
if (adGroupGOI.CustomDaysGOI.GOI < stableLevel1MinGOI)
{
isWarning = true;
dingdingWarningContent = $"{adGroup.CampaignName}-{adGroup.AdGroupName} 处于{siNanCycleType},近7天GOI低于{stableLevel1MinGOI},请及时优化!";
}
else if (adGroupGOI.CustomDaysGOI.GOI > stableLevel1MaxGOI)
{
isWarning = true;
dingdingWarningContent = $"{adGroup.CampaignName}-{adGroup.AdGroupName} 处于{siNanCycleType},近7天GOI低于{stableLevel1MaxGOI},舍不得孩子套不住狼,请及时优化!";
}
}
logContentBuilder.AppendLine($"{siNanCycleType}");
logContentBuilder.AppendLine($"累计推广花费{adGroupGOI.TotalCost}");
logContentBuilder.AppendLine($"近7天花费{adGroupGOI.CustomDaysGOI.Cost}");
logContentBuilder.AppendLine($"近7天GOI{adGroupGOI.CustomDaysGOI.GOI}");
logContentBuilder.AppendLine($"是否出发预警{isWarning}");
if (isWarning)
{
isSendDingTalk = true;
if (!isAddBusinessTypeTitle)
{
dingdingContentBuilder.Append("快车业务线-单元维度\n");
isAddBusinessTypeTitle = true;
}
dingdingContentBuilder.Append($"{dingdingWarningContent}\n");
}
}
#endregion
#region 创意
isAddBusinessTypeTitle = false;
var adGOIList = jDReportFormStatisticsBusiness.CalculationAdLevelGOI(new GOIRequest()
{
BusinessType = 2,
LevelIdList = adIds,
OnlyCustomDate = true,
StartDate = yesterday,
EndDate = startQueryDay
});
foreach (var adGOI in adGOIList)
{
var ad = yesterdayJDpopularizeadskuList.FirstOrDefault(s => s.AdId == adGOI.LevelId);
if (ad == null)
continue;
var logContentBuilder = new StringBuilder();
logContentBuilder.AppendLine($"创意维度 {ad.CampaignName}({ad.CampaignId})-{ad.AdGroupName}({ad.AdGroupId})-{ad.AdName}({ad.AdId})");
Enums.SiNanCycleType? siNanCycleType = Enums.SiNanCycleType.;
bool isWarning = false;
string dingdingWarningContent = string.Empty;
if (adGOI.TotalCost < growupCost)
{
siNanCycleType = Enums.SiNanCycleType.;
if (adGOI.TotalCost < growupLevel1Cost)
{
//不建议调整
isWarning = false;
}
else if (adGOI.TotalCost >= growupLevel4Cost)
{
if (adGOI.CustomDaysGOI.GOI < growupLevel4MinGOI)
{
isWarning = true;
dingdingWarningContent = $"{ad.CampaignName}-{ad.AdGroupName}-{ad.AdName} 处于{siNanCycleType},近7天GOI低于{growupLevel4MinGOI},请及时优化!";
}
else if (adGOI.CustomDaysGOI.GOI > growupLevel4MaxGOI)
{
isWarning = true;
dingdingWarningContent = $"{ad.CampaignName}-{ad.AdGroupName}-{ad.AdName} 处于{siNanCycleType},近7天GOI低于{growupLevel4MaxGOI},舍不得孩子套不住狼,请及时优化!";
}
}
else if (adGOI.TotalCost >= growupLevel3Cost)
{
if (adGOI.CustomDaysGOI.GOI < growupLevel3MinGOI)
{
isWarning = true;
dingdingWarningContent = $"{ad.CampaignName}-{ad.AdGroupName}-{ad.AdName} 处于{siNanCycleType},近7天GOI低于{growupLevel3MinGOI},请及时优化!";
}
else if (adGOI.CustomDaysGOI.GOI < growupLevel3MaxGOI)
{
isWarning = true;
dingdingWarningContent = $"{ad.CampaignName}-{ad.AdGroupName}-{ad.AdName} 处于{siNanCycleType},近7天GOI低于{growupLevel3MaxGOI},舍不得孩子套不住狼,请及时优化!";
}
}
else if (adGOI.TotalCost >= growupLevel2Cost)
{
if (adGOI.CustomDaysGOI.GOI < growupLevel2MinGOI)
{
isWarning = true;
dingdingWarningContent = $"{ad.CampaignName}-{ad.AdGroupName}-{ad.AdName} 处于{siNanCycleType},近7天GOI低于{growupLevel2MinGOI},请及时优化!";
}
else if (adGOI.CustomDaysGOI.GOI < growupLevel2MaxGOI)
{
isWarning = true;
dingdingWarningContent = $"{ad.CampaignName}-{ad.AdGroupName}-{ad.AdName} 处于{siNanCycleType},近7天GOI低于{growupLevel2MaxGOI},舍不得孩子套不住狼,请及时优化!";
}
}
}
else if (adGOI.TotalCost > matureCost && adGOI.CustomDaysGOI.Cost > mature7dCost)
{
siNanCycleType = Enums.SiNanCycleType.;
if (adGOI.CustomDaysGOI.GOI < matureLevel1MinGOI)
{
isWarning = true;
dingdingWarningContent = $"{ad.CampaignName}-{ad.AdGroupName}-{ad.AdName} 处于{siNanCycleType},近7天GOI低于{matureLevel1MinGOI},请及时优化!";
}
else if (adGOI.CustomDaysGOI.GOI > matureLevel1MaxGOI)
{
isWarning = true;
dingdingWarningContent = $"{ad.CampaignName}-{ad.AdGroupName}-{ad.AdName} 处于{siNanCycleType},近7天GOI低于{matureLevel1MaxGOI},舍不得孩子套不住狼,请及时优化!";
}
}
else if (adGOI.TotalCost > stableCost && adGOI.CustomDaysGOI.Cost < stable7dCost)
{
siNanCycleType = Enums.SiNanCycleType.;
if (adGOI.CustomDaysGOI.GOI < stableLevel1MinGOI)
{
isWarning = true;
dingdingWarningContent = $"{ad.CampaignName}-{ad.AdGroupName}-{ad.AdName} 处于{siNanCycleType},近7天GOI低于{stableLevel1MinGOI},请及时优化!";
}
else if (adGOI.CustomDaysGOI.GOI > stableLevel1MaxGOI)
{
isWarning = true;
dingdingWarningContent = $"{ad.CampaignName}-{ad.AdGroupName}-{ad.AdName} 处于{siNanCycleType},近7天GOI低于{stableLevel1MaxGOI},舍不得孩子套不住狼,请及时优化!";
}
}
logContentBuilder.AppendLine($"{siNanCycleType}");
logContentBuilder.AppendLine($"累计推广花费{adGOI.TotalCost}");
logContentBuilder.AppendLine($"近7天花费{adGOI.CustomDaysGOI.Cost}");
logContentBuilder.AppendLine($"近7天GOI{adGOI.CustomDaysGOI.GOI}");
logContentBuilder.AppendLine($"是否出发预警{isWarning}");
if (isWarning)
{
isSendDingTalk = true;
if (!isAddBusinessTypeTitle)
{
dingdingContentBuilder.Append("快车业务线-创意维度\n");
isAddBusinessTypeTitle = true;
}
dingdingContentBuilder.Append($"{dingdingWarningContent}\n");
}
}
#endregion
#region SKU精速推
isAddBusinessTypeTitle = false;
var skuGOIList = jDReportFormStatisticsBusiness.CalculationSkuLevelGOI(new SkuGOIRequest()
{
BusinessType = 134217728,
LevelIdList = skuIds,
OnlyCustomDate = true,
StartDate = yesterday,
EndDate = startQueryDay
});
foreach (var skuGOI in skuGOIList)
{
var sku = yesterdayJDpopularizeadskuList.FirstOrDefault(s => s.Sku == skuGOI.LevelId);
if (sku == null)
continue;
var logContentBuilder = new StringBuilder();
logContentBuilder.AppendLine($"SKU维度 {sku.CampaignName}({sku.CampaignId})-{sku.Sku}");
Enums.SiNanCycleType? siNanCycleType = Enums.SiNanCycleType.;
bool isWarning = false;
string dingdingWarningContent = string.Empty;
if (skuGOI.TotalCost < growupCost)
{
siNanCycleType = Enums.SiNanCycleType.;
if (skuGOI.TotalCost < growupLevel1Cost)
{
//不建议调整
isWarning = false;
}
else if (skuGOI.TotalCost >= growupLevel4Cost)
{
if (skuGOI.CustomDaysGOI.GOI < growupLevel4MinGOI)
{
isWarning = true;
dingdingWarningContent = $"{sku.CampaignName}-{sku.Sku} 处于{siNanCycleType},近7天GOI低于{growupLevel4MinGOI},请及时优化!";
}
else if (skuGOI.CustomDaysGOI.GOI > growupLevel4MaxGOI)
{
isWarning = true;
dingdingWarningContent = $"{sku.CampaignName}-{sku.Sku} 处于{siNanCycleType},近7天GOI低于{growupLevel4MaxGOI},舍不得孩子套不住狼,请及时优化!";
}
}
else if (skuGOI.TotalCost >= growupLevel3Cost)
{
if (skuGOI.CustomDaysGOI.GOI < growupLevel3MinGOI)
{
isWarning = true;
dingdingWarningContent = $"{sku.CampaignName}-{sku.Sku} 处于{siNanCycleType},近7天GOI低于{growupLevel3MinGOI},请及时优化!";
}
else if (skuGOI.CustomDaysGOI.GOI < growupLevel3MaxGOI)
{
isWarning = true;
dingdingWarningContent = $"{sku.CampaignName}-{sku.Sku} 处于{siNanCycleType},近7天GOI低于{growupLevel3MaxGOI},舍不得孩子套不住狼,请及时优化!";
}
}
else if (skuGOI.TotalCost >= growupLevel2Cost)
{
if (skuGOI.CustomDaysGOI.GOI < growupLevel2MinGOI)
{
isWarning = true;
dingdingWarningContent = $"{sku.CampaignName}-{sku.Sku} 处于{siNanCycleType},近7天GOI低于{growupLevel2MinGOI},请及时优化!";
}
else if (skuGOI.CustomDaysGOI.GOI < growupLevel2MaxGOI)
{
isWarning = true;
dingdingWarningContent = $"{sku.CampaignName}-{sku.Sku} 处于{siNanCycleType},近7天GOI低于{growupLevel2MaxGOI},舍不得孩子套不住狼,请及时优化!";
}
}
}
else if (skuGOI.TotalCost > matureCost && skuGOI.CustomDaysGOI.Cost > mature7dCost)
{
siNanCycleType = Enums.SiNanCycleType.;
if (skuGOI.CustomDaysGOI.GOI < matureLevel1MinGOI)
{
isWarning = true;
dingdingWarningContent = $"{sku.CampaignName}-{sku.Sku} 处于{siNanCycleType},近7天GOI低于{matureLevel1MinGOI},请及时优化!";
}
else if (skuGOI.CustomDaysGOI.GOI > matureLevel1MaxGOI)
{
isWarning = true;
dingdingWarningContent = $"{sku.CampaignName}-{sku.Sku} 处于{siNanCycleType},近7天GOI低于{matureLevel1MaxGOI},舍不得孩子套不住狼,请及时优化!";
}
}
else if (skuGOI.TotalCost > stableCost && skuGOI.CustomDaysGOI.Cost < stable7dCost)
{
siNanCycleType = Enums.SiNanCycleType.;
if (skuGOI.CustomDaysGOI.GOI < stableLevel1MinGOI)
{
isWarning = true;
dingdingWarningContent = $"{sku.CampaignName}-{sku.Sku} 处于{siNanCycleType},近7天GOI低于{stableLevel1MinGOI},请及时优化!";
}
else if (skuGOI.CustomDaysGOI.GOI > stableLevel1MaxGOI)
{
isWarning = true;
dingdingWarningContent = $"{sku.CampaignName}-{sku.Sku} 处于{siNanCycleType},近7天GOI低于{stableLevel1MaxGOI},舍不得孩子套不住狼,请及时优化!";
}
}
logContentBuilder.AppendLine($"{siNanCycleType}");
logContentBuilder.AppendLine($"累计推广花费{skuGOI.TotalCost}");
logContentBuilder.AppendLine($"近7天花费{skuGOI.CustomDaysGOI.Cost}");
logContentBuilder.AppendLine($"近7天GOI{skuGOI.CustomDaysGOI.GOI}");
logContentBuilder.AppendLine($"是否出发预警{isWarning}");
if (isWarning)
{
isSendDingTalk = true;
if (!isAddBusinessTypeTitle)
{
dingdingContentBuilder.Append("京速推业务线-SKU维度\n");
isAddBusinessTypeTitle = true;
}
dingdingContentBuilder.Append($"{dingdingWarningContent}\n");
}
}
#endregion
if (isSendDingTalk)
dingDingBusiness.SendDingDingBotMessage(shop.SiNanDingDingKey, shop.SiNanDingDingWebHook, dingdingContentBuilder.ToString());
}
catch (Exception ex)
{
nLogManager.GetLogger(loggerName).Error(ex, "GOI预警失败");
}
} }
} }
} }

132
BBWY.Server.Business/Statistics/JDReportFormStatisticsBusiness.cs

@ -131,19 +131,29 @@ namespace BBWY.Server.Business.Statistics
public IList<JDMultiLevelGOIResponse> CalculationAdGroupLevelGOI(GOIRequest gOIRequest) public IList<JDMultiLevelGOIResponse> CalculationAdGroupLevelGOI(GOIRequest gOIRequest)
{ {
var _7dEndDate = DateTime.Now.Date.AddDays(-1); var customEndTime = gOIRequest.EndDate.AddDays(1).AddSeconds(-1);
var _7dStartDate = _7dEndDate.AddDays(-6);
var _7dEndTime = _7dEndDate.AddDays(1).AddSeconds(-1);
var _30dEndDate = DateTime.Now.Date.AddDays(-1); DateTime? _7dEndDate = null;
var _30dStartDate = _30dEndDate.AddDays(-29); DateTime? _7dStartDate = null;
var _30dEndTime = _30dEndDate.AddDays(1).AddSeconds(-1); DateTime? _7dEndTime = null;
DateTime? _30dEndDate = null;
DateTime? _30dStartDate = null;
DateTime? _30dEndTime = null;
var customEndTime = gOIRequest.EndDate.AddDays(1).AddSeconds(-1); if (!gOIRequest.OnlyCustomDate)
{
_7dEndDate = DateTime.Now.Date.AddDays(-1);
_7dStartDate = _7dEndDate.Value.AddDays(-6);
_7dEndTime = _7dEndDate.Value.AddDays(1).AddSeconds(-1);
_30dEndDate = DateTime.Now.Date.AddDays(-1);
_30dStartDate = _30dEndDate.Value.AddDays(-29);
_30dEndTime = _30dEndDate.Value.AddDays(1).AddSeconds(-1);
}
var _7dAdGroupCosts = fsql.Select<JDPopularizeAdGroup>().Where(x => gOIRequest.LevelIdList.Contains(x.AdGroupId.Value) &&
x.Date >= _7dStartDate && var _7dAdGroupCosts = gOIRequest.OnlyCustomDate ? null : fsql.Select<JDPopularizeAdGroup>().Where(x => gOIRequest.LevelIdList.Contains(x.AdGroupId.Value) &&
x.Date <= _7dEndDate) x.Date >= _7dStartDate &&
x.Date <= _7dEndDate)
.GroupBy(x => x.AdGroupId) .GroupBy(x => x.AdGroupId)
.ToList(g => new .ToList(g => new
{ {
@ -151,7 +161,7 @@ namespace BBWY.Server.Business.Statistics
AdGroupId = g.Key AdGroupId = g.Key
}); });
var _7dAdGroupProfits = fsql.Select<JDOrderPopularizeRelation, OrderCost, Order>().InnerJoin((jr, oc, o) => jr.OrderId == oc.OrderId) var _7dAdGroupProfits = gOIRequest.OnlyCustomDate ? null : fsql.Select<JDOrderPopularizeRelation, OrderCost, Order>().InnerJoin((jr, oc, o) => jr.OrderId == oc.OrderId)
.InnerJoin((jr, oc, o) => jr.OrderId == o.Id) .InnerJoin((jr, oc, o) => jr.OrderId == o.Id)
.Where((jr, oc, o) => gOIRequest.LevelIdList.Contains(jr.AdGroupId.Value) && .Where((jr, oc, o) => gOIRequest.LevelIdList.Contains(jr.AdGroupId.Value) &&
jr.CookieTime >= _7dStartDate && jr.CookieTime >= _7dStartDate &&
@ -164,7 +174,7 @@ namespace BBWY.Server.Business.Statistics
Profit = g.Sum(g.Value.Item2.Profit) Profit = g.Sum(g.Value.Item2.Profit)
}); });
var _30dAdGroupCosts = fsql.Select<JDPopularizeAdGroup>().Where(x => gOIRequest.LevelIdList.Contains(x.AdGroupId.Value) && var _30dAdGroupCosts = gOIRequest.OnlyCustomDate ? null : fsql.Select<JDPopularizeAdGroup>().Where(x => gOIRequest.LevelIdList.Contains(x.AdGroupId.Value) &&
x.Date >= _30dStartDate && x.Date >= _30dStartDate &&
x.Date <= _30dEndDate) x.Date <= _30dEndDate)
.GroupBy(x => x.AdGroupId) .GroupBy(x => x.AdGroupId)
@ -174,7 +184,7 @@ namespace BBWY.Server.Business.Statistics
AdGroupId = g.Key AdGroupId = g.Key
}); });
var _30dAdGroupProfits = fsql.Select<JDOrderPopularizeRelation, OrderCost, Order>().InnerJoin((jr, oc, o) => jr.OrderId == oc.OrderId) var _30dAdGroupProfits = gOIRequest.OnlyCustomDate ? null : fsql.Select<JDOrderPopularizeRelation, OrderCost, Order>().InnerJoin((jr, oc, o) => jr.OrderId == oc.OrderId)
.InnerJoin((jr, oc, o) => jr.OrderId == o.Id) .InnerJoin((jr, oc, o) => jr.OrderId == o.Id)
.Where((jr, oc, o) => gOIRequest.LevelIdList.Contains(jr.AdGroupId.Value) && .Where((jr, oc, o) => gOIRequest.LevelIdList.Contains(jr.AdGroupId.Value) &&
jr.CookieTime >= _30dStartDate && jr.CookieTime >= _30dStartDate &&
@ -226,11 +236,11 @@ namespace BBWY.Server.Business.Statistics
LevelId = levelId, LevelId = levelId,
BusinessType = gOIRequest.BusinessType BusinessType = gOIRequest.BusinessType
}; };
goiResponse._7GOI.Cost = _7dAdGroupCosts.FirstOrDefault(x => x.AdGroupId == levelId)?.Cost ?? 0M; goiResponse._7GOI.Cost = _7dAdGroupCosts == null ? 0 : (_7dAdGroupCosts.FirstOrDefault(x => x.AdGroupId == levelId)?.Cost ?? 0M);
goiResponse._7GOI.Profit = _7dAdGroupProfits.FirstOrDefault(x => x.AdGroupId == levelId)?.Profit ?? 0M; goiResponse._7GOI.Profit = _7dAdGroupProfits == null ? 0 : (_7dAdGroupProfits.FirstOrDefault(x => x.AdGroupId == levelId)?.Profit ?? 0M);
goiResponse._30GOI.Cost = _30dAdGroupCosts.FirstOrDefault(x => x.AdGroupId == levelId)?.Cost ?? 0M; goiResponse._30GOI.Cost = _30dAdGroupCosts == null ? 0 : (_30dAdGroupCosts.FirstOrDefault(x => x.AdGroupId == levelId)?.Cost ?? 0M);
goiResponse._30GOI.Profit = _30dAdGroupProfits.FirstOrDefault(x => x.AdGroupId == levelId)?.Profit ?? 0M; goiResponse._30GOI.Profit = _30dAdGroupProfits == null ? 0 : (_30dAdGroupProfits.FirstOrDefault(x => x.AdGroupId == levelId)?.Profit ?? 0M);
goiResponse.CustomDaysGOI.Cost = customDaysAdGroupCosts.FirstOrDefault(x => x.AdGroupId == levelId)?.Cost ?? 0M; goiResponse.CustomDaysGOI.Cost = customDaysAdGroupCosts.FirstOrDefault(x => x.AdGroupId == levelId)?.Cost ?? 0M;
goiResponse.CustomDaysGOI.Profit = customDaysAdGroupProfits.FirstOrDefault(x => x.AdGroupId == levelId)?.Profit ?? 0M; goiResponse.CustomDaysGOI.Profit = customDaysAdGroupProfits.FirstOrDefault(x => x.AdGroupId == levelId)?.Profit ?? 0M;
@ -243,19 +253,28 @@ namespace BBWY.Server.Business.Statistics
public IList<JDMultiLevelGOIResponse> CalculationAdLevelGOI(GOIRequest gOIRequest) public IList<JDMultiLevelGOIResponse> CalculationAdLevelGOI(GOIRequest gOIRequest)
{ {
var _7dEndDate = DateTime.Now.Date.AddDays(-1); var customEndTime = gOIRequest.EndDate.AddDays(1).AddSeconds(-1);
var _7dStartDate = _7dEndDate.AddDays(-6);
var _7dEndTime = _7dEndDate.AddDays(1).AddSeconds(-1);
var _30dEndDate = DateTime.Now.Date.AddDays(-1); DateTime? _7dEndDate = null;
var _30dStartDate = _30dEndDate.AddDays(-29); DateTime? _7dStartDate = null;
var _30dEndTime = _30dEndDate.AddDays(1).AddSeconds(-1); DateTime? _7dEndTime = null;
DateTime? _30dEndDate = null;
DateTime? _30dStartDate = null;
DateTime? _30dEndTime = null;
var customEndTime = gOIRequest.EndDate.AddDays(1).AddSeconds(-1); if (!gOIRequest.OnlyCustomDate)
{
_7dEndDate = DateTime.Now.Date.AddDays(-1);
_7dStartDate = _7dEndDate.Value.AddDays(-6);
_7dEndTime = _7dEndDate.Value.AddDays(1).AddSeconds(-1);
_30dEndDate = DateTime.Now.Date.AddDays(-1);
_30dStartDate = _30dEndDate.Value.AddDays(-29);
_30dEndTime = _30dEndDate.Value.AddDays(1).AddSeconds(-1);
}
var _7dAdCosts = fsql.Select<JDPopularizeAdSku>().Where(x => gOIRequest.LevelIdList.Contains(x.AdId.Value) && var _7dAdCosts = gOIRequest.OnlyCustomDate ? null : fsql.Select<JDPopularizeAdSku>().Where(x => gOIRequest.LevelIdList.Contains(x.AdId.Value) &&
x.Date >= _7dStartDate && x.Date >= _7dStartDate &&
x.Date <= _7dEndDate) x.Date <= _7dEndDate)
.GroupBy(x => x.AdId) .GroupBy(x => x.AdId)
.ToList(g => new .ToList(g => new
{ {
@ -263,7 +282,7 @@ namespace BBWY.Server.Business.Statistics
AdId = g.Key AdId = g.Key
}); });
var _7dAdProfits = fsql.Select<JDOrderPopularizeRelation, OrderCost, Order>().InnerJoin((jr, oc, o) => jr.OrderId == oc.OrderId) var _7dAdProfits = gOIRequest.OnlyCustomDate ? null : fsql.Select<JDOrderPopularizeRelation, OrderCost, Order>().InnerJoin((jr, oc, o) => jr.OrderId == oc.OrderId)
.InnerJoin((jr, oc, o) => jr.OrderId == o.Id) .InnerJoin((jr, oc, o) => jr.OrderId == o.Id)
.Where((jr, oc, o) => gOIRequest.LevelIdList.Contains(jr.AdId.Value) && .Where((jr, oc, o) => gOIRequest.LevelIdList.Contains(jr.AdId.Value) &&
jr.CookieTime >= _7dStartDate && jr.CookieTime >= _7dStartDate &&
@ -276,7 +295,7 @@ namespace BBWY.Server.Business.Statistics
Profit = g.Sum(g.Value.Item2.Profit) Profit = g.Sum(g.Value.Item2.Profit)
}); });
var _30dAdCosts = fsql.Select<JDPopularizeAdSku>().Where(x => gOIRequest.LevelIdList.Contains(x.AdId.Value) && var _30dAdCosts = gOIRequest.OnlyCustomDate ? null : fsql.Select<JDPopularizeAdSku>().Where(x => gOIRequest.LevelIdList.Contains(x.AdId.Value) &&
x.Date >= _30dStartDate && x.Date >= _30dStartDate &&
x.Date <= _30dEndDate) x.Date <= _30dEndDate)
.GroupBy(x => x.AdId) .GroupBy(x => x.AdId)
@ -286,7 +305,7 @@ namespace BBWY.Server.Business.Statistics
AdId = g.Key AdId = g.Key
}); });
var _30dAdProfits = fsql.Select<JDOrderPopularizeRelation, OrderCost, Order>().InnerJoin((jr, oc, o) => jr.OrderId == oc.OrderId) var _30dAdProfits = gOIRequest.OnlyCustomDate ? null : fsql.Select<JDOrderPopularizeRelation, OrderCost, Order>().InnerJoin((jr, oc, o) => jr.OrderId == oc.OrderId)
.InnerJoin((jr, oc, o) => jr.OrderId == o.Id) .InnerJoin((jr, oc, o) => jr.OrderId == o.Id)
.Where((jr, oc, o) => gOIRequest.LevelIdList.Contains(jr.AdId.Value) && .Where((jr, oc, o) => gOIRequest.LevelIdList.Contains(jr.AdId.Value) &&
jr.CookieTime >= _30dStartDate && jr.CookieTime >= _30dStartDate &&
@ -338,11 +357,11 @@ namespace BBWY.Server.Business.Statistics
LevelId = levelId, LevelId = levelId,
BusinessType = gOIRequest.BusinessType BusinessType = gOIRequest.BusinessType
}; };
goiResponse._7GOI.Cost = _7dAdCosts.FirstOrDefault(x => x.AdId == levelId)?.Cost ?? 0M; goiResponse._7GOI.Cost = _7dAdCosts == null ? 0 : (_7dAdCosts.FirstOrDefault(x => x.AdId == levelId)?.Cost ?? 0M);
goiResponse._7GOI.Profit = _7dAdProfits.FirstOrDefault(x => x.AdId == levelId)?.Profit ?? 0M; goiResponse._7GOI.Profit = _7dAdProfits == null ? 0 : (_7dAdProfits.FirstOrDefault(x => x.AdId == levelId)?.Profit ?? 0M);
goiResponse._30GOI.Cost = _30dAdCosts.FirstOrDefault(x => x.AdId == levelId)?.Cost ?? 0M; goiResponse._30GOI.Cost = _30dAdCosts == null ? 0 : (_30dAdCosts.FirstOrDefault(x => x.AdId == levelId)?.Cost ?? 0M);
goiResponse._30GOI.Profit = _30dAdProfits.FirstOrDefault(x => x.AdId == levelId)?.Profit ?? 0M; goiResponse._30GOI.Profit = _30dAdProfits == null ? 0 : (_30dAdProfits.FirstOrDefault(x => x.AdId == levelId)?.Profit ?? 0M);
goiResponse.CustomDaysGOI.Cost = customDaysAdCosts.FirstOrDefault(x => x.AdId == levelId)?.Cost ?? 0M; goiResponse.CustomDaysGOI.Cost = customDaysAdCosts.FirstOrDefault(x => x.AdId == levelId)?.Cost ?? 0M;
goiResponse.CustomDaysGOI.Profit = customDaysAdProfits.FirstOrDefault(x => x.AdId == levelId)?.Profit ?? 0M; goiResponse.CustomDaysGOI.Profit = customDaysAdProfits.FirstOrDefault(x => x.AdId == levelId)?.Profit ?? 0M;
@ -355,20 +374,29 @@ namespace BBWY.Server.Business.Statistics
public IList<JDSkuLevelGOIResponse> CalculationSkuLevelGOI(SkuGOIRequest gOIRequest) public IList<JDSkuLevelGOIResponse> CalculationSkuLevelGOI(SkuGOIRequest gOIRequest)
{ {
var _7dEndDate = DateTime.Now.Date.AddDays(-1); var customEndTime = gOIRequest.EndDate.AddDays(1).AddSeconds(-1);
var _7dStartDate = _7dEndDate.AddDays(-6);
var _7dEndTime = _7dEndDate.AddDays(1).AddSeconds(-1);
var _30dEndDate = DateTime.Now.Date.AddDays(-1); DateTime? _7dEndDate = null;
var _30dStartDate = _30dEndDate.AddDays(-29); DateTime? _7dStartDate = null;
var _30dEndTime = _30dEndDate.AddDays(1).AddSeconds(-1); DateTime? _7dEndTime = null;
DateTime? _30dEndDate = null;
DateTime? _30dStartDate = null;
DateTime? _30dEndTime = null;
var customEndTime = gOIRequest.EndDate.AddDays(1).AddSeconds(-1); if (!gOIRequest.OnlyCustomDate)
{
_7dEndDate = DateTime.Now.Date.AddDays(-1);
_7dStartDate = _7dEndDate.Value.AddDays(-6);
_7dEndTime = _7dEndDate.Value.AddDays(1).AddSeconds(-1);
_30dEndDate = DateTime.Now.Date.AddDays(-1);
_30dStartDate = _30dEndDate.Value.AddDays(-29);
_30dEndTime = _30dEndDate.Value.AddDays(1).AddSeconds(-1);
}
var _7dSkuCosts = fsql.Select<JDPopularizeAdSku>().Where(x => gOIRequest.LevelIdList.Contains(x.Sku) && var _7dSkuCosts = gOIRequest.OnlyCustomDate ? null : fsql.Select<JDPopularizeAdSku>().Where(x => gOIRequest.LevelIdList.Contains(x.Sku) &&
x.BusinessType == 134217728 && x.BusinessType == 134217728 &&
x.Date >= _7dStartDate && x.Date >= _7dStartDate &&
x.Date <= _7dEndDate) x.Date <= _7dEndDate)
.GroupBy(x => x.Sku) .GroupBy(x => x.Sku)
.ToList(g => new .ToList(g => new
{ {
@ -376,7 +404,7 @@ namespace BBWY.Server.Business.Statistics
Sku = g.Key Sku = g.Key
}); });
var _7dSkuProfits = fsql.Select<JDOrderPopularizeRelation, OrderCost, Order>().InnerJoin((jr, oc, o) => jr.OrderId == oc.OrderId) var _7dSkuProfits = gOIRequest.OnlyCustomDate ? null : fsql.Select<JDOrderPopularizeRelation, OrderCost, Order>().InnerJoin((jr, oc, o) => jr.OrderId == oc.OrderId)
.InnerJoin((jr, oc, o) => jr.OrderId == o.Id) .InnerJoin((jr, oc, o) => jr.OrderId == o.Id)
.Where((jr, oc, o) => gOIRequest.LevelIdList.Contains(jr.PopularizeSku) && .Where((jr, oc, o) => gOIRequest.LevelIdList.Contains(jr.PopularizeSku) &&
jr.BusinessType == 134217728 && jr.BusinessType == 134217728 &&
@ -390,7 +418,7 @@ namespace BBWY.Server.Business.Statistics
Profit = g.Sum(g.Value.Item2.Profit) Profit = g.Sum(g.Value.Item2.Profit)
}); });
var _30dSkuCosts = fsql.Select<JDPopularizeAdSku>().Where(x => gOIRequest.LevelIdList.Contains(x.Sku) && var _30dSkuCosts = gOIRequest.OnlyCustomDate ? null : fsql.Select<JDPopularizeAdSku>().Where(x => gOIRequest.LevelIdList.Contains(x.Sku) &&
x.BusinessType == 134217728 && x.BusinessType == 134217728 &&
x.Date >= _30dStartDate && x.Date >= _30dStartDate &&
x.Date <= _30dEndDate) x.Date <= _30dEndDate)
@ -401,7 +429,7 @@ namespace BBWY.Server.Business.Statistics
Sku = g.Key Sku = g.Key
}); });
var _30dSkuProfits = fsql.Select<JDOrderPopularizeRelation, OrderCost, Order>().InnerJoin((jr, oc, o) => jr.OrderId == oc.OrderId) var _30dSkuProfits = gOIRequest.OnlyCustomDate ? null : fsql.Select<JDOrderPopularizeRelation, OrderCost, Order>().InnerJoin((jr, oc, o) => jr.OrderId == oc.OrderId)
.InnerJoin((jr, oc, o) => jr.OrderId == o.Id) .InnerJoin((jr, oc, o) => jr.OrderId == o.Id)
.Where((jr, oc, o) => gOIRequest.LevelIdList.Contains(jr.PopularizeSku) && .Where((jr, oc, o) => gOIRequest.LevelIdList.Contains(jr.PopularizeSku) &&
jr.BusinessType == 134217728 && jr.BusinessType == 134217728 &&
@ -458,11 +486,11 @@ namespace BBWY.Server.Business.Statistics
LevelId = levelId, LevelId = levelId,
BusinessType = gOIRequest.BusinessType BusinessType = gOIRequest.BusinessType
}; };
goiResponse._7GOI.Cost = _7dSkuCosts.FirstOrDefault(x => x.Sku == levelId)?.Cost ?? 0M; goiResponse._7GOI.Cost = _7dSkuCosts == null ? 0 : (_7dSkuCosts.FirstOrDefault(x => x.Sku == levelId)?.Cost ?? 0M);
goiResponse._7GOI.Profit = _7dSkuProfits.FirstOrDefault(x => x.Sku == levelId)?.Profit ?? 0M; goiResponse._7GOI.Profit = _7dSkuProfits == null ? 0 : (_7dSkuProfits.FirstOrDefault(x => x.Sku == levelId)?.Profit ?? 0M);
goiResponse._30GOI.Cost = _30dSkuCosts.FirstOrDefault(x => x.Sku == levelId)?.Cost ?? 0M; goiResponse._30GOI.Cost = _30dSkuCosts == null ? 0 : (_30dSkuCosts.FirstOrDefault(x => x.Sku == levelId)?.Cost ?? 0M);
goiResponse._30GOI.Profit = _30dSkuProfits.FirstOrDefault(x => x.Sku == levelId)?.Profit ?? 0M; goiResponse._30GOI.Profit = _30dSkuProfits == null ? 0 : (_30dSkuProfits.FirstOrDefault(x => x.Sku == levelId)?.Profit ?? 0M);
goiResponse.CustomDaysGOI.Cost = customDaysSkuCosts.FirstOrDefault(x => x.Sku == levelId)?.Cost ?? 0M; goiResponse.CustomDaysGOI.Cost = customDaysSkuCosts.FirstOrDefault(x => x.Sku == levelId)?.Cost ?? 0M;
goiResponse.CustomDaysGOI.Profit = customDaysSkuProfits.FirstOrDefault(x => x.Sku == levelId)?.Profit ?? 0M; goiResponse.CustomDaysGOI.Profit = customDaysSkuProfits.FirstOrDefault(x => x.Sku == levelId)?.Profit ?? 0M;

3
BBWY.Server.Business/TaskSchedulerManager.cs

@ -20,6 +20,8 @@ namespace BBWY.Server.Business
public LimitedConcurrencyLevelTaskScheduler StockNumWarningTaskScheduler { get; private set; } public LimitedConcurrencyLevelTaskScheduler StockNumWarningTaskScheduler { get; private set; }
public LimitedConcurrencyLevelTaskScheduler GOIWarningTaskScheduler { get; private set; }
public TaskSchedulerManager() public TaskSchedulerManager()
{ {
SyncOrderTaskScheduler = new LimitedConcurrencyLevelTaskScheduler(10); SyncOrderTaskScheduler = new LimitedConcurrencyLevelTaskScheduler(10);
@ -32,6 +34,7 @@ namespace BBWY.Server.Business
StoreHouseTaskScheduler = new LimitedConcurrencyLevelTaskScheduler(2); StoreHouseTaskScheduler = new LimitedConcurrencyLevelTaskScheduler(2);
StockNumWarningTaskScheduler = new LimitedConcurrencyLevelTaskScheduler(10); StockNumWarningTaskScheduler = new LimitedConcurrencyLevelTaskScheduler(10);
GOIWarningTaskScheduler = new LimitedConcurrencyLevelTaskScheduler(10);
} }
} }
} }

3
BBWY.Server.Business/Vender/VenderBusiness.cs

@ -246,12 +246,13 @@ namespace BBWY.Server.Business
return departmentList; return departmentList;
} }
public IList<ShopResponse> GetShopList(long? shopId = null, Enums.Platform? platform = null, bool filterTurnoverDays = false) public IList<ShopResponse> GetShopList(long? shopId = null, Enums.Platform? platform = null, bool filterTurnoverDays = false, bool filterSiNan = false)
{ {
return freeSqlMultiDBManager.MDSfsql.Select<Shops>().Where(s => !string.IsNullOrEmpty(s.ShopId)) return freeSqlMultiDBManager.MDSfsql.Select<Shops>().Where(s => !string.IsNullOrEmpty(s.ShopId))
.WhereIf(shopId != null, s => s.ShopId == shopId.ToString()) .WhereIf(shopId != null, s => s.ShopId == shopId.ToString())
.WhereIf(platform != null, s => s.PlatformId == (int)platform) .WhereIf(platform != null, s => s.PlatformId == (int)platform)
.WhereIf(filterTurnoverDays, s => s.SkuSafeTurnoverDays != 0) .WhereIf(filterTurnoverDays, s => s.SkuSafeTurnoverDays != 0)
.WhereIf(filterSiNan, s => !string.IsNullOrEmpty(s.SiNanDingDingWebHook))
.ToList<ShopResponse>(); .ToList<ShopResponse>();
} }

2
BBWY.Server.Model/Dto/Request/Statistics/GOIRequest.cs

@ -23,6 +23,8 @@ namespace BBWY.Server.Model.Dto
public DateTime StartDate { get; set; } public DateTime StartDate { get; set; }
public DateTime EndDate { get; set; } public DateTime EndDate { get; set; }
public bool OnlyCustomDate { get; set; }
} }
public class SkuGOIRequest: GOIRequest public class SkuGOIRequest: GOIRequest

12
BBWY.Server.Model/Enums.cs

@ -223,5 +223,17 @@
= 2, = 2,
退 = 3 退 = 3
} }
/// <summary>
/// 司南周期 暂无周期 = -1,成长加速期 = 0,成熟利润期 = 1,稳定日销期 = 2,策马奔腾期 = 3
/// </summary>
public enum SiNanCycleType
{
= -1,
= 0,
= 1,
= 2,
= 3
}
} }
} }

Loading…
Cancel
Save