Kaynağa Gözat

修改dp链接开关,随机,阶梯出价切换bug

songyh 4 yıl önce
ebeveyn
işleme
798181175d

+ 129 - 66
jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/advertise/service/impl/AiBytedanceAdvertiserStrategyServiceImpl.java

@@ -106,66 +106,121 @@ public class AiBytedanceAdvertiserStrategyServiceImpl extends ServiceImpl<AiByte
             if(null == slogenInfos||slogenInfos.isEmpty()){
                 continue;
             }
-            // 2:创建计划
-            Long dpIndex ;
-            AiBytedanceAdDplinkInfo adDplinkInfo = adDplinkInfoService.getlatestDpLinkInfo(strategy.getId(),strategy.getAccountId(),1);
-            if(null == adDplinkInfo){
-                adDplinkInfo = new AiBytedanceAdDplinkInfo();
-                if("FIX".equalsIgnoreCase(strategy.getAdBidCreateType())){
-                    adDplinkInfo.setAdBid(strategy.getAdCpaBid());
+            Integer useDplinkIndex = strategy.getDpLinkIndexUsed();
+            if(null==useDplinkIndex||useDplinkIndex.equals(0)){
+                Long dpIndex ;
+                AiBytedanceAdDplinkInfo adDplinkInfo = adDplinkInfoService.getlatestDpLinkInfo(strategy.getId(),strategy.getAccountId(),1);
+                if(null == adDplinkInfo){
+                    adDplinkInfo = new AiBytedanceAdDplinkInfo();
+                    if("FIX".equalsIgnoreCase(strategy.getAdBidCreateType())){
+                        adDplinkInfo.setAdBid(strategy.getAdCpaBid());
+                    }else{
+                        adDplinkInfo.setAdBid(strategy.getAdMinBid());
+                    }
+                    adDplinkInfo.setDpLinkIndex(strategy.getDpLinkStartIndex());
                 }else{
-                    adDplinkInfo.setAdBid(strategy.getAdMinBid());
+                    adDplinkInfo.setId(null);
+                    adDplinkInfo.setDpLinkIndex(adDplinkInfo.getDpLinkIndex()+1);
+                }
+
+                //不使用dp链接
+                String date = DateUtils.formatDate();
+                String campaignName = getCampaignName(strategy,null,date);
+                Long campaignId = getCampaignId(strategy,campaignName,token);
+                if(null == campaignId){
+                    return videoCnt;
+                }
+                //计划名称
+                String adName = getAdName(strategy,null,video);
+                //计算本次出价
+                BigDecimal currentCpaBid = StringUtils.getRandomAdCpaBid(strategy.getAdBidCreateType(),strategy.getAdMaxBid(),strategy.getAdMinBid(),strategy.getAdStepBid(),adDplinkInfo.getAdBid());
+                JSONObject adParams = getAdParams(strategy,adName,campaignId,currentCpaBid);
+                Long adId = createAdInfo(token,strategy,adParams);
+                if(null == adId){
+                    continue;
+                }
+                adDplinkInfo.setAdId(adId);
+                adDplinkInfo.setAccountId(strategy.getAccountId());
+                adDplinkInfo.setStatus(1);
+                adDplinkInfo.setStrategyId(strategy.getId());
+                adDplinkInfoService.save(adDplinkInfo);
+                //3:创建创意
+                JSONObject creativeParams = getCreativeParams(strategy,adId,video,token);
+                log.info("创意创建参数:{}",creativeParams);
+                JSONObject creativeObject =  marketingService.creativeCreate(token,adId,creativeParams);
+                if(null!=creativeObject.getInteger("code")&&creativeObject.getInteger("code")!=0){
+                    String message = creativeObject.getString("message");
+                    Integer code = creativeObject.getInteger("code");
+                    //创建创意失败
+                    log.info("创意创建失败:code==>{};message==>{}",code,message);
+                    continue;
+                }
+                videoCnt --;
+                if(videoCnt<=0){
+                    return 0L;
                 }
-                adDplinkInfo.setDpLinkIndex(strategy.getDpLinkStartIndex());
             }else{
-                adDplinkInfo.setId(null);
-                adDplinkInfo.setDpLinkIndex(adDplinkInfo.getDpLinkIndex()+1);
-            }
-            dpIndex = adDplinkInfo.getDpLinkIndex();
-            if(dpIndex>strategy.getDpLinkEndIndex()){
-                log.info("此账户策略创建结束=>账户id:{};策略id:{}", token.getAccountId(),strategy.getId());
-                return 0L;
-            }
-            //组名称
-            String campaignName = getCampaignName(strategy,dpIndex);
-            Long campaignId = getCampaignId(strategy,campaignName,token);
-            if(null == campaignId){
-                return videoCnt;
-            }
-            strategy.setAdOpenUrl(openUrl.replace("{{dp链接下标}}",dpIndex.toString()));
-            String dplinkCode = StringUtils.getParamFromUrl(strategy.getAdOpenUrl(),"bc_fl_src");
-            //计划名称
-            String adName = getAdName(strategy,dplinkCode,video);
-            //计算本次出价
-            BigDecimal currentCpaBid = StringUtils.getRandomAdCpaBid(strategy.getAdBidCreateType(),strategy.getAdMaxBid(),strategy.getAdMinBid(),strategy.getAdStepBid(),adDplinkInfo.getAdBid());
-            adDplinkInfo.setAdBid(currentCpaBid);
-            JSONObject adParams = getAdParams(strategy,adName,campaignId,currentCpaBid);
-            Long adId = createAdInfo(token,strategy,adParams);
-            if(null == adId){
-                continue;
-            }
-            adDplinkInfo.setAdId(adId);
-            adDplinkInfo.setAccountId(strategy.getAccountId());
-            adDplinkInfo.setStatus(1);
-            adDplinkInfo.setStrategyId(strategy.getId());
-            adDplinkInfoService.save(adDplinkInfo);
-            //3:创建创意
-            JSONObject creativeParams = getCreativeParams(strategy,adId,video,token);
-            log.info("创意创建参数:{}",creativeParams);
-            JSONObject creativeObject =  marketingService.creativeCreate(token,adId,creativeParams);
-            if(null!=creativeObject.getInteger("code")&&creativeObject.getInteger("code")!=0){
-                String message = creativeObject.getString("message");
-                Integer code = creativeObject.getInteger("code");
-                //创建创意失败
-                log.info("创意创建失败:code==>{};message==>{}",code,message);
-                continue;
-            }
-            videoCnt --;
-            if(videoCnt<=0){
-                return 0L;
+                Long dpIndex ;
+                AiBytedanceAdDplinkInfo adDplinkInfo = adDplinkInfoService.getlatestDpLinkInfo(strategy.getId(),strategy.getAccountId(),1);
+                if(null == adDplinkInfo){
+                    adDplinkInfo = new AiBytedanceAdDplinkInfo();
+                    if("FIX".equalsIgnoreCase(strategy.getAdBidCreateType())){
+                        adDplinkInfo.setAdBid(strategy.getAdCpaBid());
+                    }else{
+                        adDplinkInfo.setAdBid(strategy.getAdMinBid());
+                    }
+                    adDplinkInfo.setDpLinkIndex(strategy.getDpLinkStartIndex());
+                }else{
+                    adDplinkInfo.setId(null);
+                    adDplinkInfo.setDpLinkIndex(adDplinkInfo.getDpLinkIndex()+1);
+                }
+                dpIndex = adDplinkInfo.getDpLinkIndex();
+                if(dpIndex>strategy.getDpLinkEndIndex()){
+                    log.info("此账户策略创建结束=>账户id:{};策略id:{}", token.getAccountId(),strategy.getId());
+                    return 0L;
+                }
+                //组名称
+                String campaignName = getCampaignName(strategy,dpIndex,null);
+                Long campaignId = getCampaignId(strategy,campaignName,token);
+                if(null == campaignId){
+                    return videoCnt;
+                }
+                strategy.setAdOpenUrl(openUrl.replace("{{dp链接下标}}",dpIndex.toString()));
+                String dplinkCode = StringUtils.getParamFromUrl(strategy.getAdOpenUrl(),"bc_fl_src");
+                //计划名称
+                String adName = getAdName(strategy,dplinkCode,video);
+                //计算本次出价
+                BigDecimal currentCpaBid = StringUtils.getRandomAdCpaBid(strategy.getAdBidCreateType(),strategy.getAdMaxBid(),strategy.getAdMinBid(),strategy.getAdStepBid(),adDplinkInfo.getAdBid());
+                adDplinkInfo.setAdBid(currentCpaBid);
+                JSONObject adParams = getAdParams(strategy,adName,campaignId,currentCpaBid);
+                Long adId = createAdInfo(token,strategy,adParams);
+                if(null == adId){
+                    continue;
+                }
+                adDplinkInfo.setAdId(adId);
+                adDplinkInfo.setAccountId(strategy.getAccountId());
+                adDplinkInfo.setStatus(1);
+                adDplinkInfo.setStrategyId(strategy.getId());
+                adDplinkInfoService.save(adDplinkInfo);
+                //3:创建创意
+                JSONObject creativeParams = getCreativeParams(strategy,adId,video,token);
+                log.info("创意创建参数:{}",creativeParams);
+                JSONObject creativeObject =  marketingService.creativeCreate(token,adId,creativeParams);
+                if(null!=creativeObject.getInteger("code")&&creativeObject.getInteger("code")!=0){
+                    String message = creativeObject.getString("message");
+                    Integer code = creativeObject.getInteger("code");
+                    //创建创意失败
+                    log.info("创意创建失败:code==>{};message==>{}",code,message);
+                    continue;
+                }
+                videoCnt --;
+                if(videoCnt<=0){
+                    return 0L;
+                }
             }
         }
         return videoCnt;
+
     }
     private JSONObject getCreativeParams(AiBytedanceAdvertiserStrategy strategy, Long adId,ByteDanceVideoInfo videoInfo,CtopOauthToken token) {
         JSONObject params = new JSONObject();
@@ -796,7 +851,7 @@ public class AiBytedanceAdvertiserStrategyServiceImpl extends ServiceImpl<AiByte
             String date = DateUtils.formatDate(new Date(),"yyyyMMdd");
             adName = adName.replace("{{日期}}",date);
         }
