Browse Source

智能投放--定时任务自动上新服务

liyuyi@c-top.com.cn 4 năm trước cách đây
mục cha
commit
74163753b6
61 tập tin đã thay đổi với 599 bổ sung145 xóa
  1. 1 1
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ads/controller/AiKuaiShouReportAnalyzeCtrl.java
  2. 1 1
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ads/controller/AiKuaiShouStrategyListPageCtrl.java
  3. 1 3
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ads/controller/KuaishouStrategyController.java
  4. 0 5
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ads/service/Test.java
  5. 1 2
      jeecg-boot-module-system/src/main/resources/ads/timing-task.json
  6. 2 2
      jeecg-boot-module-system/src/main/resources/application-dev.yml
  7. 2 2
      jeecg-boot-module-system/src/main/resources/application-test.yml
  8. 2 2
      jeecg-boot-module-system/src/main/resources/application-wps.yml
  9. 9 7
      jeecg-boot-module-system/src/test/java/org/jeecg/SampleTest.java
  10. 0 5
      module-job-bytedance/pom.xml
  11. 0 6
      module-job-kuaishou/pom.xml
  12. 9 16
      module-job-kuaishou/src/main/java/cn/com/ctop/job/kuaishou/handler/KuaishouAiAdsNewMaterialCreativityJob.java
  13. 3 3
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ads/entity/AiKuaishouStrategyMapCreative.java
  14. 3 3
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ads/entity/AiKuaishouStrategyMiddle.java
  15. 3 3
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ads/entity/AiKuaishouStrategyTargetBase.java
  16. 1 1
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ads/entity/AiKuaishouStrategyTargetDetails.java
  17. 3 3
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ads/entity/AiKuaishouStrategyTargetUnion.java
  18. 3 3
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ads/entity/AiKuaishouStrategyTemplate.java
  19. 1 1
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ads/mapper/AiKuaiShouStrategyListPageMapper.java
  20. 2 2
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ads/mapper/AiKuaishouStrategyMapCreativeMapper.java
  21. 2 2
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ads/mapper/AiKuaishouStrategyMiddleMapper.java
  22. 2 2
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ads/mapper/AiKuaishouStrategyTargetBaseMapper.java
  23. 2 2
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ads/mapper/AiKuaishouStrategyTargetDetailsMapper.java
  24. 2 2
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ads/mapper/AiKuaishouStrategyTargetUnionMapper.java
  25. 2 2
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ads/mapper/AiKuaishouStrategyTemplateMapper.java
  26. 1 1
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ads/mapper/IAiKuaiShouReportAnalyzeMapper.java
  27. 0 0
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/ai/mapper/xml/AiKuaishouReportAnalyzeMapper.xml
  28. 0 0
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/ai/mapper/xml/AiKuaishouStrategyListPageMapper.xml
  29. 0 0
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/ai/mapper/xml/AiKuaishouStrategyMapCreativeMapper.xml
  30. 0 0
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/ai/mapper/xml/AiKuaishouStrategyMiddleMapper.xml
  31. 0 0
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/ai/mapper/xml/AiKuaishouStrategyTargetBaseMapper.xml
  32. 0 0
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/ai/mapper/xml/AiKuaishouStrategyTargetDetailsMapper.xml
  33. 0 0
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/ai/mapper/xml/AiKuaishouStrategyTargetUnionMapper.xml
  34. 0 0
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/ai/mapper/xml/AiKuaishouStrategyTemplateMapper.xml
  35. 1 1
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ads/service/IAiKuaiShouReportAnalyzeService.java
  36. 1 1
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ads/service/IAiKuaiShouStrategyListPageService.java
  37. 6 0
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/ai/service/IAiKuaishouNewCreateCampaign.java
  38. 2 2
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ads/service/IAiKuaishouStrategyMapCreativeService.java
  39. 2 2
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ads/service/IAiKuaishouStrategyMiddleService.java
  40. 2 2
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ads/service/IAiKuaishouStrategyService.java
  41. 2 2
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ads/service/IAiKuaishouStrategyTargetBaseService.java
  42. 2 2
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ads/service/IAiKuaishouStrategyTargetDetailsService.java
  43. 2 2
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ads/service/IAiKuaishouStrategyTargetUnionService.java
  44. 2 2
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ads/service/IAiKuaishouStrategyTemplateService.java
  45. 1 1
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ads/service/IAiStrategyService.java
  46. 5 0
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/ai/service/Test.java
  47. 3 3
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ads/service/impl/AiKuaiShouReportAnalyzeServiceImpl.java
  48. 3 3
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ads/service/impl/AiKuaiShouStrategyListPageServiceImpl.java
  49. 303 0
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/ai/service/impl/AiKuaishouNewCreateCampaignServiceImpl.java
  50. 4 4
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ads/service/impl/AiKuaishouStrategyMapCreativeServiceImpl.java
  51. 4 4
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ads/service/impl/AiKuaishouStrategyMiddleServiceImpl.java
  52. 4 4
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ads/service/impl/AiKuaishouStrategyTargetBaseServiceImpl.java
  53. 4 4
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ads/service/impl/AiKuaishouStrategyTargetDetailsServiceImpl.java
  54. 4 4
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ads/service/impl/AiKuaishouStrategyTargetUnionServiceImpl.java
  55. 4 5
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ads/service/impl/AiKuaishouStrategyTemplateServiceImpl.java
  56. 4 5
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ads/service/impl/AiStrategyServiceImpl.java
  57. 3 10
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ads/service/impl/TestImpl.java
  58. 2 0
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/batch/service/IKuaiShouVideoGetService.java
  59. 46 0
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/batch/service/IKuaishouInterfaceService.java
  60. 14 0
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/batch/service/impl/KuaiShouVideoGetServiceImpl.java
  61. 111 0
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/batch/service/impl/KuaishouInterfaceServiceImpl.java

+ 1 - 1
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ads/controller/AiKuaiShouReportAnalyzeCtrl.java

@@ -1,9 +1,9 @@
 package org.jeecg.modules.ads.controller;
 
+import cn.com.ctop.kuaishou.modules.ai.service.IAiKuaiShouReportAnalyzeService;
 import com.alibaba.fastjson.JSONObject;
 import com.github.pagehelper.PageInfo;
 import org.jeecg.common.api.vo.Result;
-import org.jeecg.modules.ads.service.IAiKuaiShouReportAnalyzeService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 

+ 1 - 1
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ads/controller/AiKuaiShouStrategyListPageCtrl.java

@@ -1,9 +1,9 @@
 package org.jeecg.modules.ads.controller;
 
+import cn.com.ctop.kuaishou.modules.ai.service.IAiKuaiShouStrategyListPageService;
 import com.alibaba.fastjson.JSONObject;
 import com.github.pagehelper.PageInfo;
 import org.jeecg.common.api.vo.Result;
-import org.jeecg.modules.ads.service.IAiKuaiShouStrategyListPageService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;

+ 1 - 3
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ads/controller/KuaishouStrategyController.java

@@ -2,6 +2,7 @@ package org.jeecg.modules.ads.controller;
 
 import cn.com.ctop.common.module.annotation.AutoLog;
 import cn.com.ctop.common.module.utils.Check;
+import cn.com.ctop.kuaishou.modules.ai.service.IAiStrategyService;
 import cn.com.ctop.kuaishou.modules.batch.entity.KuaishouStrategy;
 import cn.com.ctop.kuaishou.modules.batch.service.IKuaishouStrategyService;
 import com.alibaba.fastjson.JSON;
@@ -14,13 +15,10 @@ import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.shiro.SecurityUtils;
-import org.checkerframework.checker.units.qual.A;
 import org.jeecg.common.api.vo.Result;
 import org.jeecg.common.system.query.QueryGenerator;
 import org.jeecg.common.system.vo.LoginUser;
 import org.jeecg.common.util.oConvertUtils;
-import org.jeecg.modules.ads.service.IAiKuaishouStrategyService;
-import org.jeecg.modules.ads.service.IAiStrategyService;
 import org.jeecgframework.poi.excel.ExcelImportUtil;
 import org.jeecgframework.poi.excel.def.NormalExcelConstants;
 import org.jeecgframework.poi.excel.entity.ExportParams;

