浏览代码

修改批量添加头条广告计划接口逻辑

syh 5 年之前
父节点
当前提交
288d065d48
共有 14 个文件被更改,包括 292 次插入161 次删除
  1. 1 1
      jeecg-boot-module-system/src/main/java/org/jeecg/JeecgOneToMainUtil.java
  2. 1 0
      jeecg-boot-module-system/src/main/java/org/jeecg/config/ShiroConfig.java
  3. 4 1
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/controller/ByteDanceAdvertiserPostController.java
  4. 9 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/controller/ByteDanceTemplateController.java
  5. 3 3
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/entity/ByteDanceCampaignTemplate.java
  6. 2 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/entity/BytedanceAdvertisePlanTemplate.java
  7. 3 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/entity/BytedanceDeliveryTargetTemplate.java
  8. 5 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/service/IByteDanceAdvertisePlanService.java
  9. 69 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/service/impl/ByteDanceAdvertisePlanServiceImpl.java
  10. 1 1
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/service/impl/ByteDanceCampaignTemplateServiceImpl.java
  11. 167 154
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/service/impl/ByteDanceCreativeServiceImpl.java
  12. 2 1
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/service/impl/BytedanceAdvertisePlanTemplateServiceImpl.java
  13. 1 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/service/impl/BytedanceDeliveryTargetTemplateServiceImpl.java
  14. 24 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/vo/AdConvertVo.java

+ 1 - 1
jeecg-boot-module-system/src/main/java/org/jeecg/JeecgOneToMainUtil.java

