Bladeren bron

合并wps代码

syh 5 jaren geleden
bovenliggende
commit
6a491c9663
100 gewijzigde bestanden met toevoegingen van 1836 en 641 verwijderingen
  1. 21 6
      jeecg-boot-base-common/src/main/java/org/jeecg/common/system/vo/LoginUser.java
  2. 26 3
      jeecg-boot-base-common/src/main/java/org/jeecg/common/util/DateUtils.java
  3. 3 9
      jeecg-boot-module-system/pom.xml
  4. 0 67
      jeecg-boot-module-system/src/main/java/org/jeecg/config/RabbitConfig.java
  5. 3 2
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/controller/AdvertiserController.java
  6. 8 2
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/controller/MaterialCutFrameController.java
  7. 10 3
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/controller/MaterialInfoController.java
  8. 13 21
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/controller/PangolinController.java
  9. 3 2
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/controller/ProjectController.java
  10. 2 1
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/controller/ProjectMemberController.java
  11. 111 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/controller/TestController.java
  12. 27 6
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/controller/UserAllocationController.java
  13. 6 1
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/job/BytedanceDailyMaterialReportJob.java
  14. 22 2
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/job/BytedanceDailyMaterialReportRetryJob.java
  15. 59 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/job/CutFrameJob.java
  16. 2 2
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/job/KuaishouCrawlerJob.java
  17. 3 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/job/KuaishouDailyAccountReportLoadJob.java
  18. 1 1
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/job/KuaishouDailyAccountReportNextDayStayJob.java
  19. 1 14
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/job/PangolinDataJob.java
  20. 22 2
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/service/impl/CreateInternalServiceImpl.java
  21. 2 2
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/service/impl/ProjectMemberServiceImpl.java
  22. 0 20
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/mq/Receiver.java
  23. 0 27
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/mq/Sender.java
  24. 0 4
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/performanceappraisal/aa.java
  25. 52 21
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/controller/SysUserController.java
  26. 2 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/mapper/SysUserMapper.java
  27. 28 9
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/mapper/xml/SysUserMapper.xml
  28. 96 84
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/ISysUserService.java
  29. 6 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/impl/SysUserServiceImpl.java
  30. 1 6
      jeecg-boot-module-system/src/main/resources/application-dev.yml
  31. 2 8
      jeecg-boot-module-system/src/main/resources/application-prod.yml
  32. 12 18
      jeecg-boot-module-system/src/main/resources/application-test.yml
  33. 0 1
      jeecg-boot-module-system/src/main/resources/static/demo1.html
  34. 113 67
      jeecg-boot-module-system/src/test/java/org/jeecg/SampleTest.java
  35. 5 0
      module-common/src/main/java/cn/com/ctop/common/module/constant/CtopRoleCodeConstant.java
  36. 5 0
      module-common/src/main/java/cn/com/ctop/common/module/constant/OssConstant.java
  37. 3 3
      module-common/src/main/java/cn/com/ctop/common/module/entity/MaterialCutFrame.java
  38. 63 0
      module-common/src/main/java/cn/com/ctop/common/module/entity/MaterialCutFrameTask.java
  39. 7 0
      module-common/src/main/java/cn/com/ctop/common/module/entity/MaterialInfo.java
  40. 3 0
      module-common/src/main/java/cn/com/ctop/common/module/mapper/CtopOauthTokenMapper.java
  41. 4 0
      module-common/src/main/java/cn/com/ctop/common/module/mapper/MaterialCutFrameMapper.java
  42. 15 0
      module-common/src/main/java/cn/com/ctop/common/module/mapper/MaterialCutFrameTaskMapper.java
  43. 2 0
      module-common/src/main/java/cn/com/ctop/common/module/mapper/MaterialInfoMapper.java
  44. 4 1
      module-common/src/main/java/cn/com/ctop/common/module/mapper/UserAllocationMapper.java
  45. 9 0
      module-common/src/main/java/cn/com/ctop/common/module/mapper/xml/CtopOauthTokenMapper.xml
  46. 22 1
      module-common/src/main/java/cn/com/ctop/common/module/mapper/xml/MaterialCutFrameMapper.xml
  47. 5 0
      module-common/src/main/java/cn/com/ctop/common/module/mapper/xml/MaterialCutFrameTaskMapper.xml
  48. 8 0
      module-common/src/main/java/cn/com/ctop/common/module/mapper/xml/MaterialInfoMapper.xml
  49. 11 0
      module-common/src/main/java/cn/com/ctop/common/module/mapper/xml/UserAllocationMapper.xml
  50. 2 0
      module-common/src/main/java/cn/com/ctop/common/module/service/ICtopOauthTokenService.java
  51. 6 1
      module-common/src/main/java/cn/com/ctop/common/module/service/IMaterialCutFrameService.java
  52. 15 0
      module-common/src/main/java/cn/com/ctop/common/module/service/IMaterialCutFrameTaskService.java
  53. 1 0
      module-common/src/main/java/cn/com/ctop/common/module/service/IMaterialInfoService.java
  54. 2 0
      module-common/src/main/java/cn/com/ctop/common/module/service/IUserAllocationService.java
  55. 6 0
      module-common/src/main/java/cn/com/ctop/common/module/service/impl/CtopOauthTokenServiceImpl.java
  56. 126 59
      module-common/src/main/java/cn/com/ctop/common/module/service/impl/MaterialCutFrameServiceImpl.java
  57. 19 0
      module-common/src/main/java/cn/com/ctop/common/module/service/impl/MaterialCutFrameTaskServiceImpl.java
  58. 25 17
      module-common/src/main/java/cn/com/ctop/common/module/service/impl/MaterialInfoServiceImpl.java
  59. 11 0
      module-common/src/main/java/cn/com/ctop/common/module/service/impl/UserAllocationServiceImpl.java
  60. 12 1
      module-common/src/main/java/cn/com/ctop/common/module/utils/CtopAdConstant.java
  61. 5 0
      module-common/src/main/java/cn/com/ctop/common/module/utils/KuaishouInterfaceConstant.java
  62. 0 1
      module-common/src/main/java/cn/com/ctop/common/module/utils/LoadFileUtil.java
  63. 5 6
      module-crawler/src/main/java/cn/com/ctop/crawler/modules/core/service/IKuaishouCrawlerService.java
  64. 2 0
      module-crawler/src/main/java/cn/com/ctop/crawler/modules/pangolin/service/PangolinCrawlerService.java
  65. 1 1
      module-crawler/src/main/java/cn/com/ctop/crawler/modules/pangolin/service/PangolinLoginService.java
  66. 0 1
      module-crawler/src/main/java/cn/com/ctop/crawler/modules/pangolin/service/impl/PangolinAppServiceImpl.java
  67. 13 0
      module-crawler/src/main/java/cn/com/ctop/crawler/modules/pangolin/service/impl/PangolinCrawlerServiceImpl.java
  68. 33 33
      module-crawler/src/main/java/cn/com/ctop/crawler/modules/pangolin/service/impl/PangolinLoginServiceImpl.java
  69. 15 1
      module-crawler/src/main/java/cn/com/ctop/crawler/modules/pangolin/service/impl/PangolinReportAppHourServiceImpl.java
  70. 3 3
      module-ctop/src/main/java/cn/com/ctop/manage/modules/material/service/impl/MaterialUploadServiceImpl.java
  71. 4 0
      module-job-bytedance/src/main/java/cn/com/ctop/job/bytedance/handler/ByteDanceVideoReportJob.java
  72. 8 1
      module-job-kuaishou/src/main/java/cn/com/ctop/job/kuaishou/handler/KuaishouDailyAccountReportLoadJob.java
  73. 3 3
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/app/service/IKuaishouAppService.java
  74. 55 5
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/batch/controller/BatchController.java
  75. 1 0
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/batch/entity/KuaiShouGroup.java
  76. 36 0
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/batch/entity/vo/ConvertVo.java
  77. 2 0
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/batch/mapper/KuaiShouImageGetMapper.java
  78. 2 0
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/batch/mapper/xml/KuaiShouGroupMapper.xml
  79. 6 0
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/batch/mapper/xml/KuaiShouImageGetMapper.xml
  80. 2 0
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/batch/service/IKuaiShouVideoGetService.java
  81. 14 0
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/batch/service/IKuaishouInterfaceService.java
  82. 32 20
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/batch/service/impl/BatchServiceImpl.java
  83. 9 3
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/batch/service/impl/KuaiShouImageGetServiceImpl.java
  84. 108 0
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/batch/service/impl/KuaiShouVideoGetServiceImpl.java
  85. 49 2
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/batch/service/impl/KuaishouInterfaceServiceImpl.java
  86. 3 1
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/report/mapper/xml/KuaishouReportDailyAccountMapper.xml
  87. 3 1
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/report/mapper/xml/KuaishouReportDailyCampaignMapper.xml
  88. 3 1
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/report/mapper/xml/KuaishouReportDailyCreativeMapper.xml
  89. 3 1
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/report/mapper/xml/KuaishouReportDailyGroupMapper.xml
  90. 19 0
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/report/DTO/AccountReportDTO.java
  91. 40 3
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/report/controller/ByteDanceVideoReportDailyController.java
  92. 34 0
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/report/controller/BytedanceAdvertiserDailyReportController.java
  93. 20 6
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/report/controller/BytedanceHomepageReportCtrl.java
  94. 70 13
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/report/controller/BytedanceReportController.java
  95. 3 3
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/report/mapper/ByteDanceVideoReportDailyMapper.java
  96. 7 4
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/report/mapper/BytedanceHomepageMapper.java
  97. 24 3
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/report/mapper/xml/ByteDanceVideoReportDailyMapper.xml
  98. 149 31
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/report/mapper/xml/BytedanceHomepageMapper.xml
  99. 2 0
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/report/service/IByteDanceVideoReportDailyService.java
  100. 0 0
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/report/service/IBytedanceHomepageReportService.java

+ 21 - 6
jeecg-boot-base-common/src/main/java/org/jeecg/common/system/vo/LoginUser.java

@@ -1,14 +1,12 @@
 package org.jeecg.common.system.vo;
 
-import java.util.Date;
-
-import org.springframework.format.annotation.DateTimeFormat;
-
 import com.fasterxml.jackson.annotation.JsonFormat;
-
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.experimental.Accessors;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.util.Date;
 
 /**
  * <p>
@@ -73,11 +71,28 @@ public class LoginUser {
 	 * 状态(1:正常 2:冻结 )
 	 */
 	private Integer status;
-	
+
 	private String delFlag;
 	/**
      * 同步工作流引擎1同步0不同步
      */
     private String activitiSync;
 
+	@Override
+	public String toString() {
+		return "LoginUser{" +
+				"id='" + id + '\'' +
+				", username='" + username + '\'' +
+				", realname='" + realname + '\'' +
+				", orgCode='" + orgCode + '\'' +
+				", avatar='" + avatar + '\'' +
+				", birthday=" + birthday +
+				", sex=" + sex +
+				", email='" + email + '\'' +
+				", phone='" + phone + '\'' +
+				", status=" + status +
+				", delFlag='" + delFlag + '\'' +
+				", activitiSync='" + activitiSync + '\'' +
+				'}';
+	}
 }

+ 26 - 3
jeecg-boot-base-common/src/main/java/org/jeecg/common/util/DateUtils.java

@@ -20,7 +20,7 @@ import java.util.*;
  */
 public class DateUtils extends PropertyEditorSupport {
 
-    private static Logger logger= LoggerFactory.getLogger(DateUtils.class);
+    private static Logger logger = LoggerFactory.getLogger(DateUtils.class);
 
     /**
      * 以毫秒表示的时间
@@ -1227,7 +1227,7 @@ public class DateUtils extends PropertyEditorSupport {
             e.printStackTrace();
         }
         //得到相差的天数 betweenDate
-        return  (endDate.getTime() - startDate.getTime())/(60*60*24*1000);
+        return (endDate.getTime() - startDate.getTime()) / (60 * 60 * 24 * 1000);
     }
 
     /***
@@ -1313,8 +1313,31 @@ public class DateUtils extends PropertyEditorSupport {
         return calendar.getTime();
     }
 
+
+    public static List<Date> findDates(Date dBegin, Date dEnd) {
+        List<Date> lDate = new ArrayList<Date>();
+        lDate.add(dBegin);
+        Calendar calBegin = Calendar.getInstance();
+        // 使用给定的 Date 设置此 Calendar 的时间
+        calBegin.setTime(dBegin);
+        Calendar calEnd = Calendar.getInstance();
+        // 使用给定的 Date 设置此 Calendar 的时间
+        calEnd.setTime(dEnd);
+        // 测试此日期是否在指定日期之后
+        while (dEnd.after(calBegin.getTime())) {
+            // 根据日历的规则,为给定的日历字段添加或减去指定的时间量
+            calBegin.add(Calendar.DAY_OF_MONTH, 1);
+            lDate.add(calBegin.getTime());
+        }
+        return lDate;
+    }
+
+
     public static void main(String[] args) throws ParseException {
-        System.out.println(calDiffMonth(DateUtils.parseDate("2019-04-01", "yyyy-MM-dd"), new Date()));
+        String nowDate = DateUtils.getNowDate("yyyy-MM-dd");
+        String s = DateUtils.addDay(nowDate, -180);
+        System.err.println(nowDate);
+        System.err.println(s);
     }
 
 }

+ 3 - 9
jeecg-boot-module-system/pom.xml

@@ -41,12 +41,6 @@
     </repositories>
 
     <dependencies>
-        <!-- rabbitmq 依赖jar包-->
-        <dependency>
-            <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-starter-amqp</artifactId>
-            <version>1.5.2.RELEASE</version>
-        </dependency>
         <dependency>
             <groupId>org.jeecgframework.boot</groupId>
             <artifactId>jeecg-boot-base-common</artifactId>
@@ -130,9 +124,9 @@
             <version>3.17</version>
         </dependency>
         <dependency>
-        <groupId>org.apache.poi</groupId>
-        <artifactId>poi-ooxml-schemas</artifactId>
-        <version>3.17</version>
+            <groupId>org.apache.poi</groupId>
+            <artifactId>poi-ooxml-schemas</artifactId>
+            <version>3.17</version>
         </dependency>
 
         <dependency>

+ 0 - 67
jeecg-boot-module-system/src/main/java/org/jeecg/config/RabbitConfig.java

@@ -1,67 +0,0 @@
-package org.jeecg.config;
-
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.amqp.core.Queue;
-import org.springframework.amqp.rabbit.connection.CachingConnectionFactory;
-import org.springframework.amqp.rabbit.connection.ConnectionFactory;
-import org.springframework.amqp.rabbit.core.RabbitTemplate;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.beans.factory.config.ConfigurableBeanFactory;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.context.annotation.Scope;
-
-@Configuration
-@Slf4j
-public class RabbitConfig {
-    @Value("${spring.rabbitmq.host}")
-    private String host;
-
-    @Value("${spring.rabbitmq.port}")
-    private int port;
-
-    @Value("${spring.rabbitmq.username}")
-    private String username;
-
-    @Value("${spring.rabbitmq.password}")
-    private String password;
-
-
-    public static final String EXCHANGE_A = "my-mq-exchange_A";
-    public static final String EXCHANGE_B = "my-mq-exchange_B";
-    public static final String EXCHANGE_C = "my-mq-exchange_C";
-
-
-    public static final String QUEUE_A = "QUEUE_A";
-    public static final String QUEUE_B = "QUEUE_B";
-    public static final String QUEUE_C = "QUEUE_C";
-
-    public static final String ROUTINGKEY_A = "spring-boot-routingKey_A";
-    public static final String ROUTINGKEY_B = "spring-boot-routingKey_B";
-    public static final String ROUTINGKEY_C = "spring-boot-routingKey_C";
-
-    @Bean
-    public ConnectionFactory connectionFactory() {
-        CachingConnectionFactory connectionFactory = new CachingConnectionFactory(host, port);
-        connectionFactory.setUsername(username);
-        connectionFactory.setPassword(password);
-        connectionFactory.setVirtualHost("/");
-        connectionFactory.setPublisherConfirms(true);
-        return connectionFactory;
-    }
-
-    /**
-     * 必须是prototype类型
-     */
-    @Bean
-    @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
-    public RabbitTemplate rabbitTemplate() {
-        RabbitTemplate template = new RabbitTemplate(connectionFactory());
-        return template;
-    }
-
-    @Bean
-    public Queue helloQueue() {
-        return new Queue("hello");
-    }
-}

+ 3 - 2
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/controller/AdvertiserController.java

@@ -1,5 +1,6 @@
 package org.jeecg.modules.ctop.controller;
 
+import cn.com.ctop.common.module.constant.CtopRoleCodeConstant;
 import cn.com.ctop.common.module.entity.UserAllocation;
 import cn.com.ctop.common.module.service.ISysRoleService;
 import cn.com.ctop.common.module.service.IUserAllocationService;
