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

Merge remote-tracking branch 'origin/master'

yumeng 3 роки тому
батько
коміт
d16db31a80
66 змінених файлів з 4872 додано та 394 видалено
  1. 15 0
      jeecg-boot-module-system/pom.xml
  2. 91 0
      jeecg-boot-module-system/src/main/java/org/jeecg/config/Elasticsearch/ElasticsearchConfig.java
  3. 1 1
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/service/impl/MaterialReportOverViewServiceImpl.java
  4. 83 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/elasticsearch/controller/ESController.java
  5. 1 1
      jeecg-boot-module-system/src/main/resources/application-test.yml
  6. 300 13
      jeecg-boot-module-system/src/test/java/org/jeecg/SampleTest.java
  7. 15 0
      module-common/pom.xml
  8. 27 0
      module-common/src/main/java/cn/com/ctop/common/module/annotation/Document.java
  9. 16 0
      module-common/src/main/java/cn/com/ctop/common/module/annotation/EsId.java
  10. 26 0
      module-common/src/main/java/cn/com/ctop/common/module/annotation/FieId.java
  11. 24 0
      module-common/src/main/java/cn/com/ctop/common/module/entity/DataLabels.java
  12. 29 0
      module-common/src/main/java/cn/com/ctop/common/module/enums/AnalyzerType.java
  13. 40 0
      module-common/src/main/java/cn/com/ctop/common/module/enums/FieldType.java
  14. 21 21
      module-common/src/main/java/cn/com/ctop/common/module/service/impl/MaterialTagServiceImpl.java
  15. 599 0
      module-common/src/main/java/cn/com/ctop/common/module/utils/ElasticsearchUtil.java
  16. 23 0
      module-job-bytedance/src/main/java/cn/com/ctop/job/bytedance/handler/CwjsPolicyApprovedNoticeJob.java
  17. 37 0
      module-job-bytedance/src/main/java/cn/com/ctop/job/bytedance/handler/SynchronousAccountTransactionDetailsJob.java
  18. 1 1
      module-job-kuaishou/src/main/java/cn/com/ctop/job/kuaishou/handler/KuaiShouAccountCleanJob.java
  19. 10 0
      module-job-kuaishou/src/main/java/cn/com/ctop/job/kuaishou/handler/KuaishouDailyAudienceReportJob.java
  20. 21 1
      module-job-kuaishou/src/main/java/cn/com/ctop/job/kuaishou/handler/KuaishouOperationRecordJob.java
  21. 35 0
      module-job-kuaishou/src/main/java/cn/com/ctop/job/kuaishou/handler/NewMonitorJob.java
  22. 1 1
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/ai/mapper/AiKuaishouCreativeLevelOperationRecordMapper.java
  23. 4 1
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/ai/mapper/AiKuaishouUnitLevelOperationRecordMapper.java
  24. 10 1
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/ai/mapper/xml/AiKuaishouCreativeLevelOperationRecordMapper.xml
  25. 3 1
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/ai/mapper/xml/AiKuaishouUnitLevelOperationRecordMapper.xml
  26. 158 5
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/batch/service/impl/KuaishouInterfaceServiceImpl2.java
  27. 9 21
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/clean/controller/KuaiShouAccountCleanController.java
  28. 0 4
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/clean/entity/KuaiShouAccountCleanLogInfo.java
  29. 11 18
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/clean/mapper/KuaishouAccountCleanTemplateMapper.java
  30. 165 146
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/clean/mapper/xml/KuaishouAccountCleanTemplateMapper.xml
  31. 3 10
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/clean/service/KuaiShouAccountCleanService.java
  32. 68 135
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/clean/service/impl/KuaiShouAccountCleanServiceImpl.java
  33. 30 0
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/label/controller/LbelController.java
  34. 25 0
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/label/mapper/MaterialLabelMapper.java
  35. 25 0
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/label/mapper/xml/MaterialTagMapper.xml
  36. 14 0
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/label/service/MaterialTagService.java
  37. 80 0
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/label/service/impl/MaterialTagServiceImpl.java
  38. 4 0
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/report/entity/KuaishouAudienceReportDaily.java
  39. 16 0
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/report/entity/NewMonitorInfo.java
  40. 2 0
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/report/mapper/KuaishouAudienceReportDailyAgeMapper.java
  41. 2 0
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/report/mapper/KuaishouAudienceReportDailyBusinessMapper.java
  42. 2 0
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/report/mapper/KuaishouAudienceReportDailyCityMapper.java
  43. 2 0
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/report/mapper/KuaishouAudienceReportDailyClientMapper.java
  44. 2 0
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/report/mapper/KuaishouAudienceReportDailyGenderMapper.java
  45. 2 0
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/report/mapper/KuaishouAudienceReportDailyProvinceMapper.java
  46. 55 0
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/report/mapper/NewMonitorMapper.java
  47. 2 2
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/report/mapper/xml/EtlKuaishouAccountMaterialReportDailyMapper.xml
  48. 253 3
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/report/mapper/xml/KuaishouAudienceReportDailyAgeMapper.xml
  49. 250 0
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/report/mapper/xml/KuaishouAudienceReportDailyBusinessMapper.xml
  50. 251 0
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/report/mapper/xml/KuaishouAudienceReportDailyCityMapper.xml
  51. 250 0
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/report/mapper/xml/KuaishouAudienceReportDailyClientMapper.xml
  52. 250 0
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/report/mapper/xml/KuaishouAudienceReportDailyGenderMapper.xml
  53. 251 0
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/report/mapper/xml/KuaishouAudienceReportDailyProvinceMapper.xml
  54. 183 0
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/report/mapper/xml/NewMonitorMapper.xml
  55. 4 0
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/report/service/IKuaishouAudienceReportDailyService.java
  56. 25 0
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/report/service/NewMonitorService.java
  57. 202 8
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/report/service/impl/KuaishouAudienceReportDailyServiceImpl.java
  58. 289 0
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/report/service/impl/NewMonitorServiceImpl.java
  59. 30 0
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/agent/controller/AgentManagementController.java
  60. 73 0
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/agent/entity/TransactionDetails.java
  61. 15 0
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/agent/mapper/CtopAccountTransactionDetailsMapper.java
  62. 16 0
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/agent/mapper/CtopAgentAccountMapper.java
  63. 30 0
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/agent/mapper/xml/CtopAccountTransactionDetailsMapper.xml
  64. 28 0
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/agent/mapper/xml/CtopAgentAccountMapper.xml
  65. 22 0
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/agent/service/AgentManagementService.java
  66. 340 0
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/agent/service/impl/AgentManagementServiceImpl.java

+ 15 - 0
jeecg-boot-module-system/pom.xml

@@ -174,6 +174,21 @@
             <artifactId>spring-boot-starter-jimureport</artifactId>
             <version>1.1-beta</version>
         </dependency>
+        <dependency>
+            <groupId>org.elasticsearch.client</groupId>
+            <artifactId>elasticsearch-rest-high-level-client</artifactId>
+            <version>7.1.0</version>
+        </dependency>
+        <dependency>
+            <groupId>org.elasticsearch.client</groupId>
+            <artifactId>elasticsearch-rest-client</artifactId>
+            <version>7.1.0</version>
+        </dependency>
+        <dependency>
+            <groupId>org.elasticsearch</groupId>
+            <artifactId>elasticsearch</artifactId>
+            <version>7.1.0</version>
+        </dependency>
     </dependencies>
 
     <dependencyManagement>

+ 91 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/config/Elasticsearch/ElasticsearchConfig.java

@@ -0,0 +1,91 @@
+package org.jeecg.config.Elasticsearch;
+
+import org.apache.http.HttpHost;
+import org.apache.http.client.config.RequestConfig;
+import org.apache.http.impl.nio.client.HttpAsyncClientBuilder;
+import org.elasticsearch.client.RestClient;
+import org.elasticsearch.client.RestClientBuilder;
+import org.elasticsearch.client.RestHighLevelClient;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import java.util.ArrayList;
+
+/**
+ * @className: ElasticsearchConfig
+ * @description: elasticsearch 配置类
+ * @author: zzy
+ * @date: 2021-07-12
+ */
+@Configuration
+public class ElasticsearchConfig {
+    @Value("${elasticsearch.address}")
+    private String address;
+
+    /**
+     *  连接超时时间
+     */
+    @Value("${elasticsearch.connect-timeout}")
+    private int connectTimeOut = 1000;
+
+    /**
+     * 连接超时时间
+     */
+    @Value("${elasticsearch.socket-timeout}")
+    private int socketTimeOut = 30000;
+
+    /**
+     * 获取连接的超时时间
+     */
+    @Value("${elasticsearch.connection-request-timeout}")
+    private int connectionRequestTimeOut = 500;
+
+    /**
+     * 最大连接数
+     */
+    @Value("${elasticsearch.max-connect-num}")
+    private int maxConnectNum = 100;
+
+    /**
+     * 最大路由连接数
+     */
+    @Value("${elasticsearch.max-connect-per-route}")
+    private int maxConnectPerRoute = 100;
+
+
+    @Bean
+    RestHighLevelClient restHighLevelClient() {
+        ArrayList<HttpHost> hostList = new ArrayList<>();
+        String[] addrss = address.split(",");
+        for(String addr : addrss){
+            String[] arr = addr.split(":");
+            hostList.add(new HttpHost(arr[0], Integer.parseInt(arr[1]), "http"));
+        }
+
+        RestClientBuilder builder = RestClient.builder(hostList.toArray(new HttpHost[0]));
+        // 异步httpclient连接延时配置
+        builder.setRequestConfigCallback(new RestClientBuilder.RequestConfigCallback() {
+            @Override
+            public RequestConfig.Builder customizeRequestConfig(RequestConfig.Builder requestConfigBuilder) {
+                requestConfigBuilder.setConnectTimeout(connectTimeOut);
+                requestConfigBuilder.setSocketTimeout(socketTimeOut);
+                requestConfigBuilder.setConnectionRequestTimeout(connectionRequestTimeOut);
+                return requestConfigBuilder;
+            }
+        });
+        // 异步httpclient连接数配置
+        builder.setHttpClientConfigCallback(new RestClientBuilder.HttpClientConfigCallback() {
+            @Override
+            public HttpAsyncClientBuilder customizeHttpClient(HttpAsyncClientBuilder httpClientBuilder) {
+                httpClientBuilder.setMaxConnTotal(maxConnectNum);
+                httpClientBuilder.setMaxConnPerRoute(maxConnectPerRoute);
+                return httpClientBuilder;
+            }
+        });
+
+        RestHighLevelClient client = new RestHighLevelClient(builder);
+        return client;
+    }
+
+}

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

@@ -498,7 +498,7 @@ public class MaterialReportOverViewServiceImpl implements IMaterialReportOverVie
         if (roleCode.equals("admin")) {
             return null;
         }
