Преглед на файлове

修改批量生成广告计划代码逻辑

syh преди 6 години
родител
ревизия
4eccac7a2e
променени са 40 файла, в които са добавени 3797 реда и са изтрити 45 реда
  1. 0 1
      .gitignore
  2. 3 1
      jeecg-boot-module-system/src/main/java/org/jeecg/config/ShiroConfig.java
  3. 66 30
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/controller/ByteDanceAdvertiserPostController.java
  4. 253 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/controller/ByteDanceCustomAudienceController.java
  5. 253 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/controller/ByteDanceUserOrientationTemplateController.java
  6. 253 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/controller/BytedanceDeliveryTargetTemplateController.java
  7. 6 6
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/entity/ByteDanceBudgetTemplate.java
  8. 9 6
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/entity/ByteDanceCampaignTemplate.java
  9. 108 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/entity/ByteDanceCustomAudience.java
  10. 246 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/entity/ByteDanceUserOrientationTemplate.java
  11. 120 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/entity/BytedanceDeliveryTargetTemplate.java
  12. 17 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/mapper/ByteDanceCustomAudienceMapper.java
  13. 17 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/mapper/ByteDanceUserOrientationTemplateMapper.java
  14. 17 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/mapper/BytedanceDeliveryTargetTemplateMapper.java
  15. 5 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/mapper/xml/ByteDanceCustomAudienceMapper.xml
  16. 5 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/mapper/xml/ByteDanceUserOrientationTemplateMapper.xml
  17. 5 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/mapper/xml/BytedanceDeliveryTargetTemplateMapper.xml
  18. 2 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/service/IByteDanceAdvertiserDataService.java
  19. 3 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/service/IByteDanceCampaignTemplateService.java
  20. 14 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/service/IByteDanceCustomAudienceService.java
  21. 14 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/service/IByteDanceUserOrientationTemplateService.java
  22. 17 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/service/IBytedanceDeliveryTargetTemplateService.java
  23. 1 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/service/ICTopOauthTokenService.java
  24. 57 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/service/impl/ByteDanceAdvertiserDataServiceImpl.java
  25. 17 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/service/impl/ByteDanceBudgetTemplateServiceImpl.java
  26. 26 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/service/impl/ByteDanceCampaignTemplateServiceImpl.java
  27. 19 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/service/impl/ByteDanceCustomAudienceServiceImpl.java
  28. 19 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/service/impl/ByteDanceUserOrientationTemplateServiceImpl.java
  29. 45 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/service/impl/BytedanceDeliveryTargetTemplateServiceImpl.java
  30. 12 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/service/impl/CTopOauthTokenServiceImpl.java
  31. 218 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/vue/ByteDanceCustomAudienceList.vue
  32. 334 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/vue/ByteDanceUserOrientationTemplateList.vue
  33. 229 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/vue/BytedanceDeliveryTargetTemplateList.vue
  34. 176 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/vue/modules/ByteDanceCustomAudienceModal.vue
  35. 183 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/vue/modules/ByteDanceCustomAudienceModal__Style#Drawer.vue
  36. 316 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/vue/modules/ByteDanceUserOrientationTemplateModal.vue
  37. 323 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/vue/modules/ByteDanceUserOrientationTemplateModal__Style#Drawer.vue
  38. 190 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/vue/modules/BytedanceDeliveryTargetTemplateModal.vue
  39. 197 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/vue/modules/BytedanceDeliveryTargetTemplateModal__Style#Drawer.vue
  40. 2 1
      module-toutiao/src/main/resources/bytedance_config.properties

+ 0 - 1
.gitignore

@@ -31,4 +31,3 @@ gen
 
 # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
 hs_err_pid*
-

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