@@ -32,7 +32,7 @@ public class JeecgOneToMainUtil {
 		//[1].子表一
 		SubTableVo po = new SubTableVo();
         po.setTableName("sys_category");//表名
-        po.setEntityName("ChildCategory");        //实体名
+        po.setEntityName("Category");        //实体名
         po.setEntityPackage("ctop");            //包名
         po.setFtlDescription("子分类信息");       //描述
 		//子表外键参数配置

+ 1 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/config/ShiroConfig.java

@@ -93,6 +93,7 @@ public class ShiroConfig {
 		filterChainDefinitionMap.put("/toutiao/advertiser/**", "anon");
         filterChainDefinitionMap.put("/toutiao/industry/list", "anon");
         filterChainDefinitionMap.put("/template/bytedance/industry/list", "anon");
+        filterChainDefinitionMap.put("/template/convert/list", "anon");
 		//文件上传接口
 		filterChainDefinitionMap.put("/upload/**", "anon");
 

+ 4 - 1
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/controller/ByteDanceAdvertiserPostController.java

@@ -127,9 +127,12 @@ public class ByteDanceAdvertiserPostController {
      */
     @RequestMapping("/advertiser/campaign/create")
     public Map<String, Object> advertiserCampaignCreate(String accountId, String campaignName, String budgetMode, Integer budget, String landingType) {
-        return advertiserDataService.advertiserCampaignCreate(accountId, campaignName, budgetMode, budget, landingType);
+        return campaignTemplateService.campaignCreate(accountId, campaignName, budgetMode, budget, landingType);
     }
 
+    @Autowired
+    private IByteDanceCampaignTemplateService campaignTemplateService;
+
 //    /**
 //     * 11:创建广告计划信息
 //     * @param accountId 本平台广告主id

+ 9 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/controller/ByteDanceTemplateController.java

@@ -167,6 +167,15 @@ public class ByteDanceTemplateController {
     }
 
     /**
+     * @param accountId
+     * @return 查询计划可用转化id
+     */
+    @GetMapping(value = "convert/list")
+    public Map<String, Object> convertPageList(Long accountId, String packageName) {
+        return planService.getAdConvertList(accountId, packageName);
+    }
+
+    /**
      * @param req
      * @return
      * @功能:获取头条行业信息列表

+ 3 - 3
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/entity/ByteDanceCampaignTemplate.java

@@ -37,10 +37,10 @@ public class ByteDanceCampaignTemplate {
     @ApiModelProperty(value = "id")
     private Long id;
     /**
-     * 投放目标
+     * 推广目的
      */
-    @Excel(name = "投放目标", width = 15)
-    @ApiModelProperty(value = "投放目标")
+    @Excel(name = "推广目的", width = 15)
+    @ApiModelProperty(value = "推广目的")
     @Dict(dicCode = "toutiao_promotion_purpose_type")
     private String promotionPurpose;
     /**

+ 2 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/entity/BytedanceAdvertisePlanTemplate.java

@@ -13,6 +13,7 @@ import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.experimental.Accessors;
 import com.fasterxml.jackson.annotation.JsonFormat;
+import org.jeecg.common.aspect.annotation.Dict;
 import org.springframework.format.annotation.DateTimeFormat;
 import org.jeecgframework.poi.excel.annotation.Excel;
 
@@ -46,6 +47,7 @@ public class BytedanceAdvertisePlanTemplate {
      */
     @Excel(name = "投放范围", width = 15)
     @ApiModelProperty(value = "投放范围")
+    @Dict(dicCode = "toutiao_advertising_scope")
     private String deliveryRange;
     /**
      * 用户定向模板id

+ 3 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/entity/BytedanceDeliveryTargetTemplate.java

@@ -13,6 +13,7 @@ import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.experimental.Accessors;
 import com.fasterxml.jackson.annotation.JsonFormat;
+import org.jeecg.common.aspect.annotation.Dict;
 import org.springframework.format.annotation.DateTimeFormat;
 import org.jeecgframework.poi.excel.annotation.Excel;
 
@@ -46,12 +47,14 @@ public class BytedanceDeliveryTargetTemplate {
      */
     @Excel(name = "投放目标", width = 15)
     @ApiModelProperty(value = "投放目标")
+    @Dict(dicCode = "toutiao_delivery_target_type")
     private String deliveryTarget;
     /**
      * 下载方式
      */
     @Excel(name = "下载方式", width = 15)
     @ApiModelProperty(value = "下载方式")
+    @Dict(dicCode = "toutiao_dowload_type")
     private String downloadType;
     /**
      * 下载链接

+ 5 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/service/IByteDanceAdvertisePlanService.java

@@ -1,7 +1,10 @@
 package org.jeecg.modules.ctop.service;
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.jeecg.common.api.vo.Result;
 import org.jeecg.modules.ctop.entity.ByteDanceAdvertisePlan;
 import com.baomidou.mybatisplus.extension.service.IService;
+import org.jeecg.modules.ctop.entity.ByteDanceCampaign;
 import org.jeecg.modules.ctop.entity.CTopOauthToken;
 
 import java.util.Map;
@@ -15,4 +18,6 @@ import java.util.Map;
 public interface IByteDanceAdvertisePlanService extends IService<ByteDanceAdvertisePlan> {
 
     Map<String, Object> advertiserPlanCreate(CTopOauthToken token, Long campaignId, String dataString);
+
+    Map<String, Object> getAdConvertList(Long accountId, String packageName);
 }

+ 69 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/service/impl/ByteDanceAdvertisePlanServiceImpl.java

@@ -5,6 +5,7 @@ import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import org.apache.http.client.ClientProtocolException;
 import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.client.methods.HttpEntityEnclosingRequestBase;
 import org.apache.http.client.methods.HttpPost;
 import org.apache.http.entity.ContentType;
 import org.apache.http.entity.StringEntity;
@@ -25,6 +26,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import java.io.BufferedReader;
 import java.io.IOException;
 import java.io.InputStreamReader;
+import java.net.URI;
 import java.util.HashMap;
 import java.util.Map;
 
@@ -62,6 +64,73 @@ public class ByteDanceAdvertisePlanServiceImpl extends ServiceImpl<ByteDanceAdve
         return resultMap;
     }
 
+    @Override
+    public Map<String, Object> getAdConvertList(Long accountId, String packageName) {
+        CTopOauthToken token = tokenService.getOAuthTokenByAccountId(accountId + "");
+        return getAdConvert(token, packageName);
+    }
+
+    public JSONObject getAdConvert(CTopOauthToken token, String packageName) {
+        String access_token = token.getAccessToken();
+        final Long advertiser_id = token.getAccountId();
+        // 请求地址
+        String url = "https://ad.toutiao.com/open_api/2/tools/ad_convert/select/";
+
+        // 请求参数
+        Map data = new HashMap() {
+            {
+                put("advertiser_id", advertiser_id);
+                put("package_name", packageName);
+            }
+        };
+
+        // 构造请求
+        HttpEntityEnclosingRequestBase httpEntity = new HttpEntityEnclosingRequestBase() {
+            @Override
+            public String getMethod() {
+                return "GET";
+            }
+        };
+
+        httpEntity.setHeader("Access-Token", access_token);
+
+        CloseableHttpResponse response = null;
+        CloseableHttpClient client = null;
+
+        try {
+            client = HttpClientBuilder.create().build();
+            httpEntity.setURI(URI.create(url));
+            httpEntity.setEntity(new StringEntity(JSONObject.toJSONString(data), ContentType.APPLICATION_JSON));
+
+            response = client.execute(httpEntity);
+            if (response != null && response.getStatusLine().getStatusCode() == 200) {
+                BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
+                StringBuffer result = new StringBuffer();
+                String line = "";
+                while ((line = bufferedReader.readLine()) != null) {
+                    result.append(line);
+                }
+                bufferedReader.close();
+                return JSONObject.parseObject(result.toString());
+            }
+
+        } catch (ClientProtocolException e) {
+            e.printStackTrace();
+        } catch (IOException e) {
+            e.printStackTrace();
+        } finally {
+            try {
+                if (response != null) {
+                    response.close();
+                }
+                client.close();
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        }
+        return null;
+    }
+
     @Autowired
     private ByteDanceAdvertisePlanMapper planMapper;
 

+ 1 - 1
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/service/impl/ByteDanceCampaignTemplateServiceImpl.java

@@ -158,7 +158,7 @@ public class ByteDanceCampaignTemplateServiceImpl extends ServiceImpl<ByteDanceC
         JSONObject params = new JSONObject();
         params.put("advertiser_id", token.getAccountId());
         SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd_hh_mm_ss");
-        params.put("campaign_name", name + sdf.format(name + "_广告组_" + new Date()) + "汇创思拓_" + System.currentTimeMillis());
+        params.put("campaign_name", name + "_广告组_" + sdf.format(new Date()) + "汇创思拓_" + System.currentTimeMillis());
         params.put("budget_mode", template.getCampaignBudget());
         params.put("budget", template.getBudgetDaily());
         params.put("landing_type", template.getPromotionPurpose());

+ 167 - 154
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/service/impl/ByteDanceCreativeServiceImpl.java

@@ -11,6 +11,8 @@ import org.apache.http.entity.ContentType;
 import org.apache.http.entity.StringEntity;
 import org.apache.http.impl.client.CloseableHttpClient;
 import org.apache.http.impl.client.HttpClientBuilder;
+import org.jeecg.common.util.ResultMapUtils;
+import org.jeecg.common.util.StatusCode;
 import org.jeecg.modules.ctop.entity.ByteDanceCreative;
 import org.jeecg.modules.ctop.entity.CTopOauthToken;
 import org.jeecg.modules.ctop.mapper.ByteDanceCreativeMapper;
@@ -72,6 +74,7 @@ public class ByteDanceCreativeServiceImpl extends ServiceImpl<ByteDanceCreativeM
 
     @Override
     public Map<String, Object> insertBatch(JSONObject template) {
+        Map<String, Object> resultMap = new HashMap<>();
         System.out.println(template.toJSONString());
         String getName = template.getString("name");
         String getAccountId = template.getLong("accountId") + "";
@@ -80,170 +83,180 @@ public class ByteDanceCreativeServiceImpl extends ServiceImpl<ByteDanceCreativeM
         Long userorentationId = template.getLong("userorentationId");
         Long budgetId = template.getLong("budgetId");
         Long deliverytargetId = template.getLong("deliverytargetId");
-        //1:创建广告组
-        Map<String, Object> campaignResult = campaignTemplateService.campaignCreate(getAccountId, campaignTemplateId, getName);
-        Boolean createSuccess = (Boolean) campaignResult.get("success");
-        if (null == createSuccess || !createSuccess) {
-            return campaignResult;
-        }
-        Long campaignId = (Long) campaignResult.get("campaignId");
-        //2:创建广告计划
-        Map<String, Object> planResult = planTemplateService.planCreate(campaignId, getAccountId, deliveryRange, userorentationId, budgetId, deliverytargetId, getName);
-        createSuccess = (Boolean) planResult.get("success");
-        if (null == createSuccess || !createSuccess) {
-            return planResult;
-        }
-        Long planId = (Long) campaignResult.get("planId");
-        //3:创建广告创意
-        //<a-radio-button value="CREATIVE_IMAGE_MODE_VIDEO">横版视频</a-radio-button>
-        JSONArray horizonImageIds = new JSONArray();
-        String horizonVideoId = "";
-        String horizonVideoCoverImageId = "";
-
-        //<a-radio-button value="CREATIVE_IMAGE_MODE_VIDEO_VERTICAL">竖版视频</a-radio-button>
-        String verticalVideoId = "";
-        String verticalVideoCoverImageId = "";
+        Integer iteratorNum = template.getInteger("iteratorNum");
 
-        //<a-radio-button value="CREATIVE_IMAGE_MODE_GROUP">组图</a-radio-button>
-        JSONArray groupImageIds = new JSONArray();
+        JSONArray groupImageArray = null;
+        JSONArray horizonImageArray = null;
+        String horizonVideoCoverImage = null;
+        String horizonVideo = null;
+        JSONArray verticalVideoCoverImageArray = null;
+        String verticalVideoId = null;
+        JSONArray smallImageArray = null;
+        JSONArray verticalImageArray = null;
+        if (null != iteratorNum && iteratorNum >= 1) {
+            for (int i = 0; i < iteratorNum; i++) {
+                //1:创建广告组
+                Map<String, Object> campaignResult = campaignTemplateService.campaignCreate(getAccountId, campaignTemplateId, getName);
+                Boolean createSuccess = (Boolean) campaignResult.get("success");
+                if (null == createSuccess || !createSuccess) {
+                    return campaignResult;
+                }
+                Long campaignId = (Long) campaignResult.get("campaignId");
+                //2:创建广告计划
+                Map<String, Object> planResult = planTemplateService.planCreate(campaignId, getAccountId, deliveryRange, userorentationId, budgetId, deliverytargetId, getName);
+                createSuccess = (Boolean) planResult.get("success");
+                if (null == createSuccess || !createSuccess) {
+                    return planResult;
+                }
+                Long planId = (Long) campaignResult.get("planId");
+                //3:创建广告创意
+                JSONObject data = new JSONObject();
+                data.put("ad_id", planId);
+                String advertiseLoaction = template.getString("advertiseLocation");
+                //优选广告位
+                if (null != advertiseLoaction && "great".equals(advertiseLoaction)) {
+                    data.put("smart_inventory", 1);
+                } else {
+                    data.put("smart_inventory", 0);
+                }
+                //按媒体指定位置
+                if (null != advertiseLoaction && "media".equals(advertiseLoaction)) {
+                    JSONArray inventoryType = template.getJSONArray("inventoryType");
+                    data.put("inventory_type", inventoryType);
+                }
+                //按场景指定位置
+                if (null != advertiseLoaction && "sence".equals(advertiseLoaction)) {
+                    data.put("scene_inventory", template.getString("sceneInventory"));
+                }
+                JSONArray creatives = new JSONArray();
+                String horizonImageUrl = template.getString("horizonImageUrl");
+                String horizonImageCreativeText = template.getString("horizonImageCreativeText");
+                if (null != horizonImageUrl && !"".equals(horizonImageUrl) && null != horizonImageCreativeText && !"".equals(horizonImageCreativeText)) {
+                    JSONObject creative = new JSONObject();
+                    creative.put("image_mode", "CREATIVE_IMAGE_MODE_LARGE");
+                    if (null == horizonImageArray) {
+                        Map<String, Object> getImageResult = fileInfoService.uploadImageToBytedance(getAccountId, horizonImageUrl);
+                        horizonImageArray = (JSONArray) getImageResult.get("imageIds");
+                    }
+//            web.business.image/201908015d0dd63849aa78f142989c70
+                    creative.put("image_ids", horizonImageArray);
+                    creative.put("title", horizonImageCreativeText);
+                    creatives.add(creative);
+                }
+                String horizonVideoUrl = template.getString("horizonVideoUrl");
+                String horizonVideoCoverImageUrl = template.getString("horizonVideoCoverImageUrl");
+                String horizonVideoCreativeText = template.getString("horizonVideoCreativeText");
+                if (null != horizonVideoUrl && !"".equals(horizonVideoUrl) && null != horizonVideoCoverImageUrl && !"".equals(horizonVideoCoverImageUrl) && null != horizonVideoCreativeText && !"".equals(horizonVideoCreativeText)) {
+                    JSONObject creative = new JSONObject();
+                    creative.put("image_mode", "CREATIVE_IMAGE_MODE_VIDEO");
+                    if (null == horizonVideoCoverImage) {
+                        Map<String, Object> getImageResult = fileInfoService.uploadImageToBytedance(getAccountId, horizonVideoCoverImageUrl);
+                        JSONArray horizonVideoCoverImageArray = (JSONArray) getImageResult.get("imageIds");
+                        horizonVideoCoverImage = horizonVideoCoverImageArray.getString(0);
+                    }
 
-        //<a-radio-button value="CREATIVE_IMAGE_MODE_SMALL">小图</a-radio-button>
-        JSONArray smallImageIds = new JSONArray();
+                    if (null == horizonVideo) {
+                        Map<String, Object> getVideoResult = fileInfoService.uploadVideoToBytedance(getAccountId, horizonVideoCreativeText);
+                        horizonVideo = (String) getVideoResult.get("videoId");
+                    }
+                    creative.put("image_id", horizonVideoCoverImage);
+                    creative.put("video_id", horizonVideo);
+                    creative.put("title", horizonVideoCreativeText);
+                    creatives.add(creative);
+                }
+                String verticalVideoUrl = template.getString("verticalVideoUrl");
+                String verticalVideoCoverImageUrl = template.getString("verticalVideoCoverImageUrl");
+                String verticalVideoCreativeText = template.getString("verticalVideoCreativeText");
+                if (null != verticalVideoUrl && !"".equals(verticalVideoUrl) && null != verticalVideoCoverImageUrl && !"".equals(verticalVideoCoverImageUrl) && null != verticalVideoCreativeText && !"".equals(verticalVideoCreativeText)) {
+                    JSONObject creative = new JSONObject();
+                    creative.put("image_mode", "CREATIVE_IMAGE_MODE_VIDEO_VERTICAL");
+                    if (null == verticalImageArray) {
+                        Map<String, Object> getImageResult = fileInfoService.uploadImageToBytedance(getAccountId, verticalVideoCoverImageUrl);
+                        verticalVideoCoverImageArray = (JSONArray) getImageResult.get("imageIds");
+                    }
+                    if (null == verticalVideoId || "".equals(verticalVideoId.trim())) {
+                        Map<String, Object> getVideoResult = fileInfoService.uploadVideoToBytedance(getAccountId, verticalVideoUrl);
+                        verticalVideoId = (String) getVideoResult.get("videoId");
+                    }
+                    creative.put("image_id", verticalVideoCoverImageArray.getString(0));
+                    creative.put("video_id", verticalVideoId);
+                    creative.put("title", verticalVideoCreativeText);
+                    creatives.add(creative);
+                }
+                String groupImageUrl = template.getString("groupImageUrl");
+                String groupImageCreativeText = template.getString("groupImageCreativeText");
+                if (null != groupImageUrl && !"".equals(groupImageUrl) && null != groupImageCreativeText && !"".equals(groupImageCreativeText)) {
+                    JSONObject creative = new JSONObject();
+                    creative.put("image_mode", "CREATIVE_IMAGE_MODE_GROUP");
+                    if (null == groupImageArray) {
+                        Map<String, Object> getImageResult = fileInfoService.uploadImageToBytedance(getAccountId, groupImageUrl);
+                        groupImageArray = (JSONArray) getImageResult.get("imageIds");
+                    }
+                    creative.put("image_ids", groupImageArray);
+                    creative.put("title", groupImageCreativeText);
+                    creatives.add(creative);
+                }
+                String smallImageUrl = template.getString("smallImageUrl");
+                String smallImageCreativeText = template.getString("smallImageCreativeText");
+                if (null != smallImageUrl && !"".equals(smallImageUrl) && null != smallImageCreativeText && !"".equals(smallImageCreativeText)) {
+                    JSONObject creative = new JSONObject();
+                    creative.put("image_mode", "CREATIVE_IMAGE_MODE_SMALL");
+                    if (null == smallImageArray) {
+                        Map<String, Object> getImageResult = fileInfoService.uploadImageToBytedance(getAccountId, smallImageUrl);
+                        smallImageArray = (JSONArray) getImageResult.get("imageIds");
+                    }
+                    creative.put("image_ids", smallImageArray);
+                    creative.put("title", smallImageCreativeText);
+                    creatives.add(creative);
+                }
 
-        //<a-radio-button value="CREATIVE_IMAGE_MODE_LARGE_VERTICAL">大图竖图</a-radio-button>
-        JSONArray verticalImageIds = new JSONArray();
+                String verticalImageUrl = template.getString("verticalImageUrl");
+                String verticalImageCreativeText = template.getString("verticalImageCreativeText");
+                if (null != verticalImageUrl && !"".equals(verticalImageUrl) && null != verticalImageCreativeText && !"".equals(verticalImageCreativeText)) {
+                    JSONObject creative = new JSONObject();
+                    creative.put("image_mode", "CREATIVE_IMAGE_MODE_LARGE_VERTICAL");
+                    if (null == verticalImageArray) {
+                        Map<String, Object> getImageResult = fileInfoService.uploadImageToBytedance(getAccountId, verticalImageUrl);
+                        verticalImageArray = (JSONArray) getImageResult.get("imageIds");
+                    }
+                    creative.put("image_ids", verticalImageArray);
+                    creative.put("title", verticalImageCreativeText);
+                    creatives.add(creative);
+                }
 
-//        creative_display_mode
-        JSONObject data = new JSONObject();
-        data.put("ad_id", planId);
-        String advertiseLoaction = template.getString("advertiseLocation");
-        //优选广告位
-        if (null != advertiseLoaction && "great".equals(advertiseLoaction)) {
-            data.put("smart_inventory", 1);
-        } else {
-            data.put("smart_inventory", 0);
-        }
-        //按媒体指定位置
-        if (null != advertiseLoaction && "media".equals(advertiseLoaction)) {
-            JSONArray inventoryType = template.getJSONArray("inventoryType");
-            data.put("inventory_type", inventoryType);
-        }
-        //按场景指定位置
-        if (null != advertiseLoaction && "sence".equals(advertiseLoaction)) {
-            data.put("scene_inventory", template.getString("sceneInventory"));
-        }
-        JSONArray creatives = new JSONArray();
 
-        //<a-radio-button value="">大图横图</a-radio-button>
-        String horizonImageUrl = template.getString("horizonImageUrl");
-        String horizonImageCreativeText = template.getString("horizonImageCreativeText");
-        if (null != horizonImageUrl && !"".equals(horizonImageUrl) && null != horizonImageCreativeText && !"".equals(horizonImageCreativeText)) {
-            JSONObject creative = new JSONObject();
-            creative.put("image_mode", "CREATIVE_IMAGE_MODE_LARGE");
-//            Map<String,Object> getImageResult = fileInfoService.uploadImageToBytedance(getAccountId,horizonImageUrl);
-//            JSONArray imageArray = (JSONArray) getImageResult.get("imageIds");
-//            web.business.image/201908015d0dd63849aa78f142989c70
-            JSONArray imageArray = new JSONArray();
-            imageArray.add("web.business.image/201908015d0dd63849aa78f142989c70");
-            creative.put("image_ids", imageArray);
-            creative.put("title", horizonImageCreativeText);
-            creatives.add(creative);
-        }
-        //<a-radio-button value="CREATIVE_IMAGE_MODE_VIDEO">横版视频</a-radio-button>
-        String horizonVideoUrl = template.getString("horizonVideoUrl");
-        String horizonVideoCoverImageUrl = template.getString("horizonVideoCoverImageUrl");
-        String horizonVideoCreativeText = template.getString("horizonVideoCreativeText");
-        if (null != horizonVideoUrl && !"".equals(horizonVideoUrl) && null != horizonVideoCoverImageUrl && !"".equals(horizonVideoCoverImageUrl) && null != horizonVideoCreativeText && !"".equals(horizonVideoCreativeText)) {
-            JSONObject creative = new JSONObject();
-            creative.put("image_mode", "CREATIVE_IMAGE_MODE_VIDEO");
-            Map<String, Object> getImageResult = fileInfoService.uploadImageToBytedance(getAccountId, horizonVideoCoverImageUrl);
-            JSONArray imageArray = (JSONArray) getImageResult.get("imageIds");
-            Map<String, Object> getVideoResult = fileInfoService.uploadVideoToBytedance(getAccountId, horizonVideoCreativeText);
-            String videoId = (String) getVideoResult.get("videoId");
-            creative.put("image_id", imageArray.getString(0));
-            creative.put("video_id", videoId);
-            creative.put("title", horizonVideoCreativeText);
-            creatives.add(creative);
-        }
-        //<a-radio-button value="CREATIVE_IMAGE_MODE_VIDEO_VERTICAL">竖版视频</a-radio-button>
-        String verticalVideoUrl = template.getString("verticalVideoUrl");
-        String verticalVideoCoverImageUrl = template.getString("verticalVideoCoverImageUrl");
-        String verticalVideoCreativeText = template.getString("verticalVideoCreativeText");
-        if (null != verticalVideoUrl && !"".equals(verticalVideoUrl) && null != verticalVideoCoverImageUrl && !"".equals(verticalVideoCoverImageUrl) && null != verticalVideoCreativeText && !"".equals(verticalVideoCreativeText)) {
-            JSONObject creative = new JSONObject();
-            creative.put("image_mode", "CREATIVE_IMAGE_MODE_VIDEO_VERTICAL");
-            Map<String, Object> getImageResult = fileInfoService.uploadImageToBytedance(getAccountId, verticalVideoCoverImageUrl);
-            JSONArray imageArray = (JSONArray) getImageResult.get("imageIds");
-            Map<String, Object> getVideoResult = fileInfoService.uploadVideoToBytedance(getAccountId, verticalVideoUrl);
-            String videoId = (String) getVideoResult.get("videoId");
-            creative.put("image_id", imageArray.getString(0));
-            creative.put("video_id", videoId);
-            creative.put("title", verticalVideoCreativeText);
-            creatives.add(creative);
-        }
-        //<a-radio-button value="CREATIVE_IMAGE_MODE_GROUP">组图</a-radio-button>
-        String groupImageUrl = template.getString("groupImageUrl");
-        String groupImageCreativeText = template.getString("groupImageCreativeText");
-        if (null != groupImageUrl && !"".equals(groupImageUrl) && null != groupImageCreativeText && !"".equals(groupImageCreativeText)) {
-            JSONObject creative = new JSONObject();
-            creative.put("image_mode", "CREATIVE_IMAGE_MODE_GROUP");
-            Map<String, Object> getImageResult = fileInfoService.uploadImageToBytedance(getAccountId, groupImageUrl);
-            JSONArray imageArray = (JSONArray) getImageResult.get("imageIds");
-            creative.put("image_ids", imageArray);
-            creative.put("title", groupImageCreativeText);
-            creatives.add(creative);
-        }
+                data.put("creatives", creatives);
 
-        //<a-radio-button value="CREATIVE_IMAGE_MODE_SMALL">小图</a-radio-button>
-        String smallImageUrl = template.getString("smallImageUrl");
-        String smallImageCreativeText = template.getString("smallImageCreativeText");
-        if (null != smallImageUrl && !"".equals(smallImageUrl) && null != smallImageCreativeText && !"".equals(smallImageCreativeText)) {
-            JSONObject creative = new JSONObject();
-            creative.put("image_mode", "CREATIVE_IMAGE_MODE_SMALL");
-            Map<String, Object> getImageResult = fileInfoService.uploadImageToBytedance(getAccountId, smallImageUrl);
-            JSONArray imageArray = (JSONArray) getImageResult.get("imageIds");
-            creative.put("image_ids", imageArray);
-            creative.put("title", smallImageCreativeText);
-            creatives.add(creative);
-        }
+                //应用下载详情页
+                data.put("web_url", template.getString("webUrl"));
+                //应用名
+                data.put("app_name", template.getString("appName"));
+                //广告评论
+                data.put("is_comment_disable ", template.getIntValue("isCommentDisable"));
+                //创意展现方式
+                data.put("creative_display_mode ", template.getString("creativeDisplayMode"));
+                //创意分类
+                JSONArray categorys = template.getJSONArray("adCategory");
+                String thirdIndustryId = categorys.getString(2);
+                data.put("third_industry_id", Integer.parseInt(thirdIndustryId));
+                //创意标签
+                data.put("ad_keywords", template.getJSONArray("adKeywords"));
+                String name = template.getString("name");
+                //创意标题
+                data.put("title", name + "_" + i + "_" + System.currentTimeMillis());
 
-        //<a-radio-button value="CREATIVE_IMAGE_MODE_LARGE_VERTICAL">大图竖图</a-radio-button>
-        String verticalImageUrl = template.getString("verticalImageUrl");
-        String verticalImageCreativeText = template.getString("verticalImageCreativeText");
-        if (null != verticalImageUrl && !"".equals(verticalImageUrl) && null != verticalImageCreativeText && !"".equals(verticalImageCreativeText)) {
-            JSONObject creative = new JSONObject();
-            creative.put("image_mode", "CREATIVE_IMAGE_MODE_LARGE_VERTICAL");
-//            Map<String,Object> getImageResult = fileInfoService.uploadImageToBytedance(getAccountId,verticalImageUrl);
-//            JSONArray imageArray = (JSONArray) getImageResult.get("imageIds");
-            JSONArray imageArray = new JSONArray();
-            imageArray.add("web.business.image/201908025d0d9292d0662227454294d5");
-            creative.put("image_ids", imageArray);
-            creative.put("title", verticalImageCreativeText);
-            creatives.add(creative);
+                resultMap = creativeCreate(getAccountId, planId, data.toJSONString());
+                createSuccess = (Boolean) resultMap.get("success");
+                if (null != createSuccess && !createSuccess) {
+                    return resultMap;
+                }
+            }
         }
-
-
-        data.put("creatives", creatives);
-
-        //应用下载详情页
-        data.put("web_url", template.getString("webUrl"));
-        //应用名
-        data.put("app_name", template.getString("appName"));
-        //广告评论
-        data.put("is_comment_disable ", template.getIntValue("isCommentDisable"));
-        //创意展现方式
-        data.put("creative_display_mode ", template.getString("creativeDisplayMode"));
-        //创意分类
-        JSONArray categorys = template.getJSONArray("adCategory");
-        String thirdIndustryId = categorys.getString(2);
-        data.put("third_industry_id", Integer.parseInt(thirdIndustryId));
-        //创意标签
-        data.put("ad_keywords", template.getJSONArray("adKeywords"));
-        //创意标题
-        data.put("title", "测试创意标题123" + System.currentTimeMillis());
-        return creativeCreate(getAccountId, planId, data.toJSONString());
+        ResultMapUtils.setResultMap(resultMap, StatusCode.COMMON_SUCCESS.getCode());
+        return resultMap;
     }
 
+
     @Autowired
     private IByteDanceAdvertiserDataService advertiserDataService;
 

+ 2 - 1
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/service/impl/BytedanceAdvertisePlanTemplateServiceImpl.java

@@ -84,7 +84,8 @@ public class BytedanceAdvertisePlanTemplateServiceImpl extends ServiceImpl<Byted
         //广告预算
         data.put("budget", budgetTemplate.getBudgetPrice());//需要大于bid
         //转化出价(ocpm请填写 cpa_bid)
-        data.put("bid", budgetTemplate.getBudgetPrice());
+        data.put("cpa_bid", budgetTemplate.getBudgetPrice());
+        data.put("convert_id", 92029616038L);
         //广告投放时间类型
         data.put("schedule_type", budgetTemplate.getFlowDateType());
         //广告投放开始时间

+ 1 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/service/impl/BytedanceDeliveryTargetTemplateServiceImpl.java

@@ -21,6 +21,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import javax.servlet.http.HttpServletRequest;
 import java.util.HashMap;
 import java.util.Map;
+import java.util.concurrent.ConcurrentLinkedDeque;
 
 /**
  * @Description: 投放目标模板信息

+ 24 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/vo/AdConvertVo.java

@@ -0,0 +1,24 @@
+package org.jeecg.modules.ctop.vo;
+
+import java.io.Serializable;
+
+public class AdConvertVo implements Serializable {
+    /**
+     * 广告主id
+     */
+    private Long advertiserId;
+    /**
+     * 落地页链接
+     */
+    private String externalUrl;
+    /**
+     * 安卓包名
+     */
+    private String packageName;
+    /**
+     * ios应用下载链接
+     */
+    private String itunesUrl;
+
+
+}