+ 0 - 5
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ads/service/Test.java

@@ -1,5 +0,0 @@
-package org.jeecg.modules.ads.service;
-
-public interface Test {
-    int f();
-}

+ 1 - 2
jeecg-boot-module-system/src/main/resources/ads/timing-task.json

@@ -12,10 +12,9 @@
     "custom_crowd":"2",
     "population": "[]",
     "exclude_population": "[11950861, 11814320]",
-    "begin_time": "当天",
     "bid_type": 10,
     "ocpx_action_type":180,
-    "cpa_bid": 27000,
+    "cpa_bid": 26500,
     "scene_id": "[6, 7]",
     "site_id": "[{\"appId\":2817201,\"siteId\":\"\"}]",
     "impression_url": "https://adtracker.surge.alibaba.com/monitor.htm?channel=3&taskId=4&app=7&action=1&adid=__DID__&adName=__DNAME__&cid=__CID__&imeiMd5=__IMEI2__&idfaMd5=__IDFA2__&oaid=__OAID__&callbackUrl=__CALLBACK__&groupId=__AID__&csite=__CSITE__&androidIdMd5=__ANDROIDID2__&timestamp=__TS__&mac1Md5=__MAC2__&macMd5=__MAC3__&ip=__IP__&translationTag=1&serviceProviderName=Huichuang.wz",

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

@@ -136,8 +136,8 @@ spring:
       datasource:
         master:
           url: jdbc:mysql://139.186.27.96:4000/jeecg-boot?characterEncoding=UTF-8&useUnicode=true&allowMultiQueries=true
-          username: hcst
-          password: hcst@2020
+          username: data
+          password: hcst@2021
           driver-class-name: com.mysql.jdbc.Driver
           # 多数据源配置
           #multi-datasource1:

+ 2 - 2
jeecg-boot-module-system/src/main/resources/application-test.yml

@@ -97,9 +97,9 @@ spring:
         connectionProperties: druid.stat.mergeSql\=true;druid.stat.slowSqlMillis\=5000
       datasource:
         master:
-          url: jdbc:mysql://139.186.31.213:3306/jeecg-boot?characterEncoding=UTF-8&useUnicode=true
+          url: jdbc:mysql://139.186.151.174:3306/jeecg-boot?characterEncoding=UTF-8&useUnicode=true
           username: hcst
-          password: hcst2020
+          password: hcst@2020
           driver-class-name: com.mysql.jdbc.Driver
   #redis 配置
   redis:

+ 2 - 2
jeecg-boot-module-system/src/main/resources/application-wps.yml

@@ -97,8 +97,8 @@ spring:
       datasource:
         master:
           url: jdbc:mysql://139.186.27.96:4000/jeecg-boot?characterEncoding=UTF-8&useUnicode=true&useSSL=false
-          username: hcst
-          password: hcst@2020
+          username: data
+          password: hcst@2021
           driver-class-name: com.mysql.jdbc.Driver
   #redis 配置
   redis:

+ 9 - 7
jeecg-boot-module-system/src/test/java/org/jeecg/SampleTest.java

@@ -7,6 +7,7 @@ import cn.com.ctop.common.module.service.IBindAccountLoginService;
 import cn.com.ctop.common.module.service.ICtopOauthTokenService;
 import cn.com.ctop.common.module.service.IUserAllocationService;
 import cn.com.ctop.common.module.utils.CtopAdConstant;
+import cn.com.ctop.kuaishou.modules.ai.service.IAiKuaishouNewCreateCampaign;
 import cn.com.ctop.kuaishou.modules.batch.service.IKuaiShouCommentService;
 import cn.com.ctop.kuaishou.modules.batch.service.IKuaiShouDailyReportTaskService;
 import cn.com.ctop.kuaishou.modules.batch.service.IKuaiShouHistoryReportTaskService;
@@ -364,13 +365,6 @@ public class SampleTest {
             videoReportDailyService.videoInfoList(date, date);
         }
     }
-    @Autowired
-    private org.jeecg.modules.ads.service.Test test;
-
-    @Test
-    public void test(){
-        test.f();
-    }
 
     @Autowired
     private IRuleKuaiShouPlanService ruleKuaiShouPlanService;
@@ -438,4 +432,12 @@ public class SampleTest {
         }
     }
 
+    @Autowired
+    IAiKuaishouNewCreateCampaign aiKuaishouNewCreateCampaign;
+
+    @Test
+    public void kuaishouAiTest(){
+        aiKuaishouNewCreateCampaign.kuaishouAiAdsNewMaterialCreativity();
+    }
+
 }

+ 0 - 5
module-job-bytedance/pom.xml

@@ -56,11 +56,6 @@
             <groupId>org.slf4j</groupId>
             <artifactId>jcl-over-slf4j</artifactId>
         </dependency>
-        <dependency>
-            <groupId>cn.com.ctop</groupId>
-            <artifactId>module-media</artifactId>
-            <version>2.0.2</version>
-        </dependency>
 
         <dependency>
             <groupId>cn.com.ctop</groupId>

+ 0 - 6
module-job-kuaishou/pom.xml

@@ -58,12 +58,6 @@
         </dependency>
         <dependency>
             <groupId>cn.com.ctop</groupId>
-            <artifactId>module-media</artifactId>
-            <version>2.0.2</version>
-        </dependency>
-
-        <dependency>
-            <groupId>cn.com.ctop</groupId>
             <artifactId>module-alarm</artifactId>
             <version>2.0.2</version>
         </dependency>

+ 9 - 16
module-job-kuaishou/src/main/java/cn/com/ctop/job/kuaishou/handler/KuaishouAiAdsNewMaterialCreativityJob.java

@@ -1,22 +1,15 @@
 package cn.com.ctop.job.kuaishou.handler;
 
+import cn.com.ctop.kuaishou.modules.ai.service.IAiKuaishouNewCreateCampaign;
+import com.xxl.job.core.handler.annotation.XxlJob;
+import org.springframework.beans.factory.annotation.Autowired;
 
 public class KuaishouAiAdsNewMaterialCreativityJob {
 
-    //1、获取基本信息
-
-    // 2、获取执行 素造 和 非素造的 同步数据服务
-
-    // 3、获取5分钟类,ctop_kuaishou_video_get 的视频数据,记为 N,如果有数据则执行下面步骤
-
-    //2、判断该账户下有没有“上新”计划,没有则创建一个“上新”计划
-
-    //3、获取“上新”计划的最新的广告组
-    // 3.1 最新广告组里面的创意个数 记为 M
-    // 3.2 最新广告组可以增加的创意个数 15 - M
-    // 3.3 N - (15 - M) 个视频个数,按照mod15 之后的商 和 余数 来创建广告组
-
-
-
-
+    @Autowired
+    IAiKuaishouNewCreateCampaign aiKuaishouNewCreateCampaign;
+    @XxlJob("kuaishouAiAdsNewMaterialCreativityJob")
+    public void execute() {
+        aiKuaishouNewCreateCampaign.kuaishouAiAdsNewMaterialCreativity();
+    }
 }

+ 3 - 3
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ads/entity/AiKuaishouStrategyMapCreative.java

@@ -1,12 +1,12 @@
-package org.jeecg.modules.ads.entity;
+package cn.com.ctop.kuaishou.modules.ai.entity;
 
-import java.util.Date;
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
-
 import lombok.Data;
 
+import java.util.Date;
+
 /**
  * 策略创意表
  */

+ 3 - 3
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ads/entity/AiKuaishouStrategyMiddle.java

@@ -1,13 +1,13 @@
-package org.jeecg.modules.ads.entity;
+package cn.com.ctop.kuaishou.modules.ai.entity;
 
-import java.util.Date;
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
-
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
+import java.util.Date;
+
 /**
  * 策略_策略模板中间表
  */

+ 3 - 3
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ads/entity/AiKuaishouStrategyTargetBase.java

