ソースを参照

自动投放账户重构——初版

zhaoxian 4 年 前
コミット
64e6e40575
15 ファイル変更967 行追加574 行削除
  1. 5 0
      jeecg-boot-module-system/src/main/java/cn/com/ctop/common/module/utils/KuaishouInterfaceConstant.java
  2. 16 12
      jeecg-boot-module-system/src/main/java/cn/com/ctop/kuaishou/modules/ai/controller/AiKuaishouAccountAutoDoController.java
  3. 20 13
      jeecg-boot-module-system/src/main/java/cn/com/ctop/kuaishou/modules/ai/entity/AiKuaishouAccountAutoStrategy.java
  4. 23 0
      jeecg-boot-module-system/src/main/java/cn/com/ctop/kuaishou/modules/ai/entity/AiKuaishouAccountAutoVideo.java
  5. 18 0
      jeecg-boot-module-system/src/main/java/cn/com/ctop/kuaishou/modules/ai/entity/AiKuaishouCreativeLevelOperationRecord.java
  6. 20 1
      jeecg-boot-module-system/src/main/java/cn/com/ctop/kuaishou/modules/ai/entity/AiKuaishouUnitLevelOperationRecord.java
  7. 6 0
      jeecg-boot-module-system/src/main/java/cn/com/ctop/kuaishou/modules/ai/mapper/AiKuaishouAccountAutoVideoMapper.java
  8. 34 1
      jeecg-boot-module-system/src/main/java/cn/com/ctop/kuaishou/modules/ai/mapper/xml/AiKuaishouAccountAutoVideoMapper.xml
  9. 9 3
      jeecg-boot-module-system/src/main/java/cn/com/ctop/kuaishou/modules/ai/service/IAiKuaishouAccountAutoDoService.java
  10. 2 0
      jeecg-boot-module-system/src/main/java/cn/com/ctop/kuaishou/modules/ai/service/IAiKuaishouAccountAutoVideoService.java
  11. 790 535
      jeecg-boot-module-system/src/main/java/cn/com/ctop/kuaishou/modules/ai/service/impl/AiKuaishouAccountAutoDoServiceImpl.java
  12. 14 0
      jeecg-boot-module-system/src/main/java/cn/com/ctop/kuaishou/modules/ai/service/impl/AiKuaishouAccountAutoVideoServiceImpl.java
  13. 1 1
      jeecg-boot-module-system/src/main/java/cn/com/ctop/kuaishou/modules/batch/mapper/xml/KuaiShouGroupMapper.xml
  14. 6 5
      jeecg-boot-module-system/src/main/java/cn/com/ctop/kuaishou/modules/batch/service/impl/KuaishouInterfaceServiceImpl.java
  15. 3 3
      jeecg-boot-module-system/src/main/java/cn/com/ctop/kuaishou/modules/channel/controller/KuaishouChannelController.java

+ 5 - 0
jeecg-boot-module-system/src/main/java/cn/com/ctop/common/module/utils/KuaishouInterfaceConstant.java

