Просмотр исходного кода

Merge remote-tracking branch 'origin/master'

syh 4 лет назад
Родитель
Сommit
41e0f72b63

+ 7 - 0
module-common/src/main/java/cn/com/ctop/common/module/utils/RandomUtil.java

@@ -41,4 +41,11 @@ public class RandomUtil {
         return c;
     }
 
+    public static void main(String[] args) {
+        for (int i = 0; i < 1000; i++) {
+            System.err.println(verifyCodeV2());
+        }
+
+    }
+
 }

+ 1 - 1
module-job-bytedance/pom.xml

@@ -232,7 +232,7 @@
             </properties>
         </profile>
         <profile>
-            <id>prod</id>
+            <id>jiaoyang</id>
             <properties>
                 <activatedProperties>jiaoyang</activatedProperties>
             </properties>

+ 1 - 1
module-job-kuaishou/pom.xml

@@ -216,7 +216,7 @@
             </properties>
         </profile>
         <profile>
-            <id>prod</id>
+            <id>jiaoyang</id>
             <properties>
                 <activatedProperties>jiaoyang</activatedProperties>
             </properties>

+ 65 - 82
module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/batch/controller/CrossAccountBatchController.java

@@ -8,6 +8,7 @@ import cn.com.ctop.common.module.service.IProjectService;
 import cn.com.ctop.common.module.service.IUserAllocationService;
 import cn.com.ctop.common.module.utils.Check;
 import cn.com.ctop.kuaishou.modules.batch.Enums.CampaignTypeEnum;
+import cn.com.ctop.kuaishou.modules.batch.service.ICrossAccountBatchService;
 import cn.com.ctop.kuaishou.modules.batch.service.IKuaishouInterfaceService;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