@@ -1,13 +1,13 @@
-package org.jeecg.modules.ads.entity;
+package cn.com.ctop.kuaishou.modules.ai.entity;
 
-import java.util.Date;
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
-
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
+import java.util.Date;
+
 /**
  * 定向基础表
  */

+ 1 - 1
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ads/entity/AiKuaishouStrategyTargetDetails.java

@@ -1,4 +1,4 @@
-package org.jeecg.modules.ads.entity;
+package cn.com.ctop.kuaishou.modules.ai.entity;
 
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableId;

+ 3 - 3
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ads/entity/AiKuaishouStrategyTargetUnion.java

@@ -1,13 +1,13 @@
-package org.jeecg.modules.ads.entity;
+package cn.com.ctop.kuaishou.modules.ai.entity;
 
-import java.util.Date;
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
-
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
+import java.util.Date;
+
 /**
  * 策略_定向中间表
  */

+ 3 - 3
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ads/entity/AiKuaishouStrategyTemplate.java

@@ -1,13 +1,13 @@
-package org.jeecg.modules.ads.entity;
+package cn.com.ctop.kuaishou.modules.ai.entity;
 
-import java.util.Date;
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
-
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
+import java.util.Date;
+
 /**
  * 策略模板表
  */

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

@@ -1,4 +1,4 @@
-package org.jeecg.modules.ads.mapper;
+package cn.com.ctop.kuaishou.modules.ai.mapper;
 
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;

+ 2 - 2
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ads/mapper/AiKuaishouStrategyMapCreativeMapper.java

@@ -1,7 +1,7 @@
-package org.jeecg.modules.ads.mapper;
+package cn.com.ctop.kuaishou.modules.ai.mapper;
 
