Ver código fonte

头条批量拉去代码

jiequan.bi 4 anos atrás
pai
commit
bf0f35a886
26 arquivos alterados com 1514 adições e 252 exclusões
  1. 56 0
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/batch/controller/ByteDanceBatchController.java
  2. 4 0
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/batch/mapper/testMapper.java
  3. 1 1
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/batch/service/IBytedanceGroupApiService.java
  4. 59 52
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/material/controller/ByteDanceAdvertisePlanController.java
  5. 140 0
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/material/controller/ByteDanceAudiencePackageController.java
  6. 88 187
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/material/entity/ByteDanceAdvertisePlan.java
  7. 145 0
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/material/entity/ByteDanceAudiencePackage.java
  8. 14 0
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/material/mapper/ByteDanceAudiencePackageMapper.java
  9. 5 0
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/material/mapper/xml/ByteDanceAudiencePackageMapper.xml
  10. 27 12
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/material/service/IByteDanceAdvertisePlanService.java
  11. 1 0
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/material/service/IByteDanceAdvertiserDataService.java
  12. 14 0
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/material/service/IByteDanceAudiencePackageService.java
  13. 19 0
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/material/service/impl/ByteDanceByteDanceAudiencePackageServiceImpl.java
  14. 23 0
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/tool/constants/AudiencePackageUrlConstant.java
  15. 23 0
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/tool/constants/InterestActionUrlConstant.java
  16. 38 0
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/tool/constants/QueryToolUrlConstant.java
  17. 12 0
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/tool/controller/ByteDanceQueryToolController.java
  18. 22 0
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/tool/service/IByteDanceAudiencePackageService.java
  19. 27 0
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/tool/service/IByteDanceInterestActionService.java
  20. 48 0
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/tool/service/IByteDanceQueryToolService.java
  21. 255 0
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/tool/service/impl/ByteDanceAudiencePackageServiceImpl.java
  22. 155 0
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/tool/service/impl/ByteDanceInterestActionServiceImpl.java
  23. 176 0
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/tool/service/impl/ByteDanceQueryToolServiceImpl.java
  24. 80 0
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/tool/util/JsonObjectToJsonStringUtil.java
  25. 80 0
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/tool/util/JsonStringToJsonObject.java
  26. 2 0
      module-toutiao/src/main/resources/bytedance_config.properties

+ 56 - 0
module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/batch/controller/ByteDanceBatchController.java

@@ -0,0 +1,56 @@
+package cn.com.ctop.toutiao.modules.batch.controller;
+
+import cn.com.ctop.toutiao.modules.material.entity.ByteDanceAdvertisePlan;
+import cn.com.ctop.toutiao.modules.material.service.IByteDanceAdvertisePlanService;
+import com.alibaba.fastjson.JSONObject;
+import lombok.extern.slf4j.Slf4j;
+import org.jeecg.common.api.vo.Result;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.ArrayList;
+import java.util.List;
+
+
+@Slf4j
+@RestController
+@RequestMapping("/bytedance/batch")
+public class ByteDanceBatchController {
+
+    @Autowired
+    IByteDanceAdvertisePlanService byteDanceAdvertisePlanService;
+
+    /**
+     *  批量创建计划
+     * @param byteDanceAdvertisePlan
+     * @param requestBody
+     * @return
+     */
+    @PostMapping(value = "/create/advertiserPlan")
+    public Result<List<ByteDanceAdvertisePlan>> add(@RequestBody ByteDanceAdvertisePlan byteDanceAdvertisePlan,
+                                                    @RequestBody JSONObject requestBody) {
+        Result<List<ByteDanceAdvertisePlan>> result = new Result<>();
+        List<ByteDanceAdvertisePlan> byteDanceAdvertisePlanList= new ArrayList<>();
+        if(requestBody.getJSONArray("accountIds").isEmpty()){
+            log.error("批量创建计划未选择账户");
+        }
+        requestBody.getJSONArray("accountIds").forEach(it->{
+            byteDanceAdvertisePlan.setAccountId(it.toString());
+            try {
+                //TODO 需要先存入头条后台
+                byteDanceAdvertisePlanService.save(byteDanceAdvertisePlan);
+                byteDanceAdvertisePlanList.add(byteDanceAdvertisePlan);
+                result.success("添加成功!");
+            } catch (Exception e) {
+                log.error(e.getMessage(), e);
+                result.error500("操作失败");
+            }
+        });
+        result.setResult(byteDanceAdvertisePlanList);
+        return result;
+    }
+
+    /**
+     *  批量创建创意
+     */
+}

+ 4 - 0
module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/batch/mapper/testMapper.java

@@ -0,0 +1,4 @@
+package cn.com.ctop.toutiao.modules.batch.mapper;
+
+public interface testMapper {
+}

+ 1 - 1
module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/batch/service/IBytedanceGroupApiService.java

@@ -8,6 +8,6 @@ import java.util.List;
 import java.util.Map;
 
 public interface IBytedanceGroupApiService {
-    List<ByteDanceCampaign> getGroupListByParams(CtopOauthToken token, JSONArray ids, String campaignName, String landingType, String status, String campaignCreateTime, Integer page, Integer pageSize);
+    List<ByteDanceCampaign> getGroupListByParams(CtopOauthToken token, JSONArray ids, String campaignName, String landingType, String status, String campaignCreateTime, int page, int pageSize);
     Map<String,Object>createGroup(CtopOauthToken token,String campaignName,String operation,String budgetMode,String budget,String landingType,String uniqueFk);
 }

+ 59 - 52
module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/material/controller/ByteDanceAdvertisePlanController.java

@@ -1,57 +1,63 @@
 package cn.com.ctop.toutiao.modules.material.controller;
 
+import cn.com.ctop.common.module.service.ICtopOauthTokenService;
 import cn.com.ctop.common.module.utils.StringUtils;
 import cn.com.ctop.toutiao.modules.material.entity.ByteDanceAdvertisePlan;
 import cn.com.ctop.toutiao.modules.material.service.IByteDanceAdvertisePlanService;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;
 import org.jeecg.common.api.vo.Result;
-import org.jeecg.common.aspect.annotation.AutoLog;
 import org.jeecg.common.system.query.QueryGenerator;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
-import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
 import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
 
 /**
- * @Description: 今日头条广告计划信息
- * @Author: jeecg-boot
- * @Date: 2019-07-22
- * @Version: V1.0
+ * 今日头条广告计划信息
  */
 @Slf4j