@@ -86,7 +86,9 @@ public class ShiroConfig {
 		filterChainDefinitionMap.put("/auth/begin", "anon");
 		filterChainDefinitionMap.put("/ctop/syncdata/**", "anon");
 		//头条接口
-		filterChainDefinitionMap.put("/toutiao/**", "anon");
+		filterChainDefinitionMap.put("/toutiao/dictitem/list", "anon");
+		filterChainDefinitionMap.put("/toutiao/advertiser/**", "anon");
+		filterChainDefinitionMap.put("/toutiao/**/insert", "user");
 
 		//爬虫接口
 		filterChainDefinitionMap.put("/graphql/video", "anon");

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

@@ -6,16 +6,15 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import org.jeecg.common.api.vo.Result;
 import org.jeecg.common.system.query.QueryGenerator;
 import org.jeecg.modules.ctop.entity.ByteDanceBudgetTemplate;
-import org.jeecg.modules.ctop.service.IByteDanceBudgetTemplateService;
-import org.jeecg.modules.ctop.service.ITouTiaoAdvertiserService;
+import org.jeecg.modules.ctop.entity.ByteDanceCampaignTemplate;
+import org.jeecg.modules.ctop.entity.BytedanceDeliveryTargetTemplate;
+import org.jeecg.modules.ctop.service.*;
 import org.jeecg.modules.system.entity.SysDictItem;
 import org.jeecg.modules.system.service.ISysDictItemService;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletRequest;
-import java.util.HashMap;
 import java.util.Map;
 
 /**
@@ -26,14 +25,14 @@ import java.util.Map;
 @RequestMapping("toutiao")
 public class ByteDanceAdvertiserPostController {
     @Autowired
-    private ITouTiaoAdvertiserService touTiaoAdvertiserService;
+    private IByteDanceAdvertiserDataService advertiserDataService;
 
     /**
      * 1:获取广告主信息 @param accountId 本平台广告主id
      */
     @RequestMapping("/advertiser/info")
     public Map<String, Object> advertiserInfo(String accountId) {
-        return touTiaoAdvertiserService.getAdvertiserInfo(accountId);
+        return advertiserDataService.getAdvertiserInfo(accountId);
     }
 
     /**
@@ -41,7 +40,7 @@ public class ByteDanceAdvertiserPostController {
      */
     @RequestMapping("/advertiser/plan/get")
     public Map<String, Object> advertiserPlan(String accountId, String ids) {
-        return touTiaoAdvertiserService.getAdvertiserPlan(accountId, ids);
+        return advertiserDataService.getAdvertiserPlan(accountId, ids);
     }
 
     /**
@@ -49,87 +48,95 @@ public class ByteDanceAdvertiserPostController {
      */
     @RequestMapping("/advertiser/plan/update/status")
     public Map<String, Object> advertiserPlanUpdateStatus(String accountId, String adIds, String optStatus) {
-        return touTiaoAdvertiserService.advertiserPlanUpdateStatus(accountId, adIds, optStatus);
+        return advertiserDataService.advertiserPlanUpdateStatus(accountId, adIds, optStatus);
     }
 
     /**
-     * 3:修改广告计划信息状态 @param accountId 本平台广告主id
+     * 4:修改广告计划信息状态 @param accountId 本平台广告主id
      */
     @RequestMapping("/advertiser/plan/update/bid")
     public Map<String, Object> advertiserPlanUpdateBid(String accountId, String adIds, String bids) {
-        return touTiaoAdvertiserService.advertiserPlanUpdateBid(accountId, adIds, bids);
+        return advertiserDataService.advertiserPlanUpdateBid(accountId, adIds, bids);
     }
 
     /**
-     * 3:修改广告计划信息状态 @param accountId 本平台广告主id
+     * 5:修改广告计划信息状态 @param accountId 本平台广告主id
      */
     @RequestMapping("/advertiser/plan/update/budget")
     public Map<String, Object> advertiserPlanUpdateBudget(String accountId, String adIds, String budgets) {
-        return touTiaoAdvertiserService.advertiserPlanUpdateBudget(accountId, adIds, budgets);
+        return advertiserDataService.advertiserPlanUpdateBudget(accountId, adIds, budgets);
     }
 
     /**
-     * 4:获取广告主广告预算信息 @param accountId 本平台广告主id
+     * 6:获取广告主广告预算信息 @param accountId 本平台广告主id
      */
     @RequestMapping("/advertiser/budget/get/")
     public Map<String, Object> advertiserBudget(String accountId) {
-        return touTiaoAdvertiserService.getAdvertiserBudget(accountId);
+        return advertiserDataService.getAdvertiserBudget(accountId);
     }
 
     /**
-     * 3:获取广告主广告组信息 @param accountId 本平台广告主id
+     * 7:获取广告主广告组信息 @param accountId 本平台广告主id
      */
     @RequestMapping("/advertiser/campaign/get")
     public Map<String, Object> advertiserCampaign(String accountId, String ids) {
-        return touTiaoAdvertiserService.getAdvertiserCampaign(accountId, ids);
+        return advertiserDataService.getAdvertiserCampaign(accountId, ids);
     }
 
     /**
-     * 5:获取广告主广告创意信息 @param accountId 本平台广告主id
+     * 8:获取广告主广告创意信息 @param accountId 本平台广告主id
      */
     @RequestMapping("/advertiser/creative/get")
     public Map<String, Object> getAdvertiserCreative(String accountId, String ids) {
-        return touTiaoAdvertiserService.getAdvertiserCreative(accountId, ids);
+        return advertiserDataService.getAdvertiserCreative(accountId, ids);
     }
 
     /**
-     * 5:修改广告创意信息状态 @param accountId 本平台广告主id
+     * 9:修改广告创意信息状态 @param accountId 本平台广告主id
      */
     @RequestMapping("/advertiser/update/status/")
     public Map<String, Object> advertiserCreativeUpdateStatus(String accountId, String creativeIds, String optStatus) {
-        return touTiaoAdvertiserService.advertiserCreativeUpdateStatus(accountId, creativeIds, optStatus);
+        return advertiserDataService.advertiserCreativeUpdateStatus(accountId, creativeIds, optStatus);
     }
 
     /**
-     * 6:获取广告主广告创意素材信息 @param accountId 本平台广告主id @param creativeIds 广告创意id
+     * 10:获取广告主广告创意素材信息 @param accountId 本平台广告主id @param creativeIds 广告创意id
      */
     @RequestMapping("/advertiser/creative/material/read")
     public Map<String, Object> advertiserCreativeMaterial(String accountId, String creativeIds) {
-        return touTiaoAdvertiserService.getAdvertiserCreativeMaterial(accountId, creativeIds);
+        return advertiserDataService.getAdvertiserCreativeMaterial(accountId, creativeIds);
     }
 
     /**
-     * 7:创建广告组信息 @param accountId 本平台广告主id
+     * 11:创建广告组信息 @param accountId 本平台广告主id
      */
     @RequestMapping("/advertiser/campaign/create")
     public Map<String, Object> advertiserCampaignCreate(String accountId, String campaignName, String budgetMode, Integer budget, String landingType) {
-        return touTiaoAdvertiserService.advertiserCampaignCreate(accountId, campaignName, budgetMode, budget, landingType);
+        return advertiserDataService.advertiserCampaignCreate(accountId, campaignName, budgetMode, budget, landingType);
     }
 
     /**
-     * 7:广告组更新状态信息 @param accountId 本平台广告主id
+     * 12:广告组更新状态信息 @param accountId 本平台广告主id
      */
     @RequestMapping("/advertiser/campaign/update/status")
     public Map<String, Object> advertiserCampaignUpdateStatus(String accountId, String campaignIds, String optStatus) {
-        return touTiaoAdvertiserService.advertiserCampaignUpdateStatus(accountId, campaignIds, optStatus);
+        return advertiserDataService.advertiserCampaignUpdateStatus(accountId, campaignIds, optStatus);
     }
 
     /**
-     * 8:广告组更新信息 @param accountId 本平台广告主id
+     * 13:广告组更新信息 @param accountId 本平台广告主id
      */
     @RequestMapping("/advertiser/campaign/update")
     public Map<String, Object> advertiserCampaignUpdate(String accountId, Long campaignId, String budgetMode, Integer budget, String campaignName) {
-        return touTiaoAdvertiserService.advertiserCampaignUpdate(accountId, campaignId, budgetMode, budget, campaignName);
+        return advertiserDataService.advertiserCampaignUpdate(accountId, campaignId, budgetMode, budget, campaignName);
+    }
+
+    /**
+     * 14:获取人群包信息
+     */
+    @RequestMapping("/advertiser/custom/audience/select")
+    public Map<String, Object> customAudienceSelect(String accountId) {
+        return advertiserDataService.advertiserCustomAudienceSelect(accountId);
     }
 
     /**
@@ -154,18 +161,47 @@ public class ByteDanceAdvertiserPostController {
     }
 
     /**
+     * 预算与出价模板
      * @param template
      * @param req
      * @return
      */
-    @RequestMapping(value = "budget/template/insert", method = RequestMethod.GET)
-    public Map<String, Object> budgetModelInsert(@RequestBody ByteDanceBudgetTemplate template, HttpServletRequest req) {
+    @PostMapping("budget/template/insert")
+    public Map<String, Object> budgetTemplateInsert(@RequestBody ByteDanceBudgetTemplate template, HttpServletRequest req) {
         return budgetTemplateService.insertTemplate(template);
     }
 
+    /**
+     * 广告组模板
+     *
+     * @param template
+     * @param req
+     * @return
+     */
+    @PostMapping("campaign/template/insert")
+    public Map<String, Object> campaignTemplateInsert(@RequestBody ByteDanceCampaignTemplate template, HttpServletRequest req) {
+        return campaignTemplateService.insertTemplate(template);
+    }
+
+    /**
+     * 投放目标
+     *
+     * @param template
+     * @param req
+     * @return
+     */
+    @PostMapping("deliverytarget/template/insert")
+    public Map<String, Object> diliverytargetTemplateInsert(@RequestBody BytedanceDeliveryTargetTemplate template, HttpServletRequest req) {
+        return deliveryTargetTemplateService.insertTemplate(template);
+    }
+
 
     @Autowired
+    private IByteDanceCampaignTemplateService campaignTemplateService;
+    @Autowired
     private IByteDanceBudgetTemplateService budgetTemplateService;
     @Autowired
+    private IBytedanceDeliveryTargetTemplateService deliveryTargetTemplateService;
+    @Autowired
     private ISysDictItemService sysDictItemService;
 }

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

@@ -0,0 +1,253 @@
+package org.jeecg.modules.ctop.controller;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.net.URLDecoder;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.common.system.query.QueryGenerator;
+import org.jeecg.common.aspect.annotation.AutoLog;
+import org.jeecg.common.util.oConvertUtils;
+import org.jeecg.modules.ctop.entity.ByteDanceCustomAudience;
+import org.jeecg.modules.ctop.service.IByteDanceCustomAudienceService;
+
+import java.util.Date;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import lombok.extern.slf4j.Slf4j;
+
+import org.jeecgframework.poi.excel.ExcelImportUtil;
+import org.jeecgframework.poi.excel.def.NormalExcelConstants;
+import org.jeecgframework.poi.excel.entity.ExportParams;
+import org.jeecgframework.poi.excel.entity.ImportParams;
+import org.jeecgframework.poi.excel.view.JeecgEntityExcelView;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.multipart.MultipartHttpServletRequest;
+import org.springframework.web.servlet.ModelAndView;
+import com.alibaba.fastjson.JSON;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+
+/**
+ * @Description: 人群包信息
+ * @Author: jeecg-boot
+ * @Date: 2019-07-23
+ * @Version: V1.0
+ */
+@Slf4j
+@Api(tags = "人群包信息")
+@RestController
+@RequestMapping("/ctop/byteDanceCustomAudience")
+public class ByteDanceCustomAudienceController {
+    @Autowired
+    private IByteDanceCustomAudienceService byteDanceCustomAudienceService;
+
+    /**
+     * 分页列表查询
+     *
+     * @param byteDanceCustomAudience
+     * @param pageNo
+     * @param pageSize
+     * @param req
+     * @return
+     */
+    @AutoLog(value = "人群包信息-分页列表查询")
+    @ApiOperation(value = "人群包信息-分页列表查询", notes = "人群包信息-分页列表查询")
+    @GetMapping(value = "/list")
+    public Result<IPage<ByteDanceCustomAudience>> queryPageList(ByteDanceCustomAudience byteDanceCustomAudience,
+                                                                @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
+                                                                @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
+                                                                HttpServletRequest req) {
+        Result<IPage<ByteDanceCustomAudience>> result = new Result<IPage<ByteDanceCustomAudience>>();
+        QueryWrapper<ByteDanceCustomAudience> queryWrapper = QueryGenerator.initQueryWrapper(byteDanceCustomAudience, req.getParameterMap());
+        Page<ByteDanceCustomAudience> page = new Page<ByteDanceCustomAudience>(pageNo, pageSize);
+        IPage<ByteDanceCustomAudience> pageList = byteDanceCustomAudienceService.page(page, queryWrapper);
+        result.setSuccess(true);
+        result.setResult(pageList);
+        return result;
+    }
+
+    /**
+     * 添加
+     *
+     * @param byteDanceCustomAudience
+     * @return
+     */
+    @AutoLog(value = "人群包信息-添加")
+    @ApiOperation(value = "人群包信息-添加", notes = "人群包信息-添加")
+    @PostMapping(value = "/add")
+    public Result<ByteDanceCustomAudience> add(@RequestBody ByteDanceCustomAudience byteDanceCustomAudience) {
+        Result<ByteDanceCustomAudience> result = new Result<ByteDanceCustomAudience>();
+        try {
+            byteDanceCustomAudienceService.save(byteDanceCustomAudience);
+            result.success("添加成功!");
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+            result.error500("操作失败");
+        }
+        return result;
+    }
+
+    /**
+     * 编辑
+     *
+     * @param byteDanceCustomAudience
+     * @return
+     */
+    @AutoLog(value = "人群包信息-编辑")
+    @ApiOperation(value = "人群包信息-编辑", notes = "人群包信息-编辑")
+    @PutMapping(value = "/edit")
+    public Result<ByteDanceCustomAudience> edit(@RequestBody ByteDanceCustomAudience byteDanceCustomAudience) {
+        Result<ByteDanceCustomAudience> result = new Result<ByteDanceCustomAudience>();
+        ByteDanceCustomAudience byteDanceCustomAudienceEntity = byteDanceCustomAudienceService.getById(byteDanceCustomAudience.getId());
+        if (byteDanceCustomAudienceEntity == null) {
+            result.error500("未找到对应实体");
+        } else {
+            boolean ok = byteDanceCustomAudienceService.updateById(byteDanceCustomAudience);
+            //TODO 返回false说明什么?
+            if (ok) {
+                result.success("修改成功!");
+            }
+        }
+
+        return result;
+    }
+
+    /**
+     * 通过id删除
+     *
+     * @param id
+     * @return
+     */
+    @AutoLog(value = "人群包信息-通过id删除")
+    @ApiOperation(value = "人群包信息-通过id删除", notes = "人群包信息-通过id删除")
+    @DeleteMapping(value = "/delete")
+    public Result<?> delete(@RequestParam(name = "id", required = true) String id) {
+        try {
+            byteDanceCustomAudienceService.removeById(id);
+        } catch (Exception e) {
+            log.error("删除失败", e.getMessage());
+            return Result.error("删除失败!");
+        }
+        return Result.ok("删除成功!");
+    }
+
+    /**
+     * 批量删除
+     *
+     * @param ids
+     * @return
+     */
+    @AutoLog(value = "人群包信息-批量删除")
+    @ApiOperation(value = "人群包信息-批量删除", notes = "人群包信息-批量删除")
+    @DeleteMapping(value = "/deleteBatch")
+    public Result<ByteDanceCustomAudience> deleteBatch(@RequestParam(name = "ids", required = true) String ids) {
+        Result<ByteDanceCustomAudience> result = new Result<ByteDanceCustomAudience>();
+        if (ids == null || "".equals(ids.trim())) {
+            result.error500("参数不识别!");
+        } else {
+            this.byteDanceCustomAudienceService.removeByIds(Arrays.asList(ids.split(",")));
+            result.success("删除成功!");
+        }
+        return result;
+    }
+
+    /**
+     * 通过id查询
+     *
+     * @param id
+     * @return
+     */
+    @AutoLog(value = "人群包信息-通过id查询")
+    @ApiOperation(value = "人群包信息-通过id查询", notes = "人群包信息-通过id查询")
+    @GetMapping(value = "/queryById")
+    public Result<ByteDanceCustomAudience> queryById(@RequestParam(name = "id", required = true) String id) {
+        Result<ByteDanceCustomAudience> result = new Result<ByteDanceCustomAudience>();
+        ByteDanceCustomAudience byteDanceCustomAudience = byteDanceCustomAudienceService.getById(id);
+        if (byteDanceCustomAudience == null) {
+            result.error500("未找到对应实体");
+        } else {
+            result.setResult(byteDanceCustomAudience);
+            result.setSuccess(true);
+        }
+        return result;
+    }
+
+    /**
+     * 导出excel
+     *
+     * @param request
+     * @param response
+     */
+    @RequestMapping(value = "/exportXls")
+    public ModelAndView exportXls(HttpServletRequest request, HttpServletResponse response) {
+        // Step.1 组装查询条件
+        QueryWrapper<ByteDanceCustomAudience> queryWrapper = null;
+        try {
+            String paramsStr = request.getParameter("paramsStr");
+            if (oConvertUtils.isNotEmpty(paramsStr)) {
+                String deString = URLDecoder.decode(paramsStr, "UTF-8");
+                ByteDanceCustomAudience byteDanceCustomAudience = JSON.parseObject(deString, ByteDanceCustomAudience.class);
+                queryWrapper = QueryGenerator.initQueryWrapper(byteDanceCustomAudience, request.getParameterMap());
+            }
+        } catch (UnsupportedEncodingException e) {
+            e.printStackTrace();
+        }
+
+        //Step.2 AutoPoi 导出Excel
+        ModelAndView mv = new ModelAndView(new JeecgEntityExcelView());
+        List<ByteDanceCustomAudience> pageList = byteDanceCustomAudienceService.list(queryWrapper);
+        //导出文件名称
+        mv.addObject(NormalExcelConstants.FILE_NAME, "人群包信息列表");
+        mv.addObject(NormalExcelConstants.CLASS, ByteDanceCustomAudience.class);
+        mv.addObject(NormalExcelConstants.PARAMS, new ExportParams("人群包信息列表数据", "导出人:Jeecg", "导出信息"));
+        mv.addObject(NormalExcelConstants.DATA_LIST, pageList);
+        return mv;
+    }
+
+    /**
+     * 通过excel导入数据
+     *
+     * @param request
+     * @param response
+     * @return
+     */
+    @RequestMapping(value = "/importExcel", method = RequestMethod.POST)
+    public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {
+        MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
+        Map<String, MultipartFile> fileMap = multipartRequest.getFileMap();
+        for (Map.Entry<String, MultipartFile> entity : fileMap.entrySet()) {
+            MultipartFile file = entity.getValue();// 获取上传文件对象
+            ImportParams params = new ImportParams();
+            params.setTitleRows(2);
+            params.setHeadRows(1);
+            params.setNeedSave(true);
+            try {
+                List<ByteDanceCustomAudience> listByteDanceCustomAudiences = ExcelImportUtil.importExcel(file.getInputStream(), ByteDanceCustomAudience.class, params);
+                byteDanceCustomAudienceService.saveBatch(listByteDanceCustomAudiences);
+                return Result.ok("文件导入成功!数据行数:" + listByteDanceCustomAudiences.size());
+            } catch (Exception e) {
+                log.error(e.getMessage(), e);
+                return Result.error("文件导入失败:" + e.getMessage());
+            } finally {
+                try {
+                    file.getInputStream().close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+        return Result.ok("文件导入失败!");
+    }
+
+}

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

@@ -0,0 +1,253 @@
+package org.jeecg.modules.ctop.controller;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.net.URLDecoder;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.common.system.query.QueryGenerator;
+import org.jeecg.common.aspect.annotation.AutoLog;
+import org.jeecg.common.util.oConvertUtils;
+import org.jeecg.modules.ctop.entity.ByteDanceUserOrientationTemplate;
+import org.jeecg.modules.ctop.service.IByteDanceUserOrientationTemplateService;
+
+import java.util.Date;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import lombok.extern.slf4j.Slf4j;
+
+import org.jeecgframework.poi.excel.ExcelImportUtil;
+import org.jeecgframework.poi.excel.def.NormalExcelConstants;
+import org.jeecgframework.poi.excel.entity.ExportParams;
+import org.jeecgframework.poi.excel.entity.ImportParams;
+import org.jeecgframework.poi.excel.view.JeecgEntityExcelView;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.multipart.MultipartHttpServletRequest;
+import org.springframework.web.servlet.ModelAndView;
+import com.alibaba.fastjson.JSON;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+
+/**
+ * @Description: 今日头条受众模板信息
+ * @Author: jeecg-boot
+ * @Date: 2019-07-23
+ * @Version: V1.0
+ */
+@Slf4j
+@Api(tags = "今日头条受众模板信息")
+@RestController
+@RequestMapping("/ctop/byteDanceUserOrientationTemplate")
+public class ByteDanceUserOrientationTemplateController {
+    @Autowired
+    private IByteDanceUserOrientationTemplateService byteDanceUserOrientationTemplateService;
+
+    /**
+     * 分页列表查询
+     *
+     * @param byteDanceUserOrientationTemplate
+     * @param pageNo
+     * @param pageSize
+     * @param req
+     * @return
+     */
+    @AutoLog(value = "今日头条受众模板信息-分页列表查询")
+    @ApiOperation(value = "今日头条受众模板信息-分页列表查询", notes = "今日头条受众模板信息-分页列表查询")
+    @GetMapping(value = "/list")
+    public Result<IPage<ByteDanceUserOrientationTemplate>> queryPageList(ByteDanceUserOrientationTemplate byteDanceUserOrientationTemplate,
+                                                                         @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
+                                                                         @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
+                                                                         HttpServletRequest req) {
+        Result<IPage<ByteDanceUserOrientationTemplate>> result = new Result<IPage<ByteDanceUserOrientationTemplate>>();
+        QueryWrapper<ByteDanceUserOrientationTemplate> queryWrapper = QueryGenerator.initQueryWrapper(byteDanceUserOrientationTemplate, req.getParameterMap());
+        Page<ByteDanceUserOrientationTemplate> page = new Page<ByteDanceUserOrientationTemplate>(pageNo, pageSize);
+        IPage<ByteDanceUserOrientationTemplate> pageList = byteDanceUserOrientationTemplateService.page(page, queryWrapper);
+        result.setSuccess(true);
+        result.setResult(pageList);
+        return result;
+    }
+
+    /**
+     * 添加
+     *
+     * @param byteDanceUserOrientationTemplate
+     * @return
+     */
+    @AutoLog(value = "今日头条受众模板信息-添加")
+    @ApiOperation(value = "今日头条受众模板信息-添加", notes = "今日头条受众模板信息-添加")
+    @PostMapping(value = "/add")
+    public Result<ByteDanceUserOrientationTemplate> add(@RequestBody ByteDanceUserOrientationTemplate byteDanceUserOrientationTemplate) {
+        Result<ByteDanceUserOrientationTemplate> result = new Result<ByteDanceUserOrientationTemplate>();
+        try {
+            byteDanceUserOrientationTemplateService.save(byteDanceUserOrientationTemplate);
+            result.success("添加成功!");
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+            result.error500("操作失败");
+        }
+        return result;
+    }
+
+    /**
+     * 编辑
+     *
+     * @param byteDanceUserOrientationTemplate
+     * @return
+     */
+    @AutoLog(value = "今日头条受众模板信息-编辑")
+    @ApiOperation(value = "今日头条受众模板信息-编辑", notes = "今日头条受众模板信息-编辑")
+    @PutMapping(value = "/edit")
+    public Result<ByteDanceUserOrientationTemplate> edit(@RequestBody ByteDanceUserOrientationTemplate byteDanceUserOrientationTemplate) {
+        Result<ByteDanceUserOrientationTemplate> result = new Result<ByteDanceUserOrientationTemplate>();
+        ByteDanceUserOrientationTemplate byteDanceUserOrientationTemplateEntity = byteDanceUserOrientationTemplateService.getById(byteDanceUserOrientationTemplate.getId());
+        if (byteDanceUserOrientationTemplateEntity == null) {
+            result.error500("未找到对应实体");
+        } else {
+            boolean ok = byteDanceUserOrientationTemplateService.updateById(byteDanceUserOrientationTemplate);
+            //TODO 返回false说明什么?
+            if (ok) {
+                result.success("修改成功!");
+            }
+        }
+
+        return result;
+    }
+
+    /**
+     * 通过id删除
+     *
+     * @param id
+     * @return
+     */
+    @AutoLog(value = "今日头条受众模板信息-通过id删除")
+    @ApiOperation(value = "今日头条受众模板信息-通过id删除", notes = "今日头条受众模板信息-通过id删除")
+    @DeleteMapping(value = "/delete")
+    public Result<?> delete(@RequestParam(name = "id", required = true) String id) {
+        try {
+            byteDanceUserOrientationTemplateService.removeById(id);
+        } catch (Exception e) {
+            log.error("删除失败", e.getMessage());
+            return Result.error("删除失败!");
+        }
+        return Result.ok("删除成功!");
+    }
+
+    /**
+     * 批量删除
+     *
+     * @param ids
+     * @return
+     */
+    @AutoLog(value = "今日头条受众模板信息-批量删除")
+    @ApiOperation(value = "今日头条受众模板信息-批量删除", notes = "今日头条受众模板信息-批量删除")
+    @DeleteMapping(value = "/deleteBatch")
+    public Result<ByteDanceUserOrientationTemplate> deleteBatch(@RequestParam(name = "ids", required = true) String ids) {
+        Result<ByteDanceUserOrientationTemplate> result = new Result<ByteDanceUserOrientationTemplate>();
+        if (ids == null || "".equals(ids.trim())) {
+            result.error500("参数不识别!");
+        } else {
+            this.byteDanceUserOrientationTemplateService.removeByIds(Arrays.asList(ids.split(",")));
+            result.success("删除成功!");
+        }
+        return result;
+    }
+
+    /**
+     * 通过id查询
+     *
+     * @param id
+     * @return
+     */
+    @AutoLog(value = "今日头条受众模板信息-通过id查询")
+    @ApiOperation(value = "今日头条受众模板信息-通过id查询", notes = "今日头条受众模板信息-通过id查询")
+    @GetMapping(value = "/queryById")
+    public Result<ByteDanceUserOrientationTemplate> queryById(@RequestParam(name = "id", required = true) String id) {
+        Result<ByteDanceUserOrientationTemplate> result = new Result<ByteDanceUserOrientationTemplate>();
+        ByteDanceUserOrientationTemplate byteDanceUserOrientationTemplate = byteDanceUserOrientationTemplateService.getById(id);
+        if (byteDanceUserOrientationTemplate == null) {
+            result.error500("未找到对应实体");
+        } else {
+            result.setResult(byteDanceUserOrientationTemplate);
+            result.setSuccess(true);
+        }
+        return result;
+    }
+
+    /**
+     * 导出excel
+     *
+     * @param request
+     * @param response
+     */
+    @RequestMapping(value = "/exportXls")
+    public ModelAndView exportXls(HttpServletRequest request, HttpServletResponse response) {
+        // Step.1 组装查询条件
+        QueryWrapper<ByteDanceUserOrientationTemplate> queryWrapper = null;
+        try {
+            String paramsStr = request.getParameter("paramsStr");
+            if (oConvertUtils.isNotEmpty(paramsStr)) {
+                String deString = URLDecoder.decode(paramsStr, "UTF-8");
+                ByteDanceUserOrientationTemplate byteDanceUserOrientationTemplate = JSON.parseObject(deString, ByteDanceUserOrientationTemplate.class);
+                queryWrapper = QueryGenerator.initQueryWrapper(byteDanceUserOrientationTemplate, request.getParameterMap());
+            }
+        } catch (UnsupportedEncodingException e) {
+            e.printStackTrace();
+        }
+
+        //Step.2 AutoPoi 导出Excel
+        ModelAndView mv = new ModelAndView(new JeecgEntityExcelView());
+        List<ByteDanceUserOrientationTemplate> pageList = byteDanceUserOrientationTemplateService.list(queryWrapper);
+        //导出文件名称
+        mv.addObject(NormalExcelConstants.FILE_NAME, "今日头条受众模板信息列表");
+        mv.addObject(NormalExcelConstants.CLASS, ByteDanceUserOrientationTemplate.class);
+        mv.addObject(NormalExcelConstants.PARAMS, new ExportParams("今日头条受众模板信息列表数据", "导出人:Jeecg", "导出信息"));
+        mv.addObject(NormalExcelConstants.DATA_LIST, pageList);
+        return mv;
+    }
+
+    /**
+     * 通过excel导入数据
+     *
+     * @param request
+     * @param response
+     * @return
+     */
+    @RequestMapping(value = "/importExcel", method = RequestMethod.POST)
+    public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {
+        MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
+        Map<String, MultipartFile> fileMap = multipartRequest.getFileMap();
+        for (Map.Entry<String, MultipartFile> entity : fileMap.entrySet()) {
+            MultipartFile file = entity.getValue();// 获取上传文件对象
+            ImportParams params = new ImportParams();
+            params.setTitleRows(2);
+            params.setHeadRows(1);
+            params.setNeedSave(true);
+            try {
+                List<ByteDanceUserOrientationTemplate> listByteDanceUserOrientationTemplates = ExcelImportUtil.importExcel(file.getInputStream(), ByteDanceUserOrientationTemplate.class, params);
+                byteDanceUserOrientationTemplateService.saveBatch(listByteDanceUserOrientationTemplates);
+                return Result.ok("文件导入成功!数据行数:" + listByteDanceUserOrientationTemplates.size());
+            } catch (Exception e) {
+                log.error(e.getMessage(), e);
+                return Result.error("文件导入失败:" + e.getMessage());
+            } finally {
+                try {
+                    file.getInputStream().close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+        return Result.ok("文件导入失败!");
+    }
+
+}

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

@@ -0,0 +1,253 @@
+package org.jeecg.modules.ctop.controller;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.net.URLDecoder;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.common.system.query.QueryGenerator;
+import org.jeecg.common.aspect.annotation.AutoLog;
+import org.jeecg.common.util.oConvertUtils;
+import org.jeecg.modules.ctop.entity.BytedanceDeliveryTargetTemplate;
+import org.jeecg.modules.ctop.service.IBytedanceDeliveryTargetTemplateService;
+
+import java.util.Date;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import lombok.extern.slf4j.Slf4j;
+
+import org.jeecgframework.poi.excel.ExcelImportUtil;
+import org.jeecgframework.poi.excel.def.NormalExcelConstants;
+import org.jeecgframework.poi.excel.entity.ExportParams;
+import org.jeecgframework.poi.excel.entity.ImportParams;
+import org.jeecgframework.poi.excel.view.JeecgEntityExcelView;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.multipart.MultipartHttpServletRequest;
+import org.springframework.web.servlet.ModelAndView;
+import com.alibaba.fastjson.JSON;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+
+/**
+ * @Description: 投放目标模板信息
+ * @Author: jeecg-boot
+ * @Date: 2019-07-23
+ * @Version: V1.0
+ */
+@Slf4j
+@Api(tags = "投放目标模板信息")
+@RestController
+@RequestMapping("/ctop/bytedanceDeliveryTargetTemplate")
+public class BytedanceDeliveryTargetTemplateController {
+    @Autowired
+    private IBytedanceDeliveryTargetTemplateService bytedanceDeliveryTargetTemplateService;
+
+    /**
+     * 分页列表查询
+     *
+     * @param bytedanceDeliveryTargetTemplate
+     * @param pageNo
+     * @param pageSize
+     * @param req
+     * @return
+     */
+    @AutoLog(value = "投放目标模板信息-分页列表查询")
+    @ApiOperation(value = "投放目标模板信息-分页列表查询", notes = "投放目标模板信息-分页列表查询")
+    @GetMapping(value = "/list")
+    public Result<IPage<BytedanceDeliveryTargetTemplate>> queryPageList(BytedanceDeliveryTargetTemplate bytedanceDeliveryTargetTemplate,
+                                                                        @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
+                                                                        @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
+                                                                        HttpServletRequest req) {
+        Result<IPage<BytedanceDeliveryTargetTemplate>> result = new Result<IPage<BytedanceDeliveryTargetTemplate>>();
+        QueryWrapper<BytedanceDeliveryTargetTemplate> queryWrapper = QueryGenerator.initQueryWrapper(bytedanceDeliveryTargetTemplate, req.getParameterMap());
+        Page<BytedanceDeliveryTargetTemplate> page = new Page<BytedanceDeliveryTargetTemplate>(pageNo, pageSize);
+        IPage<BytedanceDeliveryTargetTemplate> pageList = bytedanceDeliveryTargetTemplateService.page(page, queryWrapper);
+        result.setSuccess(true);
+        result.setResult(pageList);
+        return result;
+    }
+
+    /**
+     * 添加
+     *
+     * @param bytedanceDeliveryTargetTemplate
+     * @return
+     */
+    @AutoLog(value = "投放目标模板信息-添加")
+    @ApiOperation(value = "投放目标模板信息-添加", notes = "投放目标模板信息-添加")
+    @PostMapping(value = "/add")
+    public Result<BytedanceDeliveryTargetTemplate> add(@RequestBody BytedanceDeliveryTargetTemplate bytedanceDeliveryTargetTemplate) {
+        Result<BytedanceDeliveryTargetTemplate> result = new Result<BytedanceDeliveryTargetTemplate>();
+        try {
+            bytedanceDeliveryTargetTemplateService.save(bytedanceDeliveryTargetTemplate);
+            result.success("添加成功!");
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+            result.error500("操作失败");
+        }
+        return result;
+    }
+
+    /**
+     * 编辑
+     *
+     * @param bytedanceDeliveryTargetTemplate
+     * @return
+     */
+    @AutoLog(value = "投放目标模板信息-编辑")
+    @ApiOperation(value = "投放目标模板信息-编辑", notes = "投放目标模板信息-编辑")
+    @PutMapping(value = "/edit")
+    public Result<BytedanceDeliveryTargetTemplate> edit(@RequestBody BytedanceDeliveryTargetTemplate bytedanceDeliveryTargetTemplate) {
+        Result<BytedanceDeliveryTargetTemplate> result = new Result<BytedanceDeliveryTargetTemplate>();
+        BytedanceDeliveryTargetTemplate bytedanceDeliveryTargetTemplateEntity = bytedanceDeliveryTargetTemplateService.getById(bytedanceDeliveryTargetTemplate.getId());
+        if (bytedanceDeliveryTargetTemplateEntity == null) {
+            result.error500("未找到对应实体");
+        } else {
+            boolean ok = bytedanceDeliveryTargetTemplateService.updateById(bytedanceDeliveryTargetTemplate);
+            //TODO 返回false说明什么?
+            if (ok) {
+                result.success("修改成功!");
+            }
+        }
+
+        return result;
+    }
+
+    /**
+     * 通过id删除
+     *
+     * @param id
+     * @return
+     */
+    @AutoLog(value = "投放目标模板信息-通过id删除")
+    @ApiOperation(value = "投放目标模板信息-通过id删除", notes = "投放目标模板信息-通过id删除")
+    @DeleteMapping(value = "/delete")
+    public Result<?> delete(@RequestParam(name = "id", required = true) String id) {
+        try {
+            bytedanceDeliveryTargetTemplateService.removeById(id);
+        } catch (Exception e) {
+            log.error("删除失败", e.getMessage());
+            return Result.error("删除失败!");
+        }
+        return Result.ok("删除成功!");
+    }
+
+    /**
+     * 批量删除
+     *
+     * @param ids
+     * @return
+     */
+    @AutoLog(value = "投放目标模板信息-批量删除")
+    @ApiOperation(value = "投放目标模板信息-批量删除", notes = "投放目标模板信息-批量删除")
+    @DeleteMapping(value = "/deleteBatch")
+    public Result<BytedanceDeliveryTargetTemplate> deleteBatch(@RequestParam(name = "ids", required = true) String ids) {
+        Result<BytedanceDeliveryTargetTemplate> result = new Result<BytedanceDeliveryTargetTemplate>();
+        if (ids == null || "".equals(ids.trim())) {
+            result.error500("参数不识别!");
+        } else {
+            this.bytedanceDeliveryTargetTemplateService.removeByIds(Arrays.asList(ids.split(",")));
+            result.success("删除成功!");
+        }
+        return result;
+    }
+
+    /**
+     * 通过id查询
+     *
+     * @param id
+     * @return
+     */
+    @AutoLog(value = "投放目标模板信息-通过id查询")
+    @ApiOperation(value = "投放目标模板信息-通过id查询", notes = "投放目标模板信息-通过id查询")
+    @GetMapping(value = "/queryById")
+    public Result<BytedanceDeliveryTargetTemplate> queryById(@RequestParam(name = "id", required = true) String id) {
+        Result<BytedanceDeliveryTargetTemplate> result = new Result<BytedanceDeliveryTargetTemplate>();
+        BytedanceDeliveryTargetTemplate bytedanceDeliveryTargetTemplate = bytedanceDeliveryTargetTemplateService.getById(id);
+        if (bytedanceDeliveryTargetTemplate == null) {
+            result.error500("未找到对应实体");
+        } else {
+            result.setResult(bytedanceDeliveryTargetTemplate);
+            result.setSuccess(true);
+        }
+        return result;
+    }
+
+    /**
+     * 导出excel
+     *
+     * @param request
+     * @param response
+     */
+    @RequestMapping(value = "/exportXls")
+    public ModelAndView exportXls(HttpServletRequest request, HttpServletResponse response) {
+        // Step.1 组装查询条件
+        QueryWrapper<BytedanceDeliveryTargetTemplate> queryWrapper = null;
+        try {
+            String paramsStr = request.getParameter("paramsStr");
+            if (oConvertUtils.isNotEmpty(paramsStr)) {
+                String deString = URLDecoder.decode(paramsStr, "UTF-8");
+                BytedanceDeliveryTargetTemplate bytedanceDeliveryTargetTemplate = JSON.parseObject(deString, BytedanceDeliveryTargetTemplate.class);
+                queryWrapper = QueryGenerator.initQueryWrapper(bytedanceDeliveryTargetTemplate, request.getParameterMap());
+            }
+        } catch (UnsupportedEncodingException e) {
+            e.printStackTrace();
+        }
+
+        //Step.2 AutoPoi 导出Excel
+        ModelAndView mv = new ModelAndView(new JeecgEntityExcelView());
+        List<BytedanceDeliveryTargetTemplate> pageList = bytedanceDeliveryTargetTemplateService.list(queryWrapper);
+        //导出文件名称
+        mv.addObject(NormalExcelConstants.FILE_NAME, "投放目标模板信息列表");
+        mv.addObject(NormalExcelConstants.CLASS, BytedanceDeliveryTargetTemplate.class);
+        mv.addObject(NormalExcelConstants.PARAMS, new ExportParams("投放目标模板信息列表数据", "导出人:Jeecg", "导出信息"));
+        mv.addObject(NormalExcelConstants.DATA_LIST, pageList);
+        return mv;
+    }
+
+    /**
+     * 通过excel导入数据
+     *
+     * @param request
+     * @param response
+     * @return
+     */
+    @RequestMapping(value = "/importExcel", method = RequestMethod.POST)
+    public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {
+        MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
+        Map<String, MultipartFile> fileMap = multipartRequest.getFileMap();
+        for (Map.Entry<String, MultipartFile> entity : fileMap.entrySet()) {
+            MultipartFile file = entity.getValue();// 获取上传文件对象
+            ImportParams params = new ImportParams();
+            params.setTitleRows(2);
+            params.setHeadRows(1);
+            params.setNeedSave(true);
+            try {
+                List<BytedanceDeliveryTargetTemplate> listBytedanceDeliveryTargetTemplates = ExcelImportUtil.importExcel(file.getInputStream(), BytedanceDeliveryTargetTemplate.class, params);
+                bytedanceDeliveryTargetTemplateService.saveBatch(listBytedanceDeliveryTargetTemplates);
+                return Result.ok("文件导入成功!数据行数:" + listBytedanceDeliveryTargetTemplates.size());
+            } catch (Exception e) {
+                log.error(e.getMessage(), e);
+                return Result.error("文件导入失败:" + e.getMessage());
+            } finally {
+                try {
+                    file.getInputStream().close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+        return Result.ok("文件导入失败!");
+    }
+
+}

+ 6 - 6
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/entity/ByteDanceBudgetTemplate.java

@@ -32,9 +32,9 @@ public class ByteDanceBudgetTemplate {
     /**
      * id
      */
-    @TableId(type = IdType.UUID)
+    @TableId(type = IdType.AUTO)
     @ApiModelProperty(value = "id")
-    private Integer id;
+    private Long id;
     /**
      * 广告主id
      */
@@ -46,7 +46,7 @@ public class ByteDanceBudgetTemplate {
      */
     @Excel(name = "头条账号id", width = 15)
     @ApiModelProperty(value = "头条账号id")
-    private Integer toutiaoId;
+    private Long toutiaoId;
     /**
      * bidType
      */
@@ -68,9 +68,9 @@ public class ByteDanceBudgetTemplate {
     /**
      * budgetMode
      */
-    @Excel(name = "budgetMode", width = 15)
-    @ApiModelProperty(value = "budgetMode")
-    private String budgetMode;
+    @Excel(name = "budgetPriceMode", width = 15)
+    @ApiModelProperty(value = "budgetPriceMode")
+    private String budgetPriceMode;
     /**
      * flowDateType
      */

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

@@ -32,21 +32,24 @@ public class ByteDanceCampaignTemplate {
     /**
      * id
      */
-    @TableId(type = IdType.UUID)
+    @TableId(type = IdType.AUTO)
     @ApiModelProperty(value = "id")
-    private Integer id;
+    private Long id;
     /**
      * accountId
      */
-    @Excel(name = "accountId", width = 15)
-    @ApiModelProperty(value = "accountId")
-    private String accountId;
+    @Excel(name = "头条账号id")
+    @ApiModelProperty(value = "头条账号id")
+    private Long accountId;
+    @Excel(name = "平台广告主id")
+    @ApiModelProperty(value = "平台广告主id")
+    private String advertiserId;
     /**
      * 投放目标
      */
     @Excel(name = "投放目标", width = 15)
     @ApiModelProperty(value = "投放目标")
-    private String promationPurpuse;
+    private String promotionPurpuse;
     /**
      * 投放方式
      */

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

@@ -0,0 +1,108 @@
+package org.jeecg.modules.ctop.entity;
+
+import java.io.Serializable;
+import java.util.Date;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.TableField;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.springframework.format.annotation.DateTimeFormat;
+import org.jeecgframework.poi.excel.annotation.Excel;
+
+/**
+ * @Description: 人群包信息
+ * @Author: jeecg-boot
+ * @Date: 2019-07-23
+ * @Version: V1.0
+ */
+@Data
+@TableName("ctop_bytedance_custom_audience")
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value = "ctop_bytedance_custom_audience对象", description = "人群包信息")
+public class ByteDanceCustomAudience {
+
+    /**
+     * id
+     */
+    @TableId(type = IdType.UUID)
+    @ApiModelProperty(value = "id")
+    private Integer id;
+    /**
+     * 广告主id
+     */
+    @Excel(name = "广告主id", width = 15)
+    @ApiModelProperty(value = "广告主id")
+    private String advertiserId;
+    /**
+     * 头条账号id
+     */
+    @Excel(name = "头条账号id", width = 15)
+    @ApiModelProperty(value = "头条账号id")
+    private Integer accountId;
+    /**
+     * 是否删除
+     */
+    @Excel(name = "是否删除", width = 15)
+    @ApiModelProperty(value = "是否删除")
+    private Integer isdel;
+    /**
+     * 数据源id
+     */
+    @Excel(name = "数据源id", width = 15)
+    @ApiModelProperty(value = "数据源id")
+    private String dataSourceId;
+    /**
+     * 人群包名称
+     */
+    @Excel(name = "人群包名称", width = 15)
+    @ApiModelProperty(value = "人群包名称")
+    private String name;
+    /**
+     * 人群包来源
+     */
+    @Excel(name = "人群包来源", width = 15)
+    @ApiModelProperty(value = "人群包来源")
+    private String source;
+    /**
+     * 人群包状态
+     */
+    @Excel(name = "人群包状态", width = 15)
+    @ApiModelProperty(value = "人群包状态")
+    private Integer status;
+    /**
+     * 人群包覆盖人群数目
+     */
+    @Excel(name = "人群包覆盖人群数目", width = 15)
+    @ApiModelProperty(value = "人群包覆盖人群数目")
+    private Integer coverNum;
+    /**
+     * 上传类型人群包包含人群数目
+     */
+    @Excel(name = "上传类型人群包包含人群数目", width = 15)
+    @ApiModelProperty(value = "上传类型人群包包含人群数目")
+    private Integer uploadNum;
+    /**
+     * 人群分组
+     */
+    @Excel(name = "人群分组", width = 15)
+    @ApiModelProperty(value = "人群分组")
+    private String tag;
+    /**
+     * createTime
+     */
+    @ApiModelProperty(value = "createTime")
+    private Date createTime;
+    /**
+     * updateTime
+     */
+    @ApiModelProperty(value = "updateTime")
+    private Date updateTime;
+}

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

@@ -0,0 +1,246 @@
+package org.jeecg.modules.ctop.entity;
+
+import java.io.Serializable;
+import java.util.Date;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.TableField;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.springframework.format.annotation.DateTimeFormat;
+import org.jeecgframework.poi.excel.annotation.Excel;
+
+/**
+ * @Description: 今日头条受众模板信息
+ * @Author: jeecg-boot
+ * @Date: 2019-07-23
+ * @Version: V1.0
+ */
+@Data
+@TableName("ctop_bytedance_user_orientation_template")
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value = "ctop_bytedance_user_orientation_template对象", description = "今日头条受众模板信息")
+public class ByteDanceUserOrientationTemplate {
+
+    /**
+     * id
+     */
+    @TableId(type = IdType.UUID)
+    @ApiModelProperty(value = "id")
+    private Integer id;
+    /**
+     * 头条账号id
+     */
+    @Excel(name = "头条账号id", width = 15)
+    @ApiModelProperty(value = "头条账号id")
+    private Integer accountId;
+    /**
+     * 广告主id
+     */
+    @Excel(name = "广告主id", width = 15)
+    @ApiModelProperty(value = "广告主id")
+    private String advertiserId;
+    /**
+     * 定向人群包列表
+     */
+    @Excel(name = "定向人群包列表", width = 15)
+    @ApiModelProperty(value = "定向人群包列表")
+    private String retargetingTagsInclude;
+    /**
+     * 排除人群包列表
+     */
+    @Excel(name = "排除人群包列表", width = 15)
+    @ApiModelProperty(value = "排除人群包列表")
+    private String retargetingTagsExclude;
+    /**
+     * 受众性别
+     */
+    @Excel(name = "受众性别", width = 15)
+    @ApiModelProperty(value = "受众性别")
+    private String gender;
+    /**
+     * 年龄
+     */
+    @Excel(name = "年龄", width = 15)
+    @ApiModelProperty(value = "年龄")
+    private String age;
+    /**
+     * 受众最低android版本
+     */
+    @Excel(name = "受众最低android版本", width = 15)
+    @ApiModelProperty(value = "受众最低android版本")
+    private String androidOsv;
+    /**
+     * 受众最低ios版本
+     */
+    @Excel(name = "受众最低ios版本", width = 15)
+    @ApiModelProperty(value = "受众最低ios版本")
+    private String iosOsv;
+    /**
+     * 运营商类型
+     */
+    @Excel(name = "运营商类型", width = 15)
+    @ApiModelProperty(value = "运营商类型")
+    private String carrier;
+    /**
+     * 受众网络类型
+     */
+    @Excel(name = "受众网络类型", width = 15)
+    @ApiModelProperty(value = "受众网络类型")
+    private String ac;
+    /**
+     * 手机品牌
+     */
+    @Excel(name = "手机品牌", width = 15)
+    @ApiModelProperty(value = "手机品牌")
+    private String deviceBrand;
+    /**
+     * 受众文章分类
+     */
+    @Excel(name = "受众文章分类", width = 15)
+    @ApiModelProperty(value = "受众文章分类")
+    private String articleCategory;
+    /**
+     * 用户首次激活时间
+     */
+    @Excel(name = "用户首次激活时间", width = 15)
+    @ApiModelProperty(value = "用户首次激活时间")
+    private String activateType;
+    /**
+     * 受众平台
+     */
+    @Excel(name = "受众平台", width = 15)
+    @ApiModelProperty(value = "受众平台")
+    private String platform;
+    /**
+     * 地域定向城市或者区县列表
+     */
+    @Excel(name = "地域定向城市或者区县列表", width = 15)
+    @ApiModelProperty(value = "地域定向城市或者区县列表")
+    private String city;
+    /**
+     * 商圈ID数组
+     */
+    @Excel(name = "商圈ID数组", width = 15)
+    @ApiModelProperty(value = "商圈ID数组")
+    private String businessIds;
+    /**
+     * 地域类型
+     */
+    @Excel(name = "地域类型", width = 15)
+    @ApiModelProperty(value = "地域类型")
+    private String district;
+    /**
+     * 受众位置类型
+     */
+    @Excel(name = "受众位置类型", width = 15)
+    @ApiModelProperty(value = "受众位置类型")
+    private String locationType;
+    /**
+     * 兴趣分类
+     */
+    @Excel(name = "兴趣分类", width = 15)
+    @ApiModelProperty(value = "兴趣分类")
+    private String adTag;
+    /**
+     * 兴趣关键词, 传入具体的词id,非兴趣词包id
+     */
+    @Excel(name = "兴趣关键词, 传入具体的词id,非兴趣词包id", width = 15)
+    @ApiModelProperty(value = "兴趣关键词, 传入具体的词id,非兴趣词包id")
+    private String interestTags;
+    /**
+     * 行为定向
+     */
+    @Excel(name = "行为定向", width = 15)
+    @ApiModelProperty(value = "行为定向")
+    private String appBehaviorTarget;
+    /**
+     * APP行为定向,分类集合
+     */
+    @Excel(name = "APP行为定向,分类集合", width = 15)
+    @ApiModelProperty(value = "APP行为定向,分类集合")
+    private String appCategory;
+    /**
+     * APP行为定向,APP集合
+     */
+    @Excel(name = "APP行为定向,APP集合", width = 15)
+    @ApiModelProperty(value = "APP行为定向,APP集合")
+    private String appIds;
+    /**
+     * 产品目录ID(ID由查询产品目录接口得到)
+     */
+    @Excel(name = "产品目录ID(ID由查询产品目录接口得到)", width = 15)
+    @ApiModelProperty(value = "产品目录ID(ID由查询产品目录接口得到)")
+    private String productPlatformId;
+    /**
+     * H5地址参数
+     */
+    @Excel(name = "H5地址参数", width = 15)
+    @ApiModelProperty(value = "H5地址参数")
+    private String externalUrlParams;
+    /**
+     * 直达链接参数
+     */
+    @Excel(name = "直达链接参数", width = 15)
+    @ApiModelProperty(value = "直达链接参数")
+    private String openUrlParams;
+    /**
+     * 是否自定义商品定向
+     */
+    @Excel(name = "是否自定义商品定向", width = 15)
+    @ApiModelProperty(value = "是否自定义商品定向")
+    private String dpaLocalAudience;
+    /**
+     * 排除人群包
+     */
+    @Excel(name = "排除人群包", width = 15)
+    @ApiModelProperty(value = "排除人群包")
+    private String excludeCustomActions;
+    /**
+     * 包含人群包
+     */
+    @Excel(name = "包含人群包", width = 15)
+    @ApiModelProperty(value = "包含人群包")
+    private String includeCustomActions;
+    /**
+     * 精选流量包
+     */
+    @Excel(name = "精选流量包", width = 15)
+    @ApiModelProperty(value = "精选流量包")
+    private String superiorPopularityType;
+    /**
+     * 定向流量包ID数组
+     */
+    @Excel(name = "定向流量包ID数组", width = 15)
+    @ApiModelProperty(value = "定向流量包ID数组")
+    private String flowPackage;
+    /**
+     * 排除流量包ID数组
+     */
+    @Excel(name = "排除流量包ID数组", width = 15)
+    @ApiModelProperty(value = "排除流量包ID数组")
+    private String excludeFlowPackage;
+    /**
+     * status
+     */
+    @Excel(name = "status", width = 15)
+    @ApiModelProperty(value = "status")
+    private Integer status;
+    /**
+     * createTime
+     */
+    @ApiModelProperty(value = "createTime")
+    private Date createTime;
+    /**
+     * updateTime
+     */
+    @ApiModelProperty(value = "updateTime")
+    private Date updateTime;
+}

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

@@ -0,0 +1,120 @@
+package org.jeecg.modules.ctop.entity;
+
+import java.io.Serializable;
+import java.util.Date;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.TableField;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.springframework.format.annotation.DateTimeFormat;
+import org.jeecgframework.poi.excel.annotation.Excel;
+
+/**
+ * @Description: 投放目标模板信息
+ * @Author: jeecg-boot
+ * @Date: 2019-07-23
+ * @Version: V1.0
+ */
+@Data
+@TableName("ctop_bytedance_delivery_target_template")
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value = "ctop_bytedance_delivery_target_template对象", description = "投放目标模板信息")
+public class BytedanceDeliveryTargetTemplate {
+
+    /**
+     * id
+     */
+    @TableId(type = IdType.AUTO)
+    @ApiModelProperty(value = "id")
+    private Long id;
+    /**
+     * 头条平台id
+     */
+    @Excel(name = "头条平台id", width = 15)
+    @ApiModelProperty(value = "头条平台id")
+    private Long accountId;
+    /**
+     * 平台账号id
+     */
+    @Excel(name = "平台账号id", width = 15)
+    @ApiModelProperty(value = "平台账号id")
+    private String advertiserId;
+    /**
+     * 投放目标
+     */
+    @Excel(name = "投放目标", width = 15)
+    @ApiModelProperty(value = "投放目标")
+    private String deliveryTarget;
+    /**
+     * 下载方式
+     */
+    @Excel(name = "下载方式", width = 15)
+    @ApiModelProperty(value = "下载方式")
+    private String downloadType;
+    /**
+     * 下载链接
+     */
+    @Excel(name = "下载链接", width = 15)
+    @ApiModelProperty(value = "下载链接")
+    private String downloadUrl;
+    /**
+     * 落地页链接
+     */
+    @Excel(name = "落地页链接", width = 15)
+    @ApiModelProperty(value = "落地页链接")
+    private String externalUrl;
+    /**
+     * 转化目标
+     */
+    @Excel(name = "转化目标", width = 15)
+    @ApiModelProperty(value = "转化目标")
+    private String convertTarget;
+    /**
+     * 应用包名
+     */
+    @Excel(name = "应用包名", width = 15)
+    @ApiModelProperty(value = "应用包名")
+    private String packageName;
+    /**
+     * 直达链接启用状态
+     */
+    @Excel(name = "直达链接启用状态", width = 15)
+    @ApiModelProperty(value = "直达链接启用状态")
+    private String openUrlStatus;
+    /**
+     * 直达链接生成方式
+     */
+    @Excel(name = "直达链接生成方式", width = 15)
+    @ApiModelProperty(value = "直达链接生成方式")
+    private String openUrlCreateMode;
+    /**
+     * 跳转app链接
+     */
+    @Excel(name = "跳转app链接", width = 15)
+    @ApiModelProperty(value = "跳转app链接")
+    private String redirectUrl;
+    /**
+     * status
+     */
+    @Excel(name = "status", width = 15)
+    @ApiModelProperty(value = "status")
+    private Integer status;
+    /**
+     * createTime
+     */
+    @ApiModelProperty(value = "createTime")
+    private Date createTime;
+    /**
+     * updateTime
+     */
+    @ApiModelProperty(value = "updateTime")
+    private Date updateTime;
+}

+ 17 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/mapper/ByteDanceCustomAudienceMapper.java

@@ -0,0 +1,17 @@
+package org.jeecg.modules.ctop.mapper;
+
+import java.util.List;
+
+import org.apache.ibatis.annotations.Param;
+import org.jeecg.modules.ctop.entity.ByteDanceCustomAudience;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * @Description: 人群包信息
+ * @Author: jeecg-boot
+ * @Date: 2019-07-23
+ * @Version: V1.0
+ */
+public interface ByteDanceCustomAudienceMapper extends BaseMapper<ByteDanceCustomAudience> {
+
+}

+ 17 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/mapper/ByteDanceUserOrientationTemplateMapper.java

@@ -0,0 +1,17 @@
+package org.jeecg.modules.ctop.mapper;
+
+import java.util.List;
+
+import org.apache.ibatis.annotations.Param;
+import org.jeecg.modules.ctop.entity.ByteDanceUserOrientationTemplate;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * @Description: 今日头条受众模板信息
+ * @Author: jeecg-boot
+ * @Date: 2019-07-23
+ * @Version: V1.0
+ */
+public interface ByteDanceUserOrientationTemplateMapper extends BaseMapper<ByteDanceUserOrientationTemplate> {
+
+}

+ 17 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/mapper/BytedanceDeliveryTargetTemplateMapper.java

@@ -0,0 +1,17 @@
+package org.jeecg.modules.ctop.mapper;
+
+import java.util.List;
+
+import org.apache.ibatis.annotations.Param;
+import org.jeecg.modules.ctop.entity.BytedanceDeliveryTargetTemplate;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * @Description: 投放目标模板信息
+ * @Author: jeecg-boot
+ * @Date: 2019-07-23
+ * @Version: V1.0
+ */
+public interface BytedanceDeliveryTargetTemplateMapper extends BaseMapper<BytedanceDeliveryTargetTemplate> {
+
+}

+ 5 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/mapper/xml/ByteDanceCustomAudienceMapper.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="org.jeecg.modules.ctop.mapper.ByteDanceCustomAudienceMapper">
+
+</mapper>

+ 5 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/mapper/xml/ByteDanceUserOrientationTemplateMapper.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="org.jeecg.modules.ctop.mapper.ByteDanceUserOrientationTemplateMapper">
+
+</mapper>

+ 5 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/mapper/xml/BytedanceDeliveryTargetTemplateMapper.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="org.jeecg.modules.ctop.mapper.BytedanceDeliveryTargetTemplateMapper">
+
+</mapper>

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

@@ -28,4 +28,6 @@ public interface IByteDanceAdvertiserDataService {
     Map<String, Object> advertiserPlanUpdateBudget(String accountId, String adIds, String budgets);
 
     Map<String, Object> advertiserCreativeUpdateStatus(String accountId, String ids, String optStatus);
+
+    Map<String, Object> advertiserCustomAudienceSelect(String accountId);
 }

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

@@ -3,6 +3,8 @@ package org.jeecg.modules.ctop.service;
 import org.jeecg.modules.ctop.entity.ByteDanceCampaignTemplate;
 import com.baomidou.mybatisplus.extension.service.IService;
 
+import java.util.Map;
+
 /**
  * @Description: 今日头条广告组模板信息
  * @Author: jeecg-boot
@@ -11,4 +13,5 @@ import com.baomidou.mybatisplus.extension.service.IService;
  */
 public interface IByteDanceCampaignTemplateService extends IService<ByteDanceCampaignTemplate> {
 
+    Map<String, Object> insertTemplate(ByteDanceCampaignTemplate template);
 }

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

@@ -0,0 +1,14 @@
+package org.jeecg.modules.ctop.service;
+
+import org.jeecg.modules.ctop.entity.ByteDanceCustomAudience;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * @Description: 人群包信息
+ * @Author: jeecg-boot
+ * @Date: 2019-07-23
+ * @Version: V1.0
+ */
+public interface IByteDanceCustomAudienceService extends IService<ByteDanceCustomAudience> {
+
+}

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

@@ -0,0 +1,14 @@
+package org.jeecg.modules.ctop.service;
+
+import org.jeecg.modules.ctop.entity.ByteDanceUserOrientationTemplate;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * @Description: 今日头条受众模板信息
+ * @Author: jeecg-boot
+ * @Date: 2019-07-23
+ * @Version: V1.0
+ */
+public interface IByteDanceUserOrientationTemplateService extends IService<ByteDanceUserOrientationTemplate> {
+
+}

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

@@ -0,0 +1,17 @@
+package org.jeecg.modules.ctop.service;
+
+import org.jeecg.modules.ctop.entity.BytedanceDeliveryTargetTemplate;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+import java.util.Map;
+
+/**
+ * @Description: 投放目标模板信息
+ * @Author: jeecg-boot
+ * @Date: 2019-07-23
+ * @Version: V1.0
+ */
+public interface IBytedanceDeliveryTargetTemplateService extends IService<BytedanceDeliveryTargetTemplate> {
+
+    Map<String, Object> insertTemplate(BytedanceDeliveryTargetTemplate template);
+}

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

@@ -11,4 +11,5 @@ import com.baomidou.mybatisplus.extension.service.IService;
  */
 public interface ICTopOauthTokenService extends IService<CTopOauthToken> {
 
+    CTopOauthToken getOAuthTokenByAccountId(String accountId);
 }

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

@@ -5,9 +5,12 @@ import cn.com.ctop.common.utils.PropertiesUtils;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import org.apache.shiro.SecurityUtils;
+import org.jeecg.common.system.vo.LoginUser;
 import org.jeecg.modules.ctop.entity.*;
 import org.jeecg.modules.ctop.mapper.*;
 import org.jeecg.modules.ctop.service.IByteDanceAdvertiserDataService;
+import org.jeecg.modules.ctop.service.ICTopOauthTokenService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -590,6 +593,60 @@ public class ByteDanceAdvertiserDataServiceImpl implements IByteDanceAdvertiserD
         return resultMap;
     }
 
+    /**
+     * 查询人群包信息
+     *
+     * @return
+     */
+    @Override
+    public Map<String, Object> advertiserCustomAudienceSelect(String accountId) {
+        Map<String, Object> resultMap = new HashMap<>();
+        CTopOauthToken token = getOAuthTokenByAccountId(accountId);
+
+        String url = PropertiesUtils.getValue("bytedance_config", "bytedance_api_url") + PropertiesUtils.getValue("bytedance_config", "bytedance_v2_dmp_custom_audience_select");
+        Map<String, String> headers = new HashMap<>();
+        headers.put("Content-Type", "application/json");
+        headers.put("Access-Token", token.getAccessToken());
+
+        TreeMap<String, Object> params = new TreeMap<>();
+        params.put("select_type", "0");
+        params.put("advertiser_id", token.getAccountId() + "");
+        params.put("limit", "100");
+        params.put("offset", "0");
+        String result = HttpUtils.httpGetRequest(url, headers, params);
+        JSONObject jsonObject = JSONObject.parseObject(result);
+        Integer code = jsonObject.getInteger("code");
+
+        if (null == code || !code.equals(0)) {
+            logger.info("获取人群包信息接口异常==》accountId:{},message:{}", token.getAdvertiserId(), jsonObject.getString("message"));
+            resultMap.put("success", false);
+            resultMap.put("message", "获取人群包信息接口异常");
+            resultMap.put("code", -1);
+            return resultMap;
+        }
+        JSONArray data = jsonObject.getJSONObject("data").getJSONArray("custom_audience_list");
+        if (null == data || data.size() <= 0) {
+            logger.info("人群包信息不存在==》accountId:{},message:{}", token.getAdvertiserId(), jsonObject.getString("message"));
+            resultMap.put("success", false);
+            resultMap.put("message", "人群包信息不存在");
+            resultMap.put("code", -1);
+            return resultMap;
+        }
+        System.out.println(data.toJSONString());
+        for (int i = 0; i < data.size(); i++) {
+            JSONObject dataObject = data.getJSONObject(i);
+
+        }
+
+        resultMap.put("success", true);
+        resultMap.put("message", "人群包信息获取成功");
+        resultMap.put("code", 0);
+        return resultMap;
+    }
+
+    @Autowired
+    private ICTopOauthTokenService tokenService;
+
     @Autowired
     private ByteDanceCreativeMaterialMapper creativeMaterialMapper;
 

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

@@ -1,8 +1,16 @@
 package org.jeecg.modules.ctop.service.impl;
 
+import org.apache.shiro.SecurityUtils;
+import org.jeecg.common.system.vo.LoginUser;
+import org.jeecg.modules.ctop.entity.ByteDanceAdvertiser;
 import org.jeecg.modules.ctop.entity.ByteDanceBudgetTemplate;
+import org.jeecg.modules.ctop.entity.CTopOauthToken;
+import org.jeecg.modules.ctop.mapper.ByteDanceAdvertiserMapper;
 import org.jeecg.modules.ctop.mapper.ByteDanceBudgetTemplateMapper;
+import org.jeecg.modules.ctop.service.IByteDanceAdvertiserBudgetService;
+import org.jeecg.modules.ctop.service.IByteDanceAdvertiserService;
 import org.jeecg.modules.ctop.service.IByteDanceBudgetTemplateService;
+import org.jeecg.modules.ctop.service.ICTopOauthTokenService;
 import org.omg.CORBA.OBJ_ADAPTER;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -24,6 +32,13 @@ public class ByteDanceBudgetTemplateServiceImpl extends ServiceImpl<ByteDanceBud
     @Override
     public Map<String, Object> insertTemplate(ByteDanceBudgetTemplate template) {
         Map<String, Object> resultMap = new HashMap<>();
+        LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();
+        CTopOauthToken token = tokenService.getOAuthTokenByAccountId(user.getId());
+        template.setAdvertiserId(token.getAdvertiserId());
+        template.setToutiaoId(token.getAccountId());
+        template.setStatus(1);
+        template.setStartDate(template.getStartDate().substring(0, 10));
+        template.setEndDate(template.getEndDate().substring(0, 10));
         budgetTemplateMapper.insert(template);
         resultMap.put("success", true);
         resultMap.put("message", "模板保存成功");
@@ -31,5 +46,7 @@ public class ByteDanceBudgetTemplateServiceImpl extends ServiceImpl<ByteDanceBud
     }
 
     @Autowired
+    private ICTopOauthTokenService tokenService;
+    @Autowired
     private ByteDanceBudgetTemplateMapper budgetTemplateMapper;
 }

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

@@ -1,12 +1,21 @@
 package org.jeecg.modules.ctop.service.impl;
 
+import org.apache.shiro.SecurityUtils;
+import org.jeecg.common.system.vo.LoginUser;
+import org.jeecg.modules.ctop.entity.ByteDanceCampaign;
 import org.jeecg.modules.ctop.entity.ByteDanceCampaignTemplate;
+import org.jeecg.modules.ctop.entity.CTopOauthToken;
 import org.jeecg.modules.ctop.mapper.ByteDanceCampaignTemplateMapper;
 import org.jeecg.modules.ctop.service.IByteDanceCampaignTemplateService;
+import org.jeecg.modules.ctop.service.ICTopOauthTokenService;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 
+import java.util.HashMap;
+import java.util.Map;
+
 /**
  * @Description: 今日头条广告组模板信息
  * @Author: jeecg-boot
@@ -16,4 +25,21 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 @Service
 public class ByteDanceCampaignTemplateServiceImpl extends ServiceImpl<ByteDanceCampaignTemplateMapper, ByteDanceCampaignTemplate> implements IByteDanceCampaignTemplateService {
 
+    @Override
+    public Map<String, Object> insertTemplate(ByteDanceCampaignTemplate template) {
+        Map<String, Object> resultMap = new HashMap<>();
+        LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();
+        CTopOauthToken token = tokenService.getOAuthTokenByAccountId(user.getId());
+        template.setAccountId(token.getAccountId());
+        template.setAdvertiserId(token.getAdvertiserId());
+        campaignTemplateMapper.insert(template);
+        resultMap.put("success", true);
+        resultMap.put("message", "模板保存成功");
+        return resultMap;
+    }
+
+    @Autowired
+    private ByteDanceCampaignTemplateMapper campaignTemplateMapper;
+    @Autowired
+    private ICTopOauthTokenService tokenService;
 }

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

@@ -0,0 +1,19 @@
+package org.jeecg.modules.ctop.service.impl;
+
+import org.jeecg.modules.ctop.entity.ByteDanceCustomAudience;
+import org.jeecg.modules.ctop.mapper.ByteDanceCustomAudienceMapper;
+import org.jeecg.modules.ctop.service.IByteDanceCustomAudienceService;
+import org.springframework.stereotype.Service;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+
+/**
+ * @Description: 人群包信息
+ * @Author: jeecg-boot
+ * @Date: 2019-07-23
+ * @Version: V1.0
+ */
+@Service
+public class ByteDanceCustomAudienceServiceImpl extends ServiceImpl<ByteDanceCustomAudienceMapper, ByteDanceCustomAudience> implements IByteDanceCustomAudienceService {
+
+}

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

@@ -0,0 +1,19 @@
+package org.jeecg.modules.ctop.service.impl;
+
+import org.jeecg.modules.ctop.entity.ByteDanceUserOrientationTemplate;
+import org.jeecg.modules.ctop.mapper.ByteDanceUserOrientationTemplateMapper;
+import org.jeecg.modules.ctop.service.IByteDanceUserOrientationTemplateService;
+import org.springframework.stereotype.Service;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+
+/**
+ * @Description: 今日头条受众模板信息
+ * @Author: jeecg-boot
+ * @Date: 2019-07-23
+ * @Version: V1.0
+ */
+@Service
+public class ByteDanceUserOrientationTemplateServiceImpl extends ServiceImpl<ByteDanceUserOrientationTemplateMapper, ByteDanceUserOrientationTemplate> implements IByteDanceUserOrientationTemplateService {
+
+}

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

@@ -0,0 +1,45 @@
+package org.jeecg.modules.ctop.service.impl;
+
+import org.apache.shiro.SecurityUtils;
+import org.jeecg.common.system.vo.LoginUser;
+import org.jeecg.modules.ctop.entity.BytedanceDeliveryTargetTemplate;
+import org.jeecg.modules.ctop.entity.CTopOauthToken;
+import org.jeecg.modules.ctop.mapper.BytedanceDeliveryTargetTemplateMapper;
+import org.jeecg.modules.ctop.service.IBytedanceDeliveryTargetTemplateService;
+import org.jeecg.modules.ctop.service.ICTopOauthTokenService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @Description: 投放目标模板信息
+ * @Author: jeecg-boot
+ * @Date: 2019-07-23
+ * @Version: V1.0
+ */
+@Service
+public class BytedanceDeliveryTargetTemplateServiceImpl extends ServiceImpl<BytedanceDeliveryTargetTemplateMapper, BytedanceDeliveryTargetTemplate> implements IBytedanceDeliveryTargetTemplateService {
+
+    @Override
+    public Map<String, Object> insertTemplate(BytedanceDeliveryTargetTemplate template) {
+        Map<String, Object> resultMap = new HashMap<>();
+        LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();
+        CTopOauthToken token = tokenService.getOAuthTokenByAccountId(user.getId());
+        template.setAccountId(token.getAccountId());
+        template.setAdvertiserId(token.getAdvertiserId());
+        template.setStatus(1);
+        deliveryTargetTemplateMapper.insert(template);
+        resultMap.put("success", true);
+        resultMap.put("message", "投放目标模板保存成功");
+        return resultMap;
+    }
+
+    @Autowired
+    private ICTopOauthTokenService tokenService;
+    @Autowired
+    private BytedanceDeliveryTargetTemplateMapper deliveryTargetTemplateMapper;
+}

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

@@ -1,8 +1,10 @@
 package org.jeecg.modules.ctop.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import org.jeecg.modules.ctop.entity.CTopOauthToken;
 import org.jeecg.modules.ctop.mapper.CTopOauthTokenMapper;
 import org.jeecg.modules.ctop.service.ICTopOauthTokenService;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@@ -16,4 +18,14 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 @Service
 public class CTopOauthTokenServiceImpl extends ServiceImpl<CTopOauthTokenMapper, CTopOauthToken> implements ICTopOauthTokenService {
 
+    @Autowired
+    private CTopOauthTokenMapper cTopOauthTokenMapper;
+
+    @Override
+    public CTopOauthToken getOAuthTokenByAccountId(String accountId) {
+        QueryWrapper<CTopOauthToken> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("advertiser_id", accountId).orderByDesc("create_time");
+        CTopOauthToken cTopOauthToken = cTopOauthTokenMapper.selectOne(queryWrapper);
+        return cTopOauthToken;
+    }
 }

+ 218 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/vue/ByteDanceCustomAudienceList.vue

@@ -0,0 +1,218 @@
+<template>
+    <a-card :bordered="false">
+
+        <!-- 查询区域 -->
+        <div class="table-page-search-wrapper">
+            <a-form layout="inline">
+                <a-row :gutter="24">
+
+                    <a-col :md="6" :sm="8">
+                        <a-form-item label="广告主id">
+                            <a-input placeholder="请输入广告主id" v-model="queryParam.advertiserId"></a-input>
+                        </a-form-item>
+                    </a-col>
+                    <a-col :md="6" :sm="8">
+                        <a-form-item label="头条账号id">
+                            <a-input placeholder="请输入头条账号id" v-model="queryParam.accountId"></a-input>
+                        </a-form-item>
+                    </a-col>
+                    <template v-if="toggleSearchStatus">
+                        <a-col :md="6" :sm="8">
+                            <a-form-item label="是否删除">
+                                <a-input placeholder="请输入是否删除" v-model="queryParam.isdel"></a-input>
+                            </a-form-item>
+                        </a-col>
+                        <a-col :md="6" :sm="8">
+                            <a-form-item label="数据源id">
+                                <a-input placeholder="请输入数据源id" v-model="queryParam.dataSourceId"></a-input>
+                            </a-form-item>
+                        </a-col>
+                        <a-col :md="6" :sm="8">
+                            <a-form-item label="人群包名称">
+                                <a-input placeholder="请输入人群包名称" v-model="queryParam.name"></a-input>
+                            </a-form-item>
+                        </a-col>
+                    </template>
+                    <a-col :md="6" :sm="8">
+            <span style="float: left;overflow: hidden;" class="table-page-search-submitButtons">
+              <a-button type="primary" @click="searchQuery" icon="search">查询</a-button>
+              <a-button type="primary" @click="searchReset" icon="reload" style="margin-left: 8px">重置</a-button>
+              <a @click="handleToggleSearch" style="margin-left: 8px">
+                {{ toggleSearchStatus ? '收起' : '展开' }}
+                <a-icon :type="toggleSearchStatus ? 'up' : 'down'"/>
+              </a>
+            </span>
+                    </a-col>
+
+                </a-row>
+            </a-form>
+        </div>
+
+        <!-- 操作按钮区域 -->
+        <div class="table-operator">
+            <a-button @click="handleAdd" type="primary" icon="plus">新增</a-button>
+            <a-button type="primary" icon="download" @click="handleExportXls('人群包信息')">导出</a-button>
+            <a-upload name="file" :showUploadList="false" :multiple="false" :headers="tokenHeader"
+                      :action="importExcelUrl" @change="handleImportExcel">
+                <a-button type="primary" icon="import">导入</a-button>
+            </a-upload>
+            <a-dropdown v-if="selectedRowKeys.length > 0">
+                <a-menu slot="overlay">
+                    <a-menu-item key="1" @click="batchDel">
+                        <a-icon type="delete"/>
+                        删除
+                    </a-menu-item>
+                </a-menu>
+                <a-button style="margin-left: 8px"> 批量操作
+                    <a-icon type="down"/>
+                </a-button>
+            </a-dropdown>
+        </div>
+
+        <!-- table区域-begin -->
+        <div>
+            <div class="ant-alert ant-alert-info" style="margin-bottom: 16px;">
+                <i class="anticon anticon-info-circle ant-alert-icon"></i> 已选择 <a style="font-weight: 600">{{
+                selectedRowKeys.length }}</a>项
+                <a style="margin-left: 24px" @click="onClearSelected">清空</a>
+            </div>
+
+            <a-table
+                    ref="table"
+                    size="middle"
+                    bordered
+                    rowKey="id"
+                    :columns="columns"
+                    :dataSource="dataSource"
+                    :pagination="ipagination"
+                    :loading="loading"
+                    :rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}"
+                    @change="handleTableChange">
+
+        <span slot="action" slot-scope="text, record">
+          <a @click="handleEdit(record)">编辑</a>
+
+          <a-divider type="vertical"/>
+          <a-dropdown>
+            <a class="ant-dropdown-link">更多 <a-icon type="down"/></a>
+            <a-menu slot="overlay">
+              <a-menu-item>
+                <a-popconfirm title="确定删除吗?" @confirm="() => handleDelete(record.id)">
+                  <a>删除</a>
+                </a-popconfirm>
+              </a-menu-item>
+            </a-menu>
+          </a-dropdown>
+        </span>
+
+            </a-table>
+        </div>
+        <!-- table区域-end -->
+
+        <!-- 表单区域 -->
+        <byteDanceCustomAudience-modal ref="modalForm" @ok="modalFormOk"></byteDanceCustomAudience-modal>
+    </a-card>
+</template>
+
+<script>
+    import ByteDanceCustomAudienceModal from './modules/ByteDanceCustomAudienceModal'
+    import {JeecgListMixin} from '@/mixins/JeecgListMixin'
+
+    export default {
+        name: "ByteDanceCustomAudienceList",
+        mixins: [JeecgListMixin],
+        components: {
+            ByteDanceCustomAudienceModal
+        },
+        data() {
+            return {
+                description: '人群包信息管理页面',
+                // 表头
+                columns: [
+                    {
+                        title: '#',
+                        dataIndex: '',
+                        key: 'rowIndex',
+                        width: 60,
+                        align: "center",
+                        customRender: function (t, r, index) {
+                            return parseInt(index) + 1;
+                        }
+                    },
+                    {
+                        title: '广告主id',
+                        align: "center",
+                        dataIndex: 'advertiserId'
+                    },
+                    {
+                        title: '头条账号id',
+                        align: "center",
+                        dataIndex: 'accountId'
+                    },
+                    {
+                        title: '是否删除',
+                        align: "center",
+                        dataIndex: 'isdel'
+                    },
+                    {
+                        title: '数据源id',
+                        align: "center",
+                        dataIndex: 'dataSourceId'
+                    },
+                    {
+                        title: '人群包名称',
+                        align: "center",
+                        dataIndex: 'name'
+                    },
+                    {
+                        title: '人群包来源',
+                        align: "center",
+                        dataIndex: 'source'
+                    },
+                    {
+                        title: '人群包状态',
+                        align: "center",
+                        dataIndex: 'status'
+                    },
+                    {
+                        title: '人群包覆盖人群数目',
+                        align: "center",
+                        dataIndex: 'coverNum'
+                    },
+                    {
+                        title: '上传类型人群包包含人群数目',
+                        align: "center",
+                        dataIndex: 'uploadNum'
+                    },
+                    {
+                        title: '人群分组',
+                        align: "center",
+                        dataIndex: 'tag'
+                    },
+                    {
+                        title: '操作',
+                        dataIndex: 'action',
+                        align: "center",
+                        scopedSlots: {customRender: 'action'},
+                    }
+                ],
+                url: {
+                    list: "/ctop/byteDanceCustomAudience/list",
+                    delete: "/ctop/byteDanceCustomAudience/delete",
+                    deleteBatch: "/ctop/byteDanceCustomAudience/deleteBatch",
+                    exportXlsUrl: "ctop/byteDanceCustomAudience/exportXls",
+                    importExcelUrl: "ctop/byteDanceCustomAudience/importExcel",
+                },
+            }
+        },
+        computed: {
+            importExcelUrl: function () {
+                return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`;
+            }
+        },
+        methods: {}
+    }
+</script>
+<style scoped>
+    @import '~@assets/less/common.less'
+</style>

+ 334 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/vue/ByteDanceUserOrientationTemplateList.vue

@@ -0,0 +1,334 @@
+<template>
+    <a-card :bordered="false">
+
+        <!-- 查询区域 -->
+        <div class="table-page-search-wrapper">
+            <a-form layout="inline">
+                <a-row :gutter="24">
+
+                    <a-col :md="6" :sm="8">
+                        <a-form-item label="头条账号id">
+                            <a-input placeholder="请输入头条账号id" v-model="queryParam.accountId"></a-input>
+                        </a-form-item>
+                    </a-col>
+                    <a-col :md="6" :sm="8">
+                        <a-form-item label="广告主id">
+                            <a-input placeholder="请输入广告主id" v-model="queryParam.advertiserId"></a-input>
+                        </a-form-item>
+                    </a-col>
+                    <template v-if="toggleSearchStatus">
+                        <a-col :md="6" :sm="8">
+                            <a-form-item label="定向人群包列表">
+                                <a-input placeholder="请输入定向人群包列表" v-model="queryParam.retargetingTagsInclude"></a-input>
+                            </a-form-item>
+                        </a-col>
+                        <a-col :md="6" :sm="8">
+                            <a-form-item label="排除人群包列表">
+                                <a-input placeholder="请输入排除人群包列表" v-model="queryParam.retargetingTagsExclude"></a-input>
+                            </a-form-item>
+                        </a-col>
+                        <a-col :md="6" :sm="8">
+                            <a-form-item label="受众性别">
+                                <a-input placeholder="请输入受众性别" v-model="queryParam.gender"></a-input>
+                            </a-form-item>
+                        </a-col>
+                    </template>
+                    <a-col :md="6" :sm="8">
+            <span style="float: left;overflow: hidden;" class="table-page-search-submitButtons">
+              <a-button type="primary" @click="searchQuery" icon="search">查询</a-button>
+              <a-button type="primary" @click="searchReset" icon="reload" style="margin-left: 8px">重置</a-button>
+              <a @click="handleToggleSearch" style="margin-left: 8px">
+                {{ toggleSearchStatus ? '收起' : '展开' }}
+                <a-icon :type="toggleSearchStatus ? 'up' : 'down'"/>
+              </a>
+            </span>
+                    </a-col>
+
+                </a-row>
+            </a-form>
+        </div>
+
+        <!-- 操作按钮区域 -->
+        <div class="table-operator">
+            <a-button @click="handleAdd" type="primary" icon="plus">新增</a-button>
+            <a-button type="primary" icon="download" @click="handleExportXls('今日头条受众模板信息')">导出</a-button>
+            <a-upload name="file" :showUploadList="false" :multiple="false" :headers="tokenHeader"
+                      :action="importExcelUrl" @change="handleImportExcel">
+                <a-button type="primary" icon="import">导入</a-button>
+            </a-upload>
+            <a-dropdown v-if="selectedRowKeys.length > 0">
+                <a-menu slot="overlay">
+                    <a-menu-item key="1" @click="batchDel">
+                        <a-icon type="delete"/>
+                        删除
+                    </a-menu-item>
+                </a-menu>
+                <a-button style="margin-left: 8px"> 批量操作
+                    <a-icon type="down"/>
+                </a-button>
+            </a-dropdown>
+        </div>
+
+        <!-- table区域-begin -->
+        <div>
+            <div class="ant-alert ant-alert-info" style="margin-bottom: 16px;">
+                <i class="anticon anticon-info-circle ant-alert-icon"></i> 已选择 <a style="font-weight: 600">{{
+                selectedRowKeys.length }}</a>项
+                <a style="margin-left: 24px" @click="onClearSelected">清空</a>
+            </div>
+
+            <a-table
+                    ref="table"
+                    size="middle"
+                    bordered
+                    rowKey="id"
+                    :columns="columns"
+                    :dataSource="dataSource"
+                    :pagination="ipagination"
+                    :loading="loading"
+                    :rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}"
+                    @change="handleTableChange">
+
+        <span slot="action" slot-scope="text, record">
+          <a @click="handleEdit(record)">编辑</a>
+
+          <a-divider type="vertical"/>
+          <a-dropdown>
+            <a class="ant-dropdown-link">更多 <a-icon type="down"/></a>
+            <a-menu slot="overlay">
+              <a-menu-item>
+                <a-popconfirm title="确定删除吗?" @confirm="() => handleDelete(record.id)">
+                  <a>删除</a>
+                </a-popconfirm>
+              </a-menu-item>
+            </a-menu>
+          </a-dropdown>
+        </span>
+
+            </a-table>
+        </div>
+        <!-- table区域-end -->
+
+        <!-- 表单区域 -->
+        <byteDanceUserOrientationTemplate-modal ref="modalForm"
+                                                @ok="modalFormOk"></byteDanceUserOrientationTemplate-modal>
+    </a-card>
+</template>
+
+<script>
+    import ByteDanceUserOrientationTemplateModal from './modules/ByteDanceUserOrientationTemplateModal'
+    import {JeecgListMixin} from '@/mixins/JeecgListMixin'
+
+    export default {
+        name: "ByteDanceUserOrientationTemplateList",
+        mixins: [JeecgListMixin],
+        components: {
+            ByteDanceUserOrientationTemplateModal
+        },
+        data() {
+            return {
+                description: '今日头条受众模板信息管理页面',
+                // 表头
+                columns: [
+                    {
+                        title: '#',
+                        dataIndex: '',
+                        key: 'rowIndex',
+                        width: 60,
+                        align: "center",
+                        customRender: function (t, r, index) {
+                            return parseInt(index) + 1;
+                        }
+                    },
+                    {
+                        title: '头条账号id',
+                        align: "center",
+                        dataIndex: 'accountId'
+                    },
+                    {
+                        title: '广告主id',
+                        align: "center",
+                        dataIndex: 'advertiserId'
+                    },
+                    {
+                        title: '定向人群包列表',
+                        align: "center",
+                        dataIndex: 'retargetingTagsInclude'
+                    },
+                    {
+                        title: '排除人群包列表',
+                        align: "center",
+                        dataIndex: 'retargetingTagsExclude'
+                    },
+                    {
+                        title: '受众性别',
+                        align: "center",
+                        dataIndex: 'gender'
+                    },
+                    {
+                        title: '年龄',
+                        align: "center",
+                        dataIndex: 'age'
+                    },
+                    {
+                        title: '受众最低android版本',
+                        align: "center",
+                        dataIndex: 'androidOsv'
+                    },
+                    {
+                        title: '受众最低ios版本',
+                        align: "center",
+                        dataIndex: 'iosOsv'
+                    },
+                    {
+                        title: '运营商类型',
+                        align: "center",
+                        dataIndex: 'carrier'
+                    },
+                    {
+                        title: '受众网络类型',
+                        align: "center",
+                        dataIndex: 'ac'
+                    },
+                    {
+                        title: '手机品牌',
+                        align: "center",
+                        dataIndex: 'deviceBrand'
+                    },
+                    {
+                        title: '受众文章分类',
+                        align: "center",
+                        dataIndex: 'articleCategory'
+                    },
+                    {
+                        title: '用户首次激活时间',
+                        align: "center",
+                        dataIndex: 'activateType'
+                    },
+                    {
+                        title: '受众平台',
+                        align: "center",
+                        dataIndex: 'platform'
+                    },
+                    {
+                        title: '地域定向城市或者区县列表',
+                        align: "center",
+                        dataIndex: 'city'
+                    },
+                    {
+                        title: '商圈ID数组',
+                        align: "center",
+                        dataIndex: 'businessIds'
+                    },
+                    {
+                        title: '地域类型',
+                        align: "center",
+                        dataIndex: 'district'
+                    },
+                    {
+                        title: '受众位置类型',
+                        align: "center",
+                        dataIndex: 'locationType'
+                    },
+                    {
+                        title: '兴趣分类',
+                        align: "center",
+                        dataIndex: 'adTag'
+                    },
+                    {
+                        title: '兴趣关键词, 传入具体的词id,非兴趣词包id',
+                        align: "center",
+                        dataIndex: 'interestTags'
+                    },
+                    {
+                        title: '行为定向',
+                        align: "center",
+                        dataIndex: 'appBehaviorTarget'
+                    },
+                    {
+                        title: 'APP行为定向,分类集合',
+                        align: "center",
+                        dataIndex: 'appCategory'
+                    },
+                    {
+                        title: 'APP行为定向,APP集合',
+                        align: "center",
+                        dataIndex: 'appIds'
+                    },
+                    {
+                        title: '产品目录ID(ID由查询产品目录接口得到)',
+                        align: "center",
+                        dataIndex: 'productPlatformId'
+                    },
+                    {
+                        title: 'H5地址参数',
+                        align: "center",
+                        dataIndex: 'externalUrlParams'
+                    },
+                    {
+                        title: '直达链接参数',
+                        align: "center",
+                        dataIndex: 'openUrlParams'
+                    },
+                    {
+                        title: '是否自定义商品定向',
+                        align: "center",
+                        dataIndex: 'dpaLocalAudience'
+                    },
+                    {
+                        title: '排除人群包',
+                        align: "center",
+                        dataIndex: 'excludeCustomActions'
+                    },
+                    {
+                        title: '包含人群包',
+                        align: "center",
+                        dataIndex: 'includeCustomActions'
+                    },
+                    {
+                        title: '精选流量包',
+                        align: "center",
+                        dataIndex: 'superiorPopularityType'
+                    },
+                    {
+                        title: '定向流量包ID数组',
+                        align: "center",
+                        dataIndex: 'flowPackage'
+                    },
+                    {
+                        title: '排除流量包ID数组',
+                        align: "center",
+                        dataIndex: 'excludeFlowPackage'
+                    },
+                    {
+                        title: 'status',
+                        align: "center",
+                        dataIndex: 'status'
+                    },
+                    {
+                        title: '操作',
+                        dataIndex: 'action',
+                        align: "center",
+                        scopedSlots: {customRender: 'action'},
+                    }
+                ],
+                url: {
+                    list: "/ctop/byteDanceUserOrientationTemplate/list",
+                    delete: "/ctop/byteDanceUserOrientationTemplate/delete",
+                    deleteBatch: "/ctop/byteDanceUserOrientationTemplate/deleteBatch",
+                    exportXlsUrl: "ctop/byteDanceUserOrientationTemplate/exportXls",
+                    importExcelUrl: "ctop/byteDanceUserOrientationTemplate/importExcel",
+                },
+            }
+        },
+        computed: {
+            importExcelUrl: function () {
+                return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`;
+            }
+        },
+        methods: {}
+    }
+</script>
+<style scoped>
+    @import '~@assets/less/common.less'
+</style>

+ 229 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/vue/BytedanceDeliveryTargetTemplateList.vue

@@ -0,0 +1,229 @@
+<template>
+    <a-card :bordered="false">
+
+        <!-- 查询区域 -->
+        <div class="table-page-search-wrapper">
+            <a-form layout="inline">
+                <a-row :gutter="24">
+
+                    <a-col :md="6" :sm="8">
+                        <a-form-item label="头条平台id">
+                            <a-input placeholder="请输入头条平台id" v-model="queryParam.accountId"></a-input>
+                        </a-form-item>
+                    </a-col>
+                    <a-col :md="6" :sm="8">
+                        <a-form-item label="平台账号id">
+                            <a-input placeholder="请输入平台账号id" v-model="queryParam.advertiserId"></a-input>
+                        </a-form-item>
+                    </a-col>
+                    <template v-if="toggleSearchStatus">
+                        <a-col :md="6" :sm="8">
+                            <a-form-item label="投放目标">
+                                <a-input placeholder="请输入投放目标" v-model="queryParam.deliveryTarget"></a-input>
+                            </a-form-item>
+                        </a-col>
+                        <a-col :md="6" :sm="8">
+                            <a-form-item label="下载方式">
+                                <a-input placeholder="请输入下载方式" v-model="queryParam.downloadType"></a-input>
+                            </a-form-item>
+                        </a-col>
+                        <a-col :md="6" :sm="8">
+                            <a-form-item label="下载链接">
+                                <a-input placeholder="请输入下载链接" v-model="queryParam.downloadUrl"></a-input>
+                            </a-form-item>
+                        </a-col>
+                    </template>
+                    <a-col :md="6" :sm="8">
+            <span style="float: left;overflow: hidden;" class="table-page-search-submitButtons">
+              <a-button type="primary" @click="searchQuery" icon="search">查询</a-button>
+              <a-button type="primary" @click="searchReset" icon="reload" style="margin-left: 8px">重置</a-button>
+              <a @click="handleToggleSearch" style="margin-left: 8px">
+                {{ toggleSearchStatus ? '收起' : '展开' }}
+                <a-icon :type="toggleSearchStatus ? 'up' : 'down'"/>
+              </a>
+            </span>
+                    </a-col>
+
+                </a-row>
+            </a-form>
+        </div>
+
+        <!-- 操作按钮区域 -->
+        <div class="table-operator">
+            <a-button @click="handleAdd" type="primary" icon="plus">新增</a-button>
+            <a-button type="primary" icon="download" @click="handleExportXls('投放目标模板信息')">导出</a-button>
+            <a-upload name="file" :showUploadList="false" :multiple="false" :headers="tokenHeader"
+                      :action="importExcelUrl" @change="handleImportExcel">
+                <a-button type="primary" icon="import">导入</a-button>
+            </a-upload>
+            <a-dropdown v-if="selectedRowKeys.length > 0">
+                <a-menu slot="overlay">
+                    <a-menu-item key="1" @click="batchDel">
+                        <a-icon type="delete"/>
+                        删除
+                    </a-menu-item>
+                </a-menu>
+                <a-button style="margin-left: 8px"> 批量操作
+                    <a-icon type="down"/>
+                </a-button>
+            </a-dropdown>
+        </div>
+
+        <!-- table区域-begin -->
+        <div>
+            <div class="ant-alert ant-alert-info" style="margin-bottom: 16px;">
+                <i class="anticon anticon-info-circle ant-alert-icon"></i> 已选择 <a style="font-weight: 600">{{
+                selectedRowKeys.length }}</a>项
+                <a style="margin-left: 24px" @click="onClearSelected">清空</a>
+            </div>
+
+            <a-table
+                    ref="table"
+                    size="middle"
+                    bordered
+                    rowKey="id"
+                    :columns="columns"
+                    :dataSource="dataSource"
+                    :pagination="ipagination"
+                    :loading="loading"
+                    :rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}"
+                    @change="handleTableChange">
+
+        <span slot="action" slot-scope="text, record">
+          <a @click="handleEdit(record)">编辑</a>
+
+          <a-divider type="vertical"/>
+          <a-dropdown>
+            <a class="ant-dropdown-link">更多 <a-icon type="down"/></a>
+            <a-menu slot="overlay">
+              <a-menu-item>
+                <a-popconfirm title="确定删除吗?" @confirm="() => handleDelete(record.id)">
+                  <a>删除</a>
+                </a-popconfirm>
+              </a-menu-item>
+            </a-menu>
+          </a-dropdown>
+        </span>
+
+            </a-table>
+        </div>
+        <!-- table区域-end -->
+
+        <!-- 表单区域 -->
+        <bytedanceDeliveryTargetTemplate-modal ref="modalForm"
+                                               @ok="modalFormOk"></bytedanceDeliveryTargetTemplate-modal>
+    </a-card>
+</template>
+
+<script>
+    import BytedanceDeliveryTargetTemplateModal from './modules/BytedanceDeliveryTargetTemplateModal'
+    import {JeecgListMixin} from '@/mixins/JeecgListMixin'
+
+    export default {
+        name: "BytedanceDeliveryTargetTemplateList",
+        mixins: [JeecgListMixin],
+        components: {
+            BytedanceDeliveryTargetTemplateModal
+        },
+        data() {
+            return {
+                description: '投放目标模板信息管理页面',
+                // 表头
+                columns: [
+                    {
+                        title: '#',
+                        dataIndex: '',
+                        key: 'rowIndex',
+                        width: 60,
+                        align: "center",
+                        customRender: function (t, r, index) {
+                            return parseInt(index) + 1;
+                        }
+                    },
+                    {
+                        title: '头条平台id',
+                        align: "center",
+                        dataIndex: 'accountId'
+                    },
+                    {
+                        title: '平台账号id',
+                        align: "center",
+                        dataIndex: 'advertiserId'
+                    },
+                    {
+                        title: '投放目标',
+                        align: "center",
+                        dataIndex: 'deliveryTarget'
+                    },
+                    {
+                        title: '下载方式',
+                        align: "center",
+                        dataIndex: 'downloadType'
+                    },
+                    {
+                        title: '下载链接',
+                        align: "center",
+                        dataIndex: 'downloadUrl'
+                    },
+                    {
+                        title: '落地页链接',
+                        align: "center",
+                        dataIndex: 'externalUrl'
+                    },
+                    {
+                        title: '转化目标',
+                        align: "center",
+                        dataIndex: 'convertTarget'
+                    },
+                    {
+                        title: '应用包名',
+                        align: "center",
+                        dataIndex: 'packageName'
+                    },
+                    {
+                        title: '直达链接启用状态',
+                        align: "center",
+                        dataIndex: 'openUrlStatus'
+                    },
+                    {
+                        title: '直达链接生成方式',
+                        align: "center",
+                        dataIndex: 'openUrlCreateMode'
+                    },
+                    {
+                        title: '跳转app链接',
+                        align: "center",
+                        dataIndex: 'redirectUrl'
+                    },
+                    {
+                        title: 'status',
+                        align: "center",
+                        dataIndex: 'status'
+                    },
+                    {
+                        title: '操作',
+                        dataIndex: 'action',
+                        align: "center",
+                        scopedSlots: {customRender: 'action'},
+                    }
+                ],
+                url: {
+                    list: "/ctop/bytedanceDeliveryTargetTemplate/list",
+                    delete: "/ctop/bytedanceDeliveryTargetTemplate/delete",
+                    deleteBatch: "/ctop/bytedanceDeliveryTargetTemplate/deleteBatch",
+                    exportXlsUrl: "ctop/bytedanceDeliveryTargetTemplate/exportXls",
+                    importExcelUrl: "ctop/bytedanceDeliveryTargetTemplate/importExcel",
+                },
+            }
+        },
+        computed: {
+            importExcelUrl: function () {
+                return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`;
+            }
+        },
+        methods: {}
+    }
+</script>
+<style scoped>
+    @import '~@assets/less/common.less'
+</style>

+ 176 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/vue/modules/ByteDanceCustomAudienceModal.vue

@@ -0,0 +1,176 @@
+<template>
+    <a-modal
+            :title="title"
+            :width="800"
+            :visible="visible"
+            :confirmLoading="confirmLoading"
+            @ok="handleOk"
+            @cancel="handleCancel"
+            cancelText="关闭">
+
+        <a-spin :spinning="confirmLoading">
+            <a-form :form="form">
+
+                <a-form-item
+                        :labelCol="labelCol"
+                        :wrapperCol="wrapperCol"
+                        label="广告主id">
+                    <a-input placeholder="请输入广告主id" v-decorator="['advertiserId', {}]"/>
+                </a-form-item>
+                <a-form-item
+                        :labelCol="labelCol"
+                        :wrapperCol="wrapperCol"
+                        label="头条账号id">
+                    <a-input placeholder="请输入头条账号id" v-decorator="['accountId', {}]"/>
+                </a-form-item>
+                <a-form-item
+                        :labelCol="labelCol"
+                        :wrapperCol="wrapperCol"
+                        label="是否删除">
+                    <a-input-number v-decorator="[ 'isdel', {}]"/>
+                </a-form-item>
+                <a-form-item
+                        :labelCol="labelCol"
+                        :wrapperCol="wrapperCol"
+                        label="数据源id">
+                    <a-input placeholder="请输入数据源id" v-decorator="['dataSourceId', {}]"/>
+                </a-form-item>
+                <a-form-item
+                        :labelCol="labelCol"
+                        :wrapperCol="wrapperCol"
+                        label="人群包名称">
+                    <a-input placeholder="请输入人群包名称" v-decorator="['name', {}]"/>
+                </a-form-item>
+                <a-form-item
+                        :labelCol="labelCol"
+                        :wrapperCol="wrapperCol"
+                        label="人群包来源">
+                    <a-input placeholder="请输入人群包来源" v-decorator="['source', {}]"/>
+                </a-form-item>
+                <a-form-item
+                        :labelCol="labelCol"
+                        :wrapperCol="wrapperCol"
+                        label="人群包状态">
+                    <a-input-number v-decorator="[ 'status', {}]"/>
+                </a-form-item>
+                <a-form-item
+                        :labelCol="labelCol"
+                        :wrapperCol="wrapperCol"
+                        label="人群包覆盖人群数目">
+                    <a-input placeholder="请输入人群包覆盖人群数目" v-decorator="['coverNum', {}]"/>
+                </a-form-item>
+                <a-form-item
+                        :labelCol="labelCol"
+                        :wrapperCol="wrapperCol"
+                        label="上传类型人群包包含人群数目">
+                    <a-input placeholder="请输入上传类型人群包包含人群数目" v-decorator="['uploadNum', {}]"/>
+                </a-form-item>
+                <a-form-item
+                        :labelCol="labelCol"
+                        :wrapperCol="wrapperCol"
+                        label="人群分组">
+                    <a-input placeholder="请输入人群分组" v-decorator="['tag', {}]"/>
+                </a-form-item>
+
+            </a-form>
+        </a-spin>
+    </a-modal>
+</template>
+
+<script>
+    import {httpAction} from '@/api/manage'
+    import pick from 'lodash.pick'
+    import moment from "moment"
+
+    export default {
+        name: "ByteDanceCustomAudienceModal",
+        data() {
+            return {
+                title: "操作",
+                visible: false,
+                model: {},
+                labelCol: {
+                    xs: {span: 24},
+                    sm: {span: 5},
+                },
+                wrapperCol: {
+                    xs: {span: 24},
+                    sm: {span: 16},
+                },
+
+                confirmLoading: false,
+                form: this.$form.createForm(this),
+                validatorRules: {},
+                url: {
+                    add: "/ctop/byteDanceCustomAudience/add",
+                    edit: "/ctop/byteDanceCustomAudience/edit",
+                },
+            }
+        },
+        created() {
+        },
+        methods: {
+            add() {
+                this.edit({});
+            },
+            edit(record) {
+                this.form.resetFields();
+                this.model = Object.assign({}, record);
+                this.visible = true;
+                this.$nextTick(() => {
+                    this.form.setFieldsValue(pick(this.model, 'advertiserId', 'accountId', 'isdel', 'dataSourceId', 'name', 'source', 'status', 'coverNum', 'uploadNum', 'tag'))
+                    //时间格式化
+                });
+
+            },
+            close() {
+                this.$emit('close');
+                this.visible = false;
+            },
+            handleOk() {
+                const that = this;
+                // 触发表单验证
+                this.form.validateFields((err, values) => {
+                    if (!err) {
+                        that.confirmLoading = true;
+                        let httpurl = '';
+                        let method = '';
+                        if (!this.model.id) {
+                            httpurl += this.url.add;
+                            method = 'post';
+                        } else {
+                            httpurl += this.url.edit;
+                            method = 'put';
+                        }
+                        let formData = Object.assign(this.model, values);
+                        //时间格式化
+
+                        console.log(formData)
+                        httpAction(httpurl, formData, method).then((res) => {
+                            if (res.success) {
+                                that.$message.success(res.message);
+                                that.$emit('ok');
+                            } else {
+                                that.$message.warning(res.message);
+                            }
+                        }).finally(() => {
+                            that.confirmLoading = false;
+                            that.close();
+                        })
+
+
+                    }
+                })
+            },
+            handleCancel() {
+                this.close()
+            },
+
+
+        }
+    }
+</script>
+
+<style lang="less" scoped>
+
+</style>

+ 183 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/vue/modules/ByteDanceCustomAudienceModal__Style#Drawer.vue

@@ -0,0 +1,183 @@
+<template>
+    <a-drawer
+            :title="title"
+            :width="800"
+            placement="right"
+            :closable="false"
+            @close="close"
+            :visible="visible"
+    >
+
+        <a-spin :spinning="confirmLoading">
+            <a-form :form="form">
+
+                <a-form-item
+                        :labelCol="labelCol"
+                        :wrapperCol="wrapperCol"
+                        label="广告主id">
+                    <a-input placeholder="请输入广告主id" v-decorator="['advertiserId', {}]"/>
+                </a-form-item>
+                <a-form-item
+                        :labelCol="labelCol"
+                        :wrapperCol="wrapperCol"
+                        label="头条账号id">
+                    <a-input placeholder="请输入头条账号id" v-decorator="['accountId', {}]"/>
+                </a-form-item>
+                <a-form-item
+                        :labelCol="labelCol"
+                        :wrapperCol="wrapperCol"
+                        label="是否删除">
+                    <a-input-number v-decorator="[ 'isdel', {}]"/>
+                </a-form-item>
+                <a-form-item
+                        :labelCol="labelCol"
+                        :wrapperCol="wrapperCol"
+                        label="数据源id">
+                    <a-input placeholder="请输入数据源id" v-decorator="['dataSourceId', {}]"/>
+                </a-form-item>
+                <a-form-item
+                        :labelCol="labelCol"
+                        :wrapperCol="wrapperCol"
+                        label="人群包名称">
+                    <a-input placeholder="请输入人群包名称" v-decorator="['name', {}]"/>
+                </a-form-item>
+                <a-form-item
+                        :labelCol="labelCol"
+                        :wrapperCol="wrapperCol"
+                        label="人群包来源">
+                    <a-input placeholder="请输入人群包来源" v-decorator="['source', {}]"/>
+                </a-form-item>
+                <a-form-item
+                        :labelCol="labelCol"
+                        :wrapperCol="wrapperCol"
+                        label="人群包状态">
+                    <a-input-number v-decorator="[ 'status', {}]"/>
+                </a-form-item>
+                <a-form-item
+                        :labelCol="labelCol"
+                        :wrapperCol="wrapperCol"
+                        label="人群包覆盖人群数目">
+                    <a-input placeholder="请输入人群包覆盖人群数目" v-decorator="['coverNum', {}]"/>
+                </a-form-item>
+                <a-form-item
+                        :labelCol="labelCol"
+                        :wrapperCol="wrapperCol"
+                        label="上传类型人群包包含人群数目">
+                    <a-input placeholder="请输入上传类型人群包包含人群数目" v-decorator="['uploadNum', {}]"/>
+                </a-form-item>
+                <a-form-item
+                        :labelCol="labelCol"
+                        :wrapperCol="wrapperCol"
+                        label="人群分组">
+                    <a-input placeholder="请输入人群分组" v-decorator="['tag', {}]"/>
+                </a-form-item>
+
+            </a-form>
+        </a-spin>
+        <a-button type="primary" @click="handleOk">确定</a-button>
+        <a-button type="primary" @click="handleCancel">取消</a-button>
+    </a-drawer>
+</template>
+
+<script>
+    import {httpAction} from '@/api/manage'
+    import pick from 'lodash.pick'
+    import moment from "moment"
+
+    export default {
+        name: "ByteDanceCustomAudienceModal",
+        data() {
+            return {
+                title: "操作",
+                visible: false,
+                model: {},
+                labelCol: {
+                    xs: {span: 24},
+                    sm: {span: 5},
+                },
+                wrapperCol: {
+                    xs: {span: 24},
+                    sm: {span: 16},
+                },
+
+                confirmLoading: false,
+                form: this.$form.createForm(this),
+                validatorRules: {},
+                url: {
+                    add: "/ctop/byteDanceCustomAudience/add",
+                    edit: "/ctop/byteDanceCustomAudience/edit",
+                },
+            }
+        },
+        created() {
+        },
+        methods: {
+            add() {
+                this.edit({});
+            },
+            edit(record) {
+                this.form.resetFields();
+                this.model = Object.assign({}, record);
+                this.visible = true;
+                this.$nextTick(() => {
+                    this.form.setFieldsValue(pick(this.model, 'advertiserId', 'accountId', 'isdel', 'dataSourceId', 'name', 'source', 'status', 'coverNum', 'uploadNum', 'tag'))
+                    //时间格式化
+                });
+
+            },
+            close() {
+                this.$emit('close');
+                this.visible = false;
+            },
+            handleOk() {
+                const that = this;
+                // 触发表单验证
+                this.form.validateFields((err, values) => {
+                    if (!err) {
+                        that.confirmLoading = true;
+                        let httpurl = '';
+                        let method = '';
+                        if (!this.model.id) {
+                            httpurl += this.url.add;
+                            method = 'post';
+                        } else {
+                            httpurl += this.url.edit;
+                            method = 'put';
+                        }
+                        let formData = Object.assign(this.model, values);
+                        //时间格式化
+
+                        console.log(formData)
+                        httpAction(httpurl, formData, method).then((res) => {
+                            if (res.success) {
+                                that.$message.success(res.message);
+                                that.$emit('ok');
+                            } else {
+                                that.$message.warning(res.message);
+                            }
+                        }).finally(() => {
+                            that.confirmLoading = false;
+                            that.close();
+                        })
+
+
+                    }
+                })
+            },
+            handleCancel() {
+                this.close()
+            },
+
+
+        }
+    }
+</script>
+
+<style lang="less" scoped>
+    /** Button按钮间距 */
+    .ant-btn {
+        margin-left: 30px;
+        margin-bottom: 30px;
+        float: right;
+    }
+</style>

Файловите разлики са ограничени, защото са твърде много
+ 316 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/vue/modules/ByteDanceUserOrientationTemplateModal.vue


Файловите разлики са ограничени, защото са твърде много
+ 323 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/vue/modules/ByteDanceUserOrientationTemplateModal__Style#Drawer.vue


+ 190 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/vue/modules/BytedanceDeliveryTargetTemplateModal.vue

@@ -0,0 +1,190 @@
+<template>
+    <a-modal
+            :title="title"
+            :width="800"
+            :visible="visible"
+            :confirmLoading="confirmLoading"
+            @ok="handleOk"
+            @cancel="handleCancel"
+            cancelText="关闭">
+
+        <a-spin :spinning="confirmLoading">
+            <a-form :form="form">
+
+                <a-form-item
+                        :labelCol="labelCol"
+                        :wrapperCol="wrapperCol"
+                        label="头条平台id">
+                    <a-input placeholder="请输入头条平台id" v-decorator="['accountId', {}]"/>
+                </a-form-item>
+                <a-form-item
+                        :labelCol="labelCol"
+                        :wrapperCol="wrapperCol"
+                        label="平台账号id">
+                    <a-input placeholder="请输入平台账号id" v-decorator="['advertiserId', {}]"/>
+                </a-form-item>
+                <a-form-item
+                        :labelCol="labelCol"
+                        :wrapperCol="wrapperCol"
+                        label="投放目标">
+                    <a-input placeholder="请输入投放目标" v-decorator="['deliveryTarget', {}]"/>
+                </a-form-item>
+                <a-form-item
+                        :labelCol="labelCol"
+                        :wrapperCol="wrapperCol"
+                        label="下载方式">
+                    <a-input placeholder="请输入下载方式" v-decorator="['downloadType', {}]"/>
+                </a-form-item>
+                <a-form-item
+                        :labelCol="labelCol"
+                        :wrapperCol="wrapperCol"
+                        label="下载链接">
+                    <a-input placeholder="请输入下载链接" v-decorator="['downloadUrl', {}]"/>
+                </a-form-item>
+                <a-form-item
+                        :labelCol="labelCol"
+                        :wrapperCol="wrapperCol"
+                        label="落地页链接">
+                    <a-input placeholder="请输入落地页链接" v-decorator="['externalUrl', {}]"/>
+                </a-form-item>
+                <a-form-item
+                        :labelCol="labelCol"
+                        :wrapperCol="wrapperCol"
+                        label="转化目标">
+                    <a-input placeholder="请输入转化目标" v-decorator="['convertTarget', {}]"/>
+                </a-form-item>
+                <a-form-item
+                        :labelCol="labelCol"
+                        :wrapperCol="wrapperCol"
+                        label="应用包名">
+                    <a-input placeholder="请输入应用包名" v-decorator="['packageName', {}]"/>
+                </a-form-item>
+                <a-form-item
+                        :labelCol="labelCol"
+                        :wrapperCol="wrapperCol"
+                        label="直达链接启用状态">
+                    <a-input placeholder="请输入直达链接启用状态" v-decorator="['openUrlStatus', {}]"/>
+                </a-form-item>
+                <a-form-item
+                        :labelCol="labelCol"
+                        :wrapperCol="wrapperCol"
+                        label="直达链接生成方式">
+                    <a-input placeholder="请输入直达链接生成方式" v-decorator="['openUrlCreateMode', {}]"/>
+                </a-form-item>
+                <a-form-item
+                        :labelCol="labelCol"
+                        :wrapperCol="wrapperCol"
+                        label="跳转app链接">
+                    <a-input placeholder="请输入跳转app链接" v-decorator="['redirectUrl', {}]"/>
+                </a-form-item>
+                <a-form-item
+                        :labelCol="labelCol"
+                        :wrapperCol="wrapperCol"
+                        label="status">
+                    <a-input-number v-decorator="[ 'status', validatorRules.status ]"/>
+                </a-form-item>
+
+            </a-form>
+        </a-spin>
+    </a-modal>
+</template>
+
+<script>
+    import {httpAction} from '@/api/manage'
+    import pick from 'lodash.pick'
+    import moment from "moment"
+
+    export default {
+        name: "BytedanceDeliveryTargetTemplateModal",
+        data() {
+            return {
+                title: "操作",
+                visible: false,
+                model: {},
+                labelCol: {
+                    xs: {span: 24},
+                    sm: {span: 5},
+                },
+                wrapperCol: {
+                    xs: {span: 24},
+                    sm: {span: 16},
+                },
+
+                confirmLoading: false,
+                form: this.$form.createForm(this),
+                validatorRules: {
+                    status: {rules: [{required: true, message: '请输入status!'}]},
+                },
+                url: {
+                    add: "/ctop/bytedanceDeliveryTargetTemplate/add",
+                    edit: "/ctop/bytedanceDeliveryTargetTemplate/edit",
+                },
+            }
+        },
+        created() {
+        },
+        methods: {
+            add() {
+                this.edit({});
+            },
+            edit(record) {
+                this.form.resetFields();
+                this.model = Object.assign({}, record);
+                this.visible = true;
+                this.$nextTick(() => {
+                    this.form.setFieldsValue(pick(this.model, 'accountId', 'advertiserId', 'deliveryTarget', 'downloadType', 'downloadUrl', 'externalUrl', 'convertTarget', 'packageName', 'openUrlStatus', 'openUrlCreateMode', 'redirectUrl', 'status'))
+                    //时间格式化
+                });
+
+            },
+            close() {
+                this.$emit('close');
+                this.visible = false;
+            },
+            handleOk() {
+                const that = this;
+                // 触发表单验证
+                this.form.validateFields((err, values) => {
+                    if (!err) {
+                        that.confirmLoading = true;
+                        let httpurl = '';
+                        let method = '';
+                        if (!this.model.id) {
+                            httpurl += this.url.add;
+                            method = 'post';
+                        } else {
+                            httpurl += this.url.edit;
+                            method = 'put';
+                        }
+                        let formData = Object.assign(this.model, values);
+                        //时间格式化
+
+                        console.log(formData)
+                        httpAction(httpurl, formData, method).then((res) => {
+                            if (res.success) {
+                                that.$message.success(res.message);
+                                that.$emit('ok');
+                            } else {
+                                that.$message.warning(res.message);
+                            }
+                        }).finally(() => {
+                            that.confirmLoading = false;
+                            that.close();
+                        })
+
+
+                    }
+                })
+            },
+            handleCancel() {
+                this.close()
+            },
+
+
+        }
+    }
+</script>
+
+<style lang="less" scoped>
+
+</style>

+ 197 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/vue/modules/BytedanceDeliveryTargetTemplateModal__Style#Drawer.vue

@@ -0,0 +1,197 @@
+<template>
+    <a-drawer
+            :title="title"
+            :width="800"
+            placement="right"
+            :closable="false"
+            @close="close"
+            :visible="visible"
+    >
+
+        <a-spin :spinning="confirmLoading">
+            <a-form :form="form">
+
+                <a-form-item
+                        :labelCol="labelCol"
+                        :wrapperCol="wrapperCol"
+                        label="头条平台id">
+                    <a-input placeholder="请输入头条平台id" v-decorator="['accountId', {}]"/>
+                </a-form-item>
+                <a-form-item
+                        :labelCol="labelCol"
+                        :wrapperCol="wrapperCol"
+                        label="平台账号id">
+                    <a-input placeholder="请输入平台账号id" v-decorator="['advertiserId', {}]"/>
+                </a-form-item>
+                <a-form-item
+                        :labelCol="labelCol"
+                        :wrapperCol="wrapperCol"
+                        label="投放目标">
+                    <a-input placeholder="请输入投放目标" v-decorator="['deliveryTarget', {}]"/>
+                </a-form-item>
+                <a-form-item
+                        :labelCol="labelCol"
+                        :wrapperCol="wrapperCol"
+                        label="下载方式">
+                    <a-input placeholder="请输入下载方式" v-decorator="['downloadType', {}]"/>
+                </a-form-item>
+                <a-form-item
+                        :labelCol="labelCol"
+                        :wrapperCol="wrapperCol"
+                        label="下载链接">
+                    <a-input placeholder="请输入下载链接" v-decorator="['downloadUrl', {}]"/>
+                </a-form-item>
+                <a-form-item
+                        :labelCol="labelCol"
+                        :wrapperCol="wrapperCol"
+                        label="落地页链接">
+                    <a-input placeholder="请输入落地页链接" v-decorator="['externalUrl', {}]"/>
+                </a-form-item>
+                <a-form-item
+                        :labelCol="labelCol"
+                        :wrapperCol="wrapperCol"
+                        label="转化目标">
+                    <a-input placeholder="请输入转化目标" v-decorator="['convertTarget', {}]"/>
+                </a-form-item>
+                <a-form-item
+                        :labelCol="labelCol"
+                        :wrapperCol="wrapperCol"
+                        label="应用包名">
+                    <a-input placeholder="请输入应用包名" v-decorator="['packageName', {}]"/>
+                </a-form-item>
+                <a-form-item
+                        :labelCol="labelCol"
+                        :wrapperCol="wrapperCol"
+                        label="直达链接启用状态">
+                    <a-input placeholder="请输入直达链接启用状态" v-decorator="['openUrlStatus', {}]"/>
+                </a-form-item>
+                <a-form-item
+                        :labelCol="labelCol"
+                        :wrapperCol="wrapperCol"
+                        label="直达链接生成方式">
+                    <a-input placeholder="请输入直达链接生成方式" v-decorator="['openUrlCreateMode', {}]"/>
+                </a-form-item>
+                <a-form-item
+                        :labelCol="labelCol"
+                        :wrapperCol="wrapperCol"
+                        label="跳转app链接">
+                    <a-input placeholder="请输入跳转app链接" v-decorator="['redirectUrl', {}]"/>
+                </a-form-item>
+                <a-form-item
+                        :labelCol="labelCol"
+                        :wrapperCol="wrapperCol"
+                        label="status">
+                    <a-input-number v-decorator="[ 'status', validatorRules.status ]"/>
+                </a-form-item>
+
+            </a-form>
+        </a-spin>
+        <a-button type="primary" @click="handleOk">确定</a-button>
+        <a-button type="primary" @click="handleCancel">取消</a-button>
+    </a-drawer>
+</template>
+
+<script>
+    import {httpAction} from '@/api/manage'
+    import pick from 'lodash.pick'
+    import moment from "moment"
+
+    export default {
+        name: "BytedanceDeliveryTargetTemplateModal",
+        data() {
+            return {
+                title: "操作",
+                visible: false,
+                model: {},
+                labelCol: {
+                    xs: {span: 24},
+                    sm: {span: 5},
+                },
+                wrapperCol: {
+                    xs: {span: 24},
+                    sm: {span: 16},
+                },
+
+                confirmLoading: false,
+                form: this.$form.createForm(this),
+                validatorRules: {
+                    status: {rules: [{required: true, message: '请输入status!'}]},
+                },
+                url: {
+                    add: "/ctop/bytedanceDeliveryTargetTemplate/add",
+                    edit: "/ctop/bytedanceDeliveryTargetTemplate/edit",
+                },
+            }
+        },
+        created() {
+        },
+        methods: {
+            add() {
+                this.edit({});
+            },
+            edit(record) {
+                this.form.resetFields();
+                this.model = Object.assign({}, record);
+                this.visible = true;
+                this.$nextTick(() => {
+                    this.form.setFieldsValue(pick(this.model, 'accountId', 'advertiserId', 'deliveryTarget', 'downloadType', 'downloadUrl', 'externalUrl', 'convertTarget', 'packageName', 'openUrlStatus', 'openUrlCreateMode', 'redirectUrl', 'status'))
+                    //时间格式化
+                });
+
+            },
+            close() {
+                this.$emit('close');
+                this.visible = false;
+            },
+            handleOk() {
+                const that = this;
+                // 触发表单验证
+                this.form.validateFields((err, values) => {
+                    if (!err) {
+                        that.confirmLoading = true;
+                        let httpurl = '';
+                        let method = '';
+                        if (!this.model.id) {
+                            httpurl += this.url.add;
+                            method = 'post';
+                        } else {
+                            httpurl += this.url.edit;
+                            method = 'put';
+                        }
+                        let formData = Object.assign(this.model, values);
+                        //时间格式化
+
+                        console.log(formData)
+                        httpAction(httpurl, formData, method).then((res) => {
+                            if (res.success) {
+                                that.$message.success(res.message);
+                                that.$emit('ok');
+                            } else {
+                                that.$message.warning(res.message);
+                            }
+                        }).finally(() => {
+                            that.confirmLoading = false;
+                            that.close();
+                        })
+
+
+                    }
+                })
+            },
+            handleCancel() {
+                this.close()
+            },
+
+
+        }
+    }
+</script>
+
+<style lang="less" scoped>
+    /** Button按钮间距 */
+    .ant-btn {
+        margin-left: 30px;
+        margin-bottom: 30px;
+        float: right;
+    }
+</style>

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

@@ -17,6 +17,7 @@ bytedance_v2_campaign_get=/2/campaign/get
 bytedance_v2_campaign_create=/2/campaign/create/
 bytedance_v2_campaign_update_status=/2/campaign/update/status
 bytedance_v2_campaign_update=/2/campaign/update
-bytedance_v2_creative_get=/2/creative/get
+bytedance_v2_dmp_custom_audience_select=/2/dmp/custom_audience/select/
+
 bytedance_v2_creative_update_status=/2/creative/update/status/
 bytedance_v2_creative_material_get=/2/creative/material/read