+import cn.com.ctop.kuaishou.modules.ai.entity.AiKuaishouStrategyMapCreative;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import org.jeecg.modules.ads.entity.AiKuaishouStrategyMapCreative;
 
 /**
  * 策略创意表

+ 2 - 2
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ads/mapper/AiKuaishouStrategyMiddleMapper.java

@@ -1,7 +1,7 @@
-package org.jeecg.modules.ads.mapper;
+package cn.com.ctop.kuaishou.modules.ai.mapper;
 
+import cn.com.ctop.kuaishou.modules.ai.entity.AiKuaishouStrategyMiddle;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import org.jeecg.modules.ads.entity.AiKuaishouStrategyMiddle;
 
 /**
  * 策略_策略模板中间表

+ 2 - 2
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ads/mapper/AiKuaishouStrategyTargetBaseMapper.java

@@ -1,7 +1,7 @@
-package org.jeecg.modules.ads.mapper;
+package cn.com.ctop.kuaishou.modules.ai.mapper;
 
+import cn.com.ctop.kuaishou.modules.ai.entity.AiKuaishouStrategyTargetBase;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import org.jeecg.modules.ads.entity.AiKuaishouStrategyTargetBase;
 
 /**
  * 定向基础表

+ 2 - 2
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ads/mapper/AiKuaishouStrategyTargetDetailsMapper.java

@@ -1,7 +1,7 @@
-package org.jeecg.modules.ads.mapper;
+package cn.com.ctop.kuaishou.modules.ai.mapper;
 
+import cn.com.ctop.kuaishou.modules.ai.entity.AiKuaishouStrategyTargetDetails;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import org.jeecg.modules.ads.entity.AiKuaishouStrategyTargetDetails;
 
 /**
  * 智能投放快手定向策略详细信息

+ 2 - 2
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ads/mapper/AiKuaishouStrategyTargetUnionMapper.java

@@ -1,7 +1,7 @@
-package org.jeecg.modules.ads.mapper;
+package cn.com.ctop.kuaishou.modules.ai.mapper;
 
+import cn.com.ctop.kuaishou.modules.ai.entity.AiKuaishouStrategyTargetUnion;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import org.jeecg.modules.ads.entity.AiKuaishouStrategyTargetUnion;
 
 /**
  * 策略_定向中间表

+ 2 - 2
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ads/mapper/AiKuaishouStrategyTemplateMapper.java

@@ -1,7 +1,7 @@
-package org.jeecg.modules.ads.mapper;
+package cn.com.ctop.kuaishou.modules.ai.mapper;
 
+import cn.com.ctop.kuaishou.modules.ai.entity.AiKuaishouStrategyTemplate;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import org.jeecg.modules.ads.entity.AiKuaishouStrategyTemplate;
 
 /**
  * 策略模板表

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

@@ -1,4 +1,4 @@
-package org.jeecg.modules.ads.mapper;
+package cn.com.ctop.kuaishou.modules.ai.mapper;
 
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;

jeecg-boot-module-system/src/main/java/org/jeecg/modules/ads/mapper/xml/AiKuaishouReportAnalyzeMapper.xml → module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/ai/mapper/xml/AiKuaishouReportAnalyzeMapper.xml


jeecg-boot-module-system/src/main/java/org/jeecg/modules/ads/mapper/xml/AiKuaishouStrategyListPageMapper.xml → module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/ai/mapper/xml/AiKuaishouStrategyListPageMapper.xml


jeecg-boot-module-system/src/main/java/org/jeecg/modules/ads/mapper/xml/AiKuaishouStrategyMapCreativeMapper.xml → module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/ai/mapper/xml/AiKuaishouStrategyMapCreativeMapper.xml


jeecg-boot-module-system/src/main/java/org/jeecg/modules/ads/mapper/xml/AiKuaishouStrategyMiddleMapper.xml → module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/ai/mapper/xml/AiKuaishouStrategyMiddleMapper.xml


jeecg-boot-module-system/src/main/java/org/jeecg/modules/ads/mapper/xml/AiKuaishouStrategyTargetBaseMapper.xml → module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/ai/mapper/xml/AiKuaishouStrategyTargetBaseMapper.xml


jeecg-boot-module-system/src/main/java/org/jeecg/modules/ads/mapper/xml/AiKuaishouStrategyTargetDetailsMapper.xml → module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/ai/mapper/xml/AiKuaishouStrategyTargetDetailsMapper.xml


jeecg-boot-module-system/src/main/java/org/jeecg/modules/ads/mapper/xml/AiKuaishouStrategyTargetUnionMapper.xml → module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/ai/mapper/xml/AiKuaishouStrategyTargetUnionMapper.xml


jeecg-boot-module-system/src/main/java/org/jeecg/modules/ads/mapper/xml/AiKuaishouStrategyTemplateMapper.xml → module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/ai/mapper/xml/AiKuaishouStrategyTemplateMapper.xml


+ 1 - 1
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ads/service/IAiKuaiShouReportAnalyzeService.java

@@ -1,4 +1,4 @@
-package org.jeecg.modules.ads.service;
+package cn.com.ctop.kuaishou.modules.ai.service;
 
 import com.alibaba.fastjson.JSONObject;
 import com.github.pagehelper.PageInfo;

+ 1 - 1
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ads/service/IAiKuaiShouStrategyListPageService.java

@@ -1,4 +1,4 @@
-package org.jeecg.modules.ads.service;
+package cn.com.ctop.kuaishou.modules.ai.service;
 
 import com.alibaba.fastjson.JSONObject;
 import com.github.pagehelper.PageInfo;

+ 6 - 0
module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/ai/service/IAiKuaishouNewCreateCampaign.java

@@ -0,0 +1,6 @@
+package cn.com.ctop.kuaishou.modules.ai.service;
+
+public interface IAiKuaishouNewCreateCampaign {
+
+    void kuaishouAiAdsNewMaterialCreativity();
+}

+ 2 - 2
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ads/service/IAiKuaishouStrategyMapCreativeService.java

@@ -1,7 +1,7 @@
-package org.jeecg.modules.ads.service;
+package cn.com.ctop.kuaishou.modules.ai.service;
 
+import cn.com.ctop.kuaishou.modules.ai.entity.AiKuaishouStrategyMapCreative;
 import com.baomidou.mybatisplus.extension.service.IService;
-import org.jeecg.modules.ads.entity.AiKuaishouStrategyMapCreative;
 
 /**
  * @Description: 策略创意表

+ 2 - 2
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ads/service/IAiKuaishouStrategyMiddleService.java

@@ -1,7 +1,7 @@
-package org.jeecg.modules.ads.service;
+package cn.com.ctop.kuaishou.modules.ai.service;
 
+import cn.com.ctop.kuaishou.modules.ai.entity.AiKuaishouStrategyMiddle;
 import com.baomidou.mybatisplus.extension.service.IService;
-import org.jeecg.modules.ads.entity.AiKuaishouStrategyMiddle;
 
 /**
  * @Description: 策略_策略模板中间表

+ 2 - 2
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ads/service/IAiKuaishouStrategyService.java

@@ -1,7 +1,7 @@
-package org.jeecg.modules.ads.service;
+package cn.com.ctop.kuaishou.modules.ai.service;
 
+import cn.com.ctop.kuaishou.modules.ai.entity.AiKuaishouStrategyTemplate;
 import com.baomidou.mybatisplus.extension.service.IService;
-import org.jeecg.modules.ads.entity.AiKuaishouStrategyTemplate;
 
 /**
  * @Description: 智能投放策略信息

+ 2 - 2
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ads/service/IAiKuaishouStrategyTargetBaseService.java

@@ -1,7 +1,7 @@
-package org.jeecg.modules.ads.service;
+package cn.com.ctop.kuaishou.modules.ai.service;
 
+import cn.com.ctop.kuaishou.modules.ai.entity.AiKuaishouStrategyTargetBase;
 import com.baomidou.mybatisplus.extension.service.IService;
-import org.jeecg.modules.ads.entity.AiKuaishouStrategyTargetBase;
 
 import java.util.List;
 

+ 2 - 2
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ads/service/IAiKuaishouStrategyTargetDetailsService.java

@@ -1,7 +1,7 @@
-package org.jeecg.modules.ads.service;
+package cn.com.ctop.kuaishou.modules.ai.service;
 
+import cn.com.ctop.kuaishou.modules.ai.entity.AiKuaishouStrategyTargetDetails;
 import com.baomidou.mybatisplus.extension.service.IService;
-import org.jeecg.modules.ads.entity.AiKuaishouStrategyTargetDetails;
 
 /**
  * @Description: 智能投放快手定向策略详细信息

+ 2 - 2
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ads/service/IAiKuaishouStrategyTargetUnionService.java

@@ -1,7 +1,7 @@
-package org.jeecg.modules.ads.service;
+package cn.com.ctop.kuaishou.modules.ai.service;
 
+import cn.com.ctop.kuaishou.modules.ai.entity.AiKuaishouStrategyTargetUnion;
 import com.baomidou.mybatisplus.extension.service.IService;
-import org.jeecg.modules.ads.entity.AiKuaishouStrategyTargetUnion;
 
 /**
  * @Description: 策略_定向中间表

+ 2 - 2
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ads/service/IAiKuaishouStrategyTemplateService.java

@@ -1,7 +1,7 @@
-package org.jeecg.modules.ads.service;
+package cn.com.ctop.kuaishou.modules.ai.service;
 
+import cn.com.ctop.kuaishou.modules.ai.entity.AiKuaishouStrategyTemplate;
 import com.baomidou.mybatisplus.extension.service.IService;
-import org.jeecg.modules.ads.entity.AiKuaishouStrategyTemplate;
 
 /**
  * @Description: 策略模板表

+ 1 - 1
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ads/service/IAiStrategyService.java

@@ -1,4 +1,4 @@
-package org.jeecg.modules.ads.service;
+package cn.com.ctop.kuaishou.modules.ai.service;
 
 import cn.com.ctop.kuaishou.modules.batch.entity.KuaishouStrategy;
 

+ 5 - 0
module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/ai/service/Test.java

@@ -0,0 +1,5 @@
+package cn.com.ctop.kuaishou.modules.ai.service;
+
+public interface Test {
+    int f();
+}

+ 3 - 3
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ads/service/impl/AiKuaiShouReportAnalyzeServiceImpl.java

@@ -1,11 +1,11 @@
-package org.jeecg.modules.ads.service.impl;
+package cn.com.ctop.kuaishou.modules.ai.service.impl;
 
+import cn.com.ctop.kuaishou.modules.ai.mapper.IAiKuaiShouReportAnalyzeMapper;
+import cn.com.ctop.kuaishou.modules.ai.service.IAiKuaiShouReportAnalyzeService;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageInfo;
-import org.jeecg.modules.ads.mapper.IAiKuaiShouReportAnalyzeMapper;
-import org.jeecg.modules.ads.service.IAiKuaiShouReportAnalyzeService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 

+ 3 - 3
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ads/service/impl/AiKuaiShouStrategyListPageServiceImpl.java

@@ -1,6 +1,8 @@
-package org.jeecg.modules.ads.service.impl;
+package cn.com.ctop.kuaishou.modules.ai.service.impl;
 
 import cn.com.ctop.common.module.service.IUserAllocationService;
+import cn.com.ctop.kuaishou.modules.ai.mapper.AiKuaiShouStrategyListPageMapper;
+import cn.com.ctop.kuaishou.modules.ai.service.IAiKuaiShouStrategyListPageService;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.github.pagehelper.PageHelper;
@@ -8,8 +10,6 @@ import com.github.pagehelper.PageInfo;
 import lombok.extern.log4j.Log4j;
 import org.apache.shiro.SecurityUtils;
 import org.jeecg.common.system.vo.LoginUser;
-import org.jeecg.modules.ads.mapper.AiKuaiShouStrategyListPageMapper;
-import org.jeecg.modules.ads.service.IAiKuaiShouStrategyListPageService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 

+ 303 - 0
module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/ai/service/impl/AiKuaishouNewCreateCampaignServiceImpl.java

@@ -0,0 +1,303 @@
+package cn.com.ctop.kuaishou.modules.ai.service.impl;
+
+import cn.com.ctop.common.module.entity.CtopOauthToken;
+import cn.com.ctop.common.module.entity.MaterialCutFrame;
+import cn.com.ctop.common.module.entity.MaterialImageInfo;
+import cn.com.ctop.common.module.service.ICtopOauthTokenService;
+import cn.com.ctop.common.module.service.IMaterialCutFrameService;
+import cn.com.ctop.common.module.service.IMaterialImageInfoService;
+import cn.com.ctop.kuaishou.modules.ai.entity.AiKuaishouStrategyMapCreative;
+import cn.com.ctop.kuaishou.modules.ai.service.IAiKuaishouNewCreateCampaign;
+import cn.com.ctop.kuaishou.modules.ai.service.IAiKuaishouStrategyMapCreativeService;
+import cn.com.ctop.kuaishou.modules.batch.entity.KuaiShouImageGet;
+import cn.com.ctop.kuaishou.modules.batch.entity.KuaiShouVideoGet;
+import cn.com.ctop.kuaishou.modules.batch.service.IKuaiShouImageGetService;
+import cn.com.ctop.kuaishou.modules.batch.service.IKuaiShouMaterialUploadService;
+import cn.com.ctop.kuaishou.modules.batch.service.IKuaiShouVideoGetService;
+import cn.com.ctop.kuaishou.modules.batch.service.IKuaishouInterfaceService;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import lombok.extern.slf4j.Slf4j;
+import org.jeecg.common.util.DateUtils;
+import org.jeecg.common.util.JsonResourceUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+@Service
+@Slf4j
+public class AiKuaishouNewCreateCampaignServiceImpl implements IAiKuaishouNewCreateCampaign {
+
+    @Autowired
+    private IKuaiShouVideoGetService videoGetService;
+    @Autowired
+    private IKuaishouInterfaceService kuaishouInterfaceService;
+    @Autowired
+    private ICtopOauthTokenService tokenService;
+    @Autowired
+    private IAiKuaishouStrategyMapCreativeService mapCreativeService;
+    @Autowired
+    private IMaterialCutFrameService materialCutFrameService;
+    @Autowired
+    private IMaterialImageInfoService materialImageInfoService;
+    @Autowired
+    private IKuaiShouImageGetService imageGetService;
+    @Autowired
+    private IKuaiShouMaterialUploadService materialUploadService;
+
+    @Override
+    public void kuaishouAiAdsNewMaterialCreativity() {
+        //1、获取基本信息
+        String filePath = "/ads/timing-task.json";
+        JSONArray configJsonArray = JsonResourceUtil.getJsonArrFromResource(filePath);
+        // 只跑一个账户的定时上新任务,怕多个账户在指定的时间内执行不完
+        JSONObject configJson = configJsonArray.getJSONObject(0);
+        Long accountId = configJson.getLong("accountId");
+        CtopOauthToken token = tokenService.getOauthTokenByAccountId(accountId.toString());
+        if(null == token){
+            log.info("token获取失败=>accountId:{}",accountId);
+            return;
+        }
+
+        // 2、执行素材的同步数据服务
+        // 2.1 执行 非素造的 视频拉取服务,时间过滤支持 yyyy-MM-dd, 拉取当天凌晨到此刻的数据
+        kuaishouInterfaceService.getVideoList(token, DateUtils.date2Str(),DateUtils.date2Str());
+
+        // 2.2 执行 素造的 视频拉取服务,时间过滤执行 yyyy-MM-dd HH:mm:ss
+        // 时间差,单位为分钟
+        int dimeDiff = 5;
+        Date now = new Date();
+        String startTime = DateUtils.formatDate(new Date(now.getTime() - dimeDiff*60*1000),"yyyy-MM-dd HH:mm:ss");
+        String endTime = DateUtils.formatDate(now,"yyyy-MM-dd HH:mm:ss");
+        kuaishouInterfaceService.getSuZaoList(token.getAccessToken(), token.getAccountId(), 1, startTime, endTime);
+
+
+        // 3、获取5分钟内,ctop_kuaishou_video_get 的视频数据,记为 N,如果有数据则执行下面步骤
+        List<KuaiShouVideoGet> newVideos = videoGetService.getNewVideoBetweenTime(accountId,startTime,endTime);
+        int newVideosCnt = newVideos.size();
+        if (newVideosCnt == 0){
+            log.info("账户:{},{} 到 {} 这段时间没有上新素材",accountId, startTime, endTime);
+            return;
+        }
+
+        //2、判断该账户下当天有没有“上新”计划,没有则创建一个“上新”计划
+        // time_filter_type 传入 "start_date",与 "end_date" 字段,且此字段为1时,按照创建时间进行筛选
+        JSONArray campaignList = kuaishouInterfaceService.getCampaignList(token, new Date(), new Date(),1);
+        boolean isHaveNewCampaign = false;
+        Long newCampaignId = 0L;
+        if (campaignList.size()>0){
+            for(int i = 0;i<campaignList.size();i++){
+                JSONObject jsonObject = campaignList.getJSONObject(i);
+                if (jsonObject.getString("campaign_name").contains("素材上新")){
+                    isHaveNewCampaign = true;
+                    newCampaignId = jsonObject.getLong("campaign_id");
+                    break;
+                }
+            }
+        }
+        // 不存在“上新”计划,则创建一个计划
+        if (!isHaveNewCampaign){
+            Date campaignDate = new Date();
+            String timestamp = DateUtils.formatDate(campaignDate,"yyyyMMddHHmmss");
+            JSONObject campaignParams = new JSONObject();
+            campaignParams.put("advertiser_id",token.getAccountId());
+            String campaignName = "户14-上下滑&信息流" + "-素材上新-"+ "剪辑-低价-低价包邮-活动-年龄18岁以上-单出价-"+ timestamp;
+            campaignParams.put("campaign_name",campaignName);
+            campaignParams.put("type",Integer.parseInt(configJson.getString("marketing_goal")));
+            campaignParams.put("day_budget",0L);
+            Map<String, Object> campaignCreateResult = kuaishouInterfaceService.campaignCreate(token.getAccessToken(), token.getAccountId(), campaignParams);
+            Integer code = (Integer) campaignCreateResult.get("code");
+            String message = (String) campaignCreateResult.get("message");
+            if(code != 0 ){
+                log.info("计划创建失败=>message:{}",message);
+                return;
+            }
+            newCampaignId = (Long) campaignCreateResult.get("campaignId");
+        }
+
+        //3、在“上新”计划中新增广告组,一个素材搭配5张封面,组成一个广告组
+        String timestamp = DateUtils.formatDate(new Date(),"yyyyMMddHHmmss");
+        String unitName = "户14-上下滑&信息流" + "-素材上新-"+ "剪辑-低价-低价包邮-活动-年龄18岁以上-单出价-"+ timestamp;
+        int unitCnt = 0;
+        for(KuaiShouVideoGet videoItem: newVideos){
+            unitCnt ++;
+            unitName = unitName + "-" + unitCnt;
+            JSONObject unitParams = createUnitParams(token, newCampaignId, configJson, unitName);
+            Map<String, Object> unitCreateResult = kuaishouInterfaceService.adUnitCreate(token.getAccessToken(), token.getAccountId(), unitParams,1);
+            Integer unitCode = (Integer) unitCreateResult.get("code");
+            String unitMessage = (String) unitCreateResult.get("message");
+            if(unitCode != 0 ){
+                log.info("组创建失败=>accountId:{};message:{}",accountId,unitMessage);
+                continue;
+            }
+            Long unitId = (Long) unitCreateResult.get("unitId");
+
+            // 每个组,搭配5个创意
+            List<MaterialCutFrame> cutFrameList = materialCutFrameService.getListByVideoSignature(videoItem.getSignature());
+            List<MaterialImageInfo> orgFrameList = materialImageInfoService.getListByVideoSignature(videoItem.getSignature());
+            if ((null == cutFrameList||cutFrameList.isEmpty())&&(null == orgFrameList|| orgFrameList.isEmpty())){
+                log.info("未获取到视频封面=>videoSignature:{}",videoItem.getSignature());
+                continue;
+            }
+            JSONObject creativeParams = creativeParams(token, unitId, videoItem, configJson);
+            createCreativeByImage(cutFrameList, orgFrameList,token, creativeParams, newCampaignId, unitId, videoItem,5);
+        }
+    }
+
+
+
+    private JSONObject creativeParams(CtopOauthToken token,Long unitId,KuaiShouVideoGet videoItem,JSONObject configJson){
+        JSONObject creativeParams = new JSONObject();
+        creativeParams.put("advertiser_id",token.getAccountId());
+        creativeParams.put("unit_id",unitId);
+        creativeParams.put("photo_id",videoItem.getPhotoId());
+        creativeParams.put("creative_material_type",videoItem.getMaterialType());
+        creativeParams.put("action_bar_text","下载抢购");
+        creativeParams.put("description","不买亏大了!众多商品低至一元!看看你多花了多少冤枉钱!");
+        // 安卓下载中间页ID
+        JSONArray siteIdArray = JSONArray.parseArray(configJson.getString("site_id"));
+        if(null == siteIdArray||!siteIdArray.isEmpty()){
+            JSONObject siteObject = siteIdArray.getJSONObject(0);
+            Long appId = siteObject.getLong("appId");
+            Long siteId = siteObject.getLong("siteId");
+            if(null!=siteId){
+                creativeParams.put("site_id",siteId);
+            }
+        }
+        if(null != configJson.getString("click_track_url")&&!"".equals(configJson.getString("click_track_url"))){
+            creativeParams.put("click_track_url",configJson.getString("click_track_url"));
+        }
+        if(null != configJson.getString("impression_url")&&!"".equals(configJson.getString("impression_url"))){
+            creativeParams.put("impression_url",configJson.getString("impression_url"));
+        }
+        if(null != configJson.getString("actionbar_click_url")&&!"".equals(configJson.getString("actionbar_click_url"))){
+            creativeParams.put("actionbar_click_url",configJson.getString("actionbar_click_url"));
+        }
+        return creativeParams;
+    }
+
+
+    private void createCreative(CtopOauthToken token,JSONObject creativeParams,Long campaignId,Long unitId,
+                                int creativeCnt,KuaiShouVideoGet videoGet){
+        creativeParams.put("creative_name","自定义创意_竖版视频_"+creativeCnt);
+        Map<String, Object> creativeCreateResult = kuaishouInterfaceService.creativeCreate
+                (token.getAccessToken(), token.getAccountId(), creativeParams,1);
+        Integer creativeCode = (Integer) creativeCreateResult.get("code");
+        String creativeMessage = (String) creativeCreateResult.get("message");
+        if(creativeCode != 0 ){
+            log.info("创意创建失败=>message:{}",creativeMessage);
+            return;
+        }
+        Long creativeId = (Long) creativeCreateResult.get("creativeId");
+        AiKuaishouStrategyMapCreative mapCreative = new AiKuaishouStrategyMapCreative();
+        mapCreative.setAccountId(token.getAccountId());
+        mapCreative.setCampaignId(campaignId);
+        mapCreative.setUnitId(unitId);
+        mapCreative.setVideoSignature(videoGet.getSignature());
+        mapCreative.setCreativeId(creativeId);
+        mapCreativeService.save(mapCreative);
+    }
+
+
+    private JSONObject createUnitParams(CtopOauthToken token, Long campaignId,  JSONObject configJson,
+                                        String unitName) {
+        // 拼装创建组的入参 json
+        JSONObject unitParams = new JSONObject();
+        unitParams.put("advertiser_id",token.getAccountId());
+        unitParams.put("campaign_id",campaignId);
+        unitParams.put("unit_name", unitName);
+        unitParams.put("bid_type",configJson.getIntValue("bid_type"));
+        unitParams.put("ocpx_action_type",configJson.getIntValue("ocpx_action_type"));
+
+        if(null!=configJson.getString("use_app_market")&&!"".equals(configJson.getString("use_app_market"))){
+            unitParams.put("use_app_market",Integer.parseInt(configJson.getString("use_app_market")));
+        }
+        if(null!=configJson.getString("app_store")&&!"".equals(configJson.getString("app_store"))){
+            unitParams.put("app_store",JSONArray.parseArray(configJson.getString("app_store")));
+        }
+
+        // 在本策略中,都是 OCPM 的出价方式
+        unitParams.put("cpa_bid",configJson.getIntValue("cpa_bid"));
+        unitParams.put("scene_id",JSONArray.parseArray(configJson.getString("scene_id")));
+        unitParams.put("unit_type",4);
+
+        // 格式为yyyy-MM-dd,需大于等于当前时间
+        unitParams.put("begin_time",DateUtils.formatDate(new Date()));
+
+        JSONArray appIds = JSONArray.parseArray(configJson.getString("app_ids"));
+        if(null!=appIds&&!appIds.isEmpty()){
+            unitParams.put("app_id",appIds.getLong(0));
+        }
+        unitParams.put("show_mode",2);
+        unitParams.put("speed",1);
+
+        // 设置定向内容
+        JSONObject targetJsonObject = new JSONObject();
+        targetJsonObject.put("region",JSONArray.parseArray(configJson.getString("region")));
+        targetJsonObject.put("ages_range",JSONArray.parseArray(configJson.getString("ages_range")));
+        targetJsonObject.put("gender",configJson.getIntValue("gender"));
+        targetJsonObject.put("platform_os",configJson.getIntValue("platform_os"));
+        JSONArray population = JSONArray.parseArray(configJson.getString("population"));
+        if(null!=population&&!population.isEmpty()){
+            targetJsonObject.put("population",population);
+        }
+        JSONArray excludePopulation = JSONArray.parseArray(configJson.getString("exclude_population"));
+        if(null!=excludePopulation&&!excludePopulation.isEmpty()){
+            targetJsonObject.put("exclude_population",excludePopulation);
+        }
+        unitParams.put("target",targetJsonObject);
+
+        return unitParams;
+    }
+
+
+    private void createCreativeByImage(List<MaterialCutFrame> cutFrameList, List<MaterialImageInfo> orgFrameList,
+                                       CtopOauthToken token, JSONObject creativeParams,
+                                       Long campaignId, Long unitId, KuaiShouVideoGet videoItem,
+                                       int imageNumber){
+        int creativeCnt  = 1;
+        if (null!=orgFrameList&&!orgFrameList.isEmpty()) {
+            for (int i = 0; i < orgFrameList.size(); i++) {
+                String imageCode = orgFrameList.get(i).getCode();
+                String imageUrl = orgFrameList.get(i).getUrl();
+                String imageToken = getImageToken(imageUrl,imageCode,token.getAccountId(),token.getAccessToken());
+                creativeParams.put("image_token",imageToken);
+                createCreative(token, creativeParams, campaignId, unitId, creativeCnt,videoItem);
+                creativeCnt++;
+                if (creativeCnt > imageNumber) {
+                    break;
+                }
+            }
+        }
+
+        if ((null!=cutFrameList&&!cutFrameList.isEmpty()) && (creativeCnt<=15)){
+            for (int i = 0; i < cutFrameList.size(); i++) {
+                String imageCode = cutFrameList.get(i).getSignature();
+                String imageUrl = cutFrameList.get(i).getUrl();
+                String imageToken = getImageToken(imageUrl,imageCode,token.getAccountId(),token.getAccessToken());
+                creativeParams.put("image_token",imageToken);
+                createCreative(token, creativeParams, campaignId, unitId, creativeCnt,videoItem);
+                creativeCnt ++;
+                if (creativeCnt > imageNumber) {
+                    break;
+                }
+            }
+        }
+    }
+
+    private String getImageToken(String imageUrl, String imageCode, Long accountId,String token){
+        // 根据imageUrl 和 imageCode,获取 imageToken (创建创意用)
+        KuaiShouImageGet imageGet = imageGetService.getOneByParams(null,imageCode);
+        if ((null == imageGet) || ("".equals(imageGet.getImageToken()))){
+            // 如果取不到image_token
+            // 则调用上传url的方法 kuauiShouImageUpload(url, signature, accountId, oauthToken.getAccessToken());
+            return materialUploadService.kuauiShouImageUpload(imageUrl,imageCode,accountId,token);
+        }
+
+        return imageGet.getImageToken();
+    }
+
+}

+ 4 - 4
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ads/service/impl/AiKuaishouStrategyMapCreativeServiceImpl.java

@@ -1,9 +1,9 @@
-package org.jeecg.modules.ads.service.impl;
+package cn.com.ctop.kuaishou.modules.ai.service.impl;
 
+import cn.com.ctop.kuaishou.modules.ai.entity.AiKuaishouStrategyMapCreative;
+import cn.com.ctop.kuaishou.modules.ai.mapper.AiKuaishouStrategyMapCreativeMapper;
+import cn.com.ctop.kuaishou.modules.ai.service.IAiKuaishouStrategyMapCreativeService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import org.jeecg.modules.ads.entity.AiKuaishouStrategyMapCreative;
-import org.jeecg.modules.ads.mapper.AiKuaishouStrategyMapCreativeMapper;
-import org.jeecg.modules.ads.service.IAiKuaishouStrategyMapCreativeService;
 import org.springframework.stereotype.Service;
 
 /**

+ 4 - 4
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ads/service/impl/AiKuaishouStrategyMiddleServiceImpl.java

@@ -1,9 +1,9 @@
-package org.jeecg.modules.ads.service.impl;
+package cn.com.ctop.kuaishou.modules.ai.service.impl;
 
+import cn.com.ctop.kuaishou.modules.ai.entity.AiKuaishouStrategyMiddle;
+import cn.com.ctop.kuaishou.modules.ai.mapper.AiKuaishouStrategyMiddleMapper;
+import cn.com.ctop.kuaishou.modules.ai.service.IAiKuaishouStrategyMiddleService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import org.jeecg.modules.ads.entity.AiKuaishouStrategyMiddle;
-import org.jeecg.modules.ads.mapper.AiKuaishouStrategyMiddleMapper;
-import org.jeecg.modules.ads.service.IAiKuaishouStrategyMiddleService;
 import org.springframework.stereotype.Service;
 
 /**

+ 4 - 4
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ads/service/impl/AiKuaishouStrategyTargetBaseServiceImpl.java

@@ -1,10 +1,10 @@
-package org.jeecg.modules.ads.service.impl;
+package cn.com.ctop.kuaishou.modules.ai.service.impl;
 
+import cn.com.ctop.kuaishou.modules.ai.entity.AiKuaishouStrategyTargetBase;
+import cn.com.ctop.kuaishou.modules.ai.mapper.AiKuaishouStrategyTargetBaseMapper;
+import cn.com.ctop.kuaishou.modules.ai.service.IAiKuaishouStrategyTargetBaseService;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import org.jeecg.modules.ads.entity.AiKuaishouStrategyTargetBase;
-import org.jeecg.modules.ads.mapper.AiKuaishouStrategyTargetBaseMapper;
-import org.jeecg.modules.ads.service.IAiKuaishouStrategyTargetBaseService;
 import org.springframework.stereotype.Service;
 
 import java.util.List;

+ 4 - 4
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ads/service/impl/AiKuaishouStrategyTargetDetailsServiceImpl.java

@@ -1,9 +1,9 @@
-package org.jeecg.modules.ads.service.impl;
+package cn.com.ctop.kuaishou.modules.ai.service.impl;
 
+import cn.com.ctop.kuaishou.modules.ai.entity.AiKuaishouStrategyTargetDetails;
+import cn.com.ctop.kuaishou.modules.ai.mapper.AiKuaishouStrategyTargetDetailsMapper;
+import cn.com.ctop.kuaishou.modules.ai.service.IAiKuaishouStrategyTargetDetailsService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import org.jeecg.modules.ads.entity.AiKuaishouStrategyTargetDetails;
-import org.jeecg.modules.ads.mapper.AiKuaishouStrategyTargetDetailsMapper;
-import org.jeecg.modules.ads.service.IAiKuaishouStrategyTargetDetailsService;
 import org.springframework.stereotype.Service;
 
 /**

+ 4 - 4
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ads/service/impl/AiKuaishouStrategyTargetUnionServiceImpl.java

@@ -1,9 +1,9 @@
-package org.jeecg.modules.ads.service.impl;
+package cn.com.ctop.kuaishou.modules.ai.service.impl;
 
+import cn.com.ctop.kuaishou.modules.ai.entity.AiKuaishouStrategyTargetUnion;
+import cn.com.ctop.kuaishou.modules.ai.mapper.AiKuaishouStrategyTargetUnionMapper;
+import cn.com.ctop.kuaishou.modules.ai.service.IAiKuaishouStrategyTargetUnionService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import org.jeecg.modules.ads.entity.AiKuaishouStrategyTargetUnion;
-import org.jeecg.modules.ads.mapper.AiKuaishouStrategyTargetUnionMapper;
-import org.jeecg.modules.ads.service.IAiKuaishouStrategyTargetUnionService;
 import org.springframework.stereotype.Service;
 
 /**

+ 4 - 5
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ads/service/impl/AiKuaishouStrategyTemplateServiceImpl.java

@@ -1,11 +1,10 @@
-package org.jeecg.modules.ads.service.impl;
+package cn.com.ctop.kuaishou.modules.ai.service.impl;
 
+import cn.com.ctop.kuaishou.modules.ai.entity.AiKuaishouStrategyTemplate;
+import cn.com.ctop.kuaishou.modules.ai.mapper.AiKuaishouStrategyTemplateMapper;
+import cn.com.ctop.kuaishou.modules.ai.service.IAiKuaishouStrategyTemplateService;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import org.jeecg.modules.ads.entity.AiKuaishouStrategyTemplate;
-import org.jeecg.modules.ads.mapper.AiKuaishouStrategyTemplateMapper;
-import org.jeecg.modules.ads.service.IAiKuaishouStrategyTemplateService;
-import org.jeecg.modules.ctop.vo.QueryParam;
 import org.springframework.stereotype.Service;
 
 /**

+ 4 - 5
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ads/service/impl/AiStrategyServiceImpl.java

@@ -1,4 +1,4 @@
-package org.jeecg.modules.ads.service.impl;
+package cn.com.ctop.kuaishou.modules.ai.service.impl;
 
 import cn.com.ctop.common.module.entity.CtopOauthToken;
 import cn.com.ctop.common.module.entity.MaterialCutFrame;
@@ -6,6 +6,8 @@ import cn.com.ctop.common.module.entity.MaterialImageInfo;
 import cn.com.ctop.common.module.service.ICtopOauthTokenService;
 import cn.com.ctop.common.module.service.IMaterialCutFrameService;
 import cn.com.ctop.common.module.service.IMaterialImageInfoService;
+import cn.com.ctop.kuaishou.modules.ai.entity.*;
+import cn.com.ctop.kuaishou.modules.ai.service.*;
 import cn.com.ctop.kuaishou.modules.batch.entity.KuaiShouImageGet;
 import cn.com.ctop.kuaishou.modules.batch.entity.KuaiShouVideoGet;
 import cn.com.ctop.kuaishou.modules.batch.entity.KuaishouStrategy;
@@ -17,14 +19,11 @@ import cn.com.ctop.kuaishou.modules.batch.service.IKuaishouInterfaceService;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import org.jeecg.common.util.DateUtils;
-import org.jeecg.modules.ads.entity.*;
-import org.jeecg.modules.ads.service.*;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
-import java.math.BigDecimal;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -181,7 +180,7 @@ public class AiStrategyServiceImpl implements IAiStrategyService {
                                 log.info("未获取到视频封面=>videoSignature:{}",videoItem.getSignature());
                                 continue;
                             }
-                            createCreativeByImage(cutFrameList,orgFrameList,token,creativeParams,campaignId,unitId,strategy,videoItem,15,null);
+                            createCreativeByImage(cutFrameList,orgFrameList,token,creativeParams,campaignId,unitId,strategy,videoItem,3,null);
                         }
                     }
                 }

+ 3 - 10
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ads/service/impl/TestImpl.java

@@ -1,17 +1,10 @@
-package org.jeecg.modules.ads.service.impl;
+package cn.com.ctop.kuaishou.modules.ai.service.impl;
 
+import cn.com.ctop.kuaishou.modules.ai.mapper.AiKuaishouStrategyTemplateMapper;
+import cn.com.ctop.kuaishou.modules.ai.service.Test;
 import cn.com.ctop.kuaishou.modules.batch.mapper.KuaiShouReportDailyMaterialMapper;
-import cn.com.ctop.kuaishou.modules.report.entity.KuaiShouReportDailyMaterial;
-import cn.hutool.json.JSON;
-import com.alibaba.fastjson.JSONObject;
-import io.swagger.models.auth.In;
-//import jdk.nashorn.internal.parser.JSONParser;
-import org.jeecg.modules.ads.entity.AiKuaishouStrategyTemplate;
-import org.jeecg.modules.ads.mapper.AiKuaishouStrategyTemplateMapper;
-import org.jeecg.modules.ads.service.Test;
 import org.springframework.stereotype.Service;
 
-import java.util.ArrayList;
 import java.util.List;
 
 @Service

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

@@ -28,6 +28,8 @@ public interface IKuaiShouVideoGetService extends IService<KuaiShouVideoGet> {
 
     List<KuaiShouVideoGet> getNewVideoDescDate(Long accountId,Integer newVideoCnt);
 
+    List<KuaiShouVideoGet> getNewVideoBetweenTime(Long accountId,String startTime, String endTime);
+
 
 
 

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

@@ -8,6 +8,7 @@ import cn.com.ctop.kuaishou.modules.material.entity.KuaishouResultToken;
 import cn.com.ctop.kuaishou.modules.report.entity.*;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
+import com.google.gson.JsonArray;
 
 import java.text.ParseException;
 import java.util.Date;
@@ -150,6 +151,20 @@ public interface IKuaishouInterfaceService {
      */
     void getCreativeList(CtopOauthToken token, Date startDate, Date endDate);
 
