|
@@ -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();
|