@@ -55,6 +55,11 @@ public class KuaishouInterfaceConstant {
      * 创建广告创意
      */
     public static final String AD_CREATIVE_CREATE = "/rest/openapi/v2/creative/create";
+
+    /**
+     * 批量创建&修改创意
+     */
+    public static final String AD_CREATIVE_BATCH_CREATE = "/rest/openapi/v2/creative/batch/update";
     /**
      * 程序化创意 2.0
      */

+ 16 - 12
jeecg-boot-module-system/src/main/java/cn/com/ctop/kuaishou/modules/ai/controller/AiKuaishouAccountAutoDoController.java

@@ -33,13 +33,20 @@ public class AiKuaishouAccountAutoDoController {
 
 
     /**
-     * 自动上新
-     *
-     * @param id
-     * @return
+     * 临时测试
      */
-    @GetMapping(value = "/customCreativeLimitNew")
-    public JSONObject customCreativeLimitNew(String id) {
+    @GetMapping(value = "/testMethod")
+    public JSONObject testMethod(int type, int count) {
+        JSONObject returnJson = new JSONObject();
+        autoDoService.testMethod(type, count);
+        return returnJson;
+    }
+
+    /**
+     * 创建自定义广告创意
+     */
+    @GetMapping(value = "/createCustomCreative")
+    public JSONObject createCustomCreative(String id) {
         JSONObject returnJson = new JSONObject();
         try {
             if (Check.isNull(id)) {
@@ -51,13 +58,10 @@ public class AiKuaishouAccountAutoDoController {
             }
             Boolean unitOverrun = autoDoService.getUnitOverrun(strategy.getAccountId());
             if (unitOverrun) {
-                log.error("组创建超限,accountId:{}", strategy.getAccountId());
-                throw new Exception("今日组创建已超限");
+                log.error("****** 广告组创建超限,accountId:{}", strategy.getAccountId());
+                throw new Exception("今日广告组创建已超限");
             }
-
-            executorService.submit(() ->
-                    autoDoService.customCreativeLimitNew(strategy)
-            );
+            executorService.submit(() -> autoDoService.createCustomCreative(strategy));
             returnJson.put("code", 0);
             returnJson.put("message", "异步创建中");
         } catch (Exception e) {

+ 20 - 13
jeecg-boot-module-system/src/main/java/cn/com/ctop/kuaishou/modules/ai/entity/AiKuaishouAccountAutoStrategy.java

@@ -1,22 +1,19 @@
 package cn.com.ctop.kuaishou.modules.ai.entity;
 
-import java.io.Serializable;
-import java.math.BigDecimal;
-import java.util.Date;
-
 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 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;
 
+import java.math.BigDecimal;
+import java.util.Date;
+
 /**
  * 自动投放重构-账户策略表
  *
@@ -547,8 +544,8 @@ public class AiKuaishouAccountAutoStrategy {
     /**
      * 是否单一应用 0 是 1 否
      */
-    @Excel(name = "是否单一应用 0 是 1 否", width = 15)
-    @ApiModelProperty(value = "是否单一应用 0 是 1 否")
+    @Excel(name = "单/多应用,1单应用,2多应用", width = 15)
+    @ApiModelProperty(value = "单/多应用,1单应用,2多应用")
     private Integer singleAppid;
     /**
      * 应用ID列表
@@ -653,6 +650,14 @@ public class AiKuaishouAccountAutoStrategy {
     @ApiModelProperty(value = "是否使用渠道号0不使用,1使用")
     private Integer useChannel;
     /**
+     * 1 定向匹配。2素材匹配
+     */
+    private Integer matchType;
+    /**
+     * 本地定向集
+     */
+    private String autoTargetArray;
+    /**
      * 是否开启系统优选 0 否 1 是
      */
     @Excel(name = "是否开启系统优选 0 否 1 是", width = 15)
@@ -664,8 +669,10 @@ public class AiKuaishouAccountAutoStrategy {
     @ApiModelProperty(value = "updateTime")
     private Date updateTime;
 
-
-
-	@TableField(exist = false)
-	private String authName;
+    /**
+     * 素材来源 1-上新素材,2-高质量素材,3-遗漏素材,4-历史打捞
+     */
+    private String sourceMaterial;
+    @TableField(exist = false)
+    private String authName;
 }

ファイルの差分が大きいため隠しています
+ 23 - 0
jeecg-boot-module-system/src/main/java/cn/com/ctop/kuaishou/modules/ai/entity/AiKuaishouAccountAutoVideo.java


+ 18 - 0
jeecg-boot-module-system/src/main/java/cn/com/ctop/kuaishou/modules/ai/entity/AiKuaishouCreativeLevelOperationRecord.java

@@ -1,9 +1,11 @@
 package cn.com.ctop.kuaishou.modules.ai.entity;
 
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import lombok.Data;
+import org.springframework.beans.BeanUtils;
 
 import java.util.Date;
 
@@ -155,4 +157,20 @@ public class AiKuaishouCreativeLevelOperationRecord {
      * 1:账户自动投放 2:项目自动投放
      */
     private Integer createType;
+
+    public AiKuaishouCreativeLevelOperationRecord() {
+
+    }
+
+    public AiKuaishouCreativeLevelOperationRecord(AiKuaishouAccountAutoStrategy strategy, Integer creativeCode, JSONObject creativeParams, String creativeMessage, Long unitId, String uuid) {
+        BeanUtils.copyProperties(strategy, this);
+        this.status = creativeCode;
+        this.description = creativeParams.getString("description");
+        this.photoId = creativeParams.getString("photo_id");
+        this.message = creativeMessage;
+        this.unitId = unitId;
+        this.aiStrategyUuid = uuid;
+        this.createTime = new Date();
+        this.createType = 3;
+    }
 }

+ 20 - 1
jeecg-boot-module-system/src/main/java/cn/com/ctop/kuaishou/modules/ai/entity/AiKuaishouUnitLevelOperationRecord.java

@@ -1,9 +1,11 @@
 package cn.com.ctop.kuaishou.modules.ai.entity;
 
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import lombok.Data;
+import org.springframework.beans.BeanUtils;
 
 import java.util.Date;
 
@@ -193,7 +195,7 @@ public class AiKuaishouUnitLevelOperationRecord {
     private Integer gender;
     /**
      * 创建类型
-     * 1:账户自动投放 2:项目自动投放
+     * 1:账户自动投放 2:项目自动投放 3 账户重构
      */
     private Integer createType;
     /**
@@ -318,4 +320,21 @@ public class AiKuaishouUnitLevelOperationRecord {
     private Integer deepConversionBid;
     private Long targetCombineId;
 
+    public AiKuaishouUnitLevelOperationRecord() {
+
+    }
+
+    public AiKuaishouUnitLevelOperationRecord(AiKuaishouAccountAutoStrategy strategy, JSONObject unitParams, Integer unitCode, String unitMessage, String strategyUuid) {
+        BeanUtils.copyProperties(strategy, this);
+        this.groupName = unitParams.getString("unit_name");
+        this.campaignId = unitParams.getLong("campaign_id");
+        this.cpaBid = unitParams.getInteger("cpa_bid");
+        this.bid = unitParams.getInteger("bid");
+        this.deepConversionBid = unitParams.getInteger("deep_conversion_bid");
+        this.createTime = new Date();
+        this.status = unitCode;
+        this.message = unitMessage;
+        this.aiStrategyUuid = strategyUuid;
+        this.createType = 3;
+    }
 }

+ 6 - 0
jeecg-boot-module-system/src/main/java/cn/com/ctop/kuaishou/modules/ai/mapper/AiKuaishouAccountAutoVideoMapper.java

@@ -24,4 +24,10 @@ public interface AiKuaishouAccountAutoVideoMapper extends BaseMapper<AiKuaishouA
     List<AiKuaishouAccountAutoVideo> getHistoryCatchVideos(@Param("accountId") Long accountId, @Param("channelType") Integer channelType, @Param("keyword") String keyword, @Param("videoCnt") Integer videoCnt);
 
     List<AiKuaishouAccountAutoVideo> getZeroVideoByParams(Long accountId, Integer channelType, String keyword, Integer videoCnt);
+
+    Integer getAutoVideoUsed(@Param("accountId") Long accountId, @Param("signature") String signature, @Param("createType") Integer createType);
+
+    void addAutoVideoUsed(@Param("accountId") Long accountId, @Param("signature") String signature, @Param("createType") Integer createType, @Param("usageTimes") Integer usageTimes, @Param("date") String date);
+
+    void updateAutoVideoUsed(@Param("accountId") Long accountId, @Param("signature") String signature, @Param("createType") Integer createType, @Param("usageTimes") Integer usageTimes);
 }

+ 34 - 1
jeecg-boot-module-system/src/main/java/cn/com/ctop/kuaishou/modules/ai/mapper/xml/AiKuaishouAccountAutoVideoMapper.xml

@@ -62,7 +62,6 @@
         LIMIT #{videoCnt}
     </select>
 
-
     <select id="getHistoryTopVideos" resultType="cn.com.ctop.kuaishou.modules.ai.entity.AiKuaishouAccountAutoVideo">
         select
         account_id,
@@ -121,8 +120,42 @@
         group by signature
         ORDER BY t2.sum_cost DESC
         LIMIT #{videoCnt}
+    </select>
 
 
+    <select id="getAutoVideoUsed" resultType="java.lang.Integer">
+        SELECT usage_times
+        FROM ctop_ai_kuaishou_account_auto_video_used
+        WHERE signature = #{signature}
+          AND account_id = #{accountId}
+          AND type = #{createType} limit 1
     </select>
 
+
+    <insert id="addAutoVideoUsed">
+        replace
+        into ctop_ai_kuaishou_account_auto_video_used
+        (
+        account_id,
+        signature,
+        type,
+        stat_date,
+        usage_times)
+        values
+        (
+        #{accountId},
+        #{signature},
+        #{type},
+        #{date},
+        #{usageTimes}
+        )
+    </insert>
+
+    <update id="updateAutoVideoUsed">
+        UPDATE ctop_ai_kuaishou_account_auto_video_used
+        SET usage_times = #{usageTimes}
+        WHERE signature = #{signature}
+          AND account_id = #{accountId}
+          AND type = #{createType}
+    </update>
 </mapper>

+ 9 - 3
jeecg-boot-module-system/src/main/java/cn/com/ctop/kuaishou/modules/ai/service/IAiKuaishouAccountAutoDoService.java

@@ -5,6 +5,14 @@ import cn.com.ctop.kuaishou.modules.ai.entity.AiKuaishouAccountAutoStrategy;
 import java.text.ParseException;
 
 public interface IAiKuaishouAccountAutoDoService {
+
+    //创建自定义广告创意
+    void createCustomCreative(AiKuaishouAccountAutoStrategy strategy);
+
+    // 组创建是否超限
+    Boolean getUnitOverrun(Long accountId);
+
+
     Integer autoCreateCreative(AiKuaishouAccountAutoStrategy strategy, Integer createType, Integer videoCnt);
 
     void autoCreateProgramCreative(AiKuaishouAccountAutoStrategy strategy, Integer createType, Integer videoCnt);
@@ -13,8 +21,6 @@ public interface IAiKuaishouAccountAutoDoService {
 
     void customCreativeLimit(AiKuaishouAccountAutoStrategy strategy);
 
-    // 组创建是否超限
-    Boolean getUnitOverrun(Long accountId);
 
-    void customCreativeLimitNew(AiKuaishouAccountAutoStrategy strategy);
+    void testMethod(int type, int count);
 }

+ 2 - 0
jeecg-boot-module-system/src/main/java/cn/com/ctop/kuaishou/modules/ai/service/IAiKuaishouAccountAutoVideoService.java

@@ -28,4 +28,6 @@ public interface IAiKuaishouAccountAutoVideoService extends IService<AiKuaishouA
 
     void insertAutoVideo(Long accountId);
 
+    //自动投放重构——记录(高质量,历史打捞)使用次数
+    void saveOrUpdateAutoVideoUsedCount(Long accountId, String signature, Integer createType);
 }

ファイルの差分が大きいため隠しています
+ 790 - 535
jeecg-boot-module-system/src/main/java/cn/com/ctop/kuaishou/modules/ai/service/impl/AiKuaishouAccountAutoDoServiceImpl.java


+ 14 - 0
jeecg-boot-module-system/src/main/java/cn/com/ctop/kuaishou/modules/ai/service/impl/AiKuaishouAccountAutoVideoServiceImpl.java

@@ -65,6 +65,20 @@ public class AiKuaishouAccountAutoVideoServiceImpl extends ServiceImpl<AiKuaisho
 
 
     @Override
+    public void saveOrUpdateAutoVideoUsedCount(Long accountId, String signature, Integer createType) {
+        Integer usageTimes = autoVideoMapper.getAutoVideoUsed(accountId, signature, createType);
+
+        if (Check.isNull(usageTimes)) {
+            String date = DateUtils.formatDate(new Date());
+            usageTimes = 1;
+            autoVideoMapper.addAutoVideoUsed(accountId, signature, createType,usageTimes,date);
+        } else {
+            usageTimes += 1;
+            autoVideoMapper.updateAutoVideoUsed(accountId, signature, createType,usageTimes);
+        }
+    }
+
+    @Override
     public void insertAutoVideo(Long accountId) {
         CtopOauthToken token = tokenService.getTokenByAccountId(accountId);
         this.getVideoListByPage(token, 1);

+ 1 - 1
jeecg-boot-module-system/src/main/java/cn/com/ctop/kuaishou/modules/batch/mapper/xml/KuaiShouGroupMapper.xml

@@ -139,7 +139,7 @@
         SELECT count(1) FROM ctop_kuaishou_group
         WHERE account_id = #{accountId}
           AND create_channel =1
-          AND LOCATE(#{date}, group_create_time)
+          AND group_create_time like concat(#{date},'%')
     </select>
     <select id="getNewDataByAccountIdAndDate" resultType="java.lang.Integer">
      select

+ 6 - 5
jeecg-boot-module-system/src/main/java/cn/com/ctop/kuaishou/modules/batch/service/impl/KuaishouInterfaceServiceImpl.java

@@ -2075,15 +2075,15 @@ public class KuaishouInterfaceServiceImpl implements IKuaishouInterfaceService {
                 if (code == 0) {
                     JSONObject dataJson = resultJson.getJSONObject("data");
                     if (!Check.isNull(dataJson)) {
-                        JSONArray add_creative_ids = dataJson.getJSONArray("add_creative_ids");
-                        if (!Check.isNull(add_creative_ids)) {
+                        JSONArray addCreativeIds = dataJson.getJSONArray("add_creative_ids");
+                        if (!Check.isNull(addCreativeIds)) {
                             Thread thread = new Thread() {
                                 @Override
                                 public void run() {
                                     try {
                                         Thread.sleep(100);
-                                        getCreativeByCreativeIds(accessToken, advertiserId, add_creative_ids);
-                                        createLandPageAndUnit(requestJson, add_creative_ids);
+                                        getCreativeByCreativeIds(accessToken, advertiserId, addCreativeIds);
+                                        createLandPageAndUnit(requestJson, addCreativeIds);
                                     } catch (InterruptedException e) {
                                         e.printStackTrace();
                                     }
@@ -2097,7 +2097,8 @@ public class KuaishouInterfaceServiceImpl implements IKuaishouInterfaceService {
                         returnMap.put("code", 0);
                         returnMap.put("message", "success");
                         returnMap.put("success", true);
-                        returnMap.put("count", add_creative_ids.size());
+                        returnMap.put("count", addCreativeIds.size());
+                        returnMap.put("ids",addCreativeIds);
                     }
                 } else {
                     if (code == 500000 && count <= 4) {

+ 3 - 3
jeecg-boot-module-system/src/main/java/cn/com/ctop/kuaishou/modules/channel/controller/KuaishouChannelController.java

@@ -274,12 +274,12 @@ public class KuaishouChannelController {
     /**
      * 通过账户查询渠道号接口
      */
-    @PostMapping(value = "/queryChannelList")
-        public Result<Object> queryChannelList(Long accountId, String appName,
+    @GetMapping(value = "/queryChannelList")
+    public Result<Object> queryChannelList(Long accountId, String appName,
                                            @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
                                            @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize) {
         try {
-            if (Check.isNull(accountId)|| Check.isNull(appName)) {
+            if (Check.isNull(accountId) || Check.isNull(appName)) {
                 return Result.error("缺失参数");
             }
             PageHelper.startPage(pageNo, pageSize);