Переглянути джерело

Merge remote-tracking branch 'origin/master'

# Conflicts:
#	jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/advertise/service/impl/AiBytedanceAdvertiserStrategyServiceImpl.java
songyh 4 роки тому
батько
коміт
7c2a556bc7
21 змінених файлів з 692 додано та 88 видалено
  1. 14 4
      jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/api/vo/Result.java
  2. 4 1
      jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/config/shiro/ShiroConfig.java
  3. 32 16
      jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/advertise/dockapi/Marketing.java
  4. 35 2
      jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/advertise/entity/AiBytedanceAdvertiserStrategy.java
  5. 75 0
      jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/advertise/entity/RuleDataAccount.java
  6. 1 1
      jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/advertise/entity/UpdAdStaOrCpaOrBudget.java
  7. 166 0
      jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/advertise/enums/BytedanceConvertType.java
  8. 14 0
      jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/advertise/mapper/RuleDataAccountMapper.java
  9. 5 0
      jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/advertise/mapper/xml/RuleDataAccountMapper.xml
  10. 9 1
      jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/advertise/service/IAiBytedanceAdvertiserStrategyService.java
  11. 16 0
      jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/advertise/service/IRuleDataAccountService.java
  12. 102 36
      jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/advertise/service/impl/AiBytedanceAdvertiserStrategyServiceImpl.java
  13. 28 0
      jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/advertise/service/impl/RuleDataAccountServiceImpl.java
  14. 36 0
      jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/advertise/vo/IndustryVo.java
  15. 6 0
      jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/common/constant/BytedanceConstant.java
  16. 2 0
      jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/common/entity/MaterialImageInfo.java
  17. 36 6
      jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/common/service/impl/MaterialImageInfoServiceImpl.java
  18. 59 1
      jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/common/utils/Check.java
  19. 50 18
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/bytedance/advertise/controller/AiBytedanceAdvertiserStrategyController.java
  20. 1 1
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/mapper/SysRoleMapper.java
  21. 1 1
      jeecg-boot-module-system/src/main/resources/application-dev.yml

+ 14 - 4
jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/api/vo/Result.java

@@ -113,15 +113,25 @@ public class Result<T> implements Serializable {
 		return r;
 	}
 
