Ver Fonte

修改智能投放数据接口

syh há 4 anos atrás
pai
commit
3f1fc119f4

+ 7 - 1
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ads/entity/AiKuaishouStrategyTemplate.java

@@ -22,12 +22,18 @@ public class AiKuaishouStrategyTemplate {
 	private Long accountId;
 	/**策略模板名称*/
 	private String templateName;
-	/**策略类型 1:素材+定向  2:时间+出价 3:素材+出价*/
+	/**策略类型 1:素材+出价 2:素材+定向  3:时间+出价 */
 	private Integer templateType;
 	/**测试方向*/
 	private String testDirection;
 	/**素材选择方式*/
 	private String materialSelectMethod;
+	/**
+	 * 组内素材组合模式
+	 * single 单视频+不同封面
+	 * mixed  多视频+各自封面
+	 */
+	private String materialFixType;
 	/**状态1可用 0不可用*/
 	private Integer status;
 	/**createTime*/

+ 156 - 109
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ads/service/impl/AiStrategyServiceImpl.java

@@ -77,6 +77,13 @@ public class AiStrategyServiceImpl implements IAiStrategyService {
         }
         //策略类型
         String scenes = strategy.getScenes();
+        //根据策略类型获取策略模板信息
+        AiKuaishouStrategyTemplate strategyTemplate = templateService.getOneByParams(scenes, 1);
+        if(null == strategyTemplate){
+            log.info("策略模板信息获取失败=>testDirection:{}",scenes);
+            return;
+        }
+        String materialFixType = strategyTemplate.getMaterialFixType();
         if(scenes.equals("1")){
             //素材+出价
             List<Long>getCapbids = splitCapBidByDomain(strategy.getCpaBidMin(),strategy.getCpaBidMax(),strategy.getStepSize());
@@ -100,13 +107,44 @@ public class AiStrategyServiceImpl implements IAiStrategyService {
                 return;
             }
             Long campaignId = (Long) campaignCreateResult.get("campaignId");
-            int unitCnt = 0;
+            int unitCnt = 1;
             // 8、根据定向和素材,两层循环 创建组和创意
             for (Long item:getCapbids) {
-                unitCnt++;
-                // 选择素材,创建创意
-                for(KuaiShouVideoGet videoItem: videoGets){
-                    //拼装广告组参数
+                //判定素材搭配方式
+                if(null!=materialFixType&&materialFixType.trim().equals("single")){
+                    // 选择素材,创建创意
+                    for(KuaiShouVideoGet videoItem: videoGets){
+                        //拼装广告组参数
+                        JSONObject unitParams = createUnitParams(token,campaignId,strategy,item,timestamp,unitCnt);
+                        Map<String, Object> unitCreateResult = kuaishouInterfaceService.adUnitCreate(token.getAccessToken(), token.getAccountId(), unitParams,1);
+                        Integer unitCode = (Integer) unitCreateResult.get("code");
+                        String unitMessage = (String) unitCreateResult.get("message");
+                        if(unitCode != 0 ){
+                            log.info("组创建失败=>accountId:{};message:{}",accountId,unitMessage);
+                            continue;
+                        }
+                        Long unitId = (Long) unitCreateResult.get("unitId");
+                        JSONObject creativeParams = creativeParams(token,unitId,videoItem,unitCnt,strategy);
+                        JSONArray sceneIdJsonArray = JSONArray.parseArray(strategy.getSceneId());
+                        // 如果广告位只包含 上下滑大屏广告(6),则一个素材搭配1张封面,生成1个创意
+                        if (sceneIdJsonArray.contains(6) && sceneIdJsonArray.size() == 1){
+                            //直接创建创意
+                            createCreative(token,creativeParams,campaignId,unitId,strategy,null,1,videoItem);
+                        } else {
+                            // 素材自带的封面 ctop_material_image_info 内部素材的自带封面,素造的没有
+                            // 素材的智能抽帧封面 ctop_material_cut_frame 其中素造的为8张封面,内部的为15张封面
+                            List<MaterialCutFrame> cutFrameList = materialCutFrameService.getListByVideoSignature(videoItem.getSignature());
+                            List<MaterialImageInfo> orgFrameList = materialImageInfoService.getListByVideoSignature(videoItem.getSignature());
+                            // 其他情况下,一个素材搭配15张封面,生成15个创意
+                            if ((null == cutFrameList||cutFrameList.isEmpty())&&(null == orgFrameList|| orgFrameList.isEmpty())){
+                                log.info("未获取到视频封面=>videoSignature:{}",videoItem.getSignature());
+                                continue;
+                            }
+                            createCreativeByImage(cutFrameList,orgFrameList,token,creativeParams,campaignId,unitId,strategy,videoItem,15,null);
+                        }
+                    }
+                }else{
+                    //混搭素材逻辑
                     JSONObject unitParams = createUnitParams(token,campaignId,strategy,item,timestamp,unitCnt);
                     Map<String, Object> unitCreateResult = kuaishouInterfaceService.adUnitCreate(token.getAccessToken(), token.getAccountId(), unitParams,1);
                     Integer unitCode = (Integer) unitCreateResult.get("code");
@@ -116,62 +154,32 @@ public class AiStrategyServiceImpl implements IAiStrategyService {
                         continue;
                     }
                     Long unitId = (Long) unitCreateResult.get("unitId");
-                    JSONObject creativeParams = creativeParams(token,unitId,videoItem,unitCnt,strategy);
-                    JSONArray sceneIdJsonArray = JSONArray.parseArray(strategy.getSceneId());
-                    // 如果广告位只包含 上下滑大屏广告(6),则一个素材搭配1张封面,生成1个创意
-                    if (sceneIdJsonArray.contains(6) && sceneIdJsonArray.size() == 1){
-                        //直接创建创意
-                        createCreative(token,creativeParams,campaignId,unitId,strategy,null,1,videoItem);
-                    } else {
-                        // 素材自带的封面 ctop_material_image_info 内部素材的自带封面,素造的没有
-                        // 素材的智能抽帧封面 ctop_material_cut_frame 其中素造的为8张封面,内部的为15张封面
-                        List<MaterialCutFrame> cutFrameList = materialCutFrameService.getListByVideoSignature(videoItem.getSignature());
-                        List<MaterialImageInfo> orgFrameList = materialImageInfoService.getListByVideoSignature(videoItem.getSignature());
-                        // 其他情况下,一个素材搭配15张封面,生成15个创意
-                        if ((null == cutFrameList||cutFrameList.isEmpty())&&(null == orgFrameList|| orgFrameList.isEmpty())){
-                            log.info("未获取到视频封面=>videoSignature:{}",videoItem.getSignature());
-                            continue;
-                        }
-                        int creativeCnt = 1;
-                        if (null!=orgFrameList&&!orgFrameList.isEmpty()) {
-                            for (int i = 0; i < orgFrameList.size(); i++) {
-                                String imageCode = orgFrameList.get(i).getCode();
-                                String imageUrl = orgFrameList.get(i).getUrl();
-                                String imageToken = getImageToken(imageUrl,imageCode,accountId,token.getAccessToken());
-                                creativeParams.put("image_token",imageToken);
-                                createCreative(token,creativeParams,campaignId,unitId,strategy,null,creativeCnt,videoItem);
-                                creativeCnt++;
-                                if (creativeCnt > 5) {
-                                    break;
-                                }
-                            }
-                        }
-
-                        if ((null!=cutFrameList&&!cutFrameList.isEmpty()) && (creativeCnt<=15)){
-                            for (int i = 0; i < cutFrameList.size(); i++) {
-                                String imageCode = cutFrameList.get(i).getSignature();
-                                String imageUrl = cutFrameList.get(i).getUrl();
-                                String imageToken = getImageToken(imageUrl,imageCode,accountId,token.getAccessToken());
-                                creativeParams.put("image_token",imageToken);
-                                createCreative(token,creativeParams,campaignId,unitId,strategy,null,creativeCnt,videoItem);
-                                creativeCnt ++;
-                                if (creativeCnt > 5) {
-                                    break;
-                                }
+                    // 选择素材,创建创意
+                    for(KuaiShouVideoGet videoItem: videoGets){
+                        //拼装广告组参数
+                        JSONObject creativeParams = creativeParams(token,unitId,videoItem,unitCnt,strategy);
+                        JSONArray sceneIdJsonArray = JSONArray.parseArray(strategy.getSceneId());
+                        // 如果广告位只包含 上下滑大屏广告(6),则一个素材搭配1张封面,生成1个创意
+                        if (sceneIdJsonArray.contains(6) && sceneIdJsonArray.size() == 1){
+                            //直接创建创意
+                            createCreative(token,creativeParams,campaignId,unitId,strategy,null,1,videoItem);
+                        } else {
+                            // 素材自带的封面 ctop_material_image_info 内部素材的自带封面,素造的没有
+                            // 素材的智能抽帧封面 ctop_material_cut_frame 其中素造的为8张封面,内部的为15张封面
+                            List<MaterialCutFrame> cutFrameList = materialCutFrameService.getListByVideoSignature(videoItem.getSignature());
+                            List<MaterialImageInfo> orgFrameList = materialImageInfoService.getListByVideoSignature(videoItem.getSignature());
+                            // 其他情况下,一个素材搭配15张封面,生成15个创意
+                            if ((null == cutFrameList||cutFrameList.isEmpty())&&(null == orgFrameList|| orgFrameList.isEmpty())){
+                                log.info("未获取到视频封面=>videoSignature:{}",videoItem.getSignature());
+                                continue;
                             }
+                            createCreativeByImage(cutFrameList,orgFrameList,token,creativeParams,campaignId,unitId,strategy,videoItem,1,null);
                         }
                     }
                 }
             }
-
         }else if(scenes.equals(2)){
             //素材+定向
-            //根据策略类型获取策略模板信息
-            AiKuaishouStrategyTemplate strategyTemplate = templateService.getOneByParams(scenes, 1);
-            if(null == strategyTemplate){
-                log.info("策略模板信息获取失败=>testDirection:{}",scenes);
-                return;
-            }
             //2:根据测试方向获取相应的定向拆分数据类型
             List<AiKuaishouStrategyTargetBase>targetBases = targetBaseService.listByType(strategyTemplate.getTestDirection());
             if(null == targetBases){
@@ -180,7 +188,6 @@ public class AiStrategyServiceImpl implements IAiStrategyService {
             }
             //3:获取相应字段相应的用户定义域
             String definitionDomain = getStragyDefDomain(strategyTemplate,strategy);
-            System.out.println(definitionDomain);
             //4:计算定向拆分逻辑
             List<AiKuaishouStrategyTargetBase>getBases = splitBasesByDomain(definitionDomain,targetBases);
             if(null == getBases||getBases.isEmpty()){
@@ -210,65 +217,74 @@ public class AiStrategyServiceImpl implements IAiStrategyService {
             // 8、根据定向和素材,两层循环 创建组和创意
             for (AiKuaishouStrategyTargetBase item:getBases) {
                 unitCnt++;
-                // 策略定向拆分数据,写入数据库
-                AiKuaishouStrategyTargetUnion targetUnion = new AiKuaishouStrategyTargetUnion(strategyMiddle.getId(),item.getId(),item.getTargetContent());
-                targetUnionService.save(targetUnion);
-                // 选择素材,创建创意
-                for(KuaiShouVideoGet videoItem: videoGets){
-                    //拼装广告组参数
-                    JSONObject unitParams = createUnitParams(token,campaignId,strategy,strategyTemplate, item,timestamp,unitCnt);
-                    Map<String, Object> unitCreateResult = kuaishouInterfaceService.adUnitCreate(token.getAccessToken(), token.getAccountId(), unitParams,1);
-                    Integer unitCode = (Integer) unitCreateResult.get("code");
-                    String unitMessage = (String) unitCreateResult.get("message");
-                    if(unitCode != 0 ){
-                        log.info("组创建失败=>accountId:{};message:{}",accountId,unitMessage);
-                        continue;
-                    }
-                    Long unitId = (Long) unitCreateResult.get("unitId");
-
-                    JSONObject creativeParams = creativeParams(token,unitId,videoItem,unitCnt,strategy);
-                    JSONArray sceneIdJsonArray = JSONArray.parseArray(strategy.getSceneId());
-                    // 如果广告位只包含 上下滑大屏广告(6),则一个素材搭配1张封面,生成1个创意
-                    if (sceneIdJsonArray.contains(6) && sceneIdJsonArray.size() == 1){
-                        //直接创建创意
-                        createCreative(token,creativeParams,campaignId,unitId,strategy,targetUnion,1,videoItem);
-                    } else {
-                        // 素材自带的封面 ctop_material_image_info 内部素材的自带封面,素造的没有
-                        // 素材的智能抽帧封面 ctop_material_cut_frame 其中素造的为8张封面,内部的为15张封面
-                        List<MaterialCutFrame> cutFrameList = materialCutFrameService.getListByVideoSignature(videoItem.getSignature());
-                        List<MaterialImageInfo> orgFrameList = materialImageInfoService.getListByVideoSignature(videoItem.getSignature());
-                        // 其他情况下,一个素材搭配15张封面,生成15个创意
-                        if ((null == cutFrameList||cutFrameList.isEmpty())&&(null == orgFrameList|| orgFrameList.isEmpty())){
-                            log.info("未获取到视频封面=>videoSignature:{}",videoItem.getSignature());
+                if(null!=materialFixType&&materialFixType.trim().equals("single")){
+                    // 策略定向拆分数据,写入数据库
+                    AiKuaishouStrategyTargetUnion targetUnion = new AiKuaishouStrategyTargetUnion(strategyMiddle.getId(),item.getId(),item.getTargetContent());
+                    targetUnionService.save(targetUnion);
+                    // 选择素材,创建创意
+                    for(KuaiShouVideoGet videoItem: videoGets){
+                        //拼装广告组参数
+                        JSONObject unitParams = createUnitParams(token,campaignId,strategy,strategyTemplate, item,timestamp,unitCnt);
+                        Map<String, Object> unitCreateResult = kuaishouInterfaceService.adUnitCreate(token.getAccessToken(), token.getAccountId(), unitParams,1);
+                        Integer unitCode = (Integer) unitCreateResult.get("code");
+                        String unitMessage = (String) unitCreateResult.get("message");
+                        if(unitCode != 0 ){
+                            log.info("组创建失败=>accountId:{};message:{}",accountId,unitMessage);
                             continue;
                         }
-                        int creativeCnt = 1;
-                        if (null!=orgFrameList&&!orgFrameList.isEmpty()) {
-                            for (int i = 0; i < orgFrameList.size(); i++) {
-                                String imageCode = orgFrameList.get(i).getCode();
-                                String imageUrl = orgFrameList.get(i).getUrl();
-                                String imageToken = getImageToken(imageUrl,imageCode,accountId,token.getAccessToken());
-                                creativeParams.put("image_token",imageToken);
-                                createCreative(token,creativeParams,campaignId,unitId,strategy,targetUnion,creativeCnt,videoItem);
-                                creativeCnt++;
-                                if (creativeCnt > 5) {
-                                    break;
-                                }
+                        Long unitId = (Long) unitCreateResult.get("unitId");
+                        JSONObject creativeParams = creativeParams(token,unitId,videoItem,unitCnt,strategy);
+                        JSONArray sceneIdJsonArray = JSONArray.parseArray(strategy.getSceneId());
+                        // 如果广告位只包含 上下滑大屏广告(6),则一个素材搭配1张封面,生成1个创意
+                        if (sceneIdJsonArray.contains(6) && sceneIdJsonArray.size() == 1){
+                            //直接创建创意
+                            createCreative(token,creativeParams,campaignId,unitId,strategy,targetUnion,1,videoItem);
+                        } else {
+                            // 素材自带的封面 ctop_material_image_info 内部素材的自带封面,素造的没有
+                            // 素材的智能抽帧封面 ctop_material_cut_frame 其中素造的为8张封面,内部的为15张封面
+                            List<MaterialCutFrame> cutFrameList = materialCutFrameService.getListByVideoSignature(videoItem.getSignature());
+                            List<MaterialImageInfo> orgFrameList = materialImageInfoService.getListByVideoSignature(videoItem.getSignature());
+                            // 其他情况下,一个素材搭配15张封面,生成15个创意
+                            if ((null == cutFrameList||cutFrameList.isEmpty())&&(null == orgFrameList|| orgFrameList.isEmpty())){
+                                log.info("未获取到视频封面=>videoSignature:{}",videoItem.getSignature());
+                                continue;
                             }
+                            createCreativeByImage(cutFrameList,orgFrameList,token,creativeParams,campaignId,unitId,strategy,videoItem,15,targetUnion);
                         }
-
-                        if ((null!=cutFrameList&&!cutFrameList.isEmpty()) && (creativeCnt<=15)){
-                            for (int i = 0; i < cutFrameList.size(); i++) {
-                                String imageCode = cutFrameList.get(i).getSignature();
-                                String imageUrl = cutFrameList.get(i).getUrl();
-                                String imageToken = getImageToken(imageUrl,imageCode,accountId,token.getAccessToken());
-                                creativeParams.put("image_token",imageToken);
-                                createCreative(token,creativeParams,campaignId,unitId,strategy,targetUnion,creativeCnt,videoItem);
-                                creativeCnt ++;
-                                if (creativeCnt > 5) {
-                                    break;
-                                }
+                    }
+                }else{
+                    // 策略定向拆分数据,写入数据库
+                    AiKuaishouStrategyTargetUnion targetUnion = new AiKuaishouStrategyTargetUnion(strategyMiddle.getId(),item.getId(),item.getTargetContent());
+                    targetUnionService.save(targetUnion);
+                    // 选择素材,创建创意
+                    for(KuaiShouVideoGet videoItem: videoGets){
+                        //拼装广告组参数
+                        JSONObject unitParams = createUnitParams(token,campaignId,strategy,strategyTemplate, item,timestamp,unitCnt);
+                        Map<String, Object> unitCreateResult = kuaishouInterfaceService.adUnitCreate(token.getAccessToken(), token.getAccountId(), unitParams,1);
+                        Integer unitCode = (Integer) unitCreateResult.get("code");
+                        String unitMessage = (String) unitCreateResult.get("message");
+                        if(unitCode != 0 ){
+                            log.info("组创建失败=>accountId:{};message:{}",accountId,unitMessage);
+                            continue;
+                        }
+                        Long unitId = (Long) unitCreateResult.get("unitId");
+                        JSONObject creativeParams = creativeParams(token,unitId,videoItem,unitCnt,strategy);
+                        JSONArray sceneIdJsonArray = JSONArray.parseArray(strategy.getSceneId());
+                        // 如果广告位只包含 上下滑大屏广告(6),则一个素材搭配1张封面,生成1个创意
+                        if (sceneIdJsonArray.contains(6) && sceneIdJsonArray.size() == 1){
+                            //直接创建创意
+                            createCreative(token,creativeParams,campaignId,unitId,strategy,targetUnion,1,videoItem);
+                        } else {
+                            // 素材自带的封面 ctop_material_image_info 内部素材的自带封面,素造的没有
+                            // 素材的智能抽帧封面 ctop_material_cut_frame 其中素造的为8张封面,内部的为15张封面
+                            List<MaterialCutFrame> cutFrameList = materialCutFrameService.getListByVideoSignature(videoItem.getSignature());
+                            List<MaterialImageInfo> orgFrameList = materialImageInfoService.getListByVideoSignature(videoItem.getSignature());
+                            // 其他情况下,一个素材搭配15张封面,生成15个创意
+                            if ((null == cutFrameList||cutFrameList.isEmpty())&&(null == orgFrameList|| orgFrameList.isEmpty())){
+                                log.info("未获取到视频封面=>videoSignature:{}",videoItem.getSignature());
+                                continue;
                             }
+                            createCreativeByImage(cutFrameList,orgFrameList,token,creativeParams,campaignId,unitId,strategy,videoItem,1,targetUnion);
                         }
                     }
                 }
@@ -277,6 +293,37 @@ public class AiStrategyServiceImpl implements IAiStrategyService {
 
     }
 
+    private void createCreativeByImage(List<MaterialCutFrame> cutFrameList,List<MaterialImageInfo> orgFrameList,CtopOauthToken token,JSONObject creativeParams,Long campaignId,Long unitId,KuaishouStrategy strategy,KuaiShouVideoGet videoItem,int imageNumber,AiKuaishouStrategyTargetUnion targetUnion){
+        int creativeCnt  = 1;
+        if (null!=orgFrameList&&!orgFrameList.isEmpty()) {
+            for (int i = 0; i < orgFrameList.size(); i++) {
+                String imageCode = orgFrameList.get(i).getCode();
+                String imageUrl = orgFrameList.get(i).getUrl();
+                String imageToken = getImageToken(imageUrl,imageCode,token.getAccountId(),token.getAccessToken());
+                creativeParams.put("image_token",imageToken);
+                createCreative(token,creativeParams,campaignId,unitId,strategy,null,creativeCnt,videoItem);
+                creativeCnt++;
+                if (creativeCnt > imageNumber) {
+                    break;
+                }
+            }
+        }
+
+        if ((null!=cutFrameList&&!cutFrameList.isEmpty()) && (creativeCnt<=15)){
+            for (int i = 0; i < cutFrameList.size(); i++) {
+                String imageCode = cutFrameList.get(i).getSignature();
+                String imageUrl = cutFrameList.get(i).getUrl();
+                String imageToken = getImageToken(imageUrl,imageCode,token.getAccountId(),token.getAccessToken());
+                creativeParams.put("image_token",imageToken);
+                createCreative(token,creativeParams,campaignId,unitId,strategy,null,creativeCnt,videoItem);
+                creativeCnt ++;
+                if (creativeCnt > imageNumber) {
+                    break;
+                }
+            }
+        }
+    }
+
     private JSONObject createUnitParams(CtopOauthToken token, Long campaignId, KuaishouStrategy strategy, Long item, String timestamp, int unitCnt) {
         // 拼装创建组的入参 json
         JSONObject unitParams = new JSONObject();

+ 3 - 3
jeecg-boot-module-system/src/test/java/org/jeecg/SampleTest.java

@@ -409,11 +409,11 @@ public class SampleTest {
     private IBytedanceVideoEtlInfoService bytedanceVideoEtlInfoService;
     @Test
     public void etlBytedanceData(){
-        String dateString = "2020-03-01";
+        String dateString = "2020-08-30";
         Date startDate = DateUtils.parseDate(dateString,"yyyy-MM-dd");
         for(int i=0;i<=310;i++){
             Date getDate = DateUtils.addDay(startDate,i);
-            bytedanceVideoEtlInfoService.etlBytedanceVideoInfo(getDate);
+//            bytedanceVideoEtlInfoService.etlBytedanceVideoInfo(getDate);
             kuaishouVideoEtlInfoService.etlKuaishouVideoInfo(getDate);
         }
     }
@@ -429,7 +429,7 @@ public class SampleTest {
     @Test
     public void loadKuaishouVideo(){
         String endDate = DateUtils.getNowDate("yyyy-MM-dd");
-        CtopOauthToken token = tokenService.getTokenByAccountId(9743023L);
+        CtopOauthToken token = tokenService.getTokenByAccountId(9718688L);
 //        kuaishouInterfaceService.getVideoList(token, endDate, endDate);
         kuaishouInterfaceService.getAdvertiserCreativeReportDaily(token, new Date(), new Date(), null, null);
     }