@@ -43,7 +44,8 @@ public class CrossAccountBatchController {
     private IKuaishouInterfaceService kuaishouInterfaceService;
     @Autowired
     private IUserAllocationService userAllocationService;
-
+    @Autowired
+    private ICrossAccountBatchService crossAccountBatchService;
 
     /**
      * 批量创建广告计划
@@ -55,7 +57,6 @@ public class CrossAccountBatchController {
     public Result<JSONArray> campaignCreate(@RequestBody JSONObject requestJson) {
         Result<JSONArray> result = new Result<>();
         try {
-            System.err.println(requestJson);
             JSONArray accountArr = requestJson.getJSONArray("accountArr");
             if (Check.isNull(accountArr)) {
                 throw new Exception("请选择需要创建的账户");
@@ -190,122 +191,104 @@ public class CrossAccountBatchController {
     }
 
 
-
-
-
     /**
      * 批量创建广告组
      *
      * @param requestJson
      * @return
      */
-    @PostMapping(value = "/batchUnitCreate")
+    @PostMapping(value = "/crossAccountUnitCreate")
     public Result<JSONArray> batchUnitCreate(@RequestBody JSONObject requestJson) {
+        System.err.println(requestJson);
         Result<JSONArray> result = new Result<>();
         try {
-            System.err.println(requestJson);
+
+            if (Check.isNull(requestJson)) {
+                throw new Exception("参数不能为空");
+            }
             JSONArray accountArr = requestJson.getJSONArray("accountArr");
             if (Check.isNull(accountArr)) {
-                throw new Exception("请选择需要创建的账户");
+                throw new Exception("accountArr节点不能为空");
             }
-            JSONArray returnArr = new JSONArray();
 
+            JSONArray createUnitArr = new JSONArray();
             for (int i = 0; i < accountArr.size(); i++) {
-                Long accountId = accountArr.getLong(i);
-                CtopOauthToken oauthToken = oauthTokenService.getTokenByAccountId(accountId);
-                if (Check.isNull(oauthToken)) {
-                    throw new Exception("未获取到账户信息");
+                JSONObject accountJson = accountArr.getJSONObject(i);
+                if (Check.isNull(accountJson)) {
+                    continue;
                 }
-
-                JSONObject returnJson = new JSONObject();
-                returnJson.put("accountId", accountId);
-                JSONObject campaignJson = new JSONObject();
-                campaignJson.put("day_budget", requestJson.getLong("dayBudget"));
-                Integer nameType = requestJson.getInteger("nameType");
-                Integer type = requestJson.getInteger("type");
-                campaignJson.put("type", type);
-                if (!Check.isNull(requestJson.getLong("dayBudget"))) {
-                    campaignJson.put("day_budget", requestJson.getLong("dayBudget"));
+                Long accountId = accountJson.getLong("accountId");
+                if (Check.isNull(accountId)) {
+                    log.error("账户id不能为空");
+                    continue;
                 }
-
-                if (!Check.isNull(requestJson.getJSONArray("dayBudgetSchedule"))) {
-                    campaignJson.put("day_budget_schedule", requestJson.getJSONArray("dayBudgetSchedule"));
+                CtopOauthToken oauthToken = oauthTokenService.getTokenByAccountId(accountId);
+                if (Check.isNull(oauthToken)) {
+                    log.error("未获取到授权信息");
+                    continue;
                 }
-
-                JSONArray campaignNames = new JSONArray();
-                if (nameType == 0) { // 0 为统一命名  1 为分别命名
-                    //    Integer startNum = requestJson.getInteger("startNum");
-                    Integer createTotal = requestJson.getInteger("createTotal");
-                    String campaignName = requestJson.getString("campaignName");
-                    for (int j = 0; j < createTotal; j++) {
-                        if (campaignName.contains("{{数值}}")) {
-                            String name = getName(campaignName, accountId, j, type);
-                            campaignNames.add(name);
-                        } else {
-                            String name = null;
-                            if (createTotal == 1) {
-                                name = getName(campaignName, accountId, null, type);
-                            } else {
-                                name = getName(campaignName + "_" + j, accountId, null, type);
-                            }
-                            campaignNames.add(name);
-                        }
-                    }
-                } else if (nameType == 1) { // "分别命名"
-                    JSONArray nameArr = requestJson.getJSONArray("nameArr");
-                    for (int j = 0; j < nameArr.size(); j++) {
-                        JSONObject nameJson = nameArr.getJSONObject(j);
-                        if (nameJson.getLong("accountId").equals(accountId)) {
-                            campaignNames = nameJson.getJSONArray("campaignNames");
-                        }
+                Integer campaignAgreement = accountJson.getInteger("campaignAgreement");  //判断是否计划相同   0为相同取值campaignOne   1不同取值campaignList
+                if (campaignAgreement == 0) { // 计划下组相同
+                    JSONObject campaignOne = accountJson.getJSONObject("campaignOne");
+                    if (Check.isNull(campaignOne)) {
+                        continue;
                     }
-                }
-                if (!Check.isNull(campaignNames)) {
-                    JSONArray returnCampaigns = new JSONArray();
-                    for (int j = 0; j < campaignNames.size(); j++) {
-                        JSONObject returnCampaignJson = new JSONObject();
-                        String campaignName = (String) campaignNames.get(j);
-                        campaignJson.put("campaign_name", campaignName);
-                        Map<String, Object> campaignMap = kuaishouInterfaceService.campaignCreate(oauthToken.getAccessToken(), accountId, campaignJson);
-                        if ((Integer) campaignMap.get("code") == 0) {
-                            returnCampaignJson.put("code", 0);
-                            returnCampaignJson.put("campaignId", campaignMap.get("campaignId"));
-                            returnCampaignJson.put("campaignName", campaignName);
-                            returnCampaignJson.put("type", type);
-                            returnCampaignJson.put("message", campaignMap.get("message"));
-                        } else {
-                            returnCampaignJson.put("code", -1);
-                            returnCampaignJson.put("campaignName", campaignName);
-                            returnCampaignJson.put("message", campaignMap.get("message"));
-                        }
-                        returnCampaigns.add(returnCampaignJson);
+                    createUnitArr = crossAccountBatchService.assembleUnitJson(oauthToken, createUnitArr, campaignOne);
 
+                } else if (campaignAgreement == 1) { // 计划下组不同
+                    JSONArray campaignList = accountJson.getJSONArray("campaignList");
+                    if (Check.isNull(campaignList)) {
+                        continue;
                     }
-                    returnJson.put("createDetail", returnCampaigns);
-
+                    createUnitArr = crossAccountBatchService.assembleUnitArray(oauthToken, createUnitArr, campaignList);
                 }
-                returnArr.add(returnJson);
             }
+            JSONArray returnArray = crossAccountBatchService.createUnit(createUnitArr);
+            System.err.println(returnArray);
             result.setSuccess(true);
-            System.err.println(returnArr);
-            result.setResult(returnArr);
+            result.setResult(returnArray);
         } catch (Exception e) {
             e.printStackTrace();
-            result.setSuccess(false);
+            result.setSuccess(true);
             result.setMessage(e.getMessage());
-
         }
         return result;
 
     }
 
 
+    @PostMapping(value = "/crossAccountCreativeCreate")
+    public Result<JSONArray> crossAccountCreativeCreate(@RequestBody JSONObject requestJson) {
+        Result<JSONArray> result = new Result<>();
+        try {
+            System.err.println(requestJson);
 
+            if (Check.isNull(requestJson)) {
+                throw new Exception("参数不能为空");
+            }
+            JSONArray accountArr = requestJson.getJSONArray("accountArr");
+            if (Check.isNull(accountArr)) {
+                throw new Exception("accountArr节点不能为空");
+            }
+            JSONArray creativeArray = new JSONArray();
+            for (int i = 0; i < accountArr.size(); i++) {
+                JSONObject accountJson = accountArr.getJSONObject(i);
+                creativeArray = crossAccountBatchService.assembleCreativeJson(creativeArray, accountJson);
+            }
+            JSONArray returnArray = crossAccountBatchService.createCreative(creativeArray);
+            System.err.println(returnArray);
+            result.setSuccess(true);
+            result.setResult(returnArray);
 
+        } catch (Exception e) {
+            e.printStackTrace();
+            result.setSuccess(true);
+            result.setMessage(e.getMessage());
+        }
 
 
-
-
+        return result;
+    }
 
 
     /**

+ 55 - 0
module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/batch/service/ICrossAccountBatchService.java

@@ -0,0 +1,55 @@
+package cn.com.ctop.kuaishou.modules.batch.service;
+
+import cn.com.ctop.common.module.entity.CtopOauthToken;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+
+public interface ICrossAccountBatchService {
+    /**
+     * \
+     * 组装数据 JSON
+     *
+     * @param oauthToken
+     * @param createUnitArr
+     * @param campaignOne
+     * @return
+     */
+    JSONArray assembleUnitJson(CtopOauthToken oauthToken, JSONArray createUnitArr, JSONObject campaignOne);
+
+    /**
+     * 组装数据 JSONArray
+     *
+     * @param oauthToken
+     * @param createUnitArr
+     * @param campaignList
+     * @return
+     */
+    JSONArray assembleUnitArray(CtopOauthToken oauthToken, JSONArray createUnitArr, JSONArray campaignList);
+
+    /**
+     * 跨账户批量创建组
+     *
+     * @param createUnitArr
+     * @return
+     */
+
+    JSONArray createUnit(JSONArray createUnitArr);
+
+    /**
+     * 组装批量创建创意数据
+     *
+     * @param creativeArray
+     * @param accountJson
+     * @return
+     */
+    JSONArray assembleCreativeJson(JSONArray creativeArray, JSONObject accountJson);
+
+
+    /**
+     * 跨账户批量创建计划
+     *
+     * @param creativeArray
+     * @return
+     */
+    JSONArray createCreative(JSONArray creativeArray);
+}

+ 648 - 0
module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/batch/service/impl/CrossAccountBatchServiceImpl.java

@@ -0,0 +1,648 @@
+package cn.com.ctop.kuaishou.modules.batch.service.impl;
+
+import cn.com.ctop.common.module.entity.CtopOauthToken;
+import cn.com.ctop.common.module.service.ICtopOauthTokenService;
+import cn.com.ctop.common.module.utils.*;
+import cn.com.ctop.kuaishou.modules.batch.entity.KuaiShouImageGet;
+import cn.com.ctop.kuaishou.modules.batch.service.*;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.HashMap;
+import java.util.Map;
+
+@Slf4j
+@Service
+public class CrossAccountBatchServiceImpl implements ICrossAccountBatchService {
+
+
+    @Autowired
+    private IKuaiShouGroupService getKuaiShouGroupService;
+    @Autowired
+    private ICtopOauthTokenService oauthTokenService;
+    @Autowired
+    private IKuaiShouImageGetService imageGetService;
+    @Autowired
+    private IKuaiShouMaterialUploadService uploadService;
+    @Autowired
+    private IKuaiShouOverRunSendMessageService overRunSendMessageService;
+    @Autowired
+    private IKuaishouInterfaceService kuaishouInterfaceService;
+
+
+    /**
+     * 组装数据  jason
+     *
+     * @param oauthToken
+     * @param createUnitArr
+     * @param campaignOne
+     * @return
+     */
+    @Override
+    public JSONArray assembleUnitJson(CtopOauthToken oauthToken, JSONArray createUnitArr, JSONObject campaignOne) {
+        if (Check.isNull(campaignOne)) {
+            return createUnitArr;
+        }
+        JSONArray campaignIds = campaignOne.getJSONArray("campaignIds"); // 计划ids
+        if (Check.isNull(campaignIds)) {
+            return createUnitArr;
+
+        }
+        JSONObject createUnitJson = this.getCreateUnitJson(campaignOne);// 通用参数组装
+        JSONArray unitNames = campaignOne.getJSONArray("unitNames"); // 组名称集合
+        if (Check.isNull(unitNames)) {
+            return createUnitArr;
+        }
+        createUnitJson.put("advertiser_id", oauthToken.getAccountId());
+        createUnitJson.put("access_token", oauthToken.getAccessToken());
+        for (int i = 0; i < campaignIds.size(); i++) {
+            Long campaignId = campaignIds.getLong(i);
+            if (Check.isNull(campaignId)) {
+                continue;
+            }
+            for (int j = 0; j < unitNames.size(); j++) {
+                String unitName = unitNames.getString(j);
+                if (!Check.isNull(unitName)) {
+                    createUnitJson.remove("campaign_id");
+                    createUnitJson.remove("unit_name");
+                    createUnitJson.put("campaign_id", campaignId);
+                    createUnitJson.put("unit_name", unitName);
+                    createUnitArr.add(createUnitJson);
+                }
+            }
+        }
+        return createUnitArr;
+    }
+
+    /**
+     * 组装数据 array
+     *
+     * @param oauthToken
+     * @param createUnitArr
+     * @param campaignList
+     * @return
+     */
+    @Override
+    public JSONArray assembleUnitArray(CtopOauthToken oauthToken, JSONArray createUnitArr, JSONArray campaignList) {
+        for (int i = 0; i < campaignList.size(); i++) {
+            JSONObject campaignJson = campaignList.getJSONObject(i);
+            if (Check.isNull(campaignJson)) {
+                continue;
+            }
+            Long campaignId = campaignJson.getLong("campaignId");
+            Integer check = campaignJson.getInteger("check");
+            if (check == 1) { // 计划下组相同
+                JSONObject unitIdenticalJson = campaignJson.getJSONObject("unitIdentical");
+                if (Check.isNull(unitIdenticalJson)) {
+                    continue;
+                }
+                JSONArray unitNames = unitIdenticalJson.getJSONArray("unitName");
+                if (Check.isNull(unitNames)) {
+                    continue;
+                }
+
+                JSONObject createUnitJson = this.getCreateUnitJson(unitIdenticalJson);// 通用参数组装
+                for (int j = 0; j < unitNames.size(); j++) {
+                    String unitName = unitNames.getString(j);
+                    createUnitJson.put("advertiser_id", oauthToken.getAccountId());
+                    createUnitJson.put("access_token", oauthToken.getAccessToken());
+                    createUnitJson.remove("campaign_id");
+                    createUnitJson.remove("unit_name");
+                    createUnitJson.put("campaign_id", campaignId);
+                    createUnitJson.put("unit_name", unitName);
+                    createUnitArr.add(createUnitJson);
+                }
+            } else if (check == 2) {// 计划下组不同
+                JSONArray unitArray = campaignJson.getJSONArray("unit");
+                if (Check.isNull(unitArray)) {
+                    continue;
+                }
+                for (int j = 0; j < unitArray.size(); j++) {
+                    JSONObject unitJson = unitArray.getJSONObject(j);
+                    if (Check.isNull(unitJson)) {
+                        continue;
+                    }
+                    JSONObject createUnitJson = this.getCreateUnitJson(unitJson);// 通用参数组装
+                    createUnitJson.put("advertiser_id", oauthToken.getAccountId());
+                    createUnitJson.put("access_token", oauthToken.getAccessToken());
+                    createUnitJson.remove("campaign_id");
+                    createUnitJson.remove("unit_name");
+                    createUnitJson.put("campaign_id", campaignId);
+                    createUnitJson.put("unit_name", unitJson.getString("name"));
+                    createUnitArr.add(createUnitJson);
+                }
+            }
+        }
+        return createUnitArr;
+    }
+
+    /**
+     * 批量创建广告组
+     *
+     * @param createUnitArr
+     * @return
+     */
+    @Override
+    public JSONArray createUnit(JSONArray createUnitArr) {
+        JSONArray returnArr = new JSONArray();
+        for (int i = 0; i < createUnitArr.size(); i++) {
+            JSONObject createUnitJson = createUnitArr.getJSONObject(i);
+            if (Check.isNull(createUnitJson)) {
+                continue;
+            }
+            JSONObject resultJson = adUnitCreate(createUnitJson, 1);
+            returnArr.add(resultJson);
+
+        }
+        return returnArr;
+    }
+
+    /**
+     * 组装创建创意数据
+     *
+     * @param creativeArray
+     * @param accountJson
+     * @return
+     */
+    @Override
+    public JSONArray assembleCreativeJson(JSONArray creativeArray, JSONObject accountJson) {
+        if (Check.isNull(accountJson)) {
+            return creativeArray;
+        }
+        Long accountId = accountJson.getLong("accountId");
+        if (Check.isNull(accountId)) {
+            return creativeArray;
+        }
+        CtopOauthToken oauthToken = oauthTokenService.getTokenByAccountId(accountId);
+        if (Check.isNull(oauthToken)) {
+            return creativeArray;
+        }
+        Long unitId = accountJson.getLong("unitId");
+        if (Check.isNull(unitId)) {
+            return creativeArray;
+        }
+
+        JSONArray photoArr = accountJson.getJSONArray("photoArr");
+        if (Check.isNull(photoArr)) {
+            return creativeArray;
+        }
+
+
+        for (int i = 0; i < photoArr.size(); i++) {
+            JSONObject photoJson = photoArr.getJSONObject(i);
+            if (Check.isNull(photoJson)) {
+                continue;
+            }
+            JSONObject creativeJson = new JSONObject();
+            creativeJson.put("advertiser_id", oauthToken.getAccountId());
+            creativeJson.put("access_token", oauthToken.getAccessToken());
+            creativeJson.put("unit_id", unitId);
+            if (!Check.isNull(photoJson.getString("clickTrackUrl"))) {
+                creativeJson.put("click_track_url", photoJson.getString("clickTrackUrl")); //第三方点击检测链接
+            }
+            if (!Check.isNull(photoJson.getString("impressionUrl"))) {
+                creativeJson.put("impression_url", photoJson.getString("impressionUrl")); //第三方开始播放监测链接
+            }
+            if (!Check.isNull(photoJson.getString("adPhotoPlayedT3sUrl"))) {
+                creativeJson.put("ad_photo_played_t3s_url", photoJson.getString("adPhotoPlayedT3sUrl")); //第三方有效播放监测链接
+            }
+            if (!Check.isNull(photoJson.getString("actionbarClickUrl"))) {
+                creativeJson.put("actionbar_click_url", photoJson.getString("actionbarClickUrl")); //第三方点击按钮监测链接
+            }
+            if (!Check.isNull(photoJson.getInteger("creativeCategory"))) {
+                creativeJson.put("creative_category", photoJson.getInteger("creativeCategory")); // 创意分类
+            }
+            if (!Check.isNull(photoJson.getJSONArray("creativeTag"))) {
+                creativeJson.put("creative_tag", photoJson.getJSONArray("creativeTag")); //创意标签
+            }
+
+            Long creativeMaterialType = photoJson.getLong("creativeMaterialType");
+
+            JSONArray creatives = new JSONArray();
+            JSONObject createJson = new JSONObject();
+            if (!Check.isNull(photoJson.getString("creativeName"))) {
+                createJson.put("creative_name", photoJson.getString("creativeName")); // 创意名称
+            }
+            if (!Check.isNull(creativeMaterialType)) {
+                createJson.put("creative_material_type", creativeMaterialType); // 素材类型
+            }
+            if (!Check.isNull(photoJson.getString("actionBar_text"))) {
+                createJson.put("action_bar_text", photoJson.getString("actionBarText")); // 行动号召按钮文案
+            }
+            if (!Check.isNull(photoJson.getString("description"))) {
+                createJson.put("description", photoJson.getString("description")); // 广告语
+            }
+            if (!Check.isNull(photoJson.getString("stickerTitle"))) {
+                createJson.put("sticker_title", photoJson.getString("stickerTitle")); //封面广告语标题
+            }
+            if (!Check.isNull(photoJson.getString("overlayType"))) {
+                createJson.put("overlay_type", photoJson.getString("overlayType")); // 贴纸样式类型
+            }
+            if (!Check.isNull(photoJson.getString("exposeTag"))) {
+                createJson.put("expose_tag", photoJson.getString("exposeTag")); //广告标签
+            }
+            if (!Check.isNull(photoJson.getString("newExposeTag"))) {
+                createJson.put("new_expose_tag", photoJson.getString("newExposeTag")); // 广告标签2期
+            }
+            if (!Check.isNull(photoJson.getString("siteId"))) {
+                createJson.put("site_id", photoJson.getString("siteId")); //安卓下载中间页ID
+            }
+
+            String creativeName = photoJson.getString("creativeName");// 创意名称
+            if (4 == creativeMaterialType) { // 便利贴组装数据
+                if (!Check.isNull(photoJson.getString("shortSlogan"))) {
+                    createJson.put("short_slogan", photoJson.getString("shortSlogan")); // 便利贴创意短广告语
+                }
+                JSONArray imageTokens = photoJson.getJSONArray("imageTokens");
+                for (int j = 0; j < imageTokens.size(); j++) {
+                    String imageToken = imageTokens.getString(j);
+                    if (!Check.isNull(imageToken)) {
+                        createJson.put("image_tokens", imageToken); // 便利贴创意短广告语
+                        if (!Check.isNull(creativeName)) {
+                            createJson.put("creative_name", creativeName + "_" + RandomUtil.verifyCodeV2()); // 便利贴创意短广告语
+                        }
+                        creatives.add(createJson);
+                    }
+                }
+
+            } else { //  非便利贴组装数据
+                if (!Check.isNull(photoJson.getLong("photoId"))) {
+                    createJson.put("photo_id", photoJson.getLong("photoId")); // 视频id
+                }
+                JSONArray imageTokenArr = photoJson.getJSONArray("imageToken");
+                if (Check.isNull(imageTokenArr)) { // 如果图片为空 说明是首帧创建
+                    createJson.put("creative_name", creativeName); // 创意名称
+                    creatives.add(createJson);
+                } else { // 选择多张图片进行创建
+                    for (int j = 0; j < imageTokenArr.size(); j++) {
+                        String signature = imageTokenArr.getString(j);
+
+                        if (Check.isNull(signature)) {
+                            continue;
+                        }
+                        QueryWrapper<KuaiShouImageGet> queryWrapper = new QueryWrapper<>();
+                        queryWrapper.eq("account_id", accountId);
+                        queryWrapper.eq("signature", signature);
+                        queryWrapper.last("limit 1");
+                        String imageToken = null;
+                        KuaiShouImageGet imageGet = imageGetService.getOne(queryWrapper);
+                        if (!Check.isNull(imageGet)) {
+                            imageToken = imageGet.getImageToken();
+                        } else {
+                            String url = imageGetService.getUrlByCode(signature);
+                            imageToken = uploadService.kuauiShouImageUpload(url, signature, accountId, oauthToken.getAccessToken());
+                        }
+                        if (!Check.isNull(imageToken)) {
+                            createJson.put("image_token", imageToken); // 封面图片 token
+                        }
+                        String name = creativeName + "_" + RandomUtil.verifyCodeV2();
+                        createJson.put("creative_name", name); // 创意名称
+                        creatives.add(createJson);
+                    }
+
+                }
+
+
+            }
+            createJson.put("creatives", creatives);
+            creativeArray.add(createJson);
+        }
+
+        return creativeArray;
+    }
+
+    /**
+     * 跨账户批量创建计划
+     *
+     * @param creativeArray
+     * @return
+     */
+    @Override
+    public JSONArray createCreative(JSONArray creativeArray) {
+        JSONArray returnArr = new JSONArray();
+        for (int i = 0; i < creativeArray.size(); i++) {
+            JSONObject createUnitJson = creativeArray.getJSONObject(i);
+            if (Check.isNull(createUnitJson)) {
+                continue;
+            }
+            JSONObject resultJson = aCreativeCreate(createUnitJson, 1);
+            returnArr.add(resultJson);
+        }
+        return returnArr;
+    }
+
+    /**
+     * 调用快手创建接口
+     *
+     * @param requestJson
+     * @param count
+     * @return
+     */
+
+    private JSONObject adUnitCreate(JSONObject requestJson, Integer count) {
+        JSONObject returnJson = new JSONObject();
+        try {
+            if (Check.isNull(requestJson)) {
+                throw new Exception("参数不能为空");
+            }
+            String url = PropertiesUtils.getConfig("kuaishou_api_url") + KuaishouInterfaceConstant.AD_UNIT_CREATE;
+            Long advertiserId = requestJson.getLong("advertiser_id");
+            String accessToken = requestJson.getString("access_token");
+            Map<String, String> headers = new HashMap<>();
+            headers.put("Access-Token", accessToken);
+            headers.put("Content-Type", " application/json");
+            String result = HttpUtils.kuaiShouhttpPostRequest(url, requestJson.toJSONString(), headers);
+            JSONObject resultJson = JSONObject.parseObject(result);
+            log.info("快手创建广告组返回,accountId:{},返回结果:{}", requestJson.getString("advertiser_id"), resultJson);
+            if (!Check.isNull(resultJson)) {
+                Integer code = resultJson.getInteger("code");
+                if (code == 0) {
+                    JSONObject dataJson = resultJson.getJSONObject("data");
+                    if (!Check.isNull(dataJson)) {
+                        Long unitId = dataJson.getLong("unit_id");
+
+                        Thread thread = new Thread() {
+                            @Override
+                            public void run() {
+                                getKuaiShouGroupService.getGroupByUnitId(accessToken, advertiserId, unitId);
+                            }
+
+                        };
+                        thread.start();
+                        returnJson.put("code", 0);
+                        returnJson.put("accountId", requestJson.getLong("advertiser_id"));
+                        returnJson.put("unitId", unitId);
+                        returnJson.put("accountName", requestJson.getString("account_name"));
+                        returnJson.put("unitName", requestJson.getString("unit_name"));
+                        returnJson.put("sceneId", requestJson.getJSONArray("scene_id").toJSONString());
+                        returnJson.put("ocpxActionType", requestJson.getLong("ocpx_action_type"));
+                        returnJson.put("unitType", requestJson.getInteger("unit_type"));
+                    }
+
+                } else {
+
+                    if (code == 500000 && count <= 4) {
+                        adUnitCreate(requestJson, count + 1);
+                    }
+                    log.error("创建广告信息失败,advertiser_id:{},返回信息:{},入参:{}", advertiserId, resultJson, requestJson);
+                    returnJson.put("code", -1);
+                    returnJson.put("message", resultJson.getString("message"));
+                    returnJson.put("accountId", requestJson.getLong("advertiser_id"));
+                    returnJson.put("accountName", requestJson.getString("account_name"));
+                    returnJson.put("unitName", requestJson.getString("unit_name"));
+                }
+            } else {
+                if (count <= 4) {
+                    log.info("创建组失败,重试,入参:{}", requestJson);
+                    adUnitCreate(requestJson, count + 1);
+                }
+                log.error("快手创建广告计划返回内容为空,advertiser_id:{},入参:{}", advertiserId, requestJson);
+                returnJson.put("code", -1);
+                returnJson.put("message", "创建广告组异常,返回结果为空");
+                returnJson.put("accountName", requestJson.getString("account_name"));
+                returnJson.put("accountId", requestJson.getLong("advertiser_id"));
+                returnJson.put("unitName", requestJson.getString("unit_name"));
+
+            }
+        } catch (Exception e) {
+            log.error("创建广告计划失败,advertiser_id:{}", requestJson.getLong("advertiser_id"));
+            returnJson.put("code", -1);
+            returnJson.put("message", "创建广告组错误,系统异常");
+            returnJson.put("accountId", requestJson.getLong("advertiser_id"));
+            returnJson.put("accountName", requestJson.getString("account_name"));
+            returnJson.put("unitName", requestJson.getString("unit_name"));
+            returnJson.put("desc", "Interface exception");
+
+            e.printStackTrace();
+        }
+        return returnJson;
+    }
+
+    /**
+     * 创建创意
+     *
+     * @param
+     * @param
+     * @param requestJson
+     * @param count
+     * @return
+     */
+    private JSONObject aCreativeCreate(JSONObject requestJson, Integer count) {
+        JSONObject retuenJson = new JSONObject();
+        try {
+            Long advertiserId = requestJson.getLong("advertiser_id");
+            String accessToken = requestJson.getString("access_token");
+            String url = "https://ad.e.kuaishou.com/rest/openapi/v2/creative/batch/update";
+            requestJson.put("advertiser_id", advertiserId);
+            Map<String, String> header = new HashMap<String, String>();
+            header.put("Content-Type", " application/json");
+            header.put("Access-Token", accessToken);
+
+            String result = HttpUtils.kuaiShouhttpPostRequest(url, requestJson.toJSONString(), header);
+            JSONObject resultJson = JSONObject.parseObject(result);
+            log.info("快手创建创意返回:accountId:{},返回结果{}", requestJson.getLong("advertiser_id"), resultJson);
+            if (!Check.isNull(resultJson)) {
+                Integer code = resultJson.getInteger("code");
+                if (code == 0) {
+                    JSONObject dataJson = resultJson.getJSONObject("data");
+                    if (!Check.isNull(dataJson)) {
+                        JSONArray add_creative_ids = dataJson.getJSONArray("add_creative_ids");
+                        Thread thread = new Thread() {
+                            @Override
+                            public void run() {
+                                try {
+                                    Thread.sleep(100);
+                                    kuaishouInterfaceService.getCreativeByCreativeIds(accessToken, advertiserId, add_creative_ids);
+
+                                } catch (InterruptedException e) {
+                                    e.printStackTrace();
+                                }
+                            }
+                        };
+                        thread.start();
+                        retuenJson.put("code", 0);
+                        retuenJson.put("unit_id", requestJson.getString("unit_id"));
+                    }
+                } else {
+                    if (code == 500000 && count <= 4) {
+                        aCreativeCreate(requestJson, count + 1);
+                    }
+                    if (code == 400001 && "/rest/openapi/v2/creative/create已超日限".equals(resultJson.getString("message"))) {
+                        overRunSendMessageService.creativeOverRunSendMessage(advertiserId);
+                    }
+                    log.error("创建广告创意失败,advertiser_id:{},返回信息:{},入参:{}", advertiserId, resultJson, requestJson, count + 1);
+                    retuenJson.put("code", -1);
+                    retuenJson.put("message", resultJson.getString("message"));
+                    retuenJson.put("unit_id", requestJson.getString("unit_id"));
+                }
+            } else {
+                if (count <= 4) {
+                    aCreativeCreate(requestJson, count + 1);
+                }
+                log.error("快手创建广告创意返回内容为空,advertiser_id:{},入参:{}", advertiserId, requestJson);
+                retuenJson.put("code", -1);
+                retuenJson.put("message", "创建创意失败,返回信息为空");
+                retuenJson.put("unit_id", requestJson.getString("unit_id"));
+            }
+
+        } catch (Exception e) {
+            log.error("创建广告创意失败,advertiser_id:{}", requestJson.getLong("advertiser_id"));
+            retuenJson.put("code", -1);
+            retuenJson.put("message", e.getMessage());
+            retuenJson.put("unit_id", requestJson.getString("unit_id"));
+            e.printStackTrace();
+        }
+        return retuenJson;
+
+    }
+
+    /**
+     * 通用组创建数据组装
+     *
+     * @param campaignOne
+     * @return
+     */
+    private JSONObject getCreateUnitJson(JSONObject campaignOne) {
+        JSONObject createUnitJson = new JSONObject();
+
+
+        if (!Check.isNull(campaignOne.getString("accountName"))) {
+            createUnitJson.put("account_name", campaignOne.getString("accountName")); // 优化目标类型
+        }
+
+        if (!Check.isNull(campaignOne.getInteger("bidType"))) {
+            createUnitJson.put("bid_type", campaignOne.getInteger("bidType")); // 优化目标类型
+        }
+
+        if (!Check.isNull(campaignOne.getInteger("useAppMarket"))) {
+            createUnitJson.put("use_app_market", campaignOne.getInteger("useAppMarket")); //优先从系统应用商店下载
+        }
+        if (!Check.isNull(campaignOne.getJSONArray("appStore"))) {
+            createUnitJson.put("app_store", campaignOne.getJSONArray("appStore")); //应用商店列表
+        }
+        if (!Check.isNull(campaignOne.getLong("bid"))) {
+            createUnitJson.put("bid", campaignOne.getLong("bid")); //出价
+
+        }
+        if (!Check.isNull(campaignOne.getLong("cpaBid"))) {
+            createUnitJson.put("cpa_bid", campaignOne.getLong("cpaBid")); //出价
+
+        }
+        if (!Check.isNull(campaignOne.getInteger("smartBid"))) {
+            createUnitJson.put("smart_bid", campaignOne.getInteger("smartBid")); //优先低成本出价(设置条件)
+
+        }
+        if (!Check.isNull(campaignOne.getInteger("ocpxActionType"))) {
+            createUnitJson.put("ocpx_action_type", campaignOne.getInteger("ocpxActionType")); //优化目标
+
+        }
+        if (!Check.isNull(campaignOne.getInteger("deepConversionType"))) {
+            createUnitJson.put("deep_conversion_type", campaignOne.getInteger("deepConversionType")); //深度转化目标
+
+        }
+        if (!Check.isNull(campaignOne.getDouble("roiRatio"))) {
+            createUnitJson.put("roi_ratio", campaignOne.getDouble("roiRatio")); //付费ROI系数
+
+        }
+        if (!Check.isNull(campaignOne.getLong("deepConversionBid"))) {
+            createUnitJson.put("deep_conversion_bid", campaignOne.getLong("deepConversionBid")); //深度转化目标出价
+
+        }
+        if (!Check.isNull(campaignOne.getJSONArray("sceneId"))) {
+            createUnitJson.put("scene_id", campaignOne.getJSONArray("sceneId")); //资源位置
+
+        }
+        if (!Check.isNull(campaignOne.getInteger("unitType"))) {
+            createUnitJson.put("unit_type", campaignOne.getInteger("unitType")); //创意制作方式
+
+        }
+        if (!Check.isNull(campaignOne.getString("beginTime"))) {
+            createUnitJson.put("begin_time", campaignOne.getString("beginTime")); //投放开始时间
+
+        }
+        if (!Check.isNull(campaignOne.getString("endTime"))) {
+            createUnitJson.put("end_time", campaignOne.getString("endTime")); //投放结束时间
+
+        }
+        if (!Check.isNull(campaignOne.getString("scheduleTime"))) {
+            createUnitJson.put("schedule_time", campaignOne.getString("scheduleTime")); //投放时间段
+
+        }
+        if (!Check.isNull(campaignOne.getLong("dayBudget"))) {
+            createUnitJson.put("day_budget", campaignOne.getLong("dayBudget")); //单日预算金额
+
+        }
+        if (!Check.isNull(campaignOne.getJSONArray("dayBudgetSchedule"))) {
+            createUnitJson.put("day_budget_schedule", campaignOne.getJSONArray("dayBudgetSchedule")); //分日预算
+
+        }
+        if (!Check.isNull(campaignOne.getInteger("convert_id"))) {
+            createUnitJson.put("convert_id", campaignOne.getInteger("convert_id")); //转化目标ID
+
+        }
+        if (!Check.isNull(campaignOne.getString("url_type"))) {
+            createUnitJson.put("url_type", campaignOne.getString("url_type")); //url类型
+
+        }
+        if (!Check.isNull(campaignOne.getString("webUriType"))) {
+            createUnitJson.put("web_uri_type", campaignOne.getString("webUriType")); //url类型
+
+        }
+        if (!Check.isNull(campaignOne.getString("url"))) {
+            createUnitJson.put("url", campaignOne.getString("url")); // 投放链接
+
+        }
+        if (!Check.isNull(campaignOne.getString("schemaUri"))) {
+            createUnitJson.put("schema_uri", campaignOne.getString("schemaUri")); // 调起链接
+
+        }
+        if (!Check.isNull(campaignOne.getString("appId"))) {
+            createUnitJson.put("app_id", campaignOne.getString("appId")); // 应用ID
+
+        }
+        if (!Check.isNull(campaignOne.getInteger("showMode"))) {
+            createUnitJson.put("show_mode", campaignOne.getInteger("showMode")); // 创意展现方式
+
+        }
+        if (!Check.isNull(campaignOne.getInteger("speed"))) {
+            createUnitJson.put("speed", campaignOne.getInteger("speed")); // 投放方式
+
+        }
+        if (!Check.isNull(campaignOne.getInteger("siteType"))) {
+            createUnitJson.put("site_type", campaignOne.getInteger("siteType")); //预约广告
+
+        }
+        if (!Check.isNull(campaignOne.getInteger("giftData"))) {
+            createUnitJson.put("gift_data", campaignOne.getInteger("giftData")); //游戏礼包码
+
+        }
+        if (!Check.isNull(campaignOne.getBoolean("videoLandingPage"))) {
+            createUnitJson.put("video_landing_page", campaignOne.getBoolean("videoLandingPage")); //游戏礼包码
+
+        }
+        if (!Check.isNull(campaignOne.getBoolean("autoTarget"))) {
+            createUnitJson.put("auto_target", campaignOne.getBoolean("autoTarget")); //智能定向
+
+        }
+        if (!Check.isNull(campaignOne.getBoolean("smartCover"))) {
+            createUnitJson.put("smart_cover", campaignOne.getBoolean("smartCover")); //是否开启智能抽帧
+
+        }
+        if (!Check.isNull(campaignOne.getBoolean("assetMining"))) {
+            createUnitJson.put("asset_mining", campaignOne.getBoolean("assetMining")); //是否开启历史素材挖掘
+
+        }
+
+        if (!Check.isNull(campaignOne.getLong("templateId"))) {
+            createUnitJson.put("template_id", campaignOne.getLong("templateId")); //定向模板id
+        }
+
+        return createUnitJson;
+    }
+
+
+}