-	public static Result<Object> successMsg(String msg,Object data) {
-		Result<Object> r = new Result<Object>();
+	public static<T> Result<T> successMsg(String msg,T t) {
+		Result<T> r = new Result<T>();
 		r.setSuccess(true);
-		r.setCode(CommonConstant.SC_OK_200);
-		r.setResult(data);
+		r.setCode(CommonConstant.STATUS_NORMAL);
+		r.setResult(t);
 		r.setMessage(msg);
 		return r;
 	}
 
+	public static<T> Result<T> errorMsg(String msg) {
+		Result<T> r = new Result<T>();
+		r.setSuccess(true);
+		r.setCode(CommonConstant.STATUS_NORMAL);
+		//r.setResult(t);
+		r.setMessage(msg);
+		return r;
+	}
+
+
 	
 	public static Result<Object> error(String msg) {
 		return error(CommonConstant.SC_INTERNAL_SERVER_ERROR_500, msg);

+ 4 - 1
jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/config/shiro/ShiroConfig.java

@@ -129,7 +129,10 @@ public class ShiroConfig {
         filterChainDefinitionMap.put("/vxeSocket/**", "anon");//JVxeTable无痕刷新示例
         filterChainDefinitionMap.put("/eoaSocket/**","anon");//我的聊天
 
-        filterChainDefinitionMap.put("/ctop/aiBytedanceAdvertiserStrategy/**","anon");//
+        filterChainDefinitionMap.put("/advertiser/aiBytedanceAdvertiserStrategy/**","anon");//
+        filterChainDefinitionMap.put("/file/**","anon");//
+
+        filterChainDefinitionMap.put("/sys/dict/**","anon");//
 
         //性能监控  TODO 存在安全漏洞泄露TOEKN(durid连接池也有)
         filterChainDefinitionMap.put("/actuator/**", "anon");

+ 32 - 16
jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/advertise/dockapi/Marketing.java

@@ -2,6 +2,7 @@ package org.jeecg.modules.bytedance.advertise.dockapi;
 
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
+import com.google.gson.JsonObject;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.http.HttpEntity;
 import org.apache.http.client.methods.CloseableHttpResponse;
@@ -10,6 +11,7 @@ import org.apache.http.impl.client.CloseableHttpClient;
 import org.apache.http.impl.client.HttpClientBuilder;
 import org.jeecg.common.api.vo.Result;
 import org.jeecg.modules.bytedance.advertise.entity.AiBytedanceAdvertiserStrategy;
+import org.jeecg.modules.bytedance.advertise.enums.BytedanceConvertType;
 import org.jeecg.modules.bytedance.advertise.vo.AdConvertQueryVo;
 import org.jeecg.modules.bytedance.advertise.vo.AdGroupSearchVo;
 import org.jeecg.modules.bytedance.advertise.vo.ByteDanceSearchVo;
@@ -24,9 +26,7 @@ import java.io.BufferedReader;
 import java.io.IOException;
 import java.io.InputStreamReader;
 import java.net.URI;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 
 /**
  * 头条-巨量引擎API 接口
@@ -117,7 +117,7 @@ public class Marketing {
         params.put("offset", "0");
         params.put("limit", "100");
         JSONObject jsonObject = HttpUtils.bytedanceGetRequest(token.getAccessToken(),
-                PropertiesUtils.getValue("bytedance_config", "bytedance_v2_dmp_custom_audience_select"),
+                urlPath + PropertiesUtils.getValue("bytedance_config", "bytedance_v2_dmp_custom_audience_select"),
                 params);
         Integer code = jsonObject.getInteger("code");
         String message = jsonObject.getString("message");
@@ -151,7 +151,7 @@ public class Marketing {
         //广告创意ID
         params.put("creative_ids", creativeIds);
         JSONObject jsonObject = HttpUtils.bytedanceGetRequest(token.getAccessToken(),
-                PropertiesUtils.getValue("bytedance_config", "bytedance_v2_create_reject_reason"),
+                urlPath + PropertiesUtils.getValue("bytedance_config", "bytedance_v2_create_reject_reason"),
                 params);
         Integer code = jsonObject.getInteger("code");
         String message = jsonObject.getString("message");
@@ -484,7 +484,7 @@ public class Marketing {
         params.put("advertiser_id", advertiserId);
         params.put("data", listMap);
         JSONObject jsonObject = HttpUtils.bytedancePostRequest(token.getAccessToken(),
-                PropertiesUtils.getValue("bytedance_config", "bytedance_v2_ad_update_bid"), params);
+                urlPath + PropertiesUtils.getValue("bytedance_config", "bytedance_v2_ad_update_bid"), params);
         int code = jsonObject.getInteger("code");
         if (code != 0) {
             log.info("修改计划出价接口异常==》accountId:{},message:{}", token.getAccountId(), jsonObject.getString("message"));
@@ -510,7 +510,7 @@ public class Marketing {
         params.put("advertiser_id", advertiserId);
         params.put("data", listMap);
         JSONObject jsonObject = HttpUtils.bytedancePostRequest(token.getAccessToken(),
-                PropertiesUtils.getValue("bytedance_config", "bytedance_v2_ad_update_budget_plan"), params);
+               urlPath + PropertiesUtils.getValue("bytedance_config", "bytedance_v2_ad_update_budget_plan"), params);
         int code = jsonObject.getInteger("code");
         Map<String, Object> resultMap = new HashMap<>();
         if (code != 0) {
@@ -890,19 +890,20 @@ public class Marketing {
         params.put("level",type.equalsIgnoreCase(BytedanceConstant.LEVEL_AGENT) ? 1 : "");
         params = Check.jsonRemoveEmpty(params);
         JSONObject jsonObject = HttpUtils.bytedanceGetRequest(token.getAccessToken(),
-                PropertiesUtils.getValue("bytedance_config", "bytedance_v2_tools_industry_get"),
+                urlPath + PropertiesUtils.getValue("bytedance_config", "bytedance_v2_tools_industry_get"),
                 params);
         Integer code = jsonObject.getInteger("code");
         String message = jsonObject.getString("message");
         if (null == code || !code.equals(0)) {
             log.info("获取行业类别信息接口异常==》accountId:{},message:{}", token.getAccountId(), message);
-            return Result.error(message);
+            return Result.errorMsg(message);
         }
-        JSONArray data = jsonObject.getJSONObject("data").getJSONArray("custom_audience_list");
+        JSONArray data = jsonObject.getJSONObject("data").getJSONArray("list");
         if (null == data || data.isEmpty()) {
             log.info("行业类别信息不存在==》accountId:{},message:{}", token.getAccountId(), message);
-            return Result.error("人群包信息不存在");
+            return Result.errorMsg("行业类别信息不存在");
         }
+
         return Result.successMsg("行业类别信息获取成功",data);
     }
 
@@ -938,12 +939,12 @@ public class Marketing {
         //小程序app_schema
         params.put("app_schema", convertQueryVo.getAppSchema());
         //附加创意类型
-        params.put("advanced_creative_type", convertQueryVo.getAdvancedCreativeType());
+        params.put("advanced_creative_type", convertQueryVo.getAdvancedCreativeType() == null ? "ATTACHED_CREATIVE_NONE" : convertQueryVo.getAdvancedCreativeType());
         //游戏预约场景
         params.put("marketing_scene",convertQueryVo.getMarketingScene());
         params = Check.jsonRemoveEmpty(params);
         JSONObject jsonObject = HttpUtils.bytedanceGetRequest(token.getAccessToken(),
-                PropertiesUtils.getValue("bytedance_config", "bytedance_v2_tools_ad_convert_query"),
+                urlPath + PropertiesUtils.getValue("bytedance_config", "bytedance_v2_tools_ad_convert_query"),
                 params);
         Integer code = jsonObject.getInteger("code");
         String message = jsonObject.getString("message");
@@ -951,12 +952,27 @@ public class Marketing {
             log.info("查询广告计划可用转化目标接口异常==》accountId:{},message:{}", token.getAccountId(), message);
             return Result.error(message);
         }
-        JSONArray data = jsonObject.getJSONObject("data").getJSONArray("custom_audience_list");
-        if (null == data || data.isEmpty()) {
+        JSONArray dataList = jsonObject.getJSONObject("data").getJSONArray("list");
+        if (null == dataList || dataList.isEmpty()) {
             log.info("查询广告计划可用转化目标不存在==》accountId:{},message:{}", token.getAccountId(), message);
             return Result.error("人群包信息不存在");
         }
-        return Result.successMsg("查询广告计划可用转化目标信息获取成功",data);
+        for (Object obj : dataList){
+            JSONObject jobj = (JSONObject) obj;
+            //String convertType = jobj.getString("convert_type");
+            //转化目标列表
+            JSONArray externalList = jobj.getJSONArray("external_actions");
+            for (Object external : externalList){
+                JSONObject externalObj = (JSONObject) external;
+                if (Check.isNull(externalObj.getString("convert_id"))){
+                    //转化目标类型 获取转化目标id
+                    String convertType = externalObj.getString("external_action");
+                    externalObj.put("convert_id",BytedanceConvertType.getNum(convertType));
+                }
+            }
+        }
+
+        return Result.successMsg("查询广告计划可用转化目标信息获取成功",dataList);
     }
 
 

+ 35 - 2
jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/advertise/entity/AiBytedanceAdvertiserStrategy.java

@@ -1,12 +1,15 @@
 package org.jeecg.modules.bytedance.advertise.entity;
 
 import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import lombok.Data;
 import org.jeecg.common.aspect.annotation.Dict;
 
+import java.io.Serializable;
 import java.math.BigDecimal;
+import java.math.BigInteger;
 import java.util.Date;
 
 /**
@@ -25,6 +28,7 @@ public class AiBytedanceAdvertiserStrategy{
 	/**账户id*/
 	@Dict(dicCode = "account_id",dictTable = "ctop_user_allocation",dicText = "auth_name")
 	private Long accountId;
+
 	/**组名称*/
 	private String campaignName;
 	/**
@@ -209,6 +213,8 @@ public class AiBytedanceAdvertiserStrategy{
 	private BigDecimal adRoiGoal;
 	/**广告位置*/
 	private String creativeInventoryType;
+	@TableField(exist = false)
+	private String[] creativeInventoryTypes;
 	/**优选广告位*/
 	private Integer creativeSmartInventory;
 	/**场景广告位*/
@@ -245,20 +251,30 @@ public class AiBytedanceAdvertiserStrategy{
 	private Integer creativeIsCommentDisable;
 	/**商品卖点*/
 	private String creativeProductSellingPoints;
+	//商品卖点
+	@TableField(exist = false)
+	private String[] productSellingPoints;
+
 	/**商品描述-卡片标题*/
 	private String creativeProductDescription;
 	/**推广卡片的行动号召*/
 	private String creativeCallToAction;
 	/**是否使用智能优选*/
-	private Integer creativeEnablePersonalAction;
+	private Boolean creativeEnablePersonalAction;
 	/**商品卡片id*/
 	private String creativeProductImageId;
+	//商品卡片md5
+	private String creativeProductImageCode;
 	/**创意展现方式*/
 	private String creativeDisplayMode;
 	/**创意分类*/
-	private Integer creativeThirdIndustryId;
+	private String creativeThirdIndustryId;
+
 	/**创意标签*/
 	private String creativeAdKeywords;
+	@TableField(exist = false)
+	private String[] adKeywords;
+
 	/**展示监测链接*/
 	private String creativeTrackUrl;
 	/**点击监测链接*/
@@ -277,4 +293,21 @@ public class AiBytedanceAdvertiserStrategy{
 	private Date updateTime;
 	/**创建人id*/
 	private String userId;
+
+	@TableField(exist = false)
+	private String loginUserId;
+
+	@TableField(exist = false)
+	private String imageUrl;
+
+	//消耗
+	@TableField(exist = false)
+	private BigDecimal cost;
+	//余额
+	@TableField(exist = false)
+	private BigDecimal validBalance;
+
+
+
+
 }

+ 75 - 0
jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/advertise/entity/RuleDataAccount.java

@@ -0,0 +1,75 @@
+package org.jeecg.modules.bytedance.advertise.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+import org.jeecgframework.poi.excel.annotation.Excel;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 规则账户清洗数据
+ * @author jeecg-boot
+ * @date   2020-11-16
+ * @version V1.0
+ */
+@Data
+@TableName("ctop_rule_data_account")
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value="ctop_rule_data_account对象", description="规则账户清洗数据")
+public class RuleDataAccount {
+
+	/**id*/
+    @ApiModelProperty(value = "id")
+	private Long id;
+	/**账户id*/
+	@Excel(name = "账户id", width = 15)
+    @ApiModelProperty(value = "账户id")
+	private Long accountId;
+	/**账户name*/
+	@Excel(name = "账户id", width = 15)
+	@ApiModelProperty(value = "账户id")
+	private String accountName;
+	/**消耗*/
+	@Excel(name = "消耗", width = 15)
+    @ApiModelProperty(value = "消耗")
+	private BigDecimal cost;
+	/**validBalance*/
+	@Excel(name = "validBalance", width = 15)
+    @ApiModelProperty(value = "validBalance")
+	private BigDecimal validBalance;
+	/**转化数*/
+	@Excel(name = "转化数", width = 15)
+    @ApiModelProperty(value = "转化数")
+	private Long convertNum;
+	/**转化成本*/
+	@Excel(name = "转化成本", width = 15)
+    @ApiModelProperty(value = "转化成本")
+	private BigDecimal convertCost;
+	/**次留数*/
+	@Excel(name = "次留数", width = 15)
+    @ApiModelProperty(value = "次留数")
+	private Long nextDayOpenNum;
+	/**nextDayOpenCost*/
+	@Excel(name = "nextDayOpenCost", width = 15)
+    @ApiModelProperty(value = "nextDayOpenCost")
+	private BigDecimal nextDayOpenCost;
+
+	private BigDecimal nextDayOpenRate;
+
+	/**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;
+}

+ 1 - 1
jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/advertise/entity/UpdAdStaOrCpaOrBudget.java

@@ -27,7 +27,7 @@ public class UpdAdStaOrCpaOrBudget implements Serializable {
     @ApiModelProperty(value = "计划id")
     private String adId;
     @ApiModelProperty(value = "出价")
-    private String bid;
+    private String bId;
     @ApiModelProperty(value = "预算")
     private String budget;
 

+ 166 - 0
jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/advertise/enums/BytedanceConvertType.java

@@ -0,0 +1,166 @@
+package org.jeecg.modules.bytedance.advertise.enums;
+
+public enum BytedanceConvertType {
+    AD_CONVERT_TYPE_PHONE("AD_CONVERT_TYPE_PHONE", 1L, "电话拨打"),
+    AD_CONVERT_TYPE_FORM("AD_CONVERT_TYPE_FORM", 2L, "表单提交"),
+    AD_CONVERT_TYPE_MAP_SEARCH("AD_CONVERT_TYPE_MAP_SEARCH", 3L, "地图搜索"),
+    AD_CONVERT_TYPE_DOWNLOAD_FINISH("AD_CONVERT_TYPE_DOWNLOAD_FINISH", 4L, "下载完成"),
+    AD_CONVERT_TYPE_BUTTON("AD_CONVERT_TYPE_BUTTON", 5L, "按钮跳转"),
+    AD_CONVERT_TYPE_XPATH("AD_CONVERT_TYPE_XPATH", 6L, "xpath类型转换"),
+    AD_CONVERT_TYPE_VIEW("AD_CONVERT_TYPE_VIEW", 7L, "关键页面浏览"),
+    AD_CONVERT_TYPE_ACTIVE("AD_CONVERT_TYPE_ACTIVE", 8L, "激活"),
+    AD_CONVERT_TYPE_DOWNLOAD_START("AD_CONVERT_TYPE_DOWNLOAD_START", 9L, "下载按钮download_start"),
+    AD_CONVERT_TYPE_QQ("AD_CONVERT_TYPE_QQ", 10L, "qq咨询"),
+    AD_CONVERT_TYPE_LOTTERY("AD_CONVERT_TYPE_LOTTERY", 11L, "抽奖"),
+    AD_CONVERT_TYPE_VOTE("AD_CONVERT_TYPE_VOTE", 12L, "投票"),
+    AD_CONVERT_TYPE_ACTIVE_REGISTER("AD_CONVERT_TYPE_ACTIVE_REGISTER", 13L, "激活且注册"),
+    AD_CONVERT_TYPE_PAY("AD_CONVERT_TYPE_PAY", 14L, "激活且付费"),
+    AD_CONVERT_TYPE_INSTALL_FINISH("AD_CONVERT_TYPE_INSTALL_FINISH", 15L, "安装完成"),
+    AD_CONVERT_TYPE_PHONE_CONFIRM("AD_CONVERT_TYPE_PHONE_CONFIRM", 16L, "智能电话-确认拨打"),
+    AD_CONVERT_TYPE_PHONE_CONNECT("AD_CONVERT_TYPE_PHONE_CONNECT", 17L, "智能电话-确认接通"),
+    AD_CONVERT_TYPE_PHONE_EFFECTIVE("AD_CONVERT_TYPE_PHONE_EFFECTIVE", 18L, "智能电话-有效接通"),
+    AD_CONVERT_TYPE_CONSULT_EFFECTIVE("AD_CONVERT_TYPE_CONSULT_EFFECTIVE", 19L, "有效咨询"),
+    AD_CONVERT_TYPE_APP_ORDER("AD_CONVERT_TYPE_APP_ORDER", 20L, "app内下单(电商)"),
+    AD_CONVERT_TYPE_APP_UV("AD_CONVERT_TYPE_APP_UV", 21L, "app内访问"),
+    AD_CONVERT_TYPE_APP_CART("AD_CONVERT_TYPE_APP_CART", 22L, "app内添加购物车(电商)"),
+    AD_CONVERT_TYPE_APP_PAY("AD_CONVERT_TYPE_APP_PAY", 23L, "app内付费"),
+    AD_CONVERT_TYPE_SALES_LEAD("AD_CONVERT_TYPE_SALES_LEAD", 24L, "销售线索"),
+    AD_CONVERT_TYPE_GAME_ADDICTION("AD_CONVERT_TYPE_GAME_ADDICTION", 25L, "关键行为(原深度转化)"),
+    AD_CONVERT_TYPE_CUSTOMER_EFFECTIVE("AD_CONVERT_TYPE_CUSTOMER_EFFECTIVE", 26L, "有效获客"),
+    AD_CONVERT_TYPE_EFFECTIVE_COPY("AD_CONVERT_TYPE_EFFECTIVE_COPY", 27L, "关键页面到达&有效内容复制"),
+    AD_CONVERT_TYPE_COUPON("AD_CONVERT_TYPE_COUPON", 28L, "卡券领取"),
+    AD_CONVERT_TYPE_APP_DETAIL_UV("AD_CONVERT_TYPE_APP_DETAIL_UV", 29L, "app内详情页到站uv"),
+    AD_CONVERT_TYPE_RSS("AD_CONVERT_TYPE_RSS", 30L, "账号关注"),
+    AD_CONVERT_TYPE_FORM_CONNECT("AD_CONVERT_TYPE_FORM_CONNECT", 31L, "表单提交-已接通"),
+    AD_CONVERT_TYPE_FORM_ANSWER("AD_CONVERT_TYPE_FORM_ANSWER", 32L, "有效沟通"),
+    AD_CONVERT_TYPE_DIALBACK("AD_CONVERT_TYPE_DIALBACK", 33L, "提交回呼电话"),
+    AD_CONVERT_TYPE_DIALBACK_CONFIRM("AD_CONVERT_TYPE_DIALBACK_CONFIRM", 34L, "回呼电话-确认拨打"),
+    AD_CONVERT_TYPE_DIALBACK_CONNECT("AD_CONVERT_TYPE_DIALBACK_CONNECT", 35L, "回呼电话-确认接通"),
+    AD_CONVERT_TYPE_FORM_DEEP("AD_CONVERT_TYPE_FORM_DEEP", 36L, "分层表单"),
+    AD_CONVERT_TYPE_UPDATE_LEVEL("AD_CONVERT_TYPE_UPDATE_LEVEL", 37L, "激活且升级"),
+    AD_CONVERT_TYPE_CREATE_GAMEROLE("AD_CONVERT_TYPE_CREATE_GAMEROLE", 38L, "激活且创建角色"),
+    AD_CONVERT_TYPE_NEXT_DAY_OPEN("AD_CONVERT_TYPE_NEXT_DAY_OPEN", 39L, "激活且次留"),
+    AD_CONVERT_TYPE_INVALID_CLUE("AD_CONVERT_TYPE_INVALID_CLUE", 40L, "无效线索"),
+    AD_CONVERT_TYPE_INTENTION_CLUE("AD_CONVERT_TYPE_INTENTION_CLUE", 41L, "有意向客户"),
+    AD_CONVERT_TYPE_HIGH_VALUE_CLUE("AD_CONVERT_TYPE_HIGH_VALUE_CLUE", 42L, "高价值客户"),
+    AD_CONVERT_TYPE_PAID_CLUE("AD_CONVERT_TYPE_PAID_CLUE", 43L, "已成单"),
+    AD_CONVERT_TYPE_NATIVE_ACTION("AD_CONVERT_TYPE_NATIVE_ACTION", 44L, "原生互动"),
+    AD_CONVERT_TYPE_LIKE_ACTION("AD_CONVERT_TYPE_LIKE_ACTION", 45L, "视频点赞"),
+    AD_CONVERT_TYPE_FOLLOW_ACTION("AD_CONVERT_TYPE_FOLLOW_ACTION", 46L, "账户关注"),
+    AD_CONVERT_TYPE_COMMENT_ACTION("AD_CONVERT_TYPE_COMMENT_ACTION", 47L, "视频评论"),
+    AD_CONVERT_TYPE_LOCATION_ACTION("AD_CONVERT_TYPE_LOCATION_ACTION", 48L, "POI点击"),
+    AD_CONVERT_TYPE_SHOPPING_ACTION("AD_CONVERT_TYPE_SHOPPING_ACTION", 49L, "购物车点击"),
+    AD_CONVERT_TYPE_REDIRECT_TO_SHOP("AD_CONVERT_TYPE_REDIRECT_TO_SHOP", 50L, "调起店铺"),
+    AD_CONVERT_TYPE_LINK_ACTION("AD_CONVERT_TYPE_LINK_ACTION", 51L, "link点击"),
+    AD_CONVERT_TYPE_DEEP_PURCHASE("AD_CONVERT_TYPE_DEEP_PURCHASE", 52L, "多次付费"),
+    AD_CONVERT_TYPE_SUCCESSORDER_ACTION("AD_CONVERT_TYPE_SUCCESSORDER_ACTION", 53L, "小店转化"),
+    AD_CONVERT_TYPE_POI_COLLECT("AD_CONVERT_TYPE_POI_COLLECT", 60L, "poi地址点击"),
+    AD_CONVERT_TYPE_POI_ADDRESS_CLICK("AD_CONVERT_TYPE_POI_ADDRESS_CLICK", 61L, "poi收藏"),
+    AD_CONVERT_TYPE_RESERVATION("AD_CONVERT_TYPE_RESERVATION", 62L, "poi预定"),
+    AD_CONVERT_TYPE_MESSAGE_ACTION("AD_CONVERT_TYPE_MESSAGE_ACTION", 63L, "私信消息"),
+    AD_CONVERT_TYPE_SHARE_ACTION("AD_CONVERT_TYPE_SHARE_ACTION", 65L, "分享"),
+    AD_CONVERT_TYPE_CLICK_LANDING_PAGE("AD_CONVERT_TYPE_CLICK_LANDING_PAGE", 66L, "访问推广详情页"),
+    AD_CONVERT_TYPE_CLICK_SHOPWINDOW("AD_CONVERT_TYPE_CLICK_SHOPWINDOW", 67L, "访问主页商品橱窗"),
+    AD_CONVERT_TYPE_CLICK_DOWNLOAD("AD_CONVERT_TYPE_CLICK_DOWNLOAD", 68L, "访问主页下载应用"),
+    AD_CONVERT_TYPE_CLICK_CALL_DY("AD_CONVERT_TYPE_CLICK_CALL_DY", 69L, "点击主页内电话拨打"),
+    AD_CONVERT_TYPE_CLICK_WEBSITE("AD_CONVERT_TYPE_CLICK_WEBSITE", 70L, "访问主页官网"),
+    AD_CONVERT_PAGE_VIEW("AD_CONVERT_PAGE_VIEW", 93L, "访问目标页面"),
+    AD_CONVERT_TYPE_MESSAGE("AD_CONVERT_TYPE_MESSAGE", 94L, "短信"),
+    AD_CONVERT_TYPE_REDIRECT("AD_CONVERT_TYPE_REDIRECT", 95L, "页面跳转"),
+    AD_CONVERT_TYPE_SHOPPING("AD_CONVERT_TYPE_SHOPPING", 96L, "商品购买"),
+    AD_CONVERT_TYPE_CONSULT("AD_CONVERT_TYPE_CONSULT", 97L, "在线咨询"),
+    AD_CONVERT_TYPE_WECHAT("AD_CONVERT_TYPE_WECHAT", 98L, "微信"),
+    AD_CONVERT_TYPE_OTHER("AD_CONVERT_TYPE_OTHER", 99L, "其他"),
+    AD_CONVERT_TYPE_MULTIPLE("AD_CONVERT_TYPE_MULTIPLE", 100L, "多转化事件"),
+    AD_CONVERT_TYPE_POI_MULTIPLE("AD_CONVERT_TYPE_POI_MULTIPLE", 101L, "POI门店多转化目标"),
+    AD_CONVERT_TYPE_MULTI_NATIVE_ACTION("AD_CONVERT_TYPE_MULTI_NATIVE_ACTION", 102L, "互动"),
+    AD_CONVERT_TYPE_LOAN_COMPLETION("AD_CONVERT_TYPE_LOAN_COMPLETION", 103L, "互联网金融-完件"),
+    AD_CONVERT_TYPE_PRE_LOAN_CREDIT("AD_CONVERT_TYPE_PRE_LOAN_CREDIT", 104L, "互联网金融-预授信"),
+    AD_CONVERT_TYPE_LOAN_CREDIT("AD_CONVERT_TYPE_LOAN_CREDIT", 105L, "互联网金融-授信"),
+    AD_CONVERT_TYPE_IDCARD_INFORMATION("AD_CONVERT_TYPE_IDCARD_INFORMATION", 106L, "身份证信息填写完成"),
+    AD_CONVERT_TYPE_BANKCARD_INFORMATION("AD_CONVERT_TYPE_BANKCARD_INFORMATION", 107L, "银行卡信息填写完成"),
+    AD_CONVERT_TYPE_PERSONAL_INFORMATION("AD_CONVERT_TYPE_PERSONAL_INFORMATION", 108L, "补充个人信息填写完成"),
+    AD_CONVERT_TYPE_CERTIFICATION_INFORMATION("AD_CONVERT_TYPE_CERTIFICATION_INFORMATION", 109L, "用户活体认证信息上传完成"),
+    AD_CONVERT_TYPE_LT_ROI("AD_CONVERT_TYPE_LT_ROI", 110L, "广告变现ROI"),
+    AD_CONVERT_TYPE_LIVE_HOMEPAGE("AD_CONVERT_TYPE_LIVE_HOMEPAGE", 111L, "直播导流"),
+    AD_CONVERT_TYPE_REDIRECT_TO_STORE("AD_CONVERT_TYPE_REDIRECT_TO_STORE", 113L, "店铺导流"),
+    AD_CONVERT_TYPE_FEED_LIVE_HOMEPAGE("AD_CONVERT_TYPE_FEED_LIVE_HOMEPAGE", 120L, "火山feed进入直播页"),
+    AD_CONVERT_TYPE_AUTHORIZATION("AD_CONVERT_TYPE_AUTHORIZATION", 121L, "授权(电商)"),
+    AD_CONVERT_TYPE_COMMODITY_CLICK("AD_CONVERT_TYPE_COMMODITY_CLICK", 122L, "快上电商推广目的"),
+    AD_CONVERT_TYPE_CONSULT_CLUE("AD_CONVERT_TYPE_CONSULT_CLUE", 123L, "留咨咨询"),
+    AD_CONVERT_TYPE_BOOST("AD_CONVERT_TYPE_BOOST", 124L, "自然助推"),
+    AD_CONVERT_TYPE_STAY_TIME("AD_CONVERT_TYPE_STAY_TIME", 125L, "店铺停留"),
+    AD_CONVERT_TYPE_PURCHASE_OF_GOODS("AD_CONVERT_TYPE_PURCHASE_OF_GOODS", 156L, "商品签收"),
+    AD_CONVERT_TYPE_PURCHASE_ROI("AD_CONVERT_TYPE_PURCHASE_ROI", 160L, "付费ROI"),
+    AD_CONVERT_TYPE_LIVE_NATIVE_ACITON("AD_CONVERT_TYPE_LIVE_NATIVE_ACITON", 162L, "直播间原生互动"),
+    AD_CONVERT_TYPE_LIVE_FOLLOW_ACITON("AD_CONVERT_TYPE_LIVE_FOLLOW_ACITON", 163L, "直播间关注"),
+    AD_CONVERT_TYPE_LIVE_COMMENT_ACTION("AD_CONVERT_TYPE_LIVE_COMMENT_ACTION", 164L, "直播间评论"),
+    AD_CONVERT_TYPE_LIVE_GIFT_ACTION("AD_CONVERT_TYPE_LIVE_GIFT_ACTION", 165L, "直播间内打赏"),
+    AD_CONVERT_TYPE_LIVE_SLIDECART_CLICK_ACTION("AD_CONVERT_TYPE_LIVE_SLIDECART_CLICK_ACTION", 166L, "直播间查看购物车"),
+    AD_CONVERT_TYPE_LIVE_CLICK_PRODUCT_ACTION("AD_CONVERT_TYPE_LIVE_CLICK_PRODUCT_ACTION", 167L, "直播间查看商品"),
+    AD_CONVERT_TYPE_LIVE_ENTER_ACTION("AD_CONVERT_TYPE_LIVE_ENTER_ACTION", 171L, "直播间观看"),
+    AD_CONVERT_TYPE_LIVE_SUCCESSORDER_ACTION("AD_CONVERT_TYPE_LIVE_SUCCESSORDER_ACTION", 172L, "直播间成单"),
+    AD_CONVERT_TYPE_NOTIFY_DOWNLOAD("AD_CONVERT_TYPE_NOTIFY_DOWNLOAD", 173L, "预约下载"),
+    AD_CONVERT_TYPE_PREMIUM_PAYMENT("AD_CONVERT_TYPE_PREMIUM_PAYMENT", 174L, "保险支付"),
+    AD_CONVERT_TYPE_MESSAGE_CLICK("AD_CONVERT_TYPE_MESSAGE_CLICK", 177L, "私信点击"),
+    AD_CONVERT_TYPE_UG_ROI("AD_CONVERT_TYPE_UG_ROI", 178L, "内广roi"),
+    AD_CONVERT_TYPE_ENTER_HOMEPAGE("AD_CONVERT_TYPE_ENTER_HOMEPAGE", 181L, "进入个人主页"),
+    AD_CONVERT_TYPE_SHOPPING_CART("AD_CONVERT_TYPE_SHOPPING_CART", 182L, "商品购物车点击"),
+    AD_CONVERT_TYPE_WECHAT_REGISTER("AD_CONVERT_TYPE_WECHAT_REGISTER", 183L, "微信内注册"),
+    AD_CONVERT_TYPE_WECHAT_PAY("AD_CONVERT_TYPE_WECHAT_PAY", 184L, "微信内付费"),
+    AD_CONVERT_TYPE_MESSAGE_INTERACTION("AD_CONVERT_TYPE_MESSAGE_INTERACTION", 185L, "沟通互动"),
+    AD_CONVERT_TYPE_LIVE_STAY_TIME("AD_CONVERT_TYPE_LIVE_STAY_TIME", 186L, "直播间停留"),
+    AD_CONVERT_TYPE_NEW_FOLLOW_ACTION("AD_CONVERT_TYPE_NEW_FOLLOW_ACTION", 187L, "粉丝增长"),
+    AD_CONVERT_TYPE_APPLET_CLICK("AD_CONVERT_TYPE_APPLET_CLICK", 189L, "小程序互动"),
+    AD_CONVERT_TYPE_MESSAGE_SERVICE("AD_CONVERT_TYPE_MESSAGE_SERVICE", 190L, "私信服务"),
+    AD_CONVERT_TYPE_MESSAGE_CLUE("AD_CONVERT_TYPE_MESSAGE_CLUE", 192L, "私信留资"),
+    AD_CONVERT_TYPE_LIVE_FANS_ACTION("AD_CONVERT_TYPE_LIVE_FANS_ACTION", 193L, "直播间加入粉丝团"),
+    AD_CONVERT_TYPE_CLUE_CONFIRM("AD_CONVERT_TYPE_CLUE_CONFIRM", 194L, "回访_信息确认"),
+    AD_CONVERT_TYPE_CLUE_INTERFLOW("AD_CONVERT_TYPE_CLUE_INTERFLOW", 195L, "回访_加为好友"),
+    AD_CONVERT_TYPE_CLUE_HIGH_INTENTION("AD_CONVERT_TYPE_CLUE_HIGH_INTENTION", 196L, "回访_高潜成交"),
+    AD_CONVERT_TYPE_LIVE_COMPONENT_CLICK("AD_CONVERT_TYPE_LIVE_COMPONENT_CLICK", 215L, "组件点击");
+
+
+    private String code;
+    private Long num;
+    private String desc;
+
+    public String getCode() {
+        return code;
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
+
+    public Long getNum() {
+        return num;
+    }
+
+    public void setNum(Long num) {
+        this.num = num;
+    }
+
+    public String getDesc() {
+        return desc;
+    }
+
+    public void setDesc(String desc) {
+        this.desc = desc;
+    }
+
+    BytedanceConvertType(String code, Long num, String desc) {
+        this.code = code;
+        this.num = num;
+        this.desc = desc;
+    }
+
+    public static Long getNum(String code) {
+        for (BytedanceConvertType convertType : BytedanceConvertType.values()) {
+            if (convertType.getCode().equals(code.trim())) {
+                return convertType.getNum();
+            }
+        }
+        return null;
+    }
+}

+ 14 - 0
jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/advertise/mapper/RuleDataAccountMapper.java

@@ -0,0 +1,14 @@
+package org.jeecg.modules.bytedance.advertise.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.jeecg.modules.bytedance.advertise.entity.RuleDataAccount;
+
+/**
+ * 规则账户清洗数据
+ * @author: jeecg-boot
+ * @date:   2020-11-16
+ * @cersion: V1.0
+ */
+public interface RuleDataAccountMapper extends BaseMapper<RuleDataAccount> {
+
+}

+ 5 - 0
jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/advertise/mapper/xml/RuleDataAccountMapper.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.bytedance.advertise.mapper.RuleDataAccountMapper">
+
+</mapper>

+ 9 - 1
jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/advertise/service/IAiBytedanceAdvertiserStrategyService.java

@@ -49,7 +49,7 @@ public interface IAiBytedanceAdvertiserStrategyService extends IService<AiByteda
      * @param type
      * @return
      */
-    Result getIndustryList(String accountId,String type);
+    Result getIndustryList(String accountId,String type) throws Exception;
 
     /**
      *  获取广告组
@@ -86,4 +86,12 @@ public interface IAiBytedanceAdvertiserStrategyService extends IService<AiByteda
      */
     Result getToolConvert(AdConvertQueryVo adConvertQueryVo);
 
+
+    /**
+     *  添加配置信息
+     * @param aiBytedanceAdvertiserStrategy
+     * @return
+     */
+    Result<AiBytedanceAdvertiserStrategy> addBytedanceStrategy(AiBytedanceAdvertiserStrategy aiBytedanceAdvertiserStrategy);
+
 }

+ 16 - 0
jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/advertise/service/IRuleDataAccountService.java

@@ -0,0 +1,16 @@
+package org.jeecg.modules.bytedance.advertise.service;
+
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.jeecg.modules.bytedance.advertise.entity.RuleDataAccount;
+
+/**
+ * @Description: 规则账户清洗数据
+ * @Author: jeecg-boot
+ * @Date: 2020-11-16
+ * @Version: V1.0
+ */
+public interface IRuleDataAccountService extends IService<RuleDataAccount> {
+
+}

+ 102 - 36
jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/advertise/service/impl/AiBytedanceAdvertiserStrategyServiceImpl.java

@@ -5,6 +5,8 @@ import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.poi.ss.formula.functions.T;
 import org.jeecg.common.api.vo.Result;
 import org.jeecg.common.util.DateUtils;
 import org.jeecg.modules.bytedance.advertise.dockapi.Marketing;
@@ -14,24 +16,31 @@ import org.jeecg.modules.bytedance.advertise.mapper.AiBytedanceAdvertiserStrateg
 import org.jeecg.modules.bytedance.advertise.service.*;
 import org.jeecg.modules.bytedance.advertise.vo.AdConvertQueryVo;
 import org.jeecg.modules.bytedance.advertise.vo.AdGroupSearchVo;
+import org.jeecg.modules.bytedance.advertise.vo.IndustryVo;
 import org.jeecg.modules.bytedance.advertise.vo.PlanSearchVo;
 import org.jeecg.modules.bytedance.common.constant.BytedanceConstant;
 import org.jeecg.modules.bytedance.common.entity.CtopOauthToken;
 import org.jeecg.modules.bytedance.common.entity.MaterialInfo;
+import org.jeecg.modules.bytedance.common.entity.MaterialImageInfo;
 import org.jeecg.modules.bytedance.common.entity.UserAllocation;
 import org.jeecg.modules.bytedance.common.service.ICtopOauthTokenService;
+import org.jeecg.modules.bytedance.common.service.IMaterialImageInfoService;
 import org.jeecg.modules.bytedance.common.service.IMaterialInfoService;
 import org.jeecg.modules.bytedance.common.service.IUserAllocationService;
 import org.jeecg.modules.bytedance.common.utils.Check;
+import org.jeecg.modules.bytedance.common.utils.Check;
 import org.jeecg.modules.bytedance.common.utils.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
+import java.util.ArrayList;
 import java.util.Date;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.spi.LocaleServiceProvider;
+import java.util.stream.Collectors;
 
 /**
  * 头条智能投放账户配置信息表
@@ -51,6 +60,8 @@ public class AiBytedanceAdvertiserStrategyServiceImpl extends ServiceImpl<AiByte
     @Autowired
     private IUserAllocationService userAllocationService;
 
+    @Autowired
+    private IMaterialImageInfoService materialImageInfoService;
 
 
     @Override
@@ -620,31 +631,8 @@ public class AiBytedanceAdvertiserStrategyServiceImpl extends ServiceImpl<AiByte
     }
 
     private String getCampaignName(Long dpIndex, AiBytedanceAdvertiserStrategy strategy) {
-        //根据每个组的计划个数计算目前计划所属的组下标范围 比如 1 则下标范围为 1/50 56则下标范围为 51/100
-        String rangeIndex = getRangeIndex(strategy.getDpLinkStartIndex(),strategy.getDpLinkEndIndex(),strategy.getCampaignAdCnt(),dpIndex);
-        if(null == rangeIndex||rangeIndex.equals("")){
-            return null;
-        }
-        return strategy.getCampaignName()+rangeIndex;
-    }
-
-    private String getRangeIndex(Long dpLinkStartIndex,Long dpLinkEndIndex, Long campaignAdCnt, Long dpIndex) {
-        if(dpIndex<dpLinkStartIndex||dpIndex>dpLinkEndIndex){
-            //超出下标范围
-            return null;
-        }
-        Long startIndex ;
-        Long endIndex ;
-        //计算当前下标值和范围区段的余数
-        Long yzIndex = (dpIndex-dpLinkStartIndex+1)%campaignAdCnt;
-        if(yzIndex == 0){
-            startIndex = dpIndex-campaignAdCnt+1;
-            endIndex = dpIndex;
-        }else{
-            startIndex = dpIndex-yzIndex+1;
-            endIndex = dpIndex-yzIndex+campaignAdCnt;
-        }
-        return "-("+startIndex+"/"+endIndex+")";
+        Long unitCreativeNum = strategy.getCampaignAdCnt();
+        return null;
     }
 
     @Autowired
@@ -688,22 +676,24 @@ public class AiBytedanceAdvertiserStrategyServiceImpl extends ServiceImpl<AiByte
     public Result updStaOrCpaOrBudgetById(UpdAdStaOrCpaOrBudget updAdStaOrCpaOrBudget) {
         Result updResult = new Result();
         CtopOauthToken token = tokenService.getOauthTokenByAccountId(updAdStaOrCpaOrBudget.getAccountId());
-        List<Map<String,Object>> priceList = updAdStaOrCpaOrBudget.getList();
+        List<Map<String,Object>> priceList = new ArrayList<>();
         Map<String,Object> mapPrice = new HashMap<>();
         //1-修改出价
         if (BytedanceConstant.UPDTYPE_BID.equals(updAdStaOrCpaOrBudget.getType())) {
-            mapPrice.put("ad_id",updAdStaOrCpaOrBudget.getAdId());
-            mapPrice.put("bid",updAdStaOrCpaOrBudget.getBid());
+              mapPrice.put("ad_id",updAdStaOrCpaOrBudget.getAdId());
+            mapPrice.put("bid",updAdStaOrCpaOrBudget.getBId());
             priceList.add(mapPrice);
 
             // api 更新计划出价
             updResult = Marketing.updatePlanBid(token,updAdStaOrCpaOrBudget.getAccountId(),priceList);
+            // api 更新计划出价 TODO
+         /* updResult = marketing.updatePlanBid(token,updAdStaOrCpaOrBudget.getAccountId(),priceList);
             if (!"200".equals(updResult.getCode())){
                 return Result.error(updResult.getMessage());
-            }
+            }*/
             // 修改 出价
             priceList.forEach(map-> {
-                aiBytedanceAdvertiserStrategyMapper.updCpaById(updAdStaOrCpaOrBudget.getId(),map.get("bid").toString());
+                aiBytedanceAdvertiserStrategyMapper.updCpaById(updAdStaOrCpaOrBudget.getId(),updAdStaOrCpaOrBudget.getBId());
             });
         }
         //2-修改预算
@@ -712,13 +702,14 @@ public class AiBytedanceAdvertiserStrategyServiceImpl extends ServiceImpl<AiByte
             mapPrice.put("budget",updAdStaOrCpaOrBudget.getBudget());
             priceList.add(mapPrice);
             // api 修改计划 预算
+           /* updResult = marketing.updatePlanBudget(token,updAdStaOrCpaOrBudget.getAccountId(),priceList);
             updResult = Marketing.updatePlanBudget(token,updAdStaOrCpaOrBudget.getAccountId(),priceList);
             if (!"200".equals(updResult.getCode())){
                 return Result.error(updResult.getMessage());
-            }
-            // 修改 预算
+            }*/
+            // 修改 预算 TODO
             priceList.forEach(map-> {
-                aiBytedanceAdvertiserStrategyMapper.updBudgetById(updAdStaOrCpaOrBudget.getId(),map.get("budget").toString());
+                aiBytedanceAdvertiserStrategyMapper.updBudgetById(updAdStaOrCpaOrBudget.getId(),updAdStaOrCpaOrBudget.getBudget());
             });
         }
         return Result.successMsg("修改"+(BytedanceConstant.UPDTYPE_BID.equals(updAdStaOrCpaOrBudget.getType()) ? "出价" : "预算")+"成功。", updResult.getResult());
@@ -735,7 +726,7 @@ public class AiBytedanceAdvertiserStrategyServiceImpl extends ServiceImpl<AiByte
      * @return: org.jeecg.common.api.vo.Result
      * @author: zianY
      */
-    public Result getIndustryList(String accountId,String type) {
+    public Result getIndustryList(String accountId,String type) throws Exception {
         CtopOauthToken token = tokenService.getOauthTokenByAccountId(accountId);
         if (null == token) {
             log.info("token获取失败=>accountId:{}", token.getAccountId());
@@ -745,6 +736,51 @@ public class AiBytedanceAdvertiserStrategyServiceImpl extends ServiceImpl<AiByte
         Result industryList = Marketing.getToolIndustryList(token,type);
         log.error("行业列表=======>>>>>>>>>>>", industryList.getResult());
         return Result.successMsg("获取行业列表成功。", industryList.getResult());
+        // api 获取行业列表
+        Result listResult = marketing.getToolIndustryList(token,type);
+        List<Map<String,Object>> industryListMap = (List<Map<String,Object>>) listResult.getResult();
+        // list map 数据格式 转 list entity 数据格式
+        List<IndustryVo> industryList = Check.convertListMap2ListBean(industryListMap,IndustryVo.class);
+        //所有行业分类 设置 父id
+        industryList.forEach(industryVo -> {
+            if ("1".equals(industryVo.getLevel())){
+                industryVo.setPId("0");
+            }
+            if ("2".equals(industryVo.getLevel())){
+                industryVo.setPId(industryVo.getFirst_industry_id());
+            }
+            if ("3".equals(industryVo.getLevel())){
+                industryVo.setPId(industryVo.getSecond_industry_id());
+            }
+        });
+
+        //行业分类 层级展示
+        List<Map<String,Object>> classificationVos = treeCategoryData(industryList,"0");
+        return Result.successMsg("获取行业列表成功。",classificationVos);
+
+    }
+
+    /**
+     * 递归 行业分类 tree 层级展示
+     * @param allList
+     * @param parentId
+     * @return
+     */
+    public List<Map<String,Object>> treeCategoryData(List<IndustryVo> allList, String parentId) {
+        List<Map<String,Object>> mapList = new ArrayList<>();
+        for (IndustryVo vo : allList) {
+            if (parentId.equals(vo.getPId())){
+                Map<String,Object> map = new HashMap();
+                map.put("industryId", vo.getIndustry_id());
+                map.put("industryName", vo.getIndustry_name());
+                map.put("level", vo.getLevel());
+                map.put("pId", vo.getPId());
+                map.put("children", treeCategoryData(allList,vo.getIndustry_id()));
+                mapList.add(map);
+            }
+        }
+        return mapList;
+
     }
 
 
@@ -768,7 +804,7 @@ public class AiBytedanceAdvertiserStrategyServiceImpl extends ServiceImpl<AiByte
             return Result.error("token获取失败====>>>>accountId:"+token.getAccountId());
         }
         // 获取广告组
-        Result industryList = Marketing.getCampaignGroupList(token,accountId,adGroupSearchVoList,pageNo,pageSize);
+        Result industryList = marketing.getCampaignGroupList(token,accountId,adGroupSearchVoList,pageNo,pageSize);
         log.error("获取广告组=======>>>>>>>>>>>", industryList.getResult());
         return Result.successMsg("获取广告组成功。", industryList.getResult());
     }
@@ -794,7 +830,7 @@ public class AiBytedanceAdvertiserStrategyServiceImpl extends ServiceImpl<AiByte
             return Result.error("token获取失败====>>>>accountId:"+token.getAccountId());
         }
         // 获取计划
