8 changed files with 725 additions and 99 deletions
@ -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}×tamp={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); |
|||
} |
|||
} |
|||
} |
|||
} |
@ -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; |
|||
|
|||
namespace BBWY.Server.Business.SiNan |
|||
{ |
|||
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预警失败"); |
|||
} |
|||
|
|||
} |
|||
} |
|||
} |
|||
|
Loading…
Reference in new issue