-        return queryProjectIdBy(recursiveQuerySubordinate(currentUser), mediaId);
+        return Check.isNull(queryProjectIdBy(recursiveQuerySubordinate(currentUser), mediaId)) ? null : queryProjectIdBy(recursiveQuerySubordinate(currentUser), mediaId);
     }
     private List<String> getfileIds(Map<String, Map<String, Object>> kuaishouVideoReportMap, JSONArray columns) {
         List<String> titles = new ArrayList<>();

+ 83 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/elasticsearch/controller/ESController.java

@@ -0,0 +1,83 @@
+package org.jeecg.modules.elasticsearch.controller;
+
+import cn.com.ctop.common.module.entity.DataLabels;
+import cn.com.ctop.common.module.utils.ElasticsearchUtil;
+import com.github.pagehelper.PageInfo;
+import lombok.extern.slf4j.Slf4j;
+import org.elasticsearch.action.index.IndexResponse;
+import org.elasticsearch.index.query.BoolQueryBuilder;
+import org.elasticsearch.index.query.QueryBuilders;
+import org.elasticsearch.index.query.WildcardQueryBuilder;
+import org.elasticsearch.search.builder.SearchSourceBuilder;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.UUID;
+
+/**
+ * es请求
+ *
+ * @author zzy
+ * @create: 2021-07-12
+ */
+@Slf4j
+@RestController
+@RequestMapping("/es")
+public class ESController {
+
+    @Autowired
+    ElasticsearchUtil elasticsearchUtil;
+
+    @RequestMapping("createIndex")
+    public void createIndex() {
+        DataLabels dataLabels = new DataLabels();
+        dataLabels
+                .setId("3");
+        dataLabels
+                .setContent("哦哦哦,测试es啦,I LOVE CHINA");
+        dataLabels
+                .setSize(1024);
+        try {
+            boolean indexIfNotExist = elasticsearchUtil.createIndexIfNotExist(DataLabels.class);
+            log.info("创建成功:{}", indexIfNotExist);
+        } catch (Exception e) {
+            log.info("创建错误:{}", e.toString());
+        }
+    }
+
+    @RequestMapping("addData")
+    public void addData() {
+        DataLabels dataLabels = new DataLabels();
+        dataLabels
+                .setId(UUID.randomUUID().toString());
+        dataLabels
+                .setContent("哦哦哦,测试es啦,I LOVE CHINA");
+        dataLabels
+                .setSize(1024);
+        try {
+            IndexResponse indexResponse = elasticsearchUtil.index(dataLabels);
+            log.info("添加数据成功:{}", indexResponse.toString());
+        } catch (Exception e) {
+            log.info("添加数据错误:{}", e.toString());
+            e.printStackTrace();
+        }
+    }
+
+    @RequestMapping("searchData")
+    public void searchData() {
+        SearchSourceBuilder SearchSourceBuilder = new SearchSourceBuilder();
+        WildcardQueryBuilder wildcardQueryBuilder = QueryBuilders.wildcardQuery("content", "*LOVE*");
+
+        BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
+        boolQueryBuilder.must(wildcardQueryBuilder);
+        SearchSourceBuilder.query(boolQueryBuilder);
+        try {
+            PageInfo<DataLabels> indexResponse = elasticsearchUtil.search(SearchSourceBuilder, 1, 10, DataLabels.class);
+            log.info("查询数据成功:{}", indexResponse.toString());
+        } catch (Exception e) {
+            log.info("查询数据错误:{}", e.toString());
+            e.printStackTrace();
+        }
+    }
+}

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

@@ -118,7 +118,7 @@ spring:
         max-wait: -1ms  #最大建立连接等待时间。如果超过此时间将接到异常。设为-1表示无限制。
         min-idle: 0     #最小等待连接中的数量,设 0 为没有限制
       shutdown-timeout: 100ms
-    password: hcst@2020
+    password: #hcst@2020
     port: 6379
 #mybatis plus 设置
 mybatis-plus:

+ 300 - 13
jeecg-boot-module-system/src/test/java/org/jeecg/SampleTest.java

@@ -4,19 +4,30 @@ import cn.com.ctop.common.module.entity.BindAccountLogin;
 import cn.com.ctop.common.module.entity.CtopOauthToken;
 import cn.com.ctop.common.module.service.IBindAccountLoginService;
 import cn.com.ctop.common.module.service.ICtopOauthTokenService;
-import cn.com.ctop.common.module.service.ISendMessageService;
+import cn.com.ctop.common.module.utils.Check;
 import cn.com.ctop.common.module.utils.CtopAdConstant;
+import cn.com.ctop.kuaishou.modules.ai.entity.AiKuaishouUnitLevelOperationRecord;
+import cn.com.ctop.kuaishou.modules.ai.mapper.AiKuaishouUnitLevelOperationRecordMapper;
+import cn.com.ctop.kuaishou.modules.batch.entity.KuaishouOperationRecord;
+import cn.com.ctop.kuaishou.modules.batch.mapper.KuaishouOperationRecordMapper;
+import cn.com.ctop.kuaishou.modules.batch.service.IKuaiShouReportDailyMaterialService;
+import cn.com.ctop.kuaishou.modules.batch.service.IKuaishouInterfaceService2;
+import cn.com.ctop.kuaishou.modules.batch.service.impl.KuaishouInterfaceServiceImpl2;
 import cn.com.ctop.kuaishou.modules.batch.service.IKuaishouInterfaceService;
 import cn.com.ctop.kuaishou.modules.dimension.service.IKuaiShouDimensionStrategyService;
 import cn.com.ctop.kuaishou.modules.dimension.service.IKuaiShouDimensionVariableService;
 import cn.com.ctop.kuaishou.modules.graphql.service.IKuaishouWebInterfaceService;
+import cn.com.ctop.kuaishou.modules.material.service.IEtlKuaishouVideoInfoService;
 import cn.com.ctop.kuaishou.modules.report.mapper.EtlKuaishouAccountMaterialReportDailyMapper;
+import cn.com.ctop.kuaishou.modules.report.service.IKuaishouAudienceReportDailyService;
 import cn.com.ctop.kuaishou.modules.report.service.IKuaishouReportDailyImageService;
 import cn.com.ctop.oa.modules.service.IWechatNoListService;
 import cn.com.ctop.toutiao.modules.link.service.IETLReportBytedanceVideoService;
 import cn.com.ctop.toutiao.modules.material.service.IByteDanceAdvertiserDataService;
 import cn.com.ctop.toutiao.modules.report.entity.BytedanceCheckReportTaskInfo;
 import cn.com.ctop.toutiao.modules.report.service.*;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
 import com.xxl.job.core.context.XxlJobHelper;
 import lombok.extern.slf4j.Slf4j;
 import org.jeecg.common.util.DateUtils;
@@ -29,9 +40,7 @@ import org.springframework.test.context.junit4.SpringRunner;
 
 import javax.annotation.Resource;
 import java.text.ParseException;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.List;
+import java.util.*;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
@@ -87,13 +96,19 @@ public class SampleTest {
     private IKuaiShouDimensionStrategyService dimensionStrategyService;
     @Autowired
     private IKuaiShouDimensionVariableService dimensionVariableService;
-    @Autowired
-    private ISendMessageService sendMessageService;
 
 
     @Test
     public void loadKuaishouCookie() throws ParseException {
-        sendMessageService.sendMessage("f6a6843879c949618e4a859140c8a127", "测试发送消息");
+      //  JSONArray dimensionVariableList = kuaiShouDimensionVariableService.getDimensionVariableList(1L);
+        JSONArray array = new JSONArray();
+        array.add(1);
+        array.add(2);
+        array.add(3);
+        // dimensionStrategyService.create(1L, array);
+        JSONArray dimensionVariableList = dimensionVariableService.getDimensionVariableList(8L); // 获取变量排列组合
+
+        System.err.println(dimensionVariableList);
     }
 
 
@@ -236,18 +251,290 @@ public class SampleTest {
     }
 
     @Test
-    public void testfreshBytedanceUrl() {
+    public void loadBkData(){
+        Date startDate = DateUtils.addDay(new Date(),-60);
+        for(int i=0;i<=60;i++){
+            Date getDate = DateUtils.addDay(startDate,i);
+            bytedanceVideoEtlInfoService.etlBytedanceVideoInfo(getDate);
+        }
+    }
+
+    @Autowired
+    private IEtlKuaishouVideoInfoService etlKuaishouVideoInfo;
+    @Test
+    public void loadkuaishouVideoData(){
+        String startDate = "2021-05-07";
+        for(int i=0;i<=60;i++){
+            String getDate = DateUtils.formatDate(DateUtils.addDay(startDate,i));
+            etlKuaishouVideoInfo.etlKuaishouVideoInfo(getDate);
+        }
+    }
+
+    @Autowired
+    private IKuaiShouReportDailyMaterialService kuaiShouReportDailyMaterialService;
+    @Test
+    public void loadKuaishouMatData() throws InterruptedException {
+        String startDate = "2021-06-18";
+        String endDate = "2021-06-24";
+        //1:查询当日数据
+        List<CtopOauthToken> tokens = tokenService.selectKuaiShouToken();
+        countDownLatch = new CountDownLatch(tokens.size());
+        tokens.forEach(token -> executorService.submit(() -> {
+            try {
+                kuaiShouReportDailyMaterialService.getMaterialReportByAccountIdAndStatDate(token.getAccountId(), token.getAccessToken(), startDate, endDate, "DAILY", 1);
+            }catch (Exception e){
+            }finally {
+                countDownLatch.countDown();
+            }
+        }));
+        countDownLatch.await();
+        System.out.println("数据获取完成");
+    }
+    @Test
+    public void loadKuaiShouMatHourlyData() throws InterruptedException{
+//        kuaiShouReportDailyMaterialService.getMaterialReportByAccountIdAndStatDate(7411077l, tokenService.getOauthTokenByAccountId("7411077").getAccessToken(), "2021-07-02", "2021-07-02", "HOURLY", 1);
+
+        String startDate = "2021-07-19";
+        String endDate = "2021-07-19";
+        System.out.println(DateUtils.now());
+        List<CtopOauthToken> tokens = tokenService.selectKuaiShouToken();
+        System.out.println(tokens.size());
+        countDownLatch = new CountDownLatch(tokens.size());
+        tokens.forEach(token -> executorService.submit(() -> {
+            try {
+                kuaiShouReportDailyMaterialService.getMaterialReportByAccountIdAndStatDate(token.getAccountId(), token.getAccessToken(), startDate, endDate, "HOURLY", 1);
+            }catch (Exception e){
+            }finally {
+                countDownLatch.countDown();
+            }
+        }));
+        countDownLatch.await();
+        System.out.println("数据获取完成");
+        System.out.println(DateUtils.now());
+    }
+
+    @Autowired
+    IKuaishouInterfaceService2 kuaishouInterfaceService2;
+    @Resource
+    private KuaishouOperationRecordMapper kuaishouOperationRecordMapper;
+
+
+    @Test
+    public void dealOperationRecordData() throws InterruptedException {
+        Date beginDate = DateUtils.parseDate("2020-04-28", "yyyy-MM-dd");   //chuangyi
+        Date endDate = DateUtils.parseDate("2021-07-19", "yyyy-MM-dd");
+//        Date beginDate = DateUtils.parseDate("2020-04-21", "yyyy-MM-dd");
+//        Date endDate = DateUtils.parseDate("2021-07-17", "yyyy-MM-dd");
+
+        int recordsCount = 0;
+        int newRecordCount = 0;
+
+        while (beginDate.before(endDate)){
+            System.out.println("开始拆分数据,当前时间为:" + beginDate);
+            List<KuaishouOperationRecord> records = kuaishouOperationRecordMapper.selectCreativeRecordByStatDate(DateUtils.formatDate(beginDate, "yyyy-MM-dd"));    //开始拆分数据,当前时间为:Tue Apr 28 00:00:00 CST 2020
+//            List<KuaishouOperationRecord> records = kuaishouOperationRecordMapper.selectAccountRecordByStatDate(DateUtils.formatDate(beginDate, "yyyy-MM-dd"));
+//            List<KuaishouOperationRecord> records = kuaishouOperationRecordMapper.selectAppRecordByStatDate(DateUtils.formatDate(beginDate, "yyyy-MM-dd"));
+//            List<KuaishouOperationRecord> records = kuaishouOperationRecordMapper.selectCampaignRecordByStatDate(DateUtils.formatDate(beginDate, "yyyy-MM-dd"));  //已执行完毕
+//            List<KuaishouOperationRecord> records = kuaishouOperationRecordMapper.selectPackageRecordByStatDate(DateUtils.formatDate(beginDate, "yyyy-MM-dd"));
+//            List<KuaishouOperationRecord> records = kuaishouOperationRecordMapper.selectUnitRecordByStatDate(DateUtils.formatDate(beginDate, "yyyy-MM-dd"));    //已执行完毕
+//            List<KuaishouOperationRecord> records = kuaishouOperationRecordMapper.selectVideoRecordByStatDate(DateUtils.formatDate(beginDate, "yyyy-MM-dd"));
+            if (!Check
+                    .isNull(records)) {
+                recordsCount += records.size();
+                countDownLatch = new CountDownLatch(records.size());
+
+                List<KuaishouOperationRecord> newRecords = new ArrayList<>();
+
+                records.forEach(record -> executorService.submit(() -> {
+                    try {
+                        String log = record.getLog();
+                        JSONArray jsonArray = JSONArray.parseArray(log);
+                        for (int i = 0; i < jsonArray.size(); i++) {
+                            JSONObject object = jsonArray.getJSONObject(i);
+                            String originalData = object.getString("original_data");
+                            String updateData = object.getString("update_data");
+                            String fieldName = object.getString("field_name");
+                            KuaishouOperationRecord newRecord = new KuaishouOperationRecord(record);
+                            newRecord.setOriginalData(originalData);
+                            newRecord.setUpdateData(updateData);
+                            newRecord.setFieldName(fieldName);
+
+                            if ("".equals(newRecord.getOriginalData()) && "".equals(newRecord.getUpdateData())) {
+                                continue;
+                            }
+                            newRecords.add(newRecord);
+                        }
+                    } catch (Exception e) {
+                    } finally {
+
+                        countDownLatch.countDown();
+                    }
+                }));
+                countDownLatch.await();
+                newRecordCount += newRecords.size();
+                this.saveOperationRecordListToDb(newRecords);
+                beginDate = DateUtils.addDay(beginDate, 1);
+            } else {
+        System.out.print("     -> 今日的数据为空!!!");
+        beginDate = DateUtils.addDay(beginDate, 1);
+            }
+        }
+        System.out.println("---------------------------------------------------------------");
+        System.out.println("------------获取数据结束"+recordsCount+"条原始数据变成了"+newRecordCount+"条数据------------");
+        System.out.println("---------------------------------------------------------------");
+    }
+
+    private void saveOperationRecordListToDb(List<KuaishouOperationRecord> records) {
+        if (Check.isNull(records)) {
+            return;
+        }
+
+        List<KuaishouOperationRecord> batchList = new ArrayList<>();
+        records.removeAll(Collections.singleton(null));
+        Integer operationTarget = records.get(0).getOperationTarget();
+
+
+        for (KuaishouOperationRecord sumPosition : records) {
+            batchList.add(sumPosition);
+
+            if (batchList.size() >= 1000) {
+                if (operationTarget == 1) {
+                    kuaishouOperationRecordMapper.insertOperationRecordInfoAccountNew(batchList);
+                } else if (operationTarget == 2) {
+                    kuaishouOperationRecordMapper.insertOperationRecordInfoCampaignNew(batchList);
+                } else if (operationTarget == 3) {
+                    kuaishouOperationRecordMapper.insertOperationRecordInfoUnitNew(batchList);
+                } else if (operationTarget == 4) {
+                    kuaishouOperationRecordMapper.insertOperationRecordInfoCreativeNew(batchList);
+                } else if (operationTarget == 5) {
+                    kuaishouOperationRecordMapper.insertOperationRecordInfoVideoNew(batchList);
+                } else if (operationTarget == 6) {
+                    kuaishouOperationRecordMapper.insertOperationRecordInfoAppNew(batchList);
+                } else if (operationTarget == 7) {
+                    kuaishouOperationRecordMapper.insertOperationRecordInfoPackageNew(batchList);
+                } else {
+                    System.out.println("未知的目标类型!");
+                }
+                batchList.clear();
+            }
+        }
+        if (!batchList.isEmpty()) {
+
+            if (operationTarget == 1) {
+                kuaishouOperationRecordMapper.insertOperationRecordInfoAccountNew(batchList);
+            } else if (operationTarget == 2) {
+                kuaishouOperationRecordMapper.insertOperationRecordInfoCampaignNew(batchList);
+            } else if (operationTarget == 3) {
+                kuaishouOperationRecordMapper.insertOperationRecordInfoUnitNew(batchList);
+            } else if (operationTarget == 4) {
+                kuaishouOperationRecordMapper.insertOperationRecordInfoCreativeNew(batchList);
+            } else if (operationTarget == 5) {
+                kuaishouOperationRecordMapper.insertOperationRecordInfoVideoNew(batchList);
+            } else if (operationTarget == 6) {
+                kuaishouOperationRecordMapper.insertOperationRecordInfoAppNew(batchList);
+            } else if (operationTarget == 7) {
+                kuaishouOperationRecordMapper.insertOperationRecordInfoPackageNew(batchList);
+            } else {
+                System.out.println("未知的目标类型!");
+            }
+            batchList.clear();
+        }
+    }
+
+    public void testfreshBytedanceUrl(){
         etlReportBytedanceVideoService.etlBytedanceVideoClipIdJob();
         etlReportBytedanceVideoService.etlBytedanceVideoPlanInfoJob();
         etlReportBytedanceVideoService.etlBytedanceVideoShotInfoJob();
     }
+    @Autowired
+    IKuaishouInterfaceService2 kuaishouInterfaceServiceImpl2;
 
     @Test
-    public void loadEffecfData() {
-        String startDate = "2021-05-01";
-        for (int i = 0; i <= 70; i++) {
-            String getDate = DateUtils.addDay(startDate, i);
-            bytedanceVideoEtlInfoService.etlBytedanceVideoInfo(DateUtils.parseDate(getDate, "yyyy-MM-dd"));
+    public void getUnitData() throws InterruptedException {
+        List<Long> accountIdList = new ArrayList<>();
+        accountIdList.add(9556188l);
+        accountIdList.add(9677284l);
+        accountIdList.add(9677304l);
+        accountIdList.add(10072135l);
+        accountIdList.add(9901975l);
+        accountIdList.add(9677344l);
+        accountIdList.add(9901956l);
+        accountIdList.add(9556431l);
+        accountIdList.add(9767055l);
+        accountIdList.add(10248827l);
+
+        Date beginDate = DateUtils.parseDate("2021-06-04", "yyyy-MM-dd");
+        Date endDate = DateUtils.parseDate("2021-07-22", "yyyy-MM-dd");
+
+        List<CtopOauthToken> tokens = tokenService.selectKuaiShouToken();
+        while (beginDate.before(endDate)){
+            Date mulDate = beginDate;
+            countDownLatch = new CountDownLatch(tokens.size());
+            tokens.forEach(token -> executorService.submit(() -> {
+                try{
+                    if(!accountIdList.contains(token.getAccountId())){
+                        kuaishouInterfaceServiceImpl2.getOperationRecord( token.getAccountId(),
+                                token.getAccessToken(),
+                                3,      //先3组   后2计划
+                                DateUtils.formatDate(mulDate,"yyyy-MM-dd"),
+                                DateUtils.formatDate(mulDate,"yyyy-MM-dd"));
+                        System.out.println("获取完毕 -> accountId:" + token.getAccountId() +",日期:" + DateUtils.formatDate(mulDate,"yyyy-MM-dd"));
+                    }
+                }catch (Exception e){
+                }finally {
+                    countDownLatch.countDown();
+                }
+            }));
+            beginDate = DateUtils.addDay(beginDate, 1);
+            countDownLatch.await();
+        }
+
+        System.out.println("走完了~");
+    }
+
+
+    @Autowired
+    IKuaishouAudienceReportDailyService kuaishouAudienceReportDailyService;
+    @Resource
+    AiKuaishouUnitLevelOperationRecordMapper kuaishouUnitLevelOperationRecordMapper;
+    @Test
+    public void getAudienceReport() throws InterruptedException {
+        int page = 1;
+        int pageSize = 2000;
+        Date beginDate = DateUtils.parseDate("2021-05-01", "yyyy-MM-dd");
+        Date endDate = DateUtils.parseDate("2021-06-01", "yyyy-MM-dd");
+
+        while (beginDate.before(endDate)){
+            Date mulDate = beginDate;
+            List<AiKuaishouUnitLevelOperationRecord> planIdsAndUnitIds = kuaishouUnitLevelOperationRecordMapper.selectAllByAccountId(mulDate, DateUtils.addDay(mulDate,1));
+            countDownLatch = new CountDownLatch(planIdsAndUnitIds.size());
+            planIdsAndUnitIds.forEach(planIdAndUnitId -> executorService.submit(() -> {
+                try{
+                    CtopOauthToken token = tokenService.getTokenByAccountId(planIdAndUnitId.getAccountId());
+                    if(!Check.isNull(token)){
+                        Date startDate = mulDate;
+                        Date enDate = DateUtils.addDay(startDate, 30);
+                        // province: 省级地域分布, city: 地级地域分布,gender: 性别分布,ageSegment: 年龄分布clientId: 系统分布 businessInterestTags: 商业兴趣分布
+                        while (startDate.before(enDate)){
+                            kuaishouAudienceReportDailyService.crowdAnalysisReport2(token, DateUtils.formatDate(startDate,"yyyy-MM-dd"), "ageSegment", planIdAndUnitId.getCampaignId(), planIdAndUnitId.getUnitId(), page, pageSize);
+                            System.out.println("获取完毕 -> unit:" + planIdAndUnitId.getUnitId() +",日期:" + DateUtils.formatDate(startDate,"yyyy-MM-dd"));
+                            startDate = DateUtils.addDay(startDate, 1);
+                        }
+
+                    }else {
+                        System.out.println("token异常 -》 accountId:"+planIdAndUnitId.getAccountId());
+                    }
+                }catch (Exception e){
+                }finally {
+                    countDownLatch.countDown();
+                }
+            }));
+            beginDate = DateUtils.addDay(beginDate, 1);
+            countDownLatch.await();
         }
+
+        System.out.println("走完了~");
+
     }
+
 }

+ 15 - 0
module-common/pom.xml

@@ -102,6 +102,21 @@
             <version>1.16</version>
             <scope>compile</scope>
         </dependency>
+        <dependency>
+            <groupId>org.elasticsearch.client</groupId>
+            <artifactId>elasticsearch-rest-high-level-client</artifactId>
+            <version>7.6.1</version>
+        </dependency>
+        <dependency>
+            <groupId>org.elasticsearch.client</groupId>
+            <artifactId>elasticsearch-rest-client</artifactId>
+            <version>7.6.1</version>
+        </dependency>
+        <dependency>
+            <groupId>org.elasticsearch</groupId>
+            <artifactId>elasticsearch</artifactId>
+            <version>7.6.1</version>
+        </dependency>
 
     </dependencies>
 

+ 27 - 0
module-common/src/main/java/cn/com/ctop/common/module/annotation/Document.java

@@ -0,0 +1,27 @@
+package cn.com.ctop.common.module.annotation;
+
+import java.lang.annotation.*;
+
+/**
+ * Es 文档注解,用于做索引实体映射
+ * 作用在类上
+ * @author zzy
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.TYPE)
+@Documented
+@Inherited
+public @interface  Document {
+
+    /**
+     * index : 索引名称
+     * @return
+     */
+    String index();
+
+    /**
+     * 类型名称
+     * @return
+     */
+    String type();
+}

+ 16 - 0
module-common/src/main/java/cn/com/ctop/common/module/annotation/EsId.java

@@ -0,0 +1,16 @@
+package cn.com.ctop.common.module.annotation;
+
+import java.lang.annotation.*;
+
+/**
+ * 用于标识使用 该字段作为ES数据中的id
+ * @author zzy
+ * @create: 2021-07-12
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.FIELD)
+@Documented
+@Inherited
+public @interface EsId {
+
+}

+ 26 - 0
module-common/src/main/java/cn/com/ctop/common/module/annotation/FieId.java

@@ -0,0 +1,26 @@
+package cn.com.ctop.common.module.annotation;
+
+import cn.com.ctop.common.module.enums.AnalyzerType;
+import cn.com.ctop.common.module.enums.FieldType;
+
+import java.lang.annotation.*;
+
+/**
+ * 作用在字段上,用于定义类型,映射关系
+ * @author zzy
+ * @create: 2021-07-12
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.FIELD)
+@Documented
+@Inherited
+public @interface FieId {
+    FieldType type() default FieldType.TEXT;
+
+    /**
+     * 指定分词器
+     * @return
+     */
+    AnalyzerType analyzer() default AnalyzerType.STANDARD;
+
+}

+ 24 - 0
module-common/src/main/java/cn/com/ctop/common/module/entity/DataLabels.java

@@ -0,0 +1,24 @@
+package cn.com.ctop.common.module.entity;
+
+import cn.com.ctop.common.module.annotation.Document;
+import cn.com.ctop.common.module.annotation.EsId;
+import cn.com.ctop.common.module.annotation.FieId;
+
+import cn.com.ctop.common.module.enums.AnalyzerType;
+import cn.com.ctop.common.module.enums.FieldType;
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+@Document(index = "data_labels", type = "lable")
+public class DataLabels implements Serializable {
+    private static final long serialVersionUID = 1L;
+    @EsId
+    @FieId(type = FieldType.KEYWORD)
+    private String id;
+    @FieId(type = FieldType.KEYWORD,analyzer = AnalyzerType.IK_SMART)
+    private String content;
+    @FieId(type = FieldType.KEYWORD)
+    private Integer size;
+}

+ 29 - 0
module-common/src/main/java/cn/com/ctop/common/module/enums/AnalyzerType.java

@@ -0,0 +1,29 @@
+package cn.com.ctop.common.module.enums;
+
+import lombok.Getter;
+
+@Getter
+public enum AnalyzerType {
+    NO("不使用分词"),
+    /**
+     * 标准分词,默认分词器
+     */
+    STANDARD("standard"),
+
+    /**
+     * ik_smart:会做最粗粒度的拆分;已被分出的词语将不会再次被其它词语占有
+     */
+    IK_SMART("ik_smart"),
+
+    /**
+     * ik_max_word :会将文本做最细粒度的拆分;尽可能多的拆分出词语
+     */
+    IK_MAX_WORD("ik_max_word");
+
+    private String type;
+
+    AnalyzerType(String type) {
+        this.type = type;
+    }
+
+}

+ 40 - 0
module-common/src/main/java/cn/com/ctop/common/module/enums/FieldType.java

@@ -0,0 +1,40 @@
+package cn.com.ctop.common.module.enums;
+
+import lombok.Getter;
+
+@Getter
+public enum FieldType {
+    /**
+     * text
+     */
+    TEXT("text"),
+
+    KEYWORD("keyword"),
+
+    INTEGER("integer"),
+
+    DOUBLE("double"),
+
+    DATE("date"),
+
+    /**
+     * 单条数据
+     */
+    OBJECT("object"),
+
+    /**
+     * 嵌套数组
+     */
+    NESTED("nested"),
+
+
+    ;
+
+
+    FieldType(String type) {
+        this.type = type;
+    }
+
+    private String type;
+
+}

+ 21 - 21
module-common/src/main/java/cn/com/ctop/common/module/service/impl/MaterialTagServiceImpl.java

@@ -1,21 +1,21 @@
-package cn.com.ctop.common.module.service.impl;
-
-import cn.com.ctop.common.module.entity.MaterialTag;
-import cn.com.ctop.common.module.mapper.MaterialTagMapper;
-import cn.com.ctop.common.module.service.IMaterialTagService;
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import org.springframework.context.annotation.Primary;
-import org.springframework.stereotype.Service;
-
-/**
- * 素材归属标
- *
- * @author jeecg-boot
- * @version V1.0
- * @date 2019-11-23
- */
-@Service
-@Primary
-public class MaterialTagServiceImpl extends ServiceImpl<MaterialTagMapper, MaterialTag> implements IMaterialTagService {
-
-}
+//package cn.com.ctop.common.module.service.impl;
+//
+//import cn.com.ctop.common.module.entity.MaterialTag;
+//import cn.com.ctop.common.module.mapper.MaterialTagMapper;
+//import cn.com.ctop.common.module.service.IMaterialTagService;
+//import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+//import org.springframework.context.annotation.Primary;
+//import org.springframework.stereotype.Service;
+//
+///**
+// * 素材归属标
+// *
+// * @author jeecg-boot
+// * @version V1.0
+// * @date 2019-11-23
+// */
+//@Service
+//@Primary
+//public class MaterialTagServiceImpl extends ServiceImpl<MaterialTagMapper, MaterialTag> implements IMaterialTagService {
+//
+//}

+ 599 - 0
module-common/src/main/java/cn/com/ctop/common/module/utils/ElasticsearchUtil.java

@@ -0,0 +1,599 @@
+package cn.com.ctop.common.module.utils;
+
+
+import cn.com.ctop.common.module.annotation.Document;
+import cn.com.ctop.common.module.annotation.EsId;
+import cn.com.ctop.common.module.annotation.FieId;
+import cn.com.ctop.common.module.enums.FieldType;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.github.pagehelper.PageInfo;
+import lombok.extern.slf4j.Slf4j;
+import org.elasticsearch.action.DocWriteResponse;
+import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest;
+import org.elasticsearch.action.bulk.BulkItemResponse;
+import org.elasticsearch.action.bulk.BulkRequest;
+import org.elasticsearch.action.bulk.BulkResponse;
+import org.elasticsearch.action.delete.DeleteRequest;
+import org.elasticsearch.action.delete.DeleteResponse;
+import org.elasticsearch.action.get.GetRequest;
+import org.elasticsearch.action.get.GetResponse;
+import org.elasticsearch.action.index.IndexRequest;
+import org.elasticsearch.action.index.IndexResponse;
+import org.elasticsearch.action.search.SearchRequest;
+import org.elasticsearch.action.search.SearchResponse;
+import org.elasticsearch.action.support.IndicesOptions;
+import org.elasticsearch.action.support.master.AcknowledgedResponse;
+import org.elasticsearch.action.support.replication.ReplicationResponse;
+import org.elasticsearch.action.update.UpdateRequest;
+import org.elasticsearch.action.update.UpdateResponse;
+import org.elasticsearch.client.RequestOptions;
+import org.elasticsearch.client.RestHighLevelClient;
+import org.elasticsearch.client.indices.CreateIndexRequest;
+import org.elasticsearch.client.indices.CreateIndexResponse;
+import org.elasticsearch.client.indices.GetIndexRequest;
+import org.elasticsearch.client.indices.PutMappingRequest;
+import org.elasticsearch.common.settings.Settings;
+import org.elasticsearch.common.unit.TimeValue;
+import org.elasticsearch.common.xcontent.XContentBuilder;
+import org.elasticsearch.common.xcontent.XContentFactory;
+import org.elasticsearch.common.xcontent.XContentType;
+import org.elasticsearch.search.SearchHit;
+import org.elasticsearch.search.SearchHits;
+import org.elasticsearch.search.builder.SearchSourceBuilder;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+import java.io.IOException;
+import java.lang.reflect.Field;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @className: EsUtil
+ * @description: es 操作工具类;
+ * 这里均采用同步调用的方式
+ * @author: zzy
+ * @create: 2021-07-12
+ */
+@Component
+@Slf4j
+public class ElasticsearchUtil {
+
+    @Resource
+    private RestHighLevelClient restHighLevelClient;
+
+    /**
+     * 创建索引(默认分片数为5和副本数为1)
+     *
+     * @param clazz 根据实体自动映射es索引
+     * @throws IOException
+     */
+    public boolean createIndex(Class clazz) throws Exception {
+        Document declaredAnnotation = (Document) clazz.getDeclaredAnnotation(Document.class);
+        if (declaredAnnotation == null) {
+            throw new Exception(String.format("class name: %s can not find Annotation [Document], please check", clazz.getName()));
+        }
+        String indexName = declaredAnnotation.index();
+        CreateIndexRequest request = new CreateIndexRequest(indexName);
+        request.settings(Settings.builder()
+                // 设置分片数为3, 副本为2
+                .put("index.number_of_shards", 3)
+                .put("index.number_of_replicas", 2)
+        );
+        request.mapping(generateBuilder(clazz));
+        CreateIndexResponse response = restHighLevelClient.indices().create(request, RequestOptions.DEFAULT);
+        // 指示是否所有节点都已确认请求
+        boolean acknowledged = response.isAcknowledged();
+        // 指示是否在超时之前为索引中的每个分片启动了必需的分片副本数
+        boolean shardsAcknowledged = response.isShardsAcknowledged();
+        if (acknowledged || shardsAcknowledged) {
+            log.info("创建索引成功!索引名称为{}", indexName);
+            return true;
+        }
+        return false;
+    }
+
+    /**
+     * 创建索引(默认分片数为5和副本数为1)
+     *
+     * @param clazz 根据实体自动映射es索引
+     * @throws IOException
+     */
+    public boolean createIndexIfNotExist(Class clazz) throws Exception {
+        Document declaredAnnotation = (Document) clazz.getDeclaredAnnotation(Document.class);
+        if (declaredAnnotation == null) {
+            throw new Exception(String.format("class name: %s can not find Annotation [Document], please check", clazz.getName()));
+        }
+        String indexName = declaredAnnotation.index();
+
+        boolean indexExists = isIndexExists(indexName);
+        if (!indexExists) {
+            CreateIndexRequest request = new CreateIndexRequest(indexName);
+            request.settings(Settings.builder()
+                    // 设置分片数为3, 副本为2
+                    .put("index.number_of_shards", 3)
+                    .put("index.number_of_replicas", 2)
+            );
+            request.mapping(generateBuilder(clazz));
+            CreateIndexResponse response = restHighLevelClient.indices().create(request, RequestOptions.DEFAULT);
+            // 指示是否所有节点都已确认请求
+            boolean acknowledged = response.isAcknowledged();
+            // 指示是否在超时之前为索引中的每个分片启动了必需的分片副本数
+            boolean shardsAcknowledged = response.isShardsAcknowledged();
+            if (acknowledged || shardsAcknowledged) {
+                log.info("创建索引成功!索引名称为{}", indexName);
+                return true;
+            }
+        }
+        return false;
+    }
+
+    /**
+     * 更新索引(默认分片数为5和副本数为1):
+     * 只能给索引上添加一些不存在的字段
+     * 已经存在的映射不能改
+     *
+     * @param clazz 根据实体自动映射es索引
+     * @throws IOException
+     */
+    public boolean updateIndex(Class clazz) throws Exception {
+        Document declaredAnnotation = (Document) clazz.getDeclaredAnnotation(Document.class);
+        if (declaredAnnotation == null) {
+            throw new Exception(String.format("class name: %s can not find Annotation [Document], please check", clazz.getName()));
+        }
+        String indexName = declaredAnnotation.index();
+        PutMappingRequest request = new PutMappingRequest(indexName);
+
+        request.source(generateBuilder(clazz));
+        AcknowledgedResponse response = restHighLevelClient.indices().putMapping(request, RequestOptions.DEFAULT);
+        // 指示是否所有节点都已确认请求
+        boolean acknowledged = response.isAcknowledged();
+
+        if (acknowledged) {
+            log.info("更新索引索引成功!索引名称为{}", indexName);
+            return true;
+        }
+        return false;
+    }
+
+    /**
+     * 删除索引
+     *
+     * @param indexName
+     * @return
+     */
+    public boolean delIndex(String indexName) {
+        boolean acknowledged = false;
+        try {
+            DeleteIndexRequest deleteIndexRequest = new DeleteIndexRequest(indexName);
+            deleteIndexRequest.indicesOptions(IndicesOptions.LENIENT_EXPAND_OPEN);
+            AcknowledgedResponse delete = restHighLevelClient.indices().delete(deleteIndexRequest, RequestOptions.DEFAULT);
+            acknowledged = delete.isAcknowledged();
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        return acknowledged;
+    }
+
+    /**
+     * 判断索引是否存在
+     *
+     * @param indexName
+     * @return
+     */
+    public boolean isIndexExists(String indexName) {
+        boolean exists = false;
+        try {
+            GetIndexRequest getIndexRequest = new GetIndexRequest(indexName);
+            getIndexRequest.humanReadable(true);
+            exists = restHighLevelClient.indices().exists(getIndexRequest, RequestOptions.DEFAULT);
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        return exists;
+    }
+
+
+    /**
+     * 添加单条数据
+     * 提供多种方式:
+     * 1. json
+     * 2. map
+     * Map<String, Object> jsonMap = new HashMap<>();
+     * jsonMap.put("user", "kimchy");
+     * jsonMap.put("postDate", new Date());
+     * jsonMap.put("message", "trying out Elasticsearch");
+     * IndexRequest indexRequest = new IndexRequest("posts")
+     * .id("1").source(jsonMap);
+     * 3. builder
+     * XContentBuilder builder = XContentFactory.jsonBuilder();
+     * builder.startObject();
+     * {
+     * builder.field("user", "kimchy");
+     * builder.timeField("postDate", new Date());
+     * builder.field("message", "trying out Elasticsearch");
+     * }
+     * builder.endObject();
+     * IndexRequest indexRequest = new IndexRequest("posts")
+     * .id("1").source(builder);
+     * 4. source:
+     * IndexRequest indexRequest = new IndexRequest("posts")
+     * .id("1")
+     * .source("user", "kimchy",
+     * "postDate", new Date(),
+     * "message", "trying out Elasticsearch");
+     * <p>
+     * 报错:  Validation Failed: 1: type is missing;
+     * 加入两个jar包解决
+     * <p>
+     * 提供新增或修改的功能
+     *
+     * @return
+     */
+    public IndexResponse index(Object o) throws Exception {
+        Document declaredAnnotation = (Document) o.getClass().getDeclaredAnnotation(Document.class);
+        if (declaredAnnotation == null) {
+            throw new Exception(String.format("class name: %s can not find Annotation [Document], please check", o.getClass().getName()));
+        }
+        String indexName = declaredAnnotation.index();
+
+        IndexRequest request = new IndexRequest(indexName);
+        Field fieldByAnnotation = getFieldByAnnotation(o, EsId.class);
+        if (fieldByAnnotation != null) {
+            fieldByAnnotation.setAccessible(true);
+            try {
+                Object id = fieldByAnnotation.get(o);
+                request = request.id(id.toString());
+            } catch (IllegalAccessException e) {
+                log.error("获取id字段出错:{}", e);
+            }
+        }
+
+        String userJson = JSON.toJSONString(o);
+        request.source(userJson, XContentType.JSON);
+        IndexResponse indexResponse = restHighLevelClient.index(request, RequestOptions.DEFAULT);
+        return indexResponse;
+    }
+
+
+    /**
+     * 根据id查询
+     *
+     * @return
+     */
+    public String queryById(String indexName, String id) throws IOException {
+        GetRequest getRequest = new GetRequest(indexName, id);
+        // getRequest.fetchSourceContext(FetchSourceContext.DO_NOT_FETCH_SOURCE);
+
+        GetResponse getResponse = restHighLevelClient.get(getRequest, RequestOptions.DEFAULT);
+        String jsonStr = getResponse.getSourceAsString();
+        return jsonStr;
+    }
+
+    /**
+     * 查询封装返回json字符串
+     *
+     * @param indexName
+     * @param searchSourceBuilder
+     * @return
+     * @throws IOException
+     */
+    public String search(String indexName, SearchSourceBuilder searchSourceBuilder) throws IOException {
+        SearchRequest searchRequest = new SearchRequest(indexName);
+        searchRequest.source(searchSourceBuilder);
+        searchRequest.scroll(TimeValue.timeValueMinutes(1L));
+        SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
+        String scrollId = searchResponse.getScrollId();
+        SearchHits hits = searchResponse.getHits();
+        JSONArray jsonArray = new JSONArray();
+        for (SearchHit hit : hits) {
+            String sourceAsString = hit.getSourceAsString();
+            JSONObject jsonObject = JSON.parseObject(sourceAsString);
+            jsonArray.add(jsonObject);
+        }
+        log.info("返回总数为:" + hits.getTotalHits());
+        return jsonArray.toJSONString();
+    }
+
+    /**
+     * 查询封装,带分页
+     *
+     * @param searchSourceBuilder
+     * @param pageNum
+     * @param pageSize
+     * @param s
+     * @param <T>
+     * @return
+     * @throws IOException
+     */
+    public <T> PageInfo<T> search(SearchSourceBuilder searchSourceBuilder, int pageNum, int pageSize, Class<T> s) throws Exception {
+        Document declaredAnnotation = (Document) s.getDeclaredAnnotation(Document.class);
+        if (declaredAnnotation == null) {
+            throw new Exception(String.format("class name: %s can not find Annotation [Document], please check", s.getName()));
+        }
+        String indexName = declaredAnnotation.index();
+        SearchRequest searchRequest = new SearchRequest(indexName);
+        searchRequest.source(searchSourceBuilder);
+        SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
+        SearchHits hits = searchResponse.getHits();
+        JSONArray jsonArray = new JSONArray();
+        for (SearchHit hit : hits) {
+            String sourceAsString = hit.getSourceAsString();
+            JSONObject jsonObject = JSON.parseObject(sourceAsString);
+            jsonArray.add(jsonObject);
+        }
+        log.info("返回总数为:" + hits.getTotalHits());
+        int total = (int) hits.getTotalHits().value;
+
+        // 封装分页
+        List<T> list = jsonArray.toJavaList(s);
+        PageInfo<T> page = new PageInfo<>();
+        page.setList(list);
+        page.setPageNum(pageNum);
+        page.setPageSize(pageSize);
+        page.setTotal(total);
+        page.setPages(total == 0 ? 0 : (total % pageSize == 0 ? total / pageSize : (total / pageSize) + 1));
+        page.setHasNextPage(page.getPageNum() < page.getPages());
+        return page;
+    }
+
+    /**
+     * 查询封装,返回集合
+     *
+     * @param searchSourceBuilder
+     * @param s
+     * @param <T>
+     * @return
+     * @throws IOException
+     */
+    public <T> List<T> search(SearchSourceBuilder searchSourceBuilder, Class<T> s) throws Exception {
+        Document declaredAnnotation = (Document) s.getDeclaredAnnotation(Document.class);
+        if (declaredAnnotation == null) {
+            throw new Exception(String.format("class name: %s can not find Annotation [Document], please check", s.getName()));
+        }
+        String indexName = declaredAnnotation.index();
+        SearchRequest searchRequest = new SearchRequest(indexName);
+        searchRequest.source(searchSourceBuilder);
+        searchRequest.scroll(TimeValue.timeValueMinutes(1L));
+        SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
+        String scrollId = searchResponse.getScrollId();
+        SearchHits hits = searchResponse.getHits();
+        JSONArray jsonArray = new JSONArray();
+        for (SearchHit hit : hits) {
+            String sourceAsString = hit.getSourceAsString();
+            JSONObject jsonObject = JSON.parseObject(sourceAsString);
+            jsonArray.add(jsonObject);
+        }
+        // 封装分页
+        List<T> list = jsonArray.toJavaList(s);
+        return list;
+    }
+
+
+    /**
+     * 批量插入文档
+     * 文档存在 则插入
+     * 文档不存在 则更新
+     *
+     * @param list
+     * @return
+     */
+    public <T> boolean batchSaveOrUpdate(List<T> list) throws Exception {
+        Object o1 = list.get(0);
+        Document declaredAnnotation = (Document) o1.getClass().getDeclaredAnnotation(Document.class);
+        if (declaredAnnotation == null) {
+            throw new Exception(String.format("class name: %s can not find Annotation [@Document], please check", o1.getClass().getName()));
+        }
+        String indexName = declaredAnnotation.index();
+
+        BulkRequest request = new BulkRequest(indexName);
+        for (Object o : list) {
+            String jsonStr = JSON.toJSONString(o);
+            IndexRequest indexReq = new IndexRequest().source(jsonStr, XContentType.JSON);
+
+            Field fieldByAnnotation = getFieldByAnnotation(o, EsId.class);
+            if (fieldByAnnotation != null) {
+                fieldByAnnotation.setAccessible(true);
+                try {
+                    Object id = fieldByAnnotation.get(o);
+                    indexReq = indexReq.id(id.toString());
+                } catch (IllegalAccessException e) {
+                    log.error("获取id字段出错:{}", e);
+                }
+            }
+            request.add(indexReq);
+        }
+        BulkResponse bulkResponse = restHighLevelClient.bulk(request, RequestOptions.DEFAULT);
+
+        for (BulkItemResponse bulkItemResponse : bulkResponse) {
+            DocWriteResponse itemResponse = bulkItemResponse.getResponse();
+            IndexResponse indexResponse = (IndexResponse) itemResponse;
+            log.info("单条返回结果:{}", indexResponse);
+            if (bulkItemResponse.isFailed()) {
+                log.error("es 返回错误{}", bulkItemResponse.getFailureMessage());
+                return false;
+            }
+        }
+        return true;
+    }
+
+    /**
+     * 删除文档
+     *
+     * @param indexName: 索引名称
+     * @param docId:     文档id
+     */
+    public boolean deleteDoc(String indexName, String docId) throws IOException {
+        DeleteRequest request = new DeleteRequest(indexName, docId);
+        DeleteResponse deleteResponse = restHighLevelClient.delete(request, RequestOptions.DEFAULT);
+        // 解析response
+        String index = deleteResponse.getIndex();
+        String id = deleteResponse.getId();
+        long version = deleteResponse.getVersion();
+        ReplicationResponse.ShardInfo shardInfo = deleteResponse.getShardInfo();
+        if (shardInfo.getFailed() > 0) {
+            for (ReplicationResponse.ShardInfo.Failure failure :
+                    shardInfo.getFailures()) {
+                String reason = failure.reason();
+                log.info("删除失败,原因为 {}", reason);
+            }
+        }
+        return true;
+    }
+
+    /**
+     * 根据json类型更新文档
+     *
+     * @param indexName
+     * @param docId
+     * @param o
+     * @return
+     * @throws IOException
+     */
+    public boolean updateDoc(String indexName, String docId, Object o) throws IOException {
+        UpdateRequest request = new UpdateRequest(indexName, docId);
+        request.doc(JSON.toJSONString(o), XContentType.JSON);
+        UpdateResponse updateResponse = restHighLevelClient.update(request, RequestOptions.DEFAULT);
+        String index = updateResponse.getIndex();
+        String id = updateResponse.getId();
+        long version = updateResponse.getVersion();
+        if (updateResponse.getResult() == DocWriteResponse.Result.CREATED) {
+            return true;
+        } else if (updateResponse.getResult() == DocWriteResponse.Result.UPDATED) {
+            return true;
+        } else if (updateResponse.getResult() == DocWriteResponse.Result.DELETED) {
+        } else if (updateResponse.getResult() == DocWriteResponse.Result.NOOP) {
+
+        }
+        return false;
+    }
+
+    /**
+     * 根据Map类型更新文档
+     *
+     * @param indexName
+     * @param docId
+     * @param map
+     * @return
+     * @throws IOException
+     */
+    public boolean updateDoc(String indexName, String docId, Map<String, Object> map) throws IOException {
+        UpdateRequest request = new UpdateRequest(indexName, docId);
+        request.doc(map);
+        UpdateResponse updateResponse = restHighLevelClient.update(request, RequestOptions.DEFAULT);
+        String index = updateResponse.getIndex();
+        String id = updateResponse.getId();
+        long version = updateResponse.getVersion();
+        if (updateResponse.getResult() == DocWriteResponse.Result.CREATED) {
+            return true;
+        } else if (updateResponse.getResult() == DocWriteResponse.Result.UPDATED) {
+            return true;
+        } else if (updateResponse.getResult() == DocWriteResponse.Result.DELETED) {
+        } else if (updateResponse.getResult() == DocWriteResponse.Result.NOOP) {
+
+        }
+        return false;
+    }
+
+
+    public XContentBuilder generateBuilder(Class clazz) throws IOException {
+        // 获取索引名称及类型
+        Document doc = (Document) clazz.getAnnotation(Document.class);
+        log.info("docIndex:{}", doc.index());
+        log.info("docType:{}", doc.type());
+
+        XContentBuilder builder = XContentFactory.jsonBuilder();
+        builder.startObject();
+        builder.startObject("properties");
+        Field[] declaredFields = clazz.getDeclaredFields();
+        for (Field f : declaredFields) {
+            if (f.isAnnotationPresent(FieId.class)) {
+                // 获取注解
+                FieId declaredAnnotation = f.getDeclaredAnnotation(FieId.class);
+
+                // 如果嵌套对象:
+                /**
+                 * {
+                 *   "mappings": {
+                 *     "properties": {
+                 *       "region": {
+                 *         "type": "keyword"
+                 *       },
+                 *       "manager": {
+                 *         "properties": {
+                 *           "age":  { "type": "integer" },
+                 *           "name": {
+                 *             "properties": {
+                 *               "first": { "type": "text" },
+                 *               "last":  { "type": "text" }
+                 *             }
+                 *           }
+                 *         }
+                 *       }
+                 *     }
+                 *   }
+                 * }
+                 */
+                if (declaredAnnotation.type() == FieldType.OBJECT) {
+                    // 获取当前类的对象-- Action
+                    Class<?> type = f.getType();
+                    Field[] df2 = type.getDeclaredFields();
+                    builder.startObject(f.getName());
+                    builder.startObject("properties");
+                    // 遍历该对象中的所有属性
+                    for (Field f2 : df2) {
+                        if (f2.isAnnotationPresent(FieId.class)) {
+                            // 获取注解
+                            FieId declaredAnnotation2 = f2.getDeclaredAnnotation(FieId.class);
+                            builder.startObject(f2.getName());
+                            builder.field("type", declaredAnnotation2.type().getType());
+                            // keyword不需要分词
+                            if (declaredAnnotation2.type() == FieldType.TEXT) {
+                                builder.field("analyzer", declaredAnnotation2.analyzer().getType());
+                            }
+                            if (declaredAnnotation2.type() == FieldType.DATE) {
+                                builder.field("format", "yyyy-MM-dd HH:mm:ss");
+                            }
+                            builder.endObject();
+                        }
+                    }
+                    builder.endObject();
+                    builder.endObject();
+
+                } else {
+                    builder.startObject(f.getName());
+                    builder.field("type", declaredAnnotation.type().getType());
+                    // keyword不需要分词
+                    if (declaredAnnotation.type() == FieldType.TEXT) {
+                        builder.field("analyzer", declaredAnnotation.analyzer().getType());
+                    }
+                    if (declaredAnnotation.type() == FieldType.DATE) {
+                        builder.field("format", "yyyy-MM-dd HH:mm:ss");
+                    }
+                    builder.endObject();
+                }
+            }
+        }
+        // 对应property
+        builder.endObject();
+        builder.endObject();
+        return builder;
+    }
+
+
+    public static Field getFieldByAnnotation(Object o, Class annotationClass) {
+        Field[] declaredFields = o.getClass().getDeclaredFields();
+        if (declaredFields != null && declaredFields.length > 0) {
+            for (Field f : declaredFields) {
+                if (f.isAnnotationPresent(annotationClass)) {
+                    return f;
+                }
+            }
+        }
+        return null;
+    }
+
+}
+

+ 23 - 0
module-job-bytedance/src/main/java/cn/com/ctop/job/bytedance/handler/CwjsPolicyApprovedNoticeJob.java

@@ -0,0 +1,23 @@
+package cn.com.ctop.job.bytedance.handler;
+
+import cn.com.ctop.common.module.utils.HttpUtils2;
+import com.xxl.job.core.context.XxlJobHelper;
+import com.xxl.job.core.handler.annotation.XxlJob;
+import org.springframework.stereotype.Component;
+
+@Component
+public class CwjsPolicyApprovedNoticeJob {
+
+
+    @XxlJob("cwjsPolicyApprovedNoticeWxJob")
+    public void execute() throws Exception {
+        try {
+//            String url = "http://gateway.tjyourong.com.cn/finance/cwjsPolicyInfo/weiXinNotice";
+            String url = "http://api.tjyourong.com.cn/finance/cwjsPolicyInfo/weiXinNotice";
+            HttpUtils2.httpGet(url, null, null);
+            XxlJobHelper.log("send weixin message success");
+        } catch (Exception e) {
+            XxlJobHelper.log(e.getMessage());
+        }
+    }
+}

+ 37 - 0
module-job-bytedance/src/main/java/cn/com/ctop/job/bytedance/handler/SynchronousAccountTransactionDetailsJob.java

@@ -0,0 +1,37 @@
+package cn.com.ctop.job.bytedance.handler;
+
+import cn.com.ctop.toutiao.modules.agent.service.AgentManagementService;
+import com.xxl.job.core.handler.annotation.XxlJob;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+
+@Component
+@Slf4j
+public class SynchronousAccountTransactionDetailsJob {
+
+    @Resource
+    AgentManagementService agentManagementService;
+
+    /**
+     * 同步账号交易流水
+     *
+     * @param
+     * @return
+     * @throws
+     * @author ZZY
+     */
+    @XxlJob("synchronousAccountTransactionDetails")
+    public void execute() throws Exception {
+        try {
+            //同步账号信息
+            agentManagementService.synchronousAccount();
+            //同步每个账号交易流水
+            agentManagementService.synchronousAccountTransactionDetails();
+        } catch (Exception e) {
+            log.info("同步完成");
+        }
+
+    }
+}

+ 1 - 1
module-job-kuaishou/src/main/java/cn/com/ctop/job/kuaishou/handler/KuaiShouAccountCleanJob.java

@@ -22,7 +22,7 @@ public class KuaiShouAccountCleanJob {
      * @throws
      * @author ZZY
      */
-    @XxlJob("accountClean")
+    @XxlJob("AccountClean")
     public void execute() throws Exception {
         try {
             kuaiShouAccountCleanService.cleanAccount();

+ 10 - 0
module-job-kuaishou/src/main/java/cn/com/ctop/job/kuaishou/handler/KuaishouDailyAudienceReportJob.java

@@ -2,6 +2,7 @@ package cn.com.ctop.job.kuaishou.handler;
 
 import cn.com.ctop.common.module.entity.CtopOauthToken;
 import cn.com.ctop.common.module.service.ICtopOauthTokenService;
+import cn.com.ctop.common.module.utils.HttpUtils2;
 import cn.com.ctop.kuaishou.modules.batch.entity.KuaiShouGroup;
 import cn.com.ctop.kuaishou.modules.batch.service.IKuaiShouGroupService;
 import cn.com.ctop.kuaishou.modules.batch.service.IKuaishouStrategyService;
@@ -79,4 +80,13 @@ public class KuaishouDailyAudienceReportJob {
             XxlJobHelper.log("定时获取人群分析报表数据异常", e);
         }
     }
+
+
+
+    @XxlJob("kuaishouDailyTaoTeAudienceReportJob")
+    public void getTaoTeAudienceData() throws Exception {
+        String url = "http://api.tjyourong.com.cn/jeecg-boot/test/getAudienceDataNew";
+        HttpUtils2.httpGet(url, null, null);
+    }
+
 }

+ 21 - 1
module-job-kuaishou/src/main/java/cn/com/ctop/job/kuaishou/handler/KuaishouOperationRecordJob.java

@@ -2,6 +2,7 @@ package cn.com.ctop.job.kuaishou.handler;
 
 import cn.com.ctop.common.module.entity.CtopOauthToken;
 import cn.com.ctop.common.module.service.ICtopOauthTokenService;
+import cn.com.ctop.common.module.utils.HttpUtils2;
 import cn.com.ctop.kuaishou.modules.batch.service.IKuaishouInterfaceService2;
 import com.xxl.job.core.context.XxlJobHelper;
 import com.xxl.job.core.handler.annotation.XxlJob;
@@ -10,7 +11,9 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
 import java.util.Date;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
 
@@ -38,7 +41,7 @@ public class KuaishouOperationRecordJob {
             XxlJobHelper.handleFail();
             return ;
         }
-        tokens.forEach(token -> {
+       /* tokens.forEach(token -> {
             executorService.submit(new Runnable() {
                 @Override
                 public void run() {
@@ -51,7 +54,24 @@ public class KuaishouOperationRecordJob {
                     kuaishouInterfaceService2.getOperationRecord(token.getAccountId(),token.getAccessToken(),7, date, date);
                 }
             });
+        });*/
+
+        String url = "http://api.tjyourong.com.cn/jeecg-boot/test/getOperationRecord";
+
+        tokens.forEach(token -> {
+            Map<String, Object> requestMap = new HashMap<>();
+            requestMap.put("accountId", token.getId());
+            requestMap.put("operationTarget", 1);   //账户
+            requestMap.put("startDate", date);
+            requestMap.put("endDate", date);
+            HttpUtils2.httpGet(url, requestMap, null);
+            requestMap.put("operationTarget", 2);   //计划
+            HttpUtils2.httpGet(url, requestMap, null);
+            requestMap.put("operationTarget", 3);   //组,别的不要了,煜一说的
+            HttpUtils2.httpGet(url, requestMap, null);
         });
+
+
     }
 
 }

+ 35 - 0
module-job-kuaishou/src/main/java/cn/com/ctop/job/kuaishou/handler/NewMonitorJob.java

@@ -0,0 +1,35 @@
+package cn.com.ctop.job.kuaishou.handler;
+
+import cn.com.ctop.kuaishou.modules.clean.service.KuaiShouAccountCleanService;
+import cn.com.ctop.kuaishou.modules.report.service.NewMonitorService;
+import com.xxl.job.core.handler.annotation.XxlJob;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+
+@Component
+@Slf4j
+public class NewMonitorJob {
+
+    @Resource
+    NewMonitorService newMonitorService;
+
+    /**
+     * 账户清理
+     *
+     * @param
+     * @return
+     * @throws
+     * @author ZZY
+     */
+    @XxlJob("synchronousMonitor")
+    public void execute() throws Exception {
+        try {
+            newMonitorService.synchronousMonitor("0");
+        } catch (Exception e) {
+            log.info("清理完成完成");
+        }
+
+    }
+}

+ 1 - 1
module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/ai/mapper/AiKuaishouCreativeLevelOperationRecordMapper.java

@@ -10,5 +10,5 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
  * @cersion: V1.0
  */
 public interface AiKuaishouCreativeLevelOperationRecordMapper extends BaseMapper<AiKuaishouCreativeLevelOperationRecord> {
-
+    String selectSignatureByUnitId(Long unitId);
 }

+ 4 - 1
module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/ai/mapper/AiKuaishouUnitLevelOperationRecordMapper.java

@@ -3,6 +3,9 @@ package cn.com.ctop.kuaishou.modules.ai.mapper;
 import cn.com.ctop.kuaishou.modules.ai.entity.AiKuaishouUnitLevelOperationRecord;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 
+import java.util.Date;
+import java.util.List;
+
 /**
  * 组创建记录
  * @author: jeecg-boot
@@ -10,5 +13,5 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
  * @cersion: V1.0
  */
 public interface AiKuaishouUnitLevelOperationRecordMapper extends BaseMapper<AiKuaishouUnitLevelOperationRecord> {
-
+    List<AiKuaishouUnitLevelOperationRecord> selectAllByAccountId(Date startDate, Date endDate);
 }

+ 10 - 1
module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/ai/mapper/xml/AiKuaishouCreativeLevelOperationRecordMapper.xml

@@ -1,5 +1,14 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="cn.com.ctop.kuaishou.modules.ai.mapper.AiKuaishouCreativeLevelOperationRecordMapper">
-
+    <select id="selectSignatureByUnitId" resultType="String">
+         SELECT
+            signature
+        FROM
+            ctop_kuaishou_creative t1
+        LEFT JOIN ctop_kuaishou_video_get t2 ON t1.photo_id = t2.photo_id
+        WHERE
+            unit_id = #{unitId}
+        LIMIT 1
+    </select>
 </mapper>

+ 3 - 1
module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/ai/mapper/xml/AiKuaishouUnitLevelOperationRecordMapper.xml

@@ -1,5 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="cn.com.ctop.kuaishou.modules.ai.mapper.AiKuaishouUnitLevelOperationRecordMapper">
-
+    <select id="selectAllByAccountId" resultType="cn.com.ctop.kuaishou.modules.ai.entity.AiKuaishouUnitLevelOperationRecord">
+        select distinct account_id,campaign_id,unit_id from ctop_ai_kuaishou_unit_level_operation_record where unit_id is not null and  create_time &gt;= #{startDate} and create_time &lt;= #{endDate} and account_id in (select account_id from ctop_user_allocation where project_id = 458) group by account_id,campaign_id,unit_id
+    </select>
 </mapper>

+ 158 - 5
module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/batch/service/impl/KuaishouInterfaceServiceImpl2.java

@@ -28,13 +28,13 @@ public class KuaishouInterfaceServiceImpl2 implements IKuaishouInterfaceService2
     @Override
     public void getOperationRecord(Long advertiserId, String accessToken, Integer operationTarget, String startDate, String endDate){
 
-        Long days = DateUtils.getDiscrepantDays(startDate, endDate);
-        String start = null;
-        String end = null;
+//        Long days = DateUtils.getDiscrepantDays(startDate, endDate);
+//        String start = null;
+//        String end = null;
         //for (int i = 0; i <= days; i++) {
         //    start = DateUtils.addDay(startDate, i);
         //    end = start;
-        getOperationRecordByPage(advertiserId, accessToken,1, 500, operationTarget, startDate, endDate);
+        getOperationRecordByPage2(advertiserId, accessToken,1, 500, operationTarget, startDate, endDate);
         //}
     }
 
@@ -125,9 +125,104 @@ public class KuaishouInterfaceServiceImpl2 implements IKuaishouInterfaceService2
                 }
             }else{
                 if(code == 500000){
+                    System.out.println("5秒后重试,accountId:"+advertiserId+",日期:"+startDate);
+                    try{Thread.sleep(5000);} catch (InterruptedException e){};
                     getOperationRecordByPage(advertiserId, accessToken,page, pageSize, operationTarget, startDate, endDate);
+                }else {
+                    log.error("快手操作记录接口code返回结果不正确,{} ~ {} resultJson:{}", startDate, endDate, result);
+                }
+            }
+        } else {
+            log.error("快手操作记录接口获取地域列表返回结果为空,{} ~ {}, resultJson:{}", startDate, endDate, result);
+        }
+
+    }
+
+    private void getOperationRecordByPage2(Long advertiserId, String accessToken, Integer page, Integer pageSize, Integer operationTarget, String startDate, String endDate) {
+        String url = PropertiesUtils.getConfig("kuaishou_api_url") + KuaishouInterfaceConstant.OPERATION_RECORD;
+        Map<String, String> headers = new HashMap<>();
+        headers.put("Access-Token", accessToken);
+        headers.put("Content-Type", " application/json");
+        JSONObject json = new JSONObject();
+        json.put("advertiser_id", advertiserId);
+        json.put("operation_target", operationTarget);
+        json.put("page", page);
+        json.put("page_size", pageSize);
+        json.put("start_date", startDate);
+        json.put("end_date", endDate);
+
+        String result = HttpUtils.kuaiShouhttpPostRequest(url, json.toJSONString(), headers);
+        JSONObject resultJson = JSONObject.parseObject(result);
+
+        if(!Check.isNull(resultJson)){
+            Integer code = resultJson.getInteger("code");
+            if (code == 0) {
+                JSONObject data = resultJson.getJSONObject("data");
+                if (!Check.isNull(data)) {
+                    List<KuaishouOperationRecord> recordList =  new ArrayList();
+
+                    Integer totalCount = data.getInteger("total_count");
+                    JSONArray dataArr = data.getJSONArray("details");
+                    for (int i = 0; i < dataArr.size(); i++) {
+                        JSONObject dataJson = JSONObject.parseObject(dataArr.get(i).toString());
+                        if (!Check.isNull(dataJson)) {
+
+                            Date operationTime = dataJson.getDate("operation_time");
+                            //Date operationDate = DateUtils.parseDate()
+                            Integer operationType = dataJson.getInteger("operation_type");
+                            operationTarget = dataJson.getInteger("operation_target");
+                            Integer roleType = dataJson.getInteger("role_type");
+                            String objectId = dataJson.getString("object_id");
+                            String objectName = dataJson.getString("object_name");
+
+
+
+                            String contentLogArrayString =  dataJson.getString("content_log");
+                            JSONArray jsonArray = JSONArray.parseArray(contentLogArrayString);
+                            for(int j=0;j<jsonArray.size();j++){
+                                JSONObject object = jsonArray.getJSONObject(j);
+                                String originalData = object.getString("original_data");
+                                String updateData = object.getString("update_data");
+                                String fieldName = object.getString("field_name");
+                                KuaishouOperationRecord record = new KuaishouOperationRecord();
+                                record.setAccountId(advertiserId);
+                                record.setStatDate(DateUtils.formatDate(operationTime));
+                                record.setOriginalData(originalData);
+                                record.setUpdateData(updateData);
+                                record.setFieldName(fieldName);
+
+                                record.setOperationTime(operationTime);
+                                record.setOperationType(operationType);
+                                record.setOperationTarget(operationTarget);
+                                record.setRoleType(roleType);
+                                record.setObjectId(objectId);
+                                record.setObjectName(objectName);
+
+                                if("".equals(record.getOriginalData()) && "".equals(record.getUpdateData())){
+                                    continue;
+                                }
+                                recordList.add(record);
+                            }
+
+                        }
+                    }
+                    saveOperationRecordListToDb(recordList);
+
+                    Integer totalPage = (totalCount - 1) / pageSize + 1;
+                    if (page < totalPage) {
+                        getOperationRecordByPage2(advertiserId, accessToken, page + 1, pageSize, operationTarget, startDate, endDate);
+                    }
+                }else{
+                    log.error("快手操作记录接口data结果不正确,{} ~ {}, resultJson:{}", startDate, endDate, result);
+                }
+            }else{
+                if(code == 500000){
+                    System.out.print("》》5秒后重试,accountId:"+advertiserId+",日期:"+startDate+"《《 ");
+                    try{Thread.sleep(5000);} catch (InterruptedException e){};
+                    getOperationRecordByPage2(advertiserId, accessToken,page, pageSize, operationTarget, startDate, endDate);
+                }else {
+                    log.error("快手操作记录接口code返回结果不正确,{} ~ {} resultJson:{}", startDate, endDate, result);
                 }
-                log.error("快手操作记录接口code返回结果不正确,{} ~ {},再次调用!!! resultJson:{}", startDate, endDate, result);
             }
         } else {
             log.error("快手操作记录接口获取地域列表返回结果为空,{} ~ {}, resultJson:{}", startDate, endDate, result);
@@ -171,6 +266,64 @@ public class KuaishouInterfaceServiceImpl2 implements IKuaishouInterfaceService2
         }
     }
 
+    private void saveOperationRecordListToDb(List<KuaishouOperationRecord> records) {
+        if (Check.isNull(records)) {
+            return;
+        }
+
+        List<KuaishouOperationRecord> batchList = new ArrayList<>();
+        records.removeAll(Collections.singleton(null));
+        Integer operationTarget = records.get(0).getOperationTarget();
+
+
+
+        for (KuaishouOperationRecord sumPosition : records) {
+            batchList.add(sumPosition);
+
+            if (batchList.size() >= 1000) {
+                if (operationTarget == 1) {
+                    kuaishouOperationRecordMapper.insertOperationRecordInfoAccountNew(batchList);
+                } else if (operationTarget == 2) {
+                    kuaishouOperationRecordMapper.insertOperationRecordInfoCampaignNew(batchList);
+                } else if (operationTarget == 3) {
+                    kuaishouOperationRecordMapper.insertOperationRecordInfoUnitNew(batchList);
+                } else if (operationTarget == 4) {
+                    kuaishouOperationRecordMapper.insertOperationRecordInfoCreativeNew(batchList);
+                } else if (operationTarget == 5) {
+                    kuaishouOperationRecordMapper.insertOperationRecordInfoVideoNew(batchList);
+                } else if (operationTarget == 6) {
+                    kuaishouOperationRecordMapper.insertOperationRecordInfoAppNew(batchList);
+                } else if (operationTarget == 7) {
+                    kuaishouOperationRecordMapper.insertOperationRecordInfoPackageNew(batchList);
+                } else {
+                    System.out.println("未知的目标类型!");
+                }
+                batchList.clear();
+            }
+        }
+        if (!batchList.isEmpty()) {
+
+            if (operationTarget == 1) {
+                kuaishouOperationRecordMapper.insertOperationRecordInfoAccountNew(batchList);
+            } else if (operationTarget == 2) {
+                kuaishouOperationRecordMapper.insertOperationRecordInfoCampaignNew(batchList);
+            } else if (operationTarget == 3) {
+                kuaishouOperationRecordMapper.insertOperationRecordInfoUnitNew(batchList);
+            } else if (operationTarget == 4) {
+                kuaishouOperationRecordMapper.insertOperationRecordInfoCreativeNew(batchList);
+            } else if (operationTarget == 5) {
+                kuaishouOperationRecordMapper.insertOperationRecordInfoVideoNew(batchList);
+            } else if (operationTarget == 6) {
+                kuaishouOperationRecordMapper.insertOperationRecordInfoAppNew(batchList);
+            } else if (operationTarget == 7) {
+                kuaishouOperationRecordMapper.insertOperationRecordInfoPackageNew(batchList);
+            } else {
+                System.out.println("未知的目标类型!");
+            }
+            batchList.clear();
+        }
+
+    }
 
 
 

+ 9 - 21
module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/clean/controller/KuaiShouAccountCleanController.java

@@ -18,7 +18,6 @@ import javax.annotation.Resource;
 @RequestMapping("/accountClean")
 public class KuaiShouAccountCleanController {
 
-
     @Resource
     KuaiShouAccountCleanService kuaiShouAccountCleanService;
 
@@ -34,26 +33,15 @@ public class KuaiShouAccountCleanController {
     }
 
     /**
-     * 根据模板名称查询
-     *
-     * @param templateName
-     * @return
-     */
-    @GetMapping("/getTemplateNameSize")
-    public Result getTemplateName(@Param("templateName")String templateName){
-        return   kuaiShouAccountCleanService.getTemplateName(templateName);
-    }
-
-    /**
      * 查询模板列表
      *
-     * @param templateName 模板名称  createUser创建人  userId当前登录人id
+     * @param templateId 模板id  createUser创建人  userId当前登录人id
      * @return
      */
     @GetMapping("/getTemplateList")
-    public Result getTemplateList(@Param("templateName")String templateName,@Param("createUser")String createUser,@Param("userId")String userId,
+    public Result getTemplateList(@Param("templateId")String templateId,@Param("createUser")String createUser,@Param("userId")String userId,
                                   @Param("pageNum")String pageNum,@Param("pageSize")String pageSize  ){
-        return   kuaiShouAccountCleanService.getTemplateList(templateName,createUser,userId,pageNum,pageSize);
+        return   kuaiShouAccountCleanService.getTemplateList(templateId,createUser,userId,pageNum,pageSize);
     }
 
     /**
@@ -98,7 +86,7 @@ public class KuaiShouAccountCleanController {
      */
     @GetMapping("/getMyselfTemplateList")
     public Result getMyselfTemplateList(@Param("accountId")String accountId,@Param("userName")String userName,@Param("userId")String userId,
-                                        @Param("pageNum")String pageNum,@Param("pageSize")String pageSize  ){
+                                  @Param("pageNum")String pageNum,@Param("pageSize")String pageSize  ){
         return   kuaiShouAccountCleanService.getMyselfTemplateList(accountId,userName,userId,pageNum,pageSize);
     }
 
@@ -129,17 +117,17 @@ public class KuaiShouAccountCleanController {
     /**
      * 查询清理记录
      *
-     * @param templateId 模板名称  userId 账户id
+     * @param userName 运营名称  accountId 账户id
      * @return
      */
     @GetMapping("/getCleanUpLog")
-    public Result getCleanUpLog(@Param("templateId")String templateId,@Param("userId")String userId,
-                                @Param("pageNum")String pageNum,@Param("pageSize")String pageSize  ){
-        return   kuaiShouAccountCleanService.getCleanUpLog(templateId,userId,pageNum,pageSize);
+    public Result getCleanUpLog(@Param("userName")String userName,@Param("accountId")String accountId,
+                                  @Param("pageNum")String pageNum,@Param("pageSize")String pageSize  ){
+        return   kuaiShouAccountCleanService.getCleanUpLog(userName,accountId,pageNum,pageSize);
     }
 
     /**
-     * 执行清理计划
+     * 查询清理记录
      *
      * @param
      * @return

+ 0 - 4
module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/clean/entity/KuaiShouAccountCleanLogInfo.java

@@ -8,10 +8,6 @@ public class KuaiShouAccountCleanLogInfo {
     private  String id;
     //账户id
     private  String accountId;
-    //账户id
-    private  String templateId;
-    //账户id
-    private  String createTemplateId;
     //运营
     private  String userName;
     //操作类型  1-投放、2-暂停、3-删除

+ 11 - 18
module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/clean/mapper/KuaishouAccountCleanTemplateMapper.java

@@ -17,41 +17,34 @@ import java.util.Map;
 @Mapper
 public interface KuaishouAccountCleanTemplateMapper {
     //创建模板
-    void saveAccountCleanTemplate(KuaiShouAccountCleanTemplateInfo kuaiShouAccountCleanTemplateInfo);
+     void saveAccountCleanTemplate(KuaiShouAccountCleanTemplateInfo kuaiShouAccountCleanTemplateInfo);
     //根据id 创建人查询模板列表
-    List<KuaiShouAccountCleanTemplateInfo> getTemplateList(@Param("templateName") String templateName, @Param("createUser") String createUser, @Param("createId") String createId);
+    List<KuaiShouAccountCleanTemplateInfo> getTemplateList(@Param("templateId")String templateId, @Param("createUser")String createUser, @Param("createId")String createId);
     //根据id查询数据
-    KuaiShouAccountCleanTemplateInfo getInfoById(@Param("templateId") String templateId);
+    KuaiShouAccountCleanTemplateInfo getInfoById(@Param("templateId")String templateId);
     //查询账户关联模板个数
-    int getAccountAssociatedSize(@Param("accountId") String accountId);
+    int getAccountAssociatedSize(@Param("accountId")String accountId);
     //推送模板保存关联关系
-    void savePushTemplateAssociated(@Param("templateId") String templateId, @Param("accountId") String accountId, @Param("createTime") String createTime);
+    void savePushTemplateAssociated(@Param("templateId")String templateId,@Param("accountId")String accountId,@Param("createTime")String createTime);
     //修改模板
     void updateTemplate(KuaiShouAccountCleanTemplateInfo kuaiShouAccountCleanTemplateInfo);
     //根据模板id修改模板状态
-    void updateTemplateStatus(@Param("templateId") String templateId, @Param("status") String status);
+    void updateTemplateStatus(@Param("templateId")String templateId,@Param("status")String status);
     //根据id和accountId 删除关联表信息
-    void removeBinding(@Param("templateId") String templateId, @Param("accountId") String accountId);
+    void removeBinding(@Param("templateId")String templateId,@Param("accountId")String accountId);
     //查询清理日志记录
-    List<KuaiShouAccountCleanLogInfo> getCleanUpLog(@Param("templateId") String templateId, @Param("userId") String userId);
+    List<KuaiShouAccountCleanLogInfo> getCleanUpLog(@Param("userName")String userName, @Param("accountId")String accountId);
 
     //根据账户id 运营名称 查询个人模板信息
-    List<KuaiShouAccountCleanTemplateInfo> getMyselfTemplateList(@Param("accountId") String accountId, @Param("userName") String userName, @Param("createId") String createId);
+    List<KuaiShouAccountCleanTemplateInfo> getMyselfTemplateList(@Param("accountId")String accountId, @Param("userName")String userName, @Param("createId")String createId);
 
     //查询所有启用的模板
     List<KuaiShouAccountCleanTemplateInfo> getTemplateListBystatus();
     //根据规则模板查询相应组信息
-    String getGroupMessage(@Param("template") KuaiShouAccountCleanTemplateInfo kuaiShouAccountCleanTemplateInfo, @Param("optimizationObjective") String optimizationObjective, @Param("startDate") String startDate, @Param("unitId") String unitId);
-    List<Map> getGroupByAccount(@Param("accountId") String accountId);
-
+    List<String> getGroupMessage(@Param("template")KuaiShouAccountCleanTemplateInfo kuaiShouAccountCleanTemplateInfo,@Param("list")List list, @Param("startDate")String startDate);
     //保存操作日志
     void saveCleamLog(KuaiShouAccountCleanLogInfo kuaiShouAccountCleanLogInfo);
 
-    Map<String,String> getUserNameByAccountId(@Param("accountId") String accountId);
+    Map<String,String> getUserNameByAccountId(@Param("accountId")String accountId);
 
-    String getUserRealName(@Param("userId") String userId);
-    /**
-     * 根据模板名称查询
-     */
-    int getTemplateName(@Param("templateName") String templateName);
 }

+ 165 - 146
module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/clean/mapper/xml/KuaishouAccountCleanTemplateMapper.xml

@@ -2,75 +2,71 @@
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="cn.com.ctop.kuaishou.modules.clean.mapper.KuaishouAccountCleanTemplateMapper">
 
-
-    <resultMap id="templateResultMap" type="cn.com.ctop.kuaishou.modules.clean.entity.KuaiShouAccountCleanTemplateInfo">
-        <id column="id" property="id"/>
-        <result column="template_name" property="templateName"/>
-        <result column="applied_media" property="appliedMedia"/>
-        <result column="clean_time" property="cleanTime"/>
-        <result column="optimization_objective" property="optimizationObjective"/>
-        <result column="charge" property="charge"/>
-        <result column="conversion" property="conversion"/>
-        <result column="promotion_group_status" property="promotionGroupStatus"/>
-        <result column="perform_operations" property="performOperations"/>
-        <result column="status" property="status"/>
-        <result column="create_user" property="createUser"/>
-        <result column="create_id" property="createId"/>
-        <result column="create_time" property="createTime"/>
-        <result column="account_id" property="accountId"/>
-        <result column="user_name" property="userName"/>
-        <result column="account_status" property="accountStatus"/>
-        <result column="account_name" property="accountName"/>
-    </resultMap>
-
-    <resultMap id="logResultMap" type="cn.com.ctop.kuaishou.modules.clean.entity.KuaiShouAccountCleanLogInfo">
-        <id column="id" property="id"/>
-        <result column="account_id" property="accountId"/>
-        <result column="template_id" property="templateId"/>
-        <result column="create_template_id" property="createTemplateId"/>
-        <result column="user_name" property="userName"/>
-        <result column="operation_type" property="operationType"/>
-        <result column="create_time" property="createTime"/>
-        <result column="executive_information" property="executiveInformation"/>
-    </resultMap>
-    <!--保存清理模板-->
-    <insert id="saveAccountCleanTemplate" parameterType="cn.com.ctop.kuaishou.modules.clean.entity.KuaiShouAccountCleanTemplateInfo">
+  <resultMap id="templateResultMap" type="cn.com.ctop.kuaishou.modules.clean.entity.KuaiShouAccountCleanTemplateInfo">
+    <id column="id" property="id"/>
+    <result column="template_name" property="templateName"/>
+    <result column="applied_media" property="appliedMedia"/>
+    <result column="clean_time" property="cleanTime"/>
+    <result column="optimization_objective" property="optimizationObjective"/>
+    <result column="charge" property="charge"/>
+    <result column="conversion" property="conversion"/>
+    <result column="promotion_group_status" property="promotionGroupStatus"/>
+    <result column="perform_operations" property="performOperations"/>
+    <result column="status" property="status"/>
+    <result column="create_user" property="createUser"/>
+    <result column="create_id" property="createId"/>
+    <result column="create_time" property="createTime"/>
+    <result column="account_id" property="accountId"/>
+    <result column="user_name" property="userName"/>
+    <result column="account_status" property="accountStatus"/>
+    <result column="account_name" property="accountName"/>
+  </resultMap>
+
+  <resultMap id="logResultMap" type="cn.com.ctop.kuaishou.modules.clean.entity.KuaiShouAccountCleanLogInfo">
+    <id column="id" property="id"/>
+    <result column="account_id" property="accountId"/>
+    <result column="user_name" property="userName"/>
+    <result column="operation_type" property="operationType"/>
+    <result column="create_time" property="createTime"/>
+    <result column="executive_information" property="executiveInformation"/>
+  </resultMap>
+  <!--保存清理模板-->
+  <insert id="saveAccountCleanTemplate" parameterType="cn.com.ctop.kuaishou.modules.clean.entity.KuaiShouAccountCleanTemplateInfo">
     insert into ctop_kuaishou_account_clean_template values (#{id},#{templateName},#{appliedMedia},#{cleanTime},#{optimizationObjective},#{charge},
-    #{conversion},#{promotionGroupStatus},#{performOperations},#{status},#{createUser},#{createId},#{createTime})
+    #{conversion},#{performOperations},#{promotionGroupStatus},#{status},#{createUser},#{createId},#{createTime})
   </insert>
 
-    <!--根据创建人查询模板-->
-    <select id="getTemplateList" resultMap="templateResultMap">
-        select t.id,t.template_name,t.applied_media,t.create_user,t.status from ctop_kuaishou_account_clean_template t
-        <where>
-            <if test="templateName!=null and templateName!=''">
-                t.template_name like CONCAT(CONCAT('%', #{templateName}), '%')
-            </if>
-
-            <if test="createUser!=null and createUser!=''">
-                and t.create_user=#{createUser}
-            </if>
-            <if test="createId!=null and createId!=''">
-                and t.create_id=#{createId}
-            </if>
-        </where>
-        order by create_time desc
-    </select>
-
-    <select id="getInfoById" parameterType="String" resultMap="templateResultMap">
+  <!--根据创建人查询模板-->
+  <select id="getTemplateList" resultMap="templateResultMap" >
+    select t.id,t.template_name,t.applied_media,t.create_user  from ctop_kuaishou_account_clean_template t
+    <where>
+      <if test="templateId!=null and templateId!=''">
+         t.id=#{templateId}
+      </if >
+
+      <if test="createUser!=null and createUser!=''">
+        and t.create_user=#{createUser}
+      </if >
+      <if test="createId!=null and createId!=''">
+        and t.create_id=#{createId}
+      </if >
+    </where>
+  </select>
+
+   <select id="getInfoById" parameterType="String" resultMap="templateResultMap">
       select  t.id,t.template_name,t.clean_time,t.optimization_objective,t.charge,t.conversion,t.promotion_group_status,t.perform_operations  from ctop_kuaishou_account_clean_template t
       where t.id=#{templateId}
    </select>
 
-    <select id="getAccountAssociatedSize" resultType="int">
+  <select id="getAccountAssociatedSize" resultType="int">
         select count(*) from ctop_kuaishou_account_clean_center where account_id=#{accountId}
   </select>
 
-    <insert id="savePushTemplateAssociated">
+  <insert id="savePushTemplateAssociated" >
     insert into ctop_kuaishou_account_clean_center (account_id,template_id,create_time)values (#{accountId},#{templateId},#{createTime})
   </insert>
 
-    <update id="updateTemplate">
+  <update id="updateTemplate" >
     update ctop_kuaishou_account_clean_template set
     template_name=#{templateName},clean_time=#{cleanTime},
     optimization_objective=#{optimizationObjective},charge=#{charge},
@@ -78,116 +74,139 @@
     perform_operations=#{performOperations}
     where id=#{id}
   </update>
-    <update id="updateTemplateStatus">
+  <update id="updateTemplateStatus" >
     update ctop_kuaishou_account_clean_template set status=#{status}
     where id=#{templateId}
   </update>
 
-    <delete id="removeBinding">
+  <delete id="removeBinding">
     delete  from ctop_kuaishou_account_clean_center where account_id=#{accountId} and template_id=#{templateId}
   </delete>
 
-    <select id="getCleanUpLog" parameterType="cn.com.ctop.kuaishou.modules.clean.entity.KuaiShouAccountCleanLogInfo"
-            resultMap="logResultMap">
-        select * from ctop_kuaishou_account_clean_logs t
-        <where>
-            <if test="templateId!=null and templateId!=''">
-                t.template_id=#{templateId}
-            </if>
-
-            <if test="userId!=null and userId!=''">
-                and t.create_template_id =#{userId}
-            </if>
-        </where>
-    </select>
-
-
-    <!--根据账户id 运营名称 查询个人模板信息-->
-    <select id="getMyselfTemplateList" resultMap="templateResultMap">
-        select t.status,t.id,t.template_name,t.applied_media,t2.account_id,t3.auth_name as
-        account_name,t3.account_status,t.create_user as 'user_name' from ctop_kuaishou_account_clean_template t
-        LEFT JOIN ctop_kuaishou_account_clean_center t2 on t.id=t2.template_id
-        LEFT JOIN ctop_user_allocation t3 on t2.account_id=t3.account_id
-        <where>
-            t2.account_id is not null
-            <if test="accountId!=null and accountId!=''">
-                and t2.account_id=#{accountId}
-            </if>
-
-            <if test="userName!=null and userName!=''">
-                and t.create_user like concat('%',#{userName},'%')
-            </if>
-            <if test="createId!=null and createId!=''">
-                and t.create_id=#{createId}
-            </if>
-        </where>
-
-    </select>
-
-    <select id="getTemplateListBystatus" resultMap="templateResultMap">
-       select  t.id,t.template_name,t.clean_time,t.optimization_objective,t.charge,t.conversion,t.promotion_group_status,t.perform_operations,t2.account_id,t.create_id,t.create_user  from ctop_kuaishou_account_clean_template t
-       left join  ctop_kuaishou_account_clean_center t2 on t.id=t2.template_id where t.status='0'
+  <select id="getCleanUpLog" parameterType="cn.com.ctop.kuaishou.modules.clean.entity.KuaiShouAccountCleanLogInfo" resultMap="logResultMap">
+    select *  from  ctop_kuaishou_account_clean_logs t
+    <where>
+      <if test="accountId!=null and accountId!=''">
+        t.account_id=#{accountId}
+      </if >
+
+      <if test="userName!=null and userName!=''">
+        and t.user_name like concat('%',#{userName},'%')
+      </if >
+    </where>
   </select>
 
-    <select id="getGroupMessage" resultType="String">
 
-        SELECT t.unit_id from ctop_kuaishou_group t LEFT JOIN ctop_kuaishou_report_daily_group t2
-        on t.unit_id=t2.unit_id
-        where t.account_id=#{template.accountId}
-        and t.group_create_time &lt;= #{startDate}
-        and t2.stat_date &gt;= #{startDate}
-        and t.unit_id=#{unitId}
-        <if test='template.promotionGroupStatus!=null and template.promotionGroupStatus!="" and template.promotionGroupStatus!="3"'>
-            and t.put_status=#{template.promotionGroupStatus}
-        </if>
-        group by t.unit_id
-        having sum(t2.charge) &lt;= #{template.charge}
-        <if test='optimizationObjective=="activation"'>
-            /* 激活数*/
-            and sum(t2.activation) &lt; #{template.conversion}
-        </if>
 
 
-        <if test='optimizationObjective=="formSize"'>
-            /*表单数*/
-            and  sum(t2.form_count) &lt; #{template.conversion}
-        </if>
+  <!--根据账户id 运营名称 查询个人模板信息-->
+  <select id="getMyselfTemplateList" resultMap="templateResultMap" >
+    select t.status,t.id,t.template_name,t.applied_media,t2.account_id,t3.auth_name as account_name,t3.account_status,t3.user_name from ctop_kuaishou_account_clean_template t
+    LEFT JOIN ctop_kuaishou_account_clean_center t2 on t.id=t2.template_id
+    LEFT JOIN ctop_user_allocation t3 on t2.account_id=t3.account_id
+    <where>
+        t2.account_id is not null
+      <if test="accountId!=null and accountId!=''">
+        and t2.account_id=#{accountId}
+      </if >
 
-        <if test='optimizationObjective=="pay"'>
-            /*付费数*/
-            and  sum(t2.event_pay) &lt; #{template.conversion}
-        </if>
+      <if test="userName!=null and userName!=''">
+        and t3.user_name like concat('%',#{userName},'%')
+      </if >
+      <if test="createId!=null and createId!=''">
+        and t.create_id=#{createId}
+      </if >
+    </where>
+
+  </select>
 
+  <select id="getTemplateListBystatus" resultMap="templateResultMap">
+       select  t.id,t.template_name,t.clean_time,t.optimization_objective,t.charge,t.conversion,t.promotion_group_status,t.perform_operations,t2.account_id  from ctop_kuaishou_account_clean_template t
+       left join  ctop_kuaishou_account_clean_center t2 on t.id=t2.template_id where t.status='0'
+  </select>
 
-        <if test='optimizationObjective=="evocativeApplication"'>
-            /*唤起应用*/
-            and sum(t2.event_app_invoked) &lt; #{template.conversion}
-        </if>
+  <select id="getGroupMessage" resultType="java.lang.String">
 
-        <if test='optimizationObjective=="registered"'>
-            /*注册*/
-            and sum(t2.event_register) &lt; #{template.conversion}
-        </if>
+      SELECT t.unit_id from ctop_kuaishou_group  t  LEFT JOIN ctop_kuaishou_report_daily_group  t2
+        on t.unit_id=t2.unit_id
+        where t.account_id=#{template.accountId}
+        and t.group_create_time &lt;= #{startDate}
+        and t2.stat_date &gt;= #{startDate}
+       <if test="template.promotionGroupStatus!=null and template.promotionGroupStatus!='' and template.promotionGroupStatus!='3'">
+          and t.put_status=#{template.promotionGroupStatus}
+       </if >
+         group by t.unit_id
+        having sum(t2.charge) &lt;= #{template.charge}
+      <foreach item="item" index="index" collection="list"  open="and (" separator="or" close=")">
+
+          <if test='item=="activation"'>
+              /* 激活数*/
+              sum(t2.activation) &lt; #{template.conversion}
+          </if >
+
+          <if test='item=="bclick"'>
+              /*行为数*/
+              sum(t2.bclick) &lt; #{template.conversion}
+          </if >
+
+          <if test='item=="formSize"'>
+              /*表单数*/
+              sum(t2.form_count) &lt; #{template.conversion}
+          </if >
+
+          <if test='item=="pay"'>
+              /*付费数*/
+              sum(t2.event_pay) &lt; #{template.conversion}
+          </if >
+
+          <if test='item=="roi"'>
+              /*首日roi*/
+              sum(t2.event_pay_first_day_roi) &lt; #{template.conversion}
+          </if >
+
+          <if test='item=="evocativeApplication"'>
+              /*唤起应用*/
+              sum(t2.event_app_invoked) &lt; #{template.conversion}
+          </if >
+
+          <if test='item=="effectiveClues"'>
+              /*落地页有效线索*/
+              sum(t2.event_valid_clues) &lt; #{template.conversion}
+          </if >
+
+          <if test='item=="creditApp"'>
+              /*授信数APP*/
+              sum(t2.event_credit_grant_app) &lt; #{template.conversion}
+          </if >
+
+          <if test='item=="creditGrant"'>
+              /*落地页授信数*/
+              sum(t2.event_credit_grant_landing_page) &lt; #{template.conversion}
+          </if >
+
+          <if test='item=="finishedPieceApp"'>
+              /*完件数App*/
+              sum(t2.event_jin_jian_app) &lt; #{template.conversion}
+          </if >
+
+          <if test='item=="finishedPieceGrant"'>
+              /*落地页完件数*/
+              sum(t2.event_jin_jian_landing_page) &lt; #{template.conversion}
+          </if >
+
+          <if test='item=="registered"'>
+              /*注册*/
+              sum(t2.event_register) &lt; #{template.conversion}
+          </if >
+      </foreach>
 
-    </select>
+  </select>
 
-    <select id="getUserNameByAccountId" resultType="Map">
+  <select id="getUserNameByAccountId" resultType="Map">
        select t.user_name as userName,t.auth_name as authName from ctop_user_allocation t where t.account_id=#{accountId}
   </select>
 
-    <insert id="saveCleamLog">
-    insert into ctop_kuaishou_account_clean_logs (template_id,account_id,create_template_id,user_name,operation_type,create_time,executive_information) values (#{templateId},#{accountId},#{createTemplateId},#{userName},#{operationType},#{createTime},#{executiveInformation})
+  <insert id="saveCleamLog" >
+    insert into ctop_kuaishou_account_clean_logs (account_id,user_name,operation_type,create_time,executive_information) values (#{accountId},#{userName},#{operationType},#{createTime},#{executiveInformation})
   </insert>
-
-    <select id="getUserRealName" resultType="String">
-        select t.realname from sys_user t where t.id=#{userId}
-    </select>
-
-    <select id="getTemplateName" parameterType="String" resultType="int">
-         select count(*) from ctop_kuaishou_account_clean_template t  where t.template_name=#{templateName}
-    </select>
-
-    <select id="getGroupByAccount" resultType="Map">
-        select  t.unit_id as 'unitId',t.ocpx_action_type  as 'type' from ctop_kuaishou_group t  where t.account_id=#{accountId}
-    </select>
 </mapper>

+ 3 - 10
module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/clean/service/KuaiShouAccountCleanService.java

@@ -22,7 +22,7 @@ public interface KuaiShouAccountCleanService {
      * @param templateId 模板id  createUser创建人
      * @return
      */
-    Result getTemplateList(String templateId, String createUser, String userId, String pageNum, String pageSize);
+    Result getTemplateList(String templateId, String createUser,String userId,String pageNum, String pageSize);
     /**
      * 预览模板
      *
@@ -61,10 +61,10 @@ public interface KuaiShouAccountCleanService {
     /**
      * 查询清理记录
      *
-     * @param templateId 模板名称  userId 账户id
+     * @param userName 运营名称  accountId 账户id
      * @return
      */
-    Result getCleanUpLog(String templateId, String userId, String pageNum, String pageSize);
+    Result getCleanUpLog(String userName, String accountId, String pageNum, String pageSize);
     /**
      * 查询个人清理模板列表
      *
@@ -81,11 +81,4 @@ public interface KuaiShouAccountCleanService {
      * @return
      */
     Result cleanAccount();
-    /**
-     * 根据模板名称查询
-     *
-     * @param templateName
-     * @return
-     */
-    Result getTemplateName(String templateName);
 }

+ 68 - 135
module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/clean/service/impl/KuaiShouAccountCleanServiceImpl.java

@@ -11,7 +11,6 @@ import cn.com.ctop.kuaishou.modules.clean.service.KuaiShouAccountCleanService;
 import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageInfo;
 import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.lang3.StringUtils;
 import org.jeecg.common.api.vo.Result;
 import org.jsoup.helper.StringUtil;
 import org.springframework.stereotype.Service;
@@ -19,7 +18,6 @@ import org.springframework.stereotype.Service;
 import javax.annotation.Resource;
 import java.text.SimpleDateFormat;
 import java.util.*;
-import java.util.concurrent.atomic.AtomicInteger;
 import java.util.concurrent.atomic.AtomicReference;
 
 /**
@@ -31,7 +29,6 @@ import java.util.concurrent.atomic.AtomicReference;
 @Service
 @Slf4j
 public class KuaiShouAccountCleanServiceImpl implements KuaiShouAccountCleanService {
-
     @Resource
     KuaishouAccountCleanTemplateMapper kuaishouAccountCleanTemplateMapper;
 
@@ -53,21 +50,18 @@ public class KuaiShouAccountCleanServiceImpl implements KuaiShouAccountCleanServ
     @Override
     public Result createCleanTemplate(KuaiShouAccountCleanTemplateInfo kuaiShouAccountCleanTemplateInfo) {
         Result result = new Result();
-        SimpleDateFormat sd = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        SimpleDateFormat sd = new SimpleDateFormat("yyyy-MM-dd");
         Random rand = new Random();
         int id = 100000 + rand.nextInt(99900000);
-
         //设置6-8位数字
         kuaiShouAccountCleanTemplateInfo.setId(String.valueOf(id));
         //设置应用媒体 固定写死
         kuaiShouAccountCleanTemplateInfo.setAppliedMedia("快手");
         //未绑定账户  设置暂停状态
-        kuaiShouAccountCleanTemplateInfo.setStatus(String.valueOf(0));
+        kuaiShouAccountCleanTemplateInfo.setStatus(String.valueOf(1));
         //设置创建日期
         kuaiShouAccountCleanTemplateInfo.setCreateTime(sd.format(new Date()));
         try {
-            String userRealName = kuaishouAccountCleanTemplateMapper.getUserRealName(kuaiShouAccountCleanTemplateInfo.getCreateId());
-            kuaiShouAccountCleanTemplateInfo.setCreateUser(userRealName);
             kuaishouAccountCleanTemplateMapper.saveAccountCleanTemplate(kuaiShouAccountCleanTemplateInfo);
             result.success("创建模板成功");
         } catch (Exception e) {
@@ -80,11 +74,11 @@ public class KuaiShouAccountCleanServiceImpl implements KuaiShouAccountCleanServ
     /**
      * 查询模板列表
      *
-     * @param templateName 模板名称  createUser创建人
+     * @param templateId 模板id  createUser创建人
      * @return
      */
     @Override
-    public Result getTemplateList(String templateName, String createUser, String userId, String pageNum, String pageSize) {
+    public Result getTemplateList(String templateId, String createUser, String userId, String pageNum, String pageSize) {
         Result result = new Result();
         PageHelper pageHelper = new PageHelper();
         List<KuaiShouAccountCleanTemplateInfo> templateList = new ArrayList<>();
@@ -94,10 +88,10 @@ public class KuaiShouAccountCleanServiceImpl implements KuaiShouAccountCleanServ
             PageHelper.startPage(Integer.parseInt(pageNum), Integer.parseInt(pageSize));
             if (roleCode != null && roleCode.equals("admin")) {
                 //管理员查询全部
-                templateList = kuaishouAccountCleanTemplateMapper.getTemplateList(templateName, createUser, null);
+                templateList = kuaishouAccountCleanTemplateMapper.getTemplateList(templateId, createUser, null);
             } else {
                 //其他角色查询自己拥有的
-                templateList = kuaishouAccountCleanTemplateMapper.getTemplateList(templateName, createUser, userId);
+                templateList = kuaishouAccountCleanTemplateMapper.getTemplateList(templateId, createUser, userId);
             }
             PageInfo pageInfo = new PageInfo(templateList);
             result.success("查询成功");
@@ -168,7 +162,7 @@ public class KuaiShouAccountCleanServiceImpl implements KuaiShouAccountCleanServ
     public Result updateTemplate(KuaiShouAccountCleanTemplateInfo kuaiShouAccountCleanTemplateInfo) {
         Result result = new Result();
         try {
-            if (!StringUtils.isBlank(kuaiShouAccountCleanTemplateInfo.getId())) {
+            if (!StringUtil.isBlank(kuaiShouAccountCleanTemplateInfo.getId())) {
                 kuaishouAccountCleanTemplateMapper.updateTemplate(kuaiShouAccountCleanTemplateInfo);
                 result.success("修改成功");
             } else {
@@ -228,20 +222,11 @@ public class KuaiShouAccountCleanServiceImpl implements KuaiShouAccountCleanServ
     }
 
     @Override
-    public Result getCleanUpLog(String templateId, String userId, String pageNum, String pageSize) {
+    public Result getCleanUpLog(String userName, String accountId, String pageNum, String pageSize) {
         Result result = new Result();
-        List<KuaiShouAccountCleanLogInfo> cleanUpLog = new ArrayList<>();
         try {
-            //查询当前登录人角色
-            String roleCode = sysRoleService.getRoleCodeByUserId(userId);
-            PageHelper.startPage(Integer.parseInt(pageNum), Integer.parseInt(pageSize));
-            if (roleCode != null && roleCode.equals("admin")) {
-                cleanUpLog = kuaishouAccountCleanTemplateMapper.getCleanUpLog(templateId, null);
-            } else {
-                cleanUpLog = kuaishouAccountCleanTemplateMapper.getCleanUpLog(templateId, userId);
-            }
             PageHelper.startPage(Integer.parseInt(pageNum), Integer.parseInt(pageSize));
-
+            List<KuaiShouAccountCleanLogInfo> cleanUpLog = kuaishouAccountCleanTemplateMapper.getCleanUpLog(userName, accountId);
             PageInfo pageInfo = new PageInfo(cleanUpLog);
             result.success("查询成功");
             result.setResult(pageInfo);
@@ -294,133 +279,81 @@ public class KuaiShouAccountCleanServiceImpl implements KuaiShouAccountCleanServ
     public Result cleanAccount() {
         Result result = new Result();
         SimpleDateFormat sd = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
-        Map optimizationObjectiveMap = new HashMap();
-        //优化目标 activation:激活数 bclick:行为数  formSize :表单数 pay:付费  roi:首日roi   evocativeApplication:唤起应用
-        // effectiveClues:有效线索 creditApp:授信-APP creditGrant:授信-落地页  finishedPieceApp:完件数-APP  finishedPieceGrant:完件数-落地页  registered:注册
-        optimizationObjectiveMap.put("180", "activation");
-        optimizationObjectiveMap.put("53", "formSize");
-        optimizationObjectiveMap.put("190", "pay");
-        optimizationObjectiveMap.put("324", "evocativeApplication");
-        optimizationObjectiveMap.put("396", "registered");
         try {
             //查询需要执行的规则模板
             List<KuaiShouAccountCleanTemplateInfo> templateListBystatus = kuaishouAccountCleanTemplateMapper.getTemplateListBystatus();
             if (!templateListBystatus.isEmpty()) {
                 templateListBystatus.stream().forEach(ob -> {
-                    AtomicInteger count= new AtomicInteger();
-                    if (ob.getAccountId() != null) {
-                        StringBuilder unitIds = new StringBuilder();
-                        //获取各项优化目标
-                        List<String> optimizationObjectiveList = Arrays.asList(ob.getOptimizationObjective().split(","));
-                        //获取清理时间范围
-                        String cleanTime = ob.getCleanTime();
-                        //计算最早清理时间
-                        Calendar calendar = Calendar.getInstance();//此时打印它获取的是系统当前时间
-                        calendar.add(Calendar.DATE, -Integer.parseInt(cleanTime));
-                        String startDate = new SimpleDateFormat("yyyy-MM-dd").format(calendar.getTime());
-                        AtomicReference<Boolean> falg = new AtomicReference<>(true);
-                        //查询改账户下所有组
-                        List<Map> groupByAccount = kuaishouAccountCleanTemplateMapper.getGroupByAccount(ob.getAccountId());
-                        if (!groupByAccount.isEmpty()) {
-                            groupByAccount.stream().forEach(obj -> {
-                                if (obj.get("unitId") != null && obj.get("type") != null) {
-                                    String unitId = Long.toString((Long) obj.get("unitId")) ;
-                                    //OCPM
-                                    String type = Integer.toString((Integer) obj.get("type")) ;
-                                    if(optimizationObjectiveMap.get(type)!=null){
-                                        String optimizationObjective= (String) optimizationObjectiveMap.get(type);
-                                        //查询组是否符合清理规则
-                                        String groupMessage = kuaishouAccountCleanTemplateMapper.getGroupMessage(ob, optimizationObjective, startDate,unitId);
-                                        if(groupMessage!=null){
-                                            count.getAndIncrement();
-                                            //符合清理规则清理
-                                            //获取Token
-                                            CtopOauthToken ctopOauthToken = ctopOauthTokenMapper.selectByAccountId(Long.parseLong(ob.getAccountId()));
-                                            if (ctopOauthToken != null) {
-                                                //修改广告组状态
-                                                Map<String, Object> resultMap = iKuaiShouUpdateService.updateUnitStatus(ctopOauthToken.getAccessToken(), Long.parseLong(ob.getAccountId()), Long.parseLong(unitId), Integer.parseInt(ob.getPerformOperations()), null);
-                                                Boolean resultFlag = (Boolean) resultMap.get("success");
-                                                //判断有没有失败
-                                                if (resultFlag) {
-                                                    //清理成功
-                                                    unitIds.append(unitId).append(",");
-                                                    log.info("组"+unitId+"已被清理");
-                                                }else {
-                                                    //清理失败
-                                                    log.info("组"+unitId+"清理失败:{}",resultMap.get("message"));
-                                                    falg.set(false);
-                                                }
-                                            }
-                                        }
-                                    }
-
+                    //获取各项优化目标
+                    List<String> optimizationObjectiveList = Arrays.asList(ob.getOptimizationObjective().split(";"));
+                    //获取清理时间范围
+                    String cleanTime = ob.getCleanTime();
+                    //计算最早清理时间
+                    Calendar calendar = Calendar.getInstance();//此时打印它获取的是系统当前时间
+                    calendar.add(Calendar.DATE, -Integer.parseInt(cleanTime));
+                    String startDate = new SimpleDateFormat("yyyy-MM-dd").format(calendar.getTime());
+                    //查询符合模板规则的组
+                    List<String> groupMessage = kuaishouAccountCleanTemplateMapper.getGroupMessage(ob, optimizationObjectiveList, startDate);
+                    AtomicReference<Boolean> falg = new AtomicReference<>(true);
+                    if (!groupMessage.isEmpty()) {
+                        //获取Token
+                        CtopOauthToken ctopOauthToken = ctopOauthTokenMapper.selectByAccountId(Long.parseLong(ob.getAccountId()));
+                        if (ctopOauthToken != null) {
+                            groupMessage.stream().forEach(item -> {
+                                //修改广告组状态
+                                Map<String, Object> resultMap = iKuaiShouUpdateService.updateUnitStatus(ctopOauthToken.getAccessToken(), Long.parseLong(ob.getAccountId()), Long.parseLong(item), Integer.parseInt(ob.getPerformOperations()), null);
+                                Boolean resultFlag = (Boolean) resultMap.get("success");
+                                //判断有没有失败
+                                if (!resultFlag) {
+                                    falg.set(false);
                                 }
                             });
-                        }
-
 
-                        if (count.get()>0 && falg.get()) {
-                            //修改成功插入日志记录
-                            KuaiShouAccountCleanLogInfo kuaiShouAccountCleanLogInfo = new KuaiShouAccountCleanLogInfo();
-                            //设置账户id
-                            kuaiShouAccountCleanLogInfo.setAccountId(ob.getAccountId());
-                            // 1-投放、2-暂停、3-删除
-                            kuaiShouAccountCleanLogInfo.setOperationType(ob.getPerformOperations());
-                            //设置运营
-//                            Map<String, String> map = kuaishouAccountCleanTemplateMapper.getUserNameByAccountId(ob.getAccountId());
-//                            String authName = "";
-//                            if (map != null) {
-//                                kuaiShouAccountCleanLogInfo.setUserName(map.get("userName"));
-//                                authName = map.get("authName");
-//                            }
-                            //设置时间
-                            kuaiShouAccountCleanLogInfo.setCreateTime(sd.format(new Date()));
-                            //操作类型
-                            String operationType = null;
-                            if (ob.getPerformOperations().equals("2")) {
-                                operationType = "暂停";
-                            }
-                            if (ob.getPerformOperations().equals("3")) {
-                                operationType = "删除";
-                            }
-                            //执行信息
-                            String textMessage = "清理规则执行:  账户:" + ob.getAccountId() + ", 授权名称: " + ob.getCreateUser() + ",推广组:" + unitIds + "已经被清理规则" + operationType;
-                            kuaiShouAccountCleanLogInfo.setExecutiveInformation(textMessage);
-                            kuaiShouAccountCleanLogInfo.setTemplateId(ob.getId());
-                            kuaiShouAccountCleanLogInfo.setCreateTemplateId(ob.getCreateId());
-                            kuaiShouAccountCleanLogInfo.setUserName(ob.getCreateUser());
-                            kuaishouAccountCleanTemplateMapper.saveCleamLog(kuaiShouAccountCleanLogInfo);
                         }
                     }
+                    if (!groupMessage.isEmpty() && falg.get()) {
+                        //修改成功插入日志记录
+                        KuaiShouAccountCleanLogInfo kuaiShouAccountCleanLogInfo = new KuaiShouAccountCleanLogInfo();
+                        //设置账户id
+                        kuaiShouAccountCleanLogInfo.setAccountId(ob.getAccountId());
+                        // 1-投放、2-暂停、3-删除
+                        kuaiShouAccountCleanLogInfo.setOperationType(ob.getPerformOperations());
+                        //设置运营
+                        Map<String, String> map = kuaishouAccountCleanTemplateMapper.getUserNameByAccountId(ob.getAccountId());
+                        String authName = "";
+                        if (map != null) {
+                            kuaiShouAccountCleanLogInfo.setUserName(map.get("userName"));
+                            authName = map.get("authName");
+                        }
+                        //设置时间
+                        kuaiShouAccountCleanLogInfo.setCreateTime(sd.format(new Date()));
+                        StringBuilder unitIds = new StringBuilder();
+                        groupMessage.stream().forEach(unid -> {
+                            unitIds.append(unid).append(",");
+                        });
+                        //操作类型
+                        String operationType = null;
+                        if (ob.getPerformOperations().equals("2")) {
+                            operationType = "暂停";
+                        }
+                        if (ob.getPerformOperations().equals("3")) {
+                            operationType = "删除";
+                        }
+                        //执行信息
+                        String textMessage = "清理规则执行:  账户:" + ob.getAccountId() + ", 授权名称: " + authName + ",推广组:" + unitIds + "已经被清理规则" + operationType;
+                        kuaiShouAccountCleanLogInfo.setExecutiveInformation(textMessage);
+                        kuaishouAccountCleanTemplateMapper.saveCleamLog(kuaiShouAccountCleanLogInfo);
+                    }
+
                 });
             }
 
-            result.success("执行计划成功");
+            result.success("修改成功");
         } catch (Exception e) {
-            log.info("执行计划失败:{}", e.toString());
-            result.error500("执行计划失败");
-        }
-        return result;
-    }
-
-    /**
-     * 根据模板名称查询
-     *
-     * @param templateName
-     * @return
-     */
-    @Override
-    public Result getTemplateName(String templateName) {
-        Result result = new Result();
-        try {
-            int number = kuaishouAccountCleanTemplateMapper.getTemplateName(templateName.trim());
-            result.setResult(number);
-        } catch (Exception e) {
-            log.info("查询失败:{}", e.toString());
-            result.error500("查询失败");
+            log.info("修改失败:{}", e.toString());
+            result.error500("修改失败");
         }
         return result;
     }
 
-
 }

+ 30 - 0
module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/label/controller/LbelController.java

@@ -0,0 +1,30 @@
+package cn.com.ctop.kuaishou.modules.label.controller;
+
+import cn.com.ctop.kuaishou.modules.clean.entity.KuaiShouAccountCleanTemplateInfo;
+import org.jeecg.common.api.vo.Result;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * @Description: 标签管理
+ * @Author: zzy
+ * @Date: 2021-07-30
+ * @Version: V1.0
+ */
+@RestController
+@RequestMapping("/label")
+public class LbelController {
+
+    /**
+     * 查询标签
+     *
+     * @param kuaiShouAccountCleanTemplateInfo
+     * @return
+     */
+    @PostMapping("/createTemplate")
+    public Result createCleanTemplate(@RequestBody KuaiShouAccountCleanTemplateInfo kuaiShouAccountCleanTemplateInfo){
+        return   null;
+    }
+}

+ 25 - 0
module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/label/mapper/MaterialLabelMapper.java

@@ -0,0 +1,25 @@
+package cn.com.ctop.kuaishou.modules.label.mapper;
+
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * @Description: 素材标签
+ * @Author: zzy
+ * @Date: 2021-07-30
+ * @Version: V1.0
+ */
+@Mapper
+public interface MaterialLabelMapper {
+    /**
+     * 查询所有素材
+     */
+    List<String> getMateriaSignature();
+
+    /**
+     * 获取素材产生消耗的最早日期
+     */
+    String getMaterialFirstDate(@Param("signature")String signature);
+}

+ 25 - 0
module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/label/mapper/xml/MaterialTagMapper.xml

@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="cn.com.ctop.kuaishou.modules.label.mapper.MaterialLabelMapper">
+
+
+  <resultMap id="logResultMap" type="cn.com.ctop.kuaishou.modules.clean.entity.KuaiShouAccountCleanLogInfo">
+    <id column="id" property="id"/>
+    <result column="account_id" property="accountId"/>
+    <result column="user_name" property="userName"/>
+    <result column="operation_type" property="operationType"/>
+    <result column="create_time" property="createTime"/>
+    <result column="executive_information" property="executiveInformation"/>
+  </resultMap>
+
+    <select id="getMateriaSignature" resultType="String">
+        SELECT  signature from ctop_etl_kuaishou_video_base_info t  GROUP BY t.signature
+    </select>
+
+
+    <select id="getMaterialFirstDate" parameterType="String" resultType="String">
+        SELECT  MIN(stat_date) from ctop_kuaishou_report_daily_material t where t.charge>0 and  t.signature=#{signature}
+    </select>
+
+
+</mapper>

+ 14 - 0
module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/label/service/MaterialTagService.java

@@ -0,0 +1,14 @@
+package cn.com.ctop.kuaishou.modules.label.service;
+
+import org.jeecg.common.api.vo.Result;
+
+/**
+ * @Description: 素材标签
+ * @Author: zzy
+ * @Date: 2021-07-30
+ * @Version: V1.0
+ */
+public interface MaterialTagService {
+
+    public Result filterMaterial ();
+}

+ 80 - 0
module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/label/service/impl/MaterialTagServiceImpl.java

@@ -0,0 +1,80 @@
+package cn.com.ctop.kuaishou.modules.label.service.impl;
+
+import cn.com.ctop.kuaishou.modules.label.mapper.MaterialLabelMapper;
+import cn.com.ctop.kuaishou.modules.label.service.MaterialTagService;
+import lombok.extern.slf4j.Slf4j;
+import org.jeecg.common.api.vo.Result;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.List;
+
+/**
+ * @Description: 素材标签
+ * @Author: zzy
+ * @Date: 2021-07-30
+ * @Version: V1.0
+ */
+@Service
+@Slf4j
+public class MaterialTagServiceImpl implements MaterialTagService {
+
+
+    @Resource
+    MaterialLabelMapper materialLabelMapper;
+
+
+    /**
+     * 清洗各素材指标入库
+     *
+     * @param
+     * @return
+     */
+    @Override
+    public Result filterMaterial() {
+
+        try {
+            //查询所有素材标签
+            List<String> materiaSignature = materialLabelMapper.getMateriaSignature();
+            if(!materiaSignature.isEmpty()){
+                materiaSignature.stream().forEach(str->{
+                    if(!str.isEmpty()){
+                        //获取素材产生消耗的最早日期
+                        String materialFirstDate = materialLabelMapper.getMaterialFirstDate(str);
+                        //获取30天之后的日期
+                        String afterDate = getDateByNumber(materialFirstDate, -30);
+                        //查询素材各项指标入库
+                        
+                    }
+
+                });
+            }
+        }catch (Exception e){
+
+        }
+
+
+        return null;
+    }
+    /**
+     * 获取指定日期number天之后之前的日期
+     *
+     * @param
+     * @return
+     */
+    public String getDateByNumber(String date,int number){
+        Calendar calc = Calendar.getInstance();
+        SimpleDateFormat sdf  = new SimpleDateFormat("yyyy-MM-dd");
+        String AfterDate=null;
+        try {
+            calc.setTime(sdf.parse(date));
+            calc.add(calc.DATE, number);
+            AfterDate=sdf.format(calc.getTime());
+        }catch (Exception e){
+            log.info("获取日期失败:{}",e.toString());
+        }
+        return AfterDate;
+    }
+}

+ 4 - 0
module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/report/entity/KuaishouAudienceReportDaily.java

@@ -761,4 +761,8 @@ public class KuaishouAudienceReportDaily {
     @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     @ApiModelProperty(value = "修改时间")
     private java.util.Date updateTime;
+
+    private String signature;
+
+    private Long projectId;
 }

+ 16 - 0
module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/report/entity/NewMonitorInfo.java

@@ -0,0 +1,16 @@
+package cn.com.ctop.kuaishou.modules.report.entity;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class NewMonitorInfo {
+    private String user_id;
+
+    private String user_name;
+
+    private String parent_id;
+
+    private List<NewMonitorInfo> children;
+}

+ 2 - 0
module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/report/mapper/KuaishouAudienceReportDailyAgeMapper.java

@@ -16,4 +16,6 @@ import java.util.List;
 public interface KuaishouAudienceReportDailyAgeMapper extends BaseMapper<KuaishouAudienceReportDailyAge> {
 
     void replaceBatch(@Param(value = "data") List<KuaishouAudienceReportDailyAge> data);
+
+    void replaceBatchNew(@Param(value = "data") List<KuaishouAudienceReportDailyAge> data);
 }

+ 2 - 0
module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/report/mapper/KuaishouAudienceReportDailyBusinessMapper.java

@@ -16,4 +16,6 @@ import java.util.List;
 public interface KuaishouAudienceReportDailyBusinessMapper extends BaseMapper<KuaishouAudienceReportDailyBusiness> {
 
     void replaceBatch(@Param(value = "data") List<KuaishouAudienceReportDailyBusiness> data);
+
+    void replaceBatchNew(@Param(value = "data") List<KuaishouAudienceReportDailyBusiness> data);
 }

+ 2 - 0
module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/report/mapper/KuaishouAudienceReportDailyCityMapper.java

@@ -16,4 +16,6 @@ import java.util.List;
 public interface KuaishouAudienceReportDailyCityMapper extends BaseMapper<KuaishouAudienceReportDailyCity> {
 
     void replaceBatch(@Param(value = "data") List<KuaishouAudienceReportDailyCity> data);
+
+    void replaceBatchNew(@Param(value = "data") List<KuaishouAudienceReportDailyCity> data);
 }

+ 2 - 0
module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/report/mapper/KuaishouAudienceReportDailyClientMapper.java

@@ -16,4 +16,6 @@ import java.util.List;
 public interface KuaishouAudienceReportDailyClientMapper extends BaseMapper<KuaishouAudienceReportDailyClient> {
 
     void replaceBatch(@Param(value = "data") List<KuaishouAudienceReportDailyClient> data);
+
+    void replaceBatchNew(@Param(value = "data") List<KuaishouAudienceReportDailyClient> data);
 }

+ 2 - 0
module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/report/mapper/KuaishouAudienceReportDailyGenderMapper.java

@@ -15,4 +15,6 @@ import java.util.List;
  */
 public interface KuaishouAudienceReportDailyGenderMapper extends BaseMapper<KuaishouAudienceReportDailyGender> {
     void replaceBatch(@Param(value = "data") List<KuaishouAudienceReportDailyGender> data);
+
+    void replaceBatchNew(@Param(value = "data") List<KuaishouAudienceReportDailyGender> data);
 }

+ 2 - 0
module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/report/mapper/KuaishouAudienceReportDailyProvinceMapper.java

@@ -16,4 +16,6 @@ import java.util.List;
 public interface KuaishouAudienceReportDailyProvinceMapper extends BaseMapper<KuaishouAudienceReportDailyProvince> {
 
     void replaceBatch(@Param(value = "data") List<KuaishouAudienceReportDailyProvince> data);
+
+    void replaceBatchNew(@Param(value = "data") List<KuaishouAudienceReportDailyProvince> data);
 }

+ 55 - 0
module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/report/mapper/NewMonitorMapper.java

@@ -0,0 +1,55 @@
+package cn.com.ctop.kuaishou.modules.report.mapper;
+
+import cn.com.ctop.kuaishou.modules.report.entity.NewMonitorInfo;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.Map;
+
+@Mapper
+public interface NewMonitorMapper {
+
+    List<Long> getAllAccountId();
+
+    List<Map> getKuaiShouGroup(@Param("date") String date, @Param("accountId") String accountId);
+
+    List<Map> getKuaiShouCampaign(@Param("date") String date, @Param("accountId") String accountId);
+
+    List<Map> getTouTiaoCampaign(@Param("date") String date, @Param("accountId") String accountId);
+
+    BigDecimal getGroupCharge(@Param("unitId") String unitId, @Param("afterDate") String afterDate);
+
+    BigDecimal getCampaignCharge(@Param("campaignId") String campaignId, @Param("afterDate") String afterDate);
+
+    BigDecimal getCampaignChargeTouTiao(@Param("campaignId") String campaignId, @Param("afterDate") String afterDate);
+
+    void saveMonitorGroup(@Param("accountId") String accountId, @Param("accountName") String accountName, @Param("operatingName") String operatingName, @Param("unitId") String unitId, @Param("createTime") String createTime, @Param("projectType") String projectType, @Param("effective") String effective);
+
+    void saveMonitorCampaign(@Param("accountId") String accountId, @Param("accountName") String accountName, @Param("operatingName") String operatingName, @Param("campaignId") String campaignId, @Param("createTime") String createTime, @Param("projectType") String projectType, @Param("effective") String effective);
+
+    String getMonitorGroupByUnitId(@Param("unitId") String unitId);
+
+    String getMonitorPlanByCampaignId(@Param("campaignId") String campaignId);
+
+    void updateMonitorGroupByUnitId(@Param("unitId") String unitId, @Param("effective") String effective);
+
+    void updateMonitorPlanByCampaignId(@Param("campaignId") String campaignId, @Param("effective") String effective);
+
+    List<JSONObject> getKuaiShouGroupMessage(@Param("array") JSONArray array, @Param("startDate") String startDate, @Param("endDate") String endDate);
+
+    JSONObject getKuaiShouGroupSum(@Param("array") JSONArray array, @Param("startDate") String startDate, @Param("endDate") String endDate);
+
+    List<JSONObject> getKuaiShouGroupMessageGroup(@Param("array") JSONArray array, @Param("startDate") String startDate, @Param("endDate") String endDate, @Param("group") String group);
+
+    List<JSONObject> getPlanMessage(@Param("array") JSONArray array, @Param("startDate") String startDate, @Param("endDate") String endDate, @Param("project") String project);
+
+    JSONObject getPlanSum(@Param("array") JSONArray array, @Param("startDate") String startDate, @Param("endDate") String endDate, @Param("project") String project);
+
+    List<JSONObject> getPlanMessageGroup(@Param("array") JSONArray array, @Param("startDate") String startDate, @Param("endDate") String endDate, @Param("group") String group, @Param("project") String project);
+
+    List<NewMonitorInfo> getOperator(@Param("userId") String userId);
+}

+ 2 - 2
module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/report/mapper/xml/EtlKuaishouAccountMaterialReportDailyMapper.xml

@@ -233,11 +233,11 @@
             and uc.company_name is not null
             and (video.company_name is null or video.company_name = '')
     </update>
-    <update id="etlKuaishouVideoTypeZz">
+    <update id="etlKuaishouVideoTypeZr">
         update ctop_material_tag_info cmti left join ctop_etl_kuaishou_video_info cbvei on cmti.code = cbvei.video_code
             set cbvei.video_type = #{videoType} where cmti.tag_code like 'Z01%' and cbvei.video_type is null
     </update>
-    <update id="etlKuaishouVideoTypeZr">
+    <update id="etlKuaishouVideoTypeZz">
         update ctop_material_tag_info cmti left join ctop_etl_kuaishou_video_info cbvei on cmti.code = cbvei.video_code
             set cbvei.video_type = #{videoType} where cmti.tag_code like 'Z02%' and cbvei.video_type is null
     </update>

+ 253 - 3
module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/report/mapper/xml/KuaishouAudienceReportDailyAgeMapper.xml

@@ -3,6 +3,253 @@
 <mapper namespace="cn.com.ctop.kuaishou.modules.report.mapper.KuaishouAudienceReportDailyAgeMapper">
 
     <insert id="replaceBatch">
+    replace into ctop_kuaishou_audience_report_daily_age (
+    account_id,
+    plan_id ,
+    unit_id ,
+    placement_type,
+    stat_date ,
+    aclick ,
+    bclick ,
+    photo_click_cost,
+    follow ,
+    cancel_follow ,
+    report ,
+    block ,
+    negative ,
+    download_started ,
+    download_completed ,
+    activation ,
+    submit ,
+    photo_click ,
+    photo_click_ratio,
+    charge ,
+    action_ratio ,
+    impression_1k_cost,
+    action_cost ,
+    event_pay_first_day ,
+    event_pay_purchase_amount_first_day,
+    event_pay_first_day_roi,
+    event_pay ,
+    event_pay_purchase_amount ,
+    event_pay_roi ,
+    event_register ,
+    event_register_cost ,
+    event_register_ratio ,
+    event_jin_jian_app ,
+    event_jin_jian_app_cost ,
+    event_credit_grant_app ,
+    event_credit_grant_app_cost,
+    event_order_paid ,
+    event_order_paid_purchase_amount,
+    event_jin_jian_landing_page ,
+    event_jin_jian_landing_page_cost ,
+    event_credit_grant_landing_page ,
+    event_credit_grant_landing_page_cost,
+    event_credit_grant_landing_ratio ,
+    event_next_day_stay_cost ,
+    event_next_day_stay_ratio ,
+    form_action_ratio ,
+    event_order_paid_cost ,
+    event_next_day_stay ,
+    form_cost ,
+    form_count ,
+    play_3s_ratio ,
+    stat_hour ,
+    click_1k_cost ,
+    event_valid_clues ,
+    event_valid_clues_cost,
+    ad_product_cnt ,
+    event_goods_view ,
+    merchant_reco_fans ,
+    event_order_amount_roi ,
+    event_new_user_pay ,
+    event_new_user_pay_cost ,
+    event_new_user_pay_ratio ,
+    event_button_click ,
+    event_button_click_cost ,
+    event_button_click_ratio ,
+    play_5s_ratio ,
+    play_end_ratio ,
+    event_order_paid_roi,
+    event_new_user_jinjian_app ,
+    event_new_user_jinjian_app_cost,
+    event_new_user_jinjian_app_roi ,
+    event_new_user_credit_grant_app ,
+    event_new_user_credit_grant_app_cost,
+    event_new_user_credit_grant_app_roi ,
+    event_new_user_jinjian_page ,
+    event_new_user_jinjian_page_cost ,
+    event_new_user_jinjian_page_roi ,
+    event_new_user_credit_grant_page ,
+    event_new_user_credit_grant_page_cost ,
+    event_new_user_credit_grant_page_roi ,
+    event_appoint_form ,
+    event_appoint_form_cost,
+    event_appoint_form_ratio,
+    event_appoint_jump_click ,
+    event_appoint_jump_click_cost,
+    event_appoint_jump_click_ratio,
+    union_event_pay_purchase_amount_7d ,
+    province ,
+    event_app_invoked ,
+    union_event_pay_purchase_amount_7d_roi,
+    event_add_shopping_cart_cost ,
+    gender ,
+    city ,
+    event_ad_watch_times_ratio ,
+    shares ,
+    business_interest_tags ,
+    event_watch_app_ad ,
+    event_multi_conversion_cost,
+    merchant_reco_fans_cost ,
+    ad_scene ,
+    event_ad_watch_times_cost ,
+    event_add_shopping_cart ,
+    age_segment ,
+    photo_like ,
+    event_add_wechat ,
+    event_add_wechat_cost,
+    event_add_wechat_ratio,
+    event_app_invoked_cost ,
+    event_multi_conversion ,
+    event_dsp_gift_form ,
+    event_app_invoked_ratio ,
+    photo_show ,
+    event_multi_conversion_ratio,
+    client ,
+    event_goods_view_cost ,
+    event_credit_grant_app_ratio,
+    event_ad_watch_times ,
+    comments
+    )
+    values
+    <foreach collection="data" item="da" separator=",">
+        (
+        #{da.accountId},
+        #{da.planId},
+        #{da.unitId},
+        #{da.placementType},
+        #{da.statDate},
+        #{da.aclick},
+        #{da.bclick},
+        #{da.photoClickCost},
+        #{da.follow},
+        #{da.cancelFollow},
+        #{da.report},
+        #{da.block},
+        #{da.negative},
+        #{da.downloadStarted},
+        #{da.downloadCompleted},
+        #{da.activation},
+        #{da.submit},
+        #{da.photoClick},
+        #{da.photoClickRatio},
+        #{da.charge},
+        #{da.actionRatio},
+        #{da.impression_1kCost},
+        #{da.actionCost},
+        #{da.eventPayFirstDay},
+        #{da.eventPayPurchaseAmountFirstDay},
+        #{da.eventPayFirstDayRoi},
+        #{da.eventPay},
+        #{da.eventPayPurchaseAmount},
+        #{da.eventPayRoi},
+        #{da.eventRegister},
+        #{da.eventRegisterCost},
+        #{da.eventRegisterRatio},
+        #{da.eventJinJianApp},
+        #{da.eventJinJianAppCost},
+        #{da.eventCreditGrantApp},
+        #{da.eventCreditGrantAppCost},
+        #{da.eventOrderPaid},
+        #{da.eventOrderPaidPurchaseAmount},
+        #{da.eventJinJianLandingPage},
+        #{da.eventJinJianLandingPageCost},
+        #{da.eventCreditGrantLandingPage},
+        #{da.eventCreditGrantLandingPageCost},
+        #{da.eventCreditGrantLandingRatio},
+        #{da.eventNextDayStayCost},
+        #{da.eventNextDayStayRatio},
+        #{da.formActionRatio},
+        #{da.eventOrderPaidCost},
+        #{da.eventNextDayStay},
+        #{da.formCost},
+        #{da.formCount},
+        #{da.play_3sRatio},
+        #{da.statHour},
+        #{da.click_1kCost},
+        #{da.eventValidClues},
+        #{da.eventValidCluesCost},
+        #{da.adProductCnt},
+        #{da.eventGoodsView},
+        #{da.merchantRecoFans},
+        #{da.eventOrderAmountRoi},
+        #{da.eventNewUserPay},
+        #{da.eventNewUserPayCost},
+        #{da.eventNewUserPayRatio},
+        #{da.eventButtonClick},
+        #{da.eventButtonClickCost},
+        #{da.eventButtonClickRatio},
+        #{da.play_5sRatio},
+        #{da.playEndRatio},
+        #{da.eventOrderPaidRoi},
+        #{da.eventNewUserJinjianApp},
+        #{da.eventNewUserJinjianAppCost},
+        #{da.eventNewUserJinjianAppRoi},
+        #{da.eventNewUserCreditGrantApp},
+        #{da.eventNewUserCreditGrantAppCost},
+        #{da.eventNewUserCreditGrantAppRoi},
+        #{da.eventNewUserJinjianPage},
+        #{da.eventNewUserJinjianPageCost},
+        #{da.eventNewUserJinjianPageRoi},
+        #{da.eventNewUserCreditGrantPage},
+        #{da.eventNewUserCreditGrantPageCost},
+        #{da.eventNewUserCreditGrantPageRoi},
+        #{da.eventAppointForm},
+        #{da.eventAppointFormCost},
+        #{da.eventAppointFormRatio},
+        #{da.eventAppointJumpClick},
+        #{da.eventAppointJumpClickCost},
+        #{da.eventAppointJumpClickRatio},
+        #{da.unionEventPayPurchaseAmount_7d},
+        #{da.province},
+        #{da.eventAppInvoked},
+        #{da.unionEventPayPurchaseAmount_7dRoi},
+        #{da.eventAddShoppingCartCost},
+        #{da.gender},
+        #{da.city},
+        #{da.eventAdWatchTimesRatio},
+        #{da.shares},
+        #{da.businessInterestTags},
+        #{da.eventWatchAppAd},
+        #{da.eventMultiConversionCost},
+        #{da.merchantRecoFansCost},
+        #{da.adScene},
+        #{da.eventAdWatchTimesCost},
+        #{da.eventAddShoppingCart},
+        #{da.ageSegment},
+        #{da.photoLike},
+        #{da.eventAddWechat},
+        #{da.eventAddWechatCost},
+        #{da.eventAddWechatRatio},
+        #{da.eventAppInvokedCost},
+        #{da.eventMultiConversion},
+        #{da.eventDspGiftForm},
+        #{da.eventAppInvokedRatio},
+        #{da.photoShow},
+        #{da.eventMultiConversionRatio},
+        #{da.client},
+        #{da.eventGoodsViewCost},
+        #{da.eventCreditGrantAppRatio},
+        #{da.eventAdWatchTimes},
+        #{da.comments}
+        )
+    </foreach>
+</insert>
+
+
+    <insert id="replaceBatchNew">
         replace into ctop_kuaishou_audience_report_daily_age (
         account_id,
         plan_id ,
@@ -121,7 +368,9 @@
         event_goods_view_cost ,
         event_credit_grant_app_ratio,
         event_ad_watch_times ,
-        comments
+        comments,
+        signature,
+        project_id
         )
         values
         <foreach collection="data" item="da" separator=",">
@@ -243,9 +492,10 @@
             #{da.eventGoodsViewCost},
             #{da.eventCreditGrantAppRatio},
             #{da.eventAdWatchTimes},
-            #{da.comments}
+            #{da.comments},
+            #{da.signature},
+            #{da.projectId}
             )
         </foreach>
     </insert>
-
 </mapper>

+ 250 - 0
module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/report/mapper/xml/KuaishouAudienceReportDailyBusinessMapper.xml

@@ -248,4 +248,254 @@
         </foreach>
     </insert>
 
+    <insert id="replaceBatchNew">
+        replace into ctop_kuaishou_audience_report_daily_business (
+        account_id,
+        plan_id ,
+        unit_id ,
+        placement_type,
+        stat_date ,
+        aclick ,
+        bclick ,
+        photo_click_cost,
+        follow ,
+        cancel_follow ,
+        report ,
+        block ,
+        negative ,
+        download_started ,
+        download_completed ,
+        activation ,
+        submit ,
+        photo_click ,
+        photo_click_ratio,
+        charge ,
+        action_ratio ,
+        impression_1k_cost,
+        action_cost ,
+        event_pay_first_day ,
+        event_pay_purchase_amount_first_day,
+        event_pay_first_day_roi,
+        event_pay ,
+        event_pay_purchase_amount ,
+        event_pay_roi ,
+        event_register ,
+        event_register_cost ,
+        event_register_ratio ,
+        event_jin_jian_app ,
+        event_jin_jian_app_cost ,
+        event_credit_grant_app ,
+        event_credit_grant_app_cost,
+        event_order_paid ,
+        event_order_paid_purchase_amount,
+        event_jin_jian_landing_page ,
+        event_jin_jian_landing_page_cost ,
+        event_credit_grant_landing_page ,
+        event_credit_grant_landing_page_cost,
+        event_credit_grant_landing_ratio ,
+        event_next_day_stay_cost ,
+        event_next_day_stay_ratio ,
+        form_action_ratio ,
+        event_order_paid_cost ,
+        event_next_day_stay ,
+        form_cost ,
+        form_count ,
+        play_3s_ratio ,
+        stat_hour ,
+        click_1k_cost ,
+        event_valid_clues ,
+        event_valid_clues_cost,
+        ad_product_cnt ,
+        event_goods_view ,
+        merchant_reco_fans ,
+        event_order_amount_roi ,
+        event_new_user_pay ,
+        event_new_user_pay_cost ,
+        event_new_user_pay_ratio ,
+        event_button_click ,
+        event_button_click_cost ,
+        event_button_click_ratio ,
+        play_5s_ratio ,
+        play_end_ratio ,
+        event_order_paid_roi,
+        event_new_user_jinjian_app ,
+        event_new_user_jinjian_app_cost,
+        event_new_user_jinjian_app_roi ,
+        event_new_user_credit_grant_app ,
+        event_new_user_credit_grant_app_cost,
+        event_new_user_credit_grant_app_roi ,
+        event_new_user_jinjian_page ,
+        event_new_user_jinjian_page_cost ,
+        event_new_user_jinjian_page_roi ,
+        event_new_user_credit_grant_page ,
+        event_new_user_credit_grant_page_cost ,
+        event_new_user_credit_grant_page_roi ,
+        event_appoint_form ,
+        event_appoint_form_cost,
+        event_appoint_form_ratio,
+        event_appoint_jump_click ,
+        event_appoint_jump_click_cost,
+        event_appoint_jump_click_ratio,
+        union_event_pay_purchase_amount_7d ,
+        province ,
+        event_app_invoked ,
+        union_event_pay_purchase_amount_7d_roi,
+        event_add_shopping_cart_cost ,
+        gender ,
+        city ,
+        event_ad_watch_times_ratio ,
+        shares ,
+        business_interest_tags ,
+        event_watch_app_ad ,
+        event_multi_conversion_cost,
+        merchant_reco_fans_cost ,
+        ad_scene ,
+        event_ad_watch_times_cost ,
+        event_add_shopping_cart ,
+        age_segment ,
+        photo_like ,
+        event_add_wechat ,
+        event_add_wechat_cost,
+        event_add_wechat_ratio,
+        event_app_invoked_cost ,
+        event_multi_conversion ,
+        event_dsp_gift_form ,
+        event_app_invoked_ratio ,
+        photo_show ,
+        event_multi_conversion_ratio,
+        client ,
+        event_goods_view_cost ,
+        event_credit_grant_app_ratio,
+        event_ad_watch_times ,
+        comments,
+        signature,
+        project_id
+        )
+        values
+        <foreach collection="data" item="da" separator=",">
+            (
+            #{da.accountId},
+            #{da.planId},
+            #{da.unitId},
+            #{da.placementType},
+            #{da.statDate},
+            #{da.aclick},
+            #{da.bclick},
+            #{da.photoClickCost},
+            #{da.follow},
+            #{da.cancelFollow},
+            #{da.report},
+            #{da.block},
+            #{da.negative},
+            #{da.downloadStarted},
+            #{da.downloadCompleted},
+            #{da.activation},
+            #{da.submit},
+            #{da.photoClick},
+            #{da.photoClickRatio},
+            #{da.charge},
+            #{da.actionRatio},
+            #{da.impression_1kCost},
+            #{da.actionCost},
+            #{da.eventPayFirstDay},
+            #{da.eventPayPurchaseAmountFirstDay},
+            #{da.eventPayFirstDayRoi},
+            #{da.eventPay},
+            #{da.eventPayPurchaseAmount},
+            #{da.eventPayRoi},
+            #{da.eventRegister},
+            #{da.eventRegisterCost},
+            #{da.eventRegisterRatio},
+            #{da.eventJinJianApp},
+            #{da.eventJinJianAppCost},
+            #{da.eventCreditGrantApp},
+            #{da.eventCreditGrantAppCost},
+            #{da.eventOrderPaid},
+            #{da.eventOrderPaidPurchaseAmount},
+            #{da.eventJinJianLandingPage},
+            #{da.eventJinJianLandingPageCost},
+            #{da.eventCreditGrantLandingPage},
+            #{da.eventCreditGrantLandingPageCost},
+            #{da.eventCreditGrantLandingRatio},
+            #{da.eventNextDayStayCost},
+            #{da.eventNextDayStayRatio},
+            #{da.formActionRatio},
+            #{da.eventOrderPaidCost},
+            #{da.eventNextDayStay},
+            #{da.formCost},
+            #{da.formCount},
+            #{da.play_3sRatio},
+            #{da.statHour},
+            #{da.click_1kCost},
+            #{da.eventValidClues},
+            #{da.eventValidCluesCost},
+            #{da.adProductCnt},
+            #{da.eventGoodsView},
+            #{da.merchantRecoFans},
+            #{da.eventOrderAmountRoi},
+            #{da.eventNewUserPay},
+            #{da.eventNewUserPayCost},
+            #{da.eventNewUserPayRatio},
+            #{da.eventButtonClick},
+            #{da.eventButtonClickCost},
+            #{da.eventButtonClickRatio},
+            #{da.play_5sRatio},
+            #{da.playEndRatio},
+            #{da.eventOrderPaidRoi},
+            #{da.eventNewUserJinjianApp},
+            #{da.eventNewUserJinjianAppCost},
+            #{da.eventNewUserJinjianAppRoi},
+            #{da.eventNewUserCreditGrantApp},
+            #{da.eventNewUserCreditGrantAppCost},
+            #{da.eventNewUserCreditGrantAppRoi},
+            #{da.eventNewUserJinjianPage},
+            #{da.eventNewUserJinjianPageCost},
+            #{da.eventNewUserJinjianPageRoi},
+            #{da.eventNewUserCreditGrantPage},
+            #{da.eventNewUserCreditGrantPageCost},
+            #{da.eventNewUserCreditGrantPageRoi},
+            #{da.eventAppointForm},
+            #{da.eventAppointFormCost},
+            #{da.eventAppointFormRatio},
+            #{da.eventAppointJumpClick},
+            #{da.eventAppointJumpClickCost},
+            #{da.eventAppointJumpClickRatio},
+            #{da.unionEventPayPurchaseAmount_7d},
+            #{da.province},
+            #{da.eventAppInvoked},
+            #{da.unionEventPayPurchaseAmount_7dRoi},
+            #{da.eventAddShoppingCartCost},
+            #{da.gender},
+            #{da.city},
+            #{da.eventAdWatchTimesRatio},
+            #{da.shares},
+            #{da.businessInterestTags},
+            #{da.eventWatchAppAd},
+            #{da.eventMultiConversionCost},
+            #{da.merchantRecoFansCost},
+            #{da.adScene},
+            #{da.eventAdWatchTimesCost},
+            #{da.eventAddShoppingCart},
+            #{da.ageSegment},
+            #{da.photoLike},
+            #{da.eventAddWechat},
+            #{da.eventAddWechatCost},
+            #{da.eventAddWechatRatio},
+            #{da.eventAppInvokedCost},
+            #{da.eventMultiConversion},
+            #{da.eventDspGiftForm},
+            #{da.eventAppInvokedRatio},
+            #{da.photoShow},
+            #{da.eventMultiConversionRatio},
+            #{da.client},
+            #{da.eventGoodsViewCost},
+            #{da.eventCreditGrantAppRatio},
+            #{da.eventAdWatchTimes},
+            #{da.comments},
+            #{da.signature},
+            #{da.projectId}
+            )
+        </foreach>
+    </insert>
+
 </mapper>

+ 251 - 0
module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/report/mapper/xml/KuaishouAudienceReportDailyCityMapper.xml

@@ -248,4 +248,255 @@
         </foreach>
     </insert>
 
+
+    <insert id="replaceBatchNew">
+        replace into ctop_kuaishou_audience_report_daily_city (
+        account_id,
+        plan_id ,
+        unit_id ,
+        placement_type,
+        stat_date ,
+        aclick ,
+        bclick ,
+        photo_click_cost,
+        follow ,
+        cancel_follow ,
+        report ,
+        block ,
+        negative ,
+        download_started ,
+        download_completed ,
+        activation ,
+        submit ,
+        photo_click ,
+        photo_click_ratio,
+        charge ,
+        action_ratio ,
+        impression_1k_cost,
+        action_cost ,
+        event_pay_first_day ,
+        event_pay_purchase_amount_first_day,
+        event_pay_first_day_roi,
+        event_pay ,
+        event_pay_purchase_amount ,
+        event_pay_roi ,
+        event_register ,
+        event_register_cost ,
+        event_register_ratio ,
+        event_jin_jian_app ,
+        event_jin_jian_app_cost ,
+        event_credit_grant_app ,
+        event_credit_grant_app_cost,
+        event_order_paid ,
+        event_order_paid_purchase_amount,
+        event_jin_jian_landing_page ,
+        event_jin_jian_landing_page_cost ,
+        event_credit_grant_landing_page ,
+        event_credit_grant_landing_page_cost,
+        event_credit_grant_landing_ratio ,
+        event_next_day_stay_cost ,
+        event_next_day_stay_ratio ,
+        form_action_ratio ,
+        event_order_paid_cost ,
+        event_next_day_stay ,
+        form_cost ,
+        form_count ,
+        play_3s_ratio ,
+        stat_hour ,
+        click_1k_cost ,
+        event_valid_clues ,
+        event_valid_clues_cost,
+        ad_product_cnt ,
+        event_goods_view ,
+        merchant_reco_fans ,
+        event_order_amount_roi ,
+        event_new_user_pay ,
+        event_new_user_pay_cost ,
+        event_new_user_pay_ratio ,
+        event_button_click ,
+        event_button_click_cost ,
+        event_button_click_ratio ,
+        play_5s_ratio ,
+        play_end_ratio ,
+        event_order_paid_roi,
+        event_new_user_jinjian_app ,
+        event_new_user_jinjian_app_cost,
+        event_new_user_jinjian_app_roi ,
+        event_new_user_credit_grant_app ,
+        event_new_user_credit_grant_app_cost,
+        event_new_user_credit_grant_app_roi ,
+        event_new_user_jinjian_page ,
+        event_new_user_jinjian_page_cost ,
+        event_new_user_jinjian_page_roi ,
+        event_new_user_credit_grant_page ,
+        event_new_user_credit_grant_page_cost ,
+        event_new_user_credit_grant_page_roi ,
+        event_appoint_form ,
+        event_appoint_form_cost,
+        event_appoint_form_ratio,
+        event_appoint_jump_click ,
+        event_appoint_jump_click_cost,
+        event_appoint_jump_click_ratio,
+        union_event_pay_purchase_amount_7d ,
+        province ,
+        event_app_invoked ,
+        union_event_pay_purchase_amount_7d_roi,
+        event_add_shopping_cart_cost ,
+        gender ,
+        city ,
+        event_ad_watch_times_ratio ,
+        shares ,
+        business_interest_tags ,
+        event_watch_app_ad ,
+        event_multi_conversion_cost,
+        merchant_reco_fans_cost ,
+        ad_scene ,
+        event_ad_watch_times_cost ,
+        event_add_shopping_cart ,
+        age_segment ,
+        photo_like ,
+        event_add_wechat ,
+        event_add_wechat_cost,
+        event_add_wechat_ratio,
+        event_app_invoked_cost ,
+        event_multi_conversion ,
+        event_dsp_gift_form ,
+        event_app_invoked_ratio ,
+        photo_show ,
+        event_multi_conversion_ratio,
+        client ,
+        event_goods_view_cost ,
+        event_credit_grant_app_ratio,
+        event_ad_watch_times ,
+        comments,
+        signature,
+        project_id
+        )
+        values
+        <foreach collection="data" item="da" separator=",">
+            (
+            #{da.accountId},
+            #{da.planId},
+            #{da.unitId},
+            #{da.placementType},
+            #{da.statDate},
+            #{da.aclick},
+            #{da.bclick},
+            #{da.photoClickCost},
+            #{da.follow},
+            #{da.cancelFollow},
+            #{da.report},
+            #{da.block},
+            #{da.negative},
+            #{da.downloadStarted},
+            #{da.downloadCompleted},
+            #{da.activation},
+            #{da.submit},
+            #{da.photoClick},
+            #{da.photoClickRatio},
+            #{da.charge},
+            #{da.actionRatio},
+            #{da.impression_1kCost},
+            #{da.actionCost},
+            #{da.eventPayFirstDay},
+            #{da.eventPayPurchaseAmountFirstDay},
+            #{da.eventPayFirstDayRoi},
+            #{da.eventPay},
+            #{da.eventPayPurchaseAmount},
+            #{da.eventPayRoi},
+            #{da.eventRegister},
+            #{da.eventRegisterCost},
+            #{da.eventRegisterRatio},
+            #{da.eventJinJianApp},
+            #{da.eventJinJianAppCost},
+            #{da.eventCreditGrantApp},
+            #{da.eventCreditGrantAppCost},
+            #{da.eventOrderPaid},
+            #{da.eventOrderPaidPurchaseAmount},
+            #{da.eventJinJianLandingPage},
+            #{da.eventJinJianLandingPageCost},
+            #{da.eventCreditGrantLandingPage},
+            #{da.eventCreditGrantLandingPageCost},
+            #{da.eventCreditGrantLandingRatio},
+            #{da.eventNextDayStayCost},
+            #{da.eventNextDayStayRatio},
+            #{da.formActionRatio},
+            #{da.eventOrderPaidCost},
+            #{da.eventNextDayStay},
+            #{da.formCost},
+            #{da.formCount},
+            #{da.play_3sRatio},
+            #{da.statHour},
+            #{da.click_1kCost},
+            #{da.eventValidClues},
+            #{da.eventValidCluesCost},
+            #{da.adProductCnt},
+            #{da.eventGoodsView},
+            #{da.merchantRecoFans},
+            #{da.eventOrderAmountRoi},
+            #{da.eventNewUserPay},
+            #{da.eventNewUserPayCost},
+            #{da.eventNewUserPayRatio},
+            #{da.eventButtonClick},
+            #{da.eventButtonClickCost},
+            #{da.eventButtonClickRatio},
+            #{da.play_5sRatio},
+            #{da.playEndRatio},
+            #{da.eventOrderPaidRoi},
+            #{da.eventNewUserJinjianApp},
+            #{da.eventNewUserJinjianAppCost},
+            #{da.eventNewUserJinjianAppRoi},
+            #{da.eventNewUserCreditGrantApp},
+            #{da.eventNewUserCreditGrantAppCost},
+            #{da.eventNewUserCreditGrantAppRoi},
+            #{da.eventNewUserJinjianPage},
+            #{da.eventNewUserJinjianPageCost},
+            #{da.eventNewUserJinjianPageRoi},
+            #{da.eventNewUserCreditGrantPage},
+            #{da.eventNewUserCreditGrantPageCost},
+            #{da.eventNewUserCreditGrantPageRoi},
+            #{da.eventAppointForm},
+            #{da.eventAppointFormCost},
+            #{da.eventAppointFormRatio},
+            #{da.eventAppointJumpClick},
+            #{da.eventAppointJumpClickCost},
+            #{da.eventAppointJumpClickRatio},
+            #{da.unionEventPayPurchaseAmount_7d},
+            #{da.province},
+            #{da.eventAppInvoked},
+            #{da.unionEventPayPurchaseAmount_7dRoi},
+            #{da.eventAddShoppingCartCost},
+            #{da.gender},
+            #{da.city},
+            #{da.eventAdWatchTimesRatio},
+            #{da.shares},
+            #{da.businessInterestTags},
+            #{da.eventWatchAppAd},
+            #{da.eventMultiConversionCost},
+            #{da.merchantRecoFansCost},
+            #{da.adScene},
+            #{da.eventAdWatchTimesCost},
+            #{da.eventAddShoppingCart},
+            #{da.ageSegment},
+            #{da.photoLike},
+            #{da.eventAddWechat},
+            #{da.eventAddWechatCost},
+            #{da.eventAddWechatRatio},
+            #{da.eventAppInvokedCost},
+            #{da.eventMultiConversion},
+            #{da.eventDspGiftForm},
+            #{da.eventAppInvokedRatio},
+            #{da.photoShow},
+            #{da.eventMultiConversionRatio},
+            #{da.client},
+            #{da.eventGoodsViewCost},
+            #{da.eventCreditGrantAppRatio},
+            #{da.eventAdWatchTimes},
+            #{da.comments},
+            #{da.signature},
+            #{da.projectId}
+            )
+        </foreach>
+    </insert>
+
 </mapper>

+ 250 - 0
module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/report/mapper/xml/KuaishouAudienceReportDailyClientMapper.xml

@@ -248,4 +248,254 @@
         </foreach>
     </insert>
 
+    <insert id="replaceBatchNew">
+        replace into ctop_kuaishou_audience_report_daily_client (
+        account_id,
+        plan_id ,
+        unit_id ,
+        placement_type,
+        stat_date ,
+        aclick ,
+        bclick ,
+        photo_click_cost,
+        follow ,
+        cancel_follow ,
+        report ,
+        block ,
+        negative ,
+        download_started ,
+        download_completed ,
+        activation ,
+        submit ,
+        photo_click ,
+        photo_click_ratio,
+        charge ,
+        action_ratio ,
+        impression_1k_cost,
+        action_cost ,
+        event_pay_first_day ,
+        event_pay_purchase_amount_first_day,
+        event_pay_first_day_roi,
+        event_pay ,
+        event_pay_purchase_amount ,
+        event_pay_roi ,
+        event_register ,
+        event_register_cost ,
+        event_register_ratio ,
+        event_jin_jian_app ,
+        event_jin_jian_app_cost ,
+        event_credit_grant_app ,
+        event_credit_grant_app_cost,
+        event_order_paid ,
+        event_order_paid_purchase_amount,
+        event_jin_jian_landing_page ,
+        event_jin_jian_landing_page_cost ,
+        event_credit_grant_landing_page ,
+        event_credit_grant_landing_page_cost,
+        event_credit_grant_landing_ratio ,
+        event_next_day_stay_cost ,
+        event_next_day_stay_ratio ,
+        form_action_ratio ,
+        event_order_paid_cost ,
+        event_next_day_stay ,
+        form_cost ,
+        form_count ,
+        play_3s_ratio ,
+        stat_hour ,
+        click_1k_cost ,
+        event_valid_clues ,
+        event_valid_clues_cost,
+        ad_product_cnt ,
+        event_goods_view ,
+        merchant_reco_fans ,
+        event_order_amount_roi ,
+        event_new_user_pay ,
+        event_new_user_pay_cost ,
+        event_new_user_pay_ratio ,
+        event_button_click ,
+        event_button_click_cost ,
+        event_button_click_ratio ,
+        play_5s_ratio ,
+        play_end_ratio ,
+        event_order_paid_roi,
+        event_new_user_jinjian_app ,
+        event_new_user_jinjian_app_cost,
+        event_new_user_jinjian_app_roi ,
+        event_new_user_credit_grant_app ,
+        event_new_user_credit_grant_app_cost,
+        event_new_user_credit_grant_app_roi ,
+        event_new_user_jinjian_page ,
+        event_new_user_jinjian_page_cost ,
+        event_new_user_jinjian_page_roi ,
+        event_new_user_credit_grant_page ,
+        event_new_user_credit_grant_page_cost ,
+        event_new_user_credit_grant_page_roi ,
+        event_appoint_form ,
+        event_appoint_form_cost,
+        event_appoint_form_ratio,
+        event_appoint_jump_click ,
+        event_appoint_jump_click_cost,
+        event_appoint_jump_click_ratio,
+        union_event_pay_purchase_amount_7d ,
+        province ,
+        event_app_invoked ,
+        union_event_pay_purchase_amount_7d_roi,
+        event_add_shopping_cart_cost ,
+        gender ,
+        city ,
+        event_ad_watch_times_ratio ,
+        shares ,
+        business_interest_tags ,
+        event_watch_app_ad ,
+        event_multi_conversion_cost,
+        merchant_reco_fans_cost ,
+        ad_scene ,
+        event_ad_watch_times_cost ,
+        event_add_shopping_cart ,
+        age_segment ,
+        photo_like ,
+        event_add_wechat ,
+        event_add_wechat_cost,
+        event_add_wechat_ratio,
+        event_app_invoked_cost ,
+        event_multi_conversion ,
+        event_dsp_gift_form ,
+        event_app_invoked_ratio ,
+        photo_show ,
+        event_multi_conversion_ratio,
+        client ,
+        event_goods_view_cost ,
+        event_credit_grant_app_ratio,
+        event_ad_watch_times ,
+        comments,
+        signature,
+        project_id
+        )
+        values
+        <foreach collection="data" item="da" separator=",">
+            (
+            #{da.accountId},
+            #{da.planId},
+            #{da.unitId},
+            #{da.placementType},
+            #{da.statDate},
+            #{da.aclick},
+            #{da.bclick},
+            #{da.photoClickCost},
+            #{da.follow},
+            #{da.cancelFollow},
+            #{da.report},
+            #{da.block},
+            #{da.negative},
+            #{da.downloadStarted},
+            #{da.downloadCompleted},
+            #{da.activation},
+            #{da.submit},
+            #{da.photoClick},
+            #{da.photoClickRatio},
+            #{da.charge},
+            #{da.actionRatio},
+            #{da.impression_1kCost},
+            #{da.actionCost},
+            #{da.eventPayFirstDay},
+            #{da.eventPayPurchaseAmountFirstDay},
+            #{da.eventPayFirstDayRoi},
+            #{da.eventPay},
+            #{da.eventPayPurchaseAmount},
+            #{da.eventPayRoi},
+            #{da.eventRegister},
+            #{da.eventRegisterCost},
+            #{da.eventRegisterRatio},
+            #{da.eventJinJianApp},
+            #{da.eventJinJianAppCost},
+            #{da.eventCreditGrantApp},
+            #{da.eventCreditGrantAppCost},
+            #{da.eventOrderPaid},
+            #{da.eventOrderPaidPurchaseAmount},
+            #{da.eventJinJianLandingPage},
+            #{da.eventJinJianLandingPageCost},
+            #{da.eventCreditGrantLandingPage},
+            #{da.eventCreditGrantLandingPageCost},
+            #{da.eventCreditGrantLandingRatio},
+            #{da.eventNextDayStayCost},
+            #{da.eventNextDayStayRatio},
+            #{da.formActionRatio},
+            #{da.eventOrderPaidCost},
+            #{da.eventNextDayStay},
+            #{da.formCost},
+            #{da.formCount},
+            #{da.play_3sRatio},
+            #{da.statHour},
+            #{da.click_1kCost},
+            #{da.eventValidClues},
+            #{da.eventValidCluesCost},
+            #{da.adProductCnt},
+            #{da.eventGoodsView},
+            #{da.merchantRecoFans},
+            #{da.eventOrderAmountRoi},
+            #{da.eventNewUserPay},
+            #{da.eventNewUserPayCost},
+            #{da.eventNewUserPayRatio},
+            #{da.eventButtonClick},
+            #{da.eventButtonClickCost},
+            #{da.eventButtonClickRatio},
+            #{da.play_5sRatio},
+            #{da.playEndRatio},
+            #{da.eventOrderPaidRoi},
+            #{da.eventNewUserJinjianApp},
+            #{da.eventNewUserJinjianAppCost},
+            #{da.eventNewUserJinjianAppRoi},
+            #{da.eventNewUserCreditGrantApp},
+            #{da.eventNewUserCreditGrantAppCost},
+            #{da.eventNewUserCreditGrantAppRoi},
+            #{da.eventNewUserJinjianPage},
+            #{da.eventNewUserJinjianPageCost},
+            #{da.eventNewUserJinjianPageRoi},
+            #{da.eventNewUserCreditGrantPage},
+            #{da.eventNewUserCreditGrantPageCost},
+            #{da.eventNewUserCreditGrantPageRoi},
+            #{da.eventAppointForm},
+            #{da.eventAppointFormCost},
+            #{da.eventAppointFormRatio},
+            #{da.eventAppointJumpClick},
+            #{da.eventAppointJumpClickCost},
+            #{da.eventAppointJumpClickRatio},
+            #{da.unionEventPayPurchaseAmount_7d},
+            #{da.province},
+            #{da.eventAppInvoked},
+            #{da.unionEventPayPurchaseAmount_7dRoi},
+            #{da.eventAddShoppingCartCost},
+            #{da.gender},
+            #{da.city},
+            #{da.eventAdWatchTimesRatio},
+            #{da.shares},
+            #{da.businessInterestTags},
+            #{da.eventWatchAppAd},
+            #{da.eventMultiConversionCost},
+            #{da.merchantRecoFansCost},
+            #{da.adScene},
+            #{da.eventAdWatchTimesCost},
+            #{da.eventAddShoppingCart},
+            #{da.ageSegment},
+            #{da.photoLike},
+            #{da.eventAddWechat},
+            #{da.eventAddWechatCost},
+            #{da.eventAddWechatRatio},
+            #{da.eventAppInvokedCost},
+            #{da.eventMultiConversion},
+            #{da.eventDspGiftForm},
+            #{da.eventAppInvokedRatio},
+            #{da.photoShow},
+            #{da.eventMultiConversionRatio},
+            #{da.client},
+            #{da.eventGoodsViewCost},
+            #{da.eventCreditGrantAppRatio},
+            #{da.eventAdWatchTimes},
+            #{da.comments},
+            #{da.signature},
+            #{da.projectId}
+            )
+        </foreach>
+    </insert>
+
 </mapper>

+ 250 - 0
module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/report/mapper/xml/KuaishouAudienceReportDailyGenderMapper.xml

@@ -248,4 +248,254 @@
         </foreach>
     </insert>
 
+
+    <insert id="replaceBatchNew">
+        replace into ctop_kuaishou_audience_report_daily_gender (
+        account_id,
+        plan_id ,
+        unit_id ,
+        placement_type,
+        stat_date ,
+        aclick ,
+        bclick ,
+        photo_click_cost,
+        follow ,
+        cancel_follow ,
+        report ,
+        block ,
+        negative ,
+        download_started ,
+        download_completed ,
+        activation ,
+        submit ,
+        photo_click ,
+        photo_click_ratio,
+        charge ,
+        action_ratio ,
+        impression_1k_cost,
+        action_cost ,
+        event_pay_first_day ,
+        event_pay_purchase_amount_first_day,
+        event_pay_first_day_roi,
+        event_pay ,
+        event_pay_purchase_amount ,
+        event_pay_roi ,
+        event_register ,
+        event_register_cost ,
+        event_register_ratio ,
+        event_jin_jian_app ,
+        event_jin_jian_app_cost ,
+        event_credit_grant_app ,
+        event_credit_grant_app_cost,
+        event_order_paid ,
+        event_order_paid_purchase_amount,
+        event_jin_jian_landing_page ,
+        event_jin_jian_landing_page_cost ,
+        event_credit_grant_landing_page ,
+        event_credit_grant_landing_page_cost,
+        event_credit_grant_landing_ratio ,
+        event_next_day_stay_cost ,
+        event_next_day_stay_ratio ,
+        form_action_ratio ,
+        event_order_paid_cost ,
+        event_next_day_stay ,
+        form_cost ,
+        form_count ,
+        play_3s_ratio ,
+        stat_hour ,
+        click_1k_cost ,
+        event_valid_clues ,
+        event_valid_clues_cost,
+        ad_product_cnt ,
+        event_goods_view ,
+        merchant_reco_fans ,
+        event_order_amount_roi ,
+        event_new_user_pay ,
+        event_new_user_pay_cost ,
+        event_new_user_pay_ratio ,
+        event_button_click ,
+        event_button_click_cost ,
+        event_button_click_ratio ,
+        play_5s_ratio ,
+        play_end_ratio ,
+        event_order_paid_roi,
+        event_new_user_jinjian_app ,
+        event_new_user_jinjian_app_cost,
+        event_new_user_jinjian_app_roi ,
+        event_new_user_credit_grant_app ,
+        event_new_user_credit_grant_app_cost,
+        event_new_user_credit_grant_app_roi ,
+        event_new_user_jinjian_page ,
+        event_new_user_jinjian_page_cost ,
+        event_new_user_jinjian_page_roi ,
+        event_new_user_credit_grant_page ,
+        event_new_user_credit_grant_page_cost ,
+        event_new_user_credit_grant_page_roi ,
+        event_appoint_form ,
+        event_appoint_form_cost,
+        event_appoint_form_ratio,
+        event_appoint_jump_click ,
+        event_appoint_jump_click_cost,
+        event_appoint_jump_click_ratio,
+        union_event_pay_purchase_amount_7d ,
+        province ,
+        event_app_invoked ,
+        union_event_pay_purchase_amount_7d_roi,
+        event_add_shopping_cart_cost ,
+        gender ,
+        city ,
+        event_ad_watch_times_ratio ,
+        shares ,
+        business_interest_tags ,
+        event_watch_app_ad ,
+        event_multi_conversion_cost,
+        merchant_reco_fans_cost ,
+        ad_scene ,
+        event_ad_watch_times_cost ,
+        event_add_shopping_cart ,
+        age_segment ,
+        photo_like ,
+        event_add_wechat ,
+        event_add_wechat_cost,
+        event_add_wechat_ratio,
+        event_app_invoked_cost ,
+        event_multi_conversion ,
+        event_dsp_gift_form ,
+        event_app_invoked_ratio ,
+        photo_show ,
+        event_multi_conversion_ratio,
+        client ,
+        event_goods_view_cost ,
+        event_credit_grant_app_ratio,
+        event_ad_watch_times ,
+        comments,
+        signature,
+        project_id
+        )
+        values
+        <foreach collection="data" item="da" separator=",">
+            (
+            #{da.accountId},
+            #{da.planId},
+            #{da.unitId},
+            #{da.placementType},
+            #{da.statDate},
+            #{da.aclick},
+            #{da.bclick},
+            #{da.photoClickCost},
+            #{da.follow},
+            #{da.cancelFollow},
+            #{da.report},
+            #{da.block},
+            #{da.negative},
+            #{da.downloadStarted},
+            #{da.downloadCompleted},
+            #{da.activation},
+            #{da.submit},
+            #{da.photoClick},
+            #{da.photoClickRatio},
+            #{da.charge},
+            #{da.actionRatio},
+            #{da.impression_1kCost},
+            #{da.actionCost},
+            #{da.eventPayFirstDay},
+            #{da.eventPayPurchaseAmountFirstDay},
+            #{da.eventPayFirstDayRoi},
+            #{da.eventPay},
+            #{da.eventPayPurchaseAmount},
+            #{da.eventPayRoi},
+            #{da.eventRegister},
+            #{da.eventRegisterCost},
+            #{da.eventRegisterRatio},
+            #{da.eventJinJianApp},
+            #{da.eventJinJianAppCost},
+            #{da.eventCreditGrantApp},
+            #{da.eventCreditGrantAppCost},
+            #{da.eventOrderPaid},
+            #{da.eventOrderPaidPurchaseAmount},
+            #{da.eventJinJianLandingPage},
+            #{da.eventJinJianLandingPageCost},
+            #{da.eventCreditGrantLandingPage},
+            #{da.eventCreditGrantLandingPageCost},
+            #{da.eventCreditGrantLandingRatio},
+            #{da.eventNextDayStayCost},
+            #{da.eventNextDayStayRatio},
+            #{da.formActionRatio},
+            #{da.eventOrderPaidCost},
+            #{da.eventNextDayStay},
+            #{da.formCost},
+            #{da.formCount},
+            #{da.play_3sRatio},
+            #{da.statHour},
+            #{da.click_1kCost},
+            #{da.eventValidClues},
+            #{da.eventValidCluesCost},
+            #{da.adProductCnt},
+            #{da.eventGoodsView},
+            #{da.merchantRecoFans},
+            #{da.eventOrderAmountRoi},
+            #{da.eventNewUserPay},
+            #{da.eventNewUserPayCost},
+            #{da.eventNewUserPayRatio},
+            #{da.eventButtonClick},
+            #{da.eventButtonClickCost},
+            #{da.eventButtonClickRatio},
+            #{da.play_5sRatio},
+            #{da.playEndRatio},
+            #{da.eventOrderPaidRoi},
+            #{da.eventNewUserJinjianApp},
+            #{da.eventNewUserJinjianAppCost},
+            #{da.eventNewUserJinjianAppRoi},
+            #{da.eventNewUserCreditGrantApp},
+            #{da.eventNewUserCreditGrantAppCost},
+            #{da.eventNewUserCreditGrantAppRoi},
+            #{da.eventNewUserJinjianPage},
+            #{da.eventNewUserJinjianPageCost},
+            #{da.eventNewUserJinjianPageRoi},
+            #{da.eventNewUserCreditGrantPage},
+            #{da.eventNewUserCreditGrantPageCost},
+            #{da.eventNewUserCreditGrantPageRoi},
+            #{da.eventAppointForm},
+            #{da.eventAppointFormCost},
+            #{da.eventAppointFormRatio},
+            #{da.eventAppointJumpClick},
+            #{da.eventAppointJumpClickCost},
+            #{da.eventAppointJumpClickRatio},
+            #{da.unionEventPayPurchaseAmount_7d},
+            #{da.province},
+            #{da.eventAppInvoked},
+            #{da.unionEventPayPurchaseAmount_7dRoi},
+            #{da.eventAddShoppingCartCost},
+            #{da.gender},
+            #{da.city},
+            #{da.eventAdWatchTimesRatio},
+            #{da.shares},
+            #{da.businessInterestTags},
+            #{da.eventWatchAppAd},
+            #{da.eventMultiConversionCost},
+            #{da.merchantRecoFansCost},
+            #{da.adScene},
+            #{da.eventAdWatchTimesCost},
+            #{da.eventAddShoppingCart},
+            #{da.ageSegment},
+            #{da.photoLike},
+            #{da.eventAddWechat},
+            #{da.eventAddWechatCost},
+            #{da.eventAddWechatRatio},
+            #{da.eventAppInvokedCost},
+            #{da.eventMultiConversion},
+            #{da.eventDspGiftForm},
+            #{da.eventAppInvokedRatio},
+            #{da.photoShow},
+            #{da.eventMultiConversionRatio},
+            #{da.client},
+            #{da.eventGoodsViewCost},
+            #{da.eventCreditGrantAppRatio},
+            #{da.eventAdWatchTimes},
+            #{da.comments},
+            #{da.signature},
+            #{da.projectId}
+            )
+        </foreach>
+    </insert>
 </mapper>

+ 251 - 0
module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/report/mapper/xml/KuaishouAudienceReportDailyProvinceMapper.xml

@@ -248,4 +248,255 @@
         </foreach>
     </insert>
 
+
+    <insert id="replaceBatchNew">
+        replace into ctop_kuaishou_audience_report_daily_province (
+        account_id,
+        plan_id ,
+        unit_id ,
+        placement_type,
+        stat_date ,
+        aclick ,
+        bclick ,
+        photo_click_cost,
+        follow ,
+        cancel_follow ,
+        report ,
+        block ,
+        negative ,
+        download_started ,
+        download_completed ,
+        activation ,
+        submit ,
+        photo_click ,
+        photo_click_ratio,
+        charge ,
+        action_ratio ,
+        impression_1k_cost,
+        action_cost ,
+        event_pay_first_day ,
+        event_pay_purchase_amount_first_day,
+        event_pay_first_day_roi,
+        event_pay ,
+        event_pay_purchase_amount ,
+        event_pay_roi ,
+        event_register ,
+        event_register_cost ,
+        event_register_ratio ,
+        event_jin_jian_app ,
+        event_jin_jian_app_cost ,
+        event_credit_grant_app ,
+        event_credit_grant_app_cost,
+        event_order_paid ,
+        event_order_paid_purchase_amount,
+        event_jin_jian_landing_page ,
+        event_jin_jian_landing_page_cost ,
+        event_credit_grant_landing_page ,
+        event_credit_grant_landing_page_cost,
+        event_credit_grant_landing_ratio ,
+        event_next_day_stay_cost ,
+        event_next_day_stay_ratio ,
+        form_action_ratio ,
+        event_order_paid_cost ,
+        event_next_day_stay ,
+        form_cost ,
+        form_count ,
+        play_3s_ratio ,
+        stat_hour ,
+        click_1k_cost ,
+        event_valid_clues ,
+        event_valid_clues_cost,
+        ad_product_cnt ,
+        event_goods_view ,
+        merchant_reco_fans ,
+        event_order_amount_roi ,
+        event_new_user_pay ,
+        event_new_user_pay_cost ,
+        event_new_user_pay_ratio ,
+        event_button_click ,
+        event_button_click_cost ,
+        event_button_click_ratio ,
+        play_5s_ratio ,
+        play_end_ratio ,
+        event_order_paid_roi,
+        event_new_user_jinjian_app ,
+        event_new_user_jinjian_app_cost,
+        event_new_user_jinjian_app_roi ,
+        event_new_user_credit_grant_app ,
+        event_new_user_credit_grant_app_cost,
+        event_new_user_credit_grant_app_roi ,
+        event_new_user_jinjian_page ,
+        event_new_user_jinjian_page_cost ,
+        event_new_user_jinjian_page_roi ,
+        event_new_user_credit_grant_page ,
+        event_new_user_credit_grant_page_cost ,
+        event_new_user_credit_grant_page_roi ,
+        event_appoint_form ,
+        event_appoint_form_cost,
+        event_appoint_form_ratio,
+        event_appoint_jump_click ,
+        event_appoint_jump_click_cost,
+        event_appoint_jump_click_ratio,
+        union_event_pay_purchase_amount_7d ,
+        province ,
+        event_app_invoked ,
+        union_event_pay_purchase_amount_7d_roi,
+        event_add_shopping_cart_cost ,
+        gender ,
+        city ,
+        event_ad_watch_times_ratio ,
+        shares ,
+        business_interest_tags ,
+        event_watch_app_ad ,
+        event_multi_conversion_cost,
+        merchant_reco_fans_cost ,
+        ad_scene ,
+        event_ad_watch_times_cost ,
+        event_add_shopping_cart ,
+        age_segment ,
+        photo_like ,
+        event_add_wechat ,
+        event_add_wechat_cost,
+        event_add_wechat_ratio,
+        event_app_invoked_cost ,
+        event_multi_conversion ,
+        event_dsp_gift_form ,
+        event_app_invoked_ratio ,
+        photo_show ,
+        event_multi_conversion_ratio,
+        client ,
+        event_goods_view_cost ,
+        event_credit_grant_app_ratio,
+        event_ad_watch_times ,
+        comments,
+        signature,
+        project_id
+        )
+        values
+        <foreach collection="data" item="da" separator=",">
+            (
+            #{da.accountId},
+            #{da.planId},
+            #{da.unitId},
+            #{da.placementType},
+            #{da.statDate},
+            #{da.aclick},
+            #{da.bclick},
+            #{da.photoClickCost},
+            #{da.follow},
+            #{da.cancelFollow},
+            #{da.report},
+            #{da.block},
+            #{da.negative},
+            #{da.downloadStarted},
+            #{da.downloadCompleted},
+            #{da.activation},
+            #{da.submit},
+            #{da.photoClick},
+            #{da.photoClickRatio},
+            #{da.charge},
+            #{da.actionRatio},
+            #{da.impression_1kCost},
+            #{da.actionCost},
+            #{da.eventPayFirstDay},
+            #{da.eventPayPurchaseAmountFirstDay},
+            #{da.eventPayFirstDayRoi},
+            #{da.eventPay},
+            #{da.eventPayPurchaseAmount},
+            #{da.eventPayRoi},
+            #{da.eventRegister},
+            #{da.eventRegisterCost},
+            #{da.eventRegisterRatio},
+            #{da.eventJinJianApp},
+            #{da.eventJinJianAppCost},
+            #{da.eventCreditGrantApp},
+            #{da.eventCreditGrantAppCost},
+            #{da.eventOrderPaid},
+            #{da.eventOrderPaidPurchaseAmount},
+            #{da.eventJinJianLandingPage},
+            #{da.eventJinJianLandingPageCost},
+            #{da.eventCreditGrantLandingPage},
+            #{da.eventCreditGrantLandingPageCost},
+            #{da.eventCreditGrantLandingRatio},
+            #{da.eventNextDayStayCost},
+            #{da.eventNextDayStayRatio},
+            #{da.formActionRatio},
+            #{da.eventOrderPaidCost},
+            #{da.eventNextDayStay},
+            #{da.formCost},
+            #{da.formCount},
+            #{da.play_3sRatio},
+            #{da.statHour},
+            #{da.click_1kCost},
+            #{da.eventValidClues},
+            #{da.eventValidCluesCost},
+            #{da.adProductCnt},
+            #{da.eventGoodsView},
+            #{da.merchantRecoFans},
+            #{da.eventOrderAmountRoi},
+            #{da.eventNewUserPay},
+            #{da.eventNewUserPayCost},
+            #{da.eventNewUserPayRatio},
+            #{da.eventButtonClick},
+            #{da.eventButtonClickCost},
+            #{da.eventButtonClickRatio},
+            #{da.play_5sRatio},
+            #{da.playEndRatio},
+            #{da.eventOrderPaidRoi},
+            #{da.eventNewUserJinjianApp},
+            #{da.eventNewUserJinjianAppCost},
+            #{da.eventNewUserJinjianAppRoi},
+            #{da.eventNewUserCreditGrantApp},
+            #{da.eventNewUserCreditGrantAppCost},
+            #{da.eventNewUserCreditGrantAppRoi},
+            #{da.eventNewUserJinjianPage},
+            #{da.eventNewUserJinjianPageCost},
+            #{da.eventNewUserJinjianPageRoi},
+            #{da.eventNewUserCreditGrantPage},
+            #{da.eventNewUserCreditGrantPageCost},
+            #{da.eventNewUserCreditGrantPageRoi},
+            #{da.eventAppointForm},
+            #{da.eventAppointFormCost},
+            #{da.eventAppointFormRatio},
+            #{da.eventAppointJumpClick},
+            #{da.eventAppointJumpClickCost},
+            #{da.eventAppointJumpClickRatio},
+            #{da.unionEventPayPurchaseAmount_7d},
+            #{da.province},
+            #{da.eventAppInvoked},
+            #{da.unionEventPayPurchaseAmount_7dRoi},
+            #{da.eventAddShoppingCartCost},
+            #{da.gender},
+            #{da.city},
+            #{da.eventAdWatchTimesRatio},
+            #{da.shares},
+            #{da.businessInterestTags},
+            #{da.eventWatchAppAd},
+            #{da.eventMultiConversionCost},
+            #{da.merchantRecoFansCost},
+            #{da.adScene},
+            #{da.eventAdWatchTimesCost},
+            #{da.eventAddShoppingCart},
+            #{da.ageSegment},
+            #{da.photoLike},
+            #{da.eventAddWechat},
+            #{da.eventAddWechatCost},
+            #{da.eventAddWechatRatio},
+            #{da.eventAppInvokedCost},
+            #{da.eventMultiConversion},
+            #{da.eventDspGiftForm},
+            #{da.eventAppInvokedRatio},
+            #{da.photoShow},
+            #{da.eventMultiConversionRatio},
+            #{da.client},
+            #{da.eventGoodsViewCost},
+            #{da.eventCreditGrantAppRatio},
+            #{da.eventAdWatchTimes},
+            #{da.comments},
+            #{da.signature},
+            #{da.projectId}
+            )
+        </foreach>
+    </insert>
+
 </mapper>

+ 183 - 0
module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/report/mapper/xml/NewMonitorMapper.xml

@@ -0,0 +1,183 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="cn.com.ctop.kuaishou.modules.report.mapper.NewMonitorMapper">
+    <resultMap id="BaseResultMap" type="cn.com.ctop.kuaishou.modules.report.mapper.NewMonitorMapper">
+        <id  column="id"  property="user_id" />
+        <result column="realname" property="user_name"/>
+        <result column="leader_id" property="parent_id"/>
+        <collection property="children" ofType="cn.com.ctop.kuaishou.modules.report.entity.NewMonitorInfo"
+                    select="cn.com.ctop.kuaishou.modules.report.mapper.NewMonitorMapper.getOperator" column="id">
+        </collection>
+    </resultMap>
+
+    <select id="getOperator" resultMap="BaseResultMap"  parameterType="String">
+        SELECT id,realname,leader_id
+        FROM sys_user
+        WHERE leader_id=#{userId};
+    </select>
+
+    <select id="getAllAccountId" resultType="Long">
+        SELECT DISTINCT t.account_id  as 'accountId' from ctop_user_allocation t
+    </select>
+    <select id="getKuaiShouGroup" resultType="Map">
+    SELECT t1.account_id as 'accountId',t1.auth_name as 'accountName',t1.user_name as 'userName',t.unit_id as 'unitId',t.group_create_time as 'groupCreatTime',DATE_FORMAT(DATE_ADD(t.group_create_time,INTERVAL 7 DAY),'%Y-%m-%d') as 'afterTime'
+     from ctop_user_allocation t1 LEFT JOIN  ctop_kuaishou_group t on t1.account_id=t.account_id and t.account_id=#{accountId}
+     <where>
+         <choose>
+             <when test="date!= null and date!=''">
+                 and  t.group_create_time &gt;= DATE_SUB(#{date},INTERVAL 7 DAY)
+             </when>
+             <otherwise>
+                 t.group_create_time &gt;= DATE_FORMAT(DATE_SUB(NOW(),INTERVAL 1 YEAR),'%Y-%m-%d')
+             </otherwise>
+         </choose>
+     </where>
+    </select>
+
+    <select id="getKuaiShouCampaign" resultType="Map">
+        SELECT t1.account_id as 'accountId',t1.auth_name as 'accountName',t1.user_name as 'userName',t.campaign_id as 'campaignId',t.put_create_time as 'campaignCreatTime',DATE_FORMAT(DATE_ADD(t.put_create_time,INTERVAL 7 DAY),'%Y-%m-%d') as 'afterTime'
+        from ctop_user_allocation t1 LEFT JOIN  ctop_kuaishou_campaign t on t1.account_id=t.account_id and t.account_id=#{accountId}
+        <where>
+            <choose>
+                <when test="date != null and date !=''">
+                    and  t.put_create_time &gt;= DATE_SUB(#{date},INTERVAL 7 DAY)
+                </when>
+                <otherwise>
+                    t.put_create_time &gt;= DATE_FORMAT(DATE_SUB(NOW(),INTERVAL 1 YEAR),'%Y-%m-%d')
+                </otherwise>
+            </choose>
+        </where>
+    </select>
+
+    <select id="getTouTiaoCampaign" resultType="Map">
+        SELECT t1.account_id as 'accountId',t1.auth_name as 'accountName',t1.user_name as 'userName',t.id as 'campaignId',t.ad_create_time as 'campaignCreatTime',DATE_FORMAT(DATE_ADD(t.ad_create_time,INTERVAL 7 DAY),'%Y-%m-%d') as 'afterTime'
+        from ctop_user_allocation t1 LEFT JOIN  ctop_bytedance_advertise_plan t on t1.account_id=t.account_id and t.account_id=#{accountId}
+        <where>
+            <choose>
+                <when test="date != null and date !=''">
+                    and  t.ad_create_time &gt;= DATE_SUB(#{date},INTERVAL 7 DAY)
+                </when>
+                <otherwise>
+                    t.ad_create_time &gt;= DATE_FORMAT(DATE_SUB(NOW(),INTERVAL 1 YEAR),'%Y-%m-%d')
+                </otherwise>
+            </choose>
+        </where>
+    </select>
+
+    <select id="getGroupCharge" resultType="BigDecimal">
+
+        select sum(charge) from ctop_kuaishou_report_daily_group t where t.stat_date &lt; #{afterDate} and t.unit_id=#{unitId}
+    </select>
+
+    <select id="getCampaignCharge" resultType="BigDecimal">
+
+        select sum(charge) from ctop_kuaishou_report_daily_campaign t where t.stat_date &lt; #{afterDate} and t.campaign_id=#{campaignId}
+    </select>
+
+    <select id="getCampaignChargeTouTiao" resultType="BigDecimal">
+
+        select sum(cost) from ctop_bytedance_report_plan_daily t where t.stat_datetime &lt; #{afterDate} and t.ad_id=#{campaignId}
+    </select>
+
+    <insert id="saveMonitorGroup">
+        insert into  ctop_new_monitor_group(account_id,account_name,operating_name,unit_id,create_time,project_type,effective) values
+        (#{accountId},#{accountName},#{operatingName},#{unitId},#{createTime},#{projectType},#{effective})
+    </insert>
+
+    <insert id="saveMonitorCampaign">
+        insert into ctop_new_monitor_campaign (account_id,account_name,operating_name,campaign_id,create_time,project_type,effective) values
+        (#{accountId},#{accountName},#{operatingName},#{campaignId},#{createTime},#{projectType},#{effective})
+    </insert>
+
+    <select id="getMonitorGroupByUnitId" resultType="String" >
+        select  t.effective from ctop_new_monitor_group t where t.unit_id=#{unitId}
+    </select>
+
+    <select id="getMonitorPlanByCampaignId" resultType="String" >
+        select  t.effective from ctop_new_monitor_campaign t where t.campaign_id=#{campaignId}
+    </select>
+
+    <update id="updateMonitorGroupByUnitId" >
+        update ctop_new_monitor_group  t set t.effective=#{effective} where  t.unit_id=#{unitId}
+    </update>
+
+    <update id="updateMonitorPlanByCampaignId" >
+        update ctop_new_monitor_campaign  t set t.effective=#{effective} where  t.campaign_id=#{campaignId}
+    </update>
+
+    <select id="getKuaiShouGroupMessage" resultType="com.alibaba.fastjson.JSONObject">
+        select account_id as 'accountId',account_name as 'authName',MAX(create_time) as 'maxCreateTime',COUNT(IF(effective ='1', TRUE, NULL))  as 'valid',count(effective) as 'new',operating_name as 'userName','' as 'projectName'
+         from ctop_new_monitor_group  where ( create_time between #{startDate}  and #{endDate})
+        and account_id in
+        <foreach item="item" collection="array" separator="," open="(" close=")" index="">
+               #{item}
+        </foreach>
+        GROUP BY account_id
+
+    </select>
+
+
+    <select id="getPlanMessage" resultType="com.alibaba.fastjson.JSONObject">
+        select account_id as 'accountId',account_name as 'authName',MAX(create_time) as 'maxCreateTime',COUNT(IF(effective ='1', TRUE, NULL))  as 'valid',count(effective) as 'new',operating_name as 'userName','' as 'projectName'
+        from ctop_new_monitor_campaign  where ( create_time between #{startDate}  and #{endDate}) and project_type=#{project}
+        and account_id in
+        <foreach item="item" collection="array" separator="," open="(" close=")" index="">
+            #{item}
+        </foreach>
+        GROUP BY account_id
+
+    </select>
+
+    <select id="getKuaiShouGroupSum" resultType="com.alibaba.fastjson.JSONObject">
+        SELECT COUNT(IF(t.effective ='1', TRUE, NULL)) as 'valid',COUNT(t.effective)  as 'new' from ctop_new_monitor_group t
+        where  create_time between #{startDate}  and #{endDate}
+        and t.account_id in
+        <foreach item="item" collection="array" separator="," open="(" close=")" index="">
+            #{item}
+        </foreach>
+    </select>
+
+    <select id="getPlanSum" resultType="com.alibaba.fastjson.JSONObject">
+        SELECT COUNT(IF(t.effective ='1', TRUE, NULL)) as 'valid',COUNT(t.effective)  as 'new' from ctop_new_monitor_campaign t
+        where  (create_time between #{startDate}  and #{endDate}) and project_type=#{project}
+        and t.account_id in
+        <foreach item="item" collection="array" separator="," open="(" close=")" index="">
+            #{item}
+        </foreach>
+    </select>
+
+    <select id="getKuaiShouGroupMessageGroup" resultType="com.alibaba.fastjson.JSONObject" >
+    SELECT DATE_FORMAT(t.create_time,'%Y-%m-%d') as 'statDate',COUNT(t.effective) as 'new',COUNT(IF(t.effective ='1', TRUE, NULL))  as 'valid' from ctop_new_monitor_group t
+     where  (create_time between #{startDate}  and #{endDate}) and t.account_id in
+        <foreach item="item" collection="array" separator="," open="(" close=")" index="">
+            #{item}
+        </foreach>
+        <choose>
+            <when test='group=="1"'>
+                GROUP BY  DATE_FORMAT(t.create_time,'%Y-%m')
+            </when>
+            <otherwise>
+                GROUP BY  DATE_FORMAT(t.create_time,'%Y-%m-%d')
+            </otherwise>
+        </choose>
+    </select>
+
+    <select id="getPlanMessageGroup" resultType="com.alibaba.fastjson.JSONObject" >
+        SELECT DATE_FORMAT(t.create_time,'%Y-%m-%d') as 'statDate',COUNT(t.effective) as 'new',COUNT(IF(t.effective ='1', TRUE, NULL))  as 'valid' from ctop_new_monitor_campaign t
+        where project_type=#{project} and  (create_time between #{startDate}  and #{endDate}) and t.account_id in
+        <foreach item="item" collection="array" separator="," open="(" close=")" index="">
+            #{item}
+        </foreach>
+        <choose>
+            <when test='group=="1"'>
+                GROUP BY  DATE_FORMAT(t.create_time,'%Y-%m')
+            </when>
+            <otherwise>
+                GROUP BY  DATE_FORMAT(t.create_time,'%Y-%m-%d')
+            </otherwise>
+        </choose>
+    </select>
+
+
+
+</mapper>

+ 4 - 0
module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/report/service/IKuaishouAudienceReportDailyService.java

@@ -2,6 +2,7 @@ package cn.com.ctop.kuaishou.modules.report.service;
 
 import cn.com.ctop.common.module.entity.CtopOauthToken;
 import cn.com.ctop.kuaishou.modules.report.entity.KuaishouAudienceReportDaily;
+import com.alibaba.fastjson.JSONArray;
 import com.baomidou.mybatisplus.extension.service.IService;
 import org.jeecg.common.api.vo.Result;
 
@@ -22,4 +23,7 @@ public interface IKuaishouAudienceReportDailyService extends IService<KuaishouAu
      */
     void crowdAnalysisReport(CtopOauthToken token, String date, String type, Long plan, Long unit, Integer page, Integer pageSize);
 
+    void crowdAnalysisReport2(CtopOauthToken token, String date, String type, Long plan, Long unit, Integer page, Integer pageSize);
+
+    void crowdAnalysisReport3(CtopOauthToken token, String date, String type, Long plan, JSONArray unit, Integer page, Integer pageSize);
 }

+ 25 - 0
module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/report/service/NewMonitorService.java

@@ -0,0 +1,25 @@
+package cn.com.ctop.kuaishou.modules.report.service;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import org.jeecg.common.api.vo.Result;
+
+import java.util.List;
+
+public interface NewMonitorService {
+    public Result synchronousMonitor(String type);
+
+    List<JSONObject> getKuaiShouGroupMessage(JSONArray array, String startDate, String endDate, String target);
+
+    JSONObject getKuaiShouGroupSum(JSONArray array, String startDate, String endDate);
+
+    List<JSONObject> getKuaiShouGroupMessageGroup(JSONArray array, String startDate, String endDate);
+
+    List<JSONObject> getPlanMessage(JSONArray array, String startDate, String endDate, String target, String project);
+
+    JSONObject getPlanSum(JSONArray array, String startDate, String endDate, String project);
+
+    List<JSONObject> getPlanMessageGroup(JSONArray array, String startDate, String endDate, String project);
+
+    List<JSONObject> getOperator(String userId, String userName);
+}

+ 202 - 8
module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/report/service/impl/KuaishouAudienceReportDailyServiceImpl.java

@@ -1,11 +1,13 @@
 package cn.com.ctop.kuaishou.modules.report.service.impl;
 
 import cn.com.ctop.common.module.entity.CtopOauthToken;
+import cn.com.ctop.common.module.mapper.UserAllocationMapper;
 import cn.com.ctop.common.module.service.ICtopOauthTokenService;
 import cn.com.ctop.common.module.utils.Check;
 import cn.com.ctop.common.module.utils.HttpUtils;
 import cn.com.ctop.common.module.utils.KuaishouInterfaceConstant;
 import cn.com.ctop.common.module.utils.PropertiesUtils;
+import cn.com.ctop.kuaishou.modules.ai.mapper.AiKuaishouCreativeLevelOperationRecordMapper;
 import cn.com.ctop.kuaishou.modules.report.entity.KuaishouAudienceReportDaily;
 import cn.com.ctop.kuaishou.modules.report.entity.KuaishouAudienceReportDailyAccount;
 import cn.com.ctop.kuaishou.modules.report.entity.KuaishouAudienceReportDailyAge;
@@ -37,6 +39,7 @@ import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import javax.annotation.Resource;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
@@ -53,19 +56,19 @@ import java.util.Map;
 @Service
 public class KuaishouAudienceReportDailyServiceImpl extends ServiceImpl<KuaishouAudienceReportDailyMapper, KuaishouAudienceReportDaily> implements IKuaishouAudienceReportDailyService {
 
-    @Autowired
+    @Resource
     private KuaishouAudienceReportDailyMapper kuaishouAudienceReportDailyMapper;
-    @Autowired
+    @Resource
     private KuaishouAudienceReportDailyProvinceMapper provinceMapper;
-    @Autowired
+    @Resource
     private KuaishouAudienceReportDailyAgeMapper ageMapper;
-    @Autowired
+    @Resource
     private KuaishouAudienceReportDailyCityMapper cityMapper;
-    @Autowired
+    @Resource
     private KuaishouAudienceReportDailyClientMapper clientMapper;
-    @Autowired
+    @Resource
     private KuaishouAudienceReportDailyBusinessMapper bussinessMapper;
-    @Autowired
+    @Resource
     private KuaishouAudienceReportDailyGenderMapper genderMapper;
     @Autowired
     private IKuaishouAudienceReportDailyAccountService dailyAccountService;
@@ -89,7 +92,7 @@ public class KuaishouAudienceReportDailyServiceImpl extends ServiceImpl<Kuaishou
      * 人群分析报表入库
      *
      * @param type      province: 省级地域分布, city: 地级地域分布,gender: 性别分布,ageSegment: 年龄分布clientId: 系统分布 businessInterestTags: 商业兴趣分布
-     * @param accountId 广告主ID
+     * @param
      * @return
      */
     @Override
@@ -211,5 +214,196 @@ public class KuaishouAudienceReportDailyServiceImpl extends ServiceImpl<Kuaishou
             log.error("插入人群分析报表数据异常,数据维度:{}", type, e);
         }
     }
+    @Resource
+    cn.com.ctop.kuaishou.modules.ai.mapper.AiKuaishouCreativeLevelOperationRecordMapper creativeLevelOperationRecordMapper;
+
+    @Resource
+    UserAllocationMapper userAllocationMapper;
+
+    @Override
+    public void crowdAnalysisReport2(CtopOauthToken token, String date, String type, Long plan, Long unit, Integer page, Integer pageSize) {
+        long start = System.currentTimeMillis();
+        try {
+            String url = urlPath + KuaishouInterfaceConstant.AUDIENCE_REPORT;
+            JSONArray reportDims = new JSONArray();
+            reportDims.add(type);
+            Map<String, String> headers = new HashMap<>();
+            headers.put("Access-Token", token.getAccessToken());
+            headers.put("Content-Type", "application/json");
+            JSONObject requestJson = new JSONObject();
+            requestJson.put("advertiser_id", token.getAccountId());
+            requestJson.put("start_date", date);
+            requestJson.put("end_date", date);
+            requestJson.put("report_dims", reportDims);
+            requestJson.put("page", page);
+            requestJson.put("page_size", pageSize);
+            if (!Check.isNull(plan)) {
+                JSONArray plans = new JSONArray();
+                plans.add(plan);
+                requestJson.put("campaign_ids", plans);
+            }
+            if (!Check.isNull(unit)) {
+                JSONArray units = new JSONArray();
+                units.add(unit);
+                requestJson.put("unit_ids", units);
+            }
+            String result = HttpUtils.kuaiShouhttpPostRequest(url, requestJson.toJSONString(), headers);
+            JSONObject resultJson = JSONObject.parseObject(result);
+            if (!Check.isNull(resultJson)) {
+                Integer code = resultJson.getInteger("code");
+                if (code == 0) {
+                    JSONObject datas = resultJson.getJSONObject("data");
+                    Integer totalCount = datas.getInteger("total_count");
+                    JSONArray details = datas.getJSONArray("details");
+                    if (!Check.isNull(details)) {
+                        //账户级数据
+                        if (Check.isNull(plan) && Check.isNull(unit)) {
+                            List<KuaishouAudienceReportDailyAccount> list = new ArrayList<>();
+                            for (int i = 0; i < details.size(); i++) {
+                                JSONObject obj = details.getJSONObject(i);
+                                KuaishouAudienceReportDailyAccount entity = JSONObject.toJavaObject(obj, KuaishouAudienceReportDailyAccount.class);
+                                entity.setPhotoLike(obj.getLong("like"));
+                                entity.setComments(obj.getLong("comment"));
+                                entity.setPhotoShow(obj.getLong("show"));
+                                entity.setShares(obj.getString("share"));
+                                entity.setAccountId(Long.valueOf(token.getAccountId()));
+                                entity.setAudienceType(type);
+                                list.add(entity);
+                            }
+                            dailyAccountService.saveBatch(list);
+                        } else {
+                            List<KuaishouAudienceReportDailyProvince> provinceList = new ArrayList<>();
+                            List<KuaishouAudienceReportDailyCity> cityList = new ArrayList<>();
+                            List<KuaishouAudienceReportDailyGender> genderList = new ArrayList<>();
+                            List<KuaishouAudienceReportDailyAge> ageList = new ArrayList<>();
+                            List<KuaishouAudienceReportDailyClient> clientList = new ArrayList<>();
+                            List<KuaishouAudienceReportDailyBusiness> businessList = new ArrayList<>();
+                            //组级
+                            for (int i = 0; i < details.size(); i++) {
+                                JSONObject obj = details.getJSONObject(i);
+                                KuaishouAudienceReportDaily entity = JSONObject.toJavaObject(obj, KuaishouAudienceReportDaily.class);
+                                entity.setPhotoLike(obj.getLong("like"));
+                                entity.setComments(obj.getLong("comment"));
+                                entity.setPhotoShow(obj.getLong("show"));
+                                entity.setShares(obj.getString("share"));
+                                entity.setAccountId(Long.valueOf(token.getAccountId()));
+                                entity.setPlanId(plan);
+                                entity.setUnitId(unit);
+
+                                String signature = creativeLevelOperationRecordMapper.selectSignatureByUnitId(unit);
+                                if(!Check.isNull(signature)){
+                                    entity.setSignature(signature);
+                                }
+
+                                Long projectId = userAllocationMapper.getProjectIdByAccountId(token.getAccountId());
+                                if(!Check.isNull(projectId)){
+                                    entity.setProjectId(projectId);
+                                }
+
+                                if ("province".equals(type)) {
+                                    KuaishouAudienceReportDailyProvince provinceEntity = new KuaishouAudienceReportDailyProvince();
+                                    BeanUtils.copyProperties(entity, provinceEntity);
+                                    provinceList.add(provinceEntity);
+                                } else if ("city".equals(type)) {
+                                    KuaishouAudienceReportDailyCity cityEntity = new KuaishouAudienceReportDailyCity();
+                                    BeanUtils.copyProperties(entity, cityEntity);
+                                    cityList.add(cityEntity);
+                                } else if ("gender".equals(type)) {
+                                    KuaishouAudienceReportDailyGender genderEntity = new KuaishouAudienceReportDailyGender();
+                                    BeanUtils.copyProperties(entity, genderEntity);
+                                    genderList.add(genderEntity);
+                                } else if ("ageSegment".equals(type)) {
+                                    KuaishouAudienceReportDailyAge ageEntity = new KuaishouAudienceReportDailyAge();
+                                    BeanUtils.copyProperties(entity, ageEntity);
+                                    ageList.add(ageEntity);
+                                } else if ("clientId".equals(type)) {
+                                    KuaishouAudienceReportDailyClient clientEntity = new KuaishouAudienceReportDailyClient();
+                                    BeanUtils.copyProperties(entity, clientEntity);
+                                    clientList.add(clientEntity);
+                                } else if ("businessInterestTags".equals(type)) {
+                                    KuaishouAudienceReportDailyBusiness bussinessEntity = new KuaishouAudienceReportDailyBusiness();
+                                    BeanUtils.copyProperties(entity, bussinessEntity);
+                                    businessList.add(bussinessEntity);
+                                }
+                            }
+                            if ("province".equals(type)) {
+                                provinceMapper.replaceBatchNew(provinceList);
+                            } else if ("city".equals(type)) {
+                                cityMapper.replaceBatchNew(cityList);
+                            } else if ("gender".equals(type)) {
+                                genderMapper.replaceBatchNew(genderList);
+                            } else if ("ageSegment".equals(type)) {
+                                ageMapper.replaceBatchNew(ageList);
+                            } else if ("clientId".equals(type)) {
+                                clientMapper.replaceBatchNew(clientList);
+                            } else if ("businessInterestTags".equals(type)) {
+                                bussinessMapper.replaceBatchNew(businessList);
+                            }
+                        }
+                        Integer totalPage = (totalCount - 1) / pageSize + 1;
+                        if (page < totalPage) {
+                            crowdAnalysisReport2(token,date, type, plan, unit, page + 1, pageSize);
+                        }
+                    } else {
+                        if(totalCount != 0){
+                            log.error("-----------未查询到人群分析报表数据:unitId:{},日期:{}, 总量:{}", unit, date,totalCount);
+                        }
+                    }
+                } else {
+                    if(code == 500000 || code == 400001){
+                        System.out.print("》》5秒后重试,accountId:"+unit+",日期:"+date+"《《 "+resultJson);
+                        try{Thread.sleep(5000);} catch (InterruptedException e){};
+                        crowdAnalysisReport2(token,date, type, plan, unit, page, pageSize);
+                    }else {
+                        log.error("查询人群分析报表数据返回信息错误:unit:{},日期{},返回信息:{}", unit,date, resultJson);
+                    }
+                }
+            }
+        } catch (Exception e) {
+            log.error("插入人群分析报表数据异常,数据维度:{}", type, e);
+        }
+    }
+
+
+    @Override
+    public void crowdAnalysisReport3(CtopOauthToken token, String date, String type, Long plan, JSONArray unit, Integer page, Integer pageSize) {
+        long start = System.currentTimeMillis();
+        try {
+            String url = urlPath + KuaishouInterfaceConstant.AUDIENCE_REPORT;
+            JSONArray reportDims = new JSONArray();
+            reportDims.add(type);
+            Map<String, String> headers = new HashMap<>();
+            headers.put("Access-Token", token.getAccessToken());
+            headers.put("Content-Type", "application/json");
+            JSONObject requestJson = new JSONObject();
+            requestJson.put("advertiser_id", token.getAccountId());
+            requestJson.put("start_date", date);
+            requestJson.put("end_date", date);
+            requestJson.put("report_dims", reportDims);
+            requestJson.put("page", page);
+            requestJson.put("page_size", pageSize);
+            if (!Check.isNull(plan)) {
+                JSONArray plans = new JSONArray();
+                plans.add(plan);
+                requestJson.put("campaign_ids", plans);
+            }
+            if (!Check.isNull(unit)) {
+                requestJson.put("unit_ids", unit);
+            }
+            String result = HttpUtils.kuaiShouhttpPostRequest(url, requestJson.toJSONString(), headers);
+            JSONObject resultJson = JSONObject.parseObject(result);
+            if (!Check.isNull(resultJson)) {
+                Integer code = resultJson.getInteger("code");
+                if (code == 0) {
+                    JSONObject datas = resultJson.getJSONObject("data");
+                    Integer totalCount = datas.getInteger("total_count");
+                    JSONArray details = datas.getJSONArray("details");
+                    System.out.println("datas"+datas.toJSONString());
+                }
+            }
+        } catch (Exception e) {
+            log.error("插入人群分析报表数据异常,数据维度:{}", type, e);
+        }
+    }
 }
 

+ 289 - 0
module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/report/service/impl/NewMonitorServiceImpl.java

@@ -0,0 +1,289 @@
+package cn.com.ctop.kuaishou.modules.report.service.impl;
+
+import cn.com.ctop.kuaishou.modules.report.entity.NewMonitorInfo;
+import cn.com.ctop.kuaishou.modules.report.mapper.NewMonitorMapper;
+import cn.com.ctop.kuaishou.modules.report.service.NewMonitorService;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import lombok.extern.slf4j.Slf4j;
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.common.util.DateUtils;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.math.BigDecimal;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+@Service
+@Slf4j
+public class NewMonitorServiceImpl implements NewMonitorService {
+
+    @Resource
+    NewMonitorMapper newMonitorMapper;
+
+    /**
+     * 同步新上监控数据
+     *
+     * @param
+     * @return
+     */
+    public Result synchronousMonitor(String type) {
+        Result result = new Result();
+        List<Map> kuaiShouGroup = new ArrayList<>();
+        List<Map> kuaiShouCampaign = new ArrayList<>();
+        List<Map> TouTiaoCampaign = new ArrayList<>();
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+        List<Long> allAccountId = newMonitorMapper.getAllAccountId();
+        if (!allAccountId.isEmpty()) {
+            for (Long accId : allAccountId) {
+                if (accId != null) {
+                    /*--------------------快手广告组-----------------------*/
+                    if (type.equals("0")) {
+                        //查询创建不满7天的快手组信息
+                        kuaiShouGroup = newMonitorMapper.getKuaiShouGroup(sdf.format(new Date()), String.valueOf(accId));
+                    } else {
+                        //查询全量快手组信息
+                        kuaiShouGroup = newMonitorMapper.getKuaiShouGroup(null, String.valueOf(accId));
+                    }
+                    //处理快手组数据
+                    if (!kuaiShouGroup.isEmpty()) {
+                        kuaiShouGroup.stream().forEach(obj -> {
+                            if (obj != null) {
+                                String unitId = obj.get("unitId") == null ? null : String.valueOf(obj.get("unitId"));
+                                String afterTime = obj.get("afterTime") == null ? null : (String) obj.get("afterTime");
+                                String accountId = obj.get("accountId") == null ? null : String.valueOf(obj.get("accountId"));
+                                String accountName = obj.get("accountName") == null ? null : (String) obj.get("accountName");
+                                String userName = obj.get("userName") == null ? null : (String) obj.get("userName");
+                                String groupCreatTime = obj.get("groupCreatTime") == null ? null : (String) obj.get("groupCreatTime");
+                                if (unitId != null && afterTime != null) {
+                                    BigDecimal groupCharge = newMonitorMapper.getGroupCharge(unitId, afterTime);
+                                    //大于500为有效广告组
+                                    String effective = "0";
+                                    if (groupCharge != null && groupCharge.compareTo(new BigDecimal(500)) == 1) {
+                                        //有效
+                                        effective = "1";
+                                    }
+                                    String effectiveResult = newMonitorMapper.getMonitorGroupByUnitId(unitId);
+                                    //判断是否存在
+                                    if (effectiveResult != null) {
+                                        if (!effectiveResult.equals(effective)) {
+                                            //存在更新
+                                            newMonitorMapper.updateMonitorGroupByUnitId(unitId, effective);
+                                        }
+
+                                    } else {
+                                        //不存在插入
+                                        newMonitorMapper.saveMonitorGroup(accountId, accountName, userName, unitId, groupCreatTime, "1", effective);
+                                    }
+                                }
+                            }
+                        });
+                    }
+
+
+                    /*---------------快手广告计划------------------*/
+                    if (type.equals("0")) {
+                        //查询创建不满7天的快手广告计划
+                        kuaiShouCampaign = newMonitorMapper.getKuaiShouCampaign(sdf.format(new Date()), String.valueOf(accId));
+                    } else {
+                        //查询全量快手广告计划
+                        kuaiShouCampaign = newMonitorMapper.getKuaiShouCampaign(null, String.valueOf(accId));
+                    }
+                    //处理快手广告计划数据
+                    if (!kuaiShouCampaign.isEmpty()) {
+                        kuaiShouCampaign.stream().forEach(obj -> {
+                            if (obj != null) {
+                                String campaignId = obj.get("campaignId") == null ? null : String.valueOf(obj.get("campaignId"));
+                                String afterTime = obj.get("afterTime") == null ? null : (String) obj.get("afterTime");
+                                String accountId = obj.get("accountId") == null ? null : String.valueOf(obj.get("accountId"));
+                                String accountName = obj.get("accountName") == null ? null : (String) obj.get("accountName");
+                                String userName = obj.get("userName") == null ? null : (String) obj.get("userName");
+                                String campaignCreatTime = obj.get("campaignCreatTime") == null ? null : (String) obj.get("campaignCreatTime");
+                                if (campaignId != null && afterTime != null) {
+                                    BigDecimal campaignCharge = newMonitorMapper.getCampaignCharge(campaignId, afterTime);
+                                    //大于500为有效广告计划
+                                    String effective = "0";
+                                    if (campaignCharge != null && campaignCharge.compareTo(new BigDecimal(500)) == 1) {
+                                        //有效
+                                        effective = "1";
+                                    }
+                                    String effectiveResult = newMonitorMapper.getMonitorPlanByCampaignId(campaignId);
+                                    //判断是否存在
+                                    if (effectiveResult != null) {
+                                        if (!effectiveResult.equals(effective)) {
+                                            //存在更新
+                                            newMonitorMapper.updateMonitorPlanByCampaignId(campaignId, effective);
+                                        }
+                                    } else {
+                                        //不存在插入
+                                        newMonitorMapper.saveMonitorCampaign(accountId, accountName, userName, campaignId, campaignCreatTime, "1", effective);
+                                    }
+                                }
+                            }
+                        });
+                    }
+
+                    /*---------------头条广告计划------------------*/
+                    if (type.equals("0")) {
+                        //查询创建不满7天的头条广告计划
+                        TouTiaoCampaign = newMonitorMapper.getTouTiaoCampaign(sdf.format(new Date()), String.valueOf(accId));
+                    } else {
+                        //查询全量头条广告计划
+                        TouTiaoCampaign = newMonitorMapper.getTouTiaoCampaign(null, String.valueOf(accId));
+                    }
+                    //处理快手广告计划数据
+                    if (!TouTiaoCampaign.isEmpty()) {
+                        TouTiaoCampaign.stream().forEach(obj -> {
+                            if (obj != null) {
+                                String campaignId = obj.get("campaignId") == null ? null : String.valueOf(obj.get("campaignId"));
+                                String afterTime = obj.get("afterTime") == null ? null : (String) obj.get("afterTime");
+                                String accountId = obj.get("accountId") == null ? null : String.valueOf(obj.get("accountId"));
+                                String accountName = obj.get("accountName") == null ? null : (String) obj.get("accountName");
+                                String userName = obj.get("userName") == null ? null : (String) obj.get("userName");
+                                String campaignCreatTime = obj.get("campaignCreatTime") == null ? null : (String) obj.get("campaignCreatTime");
+                                if (campaignId != null && afterTime != null) {
+                                    BigDecimal campaignCharge = newMonitorMapper.getCampaignChargeTouTiao(campaignId, afterTime);
+                                    //大于500为有效广告计划
+                                    String effective = "0";
+                                    if (campaignCharge != null && campaignCharge.compareTo(new BigDecimal(500)) == 1) {
+                                        //有效
+                                        effective = "1";
+                                    }
+                                    String effectiveResult = newMonitorMapper.getMonitorPlanByCampaignId(campaignId);
+                                    //判断是否存在
+                                    if (effectiveResult != null) {
+                                        if (!effectiveResult.equals(effective)) {
+                                            //存在更新
+                                            newMonitorMapper.updateMonitorPlanByCampaignId(campaignId, effective);
+                                        }
+                                    } else {
+                                        //不存在插入
+                                        newMonitorMapper.saveMonitorCampaign(accountId, accountName, userName, campaignId, campaignCreatTime, "0", effective);
+                                    }
+                                }
+                            }
+                        });
+                    }
+                }
+            }
+        }
+
+
+        return result;
+    }
+
+
+    /**
+     * 查询快手组信息
+     *
+     * @param
+     * @return
+     */
+    @Override
+    public List<JSONObject> getKuaiShouGroupMessage(JSONArray array, String startDate, String endDate, String target) {
+        return newMonitorMapper.getKuaiShouGroupMessage(array, startDate, endDate);
+    }
+
+    /**
+     * 查询快手组新上和有效数量
+     *
+     * @param
+     * @return
+     */
+    @Override
+    public JSONObject getKuaiShouGroupSum(JSONArray array, String startDate, String endDate) {
+        return newMonitorMapper.getKuaiShouGroupSum(array, startDate, endDate);
+    }
+
+    /**
+     * 查询快手组时间轴数据
+     *
+     * @param
+     * @return
+     */
+    @Override
+    public List<JSONObject> getKuaiShouGroupMessageGroup(JSONArray array, String startDate, String endDate) {
+        String group = "0";
+        List<JSONObject> kuaiShouGroupMessageGroup = new ArrayList<>();
+        try {
+            if (DateUtils.isMoreSixMonth(startDate, endDate)) {
+                group = "1";
+            }
+            kuaiShouGroupMessageGroup = newMonitorMapper.getKuaiShouGroupMessageGroup(array, startDate, endDate, group);
+        } catch (Exception e) {
+            log.info("查询数据错误:{}", e.toString());
+        }
+
+        return kuaiShouGroupMessageGroup;
+    }
+
+    @Override
+    public List<JSONObject> getPlanMessage(JSONArray array, String startDate, String endDate, String target, String project) {
+        return newMonitorMapper.getPlanMessage(array, startDate, endDate, project);
+    }
+
+    /**
+     * 查询快手广告计划 新上和有效数量
+     *
+     * @param
+     * @return
+     */
+    @Override
+    public JSONObject getPlanSum(JSONArray array, String startDate, String endDate, String project) {
+        return newMonitorMapper.getPlanSum(array, startDate, endDate, project);
+    }
+
+    @Override
+    public List<JSONObject> getPlanMessageGroup(JSONArray array, String startDate, String endDate, String project) {
+        String group = "0";
+        List<JSONObject> planGroupMessageGroup = new ArrayList<>();
+        try {
+            if (DateUtils.isMoreSixMonth(startDate, endDate)) {
+                group = "1";
+            }
+            planGroupMessageGroup = newMonitorMapper.getPlanMessageGroup(array, startDate, endDate, group, project);
+        } catch (Exception e) {
+            log.info("查询数据错误:{}", e.toString());
+        }
+
+        return planGroupMessageGroup;
+    }
+
+    @Override
+    public List<JSONObject> getOperator(String userId, String userName) {
+        List<JSONObject> list = new ArrayList<>();
+        JSONObject ob = new JSONObject();
+        ob.put("user_id", userId);
+        ob.put("user_name", userName);
+        list.add(ob);
+        try {
+            if (userId != null) {
+                List<NewMonitorInfo> operator = newMonitorMapper.getOperator(userId);
+                list.addAll(getAllNode(operator));
+            }
+        } catch (Exception e) {
+            log.info("查询失败:{}", e.toString());
+        }
+        return list;
+    }
+
+    List<JSONObject> getAllNode(List<NewMonitorInfo> operator) {
+        List<JSONObject> objects = new ArrayList<>();
+        if (!operator.isEmpty()) {
+            for (NewMonitorInfo newMonitorInfo : operator) {
+                JSONObject js = new JSONObject();
+                js.put("user_id", newMonitorInfo.getUser_id());
+                js.put("user_name", newMonitorInfo.getUser_name());
+                objects.add(js);
+                if (newMonitorInfo.getChildren() != null && newMonitorInfo.getChildren().size() > 0) {
+                    objects.addAll(getAllNode(newMonitorInfo.getChildren()));
+                }
+            }
+        }
+        return objects;
+    }
+}

+ 30 - 0
module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/agent/controller/AgentManagementController.java

@@ -0,0 +1,30 @@
+package cn.com.ctop.toutiao.modules.agent.controller;
+
+import cn.com.ctop.toutiao.modules.agent.service.AgentManagementService;
+import com.alibaba.fastjson.JSONObject;
+import lombok.extern.slf4j.Slf4j;
+import org.jeecg.common.api.vo.Result;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.ArrayList;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+@RestController
+@RequestMapping("/agent")
+@Slf4j
+public class AgentManagementController {
+
+    @Autowired
+    AgentManagementService agentManagementService;
+
+    @RequestMapping("/queryAccountTransactionDetails")
+    public void  getList(){
+        Result recharge = agentManagementService.synchronousAccountTransactionDetails();
+        log.info("123");
+
+    }
+}

+ 73 - 0
module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/agent/entity/TransactionDetails.java

@@ -0,0 +1,73 @@
+package cn.com.ctop.toutiao.modules.agent.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.math.BigDecimal;
+
+@Data
+@TableName("ctop_account_transaction_details")
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value = "ctop_account_transaction_details对象", description = "账户交易流水")
+public class TransactionDetails {
+    @TableId(type = IdType.AUTO)
+    @ApiModelProperty(value = "id")
+    private String id;
+
+    //广告主ID
+    @ApiModelProperty(value = "advertiser_id")
+    private String advertiser_id;
+
+    //流水类型  RECHARGE:充值      TRANSFER:转账
+    @ApiModelProperty(value = "transaction_type")
+    private String transaction_type;
+
+    //流水产生时间
+    @ApiModelProperty(value = "data_time")
+    private String data_time;
+
+    //交易总金额(单位元)
+    @ApiModelProperty(value = "amount")
+    private BigDecimal amount;
+
+    //现金总金额(单位元)
+    @ApiModelProperty(value = "cash")
+    private BigDecimal cash;
+
+    //赠款总金额(单位元)
+    @ApiModelProperty(value = "grant")
+    private BigDecimal grant;
+
+    //返货总金额(单位元)
+    @ApiModelProperty(value = "return_goods")
+    private BigDecimal return_goods;
+
+    //交易流水号
+    @ApiModelProperty(value = "transaction_seq")
+    private String transaction_seq;
+
+    //付款方,即广告主id
+    @ApiModelProperty(value = "remitter")
+    private String remitter;
+
+    //收款方,即广告主id。
+    @ApiModelProperty(value = "payee")
+    private String payee;
+
+    //返点
+    @ApiModelProperty(value = "dealbase")
+    private String dealbase;
+
+    //数据创建时间
+    @ApiModelProperty(value = "create_time")
+    private String create_time;
+
+
+}

+ 15 - 0
module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/agent/mapper/CtopAccountTransactionDetailsMapper.java

@@ -0,0 +1,15 @@
+package cn.com.ctop.toutiao.modules.agent.mapper;
+
+import cn.com.ctop.toutiao.modules.agent.entity.TransactionDetails;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+@Mapper
+public interface CtopAccountTransactionDetailsMapper {
+    //保存交易记录
+    public void saveAccountTransactionDetails(@Param("list") List<TransactionDetails> list, @Param("date")String date);
+    //根据日期查询当日所有交易订单号
+    public List<String> getTransactionSeq( @Param("date")String date);
+}

+ 16 - 0
module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/agent/mapper/CtopAgentAccountMapper.java

@@ -0,0 +1,16 @@
+package cn.com.ctop.toutiao.modules.agent.mapper;
+
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+@Mapper
+public interface CtopAgentAccountMapper {
+    //获取所有账户
+    public List<String> getAllAccountId();
+    //根据账户id修改账户状态
+    public void updateAccountState(@Param("list")List<String> list,@Param("state")int state);
+    //批量插入新增数据
+    public void insertAccountData(@Param("list") List<String> list,@Param("agent_id")String agent_id,@Param("create_time")String create_time);
+}

+ 30 - 0
module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/agent/mapper/xml/CtopAccountTransactionDetailsMapper.xml

@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="cn.com.ctop.toutiao.modules.agent.mapper.CtopAccountTransactionDetailsMapper">
+   <!-- 批量插入新增数据-->
+    <insert id="saveAccountTransactionDetails">
+        insert  into ctop_account_transaction_details (advertiser_id,transaction_type,data_time,amount,cash,grant_amount,return_goods,transaction_seq,
+        remitter,payee,dealbase,create_time) values
+        <foreach collection="list" item="item" index="index" separator=",">
+            (
+            #{item.advertiser_id},
+            #{item.transaction_type},
+            #{item.create_time},
+            #{item.amount},
+            #{item.cash},
+            #{item.grant},
+            #{item.return_goods},
+            #{item.transaction_seq},
+            #{item.remitter},
+            #{item.payee},
+            #{item.dealbase},
+            #{date}
+            )
+        </foreach>
+    </insert>
+
+    <select id="getTransactionSeq" parameterType="String" resultType="String">
+        select t.transaction_seq from ctop_account_transaction_details t where t.create_time=#{date}
+    </select>
+
+</mapper>

+ 28 - 0
module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/agent/mapper/xml/CtopAgentAccountMapper.xml

@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="cn.com.ctop.toutiao.modules.agent.mapper.CtopAgentAccountMapper">
+    <!--获取所有账户-->
+    <select id="getAllAccountId" resultType="String">
+        select account_id from ctop_agent_account where state=0
+    </select>
+   <!-- 根据账户id修改账户状态-->
+    <update id="updateAccountState">
+        update ctop_agent_account set state=#{state} where account_id in
+        <foreach item="item" index="index" collection="list" open="("  close=")" separator=",">
+            #{item}
+        </foreach>
+    </update>
+   <!-- 批量插入新增数据-->
+    <insert id="insertAccountData">
+        insert  into ctop_agent_account (account_id,agent_id,state,create_time) values
+        <foreach collection="list" item="item" index="index" separator=",">
+            (
+            #{item},
+            #{agent_id},
+            0,
+            #{create_time}
+            )
+        </foreach>
+    </insert>
+
+</mapper>

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

@@ -0,0 +1,22 @@
+package cn.com.ctop.toutiao.modules.agent.service;
+
+import com.alibaba.fastjson.JSONObject;
+import org.jeecg.common.api.vo.Result;
+
+public interface AgentManagementService {
+    //获取TOKEN
+    public String getToken();
+
+    //查询代理商下账户
+    public  JSONObject selectAgentAdvertiser(int pageNum,int pageSize);
+
+
+    //查询账号流水
+    public JSONObject queryAccountTransactionDetails(String AccountId,String transaction_type, int pageNum, int pageSize);
+
+    //同步代理商账户入库
+    public Result synchronousAccount();
+
+    //同步账户交易流水
+    public Result synchronousAccountTransactionDetails();
+}

+ 340 - 0
module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/agent/service/impl/AgentManagementServiceImpl.java

@@ -0,0 +1,340 @@
+package cn.com.ctop.toutiao.modules.agent.service.impl;
+
+import cn.com.ctop.common.module.entity.CtopOauthToken;
+import cn.com.ctop.common.module.mapper.CtopOauthTokenMapper;
+import cn.com.ctop.toutiao.modules.agent.entity.TransactionDetails;
+import cn.com.ctop.toutiao.modules.agent.mapper.CtopAccountTransactionDetailsMapper;
+import cn.com.ctop.toutiao.modules.agent.mapper.CtopAgentAccountMapper;
+import cn.com.ctop.toutiao.modules.agent.service.AgentManagementService;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.http.client.ClientProtocolException;
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.client.methods.HttpEntityEnclosingRequestBase;
+import org.apache.http.entity.ContentType;
+import org.apache.http.entity.StringEntity;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClientBuilder;
+import org.jeecg.common.api.vo.Result;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.net.URI;
+import java.text.SimpleDateFormat;
+import java.util.*;
+
+import static java.util.stream.Collectors.toList;
+
+/**
+ * 代理商管理
+ *
+ * @author zzy
+ * @create: 2021-07-14
+ */
+@Service
+@Slf4j
+public class AgentManagementServiceImpl implements AgentManagementService {
+
+    private final String OPEN_API_URL_PREFIX = "https://ad.oceanengine.com/open_api/2/";
+    private final String ACCOUNT_LIST_URL = "agent/advertiser/select/";
+    private final String ACCOUNT_TRANSACTION_DETAILS_URL = "advertiser/fund/transaction/get/";
+    private final String ADVERTISER_ID = "73970348172";
+    private final String RECHARGE = "RECHARGE";
+    private final String TRANSFER = "TRANSFER";
+    @Resource
+    CtopOauthTokenMapper ctopOauthTokenMapper;
+
+    @Resource
+    CtopAgentAccountMapper ctopAgentAccountMapper;
+    @Resource
+    CtopAccountTransactionDetailsMapper ctopAccountTransactionDetailsMapper;
+
+    /**
+     * 同步代理商下账号
+     *
+     * @author zzy
+     * @create: 2021-07-14
+     */
+
+    @Override
+    public Result synchronousAccount() {
+        log.info("开始同步账号信息");
+        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");//设置日期格式
+        List<String> dataList = new ArrayList();
+        Result result = new Result();
+        try {
+            //分页查询第一页数据
+            JSONObject agentAccountList = selectAgentAdvertiser(1, 2000);
+            JSONObject data = (JSONObject) agentAccountList.get("data");
+            //dataList.addAll((List) data.get("list"));
+            if (data.size() > 0) {
+                JSONObject page_info = (JSONObject) data.get("page_info");
+                int total_page = (int) page_info.get("total_page");
+                //查询其他页数据
+                for (int i = 0; i < total_page; i++) {
+                    JSONObject agenttList = selectAgentAdvertiser(i + 1, 2000);
+                    JSONObject agentData = (JSONObject) agenttList.get("data");
+                    List<Long> list = (List<Long>) agentData.get("list");
+                    list.stream().forEach(str -> {
+                        dataList.add(str.toString());
+                    });
+
+                }
+                //查询数据库已存在id
+                List<String> accountIdList = ctopAgentAccountMapper.getAllAccountId();
+                if (!accountIdList.isEmpty()) {
+                    //筛选巨量引擎剔除的用户
+                    List<String> removeList = accountIdList.stream().filter(item -> !dataList.contains(item)).collect(toList());
+                    //筛选巨量引擎新增的用户
+                    List<String> addList = dataList.stream().filter(item -> !accountIdList.contains(item)).collect(toList());
+                    //修改剔除的用户状态
+                    if (!removeList.isEmpty()) {
+                        ctopAgentAccountMapper.updateAccountState(removeList, 1);
+                    }
+                    //保存新增的用户
+                    if (!addList.isEmpty()) {
+                        ctopAgentAccountMapper.insertAccountData(addList, ADVERTISER_ID, df.format(new Date()));
+                    }
+                } else {
+                    ctopAgentAccountMapper.insertAccountData(dataList, ADVERTISER_ID, df.format(new Date()));
+                }
+
+            }
+            result.setSuccess(true);
+            result.setMessage("success");
+            return result;
+        } catch (Exception e) {
+            log.info("同步失败:{}", e.toString());
+            result.error500("同步失败");
+            return result;
+        }
+    }
+
+    /**
+     * 同步账户交易流水
+     *
+     * @author zzy
+     * @create: 2021-07-15
+     */
+    @Override
+    public Result synchronousAccountTransactionDetails() {
+        log.info("开始同步账号交易流水");
+        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");//设置日期格式
+        List<TransactionDetails> transactionDetailsList = new ArrayList<>();
+        try {
+            List<String> accountIdList = ctopAgentAccountMapper.getAllAccountId();
+            if (!accountIdList.isEmpty()) {
+                List<String> transactionSeqList = ctopAccountTransactionDetailsMapper.getTransactionSeq(df.format(new Date()));
+                accountIdList.stream().forEach(str -> {
+                    if (!str.isEmpty()) {
+                        //查询账号下充值的交易流水
+                        JSONObject jsonObject = queryAccountTransactionDetails(str, RECHARGE, 1, 1000);
+                        JSONObject data = (JSONObject) jsonObject.get("data");
+                        List<Object> dataList = (List<Object>) data.get("list");
+                        if (!dataList.isEmpty()) {
+                            //充值类存在记录
+                            //保存第一页数据
+                            dataList.stream().forEach(ob -> {
+                                TransactionDetails transactionDetails = JSONObject.toJavaObject((JSON) ob, TransactionDetails.class);
+                                //订单号不存在
+                                if (transactionSeqList.isEmpty() || !transactionSeqList.contains(transactionDetails.getTransaction_seq())) {
+                                    transactionDetailsList.add(transactionDetails);
+                                }
+
+                            });
+                            JSONObject page_info = (JSONObject) data.get("page_info");
+                            int total_page = (int) page_info.get("total_page");
+                            //查询其他页数据
+                            if (total_page > 1) {
+                                for (int i = 2; i <= total_page; i++) {
+                                    JSONObject jo = queryAccountTransactionDetails(str, RECHARGE, i, 1000);
+                                    JSONObject accountData = (JSONObject) jo.get("data");
+                                    List<Object> rechargeList = (List<Object>) accountData.get("list");
+                                    rechargeList.stream().forEach(transactionDetails -> {
+                                        TransactionDetails transactionDetailsOther = JSONObject.toJavaObject((JSON) transactionDetails, TransactionDetails.class);
+                                        //订单号不存在
+                                        if (transactionSeqList.isEmpty() || !transactionSeqList.contains(transactionDetailsOther.getTransaction_seq())) {
+                                            transactionDetailsList.add(transactionDetailsOther);
+                                        }
+                                    });
+                                }
+                            }
+                        }
+                        //查询账号下转账的交易流水
+                        JSONObject transferJsonObject = queryAccountTransactionDetails(str, TRANSFER, 1, 1000);
+                        JSONObject transferData = (JSONObject) transferJsonObject.get("data");
+                        List<Object> transferDataList = (List<Object>) transferData.get("list");
+                        if (!transferDataList.isEmpty()) {
+                            //转账类存在记录
+                            //保存第一页数据
+                            transferDataList.stream().forEach(ob -> {
+                                TransactionDetails transactionDetails = JSONObject.toJavaObject((JSON) ob, TransactionDetails.class);
+                                //订单号不存在
+                                if (transactionSeqList.isEmpty() || !transactionSeqList.contains(transactionDetails.getTransaction_seq())) {
+                                    transactionDetailsList.add(transactionDetails);
+                                }
+                            });
+                            JSONObject transferPageInfo = (JSONObject) transferData.get("page_info");
+                            int transferTotalPage = (int) transferPageInfo.get("total_page");
+                            //查询其他页数据
+                            if (transferTotalPage > 1) {
+                                for (int i = 2; i <= transferTotalPage; i++) {
+                                    JSONObject jo = queryAccountTransactionDetails(str, TRANSFER, i, 1000);
+                                    JSONObject accountData = (JSONObject) jo.get("data");
+                                    List<Object> rechargeList = (List<Object>) accountData.get("list");
+                                    rechargeList.stream().forEach(transactionDetails -> {
+                                        TransactionDetails transactionDetailsOther = JSONObject.toJavaObject((JSON) transactionDetails, TransactionDetails.class);
+                                        //订单号不存在
+                                        if (transactionSeqList.isEmpty() || !transactionSeqList.contains(transactionDetailsOther.getTransaction_seq())) {
+                                            transactionDetailsList.add(transactionDetailsOther);
+                                        }
+                                    });
+                                }
+                            }
+                        }
+                    }
+                });
+            }
+            //保存数据
+            if (!transactionDetailsList.isEmpty()) {
+                ctopAccountTransactionDetailsMapper.saveAccountTransactionDetails(transactionDetailsList, df.format(new Date()));
+                log.info("新增交易记录:{}条", transactionDetailsList.size());
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            log.info("同步失败:{}", e.toString());
+        }
+
+
+        return null;
+    }
+
+    /**
+     * 查询账号流水
+     *
+     * @return
+     * @author zzy
+     * @Param AccountId 账户id    transaction_type 流水类型  RECHARGE:充值  TRANSFER:转账     pageNum 当前页    pageSize 每页显示数量
+     * @create: 2021-07-14
+     */
+    @Override
+    public JSONObject queryAccountTransactionDetails(String AccountId, String transaction_type, int pageNum, int pageSize) {
+        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");//设置日期格式
+        Calendar ca = Calendar.getInstance();
+        ca.setTime(new Date());
+        ca.add(Calendar.DATE, -1);
+        // 请求参数
+        Map data = new HashMap() {
+            {
+                put("advertiser_id", AccountId);
+                put("start_date", df.format(ca.getTime()));
+                put("end_date", df.format(ca.getTime()));
+                put("transaction_type", transaction_type);
+                put("page", pageNum);
+                put("page_size", pageSize);
+            }
+        };
+        return sendHttpRequest(data, ACCOUNT_TRANSACTION_DETAILS_URL);
+    }
+
+
+    /**
+     * 获取token
+     *
+     * @author zzy
+     * @create: 2021-07-14
+     */
+    @Override
+    public String getToken() {
+        CtopOauthToken ctopOauthToken = ctopOauthTokenMapper.selectByAccountId(Long.parseLong(ADVERTISER_ID));
+        if (ctopOauthToken != null) {
+            return ctopOauthToken.getAccessToken();
+        } else {
+            log.info("未查询到Token");
+            return null;
+        }
+
+    }
+
+    /**
+     * 获取账户列表
+     *
+     * @author zzy
+     * @Param pageNum 当前页    pageSize 每页显示数量
+     * @create: 2021-07-14
+     */
+    @Override
+    public JSONObject selectAgentAdvertiser(int pageNum, int pageSize) {
+        // 请求参数
+        Map data = new HashMap() {
+            {
+                put("advertiser_id", ADVERTISER_ID);
+                put("page", pageNum);
+                put("page_size", pageSize);
+            }
+        };
+        return sendHttpRequest(data, ACCOUNT_LIST_URL);
+    }
+
+
+    /**
+     * 根据地址请求巨量殷勤,返回响应结果
+     *
+     * @author zzy
+     * @Param data 请求参数    apiUrl请求路径
+     * @create: 2021-07-14
+     */
+    public JSONObject sendHttpRequest(Map data, String apiUrl) {
+        String access_token = getToken();
+        // 构造请求
+        HttpEntityEnclosingRequestBase httpEntity = new HttpEntityEnclosingRequestBase() {
+            @Override
+            public String getMethod() {
+                return "GET";
+            }
+        };
+
+        httpEntity.setHeader("Access-Token", access_token);
+
+        CloseableHttpResponse response = null;
+        CloseableHttpClient client = null;
+
+        try {
+            client = HttpClientBuilder.create().build();
+            httpEntity.setURI(URI.create(OPEN_API_URL_PREFIX + apiUrl));
+            httpEntity.setEntity(new StringEntity(JSONObject.toJSONString(data), ContentType.APPLICATION_JSON));
+
+            response = client.execute(httpEntity);
+            if (response != null && response.getStatusLine().getStatusCode() == 200) {
+                BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
+                StringBuffer result = new StringBuffer();
+                String line = "";
+                while ((line = bufferedReader.readLine()) != null) {
+                    result.append(line);
+                }
+                bufferedReader.close();
+                return JSONObject.parseObject(result.toString());
+            }
+
+        } catch (ClientProtocolException e) {
+            e.printStackTrace();
+        } catch (IOException e) {
+            e.printStackTrace();
+        } finally {
+            try {
+                if (response != null) {
+                    response.close();
+                }
+                client.close();
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        }
+        return null;
+    }
+
+}