-        Result industryList = Marketing.getPlanList(token,adGroupSearchVoList,pageNo,pageSize);
+        Result industryList = marketing.getPlanList(token,adGroupSearchVoList,pageNo,pageSize);
         log.error("获取广告计划=======>>>>>>>>>>>", industryList.getResult());
         return Result.successMsg("获取广告计划成功。", industryList.getResult());
     }
@@ -868,6 +904,36 @@ public class AiBytedanceAdvertiserStrategyServiceImpl extends ServiceImpl<AiByte
         }
         Result resultCampaign = Marketing.getToolConvertQuery(token,adConvertQueryVo);
         return Result.successMsg("查询广告计划可用转化目标成功。", resultCampaign.getResult());
+        return marketing.getToolConvertQuery(token,adConvertQueryVo);
+    }
+
+
+    /**
+     *
+     * @description: 添加配置信息
+     *
+     * @param aiBytedanceAdvertiserStrategy
+     * @return: org.jeecg.common.api.vo.Result
+     * @author: zianY
+     * @time: 2021/5/6 10:26
+     */
+    public Result addBytedanceStrategy(AiBytedanceAdvertiserStrategy aiBytedanceAdvertiserStrategy) {
+        // 数据入库 string[] 转 string
+        //商品卖点
+        aiBytedanceAdvertiserStrategy.setCreativeProductSellingPoints(StringUtils.join(aiBytedanceAdvertiserStrategy.getProductSellingPoints(), ","));
+        //广告位置
+        aiBytedanceAdvertiserStrategy.setCreativeInventoryType(StringUtils.join(aiBytedanceAdvertiserStrategy.getCreativeInventoryTypes(), ","));
+        //创意标签
+        aiBytedanceAdvertiserStrategy.setCreativeAdKeywords(StringUtils.join(aiBytedanceAdvertiserStrategy.getAdKeywords(), ","));
+
+        //添加素材信息
+        MaterialImageInfo imageInfo = new MaterialImageInfo();
+        imageInfo.setUrl(aiBytedanceAdvertiserStrategy.getImageUrl());
+        imageInfo.setUserId(aiBytedanceAdvertiserStrategy.getUserId());
+        materialImageInfoService.initImageCode(imageInfo);
+        aiBytedanceAdvertiserStrategyMapper.insert(aiBytedanceAdvertiserStrategy);
+
+        return Result.successMsg("新增成功。",aiBytedanceAdvertiserStrategy);
     }
 
 