-@Api(tags = "今日头条广告计划信息")
 @RestController
 @RequestMapping("/ctop/byteDanceAdvertisePlan")
 public class ByteDanceAdvertisePlanController {
-    @Resource
+
+    @Autowired
+    ICtopOauthTokenService ctopOauthTokenService;
+
+    @Autowired
     private IByteDanceAdvertisePlanService byteDanceAdvertisePlanService;
 
     /**
      * 分页列表查询
-     *
-     * @param byteDanceAdvertisePlan
-     * @param pageNo
-     * @param pageSize
-     * @param req
-     * @return
      */
-    @AutoLog(value = "今日头条广告计划信息-分页列表查询")
-    @ApiOperation(value = "今日头条广告计划信息-分页列表查询", notes = "今日头条广告计划信息-分页列表查询")
     @GetMapping(value = "/list")
     public Result<IPage<ByteDanceAdvertisePlan>> queryPageList(ByteDanceAdvertisePlan byteDanceAdvertisePlan,
+                                                               @RequestParam(name = "accountId", defaultValue = "") String accountId,
                                                                @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
                                                                @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
                                                                HttpServletRequest req) {
         Result<IPage<ByteDanceAdvertisePlan>> result = new Result<>();
+        if(!accountId.isEmpty()){
+            byteDanceAdvertisePlan.setAccountId(accountId);
+        }
         QueryWrapper<ByteDanceAdvertisePlan> queryWrapper = QueryGenerator.initQueryWrapper(byteDanceAdvertisePlan, req.getParameterMap());
         Page<ByteDanceAdvertisePlan> page = new Page<>(pageNo, pageSize);
         IPage<ByteDanceAdvertisePlan> pageList = byteDanceAdvertisePlanService.page(page, queryWrapper);
+        //处理计划投放状态
+        if(!pageList.getRecords().isEmpty()){
+            pageList.getRecords().forEach(it->{
+                if(it.getToutiaoStatus().equals("AD_STATUS_DELIVERY_OK")){
+                    it.setStatus(true);
+                }else{
+                    it.setStatus(false);
+                }
+            });
+        }
         result.setSuccess(true);
         result.setResult(pageList);
         return result;
@@ -59,18 +65,19 @@ public class ByteDanceAdvertisePlanController {
 
     /**
      * 添加
-     *
-     * @param byteDanceAdvertisePlan
-     * @return
      */
-    @AutoLog(value = "今日头条广告计划信息-添加")
-    @ApiOperation(value = "今日头条广告计划信息-添加", notes = "今日头条广告计划信息-添加")
     @PostMapping(value = "/add")
-    public Result<ByteDanceAdvertisePlan> add(@RequestBody ByteDanceAdvertisePlan byteDanceAdvertisePlan) {
+    public Result<ByteDanceAdvertisePlan> add(@RequestBody ByteDanceAdvertisePlan byteDanceAdvertisePlan,
+                                              @RequestParam String landingType) {
         Result<ByteDanceAdvertisePlan> result = new Result<>();
         try {
-            byteDanceAdvertisePlanService.save(byteDanceAdvertisePlan);
-            result.success("添加成功!");
+            Map<String, Object> advertiserPlan = byteDanceAdvertisePlanService.createAdvertiserPlan(ctopOauthTokenService.getTokenByAccountId(Long.valueOf(byteDanceAdvertisePlan.getAccountId())), landingType, byteDanceAdvertisePlan);
+            if(advertiserPlan.get("code").equals(0)){
+                byteDanceAdvertisePlanService.save(byteDanceAdvertisePlan);
+                result.success("添加成功!");
+            }else {
+                result.error500(advertiserPlan.get("message").toString());
+            }
         } catch (Exception e) {
             log.error(e.getMessage(), e);
             result.error500("操作失败");
@@ -80,18 +87,13 @@ public class ByteDanceAdvertisePlanController {
 
     /**
      * 编辑
-     *
-     * @param byteDanceAdvertisePlan
-     * @return
      */
-    @AutoLog(value = "今日头条广告计划信息-编辑")
-    @ApiOperation(value = "今日头条广告计划信息-编辑", notes = "今日头条广告计划信息-编辑")
-    @PutMapping(value = "/edit")
+    @PostMapping(value = "/edit")
     public Result<ByteDanceAdvertisePlan> edit(@RequestBody ByteDanceAdvertisePlan byteDanceAdvertisePlan) {
         Result<ByteDanceAdvertisePlan> result = new Result<>();
         ByteDanceAdvertisePlan byteDanceAdvertisePlanEntity = byteDanceAdvertisePlanService.getById(byteDanceAdvertisePlan.getId());
         if (byteDanceAdvertisePlanEntity == null) {
-            result.error500("未找到对应实体");
+            result.error500("未找到数据");
         } else {
             boolean ok = byteDanceAdvertisePlanService.updateById(byteDanceAdvertisePlan);
             if (ok) {
@@ -104,20 +106,34 @@ public class ByteDanceAdvertisePlanController {
         return result;
     }
 
+    @PostMapping(value = "/batchEdit")
+    public Result<List<ByteDanceAdvertisePlan>> edit(@RequestBody List<ByteDanceAdvertisePlan> byteDanceAdvertisePlanList) {
+        Result<List<ByteDanceAdvertisePlan>> result = new Result<>();
+        byteDanceAdvertisePlanList.forEach(it->{
+            ByteDanceAdvertisePlan byteDanceAdvertisePlanEntity = byteDanceAdvertisePlanService.getById(it.getId());
+            if (byteDanceAdvertisePlanEntity == null) {
+                result.error500("未找到数据");
+            } else {
+                boolean ok = byteDanceAdvertisePlanService.updateById(it);
+                if (ok) {
+                    result.success("修改成功!");
+                }else {
+                    result.error500("未知错误");
+                }
+            }
+        });
+        result.setResult(byteDanceAdvertisePlanList);
+        return result;
+    }
+
     /**
      * 通过id删除
-     *
-     * @param id
-     * @return
      */
-    @AutoLog(value = "今日头条广告计划信息-通过id删除")
-    @ApiOperation(value = "今日头条广告计划信息-通过id删除", notes = "今日头条广告计划信息-通过id删除")
-    @DeleteMapping(value = "/delete")
+    @PostMapping(value = "/delete")
     public Result<?> delete(@RequestParam(name = "id", required = true) String id) {
         try {
             byteDanceAdvertisePlanService.removeById(id);
         } catch (Exception e) {
-            log.error("删除失败", e.getMessage());
             return Result.error("删除失败!");
         }
         return Result.ok("删除成功!");
@@ -125,15 +141,11 @@ public class ByteDanceAdvertisePlanController {
 
     /**
      * 批量删除
-     *
-     * @param ids
-     * @return
      */
-    @AutoLog(value = "今日头条广告计划信息-批量删除")
-    @ApiOperation(value = "今日头条广告计划信息-批量删除", notes = "今日头条广告计划信息-批量删除")
-    @DeleteMapping(value = "/deleteBatch")
+    @PostMapping(value = "/deleteBatch")
     public Result<ByteDanceAdvertisePlan> deleteBatch(@RequestParam(name = "ids", required = true) String ids) {
         Result<ByteDanceAdvertisePlan> result = new Result<>();
+
         if (ids == null || "".equals(ids.trim())) {
             result.error500("参数不识别!");
         } else {
@@ -145,18 +157,13 @@ public class ByteDanceAdvertisePlanController {
 
     /**
      * 通过id查询
-     *
-     * @param id
-     * @return
      */
-    @AutoLog(value = "今日头条广告计划信息-通过id查询")
-    @ApiOperation(value = "今日头条广告计划信息-通过id查询", notes = "今日头条广告计划信息-通过id查询")
     @GetMapping(value = "/queryById")
     public Result<ByteDanceAdvertisePlan> queryById(@RequestParam(name = "id", required = true) String id) {
         Result<ByteDanceAdvertisePlan> result = new Result<>();
         ByteDanceAdvertisePlan byteDanceAdvertisePlan = byteDanceAdvertisePlanService.getById(id);
         if (byteDanceAdvertisePlan == null) {
-            result.error500("未找到对应实体");
+            result.error500("未找到数据");
         } else {
             result.setResult(byteDanceAdvertisePlan);
             result.setSuccess(true);

+ 140 - 0
module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/material/controller/ByteDanceAudiencePackageController.java

@@ -0,0 +1,140 @@
+package cn.com.ctop.toutiao.modules.material.controller;
+
+import java.util.Arrays;
+import javax.servlet.http.HttpServletRequest;
+
+import cn.com.ctop.toutiao.modules.material.entity.ByteDanceAudiencePackage;
+import cn.com.ctop.toutiao.modules.material.service.IByteDanceAudiencePackageService;
+import cn.com.ctop.toutiao.modules.tool.util.JsonObjectToJsonStringUtil;
+import cn.com.ctop.toutiao.modules.tool.util.JsonStringToJsonObject;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.common.system.query.QueryGenerator;
+
+import lombok.extern.slf4j.Slf4j;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+ /**
+ * 头条定向包
+ */
+@Slf4j
+@RestController
+@RequestMapping("/ctop/audiencePackage")
+public class ByteDanceAudiencePackageController {
+
+	@Autowired
+	private IByteDanceAudiencePackageService audiencePackageService;
+
+	/**
+	 * 分页列表查询
+	 */
+	@GetMapping(value = "/list")
+	public Result<IPage<ByteDanceAudiencePackage>> queryPageList(ByteDanceAudiencePackage byteDanceAudiencePackage,
+																 @RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
+																 @RequestParam(name="pageSize", defaultValue="10") Integer pageSize,
+																 HttpServletRequest req) {
+		Result<IPage<ByteDanceAudiencePackage>> result = new Result<>();
+		QueryWrapper<ByteDanceAudiencePackage> queryWrapper = QueryGenerator.initQueryWrapper(byteDanceAudiencePackage, req.getParameterMap());
+		Page<ByteDanceAudiencePackage> page = new Page<>(pageNo, pageSize);
+		IPage<ByteDanceAudiencePackage> pageList = audiencePackageService.page(page, queryWrapper);
+		result.setSuccess(true);
+		result.setResult(pageList);
+		return result;
+	}
+
+	 /**
+	  * 通过id查询
+	  */
+	 @GetMapping(value = "/queryById")
+	 public Result<ByteDanceAudiencePackage> queryById(@RequestParam(name="id",required=true) Long id) {
+		 Result<ByteDanceAudiencePackage> result = new Result<>();
+		 ByteDanceAudiencePackage byteDanceAudiencePackage = JsonStringToJsonObject.toAudiencePackage(audiencePackageService.getById(id));
+		 result.setResult(byteDanceAudiencePackage);
+		 result.setSuccess(true);
+		 return result;
+	 }
+
+	 /**
+	  * 通过user_id查询
+	  */
+	 @GetMapping(value = "/queryByUserId")
+	 public Result<IPage<ByteDanceAudiencePackage>> queryByUserId(@RequestParam(name="userId",required=true) String userId,
+																 @RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
+																 @RequestParam(name="pageSize", defaultValue="10") Integer pageSize) {
+		 Result<IPage<ByteDanceAudiencePackage>> result = new Result<>();
+		 QueryWrapper<ByteDanceAudiencePackage> wrapper= new QueryWrapper<>();
+		 wrapper.eq("user_id",userId);
+		 Page<ByteDanceAudiencePackage> page = new Page<>(pageNo, pageSize);
+		 IPage<ByteDanceAudiencePackage> byteDanceAudiencePackagePage = audiencePackageService.page(page,wrapper);
+		 result.setResult(byteDanceAudiencePackagePage);
+		 result.setSuccess(true);
+		 return result;
+	 }
+
+	/**
+	 *  添加
+	 */
+	@PostMapping(value = "/add")
+	public Result<ByteDanceAudiencePackage> add(@RequestBody ByteDanceAudiencePackage byteDanceAudiencePackage) {
+		Result<ByteDanceAudiencePackage> result = new Result<>();
+		try {
+			audiencePackageService.save(JsonObjectToJsonStringUtil.toAudiencePackage(byteDanceAudiencePackage));
+			result.success("添加成功!");
+		} catch (Exception e) {
+			log.error(e.getMessage(),e);
+			result.error500("操作失败");
+		}
+		return result;
+	}
+
+	/**
+	 *  编辑
+	 */
+	@PostMapping(value = "/edit")
+	public Result<ByteDanceAudiencePackage> edit(@RequestBody ByteDanceAudiencePackage byteDanceAudiencePackage) {
+		Result<ByteDanceAudiencePackage> result = new Result<>();
+		ByteDanceAudiencePackage byteDanceAudiencePackageEntity = audiencePackageService.getById(byteDanceAudiencePackage.getId());
+		if(byteDanceAudiencePackageEntity ==null) {
+			result.error500("未找到数据");
+		}else {
+			boolean ok = audiencePackageService.updateById(JsonObjectToJsonStringUtil.toAudiencePackage(byteDanceAudiencePackage));
+			if(ok) {
+				result.success("修改成功!");
+			}
+		}
+		return result;
+	}
+
+	/**
+	 *  通过id删除
+	 */
+	@PostMapping(value = "/delete")
+	public Result<?> delete(@RequestParam(name="id",required=true) Long id) {
+		try {
+			audiencePackageService.removeById(id);
+		} catch (Exception e) {
+			return Result.error("删除失败!");
+		}
+		return Result.ok("删除成功!");
+	}
+
+	/**
+	 *  批量删除
+	 */
+	@PostMapping(value = "/deleteBatch")
+	public Result<ByteDanceAudiencePackage> deleteBatch(@RequestParam(name="ids",required=true) String ids) {
+		Result<ByteDanceAudiencePackage> result = new Result<>();
+		if(ids==null || "".equals(ids.trim())) {
+			result.error500("参数不识别!");
+		}else {
+			this.audiencePackageService.removeByIds(Arrays.asList(ids.split(",")));
+			result.success("删除成功!");
+		}
+		return result;
+	}
+
+}

+ 88 - 187
module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/material/entity/ByteDanceAdvertisePlan.java

@@ -1,5 +1,6 @@
 package cn.com.ctop.toutiao.modules.material.entity;
 
+import cn.com.ctop.common.module.annotation.Dict;
 import cn.com.ctop.common.module.utils.CtopAdConstant;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
@@ -29,209 +30,121 @@ import java.util.Date;
 @ApiModel(value = "ctop_bytedance_advertise_plan对象", description = "今日头条广告计划信息")
 public class ByteDanceAdvertisePlan {
 
-    /**
-     * 头条平台广告计划id
-     */
-    @TableId
-    @ApiModelProperty(value = "头条平台广告计划id")
+    // 头条平台广告计划id
     private Long id;
-    /**
-     * 平台广告主id
-     */
-    @Excel(name = "平台广告主id", width = 15)
-    @ApiModelProperty(value = "平台广告主id")
-    private String advertiserId;
-    /**
-     * 头条广告主id
-     */
-    @Excel(name = "头条广告主id", width = 15)
-    @ApiModelProperty(value = "头条广告主id")
-    private Long toutiaoId;
-    /**
-     * 计划名称
-     */
-    @Excel(name = "计划名称", width = 15)
-    @ApiModelProperty(value = "计划名称")
+
+
+    // 账户Id
+    @Dict(dicCode = "account_id",dictTable="ctop_user_allocation",dicText="auth_name")
+    private String accountId;
+
+    // 计划名称
     private String name;
-    /**
-     * 广告组id
-     */
-    @Excel(name = "广告组id", width = 15)
-    @ApiModelProperty(value = "广告组id")
+
+    // 广告组id
+    @Dict(dicCode = "campaign_id",dictTable="ctop_bytedance_campaign",dicText="name")
     private Long campaignId;
-    /**
-     * 上次修改时间戳(用于更新时提交,服务端判断是否基于最新信息修改)
-     */
-    @Excel(name = "上次修改时间戳(用于更新时提交,服务端判断是否基于最新信息修改)", width = 15)
-    @ApiModelProperty(value = "上次修改时间戳(用于更新时提交,服务端判断是否基于最新信息修改)")
+
+    private String operation;
+
+    private String unionVideoType;
+
+    // 上次修改时间戳(用于更新时提交,服务端判断是否基于最新信息修改)
     private String planModifyTime;
-    /**
-     * 投放范围
-     */
-    @Excel(name = "投放范围", width = 15)
-    @ApiModelProperty(value = "投放范围")
+
+    // 投放范围
     private String deliveryRange;
-    /**
-     * 计划上次修改时间
-     */
-    @Excel(name = "计划上次修改时间", width = 15)
-    @ApiModelProperty(value = "计划上次修改时间")
+
+    // 计划上次修改时间
     private String adModifyTime;
-    /**
-     * 计划创建时间
-     */
-    @Excel(name = "计划创建时间", width = 15)
-    @ApiModelProperty(value = "计划创建时间")
+
+    // 计划创建时间
     private String adCreateTime;
-    /**
-     * 广告预算类型
-     */
-    @Excel(name = "广告预算类型", width = 15)
-    @ApiModelProperty(value = "广告预算类型")
+
+    // 广告预算类型
     private String budgetMode;
-    /**
-     * 广告预算
-     */
-    @Excel(name = "广告预算", width = 15)
-    @ApiModelProperty(value = "广告预算")
+
+    // 广告预算
     private BigDecimal budget;
-    /**
-     * 广告计划投放状态
-     */
-    @Excel(name = "广告计划投放状态", width = 15)
-    @ApiModelProperty(value = "广告计划投放状态")
+
+    // 广告计划投放状态
     private String toutiaoStatus;
-    /**
-     * 广告计划操作状态
-     */
-    @Excel(name = "广告计划操作状态", width = 15)
-    @ApiModelProperty(value = "广告计划操作状态")
+
+    //true:投放中 false:暂停
+    private Boolean status;
+
+
+    // 广告计划操作状态
     private String optStatus;
-    /**
-     * 广告投放起始时间
-     */
-    @Excel(name = "广告投放起始时间", width = 15)
-    @ApiModelProperty(value = "广告投放起始时间")
+
+    // 广告投放起始时间
     private String startTime;
-    /**
-     * 广告投放结束时间
-     */
-    @Excel(name = "广告投放结束时间", width = 15)
-    @ApiModelProperty(value = "广告投放结束时间")
+
+    // 广告投放结束时间
     private String endTime;
-    /**
-     * 广告出价
-     */
-    @Excel(name = "广告出价", width = 15)
-    @ApiModelProperty(value = "广告出价")
+
+    // 广告出价
     private BigDecimal bid;
-    /**
-     * 广告出价类型
-     */
-    @Excel(name = "广告出价类型", width = 15)
-    @ApiModelProperty(value = "广告出价类型")
+
+    // 广告出价类型
     private String pricing;
-    /**
-     * 广告投放时间类型
-     */
-    @Excel(name = "广告投放时间类型", width = 15)
-    @ApiModelProperty(value = "广告投放时间类型")
+
+    // 广告投放时间类型
     private String scheduleType;
-    /**
-     * 广告投放时段
-     */
-    @Excel(name = "广告投放时段", width = 15)
-    @ApiModelProperty(value = "广告投放时段")
+
+    // 广告投放时段
     private String scheduleTime;
-    /**
-     * 广告投放速度类型
-     */
-    @Excel(name = "广告投放速度类型", width = 15)
-    @ApiModelProperty(value = "广告投放速度类型")
+
+    // 广告投放速度类型
     private String flowControlMode;
-    /**
-     * 应用直达链接
-     */
-    @Excel(name = "应用直达链接", width = 15)
-    @ApiModelProperty(value = "应用直达链接")
+
+    // 应用直达链接
     private String openUrl;
-    /**
-     * 应用下载方式
-     */
-    @Excel(name = "应用下载方式", width = 15)
-    @ApiModelProperty(value = "应用下载方式")
+
+    // 应用下载方式
     private String downloadType;
-    /**
-     * 广告落地页链接
-     */
-    @Excel(name = "广告落地页链接", width = 15)
-    @ApiModelProperty(value = "广告落地页链接")
+
+    // 广告落地页链接
     private String externalUrl;
-    /**
-     * 广告应用下载包名
-     */
-    @Excel(name = "广告应用下载包名", width = 15)
-    @ApiModelProperty(value = "广告应用下载包名")
+
+    // 广告应用下载包名
     private String toutiaoPackage;
-    /**
-     * 广告应用下载类型
-     */
-    @Excel(name = "广告应用下载类型", width = 15)
-    @ApiModelProperty(value = "广告应用下载类型")
+
+    // 广告应用下载类型
     private String appType;
-    /**
-     * 广告计划审核不通过原因
-     */
-    @Excel(name = "广告计划审核不通过原因", width = 15)
-    @ApiModelProperty(value = "广告计划审核不通过原因")
+
+    // 广告计划审核不通过原因
     private String auditRejectReason;
-    /**
-     * ocpc广告转化出价
-     */
-    @Excel(name = "ocpc广告转化出价", width = 15)
-    @ApiModelProperty(value = "ocpc广告转化出价")
+
+    // ocpc广告转化出价
     private BigDecimal cpaBid;
-    private BigDecimal deepCpabid;  // 深度优化出价
-    /**
-     * ocpc广告是否跳过第一阶段
-     */
-    @Excel(name = "ocpc广告是否跳过第一阶段", width = 15)
-    @ApiModelProperty(value = "ocpc广告是否跳过第一阶段")
+    private BigDecimal deepCpaBid;  // 深度优化出价
+
+    private String deepBidType;
+
     private Integer cpaSkipFirstPhrase;
-    /**
-     * 转化类型广告的转化工具id
-     */
-    @Excel(name = "转化类型广告的转化工具id", width = 15)
-    @ApiModelProperty(value = "转化类型广告的转化工具id")
+
+    // 转化类型广告的转化工具id
     private Long convertId;
-    /**
-     * 过滤已转化用户类型字段
-     */
-    @Excel(name = "过滤已转化用户类型字段", width = 15)
-    @ApiModelProperty(value = "过滤已转化用户类型字段")
+
+    // 过滤已转化用户类型字段
     private String hideIfConverted;
-    /**
-     * 过滤已安装,当推广目标为安卓应用下载时可填
-     */
-    @Excel(name = "过滤已安装,当推广目标为安卓应用下载时可填", width = 15)
-    @ApiModelProperty(value = "过滤已安装,当推广目标为安卓应用下载时可填")
+
+    // 过滤已安装,当推广目标为安卓应用下载时可填
     private Integer hideIfExists;
-    /**
-     * audience
-     */
-    @Excel(name = "audience", width = 15)
-    @ApiModelProperty(value = "audience")
+
+    private String convertedTimeDuration;
+
+    // audience
     private String audience;
-    @Excel(name = "上次修改时间", width = 15)
-    @ApiModelProperty(value = "上次修改时间")
+
+
     private String modifyTime;
-    /**
-     * 受众性别
-     */
+
+    // 受众性别
     private String gender;
-    /**
-     * 受众平台
-     */
+
+    // 受众平台
     private String platform;
 
     private Date createTime;
@@ -239,9 +152,8 @@ public class ByteDanceAdvertisePlan {
     private Date updateTime;
 
     public ByteDanceAdvertisePlan(JSONObject dataObject, String accountId) {
-        Long id = dataObject.getLong("id");
-        this.id = id;
-        this.advertiserId = accountId;
+        this.id = dataObject.getLong("id");
+        this.accountId = accountId;
         String name = dataObject.getString("name");
         if (null != name && !"".equals(name.trim())) {
             this.name = name;
@@ -276,9 +188,7 @@ public class ByteDanceAdvertisePlan {
         this.createTime = new Date();
         this.updateTime = new Date();
         Long advertiserId = dataObject.getLong("advertiser_id");
-        if (null != advertiserId) {
-            this.toutiaoId = advertiserId;
-        }
+
         Long campaignId = dataObject.getLong("campaign_id");
         if (null != campaignId) {
             this.campaignId = campaignId;
@@ -412,16 +322,11 @@ public class ByteDanceAdvertisePlan {
 
     public ByteDanceAdvertisePlan(String advertiserId, Long adId, JSONObject params) {
         this.id = adId;
-        this.advertiserId = advertiserId;
+        this.accountId = advertiserId;
         String name = params.getString("name");
         if (null != name && !"".equals(name.trim())) {
             this.name = name;
         }
-
-        Long toutiaoId = params.getLong("advertiser_id");
-        if (null != toutiaoId) {
-            this.toutiaoId = toutiaoId;
-        }
         Long campaignId = params.getLong("campaign_id");
         if (null != campaignId) {
             this.campaignId = campaignId;
@@ -546,10 +451,6 @@ public class ByteDanceAdvertisePlan {
         if (null != externalUrl && !"".equals(externalUrl.trim())) {
             this.externalUrl = externalUrl;
         }
-
-
-
-
     }
 
     public ByteDanceAdvertisePlan() {

+ 145 - 0
module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/material/entity/ByteDanceAudiencePackage.java

@@ -0,0 +1,145 @@
+package cn.com.ctop.toutiao.modules.material.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * 头条定向包
+ * @author jeecg-boot
+ * @date   2020-07-22
+ * @version V1.0
+ */
+@Data
+@TableName("ctop_bytedance_audience_package")
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value="ctop_bytedance_audience_package对象", description="头条定向包")
+public class ByteDanceAudiencePackage {
+    
+	/**汇创主键id*/
+	@TableId(type = IdType.AUTO)
+	private Long id;
+
+	/**账户Id*/
+	private String userId;
+
+	/**定向包名称*/
+	private String name;
+
+	/**定向包描述*/
+	private String description;
+
+	/**定向包类型*/
+	private String landingType;
+
+	/**投放范围*/
+	private String deliveryRange;
+
+	/**精选流量包*/
+	private String trafficPackage;
+
+	/**定向人群包列表,内容为人群包id*/
+	private Object retargetingTags;
+
+	/**排除人群包列表,内容为人群包id*/
+	private Object retargetingTagsExclude;
+
+	/**受众性别,允许值: GENDER_FEMALE,GENDER_MALE , NONE*/
+	private String gender;
+
+	/**	受众年龄区间,允许值: AGE_BETWEEN_18_23,AGE_BETWEEN_24_30,AGE_BETWEEN_31_40, AGE_BETWEEN_41_49,AGE_ABOVE_50*/
+	private Object age;
+
+	/**受众最低android版本*/
+	private String androidOsv;
+
+	/**受众最低ios版本*/
+	private String iosOsv;
+
+	/**受众运营商*/
+	private Object carrier;
+
+	/**受众网络类型*/
+	private Object ac;
+
+	/**受众手机品牌*/
+	private Object deviceBrand;
+
+	/**受众文章分类*/
+	private Object articleCategory;
+
+	/**用户首次激活时间*/
+	private Object activateType;
+
+	/**受众平台*/
+	private Object platform;
+
+	/**是否启动智能放量*/
+	private Integer autoExtendEnabled;
+
+	/**智能放量定向*/
+	private Object autoExtendTargets;
+
+	/**手机价格定向,传入价格区间,最高传入11000(表示1w以上)传值示例 "launch_price": [2000, 11000]*/
+	private Object launchPrice;
+
+	/**行为兴趣选择*/
+	private String interestActionMode;
+
+	/**行为场景*/
+	private Object actionScene;
+
+	/**行为天数,允许值:7, 15, 30, 60, 90, 180, 365*/
+	private Integer actionDays;
+
+	/**行为类目*/
+	private Object actionCategories;
+
+	/**行为关键词*/
+	private Object actionWords;
+
+	/**兴趣分类,如果传空数组 [] 表示不限,如果只传[0]表示系统推荐*/
+	private Object interestCategories;
+
+	/**兴趣关键词*/
+	private Object interestWords;
+
+	/**地域定向城市或者区县列表(当传递省份ID时,旗下市县ID可省略不传)*/
+	private Object city;
+
+	/**商圈ID数组	*/
+	private Object businessIds;
+
+	/**地域类型,前者为省市,后者为区县。当city有数据时,必填。*/
+	private String district;
+
+	/**受众位置类型,当city和district有值时,该字段必填*/
+	private String locationType;
+
+	/**需要传json对象!地图位置,district为BUSINESS_DISTRICT才有效*/
+	private Object geolocation;
+
+	/**(抖音推广特有)账号粉丝相似人群(添加抖音账号,会将广告投放给对应账号的相似人群粉丝)	*/
+	private Object awemeFansNumbers;
+
+	/**(抖音推广特有)过滤高活跃用户*/
+	private Integer filterAwemeAbnormalActive;
+
+	/**(抖音推广特有)过滤自己的粉丝,允许值:0表示不过滤,1表示过滤	*/
+	private Integer filterAwemeFansCount;
+
+	/**抖音号id,与aweme_fan_behaviors同时设置才会生效(抖音达人定向)	*/
+	private Object awemeFanAccounts;
+
+	private Object awemeFanCategories;
+
+	private Object awemeFanBehaviors;
+
+	/**过滤已安装,当推广目标为安卓应用下载时可填,0表示不过滤,1表示过滤,默认为不过滤*/
+	private Integer hideIfExists;
+}

+ 14 - 0
module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/material/mapper/ByteDanceAudiencePackageMapper.java

@@ -0,0 +1,14 @@
+package cn.com.ctop.toutiao.modules.material.mapper;
+
+import cn.com.ctop.toutiao.modules.material.entity.ByteDanceAudiencePackage;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * 头条定向包
+ * @author: jeecg-boot
+ * @date:   2020-07-22
+ * @cersion: V1.0
+ */
+public interface ByteDanceAudiencePackageMapper extends BaseMapper<ByteDanceAudiencePackage> {
+
+}

+ 5 - 0
module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/material/mapper/xml/ByteDanceAudiencePackageMapper.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="cn.com.ctop.toutiao.modules.material.mapper.ByteDanceAudiencePackageMapper">
+
+</mapper>

+ 27 - 12
module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/material/service/IByteDanceAdvertisePlanService.java

@@ -1,10 +1,14 @@
 package cn.com.ctop.toutiao.modules.material.service;
 
+import cn.com.ctop.common.module.entity.CtopOauthToken;
 import cn.com.ctop.toutiao.modules.material.entity.ByteDanceAdvertisePlan;
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.extension.service.IService;
+import jdk.nashorn.internal.scripts.JS;
 
 import java.math.BigDecimal;
 import java.util.List;
+import java.util.Map;
 
 /**
  * @Description: 今日头条广告计划信息
@@ -14,19 +18,30 @@ import java.util.List;
  */
 public interface IByteDanceAdvertisePlanService extends IService<ByteDanceAdvertisePlan> {
 
-    /**
-     *  查询需要预警的广告计划名称
-     * @param accountId
-     * @param maxBid
-     * @return
-     */
+    //获取广告计划  https://ad.oceanengine.com/open_api/2/ad/get/
+    Map<String, Object> getAdvertiserPlan(CtopOauthToken token, String ids, String date, String updateDate);
+
+    //创建广告计划  https://ad.oceanengine.com/open_api/2/ad/create/
+    Map<String, Object> createAdvertiserPlan(CtopOauthToken token, String landingType, ByteDanceAdvertisePlan byteDanceAdvertisePlan);
+
+    //修改广告计划  https://ad.oceanengine.com/open_api/2/ad/update/
+    Map<String, Object> updateAdvertiserPlan(CtopOauthToken token,String landingType, ByteDanceAdvertisePlan byteDanceAdvertisePlan);
+
+    //更新计划状态  https://ad.oceanengine.com/open_api/2/ad/update/status/
+    Map<String, Object> updateAdvertiserPlanStatus(CtopOauthToken token, String adIds,String optStatus);
+
+    //更新计划预算  https://ad.oceanengine.com/open_api/2/ad/update/budget/
+    Map<String, Object> updateAdvertiserPlanBudget(CtopOauthToken token, String adIds, String budgets);
+
+    //更新计划出价  https://ad.oceanengine.com/open_api/2/ad/update/bid/
+    Map<String, Object> updateAdvertiserPlanBid(CtopOauthToken token, String adIds,String bids);
+
+    //获取计划审核建议  https://ad.oceanengine.com/open_api/2/ad/reject_reason/
+    Map<String, Object> getAdvertiserPlanRejectReason(CtopOauthToken token, Long advertiserId, List<Long> adIds);
+
+    //查询需要预警的广告计划名称
     List<String> selectWarningGroup(Long accountId, BigDecimal maxBid);
 
-    /**
-     * 查询需要预警的深度转化出价
-     * @param accountId
-     * @param maxCapBid
-     * @return
-     */
+    //查询需要预警的深度转化出价
     List<String> selectWarningCpaBid(Long accountId, BigDecimal maxCapBid);
 }

+ 1 - 0
module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/material/service/IByteDanceAdvertiserDataService.java

@@ -9,6 +9,7 @@ import java.util.Map;
  * @author jeecg-boot
  */
 public interface IByteDanceAdvertiserDataService {
+
     JSONObject getAdvertiserList(String token, Long accountId);
 
     Map<String, Object> getAdvertiserInfo(String accountId, String token);

+ 14 - 0
module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/material/service/IByteDanceAudiencePackageService.java

@@ -0,0 +1,14 @@
+package cn.com.ctop.toutiao.modules.material.service;
+
+import cn.com.ctop.toutiao.modules.material.entity.ByteDanceAudiencePackage;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * 头条定向包
+ * @author jeecg-boot
+ * @date   2020-07-22
+ * @version V1.0
+ */
+public interface IByteDanceAudiencePackageService extends IService<ByteDanceAudiencePackage> {
+
+}

+ 19 - 0
module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/material/service/impl/ByteDanceByteDanceAudiencePackageServiceImpl.java

@@ -0,0 +1,19 @@
+package cn.com.ctop.toutiao.modules.material.service.impl;
+
+import cn.com.ctop.toutiao.modules.material.entity.ByteDanceAudiencePackage;
+import cn.com.ctop.toutiao.modules.material.mapper.ByteDanceAudiencePackageMapper;
+import cn.com.ctop.toutiao.modules.material.service.IByteDanceAudiencePackageService;
+import org.springframework.stereotype.Service;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+
+/**
+ * 头条定向包
+ * @author jeecg-boot
+ * @date   2020-07-22
+ * @version V1.0
+ */
+@Service
+public class ByteDanceByteDanceAudiencePackageServiceImpl extends ServiceImpl<ByteDanceAudiencePackageMapper, ByteDanceAudiencePackage> implements IByteDanceAudiencePackageService {
+
+}

+ 23 - 0
module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/tool/constants/AudiencePackageUrlConstant.java

@@ -0,0 +1,23 @@
+package cn.com.ctop.toutiao.modules.tool.constants;
+
+public class AudiencePackageUrlConstant {
+
+    //查询定向包
+    public static final String GET_AUDIENCE_PACKAGE="https://ad.oceanengine.com/open_api/2/audience_package/get/";
+
+    //创建定向包
+    public static final String CREATE_AUDIENCE_PACKAGE="https://ad.oceanengine.com/open_api/2/audience_package/create/";
+
+    //更新定向包
+    public static final String UPDATE_AUDIENCE_PACKAGE="https://ad.oceanengine.com/open_api/2/audience_package/update/";
+
+    //删除定向包
+    public static final String DELETE_AUDIENCE_PACKAGE="https://ad.oceanengine.com/open_api/2/audience_package/delete/";
+
+    //计划绑定定向包
+    public static final String BIND_AD_AUDIENCE_PACKAGE="https://ad.oceanengine.com/open_api/2/audience_package/ad/bind/";
+
+    //计划解绑定向包
+    public static final String UNBIND_AD_AUDIENCE_PACKAGE="https://ad.oceanengine.com/open_api/2/audience_package/ad/unbind/";
+
+}

+ 23 - 0
module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/tool/constants/InterestActionUrlConstant.java

@@ -0,0 +1,23 @@
+package cn.com.ctop.toutiao.modules.tool.constants;
+
+public class InterestActionUrlConstant {
+
+    //行为类目查询
+    public static final String INTEREST_ACTION_CATEGORY="https://ad.oceanengine.com/open_api/2/tools/interest_action/action/category/";
+
+    //行为关键词查询
+    public static final String INTEREST_ACTION_KEYWORD="https://ad.oceanengine.com/open_api/2/tools/interest_action/action/keyword/";
+
+    //兴趣类目查询
+    public static final String INTEREST_ACTION_INTEREST_CATEGORY="https://ad.oceanengine.com/open_api/2/tools/interest_action/interest/category/";
+
+    //兴趣关键词查询
+    public static final String INTEREST_ACTION_INTEREST_KEYWORD="https://ad.oceanengine.com/open_api/2/tools/interest_action/interest/keyword/";
+
+    //兴趣行为类目关键词id转词
+    public static final String INTEREST_ACTION_ID2WORD="https://ad.oceanengine.com/open_api/2/tools/interest_action/id2word/";
+
+    //获取行为兴趣推荐关键词
+    public static final String INTEREST_ACTION_KEYWORD_SUGGEST="https://ad.oceanengine.com/open_api/2/tools/interest_action/keyword/suggest/";
+
+}

+ 38 - 0
module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/tool/constants/QueryToolUrlConstant.java

@@ -0,0 +1,38 @@
+package cn.com.ctop.toutiao.modules.tool.constants;
+
+public class QueryToolUrlConstant {
+
+    //查询受众预估结果
+    public static final String ESTIMATE_AUDIENCE_URL="https://ad.oceanengine.com/open_api/2/tools/estimate_audience/";
+
+    //查询应用信息
+    public static final String APP_SEARCH_URL="https://ad.oceanengine.com/open_api/2/tools/app_search/";
+
+    //建议日预算及预期成本
+    public static final String BID_SUGGEST_URL="https://ad.oceanengine.com/open_api/2/tools/bid/suggest/";
+
+    //查询广告质量度
+    public static final String AD_QUALITY_URL="https://ad.oceanengine.com/open_api/2/tools/ad_quality/get/";
+
+    //获取行业列表
+    public static final String INDUSTRY_URL="https://ad.oceanengine.com/open_api/2/tools/industry/get/";
+
+    //获取地域列表
+    public static final String REGION_URL="https://ad.oceanengine.com/open_api/2/tools/region/get/";
+
+    //查询广告主门店
+    public static final String ADVERTISER_STORY_SEARCH="https://ad.oceanengine.com/open_api/2/tools/advertiser_store/search/";
+
+    //获取广告预览二维码
+    public static final String AD_PREVIEW_CODE="https://ad.oceanengine.com/open_api/2/tools/ad_preview/qrcode_get/";
+
+    //日志查询  可查询ad后台操作日志,默认查询最近7天的数据,最多查询跨度为半年。
+    public static final String LOG_SEARCH="https://ad.oceanengine.com/open_api/2/tools/log_search/";
+
+    //查询程序化创意包
+    public static final String PROCEDURAL_PACKAGE="https://ad.oceanengine.com/open_api/2/tools/procedural_package/get/";
+
+    //查询门店活动
+    public static final String ADVERTISER_STORE_PACK="https://ad.oceanengine.com/open_api/2/tools/advertiser_store/search_pack/";
+
+}

+ 12 - 0
module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/tool/controller/ByteDanceQueryToolController.java

@@ -0,0 +1,12 @@
+package cn.com.ctop.toutiao.modules.tool.controller;
+
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@Slf4j
+@RestController
+@RequestMapping("/ctop/audiencePackage")
+public class ByteDanceQueryToolController {
+
+}

+ 22 - 0
module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/tool/service/IByteDanceAudiencePackageService.java

@@ -0,0 +1,22 @@
+package cn.com.ctop.toutiao.modules.tool.service;
+
+import cn.com.ctop.common.module.entity.CtopOauthToken;
+import com.alibaba.fastjson.JSONObject;
+
+import java.util.Map;
+
+public interface IByteDanceAudiencePackageService {
+
+    Map<String,Object> getAudiencePackage(CtopOauthToken token,Long advertiserId, String landingType, String deliveryRange);
+
+    Map<String,Object> createAudiencePackage(CtopOauthToken token, Long advertiserId, JSONObject requestBody);
+
+    Map<String,Object> updateAudiencePackage(CtopOauthToken token, Long advertiserId,JSONObject requestBody);
+
+    Map<String,Object> deleteAudiencePackage(CtopOauthToken token,Long advertiserId, String landingType, String deliveryRange);
+
+    Map<String,Object> bindAdAudiencePackage(CtopOauthToken token,Long advertiserId, String landingType, String deliveryRange);
+
+    Map<String,Object> unbindAdAudiencePackage(CtopOauthToken token,Long advertiserId, String landingType, String deliveryRange);
+
+}

+ 27 - 0
module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/tool/service/IByteDanceInterestActionService.java

@@ -0,0 +1,27 @@
+package cn.com.ctop.toutiao.modules.tool.service;
+
+import cn.com.ctop.common.module.entity.CtopOauthToken;
+import com.alibaba.fastjson.JSONObject;
+
+import java.util.Map;
+
+public interface IByteDanceInterestActionService {
+
+    //行为类目查询  https://ad.oceanengine.com/open_api/2/tools/interest_action/action/category/
+    Map<String,Object> queryInterestActionCategory(CtopOauthToken token, JSONObject requestBody);
+
+    //行为关键词查询  https://ad.oceanengine.com/open_api/2/tools/interest_action/action/keyword/
+    Map<String,Object> queryInterestActionKeyword(CtopOauthToken token,JSONObject requestBody);
+
+    //兴趣类目查询  https://ad.oceanengine.com/open_api/2/tools/interest_action/interest/category/
+    Map<String,Object> queryInterestActionInterestCategory(CtopOauthToken token, JSONObject requestBody);
+
+    //兴趣关键词查询  https://ad.oceanengine.com/open_api/2/tools/interest_action/interest/keyword/
+    Map<String,Object> queryInterestActionInterestKeyword(CtopOauthToken token, JSONObject requestBody);
+
+    //兴趣行为类目关键词id转词  https://ad.oceanengine.com/open_api/2/tools/interest_action/id2word/
+    Map<String,Object> queryInterestActionId2Word(CtopOauthToken token, JSONObject requestBody);
+
+    //获取行为兴趣推荐关键词 https://ad.oceanengine.com/open_api/2/tools/interest_action/keyword/suggest/
+    Map<String,Object> queryInterestActionKeywordSuggest(CtopOauthToken token, JSONObject requestBody);
+}

+ 48 - 0
module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/tool/service/IByteDanceQueryToolService.java

@@ -0,0 +1,48 @@
+package cn.com.ctop.toutiao.modules.tool.service;
+
+import cn.com.ctop.common.module.entity.CtopOauthToken;
+import com.alibaba.fastjson.JSONObject;
+
+import java.util.List;
+import java.util.Map;
+
+public interface IByteDanceQueryToolService {
+
+    //查询受众预估结果  https://ad.oceanengine.com/open_api/2/tools/estimate_audience/
+    Map<String,Object> queryEstimateAudience(CtopOauthToken token, Long advertiserId, JSONObject requestBody);
+
+    //查询应用信息  https://ad.oceanengine.com/open_api/2/tools/app_search/
+    Map<String,Object> queryAppSearch(CtopOauthToken token,Long advertiserId,JSONObject requestBody);
+
+    //建议日预算及预期成本  https://ad.oceanengine.com/open_api/2/tools/bid/suggest/
+    Map<String,Object> queryBidSuggest(CtopOauthToken token,JSONObject requestBody);
+
+    //查询广告质量度  https://ad.oceanengine.com/open_api/2/tools/ad_quality/get/
+    Map<String,Object> queryAdQualityGet(CtopOauthToken token, Long advertiserId, List<Long> adIds);
+
+    /**
+     *  已经拉取到汇创后台
+     */
+    /*//获取行业列表  https://ad.oceanengine.com/open_api/2/tools/industry/get/
+    Map<String,Object> queryIndustryGet(CtopOauthToken token);
+
+    //获取地域列表  https://ad.oceanengine.com/open_api/2/tools/region/get/
+    Map<String,Object> queryRegionGet(CtopOauthToken token);*/
+
+    //查询广告主门店 https://ad.oceanengine.com/open_api/2/tools/advertiser_store/search/
+    Map<String,Object> queryAdvertiserStoreSearch(CtopOauthToken token, Long advertiserId, String type,String page,String pageSize);
+
+   /* //获取广告预览二维码  https://ad.oceanengine.com/open_api/2/tools/ad_preview/qrcode_get/
+    Map<String,Object> queryAdPreviewCodeGet(CtopOauthToken token);
+
+    //日志查询  可查询ad后台操作日志,默认查询最近7天的数据,最多查询跨度为半年。
+    //https://ad.oceanengine.com/open_api/2/tools/log_search/
+    Map<String,Object> queryLogSearch(CtopOauthToken token);*/
+
+    //查询程序化创意包  https://ad.oceanengine.com/open_api/2/tools/procedural_package/get/
+    Map<String,Object> queryProceduralPackageGet(CtopOauthToken token, Long advertiserId,JSONObject requestBody);
+
+    //查询门店活动  https://ad.oceanengine.com/open_api/2/tools/advertiser_store/search_pack/
+    Map<String,Object> queryAdvertiserStoreSearchPack(CtopOauthToken token);
+
+}

+ 255 - 0
module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/tool/service/impl/ByteDanceAudiencePackageServiceImpl.java

@@ -0,0 +1,255 @@
+package cn.com.ctop.toutiao.modules.tool.service.impl;
+
+import cn.com.ctop.common.module.entity.CtopOauthToken;
+import cn.com.ctop.common.module.utils.HttpUtils;
+import cn.com.ctop.toutiao.modules.tool.constants.AudiencePackageUrlConstant;
+import cn.com.ctop.toutiao.modules.tool.service.IByteDanceAudiencePackageService;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import java.util.HashMap;
+import java.util.Map;
+
+@Slf4j
+@Service
+public class ByteDanceAudiencePackageServiceImpl implements IByteDanceAudiencePackageService {
+
+    //TODO 定向包暂时不同步头条后台
+    @Override
+    public Map<String, Object> getAudiencePackage(CtopOauthToken token, Long advertiserId, String landingType, String deliveryRange) {
+        Map<String, Object> filtering = new HashMap<>();
+        if(!landingType.isEmpty()){
+            filtering.put("landing_type",landingType);
+        }
+        if(!deliveryRange.isEmpty()){
+            filtering.put("deliveryRange",deliveryRange);
+        }
+        JSONObject param = new JSONObject();
+        param.put("advertiser_id", advertiserId);
+        param.put("page", 1);
+        param.put("page_size", 50);
+        param.put("filtering", filtering);
+        String url= AudiencePackageUrlConstant.GET_AUDIENCE_PACKAGE;
+        JSONObject resultObject = HttpUtils.bytedanceGetRequest(token.getAccessToken(), url, param);
+        int code = resultObject.getInteger("code");
+        if (code != 0) {
+            log.error("获取定向包接口异常==》accountId:{},message:{}", token.getAccountId(), resultObject.getString("message"));
+        }
+        JSONArray data = resultObject.getJSONObject("data").getJSONArray("list");
+        //TODO 定向包是否入库
+        if (null != data && !data.isEmpty()) {
+            data.forEach(it->{
+
+            });
+        }
+        return null;
+    }
+
+    @Override
+    public Map<String, Object> createAudiencePackage(CtopOauthToken token, Long advertiserId,JSONObject requestBody) {
+
+        Map<String, String> headers = new HashMap<>();
+        headers.put("Content-Type", "application/json");
+        headers.put("Access-Token", token.getAccessToken());
+
+        /**
+         *  拼接创建定向包参数
+         */
+        JSONObject params = new JSONObject();
+        //必填参数
+        params.put("advertiser_id",advertiserId);
+        params.put("name",requestBody.getString("name"));
+        params.put("description",requestBody.getString("description"));
+        params.put("landing_type",requestBody.getString("landingType"));
+        //选填参数
+        if(requestBody.getJSONArray("retargetingTags")!=null){
+            params.put("retargeting_tags",requestBody.getJSONArray("retargetingTags"));
+        }
+        if(requestBody.getJSONArray("retargetingTagsExclude")!=null){
+            params.put("retargeting_tags_exclude",requestBody.getJSONArray("retargetingTagsExclude"));
+        }
+        //受众性别
+        params.put("gender",requestBody.getString("gender"));
+        if(requestBody.getJSONArray("age")!=null){
+            params.put("age",requestBody.getJSONArray("age"));
+        }
+        //受众最低ios版本
+        params.put("ios_osv",requestBody.getString("iosOsv"));
+        if(params.getJSONArray("carrier")!=null){
+            params.put("carrier",requestBody.getJSONArray("carrier"));
+        }
+        if(params.getJSONArray("ac")!=null){
+            params.put("ac",requestBody.getJSONArray("ac"));
+        }
+        if(params.getJSONArray("deviceBrand")!=null){
+            params.put("device_brand",requestBody.getJSONArray("deviceBrand"));
+        }
+        if(params.getJSONArray("articleCategory")!=null){
+            params.put("article_category",requestBody.getJSONArray("articleCategory"));
+        }
+        if(params.getJSONArray("activateType")!=null){
+            params.put("activate_type",requestBody.getJSONArray("activateType"));
+        }
+        if(params.getJSONArray("platform")!=null){
+            params.put("platform",requestBody.getJSONArray("platform"));
+        }
+        params.put("auto_extend_enabled",requestBody.getInteger("autoExtendEnabled"));
+        if(params.getJSONArray("autoExtendTargets")!=null){
+            params.put("auto_extend_targets",requestBody.getJSONArray("autoExtendTargets"));
+        }
+        if(params.getJSONArray("launchPrice")!=null){
+            params.put("launch_price",requestBody.getJSONArray("launchPrice"));
+        }
+        params.put("interest_action_mode",requestBody.getString("interestActionMode"));
+        if(params.getJSONArray("actionScene")!=null){
+            params.put("action_scene",requestBody.getJSONArray("actionScene"));
+        }
+        params.put("action_days",requestBody.getString("actionDays"));
+        if(params.getJSONArray("actionCategories")!=null){
+            params.put("action_categories",requestBody.getJSONArray("actionCategories"));
+        }
+        if(params.getJSONArray("actionWords")!=null){
+            params.put("action_words",requestBody.getJSONArray("actionWords"));
+        }
+        if(params.getJSONArray("interestCategories")!=null){
+            params.put("interest_categories",requestBody.getJSONArray("interestCategories"));
+        }
+        if(params.getJSONArray("interestWords")!=null){
+            params.put("interest_words",requestBody.getJSONArray("interestWords"));
+        }
+        if(params.getJSONArray("city")!=null){
+            params.put("city",requestBody.getJSONArray("city"));
+        }
+        if(params.getJSONArray("businessIds")!=null){
+            params.put("business_id" +
+                    "s",requestBody.getJSONArray("businessIds"));
+        }
+        params.put("district",requestBody.getString("district"));
+        params.put("location_type",requestBody.getString("locationType"));
+        if(params.getJSONArray("interestWords")!=null){
+            params.put("interest_words",requestBody.getJSONArray("interestWords"));
+        }
+        JSONObject jsonObject = JSONObject.parseObject(HttpUtils.httpPostRequest(AudiencePackageUrlConstant.CREATE_AUDIENCE_PACKAGE, params, headers));
+        Map<String,Object> resultMap=new HashMap<>();
+        if(jsonObject.getInteger("code")!=0){
+            log.error("创建定向包失败==》accountId:{},message:{}", token.getAccountId(), jsonObject.getString("message"));
+            resultMap.put("code", -1);
+            resultMap.put("message", jsonObject.getString("message"));
+            return resultMap;
+        }
+        resultMap.put("code", 0);
+        return resultMap;
+    }
+
+    @Override
+    public Map<String, Object> updateAudiencePackage(CtopOauthToken token, Long advertiserId,JSONObject requestBody) {
+
+        Map<String, String> headers = new HashMap<>();
+        headers.put("Content-Type", "application/json");
+        headers.put("Access-Token", token.getAccessToken());
+
+        JSONObject params = new JSONObject();
+        //必填参数
+        params.put("advertiser_id",advertiserId);
+        params.put("name",requestBody.getString("name"));
+        params.put("description",requestBody.getString("description"));
+        //修改的定向包Id
+        params.put("audience_package_id",requestBody.getString("audiencePackageId"));
+        //选填参数
+        if(requestBody.getJSONArray("retargetingTags")!=null){
+            params.put("retargeting_tags",requestBody.getJSONArray("retargetingTags"));
+        }
+        if(requestBody.getJSONArray("retargetingTagsExclude")!=null){
+            params.put("retargeting_tags_exclude",requestBody.getJSONArray("retargetingTagsExclude"));
+        }
+        //受众性别
+        params.put("gender",requestBody.getString("gender"));
+        if(requestBody.getJSONArray("age")!=null){
+            params.put("age",requestBody.getJSONArray("age"));
+        }
+        //受众最低ios版本
+        params.put("ios_osv",requestBody.getString("iosOsv"));
+        if(params.getJSONArray("carrier")!=null){
+            params.put("carrier",requestBody.getJSONArray("carrier"));
+        }
+        if(params.getJSONArray("ac")!=null){
+            params.put("ac",requestBody.getJSONArray("ac"));
+        }
+        if(params.getJSONArray("deviceBrand")!=null){
+            params.put("device_brand",requestBody.getJSONArray("deviceBrand"));
+        }
+        if(params.getJSONArray("articleCategory")!=null){
+            params.put("article_category",requestBody.getJSONArray("articleCategory"));
+        }
+        if(params.getJSONArray("activateType")!=null){
+            params.put("activate_type",requestBody.getJSONArray("activateType"));
+        }
+        if(params.getJSONArray("platform")!=null){
+            params.put("platform",requestBody.getJSONArray("platform"));
+        }
+        params.put("auto_extend_enabled",requestBody.getInteger("autoExtendEnabled"));
+        if(params.getJSONArray("autoExtendTargets")!=null){
+            params.put("auto_extend_targets",requestBody.getJSONArray("autoExtendTargets"));
+        }
+        if(params.getJSONArray("launchPrice")!=null){
+            params.put("launch_price",requestBody.getJSONArray("launchPrice"));
+        }
+        params.put("interest_action_mode",requestBody.getString("interestActionMode"));
+        if(params.getJSONArray("actionScene")!=null){
+            params.put("action_scene",requestBody.getJSONArray("actionScene"));
+        }
+        params.put("action_days",requestBody.getString("actionDays"));
+        if(params.getJSONArray("actionCategories")!=null){
+            params.put("action_categories",requestBody.getJSONArray("actionCategories"));
+        }
+        if(params.getJSONArray("actionWords")!=null){
+            params.put("action_words",requestBody.getJSONArray("actionWords"));
+        }
+        if(params.getJSONArray("interestCategories")!=null){
+            params.put("interest_categories",requestBody.getJSONArray("interestCategories"));
+        }
+        if(params.getJSONArray("interestWords")!=null){
+            params.put("interest_words",requestBody.getJSONArray("interestWords"));
+        }
+        if(params.getJSONArray("city")!=null){
+            params.put("city",requestBody.getJSONArray("city"));
+        }
+        if(params.getJSONArray("businessIds")!=null){
+            params.put("business_id" +
+                    "s",requestBody.getJSONArray("businessIds"));
+        }
+        params.put("district",requestBody.getString("district"));
+        params.put("location_type",requestBody.getString("locationType"));
+        if(params.getJSONArray("interestWords")!=null){
+            params.put("interest_words",requestBody.getJSONArray("interestWords"));
+        }
+
+        JSONObject jsonObject = JSONObject.parseObject(HttpUtils.httpPostRequest(AudiencePackageUrlConstant.UPDATE_AUDIENCE_PACKAGE, params, headers));
+        Map<String,Object> resultMap=new HashMap<>();
+        if(jsonObject.getInteger("code")!=0){
+            log.error("更新定向包失败==》accountId:{},message:{}", token.getAccountId(), jsonObject.getString("message"));
+            resultMap.put("code", -1);
+            resultMap.put("message", jsonObject.getString("message"));
+            return resultMap;
+        }
+        resultMap.put("code", 0);
+        return resultMap;
+    }
+
+    @Override
+    public Map<String, Object> deleteAudiencePackage(CtopOauthToken token, Long advertiserId, String landingType, String deliveryRange) {
+        return null;
+    }
+
+    @Override
+    public Map<String, Object> bindAdAudiencePackage(CtopOauthToken token, Long advertiserId, String landingType, String deliveryRange) {
+        return null;
+    }
+
+    @Override
+    public Map<String, Object> unbindAdAudiencePackage(CtopOauthToken token, Long advertiserId, String landingType, String deliveryRange) {
+        return null;
+    }
+}

+ 155 - 0
module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/tool/service/impl/ByteDanceInterestActionServiceImpl.java

@@ -0,0 +1,155 @@
+package cn.com.ctop.toutiao.modules.tool.service.impl;
+
+import cn.com.ctop.common.module.entity.CtopOauthToken;
+import cn.com.ctop.common.module.utils.HttpUtils;
+import cn.com.ctop.toutiao.modules.tool.constants.InterestActionUrlConstant;
+import cn.com.ctop.toutiao.modules.tool.service.IByteDanceInterestActionService;
+import com.alibaba.fastjson.JSONObject;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import java.util.HashMap;
+import java.util.Map;
+
+@Slf4j
+@Service
+public class ByteDanceInterestActionServiceImpl implements IByteDanceInterestActionService {
+
+    @Override
+    public Map<String, Object> queryInterestActionCategory(CtopOauthToken token, JSONObject requestBody) {
+
+        Map<String, String> headers = new HashMap<>();
+        headers.put("Content-Type", "application/json");
+        headers.put("Access-Token", token.getAccessToken());
+
+        JSONObject params=new JSONObject();
+        params.put("advertiser_id",requestBody.getLong("accountId"));
+        params.put("action_scene",requestBody.getJSONArray("actionScene"));
+        params.put("action_days",requestBody.getInteger("actionDays"));
+        JSONObject jsonObject = JSONObject.parseObject(HttpUtils.httpGetRequest(InterestActionUrlConstant.INTEREST_ACTION_CATEGORY, headers,params));
+        Map<String,Object> resultMap=new HashMap<>();
+        if(jsonObject.getInteger("code")!=0){
+            log.error("查询行为类目失败==》accountId:{},message:{}", token.getAccountId(), jsonObject.getString("message"));
+            resultMap.put("code", -1);
+            resultMap.put("message", jsonObject.getString("message"));
+            return resultMap;
+        }
+        resultMap.put("code", 0);
+        return resultMap;
+
+    }
+
+    @Override
+    public Map<String, Object> queryInterestActionKeyword(CtopOauthToken token, JSONObject requestBody) {
+
+        Map<String, String> headers = new HashMap<>();
+        headers.put("Content-Type", "application/json");
+        headers.put("Access-Token", token.getAccessToken());
+
+        JSONObject params=new JSONObject();
+        params.put("advertiser_id",requestBody.getLong("accountId"));
+        params.put("query_words",requestBody.getString("queryWords"));
+        params.put("action_scene",requestBody.getJSONArray("actionScene"));
+        params.put("action_days",requestBody.getInteger("actionDays"));
+
+        JSONObject jsonObject = JSONObject.parseObject(HttpUtils.httpGetRequest(InterestActionUrlConstant.INTEREST_ACTION_KEYWORD, headers,params));
+        Map<String,Object> resultMap=new HashMap<>();
+        if(jsonObject.getInteger("code")!=0){
+            log.error("查询行为关键词失败==》accountId:{},message:{}", token.getAccountId(), jsonObject.getString("message"));
+            resultMap.put("code", -1);
+            resultMap.put("message", jsonObject.getString("message"));
+            return resultMap;
+        }
+        resultMap.put("code", 0);
+        return resultMap;
+    }
+
+    @Override
+    public Map<String, Object> queryInterestActionInterestCategory(CtopOauthToken token, JSONObject requestBody) {
+
+        Map<String, String> headers = new HashMap<>();
+        headers.put("Content-Type", "application/json");
+        headers.put("Access-Token", token.getAccessToken());
+
+        JSONObject params=new JSONObject();
+        params.put("advertiser_id",requestBody.getLong("accountId"));
+
+        JSONObject jsonObject = JSONObject.parseObject(HttpUtils.httpGetRequest(InterestActionUrlConstant.INTEREST_ACTION_INTEREST_CATEGORY, headers,params));
+        Map<String,Object> resultMap=new HashMap<>();
+        if(jsonObject.getInteger("code")!=0){
+            log.error("查询行为类目失败==》accountId:{},message:{}", token.getAccountId(), jsonObject.getString("message"));
+            resultMap.put("code", -1);
+            resultMap.put("message", jsonObject.getString("message"));
+            return resultMap;
+        }
+        resultMap.put("code", 0);
+        return resultMap;
+    }
+
+    @Override
+    public Map<String, Object> queryInterestActionInterestKeyword(CtopOauthToken token, JSONObject requestBody) {
+
+        Map<String, String> headers = new HashMap<>();
+        headers.put("Content-Type", "application/json");
+        headers.put("Access-Token", token.getAccessToken());
+
+        JSONObject params=new JSONObject();
+        params.put("advertiser_id",requestBody.getLong("accountId"));
+        params.put("action_scene",requestBody.getJSONArray("actionScene"));
+        params.put("action_days",requestBody.getInteger("actionDays"));
+        JSONObject jsonObject = JSONObject.parseObject(HttpUtils.httpGetRequest(InterestActionUrlConstant.INTEREST_ACTION_CATEGORY, headers,params));
+        Map<String,Object> resultMap=new HashMap<>();
+        if(jsonObject.getInteger("code")!=0){
+            log.error("查询行为类目失败==》accountId:{},message:{}", token.getAccountId(), jsonObject.getString("message"));
+            resultMap.put("code", -1);
+            resultMap.put("message", jsonObject.getString("message"));
+            return resultMap;
+        }
+        resultMap.put("code", 0);
+        return resultMap;
+    }
+
+    @Override
+    public Map<String, Object> queryInterestActionId2Word(CtopOauthToken token, JSONObject requestBody) {
+        Map<String, String> headers = new HashMap<>();
+        headers.put("Content-Type", "application/json");
+        headers.put("Access-Token", token.getAccessToken());
+
+        JSONObject params=new JSONObject();
+        params.put("advertiser_id",requestBody.getLong("accountId"));
+        params.put("action_scene",requestBody.getJSONArray("actionScene"));
+        params.put("action_days",requestBody.getInteger("actionDays"));
+        JSONObject jsonObject = JSONObject.parseObject(HttpUtils.httpGetRequest(InterestActionUrlConstant.INTEREST_ACTION_CATEGORY, headers,params));
+        Map<String,Object> resultMap=new HashMap<>();
+        if(jsonObject.getInteger("code")!=0){
+            log.error("查询行为类目失败==》accountId:{},message:{}", token.getAccountId(), jsonObject.getString("message"));
+            resultMap.put("code", -1);
+            resultMap.put("message", jsonObject.getString("message"));
+            return resultMap;
+        }
+        resultMap.put("code", 0);
+        return resultMap;
+    }
+
+    @Override
+    public Map<String, Object> queryInterestActionKeywordSuggest(CtopOauthToken token, JSONObject requestBody) {
+        Map<String, String> headers = new HashMap<>();
+        headers.put("Content-Type", "application/json");
+        headers.put("Access-Token", token.getAccessToken());
+
+        JSONObject params=new JSONObject();
+        params.put("advertiser_id",requestBody.getLong("accountId"));
+        params.put("action_scene",requestBody.getJSONArray("actionScene"));
+        params.put("action_days",requestBody.getInteger("actionDays"));
+        JSONObject jsonObject = JSONObject.parseObject(HttpUtils.httpGetRequest(InterestActionUrlConstant.INTEREST_ACTION_CATEGORY, headers,params));
+        Map<String,Object> resultMap=new HashMap<>();
+        if(jsonObject.getInteger("code")!=0){
+            log.error("查询行为类目失败==》accountId:{},message:{}", token.getAccountId(), jsonObject.getString("message"));
+            resultMap.put("code", -1);
+            resultMap.put("message", jsonObject.getString("message"));
+            return resultMap;
+        }
+        resultMap.put("code", 0);
+        return resultMap;
+    }
+}

+ 176 - 0
module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/tool/service/impl/ByteDanceQueryToolServiceImpl.java

@@ -0,0 +1,176 @@
+package cn.com.ctop.toutiao.modules.tool.service.impl;
+
+import cn.com.ctop.common.module.entity.CtopOauthToken;
+import cn.com.ctop.common.module.utils.HttpUtils;
+import cn.com.ctop.toutiao.modules.tool.constants.QueryToolUrlConstant;
+import cn.com.ctop.toutiao.modules.tool.service.IByteDanceQueryToolService;
+import com.alibaba.fastjson.JSONObject;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ *  Created by JQ.bi on 2020.07.17
+ */
+@Slf4j
+@Service
+public class ByteDanceQueryToolServiceImpl implements IByteDanceQueryToolService {
+
+    //TODO 查询受众预估结果
+    @Override
+    public Map<String, Object> queryEstimateAudience(CtopOauthToken token,Long advertiserId,JSONObject requestBody) {
+
+        Map<String, String> headers = new HashMap<>();
+        headers.put("Content-Type", "application/json");
+        headers.put("Access-Token", token.getAccessToken());
+
+        JSONObject params=new JSONObject();
+        if(requestBody.getString("retargetingType")!=null)
+            params.put("retargetingType",requestBody.getString("retargetingType"));
+        if(requestBody.getJSONArray("retargetingType")!=null)
+            params.put("retargetingTags",requestBody.getString("retargetingTags"));
+        if(requestBody.getJSONArray("retargetingTagsInclude")!=null)
+            params.put("retargetingTagsInclude",requestBody.getString("retargetingTagsInclude"));
+        if(requestBody.getJSONArray("retargetingTagsExclude")!=null)
+            params.put("retargetingTagsExclude",requestBody.getString("retargetingTagsExclude"));
+        if(requestBody.getString("gender")!=null)
+            params.put("gender",requestBody.getString("gender"));
+        if(requestBody.getJSONArray("age")!=null)
+            params.put("age",requestBody.getString("age"));
+        JSONObject jsonObject = JSONObject.parseObject(HttpUtils.httpPostRequest(QueryToolUrlConstant.ESTIMATE_AUDIENCE_URL, params, headers));
+        return null;
+    }
+
+    @Override
+    public Map<String, Object> queryAppSearch(CtopOauthToken token,Long advertiserId,JSONObject requestBody) {
+
+        Map<String, String> headers = new HashMap<>();
+        headers.put("Content-Type", "application/json");
+        headers.put("Access-Token", token.getAccessToken());
+
+        JSONObject params=new JSONObject();
+        params.put("advertiser_id",advertiserId);
+        if(requestBody.getString("searchBy").equals("APP_NAME")){
+            params.put("advertiser_id",requestBody.getString("advertiserId"));
+            params.put("app_name",requestBody.getString("appName"));
+        }else {
+            params.put("advertiser_id",requestBody.getString("advertiserId"));
+            params.put("app_id",requestBody.getLong("appId"));
+        }
+        JSONObject jsonObject = JSONObject.parseObject(HttpUtils.httpPostRequest(QueryToolUrlConstant.APP_SEARCH_URL, params, headers));
+        Map<String,Object> resultMap=new HashMap<>();
+        if(jsonObject.getInteger("code")!=0){
+            log.error("查询应用信息失败==》accountId:{},message:{}", token.getAccountId(), jsonObject.getString("message"));
+            resultMap.put("code", -1);
+            resultMap.put("message", jsonObject.getString("message"));
+            return resultMap;
+        }
+        resultMap.put("code", 0);
+        return resultMap;
+    }
+
+    //TODO 建议日预算及预期成本
+    @Override
+    public Map<String, Object> queryBidSuggest(CtopOauthToken token,JSONObject requestBody) {
+
+        Map<String, String> headers = new HashMap<>();
+        headers.put("Content-Type", "application/json");
+        headers.put("Access-Token", token.getAccessToken());
+
+        JSONObject params=new JSONObject();
+        JSONObject jsonObject = JSONObject.parseObject(HttpUtils.httpPostRequest(QueryToolUrlConstant.BID_SUGGEST_URL, params, headers));
+        Map<String,Object> resultMap=new HashMap<>();
+        if(jsonObject.getInteger("code")!=0){
+            log.error("建议日预算及预期成本失败==》accountId:{},message:{}", token.getAccountId(), jsonObject.getString("message"));
+            resultMap.put("code", -1);
+            resultMap.put("message", jsonObject.getString("message"));
+            return resultMap;
+        }
+        resultMap.put("code", 0);
+        return resultMap;
+    }
+
+    @Override
+    public Map<String, Object> queryAdQualityGet(CtopOauthToken token, Long advertiserId, List<Long> adIds) {
+
+        Map<String, String> headers = new HashMap<>();
+        headers.put("Content-Type", "application/json");
+        headers.put("Access-Token", token.getAccessToken());
+
+        JSONObject params=new JSONObject();
+        params.put("advertiser_id",advertiserId);
+        params.put("ad_ids",adIds);
+        JSONObject jsonObject = JSONObject.parseObject(HttpUtils.httpPostRequest(QueryToolUrlConstant.AD_QUALITY_URL, params, headers));
+        Map<String,Object> resultMap=new HashMap<>();
+        if(jsonObject.getInteger("code")!=0){
+            log.error("查询广告质量度失败==》accountId:{},message:{}", token.getAccountId(), jsonObject.getString("message"));
+            resultMap.put("code", -1);
+            resultMap.put("message", jsonObject.getString("message"));
+            return resultMap;
+        }
+        resultMap.put("code", 0);
+        return resultMap;
+    }
+
+
+    @Override
+    public Map<String, Object> queryAdvertiserStoreSearch(CtopOauthToken token, Long advertiserId, String type,String page,String pageSize) {
+
+        Map<String, String> headers = new HashMap<>();
+        headers.put("Content-Type", "application/json");
+        headers.put("Access-Token", token.getAccessToken());
+
+        JSONObject params=new JSONObject();
+        params.put("advertiser_id",advertiserId);
+        params.put("type",type);
+        params.put("page",page);
+        params.put("page_size",pageSize);
+        JSONObject jsonObject = JSONObject.parseObject(HttpUtils.httpPostRequest(QueryToolUrlConstant.ADVERTISER_STORY_SEARCH, params, headers));
+        Map<String,Object> resultMap=new HashMap<>();
+        if(jsonObject.getInteger("code")!=0){
+            log.error("查询门店失败==》accountId:{},message:{}", token.getAccountId(), jsonObject.getString("message"));
+            resultMap.put("code", -1);
+            resultMap.put("message", jsonObject.getString("message"));
+            return resultMap;
+        }
+        resultMap.put("code", 0);
+        return resultMap;
+    }
+
+    @Override
+    public Map<String, Object> queryProceduralPackageGet(CtopOauthToken token, Long advertiserId,JSONObject requestBody) {
+
+        Map<String, String> headers = new HashMap<>();
+        headers.put("Content-Type", "application/json");
+        headers.put("Access-Token", token.getAccessToken());
+
+        JSONObject params=new JSONObject();
+        params.put("advertiser_id",advertiserId);
+        if(requestBody.getLong("adId")!=null){
+            params.put("ad_id",requestBody.getLong("adId"));
+        }
+        if(requestBody.getString("keyword")!=null){
+            params.put("keyword",requestBody.getLong("keyword"));
+        }
+        params.put("page",requestBody.getInteger("page"));
+        params.put("page_size",requestBody.getInteger("pageSize"));
+        JSONObject jsonObject = JSONObject.parseObject(HttpUtils.httpPostRequest(QueryToolUrlConstant.PROCEDURAL_PACKAGE, params, headers));
+        Map<String,Object> resultMap=new HashMap<>();
+        if(jsonObject.getInteger("code")!=0){
+            log.error("查询程序化创意包失败==》accountId:{},message:{}", token.getAccountId(), jsonObject.getString("message"));
+            resultMap.put("code", -1);
+            resultMap.put("message", jsonObject.getString("message"));
+            return resultMap;
+        }
+        resultMap.put("code", 0);
+        return resultMap;
+    }
+
+    @Override
+    public Map<String, Object> queryAdvertiserStoreSearchPack(CtopOauthToken token) {
+        return null;
+    }
+}

+ 80 - 0
module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/tool/util/JsonObjectToJsonStringUtil.java

@@ -0,0 +1,80 @@
+package cn.com.ctop.toutiao.modules.tool.util;
+
+import cn.com.ctop.toutiao.modules.material.entity.ByteDanceAudiencePackage;
+import com.alibaba.fastjson.JSONObject;
+
+public class JsonObjectToJsonStringUtil {
+
+    public static ByteDanceAudiencePackage toAudiencePackage(ByteDanceAudiencePackage byteDanceAudiencePackage) {
+        if (byteDanceAudiencePackage.getRetargetingTags() != null) {
+            byteDanceAudiencePackage.setRetargetingTags(JSONObject.toJSONString(byteDanceAudiencePackage.getRetargetingTags()));
+        }
+        if (byteDanceAudiencePackage.getRetargetingTagsExclude() != null) {
+            byteDanceAudiencePackage.setRetargetingTagsExclude(JSONObject.toJSONString(byteDanceAudiencePackage.getRetargetingTagsExclude()));
+        }
+        if (byteDanceAudiencePackage.getAge() != null) {
+            byteDanceAudiencePackage.setAge(JSONObject.toJSONString(byteDanceAudiencePackage.getAge()));
+        }
+        if (byteDanceAudiencePackage.getCarrier() != null) {
+            byteDanceAudiencePackage.setCarrier(JSONObject.toJSONString(byteDanceAudiencePackage.getCarrier()));
+        }
+        if (byteDanceAudiencePackage.getAc() != null) {
+            byteDanceAudiencePackage.setAc(JSONObject.toJSONString(byteDanceAudiencePackage.getAc()));
+        }
+        if (byteDanceAudiencePackage.getDeviceBrand() != null) {
+            byteDanceAudiencePackage.setDeviceBrand(JSONObject.toJSONString(byteDanceAudiencePackage.getDeviceBrand()));
+        }
+        if (byteDanceAudiencePackage.getArticleCategory() != null) {
+            byteDanceAudiencePackage.setArticleCategory(JSONObject.toJSONString(byteDanceAudiencePackage.getArticleCategory()));
+        }
+        if (byteDanceAudiencePackage.getActivateType() != null) {
+            byteDanceAudiencePackage.setActivateType(JSONObject.toJSONString(byteDanceAudiencePackage.getActivateType()));
+        }
+        if (byteDanceAudiencePackage.getPlatform() != null) {
+            byteDanceAudiencePackage.setPlatform(JSONObject.toJSONString(byteDanceAudiencePackage.getPlatform()));
+        }
+        if (byteDanceAudiencePackage.getAutoExtendTargets() != null) {
+            byteDanceAudiencePackage.setAutoExtendTargets(JSONObject.toJSONString(byteDanceAudiencePackage.getAutoExtendTargets()));
+        }
+        if (byteDanceAudiencePackage.getRetargetingTags() != null) {
+            byteDanceAudiencePackage.setRetargetingTags(JSONObject.toJSONString(byteDanceAudiencePackage.getRetargetingTags()));
+        }
+        if (byteDanceAudiencePackage.getActionScene() != null) {
+            byteDanceAudiencePackage.setActionScene(JSONObject.toJSONString(byteDanceAudiencePackage.getActionScene()));
+        }
+        if (byteDanceAudiencePackage.getActionCategories() != null) {
+            byteDanceAudiencePackage.setActionCategories(JSONObject.toJSONString(byteDanceAudiencePackage.getActionCategories()));
+        }
+        if (byteDanceAudiencePackage.getActionWords() != null) {
+            byteDanceAudiencePackage.setActionWords(JSONObject.toJSONString(byteDanceAudiencePackage.getActionWords()));
+        }
+        if (byteDanceAudiencePackage.getLaunchPrice() != null) {
+            byteDanceAudiencePackage.setLaunchPrice(JSONObject.toJSONString(byteDanceAudiencePackage.getLaunchPrice()));
+        }
+        if (byteDanceAudiencePackage.getInterestCategories() != null) {
+            byteDanceAudiencePackage.setInterestCategories(JSONObject.toJSONString(byteDanceAudiencePackage.getInterestCategories()));
+        }
+        if (byteDanceAudiencePackage.getCity() != null) {
+            byteDanceAudiencePackage.setCity(JSONObject.toJSONString(byteDanceAudiencePackage.getCity()));
+        }
+        if (byteDanceAudiencePackage.getBusinessIds() != null) {
+            byteDanceAudiencePackage.setBusinessIds(JSONObject.toJSONString(byteDanceAudiencePackage.getBusinessIds()));
+        }
+        if (byteDanceAudiencePackage.getGeolocation() != null) {
+            byteDanceAudiencePackage.setGeolocation(JSONObject.toJSONString(byteDanceAudiencePackage.getGeolocation()));
+        }
+        if (byteDanceAudiencePackage.getAwemeFansNumbers() != null) {
+            byteDanceAudiencePackage.setAwemeFansNumbers(JSONObject.toJSONString(byteDanceAudiencePackage.getAwemeFansNumbers()));
+        }
+        if (byteDanceAudiencePackage.getAwemeFanAccounts() != null) {
+            byteDanceAudiencePackage.setAwemeFanAccounts(JSONObject.toJSONString(byteDanceAudiencePackage.getAwemeFanAccounts()));
+        }
+        if (byteDanceAudiencePackage.getAwemeFanCategories() != null) {
+            byteDanceAudiencePackage.setAwemeFanCategories(JSONObject.toJSONString(byteDanceAudiencePackage.getAwemeFanCategories()));
+        }
+        if (byteDanceAudiencePackage.getAwemeFanBehaviors() != null) {
+            byteDanceAudiencePackage.setAwemeFanBehaviors(JSONObject.toJSONString(byteDanceAudiencePackage.getAwemeFanBehaviors()));
+        }
+        return byteDanceAudiencePackage;
+    }
+}

+ 80 - 0
module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/tool/util/JsonStringToJsonObject.java

@@ -0,0 +1,80 @@
+package cn.com.ctop.toutiao.modules.tool.util;
+
+import cn.com.ctop.toutiao.modules.material.entity.ByteDanceAudiencePackage;
+import com.alibaba.fastjson.JSONObject;
+
+public class JsonStringToJsonObject {
+
+    public static ByteDanceAudiencePackage toAudiencePackage(ByteDanceAudiencePackage byteDanceAudiencePackage) {
+        if (byteDanceAudiencePackage.getRetargetingTags() != null) {
+            byteDanceAudiencePackage.setRetargetingTags(JSONObject.parse((String) byteDanceAudiencePackage.getRetargetingTags()));
+        }
+        if (byteDanceAudiencePackage.getRetargetingTagsExclude() != null) {
+            byteDanceAudiencePackage.setRetargetingTagsExclude(JSONObject.parse((String) byteDanceAudiencePackage.getRetargetingTagsExclude()));
+        }
+        if (byteDanceAudiencePackage.getAge() != null) {
+            byteDanceAudiencePackage.setAge(JSONObject.parse((String) byteDanceAudiencePackage.getAge()));
+        }
+        if (byteDanceAudiencePackage.getCarrier() != null) {
+            byteDanceAudiencePackage.setCarrier(JSONObject.parse((String) byteDanceAudiencePackage.getCarrier()));
+        }
+        if (byteDanceAudiencePackage.getAc() != null) {
+            byteDanceAudiencePackage.setAc(JSONObject.parse((String) byteDanceAudiencePackage.getAc()));
+        }
+        if (byteDanceAudiencePackage.getDeviceBrand() != null) {
+            byteDanceAudiencePackage.setDeviceBrand(JSONObject.parse((String) byteDanceAudiencePackage.getDeviceBrand()));
+        }
+        if (byteDanceAudiencePackage.getArticleCategory() != null) {
+            byteDanceAudiencePackage.setArticleCategory(JSONObject.parse((String) byteDanceAudiencePackage.getArticleCategory()));
+        }
+        if (byteDanceAudiencePackage.getActivateType() != null) {
+            byteDanceAudiencePackage.setActivateType(JSONObject.parse((String) byteDanceAudiencePackage.getActivateType()));
+        }
+        if (byteDanceAudiencePackage.getPlatform() != null) {
+            byteDanceAudiencePackage.setPlatform(JSONObject.parse((String) byteDanceAudiencePackage.getPlatform()));
+        }
+        if (byteDanceAudiencePackage.getAutoExtendTargets() != null) {
+            byteDanceAudiencePackage.setAutoExtendTargets(JSONObject.parse((String) byteDanceAudiencePackage.getAutoExtendTargets()));
+        }
+        if (byteDanceAudiencePackage.getRetargetingTags() != null) {
+            byteDanceAudiencePackage.setRetargetingTags(JSONObject.parse((String) byteDanceAudiencePackage.getRetargetingTags()));
+        }
+        if (byteDanceAudiencePackage.getActionScene() != null) {
+            byteDanceAudiencePackage.setActionScene(JSONObject.parse((String) byteDanceAudiencePackage.getActionScene()));
+        }
+        if (byteDanceAudiencePackage.getActionCategories() != null) {
+            byteDanceAudiencePackage.setActionCategories(JSONObject.parse((String) byteDanceAudiencePackage.getActionCategories()));
+        }
+        if (byteDanceAudiencePackage.getActionWords() != null) {
+            byteDanceAudiencePackage.setActionWords(JSONObject.parse((String) byteDanceAudiencePackage.getActionWords()));
+        }
+        if (byteDanceAudiencePackage.getLaunchPrice() != null) {
+            byteDanceAudiencePackage.setLaunchPrice(JSONObject.parse((String) byteDanceAudiencePackage.getLaunchPrice()));
+        }
+        if (byteDanceAudiencePackage.getInterestCategories() != null) {
+            byteDanceAudiencePackage.setInterestCategories(JSONObject.parse((String) byteDanceAudiencePackage.getInterestCategories()));
+        }
+        if (byteDanceAudiencePackage.getCity() != null) {
+            byteDanceAudiencePackage.setCity(JSONObject.parse((String) byteDanceAudiencePackage.getCity()));
+        }
+        if (byteDanceAudiencePackage.getBusinessIds() != null) {
+            byteDanceAudiencePackage.setBusinessIds(JSONObject.parse((String) byteDanceAudiencePackage.getBusinessIds()));
+        }
+        if (byteDanceAudiencePackage.getGeolocation() != null) {
+            byteDanceAudiencePackage.setGeolocation(JSONObject.parse((String) byteDanceAudiencePackage.getGeolocation()));
+        }
+        if (byteDanceAudiencePackage.getAwemeFansNumbers() != null) {
+            byteDanceAudiencePackage.setAwemeFansNumbers(JSONObject.parse((String) byteDanceAudiencePackage.getAwemeFansNumbers()));
+        }
+        if (byteDanceAudiencePackage.getAwemeFanAccounts() != null) {
+            byteDanceAudiencePackage.setAwemeFanAccounts(JSONObject.parse((String) byteDanceAudiencePackage.getAwemeFanAccounts()));
+        }
+        if (byteDanceAudiencePackage.getAwemeFanCategories() != null) {
+            byteDanceAudiencePackage.setAwemeFanCategories(JSONObject.parse((String) byteDanceAudiencePackage.getAwemeFanCategories()));
+        }
+        if (byteDanceAudiencePackage.getAwemeFanBehaviors() != null) {
+            byteDanceAudiencePackage.setAwemeFanBehaviors(JSONObject.parse((String) byteDanceAudiencePackage.getAwemeFanBehaviors()));
+        }
+        return byteDanceAudiencePackage;
+    }
+}

+ 2 - 0
module-toutiao/src/main/resources/bytedance_config.properties

@@ -16,9 +16,11 @@ bytedance_v2_advertiser_info=/2/advertiser/public_info/
 bytedance_v2_ad_get=/2/ad/get/
 bytedance_v2_advertiser_fund_daily_stat=/2/advertiser/fund/daily_stat/
 bytedance_v2_ad_create=/2/ad/create/
+bytedance_v2_ad_update=2/ad/update/
 bytedance_v2_ad_update_status=/2/ad/update/status/
 bytedance_v2_ad_update_bid=/2/ad/update/bid/
 bytedance_v2_ad_update_budget=/2/ad/update/budget/
+bytedance_v2_ad_update_reject_reason=2/ad/reject_reason/
 bytedance_v2_campaign_get=/2/campaign/get/
 bytedance_v2_campaign_create=/2/campaign/create/
 bytedance_v2_campaign_update_status=/2/campaign/update/status/