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 { 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); } } private 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() .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 = startQueryDay, EndDate = yesterday }); 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}"); nLogManager.GetLogger(loggerName).Info(logContentBuilder); 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 = startQueryDay, EndDate = yesterday }); 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}"); nLogManager.GetLogger(loggerName).Info(logContentBuilder); 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 = startQueryDay, EndDate = yesterday }); 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}"); nLogManager.GetLogger(loggerName).Info(logContentBuilder); 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预警失败"); } } } }