-        if(adName.contains("{{dp链接标识}}")){
+        if(adName.contains("{{dp链接标识}}")&&null!=dplinkCode){
             adName = adName.replace("{{dp链接标识}}",dplinkCode);
         }
         if(adName.contains("{{出价方式}}")){
@@ -851,9 +906,16 @@ public class AiBytedanceAdvertiserStrategyServiceImpl extends ServiceImpl<AiByte
         return (Long)campaignData.getResult();
     }
 
-    private String getCampaignName(AiBytedanceAdvertiserStrategy strategy,Long dplinkIndex) {
-        String campaignSufix = getRangeIndex(strategy.getDpLinkStartIndex(),strategy.getDpLinkEndIndex(),strategy.getCampaignAdCnt(),dplinkIndex);
-        return strategy.getCampaignName()+campaignSufix;
+    private String getCampaignName(AiBytedanceAdvertiserStrategy strategy,Long dplinkIndex,String date) {
+        String result = strategy.getCampaignName();
+        if(null!=dplinkIndex&&dplinkIndex!=0){
+            String campaignSufix = getRangeIndex(strategy.getDpLinkStartIndex(),strategy.getDpLinkEndIndex(),strategy.getCampaignAdCnt(),dplinkIndex);
+            result = result+campaignSufix;
+        }
+        if(null!=date&&!date.trim().equals("")){
+            result = result +"-"+date;
+        }
+        return result;
     }
 
     private String getRangeIndex(Long dpLinkStartIndex,Long dpLinkEndIndex, Long campaignAdCnt, Long dpIndex) {
@@ -1136,8 +1198,8 @@ public class AiBytedanceAdvertiserStrategyServiceImpl extends ServiceImpl<AiByte
      * @description: 添加配置信息
      *
      * @param aiBytedanceAdvertiserStrategy
-     * @return: org.jeecg.common.api.vo.Result
-     * @author: zianY
+     * @return org.jeecg.common.api.vo.Result
+     * @author zianY
      */
     @Override
     public Result addBytedanceStrategy(AiBytedanceAdvertiserStrategy aiBytedanceAdvertiserStrategy) {
@@ -1240,13 +1302,13 @@ public class AiBytedanceAdvertiserStrategyServiceImpl extends ServiceImpl<AiByte
 
     /**
      *
-     * @description: 获取定向包
+     * 获取定向包
      *
      * @param accountId 广告主id
      * @param landingType 投放目标
      * @param deliveryRange
-     * @return: org.jeecg.common.api.vo.Result
-     * @author: zianY
+     * @return org.jeecg.common.api.vo.Result
+     * @author zianY
      */
     @Override
     public Result getAdAudiencePackage(String accountId, String landingType, String deliveryRange){
@@ -1279,11 +1341,11 @@ public class AiBytedanceAdvertiserStrategyServiceImpl extends ServiceImpl<AiByte
 
     /**
      *
-     * @description: 获取人群包列表信息
+     * 获取人群包列表信息
      *
      * @param accountId
-     * @return: org.jeecg.common.api.vo.Result
-     * @author: zianY
+     * @return org.jeecg.common.api.vo.Result
+     * @author zianY
      */
     @Override
     public Result getDMPCustomAudience(String accountId){
@@ -1314,6 +1376,7 @@ public class AiBytedanceAdvertiserStrategyServiceImpl extends ServiceImpl<AiByte
     }
 
 
+    @Override
     public Result createAudiencePackage(String accountId){
         CtopOauthToken token = tokenService.getOauthTokenByAccountId(accountId);
        Result list = marketingService.createAudiencePackage(token);

+ 11 - 1
jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/common/utils/StringUtils.java

@@ -206,7 +206,17 @@ public class StringUtils {
         }
         //当出价为阶梯出价时,创建的出价为 最低出价 + N * 浮动间隔 < 最高出价
         if ("STEP".equalsIgnoreCase(type)){
-            if(lastBid.add(stepBid).compareTo(maxBid)>0){
+            double max = maxBid.doubleValue();
+            double min = minBid.doubleValue();
+            double last = lastBid.doubleValue();
+            double step = stepBid.doubleValue();
+            if(last>max||last<min){
+                //如果不在出价范围内,设定为最低出价
+                reuslt = minBid.setScale(2, RoundingMode.DOWN);
+            }else if((last-min)%step!=0){
+                //表示上次是随机出价转变为阶梯出价
+                reuslt = minBid.setScale(2, RoundingMode.DOWN);
+            }else if(last+step>max){
                 reuslt = minBid.setScale(2, RoundingMode.DOWN);
             }else{
                 reuslt = lastBid.add(stepBid).setScale(2, RoundingMode.DOWN);

+ 0 - 2
jeecg-boot-module-system/src/main/java/org/jeecg/modules/bytedance/advertise/controller/AiBytedanceAdvertiserStrategyController.java

@@ -101,8 +101,6 @@ public class AiBytedanceAdvertiserStrategyController {
 				//拼接 目标转化出价
 				pojo.setAdCpaBidStr("FIX".equalsIgnoreCase(pojo.getAdBidCreateType()) ? pojo.getAdCpaBid().toString() : (pojo.getAdMinBid() + "~" + pojo.getAdMaxBid()));
 			}
-
-
 		});
 
 		result.setSuccess(true);