+
+
+    /**
+     * 根据组id,获取创意列表
+     *
+     * @param token
+     * @param unitId
+     * @param startDate
+     * @param endDate
+     * @param timeFilterType
+     */
+    JSONArray getCreativeList(CtopOauthToken token, Long unitId, Date startDate, Date endDate,int timeFilterType);
+
+
     /**
      * 获取视频信息
      *
@@ -343,6 +358,19 @@ public interface IKuaishouInterfaceService {
      */
     void getCampaignList(CtopOauthToken token, Date startDate, Date endDate);
 
+
+
+    /**
+     * 获取计划列表,新增一个参数 按创建时间,还是更新时间进行筛选
+     *
+     * @param token
+     * @param startDate
+     * @param endDate
+     * @param timeFilterType
+     */
+    JSONArray getCampaignList(CtopOauthToken token, Date startDate, Date endDate, int timeFilterType);
+
+
     /**
      * 获取组列表
      *
@@ -353,6 +381,24 @@ public interface IKuaishouInterfaceService {
     void getGroupList(CtopOauthToken token, Date startDate, Date endDate);
 
 
+
+    /**
+     * 获取指定广告计划下的广告组列表
+     *
+     * @param token
+     * @param campaignId
+     * @param startDate
+     * @param endDate
+     * @param time_filter_type
+     */
+    JSONArray getGroupList(CtopOauthToken token, Long campaignId, Date startDate, Date endDate,int time_filter_type);
+
+
+
+
+
+
+
     /**
      * 获取快手图片列表
      *

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

@@ -148,4 +148,18 @@ public class KuaiShouVideoGetServiceImpl extends ServiceImpl<KuaiShouVideoGetMap
         return this.list(queryWrapper);
     }
 
+
+    @Override
+    public List<KuaiShouVideoGet>getNewVideoBetweenTime(Long accountId,String startTime, String endTime){
+        QueryWrapper<KuaiShouVideoGet>queryWrapper = new QueryWrapper<>();
+        if(null!=accountId&&accountId!=0){
+            queryWrapper.eq("account_id",accountId);
+        }
+        if(null != startTime && null != endTime){
+            queryWrapper.le("stat_date",endTime);
+            queryWrapper.gt("stat_date",startTime);
+        }
+        return this.list(queryWrapper);
+    }
+
 }

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

@@ -1122,6 +1122,40 @@ public class KuaishouInterfaceServiceImpl implements IKuaishouInterfaceService {
     }
 
 
+    public JSONArray getCampaignList(CtopOauthToken token, Date startDate, Date endDate, int timeFilterType) {
+        String url = PropertiesUtils.getConfig("kuaishou_api_url") + KuaishouInterfaceConstant.CAMPAIGN_LIST;
+        Map<String, String> headers = new HashMap<>();
+        headers.put("Access-Token", token.getAccessToken());
+        headers.put("Content-Type", " application/json");
+        JSONObject param = new JSONObject();
+        param.put("advertiser_id", token.getAccountId());
+        if (startDate != null && endDate != null) {
+            param.put("start_date", DateUtils.formatDate(startDate));
+            param.put("end_date", DateUtils.formatDate(endDate));
+        }
+        param.put("time_filter_type", timeFilterType);
+
+        String result = HttpUtils.kuaiShouhttpPostRequest(url, param.toJSONString(), headers);
+        JSONObject resultJson = JSONObject.parseObject(result);
+        if (Check.isNull(resultJson)) {
+            log.error("获取广告计划信息返回结果异常,advertiserId:{}", token.getAccountId());
+            return null;
+        }
+        Integer code = resultJson.getInteger("code");
+        if (null == code || code != 0) {
+            log.error("获取广告计划信息返回结果异常,advertiserId:{},异常信息:{}", token.getAccountId(), resultJson);
+            return null;
+        }
+        JSONObject dataJson = resultJson.getJSONObject("data");
+        JSONArray details = dataJson.getJSONArray("details");
+        if (Check.isNull(details)) {
+            return null;
+        }
+        return details;
+    }
+
+
+
     /**
      * 获取 单条 广告计划数据
      *
@@ -1187,6 +1221,43 @@ public class KuaishouInterfaceServiceImpl implements IKuaishouInterfaceService {
         kuaiShouCampaignService.replaceBatch(campaigns);
     }
 
+    public JSONArray getGroupList(CtopOauthToken token, Long campaignId, Date startDate,
+                                  Date endDate,int time_filter_type){
+        String url = PropertiesUtils.getConfig("kuaishou_api_url") + KuaishouInterfaceConstant.GROUP_LIST;
+        JSONObject param = new JSONObject();
+        param.put("advertiser_id", token.getAccountId());
+        if (startDate != null && endDate != null) {
+            param.put("start_date", DateUtils.formatDate(startDate));
+            param.put("end_date", DateUtils.formatDate(endDate));
+        }
+
+        param.put("campaign_id",campaignId);
+
+        Map<String, String> headers = new HashMap<>();
+        headers.put("Access-Token", token.getAccessToken());
+        headers.put("Content-Type", "application/json");
+
+        String result = HttpUtils.kuaiShouhttpPostRequest(url, param.toJSONString(), headers);
+        JSONObject resultJson = JSONObject.parseObject(result);
+        if (Check.isNull(resultJson)) {
+            log.error("获取广告组接口异常,advertiserId:{}", token.getAccountId());
+            return null;
+        }
+        Integer code = resultJson.getInteger("code");
+        if (null == code || code != 0) {
+            log.error("获取广告组返回结果异常,advertiserId:{},异常信息:{}", token.getAccountId(), resultJson);
+            return null;
+        }
+        JSONArray details = resultJson.getJSONObject("data").getJSONArray("details");
+        if (Check.isNull(details)) {
+            return null;
+        }
+
+        return details;
+    }
+
+
+
     @Override
     public void getGroupList(CtopOauthToken token, Date startDate, Date endDate) {
         getGroupListByPage(token, startDate, endDate, 1);
@@ -1347,6 +1418,46 @@ public class KuaishouInterfaceServiceImpl implements IKuaishouInterfaceService {
     }
 
 
+
+    public JSONArray getCreativeList(CtopOauthToken token, Long unitId, Date startDate, Date endDate,int timeFilterType){
+        Long advertiserId = token.getAccountId();
+        String accessToken = token.getAccessToken();
+
+        String url = PropertiesUtils.getConfig("kuaishou_api_url") + KuaishouInterfaceConstant.CREATIVE_LIST;
+        Map<String, String> headers = new HashMap<>();
+        headers.put("Content-Type", " application/json");
+        headers.put("Access-Token", accessToken);
+        JSONObject param = new JSONObject();
+        param.put("advertiser_id", advertiserId);
+        if (startDate != null && endDate != null) {
+            param.put("start_date", DateUtils.formatDate(startDate));
+            param.put("end_date", DateUtils.formatDate(endDate));
+        }
+
+        param.put("unit_id",unitId);
+        param.put("time_filter_type",timeFilterType);
+
+        String result = HttpUtils.kuaiShouhttpPostRequest(url, param.toJSONString(), headers);
+        JSONObject resultJson = JSONObject.parseObject(result);
+        if (Check.isNull(resultJson)) {
+            log.error("获取广告创意返回结果为空,advertiserId:{}", advertiserId);
+            return null;
+        }
+        Integer code = resultJson.getInteger("code");
+        String message = resultJson.getString("message");
+        if (null == code || code != 0) {
+            log.error("获取广告创意返回结果异常,advertiserId:{},message:{}", advertiserId, message);
+            return null;
+        }
+        JSONArray details = resultJson.getJSONObject("data").getJSONArray("details");
+        if (null == details || details.size() <= 0) {
+            return null;
+        }
+        return details;
+    }
+
+
+
     @Override
     public void getCreativeList(CtopOauthToken token, Date startDate, Date endDate) {
         getCreativeListByPage(token.getAccessToken(), token.getAccountId(), startDate, endDate, 1);