Browse Source

测试提交

syh 5 years ago
parent
commit
3cb9dfaa2b
100 changed files with 7394 additions and 843 deletions
  1. 26 4
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/controller/EduLessonController.java
  2. 150 57
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/controller/MaterialImageInfoController.java
  3. 40 8
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/controller/MaterialInfoController.java
  4. 873 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/controller/TestController.java
  5. 45 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/job/BytedanceDailyAccountReportAsyncJob.java
  6. 45 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/job/BytedanceDailyCampaignReportAsyncJob.java
  7. 46 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/job/BytedanceDailyCreativeReportAsyncJob.java
  8. 59 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/job/BytedanceDailyMaterialReportJob.java
  9. 52 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/job/BytedanceDailyMaterialReportRetryJob.java
  10. 46 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/job/BytedanceDailyPlanReportAsyncJob.java
  11. 33 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/job/BytedanceDailyReportAsyncTaskGetJob.java
  12. 60 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/job/KuaishouDailyAccountReportNextDayStayJob.java
  13. 7 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/service/IKuaiShouUploadService.java
  14. 197 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/service/impl/KuaiShouUploadServiceImpl.java
  15. 2 13
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/fileupload/controller/FileController.java
  16. 8 0
      module-common/pom.xml
  17. 3 6
      module-common/src/main/java/cn/com/ctop/common/module/entity/MaterialImageInfo.java
  18. 3 0
      module-common/src/main/java/cn/com/ctop/common/module/mapper/MaterialImageInfoMapper.java
  19. 5 1
      module-common/src/main/java/cn/com/ctop/common/module/mapper/MaterialInfoMapper.java
  20. 2 4
      module-common/src/main/java/cn/com/ctop/common/module/mapper/xml/MaterialAscriptionMapper.xml
  21. 45 44
      module-common/src/main/java/cn/com/ctop/common/module/mapper/xml/MaterialImageInfoMapper.xml
  22. 27 14
      module-common/src/main/java/cn/com/ctop/common/module/mapper/xml/MaterialInfoMapper.xml
  23. 4 1
      module-common/src/main/java/cn/com/ctop/common/module/service/IMaterialImageInfoService.java
  24. 3 0
      module-common/src/main/java/cn/com/ctop/common/module/service/IMaterialInfoService.java
  25. 10 9
      module-common/src/main/java/cn/com/ctop/common/module/service/impl/BindAccountAuthServiceImpl.java
  26. 60 28
      module-common/src/main/java/cn/com/ctop/common/module/service/impl/MaterialImageInfoServiceImpl.java
  27. 141 76
      module-common/src/main/java/cn/com/ctop/common/module/service/impl/MaterialInfoServiceImpl.java
  28. 5 3
      module-common/src/main/java/cn/com/ctop/common/module/utils/CorpWexinUtils.java
  29. 13 5
      module-common/src/main/java/cn/com/ctop/common/module/utils/HttpUtils2.java
  30. 54 102
      module-common/src/main/java/cn/com/ctop/common/module/utils/LoadFileUtil.java
  31. 2 2
      module-common/src/main/java/cn/com/ctop/common/module/utils/RandomUtil.java
  32. 7 1
      module-crawler/pom.xml
  33. 0 3
      module-crawler/src/main/java/cn/com/ctop/crawler/modules/pangolin/entity/PangolinReportAccountDaily.java
  34. 20 0
      module-crawler/src/main/java/cn/com/ctop/crawler/modules/pangolin/entity/PangolinReportAppHour.java
  35. 2 2
      module-crawler/src/main/java/cn/com/ctop/crawler/modules/pangolin/entity/PangolinReportBillMonth.java
  36. 1 1
      module-crawler/src/main/java/cn/com/ctop/crawler/modules/pangolin/entity/PangolinReportChannelDaily.java
  37. 47 0
      module-crawler/src/main/java/cn/com/ctop/crawler/modules/pangolin/job/PangolinDataJob.java
  38. 7 0
      module-crawler/src/main/java/cn/com/ctop/crawler/modules/pangolin/mapper/PangolinReportAppHourMapper.java
  39. 14 0
      module-crawler/src/main/java/cn/com/ctop/crawler/modules/pangolin/service/PangolinCrawlerService.java
  40. 7 0
      module-crawler/src/main/java/cn/com/ctop/crawler/modules/pangolin/service/PangolinReportAppHourService.java
  41. 357 0
      module-crawler/src/main/java/cn/com/ctop/crawler/modules/pangolin/service/impl/PangolinCrawlerServiceImpl.java
  42. 11 0
      module-crawler/src/main/java/cn/com/ctop/crawler/modules/pangolin/service/impl/PangolinReportAppHourServiceImpl.java
  43. 4 1
      module-ctop/src/main/java/cn/com/ctop/manage/modules/edu/service/IEduLessonService.java
  44. 18 0
      module-ctop/src/main/java/cn/com/ctop/manage/modules/edu/service/IMaterialUploadService.java
  45. 21 6
      module-ctop/src/main/java/cn/com/ctop/manage/modules/edu/service/impl/EduLessonServiceImpl.java
  46. 295 0
      module-ctop/src/main/java/cn/com/ctop/manage/modules/edu/service/impl/MaterialUploadServiceImpl.java
  47. 177 41
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/batch/controller/BatchController.java
  48. 248 0
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/batch/controller/KuaishouPopulationController.java
  49. 113 0
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/batch/entity/KuaishouPopulation.java
  50. 2 0
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/batch/mapper/KuaiShouCreativeMapper.java
  51. 3 1
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/batch/mapper/KuaiShouImageGetMapper.java
  52. 15 0
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/batch/mapper/KuaishouPopulationMapper.java
  53. 7 0
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/batch/mapper/xml/KuaiShouCreativeMapper.xml
  54. 7 0
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/batch/mapper/xml/KuaiShouImageGetMapper.xml
  55. 5 0
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/batch/mapper/xml/KuaishouPopulationMapper.xml
  56. 2 0
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/batch/service/IKuaiShouImageGetService.java
  57. 12 0
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/batch/service/IKuaiShouUpdateService.java
  58. 10 2
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/batch/service/IKuaishouInterfaceService.java
  59. 15 0
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/batch/service/IKuaishouPopulationService.java
  60. 179 32
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/batch/service/impl/BatchServiceImpl.java
  61. 5 0
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/batch/service/impl/KuaiShouImageGetServiceImpl.java
  62. 63 2
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/batch/service/impl/KuaiShouUpdateServiceImpl.java
  63. 176 29
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/batch/service/impl/KuaishouInterfaceServiceImpl.java
  64. 19 0
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/batch/service/impl/KuaishouPopulationServiceImpl.java
  65. 6 0
      module-toutiao/pom.xml
  66. 71 35
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/report/controller/BytedanceReportController.java
  67. 33 11
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/report/service/impl/ByteDanceHourlyAccountWarningServiceImpl.java
  68. 339 293
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/report/service/impl/BytedanceReportServiceImpl.java
  69. 253 0
      performance-appraisal/src/main/java/cn/com/ctop/accountvideoquarterinfo/controller/AccountVideoQuarterInfoController.java
  70. 157 0
      performance-appraisal/src/main/java/cn/com/ctop/accountvideoquarterinfo/entity/AccountVideoQuarterInfo.java
  71. 18 0
      performance-appraisal/src/main/java/cn/com/ctop/accountvideoquarterinfo/mapper/AccountVideoQuarterInfoMapper.java
  72. 5 0
      performance-appraisal/src/main/java/cn/com/ctop/accountvideoquarterinfo/mapper/xml/AccountVideoQuarterInfoMapper.xml
  73. 15 0
      performance-appraisal/src/main/java/cn/com/ctop/accountvideoquarterinfo/service/IAccountVideoQuarterInfoService.java
  74. 20 0
      performance-appraisal/src/main/java/cn/com/ctop/accountvideoquarterinfo/service/impl/AccountVideoQuarterInfoServiceImpl.java
  75. 267 0
      performance-appraisal/src/main/java/cn/com/ctop/huananvideoreport/controller/HuananVideoReportController.java
  76. 27 0
      performance-appraisal/src/main/java/cn/com/ctop/huananvideoreport/dto/HuananVideoReportDTO.java
  77. 125 0
      performance-appraisal/src/main/java/cn/com/ctop/huananvideoreport/entity/HuananVideoReport.java
  78. 24 0
      performance-appraisal/src/main/java/cn/com/ctop/huananvideoreport/mapper/HuananVideoReportMapper.java
  79. 86 0
      performance-appraisal/src/main/java/cn/com/ctop/huananvideoreport/mapper/xml/HuananVideoReportMapper.xml
  80. 17 0
      performance-appraisal/src/main/java/cn/com/ctop/huananvideoreport/service/IHuananVideoReportService.java
  81. 65 0
      performance-appraisal/src/main/java/cn/com/ctop/huananvideoreport/service/impl/HuananVideoReportServiceImpl.java
  82. 253 0
      performance-appraisal/src/main/java/cn/com/ctop/performanceaccount/controller/PerformanceAccountController.java
  83. 114 0
      performance-appraisal/src/main/java/cn/com/ctop/performanceaccount/entity/PerformanceAccount.java
  84. 18 0
      performance-appraisal/src/main/java/cn/com/ctop/performanceaccount/mapper/PerformanceAccountMapper.java
  85. 5 0
      performance-appraisal/src/main/java/cn/com/ctop/performanceaccount/mapper/xml/PerformanceAccountMapper.xml
  86. 15 0
      performance-appraisal/src/main/java/cn/com/ctop/performanceaccount/service/IPerformanceAccountService.java
  87. 20 0
      performance-appraisal/src/main/java/cn/com/ctop/performanceaccount/service/impl/PerformanceAccountServiceImpl.java
  88. 208 0
      performance-appraisal/src/main/java/cn/com/ctop/performanceaccount/vue/PerformanceAccountList.vue
  89. 170 0
      performance-appraisal/src/main/java/cn/com/ctop/performanceaccount/vue/modules/PerformanceAccountModal.vue
  90. 177 0
      performance-appraisal/src/main/java/cn/com/ctop/performanceaccount/vue/modules/PerformanceAccountModal__Style#Drawer.vue
  91. 66 0
      performance-appraisal/src/main/java/cn/com/ctop/performanceappraisal/controller/PerformanceController.java
  92. 30 0
      performance-appraisal/src/main/java/cn/com/ctop/performanceappraisal/controller/PerformanceOptimizerController.java
  93. 4 4
      performance-appraisal/src/main/java/cn/com/ctop/performanceappraisal/entity/OptimizerConfig.java
  94. 6 0
      performance-appraisal/src/main/java/cn/com/ctop/performanceappraisal/service/IPerformanceOptimizerService.java
  95. 469 2
      performance-appraisal/src/main/java/cn/com/ctop/performanceappraisal/service/impl/PerformanceOptimizerServiceImpl.java
  96. 253 0
      performance-appraisal/src/main/java/cn/com/ctop/planeprojectcost/controller/PlaneProjectCostController.java
  97. 100 0
      performance-appraisal/src/main/java/cn/com/ctop/planeprojectcost/entity/PlaneProjectCost.java
  98. 18 0
      performance-appraisal/src/main/java/cn/com/ctop/planeprojectcost/mapper/PlaneProjectCostMapper.java
  99. 5 0
      performance-appraisal/src/main/java/cn/com/ctop/planeprojectcost/mapper/xml/PlaneProjectCostMapper.xml
  100. 0 0
      performance-appraisal/src/main/java/cn/com/ctop/planeprojectcost/service/IPlaneProjectCostService.java

+ 26 - 4
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/controller/EduLessonController.java

@@ -5,13 +5,14 @@ import cn.com.ctop.manage.modules.edu.service.IEduLessonService;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import io.swagger.annotations.Api;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang.StringUtils;
 import org.jeecg.common.api.vo.Result;
 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 org.springframework.web.bind.annotation.*;
 
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 @Slf4j
 @Api(tags="在线培训")
@@ -81,7 +82,7 @@ public class EduLessonController {
     }
 
     @GetMapping(value = "/lesson/list")
-    public Result<List<EduLesson>> lessonList(String media,String title,String topic){
+    public Result<List<EduLesson>> lessonList(String media, String title, String topic){
         Result<List<EduLesson>> result = new Result<>();
         QueryWrapper<EduLesson> queryWrapper = new QueryWrapper<>();
         queryWrapper.eq("media",media);
@@ -92,4 +93,25 @@ public class EduLessonController {
         result.setSuccess(true);
         return result;
     }
+
+    @PostMapping(value = "/lesson/upload")
+    public Result<Map<String, String>> updaloadLesson(@RequestBody EduLesson eduLesson) {
+        Result<Map<String, String>> result = new Result();
+        Map<String, String> resultMap = new HashMap<>();
+
+        if (StringUtils.isBlank(eduLesson.getMedia()) || StringUtils.isBlank(eduLesson.getTitle()) ||
+                StringUtils.isBlank(eduLesson.getTopic()) || StringUtils.isBlank(eduLesson.getName()) ||
+                StringUtils.isBlank(eduLesson.getOssFileUrl()) || StringUtils.isBlank(eduLesson.getFileType())
+        ) {
+            result.error500("参数不可为空");
+            return result;
+        }
+        String lessonId = eduLessonService.uploadLesson(eduLesson);
+
+        resultMap.put("lessonId", lessonId);
+        result.setResult(resultMap);
+        result.setSuccess(true);
+
+        return result;
+    }
 }

+ 150 - 57
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/controller/MaterialImageInfoController.java

@@ -3,10 +3,10 @@ package org.jeecg.modules.ctop.controller;
 import cn.com.ctop.common.module.entity.MaterialImageInfo;
 import cn.com.ctop.common.module.entity.MaterialInfo;
 import cn.com.ctop.common.module.mapper.MaterialInfoMapper;
-import cn.com.ctop.common.module.mapper.SysRoleMapper;
 import cn.com.ctop.common.module.service.IMaterialImageInfoService;
 import cn.com.ctop.common.module.service.IMaterialInfoService;
 import cn.com.ctop.common.module.utils.Check;
+import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
@@ -21,14 +21,27 @@ 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.common.util.oConvertUtils;
 import org.jeecg.modules.ctop.service.IProjectMemberService;
+import org.jeecgframework.poi.excel.ExcelImportUtil;
+import org.jeecgframework.poi.excel.def.NormalExcelConstants;
+import org.jeecgframework.poi.excel.entity.ExportParams;
+import org.jeecgframework.poi.excel.entity.ImportParams;
+import org.jeecgframework.poi.excel.view.JeecgEntityExcelView;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.multipart.MultipartHttpServletRequest;
+import org.springframework.web.servlet.ModelAndView;
 
 import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.net.URLDecoder;
 import java.text.ParseException;
+import java.util.ArrayList;
 import java.util.Arrays;
-import java.util.Date;
 import java.util.List;
 import java.util.Map;
 
@@ -45,12 +58,10 @@ import java.util.Map;
 @RequestMapping("/ctop/MaterialImageInfo")
 public class MaterialImageInfoController {
     @Autowired
-    private IMaterialImageInfoService materialImageInfoService;
+    private IMaterialImageInfoService MaterialImageInfoService;
     @Autowired
     private IMaterialInfoService materialInfoService;
     @Autowired
-    private SysRoleMapper sysRoleMapper;
-    @Autowired
     private MaterialInfoMapper materialInfoMapper;
     @Autowired
     private IProjectMemberService memberService;
@@ -62,31 +73,18 @@ public class MaterialImageInfoController {
                                                      @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
                                                      @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
                                                      HttpServletRequest req) {
-        Result<IPage<MaterialImageInfo>> result = new Result<>();
+        Result<IPage<MaterialImageInfo>> result = new Result<IPage<MaterialImageInfo>>();
+
 
         QueryWrapper<MaterialImageInfo> queryWrapper = new QueryWrapper<>();
-        Date createTime = materialImageInfo.getCreateTime();
+        Object createTime = materialImageInfo.getCreateTime();
         materialImageInfo.setCreateTime(null);
         if (!Check.isNull(materialImageInfo.getUserId())) {
-            String roleCode = sysRoleMapper.getRoleCodeByUserId(materialImageInfo.getUserId());
-            if ("admin".equals(roleCode) || "operator".equals(roleCode) || "kuaishouOperationManager".equals(roleCode) || "operationAssistant".equals(roleCode) || "touTiaoOperationManager".equals(roleCode) || "sale".equals(roleCode) || "saleDirector".equals(roleCode)) {
+            String roleCode = materialInfoService.getRoleCodeByUserId(materialImageInfo.getUserId());
+            if ("designTeamLeader".equals(roleCode) || "planeLeader".equals(roleCode) || "admin".equals(roleCode) || "operator".equals(roleCode) || "kuaishouOperationManager".equals(roleCode) || "operationAssistant".equals(roleCode) || "touTiaoOperationManager".equals(roleCode) || "sale".equals(roleCode) || "saleDirector".equals(roleCode)) {
                 materialImageInfo.setUserId(null);
                 queryWrapper = QueryGenerator.initQueryWrapper(materialImageInfo, req.getParameterMap());
-            } else if ("designTeamLeader".equals(roleCode) || "planeLeader".equals(roleCode) || "plane".equals(roleCode) || "plan".equals(roleCode) || "shot".equals(roleCode)) {
-                String userId = materialImageInfo.getUserId();
-                materialImageInfo.setUserId(null);
-                queryWrapper = QueryGenerator.initQueryWrapper(materialImageInfo, req.getParameterMap());
-                if (Check.isNull(materialImageInfo.getProjectId())) {
-                    List<Long> projects = memberService.selectProjectsByUserId(userId);
-                    if (!Check.isNull(projects)) {
-                        queryWrapper.in("project_id", projects);
-                    } else {
-                        result.setSuccess(true);
-                        result.setResult(null);
-                        return result;
-                    }
-                }
-            } else {
+            } else if ("plane".equals(roleCode) || "plan".equals(roleCode) || "shot".equals(roleCode)) {
                 queryWrapper = QueryGenerator.initQueryWrapper(materialImageInfo, req.getParameterMap());
             }
             if (!Check.isNull(createTime)) {
@@ -101,7 +99,9 @@ public class MaterialImageInfoController {
             }
         }
         Page<MaterialImageInfo> page = new Page<>(pageNo, pageSize);
-        IPage<MaterialImageInfo> pageList = materialImageInfoService.page(page, queryWrapper);
+        IPage<MaterialImageInfo> pageList = MaterialImageInfoService.page(page, queryWrapper);
+
+
         result.setSuccess(true);
         result.setResult(pageList);
         return result;
@@ -111,17 +111,33 @@ public class MaterialImageInfoController {
 
     /**
      * 分页列表查询
-     * @param req
-     * @return
+     * * @return
      */
     @AutoLog(value = "素材-分页列表查询")
     @ApiOperation(value = "素材-分页列表查询", notes = "素材-分页列表查询")
     @GetMapping(value = "/list")
-    public Result<List<MaterialImageInfo>> queryPageList(MaterialImageInfo materialImageInfo,
-                                                         HttpServletRequest req) {
+    public Result<List<MaterialImageInfo>> queryPageList(String videoId) {
         Result<List<MaterialImageInfo>> result = new Result<>();
-        QueryWrapper<MaterialImageInfo> queryWrapper = QueryGenerator.initQueryWrapper(materialImageInfo, req.getParameterMap());
-        List<MaterialImageInfo> list = materialImageInfoService.list(queryWrapper);
+
+        List<MaterialImageInfo> list = new ArrayList<>();
+        if (!Check.isNull(videoId)) {
+            QueryWrapper<MaterialImageInfo> queryWrapper = new QueryWrapper<>();
+            queryWrapper.eq("video_id", videoId);
+            list = MaterialImageInfoService.list(queryWrapper);
+        }
+
+        result.setSuccess(true);
+        result.setResult(list);
+        return result;
+    }
+
+
+    @GetMapping(value = "/getImageList")
+    public Result<List<MaterialImageInfo>> getImageList(MaterialImageInfo MaterialImageInfo,
+                                                        HttpServletRequest req) {
+        Result<List<MaterialImageInfo>> result = new Result<>();
+        QueryWrapper<MaterialImageInfo> queryWrapper = QueryGenerator.initQueryWrapper(MaterialImageInfo, req.getParameterMap());
+        List<MaterialImageInfo> list = MaterialImageInfoService.list(queryWrapper);
         result.setSuccess(true);
         result.setResult(list);
         return result;
@@ -131,17 +147,27 @@ public class MaterialImageInfoController {
     @GetMapping(value = "/getDetail")
     public Result<MaterialImageInfo> getDetail(String id) {
         Result<MaterialImageInfo> result = new Result<>();
-        MaterialImageInfo materialImageInfo = materialImageInfoService.getById(id);
+        MaterialImageInfo materialImageInfo = MaterialImageInfoService.getById(id);
         if (!Check.isNull(materialImageInfo)) {
-            MaterialInfo materialmInfo = materialInfoService.getById(materialImageInfo.getVideoId());
-            if (!Check.isNull(materialmInfo)) {
-                materialImageInfo.setVideoUrl(materialmInfo.getUrl());
+            QueryWrapper<MaterialInfo> materialInfoQueryWrapper = new QueryWrapper<>();
+            materialInfoQueryWrapper.eq("code", materialImageInfo.getVideoId());
+            materialInfoQueryWrapper.orderByDesc("create_time");
+            materialInfoQueryWrapper.last("limit 1");
+            MaterialInfo materialInfo = materialInfoService.getOne(materialInfoQueryWrapper);
+            if (!Check.isNull(materialInfo)) {
+                materialImageInfo.setVideoUrl(materialInfo.getUrl());
 
             }
+            if (!Check.isNull(materialImageInfo.getAuditorId())) {
+                String auditorName = materialInfoMapper.selectUserNameById(materialImageInfo.getAuditorId());
+                materialImageInfo.setAuditorName(auditorName);
 
-            String auditorName = materialInfoMapper.selectUserNameById(materialImageInfo.getAuditorId());
-            materialImageInfo.setAuditorName(auditorName);
+            }
 
+            if (!Check.isNull(materialImageInfo.getUserId())) {
+                String userName = materialInfoMapper.selectUserNameById(materialImageInfo.getUserId());
+                materialImageInfo.setUserName(userName);
+            }
         }
 
         result.setSuccess(true);
@@ -153,16 +179,16 @@ public class MaterialImageInfoController {
     /**
      * 添加
      *
-     * @param materialImageInfo
+     * @param MaterialImageInfo
      * @return
      */
     @AutoLog(value = "素材-添加")
     @ApiOperation(value = "素材-添加", notes = "素材-添加")
     @PostMapping(value = "/add")
-    public Result<MaterialImageInfo> add(@RequestBody MaterialImageInfo materialImageInfo) {
-        Result<MaterialImageInfo> result = new Result<>();
+    public Result<MaterialImageInfo> add(@RequestBody MaterialImageInfo MaterialImageInfo) {
+        Result<MaterialImageInfo> result = new Result<MaterialImageInfo>();
         try {
-            materialImageInfoService.save(materialImageInfo);
+            MaterialImageInfoService.save(MaterialImageInfo);
             result.success("添加成功!");
         } catch (Exception e) {
             log.error(e.getMessage(), e);
@@ -181,16 +207,16 @@ public class MaterialImageInfoController {
 
     @ApiOperation(value = "素材-编辑", notes = "素材-编辑")
     @PutMapping(value = "/edit")
-    public Result<MaterialImageInfo> edit(@RequestBody MaterialImageInfo materialImageInfo) {
+    public Result<MaterialImageInfo> edit(@RequestBody MaterialImageInfo MaterialImageInfo) {
         Result<MaterialImageInfo> result = new Result<MaterialImageInfo>();
-        MaterialImageInfo materialImageInfoEntity = materialImageInfoService.getById(materialImageInfo.getId());
-        if (materialImageInfoEntity == null) {
+        MaterialImageInfo MaterialImageInfoEntity = MaterialImageInfoService.getById(MaterialImageInfo.getId());
+        if (MaterialImageInfoEntity == null) {
             result.error500("未找到对应实体");
         } else {
-            String url = (String) materialImageInfo.getUrl();
+            String url = (String) MaterialImageInfo.getUrl();
             String urlStr = "https:" + url;
-            materialImageInfo.setUrl(urlStr);
-            boolean ok = materialImageInfoService.updateById(materialImageInfoEntity);
+            MaterialImageInfo.setUrl(urlStr);
+            boolean ok = MaterialImageInfoService.updateById(MaterialImageInfo);
             if (ok) {
                 result.success("修改成功!");
             }
@@ -204,7 +230,7 @@ public class MaterialImageInfoController {
     @ApiOperation(value = "素材-编辑", notes = "素材-编辑")
     @PutMapping(value = "/batchEdit")
     public Result<MaterialImageInfo> batchEdit(@RequestBody JSONArray updateArr) {
-        Result<MaterialImageInfo> result = new Result<>();
+        Result<MaterialImageInfo> result = new Result<MaterialImageInfo>();
         try {
             if (!Check.isNull(updateArr)) {
                 LoginUser user = (LoginUser) SecurityUtils.getSubject()
@@ -221,7 +247,7 @@ public class MaterialImageInfoController {
                             materialImageInfo.setRefuseReason(updateJson.getString("refuseReason"));
                         }
                         materialImageInfo.setAuditorId(user.getId());
-                        materialImageInfoService.updateById(materialImageInfo);
+                        MaterialImageInfoService.updateById(materialImageInfo);
                     }
                 }
             }
@@ -245,9 +271,9 @@ public class MaterialImageInfoController {
     @AutoLog(value = "素材-通过id删除")
     @ApiOperation(value = "素材-通过id删除", notes = "素材-通过id删除")
     @DeleteMapping(value = "/delete")
-    public Result<Object> delete(@RequestParam(name = "id", required = true) String id) {
+    public Result<?> delete(@RequestParam(name = "id", required = true) String id) {
         try {
-            materialImageInfoService.removeById(id);
+            MaterialImageInfoService.removeById(id);
         } catch (Exception e) {
             log.error("删除失败", e.getMessage());
             return Result.error("删除失败!");
@@ -265,11 +291,11 @@ public class MaterialImageInfoController {
     @ApiOperation(value = "素材-批量删除", notes = "素材-批量删除")
     @DeleteMapping(value = "/deleteBatch")
     public Result<MaterialImageInfo> deleteBatch(@RequestParam(name = "ids", required = true) String ids) {
-        Result<MaterialImageInfo> result = new Result<>();
+        Result<MaterialImageInfo> result = new Result<MaterialImageInfo>();
         if (ids == null || "".equals(ids.trim())) {
             result.error500("参数不识别!");
         } else {
-            materialImageInfoService.removeByIds(Arrays.asList(ids.split(",")));
+            this.MaterialImageInfoService.removeByIds(Arrays.asList(ids.split(",")));
             result.success("删除成功!");
         }
         return result;
@@ -285,14 +311,81 @@ public class MaterialImageInfoController {
     @ApiOperation(value = "素材-通过id查询", notes = "素材-通过id查询")
     @GetMapping(value = "/queryById")
     public Result<MaterialImageInfo> queryById(@RequestParam(name = "id", required = true) String id) {
-        Result<MaterialImageInfo> result = new Result<>();
-        MaterialImageInfo materialImageInfo = materialImageInfoService.getById(id);
-        if (materialImageInfo == null) {
+        Result<MaterialImageInfo> result = new Result<MaterialImageInfo>();
+        MaterialImageInfo MaterialImageInfo = MaterialImageInfoService.getById(id);
+        if (MaterialImageInfo == null) {
             result.error500("未找到对应实体");
         } else {
-            result.setResult(materialImageInfo);
+            result.setResult(MaterialImageInfo);
             result.setSuccess(true);
         }
         return result;
     }
+
+    /**
+     * 导出excel
+     *
+     * @param request
+     * @param response
+     */
+    @RequestMapping(value = "/exportXls")
+    public ModelAndView exportXls(HttpServletRequest request, HttpServletResponse response) {
+        // Step.1 组装查询条件
+        QueryWrapper<MaterialImageInfo> queryWrapper = null;
+        try {
+            String paramsStr = request.getParameter("paramsStr");
+            if (oConvertUtils.isNotEmpty(paramsStr)) {
+                String deString = URLDecoder.decode(paramsStr, "UTF-8");
+                MaterialImageInfo MaterialImageInfo = JSON.parseObject(deString, MaterialImageInfo.class);
+                queryWrapper = QueryGenerator.initQueryWrapper(MaterialImageInfo, request.getParameterMap());
+            }
+        } catch (UnsupportedEncodingException e) {
+            e.printStackTrace();
+        }
+
+        //Step.2 AutoPoi 导出Excel
+        ModelAndView mv = new ModelAndView(new JeecgEntityExcelView());
+        List<MaterialImageInfo> pageList = MaterialImageInfoService.list(queryWrapper);
+        //导出文件名称
+        mv.addObject(NormalExcelConstants.FILE_NAME, "素材列表");
+        mv.addObject(NormalExcelConstants.CLASS, MaterialImageInfo.class);
+        mv.addObject(NormalExcelConstants.PARAMS, new ExportParams("素材列表数据", "导出人:Jeecg", "导出信息"));
+        mv.addObject(NormalExcelConstants.DATA_LIST, pageList);
+        return mv;
+    }
+
+    /**
+     * 通过excel导入数据
+     *
+     * @param request
+     * @param response
+     * @return
+     */
+    @RequestMapping(value = "/importExcel", method = RequestMethod.POST)
+    public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {
+        MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
+        Map<String, MultipartFile> fileMap = multipartRequest.getFileMap();
+        for (Map.Entry<String, MultipartFile> entity : fileMap.entrySet()) {
+            MultipartFile file = entity.getValue();
+            ImportParams params = new ImportParams();
+            params.setTitleRows(2);
+            params.setHeadRows(1);
+            params.setNeedSave(true);
+            try {
+                List<MaterialImageInfo> listMaterialImageInfos = ExcelImportUtil.importExcel(file.getInputStream(), MaterialImageInfo.class, params);
+                MaterialImageInfoService.saveBatch(listMaterialImageInfos);
+                return Result.ok("文件导入成功!数据行数:" + listMaterialImageInfos.size());
+            } catch (Exception e) {
+                log.error(e.getMessage(), e);
+                return Result.error("文件导入失败:" + e.getMessage());
+            } finally {
+                try {
+                    file.getInputStream().close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+        return Result.ok("文件导入失败!");
+    }
 }

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

@@ -28,6 +28,7 @@ import org.jeecg.common.util.oConvertUtils;
 import org.jeecg.modules.ctop.entity.KuaiShouCleanMaterialReport;
 import org.jeecg.modules.ctop.service.IKuaiShouCleanMaterialReportService;
 import org.jeecg.modules.ctop.service.IProjectMemberService;
+import org.jeecg.modules.ctop.service.IProjectService;
 import org.jeecgframework.poi.excel.ExcelImportUtil;
 import org.jeecgframework.poi.excel.def.NormalExcelConstants;
 import org.jeecgframework.poi.excel.entity.ExportParams;
@@ -65,8 +66,6 @@ public class MaterialInfoController {
     @Autowired
     private IMaterialInfoService materialInfoService;
     @Autowired
-    private ISysRoleService sysRoleService;
-    @Autowired
     private IMaterialAscriptionService materialAscriptionService;
     @Autowired
     private IMaterialParameterService materialParameterService;
@@ -78,11 +77,15 @@ public class MaterialInfoController {
     private IKuaiShouCleanMaterialReportService kuaiShouCleanMaterialReportService;
     @Autowired
     private IVideoWatermarkTaskService watermarkTaskService;
+    @Autowired
+    private IKuaiShouUploadService uploadService;
 
 
     @PostMapping("/correlationUpload")
     public Map<String, Object> insertFile(@RequestBody JSONObject json) {
-        LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();
+        LoginUser user = (LoginUser) SecurityUtils.getSubject()
+                .getPrincipal();
+
         json.put("userId", user.getId());
         return materialInfoService.correlationUpload(json);
     }
@@ -179,7 +182,7 @@ public class MaterialInfoController {
         Object createTime = materialInfo.getCreateTime();
         materialInfo.setCreateTime(null);
         if (!Check.isNull(materialInfo.getUserId())) {
-            String roleCode = sysRoleService.getRoleCodeByUserId(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)) {
                 materialInfo.setUserId(null);
                 queryWrapper = QueryGenerator.initQueryWrapper(materialInfo, req.getParameterMap());
@@ -244,8 +247,14 @@ public class MaterialInfoController {
                     material.setKuaiShou(JSONObject.parseObject(kuaiShouString));
                 }
 
+                /*JSONObject generalizationJson = materialInfoService.getGeneralizationInfo(material.getCode());
+                if (!Check.isNull(generalizationJson)) {
+                    material.setGeneralization(generalizationJson);
+                }*/
+
+
                 QueryWrapper<MaterialImageInfo> imageInfoQueryWrapper = new QueryWrapper<>();
-                imageInfoQueryWrapper.eq("video_id", material.getId());
+                imageInfoQueryWrapper.eq("video_id", material.getCode());
                 imageInfoQueryWrapper.eq("status", 0);
                 List<MaterialImageInfo> imageInfoList = iMaterialImageInfoService.list(imageInfoQueryWrapper);
                 if (Check.isNull(imageInfoList)) {
@@ -325,6 +334,9 @@ public class MaterialInfoController {
      * @param materialInfo
      * @return
      */
+    @Autowired
+    private IProjectService projectService;
+
     @AutoLog(value = "素材信息-编辑")
     @ApiOperation(value = "素材信息-编辑", notes = "素材信息-编辑")
     @PutMapping(value = "/edit")
@@ -342,6 +354,29 @@ public class MaterialInfoController {
                 materialInfo.setUrl(url);
             }
 
+
+           /* Long projectId = materialInfoEntity.getProjectId();
+            Project project = projectService.getById(projectId);
+            if (!Check.isNull(projectId)) {
+                if ("2".equals(project.getMediaId())) {
+                    if (!Check.isNull(materialInfo.getStatus())) {
+                        Integer status = materialInfo.getStatus();
+                        if (status == 1) {
+                            Thread thread = new Thread() {
+                                @Override
+                                public void run() {
+                                    log.info("开始自动同步素材,code:{}", materialInfoEntity.getCode());
+                                    uploadService.upload(materialInfoEntity);
+                                }
+                            };
+                            thread.start();
+                        }
+                    }
+                }
+
+            }*/
+
+
             boolean ok = materialInfoService.updateById(materialInfo);
             if (ok) {
                 result.success("修改成功!");
@@ -533,7 +568,4 @@ public class MaterialInfoController {
         result.setResult(pageList);
         return result;
     }
-
-
-
 }

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

@@ -0,0 +1,873 @@
+package org.jeecg.modules.ctop.controller;
+
+import cn.com.ctop.common.module.entity.*;
+import cn.com.ctop.common.module.mapper.CtopOauthTokenMapper;
+import cn.com.ctop.common.module.service.*;
+import cn.com.ctop.common.module.utils.Check;
+import cn.com.ctop.common.module.utils.CtopAdConstant;
+import cn.com.ctop.common.module.utils.ResultMapUtils;
+import cn.com.ctop.common.module.utils.StatusCode;
+import cn.com.ctop.kuaishou.modules.batch.service.IKuaiShouCampaignService;
+import cn.com.ctop.kuaishou.modules.batch.service.IKuaiShouDailyReportTaskService;
+import cn.com.ctop.kuaishou.modules.batch.service.IKuaiShouHistoryReportTaskService;
+import cn.com.ctop.kuaishou.modules.batch.service.IKuaishouInterfaceService;
+import cn.com.ctop.kuaishou.modules.graphql.service.IKuaishouWebInterfaceService;
+import cn.com.ctop.toutiao.modules.material.service.IByteDanceAdvertiserDataService;
+import cn.com.ctop.toutiao.modules.report.entity.BytedancePlanDailyReport;
+import cn.com.ctop.toutiao.modules.report.service.IBytedancePlanDailyReportService;
+import cn.com.ctop.toutiao.modules.report.service.IBytedancePlanHourlyReportService;
+import cn.com.ctop.toutiao.modules.report.service.IReportService;
+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.jeecg.modules.ctop.service.ICleanMaterialService;
+import org.jeecg.modules.ctop.service.ICreateInternalService;
+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.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.*;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+
+import static org.jeecg.common.util.DateUtils.getAnotherDay;
+
+/**
+ * @author jeecg-boot
+ */
+@RestController
+@RequestMapping("/test")
+@Slf4j
+public class TestController {
+    @Autowired
+    private ICreateInternalService createInternalService;
+    @Autowired
+    private IKuaishouWebInterfaceService kuaishouWebInterfaceService;
+
+    @Autowired
+    private CtopOauthTokenMapper oauthTokenMapper;
+    @Autowired
+    private IKuaiShouHistoryReportTaskService historyReportTaskService;
+    @Autowired
+    private IMaterialInfoService materialInfoService;
+    @Autowired
+    private IMaterialParameterService parameterService;
+    @Autowired
+    private IMaterialAscriptionService ascriptionService;
+    @Autowired
+    private IMaterialTagService tagService;
+    @Autowired
+    private IMaterialImageInfoService iMaterialImageInfoService;
+
+    @GetMapping(value = "/t")
+    public String test() {
+        Result<String> result = new Result<String>();
+        try {
+            String requestId = UUID.randomUUID().toString();
+            String img = kuaishouWebInterfaceService.qrLogin(requestId);
+            if (img != null) {
+                result.setSuccess(true);
+                result.setResult(img);
+            } else {
+                result.setSuccess(false);
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            result.setSuccess(false);
+        }
+        return "success";
+    }
+
+
+    @Autowired
+    private CtopOauthTokenMapper tokenMapper;
+    @Autowired
+    private IKuaishouInterfaceService kuaishouInterfaceService;
+
+
+    @Autowired
+    private ICtopOauthTokenService oauthTokenService;
+
+
+    @GetMapping(value = "/getToken")
+    public String getToken(Long accountId, String refreshToken, Integer agentType) {
+        oauthTokenService.getKuaiShouRefreshToken(accountId, refreshToken, agentType);
+        return "Success";
+    }
+
+
+    @GetMapping(value = "/updateCode")
+    public String updateCode() {
+
+        List<MaterialInfo> list = materialInfoService.list();
+        for (MaterialInfo info : list) {
+
+
+            QueryWrapper<MaterialImageInfo> imageInfoQueryWrapper = new QueryWrapper<>();
+            imageInfoQueryWrapper.eq("video_id", String.valueOf(info.getId()));
+            MaterialImageInfo updateMaterialImageInfo = new MaterialImageInfo();
+            updateMaterialImageInfo.setVideoId(info.getCode());
+            iMaterialImageInfoService.update(updateMaterialImageInfo, imageInfoQueryWrapper);
+
+
+            QueryWrapper<MaterialTag> tagQueryWrapper = new QueryWrapper<>();
+            tagQueryWrapper.eq("material_id", String.valueOf(info.getId()));
+            MaterialTag updateTag = new MaterialTag();
+            updateTag.setMaterialId(info.getCode());
+            tagService.update(updateTag, tagQueryWrapper);
+
+            QueryWrapper<MaterialAscription> materialAscriptionQuery = new QueryWrapper<>();
+            materialAscriptionQuery.eq("material_id", String.valueOf(info.getId()));
+            MaterialAscription updateMaterialAscription = new MaterialAscription();
+            updateMaterialAscription.setMaterialId(info.getCode());
+            ascriptionService.update(updateMaterialAscription, materialAscriptionQuery);
+
+
+            QueryWrapper<MaterialParameter> parameterQueryWrapper = new QueryWrapper<>();
+            parameterQueryWrapper.eq("material_id", String.valueOf(info.getId()));
+            MaterialParameter updateMaterialParameter = new MaterialParameter();
+            updateMaterialParameter.setMaterialId(info.getCode());
+            parameterService.update(updateMaterialParameter, parameterQueryWrapper);
+
+
+        }
+        List<MaterialImageInfo> list1 = iMaterialImageInfoService.list();
+        for (MaterialImageInfo imageInfo : list1) {
+            QueryWrapper<MaterialParameter> parameterQueryWrapper = new QueryWrapper<>();
+            parameterQueryWrapper.eq("material_id", String.valueOf(imageInfo.getId()));
+            MaterialParameter updateMaterialParameter = new MaterialParameter();
+            updateMaterialParameter.setMaterialId(imageInfo.getCode());
+            parameterService.update(updateMaterialParameter, parameterQueryWrapper);
+        }
+
+
+        List<String> codeList = iMaterialImageInfoService.getCodeList();
+        if (!Check.isNull(codeList)) {
+            for (int i = 0; i < codeList.size(); i++) {
+                String code = codeList.get(i);
+                QueryWrapper<MaterialImageInfo> materialImageInfoQueryWrapper = new QueryWrapper<>();
+                materialImageInfoQueryWrapper.eq("code", code);
+
+                List<MaterialImageInfo> list2 = iMaterialImageInfoService.list(materialImageInfoQueryWrapper);
+                if (list2.size() > 1) {
+                    for (int j = 0; j < list2.size(); j++) {
+                        if (j == 0) {
+                            continue;
+                        }
+                        MaterialImageInfo materialImageInfo = list2.get(j);
+                        iMaterialImageInfoService.removeById(String.valueOf(materialImageInfo.getId()));
+                    }
+
+                }
+            }
+
+        }
+
+        return "SUCCESS";
+
+    }
+
+
+    @GetMapping(value = "/createTask")
+    public String createTask(Long accountId) {
+        Result<String> result = new Result<String>();
+        try {
+            QueryWrapper<CtopOauthToken> oauthTokenQueryWrapper = new QueryWrapper<>();
+            oauthTokenQueryWrapper.eq("media_id", 2);
+            oauthTokenQueryWrapper.eq("account_id", accountId);
+            oauthTokenQueryWrapper.last("limit 1");
+            CtopOauthToken token = oauthTokenMapper.selectOne(oauthTokenQueryWrapper);
+            String endDateStr = DateUtils.getDate("yyyy-MM-dd");
+            String startDate = DateUtils.addMonth(endDateStr, -6);
+            historyReportTaskService.createTask(token.getAccountId(), token.getAccessToken(), startDate, endDateStr, CtopAdConstant.KUAISHOU_LOAD_JOB_TYPE_HISTORY);
+
+        } catch (Exception e) {
+            e.printStackTrace();
+            result.setSuccess(false);
+        }
+        return "success";
+    }
+
+
+    @GetMapping(value = "/getHistoryData")
+    public String getHistoryData() {
+        Result<String> result = new Result<String>();
+        try {
+            String endDateStr = DateUtils.getDate("yyyy-MM-dd");
+            String startDate = DateUtils.addMonth(endDateStr, -6);
+            QueryWrapper<CtopOauthToken> tokenQueryWrapper = new QueryWrapper<>();
+            tokenQueryWrapper.eq("media_id", 2);
+            List<CtopOauthToken> ctopOauthTokens = oauthTokenMapper.selectList(tokenQueryWrapper);
+            if (!Check.isNull(ctopOauthTokens)) {
+                for (CtopOauthToken token : ctopOauthTokens) {
+                    historyReportTaskService.createTask(token.getAccountId(), token.getAccessToken(), startDate, endDateStr, CtopAdConstant.KUAISHOU_LOAD_JOB_TYPE_HISTORY);
+                }
+
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            result.setSuccess(false);
+        }
+        return "success";
+    }
+
+
+    @GetMapping(value = "/getTaskList")
+    public String getTaskList() {
+        Result<String> result = new Result<String>();
+        try {
+            String endDateStr = DateUtils.getDate("yyyy-MM-dd");
+            String startDate = DateUtils.addMonth(endDateStr, -6);
+            QueryWrapper<CtopOauthToken> tokenQueryWrapper = new QueryWrapper<>();
+            tokenQueryWrapper.eq("media_id", 2);
+            historyReportTaskService.getTaskList();
+
+        } catch (Exception e) {
+            e.printStackTrace();
+            result.setSuccess(false);
+        }
+        return "success";
+    }
+
+    @GetMapping(value = "/getGroupData")
+    public String getGroupData() {
+
+
+        Date endDate = new Date();
+        QueryWrapper<CtopOauthToken> tokenQueryWrapper = new QueryWrapper<>();
+        tokenQueryWrapper.eq("media_id", 2);
+        List<CtopOauthToken> ctopOauthTokens = tokenMapper.selectList(tokenQueryWrapper);
+        for (CtopOauthToken token : ctopOauthTokens) {
+
+
+            for (int i = 0; i < 7; i++) {
+                Date getStartDate = DateUtils.addDay(endDate, -i);
+                //3:获取广告组信息数据
+                kuaishouInterfaceService.getAdvertiserGroupReportHourly(token, getStartDate, getStartDate);
+            }
+            for (int i = 0; i < 6; i++) {
+                Date getStartDate = new Date();
+                Date getEndDate = new Date();
+                if (i == 0) {
+                    getStartDate = DateUtils.addDay(endDate, -175 + i * 30);
+                    getEndDate = DateUtils.addDay(endDate, -150 + i * 30);
+                } else {
+                    getStartDate = DateUtils.addDay(endDate, -180 + i * 30);
+                    getEndDate = DateUtils.addDay(endDate, -150 + i * 30);
+                }
+                //3:获取广告组信息数据
+                kuaishouInterfaceService.getAdvertiserGroupReportDaily(token, getStartDate, getEndDate);
+            }
+        }
+        return "Success";
+    }
+
+    static ExecutorService executorService = Executors.newFixedThreadPool(10);
+
+
+    @GetMapping(value = "/gerCreative")
+    public void gerCreative() {
+        QueryWrapper<CtopOauthToken> oauthTokenQueryWrapper = new QueryWrapper<>();
+        oauthTokenQueryWrapper.eq("media_id", 2);
+        List<CtopOauthToken> ctopOauthTokens = oauthTokenMapper.selectList(oauthTokenQueryWrapper);
+        for (CtopOauthToken token : ctopOauthTokens) {
+            executorService.submit(new Runnable() {
+                @Override
+                public void run() {
+                    try {
+                        kuaishouInterfaceService.getCreativeList(token, null, null);
+                        //  kuaishouInterfaceService.getVideoList2(token, null, null,1);
+                        //3: 获取图片信息数据
+                        // kuaishouInterfaceService.getImageList2(token, null, null,1);
+                        Thread.sleep(1 * 200);
+                        //  kuaishouInterfaceService.getAppList(token.getAccountId(), token.getAccessToken());
+                    } catch (Exception e) {
+                        e.printStackTrace();
+                    }
+                }
+            });
+        }
+
+    }
+
+    @GetMapping("checkFile")
+    public Map<String, Object> checkFile() {
+        String nowDate = DateUtils.getDate("yyyy-MM-dd");
+        String statDate = getAnotherDay("yyyy-MM-dd", nowDate, -1);
+        //  查询快手token
+        List<CtopOauthToken> tokens = tokenService.getTokenListByType(CtopAdConstant.PLATFORM_TYPE_KUAISHOU);
+        if (null == tokens || tokens.size() <= 0) {
+            log.info("定时获取快手数据异常:未获取到可用的token");
+        }
+        for (CtopOauthToken token : tokens) {
+            dailyReportTaskService.getTaskList(token.getAccountId(), token.getAccessToken(), statDate);
+        }
+        Map<String, Object> result = new HashMap<>();
+        ResultMapUtils.setResultMap(result, StatusCode.COMMON_SUCCESS);
+        return result;
+    }
+
+    @Autowired
+    private IKuaiShouDailyReportTaskService dailyReportTaskService;
+
+
+    @Autowired
+    private IKuaiShouCampaignService campaignService;
+
+
+    @GetMapping("loadBytedanceHistoryData")
+    public Map<String, Object> loadBytedanceHistoryData() {
+        Map<String, Object> result = new HashMap<>();
+        //1:查询所有头条的token数据
+        List<CtopOauthToken> tokens = tokenService.getTokenListByType(CtopAdConstant.PLATFORM_TYPE_BYTEDANCE);
+        if (null != tokens && tokens.size() > 0) {
+            tokens.forEach(token -> {
+                //拉取往期数据
+                executorService.submit(new Runnable() {
+                    @Override
+                    public void run() {
+                        reportService.loadBytedanceHistoryData(token);
+                    }
+                });
+            });
+        }
+        ResultMapUtils.setResultMap(result, StatusCode.COMMON_SUCCESS);
+        return result;
+    }
+
+
+    @Autowired
+    private IUserAllocationService userAllocationService;
+
+
+    public static void main(String[] args) throws ParseException {
+        String date = DateUtils.getDate("yyyy-MM-dd");
+        String anotherDay = DateUtils.getAnotherDay("yyyy-MM-dd", date, -1);
+    }
+
+
+    @GetMapping(value = "/getPlanAndGroupByAccount")
+    public void getPlanAndGroupByAccount(Long accountId) {
+        QueryWrapper<CtopOauthToken> oauthTokenQueryWrapper = new QueryWrapper<>();
+        oauthTokenQueryWrapper.eq("media_id", 2);
+        oauthTokenQueryWrapper.eq("account_id", accountId);
+        oauthTokenQueryWrapper.last("limit 1");
+        CtopOauthToken token = oauthTokenMapper.selectOne(oauthTokenQueryWrapper);
+        try {
+            kuaishouInterfaceService.getCampaignList(token, null, null);
+            //1:获取全量广告组数据
+            kuaishouInterfaceService.getGroupList(token, null, null);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+
+    }
+
+
+    @GetMapping(value = "/getCreativeByAccount")
+    public void gerCreative(Long accountId) {
+        QueryWrapper<CtopOauthToken> oauthTokenQueryWrapper = new QueryWrapper<>();
+        oauthTokenQueryWrapper.eq("media_id", 2);
+        oauthTokenQueryWrapper.eq("account_id", accountId);
+        oauthTokenQueryWrapper.last("limit 1");
+        CtopOauthToken token = oauthTokenMapper.selectOne(oauthTokenQueryWrapper);
+
+        try {
+            kuaishouInterfaceService.getCreativeList(token, null, null);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+
+    }
+
+
+    @Autowired
+    private IBytedancePlanDailyReportService planDailyReportService;
+    @Autowired
+    private ICtopOauthTokenService tokenService;
+
+    @GetMapping("loadBytedanceData")
+    public Map<String, Object> formatZybData(String date) {
+        Map<String, Object> result = new HashMap<>();
+        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
+        Date getDate = null;
+        try {
+            getDate = simpleDateFormat.parse(date);
+        } catch (ParseException e) {
+            e.printStackTrace();
+        }
+        //1:查询当日数据
+        QueryWrapper<UserAllocation> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("project_id", 215);
+        List<UserAllocation> allocations = userAllocationService.list(queryWrapper);
+        if (null == allocations || allocations.size() <= 0) {
+            log.info("定时获取头条数据异常:获取用户信息失败");
+        }
+        Date finalGetDate = getDate;
+
+        allocations.forEach(allocation -> {
+            //3:获取广告计划信息数据
+            CtopOauthToken token = oauthTokenMapper.selectByAccountId(allocation.getAccountId());
+            reportService.getAdvertiserPlanReport(token, finalGetDate, finalGetDate, CtopAdConstant.BYTEDANCE_REPORT_TYPE_DAILY);
+        });
+
+        //清洗关于作业帮数据
+        //1:查询作业帮相关的用户数据
+        allocations.forEach(allocation -> {
+            //根据accountId和时间,查询相关的日报表信息
+            QueryWrapper<BytedancePlanDailyReport> reportQueryWrapper = new QueryWrapper<>();
+            SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
+            String dateString = dateFormat.format(finalGetDate) + " 00:00:00";
+            queryWrapper.eq("advertiser_id", allocation.getAccountId())
+                    .eq("stat_datetime", dateString)
+            ;
+            List<BytedancePlanDailyReport> bytedancePlanDailyReports = planDailyReportService.list(reportQueryWrapper);
+            if (null != bytedancePlanDailyReports && bytedancePlanDailyReports.size() > 0) {
+                bytedancePlanDailyReports.forEach(report -> {
+                    String adName = report.getAdName();
+                    String[] tags = adName.split("-");
+                    report.setAdsense(tags[1]);
+                    report.setPlanCode(tags[2]);
+                    String materialName = tags[3];
+                    report.setMaterialName(materialName);
+                    if (materialName.contains("其他")) {
+                        report.setMaterialType("其他");
+                    } else if (materialName.contains("图片轮播")) {
+                        report.setMaterialType("图片轮播");
+                    } else if (materialName.contains("大字报")) {
+                        report.setMaterialType("大字报");
+                    } else if (materialName.contains("文字动画")) {
+                        report.setMaterialType("文字动画");
+                    } else if (materialName.contains("采访形式")) {
+                        report.setMaterialType("采访形式");
+                    } else if (materialName.contains("剧情")) {
+                        report.setMaterialType("剧情");
+                    } else if (materialName.contains("口播")) {
+                        report.setMaterialType("口播");
+                    } else {
+                        report.setMaterialType("其他");
+                    }
+                    planDailyReportService.updateById(report);
+                });
+            }
+        });
+        ResultMapUtils.setResultMap(result, StatusCode.COMMON_SUCCESS);
+        return result;
+    }
+
+    @Autowired
+    private IByteDanceAdvertiserDataService advertiserDataService;
+
+    @GetMapping("getBytedanceData")
+    public Map<String, Object> getBytedanceData() {
+        Map<String, Object> result = new HashMap<>();
+        //1:查询当日数据
+        List<CtopOauthToken> tokens = tokenService.getTokenListByType(CtopAdConstant.PLATFORM_TYPE_BYTEDANCE);
+        if (null == tokens || tokens.size() <= 0) {
+            log.info("定时获取头条数据异常:为获取到可用的token");
+        }
+        tokens.forEach(token -> {
+            advertiserDataService.getMaterialList(token);
+        });
+        ResultMapUtils.setResultMap(result, StatusCode.COMMON_SUCCESS);
+        return result;
+    }
+
+    @GetMapping("formatZybData")
+    public Map<String, Object> formatZybData() {
+        //清洗关于作业帮数据
+        //1:查询作业帮相关的用户数据
+        QueryWrapper<UserAllocation> wrapper = new QueryWrapper<>();
+        wrapper.eq("project_id", 215);
+        List<UserAllocation> allocations = userAllocationService.list(wrapper);
+        if (null != allocations && allocations.size() > 0) {
+            allocations.forEach(allocation -> {
+                //根据accountId和时间,查询相关的日报表信息
+                QueryWrapper<BytedancePlanDailyReport> queryWrapper = new QueryWrapper<>();
+                SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
+//                String dateString = dateFormat.format(getDate)+" 00:00:00";
+                queryWrapper.eq("advertiser_id", allocation.getAccountId())
+//                        .eq("stat_datetime",dateString)
+                ;
+                List<BytedancePlanDailyReport> bytedancePlanDailyReports = planDailyReportService.list(queryWrapper);
+                if (null != bytedancePlanDailyReports && bytedancePlanDailyReports.size() > 0) {
+                    bytedancePlanDailyReports.forEach(report -> {
+                        String adName = report.getAdName();
+                        String[] tags = adName.split("-");
+                        report.setAdsense(tags[1]);
+                        report.setPlanCode(tags[2]);
+                        String materialName = tags[3];
+                        report.setMaterialName(materialName);
+                        if (materialName.contains("其他")) {
+                            report.setMaterialType("其他");
+                        } else if (materialName.contains("图片轮播")) {
+                            report.setMaterialType("图片轮播");
+                        } else if (materialName.contains("大字报")) {
+                            report.setMaterialType("大字报");
+                        } else if (materialName.contains("文字动画")) {
+                            report.setMaterialType("文字动画");
+                        } else if (materialName.contains("采访形式")) {
+                            report.setMaterialType("采访形式");
+                        } else if (materialName.contains("剧情")) {
+                            report.setMaterialType("剧情");
+                        } else if (materialName.contains("口播")) {
+                            report.setMaterialType("口播");
+                        } else {
+                            report.setMaterialType("其他");
+                        }
+                        planDailyReportService.updateById(report);
+                    });
+                }
+            });
+        }
+        Map<String, Object> result = new HashMap<>();
+        ResultMapUtils.setResultMap(result, StatusCode.COMMON_SUCCESS);
+        return result;
+    }
+
+    @Autowired
+    private IReportService reportService;
+
+    @GetMapping("bytedanceHourReport")
+    public Map<String, Object> bytedanceHourReport() {
+        Map<String, Object> result = new HashMap<>();
+        log.info("头条时报数据获取开始");
+        Date getDate = new Date();
+        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("HH");
+        String hour = simpleDateFormat.format(getDate);
+        if (null != hour && "00".equals(hour)) {
+            getDate = DateUtils.addDay(getDate, -1);
+        }
+        //1:查询当日数据
+        List<CtopOauthToken> tokens = tokenService.getTokenListByType(CtopAdConstant.PLATFORM_TYPE_BYTEDANCE);
+        if (null == tokens || tokens.size() <= 0) {
+            log.info("定时获取头条小时数据异常:未获取到可用的token");
+            ResultMapUtils.setResultMap(result, StatusCode.COMMON_PARAM_ERROR);
+            return result;
+        }
+        executorService = Executors.newFixedThreadPool(4);
+        Date finalGetDate = getDate;
+        tokens.forEach(token -> {
+            executorService.submit(new Runnable() {
+                @Override
+                public void run() {
+                    reportService.getAdvertiserReport(token, finalGetDate, finalGetDate, CtopAdConstant.BYTEDANCE_REPORT_TYPE_HOURLY);
+                }
+            });
+        });
+        log.info("头条时报数据获取结束");
+        ResultMapUtils.setResultMap(result, StatusCode.COMMON_SUCCESS);
+        return result;
+    }
+
+    //线程计数器
+    static CountDownLatch countDownLatch = null;
+
+    @GetMapping("getHourLyYddData")
+    public Map<String, Object> getData() {
+        log.info("头条时报数据获取开始");
+        Date getDate = new Date();
+        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("HH");
+        String hour = simpleDateFormat.format(getDate);
+        if (null != hour && "00".equals(hour)) {
+            getDate = DateUtils.addDay(getDate, -1);
+        }
+        //1:查询当日计划时报数据
+        List<CtopOauthToken> tokens = tokenService.getTokenListByType(CtopAdConstant.PLATFORM_TYPE_BYTEDANCE);
+        Date finalGetDate = getDate;
+        executorService = Executors.newFixedThreadPool(10);
+        countDownLatch = new CountDownLatch(tokens.size());
+        tokens.forEach(token -> {
+            //1:获取当日广告计划数据
+            executorService.submit(new Runnable() {
+                @Override
+                public void run() {
+                    try {
+                        reportService.getAdvertiserPlanReport(token, finalGetDate, finalGetDate, CtopAdConstant.BYTEDANCE_REPORT_TYPE_HOURLY);
+                    } catch (Exception e) {
+                        e.printStackTrace();
+                    } finally {
+                        countDownLatch.countDown();
+                    }
+                }
+            });
+        });
+        try {
+            countDownLatch.await();
+        } catch (InterruptedException e) {
+            e.printStackTrace();
+        }
+        log.info("头条计划时报数据获取完成");
+        Map<String, Object> result = new HashMap<>();
+        ResultMapUtils.setResultMap(result, StatusCode.COMMON_SUCCESS);
+        return result;
+    }
+
+    @GetMapping("formatYzData")
+    public Map<String, Object> formatYzData() {
+        Map<String, Object> result = new HashMap<>();
+        planDailyReportService.cleanYzData(151);
+        ResultMapUtils.setResultMap(result, StatusCode.COMMON_SUCCESS);
+        return result;
+    }
+
+    @Autowired
+    private IBytedancePlanHourlyReportService planHourlyReportService;
+
+    @GetMapping("loadCreativeData")
+    public Map<String, Object> loadCreaticeData() {
+        Map<String, Object> result = new HashMap<>();
+        List<CtopOauthToken> tokens = tokenService.getTokenListByType(CtopAdConstant.PLATFORM_TYPE_BYTEDANCE);
+        log.info("头条创意素材数据开始获取");
+        //查询当日数据
+        if (null == tokens || tokens.size() <= 0) {
+            log.info("定时获取头条数据异常:wei获取到可用的token");
+            ResultMapUtils.setResultMap(result, StatusCode.COMMON_SERVER_ERROR);
+            return result;
+        }
+        executorService = Executors.newFixedThreadPool(20);
+        countDownLatch = new CountDownLatch(tokens.size());
+        tokens.forEach(token -> {
+            executorService.submit(new Runnable() {
+                @Override
+                public void run() {
+                    // 获取广告创意信息数据
+                    try {
+                        advertiserDataService.getAdvertiserCreative(token, null);
+                    } catch (Exception e) {
+                        e.printStackTrace();
+                    } finally {
+                        countDownLatch.countDown();
+                    }
+                }
+            });
+        });
+        try {
+            countDownLatch.await();
+        } catch (InterruptedException e) {
+            e.printStackTrace();
+        }
+        log.info("头条创意素材数据获取完成");
+        ResultMapUtils.setResultMap(result, StatusCode.COMMON_SUCCESS);
+        return result;
+    }
+
+    @GetMapping("loadCreaticeReportData")
+    public Map<String, Object> loadCreaticeReportData() {
+        Map<String, Object> result = new HashMap<>();
+        List<CtopOauthToken> tokens = tokenService.getTokenListByType(CtopAdConstant.PLATFORM_TYPE_BYTEDANCE);
+        for (int i = 51; i < 180; i++) {
+            Date getDate = DateUtils.addDay(new Date(), -i);
+            log.info(DateUtils.formatDate(getDate) + "头条创意日报数据开始获取");
+            //查询当日数据
+            if (null == tokens || tokens.size() <= 0) {
+                log.info("定时获取头条数据异常:为获取到可用的token");
+                continue;
+            }
+            executorService = Executors.newFixedThreadPool(10);
+            countDownLatch = new CountDownLatch(tokens.size());
+            tokens.forEach(token -> {
+                executorService.submit(new Runnable() {
+                    @Override
+                    public void run() {
+                        //获取广告创意日报信息数据
+                        try {
+                            reportService.getAdvertiserCreativeReport(token, getDate, getDate, CtopAdConstant.BYTEDANCE_REPORT_TYPE_DAILY);
+                        } catch (Exception e) {
+                            e.printStackTrace();
+                        } finally {
+                            countDownLatch.countDown();
+                        }
+                    }
+                });
+            });
+            try {
+                countDownLatch.await();
+            } catch (InterruptedException e) {
+                e.printStackTrace();
+            }
+            log.info(DateUtils.formatDate(getDate) + "头条创意日报数据获取完成");
+        }
+        ResultMapUtils.setResultMap(result, StatusCode.COMMON_SUCCESS);
+        return result;
+    }
+
+    @GetMapping("loadVideoData")
+    public Map<String, Object> loadVideoData() {
+        log.info("素材数据获取开始");
+        //1:查询当日计划时报数据
+        List<CtopOauthToken> tokens = tokenService.getTokenListByType(CtopAdConstant.PLATFORM_TYPE_BYTEDANCE);
+        executorService = Executors.newFixedThreadPool(10);
+        countDownLatch = new CountDownLatch(tokens.size());
+        tokens.forEach(token -> {
+            //1:获取当日广告计划数据
+            executorService.submit(new Runnable() {
+                @Override
+                public void run() {
+                    try {
+                        advertiserDataService.getMaterialList(token);
+                    } catch (Exception e) {
+                        e.printStackTrace();
+                    } finally {
+                        countDownLatch.countDown();
+                    }
+                }
+            });
+        });
+        try {
+            countDownLatch.await();
+        } catch (InterruptedException e) {
+            e.printStackTrace();
+        }
+        log.info("头条素材数据获取完成");
+        Map<String, Object> result = new HashMap<>();
+        ResultMapUtils.setResultMap(result, StatusCode.COMMON_SUCCESS);
+        return result;
+    }
+
+
+    @Autowired
+    private ICleanMaterialService cleanMaterialService;
+
+    @GetMapping("testReport")
+    public void testReport() {
+        List<String> signatureList = cleanMaterialService.getSignature();
+        if (Check.isNull(signatureList)) {
+            log.error("素材数据获取为空");
+            return;
+        }
+        executorService = Executors.newFixedThreadPool(5);
+        for (int i = 0; i < signatureList.size(); i++) {
+            String signature = signatureList.get(i);
+            executorService.submit(new Runnable() {
+                @Override
+                public void run() {
+                    cleanMaterialService.calculationReport(signature);
+                }
+            });
+        }
+
+
+    }
+
+    @GetMapping(value = "/AccountReportByAccount")
+    public void AccountReportByAccount(Long accountId, String startDateStr, String endDateStr) {
+        QueryWrapper<CtopOauthToken> oauthTokenQueryWrapper = new QueryWrapper<>();
+        oauthTokenQueryWrapper.eq("media_id", 2);
+        oauthTokenQueryWrapper.eq("account_id", accountId);
+        oauthTokenQueryWrapper.last("limit 1");
+        CtopOauthToken token = oauthTokenMapper.selectOne(oauthTokenQueryWrapper);
+        executorService.submit(new Runnable() {
+            @Override
+            public void run() {
+                try {
+                    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
+                    Date startDate = null;
+                    Date endDate = null;
+                    try {
+                        startDate = simpleDateFormat.parse(startDateStr);
+                        endDate = simpleDateFormat.parse(endDateStr);
+                    } catch (ParseException e) {
+                        e.printStackTrace();
+                    }
+                    kuaishouInterfaceService.getAdvertiserReportDaily(token, startDate, endDate);
+
+                    Thread.sleep(1 * 200);
+                    //  kuaishouInterfaceService.getAppList(token.getAccountId(), token.getAccessToken());
+                } catch (Exception e) {
+                    e.printStackTrace();
+                }
+            }
+        });
+    }
+
+
+    @GetMapping(value = "/getAllCreativeList")
+    public void getAllCreativeList() {
+
+        try {
+
+
+            QueryWrapper<CtopOauthToken> oauthTokenQueryWrapper = new QueryWrapper<>();
+            oauthTokenQueryWrapper.eq("media_id", 2);
+            List<CtopOauthToken> ctopOauthTokens = oauthTokenMapper.selectList(oauthTokenQueryWrapper);
+
+            if (!Check.isNull(ctopOauthTokens)) {
+                for (CtopOauthToken token : ctopOauthTokens) {
+                    executorService.submit(new Runnable() {
+                        @Override
+                        public void run() {
+                            if (!Check.isNull(token)) {
+                                log.info("获取创意,账号id:{}", token.getAccountId());
+                                kuaishouInterfaceService.getCreativeList(token, null, null);
+                            }
+                        }
+                    });
+
+                }
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+    }
+
+
+    @GetMapping(value = "/getAllGroupList")
+    public void getAllGroupList() {
+
+        try {
+
+            QueryWrapper<CtopOauthToken> oauthTokenQueryWrapper = new QueryWrapper<>();
+            oauthTokenQueryWrapper.eq("media_id", 2);
+            List<CtopOauthToken> ctopOauthTokens = oauthTokenMapper.selectList(oauthTokenQueryWrapper);
+            if (!Check.isNull(ctopOauthTokens)) {
+                for (CtopOauthToken token : ctopOauthTokens) {
+                    executorService.submit(new Runnable() {
+                        @Override
+                        public void run() {
+                            if (!Check.isNull(token)) {
+                                log.info("获取组,账号id:{}", token.getAccountId());
+                                kuaishouInterfaceService.getGroupList(token, null, null);
+                            }
+                        }
+                    });
+                }
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+    }
+
+    @GetMapping(value = "/KuaishouDailyAccountReportLoadJob")
+    public void KuaishouDailyAccountReportLoadJob() {
+        Date getDate = DateUtils.addDay(new Date(), -2);
+        //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, getDate, getDate);
+                }
+            });
+        });
+    }
+
+
+}

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

@@ -0,0 +1,45 @@
+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.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;
+import org.springframework.beans.factory.annotation.Autowired;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 头条素材报表按天跑前一天的数据任务
+ *
+ * @author sunzhen
+ */
+@Slf4j
+public class BytedanceDailyAccountReportAsyncJob implements Job {
+    @Autowired
+    private ICtopOauthTokenService tokenService;
+    @Autowired
+    private IBytedanceReportService bytedanceReportService;
+
+    @Override
+    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
+
+        Date getDate = DateUtils.addDay(new Date(), -1);
+        String date = DateUtils.formatDate(getDate);
+        log.info("头条异步广告主报表执行开始。跑的是:" + date + "的数据");
+        List<CtopOauthToken> tokens = tokenService.selectToutiaoToken();
+        if (null == tokens || tokens.size() <= 0) {
+            log.info("头条获取异步报表数据任务执行失败:未获取到可用的token");
+            return;
+        }
+
+        for (CtopOauthToken token : tokens) {
+            bytedanceReportService.bytedanceAsyncTaskCreate(date, date, token, 2);  //1.创意 2.广告主 3.广告主 4.广告计划
+        }
+
+    }
+}

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

@@ -0,0 +1,45 @@
+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.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;
+import org.springframework.beans.factory.annotation.Autowired;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 头条素材报表按天跑前一天的数据任务
+ *
+ * @author sunzhen
+ */
+@Slf4j
+public class BytedanceDailyCampaignReportAsyncJob implements Job {
+    @Autowired
+    private ICtopOauthTokenService tokenService;
+    @Autowired
+    private IBytedanceReportService bytedanceReportService;
+
+    @Override
+    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
+
+        Date getDate = DateUtils.addDay(new Date(), -1);
+        String date = DateUtils.formatDate(getDate);
+        log.info("头条异步广告组报表数据执行开始,跑的是" + date + "的数据");
+        List<CtopOauthToken> tokens = tokenService.selectToutiaoToken();
+        if (null == tokens || tokens.size() <= 0) {
+            log.info("头条获取异步报表数据任务执行失败:未获取到可用的token");
+            return;
+        }
+
+        for (CtopOauthToken token : tokens) {
+            bytedanceReportService.bytedanceAsyncTaskCreate(date, date, token, 3);  //1.创意 2.广告主 3.广告组 4.广告计划
+        }
+
+    }
+}

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

@@ -0,0 +1,46 @@
+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.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;
+import org.springframework.beans.factory.annotation.Autowired;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 头条素材报表按天跑前一天的数据任务
+ *
+ * @author sunzhen
+ */
+@Slf4j
+public class BytedanceDailyCreativeReportAsyncJob implements Job {
+    @Autowired
+    private ICtopOauthTokenService tokenService;
+    @Autowired
+    private IBytedanceReportService bytedanceReportService;
+
+    @Override
+    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
+
+        Date getDate = DateUtils.addDay(new Date(), -1);
+        String date = DateUtils.formatDate(getDate);
+        log.info("头条创意报表异步任务执行开始.跑的是" + date + "的数据");
+        List<CtopOauthToken> tokens = tokenService.selectToutiaoToken();
+        if (null == tokens || tokens.size() <= 0) {
+            log.info("头条获取异步报表数据任务执行失败:未获取到可用的token");
+            return;
+        }
+
+        for (CtopOauthToken token : tokens) {
+            //1.创意 2.广告主 3.广告主 4.广告计划
+            bytedanceReportService.bytedanceAsyncTaskCreate(date, date, token, 1);
+        }
+
+    }
+}

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

@@ -0,0 +1,59 @@
+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.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;
+import org.springframework.beans.factory.annotation.Autowired;
+
+import java.util.Date;
+import java.util.List;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+
+/**
+ * 头条素材报表按天跑前一天的数据任务
+ *
+ * @author sunzhen
+ */
+@Slf4j
+public class BytedanceDailyMaterialReportJob implements Job {
+    @Autowired
+    private ICtopOauthTokenService tokenService;
+    @Autowired
+    private IBytedanceReportService bytedanceReportService;
+
+    @Override
+    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
+        Date getDate = DateUtils.addDay(new Date(), -1);
+        String date = DateUtils.formatDate(getDate);
+        log.info("头条获取素材报表数据任务开始,任务时间:" + date);
+
+        List<CtopOauthToken> tokens = tokenService.selectToutiaoToken();
+        if (null == tokens || tokens.size() <= 0) {
+            log.info("头条获取素材报表数据任务执行失败:未获取到可用的token");
+            return;
+        }
+
+        final ExecutorService executorService = Executors.newFixedThreadPool(3);
+        tokens.forEach(token -> {
+            executorService.submit(new Runnable() {
+                @Override
+                public void run() {
+                    try {
+                        //获取头条素材报表数据
+                        bytedanceReportService.bytedanceMaterialReport(token, date, date);
+                    } catch (Exception e) {
+                        e.printStackTrace();
+                    } finally {
+                    }
+                }
+            });
+        });
+
+    }
+}

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

@@ -0,0 +1,52 @@
+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.IBytedanceReportService;
+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.ExecutorService;
+import java.util.concurrent.Executors;
+
+/**
+ * 头条素材报表错误重试定时任务
+ *
+ * @author sunzhen
+ */
+@Slf4j
+public class BytedanceDailyMaterialReportRetryJob implements Job {
+    @Autowired
+    private ICtopOauthTokenService tokenService;
+    @Autowired
+    private IBytedanceReportService bytedanceReportService;
+
+    @Override
+    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
+        log.info("头条素材报表重试定时任务开始");
+        List<BytedanceReportMaterialRetry> retryList = bytedanceReportService.getRetryList();
+        //
+        //多线程
+        final ExecutorService executorService = Executors.newFixedThreadPool(3);
+        retryList.forEach(retry -> {
+            executorService.submit(new Runnable() {
+                @Override
+                public void run() {
+                    try {
+                        CtopOauthToken token = tokenService.getOauthTokenByAccountId(String.valueOf(retry.getAccountId()));
+                        log.info("头条素材报表重试定时任务,当前accountId为:" + token.getAccountId());
+                        bytedanceReportService.bytedanceMaterialReportRetry(token, retry.getStartDate(), retry.getEndDate());
+                    } catch (Exception e) {
+                        e.printStackTrace();
+                    } finally {
+                    }
+                }
+            });
+        });
+    }
+}

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

@@ -0,0 +1,46 @@
+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.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;
+import org.springframework.beans.factory.annotation.Autowired;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 头条素材报表按天跑前一天的数据任务
+ *
+ * @author sunzhen
+ */
+@Slf4j
+public class BytedanceDailyPlanReportAsyncJob implements Job {
+    @Autowired
+    private ICtopOauthTokenService tokenService;
+    @Autowired
+    private IBytedanceReportService bytedanceReportService;
+
+    @Override
+    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
+
+        Date getDate = DateUtils.addDay(new Date(), -1);
+        String date = DateUtils.formatDate(getDate);
+        log.info("头条广告计划异步任务开始执行,跑的是" + date + "的数据");
+
+        List<CtopOauthToken> tokens = tokenService.selectToutiaoToken();
+        if (null == tokens || tokens.size() <= 0) {
+            log.info("头条获取异步报表数据任务执行失败:未获取到可用的token");
+            return;
+        }
+
+        for (CtopOauthToken token : tokens) {
+            bytedanceReportService.bytedanceAsyncTaskCreate(date, date, token, 4);  //1.创意 2.广告主 3.广告组 4.广告计划
+        }
+
+    }
+}

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

@@ -0,0 +1,33 @@
+package org.jeecg.modules.ctop.job;
+
+import cn.com.ctop.toutiao.modules.report.service.IBytedanceReportService;
+import lombok.extern.slf4j.Slf4j;
+import org.quartz.Job;
+import org.quartz.JobExecutionContext;
+import org.quartz.JobExecutionException;
+import org.springframework.beans.factory.annotation.Autowired;
+
+/**
+ * 头条素材报表按天跑前一天的数据任务
+ *
+ * @author sunzhen
+ */
+@Slf4j
+public class BytedanceDailyReportAsyncTaskGetJob implements Job {
+    @Autowired
+    private IBytedanceReportService bytedanceReportService;
+
+    @Override
+    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
+        try {
+            log.info("头条获取素材报表数据定时任务执行开始");
+            Long starttime = System.currentTimeMillis();
+            bytedanceReportService.bytedanceAsyncTaskGet();
+            Long endtime = System.currentTimeMillis();
+            log.info("头条异步报表数据定时任务执行结束,执行耗时:{}秒", (endtime - starttime) / 1000);
+        } catch (Exception e) {
+            log.error("头条获取异步报表数据定时任务执行报错");
+            e.printStackTrace();
+        }
+    }
+}

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

@@ -0,0 +1,60 @@
+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.kuaishou.modules.batch.service.IKuaishouInterfaceService;
+import lombok.extern.slf4j.Slf4j;
+import org.jeecg.common.util.DateUtils;
+import org.quartz.Job;
+import org.quartz.JobExecutionContext;
+import org.quartz.JobExecutionException;
+import org.springframework.beans.factory.annotation.Autowired;
+
+import java.util.Date;
+import java.util.List;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+
+/**
+ * 快手广告主次留数据--凌晨跑两天前的次留,统一跑起来
+ *
+ * @author sunzhen
+ */
+@Slf4j
+public class KuaishouDailyAccountReportNextDayStayJob implements Job {
+    @Autowired
+    private ICtopOauthTokenService tokenService;
+    @Autowired
+    private IKuaishouInterfaceService kuaishouInterfaceService;
+    static ExecutorService executorService = null;
+
+    @Override
+    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
+        log.info("快手次留率定时任务开始");
+        Thread thread = new Thread() {
+            @Override
+            public void run() {
+                Date getDate = DateUtils.addDay(new Date(), -2);
+                //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, getDate, getDate);
+                        }
+                    });
+                });
+            }
+        };
+        thread.start();
+
+    }
+}

+ 7 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/service/IKuaiShouUploadService.java

@@ -0,0 +1,7 @@
+package org.jeecg.modules.ctop.service;
+
+import cn.com.ctop.common.module.entity.MaterialInfo;
+
+public interface IKuaiShouUploadService {
+    void upload(MaterialInfo materialInfo);
+}

+ 197 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/service/impl/KuaiShouUploadServiceImpl.java

@@ -0,0 +1,197 @@
+package org.jeecg.modules.ctop.service.impl;
+
+import cn.com.ctop.common.module.entity.CtopOauthToken;
+import cn.com.ctop.common.module.entity.MaterialInfo;
+import cn.com.ctop.common.module.entity.MaterialParameter;
+import cn.com.ctop.common.module.entity.UserAllocation;
+import cn.com.ctop.common.module.enums.MaterialEnum;
+import cn.com.ctop.common.module.mapper.CtopOauthTokenMapper;
+import cn.com.ctop.common.module.mapper.MaterialParameterMapper;
+import cn.com.ctop.common.module.service.IUserAllocationService;
+import cn.com.ctop.common.module.utils.Check;
+import cn.com.ctop.common.module.utils.KuaishouInterfaceConstant;
+import cn.com.ctop.common.module.utils.LoadFileUtil;
+import cn.com.ctop.common.module.utils.PropertiesUtils;
+import cn.com.ctop.kuaishou.modules.batch.entity.KuaiShouVideoGet;
+import cn.com.ctop.kuaishou.modules.batch.service.IKuaiShouVideoGetService;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.http.ParseException;
+import org.jeecg.modules.ctop.service.IKuaiShouUploadService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.core.io.FileSystemResource;
+import org.springframework.http.HttpEntity;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpMethod;
+import org.springframework.http.ResponseEntity;
+import org.springframework.stereotype.Service;
+import org.springframework.util.LinkedMultiValueMap;
+import org.springframework.util.MultiValueMap;
+import org.springframework.web.client.RestTemplate;
+
+import java.io.File;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+
+@Slf4j
+@Service
+public class KuaiShouUploadServiceImpl implements IKuaiShouUploadService {
+    private static ExecutorService executorService = Executors.newFixedThreadPool(6);
+
+    @Value("${oss.replace.replace-value}")
+    private String replaceValue;
+    @Value("${oss.replace.replace-old-value}")
+    private String replaceOldValue;
+    @Value("${oss.replace.download}")
+    private String downloadUrl;
+
+
+    @Autowired
+    private IUserAllocationService allocationService;
+    @Autowired
+    private CtopOauthTokenMapper oauthTokenMapper;
+    @Autowired
+    private MaterialParameterMapper parameterMapper;
+    @Autowired
+    private IKuaiShouVideoGetService kuaiShouVideoGetService;
+
+    @Override
+    public void upload(MaterialInfo materialInfo) {
+        try {
+            String url = materialInfo.getUrl().replace(replaceOldValue, replaceValue);
+            log.info("replaceUrl:{}", url);
+            String localUrl = LoadFileUtil.downLoadFromUrl(url, downloadUrl);
+            FileSystemResource resource = new FileSystemResource(new File(localUrl));
+            Map<String, String> headerMap = new HashMap<>();
+            headerMap.put("Content-Type", "multipart/form-data");
+            JSONObject requestJson = new JSONObject();
+            requestJson.put("file", resource);
+            requestJson.put("signature", materialInfo.getCode());
+
+            QueryWrapper<MaterialParameter> parameterQueryWrapper = new QueryWrapper<>();
+            parameterQueryWrapper.eq("material_id", materialInfo.getCode());
+            parameterQueryWrapper.last("limit 1");
+            Integer type = null;
+            MaterialParameter materialParameter = parameterMapper.selectOne(parameterQueryWrapper);
+            if (!Check.isNull(materialParameter)) {
+                String width = materialParameter.getWidth();
+                String height = materialParameter.getHeight();
+                type = MaterialEnum.getTypeBySize(Integer.valueOf(width), Integer.valueOf(height));
+                if (!Check.isNull(type)) {
+                    requestJson.put("type", type);
+                }
+            }
+
+            QueryWrapper<UserAllocation> allocationQueryWrapper = new QueryWrapper<>();
+            allocationQueryWrapper.eq("project_id", materialInfo.getProjectId());
+            allocationQueryWrapper.eq("account_status", 0);
+            List<UserAllocation> list = allocationService.list(allocationQueryWrapper);
+            if (!Check.isNull(list)) {
+                for (UserAllocation allocation : list) {
+                    Long accountId = allocation.getAccountId();
+                    QueryWrapper<CtopOauthToken> tokenQueryWrapper = new QueryWrapper<>();
+                    tokenQueryWrapper.eq("account_id", accountId);
+                    tokenQueryWrapper.eq("media_id", 2);
+                    tokenQueryWrapper.orderByDesc("create_time");
+                    tokenQueryWrapper.last("limit 1");
+                    CtopOauthToken ctopOauthToken = oauthTokenMapper.selectOne(tokenQueryWrapper);
+                    if (Check.isNull(ctopOauthToken)) {
+                        log.error("快手账户信息为空,accountId:{}", accountId);
+                        continue;
+                    }
+
+                    QueryWrapper<KuaiShouVideoGet> videoGetQueryWrapper = new QueryWrapper<>();
+                    videoGetQueryWrapper.eq("account_id", accountId);
+                    videoGetQueryWrapper.eq("signature", materialInfo.getCode());
+                    videoGetQueryWrapper.last("limit 1");
+                    KuaiShouVideoGet checkVideoGet = kuaiShouVideoGetService.getOne(videoGetQueryWrapper);
+                    if (!Check.isNull(checkVideoGet)) {
+                        log.info("此素材已同步,accountId:{},code:{}", accountId, materialInfo.getCode());
+                        continue;
+                    }
+                    requestJson.put("advertiser_id", accountId);
+                    headerMap.put("Access-Token", ctopOauthToken.getAccessToken());
+                    Integer finalType = type;
+                    executorService.submit(new Runnable() {
+                        @Override
+                        public void run() {
+                            try {
+                                log.info("快手素材自动同步,accountId:{},code:{}", accountId, materialInfo.getCode());
+                                String url = PropertiesUtils.getConfig("kuaishou_api_url") + KuaishouInterfaceConstant.VIDEO_UPLOAD;
+                                String result = exceptInfoForRestTemplate(url, requestJson, headerMap);
+                                JSONObject resultJson = JSONObject.parseObject(result);
+                                if (!Check.isNull(resultJson)) {
+                                    if (resultJson.getInteger("code") == 0) {
+                                        JSONObject dataJson = resultJson.getJSONObject("data");
+                                        if (!Check.isNull(dataJson)) {
+                                            String photoId = dataJson.getString("photo_id");
+                                            String signature = dataJson.getString("signature");
+                                            KuaiShouVideoGet videoGet = new KuaiShouVideoGet();
+                                            videoGet.setAccountId(accountId);
+                                            videoGet.setId(accountId + photoId);
+                                            videoGet.setUrl(materialInfo.getUrl());
+
+
+                                            videoGet.setMaterialType(finalType);
+                                            videoGet.setPhotoId(photoId);
+                                            videoGet.setSignature(signature);
+                                            kuaiShouVideoGetService.saveOrUpdate(videoGet);
+                                        }
+                                        log.info("快手素材同步完成,accountId:{},code:{},返回信息:{}", accountId, materialInfo.getCode(), resultJson);
+                                    } else {
+                                        log.error("快手同步素材失败,返回信息:{},请求参数:{}", resultJson, requestJson);
+                                    }
+                                } else {
+                                    log.error("快手自动同步素材返回信息为空,accountId:{}", accountId);
+                                }
+
+                            } catch (Exception e) {
+                                e.printStackTrace();
+                            }
+                        }
+                    });
+                }
+            }
+
+            /*boolean isTrue = LoadFileUtil.delFile(localUrl);
+            if (isTrue) {
+                log.info("删除本地缓存素材成功,code:{}", materialInfo.getCode());
+            }*/
+
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    @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<>();
+            if (!Check.isNullMap(paramMap)) {
+                for (String key : paramMap.keySet()) {
+                    param.add(key, paramMap.get(key));
+                }
+                HttpHeaders headers = new HttpHeaders();
+                if (!Check.isNullMap(headerMap)) {
+                    for (String key : headerMap.keySet()) {
+                        headers.add(key, headerMap.get(key));
+                    }
+                }
+                HttpEntity<MultiValueMap<String, Object>> httpEntity = new HttpEntity<MultiValueMap<String, Object>>(param, headers);
+                ResponseEntity<String> responseEntity = rest.exchange(url, HttpMethod.POST, httpEntity, String.class);
+                return responseEntity.getBody();
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+}

+ 2 - 13
jeecg-boot-module-system/src/main/java/org/jeecg/modules/fileupload/controller/FileController.java

@@ -37,14 +37,12 @@ public class FileController {
     }
 
 
-
     @RequestMapping("file/imageCheck")
-    public Map<String, Object> imageCheck(String code, Long projectId) {
-        return materialImageInfoService.checkMaterialInfo(code, projectId);
+    public Map<String, Object> imageCheck(String code, String videoId) {
+        return materialImageInfoService.checkMaterialInfo(code, videoId);
     }
 
 
-
     @PostMapping("/insertV2")
     public Map<String, Object> insertV2(@RequestBody JSONObject json) {
         LoginUser user = (LoginUser) SecurityUtils.getSubject()
@@ -55,8 +53,6 @@ public class FileController {
     }
 
 
-
-
     @PostMapping("/insertImage")
     public Map<String, Object> insertImage(@RequestBody JSONObject json) {
         LoginUser user = (LoginUser) SecurityUtils.getSubject()
@@ -67,9 +63,6 @@ public class FileController {
     }
 
 
-
-
-
     @PostMapping("file/insert")
     public Map<String, Object> insertFile(@RequestBody JSONObject json) {
         LoginUser user = (LoginUser) SecurityUtils.getSubject()
@@ -106,10 +99,6 @@ public class FileController {
             ResultMapUtils.setResultMap(resultMap, StatusCode.MATERIAL_UPLOAD_FAIL.getCode());
             e.printStackTrace();
         }
-
-
         return resultMap;
     }
-
-
 }

+ 8 - 0
module-common/pom.xml

@@ -58,7 +58,15 @@
             <version>2.0</version>
         </dependency>
 
+        <dependency>
+            <groupId>com.twelvemonkeys.imageio</groupId>
+            <artifactId>imageio-jpeg</artifactId>
+            <version>3.3.2</version>
+        </dependency>
+
     </dependencies>
+
+
     <build>
         <resources>
             <resource>

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

@@ -82,12 +82,6 @@ public class MaterialImageInfo {
     @ApiModelProperty(value = "素材描述")
     private Object materialDescribe;
     /**
-     * 项目id
-     */
-    @Excel(name = "项目id", width = 15)
-    @ApiModelProperty(value = "项目id")
-    private Long projectId;
-    /**
      * 拒绝原因
      */
     @Excel(name = "拒绝原因", width = 15)
@@ -142,4 +136,7 @@ public class MaterialImageInfo {
     @TableField(exist = false)
     private String auditorName;
 
+    @TableField(exist = false)
+    private String userName;
+
 }

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

@@ -3,6 +3,8 @@ package cn.com.ctop.common.module.mapper;
 import cn.com.ctop.common.module.entity.MaterialImageInfo;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 
+import java.util.List;
+
 /**
  * 素材
  *
@@ -13,4 +15,5 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 public interface MaterialImageInfoMapper extends BaseMapper<MaterialImageInfo> {
     void insertSelective(MaterialImageInfo materialImageInfo);
 
+    List<String> getCodeList();
 }

+ 5 - 1
module-common/src/main/java/cn/com/ctop/common/module/mapper/MaterialInfoMapper.java

@@ -21,6 +21,8 @@ public interface MaterialInfoMapper extends BaseMapper<MaterialInfo> {
 
     Integer selectCountByMap(Map<String, Object> requestMap);
 
+    String getRoleCodeByUserId(@Param("userId") String userId);
+
     Integer getKuaishouUpVideoCount(@Param("code") String code);
 
     Integer getToutiaoUpVideoCount(@Param("code") String code);
@@ -29,5 +31,7 @@ public interface MaterialInfoMapper extends BaseMapper<MaterialInfo> {
 
     List<String> getEffiSignature();
 
-    MaterialInfo getMaterialInfoByCode(@Param("code")String code);
+    MaterialInfo getMaterialInfoByCode(@Param("code") String code);
+
+    Long getProjectIdByAccountId(@Param("accountId") Long accountId);
 }

+ 2 - 4
module-common/src/main/java/cn/com/ctop/common/module/mapper/xml/MaterialAscriptionMapper.xml

@@ -4,7 +4,7 @@
 
     <select id="selectByMaterialId" resultType="com.alibaba.fastjson.JSONObject">
 
-select
+    select
       (case
         when clip_id != ""
         then (select realname from sys_user where id = clip_id)
@@ -13,8 +13,6 @@ select
         ) clipName, -- 剪辑人姓名
 
         clip_id clipId,
-
-
         (case
         when shot_id != ""
         then (select realname from sys_user where id = shot_id)
@@ -45,4 +43,4 @@ select
 
     </select>
 
-</mapper>
+</mapper>

+ 45 - 44
module-common/src/main/java/cn/com/ctop/common/module/mapper/xml/MaterialImageInfoMapper.xml

@@ -2,121 +2,122 @@
 <!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.MaterialImageInfoMapper">
 
-    <insert id="insertSelective" parameterType="cn.com.ctop.common.module.entity.MaterialImageInfo" >
+    <insert id="insertSelective" parameterType="cn.com.ctop.common.module.entity.MaterialImageInfo">
         replace into ctop_material_image_info
-        <trim prefix="(" suffix=")" suffixOverrides="," >
-            <if test="id != null" >
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="id != null">
                 id,
             </if>
-            <if test="code != null" >
+            <if test="code != null">
                 code,
             </if>
-            <if test="videoId != null" >
+            <if test="videoId != null">
                 video_id,
             </if>
-            <if test="materialName != null" >
+            <if test="materialName != null">
                 material_name,
             </if>
-            <if test="userId != null" >
+            <if test="userId != null">
                 user_id,
             </if>
-            <if test="auditorId != null" >
+            <if test="auditorId != null">
                 auditor_id,
             </if>
-            <if test="status != null" >
+            <if test="status != null">
                 status,
             </if>
-            <if test="projectId != null" >
-                project_id,
-            </if>
-            <if test="width != null" >
+
+            <if test="width != null">
                 width,
             </if>
-            <if test="type != null" >
+            <if test="type != null">
                 type,
             </if>
-            <if test="height != null" >
+            <if test="height != null">
                 height,
             </if>
-            <if test="size != null" >
+            <if test="size != null">
                 size,
             </if>
-            <if test="createTime != null" >
+            <if test="createTime != null">
                 create_time,
             </if>
-            <if test="updateTime != null" >
+            <if test="updateTime != null">
                 update_time,
             </if>
-            <if test="url != null" >
+            <if test="url != null">
                 url,
             </if>
-            <if test="materialDescribe != null" >
+            <if test="materialDescribe != null">
                 material_describe,
             </if>
-            <if test="refuseReason != null" >
+            <if test="refuseReason != null">
                 refuse_reason,
             </if>
-            <if test="refuseFile != null" >
+            <if test="refuseFile != null">
                 refuse_file,
             </if>
         </trim>
-        <trim prefix="values (" suffix=")" suffixOverrides="," >
-            <if test="id != null" >
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="id != null">
                 #{id,jdbcType=VARCHAR},
             </if>
-            <if test="code != null" >
+            <if test="code != null">
                 #{code,jdbcType=VARCHAR},
             </if>
-            <if test="videoId != null" >
+            <if test="videoId != null">
                 #{videoId,jdbcType=VARCHAR},
             </if>
-            <if test="materialName != null" >
+            <if test="materialName != null">
                 #{materialName,jdbcType=VARCHAR},
             </if>
-            <if test="userId != null" >
+            <if test="userId != null">
                 #{userId,jdbcType=VARCHAR},
             </if>
-            <if test="auditorId != null" >
+            <if test="auditorId != null">
                 #{auditorId,jdbcType=VARCHAR},
             </if>
-            <if test="status != null" >
+            <if test="status != null">
                 #{status,jdbcType=INTEGER},
             </if>
-            <if test="projectId != null" >
-                #{projectId,jdbcType=BIGINT},
-            </if>
-            <if test="width != null" >
+
+            <if test="width != null">
                 #{width,jdbcType=VARCHAR},
             </if>
-            <if test="type != null" >
+            <if test="type != null">
                 #{type,jdbcType=VARCHAR},
             </if>
-            <if test="height != null" >
+            <if test="height != null">
                 #{height,jdbcType=VARCHAR},
             </if>
-            <if test="size != null" >
+            <if test="size != null">
                 #{size,jdbcType=VARCHAR},
             </if>
-            <if test="createTime != null" >
+            <if test="createTime != null">
                 #{createTime,jdbcType=TIMESTAMP},
             </if>
-            <if test="updateTime != null" >
+            <if test="updateTime != null">
                 #{updateTime,jdbcType=TIMESTAMP},
             </if>
-            <if test="url != null" >
+            <if test="url != null">
                 #{url},
             </if>
-            <if test="materialDescribe != null" >
+            <if test="materialDescribe != null">
                 #{materialDescribe},
             </if>
-            <if test="refuseReason != null" >
+            <if test="refuseReason != null">
                 #{refuseReason},
             </if>
-            <if test="refuseFile != null" >
+            <if test="refuseFile != null">
                 #{refuseFile},
             </if>
         </trim>
     </insert>
 
 
-</mapper>
+    <select id="getCodeList" resultType="java.lang.String">
+
+     SELECT DISTINCT(code)  from  ctop_material_image_info
+    </select>
+
+</mapper>

+ 27 - 14
module-common/src/main/java/cn/com/ctop/common/module/mapper/xml/MaterialInfoMapper.xml

@@ -2,6 +2,16 @@
 <!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.MaterialInfoMapper">
 
+
+    <select id="getProjectIdByAccountId" resultType="java.lang.Long">
+
+       select
+       project_id
+       from ctop_user_allocation
+       where  account_id = #{accountId}
+
+    </select>
+
     <select id="selectUserNameById" resultType="java.lang.String">
    select realname from  sys_user where  id = #{auditorId}
     </select>
@@ -23,6 +33,23 @@
 
     </select>
 
+    <select id="getRoleCodeByUserId" resultType="java.lang.String">
+   SELECT
+    role_code
+    FROM
+    sys_role
+    WHERE
+    id = (
+    SELECT
+    t2.role_id
+    FROM
+    sys_user t1
+    LEFT JOIN sys_user_role t2 ON t1.id = t2.user_id
+    WHERE
+    t1.id = #{userId,jdbcType=VARCHAR}
+    )
+    </select>
+
     <select id="getKuaishouUpVideoCount" resultType="java.lang.Integer">
         select
         count(1)
@@ -78,20 +105,6 @@
 
     </select>
 
-    <!--TODO -->
-    <select id="getEffiSignatureCount" resultType="integer">
-        select
-        count(1)
-        from
-            (
-            select
-            efficient_video_signature
-            from ctop_user_efficient_video_map
-            where company_id is not null
-            group by efficient_video_signature
-            ) a
-    </select>
-
     <select id="getMaterialInfoByCode" resultType="cn.com.ctop.common.module.entity.MaterialInfo">
             select
             id,

+ 4 - 1
module-common/src/main/java/cn/com/ctop/common/module/service/IMaterialImageInfoService.java

@@ -4,6 +4,7 @@ import cn.com.ctop.common.module.entity.MaterialImageInfo;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.extension.service.IService;
 
+import java.util.List;
 import java.util.Map;
 
 /**
@@ -20,7 +21,9 @@ public interface IMaterialImageInfoService extends IService<MaterialImageInfo> {
      */
     void insertImage(JSONObject imageJson);
 
-    Map<String, Object> checkMaterialInfo(String code, Long projectId);
+    Map<String, Object> checkMaterialInfo(String code, String videoId);
 
 
+    List<String> getCodeList();
+
 }

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

@@ -28,6 +28,8 @@ public interface IMaterialInfoService extends IService<MaterialInfo> {
 
     JSONObject report(String userId);
 
+    String getRoleCodeByUserId(String userId);
+
     void watermarkVideo(String materialId, Integer videoWatermarkTemplateId, String userId);
 
     void getFile(MaterialInfo materialInfo);
@@ -61,4 +63,5 @@ public interface IMaterialInfoService extends IService<MaterialInfo> {
     List<MaterialInfo> effiMaterialInfo();
 
     List<String> getEffiCode();
+
 }

+ 10 - 9
module-common/src/main/java/cn/com/ctop/common/module/service/impl/BindAccountAuthServiceImpl.java

@@ -8,12 +8,11 @@ import cn.com.ctop.common.module.utils.KuaishouInterfaceConstant;
 import cn.com.ctop.common.module.utils.PropertiesUtils;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
-import javax.annotation.Resource;
 import java.io.UnsupportedEncodingException;
 import java.net.URLEncoder;
-import java.nio.charset.StandardCharsets;
 import java.util.Date;
 import java.util.HashMap;
 import java.util.Map;
@@ -28,7 +27,7 @@ import java.util.Map;
 @Service
 public class BindAccountAuthServiceImpl extends ServiceImpl<BindAccountAuthMapper, BindAccountAuth> implements IBindAccountAuthService {
 
-    @Resource
+    @Autowired
     private BindAccountAuthMapper bindAccountAuthMapper;
 
     /**
@@ -58,14 +57,14 @@ public class BindAccountAuthServiceImpl extends ServiceImpl<BindAccountAuthMappe
 
     @Override
     public String getKuaishouCodeUrl(String state, Integer agentType) throws UnsupportedEncodingException {
-        StringBuilder sb = new StringBuilder();
+        StringBuffer sb = new StringBuffer();
         if (agentType == 1) {
             sb.append(PropertiesUtils.getValue("kuaishou_config", "kuaishou_auth_url"))
                     .append(KuaishouInterfaceConstant.AUTH_PATH)
                     .append("?app_id=" + PropertiesUtils.getValue("kuaishou_config", "kuaishou_appid"))
                     .append("&state=" + URLEncoder.encode(URLEncoder.encode(state)))
                     .append("&scope=%5B%22report_service%22%2C%22ad_query%22%2C%22account_service%22%2C%22ad_manage%22%5D")
-                    .append("&redirect_uri=" + URLEncoder.encode(PropertiesUtils.getValue("kuaishou_config", "kuaishou_callback_url"), StandardCharsets.UTF_8.toString()));
+                    .append("&redirect_uri=" + URLEncoder.encode(PropertiesUtils.getValue("kuaishou_config", "kuaishou_callback_url"), "UTF-8"));
         } else if (agentType == 0) {
 
             // &scope=%5B%22ad_query%22%2C%22ad_manage%22%5D&
@@ -74,8 +73,8 @@ public class BindAccountAuthServiceImpl extends ServiceImpl<BindAccountAuthMappe
                     .append(KuaishouInterfaceConstant.AUTH_PATH)
                     .append("?app_id=" + PropertiesUtils.getValue("kuaishou_config", "kuaishou_third_appid"))
                     .append("&state=" + URLEncoder.encode(URLEncoder.encode(state)))
-                    .append("&scope=%5B%22ad_query%22%2C%22ad_manage%22%5D&")
-                    .append("&redirect_uri=" + URLEncoder.encode(PropertiesUtils.getValue("kuaishou_config", "kuaishou_callback_url"), StandardCharsets.UTF_8.toString()));
+                    .append("&scope=%5B%22report_service%22%2C%22ad_query%22%2C%22account_service%22%2C%22ad_manage%22%5D")
+                    .append("&redirect_uri=" + URLEncoder.encode(PropertiesUtils.getValue("kuaishou_config", "kuaishou_callback_url"), "UTF-8"));
         }
 
         return sb.toString();
@@ -83,12 +82,14 @@ public class BindAccountAuthServiceImpl extends ServiceImpl<BindAccountAuthMappe
 
     @Override
     public String getByteDanceCodeUrl(String state) throws UnsupportedEncodingException {
-        StringBuilder sb = new StringBuilder();
+        StringBuffer sb = new StringBuffer();
+
+
         sb.append(PropertiesUtils.getValue("bytedance_config", "bytedance_auth_url"))
                 .append(BytedanceInterfaceConstant.AUTH_PATH)
                 .append("?app_id=" + PropertiesUtils.getValue("bytedance_config", "bytedance_appid"))
                 .append("&state=" + URLEncoder.encode(state))
-                .append("&redirect_uri=" + URLEncoder.encode(PropertiesUtils.getValue("bytedance_config", "bytedance_callback_url"), StandardCharsets.UTF_8.toString()));
+                .append("&redirect_uri=" + URLEncoder.encode(PropertiesUtils.getValue("bytedance_config", "bytedance_callback_url"), "UTF-8"));
         return sb.toString();
     }
 

+ 60 - 28
module-common/src/main/java/cn/com/ctop/common/module/service/impl/MaterialImageInfoServiceImpl.java

@@ -4,6 +4,7 @@ import cn.com.ctop.common.module.entity.MaterialImageInfo;
 import cn.com.ctop.common.module.mapper.MaterialImageInfoMapper;
 import cn.com.ctop.common.module.service.IMaterialImageInfoService;
 import cn.com.ctop.common.module.utils.Check;
+import cn.com.ctop.common.module.utils.LoadFileUtil;
 import cn.com.ctop.common.module.utils.ResultMapUtils;
 import cn.com.ctop.common.module.utils.StatusCode;
 import com.alibaba.fastjson.JSONArray;
@@ -15,7 +16,13 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 
+import javax.imageio.ImageIO;
+import java.awt.image.BufferedImage;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 
 /**
@@ -31,6 +38,11 @@ public class MaterialImageInfoServiceImpl extends ServiceImpl<MaterialImageInfoM
 
     @Value("${oss.replace.download}")
     private String downloadUrl;
+    @Value("${oss.replace.replace-value}")
+    private String replaceValue;
+    @Value("${oss.replace.replace-old-value}")
+    private String replaceOldValue;
+
 
     @Autowired
     private MaterialImageInfoMapper materialImageInfoMapper;
@@ -38,48 +50,63 @@ public class MaterialImageInfoServiceImpl extends ServiceImpl<MaterialImageInfoM
 
     @Override
     public void insertImage(JSONObject imageJson) {
-        String videoId = imageJson.getString("videoId");
-        if (Check.isNull(videoId)) {
-            log.error("视频id不能为空");
+        try {
 
-        }
-        String userId = imageJson.getString("userId");
-        Long projectId = imageJson.getLong("projectId");
-        JSONArray imageArr = imageJson.getJSONArray("imageArr");
-        for (int i = 0; i < imageArr.size(); i++) {
-            JSONObject json = imageArr.getJSONObject(i);
-            if (!Check.isNull(json)) {
-                MaterialImageInfo materialImageInfo = new MaterialImageInfo();
-                materialImageInfo.setVideoId(videoId);
-                materialImageInfo.setCode(json.getString("code"));
-                materialImageInfo.setMaterialDescribe(json.getString("materialDescribe"));
-                materialImageInfo.setType("IMAGE");
-                materialImageInfo.setHeight(json.getString("height"));
-                materialImageInfo.setWidth(json.getString("width"));
-
-
-                materialImageInfo.setSize(String.valueOf(json.getLong("size") / 1024));
-                materialImageInfo.setUrl("https:" + json.getString("url"));
-                materialImageInfo.setMaterialName(json.getString("materialName"));
-                materialImageInfo.setStatus(0);
-                materialImageInfo.setProjectId(projectId);
-                materialImageInfo.setUserId(userId);
-                materialImageInfoMapper.insertSelective(materialImageInfo);
+            String videoId = imageJson.getString("videoId");
+            if (Check.isNull(videoId)) {
+                log.error("视频id不能为空");
 
             }
+            String userId = imageJson.getString("userId");
+            JSONArray imageArr = imageJson.getJSONArray("imageArr");
+            for (int i = 0; i < imageArr.size(); i++) {
+                JSONObject json = imageArr.getJSONObject(i);
+                if (!Check.isNull(json)) {
+                    MaterialImageInfo materialImageInfo = new MaterialImageInfo();
+                    materialImageInfo.setVideoId(videoId);
+                    materialImageInfo.setCode(json.getString("code"));
+                    materialImageInfo.setMaterialDescribe(json.getString("materialDescribe"));
+                    materialImageInfo.setType("IMAGE");
+                    String url = "https:" + json.getString("url");
+                    materialImageInfo.setUrl(url);
+                    materialImageInfo.setMaterialName(json.getString("materialName"));
+                    materialImageInfo.setStatus(0);
+                    materialImageInfo.setUserId(userId);
+                    String replaceUrl = url.replace(replaceOldValue, replaceValue);
+                    log.info("图片replaceUrl:{}", url);
+                    String localUrl = LoadFileUtil.downLoadFromUrl(replaceUrl, downloadUrl);
+                    File picture = new File(localUrl);
+                    BufferedImage sourceImg = null;
+                    try {
+                        sourceImg = ImageIO.read(new FileInputStream(picture));
+                    } catch (IOException e) {
+                        e.printStackTrace();
+                    }
+                    String size = String.format("%.1f", picture.length() / 1024.0);
+                    Integer width = sourceImg.getWidth();
+                    Integer height = sourceImg.getHeight();
+                    materialImageInfo.setSize(size);
+                    materialImageInfo.setHeight(String.valueOf(height));
+                    materialImageInfo.setWidth(String.valueOf(width));
+                    materialImageInfoMapper.insertSelective(materialImageInfo);
+                    LoadFileUtil.delFile(localUrl);
+                }
 
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
         }
 
     }
 
     @Override
-    public Map<String, Object> checkMaterialInfo(String code, Long projectId) {
+    public Map<String, Object> checkMaterialInfo(String code, String videoId) {
 
 
         Map<String, Object> result = new HashMap<>();
         QueryWrapper<MaterialImageInfo> queryWrapper = new QueryWrapper<>();
         queryWrapper.eq("code", code);
-        queryWrapper.eq("project_id", projectId);
+        queryWrapper.eq("video_id", videoId);
         queryWrapper.last("limit 1");
         MaterialImageInfo info = this.getOne(queryWrapper);
         if (null != info) {
@@ -96,4 +123,9 @@ public class MaterialImageInfoServiceImpl extends ServiceImpl<MaterialImageInfoM
     }
 
 
+    @Override
+    public List<String> getCodeList() {
+        return materialImageInfoMapper.getCodeList();
+    }
+
 }

+ 141 - 76
module-common/src/main/java/cn/com/ctop/common/module/service/impl/MaterialInfoServiceImpl.java

@@ -5,10 +5,7 @@ import cn.com.ctop.common.module.mapper.MaterialAscriptionMapper;
 import cn.com.ctop.common.module.mapper.MaterialInfoMapper;
 import cn.com.ctop.common.module.mapper.MaterialParameterMapper;
 import cn.com.ctop.common.module.mapper.MaterialTagMapper;
-import cn.com.ctop.common.module.service.IMaterialImageInfoService;
-import cn.com.ctop.common.module.service.IMaterialInfoService;
-import cn.com.ctop.common.module.service.IVideoWatermarkTaskService;
-import cn.com.ctop.common.module.service.IVideoWatermarkTemplateService;
+import cn.com.ctop.common.module.service.*;
 import cn.com.ctop.common.module.utils.*;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
@@ -16,7 +13,7 @@ import com.aliyuncs.mts.model.v20140618.QueryJobListResponse;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import it.sauronsoftware.jave.Encoder;
-import it.sauronsoftware.jave.MultimediaInfo;
+import it.sauronsoftware.jave.EncoderException;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
@@ -24,6 +21,8 @@ import org.springframework.stereotype.Service;
 
 import java.io.File;
 import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.nio.channels.FileChannel;
@@ -43,20 +42,14 @@ import java.util.regex.Pattern;
 @Service
 public class MaterialInfoServiceImpl extends ServiceImpl<MaterialInfoMapper, MaterialInfo> implements IMaterialInfoService {
     private static ExecutorService uploadExecutorService = Executors.newFixedThreadPool(5);
+    static ExecutorService executorService = Executors.newFixedThreadPool(4);
+
     @Autowired
     private IVideoWatermarkTemplateService videoWatermarkTemplateService;
     @Autowired
     private IVideoWatermarkTaskService videoWatermarkTaskService;
     @Autowired
     private MaterialInfoMapper materialInfoMapper;
-    @Autowired
-    private MaterialAscriptionMapper materialAscriptionMapper;
-    @Autowired
-    private MaterialTagMapper materialTagMapper;
-    @Autowired
-    private IMaterialImageInfoService materialImageInfoService;
-    @Autowired
-    private MaterialParameterMapper materialParameterMapper;
     @Value("${oss.replace.replace-value}")
     private String replaceValue;
     @Value("${oss.replace.replace-old-value}")
@@ -64,13 +57,12 @@ public class MaterialInfoServiceImpl extends ServiceImpl<MaterialInfoMapper, Mat
     @Value("${oss.replace.download}")
     private String downloadUrl;
 
-
     @Override
     public void watermarkVideo(String materialId, Integer videoWatermarkTemplateId, String userId) {
         VideoWatermarkTemplate videoWatermarkTemplate = videoWatermarkTemplateService.getById(videoWatermarkTemplateId);
         MaterialInfo materialInfo = this.getById(materialId);
         MpsUtils mpsUtils = new MpsUtils();
-        String path = materialInfo.getUrl().substring(materialInfo.getUrl().indexOf('/', 10) + 1, materialInfo.getUrl().length());
+        String path = materialInfo.getUrl().substring(materialInfo.getUrl().indexOf("/", 10) + 1, materialInfo.getUrl().length());
         String jobId = mpsUtils.videoWaterMark(path, videoWatermarkTemplate.getTemplatePath(), videoWatermarkTemplate.getTemplateId(), videoWatermarkTemplate.getHeight());
         QueryJobListResponse.Job job = MpsUtils.getJobStatus(jobId);
         VideoWatermarkTask videoWatermarkTask = new VideoWatermarkTask();
@@ -116,12 +108,22 @@ public class MaterialInfoServiceImpl extends ServiceImpl<MaterialInfoMapper, Mat
         }
     }
 
-    public boolean imgLocation(String fileName) {
+    public boolean imgLocation(String fileName) throws IOException {
         String reg = "(mp4|flv|avi|rm|rmvb|wmv|MP4)";
         Pattern p = Pattern.compile(reg);
         return p.matcher(fileName).find();
     }
 
+    public static void main(String[] args) {
+        String reg = "(mp4|flv|avi|rm|rmvb|wmv)";
+        Pattern p = Pattern.compile(reg);
+    }
+
+    @Autowired
+    private MaterialAscriptionMapper materialAscriptionMapper;
+    @Autowired
+    private MaterialTagMapper materialTagMapper;
+
     @Override
     public Map<String, Object> insert(JSONObject jsonObject) {
         Map<String, Object> resultMap = new HashMap<>();
@@ -141,7 +143,7 @@ public class MaterialInfoServiceImpl extends ServiceImpl<MaterialInfoMapper, Mat
                             String md5 = LoadFileUtil.getMD5(localPath);
                             jsonObject.put("code", md5);
                             LoadFileUtil.delFile(localPath);
-                            String fileName = url.substring(url.lastIndexOf('/') + 1);
+                            String fileName = url.substring(url.lastIndexOf("/") + 1);
                             String fileNameStr = null;
                             if (!Check.isNull(fileName)) {
                                 String[] split = fileName.split("-");
@@ -150,8 +152,10 @@ public class MaterialInfoServiceImpl extends ServiceImpl<MaterialInfoMapper, Mat
                             jsonObject.put("materialName", AesEncryptUtil.getUrlDecoderString(fileNameStr));
                             insertMaterialInfo(url, type, jsonObject);
                         }
+
                     }
                 }
+
             } else {
                 String url = "";
                 if (!Check.isNull(jsonObject.getString("url"))) {
@@ -163,7 +167,7 @@ public class MaterialInfoServiceImpl extends ServiceImpl<MaterialInfoMapper, Mat
             ResultMapUtils.setResultMap(resultMap, StatusCode.COMMON_SUCCESS.getCode());
         } catch (Exception e) {
             ResultMapUtils.setResultMap(resultMap, StatusCode.MATERIAL_UPLOAD_FAIL.getCode());
-            log.error(e.getMessage(), e);
+            e.printStackTrace();
 
         }
 
@@ -171,6 +175,8 @@ public class MaterialInfoServiceImpl extends ServiceImpl<MaterialInfoMapper, Mat
         return resultMap;
     }
 
+    @Autowired
+    private IMaterialCutFrameService materialCutFrameService;
 
     private void insertMaterialInfo(String url, String type, JSONObject jsonObject) {
         MaterialInfo info = new MaterialInfo();
@@ -194,7 +200,7 @@ public class MaterialInfoServiceImpl extends ServiceImpl<MaterialInfoMapper, Mat
         info.setType(type);
         this.save(info);
         Map<String, Object> deleteMap = new HashMap<>();
-        deleteMap.put("material_id", info.getId());
+        deleteMap.put("material_id", info.getCode());
         JSONObject ascription = jsonObject.getJSONObject("ascription");
         if (!Check.isNull(ascription)) {
             MaterialAscription materialAscription = new MaterialAscription();
@@ -228,16 +234,21 @@ public class MaterialInfoServiceImpl extends ServiceImpl<MaterialInfoMapper, Mat
                 }
             }
         }
+
         getFile(info);
 
     }
 
+
     /**
      * 获取素材详细信息
      *
      * @param materialId
      * @return
      */
+
+    //@Autowired
+    //private MaterialInfoMapper materialInfoMapper;
     @Override
     public JSONObject getDetail(String materialId) {
         JSONObject json = new JSONObject();
@@ -250,24 +261,21 @@ public class MaterialInfoServiceImpl extends ServiceImpl<MaterialInfoMapper, Mat
             json.put("auditorName", "");
         }
 
-        List<String> tagList = materialTagMapper.selectByMaterialId(materialId);
+        List<String> tagList = materialTagMapper.selectByMaterialId(materialInfo.getCode());
         if (!Check.isNull(tagList)) {
             json.put("tag", tagList);
         }
         QueryWrapper<MaterialParameter> queryWrapper = new QueryWrapper<>();
-        queryWrapper.eq("material_id", materialId);
+        queryWrapper.eq("material_id", materialInfo.getCode());
         queryWrapper.orderByDesc("create_time");
         queryWrapper.last("limit 1");
         MaterialParameter materialParameter = materialParameterMapper.selectOne(queryWrapper);
 
         if (!Check.isNull(materialParameter)) {
             json.put("parameter", materialParameter);
-        } else {
-            MaterialParameter materialParameter1 = new MaterialParameter();
-            materialParameter1.setMaterialId(materialId);
-            json.put("parameter", materialParameter1);
         }
-        JSONObject ascriptionJson = materialAscriptionMapper.selectByMaterialId(materialId);
+
+        JSONObject ascriptionJson = materialAscriptionMapper.selectByMaterialId(materialInfo.getCode());
         if (!Check.isNull(ascriptionJson)) {
             json.put("ascription", ascriptionJson);
         }
@@ -309,57 +317,107 @@ public class MaterialInfoServiceImpl extends ServiceImpl<MaterialInfoMapper, Mat
         return json;
     }
 
+    @Override
+    public String getRoleCodeByUserId(String userId) {
+        return materialInfoMapper.getRoleCodeByUserId(userId);
+    }
+
+
+    @Autowired
+    private MaterialParameterMapper materialParameterMapper;
 
     @Override
     public void getFile(MaterialInfo materialInfo) {
-        uploadExecutorService.submit(() -> {
-            File file = null;
-            try {
-                String url = materialInfo.getUrl().replace(replaceOldValue, replaceValue);
-                String localUrl = LoadFileUtil.downLoadFromUrl(url, downloadUrl);
-                file = new File(localUrl);
+        uploadExecutorService.submit(new Runnable() {
+            @Override
+            public void run() {
+                /*try {*/
                 log.info("获取素材基本信息,code:{}", materialInfo.getCode());
+                if (!Check.isNull(materialInfo)) {
+                    long l = System.currentTimeMillis();
+                    String url = materialInfo.getUrl().replace(replaceOldValue, replaceValue);
+                    log.info("replaceUrl:{}", url);
+                    String localUrl = null;
+                    it.sauronsoftware.jave.MultimediaInfo m = null;
+                    FileInputStream fis = null;
+                    try {
+                        localUrl = LoadFileUtil.downLoadFromUrl(url, downloadUrl);
+
+                        File file = new File(localUrl);
+                        it.sauronsoftware.jave.Encoder encoder = new Encoder();
+                        /*try {*/
+                        m = encoder.getInfo(file);
+                        long duration = m.getDuration();
+                        long secondDuration = duration / 1000;
+                        MaterialParameter materialParameter = new MaterialParameter();
+                        materialParameter.setMaterialId(materialInfo.getCode());
+                        // 视频秒数
+                        materialParameter.setSecond(secondDuration);
+                        // 视频格式
+                        materialParameter.setFormat(m.getFormat());
+                        // 视频宽
+                        String width = String.valueOf(m.getVideo().getSize().getWidth());
+                        materialParameter.setWidth(width);
+                        // 视频高
+                        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());
+                        String size = fileSize.divide(new BigDecimal(1048576), 2, RoundingMode.HALF_UP) + "MB";
+                        materialParameter.setSize(size);
+                        materialParameter.setUpdateTime(new Date());
+
+                        Map<String, Object> deleteMap = new HashMap<>();
+                        deleteMap.put("material_id", materialInfo.getId());
+                        materialParameterMapper.deleteByMap(deleteMap);
+                        int insert = materialParameterMapper.insert(materialParameter);
+                        if (insert > 0) {
+                            log.info("素材基本信息入库完成,用时:{} s", (System.currentTimeMillis() - l) / 1000);
 
-                long start = System.currentTimeMillis();
-                log.info("replaceUrl:{}", url);
-                it.sauronsoftware.jave.Encoder encoder = new Encoder();
-                MultimediaInfo m = encoder.getInfo(file);
-                long duration = m.getDuration();
-                long secondDuration = duration / 1000;
-                MaterialParameter materialParameter = new MaterialParameter();
-                materialParameter.setMaterialId(materialInfo.getId());
-                // 视频秒数
-                materialParameter.setSecond(secondDuration);
-                // 视频格式
-                materialParameter.setFormat(m.getFormat());
-                // 视频宽
-                String width = String.valueOf(m.getVideo().getSize().getWidth());
-                materialParameter.setWidth(width);
-                // 视频高
-                String height = String.valueOf(m.getVideo().getSize().getHeight());
-                materialParameter.setHeight(height);
-                FileInputStream fis = new FileInputStream(file);
-                FileChannel fc = fis.getChannel();
-                BigDecimal fileSize = new BigDecimal(fc.size());
-                String size = fileSize.divide(new BigDecimal(1024 * 1024), 2, RoundingMode.HALF_UP) + "MB";
-                materialParameter.setSize(size);
-                materialParameter.setUpdateTime(new Date());
-
-                Map<String, Object> deleteMap = new HashMap<>();
-                deleteMap.put("material_id", materialInfo.getId());
-                materialParameterMapper.deleteByMap(deleteMap);
-                int insert = materialParameterMapper.insert(materialParameter);
-                if (insert > 0) {
-                    log.info("素材基本信息入库完成,用时:{} s", (System.currentTimeMillis() - start) / 1000);
-                }
-                /*new Thread(() -> materialCutFrameService.getCutFrame(url, materialInfo.getCode(), height, width)).start();*/
-            } catch (Exception e) {
-                e.printStackTrace();
-            } finally {
-                if (null != file) {
-                    file.delete();
+                        }
+                    } catch (FileNotFoundException e) {
+                        e.printStackTrace();
+                    } catch (IOException e) {
+                        e.printStackTrace();
+                    } catch (EncoderException e) {
+                        e.printStackTrace();
+
+                    } finally {
+                        try {
+                            if (fis != null) {
+                                fis.close();
+                            }
+                        } catch (IOException e) {
+                            e.printStackTrace();
+                        }
+                    }
+
+                            /*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();
+                        } finally {
+                            file.delete();
+                        }*/
                 }
+                /*} catch (Exception e) {
+                    e.printStackTrace();
+                }*/
             }
+
+
         });
     }
 
@@ -393,6 +451,9 @@ public class MaterialInfoServiceImpl extends ServiceImpl<MaterialInfoMapper, Mat
     }
 
 
+    @Autowired
+    private IMaterialImageInfoService materialImageInfoService;
+
     /**
      * 素材库关联上传素材 1
      *
@@ -434,7 +495,7 @@ public class MaterialInfoServiceImpl extends ServiceImpl<MaterialInfoMapper, Mat
             JSONArray imageArr = json.getJSONArray("imageArr");
             if (!Check.isNull(imageArr)) {
                 JSONObject imageJson = new JSONObject();
-                imageJson.put("videoId", info.getId());
+                imageJson.put("videoId", info.getCode());
                 imageJson.put("userId", userId);
                 imageJson.put("projectId", projectId);
                 imageJson.put("imageArr", imageArr);
@@ -442,11 +503,11 @@ public class MaterialInfoServiceImpl extends ServiceImpl<MaterialInfoMapper, Mat
             }
 
             Map<String, Object> deleteMap = new HashMap<>();
-            deleteMap.put("material_id", info.getId());
+            deleteMap.put("material_id", info.getCode());
             JSONObject ascription = json.getJSONObject("ascription");
             if (!Check.isNull(ascription)) {
                 MaterialAscription materialAscription = new MaterialAscription();
-                materialAscription.setMaterialId(info.getId());
+                materialAscription.setMaterialId(info.getCode());
                 // 剪辑人
                 materialAscription.setClipId(ascription.getString("clipId"));
                 // 拍摄人id
@@ -460,6 +521,7 @@ public class MaterialInfoServiceImpl extends ServiceImpl<MaterialInfoMapper, Mat
                 if (i > 0) {
                     log.info("素材归属信息入库完成,MaterialId:{}", info.getId());
                 }
+
             }
 
             JSONArray tag = json.getJSONArray("tag");
@@ -469,7 +531,7 @@ public class MaterialInfoServiceImpl extends ServiceImpl<MaterialInfoMapper, Mat
                     String tagStr = tag.getString(i);
                     if (!Check.isNull(tagStr)) {
                         MaterialTag materialTag = new MaterialTag();
-                        materialTag.setMaterialId(info.getId());
+                        materialTag.setMaterialId(info.getCode());
                         materialTag.setTag(tagStr);
                         materialTagMapper.insert(materialTag);
                     }
@@ -484,7 +546,11 @@ public class MaterialInfoServiceImpl extends ServiceImpl<MaterialInfoMapper, Mat
             e.printStackTrace();
 
         }
+
+
         return resultMap;
+
+
     }
 
     @Override
@@ -501,12 +567,11 @@ public class MaterialInfoServiceImpl extends ServiceImpl<MaterialInfoMapper, Mat
         return resultMap;
     }
 
-    @Override
     public List<String> getEffiCode() {
         return materialInfoMapper.getEffiSignature();
     }
 
-    @Override
+
     public List<MaterialInfo> effiMaterialInfo() {
         List<MaterialInfo> materialInfoList = new ArrayList<>();
         List<String> effiSignatureList = materialInfoMapper.getEffiSignature();

+ 5 - 3
module-common/src/main/java/cn/com/ctop/common/module/utils/CorpWexinUtils.java

@@ -33,7 +33,7 @@ public class CorpWexinUtils {
         if (wxCpService == null) {
             initService();
         }
-        if (wxUserList != null && !wxUserList.isEmpty()) {
+        if (wxUserList != null && wxUserList.size() > 0) {
             for (String userId : wxUserList) {
                 WxCpMessage message = new WxCpMessage();
                 message.setMsgType("text");
@@ -43,7 +43,8 @@ public class CorpWexinUtils {
                 try {
                     wxCpService.messageSend(message);
                 } catch (WxErrorException e) {
-                    log.error(e.getMessage(), e);
+                    log.error("发送信息失败,userId:{}", userId);
+                    e.printStackTrace();
                 }
             }
         }
@@ -64,7 +65,8 @@ public class CorpWexinUtils {
             try {
                 wxCpService.messageSend(message);
             } catch (WxErrorException e) {
-                log.error(e.getMessage(), e);
+                log.error("发送信息失败,userId:{}", weChatId);
+                e.printStackTrace();
             }
 
         }

+ 13 - 5
module-common/src/main/java/cn/com/ctop/common/module/utils/HttpUtils2.java

@@ -144,9 +144,12 @@ public class HttpUtils2 {
             HttpPost httppost = new HttpPost(url);
             httppost.setHeader("User-Agent", USER_AGENT);
             httppost.addHeader("Content-Type", "application/json");
-            for (String key : headers.keySet()) {
-                httppost.setHeader(key, headers.get(key));
+            if (headers != null) {
+                for (String key : headers.keySet()) {
+                    httppost.setHeader(key, headers.get(key));
+                }
             }
+
             httppost.setEntity(new StringEntity(new Gson().toJson(param), Charset.forName("UTF-8")));
             HttpEntity respentity;
 
@@ -237,10 +240,15 @@ public class HttpUtils2 {
             HttpPost httppost = new HttpPost(url);
             httppost.setHeader("User-Agent", USER_AGENT);
             httppost.addHeader("Content-Type", "application/json");
-            for (String key : headers.keySet()) {
-                httppost.setHeader(key, headers.get(key));
+            if (headers != null) {
+                for (String key : headers.keySet()) {
+                    httppost.setHeader(key, headers.get(key));
+                }
+            }
+            if (params != null) {
+                httppost.setEntity(new StringEntity(params.toJSONString(), Charset.forName("UTF-8")));
             }
-            httppost.setEntity(new StringEntity(params.toJSONString(), Charset.forName("UTF-8")));
+
             HttpEntity respentity;
 
             HttpResponse response = httpClient.execute(httppost);

+ 54 - 102
module-common/src/main/java/cn/com/ctop/common/module/utils/LoadFileUtil.java

@@ -5,12 +5,8 @@ import org.apache.commons.codec.digest.DigestUtils;
 import java.io.*;
 import java.net.HttpURLConnection;
 import java.net.URL;
-import java.net.URLEncoder;
-import java.util.Map;
 
 public class LoadFileUtil {
-    private LoadFileUtil() {
-    }
     /**
      * 上传文件
      *
@@ -19,38 +15,54 @@ public class LoadFileUtil {
      * @return
      * @throws IOException
      */
-    public static String downLoadFromUrl(String urlStr, String savePath) {
-        try {
-            String fileName = AesEncryptUtil.getUrlDecoderString(urlStr.substring(urlStr.lastIndexOf('/') + 1));
-            URL url = new URL(urlStr);
-            System.setProperty("https.protocols", "TLSv1,TLSv1.1,TLSv1.2,SSLv3");
-            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
-            conn.setConnectTimeout(60 * 1000);
-            //防止屏蔽程序抓取而返回403错误
-            conn.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)");
-            InputStream inputStream = conn.getInputStream();
-            //获取自己数组
-            byte[] getData = readInputStream(inputStream);
-
-            //文件保存位置
-            File saveDir = new File(savePath);
-            if (!saveDir.exists()) {
-                saveDir.mkdirs();
-            }
-            String localPath = saveDir + File.separator + fileName;
-            File file = new File(localPath);
-            if (!file.exists()) {
-                file.getParentFile().mkdirs();
-            }
-            FileOutputStream fos = new FileOutputStream(file);
-            fos.write(getData);
+    public static String downLoadFromUrl(String urlStr, String savePath) throws IOException {
+        String fileName = AesEncryptUtil.getUrlDecoderString(urlStr.substring(urlStr.lastIndexOf("/") + 1));
+        URL url = new URL(urlStr);
+
+        System.setProperty("https.protocols", "TLSv1,TLSv1.1,TLSv1.2,SSLv3");
+        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
+        //设置超时间为3秒
+        conn.setConnectTimeout(60 * 1000);
+        //防止屏蔽程序抓取而返回403错误
+        conn.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)");
+        //得到输入流
+        InputStream inputStream = conn.getInputStream();
+        //获取自己数组
+        byte[] getData = readInputStream(inputStream);
+
+        //文件保存位置
+        File saveDir = new File(savePath);
+        if (!saveDir.exists()) {
+//            saveDir.mkdir();
+            saveDir.mkdirs();
+        }
+        String localPath = saveDir + File.separator + fileName;
+        File file = new File(localPath);
+        if (!file.exists()) {
+            file.getParentFile().mkdirs();
+        }
+        FileOutputStream fos = new FileOutputStream(file);
+        fos.write(getData);
+        if (fos != null) {
             fos.close();
+        }
+        if (inputStream != null) {
             inputStream.close();
-            return localPath;
-        } catch (IOException e) {
-            e.printStackTrace();
-            return null;
         }
+        return localPath;
+
+
+    }
+
+    public static byte[] readInputStream(InputStream inputStream) throws IOException {
+        byte[] buffer = new byte[1024];
+        int len = 0;
+        ByteArrayOutputStream bos = new ByteArrayOutputStream();
+        while ((len = inputStream.read(buffer)) != -1) {
+            bos.write(buffer, 0, len);
+        }
+        bos.close();
+        return bos.toByteArray();
     }
 
 
@@ -61,16 +73,17 @@ public class LoadFileUtil {
      * @return
      */
     public static boolean delFile(String path) {
+        boolean flag = false;
         File file = new File(path);
         if (!file.exists()) {
-            return true;
+            return false;
         }
         try {
-            return file.delete();
+            flag = file.delete();
         } catch (Exception e) {
             e.printStackTrace();
-            return false;
         }
+        return flag;
     }
 
     /**
@@ -88,76 +101,15 @@ public class LoadFileUtil {
         return DigestUtils.md5Hex(inputStream);
     }
 
+
+    public static void main(String[] args) throws IOException {
+        System.out.println(LoadFileUtil.getMD5("D://video/BMjAyMDAzMDQxODMyMTlfMTU3ODQ0ODY5MV8yNDQ1ODc0Mzk1OF8wXzM=_b_Bd696ca7f28234aac3713b18edd139469.mp4"));
+    }
+
     public static void checkFile(String filePackageName) {
         File file = new File(filePackageName);
         if (!file.exists()) {
             file.mkdir();
         }
     }
-
-    public static String downloadByUrl(Map<String, Object> requestMap, String downloadPath, String urlStr, String token, String fileName) {
-
-        try {
-            StringBuilder postBody = null;
-            if (!Check.isNull(requestMap)) {
-                postBody = new StringBuilder();
-                for (Map.Entry<String, Object> entry : requestMap.entrySet()) {
-                    if (entry.getValue() == null) {
-                        continue;
-                    }
-                    postBody.append(entry.getKey()).append("=").append(URLEncoder.encode(entry.getValue().toString(),
-                            "utf-8")).append("&");
-                }
-                if (!requestMap.isEmpty()) {
-                    postBody.deleteCharAt(postBody.length() - 1);
-                }
-            }
-
-            URL url = new URL(urlStr + "?" + postBody);
-            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
-            //设置超时间为3秒
-            conn.setConnectTimeout(120 * 1000);
-            //防止屏蔽程序抓取而返回403错误
-            conn.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)");
-            conn.setRequestProperty("Access-Token", token);
-            //得到输入流
-            InputStream inputStream = null;
-
-            inputStream = conn.getInputStream();
-
-            //获取自己数组
-            byte[] getData = readInputStream(inputStream);
-
-            //文件保存位置
-            File saveDir = new File(downloadPath);
-            if (!saveDir.exists()) {
-                saveDir.mkdirs();
-            }
-            String filePath = downloadPath + fileName;
-
-            File file = new File(saveDir + File.separator + fileName);
-            FileOutputStream fos = new FileOutputStream(file);
-            fos.write(getData);
-            fos.close();
-            inputStream.close();
-            return filePath;
-        } catch (IOException e) {
-            e.printStackTrace();
-        }
-
-
-        return null;
-
-    }
-
-    public static byte[] readInputStream(InputStream inputStream) throws IOException {
-        byte[] buffer = new byte[1024];
-        int len = 0;
-        ByteArrayOutputStream bos = new ByteArrayOutputStream();
-        while ((len = inputStream.read(buffer)) != -1) {
-            bos.write(buffer, 0, len);
-        }
-        bos.close();
-        return bos.toByteArray();
-    }
 }

+ 2 - 2
module-common/src/main/java/cn/com/ctop/common/module/utils/RandomUtil.java

@@ -9,8 +9,8 @@ public class RandomUtil {
         char[] c = charArray();//获取包含26个字母大小写和数字的字符数组
 
         Random rd = new Random();
-        String code = "_";
-        for (int k = 0; k <= 4; k++) {
+        String code = "#";
+        for (int k = 0; k < 4; k++) {
             int index = rd.nextInt(c.length);//随机获取数组长度作为索引
             code += c[index];//循环添加到字符串后面
         }

+ 7 - 1
module-crawler/pom.xml

@@ -22,6 +22,12 @@
             <artifactId>jeecg-boot-base-common</artifactId>
             <version>2.0.2</version>
         </dependency>
+        <dependency>
+            <groupId>org.codehaus.jackson</groupId>
+            <artifactId>jackson-core-asl</artifactId>
+            <version>1.9.11</version>
+            <scope>compile</scope>
+        </dependency>
     </dependencies>
     <build>
         <resources>
@@ -40,4 +46,4 @@
             </resource>
         </resources>
     </build>
-</project>
+</project>

+ 0 - 3
module-crawler/src/main/java/cn/com/ctop/crawler/modules/pangolin/entity/PangolinReportAccountDaily.java

@@ -1,7 +1,5 @@
 package cn.com.ctop.crawler.modules.pangolin.entity;
 
-import com.baomidou.mybatisplus.annotation.IdType;
-import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import lombok.Data;
 
@@ -12,7 +10,6 @@ import java.util.Date;
 @TableName("ctop_pangolin_report_account_daily")
 public class PangolinReportAccountDaily {
     private Date date;
-    @TableId(value = "id", type = IdType.INPUT)
     private String accountName;
     private String appName;
     private Integer externalActivation;

+ 20 - 0
module-crawler/src/main/java/cn/com/ctop/crawler/modules/pangolin/entity/PangolinReportAppHour.java

@@ -0,0 +1,20 @@
+package cn.com.ctop.crawler.modules.pangolin.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+@Data
+@TableName("ctop_pangolin_report_app_hour")
+public class PangolinReportAppHour {
+    private Date date;
+    private Integer hour;
+    private Long appId;
+    private String type;
+    private BigDecimal num;
+}

+ 2 - 2
module-crawler/src/main/java/cn/com/ctop/crawler/modules/pangolin/entity/PangolinReportBillMonth.java

@@ -1,6 +1,7 @@
 package cn.com.ctop.crawler.modules.pangolin.entity;
 
 import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import lombok.Data;
@@ -12,8 +13,7 @@ import java.math.BigDecimal;
 public class PangolinReportBillMonth {
     private Integer year;
     private Integer month;
-    @TableId(value = "id", type = IdType.INPUT)
-    private Integer appId;
+    private Long appId;
     private String os;
     private Integer sumInternalActivations;
     private BigDecimal actualTotalPrice;

+ 1 - 1
module-crawler/src/main/java/cn/com/ctop/crawler/modules/pangolin/entity/PangolinReportChannelDaily.java

@@ -1,6 +1,7 @@
 package cn.com.ctop.crawler.modules.pangolin.entity;
 
 import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import lombok.Data;
@@ -12,7 +13,6 @@ import java.util.Date;
 @TableName("ctop_pangolin_report_channel_daily")
 public class PangolinReportChannelDaily {
     private Date date;
-    @TableId(value = "id", type = IdType.INPUT)
     private String channelName;
     private String appName;
     private String os;

+ 47 - 0
module-crawler/src/main/java/cn/com/ctop/crawler/modules/pangolin/job/PangolinDataJob.java

@@ -0,0 +1,47 @@
+package cn.com.ctop.crawler.modules.pangolin.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.*;
+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;
+import org.springframework.beans.factory.annotation.Autowired;
+
+import java.util.List;
+
+public class PangolinDataJob implements Job {
+    @Autowired
+    private IBindAccountLoginService bindAccountLoginService;
+    @Autowired
+    private PangolinAppService pangolinAppService;
+    @Autowired
+    private PangolinCrawlerService pangolinCrawlerService;
+
+    @Override
+    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
+        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.size() > 0) {
+            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.size() > 0) {
+                    for (PangolinApp app : appList) {
+                        pangolinCrawlerService.getRealTimeList(bindAccountLogin, app.getId());
+                    }
+                }
+            }
+        }
+    }
+}

+ 7 - 0
module-crawler/src/main/java/cn/com/ctop/crawler/modules/pangolin/mapper/PangolinReportAppHourMapper.java

@@ -0,0 +1,7 @@
+package cn.com.ctop.crawler.modules.pangolin.mapper;
+
+import cn.com.ctop.crawler.modules.pangolin.entity.PangolinReportAppHour;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+public interface PangolinReportAppHourMapper extends BaseMapper<PangolinReportAppHour> {
+}

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

@@ -0,0 +1,14 @@
+package cn.com.ctop.crawler.modules.pangolin.service;
+
+import cn.com.ctop.common.module.entity.BindAccountLogin;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+public interface PangolinCrawlerService {
+    public void getCheckList(BindAccountLogin bindAccountLogin);
+
+    public void getChannelList(BindAccountLogin bindAccountLogin);
+
+    public void getActivationList(BindAccountLogin bindAccountLogin, String date, int page);
+
+    public void getRealTimeList(BindAccountLogin bindAccountLogin, Long appId);
+}

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

@@ -0,0 +1,7 @@
+package cn.com.ctop.crawler.modules.pangolin.service;
+
+import cn.com.ctop.crawler.modules.pangolin.entity.PangolinReportAppHour;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+public interface PangolinReportAppHourService extends IService<PangolinReportAppHour> {
+}

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

@@ -0,0 +1,357 @@
+package cn.com.ctop.crawler.modules.pangolin.service.impl;
+
+import cn.com.ctop.common.module.entity.BindAccountLogin;
+import cn.com.ctop.common.module.service.IBindAccountLoginService;
+import cn.com.ctop.common.module.utils.HttpUtils2;
+import cn.com.ctop.crawler.modules.pangolin.entity.*;
+import cn.com.ctop.crawler.modules.pangolin.service.*;
+import cn.hutool.core.date.DateUtil;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.google.gson.Gson;
+import com.google.gson.JsonObject;
+import org.apache.http.impl.cookie.BasicClientCookie;
+import org.jeecg.common.util.DateUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.io.IOException;
+import java.math.BigDecimal;
+import java.util.*;
+
+@Service
+public class PangolinCrawlerServiceImpl implements PangolinCrawlerService {
+    @Autowired
+    private IBindAccountLoginService bindAccountLoginService;
+    @Autowired
+    private PangolinAppService pangolinAppService;
+    @Autowired
+    private PangolinChannelService pangolinChannelService;
+    @Autowired
+    private PangolinReportBillMonthService pangolinReportBillMonthService;
+    @Autowired
+    private PangolinReportChannelDailyService pangolinReportChannelDailyService;
+    @Autowired
+    private PangolinReportAppHourService pangolinReportAppHourService;
+
+    public void getCheckList(BindAccountLogin bindAccountLogin) {
+        String url = "https://pangolin.bytedance.com/api/check_apps/list";
+        ObjectMapper mapper = new ObjectMapper();
+        try {
+            List<String> cookieList = mapper.readValue(bindAccountLogin.getCookie(), new TypeReference<List<String>>() {
+            });
+            if (cookieList != null && cookieList.size() > 0) {
+                for (String cookieStr : cookieList) {
+                    String[] cookieArray = cookieStr.split(";");
+                    Map<String, String> cookieMap = new HashMap<String, String>();
+                    for (String cookie : cookieArray) {
+                        String[] kv = cookie.split("=");
+                        if (kv.length > 1) {
+                            cookieMap.put(kv[0].trim(), kv[1].trim());
+                        }
+                    }
+                    BasicClientCookie clientCookie = new BasicClientCookie(cookieArray[0].split("=")[0],
+                            cookieArray[0].split("=")[1]);
+                    clientCookie.setDomain("pangolin.bytedance.com");
+                    clientCookie.setPath(cookieMap.get("path"));
+                    HttpUtils2.cookieStore.addCookie(clientCookie);
+                }
+            }
+            String result = HttpUtils2.httpPostRequest(url, null, null);
+            System.out.println(result);
+            if (checkLogin(bindAccountLogin, result)) {
+                JsonNode resultNode = mapper.readTree(result);
+                Iterator<JsonNode> appIterator = resultNode.get("data").get("List").elements();
+                while (appIterator.hasNext()) {
+                    JsonNode checkNode = appIterator.next();
+                    Long appId = checkNode.get("ApplicationId").asLong();
+                    String date = checkNode.get("Date").asText();
+                    String os = checkNode.get("Os").asText();
+                    Integer sumInternalActivations = checkNode.get("SumInternalActivations").asInt();
+                    BigDecimal actualTotalPrice = checkNode.get("ActualTotalPrice").decimalValue();
+                    BigDecimal estimatedTotalPrice = checkNode.get("EstimatedTotalPrice").decimalValue();
+                    BigDecimal accountQualityScore = checkNode.get("AccountQualityScore").decimalValue();
+                    String appName = checkNode.get("AppName").asText();
+                    PangolinReportBillMonth pangolinReportBillMonth = new PangolinReportBillMonth();
+                    pangolinReportBillMonth.setAccountQualityScore(accountQualityScore);
+                    pangolinReportBillMonth.setActualTotalPrice(actualTotalPrice);
+                    pangolinReportBillMonth.setAppId(appId);
+                    pangolinReportBillMonth.setEstimatedTotalPrice(estimatedTotalPrice);
+                    pangolinReportBillMonth.setOs(os);
+                    pangolinReportBillMonth.setSumInternalActivations(sumInternalActivations);
+                    pangolinReportBillMonth.setYear(Integer.parseInt(date.split("-")[0]));
+                    pangolinReportBillMonth.setMonth(Integer.parseInt(date.split("-")[1]));
+                    QueryWrapper<PangolinReportBillMonth> queryWrapper = new QueryWrapper<>();
+                    queryWrapper.eq("os", pangolinReportBillMonth.getOs());
+                    queryWrapper.eq("app_id", pangolinReportBillMonth.getAppId());
+                    queryWrapper.eq("month", pangolinReportBillMonth.getMonth());
+                    queryWrapper.eq("year", pangolinReportBillMonth.getYear());
+                    if (pangolinReportBillMonthService.getOne(queryWrapper) == null) {
+                        pangolinReportBillMonthService.save(pangolinReportBillMonth);
+                    } else {
+                        pangolinReportBillMonthService.update(pangolinReportBillMonth, queryWrapper);
+                    }
+                }
+            }
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+    }
+
+    public void getChannelList(BindAccountLogin bindAccountLogin) {
+        String url = "https://pangolin.bytedance.com/api/search/external_default";
+        ObjectMapper mapper = new ObjectMapper();
+        try {
+            List<String> cookieList = mapper.readValue(bindAccountLogin.getCookie(), new TypeReference<List<String>>() {
+            });
+            if (cookieList != null && cookieList.size() > 0) {
+                for (String cookieStr : cookieList) {
+                    String[] cookieArray = cookieStr.split(";");
+                    Map<String, String> cookieMap = new HashMap<String, String>();
+                    for (String cookie : cookieArray) {
+                        String[] kv = cookie.split("=");
+                        if (kv.length > 1) {
+                            cookieMap.put(kv[0].trim(), kv[1].trim());
+                        }
+                    }
+                    BasicClientCookie clientCookie = new BasicClientCookie(cookieArray[0].split("=")[0],
+                            cookieArray[0].split("=")[1]);
+                    clientCookie.setDomain("pangolin.bytedance.com");
+                    clientCookie.setPath(cookieMap.get("path"));
+                    HttpUtils2.cookieStore.addCookie(clientCookie);
+                }
+            }
+            String result = HttpUtils2.httpGetRequest(url);
+            System.out.println(result);
+            if (checkLogin(bindAccountLogin, result)) {
+                JsonNode resultNode = mapper.readTree(result);
+                Iterator<JsonNode> appIterator = resultNode.get("data").get("AppNameList").elements();
+                while (appIterator.hasNext()) {
+                    JsonNode appNode = appIterator.next();
+                    Long id = appNode.get("Id").asLong();
+                    String name = appNode.get("Name").asText();
+                    PangolinApp app = new PangolinApp();
+                    app.setAccountName(bindAccountLogin.getAccountName());
+                    app.setId(id);
+                    app.setName(name);
+                    pangolinAppService.saveOrUpdate(app);
+                }
+                Iterator<JsonNode> channelIterator = resultNode.get("data").get("ChannelNameList").elements();
+                while (channelIterator.hasNext()) {
+                    JsonNode channelNode = channelIterator.next();
+                    Long id = channelNode.get("Id").asLong();
+                    String name = channelNode.get("Name").asText();
+                    PangolinChannel channel = new PangolinChannel();
+                    channel.setAccountName(bindAccountLogin.getAccountName());
+                    channel.setId(id);
+                    channel.setName(name);
+                    pangolinChannelService.saveOrUpdate(channel);
+                }
+            }
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+    }
+
+    public void getActivationList(BindAccountLogin bindAccountLogin, String date, int page) {
+        String url = "https://pangolin.bytedance.com/api/activation/list";
+        ObjectMapper mapper = new ObjectMapper();
+        try {
+            List<String> cookieList = mapper.readValue(bindAccountLogin.getCookie(), new TypeReference<List<String>>() {
+            });
+            if (cookieList != null && cookieList.size() > 0) {
+                for (String cookieStr : cookieList) {
+                    String[] cookieArray = cookieStr.split(";");
+                    Map<String, String> cookieMap = new HashMap<String, String>();
+                    for (String cookie : cookieArray) {
+                        String[] kv = cookie.split("=");
+                        if (kv.length > 1) {
+                            cookieMap.put(kv[0].trim(), kv[1].trim());
+                        }
+                    }
+                    BasicClientCookie clientCookie = new BasicClientCookie(cookieArray[0].split("=")[0],
+                            cookieArray[0].split("=")[1]);
+                    clientCookie.setDomain("pangolin.bytedance.com");
+                    clientCookie.setPath(cookieMap.get("path"));
+                    HttpUtils2.cookieStore.addCookie(clientCookie);
+                }
+            }
+            Map<String, Object> paramMap = new HashMap<>();
+            Map<String, Object> searchMap = new HashMap<>();
+            searchMap.put("DateStart", DateUtils.addDay(date, -2));
+            searchMap.put("DateEnd", date);
+            searchMap.put("AppId", "");
+            searchMap.put("ChannelName", "");
+            searchMap.put("OS", "");
+            Map<String, Object> pageMap = new HashMap<>();
+            pageMap.put("p", page);
+            paramMap.put("search", searchMap);
+            paramMap.put("page", pageMap);
+            String result = HttpUtils2.httpPostRequest(url, paramMap, null);
+            System.out.println(result);
+            if (checkLogin(bindAccountLogin, result)) {
+                JsonNode resultNode = mapper.readTree(result);
+                Iterator<JsonNode> listIterator = resultNode.get("data").get("list").elements();
+                while (listIterator.hasNext()) {
+                    JsonNode dataNode = listIterator.next();
+                    String startDate = dataNode.get("StatsDate").asText();
+                    String channelName = dataNode.get("ChannelName").asText();
+                    String appName = dataNode.get("AppVerboseName").asText();
+                    String os = dataNode.get("OS").asText();
+                    Integer externalActivation = dataNode.get("ExternalActivation").asInt();
+                    BigDecimal retentionRatio = dataNode.get("RetentionRatio").decimalValue();
+                    BigDecimal totalPrice = dataNode.get("TotalPrice").decimalValue();
+                    PangolinReportChannelDaily pangolinReportChannelDaily = new PangolinReportChannelDaily();
+                    pangolinReportChannelDaily.setAppName(appName);
+                    pangolinReportChannelDaily.setChannelName(channelName);
+                    pangolinReportChannelDaily.setDate(DateUtils.parseDate(startDate, "yyyy-MM-dd"));
+                    pangolinReportChannelDaily.setExternalActivation(externalActivation);
+                    pangolinReportChannelDaily.setOs(os);
+                    pangolinReportChannelDaily.setRetentionRatio(retentionRatio);
+                    pangolinReportChannelDaily.setTotalPrice(totalPrice);
+                    QueryWrapper<PangolinReportChannelDaily> queryWrapper = new QueryWrapper<>();
+                    queryWrapper.eq("date", pangolinReportChannelDaily.getDate());
+                    queryWrapper.eq("channel_name", pangolinReportChannelDaily.getChannelName());
+                    if (pangolinReportChannelDailyService.getOne(queryWrapper) == null) {
+                        pangolinReportChannelDailyService.save(pangolinReportChannelDaily);
+                    } else {
+                        pangolinReportChannelDailyService.update(pangolinReportChannelDaily, queryWrapper);
+                    }
+                }
+                Integer maxPage = resultNode.get("data").get("page").get("MaxPage").asInt();
+                if (page < maxPage) {
+                    page++;
+                    getActivationList(bindAccountLogin, date, page);
+                }
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    public void getRealTimeList(BindAccountLogin bindAccountLogin, Long appId) {
+        String url = "https://pangolin.bytedance.com/api/real_time/";
+        ObjectMapper mapper = new ObjectMapper();
+        try {
+            List<String> cookieList = mapper.readValue(bindAccountLogin.getCookie(), new TypeReference<List<String>>() {
+            });
+            if (cookieList != null && cookieList.size() > 0) {
+                for (String cookieStr : cookieList) {
+                    String[] cookieArray = cookieStr.split(";");
+                    Map<String, String> cookieMap = new HashMap<String, String>();
+                    for (String cookie : cookieArray) {
+                        String[] kv = cookie.split("=");
+                        if (kv.length > 1) {
+                            cookieMap.put(kv[0].trim(), kv[1].trim());
+                        }
+                    }
+                    BasicClientCookie clientCookie = new BasicClientCookie(cookieArray[0].split("=")[0],
+                            cookieArray[0].split("=")[1]);
+                    clientCookie.setDomain("pangolin.bytedance.com");
+                    clientCookie.setPath(cookieMap.get("path"));
+                    HttpUtils2.cookieStore.addCookie(clientCookie);
+                }
+            }
+            Map<String, Object> paramMap = new HashMap<>();
+            List<Long> appIds = new ArrayList<>();
+            appIds.add(appId);
+            paramMap.put("isInternal", 0);
+            paramMap.put("channelName", "");
+            paramMap.put("appId", appIds);
+            String result = HttpUtils2.httpPostRequest(url, paramMap, null);
+            System.out.println(result);
+            if (checkLogin(bindAccountLogin, result)) {
+                JsonNode resultNode = mapper.readTree(result);
+                Iterator<String> clickIterator = resultNode.get("data").get("ChartData").get("click_num").fieldNames();
+                while (clickIterator.hasNext()) {
+                    String date = clickIterator.next();
+                    JsonNode clickNode = resultNode.get("data").get("ChartData").get("click_num").get(date);
+                    int size = clickNode.size();
+                    for (int i = 0; i < size; i++) {
+                        BigDecimal clickNum = clickNode.get(i).decimalValue();
+                        PangolinReportAppHour pangolinReportAppHour = new PangolinReportAppHour();
+                        pangolinReportAppHour.setAppId(appId);
+                        pangolinReportAppHour.setDate(DateUtils.parseDate(date, "yyyy-MM-dd"));
+                        pangolinReportAppHour.setNum(clickNum);
+                        pangolinReportAppHour.setType("click");
+                        pangolinReportAppHour.setHour(i);
+                        QueryWrapper<PangolinReportAppHour> queryWrapper = new QueryWrapper<>();
+                        queryWrapper.eq("date", pangolinReportAppHour.getDate());
+                        queryWrapper.eq("app_id", pangolinReportAppHour.getAppId());
+                        queryWrapper.eq("type", pangolinReportAppHour.getType());
+                        queryWrapper.eq("hour", pangolinReportAppHour.getHour());
+                        if (pangolinReportAppHourService.getOne(queryWrapper) == null) {
+                            pangolinReportAppHourService.save(pangolinReportAppHour);
+                        } else {
+                            pangolinReportAppHourService.update(pangolinReportAppHour, queryWrapper);
+                        }
+//                        pangolinReportAppHourService.saveOrUpdate(pangolinReportAppHour);
+                    }
+                }
+                Iterator<String> activeIterator = resultNode.get("data").get("ChartData").get("active_num").fieldNames();
+                while (activeIterator.hasNext()) {
+                    String date = activeIterator.next();
+                    JsonNode activeNode = resultNode.get("data").get("ChartData").get("active_num").get(date);
+                    int size = activeNode.size();
+                    for (int i = 0; i < size; i++) {
+                        BigDecimal activeNum = activeNode.get(i).decimalValue();
+                        PangolinReportAppHour pangolinReportAppHour = new PangolinReportAppHour();
+                        pangolinReportAppHour.setAppId(appId);
+                        pangolinReportAppHour.setDate(DateUtils.parseDate(date, "yyyy-MM-dd"));
+                        pangolinReportAppHour.setNum(activeNum);
+                        pangolinReportAppHour.setType("active");
+                        pangolinReportAppHour.setHour(i);
+                        QueryWrapper<PangolinReportAppHour> queryWrapper = new QueryWrapper<>();
+                        queryWrapper.eq("date", pangolinReportAppHour.getDate());
+                        queryWrapper.eq("app_id", pangolinReportAppHour.getAppId());
+                        queryWrapper.eq("type", pangolinReportAppHour.getType());
+                        queryWrapper.eq("hour", pangolinReportAppHour.getHour());
+                        if (pangolinReportAppHourService.getOne(queryWrapper) == null) {
+                            pangolinReportAppHourService.save(pangolinReportAppHour);
+                        } else {
+                            pangolinReportAppHourService.update(pangolinReportAppHour, queryWrapper);
+                        }
+                    }
+                }
+                Iterator<String> rateIterator = resultNode.get("data").get("ChartData").get("ratio").fieldNames();
+                while (rateIterator.hasNext()) {
+                    String date = rateIterator.next();
+                    JsonNode rateNode = resultNode.get("data").get("ChartData").get("ratio").get(date);
+                    int size = rateNode.size();
+                    for (int i = 0; i < size; i++) {
+                        BigDecimal clickNum = rateNode.get(i).decimalValue();
+                        PangolinReportAppHour pangolinReportAppHour = new PangolinReportAppHour();
+                        pangolinReportAppHour.setAppId(appId);
+                        pangolinReportAppHour.setDate(DateUtils.parseDate(date, "yyyy-MM-dd"));
+                        pangolinReportAppHour.setNum(clickNum);
+                        pangolinReportAppHour.setType("rate");
+                        pangolinReportAppHour.setHour(i);
+                        QueryWrapper<PangolinReportAppHour> queryWrapper = new QueryWrapper<>();
+                        queryWrapper.eq("date", pangolinReportAppHour.getDate());
+                        queryWrapper.eq("app_id", pangolinReportAppHour.getAppId());
+                        queryWrapper.eq("type", pangolinReportAppHour.getType());
+                        queryWrapper.eq("hour", pangolinReportAppHour.getHour());
+                        if (pangolinReportAppHourService.getOne(queryWrapper) == null) {
+                            pangolinReportAppHourService.save(pangolinReportAppHour);
+                        } else {
+                            pangolinReportAppHourService.update(pangolinReportAppHour, queryWrapper);
+                        }
+                    }
+                }
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    public boolean checkLogin(BindAccountLogin bindAccountLogin, String response) {
+        if (response.contains("<html>")) {
+            bindAccountLogin.setCookie(null);
+            bindAccountLoginService.updateById(bindAccountLogin);
+            return false;
+        }
+        return true;
+    }
+}

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

@@ -0,0 +1,11 @@
+package cn.com.ctop.crawler.modules.pangolin.service.impl;
+
+import cn.com.ctop.crawler.modules.pangolin.entity.PangolinReportAppHour;
+import cn.com.ctop.crawler.modules.pangolin.mapper.PangolinReportAppHourMapper;
+import cn.com.ctop.crawler.modules.pangolin.service.PangolinReportAppHourService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+@Service
+public class PangolinReportAppHourServiceImpl extends ServiceImpl<PangolinReportAppHourMapper, PangolinReportAppHour> implements PangolinReportAppHourService {
+}

+ 4 - 1
module-ctop/src/main/java/cn/com/ctop/manage/modules/edu/service/IEduLessonService.java

@@ -15,5 +15,8 @@ public interface IEduLessonService extends IService<EduLesson> {
     public void getBytedanceEduLesson(String url);
     public void getKuaishouEduLesson(String url);
     public List<String> getTitleList(String media);
-    public List<String> getTopicList(String media,String title);
+
+    public List<String> getTopicList(String media, String title);
+
+    String uploadLesson(EduLesson eduLesson);
 }

+ 18 - 0
module-ctop/src/main/java/cn/com/ctop/manage/modules/edu/service/IMaterialUploadService.java

@@ -0,0 +1,18 @@
+package cn.com.ctop.manage.modules.edu.service;
+
+import com.alibaba.fastjson.JSONArray;
+
+import java.io.IOException;
+
+public interface IMaterialUploadService {
+
+    /**
+     * 同步素材到账号下
+     *
+     * @param mediaId
+     * @param materialArray
+     * @param accountArray
+     */
+    void uploadAccount(String mediaId, JSONArray materialArray, JSONArray accountArray) throws IOException;
+
+}

+ 21 - 6
module-ctop/src/main/java/cn/com/ctop/manage/modules/edu/service/impl/EduLessonServiceImpl.java

@@ -9,14 +9,13 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.ObjectMapper;
+import org.apache.shiro.SecurityUtils;
+import org.jeecg.common.system.vo.LoginUser;
 import org.jeecg.common.util.DateUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 
 /**
  * 在线培训
@@ -106,7 +105,7 @@ public class EduLessonServiceImpl extends ServiceImpl<EduLessonMapper, EduLesson
         try {
             JsonNode rootNode = mapper.readTree(result);
             String status = rootNode.get("status").asText();
-            if (status == null || !"success".equals(status)) {
+            if (status == null || !status.equals("success")) {
                 return;
             }
             String title = rootNode.get("data").get("title").asText();
@@ -124,7 +123,7 @@ public class EduLessonServiceImpl extends ServiceImpl<EduLessonMapper, EduLesson
                     System.out.println(detailResult);
                     JsonNode detailNode = mapper.readTree(detailResult);
                     status = detailNode.get("status").asText();
-                    if (status == null || !"success".equals(status)) {
+                    if (status == null || !status.equals("success")) {
                         return;
                     }
                     JsonNode courseNode = detailNode.get("data").get("course_data");
@@ -170,4 +169,20 @@ public class EduLessonServiceImpl extends ServiceImpl<EduLessonMapper, EduLesson
             e.printStackTrace();
         }
     }
+
+    //培训视频上传接口
+    @Override
+    public String uploadLesson(EduLesson eduLesson) {
+        String uuid = UUID.randomUUID().toString().replaceAll("-", "");
+        System.out.println();
+
+        LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
+        eduLesson.setLessonId(uuid);
+        eduLesson.setCreator(sysUser.getRealname());
+
+        save(eduLesson);
+        return uuid;
+    }
+
+
 }

+ 295 - 0
module-ctop/src/main/java/cn/com/ctop/manage/modules/edu/service/impl/MaterialUploadServiceImpl.java

@@ -0,0 +1,295 @@
+package cn.com.ctop.manage.modules.edu.service.impl;
+
+import cn.com.ctop.common.module.entity.CtopOauthToken;
+import cn.com.ctop.common.module.entity.MaterialInfo;
+import cn.com.ctop.common.module.entity.MaterialParameter;
+import cn.com.ctop.common.module.enums.MaterialEnum;
+import cn.com.ctop.common.module.mapper.CtopOauthTokenMapper;
+import cn.com.ctop.common.module.mapper.MaterialInfoMapper;
+import cn.com.ctop.common.module.mapper.MaterialParameterMapper;
+import cn.com.ctop.common.module.service.IFileInfoService;
+import cn.com.ctop.common.module.service.IMaterialParameterService;
+import cn.com.ctop.common.module.utils.Check;
+import cn.com.ctop.common.module.utils.KuaishouInterfaceConstant;
+import cn.com.ctop.common.module.utils.LoadFileUtil;
+import cn.com.ctop.common.module.utils.PropertiesUtils;
+import cn.com.ctop.kuaishou.modules.batch.entity.KuaiShouVideoGet;
+import cn.com.ctop.kuaishou.modules.batch.service.IKuaiShouImageGetService;
+import cn.com.ctop.kuaishou.modules.batch.service.IKuaiShouVideoGetService;
+import cn.com.ctop.kuaishou.modules.batch.service.IKuaishouInterfaceService;
+import cn.com.ctop.manage.modules.material.service.IMaterialUploadImageService;
+import cn.com.ctop.manage.modules.material.service.IMaterialUploadService;
+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.apache.http.ParseException;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.core.io.FileSystemResource;
+import org.springframework.http.HttpEntity;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpMethod;
+import org.springframework.http.ResponseEntity;
+import org.springframework.stereotype.Service;
+import org.springframework.util.LinkedMultiValueMap;
+import org.springframework.util.MultiValueMap;
+import org.springframework.web.client.RestTemplate;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+
+@Slf4j
+@Service
+public class MaterialUploadServiceImpl implements IMaterialUploadService {
+    static ExecutorService kuaiShouExecutorService = Executors.newFixedThreadPool(5);
+    static ExecutorService touTiaoExecutorService = Executors.newFixedThreadPool(5);
+    @Value("${oss.replace.replace-value}")
+    private String replaceValue;
+    @Value("${oss.replace.replace-old-value}")
+    private String replaceOldValue;
+    @Value("${oss.replace.download}")
+    private String downloadUrl;
+
+
+    @Autowired
+    private CtopOauthTokenMapper oauthTokenMapper;
+    @Autowired
+    private MaterialInfoMapper materialInfoMapper;
+    @Autowired
+    private IKuaishouInterfaceService kuaishouInterfaceService;
+    @Autowired
+    private IFileInfoService fileInfoService;
+    @Autowired
+    private IKuaiShouImageGetService iKuaiShouImageGetService;
+    @Autowired
+    private IMaterialParameterService materialParameterService;
+    @Autowired
+    private MaterialParameterMapper parameterMapper;
+    @Autowired
+    private IKuaiShouVideoGetService kuaiShouVideoGetService;
+    @Autowired
+    private IMaterialUploadImageService materialUploadImageService;
+
+
+    /**
+     * 同步素材到账号下
+     *
+     * @param mediaId
+     * @param materialArray
+     * @param accountArray
+     */
+
+    @Override
+    public void uploadAccount(String mediaId, JSONArray materialArray, JSONArray accountArray) {
+        try {
+            if ("2".equals(mediaId)) {
+                this.kuaiShouUpload(mediaId, materialArray, accountArray);
+            } else if ("1".equals(mediaId)) {
+                this.touTiaoUpload(mediaId, materialArray, accountArray);
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+
+    }
+
+
+    private void touTiaoUpload(String mediaId, JSONArray materialArray, JSONArray accountArray) {
+        for (int j = 0; j < materialArray.size(); j++) {
+            String materialId = materialArray.getString(j);
+            MaterialInfo materialInfo = materialInfoMapper.selectById(materialId);
+            if (Check.isNull(materialInfo)) {
+                continue;
+            }
+            if (Check.isNull(materialInfo.getUrl())) {
+                continue;
+            }
+
+
+            try {
+                String url = materialInfo.getUrl().replace(replaceOldValue, replaceValue);
+                String localUrl = LoadFileUtil.downLoadFromUrl(url, downloadUrl);
+
+                for (int i = 0; i < accountArray.size(); i++) {
+                    Long accountId = accountArray.getLong(i);
+                    if (Check.isNull(accountId)) {
+                        continue;
+                    }
+                    touTiaoExecutorService.submit(new Runnable() {
+                        @Override
+                        public void run() {
+                            try {
+                                log.info("头条文件多线程上传:{},accountId:{}", Thread.currentThread().getName(), accountId);
+                                if ("VIDEO".equals(materialInfo.getType())) {
+                                    fileInfoService.uploadVideoToBytedance(String.valueOf(accountId), localUrl);
+
+                                } else if ("IMAGE".equals(materialInfo.getType())) {
+                                    fileInfoService.uploadImageToBytedance(String.valueOf(accountId), localUrl);
+                                }
+
+                            } catch (Exception e) {
+                                e.printStackTrace();
+                            }
+                        }
+                    });
+                }
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+
+
+        }
+
+
+    }
+
+
+    private void kuaiShouUpload(String mediaId, JSONArray materialArray, JSONArray accountArray) {
+        for (int j = 0; j < materialArray.size(); j++) {
+            String materialId = materialArray.getString(j);
+            MaterialInfo materialInfo = materialInfoMapper.selectById(materialId);
+            if (Check.isNull(materialInfo)) {
+                continue;
+            }
+            if (Check.isNull(materialInfo.getUrl())) {
+                continue;
+            }
+            try {
+                String url = materialInfo.getUrl().replace(replaceOldValue, replaceValue);
+                log.info("replaceUrl:{}", url);
+                String localUrl = LoadFileUtil.downLoadFromUrl(url, downloadUrl);
+                FileSystemResource resource = new FileSystemResource(new File(localUrl));
+                Map<String, String> headerMap = new HashMap<>();
+                headerMap.put("Content-Type", "multipart/form-data");
+                JSONObject requestJson = new JSONObject();
+                requestJson.put("file", resource);
+                requestJson.put("signature", materialInfo.getCode());
+
+                QueryWrapper<MaterialParameter> parameterQueryWrapper = new QueryWrapper<>();
+                parameterQueryWrapper.eq("material_id", materialInfo.getCode());
+                parameterQueryWrapper.orderByDesc("create_time").last("limit 1");
+                MaterialParameter materialParameter = materialParameterService.getOne(parameterQueryWrapper);
+                if (!Check.isNull(materialParameter)) {
+                    Integer type = MaterialEnum.getTypeBySize(Integer.valueOf(materialParameter.getWidth()), Integer.valueOf(materialParameter.getHeight()));
+                    if (!Check.isNull(type) && type != 0) {
+                        requestJson.put("type", type);
+                    }
+                }
+                for (int i = 0; i < accountArray.size(); i++) {
+                    Long accountId = accountArray.getLong(i);
+                    QueryWrapper<CtopOauthToken> tokenQueryWrapper = new QueryWrapper<>();
+                    tokenQueryWrapper.eq("account_id", accountId);
+                    tokenQueryWrapper.eq("media_id", mediaId);
+                    tokenQueryWrapper.orderByDesc("create_time");
+                    tokenQueryWrapper.last("limit 1");
+                    CtopOauthToken ctopOauthToken = oauthTokenMapper.selectOne(tokenQueryWrapper);
+                    if (Check.isNull(ctopOauthToken)) {
+                        continue;
+                    }
+                    requestJson.put("advertiser_id", accountId);
+                    headerMap.put("Access-Token", ctopOauthToken.getAccessToken());
+                    kuaiShouExecutorService.submit(new Runnable() {
+                        @Override
+                        public void run() {
+                            try {
+                                log.info("快手文件多线程上传:{},accountId:{}", Thread.currentThread().getName(), accountId);
+                                String url = PropertiesUtils.getConfig("kuaishou_api_url") + KuaishouInterfaceConstant.VIDEO_UPLOAD;
+
+                                String result = exceptInfoForRestTemplate(url, requestJson, headerMap);
+                                JSONObject resultJson = JSONObject.parseObject(result);
+                                if (!Check.isNull(resultJson)) {
+                                    if (resultJson.getInteger("code") == 0) {
+                                        JSONObject dataJson = resultJson.getJSONObject("data");
+                                        if (!Check.isNull(dataJson)) {
+
+
+                                            // kuaishouInterfaceService.videoGet(accountId, ctopOauthToken.getAccessToken(), dataJson.getString("photo_id"), dataJson.getString("signature"));
+                                            String photoId = dataJson.getString("photo_id");
+                                            String signature = dataJson.getString("signature");
+                                            KuaiShouVideoGet videoGet = new KuaiShouVideoGet();
+                                            videoGet.setAccountId(accountId);
+                                            videoGet.setId(accountId + photoId);
+                                            videoGet.setUrl(materialInfo.getUrl());
+                                            QueryWrapper<MaterialParameter> parameterQueryWrapper = new QueryWrapper<>();
+                                            parameterQueryWrapper.eq("material_id", signature);
+                                            parameterQueryWrapper.last("limit 1");
+
+                                            MaterialParameter materialParameter = parameterMapper.selectOne(parameterQueryWrapper);
+                                            if (!Check.isNull(materialParameter)) {
+                                                String width = materialParameter.getWidth();
+                                                String height = materialParameter.getHeight();
+                                                videoGet.setWidth(Integer.valueOf(width));
+                                                videoGet.setHeight(Integer.valueOf(height));
+                                                Integer type = MaterialEnum.getTypeBySize(Integer.valueOf(width), Integer.valueOf(height));
+                                                if (!Check.isNull(type)) {
+                                                    videoGet.setMaterialType(type);
+                                                }
+                                            }
+                                            videoGet.setPhotoId(photoId);
+                                            //    videoGet.setCoverUrl(dataJson.getString("cover_url"));
+                                            videoGet.setSignature(signature);
+                                            kuaiShouVideoGetService.saveOrUpdate(videoGet);
+                                            materialUploadImageService.uploadImage(videoGet.getId(), accountId, ctopOauthToken.getAccessToken());
+
+                                        }
+                                        log.info("快手素材同步完成,accountId:{},code:{},返回信息:{}", accountId, materialInfo.getCode(), resultJson);
+                                    } else {
+                                        log.error("快手同步素材失败,返回信息:{},请求参数:{}", resultJson, requestJson);
+                                    }
+                                }
+
+                            } catch (Exception e) {
+                                e.printStackTrace();
+                            }
+                        }
+                    });
+
+                }
+                /*boolean isTrue = LoadFileUtil.delFile(localUrl);
+                if (isTrue) {
+                    log.info("删除本地缓存素材成功,code:{}", materialInfo.getCode());
+                }*/
+
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+
+
+        }
+
+
+    }
+
+
+    @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<>();
+            if (!Check.isNullMap(paramMap)) {
+                for (String key : paramMap.keySet()) {
+                    param.add(key, paramMap.get(key));
+                }
+                HttpHeaders headers = new HttpHeaders();
+                if (!Check.isNullMap(headerMap)) {
+                    for (String key : headerMap.keySet()) {
+                        headers.add(key, headerMap.get(key));
+                    }
+                }
+                HttpEntity<MultiValueMap<String, Object>> httpEntity = new HttpEntity<MultiValueMap<String, Object>>(param, headers);
+                ResponseEntity<String> responseEntity = rest.exchange(url, HttpMethod.POST, httpEntity, String.class);
+                return responseEntity.getBody();
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+}

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

@@ -78,6 +78,10 @@ public class BatchController {
     private IKuaiShouImageGetService imageGetService;
     @Autowired
     private IKuaiShouVideoGetService videoGetService;
+    @Autowired
+    private IKuaishouPopulationService populationService;
+    @Autowired
+    private KuaiShouGroupMapper groupMapper;
 
 
     /**
@@ -90,15 +94,17 @@ public class BatchController {
     public Result<SpendVo> spend(Long accountId) {
         Result<SpendVo> result = new Result<>();
         try {
+
             CtopOauthToken oauthToken = oauthTokenService.getTokenByAccountId(accountId);
             if (Check.isNull(oauthToken)) {
                 throw new Exception("未获取到账户信息");
             }
             SpendVo spendVo = new SpendVo();
             JSONObject fundJson = iKuaishouInterfaceService.fundGet(oauthToken);
+
+
             if (!Check.isNull(fundJson)) {
-                // 余额
-                spendVo.setBalance(fundJson.getBigDecimal("balance"));
+                spendVo.setBalance(fundJson.getBigDecimal("balance")); // 余额
             }
             BigDecimal cost = batchService.getCost(accountId);
             spendVo.setCost(cost);
@@ -107,8 +113,18 @@ 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());
+                    iKuaishouInterfaceService.getPopulationList(accountId, oauthToken.getAccessToken());
+                }
+            };
+            thread.start();
+
         } catch (Exception e) {
-            log.error(e.getMessage());
+            e.printStackTrace();
             result.setSuccess(false);
             result.setMessage(e.getMessage());
         }
@@ -131,10 +147,10 @@ public class BatchController {
                                                            @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
                                                            @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
                                                            HttpServletRequest req) {
-        Result<IPage<KuaiShouCampaign>> result = new Result<>();
+        Result<IPage<KuaiShouCampaign>> result = new Result<IPage<KuaiShouCampaign>>();
         QueryWrapper<KuaiShouCampaign> queryWrapper = QueryGenerator.initQueryWrapper(kuaiShouCampaign, req.getParameterMap());
         queryWrapper.orderByDesc("put_create_time");
-        Page<KuaiShouCampaign> page = new Page<>(pageNo, pageSize);
+        Page<KuaiShouCampaign> page = new Page<KuaiShouCampaign>(pageNo, pageSize);
         IPage<KuaiShouCampaign> pageList = kuaiShouCampaignService.page(page, queryWrapper);
         result.setSuccess(true);
         result.setResult(pageList);
@@ -339,10 +355,10 @@ public class BatchController {
                                                     @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
                                                     @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
                                                     HttpServletRequest req) {
-        Result<IPage<KuaiShouGroup>> result = new Result<>();
+        Result<IPage<KuaiShouGroup>> result = new Result<IPage<KuaiShouGroup>>();
         QueryWrapper<KuaiShouGroup> queryWrapper = QueryGenerator.initQueryWrapper(kuaiShouGroup, req.getParameterMap());
         queryWrapper.orderByDesc("group_create_time");
-        Page<KuaiShouGroup> page = new Page<>(pageNo, pageSize);
+        Page<KuaiShouGroup> page = new Page<KuaiShouGroup>(pageNo, pageSize);
         IPage<KuaiShouGroup> pageList = kuaiShouGroupService.page(page, queryWrapper);
         result.setSuccess(true);
         result.setResult(pageList);
@@ -368,7 +384,7 @@ public class BatchController {
             result.setSuccess(true);
             result.setResult(pageList);
         } catch (Exception e) {
-            log.error(e.getMessage());
+            e.printStackTrace();
             result.setSuccess(false);
 
         }
@@ -436,26 +452,21 @@ public class BatchController {
 
 
     /**
-     * 获取人群包接口
+     * 获取人群包
      *
      * @param accountId
      * @return
      */
     @GetMapping(value = "/getPopulationList")
-    public Result<JSONArray> getAppList(Long accountId) {
-        Result<JSONArray> result = new Result<>();
-        try {
-            CtopOauthToken oauthToken = oauthTokenService.getTokenByAccountId(accountId);
-            if (Check.isNull(oauthToken)) {
-                throw new Exception("未获取到账户信息");
-            }
-            JSONArray jsonArray = iKuaishouInterfaceService.getPopulationList(accountId, oauthToken.getAccessToken());
-            result.setSuccess(true);
-            result.setResult(jsonArray);
-        } catch (Exception e) {
-            e.printStackTrace();
-            result.setSuccess(false);
-        }
+    public Result<List<KuaishouPopulation>> queryPageList(Long accountId) {
+        Result<List<KuaishouPopulation>> result = new Result();
+        QueryWrapper<KuaishouPopulation> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("account_id", accountId);
+        queryWrapper.eq("status", 4);
+        queryWrapper.orderByDesc("put_time");
+        List<KuaishouPopulation> list = populationService.list(queryWrapper);
+        result.setSuccess(true);
+        result.setResult(list);
         return result;
     }
 
@@ -941,6 +952,8 @@ public class BatchController {
             if (bid == null) {
                 throw new Exception("请输入出价");
             }
+
+            Long deepConversionBid = requestJson.getLong("deepConversionBid");
             String userId = requestJson.getString("userId");
             JSONArray unitIds = requestJson.getJSONArray("unitIds");
             JSONArray failArr = new JSONArray();
@@ -948,13 +961,21 @@ public class BatchController {
                 for (int i = 0; i < unitIds.size(); i++) {
                     Long unitId = unitIds.getLong(i);
                     if (!Check.isNull(unitId)) {
+                        KuaiShouGroup group = batchService.getUnitInfo(accountId, unitId);
+
                         Map<String, Object> updateMap = updateService.updateUnitBid(token.getAccessToken(), accountId, unitId, bid, userId);
+                        if (!Check.isNull(deepConversionBid) && deepConversionBid != 0) {
+                            Long updateDeepConversionBid = group.getDeepConversionBid();
+                            if (!Check.isNull(updateDeepConversionBid) && updateDeepConversionBid != 0) {
+                                Map<String, Object> updateDeepMap = updateService.updateUnitDeepConversionBid(token.getAccessToken(), accountId, unitId, deepConversionBid, userId);
+                            }
+                            iKuaishouInterfaceService.getGroup(token.getAccessToken(), accountId, unitId);
+                        }
                         if (!Check.isNull(updateMap)) {
                             Integer code = (Integer) updateMap.get("code");
                             if (code != 0) {
                                 JSONObject failJson = new JSONObject();
                                 failJson.put("message", updateMap.get("message"));
-                                KuaiShouGroup group = batchService.getUnitInfo(accountId, unitId);
                                 if (!Check.isNull(group)) {
                                     failJson.put("unitName", group.getUnitName());
                                 }
@@ -1014,17 +1035,17 @@ 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<>();
+        Result<IPage<KuaiShouVideoGet>> result = new Result<IPage<KuaiShouVideoGet>>();
         try {
             QueryWrapper<KuaiShouVideoGet> queryWrapper = QueryGenerator.initQueryWrapper(kuaiShouVideoGet, req.getParameterMap());
             queryWrapper.orderByDesc("create_time");
-            Page<KuaiShouVideoGet> page = new Page<>(pageNo, pageSize);
+            Page<KuaiShouVideoGet> page = new Page<KuaiShouVideoGet>(pageNo, pageSize);
             IPage<KuaiShouVideoGet> pageList = kuaiShouVideoGetService.page(page, queryWrapper);
             result.setSuccess(true);
             result.setResult(pageList);
             return result;
         } catch (Exception e) {
-            log.error(e.getMessage());
+            e.printStackTrace();
             result.setSuccess(false);
         }
 
@@ -1039,17 +1060,19 @@ public class BatchController {
      * @return
      */
     @GetMapping(value = "/getCreativeCopywriter")
-    public Result<MaterialInfo> getVideoList(String code) {
+    public Result<MaterialInfo> getCreativeCopywriter(String code, Long accountId) {
         Result<MaterialInfo> result = new Result<>();
         try {
+            Long projectId = materialInfoMapper.getProjectIdByAccountId(accountId);
             QueryWrapper<MaterialInfo> materialInfoQueryWrapper = new QueryWrapper<>();
             materialInfoQueryWrapper.eq("code", code);
+            materialInfoQueryWrapper.eq("project_id", projectId);
             materialInfoQueryWrapper.last("limit 1");
             MaterialInfo materialInfo = materialInfoMapper.selectOne(materialInfoQueryWrapper);
             result.setSuccess(true);
             result.setResult(materialInfo);
-
         } catch (Exception e) {
+
             e.printStackTrace();
             result.setSuccess(false);
         }
@@ -1193,7 +1216,7 @@ public class BatchController {
      */
     @PostMapping(value = "/addDirectionalTemplate")
     public Result<KuaiShouDirectionalTemplate> add(@RequestBody KuaiShouDirectionalTemplate kuaiShouDirectionalTemplate) {
-        Result<KuaiShouDirectionalTemplate> result = new Result<>();
+        Result<KuaiShouDirectionalTemplate> result = new Result<KuaiShouDirectionalTemplate>();
         try {
             kuaiShouDirectionalTemplateService.save(kuaiShouDirectionalTemplate);
             result.success("添加成功!");
@@ -1213,7 +1236,7 @@ public class BatchController {
      */
     @PutMapping(value = "/editDirectionalTemplate")
     public Result<KuaiShouDirectionalTemplate> editDirectionalTemplate(@RequestBody KuaiShouDirectionalTemplate kuaiShouDirectionalTemplate) {
-        Result<KuaiShouDirectionalTemplate> result = new Result<>();
+        Result<KuaiShouDirectionalTemplate> result = new Result<KuaiShouDirectionalTemplate>();
         KuaiShouDirectionalTemplate kuaiShouDirectionalTemplateEntity = kuaiShouDirectionalTemplateService.getById(kuaiShouDirectionalTemplate.getId());
         if (kuaiShouDirectionalTemplateEntity == null) {
             result.error500("未找到对应实体");
@@ -1525,6 +1548,12 @@ public class BatchController {
     }
 
 
+    /**
+     * 批量复制组
+     *
+     * @param requestJson
+     * @return
+     */
     @PostMapping(value = "/batchCopyUnit")
     public Result<JSONObject> batchCopyUnit(@RequestBody JSONObject requestJson) {
         Result<JSONObject> result = new Result<>();
@@ -1555,7 +1584,15 @@ public class BatchController {
                 if (Check.isNull(group)) {
                     continue;
                 }
-                String unitName = group.getUnitName();
+                String unitNameStr = group.getUnitName();
+                String unitName;
+
+                if (unitNameStr.contains("#")) {
+                    int lastIndexOf = unitNameStr.lastIndexOf("#");
+                    unitName = unitNameStr.substring(0, lastIndexOf);
+                } else {
+                    unitName = unitNameStr;
+                }
                 group.setUnitName(unitName + RandomUtil.verifyCode());
                 JSONObject unitJson = batchService.copyUnit(group, copyToCampaignId);
                 if (!Check.isNull(unitJson)) {
@@ -1583,9 +1620,12 @@ public class BatchController {
     }
 
 
-    @Autowired
-    private KuaiShouGroupMapper groupMapper;
-
+    /**
+     * 复制组
+     *
+     * @param requestJson
+     * @return
+     */
     @PostMapping(value = "/copyUnit")
     public Result<JSONObject> copyUnit(@RequestBody JSONObject requestJson) {
         Result<JSONObject> result = new Result<>();
@@ -1600,15 +1640,11 @@ public class BatchController {
             if (Check.isNull(createCount) || createCount == 0) {
                 throw new Exception("请选择迭代次数");
             }
-
             if (createCount == 1) {
                 JSONObject createJson = batchService.createUnit(requestJson);
-
                 if (!Check.isNull(createJson)) {
                     failArr = createJson.getJSONArray("fail");
                 }
-
-
             } else if (createCount > 1) {
                 QueryWrapper<KuaiShouGroup> queryWrapper = new QueryWrapper<>();
                 queryWrapper.eq("account_id", accountId);
@@ -1617,7 +1653,16 @@ public class BatchController {
                 if (Check.isNull(group)) {
                     throw new Exception("未获取到广告组信息");
                 }
-                String unitName = group.getUnitName();
+                String unitNameStr = group.getUnitName();
+                String unitName;
+
+                if (unitNameStr.contains("#")) {
+                    int lastIndexOf = unitNameStr.lastIndexOf("#");
+                    unitName = unitNameStr.substring(0, lastIndexOf);
+                } else {
+                    unitName = unitNameStr;
+                }
+
                 Integer createType = requestJson.getInteger("createType");
                 if (createType == 1) { // 系统生成
                     for (int i = 0; i < createCount; i++) {
@@ -1664,12 +1709,103 @@ public class BatchController {
             result.setSuccess(true);
 
         } catch (Exception e) {
-            log.error(e.getMessage(), e);
+            e.printStackTrace();
             result.setSuccess(false);
             result.setMessage(e.getMessage());
         }
         return result;
     }
 
+    /**
+     * 获取人群包
+     *
+     * @param accountId
+     * @return
+     */
+    @GetMapping(value = "/pullPopulationList")
+    public Result pullPopulationList(Long accountId) {
+        Result result = new Result<>();
+        try {
+
+            CtopOauthToken oauthToken = oauthTokenService.getTokenByAccountId(accountId);
+            if (Check.isNull(oauthToken)) {
+                throw new Exception("未获取到账户信息");
+            }
+            Thread thread = new Thread() {
+                @Override
+                public void run() {
+                    iKuaishouInterfaceService.getPopulationList(accountId, oauthToken.getAccessToken());
+                }
+            };
+            thread.start();
+
+            result.setSuccess(true);
+        } catch (Exception e) {
+            e.printStackTrace();
+            result.setSuccess(false);
+        }
+        return result;
+    }
+
+
+    /**
+     * 获取创意
+     *
+     * @param accountId
+     * @param campaignId
+     * @return
+     */
+    @GetMapping(value = "/getAsyncCreativeList")
+    public Result getAsyncCreativeList(Long accountId, Long campaignId) {
+        Result result = new Result<>();
+        try {
+            if (Check.isNull(campaignId) || Check.isNull(accountId)) {
+                throw new Exception("必填参数不能为空");
+            }
+            CtopOauthToken oauthToken = oauthTokenService.getTokenByAccountId(accountId);
+            if (Check.isNull(oauthToken)) {
+                throw new Exception("未获取到账户信息");
+            }
+            Thread thread = new Thread() {
+                @Override
+                public void run() {
+                    iKuaishouInterfaceService.getAsyncCreativeList(accountId, oauthToken.getAccessToken(), campaignId);
+                }
+            };
+            thread.start();
+
+            result.setSuccess(true);
+        } catch (Exception e) {
+            e.printStackTrace();
+            result.setSuccess(false);
+        }
+        return result;
+    }
+
+
+    /**
+     * 获取当前组下创意数
+     *
+     * @param accountId
+     * @param unitId
+     * @return
+     */
+    @GetMapping(value = "/checkCreativeCount")
+    public Result checkCreativeCount(Long accountId, Long unitId) {
+        Result result = new Result<>();
+        try {
+            if (Check.isNull(unitId) || Check.isNull(accountId)) {
+                throw new Exception("必填参数不能为空");
+            }
+            Integer count = kuaiShouCreativeService.checkCreativeCount(accountId, unitId);
+            result.setResult(count);
+            result.setSuccess(true);
+        } catch (Exception e) {
+            e.printStackTrace();
+            result.setSuccess(false);
+        }
+        return result;
+    }
+
 
 }

+ 248 - 0
module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/batch/controller/KuaishouPopulationController.java

@@ -0,0 +1,248 @@
+package cn.com.ctop.kuaishou.modules.batch.controller;
+
+import cn.com.ctop.kuaishou.modules.batch.entity.KuaishouPopulation;
+import cn.com.ctop.kuaishou.modules.batch.service.IKuaishouPopulationService;
+import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.common.aspect.annotation.AutoLog;
+import org.jeecg.common.system.query.QueryGenerator;
+import org.jeecg.common.util.oConvertUtils;
+import org.jeecgframework.poi.excel.ExcelImportUtil;
+import org.jeecgframework.poi.excel.def.NormalExcelConstants;
+import org.jeecgframework.poi.excel.entity.ExportParams;
+import org.jeecgframework.poi.excel.entity.ImportParams;
+import org.jeecgframework.poi.excel.view.JeecgEntityExcelView;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.multipart.MultipartHttpServletRequest;
+import org.springframework.web.servlet.ModelAndView;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.net.URLDecoder;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 人群包列表
+ *
+ * @author jeecg-boot
+ * @version V1.0
+ * @date 2020-05-06
+ */
+@Slf4j
+@Api(tags = "人群包列表")
+@RestController
+@RequestMapping("/abc/kuaishouPopulation")
+public class KuaishouPopulationController {
+    @Autowired
+    private IKuaishouPopulationService kuaishouPopulationService;
+
+    /**
+     * 分页列表查询
+     *
+     * @param kuaishouPopulation
+     * @param pageNo
+     * @param pageSize
+     * @param req
+     * @return
+     */
+    @AutoLog(value = "人群包列表-分页列表查询")
+    @ApiOperation(value = "人群包列表-分页列表查询", notes = "人群包列表-分页列表查询")
+    @GetMapping(value = "/list")
+    public Result<IPage<KuaishouPopulation>> queryPageList(KuaishouPopulation kuaishouPopulation,
+                                                           @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
+                                                           @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
+                                                           HttpServletRequest req) {
+        Result<IPage<KuaishouPopulation>> result = new Result<IPage<KuaishouPopulation>>();
+        QueryWrapper<KuaishouPopulation> queryWrapper = QueryGenerator.initQueryWrapper(kuaishouPopulation, req.getParameterMap());
+        Page<KuaishouPopulation> page = new Page<KuaishouPopulation>(pageNo, pageSize);
+        IPage<KuaishouPopulation> pageList = kuaishouPopulationService.page(page, queryWrapper);
+        result.setSuccess(true);
+        result.setResult(pageList);
+        return result;
+    }
+
+    /**
+     * 添加
+     *
+     * @param kuaishouPopulation
+     * @return
+     */
+    @AutoLog(value = "人群包列表-添加")
+    @ApiOperation(value = "人群包列表-添加", notes = "人群包列表-添加")
+    @PostMapping(value = "/add")
+    public Result<KuaishouPopulation> add(@RequestBody KuaishouPopulation kuaishouPopulation) {
+        Result<KuaishouPopulation> result = new Result<KuaishouPopulation>();
+        try {
+            kuaishouPopulationService.save(kuaishouPopulation);
+            result.success("添加成功!");
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+            result.error500("操作失败");
+        }
+        return result;
+    }
+
+    /**
+     * 编辑
+     *
+     * @param kuaishouPopulation
+     * @return
+     */
+    @AutoLog(value = "人群包列表-编辑")
+    @ApiOperation(value = "人群包列表-编辑", notes = "人群包列表-编辑")
+    @PutMapping(value = "/edit")
+    public Result<KuaishouPopulation> edit(@RequestBody KuaishouPopulation kuaishouPopulation) {
+        Result<KuaishouPopulation> result = new Result<KuaishouPopulation>();
+        KuaishouPopulation kuaishouPopulationEntity = kuaishouPopulationService.getById(kuaishouPopulation.getId());
+        if (kuaishouPopulationEntity == null) {
+            result.error500("未找到对应实体");
+        } else {
+            boolean ok = kuaishouPopulationService.updateById(kuaishouPopulation);
+            if (ok) {
+                result.success("修改成功!");
+            }
+        }
+
+        return result;
+    }
+
+    /**
+     * 通过id删除
+     *
+     * @param id
+     * @return
+     */
+    @AutoLog(value = "人群包列表-通过id删除")
+    @ApiOperation(value = "人群包列表-通过id删除", notes = "人群包列表-通过id删除")
+    @DeleteMapping(value = "/delete")
+    public Result<?> delete(@RequestParam(name = "id", required = true) String id) {
+        try {
+            kuaishouPopulationService.removeById(id);
+        } catch (Exception e) {
+            log.error("删除失败", e.getMessage());
+            return Result.error("删除失败!");
+        }
+        return Result.ok("删除成功!");
+    }
+
+    /**
+     * 批量删除
+     *
+     * @param ids
+     * @return
+     */
+    @AutoLog(value = "人群包列表-批量删除")
+    @ApiOperation(value = "人群包列表-批量删除", notes = "人群包列表-批量删除")
+    @DeleteMapping(value = "/deleteBatch")
+    public Result<KuaishouPopulation> deleteBatch(@RequestParam(name = "ids", required = true) String ids) {
+        Result<KuaishouPopulation> result = new Result<KuaishouPopulation>();
+        if (ids == null || "".equals(ids.trim())) {
+            result.error500("参数不识别!");
+        } else {
+            this.kuaishouPopulationService.removeByIds(Arrays.asList(ids.split(",")));
+            result.success("删除成功!");
+        }
+        return result;
+    }
+
+    /**
+     * 通过id查询
+     *
+     * @param id
+     * @return
+     */
+    @AutoLog(value = "人群包列表-通过id查询")
+    @ApiOperation(value = "人群包列表-通过id查询", notes = "人群包列表-通过id查询")
+    @GetMapping(value = "/queryById")
+    public Result<KuaishouPopulation> queryById(@RequestParam(name = "id", required = true) String id) {
+        Result<KuaishouPopulation> result = new Result<KuaishouPopulation>();
+        KuaishouPopulation kuaishouPopulation = kuaishouPopulationService.getById(id);
+        if (kuaishouPopulation == null) {
+            result.error500("未找到对应实体");
+        } else {
+            result.setResult(kuaishouPopulation);
+            result.setSuccess(true);
+        }
+        return result;
+    }
+
+    /**
+     * 导出excel
+     *
+     * @param request
+     * @param response
+     */
+    @RequestMapping(value = "/exportXls")
+    public ModelAndView exportXls(HttpServletRequest request, HttpServletResponse response) {
+        // Step.1 组装查询条件
+        QueryWrapper<KuaishouPopulation> queryWrapper = null;
+        try {
+            String paramsStr = request.getParameter("paramsStr");
+            if (oConvertUtils.isNotEmpty(paramsStr)) {
+                String deString = URLDecoder.decode(paramsStr, "UTF-8");
+                KuaishouPopulation kuaishouPopulation = JSON.parseObject(deString, KuaishouPopulation.class);
+                queryWrapper = QueryGenerator.initQueryWrapper(kuaishouPopulation, request.getParameterMap());
+            }
+        } catch (UnsupportedEncodingException e) {
+            e.printStackTrace();
+        }
+
+        //Step.2 AutoPoi 导出Excel
+        ModelAndView mv = new ModelAndView(new JeecgEntityExcelView());
+        List<KuaishouPopulation> pageList = kuaishouPopulationService.list(queryWrapper);
+        //导出文件名称
+        mv.addObject(NormalExcelConstants.FILE_NAME, "人群包列表列表");
+        mv.addObject(NormalExcelConstants.CLASS, KuaishouPopulation.class);
+        mv.addObject(NormalExcelConstants.PARAMS, new ExportParams("人群包列表列表数据", "导出人:Jeecg", "导出信息"));
+        mv.addObject(NormalExcelConstants.DATA_LIST, pageList);
+        return mv;
+    }
+
+    /**
+     * 通过excel导入数据
+     *
+     * @param request
+     * @param response
+     * @return
+     */
+    @RequestMapping(value = "/importExcel", method = RequestMethod.POST)
+    public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {
+        MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
+        Map<String, MultipartFile> fileMap = multipartRequest.getFileMap();
+        for (Map.Entry<String, MultipartFile> entity : fileMap.entrySet()) {
+            MultipartFile file = entity.getValue();
+            ImportParams params = new ImportParams();
+            params.setTitleRows(2);
+            params.setHeadRows(1);
+            params.setNeedSave(true);
+            try {
+                List<KuaishouPopulation> listKuaishouPopulations = ExcelImportUtil.importExcel(file.getInputStream(), KuaishouPopulation.class, params);
+                kuaishouPopulationService.saveBatch(listKuaishouPopulations);
+                return Result.ok("文件导入成功!数据行数:" + listKuaishouPopulations.size());
+            } catch (Exception e) {
+                log.error(e.getMessage(), e);
+                return Result.error("文件导入失败:" + e.getMessage());
+            } finally {
+                try {
+                    file.getInputStream().close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+        return Result.ok("文件导入失败!");
+    }
+
+}

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

@@ -0,0 +1,113 @@
+package cn.com.ctop.kuaishou.modules.batch.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+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 org.springframework.format.annotation.DateTimeFormat;
+
+import java.util.Date;
+
+/**
+ * 人群包列表
+ *
+ * @author jeecg-boot
+ * @version V1.0
+ * @date 2020-05-06
+ */
+@Data
+@TableName("ctop_kuaishou_population")
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value = "ctop_kuaishou_population对象", description = "人群包列表")
+public class KuaishouPopulation {
+
+    /**
+     * id
+     */
+    @TableId(type = IdType.AUTO)
+    @ApiModelProperty(value = "id")
+    private Long id;
+    /**
+     * 账户ID
+     */
+    @Excel(name = "账户ID", width = 15)
+    @ApiModelProperty(value = "账户ID")
+    private Long accountId;
+    /**
+     * 人群包id
+     */
+    @Excel(name = "人群包id", width = 15)
+    @ApiModelProperty(value = "人群包id")
+    private Long orientationId;
+    /**
+     * 人群包名称
+     */
+    @Excel(name = "人群包名称", width = 15)
+    @ApiModelProperty(value = "人群包名称")
+    private String orientationName;
+    /**
+     * 人群数据类型0:非上传人群包1:IMEI2:IDFA3:IMEI_MD54:IDFA_MD55:手机号-MD5
+     */
+    @Excel(name = "人群数据类型0:非上传人群包1:IMEI2:IDFA3:IMEI_MD54:IDFA_MD55:手机号-MD5", width = 15)
+    @ApiModelProperty(value = "人群数据类型0:非上传人群包1:IMEI2:IDFA3:IMEI_MD54:IDFA_MD55:手机号-MD5")
+
+    private Integer populationType;
+    /**
+     * 上传数量
+     */
+    @Excel(name = "上传数量", width = 15)
+    @ApiModelProperty(value = "上传数量")
+    private Long recordSize;
+    /**
+     * 匹配数量
+     */
+    @Excel(name = "匹配数量", width = 15)
+    @ApiModelProperty(value = "匹配数量")
+    private Long matchSize;
+    /**
+     * 覆盖人群
+     */
+    @Excel(name = "覆盖人群", width = 15)
+    @ApiModelProperty(value = "覆盖人群")
+    private Long coverNum;
+
+    private Integer status;
+    private Integer type;
+    /**
+     * 推送时间
+     */
+    @Excel(name = "推送时间", width = 15, format = "yyyy-MM-dd")
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @ApiModelProperty(value = "推送时间")
+    private Date putTime;
+
+
+    private Long thirdPlatformCode;
+    /**
+     * 付费人群包-第3方平台code
+     * <p>
+     * private java.lang.Integer thirdPlatformCode;
+     * /**创建时间
+     */
+    @Excel(name = "创建时间", width = 20, format = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "创建时间")
+    private Date createTime;
+    /**
+     * 修改时间
+     */
+    @Excel(name = "修改时间", width = 20, format = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "修改时间")
+    private Date updateTime;
+}

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

@@ -15,4 +15,6 @@ import java.util.List;
 public interface KuaiShouCreativeMapper extends BaseMapper<KuaiShouCreative> {
 
     void replaceBatch(@Param(value = "creatives") List<KuaiShouCreative> creatives);
+
+    Integer checkCreativeCount(@Param("accountId") Long accountId, @Param("unitId") Long unitId);
 }

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

@@ -14,5 +14,7 @@ import java.util.List;
  */
 public interface KuaiShouImageGetMapper extends BaseMapper<KuaiShouImageGet> {
 
-    void replaceBatch(@Param(value = "images")List<KuaiShouImageGet>imagesGets);
+    void replaceBatch(@Param(value = "images") List<KuaiShouImageGet> imagesGets);
+
+    String getUrlByCode(String signature);
 }

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

@@ -0,0 +1,15 @@
+package cn.com.ctop.kuaishou.modules.batch.mapper;
+
+import cn.com.ctop.kuaishou.modules.batch.entity.KuaishouPopulation;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * 人群包列表
+ *
+ * @author: jeecg-boot
+ * @date: 2020-05-06
+ * @cersion: V1.0
+ */
+public interface KuaishouPopulationMapper extends BaseMapper<KuaishouPopulation> {
+
+}

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

@@ -76,4 +76,11 @@
             #{creative.updateTime})
         </foreach>
     </insert>
+
+    <select id="checkCreativeCount" resultType="java.lang.Integer">
+     select count(1)
+     from ctop_kuaishou_creative
+     where  account_id = #{accountId}
+     and unit_id = #{unitId}
+    </select>
 </mapper>

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

@@ -36,4 +36,11 @@
         </foreach>
     </insert>
 
+    <select id="getUrlByCode" resultType="java.lang.String">
+        select url from ctop_material_image_info
+        where  code = #{signature}
+        limit 1
+
+    </select>
+
 </mapper>

+ 5 - 0
module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/batch/mapper/xml/KuaishouPopulationMapper.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.kuaishou.modules.batch.mapper.KuaishouPopulationMapper">
+
+</mapper>

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

@@ -13,4 +13,6 @@ import java.util.List;
  */
 public interface IKuaiShouImageGetService extends IService<KuaiShouImageGet> {
     void replaceBatch(List<KuaiShouImageGet> imageGets);
+
+    String getUrlByCode(String signature);
 }

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

@@ -114,4 +114,16 @@ public interface IKuaiShouUpdateService {
      * @return
      */
     JSONObject updateCreative(String accessToken, JSONObject creativeJson);
+
+    /**
+     * 修改深度转化出价
+     *
+     * @param accessToken
+     * @param accountId
+     * @param unitId
+     * @param deepConversionBid
+     * @param userId
+     * @return
+     */
+    Map<String, Object> updateUnitDeepConversionBid(String accessToken, Long accountId, Long unitId, Long deepConversionBid, String userId);
 }

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

@@ -171,7 +171,7 @@ public interface IKuaishouInterfaceService {
      * @param authCode
      * @return
      */
-    KuaishouResultToken getAccessToken(String authCode,Integer agentType);
+    KuaishouResultToken getAccessToken(String authCode, Integer agentType);
 
 
     /**
@@ -439,7 +439,7 @@ public interface IKuaishouInterfaceService {
      * @param accessToken
      * @return
      */
-    JSONArray getPopulationList(Long accountId, String accessToken);
+    void getPopulationList(Long accountId, String accessToken);
 
 
     /**
@@ -471,7 +471,15 @@ public interface IKuaishouInterfaceService {
      */
     void getSuZaoList(String token, Long accountId, int page);
 
+    /**
+     * 异步获取创意信息
+     *
+     * @param accountId
+     * @param accessToken
+     * @param campaignId
+     */
 
+    void getAsyncCreativeList(Long accountId, String accessToken, Long campaignId);
 }
 
 

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

@@ -0,0 +1,15 @@
+package cn.com.ctop.kuaishou.modules.batch.service;
+
+import cn.com.ctop.kuaishou.modules.batch.entity.KuaishouPopulation;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * 人群包列表
+ *
+ * @author jeecg-boot
+ * @version V1.0
+ * @date 2020-05-06
+ */
+public interface IKuaishouPopulationService extends IService<KuaishouPopulation> {
+
+}

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

@@ -2,34 +2,55 @@ package cn.com.ctop.kuaishou.modules.batch.service.impl;
 
 import cn.com.ctop.common.module.entity.CtopOauthToken;
 import cn.com.ctop.common.module.entity.UserAllocation;
+import cn.com.ctop.common.module.enums.MaterialEnum;
 import cn.com.ctop.common.module.mapper.UserAllocationMapper;
 import cn.com.ctop.common.module.service.ICtopOauthTokenService;
+import cn.com.ctop.common.module.service.IMaterialParameterService;
 import cn.com.ctop.common.module.utils.Check;
-import cn.com.ctop.common.module.utils.RandomUtil;
-import cn.com.ctop.kuaishou.modules.batch.entity.KuaiShouCampaign;
-import cn.com.ctop.kuaishou.modules.batch.entity.KuaiShouCreative;
-import cn.com.ctop.kuaishou.modules.batch.entity.KuaiShouGroup;
-import cn.com.ctop.kuaishou.modules.batch.entity.KuaiShouGroupTarget;
+import cn.com.ctop.common.module.utils.KuaishouInterfaceConstant;
+import cn.com.ctop.common.module.utils.LoadFileUtil;
+import cn.com.ctop.common.module.utils.PropertiesUtils;
+import cn.com.ctop.kuaishou.modules.batch.entity.*;
 import cn.com.ctop.kuaishou.modules.batch.mapper.*;
 import cn.com.ctop.kuaishou.modules.batch.service.IBatchService;
+import cn.com.ctop.kuaishou.modules.batch.service.IKuaiShouImageGetService;
 import cn.com.ctop.kuaishou.modules.batch.service.IKuaiShouUpdateService;
 import cn.com.ctop.kuaishou.modules.batch.service.IKuaishouInterfaceService;
 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.apache.http.ParseException;
 import org.jeecg.common.util.DateUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.http.HttpEntity;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpMethod;
+import org.springframework.http.ResponseEntity;
 import org.springframework.stereotype.Service;
+import org.springframework.util.LinkedMultiValueMap;
+import org.springframework.util.MultiValueMap;
+import org.springframework.web.client.RestTemplate;
 
+import java.io.IOException;
 import java.math.BigDecimal;
 import java.util.Date;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
 @Slf4j
 @Service
 public class BatchServiceImpl implements IBatchService {
+
+    @Value("${oss.replace.replace-value}")
+    private String replaceValue;
+    @Value("${oss.replace.replace-old-value}")
+    private String replaceOldValue;
+    @Value("${oss.replace.download}")
+    private String downloadUrl;
+
     @Autowired
     private BatchMapper batchMapper;
     @Autowired
@@ -179,21 +200,13 @@ public class BatchServiceImpl implements IBatchService {
 
         //投放开始时间
         if (!Check.isNull(requestJson.getString("beginTime"))) {
-
-            if ("copy".equals(type)) {
-                String nowDate = DateUtils.getNowDate("yyyy-MM-dd");
-                boolean beginTimeBoolean = DateUtils.compare(requestJson.getString("beginTime"), nowDate);
-                if (beginTimeBoolean) {
-                    unitJson.put("begin_time", nowDate);
-                } else {
-                    unitJson.put("begin_time", requestJson.getString("beginTime"));
-                }
-
+            String nowDate = DateUtils.getNowDate("yyyy-MM-dd");
+            boolean beginTimeBoolean = DateUtils.compare(requestJson.getString("beginTime"), nowDate);
+            if (beginTimeBoolean) {
+                unitJson.put("begin_time", nowDate);
             } else {
                 unitJson.put("begin_time", requestJson.getString("beginTime"));
             }
-
-
         }
         // 投放结束时间
         if (!Check.isNull(requestJson.getString("endTime"))) {
@@ -452,7 +465,6 @@ public class BatchServiceImpl implements IBatchService {
             }
 
             JSONObject unitJson = new JSONObject();
-
             unitJson.put("campaign_id", copyToCampaignId);
 
             // 资源位置
@@ -460,7 +472,6 @@ public class BatchServiceImpl implements IBatchService {
             if (!Check.isNull(scene_id)) {
                 unitJson.put("scene_id", scene_id);
             }
-
             // 资源创作方式
             if (!Check.isNull(group.getUnitType())) {
                 if (!Check.isNull(group.getUnitType())) {
@@ -718,7 +729,6 @@ public class BatchServiceImpl implements IBatchService {
         QueryWrapper<KuaiShouCreative> queryWrapper = new QueryWrapper<>();
         queryWrapper.eq("account_id", accountId);
         queryWrapper.eq("unit_id", copyUnitId);
-     //   queryWrapper.eq("status", 52);
         List<KuaiShouCreative> creativeList = creativeMapper.selectList(queryWrapper);
         if (!Check.isNull(creativeList)) {
             for (KuaiShouCreative creative : creativeList) {
@@ -749,7 +759,7 @@ public class BatchServiceImpl implements IBatchService {
                 creativeJson.put("action_bar_text", action_bar_text);
                 creativeJson.put("description", description);
                 creativeJson.put("image_token", image);
-                creativeJson.put("creative_name", name + RandomUtil.verifyCode());
+                creativeJson.put("creative_name", name);
                 creativeJson.put("photo_id", photo_id);
                 creativeJson.put("click_track_url", click_track_url);
 
@@ -799,13 +809,16 @@ public class BatchServiceImpl implements IBatchService {
      * @param requestJson
      * @return
      */
+    @Autowired
+    private IKuaiShouImageGetService imageGetService;
+
+
     @Override
     public JSONObject createCreative(JSONObject requestJson) throws Exception {
         if (Check.isNull(requestJson)) {
             throw new Exception("入参为空");
         }
 
-
         Long accountId = requestJson.getLong("accountId");
         if (Check.isNull(accountId)) {
             throw new Exception("请输入需创建账号");
@@ -821,7 +834,6 @@ public class BatchServiceImpl implements IBatchService {
             throw new Exception("请选择广告组");
         }
 
-
         JSONObject creativeJson = new JSONObject();
         creativeJson.put("advertiser_id", accountId);
         creativeJson.put("unit_id", unitId);
@@ -830,10 +842,7 @@ public class BatchServiceImpl implements IBatchService {
         if (!Check.isNull(requestJson.get("creativeMaterialType"))) {
             creativeJson.put("creative_material_type", requestJson.get("creativeMaterialType"));
         }
-
         String action_bar_text = requestJson.getString("actionBarText");
-        // 视频id
-
         String click_track_url = requestJson.getString("clickTrackUrl");
         JSONObject returnJson = new JSONObject();
         JSONArray successArr = new JSONArray();
@@ -845,20 +854,41 @@ public class BatchServiceImpl implements IBatchService {
                 if (!Check.isNull(dataJsons)) {
                     String description = dataJson.getString("description");
                     String photo_id = dataJson.getString("photoId");
-                    JSONArray imageTokens = dataJson.getJSONArray("imageTokens");
-                    if (!Check.isNull(imageTokens)) {
-                        for (int j = 0; j < imageTokens.size(); j++) {
-                            JSONObject imageJson = imageTokens.getJSONObject(j);
+                    JSONArray imageArr = dataJson.getJSONArray("imageArr");
+                    if (!Check.isNull(imageArr)) {
+                        for (int j = 0; j < imageArr.size(); j++) {
+                            JSONObject imageJson = imageArr.getJSONObject(j);
                             if (!Check.isNull(imageJson)) {
-                                String image = imageJson.getString("image");
                                 String name = imageJson.getString("name");
                                 creativeJson.put("action_bar_text", action_bar_text);
                                 creativeJson.put("description", description);
-                                creativeJson.put("image_token", image);
                                 creativeJson.put("creative_name", name);
                                 creativeJson.put("photo_id", photo_id);
                                 creativeJson.put("click_track_url", click_track_url);
 
+                                String imageToken = null;
+                                String signature = imageJson.getString("signature");
+                                if (!Check.isNull(signature)) {
+                                    QueryWrapper<KuaiShouImageGet> queryWrapper = new QueryWrapper<>();
+                                    queryWrapper.eq("account_id", accountId);
+                                    queryWrapper.eq("signature", signature);
+                                    queryWrapper.last("limit 1");
+                                    KuaiShouImageGet imageGet = imageGetService.getOne(queryWrapper);
+                                    if (!Check.isNull(imageGet)) {
+                                        imageToken = imageGet.getImageToken();
+                                    } else {
+                                        String url = imageGetService.getUrlByCode(signature);
+                                        imageToken = this.kuauiShouImageUpload(url, signature, accountId, oauthToken.getAccessToken());
+                                    }
+                                    if (Check.isNull(imageToken)) {
+                                        JSONObject failJson = new JSONObject();
+                                        failJson.put("creativeName", name);
+                                        failJson.put("failMessage", "获取图片文件失败");
+                                        failArr.add(failJson);
+                                        continue;
+                                    }
+                                }
+                                creativeJson.put("image_token", imageToken);
                                 Map<String, Object> returnUnitMap = kuaishouInterfaceService.creativeCreate(oauthToken.getAccessToken(), accountId, creativeJson);
                                 if (!Check.isNullMap(returnUnitMap)) {
                                     Integer code = (Integer) returnUnitMap.get("code");
@@ -1142,6 +1172,9 @@ public class BatchServiceImpl implements IBatchService {
      * @param requestJson
      * @return
      */
+    @Autowired
+    private IKuaiShouImageGetService iKuaiShouImageGetService;
+
     @Override
     public JSONObject updateCreative(JSONObject requestJson) throws Exception {
         if (Check.isNull(requestJson)) {
@@ -1220,6 +1253,120 @@ public class BatchServiceImpl implements IBatchService {
         return returnJson;
     }
 
+    @Autowired
+    private IMaterialParameterService materialParameterService;
+
+    public String kuauiShouImageUpload(String url, String signature, Long accountId, String token) {
+        System.err.println(url);
+        System.err.println(signature);
+        try {
+            // String replaceUrl = url.replace(replaceOldValue, replaceValue);
+            // log.info("replaceUrl:{}", replaceUrl);
+          /*  String localUrl = LoadFileUtil.downLoadFromUrl(url, downloadUrl);
+            FileSystemResource resource = new FileSystemResource(new File(localUrl));*/
+            Map<String, String> headerMap = new HashMap<>();
+            headerMap.put("Content-Type", "multipart/form-data");
+            JSONObject requestJson = new JSONObject();
+            //     requestJson.put("file", resource);
+            requestJson.put("signature", signature);
+            requestJson.put("url", url);
+            requestJson.put("type", 2);
+          /*   QueryWrapper<MaterialParameter> parameterQueryWrapper = new QueryWrapper<>();
+               parameterQueryWrapper.eq("material_id", signature);
+               parameterQueryWrapper.orderByDesc("create_time").last("limit 1");
+              MaterialParameter materialParameter = materialParameterService.getOne(parameterQueryWrapper);
+              if (!Check.isNull(materialParameter)) {
+                Integer type = MaterialEnum.getTypeBySize(Integer.valueOf(materialParameter.getWidth()), Integer.valueOf(materialParameter.getHeight()));
+                if (!Check.isNull(type) && type != 0) {
+                    requestJson.put("type", type);
+                }
+            }*/
+
+            requestJson.put("advertiser_id", accountId);
+            headerMap.put("Access-Token", token);
+            String requestUrl = PropertiesUtils.getConfig("kuaishou_api_url") + KuaishouInterfaceConstant.IMAGE_UPLOAD;
+            requestJson.put("upload_type", "2");
+            String result = exceptInfoForRestTemplate(requestUrl, requestJson, headerMap);
+            JSONObject resultJson = JSONObject.parseObject(result);
+            System.err.println(resultJson);
+            if (!Check.isNull(resultJson)) {
+                if (resultJson.getInteger("code") == 0) {
+                    JSONObject dataJson = resultJson.getJSONObject("data");
+                    if (!Check.isNull(dataJson)) {
+                        String image_token = dataJson.getString("image_token");
+                        KuaiShouImageGet imageGet = new KuaiShouImageGet();
+                        imageGet.setId(accountId + image_token);
+                        imageGet.setAccountId(accountId);
+                        imageGet.setUrl(dataJson.getString("url"));
+                        imageGet.setWidth(dataJson.getInteger("width"));
+                        imageGet.setHeight(dataJson.getInteger("height"));
+                        imageGet.setSize(dataJson.getInteger("size"));
+                        imageGet.setFormat(dataJson.getString("format"));
+                        Integer type = MaterialEnum.getTypeBySize(dataJson.getInteger("width"), dataJson.getInteger("height"));
+                        if (!Check.isNull(type)) {
+                            imageGet.setMaterialType(type);
+                        }
+                        imageGet.setSignature(signature);
+                        imageGet.setImageToken(image_token);
+                        iKuaiShouImageGetService.saveOrUpdate(imageGet);
+                        return dataJson.getString("image_token");
+
+
+                    }
+
+
+                } else {
+                    log.error("上传图片失败,accountId:{},code:{},data:{}", accountId, signature, resultJson);
+                }
+
+
+            } else {
+                log.error("上传图片,返回结果为空,accountId:{},code:{},data:{}", accountId, signature, resultJson);
+            }
+
+
+        } catch (Exception e) {
+            e.printStackTrace();
+            return null;
+
+        }
+
+        return null;
+    }
+
+
+    @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<>();
+            if (!Check.isNullMap(paramMap)) {
+                for (String key : paramMap.keySet()) {
+                    param.add(key, paramMap.get(key));
+                }
+                HttpHeaders headers = new HttpHeaders();
+                if (!Check.isNullMap(headerMap)) {
+                    for (String key : headerMap.keySet()) {
+                        headers.add(key, headerMap.get(key));
+                    }
+                }
+                HttpEntity<MultiValueMap<String, Object>> httpEntity = new HttpEntity<MultiValueMap<String, Object>>(param, headers);
+                ResponseEntity<String> responseEntity = rest.exchange(url, HttpMethod.POST, httpEntity, String.class);
+                return responseEntity.getBody();
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+
+    public static void main(String[] args) throws IOException {
+        String localUrl = LoadFileUtil.downLoadFromUrl("https://ctop-media.oss-cn-beijing.aliyuncs.com/image/2020-04-29/uuuuu-1588129352054.jpg", PropertiesUtils.getValue("kuaishou_config", "video_sava_path"));
+        String signature = LoadFileUtil.getMD5(localUrl);
+        System.err.println(signature);
+    }
 
 }
 

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

@@ -27,4 +27,9 @@ public class KuaiShouImageGetServiceImpl extends ServiceImpl<KuaiShouImageGetMap
         imageGetMapper.replaceBatch(imageGets);
     }
 
+    @Override
+    public String getUrlByCode(String signature) {
+        return imageGetMapper.getUrlByCode(signature);
+    }
+
 }

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

@@ -220,8 +220,6 @@ public class KuaiShouUpdateServiceImpl implements IKuaiShouUpdateService {
                     if (i > 0) {
                         log.info("修改广告组出价本地记录添加成功,unitId:{}", unitId);
                     }
-                    // 重新请求数据
-                    interfaceService.getGroup(token, advertiserId, unitId);
                     returnMap.put("code", 0);
                     returnMap.put("success", true);
                 } else {
@@ -673,4 +671,67 @@ public class KuaiShouUpdateServiceImpl implements IKuaiShouUpdateService {
         return returnJson;
     }
 
+    @Override
+    public Map<String, Object> updateUnitDeepConversionBid(String accessToken, Long accountId, Long unitId, Long deepConversionBid, String userId) {
+
+        Map<String, Object> returnMap = new HashMap<>();
+        try {
+
+            JSONObject updateJson = new JSONObject();
+            updateJson.put("advertiser_id", accountId);
+            updateJson.put("unit_id", unitId);
+            updateJson.put("deep_conversion_bid", deepConversionBid);
+            String url = PropertiesUtils.getConfig("kuaishou_api_url") + KuaishouInterfaceConstant.UPDATE_UNIT;
+            Map<String, String> headers = new HashMap<>();
+            headers.put("Access-Token", accessToken);
+            headers.put("Content-Type", "application/json");
+            String result = HttpUtils.kuaiShouhttpPostRequest(url, updateJson.toJSONString(), headers);
+            JSONObject resultJson = JSONObject.parseObject(result);
+            log.info("修改深度转化出价返回信息,accountId:{},返回信息:{}", accountId, resultJson);
+            if (!Check.isNull(resultJson)) {
+                Integer code = resultJson.getInteger("code");
+                if (code == 0) {
+                    /*QueryWrapper<KuaiShouGroup> queryWrapper = new QueryWrapper<>();
+                    queryWrapper.eq("unit_id", unitId);
+                    queryWrapper.eq("account_id", advertiserId);
+                    queryWrapper.orderByDesc("create_time");
+                    queryWrapper.last("limit 1");
+                    KuaiShouGroup group = groupMapper.selectOne(queryWrapper);
+
+                    KuaiShouGroupBid groupBid = new KuaiShouGroupBid();
+                    groupBid.setAccountId(advertiserId);
+                    groupBid.setUnitId(unitId);
+                    groupBid.setBid(group.getBid());
+                    groupBid.setUpdateBid(bid);
+                    groupBid.setUserId(loginId);
+                    int i = groupBidMapper.insert(groupBid);
+                    if (i > 0) {
+                        log.info("修改广告组深度转化出价本地记录添加成功,unitId:{}", unitId);
+                    }*/
+                    // 重新请求数据
+
+                    returnMap.put("code", 0);
+                    returnMap.put("success", true);
+                } else {
+                    log.error("修改广告组深度转化出价失败,advertiserId:{},unitId:{},返回信息:{}", accountId, unitId, resultJson);
+                    returnMap.put("code", -1);
+                    returnMap.put("success", false);
+                    returnMap.put("message", resultJson.getString("message"));
+                }
+            } else {
+                log.error("修改广告组深度转化出价返回结果为空,advertiserId:{},unitId:{}", returnMap, unitId);
+                returnMap.put("code", -1);
+                returnMap.put("success", false);
+                returnMap.put("message", "修改广告组预算返回结果为空");
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            returnMap.put("code", -1);
+            returnMap.put("message", e.getMessage());
+        }
+
+
+        return returnMap;
+    }
+
 }

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

@@ -16,6 +16,7 @@ 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;
@@ -47,6 +48,8 @@ import java.io.IOException;
 import java.lang.reflect.ParameterizedType;
 import java.lang.reflect.Type;
 import java.util.*;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
 
 /**
  * @author
@@ -131,6 +134,8 @@ public class KuaishouInterfaceServiceImpl implements IKuaishouInterfaceService {
     IKuaiShouImageGetService kuaiShouImageGetService;
     @Autowired
     private IKuaiShouDailyFlowsService kuaiShouDailyFlowsService;
+    @Autowired
+    private IKuaishouPopulationService populationService;
 
 
     @Override
@@ -141,7 +146,6 @@ public class KuaishouInterfaceServiceImpl implements IKuaishouInterfaceService {
 
     private void getAdvertiserReportHourlyByPage(CtopOauthToken token, Date startDate, Date endDate, int page) {
         String url = PropertiesUtils.getConfig("kuaishou_api_url") + KuaishouInterfaceConstant.ACCOUNT_REPORT;
-        System.out.println(url);
         Map<String, String> headers = new HashMap<>();
         headers.put("Access-Token", token.getAccessToken());
         Map<String, Object> param = new HashMap<>();
@@ -151,9 +155,7 @@ public class KuaishouInterfaceServiceImpl implements IKuaishouInterfaceService {
         param.put("temporal_granularity", "HOURLY");
         param.put("page_size", 500);
         param.put("page", page);
-        System.out.println(param.toString());
         String result = HttpUtils.httpPostRequest(url, param, headers);
-        System.out.println(result);
         JSONObject resultJson = JSONObject.parseObject(result);
         Integer code = resultJson.getInteger("code");
         String message = resultJson.getString("message");
@@ -264,6 +266,7 @@ public class KuaishouInterfaceServiceImpl implements IKuaishouInterfaceService {
         param.put("page", page);
         String result = HttpUtils.httpPostRequest(url, param, headers);
         JSONObject resultJson = JSONObject.parseObject(result);
+        System.err.println(resultJson);
         Integer code = resultJson.getInteger("code");
         String message = resultJson.getString("message");
         if (null == code || code != 0) {
@@ -997,7 +1000,7 @@ public class KuaishouInterfaceServiceImpl implements IKuaishouInterfaceService {
                             @Override
                             public void run() {
                                 try {
-                                    Thread.sleep(1 * 1000);
+                                    Thread.sleep(500);
                                     getGroup(accessToken, advertiserId, unitId);
                                 } catch (InterruptedException e) {
                                     e.printStackTrace();
@@ -1872,7 +1875,13 @@ public class KuaishouInterfaceServiceImpl implements IKuaishouInterfaceService {
                         Thread thread = new Thread() {
                             @Override
                             public void run() {
-                                getCreativeByCreativeId(accessToken, advertiserId, creativeId);
+                                try {
+                                    Thread.sleep(100);
+                                    getCreativeByCreativeId(accessToken, advertiserId, creativeId);
+                                } catch (InterruptedException e) {
+                                    e.printStackTrace();
+                                }
+
                             }
 
                         };
@@ -2267,10 +2276,8 @@ public class KuaishouInterfaceServiceImpl implements IKuaishouInterfaceService {
                 returnMap.put("message", "上传图片失败失败");
                 returnMap.put("success", false);
             }
-            boolean trueOrFalse = LoadFileUtil.delFile(localUrl);
-            if (trueOrFalse) {
-                log.info("删除本地文件成功,accountId:{}", advertiserId);
-            }
+            LoadFileUtil.delFile(localUrl);
+
         } catch (Exception e) {
             log.error("上传图片失败,advertiser_id:{}", advertiserId);
             returnMap.put("code", -1);
@@ -2350,10 +2357,8 @@ public class KuaishouInterfaceServiceImpl implements IKuaishouInterfaceService {
                 returnMap.put("desc", "Interface exception");
                 returnMap.put("success", false);
             }
-            boolean trueOrFalse = LoadFileUtil.delFile(localUrl);
-            if (trueOrFalse) {
-                log.info("删除本地文件成功,accountId:{}", advertiserId);
-            }
+            LoadFileUtil.delFile(localUrl);
+
         } catch (Exception e) {
             log.error("创建应用失败,advertiser_id:{}", advertiserId);
             returnMap.put("code", -1);
@@ -2656,8 +2661,13 @@ public class KuaishouInterfaceServiceImpl implements IKuaishouInterfaceService {
             }
             param.put("page_size", 500);
             param.put("page", page);
+            System.err.println("入参:" + param);
+            System.err.println("头:" + JSON.toJSONString(headers));
+            System.err.println("url:" + url);
+
             String result = HttpUtils.httpPostRequest(url, param, headers);
             JSONObject resultJson = JSONObject.parseObject(result);
+            System.err.println(resultJson);
             Integer code = resultJson.getInteger("code");
             String message = resultJson.getString("message");
             if (null == code || code != 0) {
@@ -2819,9 +2829,12 @@ public class KuaishouInterfaceServiceImpl implements IKuaishouInterfaceService {
      * @param accessToken
      * @return
      */
+
+
     @Override
-    public JSONArray getPopulationList(Long accountId, String accessToken) {
+    public void getPopulationList(Long accountId, String accessToken) {
         try {
+            log.info("获取人群包列表,accountId:{}", accountId);
             String url = PropertiesUtils.getConfig("kuaishou_api_url") + KuaishouInterfaceConstant.POPULATION_LIST;
             Map<String, String> headers = new HashMap<>();
             headers.put("Access-Token", accessToken);
@@ -2836,36 +2849,41 @@ public class KuaishouInterfaceServiceImpl implements IKuaishouInterfaceService {
                 if (code == 0) {
                     JSONArray dataArr = resultJson.getJSONArray("data");
                     if (!Check.isNull(dataArr)) {
-                        JSONArray returnArr = new JSONArray();
+                        Map<String, Object> deleteMap = new HashMap<>();
+                        deleteMap.put("account_id", accountId);
+                        populationService.removeByMap(deleteMap);
                         for (int i = 0; i < dataArr.size(); i++) {
                             JSONObject dataJson = dataArr.getJSONObject(i);
                             if (!Check.isNull(dataJson)) {
-                                JSONObject returnJson = new JSONObject();
-                                returnJson.put("orientationId", dataJson.getLong("orientation_id"));
-                                returnJson.put("orientationName", dataJson.getString("orientation_name"));
-                                returnJson.put("type", dataJson.getInteger("type"));
-                                returnJson.put("populationType", dataJson.getLong("population_type"));
-                                returnJson.put("recordSize", dataJson.getLong("record_size"));
-                                returnJson.put("matchSize", dataJson.getLong("match_size"));
-                                returnJson.put("coverNum", dataJson.getLong("cover_num"));
-                                returnJson.put("status", dataJson.getInteger("status"));
-                                returnJson.put("createTime", dataJson.getInteger("create_time"));
-                                returnArr.add(returnJson);
+                                KuaishouPopulation population = new KuaishouPopulation();
+                                population.setOrientationId(dataJson.getLong("orientation_id"));
+                                population.setOrientationName(dataJson.getString("orientation_name"));
+                                population.setType(dataJson.getInteger("type"));
+                                population.setPopulationType(dataJson.getInteger("population_type"));
+                                population.setRecordSize(dataJson.getLong("record_size"));
+                                population.setMatchSize(dataJson.getLong("match_size"));
+                                population.setCoverNum(dataJson.getLong("cover_num"));
+                                population.setStatus(dataJson.getInteger("status"));
+                                population.setPutTime(dataJson.getDate("create_time"));
+                                population.setThirdPlatformCode(dataJson.getLong("third_platform_code"));
+                                population.setAccountId(accountId);
+                                populationService.save(population);
+
                             }
                         }
-                        return returnArr;
+
                     }
 
                 } else {
                     log.error("获取人群包管理返回数据为空,accountId:{}", accountId);
-                    return null;
+
                 }
             }
         } catch (Exception e) {
             e.printStackTrace();
         }
 
-        return null;
+
     }
 
 
@@ -3022,5 +3040,134 @@ public class KuaishouInterfaceServiceImpl implements IKuaishouInterfaceService {
 
     }
 
+    private static ExecutorService executorService = Executors.newFixedThreadPool(5);
+
+    @Override
+    public void getAsyncCreativeList(Long accountId, String accessToken, Long campaignId) {
+
+
+        try {
+            String url = PropertiesUtils.getConfig("kuaishou_api_url") + KuaishouInterfaceConstant.CREATIVE_LIST;
+            Map<String, String> headers = new HashMap<>();
+            headers.put("Content-Type", " application/json");
+            headers.put("Access-Token", accessToken);
+            JSONObject param = new JSONObject();
+            param.put("advertiser_id", accountId);
+            param.put("page_size", 200);
+
+            Map<String, Object> deleteMap = new HashMap<>();
+            deleteMap.put("account_id", accountId);
+            deleteMap.put("campaign_id", campaignId);
+            creativeService.removeByMap(deleteMap);
+            QueryWrapper<KuaiShouGroup> groupQueryWrapper = new QueryWrapper<>();
+            groupQueryWrapper.eq("account_id", accountId);
+            groupQueryWrapper.eq("campaign_id", campaignId);
+            List<KuaiShouGroup> list = kuaiShouGroupService.list(groupQueryWrapper);
+            if (!Check.isNull(list)) {
+                for (KuaiShouGroup group : list) {
+                    executorService.submit(new Runnable() {
+                        @Override
+                        public void run() {
+                            param.put("unit_id", group.getUnitId());
+                            String result = HttpUtils.kuaiShouhttpPostRequest(url, param.toJSONString(), headers);
+                            JSONObject resultJson = JSONObject.parseObject(result);
+                            if (Check.isNull(resultJson)) {
+                                log.error("获取广告创意返回结果为空,advertiserId:{}", accountId);
+                                return;
+                            }
+                            Integer code = resultJson.getInteger("code");
+                            String message = resultJson.getString("message");
+                            if (null == code || code != 0) {
+                                log.error("获取广告创意返回结果异常,advertiserId:{},message:{}", accountId, message);
+                                return;
+                            }
+                            JSONArray details = resultJson.getJSONObject("data").getJSONArray("details");
+                            if (null == details || details.size() <= 0) {
+                                return;
+                            }
+                            List<KuaiShouCreative> creatives = new ArrayList<>();
+                            for (int i = 0; i < details.size(); i++) {
+                                JSONObject detailJson = JSONObject.parseObject(details.get(i).toString());
+                                if (!Check.isNull(detailJson)) {
+                                    KuaiShouCreative creative = new KuaiShouCreative();
+                                    creative.setId("" + accountId + detailJson.getLong("creative_id"));
+                                    creative.setAccountId(accountId);
+                                    creative.setCampaignId(detailJson.getLong("campaign_id"));
+                                    creative.setUnitId(detailJson.getLong("unit_id"));
+                                    creative.setCreativeId(detailJson.getLong("creative_id"));
+                                    creative.setCreativeName(detailJson.getString("creative_name"));
+                                    creative.setCreativeMaterialType(detailJson.getInteger("creative_material_type"));
+                                    if (!Check.isNull(detailJson.getJSONArray("material_url"))) {
+                                        creative.setMaterialUrl(detailJson.getJSONArray("material_url").toJSONString());
+                                    }
+
+                                    if (!Check.isNull(detailJson.getJSONArray("image_tokens"))) {
+                                        creative.setImageTokens(detailJson.getJSONArray("image_tokens").toJSONString());
+                                    }
+                                    creative.setStatus(detailJson.getInteger("status"));
+                                    creative.setPutStatus(detailJson.getInteger("put_status"));
+                                    creative.setCreateChannel(detailJson.getInteger("create_channel"));
+                                    creative.setReviewDetail(detailJson.getString("review_detail"));
+                                    creative.setCoverUrl(detailJson.getString("cover_url"));
+                                    creative.setImageToken(detailJson.getString("image_token"));
+                                    creative.setCoverWidth(detailJson.getString("cover_width"));
+                                    creative.setCoverHeight(detailJson.getString("cover_height"));
+                                    creative.setOverlayBgUrl(detailJson.getString("overlay_bg_url"));
+                                    creative.setOverlayBgImageToken(detailJson.getString("overlay_bg_image_token"));
+                                    creative.setStickerTitle(detailJson.getString("sticker_title"));
+                                    creative.setOverlayType(detailJson.getString("overlay_type"));
+                                    creative.setClickTrackUrl(detailJson.getString("click_track_url"));
+                                    creative.setImpressionUrl(detailJson.getString("impression_url"));
+                                    creative.setAdPhotoPlayedT3sUrl(detailJson.getString("ad_photo_played_t3s_url"));
+                                    creative.setCreativeCreateTime(detailJson.getDate("create_time"));
+                                    creative.setCreativeUpdateTime(detailJson.getDate("update_time"));
+                                    creative.setFirstFrameType(detailJson.getInteger("first_frame_type"));
+                                    JSONObject displayInfoJson = detailJson.getJSONObject("display_info");
+                                    if (!Check.isNull(displayInfoJson)) {
+                                        creative.setDescription(displayInfoJson.getString("description"));
+                                        creative.setActionBarText(displayInfoJson.getString("action_bar_text"));
+                                    }
+                                    creative.setCreateTime(new Date());
+                                    creative.setUpdateTime(new Date());
+                                    creative.setSiteId(detailJson.getLong("site_id"));
+                                    creative.setPhotoId(detailJson.getString("photo_id"));
+                                    if (detailJson.getLong("photo_id") == 0) {
+                                        JSONArray photoIds = new JSONArray();
+                                        JSONObject programmed_creative_material = detailJson.getJSONObject("programmed_creative_material");
+                                        if (!Check.isNull(programmed_creative_material)) {
+                                            creative.setProgrammedCreativeMaterial(programmed_creative_material.toJSONString());
+                                            JSONArray materials = programmed_creative_material.getJSONArray("materials");
+                                            if (!Check.isNull(materials)) {
+                                                for (int j = 0; j < materials.size(); j++) {
+                                                    JSONObject materialJson = materials.getJSONObject(j);
+                                                    if (!Check.isNull(materialJson)) {
+                                                        Long photo_id = materialJson.getLong("photo_id");
+                                                        photoIds.add(String.valueOf(photo_id));
+                                                    }
+                                                }
+                                                creative.setPhotoIds(photoIds.toJSONString());
+                                            }
+                                        }
+                                    }
+                                    creatives.add(creative);
+                                }
+
+                            }
+                            creativeService.replaceBatch(creatives);
+                        }
+                    });
+                }
+
+            }
+
+
+        } catch (Exception e) {
+            e.printStackTrace();
+
+        }
+
+
+    }
+
 
 }

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

@@ -0,0 +1,19 @@
+package cn.com.ctop.kuaishou.modules.batch.service.impl;
+
+import cn.com.ctop.kuaishou.modules.batch.entity.KuaishouPopulation;
+import cn.com.ctop.kuaishou.modules.batch.mapper.KuaishouPopulationMapper;
+import cn.com.ctop.kuaishou.modules.batch.service.IKuaishouPopulationService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * 人群包列表
+ *
+ * @author jeecg-boot
+ * @version V1.0
+ * @date 2020-05-06
+ */
+@Service
+public class KuaishouPopulationServiceImpl extends ServiceImpl<KuaishouPopulationMapper, KuaishouPopulation> implements IKuaishouPopulationService {
+
+}

+ 6 - 0
module-toutiao/pom.xml

@@ -32,6 +32,12 @@
             <artifactId>module-crawler</artifactId>
             <version>2.0.2</version>
         </dependency>
+        <dependency>
+            <groupId>cn.com.ctop</groupId>
+            <artifactId>module-kuaishou</artifactId>
+            <version>2.0.2</version>
+            <scope>compile</scope>
+        </dependency>
     </dependencies>
 
     <build>

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

@@ -2,7 +2,6 @@ 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.IBytedanceReportService;
 import com.alibaba.fastjson.JSONObject;
 import lombok.extern.slf4j.Slf4j;
@@ -84,14 +83,19 @@ public class BytedanceReportController {
 
         Result<List<JSONObject>> result = new Result<>();
         try {
-            log.info("头条获取素材报表数据任务执行开始");
+            log.info("头条获取异步报表数据任务执行开始");
             Long starttime = System.currentTimeMillis();
             List<CtopOauthToken> tokens = tokenService.selectToutiaoToken();
-            if (null == tokens || tokens.isEmpty()) {
+            if (null == tokens || tokens.size() <= 0) {
                 log.info("头条获取异步报表数据任务执行失败:未获取到可用的token");
                 return result;
             }
-            tokens.forEach(token -> bytedanceReportService.bytedanceAsyncTaskCreate(startDate, endDate, token, type));
+
+            for (CtopOauthToken token : tokens) {
+                //if(1629785592929294L == token.getAccountId()){
+                bytedanceReportService.bytedanceAsyncTaskCreate(startDate, endDate, token, type);
+                //}
+            }
             Long endtime = System.currentTimeMillis();
             log.info("头条异步报表数据任务执行结束,执行耗时:{}秒", (endtime - starttime) / 1000);
         } catch (Exception e) {
@@ -106,13 +110,13 @@ public class BytedanceReportController {
     public Result<List<JSONObject>> bytedanceAsyncTaskGet(@RequestBody JSONObject requestJson) {
         Result<List<JSONObject>> result = new Result<>();
         try {
-            log.info("头条获取素材报表数据定时任务执行开始");
+            log.info("头条下载异步报表数据定时任务执行开始");
             Long starttime = System.currentTimeMillis();
             bytedanceReportService.bytedanceAsyncTaskGet();
             Long endtime = System.currentTimeMillis();
-            log.info("头条异步报表数据定时任务执行结束,执行耗时:{}秒", (endtime - starttime) / 1000);
+            log.info("头条下载异步报表数据定时任务执行结束,执行耗时:{}秒", (endtime - starttime) / 1000);
         } catch (Exception e) {
-            log.error("头条获取异步报表数据定时任务执行报错");
+            log.error("头条下载异步报表数据定时任务执行报错");
             e.printStackTrace();
             result.setSuccess(false);
         }
@@ -120,60 +124,92 @@ public class BytedanceReportController {
     }
 
     @GetMapping("/bytedance/bytedanceMaterialReport")
-    public Result<Object> bytedanceMaterialReport(@RequestParam(name = "startDate") String startDate,
-                                                  @RequestParam(name = "endDate")String endDate) {
-        Result<Object> result = new Result<>();
+    public Result bytedanceMaterialReport(@RequestParam(name = "startDate") String startDate,
+                                          @RequestParam(name = "endDate") String endDate) {
+        Result result = new Result<>();
         if (StringUtils.isBlank(startDate) || StringUtils.isBlank(endDate)){
             result.error500("开始时间和结束时间不能为空");
             return result;
         }
-        final ExecutorService  executorService = Executors.newFixedThreadPool(8);
+
         try {
             log.info("头条获取素材报表数据任务执行开始");
+            Long starttime = System.currentTimeMillis();
             List<CtopOauthToken> tokens = tokenService.selectToutiaoToken();
-            if (null == tokens || tokens.isEmpty()) {
+            if (null == tokens || tokens.size() <= 0) {
                 log.info("头条获取素材报表数据任务执行失败:未获取到可用的token");
                 return result;
             }
-            tokens.forEach(token -> executorService.submit(() -> {
-                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;
-                    //获取头条素材报表数据
-                    bytedanceReportService.bytedanceMaterialReport(token, start, end);
-                }
-            }));
+
+            final ExecutorService executorService = Executors.newFixedThreadPool(3);
+            tokens.forEach(token -> {
+                executorService.submit(new Runnable() {
+                    @Override
+                    public void run() {
+                        try {
+                            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;
+                                //获取头条素材报表数据
+                                bytedanceReportService.bytedanceMaterialReport(token, start, end);
+                            }
+                        } catch (Exception e) {
+                            e.printStackTrace();
+                        } finally {
+                        }
+                    }
+                });
+            });
+            ////
+            Long endtime = System.currentTimeMillis();
+            log.info("头条获取素材报表数据任务执行结束,执行耗时:{}秒", (endtime - starttime) / 1000);
         } catch (Exception e) {
             log.error("头条获取素材报表数据任务执行结失败");
             e.printStackTrace();
             result.setSuccess(false);
-        }finally {
-            executorService.shutdownNow();
         }
         return result;
     }
 
     @GetMapping("/bytedance/bytedanceMaterialReporRetry")
-    public Result<Object> bytedanceMaterialReportRetry() {
+    public Result bytedanceMaterialReportRetry() {
         log.info("头条获取素材报表失败数据任务重试开始");
-        Result<Object> result = new Result<>();
-        final ExecutorService executorService = Executors.newFixedThreadPool(8);
+        Result result = new Result<>();
         try {
             List<BytedanceReportMaterialRetry> retryList = bytedanceReportService.getRetryList();
-            retryList.forEach(retry -> executorService.submit(() -> {
-                CtopOauthToken token = tokenService.getOauthTokenByAccountId(String.valueOf(retry.getAccountId()));
-                log.info("头条素材报表当前accountId为:" + token.getAccountId());
-                bytedanceReportService.bytedanceMaterialReportRetry(token, retry.getStartDate(), retry.getEndDate());
-            }));
+            //for(BytedanceReportMaterialRetry retry:retryList){
+            //    CtopOauthToken token = tokenService.getOauthTokenByAccountId(String.valueOf(retry.getAccountId()));
+            //    log.info("头条素材报表当前accountId为:" + token.getAccountId());
+            //    bytedanceReportService.bytedanceMaterialReportRetry(token,retry.getStartDate(),retry.getEndDate());
+            //}
+
+            //
+            //多线程
+            final ExecutorService executorService = Executors.newFixedThreadPool(3);
+            retryList.forEach(retry -> {
+                executorService.submit(new Runnable() {
+                    @Override
+                    public void run() {
+                        try {
+                            CtopOauthToken token = tokenService.getOauthTokenByAccountId(String.valueOf(retry.getAccountId()));
+                            log.info("头条素材报表当前accountId为:" + token.getAccountId());
+                            bytedanceReportService.bytedanceMaterialReportRetry(token, retry.getStartDate(), retry.getEndDate());
+                        } catch (Exception e) {
+                            e.printStackTrace();
+                        } finally {
+                        }
+                    }
+                });
+            });
+            ////
+
         } catch (Exception e) {
             log.error("条获取素材报表失败数据任务重试失败");
             e.printStackTrace();
             result.setSuccess(false);
-        }finally {
-            executorService.shutdownNow();
         }
 
         log.info("头条获取素材报表数据任务重试结束");

+ 33 - 11
module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/report/service/impl/ByteDanceHourlyAccountWarningServiceImpl.java

@@ -37,26 +37,41 @@ public class ByteDanceHourlyAccountWarningServiceImpl implements IByteDanceHourl
     @Override
     public void byteDanceAccountWarning(Long accountId, String statDate, String anotherDay) {
         try {
+
             Integer maxHour = bytedanceAdvertiserHourlyReportMapper.selectMaxHour(accountId, statDate);
             if (Check.isNull(maxHour)) {
                 return;
             }
             QueryWrapper<UserAllocation> userAllocationQueryWrapper = new QueryWrapper<>();
-            userAllocationQueryWrapper.eq("account_id", accountId).eq("media_id", 1).orderByDesc("create_time").last("limit 1");
+            userAllocationQueryWrapper.eq("account_id", accountId);
+            userAllocationQueryWrapper.eq("media_id", 1);
+            userAllocationQueryWrapper.orderByDesc("create_time");
+            userAllocationQueryWrapper.last("limit 1");
             UserAllocation userAllocation = userAllocationMapper.selectOne(userAllocationQueryWrapper);
-            if (Check.isNull(userAllocation) || userAllocation.getAccountStatus() == 1) {
+            if (Check.isNull(userAllocation)) {
+                return;
+            }
+            if (userAllocation.getAccountStatus() == 1) {
                 return;
             }
             BigDecimal warningAmount = userAllocation.getWarningAmount();
             BigDecimal warningProportion = userAllocation.getWarningProportion();
             BigDecimal nowCost = bytedanceAdvertiserHourlyReportMapper.getCost(accountId, maxHour, statDate);
-            if (maxHour != 0 && !Check.isNull(nowCost) && nowCost.compareTo(new BigDecimal(0)) != 0) {
-                BigDecimal lastHourCost = bytedanceAdvertiserHourlyReportMapper.getCost(accountId, maxHour - 1, statDate);
-                if (!Check.isNull(lastHourCost) && lastHourCost.compareTo(new BigDecimal(0)) != 0) {
-                    BigDecimal subtract = nowCost.subtract(lastHourCost);
-                    BigDecimal divide = nowCost.divide(lastHourCost, 2, RoundingMode.HALF_UP);
-                    if (subtract.compareTo(warningAmount) > -1 && divide.compareTo(warningProportion) > -1) {
-                        sendMessage(accountId, userAllocation.getAuthName(), maxHour, nowCost, userAllocation.getProjectId(), userAllocation.getProjectName());
+
+            BigDecimal cost = nowCost.setScale(2, RoundingMode.HALF_UP);
+
+
+            if (maxHour != 0) {
+                if (!Check.isNull(nowCost) && nowCost.compareTo(new BigDecimal(0)) != 0) {
+                    BigDecimal lastHourCost = bytedanceAdvertiserHourlyReportMapper.getCost(accountId, maxHour - 1, statDate);
+                    if (!Check.isNull(lastHourCost) && lastHourCost.compareTo(new BigDecimal(0)) != 0) {
+                        if (!Check.isNull(userAllocation)) {
+                            BigDecimal subtract = nowCost.subtract(lastHourCost);
+                            BigDecimal divide = nowCost.divide(lastHourCost, 2, RoundingMode.HALF_UP);
+                            if (subtract.compareTo(warningAmount) > -1 && divide.compareTo(warningProportion) > -1) {
+                                sendMessage(accountId, userAllocation.getAuthName(), maxHour, cost, userAllocation.getProjectId(), userAllocation.getProjectName());
+                            }
+                        }
                     }
                 }
             }
@@ -67,10 +82,11 @@ public class ByteDanceHourlyAccountWarningServiceImpl implements IByteDanceHourl
                     BigDecimal subtract = nowCost.subtract(yesterdayHourCost);
                     BigDecimal divide = nowCost.divide(yesterdayHourCost, 2, RoundingMode.HALF_UP);
                     if (subtract.compareTo(warningAmount) > -1 && divide.compareTo(warningProportion) > -1) {
-                        sendYesterdayMessage(accountId, userAllocation.getAuthName(), maxHour, nowCost, userAllocation.getProjectId(), userAllocation.getProjectName());
+                        sendYesterdayMessage(accountId, userAllocation.getAuthName(), maxHour, cost, userAllocation.getProjectId(), userAllocation.getProjectName());
                     }
                 }
             }
+
         } catch (Exception e) {
             e.printStackTrace();
         }
@@ -87,8 +103,13 @@ public class ByteDanceHourlyAccountWarningServiceImpl implements IByteDanceHourl
                 .append("出现消耗暴涨,").append("消耗金额为:" + nowCost).append("<br/>")
                 .append("请您及时查看!");
 
+
         QueryWrapper<MailLog> queryWrapper = new QueryWrapper<>();
-        queryWrapper.eq("account_id", accountId).eq("hour", maxHour).eq("mail_type", 3).orderByDesc("create_time").last("limit 1");
+        queryWrapper.eq("account_id", accountId);
+        queryWrapper.eq("hour", maxHour);
+        queryWrapper.eq("mail_type", 3);
+        queryWrapper.orderByDesc("create_time");
+        queryWrapper.last("limit 1");
         MailLog checkMailLog = mailLogMapper.selectOne(queryWrapper);
         if (Check.isNull(checkMailLog)) {
             List<String> mailList = mailLogMapper.selectMailList(projectId);
@@ -109,6 +130,7 @@ public class ByteDanceHourlyAccountWarningServiceImpl implements IByteDanceHourl
             List<String> wexinIds = mailLogMapper.selectWeiXinIdList(projectId);
             CorpWexinUtils.sendMessage(wexinIds, text.toString());
         }
+
     }
 
 

+ 339 - 293
module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/report/service/impl/BytedanceReportServiceImpl.java

@@ -1,12 +1,19 @@
 package cn.com.ctop.toutiao.modules.report.service.impl;
 
 import cn.com.ctop.common.module.entity.CtopOauthToken;
+import cn.com.ctop.common.module.entity.UserAllocation;
+import cn.com.ctop.common.module.mapper.UserAllocationMapper;
 import cn.com.ctop.common.module.service.ICtopOauthTokenService;
 import cn.com.ctop.common.module.utils.Check;
-import cn.com.ctop.common.module.utils.LoadFileUtil;
+import cn.com.ctop.common.module.utils.HttpUtils;
+import cn.com.ctop.kuaishou.modules.report.entity.KuaishouReportDailyAccount;
+import cn.com.ctop.kuaishou.modules.report.mapper.KuaishouReportDailyAccountMapper;
+import cn.com.ctop.kuaishou.modules.utils.DownloadUtils;
+import cn.com.ctop.toutiao.modules.report.entity.BytedanceAdvertiserDailyReport;
 import cn.com.ctop.toutiao.modules.report.entity.BytedanceDailyReportTask;
 import cn.com.ctop.toutiao.modules.report.entity.BytedanceReportMaterialDaily;
 import cn.com.ctop.toutiao.modules.report.entity.BytedanceReportMaterialRetry;
+import cn.com.ctop.toutiao.modules.report.mapper.BytedanceAdvertiserDailyReportMapper;
 import cn.com.ctop.toutiao.modules.report.mapper.BytedanceDailyReportTaskMapper;
 import cn.com.ctop.toutiao.modules.report.mapper.BytedanceReportMapper;
 import cn.com.ctop.toutiao.modules.report.mapper.BytedanceReportMaterialDailyMapper;
@@ -17,24 +24,14 @@ 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.apache.http.client.ClientProtocolException;
-import org.apache.http.client.methods.CloseableHttpResponse;
-import org.apache.http.client.methods.HttpEntityEnclosingRequestBase;
-import org.apache.http.entity.ContentType;
-import org.apache.http.entity.StringEntity;
-import org.apache.http.impl.client.CloseableHttpClient;
-import org.apache.http.impl.client.HttpClientBuilder;
 import org.jeecg.common.util.DateUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStreamReader;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
-import java.net.URI;
+import java.text.ParseException;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
@@ -43,20 +40,197 @@ import java.util.Map;
 @Service
 @Slf4j
 public class BytedanceReportServiceImpl implements IBytedanceReportService {
+
     @Value("${jeecg.path.report-history}")
     private String downloadPath;
     @Autowired
+    private UserAllocationMapper userAllocationMapper;
+
+    @Autowired
+    private BytedanceAdvertiserDailyReportMapper bytedanceAdvertiserDailyReportMapper;
+
+    @Autowired
     private BytedanceReportMapper reportMapper;
+
+    @Autowired
+    private KuaishouReportDailyAccountMapper kuaishouReportDailyAccountMapper;
+
     @Autowired
     private BytedanceDailyReportTaskMapper bytedanceDailyReportTaskMapper;
+
     @Autowired
     private IBytedanceDailyReportTaskService bytedanceDailyReportTaskService;
+
     @Autowired
     private ICtopOauthTokenService ctopOauthTokenService;
+
     @Autowired
     private BytedanceReportMaterialDailyMapper bytedanceReportMaterialDailyMapper;
 
-    private static final String SIMPLE_DATE_FORMAT_YYYY_MM_DD = "yyyy-MM-dd";
+    /**
+     * 媒体昨日总消耗
+     *
+     * @param loginId
+     * @return
+     */
+    @Override
+    public JSONObject getAccountReport(String loginId) {
+        JSONObject returnJson = new JSONObject();
+        QueryWrapper<UserAllocation> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("user_id", loginId);
+        queryWrapper.isNotNull("account_id");
+        queryWrapper.groupBy("account_id");
+        List<UserAllocation> userAllocations = userAllocationMapper.selectList(queryWrapper);
+        if (!Check.isNull(userAllocations)) {
+            // 头条相关
+            JSONObject bytedanceJson = new JSONObject();
+            BigDecimal byteDanceCost = new BigDecimal(0);
+            Long byteDanceClick = 0L;
+            Long byteDanceShow = 0L;
+            Long byteDanceConvert = 0L;
+            Long byteDanceForm = 0L;
+            Long byteDanceNextDayOpen = 0L;
+            Long byteDanceActive = 0L;
+            JSONArray bytedanceDetail = new JSONArray();
+
+            // 快手相关
+            JSONArray kuaishouDetail = new JSONArray();
+            JSONObject kuaishouJson = new JSONObject();
+            BigDecimal kuaishouCost = new BigDecimal(0);
+
+            Long kuaishouClick = 0L;
+            Long kuaishouShow = 0L;
+            Long kuaishouConvert = 0L;
+            Long kuaishouForm = 0L;
+            Long kuaishouNextDayOpen = 0L;
+            Long kuaishouActive = 0L;
+
+
+            for (UserAllocation userAllocation : userAllocations) {
+                if ("1".equals(userAllocation.getMediaId())) {
+                    QueryWrapper<BytedanceAdvertiserDailyReport> bytedanceAdvertiserDailyReportQueryWrapper = new QueryWrapper<>();
+                    bytedanceAdvertiserDailyReportQueryWrapper.eq("advertiser_id", userAllocation.getAccountId());
+                    bytedanceAdvertiserDailyReportQueryWrapper.between("stat_datetime", "2019-07-01 00:00:00", "2019-07-01 23:59:59");
+                    bytedanceAdvertiserDailyReportQueryWrapper.orderByDesc("create_time");
+                    bytedanceAdvertiserDailyReportQueryWrapper.last("limit 1");
+                    BytedanceAdvertiserDailyReport bytedanceAdvertiserDailyReport = bytedanceAdvertiserDailyReportMapper.selectOne(bytedanceAdvertiserDailyReportQueryWrapper);
+                    if (!Check.isNull(bytedanceAdvertiserDailyReport)) {
+                        JSONObject bytedanceDetailJson = new JSONObject();
+                        BigDecimal cost = bytedanceAdvertiserDailyReport.getCost();
+                        // 账号总消耗
+                        bytedanceDetailJson.put("cost", cost);
+                        byteDanceCost = byteDanceCost.add(cost);
+                        Long click = bytedanceAdvertiserDailyReport.getClick();
+                        // 账号总点击
+                        bytedanceDetailJson.put("click", click);
+                        byteDanceClick += click;
+                        Long showNum = bytedanceAdvertiserDailyReport.getShowNum();
+                        // 账号总展示
+                        bytedanceDetailJson.put("show", showNum);
+                        byteDanceShow += showNum;
+                        Long convertNum = bytedanceAdvertiserDailyReport.getConvertNum();
+                        // 账号总转化
+                        bytedanceDetailJson.put("convert", convertNum);
+                        byteDanceConvert += convertNum;
+                        Long form = bytedanceAdvertiserDailyReport.getForm();
+                        // 账号总表单提交
+                        bytedanceDetailJson.put("form", form);
+                        byteDanceForm += form;
+                        Long nextDayOpen = bytedanceAdvertiserDailyReport.getNextDayOpen();
+                        // 账号总次日留存
+                        bytedanceDetailJson.put("nextDayOpen", nextDayOpen);
+                        byteDanceNextDayOpen += nextDayOpen;
+                        Long active = bytedanceAdvertiserDailyReport.getActive();
+                        // 账号总激活
+                        bytedanceDetailJson.put("active", active);
+                        byteDanceActive += active;
+                        // 账号
+                        bytedanceDetailJson.put("accountId", userAllocation.getAccountId());
+                        // 账号 名称
+                        bytedanceDetailJson.put("accountName", userAllocation.getAuthName());
+                        bytedanceDetail.add(bytedanceDetailJson);
+                    }
+
+                } else if ("2".equals(userAllocation.getMediaId())) {
+                    // 查询快手相关报表数据
+                    QueryWrapper<KuaishouReportDailyAccount> kuaishouReportDailyAccountQueryWrapper = new QueryWrapper<>();
+                    kuaishouReportDailyAccountQueryWrapper.eq("account_id", userAllocation.getAccountId());
+                    kuaishouReportDailyAccountQueryWrapper.between("stat_date", "2019-10-08 00:00:00", "2019-10-08 23:59:59");
+                    kuaishouReportDailyAccountQueryWrapper.orderByDesc("create_time");
+                    kuaishouReportDailyAccountQueryWrapper.last("limit 1");
+                    KuaishouReportDailyAccount reportDailyAccount = kuaishouReportDailyAccountMapper.selectOne(kuaishouReportDailyAccountQueryWrapper);
+                    if (!Check.isNull(reportDailyAccount)) {
+                        JSONObject kuaishouDetailJson = new JSONObject();
+                        kuaishouDetailJson.put("accountId", userAllocation.getAccountId());
+                        kuaishouDetailJson.put("accountName", userAllocation.getAuthName());
+
+                        // 花费
+                        BigDecimal cost = reportDailyAccount.getCharge();
+                        kuaishouDetailJson.put("cost", cost);
+                        kuaishouCost = kuaishouCost.add(cost);
+
+                        Long click = reportDailyAccount.getAclick();
+                        kuaishouDetailJson.put("click", click);
+                        kuaishouClick += click;
+
+                        Long show = reportDailyAccount.getPhotoShow();
+                        kuaishouDetailJson.put("show", show);
+                        kuaishouShow += show;
+
+                        Long convert = reportDailyAccount.getBclick();
+                        kuaishouDetailJson.put("convert", convert);
+                        kuaishouConvert += convert;
+
+                        Long form = reportDailyAccount.getSubmit();
+                        kuaishouDetailJson.put("form", form);
+                        kuaishouForm += form;
+
+
+                        Long active = reportDailyAccount.getActivation();
+                        kuaishouDetailJson.put("active", active);
+                        kuaishouActive += active;
+
+                        kuaishouDetail.add(kuaishouDetailJson);
+
+                    }
+
+                }
+            }
+            // 总消耗
+            bytedanceJson.put("cost", byteDanceCost);
+            // 总点击
+            bytedanceJson.put("click", byteDanceClick);
+            // 总展示
+            bytedanceJson.put("show", byteDanceShow);
+            // 总转化
+            bytedanceJson.put("convert", byteDanceConvert);
+            // 总表单提交
+            bytedanceJson.put("form", byteDanceForm);
+            // 总次留数
+            bytedanceJson.put("nextDayOpen", byteDanceNextDayOpen);
+            // 总激活
+            bytedanceJson.put("active", byteDanceActive);
+
+            returnJson.put("bytedance", bytedanceJson);
+            returnJson.put("bytedanceDetail", bytedanceDetail);
+
+
+            kuaishouJson.put("cost", kuaishouCost);
+            kuaishouJson.put("click", kuaishouClick);
+            kuaishouJson.put("show", kuaishouShow);
+            kuaishouJson.put("convert", kuaishouConvert);
+            kuaishouJson.put("form", kuaishouForm);
+            kuaishouJson.put("nextDayOpen", 0);
+            kuaishouJson.put("active", kuaishouActive);
+            returnJson.put("kuaishou", kuaishouJson);
+            returnJson.put("kuaishouDetail", kuaishouDetail);
+
+        }
+
+
+        return returnJson;
+    }
+
     /**
      * 快手-大盘报表
      *
@@ -68,16 +242,16 @@ public class BytedanceReportServiceImpl implements IBytedanceReportService {
         Integer type = requestJson.getInteger("type");
         JSONObject accountJson = new JSONObject();
         try {
-            String nowDate = DateUtils.getNowDate(SIMPLE_DATE_FORMAT_YYYY_MM_DD);
-            String anotherDay = DateUtils.getAnotherDay(SIMPLE_DATE_FORMAT_YYYY_MM_DD, nowDate, -1);
+            String nowDate = DateUtils.getNowDate("yyyy-MM-dd");
+            String anotherDay = DateUtils.getAnotherDay("yyyy-MM-dd", nowDate, -1);
             if (type == 1) {
                 // 今日总消耗
                 JSONObject nowJson = reportMapper.selectDayReport(nowDate);
-                if (null == nowJson) {
+                if (Check.isNull(nowJson)) {
                     return accountJson;
                 }
-                Integer maxHour = nowJson.getInteger("maxHour");
-                if (null == maxHour || maxHour == 0) {
+                int maxHour = nowJson.getInteger("maxHour");
+                if (maxHour == 0 || Check.isNull(maxHour)) {
                     return accountJson;
                 }
                 String maxHourStr = String.valueOf(maxHour - 1);
@@ -138,19 +312,19 @@ public class BytedanceReportServiceImpl implements IBytedanceReportService {
             } else if (type == 2) {
                 accountJson = reportMapper.selectDayReport(anotherDay);
             } else if (type == 3) {
-                String endDate = DateUtils.getAnotherDay(SIMPLE_DATE_FORMAT_YYYY_MM_DD, anotherDay, -6);
+                String endDate = DateUtils.getAnotherDay("yyyy-MM-dd", anotherDay, -6);
                 accountJson = reportMapper.selectByDate(anotherDay, endDate);
             } else if (type == 4) {
-                String endDate = DateUtils.getAnotherDay(SIMPLE_DATE_FORMAT_YYYY_MM_DD, anotherDay, -14);
+                String endDate = DateUtils.getAnotherDay("yyyy-MM-dd", anotherDay, -14);
                 accountJson = reportMapper.selectByDate(anotherDay, endDate);
             } else if (type == 5) {
-                String endDate = DateUtils.getMonthBefore(SIMPLE_DATE_FORMAT_YYYY_MM_DD, anotherDay, -1);
+                String endDate = DateUtils.getMonthBefore("yyyy-MM-dd", anotherDay, -1);
                 accountJson = reportMapper.selectByDate(anotherDay, endDate);
             } else if (type == 6) {
-                String endDate = DateUtils.getMonthBefore(SIMPLE_DATE_FORMAT_YYYY_MM_DD, anotherDay, -3);
+                String endDate = DateUtils.getMonthBefore("yyyy-MM-dd", anotherDay, -3);
                 accountJson = reportMapper.selectByDate(anotherDay, endDate);
             } else if (type == 7) {
-                String endDate = DateUtils.getMonthBefore(SIMPLE_DATE_FORMAT_YYYY_MM_DD, anotherDay, -6);
+                String endDate = DateUtils.getMonthBefore("yyyy-MM-dd", anotherDay, -6);
                 accountJson = reportMapper.selectByDate(anotherDay, endDate);
             } else if (type == 8) {
                 accountJson = reportMapper.selectAllAccount();
@@ -166,11 +340,11 @@ public class BytedanceReportServiceImpl implements IBytedanceReportService {
                 JSONObject comparedJson = new JSONObject();
 
                 if ("month".equals(sign)) {
-                    Map<String, Object> dateMap = DateUtils.compareDate(SIMPLE_DATE_FORMAT_YYYY_MM_DD, bigDate, smallDate);
+                    Map<String, Object> dateMap = DateUtils.compareDate("yyyy-MM", bigDate, smallDate);
                     beComparedJson = reportMapper.selectMonthReportByDate((String) dateMap.get("smallDate"));
                     comparedJson = reportMapper.selectMonthReportByDate((String) dateMap.get("bigDate"));
                 } else if ("day".equals(sign)) {
-                    Map<String, Object> dateMap = DateUtils.compareDate(SIMPLE_DATE_FORMAT_YYYY_MM_DD, bigDate, smallDate);
+                    Map<String, Object> dateMap = DateUtils.compareDate("yyyy-MM-dd", bigDate, smallDate);
                     beComparedJson = reportMapper.selectDayReportByDate((String) dateMap.get("smallDate"));
                     comparedJson = reportMapper.selectDayReportByDate((String) dateMap.get("bigDate"));
                 }
@@ -226,8 +400,8 @@ public class BytedanceReportServiceImpl implements IBytedanceReportService {
         Integer type = requestJson.getInteger("type");
         List<JSONObject> detail = new ArrayList<>();
         try {
-            String nowDate = DateUtils.getNowDate(SIMPLE_DATE_FORMAT_YYYY_MM_DD);
-            String anotherDay = DateUtils.getAnotherDay(SIMPLE_DATE_FORMAT_YYYY_MM_DD, nowDate, -1);
+            String nowDate = DateUtils.getNowDate("yyyy-MM-dd");
+            String anotherDay = DateUtils.getAnotherDay("yyyy-MM-dd", nowDate, -1);
             if (type == 1) {
                 //  今日明细
                 List<JSONObject> yesterdayDetail = reportMapper.selectReportDetail(anotherDay);
@@ -295,19 +469,19 @@ public class BytedanceReportServiceImpl implements IBytedanceReportService {
             } else if (type == 2) {
                 detail = reportMapper.selectReportDetail(anotherDay);
             } else if (type == 3) {
-                String endDate = DateUtils.getAnotherDay(SIMPLE_DATE_FORMAT_YYYY_MM_DD, anotherDay, -6);
+                String endDate = DateUtils.getAnotherDay("yyyy-MM-dd", anotherDay, -6);
                 detail = reportMapper.selectDayDetailByDate(anotherDay, endDate);
             } else if (type == 4) {
-                String endDate = DateUtils.getAnotherDay(SIMPLE_DATE_FORMAT_YYYY_MM_DD, anotherDay, -14);
+                String endDate = DateUtils.getAnotherDay("yyyy-MM-dd", anotherDay, -14);
                 detail = reportMapper.selectDayDetailByDate(anotherDay, endDate);
             } else if (type == 5) {
-                String endDate = DateUtils.getMonthBefore(SIMPLE_DATE_FORMAT_YYYY_MM_DD, anotherDay, -1);
+                String endDate = DateUtils.getMonthBefore("yyyy-MM-dd", anotherDay, -1);
                 detail = reportMapper.selectDayDetailByDate(anotherDay, endDate);
             } else if (type == 6) {
-                String endDate = DateUtils.getMonthBefore(SIMPLE_DATE_FORMAT_YYYY_MM_DD, anotherDay, -3);
+                String endDate = DateUtils.getMonthBefore("yyyy-MM-dd", anotherDay, -3);
                 detail = reportMapper.selectDayDetailByDate(anotherDay, endDate);
             } else if (type == 7) {
-                String endDate = DateUtils.getMonthBefore(SIMPLE_DATE_FORMAT_YYYY_MM_DD, anotherDay, -6);
+                String endDate = DateUtils.getMonthBefore("yyyy-MM-dd", anotherDay, -6);
                 detail = reportMapper.selectDayDetailByMonth(anotherDay, endDate);
             } else if (type == 8) {
                 detail = reportMapper.selectAllDayDetailByMonth();
@@ -327,7 +501,7 @@ public class BytedanceReportServiceImpl implements IBytedanceReportService {
                     comparedDate = (String) dateMap.get("smallDate");
                     comparedArr = reportMapper.selectDayDetailsByMonth((String) dateMap.get("bigDate"));
                 } else if ("day".equals(sign)) {
-                    Map<String, Object> dateMap = DateUtils.compareDate(SIMPLE_DATE_FORMAT_YYYY_MM_DD, bigDate, smallDate);
+                    Map<String, Object> dateMap = DateUtils.compareDate("yyyy-MM-dd", bigDate, smallDate);
                     comparedDate = (String) dateMap.get("smallDate");
                     comparedArr = reportMapper.selectHourlyDetailsByDate((String) dateMap.get("bigDate"));
                 }
@@ -340,7 +514,7 @@ public class BytedanceReportServiceImpl implements IBytedanceReportService {
                         String beComparedDate = "";
                         String statHour = "";
                         if ("month".equals(sign)) {
-                            String day = DateUtils.getDay(SIMPLE_DATE_FORMAT_YYYY_MM_DD, statDate);
+                            String day = DateUtils.getDay("yyyy-MM-dd", statDate);
                             beComparedDate = comparedDate + "-" + day;
                             beComparedJson = reportMapper.selectDayDailyByDate(beComparedDate);
 
@@ -368,11 +542,11 @@ public class BytedanceReportServiceImpl implements IBytedanceReportService {
                             BigDecimal comparedCost = beComparedJson.getBigDecimal("cost");
                             Long comparedPhotoShow = beComparedJson.getLong("photoShow");
                             Long comparedPhotoClick = beComparedJson.getLong("photoClick");
-                            Long comparedAclick = beComparedJson.getLong("aclick");
+                            Long comparedAClick = beComparedJson.getLong("aclick");
                             json.put("beComparedCost", comparedCost);
                             json.put("beComparedPhotoShow", comparedPhotoShow);
                             json.put("beComparedPhotoClick", comparedPhotoClick);
-                            json.put("beComparedAClick", comparedAclick);
+                            json.put("beComparedAClick", comparedAClick);
                             json.put("beComparedDate", beComparedDate);
 
                             if (comparedCost.compareTo(new BigDecimal(0)) != 0) {
@@ -393,8 +567,8 @@ public class BytedanceReportServiceImpl implements IBytedanceReportService {
                             } else {
                                 json.put("showProportion", 0);
                             }
-                            if (comparedAclick != 0L) {
-                                double aClickProportion = (aClick.doubleValue() - comparedAclick.doubleValue()) / comparedAclick.doubleValue();
+                            if (comparedAClick != 0L) {
+                                double aClickProportion = (aClick.doubleValue() - comparedAClick.doubleValue()) / comparedAClick.doubleValue();
                                 json.put("comparedAclick", aClickProportion);
                             } else {
                                 json.put("comparedAclick", 0);
@@ -422,8 +596,8 @@ public class BytedanceReportServiceImpl implements IBytedanceReportService {
         List<JSONObject> reportList = new ArrayList<>();
         try {
             Integer type = requestJson.getInteger("type");
-            String nowDate = DateUtils.getNowDate(SIMPLE_DATE_FORMAT_YYYY_MM_DD);
-            String anotherDay = DateUtils.getAnotherDay(SIMPLE_DATE_FORMAT_YYYY_MM_DD, nowDate, -1);
+            String nowDate = DateUtils.getNowDate("yyyy-MM-dd");
+            String anotherDay = DateUtils.getAnotherDay("yyyy-MM-dd", nowDate, -1);
             if (type == 1) {
                 List<JSONObject> nowReportList = reportMapper.selectReportDetail(nowDate);
                 List<JSONObject> yesterdayReportList = reportMapper.selectReportDetail(anotherDay);
@@ -435,19 +609,19 @@ public class BytedanceReportServiceImpl implements IBytedanceReportService {
             } else if (type == 2) {
                 reportList = reportMapper.selectReportDetail(anotherDay);
             } else if (type == 3) {
-                String endDate = DateUtils.getAnotherDay(SIMPLE_DATE_FORMAT_YYYY_MM_DD, anotherDay, -6);
+                String endDate = DateUtils.getAnotherDay("yyyy-MM-dd", anotherDay, -6);
                 reportList = reportMapper.selectDayDetailByDate(anotherDay, endDate);
             } else if (type == 4) {
-                String endDate = DateUtils.getAnotherDay(SIMPLE_DATE_FORMAT_YYYY_MM_DD, anotherDay, -14);
+                String endDate = DateUtils.getAnotherDay("yyyy-MM-dd", anotherDay, -14);
                 reportList = reportMapper.selectDayDetailByDate(anotherDay, endDate);
             } else if (type == 5) {
-                String endDate = DateUtils.getMonthBefore(SIMPLE_DATE_FORMAT_YYYY_MM_DD, anotherDay, -1);
+                String endDate = DateUtils.getMonthBefore("yyyy-MM-dd", anotherDay, -1);
                 reportList = reportMapper.selectDayDetailByDate(anotherDay, endDate);
             } else if (type == 6) {
-                String endDate = DateUtils.getMonthBefore(SIMPLE_DATE_FORMAT_YYYY_MM_DD, anotherDay, -3);
+                String endDate = DateUtils.getMonthBefore("yyyy-MM-dd", anotherDay, -3);
                 reportList = reportMapper.selectDayDetailByDate(anotherDay, endDate);
             } else if (type == 7) {
-                String endDate = DateUtils.getMonthBefore(SIMPLE_DATE_FORMAT_YYYY_MM_DD, anotherDay, -6);
+                String endDate = DateUtils.getMonthBefore("yyyy-MM-dd", anotherDay, -6);
                 reportList = reportMapper.selectDayDetailByMonth(anotherDay, endDate);
             } else if (type == 8) {
                 reportList = reportMapper.selectAllDayDetailByMonth();
@@ -463,7 +637,7 @@ public class BytedanceReportServiceImpl implements IBytedanceReportService {
                 if ("month".equals(sign)) {
                     dateMap = DateUtils.compareDate("yyyy-MM", bigDate, smallDate);
                 } else if ("day".equals(sign)) {
-                    dateMap = DateUtils.compareDate(SIMPLE_DATE_FORMAT_YYYY_MM_DD, bigDate, smallDate);
+                    dateMap = DateUtils.compareDate("yyyy-MM-dd", bigDate, smallDate);
                 }
                 String comparedDate = (String) dateMap.get("bigDate");
                 String beComparedDate = (String) dateMap.get("smallDate");
@@ -493,25 +667,27 @@ public class BytedanceReportServiceImpl implements IBytedanceReportService {
 
     /////////////////////////////////////////////////////////////////////////////////////////////////
     //创建异步任务
-    @Override
-    public void bytedanceAsyncTaskCreate(String startDate, String endDate, CtopOauthToken token, Integer type) {
-        int diffMonths = DateUtils.calDiffMonth(DateUtils.parseDate(startDate, SIMPLE_DATE_FORMAT_YYYY_MM_DD), DateUtils.parseDate(endDate, SIMPLE_DATE_FORMAT_YYYY_MM_DD));
+    public void bytedanceAsyncTaskCreate(String startDate, String endDate, CtopOauthToken token, Integer type) throws ParseException {
+        int diffMonths = DateUtils.calDiffMonth(DateUtils.parseDate(startDate, "yyyy-MM-dd"), DateUtils.parseDate(endDate, "yyyy-MM-dd"));
         if (diffMonths == 0) {
             bytedanceAsyncTaskCreateByMonth(startDate, endDate, token, type);
         }else{
             for(int i=0; i<=diffMonths ; i++){
                 if (i == 0){
-                    Map<String, String> dateMap = DateUtils.getMaxMinDaysOfAddMonth(startDate, SIMPLE_DATE_FORMAT_YYYY_MM_DD, i);
+                    Map<String, String> dateMap = DateUtils.getMaxMinDaysOfAddMonth(startDate, "yyyy-MM-dd", i);
                     String end = dateMap.get("endDate");
+                    //System.out.println(startDate + " ----- " + end);
                     bytedanceAsyncTaskCreateByMonth(startDate, end, token, type);
                 }else if(i == diffMonths){
-                    Map<String, String> dateMap = DateUtils.getMaxMinDaysOfAddMonth(startDate, SIMPLE_DATE_FORMAT_YYYY_MM_DD, i);
+                    Map<String, String> dateMap = DateUtils.getMaxMinDaysOfAddMonth(startDate, "yyyy-MM-dd", i);
                     String start = dateMap.get("startDate");
+                    //System.out.println(start + " ----- " + endDate);
                     bytedanceAsyncTaskCreateByMonth(start, endDate, token, type);
                 }else{
-                    Map<String, String> dateMap = DateUtils.getMaxMinDaysOfAddMonth(startDate, SIMPLE_DATE_FORMAT_YYYY_MM_DD, i);
+                    Map<String, String> dateMap = DateUtils.getMaxMinDaysOfAddMonth(startDate, "yyyy-MM-dd", i);
                     String start = dateMap.get("startDate");
                     String end = dateMap.get("endDate");
+                    //System.out.println(start + " ----- " + end);
                     bytedanceAsyncTaskCreateByMonth(start, end, token, type);
                 }
             }
@@ -525,110 +701,72 @@ public class BytedanceReportServiceImpl implements IBytedanceReportService {
      * @param token
      */
     private void bytedanceAsyncTaskCreateByMonth(String startDate, String endDate, CtopOauthToken token, Integer type){
+        String access_token = token.getAccessToken();
+        Long accountId = token.getAccountId();
+
         // 请求地址
         String open_api_domain = "https://ad.toutiao.com";
         String path = "/open_api/2/async_task/create/";
 
         String taskName = System.currentTimeMillis() + "";
         // 请求参数
-        Map<String, Object> filtering = new HashMap<>();
-        filtering.put("start_date", startDate);
-        filtering.put("end_date", endDate);
-        if (type == 1) {
-            //素材
-            filtering.put("group_by", new String[]{"STAT_GROUP_BY_CREATIVE_ID", "STAT_GROUP_BY_TIME_DAY", "STAT_GROUP_BY_CREATIVE_MATERIAL_MODE"});   //按照创意分组、天分组、创意类型分组查询
-        } else if (type == 2) {
-            //广告主
-            filtering.put("group_by", new String[]{"STAT_GROUP_BY_ADVERTISER_ID", "STAT_GROUP_BY_TIME_DAY", "STAT_GROUP_BY_PRICING_CATEGORY"});   //按照广告主分组、天分组、广告类型类型分组查询
-        } else if (type == 3) {
-            //广告组
-            filtering.put("group_by", new String[]{"STAT_GROUP_BY_CAMPAIGN_ID", "STAT_GROUP_BY_TIME_DAY", "STAT_GROUP_BY_CAMPAIGN_TYPE"});  //按照广告组、天、广告组类型分组
-        } else {
-            //4广告计划
-            filtering.put("group_by", new String[]{"STAT_GROUP_BY_AD_ID", "STAT_GROUP_BY_TIME_DAY", "STAT_GROUP_BY_LANDING_TYPE"});  //按照广告计划、天、推广类型分组
-        }
-        Map<String, Object> data = new HashMap<>();
-        data.put("advertiser_id", token.getAccountId());
-        data.put("task_name", taskName);
-        data.put("task_type", "REPORT");
-        data.put("task_params", filtering);
-
-        // 构造请求
-        HttpEntityEnclosingRequestBase httpEntity = new HttpEntityEnclosingRequestBase() {
-            @Override
-            public String getMethod() {
-                return "POST";
+        final Map filtering = new HashMap() {
+            {
+                put("start_date", startDate);
+                put("end_date", endDate);
+                if (type == 1) {//创意
+                    put("group_by", new String[]{"STAT_GROUP_BY_CREATIVE_ID", "STAT_GROUP_BY_TIME_DAY", "STAT_GROUP_BY_CREATIVE_MATERIAL_MODE"});   //按照创意分组、天分组、创意类型分组查询
+                } else if (type == 2) {//广告主
+                    put("group_by", new String[]{"STAT_GROUP_BY_ADVERTISER_ID", "STAT_GROUP_BY_TIME_DAY", "STAT_GROUP_BY_PRICING_CATEGORY"});   //按照广告主分组、天分组、广告类型类型分组查询
+                } else if (type == 3) {//广告组
+                    put("group_by", new String[]{"STAT_GROUP_BY_CAMPAIGN_ID", "STAT_GROUP_BY_TIME_DAY", "STAT_GROUP_BY_CAMPAIGN_TYPE"});  //按照广告组、天、广告组类型分组
+                } else {//4广告计划
+                    put("group_by", new String[]{"STAT_GROUP_BY_AD_ID", "STAT_GROUP_BY_TIME_DAY", "STAT_GROUP_BY_LANDING_TYPE"});  //按照广告计划、天、推广类型分组
+                }
+            }
+        };
+        final Map data = new HashMap() {
+            {
+                put("advertiser_id", accountId);
+                put("task_name", taskName);
+                put("task_type", "REPORT");
+                put("task_params", filtering);
             }
         };
 
-        httpEntity.setHeader("Access-Token", token.getAccessToken());
-
-        CloseableHttpResponse response = null;
-        CloseableHttpClient client = null;
-
-        try {
-            client = HttpClientBuilder.create().build();
-            httpEntity.setURI(URI.create(open_api_domain + path));
-            httpEntity.setEntity(new StringEntity(JSONObject.toJSONString(data), ContentType.APPLICATION_JSON));
-
-            response = client.execute(httpEntity);
-            if (response != null && response.getStatusLine().getStatusCode() == 200) {
-                BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
-                StringBuilder result = new StringBuilder();
-                String line = "";
-                while ((line = bufferedReader.readLine()) != null) {
-                    result.append(line);
-                }
-                bufferedReader.close();
+        JSONObject json = HttpUtils.bytedancePostRequest(access_token, open_api_domain + path, JSONObject.parseObject(JSONObject.toJSONString(data)));
+        if (json == null) {
+            log.error("请求有误:" + JSONObject.toJSONString(data));
+        }
 
-                JSONObject  json = JSONObject.parseObject(result.toString());
-                String jsonString = JSON.toJSONString(json);
+        String jsonString = JSON.toJSONString(json);
 
-                if(!Check.isNull(json)){
-                    Integer code = json.getInteger("code");
-                    if(code != 0){
-                        log.info("返回信息错误,错误码为:" + code + ",头条accountId:" + token.getAccountId() + ",message:" + json.getString("message"));
-                        return;
-                    }
-                    JSONObject dataJson = json.getJSONObject("data");
-
-                    //解析数据并入库
-                    BytedanceDailyReportTask task = new BytedanceDailyReportTask();
-                    task.setAccountId(token.getAccountId());
-                    task.setTaskCreateTime(dataJson.getDate("create_time") == null ? null : dataJson.getDate("create_time"));
-                    task.setTaskId(dataJson.getLong("task_id") ==  null ? null : dataJson.getLong("task_id") );
-                    task.setTaskName(dataJson.getString("task_name") == null ? null : dataJson.getString("task_name"));
-                    task.setTaskParams(JSON.toJSONString(dataJson.getJSONObject("task_params")));
-                    task.setJson(jsonString);
-                    task.setTaskStatus(dataJson.getString("task_status"));
-                    task.setTaskType(dataJson.getString("task_type"));
-                    task.setType(type);
-                    task.setIsDownload(0);
-                    task.setStatus(1); //状态1正常 0废弃
-                    bytedanceDailyReportTaskMapper.insert(task);
-                }
-
-            }else{
-                log.error("请求有误:" + response );
-            }
-        } catch (ClientProtocolException e) {
-            e.printStackTrace();
-        } catch (IOException e) {
-            e.printStackTrace();
-        } finally {
-            try {
-                if (response != null) {
-                    response.close();
-                }
-                client.close();
-            } catch (IOException e) {
-                e.printStackTrace();
+        if (!Check.isNull(json)) {
+            Integer code = json.getInteger("code");
+            if (code != 0) {
+                log.error("返回信息错误,错误码为:" + code + ",头条accountId:" + accountId + ",message:" + json.getString("message"));
+                return;
             }
+            JSONObject dataJson = json.getJSONObject("data");
+
+            //解析数据并入库
+            BytedanceDailyReportTask task = new BytedanceDailyReportTask();
+            task.setAccountId(accountId);
+            task.setTaskCreateTime(dataJson.getDate("create_time") == null ? null : dataJson.getDate("create_time"));
+            task.setTaskId(dataJson.getLong("task_id") == null ? null : dataJson.getLong("task_id"));
+            task.setTaskName(dataJson.getString("task_name") == null ? null : dataJson.getString("task_name"));
+            task.setTaskParams(JSON.toJSONString(dataJson.getJSONObject("task_params")));
+            task.setJson(jsonString);
+            task.setTaskStatus(dataJson.getString("task_status"));
+            task.setTaskType(dataJson.getString("task_type"));
+            task.setType(type);
+            task.setIsDownload(0);
+            task.setStatus(1); //状态1正常 0废弃
+            bytedanceDailyReportTaskMapper.insert(task);
         }
     }
 
     //获取任务列表
-    @Override
     public void bytedanceAsyncTaskGet(){
         QueryWrapper<BytedanceDailyReportTask> taskQueryWrapper = new QueryWrapper<>();
         //查询三种状态的信息--任务已创建、任务执行中、任务处理中
@@ -665,86 +803,45 @@ public class BytedanceReportServiceImpl implements IBytedanceReportService {
                         }
                     };
 
-                    // 构造请求
-                    HttpEntityEnclosingRequestBase httpEntity = new HttpEntityEnclosingRequestBase() {
-                        @Override
-                        public String getMethod() {
-                            return "GET";
-                        }
-                    };
-
-                    httpEntity.setHeader("Access-Token",access_token);
-
-                    CloseableHttpResponse response = null;
-                    CloseableHttpClient client = null;
+                    JSONObject json = HttpUtils.bytedanceGetRequest(access_token, open_api_domain + path, JSONObject.parseObject(JSONObject.toJSONString(data)));
+                    if (json == null) {
+                        log.error("请求有误:" + JSONObject.toJSONString(data));
+                    }
 
                     try {
-                        client = HttpClientBuilder.create().build();
-                        httpEntity.setURI(URI.create(open_api_domain + path));
-                        httpEntity.setEntity(new StringEntity(JSONObject.toJSONString(data), ContentType.APPLICATION_JSON));
-
-                        response = client.execute(httpEntity);
-                        log.info("response为:" +  response);
-                        if (response != null && response.getStatusLine().getStatusCode() == 200) {
-                            BufferedReader bufferedReader  = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
-                            StringBuffer result = new StringBuffer();
-                            String line = "";
-                            while((line = bufferedReader.readLine()) != null) {
-                                result.append(line);
+                        String jsonString = JSON.toJSONString(json);
+                        //log.info("返回json为" + jsonString);
+
+                        if (!Check.isNull(json)) {
+                            Integer code = json.getInteger("code");
+                            if (code != 0) {
+                                log.info("获取任务列表返回信息错误,错误码为:" + code + ",头条accountId:" + accountId + "taskId:" + task.getTaskId());
+                                continue;
                             }
-                            bufferedReader.close();
 
-                            JSONObject  json = JSONObject.parseObject(result.toString());
-                            String jsonString = JSON.toJSONString(json);
-                            log.info("返回json为" + jsonString);
+                            JSONObject jsonData = json.getJSONObject("data");
+                            if (Check.isNull(jsonData)) {
+                                log.error("获取任务列表返回信息data内容为空");
+                            }
+                            JSONArray jsonArrayay = jsonData.getJSONArray("list");
 
-                            if(!Check.isNull(json)){
-                                Integer code = json.getInteger("code");
-                                if(code != 0){
-                                    log.info("获取任务列表返回信息错误,错误码为:" + code + ",头条accountId:" + accountId + "taskId:" + task.getTaskId());
-                                    return;
-                                }
+                            for (int i = 0; i < jsonArrayay.size(); i++) {
+                                JSONObject detailJson = jsonArrayay.getJSONObject(i);
+                                if (!Check.isNull(detailJson)) {
+                                    String taskStatus = detailJson.getString("task_status");
 
-                                JSONObject jsonData = json.getJSONObject("data");
-                                if (Check.isNull(jsonData)){
-                                    log.error("获取任务列表返回信息data内容为空");
-                                }
-                                JSONArray jsonArrayay = jsonData.getJSONArray("list");
-
-                                for (int i = 0; i < jsonArrayay.size(); i++) {
-                                    JSONObject detailJson = jsonArrayay.getJSONObject(i);
-                                    if (!Check.isNull(detailJson)) {
-                                        String taskStatus = detailJson.getString("task_status");
-
-                                        if ("ASYNC_TASK_STATUS_COMPLETED".equals(taskStatus)) {
-                                            bytedanceAsyncTaskDownload(task,token,task.getType());
-                                            task.setIsDownload(1);
-                                        }
-                                            task.setTaskStatus(taskStatus);
-                                            bytedanceDailyReportTaskMapper.updateById(task);
-                                        }
+                                    if (taskStatus.equals("ASYNC_TASK_STATUS_COMPLETED")) {
+                                        bytedanceAsyncTaskDownload(task, token, task.getType());
+                                        task.setIsDownload(1);
                                     }
+                                    task.setTaskStatus(taskStatus);
+                                    bytedanceDailyReportTaskMapper.updateById(task);
                                 }
-
-                        }else{
-                            log.error("请求有误:" + response);
-                        }
-
-                    } catch (ClientProtocolException e) {
-                        e.printStackTrace();
-                    } catch (IOException e) {
-                        e.printStackTrace();
-                    } finally {
-                        try {
-                            if (response != null) {
-                                response.close();
                             }
-                            client.close();
-                        } catch (IOException e) {
-                            e.printStackTrace();
                         }
+                    } catch (Exception e) {
+                        e.printStackTrace();
                     }
-
                 }
             }
         }
@@ -757,11 +854,11 @@ public class BytedanceReportServiceImpl implements IBytedanceReportService {
         String path = "/open_api/2/async_task/download/";
 
         String url = open_api_domain + path;
-        String fileName = task.getAccountId() + "_" + "type" + type + "_" +System.currentTimeMillis() + ".csv";
+        String fileName = task.getAccountId() + "_" + "type" + type + "_" + task.getTaskId() + "_" + System.currentTimeMillis() + ".csv";
         Map<String, Object> requestMap = new HashMap<>();
         requestMap.put("advertiser_id", task.getAccountId());
         requestMap.put("task_id", task.getTaskId());
-        String localPath = LoadFileUtil.downloadByUrl(requestMap, downloadPath, url, token.getAccessToken(), fileName);
+        String localPath = DownloadUtils.downloadByUrl(requestMap, downloadPath, url, token.getAccessToken(), fileName);
         if(type == 1){
             //素材异步报表
             bytedanceDailyReportTaskMapper.loadBytedanceDailyCreativeFileAsync(localPath);
@@ -781,10 +878,9 @@ public class BytedanceReportServiceImpl implements IBytedanceReportService {
 
     /////////////////////////////////////////////////////////\
     //素材报表
-    @Override
     public void bytedanceMaterialReportRetry(CtopOauthToken token, String startDate, String endDate){
         Long accountId = token.getAccountId();
-        log.info("头条素材报表当前accountId为:" + accountId);
+        // log.info("头条素材报表当前accountId为:" + accountId);
         Integer page = 1;
         Integer pageSize = 100;
         int code = bytedanceMaterialReportByPage(page, pageSize, token, accountId, startDate, endDate);
@@ -803,10 +899,9 @@ public class BytedanceReportServiceImpl implements IBytedanceReportService {
         }
     }
 
-    @Override
     public void bytedanceMaterialReport(CtopOauthToken token, String startDate, String endDate){
         Long accountId = token.getAccountId();
-        log.info("头条素材报表当前accountId为:" + accountId);
+        // log.info("头条素材报表当前accountId为:" + accountId);
         Integer page = 1;
         Integer pageSize = 100;
         int code = bytedanceMaterialReportByPage(page, pageSize, token, accountId, startDate, endDate);
@@ -823,69 +918,44 @@ public class BytedanceReportServiceImpl implements IBytedanceReportService {
 
     private int bytedanceMaterialReportByPage(Integer page, Integer pageSize, CtopOauthToken token, Long accountId, String startDate, String endDate){
         //log.info("当前页数:"+ page);
-        String accessToken = token.getAccessToken();
+        String access_token = token.getAccessToken();
 
         // 请求地址
         String open_api_domain = "https://ad.oceanengine.com";
         String path = "/open_api/2/report/integrated/get/";
 
         // 请求参数
-        Map<String, Object> filtering = new HashMap<>();
-        filtering.put("image_mode", new String[]{"MATERIAL_IMAGE_MODE_TITLE"});
-
-        Map<String, Object> data = new HashMap<>();
-
-        data.put("advertiser_id", accountId);
-        data.put("start_date", startDate);
-        data.put("end_date", endDate);
-        data.put("page", page);
-        data.put("page_size", pageSize);
-        data.put("group_by", new String[]{"STAT_GROUP_BY_MATERIAL_ID", "STAT_GROUP_BY_INVENTORY", "STAT_GROUP_BY_IMAGE_MODE", "STAT_GROUP_BY_TIME_DAY"});
-
-
-        // 构造请求
-        HttpEntityEnclosingRequestBase httpEntity = new HttpEntityEnclosingRequestBase() {
-            @Override
-            public String getMethod() {
-                return "GET";
+        Map data = new HashMap() {
+            {
+                put("advertiser_id", accountId);
+                put("start_date", startDate);
+                put("end_date", endDate);
+                put("page", page);
+                put("page_size", pageSize);
+                put("group_by", new String[]{"STAT_GROUP_BY_MATERIAL_ID", "STAT_GROUP_BY_INVENTORY", "STAT_GROUP_BY_IMAGE_MODE", "STAT_GROUP_BY_TIME_DAY"});
             }
         };
 
-        httpEntity.setHeader("Access-Token", accessToken);
-
-        CloseableHttpResponse response = null;
-        CloseableHttpClient client = null;
+        JSONObject json = HttpUtils.bytedanceGetRequest(access_token, open_api_domain + path, JSONObject.parseObject(JSONObject.toJSONString(data)));
+        if (json == null) {
+            //insertMaterialRetry(accountId, startDate, endDate, -2);
+            log.error("请求有误:" + JSONObject.toJSONString(data));
+            return -2;
+        }
 
         int returnCode = 200;
         try {
-            client = HttpClientBuilder.create().build();
-            httpEntity.setURI(URI.create(open_api_domain + path));
-            httpEntity.setEntity(new StringEntity(JSONObject.toJSONString(data), ContentType.APPLICATION_JSON));
-
-            response = client.execute(httpEntity);
-
-            if (response != null && response.getStatusLine().getStatusCode() == 200) {
-                BufferedReader bufferedReader  = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
-                StringBuffer result = new StringBuffer();
-                String line = "";
-                while((line = bufferedReader.readLine()) != null) {
-                    result.append(line);
-                }
-                bufferedReader.close();
-
-                JSONObject  json = JSONObject.parseObject(result.toString());
-                String jsonString = JSON.toJSONString(json);
-
                 if(!Check.isNull(json)){
                     Integer code = json.getInteger("code");
                     if(code != 0){
-                        log.info("获取任务列表返回信息错误,错误码为:" + code + ",头条accountId:" + accountId + ";返回json为:" + jsonString);
+                        log.error("获取任务列表返回信息错误,错误码为:" + code + ",头条accountId:" + accountId + ";返回json为:" + JSONObject.toJSONString(data));
                         return -1;
                     }
 
                     JSONObject jsonData = json.getJSONObject("data");
                     if (Check.isNull(jsonData)){
-                        log.error("获取任务列表返回信息data内容为空");
+                        log.error("获取任务列表返回信息data内容为空,头条accountId:" + accountId + ";返回json为:" + JSONObject.toJSONString(data));
+                        return -1;
                     }
                     JSONObject pageInfo = jsonData.getJSONObject("page_info");
                     Integer totalPage = pageInfo.getInteger("total_page");
@@ -894,6 +964,7 @@ public class BytedanceReportServiceImpl implements IBytedanceReportService {
                     JSONArray jsonArrayay = jsonData.getJSONArray("list");
                     if(jsonArrayay.size() == 0){
                         log.info("accountId:" + accountId + ";没有数据。总页数为:" +  totalPage + "当前页数为:" + currentPage);
+                        //returnCode = 1;
                         return 1;
                     }
 
@@ -1005,35 +1076,26 @@ public class BytedanceReportServiceImpl implements IBytedanceReportService {
                             bytedanceReportMaterialDailyList.add(daily);
                         }
                     }
-
+                    //Long insertStartTime = System.currentTimeMillis();
                     bytedanceReportMaterialDailyMapper.replaceIntoBatch(bytedanceReportMaterialDailyList);
-
+                    //Long insertEndTime = System.currentTimeMillis();
+                    //log.info("头条获取素材报表插入数据结束,执行耗时:{}秒", (insertEndTime - insertStartTime) / 1000);
                     if(currentPage >= totalPage){
-                        log.info("accountId:" + accountId + "数据同步完成,开始时间:" + startDate + ",结束时间:"+ endDate);
+                        //log.info("accountId:" + accountId + "数据同步完成,开始时间:" + startDate + ",结束时间:"+ endDate);
                         return 1;
                     }else{
-                        bytedanceMaterialReportByPage(page + 1, pageSize, token, accountId, startDate, endDate);
+                        int pageCode = bytedanceMaterialReportByPage(page + 1, pageSize, token, accountId, startDate, endDate);
+                        return pageCode;
                     }
                 }else{
-                    log.error("服务器返回为空,json:"+jsonString);
+                    //returnCode = -1;
+                    log.error("服务器返回为空,json:" + JSONObject.toJSONString(data));
                     return -1;
                 }
-            }else{
-                log.error("头条素材报表请求有误:accountId:" + accountId + ",开始时间:" + startDate + "结束时间:" + endDate + "错误返回:" +response);
-                return 0;
-            }
         } catch (Exception e) {
             e.printStackTrace();
-            returnCode = -2;
-        } finally {
-            try {
-                if (response != null) {
-                    response.close();
-                }
-                client.close();
-            } catch (IOException e) {
-                e.printStackTrace();
-            }
+            log.error("头条报表其他错误,accountId:" + accountId + ",json:" + JSONObject.toJSONString(data));
+            returnCode = -3;
         }
         return returnCode;
     }
@@ -1044,19 +1106,3 @@ public class BytedanceReportServiceImpl implements IBytedanceReportService {
     }
 
 }
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-

+ 253 - 0
performance-appraisal/src/main/java/cn/com/ctop/accountvideoquarterinfo/controller/AccountVideoQuarterInfoController.java

@@ -0,0 +1,253 @@
+package cn.com.ctop.accountvideoquarterinfo.controller;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.net.URLDecoder;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.common.system.query.QueryGenerator;
+import org.jeecg.common.aspect.annotation.AutoLog;
+import org.jeecg.common.util.oConvertUtils;
+import cn.com.ctop.accountvideoquarterinfo.entity.AccountVideoQuarterInfo;
+import cn.com.ctop.accountvideoquarterinfo.service.IAccountVideoQuarterInfoService;
+
+import java.util.Date;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import lombok.extern.slf4j.Slf4j;
+
+import org.jeecgframework.poi.excel.ExcelImportUtil;
+import org.jeecgframework.poi.excel.def.NormalExcelConstants;
+import org.jeecgframework.poi.excel.entity.ExportParams;
+import org.jeecgframework.poi.excel.entity.ImportParams;
+import org.jeecgframework.poi.excel.view.JeecgEntityExcelView;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.multipart.MultipartHttpServletRequest;
+import org.springframework.web.servlet.ModelAndView;
+import com.alibaba.fastjson.JSON;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+
+/**
+ * 绩效明细_账户下所有视频的季度消耗数据
+ *
+ * @author jeecg-boot
+ * @version V1.0
+ * @date 2020-04-13
+ */
+@Slf4j
+@Api(tags = "绩效明细_账户下所有视频的季度消耗数据")
+@RestController
+@RequestMapping("/accountvideoquarterinfo/accountVideoQuarterInfo")
+public class AccountVideoQuarterInfoController {
+    @Autowired
+    private IAccountVideoQuarterInfoService accountVideoQuarterInfoService;
+
+    /**
+     * 分页列表查询
+     *
+     * @param accountVideoQuarterInfo
+     * @param pageNo
+     * @param pageSize
+     * @param req
+     * @return
+     */
+    @AutoLog(value = "绩效明细_账户下所有视频的季度消耗数据-分页列表查询")
+    @ApiOperation(value = "绩效明细_账户下所有视频的季度消耗数据-分页列表查询", notes = "绩效明细_账户下所有视频的季度消耗数据-分页列表查询")
+    @GetMapping(value = "/list")
+    public Result<IPage<AccountVideoQuarterInfo>> queryPageList(AccountVideoQuarterInfo accountVideoQuarterInfo,
+                                                                @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
+                                                                @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
+                                                                HttpServletRequest req) {
+        Result<IPage<AccountVideoQuarterInfo>> result = new Result<IPage<AccountVideoQuarterInfo>>();
+        QueryWrapper<AccountVideoQuarterInfo> queryWrapper = QueryGenerator.initQueryWrapper(accountVideoQuarterInfo, req.getParameterMap());
+        Page<AccountVideoQuarterInfo> page = new Page<AccountVideoQuarterInfo>(pageNo, pageSize);
+        IPage<AccountVideoQuarterInfo> pageList = accountVideoQuarterInfoService.page(page, queryWrapper);
+        result.setSuccess(true);
+        result.setResult(pageList);
+        return result;
+    }
+
+    /**
+     * 添加
+     *
+     * @param accountVideoQuarterInfo
+     * @return
+     */
+    @AutoLog(value = "绩效明细_账户下所有视频的季度消耗数据-添加")
+    @ApiOperation(value = "绩效明细_账户下所有视频的季度消耗数据-添加", notes = "绩效明细_账户下所有视频的季度消耗数据-添加")
+    @PostMapping(value = "/add")
+    public Result<AccountVideoQuarterInfo> add(@RequestBody AccountVideoQuarterInfo accountVideoQuarterInfo) {
+        Result<AccountVideoQuarterInfo> result = new Result<AccountVideoQuarterInfo>();
+        try {
+            accountVideoQuarterInfoService.save(accountVideoQuarterInfo);
+            result.success("添加成功!");
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+            result.error500("操作失败");
+        }
+        return result;
+    }
+
+    /**
+     * 编辑
+     *
+     * @param accountVideoQuarterInfo
+     * @return
+     */
+    @AutoLog(value = "绩效明细_账户下所有视频的季度消耗数据-编辑")
+    @ApiOperation(value = "绩效明细_账户下所有视频的季度消耗数据-编辑", notes = "绩效明细_账户下所有视频的季度消耗数据-编辑")
+    @PutMapping(value = "/edit")
+    public Result<AccountVideoQuarterInfo> edit(@RequestBody AccountVideoQuarterInfo accountVideoQuarterInfo) {
+        Result<AccountVideoQuarterInfo> result = new Result<AccountVideoQuarterInfo>();
+        AccountVideoQuarterInfo accountVideoQuarterInfoEntity = accountVideoQuarterInfoService.getById(accountVideoQuarterInfo.getId());
+        if (accountVideoQuarterInfoEntity == null) {
+            result.error500("未找到对应实体");
+        } else {
+            boolean ok = accountVideoQuarterInfoService.updateById(accountVideoQuarterInfo);
+            if (ok) {
+                result.success("修改成功!");
+            }
+        }
+
+        return result;
+    }
+
+    /**
+     * 通过id删除
+     *
+     * @param id
+     * @return
+     */
+    @AutoLog(value = "绩效明细_账户下所有视频的季度消耗数据-通过id删除")
+    @ApiOperation(value = "绩效明细_账户下所有视频的季度消耗数据-通过id删除", notes = "绩效明细_账户下所有视频的季度消耗数据-通过id删除")
+    @DeleteMapping(value = "/delete")
+    public Result<?> delete(@RequestParam(name = "id", required = true) String id) {
+        try {
+            accountVideoQuarterInfoService.removeById(id);
+        } catch (Exception e) {
+            log.error("删除失败", e.getMessage());
+            return Result.error("删除失败!");
+        }
+        return Result.ok("删除成功!");
+    }
+
+    /**
+     * 批量删除
+     *
+     * @param ids
+     * @return
+     */
+    @AutoLog(value = "绩效明细_账户下所有视频的季度消耗数据-批量删除")
+    @ApiOperation(value = "绩效明细_账户下所有视频的季度消耗数据-批量删除", notes = "绩效明细_账户下所有视频的季度消耗数据-批量删除")
+    @DeleteMapping(value = "/deleteBatch")
+    public Result<AccountVideoQuarterInfo> deleteBatch(@RequestParam(name = "ids", required = true) String ids) {
+        Result<AccountVideoQuarterInfo> result = new Result<AccountVideoQuarterInfo>();
+        if (ids == null || "".equals(ids.trim())) {
+            result.error500("参数不识别!");
+        } else {
+            this.accountVideoQuarterInfoService.removeByIds(Arrays.asList(ids.split(",")));
+            result.success("删除成功!");
+        }
+        return result;
+    }
+
+    /**
+     * 通过id查询
+     *
+     * @param id
+     * @return
+     */
+    @AutoLog(value = "绩效明细_账户下所有视频的季度消耗数据-通过id查询")
+    @ApiOperation(value = "绩效明细_账户下所有视频的季度消耗数据-通过id查询", notes = "绩效明细_账户下所有视频的季度消耗数据-通过id查询")
+    @GetMapping(value = "/queryById")
+    public Result<AccountVideoQuarterInfo> queryById(@RequestParam(name = "id", required = true) String id) {
+        Result<AccountVideoQuarterInfo> result = new Result<AccountVideoQuarterInfo>();
+        AccountVideoQuarterInfo accountVideoQuarterInfo = accountVideoQuarterInfoService.getById(id);
+        if (accountVideoQuarterInfo == null) {
+            result.error500("未找到对应实体");
+        } else {
+            result.setResult(accountVideoQuarterInfo);
+            result.setSuccess(true);
+        }
+        return result;
+    }
+
+    /**
+     * 导出excel
+     *
+     * @param request
+     * @param response
+     */
+    @RequestMapping(value = "/exportXls")
+    public ModelAndView exportXls(HttpServletRequest request, HttpServletResponse response) {
+        // Step.1 组装查询条件
+        QueryWrapper<AccountVideoQuarterInfo> queryWrapper = null;
+        try {
+            String paramsStr = request.getParameter("paramsStr");
+            if (oConvertUtils.isNotEmpty(paramsStr)) {
+                String deString = URLDecoder.decode(paramsStr, "UTF-8");
+                AccountVideoQuarterInfo accountVideoQuarterInfo = JSON.parseObject(deString, AccountVideoQuarterInfo.class);
+                queryWrapper = QueryGenerator.initQueryWrapper(accountVideoQuarterInfo, request.getParameterMap());
+            }
+        } catch (UnsupportedEncodingException e) {
+            e.printStackTrace();
+        }
+
+        //Step.2 AutoPoi 导出Excel
+        ModelAndView mv = new ModelAndView(new JeecgEntityExcelView());
+        List<AccountVideoQuarterInfo> pageList = accountVideoQuarterInfoService.list(queryWrapper);
+        //导出文件名称
+        mv.addObject(NormalExcelConstants.FILE_NAME, "绩效明细_账户下所有视频的季度消耗数据列表");
+        mv.addObject(NormalExcelConstants.CLASS, AccountVideoQuarterInfo.class);
+        mv.addObject(NormalExcelConstants.PARAMS, new ExportParams("绩效明细_账户下所有视频的季度消耗数据列表数据", "导出人:Jeecg", "导出信息"));
+        mv.addObject(NormalExcelConstants.DATA_LIST, pageList);
+        return mv;
+    }
+
+    /**
+     * 通过excel导入数据
+     *
+     * @param request
+     * @param response
+     * @return
+     */
+    @RequestMapping(value = "/importExcel", method = RequestMethod.POST)
+    public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {
+        MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
+        Map<String, MultipartFile> fileMap = multipartRequest.getFileMap();
+        for (Map.Entry<String, MultipartFile> entity : fileMap.entrySet()) {
+            MultipartFile file = entity.getValue();
+            ImportParams params = new ImportParams();
+            params.setTitleRows(2);
+            params.setHeadRows(1);
+            params.setNeedSave(true);
+            try {
+                List<AccountVideoQuarterInfo> listAccountVideoQuarterInfos = ExcelImportUtil.importExcel(file.getInputStream(), AccountVideoQuarterInfo.class, params);
+                accountVideoQuarterInfoService.saveBatch(listAccountVideoQuarterInfos);
+                return Result.ok("文件导入成功!数据行数:" + listAccountVideoQuarterInfos.size());
+            } catch (Exception e) {
+                log.error(e.getMessage(), e);
+                return Result.error("文件导入失败:" + e.getMessage());
+            } finally {
+                try {
+                    file.getInputStream().close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+        return Result.ok("文件导入失败!");
+    }
+
+}

+ 157 - 0
performance-appraisal/src/main/java/cn/com/ctop/accountvideoquarterinfo/entity/AccountVideoQuarterInfo.java

@@ -0,0 +1,157 @@
+package cn.com.ctop.accountvideoquarterinfo.entity;
+
+import java.io.Serializable;
+import java.util.Date;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.TableField;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.springframework.format.annotation.DateTimeFormat;
+import org.jeecgframework.poi.excel.annotation.Excel;
+
+/**
+ * 绩效明细_账户下所有视频的季度消耗数据
+ *
+ * @author jeecg-boot
+ * @version V1.0
+ * @date 2020-04-13
+ */
+@Data
+@TableName("ctop_performance_account_video_quarter_info")
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value = "ctop_performance_account_video_quarter_info对象", description = "绩效明细_账户下所有视频的季度消耗数据")
+public class AccountVideoQuarterInfo {
+
+    /**
+     * id
+     */
+    @TableId(type = IdType.AUTO)
+    @ApiModelProperty(value = "id")
+    private Integer id;
+    /**
+     * accountId
+     */
+    @Excel(name = "accountId", width = 15)
+    @ApiModelProperty(value = "accountId")
+    private Long accountId;
+    /**
+     * projectId
+     */
+    @Excel(name = "projectId", width = 15)
+    @ApiModelProperty(value = "projectId")
+    private Long projectId;
+    /**
+     * projectName
+     */
+    @Excel(name = "projectName", width = 15)
+    @ApiModelProperty(value = "projectName")
+    private String projectName;
+    /**
+     * signature
+     */
+    @Excel(name = "signature", width = 15)
+    @ApiModelProperty(value = "signature")
+    private String signature;
+    /**
+     * designResponsibleName
+     */
+    @Excel(name = "designResponsibleName", width = 15)
+    @ApiModelProperty(value = "designResponsibleName")
+    private String designResponsibleName;
+    /**
+     * designResponsibleId
+     */
+    @Excel(name = "designResponsibleId", width = 15)
+    @ApiModelProperty(value = "designResponsibleId")
+    private String designResponsibleId;
+    /**
+     * planId
+     */
+    @Excel(name = "planId", width = 15)
+    @ApiModelProperty(value = "planId")
+    private String planId;
+    /**
+     * planName
+     */
+    @Excel(name = "planName", width = 15)
+    @ApiModelProperty(value = "planName")
+    private String planName;
+    /**
+     * clipId
+     */
+    @Excel(name = "clipId", width = 15)
+    @ApiModelProperty(value = "clipId")
+    private String clipId;
+    /**
+     * clipName
+     */
+    @Excel(name = "clipName", width = 15)
+    @ApiModelProperty(value = "clipName")
+    private String clipName;
+    /**
+     * shotId
+     */
+    @Excel(name = "shotId", width = 15)
+    @ApiModelProperty(value = "shotId")
+    private String shotId;
+    /**
+     * shotName
+     */
+    @Excel(name = "shotName", width = 15)
+    @ApiModelProperty(value = "shotName")
+    private String shotName;
+    /**
+     * planeId
+     */
+    @Excel(name = "planeId", width = 15)
+    @ApiModelProperty(value = "planeId")
+    private String planeId;
+    /**
+     * planeName
+     */
+    @Excel(name = "planeName", width = 15)
+    @ApiModelProperty(value = "planeName")
+    private String planeName;
+    /**
+     * videoCost
+     */
+    @Excel(name = "videoCost", width = 15)
+    @ApiModelProperty(value = "videoCost")
+    private java.math.BigDecimal videoCost;
+    /**
+     * appType
+     */
+    @Excel(name = "appType", width = 15)
+    @ApiModelProperty(value = "appType")
+    private Integer appType;
+    /**
+     * year
+     */
+    @Excel(name = "year", width = 15)
+    @ApiModelProperty(value = "year")
+    private Integer year;
+    /**
+     * quarter
+     */
+    @Excel(name = "quarter", width = 15)
+    @ApiModelProperty(value = "quarter")
+    private Integer quarter;
+    /**
+     * createTime
+     */
+    @ApiModelProperty(value = "createTime")
+    private Date createTime;
+    /**
+     * updateTime
+     */
+    @ApiModelProperty(value = "updateTime")
+    private Date updateTime;
+}

+ 18 - 0
performance-appraisal/src/main/java/cn/com/ctop/accountvideoquarterinfo/mapper/AccountVideoQuarterInfoMapper.java

@@ -0,0 +1,18 @@
+package cn.com.ctop.accountvideoquarterinfo.mapper;
+
+import java.util.List;
+
+import org.apache.ibatis.annotations.Param;
+import cn.com.ctop.accountvideoquarterinfo.entity.AccountVideoQuarterInfo;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * 绩效明细_账户下所有视频的季度消耗数据
+ *
+ * @author: jeecg-boot
+ * @date: 2020-04-13
+ * @cersion: V1.0
+ */
+public interface AccountVideoQuarterInfoMapper extends BaseMapper<AccountVideoQuarterInfo> {
+
+}

+ 5 - 0
performance-appraisal/src/main/java/cn/com/ctop/accountvideoquarterinfo/mapper/xml/AccountVideoQuarterInfoMapper.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.accountvideoquarterinfo.mapper.AccountVideoQuarterInfoMapper">
+
+</mapper>

+ 15 - 0
performance-appraisal/src/main/java/cn/com/ctop/accountvideoquarterinfo/service/IAccountVideoQuarterInfoService.java

@@ -0,0 +1,15 @@
+package cn.com.ctop.accountvideoquarterinfo.service;
+
+import cn.com.ctop.accountvideoquarterinfo.entity.AccountVideoQuarterInfo;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * 绩效明细_账户下所有视频的季度消耗数据
+ *
+ * @author jeecg-boot
+ * @version V1.0
+ * @date 2020-04-13
+ */
+public interface IAccountVideoQuarterInfoService extends IService<AccountVideoQuarterInfo> {
+
+}

+ 20 - 0
performance-appraisal/src/main/java/cn/com/ctop/accountvideoquarterinfo/service/impl/AccountVideoQuarterInfoServiceImpl.java

@@ -0,0 +1,20 @@
+package cn.com.ctop.accountvideoquarterinfo.service.impl;
+
+import cn.com.ctop.accountvideoquarterinfo.entity.AccountVideoQuarterInfo;
+import cn.com.ctop.accountvideoquarterinfo.mapper.AccountVideoQuarterInfoMapper;
+import cn.com.ctop.accountvideoquarterinfo.service.IAccountVideoQuarterInfoService;
+import org.springframework.stereotype.Service;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+
+/**
+ * 绩效明细_账户下所有视频的季度消耗数据
+ *
+ * @author jeecg-boot
+ * @version V1.0
+ * @date 2020-04-13
+ */
+@Service
+public class AccountVideoQuarterInfoServiceImpl extends ServiceImpl<AccountVideoQuarterInfoMapper, AccountVideoQuarterInfo> implements IAccountVideoQuarterInfoService {
+
+}

+ 267 - 0
performance-appraisal/src/main/java/cn/com/ctop/huananvideoreport/controller/HuananVideoReportController.java

@@ -0,0 +1,267 @@
+package cn.com.ctop.huananvideoreport.controller;
+
+import java.text.ParseException;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.net.URLDecoder;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import cn.com.ctop.userefficientvideomap.entity.PerformanceTimeDTO;
+import cn.com.ctop.userefficientvideomap.entity.UserDto2;
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.common.system.query.QueryGenerator;
+import org.jeecg.common.aspect.annotation.AutoLog;
+import org.jeecg.common.util.oConvertUtils;
+import cn.com.ctop.huananvideoreport.entity.HuananVideoReport;
+import cn.com.ctop.huananvideoreport.service.IHuananVideoReportService;
+
+import java.util.Date;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import lombok.extern.slf4j.Slf4j;
+
+import org.jeecgframework.poi.excel.ExcelImportUtil;
+import org.jeecgframework.poi.excel.def.NormalExcelConstants;
+import org.jeecgframework.poi.excel.entity.ExportParams;
+import org.jeecgframework.poi.excel.entity.ImportParams;
+import org.jeecgframework.poi.excel.view.JeecgEntityExcelView;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.multipart.MultipartHttpServletRequest;
+import org.springframework.web.servlet.ModelAndView;
+import com.alibaba.fastjson.JSON;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+
+/**
+ * 华南视频报表类
+ *
+ * @author jeecg-boot
+ * @version V1.0
+ * @date 2020-04-28
+ */
+@Slf4j
+@Api(tags = "华南视频报表类")
+@RestController
+@RequestMapping("/huananvideoreport/huananVideoReport")
+public class HuananVideoReportController {
+    @Autowired
+    private IHuananVideoReportService huananVideoReportService;
+
+    /**
+     * 分页列表查询
+     *
+     * @param huananVideoReport
+     * @param pageNo
+     * @param pageSize
+     * @param req
+     * @return
+     */
+    @AutoLog(value = "华南视频报表类-分页列表查询")
+    @ApiOperation(value = "华南视频报表类-分页列表查询", notes = "华南视频报表类-分页列表查询")
+    @GetMapping(value = "/list")
+    public Result<IPage<HuananVideoReport>> queryPageList(HuananVideoReport huananVideoReport,
+                                                          @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
+                                                          @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
+                                                          HttpServletRequest req) {
+        Result<IPage<HuananVideoReport>> result = new Result<IPage<HuananVideoReport>>();
+        QueryWrapper<HuananVideoReport> queryWrapper = QueryGenerator.initQueryWrapper(huananVideoReport, req.getParameterMap());
+        Page<HuananVideoReport> page = new Page<HuananVideoReport>(pageNo, pageSize);
+        IPage<HuananVideoReport> pageList = huananVideoReportService.page(page, queryWrapper);
+        result.setSuccess(true);
+        result.setResult(pageList);
+        return result;
+    }
+
+    /**
+     * 添加
+     *
+     * @param huananVideoReport
+     * @return
+     */
+    @AutoLog(value = "华南视频报表类-添加")
+    @ApiOperation(value = "华南视频报表类-添加", notes = "华南视频报表类-添加")
+    @PostMapping(value = "/add")
+    public Result<HuananVideoReport> add(@RequestBody HuananVideoReport huananVideoReport) {
+        Result<HuananVideoReport> result = new Result<HuananVideoReport>();
+        try {
+            huananVideoReportService.save(huananVideoReport);
+            result.success("添加成功!");
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+            result.error500("操作失败");
+        }
+        return result;
+    }
+
+    /**
+     * 编辑
+     *
+     * @param huananVideoReport
+     * @return
+     */
+    @AutoLog(value = "华南视频报表类-编辑")
+    @ApiOperation(value = "华南视频报表类-编辑", notes = "华南视频报表类-编辑")
+    @PutMapping(value = "/edit")
+    public Result<HuananVideoReport> edit(@RequestBody HuananVideoReport huananVideoReport) {
+        Result<HuananVideoReport> result = new Result<HuananVideoReport>();
+        HuananVideoReport huananVideoReportEntity = huananVideoReportService.getById(huananVideoReport.getId());
+        if (huananVideoReportEntity == null) {
+            result.error500("未找到对应实体");
+        } else {
+            boolean ok = huananVideoReportService.updateById(huananVideoReport);
+            if (ok) {
+                result.success("修改成功!");
+            }
+        }
+
+        return result;
+    }
+
+    /**
+     * 通过id删除
+     *
+     * @param id
+     * @return
+     */
+    @AutoLog(value = "华南视频报表类-通过id删除")
+    @ApiOperation(value = "华南视频报表类-通过id删除", notes = "华南视频报表类-通过id删除")
+    @DeleteMapping(value = "/delete")
+    public Result<?> delete(@RequestParam(name = "id", required = true) String id) {
+        try {
+            huananVideoReportService.removeById(id);
+        } catch (Exception e) {
+            log.error("删除失败", e.getMessage());
+            return Result.error("删除失败!");
+        }
+        return Result.ok("删除成功!");
+    }
+
+    /**
+     * 批量删除
+     *
+     * @param ids
+     * @return
+     */
+    @AutoLog(value = "华南视频报表类-批量删除")
+    @ApiOperation(value = "华南视频报表类-批量删除", notes = "华南视频报表类-批量删除")
+    @DeleteMapping(value = "/deleteBatch")
+    public Result<HuananVideoReport> deleteBatch(@RequestParam(name = "ids", required = true) String ids) {
+        Result<HuananVideoReport> result = new Result<HuananVideoReport>();
+        if (ids == null || "".equals(ids.trim())) {
+            result.error500("参数不识别!");
+        } else {
+            this.huananVideoReportService.removeByIds(Arrays.asList(ids.split(",")));
+            result.success("删除成功!");
+        }
+        return result;
+    }
+
+    /**
+     * 通过id查询
+     *
+     * @param id
+     * @return
+     */
+    @AutoLog(value = "华南视频报表类-通过id查询")
+    @ApiOperation(value = "华南视频报表类-通过id查询", notes = "华南视频报表类-通过id查询")
+    @GetMapping(value = "/queryById")
+    public Result<HuananVideoReport> queryById(@RequestParam(name = "id", required = true) String id) {
+        Result<HuananVideoReport> result = new Result<HuananVideoReport>();
+        HuananVideoReport huananVideoReport = huananVideoReportService.getById(id);
+        if (huananVideoReport == null) {
+            result.error500("未找到对应实体");
+        } else {
+            result.setResult(huananVideoReport);
+            result.setSuccess(true);
+        }
+        return result;
+    }
+
+    /**
+     * 导出excel
+     *
+     * @param request
+     * @param response
+     */
+    @RequestMapping(value = "/exportXls")
+    public ModelAndView exportXls(HttpServletRequest request, HttpServletResponse response) {
+        // Step.1 组装查询条件
+        QueryWrapper<HuananVideoReport> queryWrapper = null;
+        try {
+            String paramsStr = request.getParameter("paramsStr");
+            if (oConvertUtils.isNotEmpty(paramsStr)) {
+                String deString = URLDecoder.decode(paramsStr, "UTF-8");
+                HuananVideoReport huananVideoReport = JSON.parseObject(deString, HuananVideoReport.class);
+                queryWrapper = QueryGenerator.initQueryWrapper(huananVideoReport, request.getParameterMap());
+            }
+        } catch (UnsupportedEncodingException e) {
+            e.printStackTrace();
+        }
+
+        //Step.2 AutoPoi 导出Excel
+        ModelAndView mv = new ModelAndView(new JeecgEntityExcelView());
+        List<HuananVideoReport> pageList = huananVideoReportService.list(queryWrapper);
+        //导出文件名称
+        mv.addObject(NormalExcelConstants.FILE_NAME, "华南视频报表类列表");
+        mv.addObject(NormalExcelConstants.CLASS, HuananVideoReport.class);
+        mv.addObject(NormalExcelConstants.PARAMS, new ExportParams("华南视频报表类列表数据", "导出人:Jeecg", "导出信息"));
+        mv.addObject(NormalExcelConstants.DATA_LIST, pageList);
+        return mv;
+    }
+
+    /**
+     * 通过excel导入数据
+     *
+     * @param request
+     * @param response
+     * @return
+     */
+    @RequestMapping(value = "/importExcel", method = RequestMethod.POST)
+    public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {
+        MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
+        Map<String, MultipartFile> fileMap = multipartRequest.getFileMap();
+        for (Map.Entry<String, MultipartFile> entity : fileMap.entrySet()) {
+            MultipartFile file = entity.getValue();
+            ImportParams params = new ImportParams();
+            params.setTitleRows(2);
+            params.setHeadRows(1);
+            params.setNeedSave(true);
+            try {
+                List<HuananVideoReport> listHuananVideoReports = ExcelImportUtil.importExcel(file.getInputStream(), HuananVideoReport.class, params);
+                huananVideoReportService.saveBatch(listHuananVideoReports);
+                return Result.ok("文件导入成功!数据行数:" + listHuananVideoReports.size());
+            } catch (Exception e) {
+                log.error(e.getMessage(), e);
+                return Result.error("文件导入失败:" + e.getMessage());
+            } finally {
+                try {
+                    file.getInputStream().close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+        return Result.ok("文件导入失败!");
+    }
+
+
+    @AutoLog(value = "头条优化季度绩效报表")
+    @ApiOperation(value = "头条优化季度绩效报表", notes = "头条优化季度绩效报表")
+    @PostMapping(value = "/getHuananMaterialInfo")
+    public Result getHuananMaterialInfo(HttpServletRequest req) throws ParseException {
+        Result<List<UserDto2>> result = new Result<List<UserDto2>>();
+        huananVideoReportService.getHuananMaterialInfo("2020-05-01", "2020-05-07");
+        result.setSuccess(true);
+        return result;
+    }
+
+}

+ 27 - 0
performance-appraisal/src/main/java/cn/com/ctop/huananvideoreport/dto/HuananVideoReportDTO.java

@@ -0,0 +1,27 @@
+package cn.com.ctop.huananvideoreport.dto;
+
+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-04-28
+ */
+@Data
+public class HuananVideoReportDTO {
+
+    private String accountId;
+    private String authName;
+}

+ 125 - 0
performance-appraisal/src/main/java/cn/com/ctop/huananvideoreport/entity/HuananVideoReport.java

@@ -0,0 +1,125 @@
+package cn.com.ctop.huananvideoreport.entity;
+
+import java.io.Serializable;
+import java.util.Date;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.TableField;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.springframework.format.annotation.DateTimeFormat;
+import org.jeecgframework.poi.excel.annotation.Excel;
+
+/**
+ * 华南视频报表类
+ *
+ * @author jeecg-boot
+ * @version V1.0
+ * @date 2020-04-28
+ */
+@Data
+@TableName("bytedance_huanan_video_report")
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value = "bytedance_huanan_video_report对象", description = "华南视频报表类")
+public class HuananVideoReport {
+
+    /**
+     * id
+     */
+    @TableId(type = IdType.AUTO)
+    @ApiModelProperty(value = "id")
+    private Integer id;
+    /**
+     * accountId
+     */
+    @Excel(name = "accountId", width = 15)
+    @ApiModelProperty(value = "accountId")
+    private String accountId;
+    /**
+     * authName
+     */
+    @Excel(name = "authName", width = 15)
+    @ApiModelProperty(value = "authName")
+    private String authName;
+    /**
+     * projectId
+     */
+    @Excel(name = "projectId", width = 15)
+    @ApiModelProperty(value = "projectId")
+    private Integer projectId;
+    /**
+     * projectName
+     */
+    @Excel(name = "projectName", width = 15)
+    @ApiModelProperty(value = "projectName")
+    private String projectName;
+    /**
+     * advertiserId
+     */
+    @Excel(name = "advertiserId", width = 15)
+    @ApiModelProperty(value = "advertiserId")
+    private String advertiserId;
+    /**
+     * advertiserName
+     */
+    @Excel(name = "advertiserName", width = 15)
+    @ApiModelProperty(value = "advertiserName")
+    private String advertiserName;
+    /**
+     * cost
+     */
+    @Excel(name = "cost", width = 15)
+    @ApiModelProperty(value = "cost")
+    private java.math.BigDecimal cost;
+    /**
+     * signature
+     */
+    @Excel(name = "signature", width = 15)
+    @ApiModelProperty(value = "signature")
+    private String signature;
+    /**
+     * videoUrl
+     */
+    @Excel(name = "videoUrl", width = 15)
+    @ApiModelProperty(value = "videoUrl")
+    private String videoUrl;
+    /**
+     * 环比
+     */
+    @Excel(name = "环比", width = 15)
+    @ApiModelProperty(value = "环比")
+    private java.math.BigDecimal huanbi;
+    /**
+     * 素材名称
+     */
+    @Excel(name = "素材名称", width = 15)
+    @ApiModelProperty(value = "素材名称")
+    private String materialName;
+    /**
+     * 1头条2快手
+     */
+    @Excel(name = "1头条2快手", width = 15)
+    @ApiModelProperty(value = "1头条2快手")
+    private Integer appType;
+    /**
+     * createTime
+     */
+    @ApiModelProperty(value = "createTime")
+    private Date createTime;
+    /**
+     * updateTime
+     */
+    @ApiModelProperty(value = "updateTime")
+    private Date updateTime;
+
+    private Long materialId;
+
+    private String statDatetime;
+}

+ 24 - 0
performance-appraisal/src/main/java/cn/com/ctop/huananvideoreport/mapper/HuananVideoReportMapper.java

@@ -0,0 +1,24 @@
+package cn.com.ctop.huananvideoreport.mapper;
+
+import java.util.List;
+
+import cn.com.ctop.huananvideoreport.dto.HuananVideoReportDTO;
+import org.apache.ibatis.annotations.Param;
+import cn.com.ctop.huananvideoreport.entity.HuananVideoReport;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * 华南视频报表类
+ *
+ * @author: jeecg-boot
+ * @date: 2020-04-28
+ * @cersion: V1.0
+ */
+public interface HuananVideoReportMapper extends BaseMapper<HuananVideoReport> {
+
+    List<HuananVideoReport> getHuananMaterialInfo(@Param("startDate") String startDate, @Param("endDate") String endDate);
+
+    HuananVideoReport selectByDateAndId(@Param("materialId") Long materialId, @Param("statDate") String statDate);
+
+    HuananVideoReportDTO getAccountConcatInfo(@Param("materialId") Long materialId);
+}

+ 86 - 0
performance-appraisal/src/main/java/cn/com/ctop/huananvideoreport/mapper/xml/HuananVideoReportMapper.xml

@@ -0,0 +1,86 @@
+<?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.huananvideoreport.mapper.HuananVideoReportMapper">
+
+
+    <select id="getHuananMaterialInfo" resultType="cn.com.ctop.huananvideoreport.entity.HuananVideoReport">
+        select
+        a.material_id as materialId,
+--         a.account_id as accountId,
+--         b.auth_name as authName,
+        b.project_id as projectId,
+        b.project_name as projectName,
+        b.advertiser_id as advertiserId,
+        b.advertiser_name as advertiserName,
+        a.stat_datetime as statDatetime,
+        sum(a.cost) as cost,
+        d.signature as signature,
+        d.video_url as video_url,
+        e.url as url,
+        e.material_name as materialName,
+        1 as appType
+        from ctop_bytedance_report_material_daily a
+        left join ctop_user_allocation 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
+        where c.company_id = '6608ed13c0dd42de93c790dbdf124234'
+        and a.image_mode in ('CREATIVE_IMAGE_MODE_VIDEO',
+        '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}
+        group by `statDatetime`,`materialId`
+        order by `statDatetime`,`projectId`,`materialId`
+    </select>
+
+    <select id="selectByDateAndId" resultType="cn.com.ctop.huananvideoreport.entity.HuananVideoReport">
+        select
+        *
+        from
+        bytedance_huanan_video_report
+        where material_id = #{materialId}
+        and stat_datetime = #{statDate}
+
+    </select>
+
+    <select id="getAccountConcatInfo" resultType="cn.com.ctop.huananvideoreport.dto.HuananVideoReportDTO">
+        select
+        group_concat(distinct(b.account_id)) as accountId,
+        group_concat(distinct(b.auth_name)) as authName
+        from
+        ctop_bytedance_report_material_daily a
+        left join ctop_user_allocation b on a.account_id = b.account_id
+        where a.material_id = #{materialId}
+    </select>
+
+    <select id="getHuananVideoInfo" resultType="cn.com.ctop.huananvideoreport.entity.HuananVideoReport">
+        select
+        a.material_id as materialId,
+--         a.account_id as accountId,
+--         b.auth_name as authName,
+        b.project_id as projectId,
+        b.project_name as projectName,
+        b.advertiser_id as advertiserId,
+        b.advertiser_name as advertiserName,
+        a.stat_datetime as statDatetime,
+        sum(a.cost) as cost,
+        d.signature as signature,
+        d.video_url as video_url,
+        e.url as url,
+        e.material_name as materialName,
+        1 as appType
+        from ctop_bytedance_report_material_daily a
+        left join ctop_user_allocation 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
+        where c.company_id = '6608ed13c0dd42de93c790dbdf124234'
+        and a.image_mode in ('CREATIVE_IMAGE_MODE_VIDEO',
+        '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}
+        group by `statDatetime`,`signature`
+        order by `statDatetime`,`projectId`,`materialId`
+    </select>
+
+</mapper>

+ 17 - 0
performance-appraisal/src/main/java/cn/com/ctop/huananvideoreport/service/IHuananVideoReportService.java

@@ -0,0 +1,17 @@
+package cn.com.ctop.huananvideoreport.service;
+
+import cn.com.ctop.huananvideoreport.entity.HuananVideoReport;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+import java.text.ParseException;
+
+/**
+ * 华南视频报表类
+ *
+ * @author jeecg-boot
+ * @version V1.0
+ * @date 2020-04-28
+ */
+public interface IHuananVideoReportService extends IService<HuananVideoReport> {
+    void getHuananMaterialInfo(String startDate, String endDate) throws ParseException;
+}

+ 65 - 0
performance-appraisal/src/main/java/cn/com/ctop/huananvideoreport/service/impl/HuananVideoReportServiceImpl.java

@@ -0,0 +1,65 @@
+package cn.com.ctop.huananvideoreport.service.impl;
+
+import cn.com.ctop.common.module.entity.MaterialInfo;
+import cn.com.ctop.huananvideoreport.dto.HuananVideoReportDTO;
+import cn.com.ctop.huananvideoreport.entity.HuananVideoReport;
+import cn.com.ctop.huananvideoreport.mapper.HuananVideoReportMapper;
+import cn.com.ctop.huananvideoreport.service.IHuananVideoReportService;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import org.assertj.core.util.DateUtil;
+import org.jeecg.common.util.DateUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+
+import java.math.BigDecimal;
+import java.text.ParseException;
+import java.util.List;
+
+/**
+ * 华南视频报表类
+ *
+ * @author jeecg-boot
+ * @version V1.0
+ * @date 2020-04-28
+ */
+@Service
+public class HuananVideoReportServiceImpl extends ServiceImpl<HuananVideoReportMapper, HuananVideoReport> implements IHuananVideoReportService {
+
+    @Autowired
+    private HuananVideoReportMapper huananVideoReportMapper;
+
+    public void getHuananMaterialInfo(String startDate, String endDate) throws ParseException {
+
+        List<HuananVideoReport> mList = huananVideoReportMapper.getHuananMaterialInfo(startDate, endDate);
+
+        for (HuananVideoReport m : mList) {
+            huananVideoReportMapper.insert(m);
+        }
+
+
+        QueryWrapper<HuananVideoReport> queryWrapper = new QueryWrapper<>();
+        List<HuananVideoReport> mList2 = huananVideoReportMapper.selectList(queryWrapper);
+
+        for (HuananVideoReport m : mList2) {
+            String statDate = DateUtils.addDay(m.getStatDatetime(), -1);
+            HuananVideoReport mb = huananVideoReportMapper.selectByDateAndId(m.getMaterialId(), statDate);
+
+            BigDecimal huanbi = BigDecimal.ZERO;
+            if (mb != null && mb.getCost().compareTo(BigDecimal.ZERO) > 0) {
+                huanbi = m.getCost().subtract(mb.getCost()).divide(mb.getCost(), 7, BigDecimal.ROUND_HALF_UP);
+            }
+            HuananVideoReportDTO accountConcatInfo = huananVideoReportMapper.getAccountConcatInfo(m.getMaterialId());
+
+            m.setAccountId(accountConcatInfo.getAccountId());
+            m.setAuthName(accountConcatInfo.getAuthName());
+            m.setHuanbi(huanbi);
+            huananVideoReportMapper.updateById(m);
+        }
+
+
+    }
+
+
+}

+ 253 - 0
performance-appraisal/src/main/java/cn/com/ctop/performanceaccount/controller/PerformanceAccountController.java

@@ -0,0 +1,253 @@
+package cn.com.ctop.performanceaccount.controller;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.net.URLDecoder;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.common.system.query.QueryGenerator;
+import org.jeecg.common.aspect.annotation.AutoLog;
+import org.jeecg.common.util.oConvertUtils;
+import cn.com.ctop.performanceaccount.entity.PerformanceAccount;
+import cn.com.ctop.performanceaccount.service.IPerformanceAccountService;
+
+import java.util.Date;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import lombok.extern.slf4j.Slf4j;
+
+import org.jeecgframework.poi.excel.ExcelImportUtil;
+import org.jeecgframework.poi.excel.def.NormalExcelConstants;
+import org.jeecgframework.poi.excel.entity.ExportParams;
+import org.jeecgframework.poi.excel.entity.ImportParams;
+import org.jeecgframework.poi.excel.view.JeecgEntityExcelView;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.multipart.MultipartHttpServletRequest;
+import org.springframework.web.servlet.ModelAndView;
+import com.alibaba.fastjson.JSON;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+
+/**
+ * 运营明细表
+ *
+ * @author jeecg-boot
+ * @version V1.0
+ * @date 2020-04-05
+ */
+@Slf4j
+@Api(tags = "运营明细表")
+@RestController
+@RequestMapping("/performanceaccount/performanceAccount")
+public class PerformanceAccountController {
+    @Autowired
+    private IPerformanceAccountService performanceAccountService;
+
+    /**
+     * 分页列表查询
+     *
+     * @param performanceAccount
+     * @param pageNo
+     * @param pageSize
+     * @param req
+     * @return
+     */
+    @AutoLog(value = "运营明细表-分页列表查询")
+    @ApiOperation(value = "运营明细表-分页列表查询", notes = "运营明细表-分页列表查询")
+    @GetMapping(value = "/list")
+    public Result<IPage<PerformanceAccount>> queryPageList(PerformanceAccount performanceAccount,
+                                                           @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
+                                                           @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
+                                                           HttpServletRequest req) {
+        Result<IPage<PerformanceAccount>> result = new Result<IPage<PerformanceAccount>>();
+        QueryWrapper<PerformanceAccount> queryWrapper = QueryGenerator.initQueryWrapper(performanceAccount, req.getParameterMap());
+        Page<PerformanceAccount> page = new Page<PerformanceAccount>(pageNo, pageSize);
+        IPage<PerformanceAccount> pageList = performanceAccountService.page(page, queryWrapper);
+        result.setSuccess(true);
+        result.setResult(pageList);
+        return result;
+    }
+
+    /**
+     * 添加
+     *
+     * @param performanceAccount
+     * @return
+     */
+    @AutoLog(value = "运营明细表-添加")
+    @ApiOperation(value = "运营明细表-添加", notes = "运营明细表-添加")
+    @PostMapping(value = "/add")
+    public Result<PerformanceAccount> add(@RequestBody PerformanceAccount performanceAccount) {
+        Result<PerformanceAccount> result = new Result<PerformanceAccount>();
+        try {
+            performanceAccountService.save(performanceAccount);
+            result.success("添加成功!");
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+            result.error500("操作失败");
+        }
+        return result;
+    }
+
+    /**
+     * 编辑
+     *
+     * @param performanceAccount
+     * @return
+     */
+    @AutoLog(value = "运营明细表-编辑")
+    @ApiOperation(value = "运营明细表-编辑", notes = "运营明细表-编辑")
+    @PutMapping(value = "/edit")
+    public Result<PerformanceAccount> edit(@RequestBody PerformanceAccount performanceAccount) {
+        Result<PerformanceAccount> result = new Result<PerformanceAccount>();
+        PerformanceAccount performanceAccountEntity = performanceAccountService.getById(performanceAccount.getId());
+        if (performanceAccountEntity == null) {
+            result.error500("未找到对应实体");
+        } else {
+            boolean ok = performanceAccountService.updateById(performanceAccount);
+            if (ok) {
+                result.success("修改成功!");
+            }
+        }
+
+        return result;
+    }
+
+    /**
+     * 通过id删除
+     *
+     * @param id
+     * @return
+     */
+    @AutoLog(value = "运营明细表-通过id删除")
+    @ApiOperation(value = "运营明细表-通过id删除", notes = "运营明细表-通过id删除")
+    @DeleteMapping(value = "/delete")
+    public Result<?> delete(@RequestParam(name = "id", required = true) String id) {
+        try {
+            performanceAccountService.removeById(id);
+        } catch (Exception e) {
+            log.error("删除失败", e.getMessage());
+            return Result.error("删除失败!");
+        }
+        return Result.ok("删除成功!");
+    }
+
+    /**
+     * 批量删除
+     *
+     * @param ids
+     * @return
+     */
+    @AutoLog(value = "运营明细表-批量删除")
+    @ApiOperation(value = "运营明细表-批量删除", notes = "运营明细表-批量删除")
+    @DeleteMapping(value = "/deleteBatch")
+    public Result<PerformanceAccount> deleteBatch(@RequestParam(name = "ids", required = true) String ids) {
+        Result<PerformanceAccount> result = new Result<PerformanceAccount>();
+        if (ids == null || "".equals(ids.trim())) {
+            result.error500("参数不识别!");
+        } else {
+            this.performanceAccountService.removeByIds(Arrays.asList(ids.split(",")));
+            result.success("删除成功!");
+        }
+        return result;
+    }
+
+    /**
+     * 通过id查询
+     *
+     * @param id
+     * @return
+     */
+    @AutoLog(value = "运营明细表-通过id查询")
+    @ApiOperation(value = "运营明细表-通过id查询", notes = "运营明细表-通过id查询")
+    @GetMapping(value = "/queryById")
+    public Result<PerformanceAccount> queryById(@RequestParam(name = "id", required = true) String id) {
+        Result<PerformanceAccount> result = new Result<PerformanceAccount>();
+        PerformanceAccount performanceAccount = performanceAccountService.getById(id);
+        if (performanceAccount == null) {
+            result.error500("未找到对应实体");
+        } else {
+            result.setResult(performanceAccount);
+            result.setSuccess(true);
+        }
+        return result;
+    }
+
+    /**
+     * 导出excel
+     *
+     * @param request
+     * @param response
+     */
+    @RequestMapping(value = "/exportXls")
+    public ModelAndView exportXls(HttpServletRequest request, HttpServletResponse response) {
+        // Step.1 组装查询条件
+        QueryWrapper<PerformanceAccount> queryWrapper = null;
+        try {
+            String paramsStr = request.getParameter("paramsStr");
+            if (oConvertUtils.isNotEmpty(paramsStr)) {
+                String deString = URLDecoder.decode(paramsStr, "UTF-8");
+                PerformanceAccount performanceAccount = JSON.parseObject(deString, PerformanceAccount.class);
+                queryWrapper = QueryGenerator.initQueryWrapper(performanceAccount, request.getParameterMap());
+            }
+        } catch (UnsupportedEncodingException e) {
+            e.printStackTrace();
+        }
+
+        //Step.2 AutoPoi 导出Excel
+        ModelAndView mv = new ModelAndView(new JeecgEntityExcelView());
+        List<PerformanceAccount> pageList = performanceAccountService.list(queryWrapper);
+        //导出文件名称
+        mv.addObject(NormalExcelConstants.FILE_NAME, "运营明细表列表");
+        mv.addObject(NormalExcelConstants.CLASS, PerformanceAccount.class);
+        mv.addObject(NormalExcelConstants.PARAMS, new ExportParams("运营明细表列表数据", "导出人:Jeecg", "导出信息"));
+        mv.addObject(NormalExcelConstants.DATA_LIST, pageList);
+        return mv;
+    }
+
+    /**
+     * 通过excel导入数据
+     *
+     * @param request
+     * @param response
+     * @return
+     */
+    @RequestMapping(value = "/importExcel", method = RequestMethod.POST)
+    public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {
+        MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
+        Map<String, MultipartFile> fileMap = multipartRequest.getFileMap();
+        for (Map.Entry<String, MultipartFile> entity : fileMap.entrySet()) {
+            MultipartFile file = entity.getValue();
+            ImportParams params = new ImportParams();
+            params.setTitleRows(2);
+            params.setHeadRows(1);
+            params.setNeedSave(true);
+            try {
+                List<PerformanceAccount> listPerformanceAccounts = ExcelImportUtil.importExcel(file.getInputStream(), PerformanceAccount.class, params);
+                performanceAccountService.saveBatch(listPerformanceAccounts);
+                return Result.ok("文件导入成功!数据行数:" + listPerformanceAccounts.size());
+            } catch (Exception e) {
+                log.error(e.getMessage(), e);
+                return Result.error("文件导入失败:" + e.getMessage());
+            } finally {
+                try {
+                    file.getInputStream().close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+        return Result.ok("文件导入失败!");
+    }
+
+}

+ 114 - 0
performance-appraisal/src/main/java/cn/com/ctop/performanceaccount/entity/PerformanceAccount.java

@@ -0,0 +1,114 @@
+package cn.com.ctop.performanceaccount.entity;
+
+import java.io.Serializable;
+import java.util.Date;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.TableField;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.springframework.format.annotation.DateTimeFormat;
+import org.jeecgframework.poi.excel.annotation.Excel;
+
+/**
+ * 运营明细表
+ *
+ * @author jeecg-boot
+ * @version V1.0
+ * @date 2020-04-05
+ */
+@Data
+@TableName("ctop_performance_account")
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value = "ctop_performance_account对象", description = "运营明细表")
+public class PerformanceAccount {
+
+    /**
+     * id
+     */
+    @TableId(type = IdType.AUTO)
+    @ApiModelProperty(value = "id")
+    private Integer id;
+    /**
+     * 账户id
+     */
+    @Excel(name = "账户id", width = 15)
+    @ApiModelProperty(value = "账户id")
+    private Long accountId;
+    /**
+     * 账户期间消耗
+     */
+    @Excel(name = "账户期间消耗", width = 15)
+    @ApiModelProperty(value = "账户期间消耗")
+    private java.math.BigDecimal cost;
+    /**
+     * 年
+     */
+    @Excel(name = "年", width = 15)
+    @ApiModelProperty(value = "年")
+    private Integer year;
+    /**
+     * 1头条2快手
+     */
+    @Excel(name = "1头条2快手", width = 15)
+    @ApiModelProperty(value = "1头条2快手")
+    private Integer mediaType;
+    /**
+     * 季度
+     */
+    @Excel(name = "季度", width = 15)
+    @ApiModelProperty(value = "季度")
+    private Integer quarter;
+    /**
+     * 账户所属人
+     */
+    @Excel(name = "账户所属人", width = 15)
+    @ApiModelProperty(value = "账户所属人")
+    private String userId;
+    /**
+     * 账户消耗计算开始时间
+     */
+    @Excel(name = "账户消耗计算开始时间", width = 15, format = "yyyy-MM-dd")
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @ApiModelProperty(value = "账户消耗计算开始时间")
+    private String startDate;
+    /**
+     * 账户消耗计算结束时间
+     */
+    @Excel(name = "账户消耗计算结束时间", width = 15, format = "yyyy-MM-dd")
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @ApiModelProperty(value = "账户消耗计算结束时间")
+    private String endDate;
+    /**
+     * createTime
+     */
+    @ApiModelProperty(value = "createTime")
+    private Date createTime;
+    /**
+     * updateTime
+     */
+    @ApiModelProperty(value = "updateTime")
+    private Date updateTime;
+
+    @TableField(exist = false)
+    private String realname;
+
+    @TableField(exist = false)
+    private String authName;
+
+    @TableField(exist = false)
+    private String advertiserName;
+
+    @TableField(exist = false)
+    private String projectName;
+
+}

+ 18 - 0
performance-appraisal/src/main/java/cn/com/ctop/performanceaccount/mapper/PerformanceAccountMapper.java

@@ -0,0 +1,18 @@
+package cn.com.ctop.performanceaccount.mapper;
+
+import java.util.List;
+
+import org.apache.ibatis.annotations.Param;
+import cn.com.ctop.performanceaccount.entity.PerformanceAccount;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * 运营明细表
+ *
+ * @author: jeecg-boot
+ * @date: 2020-04-05
+ * @cersion: V1.0
+ */
+public interface PerformanceAccountMapper extends BaseMapper<PerformanceAccount> {
+
+}

+ 5 - 0
performance-appraisal/src/main/java/cn/com/ctop/performanceaccount/mapper/xml/PerformanceAccountMapper.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.performanceaccount.mapper.PerformanceAccountMapper">
+
+</mapper>

+ 15 - 0
performance-appraisal/src/main/java/cn/com/ctop/performanceaccount/service/IPerformanceAccountService.java

@@ -0,0 +1,15 @@
+package cn.com.ctop.performanceaccount.service;
+
+import cn.com.ctop.performanceaccount.entity.PerformanceAccount;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * 运营明细表
+ *
+ * @author jeecg-boot
+ * @version V1.0
+ * @date 2020-04-05
+ */
+public interface IPerformanceAccountService extends IService<PerformanceAccount> {
+
+}

+ 20 - 0
performance-appraisal/src/main/java/cn/com/ctop/performanceaccount/service/impl/PerformanceAccountServiceImpl.java

@@ -0,0 +1,20 @@
+package cn.com.ctop.performanceaccount.service.impl;
+
+import cn.com.ctop.performanceaccount.entity.PerformanceAccount;
+import cn.com.ctop.performanceaccount.mapper.PerformanceAccountMapper;
+import cn.com.ctop.performanceaccount.service.IPerformanceAccountService;
+import org.springframework.stereotype.Service;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+
+/**
+ * 运营明细表
+ *
+ * @author jeecg-boot
+ * @version V1.0
+ * @date 2020-04-05
+ */
+@Service
+public class PerformanceAccountServiceImpl extends ServiceImpl<PerformanceAccountMapper, PerformanceAccount> implements IPerformanceAccountService {
+
+}

+ 208 - 0
performance-appraisal/src/main/java/cn/com/ctop/performanceaccount/vue/PerformanceAccountList.vue

@@ -0,0 +1,208 @@
+<template>
+    <a-card :bordered="false">
+
+        <!-- 查询区域 -->
+        <div class="table-page-search-wrapper">
+            <a-form layout="inline">
+                <a-row :gutter="24">
+
+                    <a-col :md="6" :sm="8">
+                        <a-form-item label="账户id">
+                            <a-input placeholder="请输入账户id" v-model="queryParam.accountId"></a-input>
+                        </a-form-item>
+                    </a-col>
+                    <a-col :md="6" :sm="8">
+                        <a-form-item label="账户期间消耗">
+                            <a-input placeholder="请输入账户期间消耗" v-model="queryParam.cost"></a-input>
+                        </a-form-item>
+                    </a-col>
+                    <template v-if="toggleSearchStatus">
+                        <a-col :md="6" :sm="8">
+                            <a-form-item label="年">
+                                <a-input placeholder="请输入年" v-model="queryParam.year"></a-input>
+                            </a-form-item>
+                        </a-col>
+                        <a-col :md="6" :sm="8">
+                            <a-form-item label="1头条2快手">
+                                <a-input placeholder="请输入1头条2快手" v-model="queryParam.mediaType"></a-input>
+                            </a-form-item>
+                        </a-col>
+                        <a-col :md="6" :sm="8">
+                            <a-form-item label="季度">
+                                <a-input placeholder="请输入季度" v-model="queryParam.quarter"></a-input>
+                            </a-form-item>
+                        </a-col>
+                    </template>
+                    <a-col :md="6" :sm="8">
+            <span style="float: left;overflow: hidden;" class="table-page-search-submitButtons">
+              <a-button type="primary" @click="searchQuery" icon="search">查询</a-button>
+              <a-button type="primary" @click="searchReset" icon="reload" style="margin-left: 8px">重置</a-button>
+              <a @click="handleToggleSearch" style="margin-left: 8px">
+                {{ toggleSearchStatus ? '收起' : '展开' }}
+                <a-icon :type="toggleSearchStatus ? 'up' : 'down'"/>
+              </a>
+            </span>
+                    </a-col>
+
+                </a-row>
+            </a-form>
+        </div>
+
+        <!-- 操作按钮区域 -->
+        <div class="table-operator">
+            <a-button @click="handleAdd" type="primary" icon="plus">新增</a-button>
+            <a-button type="primary" icon="download" @click="handleExportXls('运营明细表')">导出</a-button>
+            <a-upload name="file" :showUploadList="false" :multiple="false" :headers="tokenHeader"
+                      :action="importExcelUrl" @change="handleImportExcel">
+                <a-button type="primary" icon="import">导入</a-button>
+            </a-upload>
+            <a-dropdown v-if="selectedRowKeys.length > 0">
+                <a-menu slot="overlay">
+                    <a-menu-item key="1" @click="batchDel">
+                        <a-icon type="delete"/>
+                        删除
+                    </a-menu-item>
+                </a-menu>
+                <a-button style="margin-left: 8px"> 批量操作
+                    <a-icon type="down"/>
+                </a-button>
+            </a-dropdown>
+        </div>
+
+        <!-- table区域-begin -->
+        <div>
+            <div class="ant-alert ant-alert-info" style="margin-bottom: 16px;">
+                <i class="anticon anticon-info-circle ant-alert-icon"></i> 已选择 <a style="font-weight: 600">{{
+                selectedRowKeys.length }}</a>项
+                <a style="margin-left: 24px" @click="onClearSelected">清空</a>
+            </div>
+
+            <a-table
+                    ref="table"
+                    size="middle"
+                    bordered
+                    rowKey="id"
+                    :columns="columns"
+                    :dataSource="dataSource"
+                    :pagination="ipagination"
+                    :loading="loading"
+                    :rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}"
+                    @change="handleTableChange">
+
+        <span slot="action" slot-scope="text, record">
+          <a @click="handleEdit(record)">编辑</a>
+
+          <a-divider type="vertical"/>
+          <a-dropdown>
+            <a class="ant-dropdown-link">更多 <a-icon type="down"/></a>
+            <a-menu slot="overlay">
+              <a-menu-item>
+                <a-popconfirm title="确定删除吗?" @confirm="() => handleDelete(record.id)">
+                  <a>删除</a>
+                </a-popconfirm>
+              </a-menu-item>
+            </a-menu>
+          </a-dropdown>
+        </span>
+
+            </a-table>
+        </div>
+        <!-- table区域-end -->
+
+        <!-- 表单区域 -->
+        <performanceAccount-modal ref="modalForm" @ok="modalFormOk"></performanceAccount-modal>
+    </a-card>
+</template>
+
+<script>
+    import PerformanceAccountModal from './modules/PerformanceAccountModal'
+    import {JeecgListMixin} from '@/mixins/JeecgListMixin'
+
+    export default {
+        name: "PerformanceAccountList",
+        mixins: [JeecgListMixin],
+        components: {
+            PerformanceAccountModal
+        },
+        data() {
+            return {
+                description: '运营明细表管理页面',
+                // 表头
+                columns: [
+                    {
+                        title: '#',
+                        dataIndex: '',
+                        key: 'rowIndex',
+                        width: 60,
+                        align: "center",
+                        customRender: function (t, r, index) {
+                            return parseInt(index) + 1;
+                        }
+                    },
+                    {
+                        title: '账户id',
+                        align: "center",
+                        dataIndex: 'accountId'
+                    },
+                    {
+                        title: '账户期间消耗',
+                        align: "center",
+                        dataIndex: 'cost'
+                    },
+                    {
+                        title: '年',
+                        align: "center",
+                        dataIndex: 'year'
+                    },
+                    {
+                        title: '1头条2快手',
+                        align: "center",
+                        dataIndex: 'mediaType'
+                    },
+                    {
+                        title: '季度',
+                        align: "center",
+                        dataIndex: 'quarter'
+                    },
+                    {
+                        title: '账户所属人',
+                        align: "center",
+                        dataIndex: 'userId'
+                    },
+                    {
+                        title: '账户消耗计算开始时间',
+                        align: "center",
+                        dataIndex: 'startDate'
+                    },
+                    {
+                        title: '账户消耗计算结束时间',
+                        align: "center",
+                        dataIndex: 'endDate'
+                    },
+                    {
+                        title: '操作',
+                        dataIndex: 'action',
+                        align: "center",
+                        scopedSlots: {customRender: 'action'},
+                    }
+                ],
+                url: {
+                    list: "/performanceaccount/performanceAccount/list",
+                    delete: "/performanceaccount/performanceAccount/delete",
+                    deleteBatch: "/performanceaccount/performanceAccount/deleteBatch",
+                    exportXlsUrl: "performanceaccount/performanceAccount/exportXls",
+                    importExcelUrl: "performanceaccount/performanceAccount/importExcel",
+                },
+            }
+        },
+        computed: {
+            importExcelUrl: function () {
+                return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`;
+            }
+        },
+        methods: {}
+    }
+</script>
+<style scoped>
+    @import '~@assets/less/common.less'
+</style>

+ 170 - 0
performance-appraisal/src/main/java/cn/com/ctop/performanceaccount/vue/modules/PerformanceAccountModal.vue

@@ -0,0 +1,170 @@
+<template>
+    <a-modal
+            :title="title"
+            :width="800"
+            :visible="visible"
+            :confirmLoading="confirmLoading"
+            @ok="handleOk"
+            @cancel="handleCancel"
+            cancelText="关闭">
+
+        <a-spin :spinning="confirmLoading">
+            <a-form :form="form">
+
+                <a-form-item
+                        :labelCol="labelCol"
+                        :wrapperCol="wrapperCol"
+                        label="账户id">
+                    <a-input placeholder="请输入账户id" v-decorator="['accountId', validatorRules.accountId ]"/>
+                </a-form-item>
+                <a-form-item
+                        :labelCol="labelCol"
+                        :wrapperCol="wrapperCol"
+                        label="账户期间消耗">
+                    <a-input-number v-decorator="[ 'cost', {}]"/>
+                </a-form-item>
+                <a-form-item
+                        :labelCol="labelCol"
+                        :wrapperCol="wrapperCol"
+                        label="年">
+                    <a-input-number v-decorator="[ 'year', {}]"/>
+                </a-form-item>
+                <a-form-item
+                        :labelCol="labelCol"
+                        :wrapperCol="wrapperCol"
+                        label="1头条2快手">
+                    <a-input-number v-decorator="[ 'mediaType', {}]"/>
+                </a-form-item>
+                <a-form-item
+                        :labelCol="labelCol"
+                        :wrapperCol="wrapperCol"
+                        label="季度">
+                    <a-input-number v-decorator="[ 'quarter', {}]"/>
+                </a-form-item>
+                <a-form-item
+                        :labelCol="labelCol"
+                        :wrapperCol="wrapperCol"
+                        label="账户所属人">
+                    <a-input placeholder="请输入账户所属人" v-decorator="['userId', {}]"/>
+                </a-form-item>
+                <a-form-item
+                        :labelCol="labelCol"
+                        :wrapperCol="wrapperCol"
+                        label="账户消耗计算开始时间">
+                    <a-date-picker v-decorator="[ 'startDate', {}]"/>
+                </a-form-item>
+                <a-form-item
+                        :labelCol="labelCol"
+                        :wrapperCol="wrapperCol"
+                        label="账户消耗计算结束时间">
+                    <a-date-picker v-decorator="[ 'endDate', {}]"/>
+                </a-form-item>
+
+            </a-form>
+        </a-spin>
+    </a-modal>
+</template>
+
+<script>
+    import {httpAction} from '@/api/manage'
+    import pick from 'lodash.pick'
+    import moment from "moment"
+
+    export default {
+        name: "PerformanceAccountModal",
+        data() {
+            return {
+                title: "操作",
+                visible: false,
+                model: {},
+                labelCol: {
+                    xs: {span: 24},
+                    sm: {span: 5},
+                },
+                wrapperCol: {
+                    xs: {span: 24},
+                    sm: {span: 16},
+                },
+
+                confirmLoading: false,
+                form: this.$form.createForm(this),
+                validatorRules: {
+                    accountId: {rules: [{required: true, message: '请输入账户id!'}]},
+                },
+                url: {
+                    add: "/performanceaccount/performanceAccount/add",
+                    edit: "/performanceaccount/performanceAccount/edit",
+                },
+            }
+        },
+        created() {
+        },
+        methods: {
+            add() {
+                this.edit({});
+            },
+            edit(record) {
+                this.form.resetFields();
+                this.model = Object.assign({}, record);
+                this.visible = true;
+                this.$nextTick(() => {
+                    this.form.setFieldsValue(pick(this.model, 'accountId', 'cost', 'year', 'mediaType', 'quarter', 'userId'))
+                    //时间格式化
+                    this.form.setFieldsValue({startDate: this.model.startDate ? moment(this.model.startDate) : null})
+                    this.form.setFieldsValue({endDate: this.model.endDate ? moment(this.model.endDate) : null})
+                });
+
+            },
+            close() {
+                this.$emit('close');
+                this.visible = false;
+            },
+            handleOk() {
+                const that = this;
+                // 触发表单验证
+                this.form.validateFields((err, values) => {
+                    if (!err) {
+                        that.confirmLoading = true;
+                        let httpurl = '';
+                        let method = '';
+                        if (!this.model.id) {
+                            httpurl += this.url.add;
+                            method = 'post';
+                        } else {
+                            httpurl += this.url.edit;
+                            method = 'put';
+                        }
+                        let formData = Object.assign(this.model, values);
+                        //时间格式化
+                        formData.startDate = formData.startDate ? formData.startDate.format() : null;
+                        formData.endDate = formData.endDate ? formData.endDate.format() : null;
+
+                        console.log(formData)
+                        httpAction(httpurl, formData, method).then((res) => {
+                            if (res.success) {
+                                that.$message.success(res.message);
+                                that.$emit('ok');
+                            } else {
+                                that.$message.warning(res.message);
+                            }
+                        }).finally(() => {
+                            that.confirmLoading = false;
+                            that.close();
+                        })
+
+
+                    }
+                })
+            },
+            handleCancel() {
+                this.close()
+            },
+
+
+        }
+    }
+</script>
+
+<style lang="less" scoped>
+
+</style>

+ 177 - 0
performance-appraisal/src/main/java/cn/com/ctop/performanceaccount/vue/modules/PerformanceAccountModal__Style#Drawer.vue

@@ -0,0 +1,177 @@
+<template>
+    <a-drawer
+            :title="title"
+            :width="800"
+            placement="right"
+            :closable="false"
+            @close="close"
+            :visible="visible"
+    >
+
+        <a-spin :spinning="confirmLoading">
+            <a-form :form="form">
+
+                <a-form-item
+                        :labelCol="labelCol"
+                        :wrapperCol="wrapperCol"
+                        label="账户id">
+                    <a-input placeholder="请输入账户id" v-decorator="['accountId', validatorRules.accountId ]"/>
+                </a-form-item>
+                <a-form-item
+                        :labelCol="labelCol"
+                        :wrapperCol="wrapperCol"
+                        label="账户期间消耗">
+                    <a-input-number v-decorator="[ 'cost', {}]"/>
+                </a-form-item>
+                <a-form-item
+                        :labelCol="labelCol"
+                        :wrapperCol="wrapperCol"
+                        label="年">
+                    <a-input-number v-decorator="[ 'year', {}]"/>
+                </a-form-item>
+                <a-form-item
+                        :labelCol="labelCol"
+                        :wrapperCol="wrapperCol"
+                        label="1头条2快手">
+                    <a-input-number v-decorator="[ 'mediaType', {}]"/>
+                </a-form-item>
+                <a-form-item
+                        :labelCol="labelCol"
+                        :wrapperCol="wrapperCol"
+                        label="季度">
+                    <a-input-number v-decorator="[ 'quarter', {}]"/>
+                </a-form-item>
+                <a-form-item
+                        :labelCol="labelCol"
+                        :wrapperCol="wrapperCol"
+                        label="账户所属人">
+                    <a-input placeholder="请输入账户所属人" v-decorator="['userId', {}]"/>
+                </a-form-item>
+                <a-form-item
+                        :labelCol="labelCol"
+                        :wrapperCol="wrapperCol"
+                        label="账户消耗计算开始时间">
+                    <a-date-picker v-decorator="[ 'startDate', {}]"/>
+                </a-form-item>
+                <a-form-item
+                        :labelCol="labelCol"
+                        :wrapperCol="wrapperCol"
+                        label="账户消耗计算结束时间">
+                    <a-date-picker v-decorator="[ 'endDate', {}]"/>
+                </a-form-item>
+
+            </a-form>
+        </a-spin>
+        <a-button type="primary" @click="handleOk">确定</a-button>
+        <a-button type="primary" @click="handleCancel">取消</a-button>
+    </a-drawer>
+</template>
+
+<script>
+    import {httpAction} from '@/api/manage'
+    import pick from 'lodash.pick'
+    import moment from "moment"
+
+    export default {
+        name: "PerformanceAccountModal",
+        data() {
+            return {
+                title: "操作",
+                visible: false,
+                model: {},
+                labelCol: {
+                    xs: {span: 24},
+                    sm: {span: 5},
+                },
+                wrapperCol: {
+                    xs: {span: 24},
+                    sm: {span: 16},
+                },
+
+                confirmLoading: false,
+                form: this.$form.createForm(this),
+                validatorRules: {
+                    accountId: {rules: [{required: true, message: '请输入账户id!'}]},
+                },
+                url: {
+                    add: "/performanceaccount/performanceAccount/add",
+                    edit: "/performanceaccount/performanceAccount/edit",
+                },
+            }
+        },
+        created() {
+        },
+        methods: {
+            add() {
+                this.edit({});
+            },
+            edit(record) {
+                this.form.resetFields();
+                this.model = Object.assign({}, record);
+                this.visible = true;
+                this.$nextTick(() => {
+                    this.form.setFieldsValue(pick(this.model, 'accountId', 'cost', 'year', 'mediaType', 'quarter', 'userId'))
+                    //时间格式化
+                    this.form.setFieldsValue({startDate: this.model.startDate ? moment(this.model.startDate) : null})
+                    this.form.setFieldsValue({endDate: this.model.endDate ? moment(this.model.endDate) : null})
+                });
+
+            },
+            close() {
+                this.$emit('close');
+                this.visible = false;
+            },
+            handleOk() {
+                const that = this;
+                // 触发表单验证
+                this.form.validateFields((err, values) => {
+                    if (!err) {
+                        that.confirmLoading = true;
+                        let httpurl = '';
+                        let method = '';
+                        if (!this.model.id) {
+                            httpurl += this.url.add;
+                            method = 'post';
+                        } else {
+                            httpurl += this.url.edit;
+                            method = 'put';
+                        }
+                        let formData = Object.assign(this.model, values);
+                        //时间格式化
+                        formData.startDate = formData.startDate ? formData.startDate.format() : null;
+                        formData.endDate = formData.endDate ? formData.endDate.format() : null;
+
+                        console.log(formData)
+                        httpAction(httpurl, formData, method).then((res) => {
+                            if (res.success) {
+                                that.$message.success(res.message);
+                                that.$emit('ok');
+                            } else {
+                                that.$message.warning(res.message);
+                            }
+                        }).finally(() => {
+                            that.confirmLoading = false;
+                            that.close();
+                        })
+
+
+                    }
+                })
+            },
+            handleCancel() {
+                this.close()
+            },
+
+
+        }
+    }
+</script>
+
+<style lang="less" scoped>
+    /** Button按钮间距 */
+    .ant-btn {
+        margin-left: 30px;
+        margin-bottom: 30px;
+        float: right;
+    }
+</style>

+ 66 - 0
performance-appraisal/src/main/java/cn/com/ctop/performanceappraisal/controller/PerformanceController.java

@@ -2,20 +2,24 @@ package cn.com.ctop.performanceappraisal.controller;
 
 import cn.com.ctop.performanceappraisal.entity.Performance;
 import cn.com.ctop.performanceappraisal.service.IPerformanceService;
+import cn.com.ctop.userefficientvideomap.mapper.UserEfficientVideoMapMapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.shiro.SecurityUtils;
 import org.jeecg.common.api.vo.Result;
 import org.jeecg.common.aspect.annotation.AutoLog;
 import org.jeecg.common.system.query.QueryGenerator;
+import org.jeecg.common.system.vo.LoginUser;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletRequest;
 import java.util.Arrays;
+import java.util.List;
 import java.util.Map;
 
 /**
@@ -32,6 +36,8 @@ import java.util.Map;
 public class PerformanceController {
     @Autowired
     private IPerformanceService performanceService;
+    @Autowired
+    private UserEfficientVideoMapMapper userEfficientVideoMapMapper;
 
     /**
      * 分页列表查询
@@ -175,4 +181,64 @@ public class PerformanceController {
                                            Long projectId, String appType) {
         return performanceService.getUserOptimizerAccountList(appType, projectId, pageNo, pageSize);
     }
+
+
+    @AutoLog(value = "设计组内设计师季度绩效表-分页列表查询")
+    @ApiOperation(value = "设计组内设计师季度绩效表-分页列表查询", notes = "设计组内设计师季度绩效表-分页列表查询")
+    @GetMapping(value = "/designerDepartMemberPerformanceList")
+    public Result<IPage<Performance>> designerDepartMemberPerformanceList(Performance performance,
+                                                                          @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
+                                                                          @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
+                                                                          HttpServletRequest req) {
+        Result<IPage<Performance>> result = new Result<IPage<Performance>>();
+        LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
+        //String departId = userEfficientVideoMapMapper.getDepartIdByUserId("e9ca23d68d884d4ebb19d07889727dae");
+        String departId = userEfficientVideoMapMapper.getDepartIdByUserId(sysUser.getId());
+        List<String> userIdList = userEfficientVideoMapMapper.getUserIdListByDepId(departId);
+        ////
+        QueryWrapper<Performance> queryWrapper = QueryGenerator.initQueryWrapper(performance, req.getParameterMap());
+        queryWrapper.in("user_id", userIdList);
+
+        Page<Performance> page = new Page<Performance>(pageNo, pageSize);
+        IPage<Performance> pageList = performanceService.page(page, queryWrapper);
+        result.setSuccess(true);
+        result.setResult(pageList);
+        return result;
+    }
+
+    @AutoLog(value = "北京设计师季度绩效列表-分页列表查询")
+    @ApiOperation(value = "北京设计师季度绩效列表-分页列表查询", notes = "北京设计师季度绩效列表-分页列表查询")
+    @GetMapping(value = "/beijingDesignerPageList")
+    public Result<IPage<Performance>> beijingDesignerPageList(Performance performance,
+                                                              @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
+                                                              @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
+                                                              HttpServletRequest req) {
+        Result<IPage<Performance>> result = new Result<IPage<Performance>>();
+        QueryWrapper<Performance> queryWrapper = QueryGenerator.initQueryWrapper(performance, req.getParameterMap());
+        Page<Performance> page = new Page<Performance>(pageNo, pageSize);
+        IPage<Performance> pageList = performanceService.page(page, queryWrapper);
+        result.setSuccess(true);
+        result.setResult(pageList);
+        return result;
+    }
+
+    @AutoLog(value = "北京设计师季度绩效列表-分页列表查询")
+    @ApiOperation(value = "北京设计师季度绩效列表-分页列表查询", notes = "北京设计师季度绩效列表-分页列表查询")
+    @GetMapping(value = "/beijingPlaneDesignerList")
+    public Result<IPage<Performance>> beijingPlaneDesignerPageList(Performance performance,
+                                                                   @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
+                                                                   @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
+                                                                   HttpServletRequest req) {
+        Result<IPage<Performance>> result = new Result<IPage<Performance>>();
+        QueryWrapper<Performance> queryWrapper = QueryGenerator.initQueryWrapper(performance, req.getParameterMap());
+        LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
+        //sysUser.setId("b0e4798234df4096936e6bc6d00db3ba");
+        queryWrapper.eq("user_id", sysUser.getId());
+        Page<Performance> page = new Page<Performance>(pageNo, pageSize);
+        IPage<Performance> pageList = performanceService.page(page, queryWrapper);
+        result.setSuccess(true);
+        result.setResult(pageList);
+        return result;
+    }
+
 }

+ 30 - 0
performance-appraisal/src/main/java/cn/com/ctop/performanceappraisal/controller/PerformanceOptimizerController.java

@@ -12,6 +12,7 @@ import lombok.extern.slf4j.Slf4j;
 import org.jeecg.common.api.vo.Result;
 import org.jeecg.common.aspect.annotation.AutoLog;
 import org.jeecg.common.system.query.QueryGenerator;
+import org.jeecg.common.util.DateUtils;
 import org.jeecg.common.util.oConvertUtils;
 import org.jeecgframework.poi.excel.ExcelImportUtil;
 import org.jeecgframework.poi.excel.def.NormalExcelConstants;
@@ -293,4 +294,33 @@ public class PerformanceOptimizerController {
     }
 
 
+    /**
+     * 计算运营绩效
+     */
+    @GetMapping(value = "/yunyingPerformance")
+    @ResponseBody
+    public void yunyingPerformance(@RequestParam(name = "year") Integer year,
+                                   @RequestParam(name = "quarter") Integer quarter) {
+
+        Map<String, String> map = DateUtils.quarterStartEndDate(year, quarter);
+        //performanceOptimizerService.toutiaoYunyingQuarterPerformance(year, quarter, map.get("startDate"), map.get("endDate"));
+        //performanceOptimizerService.kuaishouYunyingQuarterPerformance(year, quarter, map.get("startDate"), map.get("endDate"));
+
+        performanceOptimizerService.toutiaoYunyingQuarterPerformance(year, quarter, "2020-01-01", "2020-03-31");
+        performanceOptimizerService.kuaishouYunyingQuarterPerformance(year, quarter, "2020-01-01", "2020-03-31");
+
+    }
+
+    /**
+     * 计算运营绩效
+     */
+    @GetMapping(value = "/kuaishouYunyingLeaderQuarterPerformance")
+    @ResponseBody
+    public void kuaishouYunyingLeaderQuarterPerformance(@RequestParam(name = "year") Integer year,
+                                                        @RequestParam(name = "quarter") Integer quarter) {
+
+        Map<String, String> map = DateUtils.quarterStartEndDate(year, quarter);
+        performanceOptimizerService.kuaishouYunyingLeaderQuarterPerformance(year, quarter);
+    }
+
 }

+ 4 - 4
performance-appraisal/src/main/java/cn/com/ctop/performanceappraisal/entity/OptimizerConfig.java

@@ -44,25 +44,25 @@ public class OptimizerConfig {
      */
     @Excel(name = "媒体任务", width = 15)
     @ApiModelProperty(value = "媒体任务")
-    private java.math.BigDecimal mediaTask;
+    private BigDecimal mediaTask;
     /**
      * personalTask
      */
     @Excel(name = "personalTask", width = 15)
     @ApiModelProperty(value = "personalTask")
-    private java.math.BigDecimal personalTask;
+    private BigDecimal personalTask;
     /**
      * 媒体任务完成下的提成比例 (千分之n)
      */
     @Excel(name = "媒体任务完成下的提成比例 (千分之n)", width = 15)
     @ApiModelProperty(value = "媒体任务完成下的提成比例 (千分之n)")
-    private java.math.BigDecimal mediaTaskFinishRate;
+    private BigDecimal mediaTaskFinishRate;
     /**
      * 媒体任务未完成下的提成比例 (千分之n)
      */
     @Excel(name = "媒体任务未完成下的提成比例 (千分之n)", width = 15)
     @ApiModelProperty(value = "媒体任务未完成下的提成比例 (千分之n)")
-    private java.math.BigDecimal mediaTaskNoFinishRate;
+    private BigDecimal mediaTaskNoFinishRate;
     /**
      * 是否有效
      */

+ 6 - 0
performance-appraisal/src/main/java/cn/com/ctop/performanceappraisal/service/IPerformanceOptimizerService.java

@@ -19,4 +19,10 @@ public interface IPerformanceOptimizerService extends IService<PerformanceOptimi
     Map<String, Object> getRankingList(String mediaType, Integer pageNo, Integer pageSize, String orgCode);
 
     Map<String, Object> getManagerPerformanceDetail(String mediaType, String orgCode);
+
+    Map<String, Object> kuaishouYunyingQuarterPerformance(Integer year, Integer quarter, String startDate, String endDate);
+
+    void kuaishouYunyingLeaderQuarterPerformance(Integer year, Integer quarter);
+
+    void toutiaoYunyingQuarterPerformance(Integer year, Integer quarter, String startDate, String endDate);
 }

+ 469 - 2
performance-appraisal/src/main/java/cn/com/ctop/performanceappraisal/service/impl/PerformanceOptimizerServiceImpl.java

@@ -1,9 +1,10 @@
 package cn.com.ctop.performanceappraisal.service.impl;
 
-import cn.com.ctop.common.module.mapper.SysRoleMapper;
 import cn.com.ctop.common.module.utils.CtopAdConstant;
 import cn.com.ctop.common.module.utils.ResultMapUtils;
 import cn.com.ctop.common.module.utils.StatusCode;
+import cn.com.ctop.performanceaccount.entity.PerformanceAccount;
+import cn.com.ctop.performanceaccount.mapper.PerformanceAccountMapper;
 import cn.com.ctop.performanceappraisal.entity.OptimizerConfig;
 import cn.com.ctop.performanceappraisal.entity.PerformanceConfig;
 import cn.com.ctop.performanceappraisal.entity.PerformanceOptimizer;
@@ -15,6 +16,9 @@ import cn.com.ctop.performanceappraisal.service.IPerformanceOptimizerService;
 import cn.com.ctop.performanceappraisal.service.IPerformanceService;
 import cn.com.ctop.performanceappraisal.vo.OptimizerCostDetailVO;
 import cn.com.ctop.performanceappraisal.vo.UserPerformanceDetailVO;
+import cn.com.ctop.userefficientvideomap.entity.TransferorAccountDTO;
+import cn.com.ctop.userefficientvideomap.entity.UserDto2;
+import cn.com.ctop.userefficientvideomap.mapper.UserEfficientVideoMapMapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.shiro.SecurityUtils;
@@ -44,16 +48,479 @@ public class PerformanceOptimizerServiceImpl extends ServiceImpl<PerformanceOpti
     @Autowired
     private IOptimizerConfigService optimizerConfigService;
     @Autowired
-    private SysRoleMapper sysRoleMapper;
+    private UserEfficientVideoMapMapper userEfficientVideoMapMapper;
     @Autowired
     private PerformanceMapper performanceMapper;
     @Autowired
     private PerformanceOptimizerMapper performanceOptimizerMapper;
+    @Autowired
+    private PerformanceAccountMapper performanceAccountMapper;
+
 
+    public void YunyingPerformance(Integer year, Integer quarter, String startDate, String endDate) {
+        //Map<String,String> map = DateUtils.quarterStartEndDate(year, quarter);
 
 
+    }
+
 
+    //快手运营季度绩效计算
+    public Map<String, Object> kuaishouYunyingQuarterPerformance(Integer year, Integer quarter, String startDate, String endDate) {
+        Map<String, Object> result = new HashMap<>();
+        //获取快手所有运营的数据
+        //List<UserDto2> userList = userEfficientVideoMapMapper.getAllKuaishouYunyingDepartUserInfo();
+        Integer mediaType = 2;
+        //华北
+        //查询当前媒体配置信息
+        OptimizerConfig config = optimizerConfigService.getEnabledConfigByMediaType(mediaType + "", CtopAdConstant.CTOP_ORGCODE_NORTH_CHINA_PREFIX);
+        if (null == config) {
+            ResultMapUtils.setResultMap(result, StatusCode.KUAISHOU_OPTINIZER_CONFIG_IS_NULL.getCode());
+            return result;
+        }
 
+        ///////////////方法2
+        //1。获取所有快手账户
+        //2。循环每个账户,然后查找每个账户下在本季度是否有转户的情况存在;
+
+        //创建map,Map<String人,Map<String账户,时间段List<Map<String开始时间,String结束时间>>>>
+        Map<String, Map<String, List<Map<String, String>>>> userAccountMap = new HashMap<>();
+
+        //获取所有快手的账户
+        List<String> accountList = userEfficientVideoMapMapper.getAccountListByMediaId(mediaType);
+        //循环所有账户
+        for (String account : accountList) {
+            String userId = userEfficientVideoMapMapper.getAccountUserId(account);
+            //判断本季度内是否有转户情况存在
+            List<TransferorAccountDTO> transferorAccountDTOList = userEfficientVideoMapMapper.accountTransforerListByUserId(account, startDate, endDate);
+
+            //如果此账户没有转户情况发生,则存入userAccountMap当中
+            if (transferorAccountDTOList.size() == 0) {
+                if (userAccountMap.get(userId) == null) {
+                    Map<String, List<Map<String, String>>> accountMap = new HashMap<>();
+                    List<Map<String, String>> dateList = new ArrayList<>();
+                    Map<String, String> dateMap = new HashMap<>();
+
+                    dateMap.put("startDate", startDate);
+                    dateMap.put("endDate", endDate);
+                    dateList.add(dateMap);
+                    accountMap.put(account, dateList);
+                    userAccountMap.put(userId, accountMap);
+                } else {
+                    Map<String, List<Map<String, String>>> accountMap = userAccountMap.get(userId);
+                    //如果此账户本季度没有转户行为,直接创建账户即可,不用再做判断
+                    Map<String, String> dateMap = new HashMap<>();
+                    dateMap.put("startDate", startDate);
+                    dateMap.put("endDate", endDate);
+                    if (accountMap.get(account) == null) {
+                        List<Map<String, String>> dateList = new ArrayList<>();
+                        dateList.add(dateMap);
+                        accountMap.put(account, dateList);
+                    } else {
+                        List<Map<String, String>> dateList = accountMap.get(account);
+                        dateList.add(dateMap);
+                    }
+                }
+            } else {//如果此账户有转户情况
+                //循环所有转户信息
+                for (int j = 0; j < transferorAccountDTOList.size(); j++) {
+                    if (j == 0) {
+                        Map<String, String> dateMap = new HashMap<>();
+                        dateMap.put("startDate", startDate);
+                        dateMap.put("endDate", transferorAccountDTOList.get(j).getTransferorDate());
+                        String transferorUserId = transferorAccountDTOList.get(j).getTransferor();
+                        //判断:如果userAccountMap中没有assigneeUserId,则直接创建;
+                        if (userAccountMap.get(transferorUserId) == null) {
+                            Map<String, List<Map<String, String>>> accountMap = new HashMap<>();
+                            List<Map<String, String>> dateList = new ArrayList<>();
+                            dateList.add(dateMap);
+                            accountMap.put(account, dateList);
+                            userAccountMap.put(transferorUserId, accountMap);
+                        } else {//如果已经有了这个userId,则需要判断是否有此账户
+                            if (userAccountMap.get(transferorUserId).get(account) == null) {
+                                Map<String, List<Map<String, String>>> accountMap = userAccountMap.get(transferorUserId);
+                                List<Map<String, String>> dateList = new ArrayList<>();
+                                dateList.add(dateMap);
+                                accountMap.put(account, dateList);
+                            } else {
+                                List<Map<String, String>> dateList = userAccountMap.get(transferorUserId).get(account);
+                                dateList.add(dateMap);
+                            }
+                        }
+
+                        if (j == transferorAccountDTOList.size() - 1) {
+                            Map<String, String> dateMap2 = new HashMap<>();
+                            dateMap2.put("startDate", transferorAccountDTOList.get(j).getAssigneeDate());
+                            dateMap2.put("endDate", endDate);
+                            String assigneeUserId = transferorAccountDTOList.get(j).getAssignee();
+                            //判断:如果userAccountMap中没有assigneeUserId,则直接创建;
+                            if (userAccountMap.get(assigneeUserId) == null) {
+                                Map<String, List<Map<String, String>>> accountMap = new HashMap<>();
+                                List<Map<String, String>> dateList = new ArrayList<>();
+                                dateList.add(dateMap2);
+                                accountMap.put(account, dateList);
+                                userAccountMap.put(assigneeUserId, accountMap);
+                            } else {//如果已经有了这个userId,则需要判断是否有此账户
+                                if (userAccountMap.get(assigneeUserId).get(account) == null) {
+                                    Map<String, List<Map<String, String>>> accountMap = userAccountMap.get(assigneeUserId);
+                                    List<Map<String, String>> dateList = new ArrayList<>();
+                                    dateList.add(dateMap2);
+                                    accountMap.put(account, dateList);
+                                } else {
+                                    List<Map<String, String>> dateList = userAccountMap.get(assigneeUserId).get(account);
+                                    dateList.add(dateMap2);
+                                }
+                            }
+                        }
+                    } else {
+                        Map<String, String> dateMap = new HashMap<>();
+                        dateMap.put("startDate", transferorAccountDTOList.get(j).getAssigneeDate());
+                        if (j == (transferorAccountDTOList.size() - 1)) {
+                            dateMap.put("endDate", endDate);
+                        } else {
+                            dateMap.put("endDate", transferorAccountDTOList.get(j + 1).getTransferorDate());
+                        }
+
+                        String assigneeUserId = transferorAccountDTOList.get(j).getAssignee();
+                        //判断:如果userAccountMap中没有assigneeUserId,则直接创建;
+                        if (userAccountMap.get(assigneeUserId) == null) {
+                            Map<String, List<Map<String, String>>> accountMap = new HashMap<>();
+                            List<Map<String, String>> dateList = new ArrayList<>();
+                            dateList.add(dateMap);
+                            accountMap.put(account, dateList);
+                            userAccountMap.put(assigneeUserId, accountMap);
+                        } else {//如果已经有了这个userId,则需要判断是否有此账户
+
+                            if (userAccountMap.get(assigneeUserId).get(account) == null) {
+                                Map<String, List<Map<String, String>>> accountMap = userAccountMap.get(assigneeUserId);
+                                List<Map<String, String>> dateList = new ArrayList<>();
+                                dateList.add(dateMap);
+                                accountMap.put(account, dateList);
+                            } else {
+                                List<Map<String, String>> dateList = userAccountMap.get(assigneeUserId).get(account);
+                                dateList.add(dateMap);
+                            }
+
+                        }
+
+                    }
+
+                } //转户列表循环结束
+            } //else判断
+
+        }//账户循环结束
+
+        for (Map.Entry<String, Map<String, List<Map<String, String>>>> entry : userAccountMap.entrySet()) {
+            String userAccountKey = entry.getKey();
+            Map<String, List<Map<String, String>>> userAccountValue = entry.getValue();
+            BigDecimal totalCharge = BigDecimal.ZERO;
+            BigDecimal totalPerformance = BigDecimal.ZERO;
+
+            for (Map.Entry<String, List<Map<String, String>>> entryAccount : userAccountValue.entrySet()) {
+                String acountKey = entryAccount.getKey();
+                List<Map<String, String>> accountValue = entryAccount.getValue();
+
+                for (Map<String, String> dateMap : accountValue) {
+                    //当前消耗
+                    BigDecimal charge = userEfficientVideoMapMapper.getAccountSumCharge(acountKey, dateMap.get("startDate"), dateMap.get("endDate")) == null ? BigDecimal.ZERO : userEfficientVideoMapMapper.getAccountSumCharge(acountKey, dateMap.get("startDate"), dateMap.get("endDate"));
+                    //此人总消耗
+                    totalCharge = totalCharge.add(charge);
+
+                    PerformanceAccount performanceAccount = new PerformanceAccount();
+                    performanceAccount.setAccountId(Long.parseLong(acountKey));
+                    performanceAccount.setCost(charge);
+                    performanceAccount.setYear(year);
+                    performanceAccount.setQuarter(quarter);
+                    performanceAccount.setMediaType(mediaType);
+                    performanceAccount.setUserId(userAccountKey);
+                    performanceAccount.setStartDate(dateMap.get("startDate"));
+                    performanceAccount.setEndDate(dateMap.get("endDate"));
+                    performanceAccountMapper.insert(performanceAccount);
+                }
+            }
+
+            //运营绩效数据入库
+            PerformanceOptimizer performance = new PerformanceOptimizer();
+            performance.setAppType(mediaType);
+            performance.setQuarter(quarter + "");
+            performance.setYear(year + "");
+            performance.setRealname(userEfficientVideoMapMapper.getrealnameByUserId(userAccountKey));
+            performance.setUserId(userAccountKey);
+            performance.setTotalCost(totalCharge);
+
+            //个人季度任务
+            BigDecimal personalTask = config.getPersonalTask();
+            //判断个人任务是否完成 ,如果完成则给到千分之5,如果未完成,则给到千分之3的绩效
+            String roleCode = userEfficientVideoMapMapper.getRoleCodeByUserId(userAccountKey);
+            if (!roleCode.equals("operationAssistant")) {
+                if (totalCharge.compareTo(personalTask) > 0) {
+                    totalPerformance = totalCharge.multiply(config.getMediaTaskFinishRate()).divide(new BigDecimal("1000")).setScale(2, RoundingMode.HALF_UP);
+                } else {
+                    totalPerformance = totalCharge.multiply(config.getMediaTaskNoFinishRate()).divide(new BigDecimal("1000")).setScale(2, RoundingMode.HALF_UP);
+                }
+            }
+            performance.setTotalRoyalty(totalPerformance);
+            performanceOptimizerMapper.insert(performance);
+        }
+        return result;
+    }
+
+    //头条运营季度绩效计算
+    public void toutiaoYunyingQuarterPerformance(Integer year, Integer quarter, String startDate, String endDate) {
+        //方法
+        //1。获取所有头条账户
+        //2。循环每个账户,然后查找每个账户下在本季度是否有转户的情况存在;
+        Integer mediaType = 1;
+        //创建map,Map<String人,Map<String账户,时间段List<Map<String开始时间,String结束时间>>>>
+        Map<String, Map<String, List<Map<String, String>>>> userAccountMap = new HashMap<>();
+        OptimizerConfig config = optimizerConfigService.getEnabledConfigByMediaType(mediaType + "", CtopAdConstant.CTOP_ORGCODE_NORTH_CHINA_PREFIX);
+        //获取所有头条的账户
+        List<String> accountList = userEfficientVideoMapMapper.getAccountListByMediaId(mediaType);
+
+        //循环所有账户
+        for (String account : accountList) {
+            String userId = userEfficientVideoMapMapper.getAccountUserId(account);
+            //判断本季度内是否有转户情况存在
+            List<TransferorAccountDTO> transferorAccountDTOList = userEfficientVideoMapMapper.accountTransforerListByUserId(account, startDate, endDate);
+
+            //如果此账户没有转户情况发生,则存入userAccountMap当中
+            if (transferorAccountDTOList.size() == 0) {
+                if (userAccountMap.get(userId) == null) {
+                    Map<String, List<Map<String, String>>> accountMap = new HashMap<>();
+                    List<Map<String, String>> dateList = new ArrayList<>();
+                    Map<String, String> dateMap = new HashMap<>();
+
+                    dateMap.put("startDate", startDate);
+                    dateMap.put("endDate", endDate);
+                    dateList.add(dateMap);
+                    accountMap.put(account, dateList);
+                    userAccountMap.put(userId, accountMap);
+                } else {
+                    Map<String, List<Map<String, String>>> accountMap = userAccountMap.get(userId);
+                    //如果此账户本季度没有转户行为,直接创建账户即可,不用再做判断
+                    Map<String, String> dateMap = new HashMap<>();
+                    dateMap.put("startDate", startDate);
+                    dateMap.put("endDate", endDate);
+                    if (accountMap.get(account) == null) {
+                        List<Map<String, String>> dateList = new ArrayList<>();
+                        dateList.add(dateMap);
+                        accountMap.put(account, dateList);
+                    } else {
+                        List<Map<String, String>> dateList = accountMap.get(account);
+                        dateList.add(dateMap);
+                    }
+                }
+            } else {//如果此账户有转户情况
+                //循环所有转户信息
+                for (int j = 0; j < transferorAccountDTOList.size(); j++) {
+                    if (j == 0) {
+                        Map<String, String> dateMap = new HashMap<>();
+                        dateMap.put("startDate", startDate);
+                        dateMap.put("endDate", transferorAccountDTOList.get(j).getTransferorDate());
+                        String transferorUserId = transferorAccountDTOList.get(j).getTransferor();
+                        //判断:如果userAccountMap中没有assigneeUserId,则直接创建;
+                        if (userAccountMap.get(transferorUserId) == null) {
+                            Map<String, List<Map<String, String>>> accountMap = new HashMap<>();
+                            List<Map<String, String>> dateList = new ArrayList<>();
+                            dateList.add(dateMap);
+                            accountMap.put(account, dateList);
+                            userAccountMap.put(transferorUserId, accountMap);
+                        } else {//如果已经有了这个userId,则需要判断是否有此账户
+                            if (userAccountMap.get(transferorUserId).get(account) == null) {
+                                Map<String, List<Map<String, String>>> accountMap = userAccountMap.get(transferorUserId);
+                                List<Map<String, String>> dateList = new ArrayList<>();
+                                dateList.add(dateMap);
+                                accountMap.put(account, dateList);
+                            } else {
+                                List<Map<String, String>> dateList = userAccountMap.get(transferorUserId).get(account);
+                                dateList.add(dateMap);
+                            }
+                        }
+
+                        if (j == transferorAccountDTOList.size() - 1) {
+                            Map<String, String> dateMap2 = new HashMap<>();
+                            dateMap2.put("startDate", transferorAccountDTOList.get(j).getAssigneeDate());
+                            dateMap2.put("endDate", endDate);
+                            String assigneeUserId = transferorAccountDTOList.get(j).getAssignee();
+                            //判断:如果userAccountMap中没有assigneeUserId,则直接创建;
+                            if (userAccountMap.get(assigneeUserId) == null) {
+                                Map<String, List<Map<String, String>>> accountMap = new HashMap<>();
+                                List<Map<String, String>> dateList = new ArrayList<>();
+                                dateList.add(dateMap2);
+                                accountMap.put(account, dateList);
+                                userAccountMap.put(assigneeUserId, accountMap);
+                            } else {//如果已经有了这个userId,则需要判断是否有此账户
+                                if (userAccountMap.get(assigneeUserId).get(account) == null) {
+                                    Map<String, List<Map<String, String>>> accountMap = userAccountMap.get(transferorUserId);
+                                    List<Map<String, String>> dateList = new ArrayList<>();
+                                    dateList.add(dateMap2);
+                                    accountMap.put(account, dateList);
+                                } else {
+                                    List<Map<String, String>> dateList = userAccountMap.get(assigneeUserId).get(account);
+                                    dateList.add(dateMap2);
+                                }
+                            }
+                        }
+                    } else {
+                        Map<String, String> dateMap = new HashMap<>();
+                        dateMap.put("startDate", transferorAccountDTOList.get(j).getAssigneeDate());
+                        if (j == (transferorAccountDTOList.size() - 1)) {
+                            dateMap.put("endDate", endDate);
+                        } else {
+                            dateMap.put("endDate", transferorAccountDTOList.get(j + 1).getTransferorDate());
+                        }
+
+                        String assigneeUserId = transferorAccountDTOList.get(j).getAssignee();
+                        //判断:如果userAccountMap中没有assigneeUserId,则直接创建;
+                        if (userAccountMap.get(assigneeUserId) == null) {
+                            Map<String, List<Map<String, String>>> accountMap = new HashMap<>();
+                            List<Map<String, String>> dateList = new ArrayList<>();
+                            dateList.add(dateMap);
+                            accountMap.put(account, dateList);
+                            userAccountMap.put(assigneeUserId, accountMap);
+                        } else {//如果已经有了这个userId,则需要判断是否有此账户
+
+                            if (userAccountMap.get(assigneeUserId).get(account) == null) {
+                                Map<String, List<Map<String, String>>> accountMap = userAccountMap.get(assigneeUserId);
+                                List<Map<String, String>> dateList = new ArrayList<>();
+                                dateList.add(dateMap);
+                                accountMap.put(account, dateList);
+                            } else {
+                                List<Map<String, String>> dateList = userAccountMap.get(assigneeUserId).get(account);
+                                dateList.add(dateMap);
+                            }
+
+                        }
+
+                    }
+
+                } //转户列表循环结束
+            } //else判断
+
+        }//账户循环结束
+
+
+        for (Map.Entry<String, Map<String, List<Map<String, String>>>> entry : userAccountMap.entrySet()) {
+            String userAccountKey = entry.getKey();
+            Map<String, List<Map<String, String>>> userAccountValue = entry.getValue();
+            BigDecimal totalCharge = BigDecimal.ZERO;
+            BigDecimal totalPerformance = BigDecimal.ZERO;
+
+            for (Map.Entry<String, List<Map<String, String>>> entryAccount : userAccountValue.entrySet()) {
+                String acountKey = entryAccount.getKey();
+                List<Map<String, String>> accountValue = entryAccount.getValue();
+
+                for (Map<String, String> dateMap : accountValue) {
+                    //当前消耗
+                    BigDecimal charge = userEfficientVideoMapMapper.getToutiaoAccountSumCharge(acountKey, dateMap.get("startDate"), dateMap.get("endDate")) == null ? BigDecimal.ZERO : userEfficientVideoMapMapper.getToutiaoAccountSumCharge(acountKey, dateMap.get("startDate"), dateMap.get("endDate"));
+                    //此人总消耗
+                    totalCharge = totalCharge.add(charge);
+
+                    PerformanceAccount performanceAccount = new PerformanceAccount();
+                    performanceAccount.setAccountId(Long.parseLong(acountKey));
+                    performanceAccount.setCost(charge);
+                    performanceAccount.setYear(year);
+                    performanceAccount.setQuarter(quarter);
+                    performanceAccount.setMediaType(mediaType);
+                    performanceAccount.setUserId(userAccountKey);
+                    performanceAccount.setStartDate(dateMap.get("startDate"));
+                    performanceAccount.setEndDate(dateMap.get("endDate"));
+                    performanceAccountMapper.insert(performanceAccount);
+                }
+            }
+
+            //运营绩效数据入库
+            PerformanceOptimizer performance = new PerformanceOptimizer();
+            performance.setAppType(mediaType);
+            performance.setQuarter(quarter + "");
+            performance.setYear(year + "");
+            performance.setRealname(userEfficientVideoMapMapper.getrealnameByUserId(userAccountKey));
+            performance.setUserId(userAccountKey);
+            performance.setTotalCost(totalCharge);
+
+            //个人季度任务
+            BigDecimal personalTask = config.getPersonalTask();
+            //判断个人任务是否完成 ,如果完成则给到千分之5,如果未完成,则给到千分之3的绩效
+            String roleCode = userEfficientVideoMapMapper.getRoleCodeByUserId(userAccountKey);
+            if (!roleCode.equals("operationAssistant")) {
+                if (totalCharge.compareTo(personalTask) > 0) {
+                    totalPerformance = totalCharge.multiply(config.getMediaTaskFinishRate()).divide(new BigDecimal("1000")).setScale(2, RoundingMode.HALF_UP);
+                } else {
+                    totalPerformance = totalCharge.multiply(config.getMediaTaskNoFinishRate()).divide(new BigDecimal("1000")).setScale(2, RoundingMode.HALF_UP);
+                }
+            }
+            performance.setTotalRoyalty(totalPerformance);
+            performanceOptimizerMapper.insert(performance);
+        }
+
+        return;
+    }
+
+    //快手运营leader绩效计算
+    public void kuaishouYunyingLeaderQuarterPerformance(Integer year, Integer quarter) {
+        Integer mediaType = 2;
+        //获取快手组下所有运营组长信息列表
+        List<UserDto2> yunyingLeaderList = userEfficientVideoMapMapper.getKuaishouYunyingLeaderUserInfo();
+        for (UserDto2 userDto2 : yunyingLeaderList) {
+            BigDecimal royalty = BigDecimal.ZERO;
+            List<UserDto2> userList = userEfficientVideoMapMapper.getYunyingLeaderMember(userDto2.getDepId());
+
+            for (UserDto2 user : userList) {
+                //增加判断:如果项目成员中包含自己的话,不将自己的消耗计算在内
+                if (user.getUserId().equals(userDto2.getUserId())) {
+                    continue;
+                }
+                BigDecimal userRoality = userEfficientVideoMapMapper.getYunyingRoyalty(user.getUserId(), year, quarter);
+                if (userRoality == null) {
+                    userRoality = BigDecimal.ZERO;
+                }
+                royalty = royalty.add(userRoality);
+            }
+            //运营leader绩效数据入库
+            PerformanceOptimizer performanceOptimizer = new PerformanceOptimizer();
+            performanceOptimizer.setAppType(mediaType);
+            performanceOptimizer.setQuarter(quarter + "");
+            performanceOptimizer.setYear(year + "");
+            performanceOptimizer.setRealname(userDto2.getRealname());
+            performanceOptimizer.setTotalCost(royalty);
+            performanceOptimizer.setTotalRoyalty(royalty.multiply(new BigDecimal("0.2")));
+            performanceOptimizer.setUserId(userDto2.getUserId());
+            performanceOptimizerMapper.insert(performanceOptimizer);
+        }
+    }
+
+    //TODO 头条运营leader绩效计算
+    public void toutiaoYunyingLeaderQuarterPerformance(Integer year, Integer quarter) {
+        Integer mediaType = 1;
+        //获取快手组下所有运营组长信息列表
+        List<UserDto2> yunyingLeaderList = userEfficientVideoMapMapper.getToutiaoYunyingLeaderUserInfo();
+        for (UserDto2 userDto2 : yunyingLeaderList) {
+            BigDecimal royalty = BigDecimal.ZERO;
+            List<UserDto2> userList = userEfficientVideoMapMapper.getYunyingLeaderMember(userDto2.getDepId());
+
+            for (UserDto2 user : userList) {
+                //增加判断:如果项目成员中包含自己的话,不将自己的消耗计算在内
+                if (user.getUserId().equals(userDto2.getUserId())) {
+                    continue;
+                }
+                BigDecimal userRoality = userEfficientVideoMapMapper.getYunyingRoyalty(user.getUserId(), year, quarter);
+                if (userRoality == null) {
+                    userRoality = BigDecimal.ZERO;
+                }
+                royalty = royalty.add(userRoality);
+            }
+            //运营leader绩效数据入库
+            PerformanceOptimizer performanceOptimizer = new PerformanceOptimizer();
+            performanceOptimizer.setAppType(mediaType);
+            performanceOptimizer.setQuarter(quarter + "");
+            performanceOptimizer.setYear(year + "");
+            performanceOptimizer.setRealname(userDto2.getRealname());
+            performanceOptimizer.setTotalCost(royalty);
+            performanceOptimizer.setTotalRoyalty(royalty.multiply(new BigDecimal("0.2")));
+            performanceOptimizer.setUserId(userDto2.getUserId());
+            performanceOptimizerMapper.insert(performanceOptimizer);
+        }
+
+    }
 
 
     private List<OptimizerCostDetailVO> getOptimizerTotalCostDetailGroupByUserId(String mediaType, String userId, Integer year, Integer quarter, String startDate, String endDate) {

+ 253 - 0
performance-appraisal/src/main/java/cn/com/ctop/planeprojectcost/controller/PlaneProjectCostController.java

@@ -0,0 +1,253 @@
+package cn.com.ctop.planeprojectcost.controller;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.net.URLDecoder;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.common.system.query.QueryGenerator;
+import org.jeecg.common.aspect.annotation.AutoLog;
+import org.jeecg.common.util.oConvertUtils;
+import cn.com.ctop.planeprojectcost.entity.PlaneProjectCost;
+import cn.com.ctop.planeprojectcost.service.IPlaneProjectCostService;
+
+import java.util.Date;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import lombok.extern.slf4j.Slf4j;
+
+import org.jeecgframework.poi.excel.ExcelImportUtil;
+import org.jeecgframework.poi.excel.def.NormalExcelConstants;
+import org.jeecgframework.poi.excel.entity.ExportParams;
+import org.jeecgframework.poi.excel.entity.ImportParams;
+import org.jeecgframework.poi.excel.view.JeecgEntityExcelView;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.multipart.MultipartHttpServletRequest;
+import org.springframework.web.servlet.ModelAndView;
+import com.alibaba.fastjson.JSON;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+
+/**
+ * 平面设计项目消耗表
+ *
+ * @author jeecg-boot
+ * @version V1.0
+ * @date 2019-12-28
+ */
+@Slf4j
+@Api(tags = "平面设计项目消耗表")
+@RestController
+@RequestMapping("/planeprojectcost/planeProjectCost")
+public class PlaneProjectCostController {
+    @Autowired
+    private IPlaneProjectCostService planeProjectCostService;
+
+    /**
+     * 分页列表查询
+     *
+     * @param planeProjectCost
+     * @param pageNo
+     * @param pageSize
+     * @param req
+     * @return
+     */
+    @AutoLog(value = "平面设计项目消耗表-分页列表查询")
+    @ApiOperation(value = "平面设计项目消耗表-分页列表查询", notes = "平面设计项目消耗表-分页列表查询")
+    @GetMapping(value = "/list")
+    public Result<IPage<PlaneProjectCost>> queryPageList(PlaneProjectCost planeProjectCost,
+                                                         @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
+                                                         @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
+                                                         HttpServletRequest req) {
+        Result<IPage<PlaneProjectCost>> result = new Result<IPage<PlaneProjectCost>>();
+        QueryWrapper<PlaneProjectCost> queryWrapper = QueryGenerator.initQueryWrapper(planeProjectCost, req.getParameterMap());
+        Page<PlaneProjectCost> page = new Page<PlaneProjectCost>(pageNo, pageSize);
+        IPage<PlaneProjectCost> pageList = planeProjectCostService.page(page, queryWrapper);
+        result.setSuccess(true);
+        result.setResult(pageList);
+        return result;
+    }
+
+    /**
+     * 添加
+     *
+     * @param planeProjectCost
+     * @return
+     */
+    @AutoLog(value = "平面设计项目消耗表-添加")
+    @ApiOperation(value = "平面设计项目消耗表-添加", notes = "平面设计项目消耗表-添加")
+    @PostMapping(value = "/add")
+    public Result<PlaneProjectCost> add(@RequestBody PlaneProjectCost planeProjectCost) {
+        Result<PlaneProjectCost> result = new Result<PlaneProjectCost>();
+        try {
+            planeProjectCostService.save(planeProjectCost);
+            result.success("添加成功!");
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+            result.error500("操作失败");
+        }
+        return result;
+    }
+
+    /**
+     * 编辑
+     *
+     * @param planeProjectCost
+     * @return
+     */
+    @AutoLog(value = "平面设计项目消耗表-编辑")
+    @ApiOperation(value = "平面设计项目消耗表-编辑", notes = "平面设计项目消耗表-编辑")
+    @PutMapping(value = "/edit")
+    public Result<PlaneProjectCost> edit(@RequestBody PlaneProjectCost planeProjectCost) {
+        Result<PlaneProjectCost> result = new Result<PlaneProjectCost>();
+        PlaneProjectCost planeProjectCostEntity = planeProjectCostService.getById(planeProjectCost.getId());
+        if (planeProjectCostEntity == null) {
+            result.error500("未找到对应实体");
+        } else {
+            boolean ok = planeProjectCostService.updateById(planeProjectCost);
+            if (ok) {
+                result.success("修改成功!");
+            }
+        }
+
+        return result;
+    }
+
+    /**
+     * 通过id删除
+     *
+     * @param id
+     * @return
+     */
+    @AutoLog(value = "平面设计项目消耗表-通过id删除")
+    @ApiOperation(value = "平面设计项目消耗表-通过id删除", notes = "平面设计项目消耗表-通过id删除")
+    @DeleteMapping(value = "/delete")
+    public Result<?> delete(@RequestParam(name = "id", required = true) String id) {
+        try {
+            planeProjectCostService.removeById(id);
+        } catch (Exception e) {
+            log.error("删除失败", e.getMessage());
+            return Result.error("删除失败!");
+        }
+        return Result.ok("删除成功!");
+    }
+
+    /**
+     * 批量删除
+     *
+     * @param ids
+     * @return
+     */
+    @AutoLog(value = "平面设计项目消耗表-批量删除")
+    @ApiOperation(value = "平面设计项目消耗表-批量删除", notes = "平面设计项目消耗表-批量删除")
+    @DeleteMapping(value = "/deleteBatch")
+    public Result<PlaneProjectCost> deleteBatch(@RequestParam(name = "ids", required = true) String ids) {
+        Result<PlaneProjectCost> result = new Result<PlaneProjectCost>();
+        if (ids == null || "".equals(ids.trim())) {
+            result.error500("参数不识别!");
+        } else {
+            this.planeProjectCostService.removeByIds(Arrays.asList(ids.split(",")));
+            result.success("删除成功!");
+        }
+        return result;
+    }
+
+    /**
+     * 通过id查询
+     *
+     * @param id
+     * @return
+     */
+    @AutoLog(value = "平面设计项目消耗表-通过id查询")
+    @ApiOperation(value = "平面设计项目消耗表-通过id查询", notes = "平面设计项目消耗表-通过id查询")
+    @GetMapping(value = "/queryById")
+    public Result<PlaneProjectCost> queryById(@RequestParam(name = "id", required = true) String id) {
+        Result<PlaneProjectCost> result = new Result<PlaneProjectCost>();
+        PlaneProjectCost planeProjectCost = planeProjectCostService.getById(id);
+        if (planeProjectCost == null) {
+            result.error500("未找到对应实体");
+        } else {
+            result.setResult(planeProjectCost);
+            result.setSuccess(true);
+        }
+        return result;
+    }
+
+    /**
+     * 导出excel
+     *
+     * @param request
+     * @param response
+     */
+    @RequestMapping(value = "/exportXls")
+    public ModelAndView exportXls(HttpServletRequest request, HttpServletResponse response) {
+        // Step.1 组装查询条件
+        QueryWrapper<PlaneProjectCost> queryWrapper = null;
+        try {
+            String paramsStr = request.getParameter("paramsStr");
+            if (oConvertUtils.isNotEmpty(paramsStr)) {
+                String deString = URLDecoder.decode(paramsStr, "UTF-8");
+                PlaneProjectCost planeProjectCost = JSON.parseObject(deString, PlaneProjectCost.class);
+                queryWrapper = QueryGenerator.initQueryWrapper(planeProjectCost, request.getParameterMap());
+            }
+        } catch (UnsupportedEncodingException e) {
+            e.printStackTrace();
+        }
+
+        //Step.2 AutoPoi 导出Excel
+        ModelAndView mv = new ModelAndView(new JeecgEntityExcelView());
+        List<PlaneProjectCost> pageList = planeProjectCostService.list(queryWrapper);
+        //导出文件名称
+        mv.addObject(NormalExcelConstants.FILE_NAME, "平面设计项目消耗表列表");
+        mv.addObject(NormalExcelConstants.CLASS, PlaneProjectCost.class);
+        mv.addObject(NormalExcelConstants.PARAMS, new ExportParams("平面设计项目消耗表列表数据", "导出人:Jeecg", "导出信息"));
+        mv.addObject(NormalExcelConstants.DATA_LIST, pageList);
+        return mv;
+    }
+
+    /**
+     * 通过excel导入数据
+     *
+     * @param request
+     * @param response
+     * @return
+     */
+    @RequestMapping(value = "/importExcel", method = RequestMethod.POST)
+    public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {
+        MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
+        Map<String, MultipartFile> fileMap = multipartRequest.getFileMap();
+        for (Map.Entry<String, MultipartFile> entity : fileMap.entrySet()) {
+            MultipartFile file = entity.getValue();
+            ImportParams params = new ImportParams();
+            params.setTitleRows(2);
+            params.setHeadRows(1);
+            params.setNeedSave(true);
+            try {
+                List<PlaneProjectCost> listPlaneProjectCosts = ExcelImportUtil.importExcel(file.getInputStream(), PlaneProjectCost.class, params);
+                planeProjectCostService.saveBatch(listPlaneProjectCosts);
+                return Result.ok("文件导入成功!数据行数:" + listPlaneProjectCosts.size());
+            } catch (Exception e) {
+                log.error(e.getMessage(), e);
+                return Result.error("文件导入失败:" + e.getMessage());
+            } finally {
+                try {
+                    file.getInputStream().close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+        return Result.ok("文件导入失败!");
+    }
+
+}

+ 100 - 0
performance-appraisal/src/main/java/cn/com/ctop/planeprojectcost/entity/PlaneProjectCost.java

@@ -0,0 +1,100 @@
+package cn.com.ctop.planeprojectcost.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.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 平面设计项目消耗表
+ *
+ * @author jeecg-boot
+ * @version V1.0
+ * @date 2019-12-28
+ */
+@Data
+@TableName("ctop_plane_project_cost")
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value = "ctop_plane_project_cost对象", description = "平面设计项目消耗表")
+public class PlaneProjectCost {
+
+    /**
+     * id
+     */
+    @TableId(type = IdType.AUTO)
+    @ApiModelProperty(value = "id")
+    private Integer id;
+    /**
+     * ctop_project的id
+     */
+    @Excel(name = "ctop_project的id", width = 15)
+    @ApiModelProperty(value = "ctop_project的id")
+    private Long projectId;
+    /**
+     * sys_user的id
+     */
+    @Excel(name = "sys_user的id", width = 15)
+    @ApiModelProperty(value = "sys_user的id")
+    private String userId;
+    /**
+     * 项目消耗
+     */
+    @Excel(name = "项目消耗", width = 15)
+    @ApiModelProperty(value = "项目消耗")
+    private BigDecimal projectCost;
+    /**
+     * 1_头条2_快手
+     */
+    @Excel(name = "1_头条2_快手", width = 15)
+    @ApiModelProperty(value = "1_头条2_快手")
+    private Integer appType;
+    /**
+     * 项目总消耗
+     */
+    @Excel(name = "项目总消耗", width = 15)
+    @ApiModelProperty(value = "项目总消耗")
+    private BigDecimal projectTotalCost;
+    /**
+     * 所属年
+     */
+    @Excel(name = "所属年", width = 15)
+    @ApiModelProperty(value = "所属年")
+    private Integer year;
+    /**
+     * 所属季度
+     */
+    @Excel(name = "所属季度", width = 15)
+    @ApiModelProperty(value = "所属季度")
+    private Integer quarter;
+    /**
+     * createTime
+     */
+    @ApiModelProperty(value = "createTime")
+    private Date createTime;
+    /**
+     * updateTime
+     */
+    @ApiModelProperty(value = "updateTime")
+    private Date updateTime;
+    /**
+     * projectPerformance
+     */
+    @ApiModelProperty(value = "projectPerformance")
+    private BigDecimal projectPerformance;
+    /**
+     * projectPlaneCount
+     */
+    @ApiModelProperty(value = "projectPlaneCount")
+    private Integer projectPlaneCount;
+
+    private Integer type;
+}

+ 18 - 0
performance-appraisal/src/main/java/cn/com/ctop/planeprojectcost/mapper/PlaneProjectCostMapper.java

@@ -0,0 +1,18 @@
+package cn.com.ctop.planeprojectcost.mapper;
+
+import java.util.List;
+
+import org.apache.ibatis.annotations.Param;
+import cn.com.ctop.planeprojectcost.entity.PlaneProjectCost;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * 平面设计项目消耗表
+ *
+ * @author: jeecg-boot
+ * @date: 2019-12-28
+ * @cersion: V1.0
+ */
+public interface PlaneProjectCostMapper extends BaseMapper<PlaneProjectCost> {
+
+}

+ 5 - 0
performance-appraisal/src/main/java/cn/com/ctop/planeprojectcost/mapper/xml/PlaneProjectCostMapper.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.planeprojectcost.mapper.PlaneProjectCostMapper">
+
+</mapper>

+ 0 - 0
performance-appraisal/src/main/java/cn/com/ctop/planeprojectcost/service/IPlaneProjectCostService.java


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