@@ -78,7 +79,7 @@ public class AdvertiserController {
         try {
             String roleCode = sysRoleService.getRoleCodeByUserId(userId);
             QueryWrapper<Advertiser> queryWrapper = new QueryWrapper<>();
-            if (!"admin".equals(roleCode)) {
+            if (!CtopRoleCodeConstant.COMMON_ROLE_CODE_ADMIN.equals(roleCode)) {
                 QueryWrapper<UserCompany> userCompanyQueryWrapper = new QueryWrapper<>();
                 userCompanyQueryWrapper.eq("user_id", userId);
                 userCompanyQueryWrapper.orderByDesc("create_time");
@@ -115,7 +116,7 @@ public class AdvertiserController {
         Result<IPage<Advertiser>> result = new Result<>();
         String roleCode = sysRoleService.getRoleCodeByUserId(advertiser.getUserId());
         String userId = advertiser.getUserId();
-        if ("admin".equals(roleCode) || "kuaishouOperationManager".equals(roleCode) || "touTiaoOperationManager".equals(roleCode) || "sale".equals(roleCode) || "saleDirector".equals(roleCode)) {
+        if (CtopRoleCodeConstant.COMMON_ROLE_CODE_ADMIN.equals(roleCode) || "kuaishouOperationManager".equals(roleCode) || "touTiaoOperationManager".equals(roleCode) || "sale".equals(roleCode) || "saleDirector".equals(roleCode)) {
             advertiser.setUserId(null);
         }
         String industryId = advertiser.getIndustryId();

+ 8 - 2
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/controller/MaterialCutFrameController.java

@@ -16,6 +16,7 @@ import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletRequest;
 import java.util.Arrays;
+import java.util.List;
 
 
 /**
@@ -49,15 +50,20 @@ public class MaterialCutFrameController {
                                                          @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
                                                          @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
                                                          HttpServletRequest req) {
-        Result<IPage<MaterialCutFrame>> result = new Result<IPage<MaterialCutFrame>>();
+        Result<IPage<MaterialCutFrame>> result = new Result<>();
         QueryWrapper<MaterialCutFrame> queryWrapper = QueryGenerator.initQueryWrapper(materialCutFrame, req.getParameterMap());
-        Page<MaterialCutFrame> page = new Page<MaterialCutFrame>(pageNo, pageSize);
+        queryWrapper.orderByAsc("image_index");
+        Page<MaterialCutFrame> page = new Page<>(pageNo, pageSize);
+        //TODO 这边代码有bug,先临时紧急处理,后续优化截帧任务
         IPage<MaterialCutFrame> pageList = materialCutFrameService.page(page, queryWrapper);
+        List<MaterialCutFrame> list = materialCutFrameService.getListByVideoSignature(materialCutFrame.getVideoSignature());
+        pageList.setRecords(list);
         result.setSuccess(true);
         result.setResult(pageList);
         return result;
     }
 
+
     /**
      * 添加
      *

+ 10 - 3
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/controller/MaterialInfoController.java

@@ -1,6 +1,7 @@
 package org.jeecg.modules.ctop.controller;
 
 
+import cn.com.ctop.common.module.constant.CtopRoleCodeConstant;
 import cn.com.ctop.common.module.entity.*;
 import cn.com.ctop.common.module.service.*;
 import cn.com.ctop.common.module.utils.Check;
@@ -24,6 +25,7 @@ import org.jeecg.common.aspect.annotation.AutoLog;
 import org.jeecg.common.system.query.QueryGenerator;
 import org.jeecg.common.system.vo.LoginUser;
 import org.jeecg.common.util.DateUtils;
+import org.jeecg.modules.ctop.entity.Project;
 import org.jeecg.modules.ctop.service.IKuaiShouUploadService;
 import org.jeecg.modules.ctop.service.IProjectMemberService;
 import org.jeecg.modules.ctop.service.IProjectService;
@@ -168,7 +170,7 @@ public class MaterialInfoController {
         materialInfo.setCreateTime(null);
         if (!Check.isNull(materialInfo.getUserId())) {
             String roleCode = materialInfoService.getRoleCodeByUserId(materialInfo.getUserId());
-            if ("admin".equals(roleCode) || "operator".equals(roleCode) || "kuaishouOperationManager".equals(roleCode) || "operationAssistant".equals(roleCode) || "touTiaoOperationManager".equals(roleCode) || "sale".equals(roleCode) || "saleDirector".equals(roleCode)) {
+            if (CtopRoleCodeConstant.COMMON_ROLE_CODE_ADMIN.equals(roleCode) || "operator".equals(roleCode) || "kuaishouOperationManager".equals(roleCode) || "operationAssistant".equals(roleCode) || "touTiaoOperationManager".equals(roleCode) || "sale".equals(roleCode) || "saleDirector".equals(roleCode)) {
                 materialInfo.setUserId(null);
                 queryWrapper = QueryGenerator.initQueryWrapper(materialInfo, req.getParameterMap());
             } else if ("designTeamLeader".equals(roleCode) || "planeLeader".equals(roleCode) || "plane".equals(roleCode) || "plan".equals(roleCode) || "shot".equals(roleCode)) {
@@ -232,12 +234,17 @@ public class MaterialInfoController {
                     material.setKuaiShou(JSONObject.parseObject(kuaiShouString));
                 }
 
+
+                Project project = projectService.getById(material.getProjectId());
+                if (!Check.isNull(project)) {
+                    material.setMediaId(project.getMediaId());
+                    material.setProjectName(project.getProjectName());
+                }
                 /*JSONObject generalizationJson = materialInfoService.getGeneralizationInfo(material.getCode());
                 if (!Check.isNull(generalizationJson)) {
-                    material.setGeneralization(generalizationJson);
+                    material.setGeneralization(generaliz  ationJson);
                 }*/
 
-
                 QueryWrapper<MaterialImageInfo> imageInfoQueryWrapper = new QueryWrapper<>();
                 imageInfoQueryWrapper.eq("video_id", material.getCode());
                 imageInfoQueryWrapper.eq("status", 0);

+ 13 - 21
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/controller/PangolinController.java

@@ -1,6 +1,6 @@
 package org.jeecg.modules.ctop.controller;
 
-import cn.com.ctop.common.module.service.IBindAccountLoginService;
+import cn.com.ctop.common.module.constant.CtopRoleCodeConstant;
 import cn.com.ctop.common.module.service.ISysRoleService;
 import cn.com.ctop.common.module.utils.ResultMapUtils;
 import cn.com.ctop.common.module.utils.StatusCode;
@@ -34,16 +34,13 @@ public class PangolinController {
     private PangolinChannelService pangolinChannelService;
     @Autowired
     private ISysRoleService sysRoleService;
-    @Autowired
-    private IBindAccountLoginService bindAccountLoginService;
 
     @PostMapping("api/channel/list")
     public Map<String, Object> channelList(@RequestBody JSONObject data) {
         LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();
         String userId = user.getId();
-//        String userId = "6b4c821adc414dc8b7718ab63ccbfcaf";
         String roleCode = sysRoleService.getRoleCodeByUserId(userId);
-        if(null!=roleCode&&(roleCode.equals("admin"))){
+        if(null!=roleCode&&(roleCode.equals(CtopRoleCodeConstant.COMMON_ROLE_CODE_ADMIN))){
             userId = null;
         }
         return pangolinChannelService.getListByUserId(userId);
@@ -52,10 +49,9 @@ public class PangolinController {
     @PostMapping("api/app/list")
     public Map<String, Object> appList(@RequestBody JSONObject data) {
         LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();
-//        String userId = user.getId();
-        String userId = "6b4c821adc414dc8b7718ab63ccbfcaf";
+        String userId = user.getId();
         String roleCode = sysRoleService.getRoleCodeByUserId(userId);
-        if(null!=roleCode&&(roleCode.equals("admin"))){
+        if(null!=roleCode&&(roleCode.equals(CtopRoleCodeConstant.COMMON_ROLE_CODE_ADMIN))){
             userId = null;
         }
         return pangolinAppService.getListByUserId(userId,data);
@@ -66,11 +62,10 @@ public class PangolinController {
     public Map<String,Object> memberList(){
         Map<String, Object> resultMap = new HashMap<>();
         try {
-//            LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();
-//            String userId = user.getId();
-            String userId = "6b4c821adc414dc8b7718ab63ccbfcaf";
+            LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();
+            String userId = user.getId();
             String roleCode = sysRoleService.getRoleCodeByUserId(userId);
-            if (null!=roleCode&&"admin".equals(roleCode)) {
+            if (null!=roleCode&&CtopRoleCodeConstant.COMMON_ROLE_CODE_ADMIN.equals(roleCode)) {
                 userId = null;
             }
             resultMap = pangolinAppService.getMemberList(userId);
@@ -88,10 +83,9 @@ public class PangolinController {
     @PostMapping("api/realtime")
     public Map<String, Object> realTime(@RequestBody JSONObject data) {
         LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();
-//        String userId = user.getId();
-        String userId = "6b4c821adc414dc8b7718ab63ccbfcaf";
+        String userId = user.getId();
         String roleCode = sysRoleService.getRoleCodeByUserId(userId);
-        if(null!=roleCode&&(roleCode.equals("admin"))){
+        if(null!=roleCode&&(roleCode.equals(CtopRoleCodeConstant.COMMON_ROLE_CODE_ADMIN))){
             userId = null;
         }
         return pangolinReportAppHourService.getRealTimeData(userId,data);
@@ -103,10 +97,9 @@ public class PangolinController {
     @PostMapping("api/activation/list")
     public Map<String, Object> activationList(@RequestBody JSONObject data) {
         LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();
-//        String userId = user.getId();
-        String userId = "6b4c821adc414dc8b7718ab63ccbfcaf";
+        String userId = user.getId();
         String roleCode = sysRoleService.getRoleCodeByUserId(userId);
-        if(null!=roleCode&&(roleCode.equals("admin"))){
+        if(null!=roleCode&&(roleCode.equals(CtopRoleCodeConstant.COMMON_ROLE_CODE_ADMIN))){
             userId = null;
         }
         return pangolinReportChannelDailyService.getActivationList(userId, data);
@@ -119,10 +112,9 @@ public class PangolinController {
     public Map<String,Object> checkAppList(@RequestBody JSONObject data) {
         Map<String,Object> result = new HashMap<>();
         LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();
-//        String userId = user.getId();
-        String userId = "6b4c821adc414dc8b7718ab63ccbfcaf";
+        String userId = user.getId();
         String roleCode = sysRoleService.getRoleCodeByUserId(userId);
-        if(null!=roleCode&&(roleCode.equals("admin"))){
+        if(null!=roleCode&&(roleCode.equals(CtopRoleCodeConstant.COMMON_ROLE_CODE_ADMIN))){
             userId = null;
         }
         PageInfo<PangolinReportAppMonthVO> pageInfo = pangolinReportBillMonthService.checkAppList(userId, data);

+ 3 - 2
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/controller/ProjectController.java

@@ -1,5 +1,6 @@
 package org.jeecg.modules.ctop.controller;
 
+import cn.com.ctop.common.module.constant.CtopRoleCodeConstant;
 import cn.com.ctop.common.module.entity.UserAllocation;
 import cn.com.ctop.common.module.service.ISysRoleService;
 import cn.com.ctop.common.module.service.IUserAllocationService;
@@ -100,7 +101,7 @@ public class ProjectController {
         String roleCode = sysRoleService.getRoleCodeByUserId(userId);
         QueryWrapper<Project> queryWrapper = new QueryWrapper<>();
         List<Project> projects = new ArrayList<>();
-        if (!"admin".equals(roleCode) && !"sale".equals(roleCode) && !"saleDirector".equals(roleCode)) {
+        if (!CtopRoleCodeConstant.COMMON_ROLE_CODE_ADMIN.equals(roleCode) && !"sale".equals(roleCode) && !"saleDirector".equals(roleCode)) {
             if ("designTeamLeader".equals(roleCode) || "touTiaoOperationManager".equals(roleCode) || "kuaishouOperationManager".equals(roleCode) || "planeLeader".equals(roleCode)) {
                 QueryWrapper<ProjectMember> memberQueryWrapper = new QueryWrapper<>();
                 memberQueryWrapper.eq("user_id", userId);
@@ -178,7 +179,7 @@ public class ProjectController {
         Page<Project> page = new Page<>(pageNo, pageSize);
         LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
         String roleCode = sysRoleService.getRoleCodeByUserId(sysUser.getId());
-        if (!("admin".equals(roleCode) || "sale".equals(roleCode) || "saleDirector".equals(roleCode))) {
+        if (!(CtopRoleCodeConstant.COMMON_ROLE_CODE_ADMIN.equals(roleCode) || "sale".equals(roleCode) || "saleDirector".equals(roleCode))) {
             queryWrapper.eq("user_id", sysUser.getId());
             queryWrapper.orderByDesc("create_time");
         }

+ 2 - 1
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/controller/ProjectMemberController.java

@@ -1,5 +1,6 @@
 package org.jeecg.modules.ctop.controller;
 
+import cn.com.ctop.common.module.constant.CtopRoleCodeConstant;
 import cn.com.ctop.common.module.service.ISysRoleService;
 import cn.com.ctop.common.module.utils.Check;
 import com.alibaba.fastjson.JSONArray;
@@ -91,7 +92,7 @@ public class ProjectMemberController {
         try {
             QueryWrapper<ProjectMember> queryWrapper = new QueryWrapper<>();
             String roleCode = sysRoleService.getRoleCodeByUserId(userId);
-            if (!"admin".equals(roleCode) && !"sale".equals(roleCode) && !"saleDirector".equals(roleCode)) {
+            if (!CtopRoleCodeConstant.COMMON_ROLE_CODE_ADMIN.equals(roleCode) && !"sale".equals(roleCode) && !"saleDirector".equals(roleCode)) {
                 queryWrapper.eq("user_id", userId);
             }
             queryWrapper.groupBy("project_id");

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

@@ -20,11 +20,13 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import lombok.extern.slf4j.Slf4j;
 import org.jeecg.common.api.vo.Result;
 import org.jeecg.common.util.DateUtils;
+import org.quartz.JobExecutionException;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
+import java.io.IOException;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.util.*;
@@ -87,6 +89,115 @@ public class TestController {
     @Autowired
     private ICtopOauthTokenService oauthTokenService;
 
+    @Autowired
+    private IMaterialCutFrameService cutFrameService;
+
+
+    @GetMapping(value = "/getAccountList")
+    public void getAccountList(String startDate, String endDate) throws JobExecutionException {
+        Thread thread = new Thread() {
+            @Override
+            public void run() {
+                SimpleDateFormat sim = new SimpleDateFormat("yyyy-MM-dd");
+                try {
+                    Date start = sim.parse(startDate);
+                    Date end = sim.parse(endDate);
+                    //1:查询当日数据
+                    List<CtopOauthToken> tokens = tokenService.selectKuaiShouToken();
+                    if (null == tokens || tokens.size() <= 0) {
+                        log.info("定时获取快手数据异常:未获取到可用的token");
+                        return;
+                    }
+
+                    executorService = Executors.newFixedThreadPool(3);
+                    tokens.forEach(token -> {
+                        executorService.submit(new Runnable() {
+                            @Override
+                            public void run() {
+                                //1: 获取广告主信息数据
+                                kuaishouInterfaceService.getAdvertiserReportDaily(token, start, end);
+                            }
+                        });
+                    });
+                } catch (ParseException e) {
+                    e.printStackTrace();
+                }
+
+
+            }
+        };
+        thread.start();
+
+    }
+
+
+    @GetMapping(value = "/getVideo")
+    public String getVideo(String startDate, String endDate) throws IOException {
+
+        try {
+
+
+            Thread thread = new Thread() {
+                @Override
+                public void run() {
+
+
+                    QueryWrapper<CtopOauthToken> tokenQueryWrapper = new QueryWrapper<>();
+                    tokenQueryWrapper.eq("media_id", 2);
+                    List<CtopOauthToken> list = tokenService.list(tokenQueryWrapper);
+
+                    executorService = Executors.newFixedThreadPool(8);
+                    list.forEach(token -> {
+                        executorService.submit(new Runnable() {
+                            @Override
+                            public void run() {
+                                try {
+                                    //获取全量视频素材数据
+                                    kuaishouInterfaceService.getVideoList(token, null, null);
+                                    // 获取图片信息数据
+                                    //   kuaishouInterfaceService.getImageList(token, startDate, endDate);
+                                } catch (Exception e) {
+                                    e.printStackTrace();
+                                } finally {
+                                }
+                            }
+                        });
+                    });
+                    log.info("快手物料数据同步完成");
+                }
+            };
+            thread.start();
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return "Success";
+    }
+
+    @GetMapping(value = "/createCutTask")
+    public String createCutTask(String startDate, String endDate) throws IOException {
+
+        List<MaterialInfo> materialInfos = materialInfoService.getListByDate(startDate, endDate);
+        if (!Check.isNull(materialInfos)) {
+            for (MaterialInfo materialInfo : materialInfos) {
+                if (!Check.isNull(materialInfo)) {
+                    String code = materialInfo.getCode();
+                    QueryWrapper<MaterialParameter> parameterQueryWrapper = new QueryWrapper<>();
+                    parameterQueryWrapper.eq("material_id", code);
+                    parameterQueryWrapper.last("limit 1");
+                    MaterialParameter materialParameter = parameterService.getOne(parameterQueryWrapper);
+                    if (!Check.isNull(materialParameter)) {
+                        cutFrameService.getCutFrame(materialInfo.getUrl(), code, materialParameter.getSecond(), materialParameter.getHeight(), materialParameter.getWidth());
+
+                    }
+
+                }
+
+            }
+
+        }
+        return "Success";
+    }
+
 
     @GetMapping(value = "/getToken")
     public String getToken(Long accountId, String refreshToken, Integer agentType) {

+ 27 - 6
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/controller/UserAllocationController.java

@@ -1,5 +1,6 @@
 package org.jeecg.modules.ctop.controller;
 
+import cn.com.ctop.common.module.constant.CtopRoleCodeConstant;
 import cn.com.ctop.common.module.entity.UserAllocation;
 import cn.com.ctop.common.module.mapper.UserAllocationMapper;
 import cn.com.ctop.common.module.service.ISysRoleService;
@@ -54,7 +55,6 @@ public class UserAllocationController {
     @Autowired
     private IProjectMemberService projectMemberService;
 
-
     @GetMapping(value = "/accountTurnProject")
     public Result<Object> getAccountList(Long accountId, Long projectId) {
         Result<Object> result = new Result<>();
@@ -124,10 +124,10 @@ public class UserAllocationController {
             QueryWrapper<UserAllocation> queryWrapper = new QueryWrapper<>();
             queryWrapper.eq("user_id", userId);
             queryWrapper.eq("project_id", projectId);
-            Project project = projectService.getById(projectId);
-            if (!Check.isNull(project)) {
+           /*  Project project = projectService.getById(projectId);
+                if (!Check.isNull(project)) {
                 queryWrapper.eq("media_id", project.getMediaId());
-            }
+            }*/
 
             List<UserAllocation> userAllocations = userAllocationMapper.selectList(queryWrapper);
             result.setSuccess(true);
@@ -155,7 +155,7 @@ public class UserAllocationController {
             }*/
 
             String roleCode = sysRoleService.getRoleCodeByUserId(userId);
-            if (!"admin".equals(roleCode) && !"kuaishouOperationManager".equals(roleCode) && !"designTeamLeader".equals(roleCode) && !"touTiaoOperationManager".equals(roleCode)) {
+            if (!CtopRoleCodeConstant.COMMON_ROLE_CODE_ADMIN.equals(roleCode) && !"kuaishouOperationManager".equals(roleCode) && !"designTeamLeader".equals(roleCode) && !"touTiaoOperationManager".equals(roleCode)) {
                 queryWrapper.eq("user_id", userId);
             }
             queryWrapper.orderByDesc("create_time");
@@ -224,7 +224,7 @@ public class UserAllocationController {
         LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();
         QueryWrapper<UserAllocation> queryWrapper = QueryGenerator.initQueryWrapper(userAllocation, req.getParameterMap());
         String roleCode = sysRoleService.getRoleCodeByUserId(user.getId());
-        if (!"admin".equals(roleCode)) {
+        if (!CtopRoleCodeConstant.COMMON_ROLE_CODE_ADMIN.equals(roleCode)) {
             queryWrapper.eq("user_id", user.getId());
             queryWrapper.orderByDesc("id");
         }
@@ -357,4 +357,25 @@ public class UserAllocationController {
         }
         return result;
     }
+
+    /**
+     * 统计报表 查看所有账号
+     *
+     * @param projectId
+     * @return
+     */
+    @GetMapping(value = "/selectAccountListByProjectId")
+    public Result<List<UserAllocation>> selectAccountListByProjectId(Long projectId) {
+        Result<List<UserAllocation>> result = new Result<>();
+        try {
+            List<UserAllocation> userAllocations = userAllocationService.selectAccountListByProjectId(projectId);
+            result.setSuccess(true);
+            result.setResult(userAllocations);
+        } catch (Exception e) {
+            result.setSuccess(false);
+            result.success("查询失败");
+        }
+        return result;
+    }
+
 }

+ 6 - 1
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/job/BytedanceDailyMaterialReportJob.java

@@ -29,9 +29,12 @@ public class BytedanceDailyMaterialReportJob implements Job {
 
     @Override
     public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
+        Date getDate2 = DateUtils.addDay(new Date(), -2);
+        String date2 = DateUtils.formatDate(getDate2);
+
         Date getDate = DateUtils.addDay(new Date(), -1);
         String date = DateUtils.formatDate(getDate);
-        log.info("头条获取素材报表数据任务开始,任务时间:" + date);
+        log.info("头条获取素材报表数据任务开始,任务时间:" + date2 + "~" + date);
 
         List<CtopOauthToken> tokens = tokenService.selectToutiaoToken();
         if (null == tokens || tokens.size() <= 0) {
@@ -45,6 +48,8 @@ public class BytedanceDailyMaterialReportJob implements Job {
                 @Override
                 public void run() {
                     try {
+                        //获取头条素材报表两天前的数据
+                        bytedanceReportService.bytedanceMaterialReport(token, date2, date2);
                         //获取头条素材报表数据
                         bytedanceReportService.bytedanceMaterialReport(token, date, date);
                     } catch (Exception e) {

+ 22 - 2
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/job/BytedanceDailyMaterialReportRetryJob.java

@@ -3,8 +3,10 @@ package org.jeecg.modules.ctop.job;
 import cn.com.ctop.common.module.entity.CtopOauthToken;
 import cn.com.ctop.common.module.service.ICtopOauthTokenService;
 import cn.com.ctop.toutiao.modules.report.entity.BytedanceReportMaterialRetry;
+import cn.com.ctop.toutiao.modules.report.service.IByteDanceVideoReportDailyService;
 import cn.com.ctop.toutiao.modules.report.service.IBytedanceReportService;
 import lombok.extern.slf4j.Slf4j;
+import org.jeecg.common.util.DateUtils;
 import org.quartz.Job;
 import org.quartz.JobExecutionContext;
 import org.quartz.JobExecutionException;
@@ -25,6 +27,8 @@ public class BytedanceDailyMaterialReportRetryJob implements Job {
     private ICtopOauthTokenService tokenService;
     @Autowired
     private IBytedanceReportService bytedanceReportService;
+    @Autowired
+    private IByteDanceVideoReportDailyService byteDanceVideoReportDailyService;
 
     @Override
     public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
@@ -38,9 +42,25 @@ public class BytedanceDailyMaterialReportRetryJob implements Job {
                 @Override
                 public void run() {
                     try {
-                        CtopOauthToken token = tokenService.getOauthTokenByAccountId(String.valueOf(retry.getAccountId()));
+                        String startDate = retry.getStartDate();
+                        String endDate = retry.getEndDate();
+                        Long accountId = retry.getAccountId();
+                        CtopOauthToken token = tokenService.getOauthTokenByAccountId(String.valueOf(accountId));
                         log.info("头条素材报表重试定时任务,当前accountId为:" + token.getAccountId());
-                        bytedanceReportService.bytedanceMaterialReportRetry(token, retry.getStartDate(), retry.getEndDate());
+
+                        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;
+                            //获取头条素材报表数据
+                            int code = bytedanceReportService.bytedanceMaterialReportRetry(token, start, end);
+                            if(code ==200 || code == 1){
+                                //重试成功清洗数据
+                                byteDanceVideoReportDailyService.videoInfoListByAccountId(start,end,accountId);
+                            }
+                        }
                     } catch (Exception e) {
                         e.printStackTrace();
                     } finally {

+ 59 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/job/CutFrameJob.java

@@ -0,0 +1,59 @@
+package org.jeecg.modules.ctop.job;
+
+import cn.com.ctop.common.module.entity.MaterialCutFrameTask;
+import cn.com.ctop.common.module.service.IMaterialCutFrameService;
+import cn.com.ctop.common.module.service.IMaterialCutFrameTaskService;
+import cn.com.ctop.common.module.utils.Check;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import lombok.extern.slf4j.Slf4j;
+import org.quartz.Job;
+import org.quartz.JobExecutionContext;
+import org.quartz.JobExecutionException;
+import org.springframework.beans.factory.annotation.Autowired;
+
+import java.util.List;
+import java.util.concurrent.Executors;
+
+import static org.jeecg.modules.ctop.job.KuaishouDailyGroupReportLoadJob.executorService;
+
+/**
+ * 获取抽帧视频
+ */
+@Slf4j
+public class CutFrameJob implements Job {
+    @Autowired
+    private IMaterialCutFrameService materialCutFrameService;
+    @Autowired
+    private IMaterialCutFrameTaskService taskService;
+
+    @Override
+    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
+        Thread thread = new Thread() {
+            @Override
+            public void run() {
+
+                log.info("开始抽帧定时任务");
+                QueryWrapper<MaterialCutFrameTask> taskQueryWrapper = new QueryWrapper<>();
+                taskQueryWrapper.eq("job_status", 0);
+                List<MaterialCutFrameTask> list = taskService.list(taskQueryWrapper);
+
+                if (Check.isNull(list)) {
+                    return;
+                }
+                executorService = Executors.newFixedThreadPool(5);
+                list.forEach(cutFrameTask -> {
+                    executorService.submit(new Runnable() {
+                        @Override
+                        public void run() {
+                            //获取广告计划信息数据
+                            materialCutFrameService.loadCutFrame(cutFrameTask.getJobId(), cutFrameTask.getVideoSignature());
+                        }
+                    });
+                });
+            }
+        };
+        thread.start();
+
+
+    }
+}

+ 2 - 2
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/job/KuaishouCrawlerJob.java

@@ -24,7 +24,7 @@ public class KuaishouCrawlerJob implements Job {
     public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
         try {
             Integer page = 1;
-            QueryWrapper<KuaishouAppAccount> queryWrapper = new QueryWrapper<KuaishouAppAccount>();
+            QueryWrapper<KuaishouAppAccount> queryWrapper = new QueryWrapper<>();
             queryWrapper.eq("path","/rest/n/feed/hot");
             List<KuaishouAppAccount> list = kuaishouAppAccountService.list(queryWrapper);
             if (list != null) {
@@ -37,7 +37,7 @@ public class KuaishouCrawlerJob implements Job {
                 }
             }
 
-            QueryWrapper<KuaishouIosAccount> queryWrapper2 = new QueryWrapper<KuaishouIosAccount>();
+            QueryWrapper<KuaishouIosAccount> queryWrapper2 = new QueryWrapper<>();
             queryWrapper2.eq("path","/rest/n/feed/hot");
             List<KuaishouIosAccount> list2 = kuaishouIosAccountService.list(queryWrapper2);
             if (list2 != null) {

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

@@ -33,6 +33,7 @@ public class KuaishouDailyAccountReportLoadJob implements Job {
         Thread thread = new Thread() {
             @Override
             public void run() {
+                Date getDate2 = DateUtils.addDay(new Date(), -2);
                 Date getDate = DateUtils.addDay(new Date(), -1);
                 //1:查询当日数据
                 List<CtopOauthToken> tokens = tokenService.selectKuaiShouToken();
@@ -46,6 +47,8 @@ public class KuaishouDailyAccountReportLoadJob implements Job {
                     executorService.submit(new Runnable() {
                         @Override
                         public void run() {
+                            //跑两天前的账户报表---次留统计用
+                            kuaishouInterfaceService.getAdvertiserReportDaily(token, getDate2, getDate2);
                             //1: 获取广告主信息数据
                             kuaishouInterfaceService.getAdvertiserReportDaily(token, getDate, getDate);
                         }

+ 1 - 1
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/job/KuaishouDailyAccountReportNextDayStayJob.java

@@ -34,7 +34,7 @@ public class KuaishouDailyAccountReportNextDayStayJob implements Job {
         Thread thread = new Thread() {
             @Override
             public void run() {
-                Date getDate = DateUtils.addDay(new Date(), -2);
+                Date getDate = new Date();
                 //1:查询当日数据
                 List<CtopOauthToken> tokens = tokenService.selectKuaiShouToken();
                 if (null == tokens || tokens.size() <= 0) {

+ 1 - 14
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/job/PangolinDataJob.java

@@ -2,11 +2,8 @@ package org.jeecg.modules.ctop.job;
 
 import cn.com.ctop.common.module.entity.BindAccountLogin;
 import cn.com.ctop.common.module.service.IBindAccountLoginService;
-import cn.com.ctop.crawler.modules.pangolin.entity.PangolinApp;
-import cn.com.ctop.crawler.modules.pangolin.service.PangolinAppService;
 import cn.com.ctop.crawler.modules.pangolin.service.PangolinCrawlerService;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import org.jeecg.common.util.DateUtils;
 import org.quartz.Job;
 import org.quartz.JobExecutionContext;
 import org.quartz.JobExecutionException;
@@ -18,8 +15,6 @@ public class PangolinDataJob implements Job {
     @Autowired
     private IBindAccountLoginService bindAccountLoginService;
     @Autowired
-    private PangolinAppService pangolinAppService;
-    @Autowired
     private PangolinCrawlerService pangolinCrawlerService;
 
     @Override
@@ -31,15 +26,7 @@ public class PangolinDataJob implements Job {
         List<BindAccountLogin> list = bindAccountLoginService.list(queryWrapper);
         if (list != null && !list.isEmpty()) {
             for (BindAccountLogin bindAccountLogin : list) {
-                pangolinCrawlerService.getChannelList(bindAccountLogin);
-                pangolinCrawlerService.getActivationList(bindAccountLogin, DateUtils.getNowDate("yyyy-MM-dd"), 1);
-                pangolinCrawlerService.getCheckList(bindAccountLogin);
-                QueryWrapper<PangolinApp> queryWrapper1 = new QueryWrapper<>();
-                queryWrapper1.eq("account_name", bindAccountLogin.getAccountName());
-                List<PangolinApp> appList = pangolinAppService.list(queryWrapper1);
-                if (appList != null && !appList.isEmpty()) {
-                    appList.forEach(pangolinApp -> pangolinCrawlerService.getRealTimeList(bindAccountLogin, pangolinApp.getId()));
-                }
+                pangolinCrawlerService.getNowData(bindAccountLogin);
             }
         }
     }

+ 22 - 2
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/service/impl/CreateInternalServiceImpl.java

@@ -5,6 +5,8 @@ import cn.com.ctop.common.module.mapper.BindAccountLoginMapper;
 import cn.com.ctop.common.module.utils.*;
 import cn.com.ctop.crawler.modules.core.util.FateadmHttpUtil;
 import cn.com.ctop.crawler.modules.core.util.FateadmUtil;
+import cn.com.ctop.crawler.modules.pangolin.service.PangolinCrawlerService;
+import cn.com.ctop.crawler.modules.pangolin.service.PangolinLoginService;
 import com.fasterxml.jackson.databind.DeserializationFeature;
 import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.ObjectMapper;
@@ -33,6 +35,10 @@ public class CreateInternalServiceImpl implements ICreateInternalService {
     private String chromeDriver;
     @Autowired
     private BindAccountLoginMapper bindAccountLoginMapper;
+    @Autowired
+    private PangolinLoginService pangolinLoginService;
+    @Autowired
+    private PangolinCrawlerService pangolinCrawlerService;
 
     @Override
     public Map<String, Object> bindLogin(Long projectId,String advertiserId, String accountName, String password, String loginType, String userId, String advertiserName) {
@@ -49,7 +55,7 @@ public class CreateInternalServiceImpl implements ICreateInternalService {
         if (null != loginType && loginType.equals(CtopAdConstant.PLATFORM_TYPE_BYTEDANCE_PY)) {
             Map<String, Object> result = this.checkAccountPassword(accountName, password);
             Boolean checkSuccess = (Boolean) result.get("success");
-            if (!checkSuccess) {
+            if (Boolean.FALSE.equals(checkSuccess)) {
                 returnMap.put("success", false);
                 returnMap.put("message", "账号验证失败");
                 return returnMap;
@@ -67,6 +73,20 @@ public class CreateInternalServiceImpl implements ICreateInternalService {
         int i = bindAccountLoginMapper.insert(bindAccountLogin);
         if (i > 0) {
             log.info("登录账号绑定成功,广告主id:{}", bindAccountLogin.getAdvertiserId());
+            if(null!=loginType&&loginType.equals(CtopAdConstant.PLATFORM_TYPE_PANGOLIN_PY)){
+                //穿山甲账户绑定
+                Thread thread = new Thread(){
+                    @Override
+                    public void run() {
+                        //1:登录
+                        pangolinLoginService.pangolinLogin(bindAccountLogin.getAccountName(), bindAccountLogin.getPassword());
+                        //2:拉取数据
+                        pangolinCrawlerService.getNowData(bindAccountLogin);
+                    }
+                };
+                thread.start();
+            }
+
             returnMap.put("success", true);
             returnMap.put("accountUd", password);
         }
@@ -164,7 +184,7 @@ public class CreateInternalServiceImpl implements ICreateInternalService {
                 }
             }
         } catch (Exception e) {
-            e.printStackTrace();
+            log.error(e.getMessage(),e);
             ResultMapUtils.setResultMap(resultMap, StatusCode.COMMON_SERVER_ERROR.getCode());
         } finally {
             //清除所有的缓存

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

@@ -1,5 +1,6 @@
 package org.jeecg.modules.ctop.service.impl;
 
+import cn.com.ctop.common.module.constant.CtopRoleCodeConstant;
 import cn.com.ctop.common.module.service.ISysRoleService;
 import cn.com.ctop.common.module.utils.Check;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@@ -13,7 +14,6 @@ import org.jeecg.modules.system.entity.SysUser;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
-import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -78,7 +78,7 @@ public class ProjectMemberServiceImpl extends ServiceImpl<ProjectMemberMapper, P
             projectMemberList = memberMapper.designProjects(userId, mediaIds);
         }else if( roleCode.equals("designTeamLeader")){
             projectMemberList = memberMapper.designLeaderProjects(companyId, mediaIds);
-        }else if(roleCode.equals("admin")){
+        }else if(roleCode.equals(CtopRoleCodeConstant.COMMON_ROLE_CODE_ADMIN)){
             projectMemberList = memberMapper.adminProjects(mediaIds);
         }else if(roleCode.equals("operator") || roleCode.equals("operationAssistant") || roleCode.equals("touTiaoOperationManager")){
             projectMemberList = memberMapper.operationProjects(userId, mediaIds);

+ 0 - 20
jeecg-boot-module-system/src/main/java/org/jeecg/modules/mq/Receiver.java

@@ -1,20 +0,0 @@
-package org.jeecg.modules.mq;
-
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.amqp.rabbit.annotation.Queue;
-import org.springframework.amqp.rabbit.annotation.RabbitHandler;
-import org.springframework.amqp.rabbit.annotation.RabbitListener;
-import org.springframework.stereotype.Component;
-
-@Slf4j
-@Component
-@RabbitListener(queuesToDeclare = @Queue("hello"))
-public class Receiver {
-    /**
-     * 通过@RabbitHandler声明的方法,对hello队列中的消息进行处理
-     */
-    @RabbitHandler
-    public void receiver(String str) {
-        log.info("Receiver says:[" + str + "]");
-    }
-}

+ 0 - 27
jeecg-boot-module-system/src/main/java/org/jeecg/modules/mq/Sender.java

@@ -1,27 +0,0 @@
-package org.jeecg.modules.mq;
-
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.amqp.core.AmqpTemplate;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Component;
-
-/**
- * @author jeecg-boot
- * 2019年12月5日19:57:58
- */
-@Component
-@Slf4j
-public class Sender {
-
-    @Autowired
-    AmqpTemplate rabbitmqTemplate;
-
-    /**
-     * 发送消息
-     */
-    public void send() {
-        String content = "Sender says:" + "'hello, I'm sender'";
-        log.info(content);
-        rabbitmqTemplate.convertAndSend("hello", content);
-    }
-}

+ 0 - 4
jeecg-boot-module-system/src/main/java/org/jeecg/modules/performanceappraisal/aa.java

@@ -1,4 +0,0 @@
-package org.jeecg.modules.performanceappraisal;
-
-public class aa {
-}

+ 52 - 21
jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/controller/SysUserController.java

@@ -25,10 +25,8 @@ import org.jeecg.common.util.RedisUtil;
 import org.jeecg.common.util.oConvertUtils;
 import org.jeecg.modules.ctop.entity.ProjectMember;
 import org.jeecg.modules.ctop.service.IProjectMemberService;
-import org.jeecg.modules.system.entity.SysDepart;
-import org.jeecg.modules.system.entity.SysUser;
-import org.jeecg.modules.system.entity.SysUserDepart;
-import org.jeecg.modules.system.entity.SysUserRole;
+import org.jeecg.modules.system.entity.*;
+import org.jeecg.modules.system.mapper.UserCompanyMapper;
 import org.jeecg.modules.system.model.DepartIdModel;
 import org.jeecg.modules.system.model.SysUserDepartsVO;
 import org.jeecg.modules.system.service.*;
@@ -96,34 +94,41 @@ public class SysUserController {
     @RequestMapping(value = "/list", method = RequestMethod.GET)
     public Result<IPage<SysUser>> queryPageList(SysUser user, @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
                                                 @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize, HttpServletRequest req) {
-        Result<IPage<SysUser>> result = new Result<IPage<SysUser>>();
+        Result<IPage<SysUser>> result = new Result<>();
+        String realName = user.getRealname();
         QueryWrapper<SysUser> queryWrapper = QueryGenerator.initQueryWrapper(user, req.getParameterMap());
-        Page<SysUser> page = new Page<SysUser>(pageNo, pageSize);
+        if(null!=realName&&!"".equals(realName)){
+            queryWrapper.like("realname",realName);
+        }
+        Page<SysUser> page = new Page<>(pageNo, pageSize);
         IPage<SysUser> pageList = sysUserService.page(page, queryWrapper);
         result.setSuccess(true);
         result.setResult(pageList);
         return result;
     }
 
+    @Autowired
+    private UserCompanyMapper userCompanyMapper;
 
     @RequestMapping(value = "/getAllUserListByCompany", method = RequestMethod.GET)
-    public Result<List<SysUserVo>> getAllUserListByCompany(String userId) {
+    public Result<List<SysUserVo>> getAllUserListByCompany() {
         Result<List<SysUserVo>> result = new Result<>();
         try {
-            /*List<SysUserVo> userList = new ArrayList<>();
-            String roleCode = materialReportMapper.getRoleCodeByUserId(userId);
-            if (!"admin".equals(roleCode)) {
-                QueryWrapper<UserCompany> userCompanyQueryWrapper = new QueryWrapper<>();
-                userCompanyQueryWrapper.eq("user_id", userId);
-                userCompanyQueryWrapper.orderByDesc("create_time");
-                userCompanyQueryWrapper.last("limit 1");
-                UserCompany userCompany = userCompanyMapper.selectOne(userCompanyQueryWrapper);
-                userList = sysUserService.getUserListByCompany(userCompany.getCompanyId());
-            } else {
+            LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();
+            QueryWrapper<UserCompany> userCompanyQueryWrapper = new QueryWrapper<>();
+            userCompanyQueryWrapper.eq("user_id", user.getId());
+            userCompanyQueryWrapper.orderByDesc("create_time");
+            userCompanyQueryWrapper.last("limit 1");
+            UserCompany userCompany = userCompanyMapper.selectOne(userCompanyQueryWrapper);
+            String companyId = userCompany.getCompanyId();
+            List<SysUserVo> userList;
+            if ("4b10089775c040119e139087517aed88".equals(companyId) || "6608ed13c0dd42de93c790dbdf124234".equals(companyId) || "d57fecdcf7a94d009736d9c850731582".equals(companyId)) {
                 userList = sysUserService.getAllUser();
+            } else {
+                userList = sysUserService.getUserListByCompany(companyId);
             }
-*/
-            List<SysUserVo> userList = sysUserService.getAllUser();
+
+
             result.setSuccess(true);
             result.setResult(userList);
         } catch (Exception e) {
@@ -140,7 +145,19 @@ public class SysUserController {
     public Result<List<SysUserVo>> getAllList() {
         Result<List<SysUserVo>> result = new Result<>();
         try {
-            List<SysUserVo> userList = sysUserService.getAllUser();
+            LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();
+            QueryWrapper<UserCompany> userCompanyQueryWrapper = new QueryWrapper<>();
+            userCompanyQueryWrapper.eq("user_id", user.getId());
+            userCompanyQueryWrapper.orderByDesc("create_time");
+            userCompanyQueryWrapper.last("limit 1");
+            UserCompany userCompany = userCompanyMapper.selectOne(userCompanyQueryWrapper);
+            String companyId = userCompany.getCompanyId();
+            List<SysUserVo> userList;
+            if ("4b10089775c040119e139087517aed88".equals(companyId) || "6608ed13c0dd42de93c790dbdf124234".equals(companyId) || "d57fecdcf7a94d009736d9c850731582".equals(companyId)) {
+                userList = sysUserService.getAllUser();
+            } else {
+                userList = sysUserService.getUserListByCompany(companyId);
+            }
             result.setSuccess(true);
             result.setResult(userList);
         } catch (Exception e) {
@@ -155,7 +172,21 @@ public class SysUserController {
     public Result<List<SysUserVo>> getSaleList() {
         Result<List<SysUserVo>> result = new Result<>();
         try {
-            List<SysUserVo> userList = sysUserService.getAllSales();
+            LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();
+            List<SysUserVo> userList;
+            QueryWrapper<UserCompany> userCompanyQueryWrapper = new QueryWrapper<>();
+            userCompanyQueryWrapper.eq("user_id", user.getId());
+            userCompanyQueryWrapper.orderByDesc("create_time");
+            userCompanyQueryWrapper.last("limit 1");
+            UserCompany userCompany = userCompanyMapper.selectOne(userCompanyQueryWrapper);
+            String companyId = userCompany.getCompanyId();
+            if ("4b10089775c040119e139087517aed88".equals(companyId) || "6608ed13c0dd42de93c790dbdf124234".equals(companyId) || "d57fecdcf7a94d009736d9c850731582".equals(companyId)) {
+                userList = sysUserService.getAllSales();
+            } else {
+                userList = sysUserService.getAllSalesByCompanyId(companyId);
+            }
+
+
             result.setSuccess(true);
             result.setResult(userList);
         } catch (Exception e) {

+ 2 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/mapper/SysUserMapper.java

@@ -80,4 +80,6 @@ public interface SysUserMapper extends BaseMapper<SysUser> {
     List<SysUserVo> getUserListByCompany(@Param("companyId") String companyId);
 
     List<SysUserVo> getAllSale();
+
+    List<SysUserVo> getAllSalesByCompanyId(@Param("companyId") String companyId);
 }

+ 28 - 9
jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/mapper/xml/SysUserMapper.xml

@@ -94,15 +94,34 @@ SELECT
     WHERE t1.company_id = #{companyId}
     </select>
     <select id="getAllSale" resultType="cn.com.ctop.common.module.vo.SysUserVo">
-        SELECT
-            t1.id userId,
-            t1.username userName,
-            t1.realname realName,
-            t3.role_name as  roleName
-        FROM sys_user t1
-        LEFT JOIN sys_user_role t2 on t1.id = t2.user_id
-        left join sys_role t3 on t3.id = t2.role_id
-        where t3.role_name like '销售%';
+       SELECT
+	t2.id userId,
+	t2.username userName,
+	t2.realname realName,
+   t4.role_name AS roleName
+    FROM
+	user_company t1
+    LEFT JOIN sys_user t2 ON t1.user_id = t2.id
+    LEFT JOIN sys_user_role t3 ON t2.id = t3.user_id
+    LEFT JOIN sys_role t4 ON t3.role_id = t4.id
+    WHERE
+	t4.role_name LIKE '%销售%';
+    </select>
+
+
+    <select id="getAllSalesByCompanyId" resultType="cn.com.ctop.common.module.vo.SysUserVo">
+       SELECT
+	t2.id userId,
+	t2.username userName,
+	t2.realname realName,
+    t4.role_name AS roleName
+  FROM
+	user_company t1
+    LEFT JOIN sys_user t2 ON t1.user_id = t2.id
+    LEFT JOIN sys_user_role t3 ON t2.id = t3.user_id
+    LEFT JOIN sys_role t4 ON t3.role_id = t4.id
+    WHERE t1.company_id = #{companyId}
+	and t4.role_name LIKE '%销售%';
     </select>
 
 

+ 96 - 84
jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/ISysUserService.java

@@ -22,115 +22,127 @@ import java.util.Set;
  */
 public interface ISysUserService extends IService<SysUser> {
 
-	public SysUser getUserByName(String username);
+    public SysUser getUserByName(String username);
+
+    /**
+     * 添加用户和用户角色关系
+     *
+     * @param user
+     * @param roles
+     */
+    public void addUserWithRole(SysUser user, String roles);
 
-	/**
-	 * 添加用户和用户角色关系
-	 * @param user
-	 * @param roles
-	 */
-	public void addUserWithRole(SysUser user,String roles);
 
+    /**
+     * 修改用户和用户角色关系
+     *
+     * @param user
+     * @param roles
+     */
+    public void editUserWithRole(SysUser user, String roles);
 
     /**
-	 * 修改用户和用户角色关系
-	 * @param user
-	 * @param roles
-	 */
-	public void editUserWithRole(SysUser user,String roles);
-
-	/**
-	 * 获取用户的授权角色
-	 * @param username
-	 * @return
-	 */
-	public List<String> getRole(String username);
+     * 获取用户的授权角色
+     *
+     * @param username
+     * @return
+     */
+    public List<String> getRole(String username);
 
     /**
-	  * 查询用户信息包括 部门信息
-	 * @param username
-	 * @return
-	 */
-	public SysUserCacheInfo getCacheUser(String username);
-
-	/**
-	 * 根据部门Id查询
-	 * @param
-	 * @return
-	 */
-	public IPage<SysUser> getUserByDepId(Page<SysUser> page, String departId, String username);
-
-	/**
-	 * 根据角色Id查询
-	 * @param
-	 * @return
-	 */
-	public IPage<SysUser> getUserByRoleId(Page<SysUser> page,String roleId, String username);
-
-	/**
-	 * 通过用户名获取用户角色集合
-	 *
-	 * @param username 用户名
-	 * @return 角色集合
-	 */
-	Set<String> getUserRolesSet(String username);
-
-	/**
-	 * 通过用户名获取用户权限集合
-	 *
-	 * @param username 用户名
-	 * @return 权限集合
-	 */
-	Set<String> getUserPermissionsSet(String username);
+     * 查询用户信息包括 部门信息
+     *
+     * @param username
+     * @return
+     */
+    public SysUserCacheInfo getCacheUser(String username);
 
     /**
-	 * 根据用户名设置部门ID
-	 * @param username
-	 * @param orgCode
-	 */
-	void updateUserDepart(String username,String orgCode);
+     * 根据部门Id查询
+     *
+     * @param
+     * @return
+     */
+    public IPage<SysUser> getUserByDepId(Page<SysUser> page, String departId, String username);
 
     /**
-	 * 根据手机号获取用户名和密码
-	 */
-	public SysUser getUserByPhone(String phone);
+     * 根据角色Id查询
+     *
+     * @param
+     * @return
+     */
+    public IPage<SysUser> getUserByRoleId(Page<SysUser> page, String roleId, String username);
 
+    /**
+     * 通过用户名获取用户角色集合
+     *
+     * @param username 用户名
+     * @return 角色集合
+     */
+    Set<String> getUserRolesSet(String username);
 
-	/**
-	 * 根据邮箱获取用户
-	 */
-	public SysUser getUserByEmail(String email);
+    /**
+     * 通过用户名获取用户权限集合
+     *
+     * @param username 用户名
+     * @return 权限集合
+     */
+    Set<String> getUserPermissionsSet(String username);
 
+    /**
+     * 根据用户名设置部门ID
+     *
+     * @param username
+     * @param orgCode
+     */
+    void updateUserDepart(String username, String orgCode);
 
-	/**
-	 * 添加用户和用户部门关系
-	 * @param user
-	 * @param selectedParts
-	 */
-	void addUserWithDepart(SysUser user, String selectedParts);
+    /**
+     * 根据手机号获取用户名和密码
+     */
+    public SysUser getUserByPhone(String phone);
 
-	/**
-	 * 编辑用户和用户部门关系
-	 * @param user
-	 * @param departs
-	 */
-	void editUserWithDepart(SysUser user, String departs);
 
     /**
-	   * 校验用户是否有效
-	 * @param sysUser
-	 * @return
-	 */
-	Result checkUserIsEffective(SysUser sysUser);
+     * 根据邮箱获取用户
+     */
+    public SysUser getUserByEmail(String email);
+
+
+    /**
+     * 添加用户和用户部门关系
+     *
+     * @param user
+     * @param selectedParts
+     */
+    void addUserWithDepart(SysUser user, String selectedParts);
+
+    /**
+     * 编辑用户和用户部门关系
+     *
+     * @param user
+     * @param departs
+     */
+    void editUserWithDepart(SysUser user, String departs);
+
+    /**
+     * 校验用户是否有效
+     *
+     * @param sysUser
+     * @return
+     */
+    Result checkUserIsEffective(SysUser sysUser);
 
     Map<String, Object> queryRoleCode(String userId);
 
     List<SysUserVo> getAllUser();
 
 
-	List<SysUserVo> getUserListByCompany(String companyId);
+    List<SysUserVo> getUserListByCompany(String companyId);
 
     List<SysUser> getUserListByRoleId(String roleId);
 
     List<SysUserVo> getAllSales();
+
+    List<SysUserVo> getAllSalesByCompanyId(String companyId);
 }

+ 6 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/impl/SysUserServiceImpl.java

@@ -289,5 +289,11 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
         return userMapper.getAllSale();
     }
 
+    @Override
+    public List<SysUserVo> getAllSalesByCompanyId(String companyId) {
+        return userMapper.getAllSalesByCompanyId(companyId);
+
+    }
+
 
 }

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

@@ -14,11 +14,6 @@ management:
         include: metrics,httptrace
 
 spring:
-  rabbitmq:
-    host: 39.106.184.70
-    port: 5672
-    username: guest
-    password: guest
   servlet:
     multipart:
       max-file-size: -1
@@ -135,7 +130,7 @@ mybatis-plus:
       table-underline: true
     configuration:
       # 这个配置会将执行的sql打印出来,在开发或测试的时候可以用
-      log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
+      #log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
 #jeecg专用配置
 jeecg:
   ffmpeg:

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

@@ -12,11 +12,6 @@ management:
       exposure:
         include: metrics,httptrace
 spring:
-  rabbitmq:
-    host: 39.106.184.70
-    port: 5672
-    username: guest
-    password: guest
   servlet:
     multipart:
       max-file-size: -1
@@ -33,8 +28,8 @@ spring:
             enable: true
             required: true
   ## quartz定时任务,采用数据库方式
-#  quartz:
-#    job-store-type: jdbc
+  quartz:
+    job-store-type: jdbc
   #json 时间戳统一转换
   jackson:
     date-format:   yyyy-MM-dd HH:mm:ss
@@ -150,7 +145,6 @@ jeecg:
     video-upload: /mnt/upload/video/
     image-upload: /mnt/upload/image/
     chrome-driver: /usr/bin/chromedriver
-#    chrome-driver: D://chromedriver.exe
     csv-upload: /mnt/upload/csv/
     bak-database-file: /mnt/data/bak/
     report-history: /mnt/upload/report/history/

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

@@ -14,11 +14,6 @@ management:
         include: metrics,httptrace
 
 spring:
-  rabbitmq:
-    host: 39.106.184.70
-    port: 5672
-    username: guest
-    password: guest
   servlet:
     multipart:
       max-file-size: -1
@@ -34,6 +29,9 @@ spring:
           starttls:
             enable: true
             required: true
+  ## quartz定时任务,采用数据库方式
+  quartz:
+    job-store-type: jdbc
   #json 时间戳统一转换
   jackson:
     date-format:   yyyy-MM-dd HH:mm:ss
@@ -41,6 +39,7 @@ spring:
   aop:
     proxy-target-class: true
   #配置freemarker
+  #配置freemarker
   freemarker:
     # 设置模板后缀名
     suffix: .ftl
@@ -95,11 +94,11 @@ spring:
         filters: stat,slf4j
         # 通过connectProperties属性来打开mergeSql功能;慢SQL记录
         connectionProperties: druid.stat.mergeSql\=true;druid.stat.slowSqlMillis\=5000
-#      datasource:
-#        master:
-#          url: jdbc:mysql://39.106.184.70:3306/jeecg-boot?characterEncoding=UTF-8&useUnicode=true&useSSL=false
-#          username: hcst
-#          password: test@20190531
+      #      datasource:
+      #        master:
+      #          url: jdbc:mysql://39.106.184.70:3306/jeecg-boot?characterEncoding=UTF-8&useUnicode=true&useSSL=false
+      #          username: hcst
+      #          password: test@20190531
       datasource:
         master:
           url: jdbc:mysql://39.106.184.70:3306/jeecg-boot?characterEncoding=UTF-8&useUnicode=true&useSSL=false
@@ -130,11 +129,8 @@ mybatis-plus:
       id-type: 4
       # 默认数据库表下划线命名
       table-underline: true
-  configuration:
-    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
-
-    # 这个配置会将执行的sql打印出来,在开发或测试的时候可以用
-      #log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
+  # configuration:
+  #  map-underscore-to-camel-case: false
   #分页pageHelper
 pagehelper:
   helper-dialect: mysql
@@ -167,10 +163,8 @@ logging:
 chrome:
   script:
     clean: sh /mnt/webapp/cleanProcess.sh
-
-
 oss:
   replace:
-    replace-value: oss-cn-beijing-internal
+    replace-value: oss-cn-beijing
     replace-old-value: oss-cn-beijing
     download: /mnt/file/video/

+ 0 - 1
jeecg-boot-module-system/src/main/resources/static/demo1.html

@@ -1 +0,0 @@
-demo1

+ 113 - 67
jeecg-boot-module-system/src/test/java/org/jeecg/SampleTest.java

@@ -1,16 +1,21 @@
 package org.jeecg;
 
 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.utils.CtopAdConstant;
-import cn.com.ctop.crawler.modules.oceanengine.entity.HotMaterial;
-import cn.com.ctop.crawler.modules.oceanengine.service.IHotMaterialService;
-import cn.com.ctop.crawler.modules.oceanengine.service.IOceanEngineService;
+import cn.com.ctop.common.module.utils.HttpUtils;
+import cn.com.ctop.crawler.modules.pangolin.entity.PangolinApp;
+import cn.com.ctop.crawler.modules.pangolin.service.PangolinAppService;
+import cn.com.ctop.crawler.modules.pangolin.service.PangolinCrawlerService;
+import cn.com.ctop.crawler.modules.pangolin.service.PangolinLoginService;
 import cn.com.ctop.kuaishou.modules.graphql.service.IKuaishouWebInterfaceService;
-import cn.com.ctop.toutiao.modules.report.service.IBytedanceFundDailyService;
-import com.xxl.job.core.log.XxlJobLogger;
+import cn.com.ctop.toutiao.modules.report.service.IByteDanceVideoReportDailyService;
+import cn.com.ctop.toutiao.modules.report.service.IBytedanceReportService;
+import cn.com.ctop.toutiao.modules.report.service.IReportService;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import lombok.extern.slf4j.Slf4j;
 import org.jeecg.common.util.DateUtils;
 import org.junit.Test;
@@ -21,6 +26,7 @@ import org.springframework.test.context.junit4.SpringRunner;
 
 import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
@@ -30,26 +36,53 @@ import java.util.concurrent.Executors;
 @Slf4j
 public class SampleTest {
     @Autowired
-    private IOceanEngineService oceanEngineService;
+    private IBytedanceReportService bytedanceReportService;
     @Autowired
-    private IHotMaterialService hotMaterialService;
+    private IByteDanceVideoReportDailyService byteDanceVideoReportDailyService;
+    @Autowired
+    private ICtopOauthTokenService oauthTokenService;
+    @Autowired
+    private IReportService reportService;
+
     @Test
-    public void initImageUrl(){
-        List<HotMaterial> hotMaterials =  hotMaterialService.getId();
-        if(null!=hotMaterials&&!hotMaterials.isEmpty()){
-            hotMaterials.forEach(douyinHot -> {
-                HotMaterial getHot = hotMaterialService.getById(douyinHot.getId());
-//                String image = getHot.getCoverImage().replace("data:image/jpg;base64,", "");
-                String destPath = "D:\\data\\effectCase\\";
-                String fileName = getHot.getId()+".jpg";
-//                EffectCase.base64ToFile(destPath,image,fileName);
-            });
+    public void testOceanEngineJob() {
+        try {
+            String url = "https://ad.e.kuaishou.com/rest/openapi/v1/tool/key_frame";
+            JSONArray ptotoArr = new JSONArray();
+            ptotoArr.add("5188991225263567823");
+
+            Map<String, String> headers = new HashMap<>();
+            headers.put("Access-Token", "e251db4aa139eb36623818581003bcec");
+            headers.put("Content-Type", "application/json");
+            JSONObject requestJson = new JSONObject();
+            requestJson.put("advertiser_id", 161468);
+            requestJson.put("photo_ids", ptotoArr);
+            //  requestJson.put("type", type);
+            String result = HttpUtils.kuaiShouhttpPostRequest(url, requestJson.toJSONString(), headers);
+            System.err.println(result);
+            //     CtopOauthToken byId = oauthTokenService.getById(1654059015242756L);
+
+          /*  SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
+            Date start = simpleDateFormat.parse("2020-01-01");
+            Date end = simpleDateFormat.parse("2020-06-03");*/
+
+
+            /*String nowDate = "2020-06-03";
+            String endDate = "2020-01-01";
+            SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
+            Date start = simpleDateFormat.parse(nowDate);
+            Date end = simpleDateFormat.parse(endDate);
+            List<Date> dates = DateUtils.findDates(end, start);
+            for (int i = 0; i < dates.size(); i++) {
+                String formatDate = simpleDateFormat.format(dates.get(i));
+                Date parse = simpleDateFormat.parse(formatDate);
+                reportService.getAdvertiserReport(byId, parse, parse, CtopAdConstant.BYTEDANCE_REPORT_TYPE_DAILY);
+            }*/
+        } catch (Exception e) {
+            e.printStackTrace();
         }
-    }
-    @Test
-    public void testOceanEngineJob(){
-        String account="3248395570@qq.com";
-        String password = "Ydxq-704127411";
+        String account = "3248395570@qq.com";
+       /* String password = "Ydxq-704127411";
         oceanEngineService.login(account,password);
         oceanEngineService.douyinHotHandler(1,1);
         oceanEngineService.effectCaseHandler(1);
@@ -58,45 +91,48 @@ public class SampleTest {
         oceanEngineService.hotMaterialHandler(1,1,"西瓜");
         oceanEngineService.hotMaterialHandler(1,3,"火山");
         oceanEngineService.hotMaterialHandler(1,9,"穿山甲");
-        log.info("巨量创意抓取完成");
+        log.info("巨量创意抓取完成");*/
     }
 
     @Autowired
     private IBindAccountLoginService bindAccountLoginService;
     @Autowired
     private IKuaishouWebInterfaceService kuaishouWebInterfaceService;
+
     @Test
-    public void kuaishouLogin(){
-        Long start =System.currentTimeMillis();
-        List<BindAccountLogin> list = bindAccountLoginService.getListByParams(CtopAdConstant.PLATFORM_TYPE_KUAISHOU_PY,1);
-        if(list!=null&&!list.isEmpty()){
-            for (BindAccountLogin login:list) {
-                if(null==login.getCookie()||"".equals(login.getCookie().trim())){
+    public void kuaishouLogin() {
+        Long start = System.currentTimeMillis();
+        List<BindAccountLogin> list = bindAccountLoginService.getListByParams(CtopAdConstant.PLATFORM_TYPE_KUAISHOU_PY, 1);
+        if (list != null && !list.isEmpty()) {
+            for (BindAccountLogin login : list) {
+                if (null == login.getCookie() || "".equals(login.getCookie().trim())) {
                     kuaishouWebInterfaceService.getkuaishouWebLoginCookie(login);
                 }
             }
         }
         Long end = System.currentTimeMillis();
-        log.info("总用时:{}毫秒",end-start);
+        log.info("总用时:{}毫秒", end - start);
     }
+
     static ExecutorService executorService = null;
     static CountDownLatch countDownLatch = null;
+
     @Test
-    public void kuaishouCommentDelete(){
-        Long start =System.currentTimeMillis();
-        List<BindAccountLogin> list = bindAccountLoginService.getListByParams(CtopAdConstant.PLATFORM_TYPE_KUAISHOU_PY,1);
-        if(list!=null&&!list.isEmpty()){
+    public void kuaishouCommentDelete() {
+        Long start = System.currentTimeMillis();
+        List<BindAccountLogin> list = bindAccountLoginService.getListByParams(CtopAdConstant.PLATFORM_TYPE_KUAISHOU_PY, 1);
+        if (list != null && !list.isEmpty()) {
             executorService = Executors.newFixedThreadPool(10);
             countDownLatch = new CountDownLatch(list.size());
             list.forEach(login -> {
-                executorService.submit(()->{
+                executorService.submit(() -> {
                     try {
-                        if(null!=login.getCookie()&&!"".equals(login.getCookie().trim())){
-                            kuaishouWebInterfaceService.deleteAllComment(new HashMap<>(),login);
+                        if (null != login.getCookie() && !"".equals(login.getCookie().trim())) {
+                            kuaishouWebInterfaceService.deleteAllComment(new HashMap<>(), login);
                         }
-                    }catch (Exception e){
+                    } catch (Exception e) {
 
-                    }finally {
+                    } finally {
                         countDownLatch.countDown();
                     }
                 });
@@ -108,41 +144,51 @@ public class SampleTest {
             e.printStackTrace();
         }
         Long end = System.currentTimeMillis();
-        log.info("总用时:{}毫秒",end-start);
+        log.info("总用时:{}毫秒", end - start);
     }
+
+    @Autowired
+    private PangolinLoginService pangolinLoginService;
     @Autowired
-    private ICtopOauthTokenService tokenService;
+    private PangolinCrawlerService pangolinCrawlerService;
     @Autowired
-    private IBytedanceFundDailyService bytedanceFundDailyService;
+    private PangolinAppService pangolinAppService;
+
     @Test
-    public void testBase64(){
-        List<CtopOauthToken> tokens = tokenService.getTokenListByType(CtopAdConstant.PLATFORM_TYPE_BYTEDANCE);
-        if (null == tokens || tokens.size() <= 0) {
-            XxlJobLogger.log("头条账户流水数据异常:未获取到可用的token");
-            return ;
+    public void testPangolinLogin() {
+        QueryWrapper<BindAccountLogin> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("login_type", "pangolin");
+        queryWrapper.eq("status", 1);
+        List<BindAccountLogin> list = bindAccountLoginService.list(queryWrapper);
+        if (list != null && !list.isEmpty()) {
+            for (BindAccountLogin login : list) {
+                if (null == login.getCookie() || "".equals(login.getCookie().trim())) {
+                    pangolinLoginService.pangolinLogin(login.getAccountName(), login.getPassword());
+                }
+            }
         }
-        executorService = Executors.newFixedThreadPool(4);
-        countDownLatch = new CountDownLatch(tokens.size());
-        tokens.forEach(token -> {
-            executorService.submit(() -> {
-                try {
-                    for(int i=0;i<12;i++){
-                        String getDate = DateUtils.addDay("2020-05-28",-i);
-                        bytedanceFundDailyService.loadFundDataByPage(token, getDate, getDate,1);
-                    }
-                }catch (Exception e){
+    }
 
-                }finally {
-                    countDownLatch.countDown();
+    @Test
+    public void testPangolinData() {
+        QueryWrapper<BindAccountLogin> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("login_type", "pangolin");
+        queryWrapper.eq("status", 1);
+        queryWrapper.isNotNull("cookie");
+        List<BindAccountLogin> list = bindAccountLoginService.list(queryWrapper);
+        if (list != null && !list.isEmpty()) {
+            for (BindAccountLogin bindAccountLogin : list) {
+                pangolinCrawlerService.getChannelList(bindAccountLogin);
+                pangolinCrawlerService.getActivationList(bindAccountLogin, DateUtils.getNowDate("yyyy-MM-dd"), 1);
+                pangolinCrawlerService.getCheckList(bindAccountLogin);
+                QueryWrapper<PangolinApp> queryWrapper1 = new QueryWrapper<>();
+                queryWrapper1.eq("account_name", bindAccountLogin.getAccountName());
+                List<PangolinApp> appList = pangolinAppService.list(queryWrapper1);
+                if (appList != null && !appList.isEmpty()) {
+                    appList.forEach(pangolinApp -> pangolinCrawlerService.getRealTimeList(bindAccountLogin, pangolinApp.getId()));
                 }
-
-            });
-        });
-        try {
-            countDownLatch.await();
-        } catch (InterruptedException e) {
+            }
         }
-        System.out.println("执行完成");
     }
 }
 

+ 5 - 0
module-common/src/main/java/cn/com/ctop/common/module/constant/CtopRoleCodeConstant.java

@@ -0,0 +1,5 @@
+package cn.com.ctop.common.module.constant;
+
+public class CtopRoleCodeConstant {
+    public static final String COMMON_ROLE_CODE_ADMIN = "admin";
+}

+ 5 - 0
module-common/src/main/java/cn/com/ctop/common/module/constant/OssConstant.java

@@ -0,0 +1,5 @@
+package cn.com.ctop.common.module.constant;
+
+public class OssConstant {
+    public static final String formatUrl = "https://%s.%s.aliyuncs.com/";
+}

+ 3 - 3
module-common/src/main/java/cn/com/ctop/common/module/entity/MaterialCutFrame.java

@@ -38,7 +38,7 @@ public class MaterialCutFrame {
      */
     @Excel(name = "素材库id", width = 15)
     @ApiModelProperty(value = "素材库id")
-    private String materialMd5;
+    private String videoSignature;
     /**
      * url
      */
@@ -50,13 +50,13 @@ public class MaterialCutFrame {
      */
     @Excel(name = "md5", width = 15)
     @ApiModelProperty(value = "md5")
-    private String code;
+    private String signature;
     /**
      * 素材标
      */
     @Excel(name = "素材标", width = 15)
     @ApiModelProperty(value = "素材标")
-    private Integer cutFrameIndex;
+    private Integer imageIndex;
 
     /**
      * createTime

+ 63 - 0
module-common/src/main/java/cn/com/ctop/common/module/entity/MaterialCutFrameTask.java

@@ -0,0 +1,63 @@
+package cn.com.ctop.common.module.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 org.jeecgframework.poi.excel.annotation.Excel;
+
+import java.util.Date;
+
+/**
+ * 截帧 任务表
+ *
+ * @author jeecg-boot
+ * @version V1.0
+ * @date 2020-06-01
+ */
+@Data
+@TableName("ctop_material_cut_frame_task")
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value = "ctop_material_cut_frame_task对象", description = "截帧 任务表")
+public class MaterialCutFrameTask {
+
+    /**
+     * id
+     */
+    @TableId(type = IdType.AUTO)
+    @ApiModelProperty(value = "id")
+    private Long id;
+    /**
+     * 视频md5
+     */
+    @Excel(name = "视频md5", width = 15)
+    @ApiModelProperty(value = "视频md5")
+    private String videoSignature;
+    /**
+     * jobId
+     */
+    @Excel(name = "jobId", width = 15)
+    @ApiModelProperty(value = "jobId")
+    private String jobId;
+    /**
+     * 任务状态 0 未执行 1 已完成
+     */
+    @Excel(name = "任务状态 0 未执行 1 已完成", width = 15)
+    @ApiModelProperty(value = "任务状态 0 未执行 1 已完成")
+    private Integer jobStatus;
+    /**
+     * createTime
+     */
+    @ApiModelProperty(value = "createTime")
+    private Date createTime;
+    /**
+     * updateTime
+     */
+    @ApiModelProperty(value = "updateTime")
+    private Date updateTime;
+}

+ 7 - 0
module-common/src/main/java/cn/com/ctop/common/module/entity/MaterialInfo.java

@@ -153,4 +153,11 @@ public class MaterialInfo {
     private Boolean whetherUnaudited;  // 是否有未审核封面
 
 
+    @TableField(exist = false)
+    private String mediaId;  // 是否有未审核封面
+
+    @TableField(exist = false)
+    private String projectName;  // 是否有未审核封面
+
+
 }

+ 3 - 0
module-common/src/main/java/cn/com/ctop/common/module/mapper/CtopOauthTokenMapper.java

@@ -2,6 +2,7 @@ package cn.com.ctop.common.module.mapper;
 
 import cn.com.ctop.common.module.entity.CtopOauthToken;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
 
@@ -36,4 +37,6 @@ public interface CtopOauthTokenMapper extends BaseMapper<CtopOauthToken> {
     List<CtopOauthToken> selectKuaiShouToken();
 
     List<CtopOauthToken> selectToutiaoToken();
+
+    CtopOauthToken getAccessTokenByAccountIdAndMediaId(@Param("mediaId")Integer mediaId, @Param("accountId")Long accountId);
 }

+ 4 - 0
module-common/src/main/java/cn/com/ctop/common/module/mapper/MaterialCutFrameMapper.java

@@ -2,6 +2,9 @@ package cn.com.ctop.common.module.mapper;
 
 import cn.com.ctop.common.module.entity.MaterialCutFrame;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
 
 
 /**
@@ -13,4 +16,5 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
  */
 public interface MaterialCutFrameMapper extends BaseMapper<MaterialCutFrame> {
 
+    List<MaterialCutFrame> getListByVideoSignature(@Param(value = "videoSignature") String signature);
 }

+ 15 - 0
module-common/src/main/java/cn/com/ctop/common/module/mapper/MaterialCutFrameTaskMapper.java

@@ -0,0 +1,15 @@
+package cn.com.ctop.common.module.mapper;
+
+import cn.com.ctop.common.module.entity.MaterialCutFrameTask;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * 截帧 任务表
+ *
+ * @author: jeecg-boot
+ * @date: 2020-06-01
+ * @cersion: V1.0
+ */
+public interface MaterialCutFrameTaskMapper extends BaseMapper<MaterialCutFrameTask> {
+
+}

+ 2 - 0
module-common/src/main/java/cn/com/ctop/common/module/mapper/MaterialInfoMapper.java

@@ -34,4 +34,6 @@ public interface MaterialInfoMapper extends BaseMapper<MaterialInfo> {
     MaterialInfo getMaterialInfoByCode(@Param("code") String code);
 
     Long getProjectIdByAccountId(@Param("accountId") Long accountId);
+
+    List<MaterialInfo> getListByDate(@Param("startDate") String startDate,@Param("endDate") String endDate);
 }

+ 4 - 1
module-common/src/main/java/cn/com/ctop/common/module/mapper/UserAllocationMapper.java

@@ -2,6 +2,9 @@ package cn.com.ctop.common.module.mapper;
 
 import cn.com.ctop.common.module.entity.UserAllocation;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
 
 /**
  * @Description: 用户分配
@@ -10,5 +13,5 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
  * @Version: V1.0
  */
 public interface UserAllocationMapper extends BaseMapper<UserAllocation> {
-
+    List<UserAllocation> selectAccountListByProjectId(@Param("projectId")Long projectId);
 }

+ 9 - 0
module-common/src/main/java/cn/com/ctop/common/module/mapper/xml/CtopOauthTokenMapper.xml

@@ -97,4 +97,13 @@
         group by account_id
     </select>
 
+    <select id="getAccessTokenByAccountIdAndMediaId" resultType="cn.com.ctop.common.module.entity.CtopOauthToken">
+        select
+        *
+        from
+        ctop_oauth_token
+        where media_id = #{mediaId}
+        and account_id = #{accountId}
+    </select>
+
 </mapper>

+ 22 - 1
module-common/src/main/java/cn/com/ctop/common/module/mapper/xml/MaterialCutFrameMapper.xml

@@ -2,4 +2,25 @@
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="cn.com.ctop.common.module.mapper.MaterialCutFrameMapper">
 
-</mapper>
+    <select id="getListByVideoSignature" resultType="cn.com.ctop.common.module.entity.MaterialCutFrame">
+        select a.signature,
+       (select frame.url
+        from ctop_material_cut_frame frame
+        where frame.signature = a.signature
+        order by id desc
+        limit 1) as 'url',
+       (select frame.image_index
+        from ctop_material_cut_frame frame
+        where frame.signature = a.signature
+        order by id desc
+        limit 1) as 'image_index',
+       (select frame.id
+        from ctop_material_cut_frame frame
+        where frame.signature = a.signature
+        order by id desc
+        limit 1) as 'id'
+from (select distinct signature
+      from ctop_material_cut_frame
+      where video_signature = #{videoSignature}) a;
+    </select>
+</mapper>

+ 5 - 0
module-common/src/main/java/cn/com/ctop/common/module/mapper/xml/MaterialCutFrameTaskMapper.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="cn.com.ctop.common.module.mapper.MaterialCutFrameTaskMapper">
+
+</mapper>

+ 8 - 0
module-common/src/main/java/cn/com/ctop/common/module/mapper/xml/MaterialInfoMapper.xml

@@ -130,5 +130,13 @@
         limit 1
     </select>
 
+    <select id="getListByDate" resultType="cn.com.ctop.common.module.entity.MaterialInfo">
+        select  *  from
+        ctop_material_info
+        where  1 = 1
+        and DATE_FORMAT(create_time,'%Y-%m-%d') &gt;= #{startDate}
+        and DATE_FORMAT(create_time,'%Y-%m-%d') &lt;= #{endDate}
+    </select>
+
 
 </mapper>

+ 11 - 0
module-common/src/main/java/cn/com/ctop/common/module/mapper/xml/UserAllocationMapper.xml

@@ -2,4 +2,15 @@
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="cn.com.ctop.common.module.mapper.UserAllocationMapper">
 
+    <select id="selectAccountListByProjectId" resultType="cn.com.ctop.common.module.entity.UserAllocation">
+        select
+        a.user_id as userId,
+        a.user_name as userName,
+        a.auth_name as authName,
+        a.account_id as accountId
+        from
+        ctop_user_allocation a
+        left join ctop_project b on a.project_id = b.id
+        where b.id = #{projectId}
+    </select>
 </mapper>

+ 2 - 0
module-common/src/main/java/cn/com/ctop/common/module/service/ICtopOauthTokenService.java

@@ -27,4 +27,6 @@ public interface ICtopOauthTokenService extends IService<CtopOauthToken> {
     List<CtopOauthToken> selectKuaiShouToken();
 
     List<CtopOauthToken> selectToutiaoToken();
+
+    CtopOauthToken getAccessTokenByAccountIdAndMediaId(Integer mediaId, Long accountId);
 }

+ 6 - 1
module-common/src/main/java/cn/com/ctop/common/module/service/IMaterialCutFrameService.java

@@ -5,6 +5,7 @@ import cn.com.ctop.common.module.entity.MaterialCutFrame;
 import com.baomidou.mybatisplus.extension.service.IService;
 
 import java.io.IOException;
+import java.util.List;
 
 /**
  * 截屏
@@ -14,6 +15,10 @@ import java.io.IOException;
  * @date 2019-12-25
  */
 public interface IMaterialCutFrameService extends IService<MaterialCutFrame> {
-    void getCutFrame(String url, String materialId, String height, String width) throws IOException;
+    void getCutFrame(String url, String materialId, Long secondDuration, String height, String width) throws IOException;
+
+    void loadCutFrame(String jobId, String videoSignature);
+
+    List<MaterialCutFrame> getListByVideoSignature(String signature);
 
 }

+ 15 - 0
module-common/src/main/java/cn/com/ctop/common/module/service/IMaterialCutFrameTaskService.java

@@ -0,0 +1,15 @@
+package cn.com.ctop.common.module.service;
+
+import cn.com.ctop.common.module.entity.MaterialCutFrameTask;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * 截帧 任务表
+ *
+ * @author jeecg-boot
+ * @version V1.0
+ * @date 2020-06-01
+ */
+public interface IMaterialCutFrameTaskService extends IService<MaterialCutFrameTask> {
+
+}

+ 1 - 0
module-common/src/main/java/cn/com/ctop/common/module/service/IMaterialInfoService.java

@@ -64,4 +64,5 @@ public interface IMaterialInfoService extends IService<MaterialInfo> {
 
     List<String> getEffiCode();
 
+    List<MaterialInfo> getListByDate(String startDate, String endDate);
 }

+ 2 - 0
module-common/src/main/java/cn/com/ctop/common/module/service/IUserAllocationService.java

@@ -22,4 +22,6 @@ public interface IUserAllocationService extends IService<UserAllocation> {
     Map<String, Object> getPangolinAccountListByParams(String userId, JSONObject data);
 
     Map<String, Object> getPangolinProjectListByParams(String userId);
+
+    List<UserAllocation> selectAccountListByProjectId(Long projectId);
 }

+ 6 - 0
module-common/src/main/java/cn/com/ctop/common/module/service/impl/CtopOauthTokenServiceImpl.java

@@ -191,4 +191,10 @@ public class CtopOauthTokenServiceImpl extends ServiceImpl<CtopOauthTokenMapper,
     public List<CtopOauthToken> selectToutiaoToken() {
         return cTopOauthTokenMapper.selectToutiaoToken();
     }
+
+
+    @Override
+    public CtopOauthToken getAccessTokenByAccountIdAndMediaId(Integer mediaId, Long accountId) {
+        return cTopOauthTokenMapper.getAccessTokenByAccountIdAndMediaId(mediaId, accountId);
+    }
 }

+ 126 - 59
module-common/src/main/java/cn/com/ctop/common/module/service/impl/MaterialCutFrameServiceImpl.java

@@ -1,8 +1,12 @@
 package cn.com.ctop.common.module.service.impl;
 
+import cn.com.ctop.common.module.constant.OssConstant;
 import cn.com.ctop.common.module.entity.MaterialCutFrame;
+import cn.com.ctop.common.module.entity.MaterialCutFrameTask;
 import cn.com.ctop.common.module.mapper.MaterialCutFrameMapper;
 import cn.com.ctop.common.module.service.IMaterialCutFrameService;
+import cn.com.ctop.common.module.service.IMaterialCutFrameTaskService;
+import cn.com.ctop.common.module.utils.Check;
 import cn.com.ctop.common.module.utils.LoadFileUtil;
 import cn.com.ctop.common.module.utils.MpsUtils;
 import com.alibaba.fastjson.JSON;
@@ -14,11 +18,16 @@ import com.aliyuncs.mts.model.v20140618.QuerySnapshotJobListResponse;
 import com.aliyuncs.mts.model.v20140618.SubmitSnapshotJobRequest;
 import com.aliyuncs.mts.model.v20140618.SubmitSnapshotJobResponse;
 import com.aliyuncs.profile.DefaultProfile;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 
 import java.io.IOException;
 import java.net.URLEncoder;
+import java.util.List;
 
 
 /**
@@ -28,6 +37,7 @@ import java.net.URLEncoder;
  * @version V1.0
  * @date 2019-12-25
  */
+@Slf4j
 @Service
 public class MaterialCutFrameServiceImpl extends ServiceImpl<MaterialCutFrameMapper, MaterialCutFrame> implements IMaterialCutFrameService {
 
@@ -35,26 +45,44 @@ public class MaterialCutFrameServiceImpl extends ServiceImpl<MaterialCutFrameMap
     private static String ossBucket = "ctop-media";
     private static String ossOutputObject = "output_{Count}.jpg";
 
+    @Value("${jeecg.path.image-upload}")
+    private String imageUpLoadPath;
+
+
+    @Autowired
+    private IMaterialCutFrameTaskService cutFrameTaskService;
+    @Autowired
+    private MaterialCutFrameMapper materialCutFrameMapper;
+
     /**
      * 获取素材关键帧
      *
      * @param url
      */
     @Override
-    public void getCutFrame(String url, String materialId, String height, String width) throws IOException {
+    public void getCutFrame(String url, String materialId, Long secondDuration, String height, String width) throws IOException {
         try {
-            String zeroFrameUrl = url + "?x-oss-process=video/snapshot,t_00000,m_fast";
 
-            // String localPath = LoadFileUtil.downLoadFromUrl(zeroFrameUrl, PropertiesUtils.getValue("kuaishou_config", "video_sava_path"));
-            String localPath = LoadFileUtil.downLoadFromUrl(zeroFrameUrl, "D:\\tets1");
+            QueryWrapper<MaterialCutFrameTask> queryWrapper = new QueryWrapper<>();
+            queryWrapper.eq("video_signature", materialId);
+            queryWrapper.last("limit 1");
+            MaterialCutFrameTask checkCutFrame = cutFrameTaskService.getOne(queryWrapper);
+            if (!Check.isNull(checkCutFrame)) {
+                log.info("已存推荐封面");
+                return;
+
+            }
+
+            String zeroFrameUrl = url + "?x-oss-process=video/snapshot,t_00000,m_fast";
+            String localPath = LoadFileUtil.downLoadFromUrl(zeroFrameUrl, imageUpLoadPath);
             String md5 = LoadFileUtil.getMD5(localPath);
             LoadFileUtil.delFile(localPath);
 
             MaterialCutFrame cutFrame = new MaterialCutFrame();
-            cutFrame.setCode(md5);
+            cutFrame.setSignature(md5);
             cutFrame.setUrl(zeroFrameUrl);
-            cutFrame.setMaterialMd5(materialId);
-            cutFrame.setCutFrameIndex(0);
+            cutFrame.setVideoSignature(materialId);
+            cutFrame.setImageIndex(0);
             this.save(cutFrame);
 
 
@@ -72,11 +100,13 @@ public class MaterialCutFrameServiceImpl extends ServiceImpl<MaterialCutFrameMap
             JSONObject input = new JSONObject();
             input.put("Location", ossLocation);
             input.put("Bucket", ossBucket);
-
+            //   https://ctop-media.oss-cn-beijing.aliyuncs.com/video/2020-06-03/bp%E8%95%89%E4%B8%8B%E7%9B%B4%E6%92%AD2-1591188835505.mp4
             String replaceUrl = url.replace("https://ctop-media.oss-cn-beijing.aliyuncs.com/", "");
             input.put("Object", replaceUrl);
 
             request.setInput(input.toJSONString());
+
+
             // SnapshotConfig
             JSONObject snapshotConfig = new JSONObject();
             // SnapshotConfig->OutputFile
@@ -89,10 +119,15 @@ public class MaterialCutFrameServiceImpl extends ServiceImpl<MaterialCutFrameMap
 
             snapshotConfig.put("OutputFile", output.toJSONString());
             // SnapshotConfig->Time
-            snapshotConfig.put("Time", "3");
+            //   Integer time = ((secondDuration.intValue() - 2) / 14) + 1; // 时长 / 14 == 间隔时间
+
+            double num = (double) (secondDuration - 2) / 15;
+            long rint = Math.round(num);
+            log.info("相隔时间数:{}", rint);
+            snapshotConfig.put("Time", 2000);
             // SnapshotConfig->Interval/Num
-            snapshotConfig.put("Interval", "2");
-            snapshotConfig.put("Num", "9");
+            snapshotConfig.put("Interval", rint);
+            snapshotConfig.put("Num", "14");
             // SnapshotConfig->Width/Height
             snapshotConfig.put("Height", height);
             snapshotConfig.put("Width", width);
@@ -101,61 +136,93 @@ public class MaterialCutFrameServiceImpl extends ServiceImpl<MaterialCutFrameMap
             // PipelineId
             String pipelineId = MpsUtils.getPipelineId(client);
             request.setPipelineId(pipelineId);
-            // call api
-            SubmitSnapshotJobResponse response;
-            response = client.getAcsResponse(request);
-            for (int i = 0; i < 100; i++) {
-                Thread.sleep(5 * 1000L);
-                QuerySnapshotJobListRequest request1 = new QuerySnapshotJobListRequest();
-                request1.setSnapshotJobIds(response.getSnapshotJob().getId());
-                QuerySnapshotJobListResponse response1 = client.getAcsResponse(request1);
-                String s = JSON.toJSONString(response1);
-                JSONObject jsonObject = JSONObject.parseObject(s);
-                if (jsonObject == null) {
-                    continue;
-                }
-                JSONObject json = (JSONObject) jsonObject.getJSONArray("snapshotJobList").get(0);
-                String state = json.getString("state");
-                if (null == state || !"Success".equals(state)) {
-                    continue;
-                }
-                Integer count = json.getInteger("count");
-                for (int j = 1; j <= count; j++) {
-                    String urlStr = "";
-                    if (j < 10) {
-                        urlStr = String.format(
-                                "https://%s.%s.aliyuncs.com/" + ossOutputObject1 + "output_0000" + j + ".jpg",
-                                ossBucket,
-                                ossLocation);
-                    } else if (j < 100) {
-                        urlStr = String.format(
-                                "https://%s.%s.aliyuncs.com/" + ossOutputObject1 + "output_000" + j + ".jpg",
-                                ossBucket,
-                                ossLocation);
-                    } else if (j > 100) {
-                        urlStr = String.format(
-                                "https://%s.%s.aliyuncs.com/" + ossOutputObject1 + "output_00" + j + ".jpg",
-                                ossBucket,
-                                ossLocation);
-                    }
-                    String cutFramePath = LoadFileUtil.downLoadFromUrl(urlStr, "D:\\tets1");
-                    String cutFrameMd5 = LoadFileUtil.getMD5(cutFramePath);
-                    LoadFileUtil.delFile(cutFramePath);
-                    cutFrame = new MaterialCutFrame();
-                    cutFrame.setCode(cutFrameMd5);
-                    cutFrame.setUrl(urlStr);
-                    cutFrame.setMaterialMd5(materialId);
-                    cutFrame.setCutFrameIndex(j);
-                    this.save(cutFrame);
+            SubmitSnapshotJobResponse response = client.getAcsResponse(request);
+            String jobId = response.getSnapshotJob().getId();
+            MaterialCutFrameTask cutFrameTask = new MaterialCutFrameTask();
+            cutFrameTask.setJobStatus(0);
+            cutFrameTask.setJobId(jobId);
+            cutFrameTask.setVideoSignature(materialId);
+            cutFrameTaskService.save(cutFrameTask);
+        } catch (Exception e) {
+            log.error(e.getMessage());
+        }
+
+
+    }
+
+
+    @Override
+    public void loadCutFrame(String jobId, String videoSignature) {
+        try {
+            DefaultProfile profile = DefaultProfile.getProfile(
+                    "cn-beijing",
+                    "LTAIbNbqWzSOklQV",
+                    "1rkPz7JNoXk8sJevPaeYHWqfkQXBGh");
+            IAcsClient client = new DefaultAcsClient(profile);
+
+            QuerySnapshotJobListRequest request = new QuerySnapshotJobListRequest();
+            request.setSnapshotJobIds(jobId);
+            QuerySnapshotJobListResponse response = client.getAcsResponse(request);
+            JSONObject jsonObject = JSONObject.parseObject(JSON.toJSONString(response));
+            if (jsonObject == null) {
+                return;
+            }
+            JSONObject json = (JSONObject) jsonObject.getJSONArray("snapshotJobList").get(0);
+            String state = json.getString("state");
+            if (null == state || !"Success".equals(state)) {
+                return;
+            }
+            String loadImage = "cutFrame/" + videoSignature + "/";
+
+            Integer count = json.getInteger("count");
+            for (int j = 1; j <= count; j++) {
+                String urlStr = null;
+                if (j < 10) {
+                    urlStr = String.format(
+                            OssConstant.formatUrl + loadImage + "output_0000" + j + ".jpg",
+                            ossBucket,
+                            ossLocation);
+                } else if (j < 100) {
+                    urlStr = String.format(
+                            OssConstant.formatUrl + loadImage + "output_000" + j + ".jpg",
+                            ossBucket,
+                            ossLocation);
+                } else if (j > 100) {
+                    urlStr = String.format(
+                            OssConstant.formatUrl + loadImage + "output_00" + j + ".jpg",
+                            ossBucket,
+                            ossLocation);
                 }
-                break;
+                String cutFramePath = LoadFileUtil.downLoadFromUrl(urlStr, imageUpLoadPath);
+                String cutFrameMd5 = LoadFileUtil.getMD5(cutFramePath);
+
+                MaterialCutFrame cutFrame = new MaterialCutFrame();
+                cutFrame.setSignature(cutFrameMd5);
+                cutFrame.setUrl(urlStr);
+                cutFrame.setVideoSignature(videoSignature);
+                cutFrame.setImageIndex(j);
+                this.save(cutFrame);
+                LoadFileUtil.delFile(cutFramePath);
+
             }
+
+            QueryWrapper<MaterialCutFrameTask> updateQueryWrapper = new QueryWrapper<>();
+            updateQueryWrapper.eq("job_id", jobId);
+            updateQueryWrapper.eq("video_signature", videoSignature);
+            MaterialCutFrameTask updateTask = new MaterialCutFrameTask();
+            updateTask.setJobStatus(1);
+            cutFrameTaskService.update(updateTask, updateQueryWrapper);
         } catch (Exception e) {
-            e.printStackTrace();
+            log.error(e.getMessage());
         }
 
+    }
 
+    @Override
+    public List<MaterialCutFrame> getListByVideoSignature(String videoSignature) {
+        return materialCutFrameMapper.getListByVideoSignature(videoSignature);
     }
 
 
+
 }

+ 19 - 0
module-common/src/main/java/cn/com/ctop/common/module/service/impl/MaterialCutFrameTaskServiceImpl.java

@@ -0,0 +1,19 @@
+package cn.com.ctop.common.module.service.impl;
+
+import cn.com.ctop.common.module.entity.MaterialCutFrameTask;
+import cn.com.ctop.common.module.mapper.MaterialCutFrameTaskMapper;
+import cn.com.ctop.common.module.service.IMaterialCutFrameTaskService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * 截帧 任务表
+ *
+ * @author jeecg-boot
+ * @version V1.0
+ * @date 2020-06-01
+ */
+@Service
+public class MaterialCutFrameTaskServiceImpl extends ServiceImpl<MaterialCutFrameTaskMapper, MaterialCutFrameTask> implements IMaterialCutFrameTaskService {
+
+}

+ 25 - 17
module-common/src/main/java/cn/com/ctop/common/module/service/impl/MaterialInfoServiceImpl.java

@@ -51,6 +51,9 @@ public class MaterialInfoServiceImpl extends ServiceImpl<MaterialInfoMapper, Mat
     private IVideoWatermarkTaskService videoWatermarkTaskService;
     @Autowired
     private MaterialInfoMapper materialInfoMapper;
+    @Autowired
+    private MaterialParameterMapper materialParameterMapper;
+
     @Value("${oss.replace.replace-value}")
     private String replaceValue;
     @Value("${oss.replace.replace-old-value}")
@@ -324,9 +327,6 @@ public class MaterialInfoServiceImpl extends ServiceImpl<MaterialInfoMapper, Mat
     }
 
 
-    @Autowired
-    private MaterialParameterMapper materialParameterMapper;
-
     @Override
     public void getFile(MaterialInfo materialInfo) {
         uploadExecutorService.submit(new Runnable() {
@@ -336,7 +336,8 @@ public class MaterialInfoServiceImpl extends ServiceImpl<MaterialInfoMapper, Mat
                 log.info("获取素材基本信息,code:{}", materialInfo.getCode());
                 if (!Check.isNull(materialInfo)) {
                     long l = System.currentTimeMillis();
-                    String url = materialInfo.getUrl().replace(replaceOldValue, replaceValue);
+                    String videoUrl = materialInfo.getUrl();
+                    String url = videoUrl.replace(replaceOldValue, replaceValue);
                     log.info("replaceUrl:{}", url);
                     String localUrl = null;
                     it.sauronsoftware.jave.MultimediaInfo m = null;
@@ -362,6 +363,8 @@ public class MaterialInfoServiceImpl extends ServiceImpl<MaterialInfoMapper, Mat
                         // 视频高
                         String height = String.valueOf(m.getVideo().getSize().getHeight());
                         materialParameter.setHeight(height);
+
+
                         fis = new FileInputStream(file);
                         FileChannel fc = fis.getChannel();
                         BigDecimal fileSize = new BigDecimal(fc.size());
@@ -375,8 +378,19 @@ public class MaterialInfoServiceImpl extends ServiceImpl<MaterialInfoMapper, Mat
                         int insert = materialParameterMapper.insert(materialParameter);
                         if (insert > 0) {
                             log.info("素材基本信息入库完成,用时:{} s", (System.currentTimeMillis() - l) / 1000);
-
                         }
+                        Thread thread = new Thread() {
+                            @Override
+                            public void run() {
+                                try {
+                                    log.info("开始抽帧");
+                                    materialCutFrameService.getCutFrame(videoUrl, materialInfo.getCode(), secondDuration, height, width);
+                                } catch (Exception e) {
+                                    e.printStackTrace();
+                                }
+                            }
+                        };
+                        thread.start();
                     } catch (FileNotFoundException e) {
                         e.printStackTrace();
                     } catch (IOException e) {
@@ -394,18 +408,7 @@ public class MaterialInfoServiceImpl extends ServiceImpl<MaterialInfoMapper, Mat
                         }
                     }
 
-                            /*Thread thread = new Thread() {
-                                @Override
-                                public void run() {
-                                    try {
-                                        Thread.sleep(5 * 1000);
-                                        materialCutFrameService.getCutFrame(url, materialInfo.getCode(), height, width);
-                                    } catch (Exception e) {
-                                        e.printStackTrace();
-                                    }
-                                }
-                            };
-                            thread.start();*/
+                    /* */
 
                        /* } catch (Exception e) {
                             e.printStackTrace();
@@ -601,6 +604,11 @@ public class MaterialInfoServiceImpl extends ServiceImpl<MaterialInfoMapper, Mat
 
         return materialInfoList;
     }
+
+    @Override
+    public List<MaterialInfo> getListByDate(String startDate, String endDate) {
+        return materialInfoMapper.getListByDate(startDate, endDate);
+    }
 }
 
 

+ 11 - 0
module-common/src/main/java/cn/com/ctop/common/module/service/impl/UserAllocationServiceImpl.java

@@ -10,6 +10,7 @@ import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import org.springframework.context.annotation.Primary;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import java.util.HashMap;
@@ -25,6 +26,8 @@ import java.util.Map;
 @Service
 @Primary
 public class UserAllocationServiceImpl extends ServiceImpl<UserAllocationMapper, UserAllocation> implements IUserAllocationService {
+    @Autowired
+    private UserAllocationMapper userAllocationMapper;
 
     @Override
     public UserAllocation getByAccountId(Long accountId) {
@@ -78,4 +81,12 @@ public class UserAllocationServiceImpl extends ServiceImpl<UserAllocationMapper,
         result.put("data",allocations);
         return result;
     }
+
+    @Override
+    public List<UserAllocation> selectAccountListByProjectId(Long projectId) {
+        List<UserAllocation> list = userAllocationMapper.selectAccountListByProjectId(projectId);
+        return list;
+    }
+
+
 }

+ 12 - 1
module-common/src/main/java/cn/com/ctop/common/module/utils/CtopAdConstant.java

@@ -6,9 +6,20 @@ import java.math.BigDecimal;
  * 广告相关常量数据
  */
 public class CtopAdConstant {
+    //头条
     public static final String PLATFORM_TYPE_BYTEDANCE = "1";
+    public static final  int PLATFORM_TYPE_BYTEDANCE_INT = 1;
+    //快手
     public static final String PLATFORM_TYPE_KUAISHOU = "2";
-    public static final String PLATFORM_TYPE_PANGOLIN = "3";
+    public static final  int PLATFORM_TYPE_KUAISHOU_INT = 2;
+    //头条内广
+    public static final String PLATFORM_TYPE_BYTEDANCE_INSIDE = "3";
+    public static final  int PLATFORM_TYPE_BYTEDANCE_INSIDE_INT = 3;
+    //头条内广
+    public static final String PLATFORM_TYPE_KUAISHOU_INSIDE = "4";
+    public static final  int PLATFORM_TYPE_KUAISHOU_INSIDE_INT = 4;
+
+    public static final String PLATFORM_TYPE_PANGOLIN = "5";
 
     public static final String PLATFORM_TYPE_BYTEDANCE_PY = "bytedance";
     public static final String PLATFORM_TYPE_KUAISHOU_PY = "kuaishou";

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

@@ -109,6 +109,11 @@ public class KuaishouInterfaceConstant {
      */
     public static final String APP_SEARCH = "/rest/openapi/v1/tool/app/search";
 
+    /**
+     * 获取可选的应用定向
+     */
+    public static final String CONVERT_LIST = "/rest/openapi/v1/tool/convert/list";
+
 
     /**
      * 获取定向标签

+ 0 - 1
module-common/src/main/java/cn/com/ctop/common/module/utils/LoadFileUtil.java

@@ -37,7 +37,6 @@ public class LoadFileUtil {
             //文件保存位置
             File saveDir = new File(savePath);
             if (!saveDir.exists()) {
-//            saveDir.mkdir();
                 saveDir.mkdirs();
             }
             String localPath = saveDir + File.separator + fileName;

+ 5 - 6
module-crawler/src/main/java/cn/com/ctop/crawler/modules/core/service/IKuaishouCrawlerService.java

@@ -5,10 +5,9 @@ import cn.com.ctop.crawler.modules.account.entity.KuaishouAppAccount;
 import cn.com.ctop.crawler.modules.account.entity.KuaishouIosAccount;
 
 public interface IKuaishouCrawlerService {
-    public String getVideoFeeds(KuaishouAppAccount kuaishouAppAccount,Integer page);
-    public String getVideoFeeds(KuaishouIosAccount kuaishouIosAccount);
-    public String getAdAccountVideoFeeds(KuaishouAdAccount kuaishouAdAccount,String pcursor);
-    public String getAdFeeds();
-
-    public String getUserProfile(Long userId);
+    String getVideoFeeds(KuaishouAppAccount kuaishouAppAccount,Integer page);
+    String getVideoFeeds(KuaishouIosAccount kuaishouIosAccount);
+    String getAdAccountVideoFeeds(KuaishouAdAccount kuaishouAdAccount,String pcursor);
+    String getAdFeeds();
+    String getUserProfile(Long userId);
 }

+ 2 - 0
module-crawler/src/main/java/cn/com/ctop/crawler/modules/pangolin/service/PangolinCrawlerService.java

@@ -10,4 +10,6 @@ public interface PangolinCrawlerService {
     void getActivationList(BindAccountLogin bindAccountLogin, String date, int page);
 
     void getRealTimeList(BindAccountLogin bindAccountLogin, Long appId);
+
+    void getNowData(BindAccountLogin bindAccountLogin);
 }

+ 1 - 1
module-crawler/src/main/java/cn/com/ctop/crawler/modules/pangolin/service/PangolinLoginService.java

@@ -1,5 +1,5 @@
 package cn.com.ctop.crawler.modules.pangolin.service;
 
 public interface PangolinLoginService {
-    public void pangolinLogin(String username,String password);
+    void pangolinLogin(String username,String password);
 }

+ 0 - 1
module-crawler/src/main/java/cn/com/ctop/crawler/modules/pangolin/service/impl/PangolinAppServiceImpl.java

@@ -28,7 +28,6 @@ public class PangolinAppServiceImpl extends ServiceImpl<PangolinAppMapper, Pango
     @Override
     public Map<String, Object> getListByUserId(String userId, JSONObject data) {
         Map<String,Object>result = new HashMap<>();
-        System.out.println(data.toJSONString());
         List<Long>projectIds = null;
         List<String>accountNames = null;
         JSONArray accountNameArray = data.getJSONArray("accountName");

+ 13 - 0
module-crawler/src/main/java/cn/com/ctop/crawler/modules/pangolin/service/impl/PangolinCrawlerServiceImpl.java

@@ -341,4 +341,17 @@ public class PangolinCrawlerServiceImpl implements PangolinCrawlerService {
             e.printStackTrace();
         }
     }
+
+    @Override
+    public void getNowData(BindAccountLogin bindAccountLogin) {
+        getChannelList(bindAccountLogin);
+        getActivationList(bindAccountLogin, DateUtils.getNowDate("yyyy-MM-dd"), 1);
+        getCheckList(bindAccountLogin);
+        QueryWrapper<PangolinApp> queryWrapper1 = new QueryWrapper<>();
+        queryWrapper1.eq("account_name", bindAccountLogin.getAccountName());
+        List<PangolinApp> appList = pangolinAppService.list(queryWrapper1);
+        if (appList != null && !appList.isEmpty()) {
+            appList.forEach(pangolinApp -> getRealTimeList(bindAccountLogin, pangolinApp.getId()));
+        }
+    }
 }

+ 33 - 33
module-crawler/src/main/java/cn/com/ctop/crawler/modules/pangolin/service/impl/PangolinLoginServiceImpl.java

@@ -5,9 +5,8 @@ import cn.com.ctop.common.module.service.IBindAccountLoginService;
 import cn.com.ctop.common.module.utils.ChaojiyingUtils;
 import cn.com.ctop.common.module.utils.HttpUtils2;
 import cn.com.ctop.crawler.modules.pangolin.service.PangolinLoginService;
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.ObjectMapper;
 import com.google.gson.Gson;
 import org.apache.http.impl.client.BasicCookieStore;
 import org.apache.http.impl.cookie.BasicClientCookie;
@@ -17,6 +16,7 @@ import org.openqa.selenium.chrome.ChromeOptions;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
+
 import java.util.*;
 
 
@@ -45,33 +45,38 @@ public class PangolinLoginServiceImpl implements PangolinLoginService {
             webDriver.manage().deleteAllCookies();
             //获取登录页面
             webDriver.get(url);
+            Thread.sleep(3000L);
+            WebElement accountElement = webDriver.findElement(By.xpath("//input[@id='username']"));
+            accountElement.sendKeys(username);
+            Thread.sleep(3000L);
+            WebElement passwordElement = webDriver.findElement(By.xpath("//input[@id='password']"));
+            passwordElement.sendKeys(password);
+            WebElement captchaElement = webDriver.findElement(By.xpath("//div[@class='ant-form-item-control ']/img"));
+            String outputType = captchaElement.getScreenshotAs(OutputType.BASE64);
+            String res = ChaojiyingUtils.process(outputType,1902);
+            JSONObject capachaObject = JSONObject.parseObject(res);
+            Integer code = capachaObject.getInteger("err_no");
+            String captcha = capachaObject.getString("pic_str");
+            WebElement captchaInputElement = webDriver.findElement(By.xpath("//input[@id='captcha']"));
+            captchaInputElement.sendKeys(captcha);
+            WebElement loginElement = webDriver.findElement(By.xpath("//button[@type='submit']"));
+            Thread.sleep(3000L);
+            //点击登录
+            loginElement.click();
+            Thread.sleep(3000L);
+            webDriver.get("https://pangolin.bytedance.com");
+            Thread.sleep(3000L);
             List<WebElement> list = webDriver.findElements(By.xpath("//input[@id='captcha']"));
-            do {
-                Thread.sleep(3000L);
-                WebElement accountElement = webDriver.findElement(By.xpath("//input[@id='username']"));
-                accountElement.sendKeys(username);
-                Thread.sleep(3000L);
-                WebElement passwordElement = webDriver.findElement(By.xpath("//input[@id='password']"));
-                passwordElement.sendKeys(password);
-                WebElement captchaElement = webDriver.findElement(By.xpath("//div[@class='ant-form-item-control ']/img"));
-                String outputType = captchaElement.getScreenshotAs(OutputType.BASE64);
-                String res = ChaojiyingUtils.process(outputType,1902);
-                ObjectMapper mapper = new ObjectMapper();
-                JsonNode n = mapper.readTree(res);
-                String captcha = n.get("pic_str").asText();
-                WebElement captchaInputElement = webDriver.findElement(By.xpath("//input[@id='captcha']"));
-                captchaInputElement.sendKeys(captcha);
-                WebElement loginElement = webDriver.findElement(By.xpath("//button[@type='submit']"));
-                Thread.sleep(3000L);
-                //点击登录
-                loginElement.click();
-                Thread.sleep(3000L);
-                webDriver.get("https://pangolin.bytedance.com");
-                list = webDriver.findElements(By.xpath("//input[@id='captcha']"));
-            }while (list != null && list.size() > 0);
-
-
-
+            QueryWrapper<BindAccountLogin> queryWrapper = new QueryWrapper<>();
+            queryWrapper.eq("account_name",username);
+            queryWrapper.eq("login_type","pangolin");
+            BindAccountLogin bindAccountLogin = bindAccountLoginService.getOne(queryWrapper);
+            if(null != code && code == 0 && null != list && !list.isEmpty()){
+                //表示验证码正确,登录不成功
+                bindAccountLogin.setStatus("2");
+                bindAccountLoginService.updateById(bindAccountLogin);
+                return ;
+            }
             Set<Cookie> cookies = webDriver.manage().getCookies();
             List<String> cookieList = new ArrayList<>();
             Iterator iterator = cookies.iterator();
@@ -92,11 +97,6 @@ public class PangolinLoginServiceImpl implements PangolinLoginService {
                 clientCookie.setPath(cookieMap.get("path"));
                 HttpUtils2.cookieStore.addCookie(clientCookie);
             }
-
-            QueryWrapper<BindAccountLogin> queryWrapper = new QueryWrapper<>();
-            queryWrapper.eq("account_name",username);
-            queryWrapper.eq("login_type","pangolin");
-            BindAccountLogin bindAccountLogin = bindAccountLoginService.getOne(queryWrapper);
             if (bindAccountLogin != null){
                 bindAccountLogin.setCookie(new Gson().toJson(cookieList));
                 bindAccountLoginService.updateById(bindAccountLogin);

+ 15 - 1
module-crawler/src/main/java/cn/com/ctop/crawler/modules/pangolin/service/impl/PangolinReportAppHourServiceImpl.java

@@ -63,6 +63,20 @@ public class PangolinReportAppHourServiceImpl extends ServiceImpl<PangolinReport
     }
 
     private JSONObject getComparedDate(Integer appId,Integer hour,String userId,String type,String today, String yesterday, String sevenDaysAgo, String compareTime1, String compareTime2,List<Long>projectIds,List<String>  accountNames) {
-        return pangolinReportAppHourMapper.getComparedDate(appId,hour,userId,type,today, yesterday,sevenDaysAgo,compareTime1,compareTime2,projectIds,accountNames);
+        JSONObject data = pangolinReportAppHourMapper.getComparedDate(appId,hour,userId,type,today, yesterday,sevenDaysAgo,compareTime1,compareTime2,projectIds,accountNames);
+        if(null==data||data.toJSONString().equals("null")){
+            data = new JSONObject();
+            data.put("today",0);
+            data.put("yesterday",0);
+            data.put("sevendaysAgo",0);
+            data.put("hour",hour);
+            if(null!=compareTime1&&!compareTime1.trim().equals("")){
+                data.put(compareTime1,0);
+            }
+            if(null!=compareTime2&&!compareTime2.trim().equals("")){
+                data.put(compareTime2,0);
+            }
+        }
+        return data;
     }
 }

+ 3 - 3
module-ctop/src/main/java/cn/com/ctop/manage/modules/material/service/impl/MaterialUploadServiceImpl.java

@@ -1,4 +1,4 @@
-package cn.com.ctop.manage.modules.edu.service.impl;
+package cn.com.ctop.manage.modules.material.service.impl;
 
 import cn.com.ctop.common.module.entity.CtopOauthToken;
 import cn.com.ctop.common.module.entity.MaterialInfo;
@@ -110,8 +110,8 @@ public class MaterialUploadServiceImpl implements IMaterialUploadService {
                         continue;
                     }
                     touTiaoExecutorService.submit(new Runnable() {
-                        @Override
-                        public void run() {
+                                @Override
+                                public void run() {
                             try {
                                 log.info("头条文件多线程上传:{},accountId:{}", Thread.currentThread().getName(), accountId);
                                 if ("VIDEO".equals(materialInfo.getType())) {

+ 4 - 0
module-job-bytedance/src/main/java/cn/com/ctop/job/bytedance/handler/ByteDanceVideoReportJob.java

@@ -22,6 +22,10 @@ public class ByteDanceVideoReportJob {
 
     @XxlJob("byteDanceVideoReport")
     public ReturnT<String> execute(String param) throws Exception {
+        String getDate2 = DateUtils.formatDate(DateUtils.addDay(new Date(), -2));
+        XxlJobLogger.log("头条视频报表清洗数据定时任务开始, 执行时间为:" + getDate2);
+        byteDanceVideoReportDailyService.videoInfoList(getDate2, getDate2);
+
         String getDate = DateUtils.formatDate(DateUtils.addDay(new Date(), -1));
         XxlJobLogger.log("头条视频报表清洗数据定时任务开始, 执行时间为:" + getDate);
         byteDanceVideoReportDailyService.videoInfoList(getDate, getDate);

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

@@ -31,6 +31,7 @@ public class KuaishouDailyAccountReportLoadJob {
     @XxlJob("kuaishouDailyAccountReport")
     public ReturnT<String> execute(String param) throws Exception {
         Date getDate = DateUtils.addDay(new Date(), -1);
+        Date getDate2 = DateUtils.addDay(new Date(), -2);
         //1:查询当日数据
         List<CtopOauthToken> tokens = tokenService.selectKuaiShouToken();
         if (null == tokens || tokens.size() <= 0) {
@@ -39,7 +40,13 @@ public class KuaishouDailyAccountReportLoadJob {
         }
 
         executorService = Executors.newFixedThreadPool(3);
-        tokens.forEach(token -> executorService.submit(() -> kuaishouInterfaceService.getAdvertiserReportDaily(token, getDate, getDate)));
+        tokens.forEach(token ->
+                executorService.submit(() ->{
+                    kuaishouInterfaceService.getAdvertiserReportDaily(token, getDate2, getDate2);
+                    kuaishouInterfaceService.getAdvertiserReportDaily(token, getDate, getDate);
+                }
+                )
+        );
         return ReturnT.SUCCESS;
     }
 }

+ 3 - 3
module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/app/service/IKuaishouAppService.java

@@ -5,7 +5,7 @@ import cn.com.ctop.crawler.modules.account.entity.KuaishouAppAccount;
 import cn.com.ctop.crawler.modules.account.entity.KuaishouIosAccount;
 
 public interface IKuaishouAppService {
-    public void adFetch(KuaishouAppAccount kuaishouAppAccount,Integer page);
-    public void adFetch(KuaishouIosAccount kuaishouIosAccount);
-    public void adAccountFetch(KuaishouAdAccount kuaishouAdAccount,String pcursor);
+     void adFetch(KuaishouAppAccount kuaishouAppAccount,Integer page);
+     void adFetch(KuaishouIosAccount kuaishouIosAccount);
+     void adAccountFetch(KuaishouAdAccount kuaishouAdAccount,String pcursor);
 }

+ 55 - 5
module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/batch/controller/BatchController.java

@@ -9,6 +9,7 @@ import cn.com.ctop.common.module.utils.BigDecimalUtil;
 import cn.com.ctop.common.module.utils.Check;
 import cn.com.ctop.common.module.utils.RandomUtil;
 import cn.com.ctop.kuaishou.modules.batch.entity.*;
+import cn.com.ctop.kuaishou.modules.batch.entity.vo.ConvertVo;
 import cn.com.ctop.kuaishou.modules.batch.entity.vo.SpendVo;
 import cn.com.ctop.kuaishou.modules.batch.mapper.KuaiShouCampaignMapper;
 import cn.com.ctop.kuaishou.modules.batch.mapper.KuaiShouGroupMapper;
@@ -113,16 +114,38 @@ public class BatchController {
             spendVo.setBudget(budget);
             result.setSuccess(true);
             result.setResult(spendVo);
-
             Thread thread = new Thread() {
                 @Override
                 public void run() {
                     iKuaishouInterfaceService.getAppList(oauthToken.getAccountId(), oauthToken.getAccessToken());
+                }
+            };
+            thread.start();
+
+            Thread thread1 = new Thread() {
+                @Override
+                public void run() {
                     iKuaishouInterfaceService.getPopulationList(accountId, oauthToken.getAccessToken());
+                }
+            };
+            thread1.start();
+
+            Thread thread2 = new Thread() {
+                @Override
+                public void run() {
                     iKuaishouInterfaceService.getVideoList(oauthToken, null, null);
                 }
             };
-            thread.start();
+            thread2.start();
+
+            Thread thread3 = new Thread() {
+                @Override
+                public void run() {
+                    iKuaishouInterfaceService.getSuZaoList(oauthToken.getAccessToken(), oauthToken.getAccountId(), 1);
+                    videoGetService.getKeyFrame(oauthToken);
+                }
+            };
+            thread3.start();
 
         } catch (Exception e) {
             e.printStackTrace();
@@ -1037,12 +1060,15 @@ public class BatchController {
      */
     @GetMapping(value = "/getVideoList")
     public Result<IPage<KuaiShouVideoGet>> getVideoList(KuaiShouVideoGet kuaiShouVideoGet, @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
-                                                        @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize, HttpServletRequest req) {
-        Result<IPage<KuaiShouVideoGet>> result = new Result<IPage<KuaiShouVideoGet>>();
+                                                        @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
+                                                        @RequestParam(name = "startDate", defaultValue = "2010-01-01") String startDate,
+                                                        @RequestParam(name = "endDate", defaultValue = "2100-01-01") String endDate,HttpServletRequest req) {
+        Result<IPage<KuaiShouVideoGet>> result = new Result<>();
         try {
             QueryWrapper<KuaiShouVideoGet> queryWrapper = QueryGenerator.initQueryWrapper(kuaiShouVideoGet, req.getParameterMap());
+            queryWrapper.between("create_time",startDate,endDate);
             queryWrapper.orderByDesc("create_time");
-            Page<KuaiShouVideoGet> page = new Page<KuaiShouVideoGet>(pageNo, pageSize);
+            Page<KuaiShouVideoGet> page = new Page<>(pageNo, pageSize);
             IPage<KuaiShouVideoGet> pageList = kuaiShouVideoGetService.page(page, queryWrapper);
             result.setSuccess(true);
             result.setResult(pageList);
@@ -1811,4 +1837,28 @@ public class BatchController {
     }
 
 
+    @GetMapping(value = "/getConvertList")
+    public Result<List<ConvertVo>> getConvertList(Long accountId, Integer type) {
+        Result result = new Result<>();
+        try {
+            if (Check.isNull(accountId) || Check.isNull(type)) {
+                throw new Exception("必填参数不能为空");
+            }
+            CtopOauthToken oauthToken = oauthTokenService.getTokenByAccountId(accountId);
+            if (Check.isNull(oauthToken)) {
+                throw new Exception("未获取到账户信息");
+            }
+
+            List<ConvertVo> convertList = iKuaishouInterfaceService.getConvertList(accountId, oauthToken.getAccessToken(), type);
+            result.setResult(convertList);
+            result.setSuccess(true);
+        } catch (Exception e) {
+            e.printStackTrace();
+            result.setSuccess(false);
+            result.setMessage(e.getMessage());
+        }
+        return result;
+    }
+
+
 }

+ 1 - 0
module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/batch/entity/KuaiShouGroup.java

@@ -159,6 +159,7 @@ public class KuaiShouGroup {
 
 
     private Long convertId; // 转化目标
+    private Integer useAppMarket; // 转化目标
     private String groupCreateTime;
     private String groupUpdateTime;
 

+ 36 - 0
module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/batch/entity/vo/ConvertVo.java

@@ -0,0 +1,36 @@
+package cn.com.ctop.kuaishou.modules.batch.entity.vo;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.sql.Date;
+
+@Data
+public class ConvertVo implements Serializable {
+    @JsonProperty("app_name")
+    private String appName;
+    @JsonProperty("convert_target")
+    private Integer convertTarget;
+    @JsonProperty("convert_name")
+    private String convertName;
+    @JsonProperty("deep_conversion_count")
+    private Long deepConversionCount;
+    @JsonProperty("deep_conversion_type")
+    private Integer deepConversionType;
+    @JsonProperty("type")
+    private Integer type;
+    @JsonProperty("app_id")
+    private Long appId;
+    @JsonProperty("convert_id")
+    private Long convertId;
+    @JsonProperty("convert_count")
+    private Long convertCount;
+    @JsonProperty("click_url")
+    private String clickUrl;
+    @JsonProperty("create_time")
+    private String createTime;
+    @JsonProperty("update_time")
+    private String updateTime;
+
+}

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

@@ -17,4 +17,6 @@ public interface KuaiShouImageGetMapper extends BaseMapper<KuaiShouImageGet> {
     void replaceBatch(@Param(value = "images") List<KuaiShouImageGet> imagesGets);
 
     String getUrlByCode(String signature);
+
+    String getCutFrameUrlByCode(String signature);
 }

+ 2 - 0
module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/batch/mapper/xml/KuaiShouGroupMapper.xml

@@ -31,6 +31,7 @@
         app_id,
         app_icon_url,
         convert_id,
+        use_app_market,
         group_create_time,
         group_update_time,
         create_time,
@@ -66,6 +67,7 @@
             #{getGroup.appId},
             #{getGroup.appIconUrl},
             #{getGroup.convertId},
+            #{getGroup.useAppMarket},
             #{getGroup.groupCreateTime},
             #{getGroup.groupUpdateTime},
             #{getGroup.createTime},

+ 6 - 0
module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/batch/mapper/xml/KuaiShouImageGetMapper.xml

@@ -40,7 +40,13 @@
         select url from ctop_material_image_info
         where  code = #{signature}
         limit 1
+    </select>
 
+    <select id="getCutFrameUrlByCode" resultType="java.lang.String">
+        select url from ctop_material_cut_frame
+        where  signature = #{signature}
+        limit 1
     </select>
 
+
 </mapper>

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

@@ -1,5 +1,6 @@
 package cn.com.ctop.kuaishou.modules.batch.service;
 
+import cn.com.ctop.common.module.entity.CtopOauthToken;
 import cn.com.ctop.kuaishou.modules.batch.entity.KuaiShouImageGet;
 import cn.com.ctop.kuaishou.modules.batch.entity.KuaiShouVideoGet;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
@@ -16,4 +17,5 @@ import java.util.List;
 public interface IKuaiShouVideoGetService extends IService<KuaiShouVideoGet> {
     void replaceBatch(List<KuaiShouVideoGet> videoGets);
 
+    void getKeyFrame(CtopOauthToken token);
 }

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

@@ -2,6 +2,7 @@ package cn.com.ctop.kuaishou.modules.batch.service;
 
 
 import cn.com.ctop.common.module.entity.CtopOauthToken;
+import cn.com.ctop.kuaishou.modules.batch.entity.vo.ConvertVo;
 import cn.com.ctop.kuaishou.modules.material.entity.KuaishouResult;
 import cn.com.ctop.kuaishou.modules.material.entity.KuaishouResultToken;
 import cn.com.ctop.kuaishou.modules.report.entity.*;
@@ -10,6 +11,7 @@ import com.alibaba.fastjson.JSONObject;
 
 import java.text.ParseException;
 import java.util.Date;
+import java.util.List;
 import java.util.Map;
 
 /**
@@ -480,6 +482,18 @@ public interface IKuaishouInterfaceService {
      */
 
     void getAsyncCreativeList(Long accountId, String accessToken, Long campaignId);
+
+
+    /**
+     * 获取转化目标
+     *
+     * @param accountId
+     * @param accessToken
+     * @param type
+     * @return
+     */
+    List<ConvertVo> getConvertList(Long accountId, String accessToken, Integer type);
+
 }
 
 

+ 32 - 20
module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/batch/service/impl/BatchServiceImpl.java

@@ -58,6 +58,18 @@ public class BatchServiceImpl implements IBatchService {
     private KuaiShouGroupMapper groupMapper;
     @Autowired
     private KuaiShouCreativeMapper creativeMapper;
+    @Autowired
+    private KuaiShouGroupMapper kuaiShouGroupMapper;
+    @Autowired
+    private KuaiShouGroupTargetMapper targetMapper;
+    @Autowired
+    private ICtopOauthTokenService oauthTokenService;
+    @Autowired
+    private IKuaishouInterfaceService kuaishouInterfaceService;
+    @Autowired
+    private IKuaiShouImageGetService imageGetService;
+    @Autowired
+    private RestTemplate rest;
 
 
     /**
@@ -133,8 +145,7 @@ public class BatchServiceImpl implements IBatchService {
      * @param unitName
      * @return
      */
-    @Autowired
-    private KuaiShouGroupMapper kuaiShouGroupMapper;
+
 
     @Override
     public Boolean checkUnitName(Long campaignId, String unitName) {
@@ -157,11 +168,6 @@ public class BatchServiceImpl implements IBatchService {
      * @param requestJson
      * @return
      */
-    @Autowired
-    private ICtopOauthTokenService oauthTokenService;
-    @Autowired
-    private IKuaishouInterfaceService kuaishouInterfaceService;
-
     @Override
     public JSONObject createUnit(JSONObject requestJson) throws Exception {
         Long accountId = requestJson.getLong("accountId");
@@ -197,6 +203,16 @@ public class BatchServiceImpl implements IBatchService {
             unitJson.put("unit_type", requestJson.getInteger("unitType"));
         }
 
+        // 转化目标id
+        if (!Check.isNull(requestJson.getInteger("convertId"))) {
+            unitJson.put("convert_id", requestJson.getInteger("convertId"));
+        }
+
+        // 优先从系统应用商店下载
+        if (!Check.isNull(requestJson.getInteger("useAppMarket"))) {
+            unitJson.put("use_app_market", requestJson.getInteger("useAppMarket"));
+        }
+
         //投放开始时间
         if (!Check.isNull(requestJson.getString("beginTime"))) {
             String nowDate = DateUtils.getNowDate("yyyy-MM-dd");
@@ -447,9 +463,6 @@ public class BatchServiceImpl implements IBatchService {
      * @throws Exception
      */
 
-    @Autowired
-    private KuaiShouGroupTargetMapper targetMapper;
-
 
     @Override
     public JSONObject copyUnit(KuaiShouGroup group, Long copyToCampaignId) {
@@ -489,6 +502,15 @@ public class BatchServiceImpl implements IBatchService {
                     }
 
                 }
+
+                // 优先从系统应用商店下载
+                if (!Check.isNull(group.getUseAppMarket())) {
+                    unitJson.put("use_app_market", group.getUseAppMarket());
+                }
+                // 转化目标id
+                if (!Check.isNull(group.getConvertId())) {
+                    unitJson.put("convert_id", group.getConvertId());
+                }
                 // 投放结束时间
                 if (!Check.isNull(group.getEndTime())) {
                     unitJson.put("end_time", group.getEndTime());
@@ -807,10 +829,6 @@ public class BatchServiceImpl implements IBatchService {
      * @param requestJson
      * @return
      */
-    @Autowired
-    private IKuaiShouImageGetService imageGetService;
-
-
     @Override
     public JSONObject createCreative(JSONObject requestJson) throws Exception {
         if (Check.isNull(requestJson)) {
@@ -1167,9 +1185,6 @@ public class BatchServiceImpl implements IBatchService {
      * @param requestJson
      * @return
      */
-    @Autowired
-    private IKuaiShouImageGetService iKuaiShouImageGetService;
-
     @Override
     public JSONObject updateCreative(JSONObject requestJson) throws Exception {
         if (Check.isNull(requestJson)) {
@@ -1249,9 +1264,6 @@ public class BatchServiceImpl implements IBatchService {
     }
 
 
-    @Autowired
-    private RestTemplate rest;
-
     private String exceptInfoForRestTemplate(String url, Map<String, Object> paramMap, Map<String, String> headerMap) throws ParseException {
         try {
             MultiValueMap<String, Object> param = new LinkedMultiValueMap<>();

+ 9 - 3
module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/batch/service/impl/KuaiShouImageGetServiceImpl.java

@@ -1,9 +1,8 @@
 package cn.com.ctop.kuaishou.modules.batch.service.impl;
 
+import cn.com.ctop.common.module.utils.Check;
 import cn.com.ctop.kuaishou.modules.batch.entity.KuaiShouImageGet;
-import cn.com.ctop.kuaishou.modules.batch.entity.KuaiShouVideoGet;
 import cn.com.ctop.kuaishou.modules.batch.mapper.KuaiShouImageGetMapper;
-import cn.com.ctop.kuaishou.modules.batch.mapper.KuaiShouVideoGetMapper;
 import cn.com.ctop.kuaishou.modules.batch.service.IKuaiShouImageGetService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -29,7 +28,14 @@ public class KuaiShouImageGetServiceImpl extends ServiceImpl<KuaiShouImageGetMap
 
     @Override
     public String getUrlByCode(String signature) {
-        return imageGetMapper.getUrlByCode(signature);
+        String url = imageGetMapper.getUrlByCode(signature);
+        if (!Check.isNull(url)) {
+            return url;
+        } else {
+            return imageGetMapper.getCutFrameUrlByCode(signature);
+        }
+
+
     }
 
 }

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

@@ -1,17 +1,33 @@
 package cn.com.ctop.kuaishou.modules.batch.service.impl;
 
+import cn.com.ctop.common.module.entity.CtopOauthToken;
+import cn.com.ctop.common.module.entity.MaterialCutFrame;
+import cn.com.ctop.common.module.service.IMaterialCutFrameService;
+import cn.com.ctop.common.module.utils.Check;
+import cn.com.ctop.common.module.utils.HttpUtils;
+import cn.com.ctop.common.module.utils.LoadFileUtil;
 import cn.com.ctop.kuaishou.modules.batch.entity.KuaiShouVideoGet;
 import cn.com.ctop.kuaishou.modules.batch.mapper.KuaiShouVideoGetMapper;
 import cn.com.ctop.kuaishou.modules.batch.service.IKuaiShouVideoGetService;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 
+import java.io.IOException;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
 
 /**
  * @Description: 快手-获取视频接口
  * @Author: jeecg-boot
+ *
  * @Date: 2019-07-25
  * @Version: V1.0
  */
@@ -19,9 +35,101 @@ import java.util.List;
 public class KuaiShouVideoGetServiceImpl extends ServiceImpl<KuaiShouVideoGetMapper, KuaiShouVideoGet> implements IKuaiShouVideoGetService {
     @Autowired
     private KuaiShouVideoGetMapper videoGetMapper;
+    @Autowired
+    private IMaterialCutFrameService materialCutFrameService;
+    static ExecutorService executorService = Executors.newFixedThreadPool(15);
+
+
+    @Value("${oss.replace.download}")
+    private String downloadUrl;
 
     @Override
     public void replaceBatch(List<KuaiShouVideoGet> videoGets) {
         videoGetMapper.replaceBatch(videoGets);
     }
+
+    /**
+     * 获取关键帧
+     *
+     *
+     * @param
+     */
+    @Override
+    public void getKeyFrame(CtopOauthToken token) {
+        try {
+            QueryWrapper<KuaiShouVideoGet> videoGetQueryWrapper = new QueryWrapper<>();
+            videoGetQueryWrapper.eq("account_id", token.getAccountId());
+            videoGetQueryWrapper.eq("channel_type", 1);
+            List<KuaiShouVideoGet> kuaiShouVideoGets = videoGetMapper.selectList(videoGetQueryWrapper);
+            if (Check.isNull(kuaiShouVideoGets)) {
+                return;
+            }
+            for (KuaiShouVideoGet videoGet : kuaiShouVideoGets) {
+                synchronized (this) {
+                    if (!Check.isNull(videoGet.getSignature())) {
+                        QueryWrapper<MaterialCutFrame> cutFrameQueryWrapper = new QueryWrapper<>();
+                        cutFrameQueryWrapper.eq("video_signature", videoGet.getSignature());
+                        cutFrameQueryWrapper.last("limit 1");
+                        MaterialCutFrame one = materialCutFrameService.getOne(cutFrameQueryWrapper);
+                        if (!Check.isNull(one)) {
+                            continue;
+                        }
+                    }
+
+                    executorService.submit(new Runnable() {
+                        @Override
+                        public void run() {
+                            String url = "https://ad.e.kuaishou.com/rest/openapi/v1/tool/key_frame";
+                            JSONArray photoArr = new JSONArray();
+                            photoArr.add(videoGet.getPhotoId());
+                            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("photo_ids", photoArr);
+                            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) {
+                                    JSONArray dataArr = resultJson.getJSONArray("data");
+                                    if (!Check.isNull(dataArr)) {
+                                        for (int i = 0; i < dataArr.size(); i++) {
+                                            String imageUrl = dataArr.getString(i);
+                                            String localPath = LoadFileUtil.downLoadFromUrl(imageUrl, downloadUrl);
+                                            String md5 = null;
+                                            try {
+                                                md5 = LoadFileUtil.getMD5(localPath);
+                                            } catch (IOException e) {
+                                                e.printStackTrace();
+                                                continue;
+                                            }
+                                            Map<String, Object> deleteMap = new HashMap<>();
+                                            deleteMap.put("video_signature", videoGet.getSignature());
+                                            deleteMap.put("signature", md5);
+                                            materialCutFrameService.removeByMap(deleteMap);
+
+                                            MaterialCutFrame materialCutFrame = new MaterialCutFrame();
+                                            materialCutFrame.setImageIndex(i);
+                                            materialCutFrame.setVideoSignature(videoGet.getSignature());
+                                            materialCutFrame.setUrl(imageUrl);
+                                            materialCutFrame.setSignature(md5);
+                                            materialCutFrameService.save(materialCutFrame);
+                                            LoadFileUtil.delFile(localPath);
+                                        }
+                                    }
+                                }
+                            }
+                        }
+                    });
+                }
+
+            }
+
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+    }
 }

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

@@ -8,6 +8,7 @@ import cn.com.ctop.common.module.mapper.MaterialInfoMapper;
 import cn.com.ctop.common.module.service.IUserAllocationService;
 import cn.com.ctop.common.module.utils.*;
 import cn.com.ctop.kuaishou.modules.batch.entity.*;
+import cn.com.ctop.kuaishou.modules.batch.entity.vo.ConvertVo;
 import cn.com.ctop.kuaishou.modules.batch.mapper.*;
 import cn.com.ctop.kuaishou.modules.batch.service.*;
 import cn.com.ctop.kuaishou.modules.material.entity.KuaishouResult;
@@ -16,7 +17,6 @@ import cn.com.ctop.kuaishou.modules.report.entity.*;
 import cn.com.ctop.kuaishou.modules.report.mapper.KuaishouReportDailyAccountMapper;
 import cn.com.ctop.kuaishou.modules.report.mapper.KuaishouReportDailyCampaignMapper;
 import cn.com.ctop.kuaishou.modules.report.service.*;
-import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
@@ -291,6 +291,8 @@ public class KuaishouInterfaceServiceImpl implements IKuaishouInterfaceService {
                 detailJson.remove("show");
                 detailJson.remove("adScene");
                 detailJson.remove("stat_hour");
+                detailJson.remove("event_valid_clues");
+                detailJson.remove("event_valid_clues_cost");
                 KuaishouReportDailyAccount kuaishouReportDailyAccount = JsonUtil.jsonToObj(detailJson, KuaishouReportDailyAccount.class);
                 kuaishouReportDailyAccount.setAccountId(token.getAccountId());
                 dailyAccountMapper.insertSelective(kuaishouReportDailyAccount);
@@ -1178,7 +1180,6 @@ public class KuaishouInterfaceServiceImpl implements IKuaishouInterfaceService {
         }
         JSONArray details = resultJson.getJSONObject("data").getJSONArray("details");
         if (Check.isNull(details)) {
-
             return;
         }
         addGroup(token.getAccountId(), details);
@@ -1281,6 +1282,7 @@ public class KuaishouInterfaceServiceImpl implements IKuaishouInterfaceService {
                     group.setGroupCreateTime(detail.getString("create_time"));
                     group.setGroupUpdateTime(detail.getString("update_time"));
                     group.setConvertId(detail.getLong("convert_id"));
+                    group.setUseAppMarket(detail.getInteger("use_app_market"));
                     group.setCreateTime(new Date());
                     group.setUpdateTime(new Date());
                     groups.add(group);
@@ -3011,6 +3013,10 @@ public class KuaishouInterfaceServiceImpl implements IKuaishouInterfaceService {
         }
         JSONObject dataJson = resultJson.getJSONObject("data");
         if (!Check.isNull(dataJson)) {
+            Integer total_count = dataJson.getInteger("total_count");
+            if (total_count > 2000) {
+                return;
+            }
             JSONArray details = dataJson.getJSONArray("details");
             if (Check.isNull(details)) {
                 return;
@@ -3163,5 +3169,46 @@ public class KuaishouInterfaceServiceImpl implements IKuaishouInterfaceService {
 
     }
 
+    /**
+     * 获取转化目标
+     *
+     * @param accountId
+     * @param accessToken
+     * @param type
+     * @return
+     */
+    @Override
+    public List<ConvertVo> getConvertList(Long accountId, String accessToken, Integer type) {
+        List<ConvertVo> convertVoList = new ArrayList<>();
+        try {
+            log.info("获取转化目标:accountId:{}", accountId);
+            String url = PropertiesUtils.getConfig("kuaishou_api_url") + KuaishouInterfaceConstant.CONVERT_LIST;
+            Map<String, String> headers = new HashMap<>();
+            headers.put("Access-Token", accessToken);
+            headers.put("Content-Type", "application/json");
+            JSONObject requestJson = new JSONObject();
+            requestJson.put("advertiser_id", accountId);
+            requestJson.put("type", type);
+            String result = HttpUtils.kuaiShouhttpPostRequest(url, requestJson.toJSONString(), headers);
+            JSONObject resultJson = JSONObject.parseObject(result);
+            Integer code = resultJson.getInteger("code");
+            if (code == 0) {
+                JSONObject data = resultJson.getJSONObject("data");
+                if (!Check.isNull(data)) {
+                    JSONArray details = data.getJSONArray("details");
+                    if (!Check.isNull(details)) {
+                        for (int i = 0; i < details.size(); i++) {
+                            ConvertVo convertVo = JsonUtil.jsonToObj(details.getJSONObject(i), ConvertVo.class);
+                            convertVoList.add(convertVo);
+                        }
+                    }
+                }
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+        return convertVoList;
+    }
 
 }

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

@@ -485,7 +485,9 @@
         event_next_day_stay_cost,
         event_next_day_stay_ratio,
         event_next_day_stay,
-        play_3s_ratio
+        play_3s_ratio,
+        @event_valid_clues,
+        @event_valid_clues_cost
         )
           set account_id = #{accountId}
     </insert>

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

@@ -64,7 +64,9 @@
         event_next_day_stay_cost,
         event_next_day_stay_ratio,
         event_next_day_stay,
-        play_3s_ratio
+        play_3s_ratio,
+        @event_valid_clues,
+        @event_valid_clues_cost
         )
           set account_id = #{accountId}
     </insert>

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

@@ -69,7 +69,9 @@
         event_next_day_stay_cost,
         event_next_day_stay_ratio,
         event_next_day_stay,
-        play_3s_ratio
+        play_3s_ratio,
+        @event_valid_clues,
+        @event_valid_clues_cost
         )
           set account_id = #{accountId}
     </insert>

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

@@ -66,7 +66,9 @@
         event_next_day_stay_cost,
         event_next_day_stay_ratio,
         event_next_day_stay,
-        play_3s_ratio
+        play_3s_ratio,
+        @event_valid_clues,
+        @event_valid_clues_cost
         )
           set account_id = #{accountId}
     </insert>

+ 19 - 0
module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/report/DTO/AccountReportDTO.java

@@ -0,0 +1,19 @@
+package cn.com.ctop.toutiao.modules.report.DTO;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.List;
+
+
+@Data
+public class AccountReportDTO implements Serializable {
+    private String startDate;
+    private String endDate;
+    private BigDecimal discount;  //仅头条内广可用 折扣
+    private BigDecimal point;  //仅头条可用 返点
+    private List<Long> accountIds;
+    private Integer statHour;
+    private Integer type;
+}

+ 40 - 3
module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/report/controller/ByteDanceVideoReportDailyController.java

@@ -56,15 +56,15 @@ public class ByteDanceVideoReportDailyController {
 			 dateList.add(endStr);
 		 }
 
-
 		 final ExecutorService executorService = Executors.newFixedThreadPool(8);
 		 dateList.forEach(date -> {
 			 executorService.submit(new Runnable() {
 				 @Override
 				 public void run() {
 					 try {
-						 System.out.println("头条视频按天汇总接口现在在跑的时间为:" + date + "~" + date);
+						 log.info("头条视频按天汇总接口现在在跑的时间为:" + date + "~" + date);
 						 videoReportDailyService.videoInfoList(date, date);
+						 log.info("头条视频按天汇总接口运行结束,时间为" + date + "~" + date);
 					 } catch (Exception e) {
 						 e.printStackTrace();
 					 } finally {
@@ -77,6 +77,42 @@ public class ByteDanceVideoReportDailyController {
 		 return result;
 	 }
 
+	@AutoLog(value = "头条视频单个账户按天汇总")
+	@ApiOperation(value = "头条视频单个账户按天汇总", notes = "头条视频单个账户按天汇总")
+	@GetMapping(value = "/videoInfoListByAccountId")
+	public Result videoInfoListByAccountId(@RequestParam(name = "startDate") String startDate,
+										 @RequestParam(name = "endDate") String endDate,
+										   @RequestParam(name = "accountId") Long accountId,
+										 HttpServletRequest req){
+		Result result = new Result();
+		int days = DateUtils.dateDiff(startDate, endDate);
+		List<String> dateList = new ArrayList<>();
+		for(int i=0; i<=days; i++){
+			String endStr = DateUtils.addDay(startDate ,i);
+			dateList.add(endStr);
+			System.out.println(endStr);
+		}
+
+		final ExecutorService executorService = Executors.newFixedThreadPool(8);
+		dateList.forEach(date -> {
+			executorService.submit(new Runnable() {
+				@Override
+				public void run() {
+					try {
+						System.out.println("头条视频按天汇总接口现在在跑的时间为:" + date + "~" + date);
+						videoReportDailyService.videoInfoListByAccountId(date, date,accountId);
+					} catch (Exception e) {
+						e.printStackTrace();
+					} finally {
+					}
+				}
+			});
+		});
+
+		result.setSuccess(true);
+		return result;
+	}
+
 	@AutoLog(value = "头条视频账户视频关联方法")
 	@ApiOperation(value = "头条视频账户视频关联方法", notes = "头条视频账户视频关联方法")
 	@PostMapping(value = "/accountVideoMap")
@@ -239,6 +275,7 @@ public class ByteDanceVideoReportDailyController {
 			 for (ByteDanceVideoReportDaily sum : list) {
 				 List<Object> ByteDanceVideoReportDaily = new ArrayList();
 				 ByteDanceVideoReportDaily.add(sum.getAdvertiserName());  //客户
+				 ByteDanceVideoReportDaily.add(sum.getProjectName());  //项目名称
 				 ByteDanceVideoReportDaily.add(sum.getVideoUrl() );  //视频链接
 				 ByteDanceVideoReportDaily.add(DateUtils.formatDate(sum.getStatDatetime()));  //时间
 				 ByteDanceVideoReportDaily.add(sum.getCost());  //消耗
@@ -247,7 +284,7 @@ public class ByteDanceVideoReportDailyController {
 			 }
 		 }
 
-		 String[] groupHeaders = {"客户","视频链接", "时间", "消耗","环比"};
+		 String[] groupHeaders = {"客户","项目名称","视频链接", "时间", "消耗","环比"};
 		 OutputStream os = response.getOutputStream();
 		 ExportExcelUtils eeu = new ExportExcelUtils();
 		 XSSFWorkbook workbook = new XSSFWorkbook();

+ 34 - 0
module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/report/controller/BytedanceAdvertiserDailyReportController.java

@@ -1,6 +1,7 @@
 package cn.com.ctop.toutiao.modules.report.controller;
 
 import cn.com.ctop.common.module.utils.StringUtils;
+import cn.com.ctop.toutiao.modules.report.DTO.AccountReportDTO;
 import cn.com.ctop.toutiao.modules.report.entity.BytedanceAdvertiserDailyReport;
 import cn.com.ctop.toutiao.modules.report.service.IBytedanceAdvertiserDailyReportService;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
@@ -163,4 +164,37 @@ public class BytedanceAdvertiserDailyReportController {
         }
         return result;
     }
+
+
+
+
+
+
+
+
+
+    @AutoLog(value = "头条账户报表统计-指标统计")
+    @ApiOperation(value = "头条账户报表统计-指标统计", notes = "头条账户报表统计-指标统计")
+    @GetMapping(value = "/bytedanceAccountReportStatistics")
+    public Result bytedanceAccountReportStatistics(@RequestBody AccountReportDTO accountReportDTO) {
+        Result<BytedanceAdvertiserDailyReport> result = new Result<>();
+        result.setSuccess(true);
+        //判断必填字段
+
+
+        return result;
+    }
+
+
+    @AutoLog(value = "头条账户报表统计-账户列表及汇总")
+    @ApiOperation(value = "头条账户报表统计-账户列表及汇总", notes = "头条账户报表统计-账户列表及汇总")
+    @GetMapping(value = "/bytedanceAccountReportListAndCollect")
+    public Result bytedanceAccountReportListAndCollect(@RequestBody AccountReportDTO accountReportDTO) {
+        Result<BytedanceAdvertiserDailyReport> result = new Result<>();
+        result.setSuccess(true);
+
+        return result;
+    }
+
+
 }

+ 20 - 6
module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/report/controller/BytedanceHomepageReportCtrl.java

@@ -25,10 +25,10 @@ public class BytedanceHomepageReportCtrl {
     IBytedanceHomepageReportService bytedanceHomepageReportService;
 
     @PostMapping("/report/week")
-    public Result<Map<String,JSONObject>> getWeekReport(@RequestBody JSONObject requestBody) {
-        Result<Map<String,JSONObject>> result = new Result<>();
+    public Result<Map<String,Object>> getWeekReport(@RequestBody JSONObject requestBody) {
+        Result<Map<String,Object>> result = new Result<>();
         try {
-            Map<String, JSONObject> weekReport = bytedanceHomepageReportService.getWeekReport(requestBody);
+            Map<String, Object> weekReport = bytedanceHomepageReportService.getWeekReport(requestBody);
             result.setResult(weekReport);
             result.setSuccess(true);
         } catch (Exception e) {
@@ -39,14 +39,14 @@ public class BytedanceHomepageReportCtrl {
     }
 
     @PostMapping("/report/chart")
-    public Result<List<JSONObject>> getChartReport(@RequestBody JSONObject requestBody) {
-        Result<List<JSONObject>> result = new Result<>();
+    public Result<Map<String,List<JSONObject>>> getChartReport(@RequestBody JSONObject requestBody) {
+        Result<Map<String,List<JSONObject>>> result = new Result<>();
         if(requestBody.isEmpty()){
             log.error("request body is empty");
             result.setSuccess(false);
         }
         try {
-            List<JSONObject> chartReport=bytedanceHomepageReportService.getChartByDate(requestBody);
+            Map<String,List<JSONObject>> chartReport=bytedanceHomepageReportService.getChartByDate(requestBody);
             result.setResult(chartReport);
             result.setSuccess(true);
         } catch (Exception e) {
@@ -55,6 +55,20 @@ public class BytedanceHomepageReportCtrl {
         }
 
         return result;
+    }
+    @PostMapping("/report/compare")
+    public Result<Map<String,JSONObject>> getCompareReport(@RequestBody JSONObject requestBody) {
+        Result<Map<String,JSONObject>> result = new Result<>();
+        try {
+            Map<String,JSONObject> chartReport=bytedanceHomepageReportService.getCompareByDate(requestBody);
+            result.setResult(chartReport);
+            result.setSuccess(true);
+        } catch (Exception e) {
+            log.error(e.getMessage(),e);
+            result.setSuccess(false);
+        }
 
+        return result;
     }
+
 }

+ 70 - 13
module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/report/controller/BytedanceReportController.java

@@ -3,6 +3,7 @@ package cn.com.ctop.toutiao.modules.report.controller;
 import cn.com.ctop.common.module.entity.CtopOauthToken;
 import cn.com.ctop.common.module.service.ICtopOauthTokenService;
 import cn.com.ctop.toutiao.modules.report.entity.BytedanceReportMaterialRetry;
+import cn.com.ctop.toutiao.modules.report.service.IByteDanceVideoReportDailyService;
 import cn.com.ctop.toutiao.modules.report.service.IBytedanceReportService;
 import com.alibaba.fastjson.JSONObject;
 import lombok.extern.slf4j.Slf4j;
@@ -12,6 +13,7 @@ import org.jeecg.common.util.DateUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
+import java.util.ArrayList;
 import java.util.List;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
@@ -24,6 +26,8 @@ public class BytedanceReportController {
     private IBytedanceReportService bytedanceReportService;
     @Autowired
     private ICtopOauthTokenService tokenService;
+    @Autowired
+    private IByteDanceVideoReportDailyService byteDanceVideoReportDailyService;
 
     @PostMapping("/kuaiShou/accountReport")
     public Result<JSONObject> getKuaiShouAccountReport(@RequestBody JSONObject requestJson) {
@@ -185,12 +189,29 @@ public class BytedanceReportController {
                     @Override
                     public void run() {
                         try {
-                            CtopOauthToken token = tokenService.getOauthTokenByAccountId(String.valueOf(retry.getAccountId()));
+                            String startDate = retry.getStartDate();
+                            String endDate = retry.getEndDate();
+                            Long accountId = retry.getAccountId();
+                            CtopOauthToken token = tokenService.getOauthTokenByAccountId(String.valueOf(accountId));
                             log.info("头条素材报表当前accountId为:" + token.getAccountId());
-                            bytedanceReportService.bytedanceMaterialReportRetry(token, retry.getStartDate(), retry.getEndDate());
+                            //int code = bytedanceReportService.bytedanceMaterialReportRetry(token, startDate, endDate);
+
+                            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;
+                                //获取头条素材报表数据
+                                int code = bytedanceReportService.bytedanceMaterialReportRetry(token, start, end);
+                                if(code ==200 || code == 1){
+                                    //重试成功清洗数据
+                                    byteDanceVideoReportDailyService.videoInfoListByAccountId(start,end,accountId);
+                                }
+                            }
+
                         } catch (Exception e) {
                             e.printStackTrace();
-                        } finally {
                         }
                     }
                 });
@@ -207,18 +228,54 @@ public class BytedanceReportController {
         return result;
     }
 
+    /**
+     * 绑定头条账户之后的操作,对此账户进行素材报表数据拉取以及素材报表数据清洗
+     * @param accountId
+     * @param startDate
+     * @param endDate
+     * @return
+     */
+    @GetMapping("/bytedance/bytedanceMaterialReportAndVideoReport")
+    public Result bytedanceMaterialReportAndVideoReport(@RequestParam(name = "accountId") Long accountId,
+                                          @RequestParam(name = "startDate") String startDate,
+                                          @RequestParam(name = "endDate") String endDate) {
+        Result result = new Result<>();
+        if (StringUtils.isBlank(startDate) || StringUtils.isBlank(endDate) || null == accountId){
+            result.error500("开始时间和结束时间、accountId均不能为空");
+            return result;
+        }
 
+        try {
+            log.info("头条获取素材报表数据任务执行开始");
+            Long starttime = System.currentTimeMillis();
+            CtopOauthToken token = tokenService.getAccessTokenByAccountIdAndMediaId(1,accountId);
+            if (null == token) {
+                log.info("头条获取素材报表数据任务执行失败:未获取到可用的token,accountId:" + accountId);
+                return result;
+            }
 
+            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;
+                //获取头条素材报表数据
+                int code = bytedanceReportService.bytedanceMaterialReport(token, start, end);
+                //如果成功的话跑视频清洗数据方法,失败会进入重试库,重试成功后再清洗数据
+                if(code ==200 || code == 1){
+                    byteDanceVideoReportDailyService.videoInfoListByAccountId(start,end,accountId);
+                }
+            }
 
-
-
-
-
-
-
-
-
-
-
+            Long endtime = System.currentTimeMillis();
+            log.info("头条获取素材报表数据任务执行结束,accountId:{},执行耗时:{}秒", accountId, (endtime - starttime) / 1000);
+        } catch (Exception e) {
+            log.error("头条获取素材报表数据任务执行结失败accountId:" + accountId);
+            e.printStackTrace();
+            result.setSuccess(false);
+        }
+        return result;
+    }
 
 }

+ 3 - 3
module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/report/mapper/ByteDanceVideoReportDailyMapper.java

@@ -17,7 +17,9 @@ import java.util.List;
  */
 public interface ByteDanceVideoReportDailyMapper extends BaseMapper<ByteDanceVideoReportDaily> {
 
-    List<ByteDanceVideoReportDaily> videoInfoList(@Param("startDate") String startDate, @Param("endDate") String endDate, @Param("companyId") String companyId);
+    List<ByteDanceVideoReportDaily> videoInfoList(@Param("startDate") String startDate, @Param("endDate") String endDate, @Param("companyId") String companyId, @Param("accountId")Long accountId);
+
+    String getCompanyIdByAccountId(@Param("accountId")Long accountId);
 
     BigDecimal getVideoReportDailyByDateAndSignature(@Param("startDate") String date, @Param("endDate") String endDate, @Param("signature") String signature, @Param("accountIds")List<Long> accountIds);
 
@@ -41,8 +43,6 @@ public interface ByteDanceVideoReportDailyMapper extends BaseMapper<ByteDanceVid
 
     List<ByteDanceVideoReportDaily> videoInfoListDetailOperator(@Param("companyId") String companyId, @Param("startDate") String startDate, @Param("endDate") String endDate, @Param("signature") String signature, @Param("accountIds") List<Long> accountIds);
 
-    //List<ByteDanceVideoReportDaily> bytedanceVideoInfoList(@Param("startDate") String startDate, @Param("endDate") String endDate, @Param("role") String role, @Param("userId") String userId, @Param("signature") String signature, @Param("companyId") String companyId, @Param("cost") BigDecimal cost);
-
     List<AccountVideoDTO> accountVideoMap();
 
     void replaceIntoAccountVideoMapBatch(@Param("accountVideoDTOList")List<AccountVideoDTO> accountVideoDTOList);

+ 7 - 4
module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/report/mapper/BytedanceHomepageMapper.java

@@ -13,22 +13,25 @@ public interface BytedanceHomepageMapper {
     //今日汇总数据
     JSONObject queryTodaySumReportBy(@Param("statDate") String statDate);
 
+    //根据小时区间查询今日汇总数据
+    List<JSONObject> queryTodaySumByHour(@Param("hour") int hour);
+
     //今日明细数据
     List<JSONObject> queryTodayDetailReportBy(@Param("statDate") String statDate);
 
     //根据开始、结束时间 查询汇总数据
-    JSONObject querySumByStartEndDate(@Param("startDate") String anotherDay, @Param("endDate") String endDate);
+    JSONObject querySumByStartEndDate(@Param("endDate") String endDate, @Param("startDate") String startDate);
 
     //根据开始、结束时间 查询明细数据
-     List<JSONObject> queryDetailByStartEndDate(@Param("startDate") String anotherDay, @Param("endDate") String endDate);
+    List<JSONObject> queryDetailByStartEndDate(@Param("endDate") String endDate, @Param("startDate") String startDate);
 
     //按月分组查询明细数据
-    List<JSONObject> queryDetailGroupMonthByDate(@Param("startDate") String anotherDay, @Param("endDate") String endDate);
+    List<JSONObject> queryDetailGroupMonthByDate(@Param("endDate") String endDate, @Param("startDate") String startDate);
 
     //查询固定月的明细数据
     List<JSONObject> queryDetailGroupDayByMonth(@Param("month") String month);
 
     //项目消耗排行榜
-    List<JSONObject> queryTopCost(@Param("startDate") String anotherDay, @Param("endDate") String endDate, @Param("rank") int rank);
+    List<JSONObject> queryTopCost(@Param("endDate") String endDate, @Param("startDate") String startDate, @Param("rank") int rank);
 
 }

+ 24 - 3
module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/report/mapper/xml/ByteDanceVideoReportDailyMapper.xml

@@ -288,6 +288,8 @@
 
     <select id="videoInfoListDetail" resultType="cn.com.ctop.toutiao.modules.report.entity.ByteDanceVideoReportDaily">
                 select
+                a.project_id as projectId,
+                a.project_name as projectName,
                 a.account_id as accountId,
                 a.advertiser_id as advertiserId,
                 a.advertiser_name as advertiserName,
@@ -319,6 +321,8 @@
 
     <select id="videoInfoListDetailOperator" resultType="cn.com.ctop.toutiao.modules.report.entity.ByteDanceVideoReportDaily">
         select
+        a.project_id as projectId,
+        a.project_name as projectName,
         a.account_id as accountId,
         a.advertiser_id as advertiserId,
         a.advertiser_name as advertiserName,
@@ -347,6 +351,8 @@
 
     <select id="videoInfoListDetailDesign" resultType="cn.com.ctop.toutiao.modules.report.entity.ByteDanceVideoReportDaily">
         select
+        a.project_id as projectId,
+        a.project_name as projectName,
         a.account_id as accountId,
         a.advertiser_id as advertiserId,
         a.advertiser_name as advertiserName,
@@ -425,8 +431,7 @@
         and media_id = #{mediaId}
     </select>
 
-    <select id="videoInfoList" resultType="cn.com.ctop.toutiao.modules.report.entity.ByteDanceVideoReportDaily">
-        select
+    <sql id="videoInfoSql">
         a.account_id as accountId,
         b.project_id as projectId,
         b.project_name as projectName,
@@ -629,10 +634,14 @@
         when sum(a.click) != 0
         then sum(a.download_start)/sum(a.click)
         else 0 end as downloadStartRate, --  应用下载广告数据-安卓下载开始率  计算方法:安卓下载开始数/点击数
+    </sql>
 
+    <select id="videoInfoList" resultType="cn.com.ctop.toutiao.modules.report.entity.ByteDanceVideoReportDaily">
+        select
+        <include refid="videoInfoSql"></include>
         #{companyId} as companyId
         from ctop_bytedance_report_material_daily a
-        left join ctop_user_allocation b on a.account_id = b.account_id
+        left join (select * from ctop_user_allocation group by account_id) b on a.account_id = b.account_id
         left join user_company c on b.user_id = c.user_id
         left join ctop_bytedance_video_info d on a.material_id = d.material_id
         left join (select code,url,material_name from ctop_material_info group by code) e on d.signature = e.code
@@ -641,9 +650,21 @@
         'CREATIVE_IMAGE_MODE_VIDEO_VERTICAL')
         and date_format(stat_datetime,'%Y-%m-%d') &gt;= #{startDate}
         and date_format(stat_datetime,'%Y-%m-%d') &lt;= #{endDate}
+        <if test="accountId != null">
+            and a.account_id = #{accountId}
+        </if>
         group by `statDatetime`,`accountId`,`signature`
     </select>
 
+    <select id="getCompanyIdByAccountId" resultType="string">
+        select
+        c.company_id
+        from
+        ctop_user_allocation b
+        left join user_company c on b.user_id = c.user_id
+        where b.account_id = #{accountId}
+    </select>
+
     <select id="videoInfoListGroupOperator" resultType="cn.com.ctop.toutiao.modules.report.entity.ByteDanceVideoReportDaily">
         select
         <include refid="selectSql"></include>

+ 149 - 31
module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/report/mapper/xml/BytedanceHomepageMapper.xml

@@ -7,7 +7,7 @@
        SELECT
 	     ROUND(sum(cost),2) cost,
 	     sum(show_num) showNum,
-	     sum(stat_datetime) click,
+	     sum(click) click,
 	     max(stat_hour) maxHour
        FROM
 	      ctop_bytedance_report_advertiser_hourly
@@ -15,22 +15,59 @@
 	      stat_datetime = #{statDate}
       </select>
 
+    <select id="queryTodaySumByHour" resultType="com.alibaba.fastjson.JSONObject">
+        SELECT
+            ROUND(sum(cost),2) cost,
+            sum(show_num) showNum,
+            sum(click) click
+        FROM
+            ctop_bytedance_report_advertiser_hourly
+        WHERE
+            stat_hour &lt;= #{hour}
+    </select>
 
     <select id="queryTodayDetailReportBy" resultType="com.alibaba.fastjson.JSONObject">
-       SELECT
-         stat_datetime statDate,
-         stat_hour statHour,
-	     ROUND(sum(cost),2) cost,
-	     sum(show_num) showNum,
-	     sum(click) click
-	   FROM
-	      ctop_bytedance_report_advertiser_hourly
-       WHERE
-	      stat_datetime = #{statDate}
-       GROUP BY
-	      stat_hour
-       ORDER BY
-	      stat_hour ASC
+        SELECT
+            stat_datetime statDate,
+            stat_hour statHour,
+            ROUND(sum(cost), 2) cost,
+            sum(show_num) showNum,
+            sum(click) click,
+            CASE
+                WHEN (click / show_num) IS NULL THEN
+                    0
+                ELSE
+                    CONCAT(
+                            ROUND(
+                                    (click / show_num) * 100,
+                                    2
+                                ),
+                            '%'
+                        )
+                END AS 'clickRate',
+            CASE
+                WHEN (cost / show_num) IS NULL THEN
+                    0
+                ELSE
+                    ROUND(
+                            (cost / show_num) * 1000,
+                            2
+                        )
+                END AS 'cpm',
+            CASE
+                WHEN (click / cost) IS NULL THEN
+                    0
+                ELSE
+                    ROUND((cost / click), 2)
+                END AS 'cp'
+        FROM
+            ctop_bytedance_report_advertiser_hourly
+        WHERE
+            stat_datetime = #{statDate}
+        GROUP BY
+            stat_hour
+        ORDER BY
+            stat_hour ASC
 
     </select>
 
@@ -42,21 +79,48 @@
        FROM
          ctop_bytedance_report_advertiser_daily
        WHERE
-         stat_datetime &lt;= #{endDate}
+         stat_datetime &lt;= #{endDate} '00:00:00'
        AND
          stat_datetime &gt;= #{startDate}
     </select>
 
     <select id="queryDetailByStartEndDate" resultType="com.alibaba.fastjson.JSONObject">
        SELECT
-         ROUND(sum(cost), 2) cost,
-         sum(show_num) showNum,
-         sum(click) click,
+           ROUND(sum(cost), 2) cost,
+           sum(show_num) showNum,
+           sum(click) click,
+           CASE
+               WHEN (sum(click) / sum(show_num)) IS NULL THEN
+                   0
+               ELSE
+                   CONCAT(
+                           ROUND(
+                                   (sum(click) / sum(show_num)) * 100,
+                                   2
+                               ),
+                           '%'
+                       )
+               END AS 'clickRate',
+           CASE
+               WHEN (sum(cost) / sum(show_num)) IS NULL THEN
+                   0
+               ELSE
+                   ROUND(
+                           (sum(cost) / sum(show_num)) * 1000,
+                           2
+                       )
+               END AS 'cpm',
+           CASE
+               WHEN (sum(click) / sum(cost)) IS NULL THEN
+                   0
+               ELSE
+                   ROUND((sum(cost) / sum(click)), 2)
+               END AS 'cp',
          DATE_FORMAT(stat_datetime,'%Y-%m-%d') statDate
        FROM
          ctop_bytedance_report_advertiser_daily
        WHERE
-            stat_datetime &lt;= #{endDate}
+            stat_datetime &lt;= #{endDate} '00:00:00'
        AND  stat_datetime &gt;= #{startDate}
        group by stat_datetime
        order by stat_datetime asc
@@ -64,14 +128,41 @@
 
     <select id="queryDetailGroupMonthByDate" resultType="com.alibaba.fastjson.JSONObject">
        SELECT
-         ROUND(sum(cost), 2) cost,
-         sum(show_num) showNum,
-         sum(click) click,
+           ROUND(sum(cost), 2) cost,
+           sum(show_num) showNum,
+           sum(click) click,
+           CASE
+               WHEN (sum(click) / sum(show_num)) IS NULL THEN
+                   0
+               ELSE
+                   CONCAT(
+                           ROUND(
+                                   (sum(click) / sum(show_num)) * 100,
+                                   2
+                               ),
+                           '%'
+                       )
+               END AS 'clickRate',
+           CASE
+               WHEN (sum(cost) / sum(show_num)) IS NULL THEN
+                   0
+               ELSE
+                   ROUND(
+                           (sum(cost) / sum(show_num)) * 1000,
+                           2
+                       )
+               END AS 'cpm',
+           CASE
+               WHEN (sum(click) / sum(cost)) IS NULL THEN
+                   0
+               ELSE
+                   ROUND((sum(cost) / sum(click)), 2)
+               END AS 'cp',
          DATE_FORMAT(stat_datetime,'%Y-%m') statDate
        FROM
          ctop_bytedance_report_advertiser_daily
        WHERE
-         stat_datetime &lt;= #{endDate}
+         stat_datetime &lt;= #{endDate} '00:00:00'
        AND
          stat_datetime &gt;= #{startDate}
       group by DATE_FORMAT(stat_datetime,'%Y-%m')
@@ -79,10 +170,37 @@
     </select>
 
     <select id="queryDetailGroupDayByMonth" resultType="com.alibaba.fastjson.JSONObject">
-       SELECT
-         ROUND(sum(cost), 2) cost,
-         sum(show_num) showNum,
-         sum(click) click,
+        SELECT
+            ROUND(sum(cost), 2) cost,
+            sum(show_num) showNum,
+            sum(click) click,
+            CASE
+                WHEN (sum(click) / sum(show_num)) IS NULL THEN
+                    0
+                ELSE
+                    CONCAT(
+                            ROUND(
+                                    (sum(click) / sum(show_num)) * 100,
+                                    2
+                                ),
+                            '%'
+                        )
+                END AS 'clickRate',
+            CASE
+                WHEN (sum(cost) / sum(show_num)) IS NULL THEN
+                    0
+                ELSE
+                    ROUND(
+                            (sum(cost) / sum(show_num)) * 1000,
+                            2
+                        )
+                END AS 'cpm',
+            CASE
+                WHEN (sum(click) / sum(cost)) IS NULL THEN
+                    0
+                ELSE
+                    ROUND((sum(cost) / sum(click)), 2)
+                END AS 'cp',
          DATE_FORMAT(stat_datetime,'%Y-%m-%d') statDate,
          SUBSTR(DATE_FORMAT(stat_datetime,'%Y-%m-%d') FROM 9 FOR 2) day
        FROM
@@ -102,7 +220,7 @@
        LEFT JOIN
          ctop_user_allocation t2 ON t1.advertiser_id=t2.account_id
        WHERE
-         stat_datetime &lt;= #{endDate}
+         stat_datetime &lt;= #{endDate} '00:00:00'
        AND
          stat_datetime &gt;= #{startDate}
        GROUP BY t1.advertiser_id
@@ -119,7 +237,7 @@
        LEFT JOIN
          ctop_user_allocation t2 ON t1.advertiser_id=t2.account_id
        WHERE
-         stat_datetime &lt;= #{endDate}
+         stat_datetime &lt;= #{endDate} '00:00:00'
        AND
          stat_datetime &gt;= #{startDate}
        GROUP BY t1.advertiser_id
@@ -136,7 +254,7 @@
        LEFT JOIN
          ctop_user_allocation t2 ON t1.advertiser_id=t2.account_id
        WHERE
-         stat_datetime &lt;= #{endDate}
+         stat_datetime &lt;= #{endDate} '00:00:00'
        AND
          stat_datetime &gt;= #{startDate}
        GROUP BY t1.advertiser_id

+ 2 - 0
module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/report/service/IByteDanceVideoReportDailyService.java

@@ -17,6 +17,8 @@ public interface IByteDanceVideoReportDailyService extends IService<ByteDanceVid
 
     void videoInfoList(String startDate, String endDate);
 
+    void videoInfoListByAccountId(String startDate, String endDate, Long accountId);
+
     PageInfo<ByteDanceVideoReportDaily> videoInfoListWeek(String startDate, String endDate, String signature, BigDecimal cost, Integer pageNo, Integer pageSize, Long[] projectIds, Long[] accountIds, String sort);
 
     PageInfo<ByteDanceVideoReportDaily> videoInfoListTotal(String startDate, String endDate, String signature, BigDecimal cost, Integer pageNo, Integer pageSize, Long[] projectIds, Long[] accountIds, String sort);

+ 0 - 0
module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/report/service/IBytedanceHomepageReportService.java


Some files were not shown because too many files changed in this diff