+ 28 - 0
jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/advertise/service/impl/RuleDataAccountServiceImpl.java

@@ -0,0 +1,28 @@
+package org.jeecg.modules.bytedance.advertise.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.jeecg.modules.bytedance.advertise.entity.RuleDataAccount;
+import org.jeecg.modules.bytedance.advertise.mapper.RuleDataAccountMapper;
+import org.jeecg.modules.bytedance.advertise.service.IRuleDataAccountService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 规则账户清洗数据
+ *
+ * @author jeecg-boot
+ * @version V1.0
+ * @date 2020-11-16
+ */
+@Service
+public class RuleDataAccountServiceImpl extends ServiceImpl<RuleDataAccountMapper, RuleDataAccount> implements IRuleDataAccountService {
+
+    @Autowired
+    private RuleDataAccountMapper ruleDataAccountMapper;
+
+
+}

+ 36 - 0
jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/advertise/vo/IndustryVo.java

@@ -0,0 +1,36 @@
+package org.jeecg.modules.bytedance.advertise.vo;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author zianY
+ *查询广告计划可用转化目标 入参
+ */
+@Data
+public class IndustryVo implements Serializable {
+    //行业ID
+    private String industry_id;
+    //行业名称
+    private String industry_name;
+    //所在级别,1:一级行业、2:二级行业、3:三级行业
+    private String level;
+    //该行业的一级行业ID
+    private String first_industry_id;
+    //该行业的一级行业名称
+    private String first_industry_name;
+    //该行业的二级行业ID
+    private String second_industry_id;
+    //该行业的二级行业名称
+    private String second_industry_name;
+    //该行业的三级行业ID
+    private String third_industry_id;
+    //该行业的三级行业名称
+    private String third_industry_name;
+
+
+    //父id
+    private String pId;
+
+}

+ 6 - 0
jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/common/constant/BytedanceConstant.java

@@ -57,4 +57,10 @@ public class BytedanceConstant {
 
 
     public static final String UPLOAD_TYPE_BY_URL = "UPLOAD_BY_URL";
+
+    //图片类型
+    public static final String IMAGE_TYPE_ICON = "ICON";
+    public static final String IMAGE_TYPE_IMA = "IMAGE";
+
+
 }

+ 2 - 0
jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/common/entity/MaterialImageInfo.java

@@ -119,6 +119,8 @@ public class MaterialImageInfo {
     private String size;
 
     private Integer excellent;
+
+    private String projectId;
     /**
      * createTime
      */

+ 36 - 6
jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/common/service/impl/MaterialImageInfoServiceImpl.java

@@ -5,6 +5,9 @@ import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import lombok.extern.slf4j.Slf4j;
+import org.jeecg.common.system.query.QueryGenerator;
+import org.jeecg.modules.bytedance.advertise.entity.AiBytedanceAdvertiserStrategy;
+import org.jeecg.modules.bytedance.common.constant.BytedanceConstant;
 import org.jeecg.modules.bytedance.common.entity.MaterialImageInfo;
 import org.jeecg.modules.bytedance.common.mapper.MaterialImageInfoMapper;
 import org.jeecg.modules.bytedance.common.service.IMaterialImageInfoService;
@@ -58,7 +61,7 @@ public class MaterialImageInfoServiceImpl extends ServiceImpl<MaterialImageInfoM
                     MaterialImageInfo materialImageInfo = new MaterialImageInfo();
                     materialImageInfo.setVideoId(videoId);
                     materialImageInfo.setMaterialDescribe(json.getString("materialDescribe"));
-                    materialImageInfo.setType("IMAGE");
+                    materialImageInfo.setType("ICON");
                     String url = "https:" + json.getString("url");
                     materialImageInfo.setUrl(url);
                     materialImageInfo.setMaterialName(json.getString("materialName"));
@@ -102,7 +105,7 @@ public class MaterialImageInfoServiceImpl extends ServiceImpl<MaterialImageInfoM
         Map<String, Object> result = new HashMap<>();
         QueryWrapper<MaterialImageInfo> queryWrapper = new QueryWrapper<>();
         queryWrapper.eq("code", code);
-        queryWrapper.eq("video_id", videoId);
+        queryWrapper.eq("type", BytedanceConstant.IMAGE_TYPE_ICON);
         queryWrapper.last("limit 1");
         MaterialImageInfo info = this.getOne(queryWrapper);
         if (null != info) {
@@ -131,13 +134,40 @@ public class MaterialImageInfoServiceImpl extends ServiceImpl<MaterialImageInfoM
 
     @Override
     public void initImageCode(MaterialImageInfo image) {
-        String localUrl = LoadFileUtil.downLoadFromUrl(image.getUrl(), downloadUrl);
-        String md5Code = null;
+        //String localUrl = LoadFileUtil.downLoadFromUrl(image.getUrl(), downloadUrl);
+        //String md5Code = null;
         try {
-            md5Code = MD5Util.getFileMd5(localUrl);
+            /*md5Code = MD5Util.getFileMd5(localUrl);
             image.setCode(md5Code);
             image.setUpdateTime(new Date());
-            this.saveOrUpdate(image);
+            this.saveOrUpdate(image);*/
+
+            image.setType("ICON");
+            String url = "https:" + image.getUrl();
+            image.setUrl(url);
+            image.setStatus(0);
+
+            String imaUrl = LoadFileUtil.downLoadFromUrl(url, downloadUrl);
+            String urlMd5 = MD5Util.getFileMd5(imaUrl);
+            image.setCode(urlMd5);
+            File picture = new File(imaUrl);
+            BufferedImage sourceImg = null;
+            try {
+                sourceImg = ImageIO.read(new FileInputStream(picture));
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+            String size = String.format("%.1f", picture.length() / 1024.0);
+            Integer width = sourceImg.getWidth();
+            Integer height = sourceImg.getHeight();
+            image.setSize(size);
+            image.setHeight(String.valueOf(height));
+            image.setWidth(String.valueOf(width));
+            QueryWrapper<MaterialImageInfo> queryWrapper = new QueryWrapper<>();
+            MaterialImageInfo info = this.getOne(queryWrapper.eq("code", image.getCode()));
+            if (Check.isNull(info)){
+                this.saveOrUpdate(image);
+            }
         } catch (Exception e) {
             e.printStackTrace();
         }

+ 59 - 1
jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/common/utils/Check.java

@@ -3,8 +3,17 @@ package org.jeecg.modules.bytedance.common.utils;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.beanutils.BeanUtils;
 import org.apache.commons.lang3.StringUtils;
-
+import org.apache.poi.ss.formula.functions.T;
+import org.jeecg.modules.bytedance.advertise.vo.IndustryVo;
+
+import java.beans.BeanInfo;
+import java.beans.Introspector;
+import java.beans.PropertyDescriptor;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
 import java.util.Map;
@@ -83,6 +92,55 @@ public class Check {
     }
 
 
+
+    /**
+     * 将 Map对象转化为JavaBean
+     * @author loulan
+     * @param map
+     * @return Object对象
+     */
+    public static <T> T convertMap2Bean(Map map, Class T) throws Exception {
+        if(map==null || map.size()==0){
+            return null;
+        }
+        BeanInfo beanInfo = Introspector.getBeanInfo(T);
+        T bean = (T)T.newInstance();
+        PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
+        for (int i = 0, n = propertyDescriptors.length; i <n ; i++) {
+            PropertyDescriptor descriptor = propertyDescriptors[i];
+            String propertyName = descriptor.getName();
+            //将字母大写,这里先注掉,因为本例子直接读取名字匹配即可。
+            //String upperPropertyName = propertyName.toUpperCase();
+            if (map.containsKey(propertyName)) {
+                Object value = map.get(propertyName);
+                //这个方法不会报参数类型不匹配的错误。
+                BeanUtils.copyProperty(bean, propertyName, value);
+                //用这个方法对int等类型会报参数类型不匹配错误,需要我们手动判断类型进行转换,比较麻烦。
+                //descriptor.getWriteMethod().invoke(bean, value);
+                //用这个方法对时间等类型会报参数类型不匹配错误,也需要我们手动判断类型进行转换,比较麻烦。
+                //BeanUtils.setProperty(bean, propertyName, value);
+            }
+        }
+        return bean;
+    }
+
+    /**
+     * 将 List<Map>对象转化为List<JavaBean>
+     * @author loulan
+
+     * @return Object对象
+     */
+    public static <T> List<T> convertListMap2ListBean(List<Map<String,Object>> listMap, Class T) throws Exception {
+        List<T> beanList = new ArrayList<T>();
+        for(int i=0, n=listMap.size(); i<n; i++){
+            Map<String,Object> map = listMap.get(i);
+            T bean = convertMap2Bean(map,T);
+            beanList.add(bean);
+        }
+        return beanList;
+    }
+
+
     public static void main(String[] args) {
         JSONObject params = new JSONObject();
         params.put("advertiser_id", "123");

+ 50 - 18
jeecg-boot-module-system/src/main/java/org/jeecg/modules/bytedance/advertise/controller/AiBytedanceAdvertiserStrategyController.java

@@ -5,17 +5,24 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import io.swagger.annotations.*;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.shiro.SecurityUtils;
 import org.jeecg.common.api.vo.Result;
 import org.jeecg.common.system.query.QueryGenerator;
 import org.jeecg.common.system.vo.LoginUser;
 import org.jeecg.modules.bytedance.advertise.entity.AiBytedanceAdvertiserStrategy;
+import org.jeecg.modules.bytedance.advertise.entity.RuleDataAccount;
 import org.jeecg.modules.bytedance.advertise.entity.UpdAdStaOrCpaOrBudget;
 import org.jeecg.modules.bytedance.advertise.service.IAiBytedanceAdvertiserStrategyService;
+import org.jeecg.modules.bytedance.advertise.service.IRuleDataAccountService;
 import org.jeecg.modules.bytedance.advertise.vo.AdConvertQueryVo;
 import org.jeecg.modules.bytedance.advertise.vo.AdGroupSearchVo;
 import org.jeecg.modules.bytedance.advertise.vo.PlanSearchVo;
 import org.jeecg.modules.bytedance.common.constant.BytedanceConstant;
+import org.jeecg.modules.bytedance.common.entity.MaterialImageInfo;
+import org.jeecg.modules.bytedance.common.service.IMaterialImageInfoService;
+import org.jeecg.modules.bytedance.common.service.impl.MaterialImageInfoServiceImpl;
+import org.jeecg.modules.bytedance.common.utils.Check;
 import org.jeecg.modules.system.service.ISysRoleService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
@@ -31,7 +38,7 @@ import java.util.List;
  * @version V1.0
  */
 @RestController
-@RequestMapping("/ctop/aiBytedanceAdvertiserStrategy")
+@RequestMapping("/advertiser/aiBytedanceAdvertiserStrategy")
 @Api(tags="头条智能投放账户配置信息表")
 @Slf4j
 public class AiBytedanceAdvertiserStrategyController {
@@ -41,6 +48,12 @@ public class AiBytedanceAdvertiserStrategyController {
 	@Autowired
 	private ISysRoleService sysRoleService;
 
+	@Autowired
+	private IRuleDataAccountService ruleDataAccountService;
+
+	@Autowired
+	private IMaterialImageInfoService materialImageInfoService;
+
 
 	/**
 	  * 分页列表查询
@@ -58,38 +71,48 @@ public class AiBytedanceAdvertiserStrategyController {
 																	  HttpServletRequest req) {
 		Result<IPage<AiBytedanceAdvertiserStrategy>> result = new Result<>();
 		QueryWrapper<AiBytedanceAdvertiserStrategy> queryWrapper = QueryGenerator.initQueryWrapper(aiBytedanceAdvertiserStrategy, req.getParameterMap());
-		//获取登录用户信息
-		LoginUser loginUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
 		//获取用户角色code
-		String roleCode = sysRoleService.getRoleCodeByUserId(loginUser.getId());
-		if(!BytedanceConstant.COMMON_ROLE_CODE_ADMIN.equals(roleCode)){
-			queryWrapper.eq("user_id", loginUser.getId());
+		String roleCode = sysRoleService.getRoleCodeByUserId(aiBytedanceAdvertiserStrategy.getLoginUserId());
+		if(null != roleCode && !BytedanceConstant.COMMON_ROLE_CODE_ADMIN.equals(roleCode)){
+			queryWrapper.eq("user_id", aiBytedanceAdvertiserStrategy.getLoginUserId());
 		}
 		Page<AiBytedanceAdvertiserStrategy> page = new Page<AiBytedanceAdvertiserStrategy>(pageNo, pageSize);
 		//查询
 		IPage<AiBytedanceAdvertiserStrategy> pageList = aiBytedanceAdvertiserStrategyService.page(page, queryWrapper);
+		pageList.getRecords().forEach(pojo ->{
+			if (!Check.isNull(pojo.getAccountId())){
+				QueryWrapper<RuleDataAccount> ruleDataAccountQueryWrapper = new QueryWrapper<>();
+				ruleDataAccountQueryWrapper.eq("account_id",pojo.getAccountId());
+				//获取消耗 余额
+				RuleDataAccount ruleDataAccountVo =  ruleDataAccountService.getOne(ruleDataAccountQueryWrapper);
+				//消耗
+				pojo.setCost(ruleDataAccountVo.getCost());
+				//余额
+				pojo.setValidBalance(ruleDataAccountVo.getValidBalance());
+			}
+
+
+		});
+
 		result.setSuccess(true);
 		result.setResult(pageList);
 		return result;
 	}
 
 	/**
-	  *   添加
+	  *   添加配置信息
 	 * @param aiBytedanceAdvertiserStrategy
 	 * @return
 	 */
 	@ApiOperation(value="头条智能投放账户配置信息表-添加", notes="头条智能投放账户配置信息表-添加")
-	@PostMapping(value = "/add")
-	public Result<AiBytedanceAdvertiserStrategy> add(@RequestBody AiBytedanceAdvertiserStrategy aiBytedanceAdvertiserStrategy) {
-		Result<AiBytedanceAdvertiserStrategy> result = new Result<>();
+	@PostMapping(value = "/addBytedanceStrategy")
+	public Result addBytedanceStrategy(@RequestBody AiBytedanceAdvertiserStrategy aiBytedanceAdvertiserStrategy) {
 		try {
-			aiBytedanceAdvertiserStrategyService.save(aiBytedanceAdvertiserStrategy);
-			result.success("添加成功!");
+			return aiBytedanceAdvertiserStrategyService.addBytedanceStrategy(aiBytedanceAdvertiserStrategy);
 		} catch (Exception e) {
 			log.error(e.getMessage(),e);
-			result.error500("操作失败");
+			return Result.error("请求失败,请联系开发人员!");
 		}
-		return result;
 	}
 
 
@@ -164,6 +187,15 @@ public class AiBytedanceAdvertiserStrategyController {
 		if(aiBytedanceAdvertiserStrategy==null) {
 			result.error500("未找到对应实体");
 		}else {
+			//商品卖点
+			aiBytedanceAdvertiserStrategy.setProductSellingPoints(aiBytedanceAdvertiserStrategy.getCreativeProductSellingPoints().split(","));
+			//广告位置
+			aiBytedanceAdvertiserStrategy.setCreativeInventoryTypes(aiBytedanceAdvertiserStrategy.getCreativeInventoryType().split(","));
+			//创意标签
+			aiBytedanceAdvertiserStrategy.setAdKeywords(aiBytedanceAdvertiserStrategy.getCreativeAdKeywords().split(","));
+			//素材图片url
+			MaterialImageInfo materialImageInfo = materialImageInfoService.getByCode(aiBytedanceAdvertiserStrategy.getCreativeProductImageCode());
+			aiBytedanceAdvertiserStrategy.setImageUrl(materialImageInfo.getUrl());
 			result.setResult(aiBytedanceAdvertiserStrategy);
 			result.setSuccess(true);
 		}
@@ -201,8 +233,8 @@ public class AiBytedanceAdvertiserStrategyController {
 
 
 	@ApiOperation(value="头条智能投放账户配置-获取行业类别", notes="头条智能投放账户配置-获取行业类别")
-	@PostMapping(value = "/getIndustryList")
-	public Result getIndustryList(@RequestParam("accountId") String accountId, @RequestParam("type") String type) {
+	@GetMapping(value = "/getIndustryList")
+	public Result getIndustryList(@RequestParam("accountId") String accountId, @RequestParam(value = "type",defaultValue = "ADVERTISER") String type) {
 		try {
 			return aiBytedanceAdvertiserStrategyService.getIndustryList(accountId,type);
 		}catch (Exception e){
@@ -235,7 +267,7 @@ public class AiBytedanceAdvertiserStrategyController {
 		try {
 			return aiBytedanceAdvertiserStrategyService.getCampaignPlan(accountId,planSearchVoList,pageNo,pageSize);
 		}catch (Exception e){
-			log.error("获取广告异常。",e.getMessage());
+			log.error("获取广告计划异常。",e.getMessage());
 			return Result.error("请求失败,请联系开发人员!");
 		}
 	}
@@ -259,7 +291,7 @@ public class AiBytedanceAdvertiserStrategyController {
 		try {
 			return aiBytedanceAdvertiserStrategyService.getToolConvert(adConvertQueryVo);
 		}catch (Exception e){
-			log.error("创建失败",e.getMessage());
+			log.error("查询广告计划可用转化目标异常",e.getMessage());
 			return Result.error("请求失败,请联系开发人员!");
 		}
 	}

+ 1 - 1
jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/mapper/SysRoleMapper.java

@@ -41,6 +41,6 @@ public interface SysRoleMapper extends BaseMapper<SysRole> {
      * @param userId
      * @return
      */
-    @Select("select c.role_code from sys_user left join sys_user_role b on a.id = b.user_id left join sys_role c on b.role_id = c.id where a.id = #{userId}")
+    @Select("select c.role_code from sys_user a left join sys_user_role b on a.id = b.user_id left join sys_role c on b.role_id = c.id where a.id = #{userId}")
     String getRoleCodeByUserId(@Param("userId") String userId);
 }

+ 1 - 1
jeecg-boot-module-system/src/main/resources/application-dev.yml

@@ -7,7 +7,7 @@ server:
     include-stacktrace: ALWAYS
     include-message: ALWAYS
   servlet:
-    context-path: /jeecg-boot
+    context-path: /bytedance-api
   compression:
     enabled: true
     min-response-size: 1024