Ver código fonte

Merge remote-tracking branch 'remotes/ctop/master' into test_performance2

# Conflicts:
#	jeecg-boot-module-system/src/test/java/org/jeecg/SampleTest.java
#	module-common/src/main/java/cn/com/ctop/common/module/utils/CtopAdConstant.java
#	module-report/src/main/java/cn/com/ctop/bytedance/controller/ReportController.java
#	module-report/src/main/java/cn/com/ctop/bytedance/service/IReportService.java
#	module-report/src/main/java/cn/com/ctop/bytedance/service/impl/ReportServiceImpl.java
hcst_sunzhen 5 anos atrás
pai
commit
2503a293c9
100 arquivos alterados com 4522 adições e 2616 exclusões
  1. 9 3
      jeecg-boot-module-system/pom.xml
  2. 5 3
      jeecg-boot-module-system/src/main/java/org/jeecg/JeecgOneGui.java
  3. 1 0
      jeecg-boot-module-system/src/main/java/org/jeecg/config/ShiroConfig.java
  4. 41 80
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/controller/AdvertiserController.java
  5. 7 21
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/controller/ByteDanceAdvertiserPostController.java
  6. 248 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/controller/KuaiShouDefectMaterialController.java
  7. 13 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/controller/MaterialAscriptionController.java
  8. 47 2
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/controller/MaterialImageInfoController.java
  9. 1 1
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/controller/MaterialInfoController.java
  10. 2 2
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/controller/ProjectController.java
  11. 1 2
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/controller/ProjectMemberController.java
  12. 131 230
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/controller/TestController.java
  13. 10 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/controller/VideoModelController.java
  14. 92 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/entity/KuaiShouDefectMaterial.java
  15. 4 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/entity/SalePerformanceDetail.java
  16. 2 2
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/job/BakDataBaseJob.java
  17. 6 6
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/job/BytedanceAdvertiserHourlyReportLoadJob.java
  18. 6 6
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/job/BytedanceCreativeHourlyReportLoadJob.java
  19. 5 5
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/job/BytedancePlanHourlyReportLoadJob.java
  20. 0 40
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/job/DeleteCreativeStaticJob.java
  21. 3 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/job/KuaishouCceDataJob.java
  22. 0 2
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/job/KuaishouDailyAccountReportLoadJob.java
  23. 0 4
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/job/KuaishouDailyCampaignReportLoadJob.java
  24. 0 3
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/job/KuaishouDailyCreativeReportLoadJob.java
  25. 0 3
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/job/KuaishouDailyGroupReportLoadJob.java
  26. 0 4
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/job/KuaishouHourlyCreativeReportLoadJob.java
  27. 10 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/mapper/AdvertiserMapper.java
  28. 15 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/mapper/KuaiShouDefectMaterialMapper.java
  29. 104 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/mapper/xml/AdvertiserMapper.xml
  30. 5 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/mapper/xml/KuaiShouDefectMaterialMapper.xml
  31. 7 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/service/IAdvertiserService.java
  32. 16 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/service/IKuaiShouDefectMaterialService.java
  33. 90 1
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/service/impl/AdvertiserServiceImpl.java
  34. 0 1
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/service/impl/BidWarningServiceImpl.java
  35. 90 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/service/impl/KuaiShouDefectMaterialServiceImpl.java
  36. 52 41
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/service/impl/PerformanceSaleServiceImpl.java
  37. 4 6
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/vo/SheetInfoVo.java
  38. 0 141
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/demo/opencv/FFmpegUtils.java
  39. 0 72
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/demo/opencv/Test.java
  40. 0 87
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/demo/opencv/VideoProcessing.java
  41. 67 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/excelutil/entity/YdMaterialWeekEntity.java
  42. 207 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/excelutil/entity/YdPlanAggregateEntity.java
  43. 64 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/excelutil/entity/YdWeekAggregateEntity.java
  44. 164 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/opencv/controller/ModelVideoCompositeInfoController.java
  45. 178 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/opencv/controller/ModelVideoInfoConfigController.java
  46. 180 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/opencv/controller/ModelVideoInfoController.java
  47. 248 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/opencv/controller/ModelVideoInfoTagController.java
  48. 77 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/opencv/entity/ModelVideoCompositeInfo.java
  49. 76 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/opencv/entity/ModelVideoInfo.java
  50. 117 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/opencv/entity/ModelVideoInfoConfig.java
  51. 73 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/opencv/entity/ModelVideoInfoTag.java
  52. 15 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/opencv/mapper/ModelVideoCompositeInfoMapper.java
  53. 15 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/opencv/mapper/ModelVideoInfoConfigMapper.java
  54. 15 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/opencv/mapper/ModelVideoInfoMapper.java
  55. 15 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/opencv/mapper/ModelVideoInfoTagMapper.java
  56. 5 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/opencv/mapper/xml/ModelVideoCompositeInfoMapper.xml
  57. 5 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/opencv/mapper/xml/ModelVideoInfoConfigMapper.xml
  58. 5 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/opencv/mapper/xml/ModelVideoInfoMapper.xml
  59. 5 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/opencv/mapper/xml/ModelVideoInfoTagMapper.xml
  60. 19 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/opencv/service/IFfmpegService.java
  61. 15 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/opencv/service/IModelVideoCompositeInfoService.java
  62. 16 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/opencv/service/IModelVideoInfoConfigService.java
  63. 15 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/opencv/service/IModelVideoInfoService.java
  64. 15 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/opencv/service/IModelVideoInfoTagService.java
  65. 433 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/opencv/service/impl/FfmpegServiceImpl.java
  66. 19 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/opencv/service/impl/ModelVideoCompositeInfoServiceImpl.java
  67. 27 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/opencv/service/impl/ModelVideoInfoConfigServiceImpl.java
  68. 19 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/opencv/service/impl/ModelVideoInfoServiceImpl.java
  69. 19 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/opencv/service/impl/ModelVideoInfoTagServiceImpl.java
  70. 282 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/opencv/utils/Avutils.java
  71. 179 38
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/demo/opencv/CornerCheck.java
  72. 126 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/opencv/utils/ImageUtils.java
  73. 6 14
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/demo/opencv/Perspective.java
  74. 79 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/opencv/utils/Test.java
  75. 101 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/opencv/utils/VideoProcessing.java
  76. 4 0
      jeecg-boot-module-system/src/main/resources/application-dev.yml
  77. 3 0
      jeecg-boot-module-system/src/main/resources/application-prod.yml
  78. 145 20
      jeecg-boot-module-system/src/test/java/org/jeecg/SampleTest.java
  79. 10 4
      module-common/src/main/java/cn/com/ctop/common/module/mapper/xml/MailLogMapper.xml
  80. 1 1
      module-common/src/main/java/cn/com/ctop/common/module/service/IUserAllocationService.java
  81. 4 1
      module-common/src/main/java/cn/com/ctop/common/module/service/impl/CtopOauthTokenServiceImpl.java
  82. 4 2
      module-common/src/main/java/cn/com/ctop/common/module/service/impl/UserAllocationServiceImpl.java
  83. 19 3
      module-common/src/main/java/cn/com/ctop/common/module/utils/CtopAdConstant.java
  84. 6 0
      module-common/src/main/java/cn/com/ctop/common/module/utils/LoadFileUtil.java
  85. 72 42
      module-common/src/main/java/cn/com/ctop/common/module/utils/OSSUtils.java
  86. 2 1
      module-common/src/main/java/cn/com/ctop/common/module/utils/StatusCode.java
  87. 1 1
      module-common/src/main/resources/config.properties
  88. 2 61
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/batch/controller/KuaiShouController.java
  89. 0 91
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/batch/controller/KuaiShouReportController.java
  90. 0 249
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/batch/controller/KuaishouReportHourlyCreativeStatisticController.java
  91. 181 68
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/batch/service/IKuaishouInterfaceService.java
  92. 2 2
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/batch/service/impl/KuaiShouUpdateServiceImpl.java
  93. 118 1009
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/batch/service/impl/KuaishouInterfaceServiceImpl.java
  94. 5 0
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/report/mapper/KuaishouReportDailyCreativeMapper.java
  95. 0 18
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/report/mapper/KuaishouReportHourlyCreativeStatisticMapper.java
  96. 15 0
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/report/mapper/xml/KuaishouReportDailyCreativeMapper.xml
  97. 0 157
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/report/mapper/xml/KuaishouReportHourlyCreativeStatisticMapper.xml
  98. 0 22
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/report/service/IKuaishouReportHourlyCreativeStatisticService.java
  99. 0 44
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/report/service/impl/KuaishouReportHourlyCreativeStatisticServiceImpl.java
  100. 0 0
      module-kuaishou/src/main/resources/kuaishou_config.properties

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

@@ -175,10 +175,16 @@
             <version>3.17</version>
         </dependency>-->
         <!--<dependency>
-            <groupId>cn.com.ctop</groupId>
-            <artifactId>moudule-opencv</artifactId>
-            <version>4.20.0</version>
+            <groupId>com.test</groupId>
+            <artifactId>opencv</artifactId>
+            <scope>system</scope>
+            <systemPath>${basedir}/docs/opencv-420.jar</systemPath>
         </dependency>-->
+        <dependency>
+            <groupId>cn.com.ctop</groupId>
+            <artifactId>opencv</artifactId>
+            <version>4.2.0</version>
+        </dependency>
     </dependencies>
 
     <dependencyManagement>

+ 5 - 3
jeecg-boot-module-system/src/main/java/org/jeecg/JeecgOneGui.java

@@ -10,9 +10,11 @@ import org.jeecgframework.codegenerate.window.CodeWindow;
  */
 public class JeecgOneGui {
 
-	/** 详细使用手册: http://jeecg-boot.mydoc.io/?t=338140 */
+    /**
+     * 详细使用手册: http://jeecg-boot.mydoc.io/?t=338140
+     */
     public static void main(String[] args) {
-    	new CodeWindow().pack();
-	}
+        new CodeWindow().pack();
+    }
 
 }

+ 1 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/config/ShiroConfig.java

@@ -147,6 +147,7 @@ public class ShiroConfig {
 		filterChainDefinitionMap.put("/graphql/video", "anon");
 		filterChainDefinitionMap.put("/ks/web/test", "anon");
         filterChainDefinitionMap.put("/ureport/**", "anon");
+        filterChainDefinitionMap.put("/ctop/advertiser/**", "anon");
 
 		// 添加自己的过滤器并且取名为jwt
 		Map<String, Filter> filterMap = new HashMap<String, Filter>(1);

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

@@ -10,7 +10,6 @@ import cn.com.ctop.common.module.utils.StringUtils;
 import com.alibaba.excel.EasyExcelFactory;
 import com.alibaba.excel.ExcelWriter;
 import com.alibaba.excel.metadata.Sheet;
-import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -22,7 +21,6 @@ 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.jeecg.modules.ctop.entity.Advertiser;
 import org.jeecg.modules.ctop.entity.Project;
 import org.jeecg.modules.ctop.mapper.ProjectMapper;
@@ -37,23 +35,13 @@ import org.jeecg.modules.system.entity.UserCompany;
 import org.jeecg.modules.system.mapper.UserCompanyMapper;
 import org.jeecg.modules.system.service.ISysCategoryService;
 import org.jeecg.modules.system.service.ISysUserService;
-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.OutputStream;
 import java.io.UnsupportedEncodingException;
-import java.net.URLDecoder;
 import java.util.*;
 
 /**
@@ -134,7 +122,7 @@ public class AdvertiserController {
         Result<IPage<Advertiser>> result = new Result<IPage<Advertiser>>();
         String roleCode = materialReportMapper.getRoleCodeByUserId(advertiser.getUserId());
         String userId = advertiser.getUserId();
-        if ("admin".equals(roleCode) || "kuaishouOperationManager".equals(roleCode) || "touTiaoOperationManager".equals(roleCode)) {
+        if ("admin".equals(roleCode) || "kuaishouOperationManager".equals(roleCode) || "touTiaoOperationManager".equals(roleCode) || "sale".equals(roleCode) || "saleDirector".equals(roleCode)) {
             advertiser.setUserId(null);
         }
         QueryWrapper<Advertiser> queryWrapper = QueryGenerator.initQueryWrapper(advertiser, req.getParameterMap());
@@ -331,77 +319,50 @@ public class AdvertiserController {
     }
 
     /**
-     * 导出excel
+     * 导出伊对报表
      *
-     * @param request
-     * @param response
+     * @return
      */
-    @RequestMapping(value = "/exportXls")
-    public ModelAndView exportXls(HttpServletRequest request, HttpServletResponse response) {
-        // Step.1 组装查询条件
-        QueryWrapper<Advertiser> queryWrapper = null;
-        try {
-            String paramsStr = request.getParameter("paramsStr");
-            if (oConvertUtils.isNotEmpty(paramsStr)) {
-                String deString = URLDecoder.decode(paramsStr, "UTF-8");
-                Advertiser advertiser = JSON.parseObject(deString, Advertiser.class);
-                queryWrapper = QueryGenerator.initQueryWrapper(advertiser, request.getParameterMap());
-            }
-        } catch (UnsupportedEncodingException e) {
-            e.printStackTrace();
-        }
-
-        //Step.2 AutoPoi 导出Excel
-        ModelAndView mv = new ModelAndView(new JeecgEntityExcelView());
-        List<Advertiser> pageList = advertiserService.list(queryWrapper);
-        //导出文件名称
-        mv.addObject(NormalExcelConstants.FILE_NAME, "广告主信息表列表");
-        mv.addObject(NormalExcelConstants.CLASS, Advertiser.class);
-        mv.addObject(NormalExcelConstants.PARAMS, new ExportParams("广告主信息表列表数据", "导出人:Jeecg", "导出信息"));
-        mv.addObject(NormalExcelConstants.DATA_LIST, pageList);
-        return mv;
+    @RequestMapping(value = "/ydWeekReportList")
+    public Map<String, Object> ydReportList(HttpServletRequest request, HttpServletResponse response, @RequestBody JSONObject data) throws Exception {
+        Map<String, Object> result = new HashMap<>();
+        Long projectId = data.getLong("projectId");
+        String startDate = data.getString("startDate");
+        String endDate = data.getString("endDate");
+        List<SheetInfoVo> vos = advertiserService.getYdStatisticInfo(projectId, startDate, endDate);
+        result.put("data", vos);
+        ResultMapUtils.setResultMap(result, StatusCode.COMMON_SUCCESS);
+        return result;
     }
 
     /**
-     * 通过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<Advertiser> listAdvertisers = ExcelImportUtil.importExcel(file.getInputStream(), Advertiser.class, params);
-                for (Advertiser advertiserExcel : listAdvertisers) {
-                    advertiserService.save(advertiserExcel);
-                }
-                return Result.ok("文件导入成功!数据行数:" + listAdvertisers.size());
-            } catch (Exception e) {
-                log.error(e.getMessage(), e);
-                return Result.error("文件导入失败:" + e.getMessage());
-            } finally {
-                try {
-                    file.getInputStream().close();
-                } catch (IOException e) {
-                    e.printStackTrace();
-                }
-            }
+    @RequestMapping(value = "/exportYdDailyReport")
+    @ResponseBody
+    public void exportYdWeek(HttpServletRequest request, HttpServletResponse response, @RequestBody JSONObject data) throws Exception {
+        Map<String, Object> result = new HashMap<>();
+        Long projectId = data.getLong("projectId");
+        String startDate = data.getString("startDate");
+        String endDate = data.getString("endDate");
+        List<SheetInfoVo> vos = advertiserService.getYdStatisticInfo(projectId, startDate, endDate);
+        OutputStream outputStream = response.getOutputStream();
+        this.setResponseHeader(response, "伊对" + startDate + "至" + endDate + "周报.xls");
+        ExcelWriter excelWriter = EasyExcelFactory.getWriter(outputStream);
+        for (int i = 0; i < vos.size(); i++) {
+            Sheet sheet = new Sheet(i + 1, 0, KuaishouXxlEntity.class);
+            sheet.setSheetName(vos.get(i).getSheetName());
+            excelWriter.write(vos.get(i).getDetails(), sheet);
         }
-        return Result.ok("文件导入失败!");
+        excelWriter.finish();
+        outputStream.flush();
+        outputStream.close();
     }
 
     /**
-     * 导出报表
+     * 导出消消乐报表
      *
      * @return
      */
@@ -418,10 +379,10 @@ public class AdvertiserController {
         }
         SheetInfoVo totalSheetVo = advertiserService.getXxlStatisticInfo(projectId, systemType, null, "汇总表");
         sheets.add(totalSheetVo);
-        if(null == systemType){
-            List<SheetInfoVo>vos = advertiserService.getSystemTypeXxlStatisticInfo(projectId);
-            if(null!=vos&&vos.size()>0){
-                for(SheetInfoVo vo:vos){
+        if (null == systemType) {
+            List<SheetInfoVo> vos = advertiserService.getSystemTypeXxlStatisticInfo(projectId);
+            if (null != vos && vos.size() > 0) {
+                for (SheetInfoVo vo : vos) {
                     sheets.add(vo);
                 }
             }
@@ -453,10 +414,10 @@ public class AdvertiserController {
         //查询总的消耗信息
         SheetInfoVo totalSheetVo = advertiserService.getXxlStatisticInfo(projectId, systemType, null, "汇总表");
         sheets.add(totalSheetVo);
-        if(null == systemType){
-            List<SheetInfoVo>vos = advertiserService.getSystemTypeXxlStatisticInfo(projectId);
-            if(null!=vos&&vos.size()>0){
-                for(SheetInfoVo vo:vos){
+        if (null == systemType) {
+            List<SheetInfoVo> vos = advertiserService.getSystemTypeXxlStatisticInfo(projectId);
+            if (null != vos && vos.size() > 0) {
+                for (SheetInfoVo vo : vos) {
                     sheets.add(vo);
                 }
             }

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

@@ -28,7 +28,6 @@ import org.springframework.web.bind.annotation.*;
 import javax.servlet.http.HttpServletRequest;
 import java.text.ParseException;
 import java.util.HashMap;
-import java.util.List;
 import java.util.Map;
 
 /**
@@ -53,6 +52,7 @@ public class ByteDanceAdvertiserPostController {
 
     /**
      * 1:获取广告主信息
+     *
      * @param accountId 本平台广告主id
      */
     @RequestMapping("/advertiser/info")
@@ -110,6 +110,7 @@ public class ByteDanceAdvertiserPostController {
 
     /**
      * 6:获取广告主广告预算信息
+     *
      * @param accountId 本平台广告主id
      */
     @RequestMapping("/advertiser/budget/get/")
@@ -119,6 +120,7 @@ public class ByteDanceAdvertiserPostController {
 
     /**
      * 7:获取广告主广告组信息
+     *
      * @param accountId 本平台广告主id
      */
     @RequestMapping("/advertiser/campaign/get")
@@ -138,6 +140,7 @@ public class ByteDanceAdvertiserPostController {
 
     /**
      * 8:获取广告主广告创意信息
+     *
      * @param accountId 本平台广告主id
      */
     @RequestMapping("/advertiser/creative/get")
@@ -147,6 +150,7 @@ public class ByteDanceAdvertiserPostController {
 
     /**
      * 9:修改广告创意信息状态
+     *
      * @param accountId 本平台广告主id
      */
     @RequestMapping("/advertiser/update/status/")
@@ -156,7 +160,8 @@ public class ByteDanceAdvertiserPostController {
 
     /**
      * 10:获取广告主广告创意素材信息
-     * @param accountId 本平台广告主id
+     *
+     * @param accountId   本平台广告主id
      * @param creativeIds 广告创意id
      */
     @RequestMapping("/advertiser/creative/material/read")
@@ -263,14 +268,6 @@ public class ByteDanceAdvertiserPostController {
         return result;
     }
 
-    @GetMapping("loadAllData")
-    public Map<String, Object> loadAllData() {
-        Map<String, Object> result = new HashMap<>();
-        List<CtopOauthToken> kuaishouTokens = tokenService.getTokenListByType(CtopAdConstant.PLATFORM_TYPE_KUAISHOU);
-        kuaishouInterfaceService.loadAllKuaishouData(kuaishouTokens);
-        ResultMapUtils.setResultMap(result, StatusCode.COMMON_SUCCESS.getCode());
-        return result;
-    }
 
     @GetMapping("loadSingleData")
     public Map<String, Object> loadSingleData(Long accountId) {
@@ -289,17 +286,6 @@ public class ByteDanceAdvertiserPostController {
         return result;
     }
 
-    @GetMapping("loadData")
-    public Map<String, Object> loadData() {
-        Map<String, Object> result = new HashMap<>();
-        try {
-            kuaishouInterfaceService.loadData();
-        } catch (InterruptedException e) {
-            e.printStackTrace();
-        }
-        ResultMapUtils.setResultMap(result, StatusCode.COMMON_SUCCESS.getCode());
-        return result;
-    }
 
     @Autowired
     private ICtopOauthTokenService tokenService;

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

@@ -0,0 +1,248 @@
+package org.jeecg.modules.ctop.controller;
+
+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.jeecg.modules.ctop.entity.KuaiShouDefectMaterial;
+import org.jeecg.modules.ctop.service.IKuaiShouDefectMaterialService;
+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-04-15
+ */
+@Slf4j
+@Api(tags = "快手缺失素材")
+@RestController
+@RequestMapping("/ctop/kuaiShouDefectMaterial")
+public class KuaiShouDefectMaterialController {
+    @Autowired
+    private IKuaiShouDefectMaterialService kuaiShouDefectMaterialService;
+
+    /**
+     * 分页列表查询
+     *
+     * @param kuaiShouDefectMaterial
+     * @param pageNo
+     * @param pageSize
+     * @param req
+     * @return
+     */
+    @AutoLog(value = "快手缺失素材-分页列表查询")
+    @ApiOperation(value = "快手缺失素材-分页列表查询", notes = "快手缺失素材-分页列表查询")
+    @GetMapping(value = "/list")
+    public Result<IPage<KuaiShouDefectMaterial>> queryPageList(KuaiShouDefectMaterial kuaiShouDefectMaterial,
+                                                               @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
+                                                               @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
+                                                               HttpServletRequest req) {
+        Result<IPage<KuaiShouDefectMaterial>> result = new Result<IPage<KuaiShouDefectMaterial>>();
+        QueryWrapper<KuaiShouDefectMaterial> queryWrapper = QueryGenerator.initQueryWrapper(kuaiShouDefectMaterial, req.getParameterMap());
+        Page<KuaiShouDefectMaterial> page = new Page<KuaiShouDefectMaterial>(pageNo, pageSize);
+        IPage<KuaiShouDefectMaterial> pageList = kuaiShouDefectMaterialService.page(page, queryWrapper);
+        result.setSuccess(true);
+        result.setResult(pageList);
+        return result;
+    }
+
+    /**
+     * 添加
+     *
+     * @param kuaiShouDefectMaterial
+     * @return
+     */
+    @AutoLog(value = "快手缺失素材-添加")
+    @ApiOperation(value = "快手缺失素材-添加", notes = "快手缺失素材-添加")
+    @PostMapping(value = "/add")
+    public Result<KuaiShouDefectMaterial> add(@RequestBody KuaiShouDefectMaterial kuaiShouDefectMaterial) {
+        Result<KuaiShouDefectMaterial> result = new Result<KuaiShouDefectMaterial>();
+        try {
+            kuaiShouDefectMaterialService.save(kuaiShouDefectMaterial);
+            result.success("添加成功!");
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+            result.error500("操作失败");
+        }
+        return result;
+    }
+
+    /**
+     * 编辑
+     *
+     * @param kuaiShouDefectMaterial
+     * @return
+     */
+    @AutoLog(value = "快手缺失素材-编辑")
+    @ApiOperation(value = "快手缺失素材-编辑", notes = "快手缺失素材-编辑")
+    @PutMapping(value = "/edit")
+    public Result<KuaiShouDefectMaterial> edit(@RequestBody KuaiShouDefectMaterial kuaiShouDefectMaterial) {
+        Result<KuaiShouDefectMaterial> result = new Result<KuaiShouDefectMaterial>();
+        KuaiShouDefectMaterial kuaiShouDefectMaterialEntity = kuaiShouDefectMaterialService.getById(kuaiShouDefectMaterial.getId());
+        if (kuaiShouDefectMaterialEntity == null) {
+            result.error500("未找到对应实体");
+        } else {
+            boolean ok = kuaiShouDefectMaterialService.updateById(kuaiShouDefectMaterial);
+            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 {
+            kuaiShouDefectMaterialService.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<KuaiShouDefectMaterial> deleteBatch(@RequestParam(name = "ids", required = true) String ids) {
+        Result<KuaiShouDefectMaterial> result = new Result<KuaiShouDefectMaterial>();
+        if (ids == null || "".equals(ids.trim())) {
+            result.error500("参数不识别!");
+        } else {
+            this.kuaiShouDefectMaterialService.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<KuaiShouDefectMaterial> queryById(@RequestParam(name = "id", required = true) String id) {
+        Result<KuaiShouDefectMaterial> result = new Result<KuaiShouDefectMaterial>();
+        KuaiShouDefectMaterial kuaiShouDefectMaterial = kuaiShouDefectMaterialService.getById(id);
+        if (kuaiShouDefectMaterial == null) {
+            result.error500("未找到对应实体");
+        } else {
+            result.setResult(kuaiShouDefectMaterial);
+            result.setSuccess(true);
+        }
+        return result;
+    }
+
+    /**
+     * 导出excel
+     *
+     * @param request
+     * @param response
+     */
+    @RequestMapping(value = "/exportXls")
+    public ModelAndView exportXls(HttpServletRequest request, HttpServletResponse response) {
+        // Step.1 组装查询条件
+        QueryWrapper<KuaiShouDefectMaterial> queryWrapper = null;
+        try {
+            String paramsStr = request.getParameter("paramsStr");
+            if (oConvertUtils.isNotEmpty(paramsStr)) {
+                String deString = URLDecoder.decode(paramsStr, "UTF-8");
+                KuaiShouDefectMaterial kuaiShouDefectMaterial = JSON.parseObject(deString, KuaiShouDefectMaterial.class);
+                queryWrapper = QueryGenerator.initQueryWrapper(kuaiShouDefectMaterial, request.getParameterMap());
+            }
+        } catch (UnsupportedEncodingException e) {
+            e.printStackTrace();
+        }
+
+        //Step.2 AutoPoi 导出Excel
+        ModelAndView mv = new ModelAndView(new JeecgEntityExcelView());
+        List<KuaiShouDefectMaterial> pageList = kuaiShouDefectMaterialService.list(queryWrapper);
+        //导出文件名称
+        mv.addObject(NormalExcelConstants.FILE_NAME, "快手缺失素材列表");
+        mv.addObject(NormalExcelConstants.CLASS, KuaiShouDefectMaterial.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<KuaiShouDefectMaterial> listKuaiShouDefectMaterials = ExcelImportUtil.importExcel(file.getInputStream(), KuaiShouDefectMaterial.class, params);
+                kuaiShouDefectMaterialService.saveBatch(listKuaiShouDefectMaterials);
+                return Result.ok("文件导入成功!数据行数:" + listKuaiShouDefectMaterials.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("文件导入失败!");
+    }
+
+}

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

@@ -118,6 +118,19 @@ public class MaterialAscriptionController {
         return result;
     }
 
+    @PutMapping(value = "/update")
+    public Result<MaterialAscription> update(@RequestBody MaterialAscription materialAscription) {
+        Result<MaterialAscription> result = new Result<>();
+        QueryWrapper<MaterialAscription> ascriptionQueryWrapper = new QueryWrapper<>();
+        ascriptionQueryWrapper.eq("material_id", materialAscription.getMaterialId());
+        boolean ok = materialAscriptionService.update(materialAscription, ascriptionQueryWrapper);
+        if (ok) {
+            result.success("修改成功!");
+        }
+        return result;
+    }
+
+
     /**
      * 通过id删除
      *

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

@@ -20,7 +20,9 @@ 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.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;
@@ -37,6 +39,7 @@ import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
 import java.io.UnsupportedEncodingException;
 import java.net.URLDecoder;
+import java.text.ParseException;
 import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
@@ -59,6 +62,8 @@ public class MaterialImageInfoController {
     private IMaterialInfoService materialInfoService;
     @Autowired
     private MaterialInfoMapper materialInfoMapper;
+    @Autowired
+    private IProjectMemberService memberService;
 
 
     @ApiOperation(value = "截屏-分页列表查询", notes = "截屏-分页列表查询")
@@ -68,12 +73,52 @@ public class MaterialImageInfoController {
                                                      @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
                                                      HttpServletRequest req) {
         Result<IPage<MaterialImageInfo>> result = new Result<IPage<MaterialImageInfo>>();
-        QueryWrapper<MaterialImageInfo> queryWrapper = QueryGenerator.initQueryWrapper(materialImageInfo, req.getParameterMap());
-        Page<MaterialImageInfo> page = new Page<MaterialImageInfo>(pageNo, pageSize);
+
+
+        QueryWrapper<MaterialImageInfo> queryWrapper = new QueryWrapper<>();
+        Object createTime = materialImageInfo.getCreateTime();
+        materialImageInfo.setCreateTime(null);
+        if (!Check.isNull(materialImageInfo.getUserId())) {
+            String roleCode = materialInfoService.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)) {
+                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 {
+                queryWrapper = QueryGenerator.initQueryWrapper(materialImageInfo, req.getParameterMap());
+            }
+            if (!Check.isNull(createTime)) {
+                try {
+                    String dateString = DateUtils.getDateString(String.valueOf(createTime));
+                    Map<String, Object> map = DateUtils.getStartEndTime(dateString);
+                    queryWrapper.ge("create_time", map.get("start"));
+                    queryWrapper.lt("create_time", map.get("end"));
+                } catch (ParseException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+        Page<MaterialImageInfo> page = new Page<>(pageNo, pageSize);
         IPage<MaterialImageInfo> pageList = MaterialImageInfoService.page(page, queryWrapper);
+
+
         result.setSuccess(true);
         result.setResult(pageList);
         return result;
+
     }
 
 

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

@@ -177,7 +177,7 @@ public class MaterialInfoController {
         materialInfo.setCreateTime(null);
         if (!Check.isNull(materialInfo.getUserId())) {
             String roleCode = materialInfoService.getRoleCodeByUserId(materialInfo.getUserId());
-            if ("admin".equals(roleCode) || "operator".equals(roleCode) || "kuaishouOperationManager".equals(roleCode) || "operationAssistant".equals(roleCode) || "touTiaoOperationManager".equals(roleCode)) {
+            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());
             } else if ("designTeamLeader".equals(roleCode) || "planeLeader".equals(roleCode) || "plane".equals(roleCode) || "plan".equals(roleCode) || "shot".equals(roleCode)) {

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

@@ -118,7 +118,7 @@ public class ProjectController {
         String roleCode = materialReportMapper.getRoleCodeByUserId(userId);
         QueryWrapper<Project> queryWrapper = new QueryWrapper<>();
         List<Project> projects = new ArrayList<>();
-        if (!"admin".equals(roleCode)) {
+        if (!"admin".equals(roleCode) && !"sale".equals(roleCode) && !"saleDirector".equals(roleCode)) {
             if ("designTeamLeader".equals(roleCode) || "touTiaoOperationManager".equals(roleCode) || "kuaishouOperationManager".equals(roleCode) || "planeLeader".equals(roleCode)) {
                 QueryWrapper<ProjectMember> memberQueryWrapper = new QueryWrapper<>();
                 memberQueryWrapper.eq("user_id", userId);
@@ -198,7 +198,7 @@ public class ProjectController {
         }
 
         String roleCode = materialReportMapper.getRoleCodeByUserId(sysUser.getId());
-        if (!"admin".equals(roleCode)) {
+        if (!"admin".equals(roleCode) && "sale".equals(roleCode) && "saleDirector".equals(roleCode)) {
             queryWrapper.eq("user_id", sysUser.getId());
             queryWrapper.orderByDesc("create_time");
         }

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

@@ -106,9 +106,8 @@ public class ProjectMemberController {
         try {
             QueryWrapper<ProjectMember> queryWrapper = new QueryWrapper<>();
             String roleCode = materialReportMapper.getRoleCodeByUserId(userId);
-            if (!"admin".equals(roleCode)) {
+            if (!"admin".equals(roleCode) && !"sale".equals(roleCode) && !"saleDirector".equals(roleCode)) {
                 queryWrapper.eq("user_id", userId);
-
             }
             queryWrapper.groupBy("project_id");
             queryWrapper.orderByDesc("create_time");

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

@@ -13,18 +13,14 @@ 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.entity.KuaiShouCampaign;
 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.kuaishou.modules.report.mapper.KuaishouReportDailyCreativeMapper;
-import cn.com.ctop.kuaishou.modules.report.mapper.KuaishouReportDailyCreativeStatisticMapper;
 import cn.com.ctop.toutiao.service.IByteDanceAdvertiserDataService;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import lombok.SneakyThrows;
 import lombok.extern.slf4j.Slf4j;
 import org.jeecg.common.api.vo.Result;
 import org.jeecg.common.util.DateUtils;
@@ -90,7 +86,6 @@ public class TestController {
     private IKuaishouInterfaceService kuaishouInterfaceService;
 
 
-
     @GetMapping(value = "/getHistoryData")
     public String getHistoryData() {
         Result<String> result = new Result<String>();
@@ -99,19 +94,13 @@ public class TestController {
             String startDate = DateUtils.addMonth(endDateStr, -6);
             QueryWrapper<CtopOauthToken> tokenQueryWrapper = new QueryWrapper<>();
             tokenQueryWrapper.eq("media_id", 2);
-            System.err.println(startDate);
-            System.err.println(endDateStr);
-
-
-            //List<CtopOauthToken> ctopOauthTokens = oauthTokenMapper.selectList(tokenQueryWrapper);
-            //if (!Check.isNull(ctopOauthTokens)) {
-                //for (CtopOauthToken token : ctopOauthTokens) {
-                    //if ("3768019".equals(token.getAccountId())) {
-                        historyReportTaskService.createTask(3768019L, "0fb5f7dadd26b265979b1a8956950008", startDate, endDateStr, CtopAdConstant.KUAISHOU_LOAD_JOB_TYPE_HISTORY);
+            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);
@@ -128,13 +117,8 @@ public class TestController {
             String startDate = DateUtils.addMonth(endDateStr, -6);
             QueryWrapper<CtopOauthToken> tokenQueryWrapper = new QueryWrapper<>();
             tokenQueryWrapper.eq("media_id", 2);
-            System.err.println(startDate);
-            System.err.println(endDateStr);
-
-
             historyReportTaskService.getTaskList();
 
-
         } catch (Exception e) {
             e.printStackTrace();
             result.setSuccess(false);
@@ -175,26 +159,7 @@ public class TestController {
         return "Success";
     }
 
-    static ExecutorService executorService = Executors.newFixedThreadPool(5);
-
-    @GetMapping(value = "/getVideoAndImage")
-    public String getVideoAndImage() {
-        QueryWrapper<CtopOauthToken> tokenQueryWrapper = new QueryWrapper<>();
-        tokenQueryWrapper.eq("media_id", 2);
-        List<CtopOauthToken> ctopOauthTokens = tokenMapper.selectList(tokenQueryWrapper);
-        for (CtopOauthToken token : ctopOauthTokens) {
-            executorService.submit(new Runnable() {
-                @Override
-                public void run() {
-                    kuaishouInterfaceService.getVideoList2(token, null, null, 1);
-                    //kuaishouInterfaceService.getImageList2(token, null, null, 1);
-                    //   kuaishouInterfaceService.getCreativeList2(token, null, null, 1);
-                }
-            });
-
-        }
-        return "Success";
-    }
+    static ExecutorService executorService = Executors.newFixedThreadPool(10);
 
 
     @GetMapping(value = "/gerCreative")
@@ -207,7 +172,6 @@ public class TestController {
                 @Override
                 public void run() {
                     try {
-                        System.err.println("获取创意,accountId:" + token.getAccountId());
                         kuaishouInterfaceService.getCreativeList(token, null, null);
                         //  kuaishouInterfaceService.getVideoList2(token, null, null,1);
                         //3: 获取图片信息数据
@@ -247,118 +211,35 @@ public class TestController {
     @Autowired
     private IKuaiShouCampaignService campaignService;
 
-    @GetMapping(value = "/getCreativeReportByAccount")
-    public void gerCreativeReportByAccount(Long accountId, String startDateStr, String endDateStr) {
-        Thread thread = new Thread() {
-            @SneakyThrows
-            @Override
-            public void run() {
-                SimpleDateFormat sim = new SimpleDateFormat("yyyy-MM-dd");
-                Date startDate = sim.parse(startDateStr);
-                Date endDate = sim.parse(endDateStr);
-                //1:查询当日数据
-                //executorService = Executors.newFixedThreadPool(3);
-                QueryWrapper<CtopOauthToken> oauthTokenQueryWrapper = new QueryWrapper<>();
-                oauthTokenQueryWrapper.eq("media_id", 2);
-                oauthTokenQueryWrapper.eq("account_id", accountId);
-                CtopOauthToken ctopOauthToken = oauthTokenMapper.selectOne(oauthTokenQueryWrapper);
-
-                System.err.println("创意报表accountId:" + ctopOauthToken.getAccountId());
-                QueryWrapper<KuaiShouCampaign> campaignQueryWrapper = new QueryWrapper<>();
-                campaignQueryWrapper.eq("account_id", accountId);
-                List<KuaiShouCampaign> list = campaignService.list(campaignQueryWrapper);
-                if (!Check.isNull(list)) {
-                    for (KuaiShouCampaign campaign : list) {
-                        kuaishouInterfaceService.getAdvertiserCreativeReportDailyV2(campaign.getCampaignId(), ctopOauthToken, startDate, endDate);
 
+    @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);
                     }
-
-                }
-
-
-            }
-        };
-        thread.start();
+                });
+            });
+        }
+        ResultMapUtils.setResultMap(result, StatusCode.COMMON_SUCCESS);
+        return result;
     }
 
 
     @Autowired
     private IUserAllocationService userAllocationService;
-    @Autowired
-    private KuaishouReportDailyCreativeStatisticMapper reportDailyCreativeStatisticMapper;
 
 
-    @Autowired
-    private KuaishouReportDailyCreativeMapper reportDailyCreativeMapper;
-
-    @GetMapping(value = "/getCreativeReportByProjectId")
-    public void getCreativeReportByProjectId(Long projectId) {
-
-        try {
-            Map<String, Object> deleteMap = new HashMap<>();
-            String date = DateUtils.getDate("yyyy-MM-dd");
-            String anotherDay = DateUtils.getAnotherDay("yyyy-MM-dd", date, -1);
-            SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
-            Date endDate = simpleDateFormat.parse(anotherDay);
-            QueryWrapper<UserAllocation> userAllocationQueryWrapper = new QueryWrapper<>();
-            userAllocationQueryWrapper.eq("project_id", projectId);
-            List<UserAllocation> list = userAllocationService.list(userAllocationQueryWrapper);
-            if (!Check.isNull(list)) {
-                for (UserAllocation allocation : list) {
-                    executorService.submit(new Runnable() {
-                        @Override
-                        public void run() {
-                            if (!Check.isNull(allocation)) {
-                                log.info("账号id:{}", allocation.getAccountId());
-
-                                QueryWrapper<CtopOauthToken> oauthTokenQueryWrapper = new QueryWrapper<>();
-                                oauthTokenQueryWrapper.eq("media_id", 2);
-                                oauthTokenQueryWrapper.eq("account_id", allocation.getAccountId());
-                                CtopOauthToken ctopOauthToken = oauthTokenMapper.selectOne(oauthTokenQueryWrapper);
-                                if (!Check.isNull(ctopOauthToken)) {
-                                    deleteMap.put("account_id", allocation.getAccountId());
-                                    deleteMap.put("stat_date", anotherDay);
-                                    //   reportDailyCreativeStatisticMapper.deleteByMap(deleteMap);
-                                    //  reportDailyCreativeMapper.deleteByMap(deleteMap);
-
-                                    // 1.计划数据
-                                    log.info("获取计划,账号id:{}", allocation.getAccountId());
-                                    kuaishouInterfaceService.getCampaignList(ctopOauthToken, null, null);
-                                    // 2:广告组数据
-                                    log.info("获取广告组,账号id:{}", allocation.getAccountId());
-                                    kuaishouInterfaceService.getGroupList(ctopOauthToken, null, null);
-                                    // 3:创意数据
-                                    log.info("获取创意,账号id:{}", allocation.getAccountId());
-                                    kuaishouInterfaceService.getCreativeList(ctopOauthToken, null, null);
-
-                                    QueryWrapper<KuaiShouCampaign> campaignQueryWrapper = new QueryWrapper<>();
-                                    campaignQueryWrapper.eq("account_id", ctopOauthToken.getAccountId());
-                                    log.info("获取创意报表,账号id:{}", allocation.getAccountId());
-                                    List<KuaiShouCampaign> campaigns = campaignService.list(campaignQueryWrapper);
-                                    if (!Check.isNull(campaigns)) {
-                                        for (KuaiShouCampaign campaign : campaigns) {
-                                            kuaishouInterfaceService.getAdvertiserCreativeReportDailyV2(campaign.getCampaignId(), ctopOauthToken, endDate, endDate);
-                                        }
-                                    }
-                                }
-                            }
-
-                        }
-                    });
-
-
-                }
-            }
-        } catch (ParseException e) {
-            e.printStackTrace();
-        }
-
-    }
-
     public static void main(String[] args) throws ParseException {
         String date = DateUtils.getDate("yyyy-MM-dd");
         String anotherDay = DateUtils.getAnotherDay("yyyy-MM-dd", date, -1);
-        System.err.println(anotherDay);
     }
 
 
@@ -370,11 +251,9 @@ public class TestController {
         oauthTokenQueryWrapper.last("limit 1");
         CtopOauthToken token = oauthTokenMapper.selectOne(oauthTokenQueryWrapper);
         try {
-            System.err.println("获取计划,广告组:" + accountId);
             kuaishouInterfaceService.getCampaignList(token, null, null);
             //1:获取全量广告组数据
             kuaishouInterfaceService.getGroupList(token, null, null);
-            System.err.println("获取计划,广告组:" + accountId);
         } catch (Exception e) {
             e.printStackTrace();
         }
@@ -392,9 +271,7 @@ public class TestController {
         CtopOauthToken token = oauthTokenMapper.selectOne(oauthTokenQueryWrapper);
 
         try {
-            System.err.println("获取创意,accountId:" + token.getAccountId());
             kuaishouInterfaceService.getCreativeList(token, null, null);
-            System.err.println("获取创意结束,accountId:" + token.getAccountId());
         } catch (Exception e) {
             e.printStackTrace();
         }
@@ -403,40 +280,6 @@ public class TestController {
     }
 
 
-    @GetMapping(value = "/gerCreativeReportByAccount")
-    public void gerCreativeReportByAccount(Long accountId, String startDateStr, String endDateStr, QueryWrapper<CtopOauthToken> account_id) {
-        Thread thread = new Thread() {
-            @SneakyThrows
-            @Override
-            public void run() {
-                SimpleDateFormat sim = new SimpleDateFormat("yyyy-MM-dd");
-                Date startDate = sim.parse(startDateStr);
-                Date endDate = sim.parse(endDateStr);
-                //1:查询当日数据
-                //executorService = Executors.newFixedThreadPool(3);
-                QueryWrapper<CtopOauthToken> oauthTokenQueryWrapper = new QueryWrapper<>();
-                oauthTokenQueryWrapper.eq("media_id", 2);
-                oauthTokenQueryWrapper.eq("account_id", accountId);
-                CtopOauthToken ctopOauthToken = oauthTokenMapper.selectOne(oauthTokenQueryWrapper);
-                System.err.println("创意报表accountId:" + ctopOauthToken.getAccountId());
-
-
-                QueryWrapper<KuaiShouCampaign> campaignQueryWrapper = new QueryWrapper<>();
-                campaignQueryWrapper.eq("account_id", ctopOauthToken.getAccountId());
-
-                List<KuaiShouCampaign> campaigns = campaignService.list(campaignQueryWrapper);
-                if (!Check.isNull(campaigns)) {
-                    for (KuaiShouCampaign campaign : campaigns) {
-                        kuaishouInterfaceService.getAdvertiserCreativeReportDailyV2(campaign.getCampaignId(), ctopOauthToken, endDate, endDate);
-                    }
-                }
-
-            }
-        };
-        thread.start();
-    }
-
-
     @Autowired
     private IBytedancePlanDailyReportService planDailyReportService;
     @Autowired
@@ -453,61 +296,60 @@ public class TestController {
             e.printStackTrace();
         }
         //1:查询当日数据
-        List<CtopOauthToken> tokens = tokenService.getTokenListByType(CtopAdConstant.PLATFORM_TYPE_BYTEDANCE);
-        if (null == tokens || tokens.size() <= 0) {
-            log.info("定时获取头条数据异常:为获取到可用的token");
+        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;
-        tokens.forEach(token -> {
+
+        allocations.forEach(allocation -> {
             //3:获取广告计划信息数据
+            CtopOauthToken token = oauthTokenMapper.selectByAccountId(allocation.getAccountId());
             reportService.getAdvertiserPlanReport(token, finalGetDate, finalGetDate, CtopAdConstant.BYTEDANCE_REPORT_TYPE_DAILY);
         });
 
         //清洗关于作业帮数据
         //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(finalGetDate) + " 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);
-                    });
-                }
-            });
-        }
+        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;
     }
@@ -799,7 +641,6 @@ public class TestController {
             executorService.submit(new Runnable() {
                 @Override
                 public void run() {
-                    System.err.println(signature);
                     cleanMaterialService.calculationReport(signature);
                 }
             });
@@ -828,7 +669,6 @@ public class TestController {
                     } catch (ParseException e) {
                         e.printStackTrace();
                     }
-                    System.err.println("获取广告主报表,accountId:" + token.getAccountId());
                     kuaishouInterfaceService.getAdvertiserReportDaily(token, startDate, endDate);
 
                     Thread.sleep(1 * 200);
@@ -839,4 +679,65 @@ public class TestController {
             }
         });
     }
+
+
+    @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();
+        }
+
+    }
+
+
 }

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

@@ -0,0 +1,10 @@
+package org.jeecg.modules.ctop.controller;
+
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequestMapping("/video/model")
+public class VideoModelController {
+
+}

+ 92 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/entity/KuaiShouDefectMaterial.java

@@ -0,0 +1,92 @@
+package org.jeecg.modules.ctop.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-04-15
+ */
+@Data
+@TableName("ctop_kuaishou_defect_material")
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value = "ctop_kuaishou_defect_material对象", description = "快手缺失素材")
+public class KuaiShouDefectMaterial {
+
+    /**
+     * id
+     */
+    @TableId(type = IdType.AUTO)
+    @ApiModelProperty(value = "id")
+    private Integer id;
+    /**
+     * md5
+     */
+    @Excel(name = "md5", width = 15)
+    @ApiModelProperty(value = "md5")
+    private String signature;
+    /**
+     * 花费(元)
+     */
+    @Excel(name = "花费(元)", width = 15)
+    @ApiModelProperty(value = "花费(元)")
+    private java.math.BigDecimal charge;
+    /**
+     * url
+     */
+    @Excel(name = "url", width = 15)
+    @ApiModelProperty(value = "url")
+    private String url;
+    /**
+     * 项目
+     */
+    @Excel(name = "项目", width = 15)
+    @ApiModelProperty(value = "项目")
+    private Long projectId;
+    /**
+     * 开始时间
+     */
+    @Excel(name = "开始时间", width = 15)
+    @ApiModelProperty(value = "开始时间")
+    private String startDate;
+    /**
+     * 结束时间
+     */
+    @Excel(name = "结束时间", width = 15)
+    @ApiModelProperty(value = "结束时间")
+    private String endDate;
+
+    private String accountIds;
+
+    /**
+     * 创建时间
+     */
+    @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;
+}

+ 4 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/entity/SalePerformanceDetail.java

@@ -56,6 +56,10 @@ public class SalePerformanceDetail {
     @Excel(name = "广告主id", width = 15)
     @ApiModelProperty(value = "广告主id")
     private String advertiserId;
+
+    @Excel(name = "户id", width = 15)
+    @ApiModelProperty(value = "户id")
+    private Long accountId;
     /**
      * 年
      */

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

@@ -12,9 +12,9 @@ import java.util.Date;
 
 @Slf4j
 public class BakDataBaseJob implements Job {
-    @Value("${spring.datasource.master.username}")
+    @Value("${spring.datasource.username}")
     private String userName;
-    @Value("${spring.datasource.master.password}")
+    @Value("${spring.datasource.password}")
     private String password;
     @Value("${jeecg.path.bak-database-file}")
     private String filePath;

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

@@ -35,9 +35,6 @@ public class BytedanceAdvertiserHourlyReportLoadJob implements Job {
         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) {
@@ -45,13 +42,16 @@ public class BytedanceAdvertiserHourlyReportLoadJob implements Job {
             return;
         }
         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);
+                    if (null != hour && "00".equals(hour)) {
+                        Date  finalGetDate = DateUtils.addDay(getDate, -1);
+                        //获取广告主信息数据
+                        reportService.getAdvertiserReport(token, finalGetDate, finalGetDate, CtopAdConstant.BYTEDANCE_REPORT_TYPE_HOURLY);
+                    }
+                    reportService.getAdvertiserReport(token, getDate, getDate, CtopAdConstant.BYTEDANCE_REPORT_TYPE_HOURLY);
                 }
 
             });

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

@@ -35,9 +35,6 @@ public class BytedanceCreativeHourlyReportLoadJob implements Job {
         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) {
@@ -45,13 +42,16 @@ public class BytedanceCreativeHourlyReportLoadJob implements Job {
             return;
         }
         executorService = Executors.newFixedThreadPool(4);
-        Date finalGetDate = getDate;
         tokens.forEach(token -> {
             executorService.submit(new Runnable() {
                 @Override
                 public void run() {
-                    //获取广告创意信息数据
-                    reportService.getAdvertiserCreativeReport(token, finalGetDate, finalGetDate, CtopAdConstant.BYTEDANCE_REPORT_TYPE_HOURLY);
+                    if (null != hour && "00".equals(hour)) {
+                        Date  finalGetDate = DateUtils.addDay(getDate, -1);
+                        //获取广告创意信息数据
+                        reportService.getAdvertiserCreativeReport(token, finalGetDate, finalGetDate, CtopAdConstant.BYTEDANCE_REPORT_TYPE_HOURLY);
+                    }
+                    reportService.getAdvertiserCreativeReport(token, getDate, getDate, CtopAdConstant.BYTEDANCE_REPORT_TYPE_HOURLY);
                 }
 
             });

+ 5 - 5
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/job/BytedancePlanHourlyReportLoadJob.java

@@ -37,12 +37,8 @@ public class BytedancePlanHourlyReportLoadJob implements Job {
         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(5);
         countDownLatch = new CountDownLatch(tokens.size());
         tokens.forEach(token -> {
@@ -50,7 +46,11 @@ public class BytedancePlanHourlyReportLoadJob implements Job {
                 @Override
                 public void run() {
                     try {
-                        reportService.getAdvertiserPlanReport(token, finalGetDate, finalGetDate, CtopAdConstant.BYTEDANCE_REPORT_TYPE_HOURLY);
+                        if (null != hour && "00".equals(hour)) {
+                            Date  finalGetDate = DateUtils.addDay(getDate, -1);
+                            reportService.getAdvertiserPlanReport(token, finalGetDate, finalGetDate, CtopAdConstant.BYTEDANCE_REPORT_TYPE_HOURLY);
+                        }
+                        reportService.getAdvertiserPlanReport(token, getDate, getDate, CtopAdConstant.BYTEDANCE_REPORT_TYPE_HOURLY);
                     } catch (Exception e) {
                         e.printStackTrace();
                     } finally {

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

@@ -1,40 +0,0 @@
-package org.jeecg.modules.ctop.job;
-
-import cn.com.ctop.kuaishou.modules.report.service.IKuaishouReportHourlyCreativeStatisticService;
-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;
-
-/**
- * 出价预警
- */
-public class DeleteCreativeStaticJob implements Job {
-    @Autowired
-    private IKuaishouReportHourlyCreativeStatisticService reportHourlyCreativeStatisticService;
-
-    /**
-     * 定时删除数据
-     *
-     * @param jobExecutionContext
-     * @throws JobExecutionException
-     */
-    @Override
-    public void execute(JobExecutionContext jobExecutionContext) {
-        Thread thread = new Thread() {
-            @Override
-            public void run() {
-                try {
-                    String nowDate = DateUtils.getNowDate("yyyy-MM-dd");
-                    String anotherDay = DateUtils.getAnotherDay("yyyy-MM-dd", nowDate, -2);
-                    reportHourlyCreativeStatisticService.deleteHourlyReportByStatDate(anotherDay);
-                } catch (Exception e) {
-                    e.printStackTrace();
-                }
-            }
-        };
-        thread.start();
-    }
-
-}

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

@@ -6,6 +6,9 @@ import org.quartz.JobExecutionContext;
 import org.quartz.JobExecutionException;
 import org.springframework.beans.factory.annotation.Autowired;
 
+/**
+ * @author 宋英豪
+ */
 public class KuaishouCceDataJob implements Job {
     @Autowired
     private ICrawlerService crawlerService;

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

@@ -33,8 +33,6 @@ public class KuaishouDailyAccountReportLoadJob implements Job {
         Thread thread = new Thread() {
             @Override
             public void run() {
-                Date deleteDate = DateUtils.addDay(new Date(), -2);
-                kuaishouInterfaceService.deleteHourlyReport(deleteDate);
                 Date getDate = DateUtils.addDay(new Date(), -1);
                 //1:查询当日数据
                 List<CtopOauthToken> tokens = tokenService.selectKuaiShouToken();

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

@@ -2,7 +2,6 @@ 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.common.module.utils.CtopAdConstant;
 import cn.com.ctop.kuaishou.modules.batch.service.IKuaishouInterfaceService;
 import lombok.extern.slf4j.Slf4j;
 import org.jeecg.common.util.DateUtils;
@@ -34,8 +33,6 @@ public class KuaishouDailyCampaignReportLoadJob implements Job {
         Thread thread = new Thread() {
             @Override
             public void run() {
-                Date deleteDate = DateUtils.addDay(new Date(), -2);
-                kuaishouInterfaceService.deleteHourlyReport(deleteDate);
                 Date getDate = DateUtils.addDay(new Date(), -1);
                 //1:查询当日数据
                 List<CtopOauthToken> tokens = tokenService.selectKuaiShouToken();
@@ -50,7 +47,6 @@ public class KuaishouDailyCampaignReportLoadJob implements Job {
                         public void run() {
                             //获取广告计划信息数据
                             kuaishouInterfaceService.getAdvertiserCampaignReportDaily(token, getDate, getDate);
-
                         }
                     });
                 });

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

@@ -3,7 +3,6 @@ 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.common.module.utils.Check;
-import cn.com.ctop.common.module.utils.CtopAdConstant;
 import cn.com.ctop.kuaishou.modules.batch.service.IKuaiShouCampaignService;
 import cn.com.ctop.kuaishou.modules.batch.service.IKuaishouInterfaceService;
 import com.alibaba.fastjson.JSONArray;
@@ -41,8 +40,6 @@ public class KuaishouDailyCreativeReportLoadJob implements Job {
         Thread thread = new Thread() {
             @Override
             public void run() {
-                Date deleteDate = DateUtils.addDay(new Date(), -2);
-                kuaishouInterfaceService.deleteHourlyReport(deleteDate);
                 Date getDate = DateUtils.addDay(new Date(), -1);
                 //1:查询当日数据
                 executorService = Executors.newFixedThreadPool(4);

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

@@ -2,7 +2,6 @@ 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.common.module.utils.CtopAdConstant;
 import cn.com.ctop.kuaishou.modules.batch.service.IKuaishouInterfaceService;
 import lombok.extern.slf4j.Slf4j;
 import org.jeecg.common.util.DateUtils;
@@ -34,8 +33,6 @@ public class KuaishouDailyGroupReportLoadJob implements Job {
         Thread thread = new Thread() {
             @Override
             public void run() {
-                Date deleteDate = DateUtils.addDay(new Date(), -2);
-                kuaishouInterfaceService.deleteHourlyReport(deleteDate);
                 Date getDate = DateUtils.addDay(new Date(), -1);
                 //1:查询当日数据
                 List<CtopOauthToken> tokens = tokenService.selectKuaiShouToken();

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

@@ -2,7 +2,6 @@ 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.common.module.utils.CtopAdConstant;
 import cn.com.ctop.kuaishou.modules.batch.service.IKuaishouInterfaceService;
 import lombok.extern.slf4j.Slf4j;
 import org.jeecg.common.util.DateUtils;
@@ -76,9 +75,6 @@ public class KuaishouHourlyCreativeReportLoadJob implements Job {
                     e.printStackTrace();
                 }
                 executorService.shutdown();
-                for (CtopOauthToken token : tokens) {
-                    kuaishouInterfaceService.updateCreativeReportHourlyStatistic(token, getDate);
-                }
             }
 
         };

+ 10 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/mapper/AdvertiserMapper.java

@@ -1,9 +1,12 @@
 package org.jeecg.modules.ctop.mapper;
 
+import cn.com.ctop.common.module.entity.UserAllocation;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import org.apache.ibatis.annotations.Param;
 import org.jeecg.modules.ctop.entity.Advertiser;
 import org.jeecg.modules.excelutil.entity.KuaishouXxlEntity;
+import org.jeecg.modules.excelutil.entity.YdPlanAggregateEntity;
+import org.jeecg.modules.excelutil.entity.YdWeekAggregateEntity;
 
 import java.util.List;
 
@@ -17,4 +20,11 @@ public interface AdvertiserMapper extends BaseMapper<Advertiser> {
 
     List<KuaishouXxlEntity> getXXlStatisticInfo(@Param(value = "projectId") Long projectId, @Param(value = "systemType") String systemType, @Param(value = "accountId") Long accountId, @Param(value = "groupBy") String groupBy);
 
+    YdWeekAggregateEntity getYdWeekStatisticInfo(@Param(value = "projectId") Long projecgId, @Param(value = "start") String lastWeekStart, @Param(value = "end") String lastWeekEnd);
+
+    List<YdPlanAggregateEntity> getYdWeekPlanStatisticInfoAll(@Param(value = "start") String startDate, @Param(value = "end") String endDate, @Param(value = "accountId") Long accountId);
+
+    List<UserAllocation> getAllocationsBySaleId(@Param(value = "saleId") String saleId);
+
+    List<UserAllocation> getAllocationsByAdvertiserId(@Param(value = "adId") String adId);
 }

+ 15 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/mapper/KuaiShouDefectMaterialMapper.java

@@ -0,0 +1,15 @@
+package org.jeecg.modules.ctop.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.jeecg.modules.ctop.entity.KuaiShouDefectMaterial;
+
+/**
+ * 快手缺失素材
+ *
+ * @author: jeecg-boot
+ * @date: 2020-04-15
+ * @cersion: V1.0
+ */
+public interface KuaiShouDefectMaterialMapper extends BaseMapper<KuaiShouDefectMaterial> {
+
+}

+ 104 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/mapper/xml/AdvertiserMapper.xml

@@ -66,4 +66,108 @@
         </if>
 
     </select>
+    <select id="getYdWeekStatisticInfo" resultType="org.jeecg.modules.excelutil.entity.YdWeekAggregateEntity">
+        select
+            concat(#{start},'至',#{end}) as date,
+            round(sum(cost),2) as cost,
+            sum(active) as active,
+            (
+                case
+                    when sum(cost)!=0 and sum(active)!=0
+                    then round(sum(cost)/sum(active),2)
+                    else 0
+                end)    as activeAvg
+        from
+            ctop_bytedance_report_advertiser_daily daily
+        left join ctop_user_allocation allocation on allocation.account_id = daily.advertiser_id
+        where
+            allocation.project_id = #{projectId}
+        and
+            allocation.account_status = 0
+        and
+            daily.stat_datetime &gt;= #{start}
+        and
+            daily.stat_datetime &lt;= #{end}
+
+    </select>
+    <select id="getYdWeekPlanStatisticInfoAll"
+            resultType="org.jeecg.modules.excelutil.entity.YdPlanAggregateEntity">
+        select
+            allocation.auth_name as accountName,
+            concat(#{start}, '至', #{end})as date,
+            daily.campaign_name as planName,
+            sum(daily.cost) as totalCost,
+            sum(daily.show_num) as showNum,
+            sum(daily.click) as clickNum,
+            (case
+                when sum(daily.click)!=0 and sum(daily.show_num)!=0
+                then concat(round(sum(daily.click)/sum(daily.show_num)*100,2),'%')
+                else '0%'
+                end
+            )as clickRate,
+            (case
+                when sum(daily.cost)!=0 and sum(daily.click)!=0
+                then round(sum(daily.cost)/sum(daily.click)*100,2)
+                else 0
+                end
+            )as priceAvg,
+            (case
+                when sum(daily.cost)!=0 and sum(daily.show_num)!=0
+                then round(sum(daily.cost)/sum(daily.show_num)*1000,2)
+                else 0
+                end
+            )as ctr,
+            sum(daily.convert_num) as convertNum,
+            (case
+                when sum(daily.convert_num)!=0 and sum(daily.cost)!=0
+                then round(sum(daily.cost)/sum(daily.convert_num),2)
+                else 0
+                end
+            )as convertPrice,
+            (case
+                when sum(daily.convert_num)!=0 and sum(daily.click)!=0
+                then concat(round(sum(daily.convert_num)/sum(daily.click)*100,2),'%')
+                else '0%'
+                end
+            )as convertRate,
+            (
+                select
+                    group_concat(distinct plan.gender)
+                from
+                    ctop_bytedance_advertise_plan plan
+                    where plan.campaign_id = daily.campaign_id
+            )as sex,
+            (
+                select
+                    group_concat(distinct plan.platform)
+                from
+                    ctop_bytedance_advertise_plan plan
+                where
+                    plan.campaign_id = daily.campaign_id
+            )as platform
+        from ctop_bytedance_report_campaign_daily daily
+        left join ctop_user_allocation allocation on allocation.account_id = daily.advertiser_id
+        where allocation.account_id = #{accountId}
+        and allocation.account_status = 0
+        and daily.stat_datetime &gt;= #{start}
+        and daily.stat_datetime &lt;= #{end}
+        group by daily.campaign_id order by sum(daily.cost) desc
+    </select>
+    <select id="getAllocationsBySaleId" resultType="cn.com.ctop.common.module.entity.UserAllocation">
+        select
+            allocation.*
+        from
+            ctop_user_allocation allocation
+         left join ctop_project project on project.id = allocation.project_id
+         left join ctop_advertiser advertiser on advertiser.id = project.advertiser_id
+        where advertiser.sale_id = #{saleId}
+    </select>
+    <select id="getAllocationsByAdvertiserId" resultType="cn.com.ctop.common.module.entity.UserAllocation">
+        select
+            allocation.*
+        from
+            ctop_user_allocation allocation
+         left join ctop_project project on project.id = allocation.project_id
+         where project.advertiser_id = #{adId}
+    </select>
 </mapper>

+ 5 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/mapper/xml/KuaiShouDefectMaterialMapper.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="org.jeecg.modules.ctop.mapper.KuaiShouDefectMaterialMapper">
+
+</mapper>

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

@@ -1,5 +1,6 @@
 package org.jeecg.modules.ctop.service;
 
+import cn.com.ctop.common.module.entity.UserAllocation;
 import com.baomidou.mybatisplus.extension.service.IService;
 import org.jeecg.modules.ctop.entity.Advertiser;
 import org.jeecg.modules.ctop.vo.SheetInfoVo;
@@ -16,7 +17,13 @@ public interface IAdvertiserService extends IService<Advertiser> {
 
     List<Advertiser> getBySaleId(String saleId);
 
+    List<UserAllocation> getAllocationsBySaleId(String saleId);
+
     SheetInfoVo getXxlStatisticInfo(Long projectId, String systemType, Long accountId, String sheetName);
 
     List<SheetInfoVo> getSystemTypeXxlStatisticInfo(Long projectId);
+
+    List<SheetInfoVo> getYdStatisticInfo(Long projectId, String startDate, String endDate);
+
+    List<UserAllocation> getAllocationsByAdvertiserId(String id);
 }

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

@@ -0,0 +1,16 @@
+package org.jeecg.modules.ctop.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.jeecg.modules.ctop.entity.KuaiShouDefectMaterial;
+
+/**
+ * 快手缺失素材
+ *
+ * @author jeecg-boot
+ * @version V1.0
+ * @date 2020-04-15
+ */
+public interface IKuaiShouDefectMaterialService extends IService<KuaiShouDefectMaterial> {
+    void getDefectVideo(String startDate, String endDate);
+
+}

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

@@ -1,17 +1,27 @@
 package org.jeecg.modules.ctop.service.impl;
 
+import cn.com.ctop.common.module.entity.UserAllocation;
+import cn.com.ctop.common.module.service.IUserAllocationService;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.jeecg.common.util.DateUtils;
 import org.jeecg.modules.ctop.entity.Advertiser;
 import org.jeecg.modules.ctop.mapper.AdvertiserMapper;
 import org.jeecg.modules.ctop.service.IAdvertiserService;
 import org.jeecg.modules.ctop.vo.SheetInfoVo;
 import org.jeecg.modules.excelutil.entity.KuaishouXxlEntity;
+import org.jeecg.modules.excelutil.entity.YdPlanAggregateEntity;
+import org.jeecg.modules.excelutil.entity.YdWeekAggregateEntity;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.text.ParseException;
 import java.util.ArrayList;
+import java.util.Date;
 import java.util.List;
+import java.util.stream.Collectors;
 
 /**
  * @Description: 广告主信息表
@@ -32,8 +42,13 @@ public class AdvertiserServiceImpl extends ServiceImpl<AdvertiserMapper, Adverti
     }
 
     @Override
+    public List<UserAllocation> getAllocationsBySaleId(String saleId) {
+        return advertiserMapper.getAllocationsBySaleId(saleId);
+    }
+
+    @Override
     public SheetInfoVo getXxlStatisticInfo(Long projectId, String systemType, Long accountId, String sheetName) {
-        SheetInfoVo vo = new SheetInfoVo();
+        SheetInfoVo vo = new SheetInfoVo<KuaishouXxlEntity>();
         List<KuaishouXxlEntity> details = new ArrayList<>();
         vo.setSheetName(sheetName);
         List<KuaishouXxlEntity> totalList = advertiserMapper.getXXlStatisticInfo(projectId, systemType, accountId, null);
@@ -54,4 +69,78 @@ public class AdvertiserServiceImpl extends ServiceImpl<AdvertiserMapper, Adverti
         vos.add(ios);
         return vos;
     }
+
+    @Override
+    public List<SheetInfoVo> getYdStatisticInfo(Long projectId, String startDate, String endDate) {
+        List<SheetInfoVo> sheetInfoVos = new ArrayList<>();
+        try {
+            Date start = DateUtils.parseDate(startDate, "yyyy-MM-dd");
+            Date end = DateUtils.parseDate(endDate, "yyyy-MM-dd");
+            String lastWeekStart = DateUtils.formatDate(DateUtils.addDay(start, -7));
+            String lastWeekEnd = DateUtils.formatDate(DateUtils.addDay(end, -7));
+            //1:获取周报汇总数据
+            SheetInfoVo voFirst = new SheetInfoVo();
+            List<YdWeekAggregateEntity> weekEntities = new ArrayList<>();
+            YdWeekAggregateEntity lastWeek = advertiserMapper.getYdWeekStatisticInfo(projectId, lastWeekStart + " 00:00:00", lastWeekEnd + " 00:00:00");
+            weekEntities.add(lastWeek);
+            YdWeekAggregateEntity thWeek = advertiserMapper.getYdWeekStatisticInfo(projectId, startDate + " 00:00:00", endDate + " 00:00:00");
+            weekEntities.add(thWeek);
+            YdWeekAggregateEntity qoq = new YdWeekAggregateEntity();
+            qoq.setDate("环比数据");
+            BigDecimal qoqActive = (new BigDecimal(thWeek.getActive()).subtract(new BigDecimal(lastWeek.getActive()))).divide(
+                    new BigDecimal(lastWeek.getActive()), 5, RoundingMode.HALF_UP).multiply(new BigDecimal("100")).setScale(2, RoundingMode.HALF_UP);
+            qoq.setActive(qoqActive.toString() + "%");
+            BigDecimal qoqCost = (new BigDecimal(thWeek.getCost()).subtract(new BigDecimal(lastWeek.getCost()))).divide(
+                    new BigDecimal(lastWeek.getCost()), 5, RoundingMode.HALF_UP).multiply(new BigDecimal("100")).setScale(2, RoundingMode.HALF_UP);
+            qoq.setCost(qoqCost.toString() + "%");
+            BigDecimal qoqActiveAvg = (new BigDecimal(thWeek.getActiveAvg()).subtract(new BigDecimal(lastWeek.getActiveAvg()))).divide(
+                    new BigDecimal(lastWeek.getActiveAvg()), 5, RoundingMode.HALF_UP).multiply(new BigDecimal("100")).setScale(2, RoundingMode.HALF_UP);
+            qoq.setActiveAvg(qoqActiveAvg.toString() + "%");
+            weekEntities.add(qoq);
+            voFirst.setSheetName("周数据");
+            voFirst.setDetails(weekEntities);
+            sheetInfoVos.add(voFirst);
+            //2:获取主力计划汇总
+            SheetInfoVo secondVo = new SheetInfoVo();
+            secondVo.setSheetName("主力计划汇总");
+            List<YdPlanAggregateEntity> planAggregateEntities = getYdPlanStatisticInfo(projectId, startDate, endDate);
+            secondVo.setDetails(planAggregateEntities);
+            sheetInfoVos.add(secondVo);
+            //3:获取每周素材统计
+
+            return sheetInfoVos;
+        } catch (ParseException e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+    @Override
+    public List<UserAllocation> getAllocationsByAdvertiserId(String adId) {
+        return advertiserMapper.getAllocationsByAdvertiserId(adId);
+    }
+
+    private List<YdPlanAggregateEntity> getYdPlanStatisticInfo(Long projectId, String startDate, String endDate) {
+        List<YdPlanAggregateEntity> result = new ArrayList<>();
+        List<UserAllocation> allocations = userAllocationService.getByProjectId(projectId, null);
+        if (null != allocations && allocations.size() > 0) {
+            allocations.forEach(allocation -> {
+                List<YdPlanAggregateEntity> plans = statisticWeekInfoByAccount(allocation, startDate, endDate);
+                result.addAll(plans);
+            });
+        }
+        return result;
+    }
+
+    private List<YdPlanAggregateEntity> statisticWeekInfoByAccount(UserAllocation allocation, String startDate, String endDate) {
+        List<YdPlanAggregateEntity> all = advertiserMapper.getYdWeekPlanStatisticInfoAll(startDate, endDate, allocation.getAccountId());
+        List<YdPlanAggregateEntity> big = all.parallelStream().filter(ydPlanAggregateEntity -> new BigDecimal(ydPlanAggregateEntity.getTotalCost()).compareTo(new BigDecimal("10000")) >= 0).collect(Collectors.toList());
+        if (null != big || big.size() > 0) {
+            return big;
+        }
+        return all.parallelStream().limit(5).collect(Collectors.toList());
+    }
+
+    @Autowired
+    private IUserAllocationService userAllocationService;
 }

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

@@ -110,7 +110,6 @@ public class BidWarningServiceImpl implements IBidWarningService {
         String createTime = DateUtils.getNowDate("yyyy-MM-dd");
         Integer count = mailLogMapper.selectCountByAccountIdAndDate(accountId, createTime, 1);
         StringBuilder text = new StringBuilder();
-
         String s = "";
         for (int i = 0; i < unitWarning.size(); i++) {
             s += unitWarning.get(i) + "," + "<br/>";

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

@@ -0,0 +1,90 @@
+package org.jeecg.modules.ctop.service.impl;
+
+import cn.com.ctop.common.module.entity.MaterialInfo;
+import cn.com.ctop.common.module.entity.UserAllocation;
+import cn.com.ctop.common.module.service.IMaterialInfoService;
+import cn.com.ctop.common.module.service.IUserAllocationService;
+import cn.com.ctop.common.module.utils.Check;
+import cn.com.ctop.kuaishou.modules.batch.entity.KuaiShouVideoGet;
+import cn.com.ctop.kuaishou.modules.batch.service.IKuaiShouVideoGetService;
+import cn.com.ctop.kuaishou.modules.report.mapper.KuaishouReportDailyCreativeMapper;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import lombok.extern.slf4j.Slf4j;
+import org.jeecg.modules.ctop.entity.KuaiShouDefectMaterial;
+import org.jeecg.modules.ctop.mapper.KuaiShouDefectMaterialMapper;
+import org.jeecg.modules.ctop.service.IKuaiShouDefectMaterialService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * 快手缺失素材
+ *
+ * @author jeecg-boot
+ * @version V1.0
+ * @date 2020-04-15
+ */
+@Slf4j
+@Service
+public class KuaiShouDefectMaterialServiceImpl extends ServiceImpl<KuaiShouDefectMaterialMapper, KuaiShouDefectMaterial> implements IKuaiShouDefectMaterialService {
+    @Autowired
+    private KuaishouReportDailyCreativeMapper creativeMapper;
+    @Autowired
+    private IMaterialInfoService materialInfoService;
+    @Autowired
+    private IKuaiShouVideoGetService videoGetService;
+    @Autowired
+    private IUserAllocationService userAllocationService;
+
+
+    @Override
+    public void getDefectVideo(String startDate, String endDate) {
+
+        List<JSONObject> list = creativeMapper.selectCodeByDate(startDate, endDate);
+        if (!Check.isNull(list)) {
+            for (int i = 0; i < list.size(); i++) {
+
+                JSONObject codeJson = list.get(i);
+                // charge signature
+                String signature = codeJson.getString("signature");
+                if (!Check.isNull(signature)) {
+                    QueryWrapper<MaterialInfo> materialInfoQueryWrapper = new QueryWrapper<>();
+                    materialInfoQueryWrapper.eq("code", signature);
+                    materialInfoQueryWrapper.last("limit 1");
+                    MaterialInfo materialInfo = materialInfoService.getOne(materialInfoQueryWrapper);
+                    if (!Check.isNull(materialInfo)) {
+                        continue;
+                    }
+                    KuaiShouDefectMaterial defectMaterial = new KuaiShouDefectMaterial();
+                    defectMaterial.setCharge(codeJson.getBigDecimal("charge"));
+                    defectMaterial.setAccountIds(codeJson.getString("accountId"));
+                    defectMaterial.setSignature(signature);
+                    defectMaterial.setStartDate(startDate);
+                    defectMaterial.setEndDate(endDate);
+                    QueryWrapper<KuaiShouVideoGet> videoGetQueryWrapper = new QueryWrapper<>();
+                    videoGetQueryWrapper.eq("signature", signature);
+                    videoGetQueryWrapper.last("limit 1");
+                    KuaiShouVideoGet videoGet = videoGetService.getOne(videoGetQueryWrapper);
+                    if (Check.isNull(videoGet)) {
+                        continue;
+                    }
+                    defectMaterial.setUrl(videoGet.getUrl());
+                    QueryWrapper<UserAllocation> userAllocationQueryWrapper = new QueryWrapper<>();
+                    userAllocationQueryWrapper.eq("account_id", videoGet.getAccountId());
+                    userAllocationQueryWrapper.last("limit 1");
+                    UserAllocation userAllocation = userAllocationService.getOne(userAllocationQueryWrapper);
+                    if (!Check.isNull(userAllocation)) {
+                        defectMaterial.setProjectId(userAllocation.getProjectId());
+                    }
+                    this.save(defectMaterial);
+
+                }
+            }
+
+        }
+
+    }
+}

+ 52 - 41
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/service/impl/PerformanceSaleServiceImpl.java

@@ -1,7 +1,9 @@
 package org.jeecg.modules.ctop.service.impl;
 
+import cn.com.ctop.common.module.entity.UserAllocation;
 import cn.com.ctop.common.module.utils.CtopAdConstant;
 import cn.com.ctop.performanceappraisal.service.IPerformanceService;
+import lombok.extern.slf4j.Slf4j;
 import org.jeecg.common.util.DateUtils;
 import org.jeecg.modules.ctop.entity.Advertiser;
 import org.jeecg.modules.ctop.entity.SalePerformanceDetail;
@@ -23,6 +25,7 @@ import java.util.Date;
 import java.util.List;
 
 @Service
+@Slf4j
 public class PerformanceSaleServiceImpl implements IPerformanceSaleService {
 
     @Autowired
@@ -55,60 +58,68 @@ public class PerformanceSaleServiceImpl implements IPerformanceSaleService {
 
     public void countPerformance(SysUser user) {
 //        Date getDate = DateUtils.addDay(new Date(), -1)
-        Date getDate = DateUtils.addDay(new Date(), -5);
+        log.info("销售人员名称:{}", user.getRealname());
+        Date getDate = DateUtils.addDay(new Date(), -18);
         String startDateStr = DateUtils.getQuarterStartDate(getDate);
         String endDateStr = DateUtils.getQuarterEndDate(getDate);
         //获取用户角色信息
         SysUserRole userRole = userRoleService.getUserRoleByUserId(user.getId());
-        //1:获取快手季度总消耗
-        BigDecimal kuaishouFinishMediaTask = performanceService.getKuaishouSeasonTotalCost(startDateStr, endDateStr);
+        //1:获取快手季度总消耗 TODO 后续需要改成动态获取
+        BigDecimal kuaishouFinishMediaTask = CtopAdConstant.KUAISHOU_MEDIA_TASK_COST;
         //2:获取快手个人季度总消耗
-        BigDecimal kuaishouFinishPersonnalTask = performanceService.getKuaishouSalesSeasonTotalCostByParams(startDateStr, endDateStr, user.getId(), null);
-        //1:获取头条季度总消耗
-        BigDecimal bytedanceFinishMediaTask = performanceService.getBytedanceSeasonTotalCost(startDateStr, endDateStr);
+        BigDecimal kuaishouFinishPersonnalTask = performanceService.getKuaishouSalesSeasonTotalCostByParams(startDateStr, endDateStr, user.getId(), null, null);
+        //1:获取头条季度总消耗 TODO 后续需要改成动态获取
+        BigDecimal bytedanceFinishMediaTask = CtopAdConstant.BYTEDANCE_MEDIA_TASK_COST;
         //2:获取头条个人季度总消耗
-        BigDecimal bytedanceFinishPersonnalTask = performanceService.getBytedanceSalesSeasonTotalCostByParams(startDateStr, endDateStr, user.getId(), null);
+        BigDecimal bytedanceFinishPersonnalTask = performanceService.getBytedanceSalesSeasonTotalCostByParams(startDateStr, endDateStr, user.getId(), null, null);
         //获取销售所属的广告主信息
         List<Advertiser> advertiserList = advertiserService.getBySaleId(user.getId());
-
+        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
+        Date startSeasonDate = null;
+        Date endSeasonDate = null;
+        try {
+            startSeasonDate = dateFormat.parse(startDateStr);
+            endSeasonDate = dateFormat.parse(endDateStr);
+        } catch (ParseException e) {
+            e.printStackTrace();
+        }
         if (null != advertiserList && advertiserList.size() > 0) {
-            SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
-            Date startSeasonDate = null;
-            Date endSeasonDate = null;
-            try {
-                startSeasonDate = dateFormat.parse(startDateStr);
-                endSeasonDate = dateFormat.parse(endDateStr);
-            } catch (ParseException e) {
-                e.printStackTrace();
-            }
-
             for (Advertiser advertiser : advertiserList) {
-                Date endOldDate = DateUtils.addDay(advertiser.getCreateTime(), 90);
-                if (startSeasonDate.after(endOldDate)) {
-                    //季度开始时间大于新户结束时间(全部按照老户逻辑计算)
-                    saveSalePerformanceDetail(advertiser, user, userRole, DateUtils.getYear(getDate), DateUtils.getQuarter(getDate),
-                            startDateStr, endDateStr, bytedanceFinishMediaTask, bytedanceFinishPersonnalTask, kuaishouFinishMediaTask,
-                            kuaishouFinishPersonnalTask, 0);
-                } else if (endOldDate.after(endSeasonDate)) {
-                    saveSalePerformanceDetail(advertiser, user, userRole, DateUtils.getYear(getDate), DateUtils.getQuarter(getDate),
-                            startDateStr, endDateStr, bytedanceFinishMediaTask, bytedanceFinishPersonnalTask, kuaishouFinishMediaTask,
-                            kuaishouFinishPersonnalTask, 1);
-                } else {
-                    //新户结束时间处于本季度中间
-                    String endduring1Date = DateUtils.formatDate(endOldDate);
-                    saveSalePerformanceDetail(advertiser, user, userRole, DateUtils.getYear(getDate), DateUtils.getQuarter(getDate),
-                            startDateStr, endduring1Date, bytedanceFinishMediaTask, bytedanceFinishPersonnalTask, kuaishouFinishMediaTask,
-                            kuaishouFinishPersonnalTask, 1);
-                    saveSalePerformanceDetail(advertiser, user, userRole, DateUtils.getYear(getDate), DateUtils.getQuarter(getDate),
-                            endduring1Date, endDateStr, bytedanceFinishMediaTask, bytedanceFinishPersonnalTask, kuaishouFinishMediaTask,
-                            kuaishouFinishPersonnalTask, 0);
+                //1:根据广告主查询用户绑定信息
+                List<UserAllocation> allocations = advertiserService.getAllocationsByAdvertiserId(advertiser.getId());
+                if (null != allocations && allocations.size() > 0) {
+                    Date finalStartSeasonDate = startSeasonDate;
+                    Date finalEndSeasonDate = endSeasonDate;
+                    allocations.forEach(allocation -> {
+                        Date endOldDate = DateUtils.addDay(allocation.getCreateTime(), 90);
+                        if (finalStartSeasonDate.after(endOldDate)) {
+                            //季度开始时间大于新户结束时间(全部按照老户逻辑计算)
+                            saveSalePerformanceDetail(allocation, advertiser, user, userRole, DateUtils.getYear(getDate), DateUtils.getQuarter(getDate),
+                                    startDateStr, endDateStr, bytedanceFinishMediaTask, bytedanceFinishPersonnalTask, kuaishouFinishMediaTask,
+                                    kuaishouFinishPersonnalTask, 0);
+                        } else if (endOldDate.after(finalEndSeasonDate)) {
+                            saveSalePerformanceDetail(allocation, advertiser, user, userRole, DateUtils.getYear(getDate), DateUtils.getQuarter(getDate),
+                                    startDateStr, endDateStr, bytedanceFinishMediaTask, bytedanceFinishPersonnalTask, kuaishouFinishMediaTask,
+                                    kuaishouFinishPersonnalTask, 1);
+                        } else {
+                            //新户结束时间处于本季度中间
+                            String endduring1Date = DateUtils.formatDate(endOldDate);
+                            saveSalePerformanceDetail(allocation, advertiser, user, userRole, DateUtils.getYear(getDate), DateUtils.getQuarter(getDate),
+                                    startDateStr, endduring1Date, bytedanceFinishMediaTask, bytedanceFinishPersonnalTask, kuaishouFinishMediaTask,
+                                    kuaishouFinishPersonnalTask, 1);
+                            saveSalePerformanceDetail(allocation, advertiser, user, userRole, DateUtils.getYear(getDate), DateUtils.getQuarter(getDate),
+                                    endduring1Date, endDateStr, bytedanceFinishMediaTask, bytedanceFinishPersonnalTask, kuaishouFinishMediaTask,
+                                    kuaishouFinishPersonnalTask, 0);
+                        }
+                    });
                 }
             }
         }
     }
 
-    private void saveSalePerformanceDetail(Advertiser advertiser, SysUser user, SysUserRole userRole, int year, int quarter, String startDate, String endDate, BigDecimal bytedanceFinishMediaTask, BigDecimal bytedanceFinishPersonnalTask, BigDecimal kuaishouFinishMediaTask, BigDecimal kuaishouFinishPersonnalTask, Integer brandNew) {
+    private void saveSalePerformanceDetail(UserAllocation allocation, Advertiser advertiser, SysUser user, SysUserRole userRole, int year, int quarter, String startDate, String endDate, BigDecimal bytedanceFinishMediaTask, BigDecimal bytedanceFinishPersonnalTask, BigDecimal kuaishouFinishMediaTask, BigDecimal kuaishouFinishPersonnalTask, Integer brandNew) {
         SalePerformanceDetail detail = new SalePerformanceDetail();
+        detail.setAccountId(allocation.getAccountId());
         detail.setAdvertiserId(advertiser.getId());
         detail.setSaleId(user.getId());
         detail.setRoleId(userRole.getRoleId());
@@ -120,7 +131,7 @@ public class PerformanceSaleServiceImpl implements IPerformanceSaleService {
         detail.setBrandNew(brandNew);
         if (user.getOrgCode().startsWith(CtopAdConstant.HB_BYTEDANCE_SALE_ORG_CODE)) {
             detail.setMediaType(CtopAdConstant.PLATFORM_TYPE_BYTEDANCE);
-            BigDecimal totalCost = performanceService.getSalesSeasonTotalCostByParams(startDate, endDate, null, advertiser.getId(), CtopAdConstant.PLATFORM_TYPE_BYTEDANCE);
+            BigDecimal totalCost = performanceService.getSalesSeasonTotalCostByParams(startDate, endDate, null, null, allocation.getAccountId(), CtopAdConstant.PLATFORM_TYPE_BYTEDANCE);
             if (null == totalCost) {
                 totalCost = BigDecimal.ZERO;
             }
@@ -134,7 +145,7 @@ public class PerformanceSaleServiceImpl implements IPerformanceSaleService {
             salePerformanceDetailService.save(detail);
         } else if (user.getOrgCode().startsWith(CtopAdConstant.HB_KUAISHOU_SALE_ORG_CODE)) {
             detail.setMediaType(CtopAdConstant.PLATFORM_TYPE_KUAISHOU);
-            BigDecimal totalCost = performanceService.getSalesSeasonTotalCostByParams(startDate, endDate, null, advertiser.getId(), CtopAdConstant.PLATFORM_TYPE_KUAISHOU);
+            BigDecimal totalCost = performanceService.getSalesSeasonTotalCostByParams(startDate, endDate, null, null, allocation.getAccountId(), CtopAdConstant.PLATFORM_TYPE_KUAISHOU);
             if (null == totalCost) {
                 totalCost = BigDecimal.ZERO;
             }
@@ -153,7 +164,7 @@ public class PerformanceSaleServiceImpl implements IPerformanceSaleService {
     }
 
     private BigDecimal getPercentagePercent(SalePerformanceDetail detail) {
-        BigDecimal percent = detail.getDoMediaTask().divide(detail.getMediaTask()).multiply(new BigDecimal("100"));
+        BigDecimal percent = detail.getDoMediaTask().divide(detail.getMediaTask(), 4, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal("100"));
         //AM非自拓客户
         if (detail.getRoleId().equals(CtopAdConstant.SYSTEM_SALE_AM_CODE) && detail.getExtensionSelf() != 1) {
             return new BigDecimal("0.0005");

+ 4 - 6
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/vo/SheetInfoVo.java

@@ -1,21 +1,19 @@
 package org.jeecg.modules.ctop.vo;
 
-import org.jeecg.modules.excelutil.entity.KuaishouXxlEntity;
-
 import java.util.List;
 
 /**
  * @author 宋英豪
  */
-public class SheetInfoVo {
+public class SheetInfoVo<T> {
     private String sheetName;
-    List<KuaishouXxlEntity> details;
+    List<T> details;
 
-    public List<KuaishouXxlEntity> getDetails() {
+    public List<T> getDetails() {
         return details;
     }
 
-    public void setDetails(List<KuaishouXxlEntity> details) {
+    public void setDetails(List<T> details) {
         this.details = details;
     }
 

+ 0 - 141
jeecg-boot-module-system/src/main/java/org/jeecg/modules/demo/opencv/FFmpegUtils.java

@@ -1,141 +0,0 @@
-//package org.jeecg.modules.demo.opencv;
-//
-//import java.io.BufferedReader;
-//import java.io.IOException;
-//import java.io.InputStream;
-//import java.io.InputStreamReader;
-//import java.text.SimpleDateFormat;
-//import java.util.ArrayList;
-//import java.util.Date;
-//import java.util.List;
-//import java.util.UUID;
-//
-//public class FFmpegUtils {
-//    public static void videoToPcm(String vedioUrl,String m4aUrl,String ffmpegUrl) throws InterruptedException, IOException {
-//        List<String> commend = new ArrayList<String>();
-//        commend.add(ffmpegUrl);
-//        commend.add("-i");
-//        commend.add(vedioUrl);
-//        commend.add("-vn");
-//        commend.add("y");
-//        commend.add("-acodec");
-//        commend.add("copy");
-//        commend.add(m4aUrl);
-//        ProcessBuilder builder = new ProcessBuilder();
-//        builder.command(commend);
-//        builder.redirectErrorStream(true);
-//        Process process = builder.start();
-//        process.waitFor();// 等待进程执行结束
-//    }
-//
-//    public static void mergeVideodioAndPcm(String videoInputPath, String audioInputPath, String videoOutPath,String ffmpegUrl) throws InterruptedException, IOException {
-//        /**
-//         *  String command = FFMPEG_PATH + " -i " + videoInputPath + " -i " + audioInputPath
-//         *   + " -c:v copy -c:a aac -strict experimental " +
-//         *   " -map 0:v:0 -map 1:a:0 "
-//         *   + " -y " + videoOutPath;
-//         */
-//        List<String> commend = new ArrayList<String>();
-//        commend.add(ffmpegUrl);
-//        commend.add("-i");
-//        commend.add(videoInputPath);
-//        commend.add("-i");
-//        commend.add(audioInputPath);
-//        commend.add(" -c:v");
-//        commend.add("copy");
-//        commend.add("-c:a");
-//        commend.add("acc");
-//        commend.add("-strict");
-//        commend.add("experimental");
-//        commend.add(videoOutPath);
-//        ProcessBuilder builder = new ProcessBuilder();
-//        builder.command(commend);
-//        builder.redirectErrorStream(true);
-//        Process process = builder.start();
-//        process.waitFor();// 等待进程执行结束
-//    }
-//
-//    public static void main(String[] args) throws InterruptedException, IOException {
-////        videoToPcm("D:\\data\\fill.mp4","D:\\data\\fill.m4a","D:\\java\\ffmpeg\\bin\\ffmpeg.exe");
-////        mergeVideodioAndPcm("D:\\data\\merge.mp4","D:\\data\\fill.m4a","D:\\data\\fill2.mp4","D:\\java\\ffmpeg\\bin\\ffmpeg.exe");
-//        try {
-//			videoToAudio("D:\\data\\test\\fill.mp4","D:\\data\\test\\123.mp3");
-//            String videoInputPath = "D:\\data\\test\\merge.mp4";
-//            String audioInputPath = "D:\\data\\test\\123.mp3";
-//            String videoOutPath = "D:\\data\\test\\fill.mp4";
-//            convetor(videoInputPath,audioInputPath,videoOutPath);
-//        } catch (Exception e) {
-//            e.printStackTrace();
-//        }
-//        System.out.println("---------获取音频文件成功!-----------");
-//    }
-//
-//    /**
-//     * @param videoInputPath 原视频的全路径
-//     * @param audioInputPath 音频的全路径
-//     * @param videoOutPath   视频与音频结合之后的视频的路径
-//     * @throws Exception
-//     */
-//    public static void convetor(String videoInputPath, String audioInputPath, String videoOutPath)
-//            throws Exception {
-//        Process process = null;
-//        try {
-//            String command =FFMPEG_PATH + " -i " + videoInputPath + " -i " + audioInputPath + " -c:v copy -c:a aac -strict experimental " +
-//                    " -map 0:v:0 -map 1:a:0 "
-//                    + " -y " + videoOutPath;
-//            System.out.println(command);
-//            process = Runtime.getRuntime().exec(command);
-//            process.waitFor();
-//        } catch (IOException e) {
-//            // TODO Auto-generated catch block
-//            e.printStackTrace();
-//        }
-//        // 使用这种方式会在瞬间大量消耗CPU和内存等系统资源,所以这里我们需要对流进行处理
-//        InputStream errorStream = process.getErrorStream();
-//        InputStreamReader inputStreamReader = new InputStreamReader(errorStream);
-//        BufferedReader br = new BufferedReader(inputStreamReader);
-//
-//        String line = "";
-//        while ((line = br.readLine()) != null) {
-//        }
-//        if (br != null) {
-//            br.close();
-//        }
-//        if (inputStreamReader != null) {
-//            inputStreamReader.close();
-//        }
-//        if (errorStream != null) {
-//            errorStream.close();
-//        }
-//
-//    }
-//
-//    /**
-//     * 从视频中提取音频信息
-//     * @param videoUrl
-//     * @return
-//     */
-//    public static String videoToAudio(String videoUrl,String accFile){
-//        String aacFile = "";
-//        try {
-//            aacFile = TMP_PATH + "/" + new SimpleDateFormat("yyyyMMddHHmmss").format(new Date())
-//                    + UUID.randomUUID().toString().replaceAll("-", "") + ".mp3";
-//            String command =   FFMPEG_PATH + " -i "+ videoUrl + " -vn -acodec copy "+ aacFile;
-//            System.out.println("video to audio command : " + command);
-//            Process process = Runtime.getRuntime().exec(command);
-//            process.waitFor();
-//        } catch (Exception e) {
-//            e.printStackTrace();
-//        }
-//        return "";
-//    }
-//
-//    /**
-//     * FFmpeg全路径
-//     */
-//    private static final String FFMPEG_PATH = "D:\\java\\ffmpeg\\bin\\ffmpeg.exe";
-//    /**
-//     * 音频保存路径
-//     */
-//    private static final String TMP_PATH = "D:\\data\\test";
-//}

+ 0 - 72
jeecg-boot-module-system/src/main/java/org/jeecg/modules/demo/opencv/Test.java

@@ -1,72 +0,0 @@
-//package org.jeecg.modules.demo.opencv;
-//
-//import org.opencv.core.Core;
-//import org.opencv.core.Mat;
-//import org.opencv.core.Size;
-//import org.opencv.imgcodecs.Imgcodecs;
-//import org.opencv.imgproc.Imgproc;
-//
-//public class Test {
-//    public static void initVideo(){
-//        System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
-//        String srcPath = "D:\\data\\images\\";
-//        String fillPath = "D:\\data\\fill\\";
-//        String targetPath = "D:\\data\\video\\";
-//        //1:切分视频
-////        VideoProcessing.grabberVideoFramer("D://data//video.mp4",srcPath);
-////        VideoProcessing.grabberVideoFramer("D://data//fill.mp4",fillPath);
-//        //2:合并图片
-//        int srcPhoneFrameNumFrom = 163;
-//        int changeSenceFrameNumFrom = 234;
-//        //2.1 复制原始视频无变化图片
-////        for(int i=1;i<srcPhoneFrameNumFrom;i++){
-////            Mat srcNoChangeImage = Imgcodecs.imread(srcPath+i+".jpg");
-////            Imgcodecs.imwrite(targetPath+i+".jpg",srcNoChangeImage);
-////        }
-//        String getImageName = "";
-//        //2.2 填充手机内部图片画面
-//        for (int i = 163; i < changeSenceFrameNumFrom; i++) {
-//            String backImg = srcPath + (i) + ".jpg";
-//            String phoneImg = fillPath + (i - 162) + ".jpg";
-//            String targetImg = targetPath + i + ".jpg";
-//            Perspective.perpectiveImg(backImg, phoneImg, targetImg);
-//            getImageName = targetImg;
-//        }
-//        //2.3 转场动画
-//        Mat image = Imgcodecs.imread(getImageName, Imgcodecs.IMREAD_COLOR);
-//        //(1)径向模糊图片
-//        Mat radialBlur = ImageUtils.radialBlur(image);
-//        Imgcodecs.imwrite(targetPath + changeSenceFrameNumFrom + ".jpg", radialBlur);
-//        changeSenceFrameNumFrom++;
-//        //(2)放大后径向模糊图片
-//        Mat bigImamge = new Mat();
-//        Imgproc.resize(image, bigImamge, new Size(image.cols() * 1.25, image.rows() * 1.25));
-//        Mat destBigImamge = ImageUtils.cutFromCenter(bigImamge, image.width(), image.height());
-//        Mat radialBlurDestBigImamge = ImageUtils.radialBlur(destBigImamge);
-//        Imgcodecs.imwrite(targetPath + changeSenceFrameNumFrom + ".jpg", radialBlurDestBigImamge);
-//        changeSenceFrameNumFrom++;
-//        //(3)缩小之后重复平铺加径向模糊
-//        Mat smallImage = new Mat();
-//        Mat halfImage = new Mat();
-//        Mat wholeImage = new Mat();
-//        Imgproc.resize(image, smallImage, new Size(image.cols() / 2, image.rows() / 2));
-//        ImageUtils.hconcat(smallImage, smallImage, halfImage);
-//        ImageUtils.vconcat(halfImage, halfImage, wholeImage);
-//        wholeImage = ImageUtils.radialBlur(wholeImage);
-//        Imgcodecs.imwrite(targetPath + changeSenceFrameNumFrom + ".jpg", wholeImage);
-//        changeSenceFrameNumFrom++;
-//        //复制填充视频无变化图片
-////        for(int i=changeSenceFrameNumFrom;i<100000;i++){
-////            int checkNum = i-3-srcPhoneFrameNumFrom+1;
-////            String fillImagePath = fillPath+checkNum+".jpg";
-////            File file = new File(fillImagePath);
-////            if(file.exists()){
-////                Mat srcMat = Imgcodecs.imread(fillImagePath);
-////                Imgcodecs.imwrite(targetPath+i+".jpg",srcMat);
-////            }else{
-////                break;
-////            }
-////        }
-//    }
-//
-//}

+ 0 - 87
jeecg-boot-module-system/src/main/java/org/jeecg/modules/demo/opencv/VideoProcessing.java

@@ -1,87 +0,0 @@
-/*
-package org.jeecg.modules.demo.opencv;
-
-import org.bytedeco.javacv.FFmpegFrameGrabber;
-import org.bytedeco.javacv.Frame;
-import org.bytedeco.javacv.Java2DFrameConverter;
-
-import javax.imageio.ImageIO;
-import java.awt.image.BufferedImage;
-import java.io.File;
-
-*/
-/**
- * 视频截帧处理
- *//*
-
-public class VideoProcessing {
-    public static String videoPath = "D:/data";
-
-    //存放截取视频某一帧的图片
-    public static String videoFramesPath = "D:/data/images/";
-
-    */
-/**
-     * 将视频文件帧处理并以“jpg”格式进行存储。
-     * 依赖FrameToBufferedImage方法:将frame转换为bufferedImage对象
-     *
-     * @param videoFileName
-     *//*
-
-    public static String grabberVideoFramer(String videoFileName) {
-        //最后获取到的视频的图片的路径
-        String videPicture = "";
-        //Frame对象
-        Frame frame = null;
-        //标识
-        int flag = 0;
-        try {
-			 */
-/*
-            获取视频文件
-            *//*
-
-            FFmpegFrameGrabber fFmpegFrameGrabber = new FFmpegFrameGrabber(videoPath + "/" + videoFileName);
-            fFmpegFrameGrabber.start();
-
-            //获取视频总帧数
-            int ftp = fFmpegFrameGrabber.getLengthInFrames();
-
-            while (flag <= ftp) {
-                frame = fFmpegFrameGrabber.grabImage();
-				*/
-/*
-				对视频的第五帧进行处理
-				 *//*
-
-                if (frame != null) {
-                    //文件绝对路径+名字
-                    String fileName = videoFramesPath + String.valueOf(flag) + ".jpg";
-
-                    //文件储存对象
-                    File outPut = new File(fileName);
-                    ImageIO.write(FrameToBufferedImage(frame), "jpg", outPut);
-                }
-                flag++;
-            }
-            fFmpegFrameGrabber.stop();
-            fFmpegFrameGrabber.close();
-        } catch (Exception E) {
-            E.printStackTrace();
-        }
-        return videPicture;
-    }
-
-    public static BufferedImage FrameToBufferedImage(Frame frame) {
-        //创建BufferedImage对象
-        Java2DFrameConverter converter = new Java2DFrameConverter();
-        BufferedImage bufferedImage = converter.getBufferedImage(frame);
-        return bufferedImage;
-    }
-
-    public static void main(String[] args) {
-        String videoFileName = "video.mp4";
-        grabberVideoFramer(videoFileName);
-    }
-}
-*/

+ 67 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/excelutil/entity/YdMaterialWeekEntity.java

@@ -0,0 +1,67 @@
+package org.jeecg.modules.excelutil.entity;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.metadata.BaseRowModel;
+
+/**
+ * 伊对每周素材统计
+ *
+ * @author 宋英豪
+ */
+public class YdMaterialWeekEntity extends BaseRowModel {
+    /**
+     * 日期
+     */
+    @ExcelProperty(index = 1, value = "日期")
+    private String date;
+
+    /**
+     * 创意类型
+     */
+    @ExcelProperty(index = 1, value = "创意类型")
+    private String type;
+
+    /**
+     * 视频链接/图片数量
+     */
+    @ExcelProperty(index = 1, value = "视频链接/图片数量")
+    private String imageUrl;
+
+    /**
+     * 创意类型
+     */
+    @ExcelProperty(index = 1, value = "创意名称")
+    private String name;
+
+    public String getDate() {
+        return date;
+    }
+
+    public void setDate(String date) {
+        this.date = date;
+    }
+
+    public String getType() {
+        return type;
+    }
+
+    public void setType(String type) {
+        this.type = type;
+    }
+
+    public String getImageUrl() {
+        return imageUrl;
+    }
+
+    public void setImageUrl(String imageUrl) {
+        this.imageUrl = imageUrl;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+}

+ 207 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/excelutil/entity/YdPlanAggregateEntity.java

@@ -0,0 +1,207 @@
+package org.jeecg.modules.excelutil.entity;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.metadata.BaseRowModel;
+
+/**
+ * 伊对计划汇总报表信息
+ *
+ * @author 宋英豪
+ */
+public class YdPlanAggregateEntity extends BaseRowModel {
+    /**
+     * 账号名称
+     */
+    @ExcelProperty(index = 1, value = "账号名称")
+    private String accountName;
+
+    /**
+     * 投放时间
+     */
+    @ExcelProperty(index = 2, value = "投放时间")
+    private String date;
+
+    /**
+     * 计划名称
+     */
+    @ExcelProperty(index = 3, value = "计划名称")
+    private String planName;
+
+    /**
+     * 总花费(元)
+     */
+    @ExcelProperty(index = 4, value = "总花费(元)")
+    private String totalCost;
+
+    /**
+     * 展示
+     */
+    @ExcelProperty(index = 5, value = "展示")
+    private String showNum;
+
+    /**
+     * 点击
+     */
+    @ExcelProperty(index = 6, value = "点击")
+    private String clickNum;
+
+    /**
+     * 点击率(%)
+     */
+    @ExcelProperty(index = 7, value = "点击率(%)")
+    private String clickRate;
+
+    /**
+     * 平均点击单价(元)
+     */
+    @ExcelProperty(index = 8, value = "平均点击单价(元)")
+    private String priceAvg;
+
+    /**
+     * 平均千次展现费用(元)
+     */
+    @ExcelProperty(index = 9, value = "平均千次展现费用(元)")
+    private String ctr;
+
+    /**
+     * 转化数
+     */
+    @ExcelProperty(index = 10, value = "转化数")
+    private String convertNum;
+
+    /**
+     * 转化成本
+     */
+    @ExcelProperty(index = 11, value = "转化成本")
+    private String convertPrice;
+
+    /**
+     * 转化率(%)
+     */
+    @ExcelProperty(index = 12, value = "转化率(%)")
+    private String convertRate;
+
+    /**
+     * 投放平台
+     */
+    @ExcelProperty(index = 13, value = "投放平台")
+    private String platform;
+
+    /**
+     * 投放性别
+     */
+    @ExcelProperty(index = 14, value = "投放性别")
+    private String sex;
+
+    public String getAccountName() {
+        return accountName;
+    }
+
+    public void setAccountName(String accountName) {
+        this.accountName = accountName;
+    }
+
+    public String getDate() {
+        return date;
+    }
+
+    public void setDate(String date) {
+        this.date = date;
+    }
+
+    public String getPlanName() {
+        return planName;
+    }
+
+    public void setPlanName(String planName) {
+        this.planName = planName;
+    }
+
+    public String getTotalCost() {
+        return totalCost;
+    }
+
+    public void setTotalCost(String totalCost) {
+        this.totalCost = totalCost;
+    }
+
+    public String getClickRate() {
+        return clickRate;
+    }
+
+    public void setClickRate(String clickRate) {
+        this.clickRate = clickRate;
+    }
+
+    public String getPriceAvg() {
+        return priceAvg;
+    }
+
+    public void setPriceAvg(String priceAvg) {
+        this.priceAvg = priceAvg;
+    }
+
+    public String getCtr() {
+        return ctr;
+    }
+
+    public void setCtr(String ctr) {
+        this.ctr = ctr;
+    }
+
+    public String getShowNum() {
+        return showNum;
+    }
+
+    public void setShowNum(String showNum) {
+        this.showNum = showNum;
+    }
+
+    public String getClickNum() {
+        return clickNum;
+    }
+
+    public void setClickNum(String clickNum) {
+        this.clickNum = clickNum;
+    }
+
+    public String getConvertNum() {
+        return convertNum;
+    }
+
+    public void setConvertNum(String convertNum) {
+        this.convertNum = convertNum;
+    }
+
+    public String getConvertPrice() {
+        return convertPrice;
+    }
+
+    public void setConvertPrice(String convertPrice) {
+        this.convertPrice = convertPrice;
+    }
+
+    public String getConvertRate() {
+        return convertRate;
+    }
+
+    public void setConvertRate(String convertRate) {
+        this.convertRate = convertRate;
+    }
+
+    public String getPlatform() {
+        return platform;
+    }
+
+    public void setPlatform(String platform) {
+        this.platform = platform;
+    }
+
+    public String getSex() {
+        return sex;
+    }
+
+    public void setSex(String sex) {
+        this.sex = sex;
+    }
+}

+ 64 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/excelutil/entity/YdWeekAggregateEntity.java

@@ -0,0 +1,64 @@
+package org.jeecg.modules.excelutil.entity;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.metadata.BaseRowModel;
+
+/**
+ * 伊对周报汇总
+ *
+ * @author 宋英豪
+ */
+public class YdWeekAggregateEntity extends BaseRowModel {
+    /**
+     * 时间
+     */
+    @ExcelProperty(index = 1, value = "时间")
+    private String date;
+    /**
+     * 时间
+     */
+    @ExcelProperty(index = 2, value = "总消费")
+    private String cost;
+    /**
+     * 时间
+     */
+    @ExcelProperty(index = 3, value = "激活数(头条)")
+    private String active;
+    /**
+     * 时间
+     */
+    @ExcelProperty(index = 4, value = "激活成本(头条)")
+    private String activeAvg;
+
+    public String getDate() {
+        return date;
+    }
+
+    public void setDate(String date) {
+        this.date = date;
+    }
+
+    public String getCost() {
+        return cost;
+    }
+
+    public void setCost(String cost) {
+        this.cost = cost;
+    }
+
+    public String getActive() {
+        return active;
+    }
+
+    public void setActive(String active) {
+        this.active = active;
+    }
+
+    public String getActiveAvg() {
+        return activeAvg;
+    }
+
+    public void setActiveAvg(String activeAvg) {
+        this.activeAvg = activeAvg;
+    }
+}

+ 164 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/opencv/controller/ModelVideoCompositeInfoController.java

@@ -0,0 +1,164 @@
+package org.jeecg.modules.opencv.controller;
+
+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.modules.opencv.entity.ModelVideoCompositeInfo;
+import org.jeecg.modules.opencv.service.IModelVideoCompositeInfoService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.Arrays;
+
+/**
+ * 模板合成视频
+ *
+ * @author jeecg-boot
+ * @version V1.0
+ * @date 2020-04-17
+ */
+@Slf4j
+@Api(tags = "模板合成视频")
+@RestController
+@RequestMapping("/ctop/modelVideoCompositeInfo")
+public class ModelVideoCompositeInfoController {
+    @Autowired
+    private IModelVideoCompositeInfoService modelVideoCompositeInfoService;
+
+    /**
+     * 分页列表查询
+     *
+     * @param modelVideoCompositeInfo
+     * @param pageNo
+     * @param pageSize
+     * @param req
+     * @return
+     */
+    @AutoLog(value = "模板合成视频-分页列表查询")
+    @ApiOperation(value = "模板合成视频-分页列表查询", notes = "模板合成视频-分页列表查询")
+    @GetMapping(value = "/list")
+    public Result<IPage<ModelVideoCompositeInfo>> queryPageList(ModelVideoCompositeInfo modelVideoCompositeInfo,
+                                                                @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
+                                                                @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
+                                                                HttpServletRequest req) {
+        Result<IPage<ModelVideoCompositeInfo>> result = new Result<IPage<ModelVideoCompositeInfo>>();
+        QueryWrapper<ModelVideoCompositeInfo> queryWrapper = QueryGenerator.initQueryWrapper(modelVideoCompositeInfo, req.getParameterMap());
+        Page<ModelVideoCompositeInfo> page = new Page<ModelVideoCompositeInfo>(pageNo, pageSize);
+        IPage<ModelVideoCompositeInfo> pageList = modelVideoCompositeInfoService.page(page, queryWrapper);
+        result.setSuccess(true);
+        result.setResult(pageList);
+        return result;
+    }
+
+    /**
+     * 添加
+     *
+     * @param modelVideoCompositeInfo
+     * @return
+     */
+    @AutoLog(value = "模板合成视频-添加")
+    @ApiOperation(value = "模板合成视频-添加", notes = "模板合成视频-添加")
+    @PostMapping(value = "/add")
+    public Result<ModelVideoCompositeInfo> add(@RequestBody ModelVideoCompositeInfo modelVideoCompositeInfo) {
+        Result<ModelVideoCompositeInfo> result = new Result<ModelVideoCompositeInfo>();
+        try {
+            modelVideoCompositeInfoService.save(modelVideoCompositeInfo);
+            result.success("添加成功!");
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+            result.error500("操作失败");
+        }
+        return result;
+    }
+
+    /**
+     * 编辑
+     *
+     * @param modelVideoCompositeInfo
+     * @return
+     */
+    @AutoLog(value = "模板合成视频-编辑")
+    @ApiOperation(value = "模板合成视频-编辑", notes = "模板合成视频-编辑")
+    @PutMapping(value = "/edit")
+    public Result<ModelVideoCompositeInfo> edit(@RequestBody ModelVideoCompositeInfo modelVideoCompositeInfo) {
+        Result<ModelVideoCompositeInfo> result = new Result<ModelVideoCompositeInfo>();
+        ModelVideoCompositeInfo modelVideoCompositeInfoEntity = modelVideoCompositeInfoService.getById(modelVideoCompositeInfo.getId());
+        if (modelVideoCompositeInfoEntity == null) {
+            result.error500("未找到对应实体");
+        } else {
+            boolean ok = modelVideoCompositeInfoService.updateById(modelVideoCompositeInfo);
+            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 {
+            modelVideoCompositeInfoService.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<ModelVideoCompositeInfo> deleteBatch(@RequestParam(name = "ids", required = true) String ids) {
+        Result<ModelVideoCompositeInfo> result = new Result<ModelVideoCompositeInfo>();
+        if (ids == null || "".equals(ids.trim())) {
+            result.error500("参数不识别!");
+        } else {
+            this.modelVideoCompositeInfoService.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<ModelVideoCompositeInfo> queryById(@RequestParam(name = "id", required = true) String id) {
+        Result<ModelVideoCompositeInfo> result = new Result<ModelVideoCompositeInfo>();
+        ModelVideoCompositeInfo modelVideoCompositeInfo = modelVideoCompositeInfoService.getById(id);
+        if (modelVideoCompositeInfo == null) {
+            result.error500("未找到对应实体");
+        } else {
+            result.setResult(modelVideoCompositeInfo);
+            result.setSuccess(true);
+        }
+        return result;
+    }
+}

+ 178 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/opencv/controller/ModelVideoInfoConfigController.java

@@ -0,0 +1,178 @@
+package org.jeecg.modules.opencv.controller;
+
+import com.alibaba.fastjson.JSONObject;
+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.jeecg.modules.opencv.entity.ModelVideoInfoConfig;
+import org.jeecg.modules.opencv.service.IFfmpegService;
+import org.jeecg.modules.opencv.service.IModelVideoInfoConfigService;
+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.Map;
+
+/**
+ * 模板视频配置信息
+ *
+ * @author jeecg-boot
+ * @version V1.0
+ * @date 2020-04-17
+ */
+@Slf4j
+@Api(tags = "模板视频配置信息")
+@RestController
+@RequestMapping("/ctop/modelVideoInfoConfig")
+public class ModelVideoInfoConfigController {
+    @Autowired
+    private IModelVideoInfoConfigService modelVideoInfoConfigService;
+
+    /**
+     * 分页列表查询
+     *
+     * @param modelVideoInfoConfig
+     * @param pageNo
+     * @param pageSize
+     * @param req
+     * @return
+     */
+    @AutoLog(value = "模板视频配置信息-分页列表查询")
+    @ApiOperation(value = "模板视频配置信息-分页列表查询", notes = "模板视频配置信息-分页列表查询")
+    @GetMapping(value = "/list")
+    public Result<IPage<ModelVideoInfoConfig>> queryPageList(ModelVideoInfoConfig modelVideoInfoConfig,
+                                                             @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
+                                                             @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
+                                                             HttpServletRequest req) {
+        Result<IPage<ModelVideoInfoConfig>> result = new Result<IPage<ModelVideoInfoConfig>>();
+        QueryWrapper<ModelVideoInfoConfig> queryWrapper = QueryGenerator.initQueryWrapper(modelVideoInfoConfig, req.getParameterMap());
+        Page<ModelVideoInfoConfig> page = new Page<ModelVideoInfoConfig>(pageNo, pageSize);
+        IPage<ModelVideoInfoConfig> pageList = modelVideoInfoConfigService.page(page, queryWrapper);
+        result.setSuccess(true);
+        result.setResult(pageList);
+        return result;
+    }
+
+    @RequestMapping("/videoMerge")
+    public Map<String, Object> videoMerge(@RequestBody JSONObject data) {
+        LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();
+        return ffmpegService.videoMerge(data, user.getId());
+    }
+
+    @Autowired
+    IFfmpegService ffmpegService;
+
+    /**
+     * 添加
+     *
+     * @param modelVideoInfoConfig
+     * @return
+     */
+    @AutoLog(value = "模板视频配置信息-添加")
+    @ApiOperation(value = "模板视频配置信息-添加", notes = "模板视频配置信息-添加")
+    @PostMapping(value = "/add")
+    public Result<ModelVideoInfoConfig> add(@RequestBody ModelVideoInfoConfig modelVideoInfoConfig) {
+        Result<ModelVideoInfoConfig> result = new Result<ModelVideoInfoConfig>();
+        try {
+            modelVideoInfoConfigService.save(modelVideoInfoConfig);
+            result.success("添加成功!");
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+            result.error500("操作失败");
+        }
+        return result;
+    }
+
+    /**
+     * 编辑
+     *
+     * @param modelVideoInfoConfig
+     * @return
+     */
+    @AutoLog(value = "模板视频配置信息-编辑")
+    @ApiOperation(value = "模板视频配置信息-编辑", notes = "模板视频配置信息-编辑")
+    @PutMapping(value = "/edit")
+    public Result<ModelVideoInfoConfig> edit(@RequestBody ModelVideoInfoConfig modelVideoInfoConfig) {
+        Result<ModelVideoInfoConfig> result = new Result<ModelVideoInfoConfig>();
+        ModelVideoInfoConfig modelVideoInfoConfigEntity = modelVideoInfoConfigService.getById(modelVideoInfoConfig.getId());
+        if (modelVideoInfoConfigEntity == null) {
+            result.error500("未找到对应实体");
+        } else {
+            boolean ok = modelVideoInfoConfigService.updateById(modelVideoInfoConfig);
+            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 {
+            modelVideoInfoConfigService.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<ModelVideoInfoConfig> deleteBatch(@RequestParam(name = "ids", required = true) String ids) {
+        Result<ModelVideoInfoConfig> result = new Result<ModelVideoInfoConfig>();
+        if (ids == null || "".equals(ids.trim())) {
+            result.error500("参数不识别!");
+        } else {
+            this.modelVideoInfoConfigService.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<ModelVideoInfoConfig> queryById(@RequestParam(name = "id", required = true) String id) {
+        Result<ModelVideoInfoConfig> result = new Result<ModelVideoInfoConfig>();
+        ModelVideoInfoConfig modelVideoInfoConfig = modelVideoInfoConfigService.getById(id);
+        if (modelVideoInfoConfig == null) {
+            result.error500("未找到对应实体");
+        } else {
+            result.setResult(modelVideoInfoConfig);
+            result.setSuccess(true);
+        }
+        return result;
+    }
+}

+ 180 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/opencv/controller/ModelVideoInfoController.java

@@ -0,0 +1,180 @@
+package org.jeecg.modules.opencv.controller;
+
+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.modules.opencv.entity.ModelVideoInfo;
+import org.jeecg.modules.opencv.service.IModelVideoInfoService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.Arrays;
+
+/**
+ * 模板视频信息
+ *
+ * @author jeecg-boot
+ * @version V1.0
+ * @date 2020-04-17
+ */
+@Slf4j
+@Api(tags = "模板视频信息")
+@RestController
+@RequestMapping("/ctop/modelVideoInfo")
+public class ModelVideoInfoController {
+    @Autowired
+    private IModelVideoInfoService modelVideoInfoService;
+
+    /**
+     * 分页列表查询
+     *
+     * @param modelVideoInfo
+     * @param pageNo
+     * @param pageSize
+     * @param req
+     * @return
+     */
+    @AutoLog(value = "模板视频信息-分页列表查询")
+    @ApiOperation(value = "模板视频信息-分页列表查询", notes = "模板视频信息-分页列表查询")
+    @GetMapping(value = "/list")
+    public Result<IPage<ModelVideoInfo>> queryPageList(ModelVideoInfo modelVideoInfo,
+                                                       @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
+                                                       @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
+                                                       HttpServletRequest req) {
+        Result<IPage<ModelVideoInfo>> result = new Result<>();
+        String title = modelVideoInfo.getTitle();
+        modelVideoInfo.setTitle(null);
+        Integer orderType = modelVideoInfo.getOrderType();
+        modelVideoInfo.setOrderType(null);
+        QueryWrapper<ModelVideoInfo> queryWrapper = QueryGenerator.initQueryWrapper(modelVideoInfo, req.getParameterMap());
+        if (null != orderType && orderType == 1) {
+            queryWrapper.orderByDesc("model_type", "id");
+        } else if (orderType == 2) {
+            queryWrapper.orderByDesc("id");
+        }
+        if (null != title && !title.trim().equals("")) {
+            queryWrapper.like("title", title);
+        }
+        Page<ModelVideoInfo> page = new Page<>(pageNo, pageSize);
+        IPage<ModelVideoInfo> pageList = modelVideoInfoService.page(page, queryWrapper);
+        result.setSuccess(true);
+        result.setResult(pageList);
+        return result;
+    }
+
+
+    /**
+     * 添加
+     *
+     * @param modelVideoInfo
+     * @return
+     */
+    @AutoLog(value = "模板视频信息-添加")
+    @ApiOperation(value = "模板视频信息-添加", notes = "模板视频信息-添加")
+    @PostMapping(value = "/add")
+    public Result<ModelVideoInfo> add(@RequestBody ModelVideoInfo modelVideoInfo) {
+        Result<ModelVideoInfo> result = new Result<>();
+        try {
+            modelVideoInfo.setModelVideoUrl("https:" + modelVideoInfo.getModelVideoUrl());
+            modelVideoInfo.setStatus(1);
+            modelVideoInfo.setModelType(1);
+            modelVideoInfoService.save(modelVideoInfo);
+            result.success("添加成功!");
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+            result.error500("操作失败");
+        }
+        return result;
+    }
+
+    /**
+     * 编辑
+     *
+     * @param modelVideoInfo
+     * @return
+     */
+    @AutoLog(value = "模板视频信息-编辑")
+    @ApiOperation(value = "模板视频信息-编辑", notes = "模板视频信息-编辑")
+    @PutMapping(value = "/edit")
+    public Result<ModelVideoInfo> edit(@RequestBody ModelVideoInfo modelVideoInfo) {
+        Result<ModelVideoInfo> result = new Result<>();
+        ModelVideoInfo modelVideoInfoEntity = modelVideoInfoService.getById(modelVideoInfo.getId());
+        if (modelVideoInfoEntity == null) {
+            result.error500("未找到对应实体");
+        } else {
+            boolean ok = modelVideoInfoService.updateById(modelVideoInfo);
+            if (ok) {
+                result.success("修改成功!");
+            }
+        }
+
+        return result;
+    }
+
+    /**
+     * 通过id删除
+     *
+     * @param id id
+     * @return 操作结果
+     */
+    @AutoLog(value = "模板视频信息-通过id删除")
+    @ApiOperation(value = "模板视频信息-通过id删除", notes = "模板视频信息-通过id删除")
+    @DeleteMapping(value = "/delete")
+    public Result<?> delete(@RequestParam(name = "id", required = true) String id) {
+        try {
+            modelVideoInfoService.removeById(id);
+        } catch (Exception e) {
+            log.error("删除失败", e.getMessage());
+            return Result.error("删除失败!");
+        }
+        return Result.ok("删除成功!");
+    }
+
+    /**
+     * 批量删除
+     *
+     * @param ids id信息
+     * @return 操作结果
+     */
+    @AutoLog(value = "模板视频信息-批量删除")
+    @ApiOperation(value = "模板视频信息-批量删除", notes = "模板视频信息-批量删除")
+    @DeleteMapping(value = "/deleteBatch")
+    public Result<ModelVideoInfo> deleteBatch(@RequestParam(name = "ids", required = true) String ids) {
+        Result<ModelVideoInfo> result = new Result<>();
+        if (ids == null || "".equals(ids.trim())) {
+            result.error500("参数不识别!");
+        } else {
+            this.modelVideoInfoService.removeByIds(Arrays.asList(ids.split(",")));
+            result.success("删除成功!");
+        }
+        return result;
+    }
+
+    /**
+     * 通过id查询
+     *
+     * @param id id
+     * @return 查询结果信息
+     */
+    @AutoLog(value = "模板视频信息-通过id查询")
+    @ApiOperation(value = "模板视频信息-通过id查询", notes = "模板视频信息-通过id查询")
+    @GetMapping(value = "/queryById")
+    public Result<ModelVideoInfo> queryById(@RequestParam(name = "id", required = true) String id) {
+        Result<ModelVideoInfo> result = new Result<>();
+        ModelVideoInfo modelVideoInfo = modelVideoInfoService.getById(id);
+        if (modelVideoInfo == null) {
+            result.error500("未找到对应实体");
+        } else {
+            result.setResult(modelVideoInfo);
+            result.setSuccess(true);
+        }
+        return result;
+    }
+}

+ 248 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/opencv/controller/ModelVideoInfoTagController.java

@@ -0,0 +1,248 @@
+package org.jeecg.modules.opencv.controller;
+
+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.jeecg.modules.opencv.entity.ModelVideoInfoTag;
+import org.jeecg.modules.opencv.service.IModelVideoInfoTagService;
+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-04-17
+ */
+@Slf4j
+@Api(tags = "模板视频分类信息")
+@RestController
+@RequestMapping("/ctop/modelVideoInfoTag")
+public class ModelVideoInfoTagController {
+    @Autowired
+    private IModelVideoInfoTagService modelVideoInfoTagService;
+
+    /**
+     * 分页列表查询
+     *
+     * @param modelVideoInfoTag
+     * @param pageNo
+     * @param pageSize
+     * @param req
+     * @return
+     */
+    @AutoLog(value = "模板视频分类信息-分页列表查询")
+    @ApiOperation(value = "模板视频分类信息-分页列表查询", notes = "模板视频分类信息-分页列表查询")
+    @GetMapping(value = "/list")
+    public Result<IPage<ModelVideoInfoTag>> queryPageList(ModelVideoInfoTag modelVideoInfoTag,
+                                                          @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
+                                                          @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
+                                                          HttpServletRequest req) {
+        Result<IPage<ModelVideoInfoTag>> result = new Result<IPage<ModelVideoInfoTag>>();
+        QueryWrapper<ModelVideoInfoTag> queryWrapper = QueryGenerator.initQueryWrapper(modelVideoInfoTag, req.getParameterMap());
+        Page<ModelVideoInfoTag> page = new Page<ModelVideoInfoTag>(pageNo, pageSize);
+        IPage<ModelVideoInfoTag> pageList = modelVideoInfoTagService.page(page, queryWrapper);
+        result.setSuccess(true);
+        result.setResult(pageList);
+        return result;
+    }
+
+    /**
+     * 添加
+     *
+     * @param modelVideoInfoTag
+     * @return
+     */
+    @AutoLog(value = "模板视频分类信息-添加")
+    @ApiOperation(value = "模板视频分类信息-添加", notes = "模板视频分类信息-添加")
+    @PostMapping(value = "/add")
+    public Result<ModelVideoInfoTag> add(@RequestBody ModelVideoInfoTag modelVideoInfoTag) {
+        Result<ModelVideoInfoTag> result = new Result<ModelVideoInfoTag>();
+        try {
+            modelVideoInfoTagService.save(modelVideoInfoTag);
+            result.success("添加成功!");
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+            result.error500("操作失败");
+        }
+        return result;
+    }
+
+    /**
+     * 编辑
+     *
+     * @param modelVideoInfoTag
+     * @return
+     */
+    @AutoLog(value = "模板视频分类信息-编辑")
+    @ApiOperation(value = "模板视频分类信息-编辑", notes = "模板视频分类信息-编辑")
+    @PutMapping(value = "/edit")
+    public Result<ModelVideoInfoTag> edit(@RequestBody ModelVideoInfoTag modelVideoInfoTag) {
+        Result<ModelVideoInfoTag> result = new Result<ModelVideoInfoTag>();
+        ModelVideoInfoTag modelVideoInfoTagEntity = modelVideoInfoTagService.getById(modelVideoInfoTag.getId());
+        if (modelVideoInfoTagEntity == null) {
+            result.error500("未找到对应实体");
+        } else {
+            boolean ok = modelVideoInfoTagService.updateById(modelVideoInfoTag);
+            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 {
+            modelVideoInfoTagService.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<ModelVideoInfoTag> deleteBatch(@RequestParam(name = "ids", required = true) String ids) {
+        Result<ModelVideoInfoTag> result = new Result<ModelVideoInfoTag>();
+        if (ids == null || "".equals(ids.trim())) {
+            result.error500("参数不识别!");
+        } else {
+            this.modelVideoInfoTagService.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<ModelVideoInfoTag> queryById(@RequestParam(name = "id", required = true) String id) {
+        Result<ModelVideoInfoTag> result = new Result<ModelVideoInfoTag>();
+        ModelVideoInfoTag modelVideoInfoTag = modelVideoInfoTagService.getById(id);
+        if (modelVideoInfoTag == null) {
+            result.error500("未找到对应实体");
+        } else {
+            result.setResult(modelVideoInfoTag);
+            result.setSuccess(true);
+        }
+        return result;
+    }
+
+    /**
+     * 导出excel
+     *
+     * @param request
+     * @param response
+     */
+    @RequestMapping(value = "/exportXls")
+    public ModelAndView exportXls(HttpServletRequest request, HttpServletResponse response) {
+        // Step.1 组装查询条件
+        QueryWrapper<ModelVideoInfoTag> queryWrapper = null;
+        try {
+            String paramsStr = request.getParameter("paramsStr");
+            if (oConvertUtils.isNotEmpty(paramsStr)) {
+                String deString = URLDecoder.decode(paramsStr, "UTF-8");
+                ModelVideoInfoTag modelVideoInfoTag = JSON.parseObject(deString, ModelVideoInfoTag.class);
+                queryWrapper = QueryGenerator.initQueryWrapper(modelVideoInfoTag, request.getParameterMap());
+            }
+        } catch (UnsupportedEncodingException e) {
+            e.printStackTrace();
+        }
+
+        //Step.2 AutoPoi 导出Excel
+        ModelAndView mv = new ModelAndView(new JeecgEntityExcelView());
+        List<ModelVideoInfoTag> pageList = modelVideoInfoTagService.list(queryWrapper);
+        //导出文件名称
+        mv.addObject(NormalExcelConstants.FILE_NAME, "模板视频分类信息列表");
+        mv.addObject(NormalExcelConstants.CLASS, ModelVideoInfoTag.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<ModelVideoInfoTag> listModelVideoInfoTags = ExcelImportUtil.importExcel(file.getInputStream(), ModelVideoInfoTag.class, params);
+                modelVideoInfoTagService.saveBatch(listModelVideoInfoTags);
+                return Result.ok("文件导入成功!数据行数:" + listModelVideoInfoTags.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("文件导入失败!");
+    }
+
+}

+ 77 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/opencv/entity/ModelVideoCompositeInfo.java

@@ -0,0 +1,77 @@
+package org.jeecg.modules.opencv.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+import org.jeecgframework.poi.excel.annotation.Excel;
+
+import java.util.Date;
+
+/**
+ * 模板合成视频
+ *
+ * @author jeecg-boot
+ * @version V1.0
+ * @date 2020-04-17
+ */
+@Data
+@TableName("ctop_model_video_composite_info")
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value = "ctop_model_video_composite_info对象", description = "模板合成视频")
+public class ModelVideoCompositeInfo {
+
+    /**
+     * id
+     */
+    @TableId(type = IdType.AUTO)
+    @ApiModelProperty(value = "id")
+    private Long id;
+    /**
+     * videoUrl
+     */
+    @Excel(name = "videoUrl", width = 15)
+    @ApiModelProperty(value = "videoUrl")
+    private String videoUrl;
+    /**
+     * 模板id
+     */
+    @Excel(name = "模板id", width = 15)
+    @ApiModelProperty(value = "模板id")
+    private Long modelId;
+    /**
+     * userId
+     */
+    @Excel(name = "userId", width = 15)
+    @ApiModelProperty(value = "userId")
+    private String userId;
+    /**
+     * createTime
+     */
+    @ApiModelProperty(value = "createTime")
+    private Date createTime;
+    /**
+     * updateTime
+     */
+    @ApiModelProperty(value = "updateTime")
+    private Date updateTime;
+
+    private Integer sizeType;
+
+    public ModelVideoCompositeInfo(String userId, ModelVideoInfo videoInfo, String finalUrl) {
+        this.userId = userId;
+        this.modelId = videoInfo.getId();
+        this.videoUrl = finalUrl;
+        this.sizeType = videoInfo.getSizeType();
+        this.createTime = new Date();
+        this.updateTime = new Date();
+    }
+
+    public ModelVideoCompositeInfo() {
+    }
+}

+ 76 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/opencv/entity/ModelVideoInfo.java

@@ -0,0 +1,76 @@
+package org.jeecg.modules.opencv.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 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-17
+ */
+@Data
+@TableName("ctop_model_video_info")
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value = "ctop_model_video_info对象", description = "模板视频信息")
+public class ModelVideoInfo {
+
+    /**
+     * id
+     */
+    @TableId(type = IdType.AUTO)
+    @ApiModelProperty(value = "id")
+    private Long id;
+    /**
+     * 视频链接
+     */
+    private String modelVideoUrl;
+    private String title;
+    /**
+     * 封面链接
+     */
+    private String coverImageUrl;
+    /**
+     * 模板类型
+     */
+    private Integer modelType;
+    /**
+     * 尺寸类型 1:竖版 2:横版
+     */
+    private Integer sizeType;
+    /**
+     * 状态
+     */
+    @Excel(name = "状态", width = 15)
+    @ApiModelProperty(value = "状态")
+    private Integer status;
+    /**
+     * MD5
+     */
+    private String signature;
+    /**
+     * createTime
+     */
+    @ApiModelProperty(value = "createTime")
+    private Date createTime;
+    /**
+     * updateTime
+     */
+    @ApiModelProperty(value = "updateTime")
+    private Date updateTime;
+
+    @TableField(exist = false)
+    private Integer orderType;
+}

+ 117 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/opencv/entity/ModelVideoInfoConfig.java

@@ -0,0 +1,117 @@
+package org.jeecg.modules.opencv.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+import org.jeecgframework.poi.excel.annotation.Excel;
+
+import java.util.Date;
+
+/**
+ * 模板视频配置信息
+ *
+ * @author jeecg-boot
+ * @version V1.0
+ * @date 2020-04-17
+ */
+@Data
+@TableName("ctop_model_video_info_config")
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value = "ctop_model_video_info_config对象", description = "模板视频配置信息")
+public class ModelVideoInfoConfig {
+
+    /**
+     * id
+     */
+    @TableId(type = IdType.UUID)
+    @ApiModelProperty(value = "id")
+    private Integer id;
+    /**
+     * name
+     */
+    @Excel(name = "name", width = 15)
+    @ApiModelProperty(value = "name")
+    private String name;
+    /**
+     * 文件路径
+     */
+    @Excel(name = "文件路径", width = 15)
+    @ApiModelProperty(value = "文件路径")
+    private String fileUrl;
+    /**
+     * modelId
+     */
+    @Excel(name = "modelId", width = 15)
+    @ApiModelProperty(value = "modelId")
+    private Integer modelId;
+    /**
+     * 1:简单后接模板2:复杂投影模板
+     */
+    @Excel(name = "1:简单后接模板2:复杂投影模板", width = 15)
+    @ApiModelProperty(value = "1:简单后接模板2:复杂投影模板")
+    private Integer type;
+    /**
+     * 矩形替换开始帧数
+     */
+    @Excel(name = "矩形替换开始帧数", width = 15)
+    @ApiModelProperty(value = "矩形替换开始帧数")
+    private Integer rectangleStartFrame;
+    /**
+     * 矩形替换结束帧数
+     */
+    @Excel(name = "矩形替换结束帧数", width = 15)
+    @ApiModelProperty(value = "矩形替换结束帧数")
+    private Integer rectangleEndFrame;
+    /**
+     * 全屏替换开始帧数
+     */
+    @Excel(name = "全屏替换开始帧数", width = 15)
+    @ApiModelProperty(value = "全屏替换开始帧数")
+    private Integer fullScreenStartFrame;
+    /**
+     * 全屏替换结束帧数
+     */
+    @Excel(name = "全屏替换结束帧数", width = 15)
+    @ApiModelProperty(value = "全屏替换结束帧数")
+    private Integer fullScreenEndFrame;
+    /**
+     * rectangleStartX
+     */
+    @Excel(name = "rectangleStartX", width = 15)
+    @ApiModelProperty(value = "rectangleStartX")
+    private Integer rectangleStartX;
+    /**
+     * rectangleEndX
+     */
+    @Excel(name = "rectangleEndX", width = 15)
+    @ApiModelProperty(value = "rectangleEndX")
+    private Integer rectangleEndX;
+    /**
+     * rectangleStartY
+     */
+    @Excel(name = "rectangleStartY", width = 15)
+    @ApiModelProperty(value = "rectangleStartY")
+    private Integer rectangleStartY;
+    /**
+     * rectangleEndY
+     */
+    @Excel(name = "rectangleEndY", width = 15)
+    @ApiModelProperty(value = "rectangleEndY")
+    private Integer rectangleEndY;
+    /**
+     * createTime
+     */
+    @ApiModelProperty(value = "createTime")
+    private Date createTime;
+    /**
+     * updateTime
+     */
+    @ApiModelProperty(value = "updateTime")
+    private Date updateTime;
+}

+ 73 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/opencv/entity/ModelVideoInfoTag.java

@@ -0,0 +1,73 @@
+package org.jeecg.modules.opencv.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-17
+ */
+@Data
+@TableName("ctop_model_video_industry_tag")
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value = "ctop_model_video_industry_tag对象", description = "模板视频分类信息")
+public class ModelVideoInfoTag {
+
+    /**
+     * id
+     */
+    @TableId(type = IdType.UUID)
+    @ApiModelProperty(value = "id")
+    private Integer id;
+    /**
+     * tagName
+     */
+    @Excel(name = "tagName", width = 15)
+    @ApiModelProperty(value = "tagName")
+    private String tagName;
+    /**
+     * tagCode
+     */
+    @Excel(name = "tagCode", width = 15)
+    @ApiModelProperty(value = "tagCode")
+    private String tagCode;
+    /**
+     * parentId
+     */
+    @Excel(name = "parentId", width = 15)
+    @ApiModelProperty(value = "parentId")
+    private Integer parentId;
+    /**
+     * level
+     */
+    @Excel(name = "level", width = 15)
+    @ApiModelProperty(value = "level")
+    private Integer level;
+    /**
+     * createTime
+     */
+    @ApiModelProperty(value = "createTime")
+    private Date createTime;
+    /**
+     * updateTime
+     */
+    @ApiModelProperty(value = "updateTime")
+    private Date updateTime;
+}

+ 15 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/opencv/mapper/ModelVideoCompositeInfoMapper.java

@@ -0,0 +1,15 @@
+package org.jeecg.modules.opencv.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.jeecg.modules.opencv.entity.ModelVideoCompositeInfo;
+
+/**
+ * 模板合成视频
+ *
+ * @author: jeecg-boot
+ * @date: 2020-04-17
+ * @cersion: V1.0
+ */
+public interface ModelVideoCompositeInfoMapper extends BaseMapper<ModelVideoCompositeInfo> {
+
+}

+ 15 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/opencv/mapper/ModelVideoInfoConfigMapper.java

@@ -0,0 +1,15 @@
+package org.jeecg.modules.opencv.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.jeecg.modules.opencv.entity.ModelVideoInfoConfig;
+
+/**
+ * 模板视频配置信息
+ *
+ * @author: jeecg-boot
+ * @date: 2020-04-17
+ * @cersion: V1.0
+ */
+public interface ModelVideoInfoConfigMapper extends BaseMapper<ModelVideoInfoConfig> {
+
+}

+ 15 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/opencv/mapper/ModelVideoInfoMapper.java

@@ -0,0 +1,15 @@
+package org.jeecg.modules.opencv.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.jeecg.modules.opencv.entity.ModelVideoInfo;
+
+/**
+ * 模板视频信息
+ *
+ * @author: jeecg-boot
+ * @date: 2020-04-17
+ * @cersion: V1.0
+ */
+public interface ModelVideoInfoMapper extends BaseMapper<ModelVideoInfo> {
+
+}

+ 15 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/opencv/mapper/ModelVideoInfoTagMapper.java

@@ -0,0 +1,15 @@
+package org.jeecg.modules.opencv.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.jeecg.modules.opencv.entity.ModelVideoInfoTag;
+
+/**
+ * 模板视频分类信息
+ *
+ * @author: jeecg-boot
+ * @date: 2020-04-17
+ * @cersion: V1.0
+ */
+public interface ModelVideoInfoTagMapper extends BaseMapper<ModelVideoInfoTag> {
+
+}

+ 5 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/opencv/mapper/xml/ModelVideoCompositeInfoMapper.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.ctop.mapper.ModelVideoCompositeInfoMapper">
+
+</mapper>

+ 5 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/opencv/mapper/xml/ModelVideoInfoConfigMapper.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.ctop.mapper.ModelVideoInfoConfigMapper">
+
+</mapper>

+ 5 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/opencv/mapper/xml/ModelVideoInfoMapper.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.ctop.mapper.ModelVideoInfoMapper">
+
+</mapper>

+ 5 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/opencv/mapper/xml/ModelVideoInfoTagMapper.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.ctop.mapper.ModelVideoInfoTagMapper">
+
+</mapper>

+ 19 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/opencv/service/IFfmpegService.java

@@ -0,0 +1,19 @@
+package org.jeecg.modules.opencv.service;
+
+import com.alibaba.fastjson.JSONObject;
+
+import java.util.Map;
+
+public interface IFfmpegService {
+    void getM4aFromMp4(String videoPath, String m4apath);
+
+    void cutM4a(String srcPath, String targetPath, String startSecond, String endSecond);
+
+    void audioMosaic(String audioPart1, String audioPart2, String finalAudio);
+
+    void mergeAudioAndVideo(String srcVideoPath, String srcAudioPath, String finalVideoPath);
+
+    void mergeImageToVideo(String imagePath, Integer frameNumber, String videoFilePath);
+
+    Map<String, Object> videoMerge(JSONObject data, String userId);
+}

+ 15 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/opencv/service/IModelVideoCompositeInfoService.java

@@ -0,0 +1,15 @@
+package org.jeecg.modules.opencv.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.jeecg.modules.opencv.entity.ModelVideoCompositeInfo;
+
+/**
+ * 模板合成视频
+ *
+ * @author jeecg-boot
+ * @version V1.0
+ * @date 2020-04-17
+ */
+public interface IModelVideoCompositeInfoService extends IService<ModelVideoCompositeInfo> {
+
+}

+ 16 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/opencv/service/IModelVideoInfoConfigService.java

@@ -0,0 +1,16 @@
+package org.jeecg.modules.opencv.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.jeecg.modules.opencv.entity.ModelVideoInfoConfig;
+
+/**
+ * 模板视频配置信息
+ *
+ * @author jeecg-boot
+ * @version V1.0
+ * @date 2020-04-17
+ */
+public interface IModelVideoInfoConfigService extends IService<ModelVideoInfoConfig> {
+
+    ModelVideoInfoConfig getByModelId(Long id);
+}

+ 15 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/opencv/service/IModelVideoInfoService.java

@@ -0,0 +1,15 @@
+package org.jeecg.modules.opencv.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.jeecg.modules.opencv.entity.ModelVideoInfo;
+
+/**
+ * 模板视频信息
+ *
+ * @author jeecg-boot
+ * @version V1.0
+ * @date 2020-04-17
+ */
+public interface IModelVideoInfoService extends IService<ModelVideoInfo> {
+
+}

+ 15 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/opencv/service/IModelVideoInfoTagService.java

@@ -0,0 +1,15 @@
+package org.jeecg.modules.opencv.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.jeecg.modules.opencv.entity.ModelVideoInfoTag;
+
+/**
+ * 模板视频分类信息
+ *
+ * @author jeecg-boot
+ * @version V1.0
+ * @date 2020-04-17
+ */
+public interface IModelVideoInfoTagService extends IService<ModelVideoInfoTag> {
+
+}

+ 433 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/opencv/service/impl/FfmpegServiceImpl.java

@@ -0,0 +1,433 @@
+package org.jeecg.modules.opencv.service.impl;
+
+import cn.com.ctop.common.module.utils.*;
+import com.alibaba.fastjson.JSONObject;
+import lombok.extern.slf4j.Slf4j;
+import org.jeecg.modules.opencv.entity.ModelVideoCompositeInfo;
+import org.jeecg.modules.opencv.entity.ModelVideoInfo;
+import org.jeecg.modules.opencv.entity.ModelVideoInfoConfig;
+import org.jeecg.modules.opencv.service.IFfmpegService;
+import org.jeecg.modules.opencv.service.IModelVideoCompositeInfoService;
+import org.jeecg.modules.opencv.service.IModelVideoInfoConfigService;
+import org.jeecg.modules.opencv.service.IModelVideoInfoService;
+import org.jeecg.modules.opencv.utils.ImageUtils;
+import org.jeecg.modules.opencv.utils.VideoProcessing;
+import org.opencv.core.Core;
+import org.opencv.core.Mat;
+import org.opencv.core.Size;
+import org.opencv.imgcodecs.Imgcodecs;
+import org.opencv.imgproc.Imgproc;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+
+import java.io.*;
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@Service
+@Slf4j
+public class FfmpegServiceImpl implements IFfmpegService {
+    /**
+     * FFmpeg全路径
+     */
+    @Value("${jeecg.ffmpeg.bin}")
+    private String FFMPEG_PATH;
+
+    /**
+     * 从视频中抽取音频文件
+     */
+    @Override
+    public void getM4aFromMp4(String videoPath, String m4apath) {
+        /**
+         * D:\java\ffmpeg\bin\ffmpeg.exe -i D:\data\test\\video.mp4 -vn -y -acodec copy D:\data\test\\video.m4a
+         */
+        List<String> command = new ArrayList<>();
+        command.add(FFMPEG_PATH);
+        command.add("-i");
+        command.add(videoPath);
+        command.add("-vn");
+        command.add("-y");
+        command.add("-acodec");
+        command.add("copy");
+        command.add(m4apath);
+        runCommand(command);
+    }
+
+    /**
+     * 截取音频文件
+     */
+    @Override
+    public void cutM4a(String srcPath, String targetPath, String startSecond, String endSecond) {
+        /**
+         *D:\java\ffmpeg\bin\ffmpeg.exe -i D:\data\test\\video.m4a -vn -acodec copy -ss 00:00:00.000 -t 00:00:08.000 D:\data\test\\cut.m4a
+         */
+        List<String> command = new ArrayList<>();
+        command.add(FFMPEG_PATH);
+        command.add("-i");
+        command.add(srcPath);
+        command.add("-vn");
+        command.add("-acodec");
+        command.add("copy");
+        command.add("-ss");
+        command.add(startSecond);
+        command.add("-t");
+        command.add(endSecond);
+        command.add(targetPath);
+        runCommand(command);
+    }
+
+    /**
+     * 音频拼接
+     * D:\java\ffmpeg\bin\ffmpeg.exe -i D:\data\test\\cut.m4a -i D:\data\test\\fill.m4a -filter_complex "[0:0] [1:0] concat=n=2:v=0:a=1 [a]" -map [a] D:\data\test\\final.m4a
+     */
+    @Override
+    public void audioMosaic(String audioPart1, String audioPart2, String finalAudio) {
+        List<String> command = new ArrayList<>();
+        command.add(FFMPEG_PATH);
+        command.add("-i");
+        command.add(audioPart1);
+        command.add("-i");
+        command.add(audioPart2);
+        command.add("-filter_complex");
+        command.add("\"[0:0] [1:0] concat=n=2:v=0:a=1 [a]\"");
+        command.add("-map");
+        command.add("[a]");
+        command.add(finalAudio);
+        runCommand(command);
+    }
+
+    /**
+     * 音频+视频合成视频
+     *
+     * @param srcVideoPath
+     * @param srcAudioPath
+     * @param finalVideoPath D:\java\ffmpeg\bin\ffmpeg.exe -i D:\data\test\\merge.mp4 -i D:\data\test\\final.m4a -c:v copy -c:a aac -strict experimental D:\data\test\\final.mp4
+     */
+    @Override
+    public void mergeAudioAndVideo(String srcVideoPath, String srcAudioPath, String finalVideoPath) {
+        List<String> command = new ArrayList<>();
+        command.add(FFMPEG_PATH);
+        command.add("-i");
+        command.add(srcVideoPath);
+        command.add("-i");
+        command.add(srcAudioPath);
+        command.add("-c:v");
+        command.add("copy");
+        command.add("-c:a");
+        command.add("aac");
+        command.add("-strict");
+        command.add("experimental");
+        command.add(finalVideoPath);
+        runCommand(command);
+    }
+
+    /**
+     * 将图片合成为视频
+     * D:\java\ffmpeg\bin\ffmpeg.exe -f image2 -i D:\\data\\video\\%d.jpg  -vcodec libx264 -r 25  D:\\data\\merge.mp4
+     *
+     * @param imagePath
+     * @param frameNumber
+     * @param videoFilePath
+     */
+    @Override
+    public void mergeImageToVideo(String imagePath, Integer frameNumber, String videoFilePath) {
+        List<String> command = new ArrayList<>();
+        command.add(FFMPEG_PATH);
+        command.add("-f");
+        command.add("image2");
+        command.add("-i");
+        command.add(imagePath + "%d.jpg");
+        command.add("-vcodec");
+        command.add("libx264");
+        command.add("-r");
+        command.add(frameNumber + "");
+        command.add(videoFilePath);
+        runCommand(command);
+    }
+
+    private void runCommand(List<String> command) {
+        try {
+            ProcessBuilder builder = new ProcessBuilder();
+            builder.command(command);
+            builder.redirectErrorStream(true);
+            Process process = builder.start();
+            //获取进程的标准输入流
+            final InputStream is1 = process.getInputStream();
+            //获取进城的错误流
+            final InputStream is2 = process.getErrorStream();
+            //启动两个线程,一个线程负责读标准输出流,另一个负责读标准错误流
+            new Thread() {
+                public void run() {
+                    BufferedReader br1 = new BufferedReader(new InputStreamReader(is1));
+                    try {
+                        String line1 = null;
+                        while ((line1 = br1.readLine()) != null) {
+                            if (line1 != null) {
+                            }
+                        }
+                    } catch (IOException e) {
+                        e.printStackTrace();
+                    } finally {
+                        try {
+                            is1.close();
+                        } catch (IOException e) {
+                            e.printStackTrace();
+                        }
+                    }
+                }
+            }.start();
+
+            new Thread() {
+                public void run() {
+                    BufferedReader br2 = new BufferedReader(new InputStreamReader(is2));
+                    try {
+                        String line2 = null;
+                        while ((line2 = br2.readLine()) != null) {
+                            if (line2 != null) {
+                            }
+                        }
+                    } catch (IOException e) {
+                        e.printStackTrace();
+                    } finally {
+                        try {
+                            is2.close();
+                        } catch (IOException e) {
+                            e.printStackTrace();
+                        }
+                    }
+                }
+            }.start();
+            // 等待进程执行结束
+            process.waitFor();
+            process.destroy();
+            log.info("ffmpeg命令执行完成");
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    @Override
+    public Map<String, Object> videoMerge(JSONObject data, String userId) {
+        Map<String, Object> result = new HashMap<>();
+        try {
+            Long modelId = data.getLong("modelId");
+            String url = data.getString("url");
+            if (null == modelId || modelId == 0 || null == url || "".equals(url.trim())) {
+                ResultMapUtils.setResultMap(result, StatusCode.MODEL_VIDEO_NOT_EXIST);
+                return result;
+            }
+            ModelVideoInfo videoInfo = modelVideoInfoService.getById(modelId);
+            if (null == videoInfo || videoInfo.getStatus() == 0) {
+                ResultMapUtils.setResultMap(result, StatusCode.MODEL_VIDEO_NOT_EXIST);
+                return result;
+            }
+            //1:
+            url = "https:" + url;
+            String getUrl = mergeVideo(videoInfo, url, userId);
+            ResultMapUtils.setResultMap(result, StatusCode.COMMON_SUCCESS);
+            result.put("url", getUrl);
+            return result;
+        } catch (Exception e) {
+            e.printStackTrace();
+            ResultMapUtils.setResultMap(result, StatusCode.COMMON_SERVER_ERROR);
+            return result;
+        }
+    }
+
+    @Autowired
+    private IModelVideoInfoConfigService configService;
+
+    private String mergeVideo(ModelVideoInfo videoInfo, String url, String userId) throws Exception {
+        Long current = System.currentTimeMillis();
+        System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
+        //根据url下载视频
+        String srcVideoPath = PropertiesUtils.getValue("kuaishou_config", "model_video_src_path");
+        String fillVideoPath = PropertiesUtils.getValue("kuaishou_config", "model_video_fill_path");
+        String finalVideoPath = PropertiesUtils.getValue("kuaishou_config", "model_video_final_path");
+
+        String fillFilePath = LoadFileUtil.downLoadFromUrl(url, fillVideoPath);
+        String srcFilePath = LoadFileUtil.downLoadFromUrl(videoInfo.getModelVideoUrl(), srcVideoPath);
+
+        String splitSrcPath = srcVideoPath + current + File.separator;
+        String splitFillPath = fillVideoPath + current + File.separator;
+        String splitFinalPath = finalVideoPath + current + File.separator;
+        LoadFileUtil.checkFile(splitFinalPath);
+        //1:切分视频
+        VideoProcessing.grabberVideoFramer(srcFilePath, splitSrcPath);
+        VideoProcessing.grabberVideoFramer(fillFilePath, splitFillPath);
+        ModelVideoInfoConfig config = configService.getByModelId(videoInfo.getId());
+        if (null == config) {
+            log.error("配置文件尚未配置=>modelId:{}", videoInfo.getId());
+            return null;
+        }
+        if (config.getType() == 1) {
+            //简单的最终追加
+            //2:合并图片
+            //视频替换开始帧数
+            int exchangeStartFrameNum = config.getFullScreenStartFrame();
+            //视频替换结束帧数
+            int exchangeEndFrameNum = config.getFullScreenEndFrame();
+            //2.1 复制原始视频无变化图片
+            for (int i = 0; i < exchangeStartFrameNum; i++) {
+                Mat srcNoChangeImage = Imgcodecs.imread(splitSrcPath + i + ".jpg");
+                Imgcodecs.imwrite(splitFinalPath + i + ".jpg", srcNoChangeImage);
+            }
+
+            //2.2 转场动画(从fill文件夹的第一帧开始)
+            String getImageName = splitFillPath + "0.jpg";
+            Mat image = Imgcodecs.imread(getImageName, Imgcodecs.IMREAD_COLOR);
+            //(1)径向模糊图片
+            Mat radialBlur = ImageUtils.radialBlur(image);
+            Imgcodecs.imwrite(splitFinalPath + exchangeStartFrameNum + ".jpg", radialBlur);
+            exchangeStartFrameNum++;
+            //(2)放大后径向模糊图片
+            Mat bigImamge = new Mat();
+            Imgproc.resize(image, bigImamge, new Size(image.cols() * 1.25, image.rows() * 1.25));
+            Mat destBigImamge = ImageUtils.cutFromCenter(bigImamge, image.width(), image.height());
+            Mat radialBlurDestBigImamge = ImageUtils.radialBlur(destBigImamge);
+            Imgcodecs.imwrite(splitFinalPath + exchangeStartFrameNum + ".jpg", radialBlurDestBigImamge);
+            exchangeStartFrameNum++;
+            //(3)缩小之后重复平铺加径向模糊
+            Mat smallImage = new Mat();
+            Mat halfImage = new Mat();
+            Mat wholeImage = new Mat();
+            Imgproc.resize(image, smallImage, new Size(image.cols() / 2, image.rows() / 2));
+            ImageUtils.hconcat(smallImage, smallImage, halfImage);
+            ImageUtils.vconcat(halfImage, halfImage, wholeImage);
+            wholeImage = ImageUtils.radialBlur(wholeImage);
+            Imgcodecs.imwrite(splitFinalPath + exchangeStartFrameNum + ".jpg", wholeImage);
+            exchangeStartFrameNum++;
+            //2.3复制填充视频无变化图片
+            int checkNum = 1;
+            for (int i = exchangeStartFrameNum; i < exchangeEndFrameNum; i++) {
+                String fillImagePath = splitFillPath + checkNum + ".jpg";
+                File file = new File(fillImagePath);
+                if (file.exists()) {
+                    Mat srcMat = Imgcodecs.imread(fillImagePath);
+                    Imgcodecs.imwrite(splitFinalPath + i + ".jpg", srcMat);
+                } else {
+                    break;
+                }
+                checkNum++;
+            }
+            //3开始合成视频
+            //3.1 抽取音频文件
+            String srcM4aFilePath = splitSrcPath + "src.m4a";
+            getM4aFromMp4(srcFilePath, srcM4aFilePath);
+            String fillM4aFilePath = splitSrcPath + "fill.m4a";
+            getM4aFromMp4(fillFilePath, fillM4aFilePath);
+            //3.2 截取源模板音频文件
+            String cutM4aFilePath = splitSrcPath + "cut.m4a";
+            //计算需要截取的音频时长
+            String secondStr = getSecond(exchangeStartFrameNum);
+            cutM4a(srcM4aFilePath, cutM4aFilePath, "00:00:00.000", secondStr);
+            //3.3 合并两个音频文件
+            String finalM4aFilePath = splitSrcPath + "final.m4a";
+            audioMosaic(cutM4aFilePath, fillM4aFilePath, finalM4aFilePath);
+            //3.4 将最终生成的图片合成为视频
+            String noVoiceVideoFilePath = splitSrcPath + "novoice.mp4";
+            mergeImageToVideo(splitFinalPath, 25, noVoiceVideoFilePath);
+            //3.5 合并视频和音频
+            String finalVideoFilePath = splitSrcPath + "final.mp4";
+            mergeAudioAndVideo(noVoiceVideoFilePath, finalM4aFilePath, finalVideoFilePath);
+            //3.6 上传视频文件至OSS并返回url存入数据库
+            InputStream inputStream = new FileInputStream(finalVideoFilePath);
+            String finalUrl = OSSUtils.uploadFile2OSS(inputStream, "model/final/", videoInfo.getId() + "_" + current + ".mp4");
+            System.out.println(finalUrl);
+            ModelVideoCompositeInfo compositeInfo = new ModelVideoCompositeInfo(userId, videoInfo, finalUrl);
+            compositeInfoService.saveOrUpdate(compositeInfo);
+            //删除文件
+            deleteFile(splitSrcPath, splitFillPath, splitFinalPath, srcFilePath, fillFilePath);
+            log.info("视频合成成功:总时长{}毫秒", System.currentTimeMillis() - current);
+            return finalUrl;
+        } else if (config.getType() == 2) {
+            //2:合并图片
+
+        } else {
+            log.error("此类模板视频尚未配置=>type:{}", config.getType());
+        }
+        return null;
+    }
+
+    private void deleteFile(String splitSrcPath, String splitFillPath, String splitFinalPath, String srcFilePath, String fillFilePath) {
+        LoadFileUtil.delFile(splitFillPath);
+        LoadFileUtil.delFile(splitSrcPath);
+        LoadFileUtil.delFile(splitFinalPath);
+        LoadFileUtil.delFile(srcFilePath);
+        LoadFileUtil.delFile(fillFilePath);
+    }
+
+    @Autowired
+    private IModelVideoCompositeInfoService compositeInfoService;
+
+    private String getSecond(int exchangeStartFrameNum) {
+        BigDecimal second = new BigDecimal(exchangeStartFrameNum).divide(new BigDecimal("25"), 3, RoundingMode.HALF_UP);
+        if (second.compareTo(new BigDecimal("10")) < 0) {
+            return "00:00:0" + second.toString();
+        } else {
+            return "00:00:" + second.toString();
+        }
+    }
+
+    @Autowired
+    private IModelVideoInfoService modelVideoInfoService;
+
+//    public void cornerCheck(){
+//        int srcPhoneFrameNumFrom = 163;
+//        int changeSenceFrameNumFrom = 234;
+//        //2.1 复制原始视频无变化图片
+//        for (int i = 1; i < srcPhoneFrameNumFrom; i++) {
+//            Mat srcNoChangeImage = Imgcodecs.imread(srcPath + i + ".jpg");
+//            Imgcodecs.imwrite(targetPath + i + ".jpg", srcNoChangeImage);
+//        }
+//        String getImageName = "";
+//        //2.2 填充手机内部图片画面
+//        for (int i = 163; i < changeSenceFrameNumFrom; i++) {
+//            String backImg = srcPath + (i) + ".jpg";
+//            String phoneImg = fillPath + (i - 162) + ".jpg";
+//            String targetImg = targetPath + i + ".jpg";
+//            Perspective.perpectiveImg(backImg, phoneImg, targetImg);
+//            getImageName = targetImg;
+//        }
+//        //2.3 转场动画
+//        Mat image = Imgcodecs.imread(getImageName, Imgcodecs.IMREAD_COLOR);
+//        //(1)径向模糊图片
+//        Mat radialBlur = ImageUtils.radialBlur(image);
+//        Imgcodecs.imwrite(targetPath + changeSenceFrameNumFrom + ".jpg", radialBlur);
+//        changeSenceFrameNumFrom++;
+//        //(2)放大后径向模糊图片
+//        Mat bigImamge = new Mat();
+//        Imgproc.resize(image, bigImamge, new Size(image.cols() * 1.25, image.rows() * 1.25));
+//        Mat destBigImamge = ImageUtils.cutFromCenter(bigImamge, image.width(), image.height());
+//        Mat radialBlurDestBigImamge = ImageUtils.radialBlur(destBigImamge);
+//        Imgcodecs.imwrite(targetPath + changeSenceFrameNumFrom + ".jpg", radialBlurDestBigImamge);
+//        changeSenceFrameNumFrom++;
+//        //(3)缩小之后重复平铺加径向模糊
+//        Mat smallImage = new Mat();
+//        Mat halfImage = new Mat();
+//        Mat wholeImage = new Mat();
+//        Imgproc.resize(image, smallImage, new Size(image.cols() / 2, image.rows() / 2));
+//        ImageUtils.hconcat(smallImage, smallImage, halfImage);
+//        ImageUtils.vconcat(halfImage, halfImage, wholeImage);
+//        wholeImage = ImageUtils.radialBlur(wholeImage);
+//        Imgcodecs.imwrite(targetPath + changeSenceFrameNumFrom + ".jpg", wholeImage);
+//        changeSenceFrameNumFrom++;
+//        //复制填充视频无变化图片
+//        for (int i = changeSenceFrameNumFrom; i < 100000; i++) {
+//            int checkNum = i - 3 - srcPhoneFrameNumFrom + 1;
+//            String fillImagePath = fillPath + checkNum + ".jpg";
+//            File file = new File(fillImagePath);
+//            if (file.exists()) {
+//                Mat srcMat = Imgcodecs.imread(fillImagePath);
+//                Imgcodecs.imwrite(targetPath + i + ".jpg", srcMat);
+//            } else {
+//                break;
+//            }
+//        }
+//    }
+}

+ 19 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/opencv/service/impl/ModelVideoCompositeInfoServiceImpl.java

@@ -0,0 +1,19 @@
+package org.jeecg.modules.opencv.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.jeecg.modules.opencv.entity.ModelVideoCompositeInfo;
+import org.jeecg.modules.opencv.mapper.ModelVideoCompositeInfoMapper;
+import org.jeecg.modules.opencv.service.IModelVideoCompositeInfoService;
+import org.springframework.stereotype.Service;
+
+/**
+ * 模板合成视频
+ *
+ * @author jeecg-boot
+ * @version V1.0
+ * @date 2020-04-17
+ */
+@Service
+public class ModelVideoCompositeInfoServiceImpl extends ServiceImpl<ModelVideoCompositeInfoMapper, ModelVideoCompositeInfo> implements IModelVideoCompositeInfoService {
+
+}

+ 27 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/opencv/service/impl/ModelVideoInfoConfigServiceImpl.java

@@ -0,0 +1,27 @@
+package org.jeecg.modules.opencv.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.jeecg.modules.opencv.entity.ModelVideoInfoConfig;
+import org.jeecg.modules.opencv.mapper.ModelVideoInfoConfigMapper;
+import org.jeecg.modules.opencv.service.IModelVideoInfoConfigService;
+import org.springframework.stereotype.Service;
+
+/**
+ * 模板视频配置信息
+ *
+ * @author jeecg-boot
+ * @version V1.0
+ * @date 2020-04-17
+ */
+@Service
+public class ModelVideoInfoConfigServiceImpl extends ServiceImpl<ModelVideoInfoConfigMapper, ModelVideoInfoConfig> implements IModelVideoInfoConfigService {
+
+    @Override
+    public ModelVideoInfoConfig getByModelId(Long modelId) {
+        QueryWrapper<ModelVideoInfoConfig> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("model_id", modelId);
+        queryWrapper.orderByDesc("id").last("limit 1");
+        return this.getOne(queryWrapper);
+    }
+}

+ 19 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/opencv/service/impl/ModelVideoInfoServiceImpl.java

@@ -0,0 +1,19 @@
+package org.jeecg.modules.opencv.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.jeecg.modules.opencv.entity.ModelVideoInfo;
+import org.jeecg.modules.opencv.mapper.ModelVideoInfoMapper;
+import org.jeecg.modules.opencv.service.IModelVideoInfoService;
+import org.springframework.stereotype.Service;
+
+/**
+ * 模板视频信息
+ *
+ * @author jeecg-boot
+ * @version V1.0
+ * @date 2020-04-17
+ */
+@Service
+public class ModelVideoInfoServiceImpl extends ServiceImpl<ModelVideoInfoMapper, ModelVideoInfo> implements IModelVideoInfoService {
+
+}

+ 19 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/opencv/service/impl/ModelVideoInfoTagServiceImpl.java

@@ -0,0 +1,19 @@
+package org.jeecg.modules.opencv.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.jeecg.modules.opencv.entity.ModelVideoInfoTag;
+import org.jeecg.modules.opencv.mapper.ModelVideoInfoTagMapper;
+import org.jeecg.modules.opencv.service.IModelVideoInfoTagService;
+import org.springframework.stereotype.Service;
+
+/**
+ * 模板视频分类信息
+ *
+ * @author jeecg-boot
+ * @version V1.0
+ * @date 2020-04-17
+ */
+@Service
+public class ModelVideoInfoTagServiceImpl extends ServiceImpl<ModelVideoInfoTagMapper, ModelVideoInfoTag> implements IModelVideoInfoTagService {
+
+}

+ 282 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/opencv/utils/Avutils.java

@@ -0,0 +1,282 @@
+package org.jeecg.modules.opencv.utils;
+
+public class Avutils {
+    /**
+     * 平面YUV 4:2:0,12bpp,(1 Cr&每2×2个样本的Cb样本)
+     **/
+    public static int AV_PIX_FMT_YUV420P = 0;
+    /**
+     * 打包YUV 4:2:2,16bpp,Y0 Cb Y1 Cr
+     */
+    public static int AV_PIX_FMT_YUYV422 = 1;
+    /**
+     * 打包RGB 8:8:8,24bpp,RGBRGB ...
+     */
+    public static int AV_PIX_FMT_RGB24 = 2;
+    /**
+     * 打包RGB 8:8:8,24bpp,BGRBGR ...
+     */
+    public static int AV_PIX_FMT_BGR24 = 3;
+    /**
+     * 平面YUV 4:2:2,16bpp,(每2×1个样本1 Cr& Cb样本)
+     */
+    public static int AV_PIX_FMT_YUV422P = 4;
+    /**
+     * 平面YUV 4:4:4,24bpp,(每1×1个样本1个Cr& Cb样本)
+     */
+    public static int AV_PIX_FMT_YUV444P = 5;
+    /**
+     * 平面YUV 4:1 :0,9bpp,(每4x4Y样品1 Cr& Cb样品)
+     */
+    public static int AV_PIX_FMT_YUV410P = 6;
+    /**
+     * 平面YUV 4:1:1,12bpp,(1 Cr& Cb每4x1 Y样本的样本)
+     **/
+    public static int AV_PIX_FMT_YUV411P = 7;
+    /**
+     * Y,8bpp
+     */
+    public static int AV_PIX_FMT_GRAY8 = 8;
+    /**
+     * Y,1bpp,0为白色,1是黑色的,每个字节的像素都是从msb到lsb的顺序
+     */
+    public static int AV_PIX_FMT_MONOWHITE = 9;
+    /**
+     * Y,1bpp,0为黑色,1为白色,每个字节中的像素从msb排序到lsb
+     */
+    public static int AV_PIX_FMT_MONOBLACK = 10;
+    /**
+     * 8使用PIX_FMT_RGB32调色板
+     */
+    public static int AV_PIX_FMT_PAL8 = 11;
+    /**
+     * 平面YUV 4:2:0,12bpp,满刻度(JPEG),弃用PIX_FMT_YUV420P并设置color_range
+     */
+    public static int AV_PIX_FMT_YUVJ420P = 12;
+    /**
+     * 平面YUV 4:2:2,16bpp,满量程(JPEG),弃用PIX_FMT_YUV422P并设置color_range
+     */
+    public static int AV_PIX_FMT_YUVJ422P = 13;
+    /**
+     * 平面YUV 4:4:4,24bpp,满量程(JPEG),不利于PIX_FMT_YUV444P并设置color_range
+     */
+    public static int AV_PIX_FMT_YUVJ444P = 14;
+    /**
+     * 通过公共数据包的XVideo运动加速通过
+     */
+    public static int AV_PIX_FMT_XVMC_MPEG2_MC = 15;
+    public static int AV_PIX_FMT_XVMC_MPEG2_IDCT = 16;
+    /**
+     * 打包YUV 4:2:2,16bpp,Cb Y0 Cr Y1
+     */
+    public static int AV_PIX_FMT_UYVY422 = 17;
+    /**
+     * 打包YUV 4:1:1,12bpp,Cb Y0 Y1 Cr Y2 Y3
+     */
+    public static int AV_PIX_FMT_UYYVYY411 = 18;
+    /**
+     * 打包RGB 3:3:2,8bpp,(msb)2B 3G 3R(lsb)
+     */
+    public static int AV_PIX_FMT_BGR8 = 19;
+    /**
+     * 打包RGB 1:2:1比特流,4bpp,(msb)1B 2G 1R(lsb),一个字节包含两个像素,字节中的第一个像素是4 msb位
+     */
+    public static int AV_PIX_FMT_BGR4 = 20;
+    /**
+     * 打包RGB 1:2:1,8bpp,(msb)1B 2G 1R(lsb)
+     */
+    public static int AV_PIX_FMT_BGR4_BYTE = 21;
+    /**
+     * 打包RGB 3:3:2,8bpp,(msb)2R 3G 3B(lsb)
+     */
+    public static int AV_PIX_FMT_RGB8 = 22;
+    /**
+     * 打包RGB 1:2:1比特流,4bpp,( msb)1R 2G 1B(lsb),
+     * 一个字节包含两个像素,字节中的第一个像素是由4 msb位组成的一个
+     */
+    public static int AV_PIX_FMT_RGB4 = 23;
+    /**
+     * 打包RGB 1 :2:1,8bpp,(msb)1R 2G 1B(lsb)
+     */
+    public static int AV_PIX_FMT_RGB4_BYTE = 24;
+    /**
+     * 平面YUV 4:2:0,12bpp,1和1个交织的平面(第一个字节U和随后的字节V)
+     */
+    public static int AV_PIX_FMT_NV12 = 25;
+    /**
+     * 如上所述,但U和V字节被交换
+     */
+    public static int AV_PIX_FMT_NV21 = 26;
+
+    /**
+     * 打包ARGB 8:8:8:8,32bpp,ARGBARGB ...
+     */
+    public static int AV_PIX_FMT_ARGB = 27;
+    /**
+     * 包装RGBA 8:8:8:8,3bpp,RGBARGBA ...
+     */
+    public static int AV_PIX_FMT_RGBA = 28;
+    /**
+     * 打包ABGR 8:8:8:8,332pp,ABGRABGR .. 。
+     */
+    public static int AV_PIX_FMT_ABGR = 29;
+    /**
+     * 包装BGRA 8:8:8:8,32bpp,BGRABGRA ...
+     */
+    public static int AV_PIX_FMT_BGRA = 30;
+
+    /**
+     * Y,16bpp,big-endian
+     */
+    public static int AV_PIX_FMT_GRAY16BE = 31;
+    /**
+     * Y,16bpp,little-endian
+     */
+    public static int AV_PIX_FMT_GRAY16LE = 32;
+    /**
+     * 平面YUV 4:4:0(1 Cr&每个1x2 Y样本的Cb样本)
+     */
+    public static int AV_PIX_FMT_YUV440P = 33;
+    /**
+     * 平面YUV 4:4:0满量程(JPEG),弃用PIX_FMT_YUV440P并设置color_range
+     */
+    public static int AV_PIX_FMT_YUVJ440P = 34;
+    /**
+     * 平面YUV 4:2:0,20bpp,(每2X& A样本1 Cr& Cb样本)
+     */
+    public static int AV_PIX_FMT_YUVA420P = 35;
+    /**
+     * 使用VDPAU的H.264硬件解码,数据[0]包含一个vdpau_render_state结构,
+     * 其中包含片段的比特流以及从头部提取的各种字段
+     */
+    public static int AV_PIX_FMT_VDPAU_H264 = 36;
+    /**
+     * 使用VDPAU的MPEG-1硬件解码,数据[0]包含一个vdpau_render_state结构,
+     * 其中包含片段的比特流以及从标题中提取的各种字段
+     */
+    public static int AV_PIX_FMT_VDPAU_MPEG1 = 37;
+    /**
+     * 使用VDPAU的MPEG-2硬件解码,数据[0]包含一个vdpau_render_state结构,
+     * 其中包含片段的比特流以及从头部提取的各种字段
+     */
+    public static int AV_PIX_FMT_VDPAU_MPEG2 = 38;
+    /**
+     * 使用VDPAU的WMV3硬件解码,数据[0]包含一个包含片段的比特流的vdpau_render_state结构以及从头提取的各种字段
+     */
+    public static int AV_PIX_FMT_VDPAU_WMV3 = 39;
+    /**
+     * 使用VDPAU的VC-1 HW解码,数据[0]包含一个vdpau_render_state结构,
+     * 其中包含片段的比特流以及从标题中提取的各种字段
+     */
+    public static int AV_PIX_FMT_VDPAU_VC1 = 40;
+    /**
+     * 打包RGB 16:16:16,48bpp,16R,16G,16B,每个R / G / B组件的2字节值存储为big-endian
+     */
+    public static int AV_PIX_FMT_RGB48BE = 41;
+    /**
+     * 打包RGB 16:16:16,48bpp,16R,16G,16B,每个R / G / B组件的2字节值存储为小尾数
+     */
+    public static int AV_PIX_FMT_RGB48LE = 42;
+
+    /**
+     * 打包RGB 5:6:5,16bpp,(msb)5R 6G 5B(lsb),big-endian
+     */
+    public static int AV_PIX_FMT_RGB565BE = 43;
+    /**
+     * 包装RGB 5:6:5,16bpp,(msb)5R 6G 5B(lsb),little-endian
+     */
+    public static int AV_PIX_FMT_RGB565LE = 44;
+    /**
+     * 打包RGB 5:5:5,16bpp,(msb)1A 5R 5G 5B(lsb),大端,最高有效位为0
+     */
+    public static int AV_PIX_FMT_RGB555BE = 45;
+    /**
+     * 包装RGB 5:5:5,16bpp,(msb)1A 5R 5G 5B(lsb),小端,最高有效位为0
+     */
+    public static int AV_PIX_FMT_RGB555LE = 46;
+
+    /**
+     * 包装BGR 5:6:5,16bpp,(msb)5B 6G 5R(lsb),big-endian
+     */
+    public static int AV_PIX_FMT_BGR565BE = 47;
+    /**
+     * 打包BGR 5:6:5,16bpp ,(msb)5B 6G 5R(lsb),little-endian
+     */
+    public static int AV_PIX_FMT_BGR565LE = 48;
+    /**
+     * 打包BGR 5:5:5,16bpp,(msb)1A 5B 5G 5R(lsb ),big-endian,最高有效位到1
+     */
+    public static int AV_PIX_FMT_BGR555BE = 49;
+    /**
+     * 打包BGR 5:5:5,16bpp,(msb)1A 5B 5G 5R(lsb) -endian,最高有效位到1
+     */
+    public static int AV_PIX_FMT_BGR555LE = 50;
+
+    /**
+     * 通过VA API在运动补偿入口处的HW加速,Picture.
+     * data [3]包含一个vaapi_render_state struct包含宏块以及从头文件提取的各种字段
+     */
+    public static int AV_PIX_FMT_VAAPI_MOCO = 51;
+    /**
+     * 通过IDC入口点的VA API加速硬件,Picture.data [3]包含一个vaapi_render_state结构,其中包含从头部提取的字段
+     */
+    public static int AV_PIX_FMT_VAAPI_IDCT = 52;
+    /**
+     * 通过VA API进行HW解码,Picture.data [3]包含一个vaapi_render_state结构,其中包含片段的比特流以及从标题中提取的各种字段
+     */
+    public static int AV_PIX_FMT_VAAPI_VLD = 53;
+
+    /**
+     * 平面YUV 4:2:0,24bpp,(1 Cr&每个2x2 Y样本的Cb样本),little-endian
+     */
+    public static int AV_PIX_FMT_YUV420P16LE = 54;
+    /**
+     * 平面YUV 4:2:0,248pp,(每2×2个样本1 Cr& Cb样本) ,big-endian
+     */
+    public static int AV_PIX_FMT_YUV420P16BE = 55;
+    /**
+     * 平面YUV 4:2:2,32bpp,(每2×1个样本1 Cr& Cb样本),little-endian
+     */
+    public static int AV_PIX_FMT_YUV422P16LE = 56;
+    /**
+     * 平面YUV 4:2:2,32bpp,(每2×1个样本1 Cr& Cb样本),big-endian
+     */
+    public static int AV_PIX_FMT_YUV422P16BE = 57;
+    /**
+     * 平面YUV 4:4:4,48bpp,(每1×1个样本1 Cr& Cb样本),小尾数
+     */
+    public static int AV_PIX_FMT_YUV444P16LE = 58;
+    /**
+     * 平面YUV 4:4:4,48bpp,(每1×1个样品1 Cr& Cb样品),big-endian
+     */
+    public static int AV_PIX_FMT_YUV444P16BE = 59;
+    /**
+     * 使用VDPAU的MPEG4硬件解码,数据[0]包含一个vdpau_render_state结构,其中包含片段的比特流以及从头部提取的各种字段
+     */
+    public static int AV_PIX_FMT_VDPAU_MPEG4 = 60;
+    /**
+     * 硬解码thr哦DXVA2,Picture.data [3]包含一个LPDIRECT3DSURFACE9指针
+     */
+    public static int AV_PIX_FMT_DXVA2_VLD = 61;
+
+    /**
+     * 打包RGB 4:4:4,16bpp,(msb)4A 4R 4G 4B(lsb),小端,最高有效位为0
+     */
+    public static int AV_PIX_FMT_RGB444LE = 62;
+    /**
+     * 打包RGB 4:4:4,16bpp,(msb)4A 4R 4G 4B(lsb ),big-endian,最高有效位为0
+     */
+    public static int AV_PIX_FMT_RGB444BE = 63;
+    /**
+     * 打包BGR 4:4:4,16bpp,(msb)4A 4B 4G 4R(lsb) -endian,最高有效位为1
+     */
+    public static int AV_PIX_FMT_BGR444LE = 64;
+    /**
+     * 打包BGR 4:4:4,16bpp,(msb)4A 4B 4G 4R(lsb),big-endian,最高有效位为1
+     */
+    public static int AV_PIX_FMT_BGR444BE = 65;
+    /**
+     * 8位灰色,8位alpha
+     */
+    public static int AV_PIX_FMT_YA8 = 66;
+}

+ 179 - 38
jeecg-boot-module-system/src/main/java/org/jeecg/modules/demo/opencv/CornerCheck.java

@@ -1,5 +1,4 @@
-/*
-package org.jeecg.modules.demo.opencv;
+package org.jeecg.modules.opencv.utils;
 
 import cn.com.ctop.common.module.utils.ResultMapUtils;
 import cn.com.ctop.common.module.utils.StatusCode;
@@ -9,10 +8,9 @@ import org.opencv.imgproc.Imgproc;
 
 import java.util.*;
 
-*/
 /**
  * 角点检测
- *//*
+ */
 
 public class CornerCheck {
     static {
@@ -26,24 +24,6 @@ public class CornerCheck {
         channelSplit();
     }
 
-    public static void channelSplit() {
-        Mat srcImage = Imgcodecs.imread("D:\\data\\235.jpg", Imgcodecs.IMREAD_COLOR);
-        List<Mat> channels = new ArrayList<>();
-        Core.split(srcImage, channels);
-
-        //创建类型为Mat,数组长度为3的变量mbgr
-        List<Mat> mbgr = new ArrayList<>();
-        Mat hideChannel = new Mat(srcImage.size(), CvType.CV_8UC1, new Scalar(0));
-
-        Mat imageB = new Mat(srcImage.size(), CvType.CV_8UC3);
-        mbgr.add(channels.get(0));
-        mbgr.add(hideChannel);
-        mbgr.add(hideChannel);
-        Core.merge(mbgr, imageB);
-        Imgcodecs.imwrite("D:\\data\\imageB.jpg", imageB);
-
-    }
-
     public static Map<String, Object> detectConers() {
         Map<String, Object> result = new HashMap<>();
         try {
@@ -62,7 +42,6 @@ public class CornerCheck {
             Mat gray = new Mat();
             //灰度
             Imgproc.cvtColor(src, gray, Imgproc.COLOR_RGB2GRAY);
-            Imgcodecs.imwrite("D:\\data\\gray.jpg", gray);
             Mat binary = new Mat();
             //二值化
             Imgproc.threshold(gray, binary, 1, 255, Imgproc.THRESH_TOZERO);
@@ -145,25 +124,56 @@ public class CornerCheck {
         return matCornerList;
     }
 
-    public static List<Point> detectConerList() {
+    public static List<Point> detectConerList(String filePath) {
         List<Point> result = new ArrayList<>();
         try {
             System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
-
-            final int maxCorners = 50, blockSize = 3;
-            final double qualityLevel = 0.01, minDistance = 20.0, k = 0.04;
+            Mat src = Imgcodecs.imread(filePath);
+            if (src.empty()) {
+                throw new Exception("no file");
+            }
+            final int maxCorners = 1000, blockSize = 5;
+            final double qualityLevel = 0.05, minDistance = 10.0, k = 0.04;
             final boolean useHarrisDetector = false;
             MatOfPoint corners = new MatOfPoint();
 
-            Mat src = Imgcodecs.imread("D:\\data\\167.jpg");
-            if (src.empty()) {
-                throw new Exception("no file");
+            for (int i = 0; i < src.cols(); i++) {
+                for (int j = 0; j < src.rows(); j++) {
+                    if (i > 160 && i < 470 && j > 250 && j < 750) {
+                        Imgproc.circle(src, new Point(i, j), 1, new Scalar(0, 236, 2), Imgproc.FILLED);
+                    }
+                }
             }
+//            //卷积
+//            Mat kernel = new Mat(3, 3, CvType.CV_16SC1);
+//            kernel.put(0, 0, 0, -1, 0, -1, 5, -1, 0, -1, 0);
+//            Imgproc.filter2D(src, src, src.depth(), kernel);
+//            //降噪
+//            Imgproc.GaussianBlur(src, src, new Size(3, 3), 0, 0, 1);
             Mat dst = src.clone();
             Mat gray = new Mat();
+            //灰度
             Imgproc.cvtColor(src, gray, Imgproc.COLOR_RGB2GRAY);
-            Imgproc.goodFeaturesToTrack(gray, corners, maxCorners, qualityLevel, minDistance,
-                    new Mat(), blockSize, useHarrisDetector, k);
+//            //归一处理
+//            Core.normalize(gray,gray);
+            //Sobel算子
+//            Mat grad_x = new Mat(), grad_y = new Mat();
+//            Mat abs_grad_x = new Mat(), abs_grad_y = new Mat();
+//            int scale = 1;
+//            int delta = 0;
+//            //Gradient X
+//            Imgproc.Sobel(gray, grad_x, CvType.CV_16S, 1, 0, 3, scale, delta, 1);
+//            //Gradient y
+//            Imgproc.Sobel(gray, grad_y, CvType.CV_16S, 0, 1, 3, scale, delta, 1);
+//
+//            Core.convertScaleAbs(grad_x, abs_grad_x);
+//            Core.convertScaleAbs(grad_y, abs_grad_y);
+//
+//            /// Total Gradient (approximate)
+//            Mat grad = new Mat();
+//            Core.addWeighted(abs_grad_x, 0.5, abs_grad_y, 0.5, 0, grad);
+
+            Imgproc.goodFeaturesToTrack(gray, corners, maxCorners, qualityLevel, minDistance, new Mat(), blockSize, useHarrisDetector, k);
             Point[] pCorners = corners.toArray();
             List<Point> pointList = new ArrayList<>();
             double maxX = 0d;
@@ -171,7 +181,8 @@ public class CornerCheck {
             double minX = 10000d;
             double minY = 100000d;
             for (int i = 0; i < pCorners.length; i++) {
-                if (pCorners[i].x > 130 && pCorners[i].x < 570 && pCorners[i].y > 200 && pCorners[i].y < 850) {
+//                Imgproc.circle(dst, pCorners[i], 4, new Scalar(255, 0, 255), Imgproc.FILLED);
+                if (pCorners[i].x > 120 && pCorners[i].x < 555 && pCorners[i].y > 200 && pCorners[i].y < 860) {
                     if (pCorners[i].x >= maxX) {
                         maxX = pCorners[i].x;
                     }
@@ -189,17 +200,62 @@ public class CornerCheck {
                     pointList.add(pCorners[i]);
                 }
             }
+            Imgproc.line(dst, new Point(minX, minY), new Point(minX, maxY), new Scalar(255, 255, 255));
+            Imgproc.line(dst, new Point(minX, maxY), new Point(maxX, maxY), new Scalar(255, 255, 255));
+            Imgproc.line(dst, new Point(maxX, maxY), new Point(maxX, minY), new Scalar(255, 255, 255));
+            Imgproc.line(dst, new Point(maxX, minY), new Point(minX, minY), new Scalar(255, 255, 255));
             List<Point> cornerPoints = new ArrayList<>();
             for (Point point : pointList) {
                 double getX = point.x;
                 double getY = point.y;
-                if ((getY >= (minY + 20) && getY <= (maxY - 20))) {
-                    Imgproc.circle(dst, point, 4, new Scalar(255, 255, 255), Imgproc.FILLED);
+                if ((getY >= (minY + 50) && getY <= (maxY - 50)) || (getX >= (minX + 25) && getX <= (maxX - 70))) {
+                    Imgproc.circle(dst, point, 4, new Scalar(0, 255, 0), Imgproc.FILLED);
                 } else {
+                    Imgproc.circle(dst, point, 4, new Scalar(255, 0, 255), Imgproc.FILLED);
                     cornerPoints.add(point);
-                    Imgproc.circle(dst, point, 4, new Scalar(0, 0, 255), Imgproc.FILLED);
                 }
             }
+            Point[] cornerArray = new Point[cornerPoints.size()];
+
+            for (int i = 0; i < cornerPoints.size(); i++) {
+                cornerArray[i] = cornerPoints.get(i);
+            }
+            /*MatOfPoint2f srcPoint = new MatOfPoint2f(cornerArray);
+            MatOfPoint2f destPoint = new MatOfPoint2f();
+            Imgproc.approxPolyDP(srcPoint,destPoint,100,true);
+            Point []des = destPoint.toArray();
+            for (int i=0;i<des.length-2;i++) {
+                Imgproc.line(dst,des[i],des[i+1],new Scalar(255,255,255));
+            }*/
+            Collections.sort(cornerPoints, new Comparator<Point>() {
+                @Override
+                public int compare(Point p1, Point p2) {
+                    return (int) (p1.x + p1.y - p2.x - p2.y);
+                }
+            });
+            List<Mat> channels = new ArrayList<>();
+            Core.split(src, channels);
+            List<Mat> mbgr = new ArrayList<>();
+            Mat hideChannel = new Mat(src.size(), CvType.CV_8UC1, new Scalar(0));
+            Mat imageGR = new Mat(src.size(), CvType.CV_8UC3);
+            mbgr = new ArrayList<>();
+            mbgr.add(hideChannel);
+            mbgr.add(channels.get(1));
+            mbgr.add(channels.get(2));
+            Core.merge(mbgr, imageGR);
+            List<Point> checkPoints = new ArrayList<>();
+            Point rightDown = cornerPoints.get(cornerPoints.size() - 1);
+            for (Point point : cornerPoints) {
+                System.out.println("cornerPoint:" + point.toString());
+                System.out.println(imageGR.get((int) point.y, (int) point.x)[1]);
+                if (imageGR.get((int) point.y, (int) point.x)[1] >= 120) {
+                    if (point.x <= rightDown.x) {
+                        System.out.println("greenPoint:" + point.toString());
+                        checkPoints.add(point);
+                    }
+                }
+            }
+            cornerPoints = checkPoints;
             Collections.sort(cornerPoints, new Comparator<Point>() {
                 @Override
                 public int compare(Point p1, Point p2) {
@@ -220,12 +276,97 @@ public class CornerCheck {
                 result.add(new Point(cornerPoints.get(1).x - EXPAND_SIZE, cornerPoints.get(1).y + EXPAND_SIZE));
             }
             //右下
-            result.add(new Point(cornerPoints.get(3).x + EXPAND_SIZE, cornerPoints.get(3).y + EXPAND_SIZE));
+            result.add(new Point(cornerPoints.get(cornerPoints.size() - 1).x + EXPAND_SIZE, cornerPoints.get(cornerPoints.size() - 1).y + EXPAND_SIZE));
+
+            for (Point point : result) {
+                Imgproc.circle(dst, point, 10, new Scalar(255, 0, 255), Imgproc.FILLED);
+            }
+            Imgcodecs.imwrite("D:\\data\\allConers.jpg", dst);
             return result;
         } catch (Exception e) {
             e.printStackTrace();
             return result;
         }
     }
+
+    public static void channelSplit() {
+        Mat srcImage = Imgcodecs.imread("D:\\data\\163.jpg", Imgcodecs.IMREAD_COLOR);
+        List<Mat> channels = new ArrayList<>();
+        Core.split(srcImage, channels);
+
+        //创建类型为Mat,数组长度为3的变量mbgr
+        List<Mat> mbgr = new ArrayList<>();
+        Mat hideChannel = new Mat(srcImage.size(), CvType.CV_8UC1, new Scalar(0));
+
+        Mat imageB = new Mat(srcImage.size(), CvType.CV_8UC3);
+        mbgr.add(channels.get(0));
+        mbgr.add(hideChannel);
+        mbgr.add(hideChannel);
+        Core.merge(mbgr, imageB);
+        List<Point> points = detectConerList("D:\\data\\imageB.jpg");
+        for (Point point : points) {
+            Imgproc.circle(imageB, point, 5, new Scalar(0, 0, 0));
+        }
+        Imgcodecs.imwrite("D:\\data\\imageB.jpg", imageB);
+
+        mbgr = new ArrayList<>();
+        Mat imageG = new Mat(srcImage.size(), CvType.CV_8UC3);
+        mbgr.add(hideChannel);
+        mbgr.add(channels.get(1));
+        mbgr.add(hideChannel);
+        Core.merge(mbgr, imageG);
+        points = detectConerList("D:\\data\\imageG.jpg");
+        for (Point point : points) {
+            Imgproc.circle(imageG, point, 5, new Scalar(0, 0, 0));
+        }
+        Imgcodecs.imwrite("D:\\data\\imageG.jpg", imageG);
+
+        mbgr = new ArrayList<>();
+        Mat imageR = new Mat(srcImage.size(), CvType.CV_8UC3);
+        mbgr.add(hideChannel);
+        mbgr.add(hideChannel);
+        mbgr.add(channels.get(2));
+        Core.merge(mbgr, imageR);
+        points = detectConerList("D:\\data\\imageR.jpg");
+        for (Point point : points) {
+            Imgproc.circle(imageR, point, 5, new Scalar(0, 0, 0));
+        }
+        Imgcodecs.imwrite("D:\\data\\imageR.jpg", imageR);
+
+        mbgr = new ArrayList<>();
+        Mat imageBG = new Mat(srcImage.size(), CvType.CV_8UC3);
+        mbgr.add(channels.get(0));
+        mbgr.add(channels.get(1));
+        mbgr.add(hideChannel);
+        Core.merge(mbgr, imageBG);
+        points = detectConerList("D:\\data\\imageBG.jpg");
+        for (Point point : points) {
+            Imgproc.circle(imageBG, point, 5, new Scalar(0, 0, 0));
+        }
+        Imgcodecs.imwrite("D:\\data\\imageBG.jpg", imageBG);
+
+        Mat imageGR = new Mat(srcImage.size(), CvType.CV_8UC3);
+        mbgr = new ArrayList<>();
+        mbgr.add(hideChannel);
+        mbgr.add(channels.get(1));
+        mbgr.add(channels.get(2));
+        Core.merge(mbgr, imageGR);
+        points = detectConerList("D:\\data\\imageGR.jpg");
+        for (Point point : points) {
+            Imgproc.circle(imageGR, point, 5, new Scalar(0, 0, 0));
+        }
+        Imgcodecs.imwrite("D:\\data\\imageGR.jpg", imageGR);
+
+        mbgr = new ArrayList<>();
+        Mat imageBR = new Mat(srcImage.size(), CvType.CV_8UC3);
+        mbgr.add(channels.get(0));
+        mbgr.add(hideChannel);
+        mbgr.add(channels.get(2));
+        Core.merge(mbgr, imageBR);
+        points = detectConerList("D:\\data\\imageBR.jpg");
+        for (Point point : points) {
+            Imgproc.circle(imageBR, point, 5, new Scalar(0, 0, 0));
+        }
+        Imgcodecs.imwrite("D:\\data\\imageBR.jpg", imageBR);
+    }
 }
-*/

+ 126 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/opencv/utils/ImageUtils.java

@@ -0,0 +1,126 @@
+package org.jeecg.modules.opencv.utils;
+
+import org.opencv.core.*;
+import org.opencv.imgcodecs.Imgcodecs;
+import org.opencv.imgproc.Imgproc;
+
+public class ImageUtils {
+
+    /**
+     * 按照指定的尺寸截取Mat,坐标原点为左上角
+     *
+     * @param src    源Mat
+     * @param width  width
+     * @param height height
+     * @return 截取后的Mat
+     */
+    public static Mat cutFromCenter(Mat src, int width, int height) {
+        if (width > src.width()) {
+            width = src.width();
+        }
+        if (height > src.height()) {
+            height = src.height();
+        }
+        int originX = (src.width() - width) / 2;
+        int originy = (src.height() - height) / 2;
+        // 截取尺寸
+        Rect rect = new Rect(originX, originy, width, height);
+        return new Mat(src, rect);
+    }
+
+    public static Mat radialBlur(Mat src) {
+        Mat returnMat = new Mat(src.size(), CvType.CV_32FC3);
+        src.convertTo(returnMat, CvType.CV_32FC3);
+        int width = src.width();
+        int height = src.height();
+        double r;
+        double angle;
+        Point center = new Point(width / 2, height / 2);
+        double t1, t2, t3;
+        int new_x, new_y;
+        int Num = 20;
+        for (int y = 0; y < height; y++) {
+            for (int x = 0; x < width; x++) {
+                t1 = 0;
+                t2 = 0;
+                t3 = 0;
+                r = Math.sqrt((y - center.y) * (y - center.y) + (x - center.x) * (x - center.x));
+                angle = Math.atan2((y - center.y), (x - center.x));
+                for (int mm = 0; mm < Num; mm++) {
+                    double tmR = r - mm > 0 ? r - mm : 0.0;
+                    new_x = (int) (tmR * Math.cos(angle) + center.x);
+                    new_y = (int) (tmR * Math.sin(angle) + center.y);
+                    if (new_x < 0) {
+                        new_x = 0;
+                    }
+                    if (new_x > width - 1) {
+                        new_x = width - 1;
+                    }
+                    if (new_y < 0) {
+                        new_y = 0;
+                    }
+                    if (new_y > height - 1) {
+                        new_y = height - 1;
+                    }
+                    t1 = t1 + src.get(new_y, new_x)[0];
+                    t2 = t2 + src.get(new_y, new_x)[1];
+                    t3 = t3 + src.get(new_y, new_x)[2];
+                }
+                returnMat.put(y, x, t1 / Num, t2 / Num, t3 / Num);
+            }
+        }
+        return returnMat;
+    }
+
+    /**
+     * 矩阵横向拼接
+     *
+     * @param matrix1
+     * @param matrix2
+     * @param matrixCom
+     * @return
+     */
+    public static Mat hconcat(Mat matrix1, Mat matrix2, Mat matrixCom) {
+        matrixCom.create(matrix1.rows(), matrix1.cols() + matrix2.cols(), matrix1.type());
+        Mat temp = matrixCom.colRange(0, matrix1.cols());
+        matrix1.copyTo(temp);
+        Mat temp1 = matrixCom.colRange(matrix1.cols(), matrix1.cols() + matrix2.cols());
+        matrix2.copyTo(temp1);
+        return matrixCom;
+    }
+
+    /**
+     * 矩阵纵向拼接
+     *
+     * @param matrix1
+     * @param matrix2
+     * @param matrixCom
+     * @return
+     */
+    public static Mat vconcat(Mat matrix1, Mat matrix2, Mat matrixCom) {
+        matrixCom.create(matrix1.rows() + matrix2.rows(), matrix1.cols(), matrix1.type());
+        Mat temp = matrixCom.rowRange(0, matrix1.rows());
+        matrix1.copyTo(temp);
+        Mat temp1 = matrixCom.rowRange(matrix1.rows(), matrix1.rows() + matrix2.rows());
+        matrix2.copyTo(temp1);
+        return matrixCom;
+    }
+
+    public static void main(String[] args) {
+        System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
+        Mat image = Imgcodecs.imread("D:\\data\\167.jpg", Imgcodecs.IMREAD_COLOR);
+        Mat bigImamge = new Mat();
+        Mat smallImage = new Mat();
+        Mat halfImage = new Mat();
+        Mat wholeImage = new Mat();
+        Imgproc.resize(image, bigImamge, new Size(image.cols() * 1.25, image.rows() * 1.25));
+        Imgproc.resize(image, smallImage, new Size(image.cols() / 2, image.rows() / 2));
+        hconcat(smallImage, smallImage, halfImage);
+        vconcat(halfImage, halfImage, wholeImage);
+        Mat destImage = cutFromCenter(bigImamge, image.width(), image.height());
+        wholeImage = radialBlur(wholeImage);
+        Mat radialBlur = radialBlur(destImage);
+        Imgcodecs.imwrite("D:\\data\\radialBlur.jpg", radialBlur);
+        Imgcodecs.imwrite("D:\\data\\whole.jpg", wholeImage);
+    }
+}

+ 6 - 14
jeecg-boot-module-system/src/main/java/org/jeecg/modules/demo/opencv/Perspective.java

@@ -1,5 +1,4 @@
-/*
-package org.jeecg.modules.demo.opencv;
+package org.jeecg.modules.opencv.utils;
 
 
 import org.opencv.core.*;
@@ -9,16 +8,11 @@ import org.opencv.utils.Converters;
 
 import java.util.List;
 
-*/
 /**
  * 透视变换
- *//*
+ */
 
 public class Perspective {
-    public static void main(String[] args) {
-
-    }
-
     public static void perpectiveImg(String backgroundImgPath, String phoneImgPath, String targetFileName) {
         try {
             System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
@@ -27,7 +21,7 @@ public class Perspective {
             Mat dst = Imgcodecs.imread(backgroundImgPath);
             Mat dst1 = dst.clone();
             //透视变换点位
-            List<Point> perspectivePoints = CornerCheck.detectConerList();
+            List<Point> perspectivePoints = CornerCheck.detectConerList(backgroundImgPath);
             //矩形点位
             List<Point> matPoints = CornerCheck.matCornerList(perspectivePoints);
             //读取图像到矩阵中
@@ -54,6 +48,7 @@ public class Perspective {
             Imgcodecs.imwrite(targetFileName, dst);
         } catch (Exception e) {
             e.printStackTrace();
+            System.out.println("例外:" + e);
         }
     }
 
@@ -111,15 +106,13 @@ public class Perspective {
         return (iSum % 2) != 0;
     }
 
-    */
-/**
+    /**
      * 判断点是否在多边形内,如果点位于多边形的顶点或边上,也算做点在多边形内,直接返回true
      *
      * @param point   检测点
      * @param polygon 多边形的顶点
      * @return 点在多边形内返回true, 否则返回false
-     *//*
-
+     */
     public static boolean isPtInPoly(Point point, List<Point> polygon) {
 
         int N = polygon.size();
@@ -212,4 +205,3 @@ public class Perspective {
         }
     }
 }
-*/

+ 79 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/opencv/utils/Test.java

@@ -0,0 +1,79 @@
+package org.jeecg.modules.opencv.utils;
+
+import org.opencv.core.Core;
+import org.opencv.core.Mat;
+import org.opencv.core.Size;
+import org.opencv.imgcodecs.Imgcodecs;
+import org.opencv.imgproc.Imgproc;
+
+import java.io.File;
+
+public class Test {
+    public static void initVideo() {
+        System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
+        String srcPath = "D:\\data\\images\\";
+        String fillPath = "D:\\data\\fill\\";
+        String targetPath = "D:\\data\\video\\";
+        //1:切分视频
+//        VideoProcessing.grabberVideoFramer("D://data//video.mp4",srcPath);
+//        VideoProcessing.grabberVideoFramer("D://data//fill.mp4",fillPath);
+        //2:合并图片
+        int srcPhoneFrameNumFrom = 163;
+        int changeSenceFrameNumFrom = 234;
+        //2.1 复制原始视频无变化图片
+        for (int i = 1; i < srcPhoneFrameNumFrom; i++) {
+            Mat srcNoChangeImage = Imgcodecs.imread(srcPath + i + ".jpg");
+            Imgcodecs.imwrite(targetPath + i + ".jpg", srcNoChangeImage);
+        }
+        String getImageName = "";
+        //2.2 填充手机内部图片画面
+        for (int i = 163; i < changeSenceFrameNumFrom; i++) {
+            String backImg = srcPath + (i) + ".jpg";
+            String phoneImg = fillPath + (i - 162) + ".jpg";
+            String targetImg = targetPath + i + ".jpg";
+            Perspective.perpectiveImg(backImg, phoneImg, targetImg);
+            getImageName = targetImg;
+        }
+        //2.3 转场动画
+        Mat image = Imgcodecs.imread(getImageName, Imgcodecs.IMREAD_COLOR);
+        //(1)径向模糊图片
+        Mat radialBlur = ImageUtils.radialBlur(image);
+        Imgcodecs.imwrite(targetPath + changeSenceFrameNumFrom + ".jpg", radialBlur);
+        changeSenceFrameNumFrom++;
+        //(2)放大后径向模糊图片
+        Mat bigImamge = new Mat();
+        Imgproc.resize(image, bigImamge, new Size(image.cols() * 1.25, image.rows() * 1.25));
+        Mat destBigImamge = ImageUtils.cutFromCenter(bigImamge, image.width(), image.height());
+        Mat radialBlurDestBigImamge = ImageUtils.radialBlur(destBigImamge);
+        Imgcodecs.imwrite(targetPath + changeSenceFrameNumFrom + ".jpg", radialBlurDestBigImamge);
+        changeSenceFrameNumFrom++;
+        //(3)缩小之后重复平铺加径向模糊
+        Mat smallImage = new Mat();
+        Mat halfImage = new Mat();
+        Mat wholeImage = new Mat();
+        Imgproc.resize(image, smallImage, new Size(image.cols() / 2, image.rows() / 2));
+        ImageUtils.hconcat(smallImage, smallImage, halfImage);
+        ImageUtils.vconcat(halfImage, halfImage, wholeImage);
+        wholeImage = ImageUtils.radialBlur(wholeImage);
+        Imgcodecs.imwrite(targetPath + changeSenceFrameNumFrom + ".jpg", wholeImage);
+        changeSenceFrameNumFrom++;
+        //复制填充视频无变化图片
+        for (int i = changeSenceFrameNumFrom; i < 100000; i++) {
+            int checkNum = i - 3 - srcPhoneFrameNumFrom + 1;
+            String fillImagePath = fillPath + checkNum + ".jpg";
+            File file = new File(fillImagePath);
+            if (file.exists()) {
+                Mat srcMat = Imgcodecs.imread(fillImagePath);
+                Imgcodecs.imwrite(targetPath + i + ".jpg", srcMat);
+            } else {
+                break;
+            }
+        }
+    }
+
+
+    public static void main(String[] args) {
+        initVideo();
+    }
+
+}

+ 101 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/opencv/utils/VideoProcessing.java

@@ -0,0 +1,101 @@
+package org.jeecg.modules.opencv.utils;
+
+import cn.com.ctop.common.module.utils.LoadFileUtil;
+import org.bytedeco.javacpp.avcodec;
+import org.bytedeco.javacpp.opencv_core;
+import org.bytedeco.javacv.*;
+
+import javax.imageio.ImageIO;
+import java.awt.image.BufferedImage;
+import java.io.File;
+
+import static org.bytedeco.javacpp.opencv_imgcodecs.cvLoadImage;
+
+/**
+ * 视频截帧处理
+ */
+public class VideoProcessing {
+    /**
+     * 将视频文件帧处理并以“jpg”格式进行存储。
+     * 依赖FrameToBufferedImage方法:将frame转换为bufferedImage对象
+     * 视频帧拆分
+     * @param videoFileName
+     */
+    public static String grabberVideoFramer(String videoFileName, String filePackageName) {
+        //最后获取到的视频的图片的路径
+        String videPicture = "";
+        //Frame对象
+        Frame frame = null;
+        //标识
+        int flag = 0;
+        try {
+
+            /*获取视频文件*/
+            FFmpegFrameGrabber fFmpegFrameGrabber = new FFmpegFrameGrabber(videoFileName);
+            fFmpegFrameGrabber.start();
+
+            //获取视频总帧数
+            int ftp = fFmpegFrameGrabber.getLengthInFrames();
+            System.out.println("时长 " + ftp / fFmpegFrameGrabber.getFrameRate() / 60);
+            LoadFileUtil.checkFile(filePackageName);
+            while (flag <= ftp) {
+                frame = fFmpegFrameGrabber.grabImage();
+                /*对视频的第五帧进行处理*/
+                if (frame != null) {
+                    //文件绝对路径+名字
+                    String fileName = filePackageName + String.valueOf(flag) + ".jpg";
+                    //文件储存对象
+                    File outPut = new File(fileName);
+                    ImageIO.write(FrameToBufferedImage(frame), "jpg", outPut);
+                }
+                flag++;
+            }
+            fFmpegFrameGrabber.stop();
+            fFmpegFrameGrabber.close();
+        } catch (Exception E) {
+            E.printStackTrace();
+        }
+        return videPicture;
+    }
+
+    public static void videoMerge(String videoFileName, String imagePackage) throws FrameRecorder.Exception {
+        FFmpegFrameRecorder recorder = new FFmpegFrameRecorder(videoFileName, 720, 1280);
+//
+        recorder.setVideoCodec(avcodec.AV_CODEC_ID_MPEG4); // 28
+//		recorder.setFormat("mp4");
+        //	recorder.setFormat("mov,mp4,m4a,3gp,3g2,mj2,h264,ogg,MPEG4");
+        recorder.setFrameRate(25);
+        recorder.setPixelFormat(Avutils.AV_PIX_FMT_YUV422P); // yuv420p
+        recorder.start();
+        //
+        OpenCVFrameConverter.ToIplImage conveter = new OpenCVFrameConverter.ToIplImage();
+        // 列出目录中所有的图片,都是jpg的,以1.jpg,2.jpg的方式,方便操作
+        File file = new File(imagePackage);
+        File[] flist = file.listFiles();
+        // 循环所有图片
+        for (int i = 1; i <= flist.length; i++) {
+            String fname = imagePackage + i + ".jpg";
+            opencv_core.IplImage image = cvLoadImage(fname); // 非常吃内存!!
+            recorder.record(conveter.convert(image));
+            // 释放内存? cvLoadImage(fname); // 非常吃内存!!
+            opencv_core.cvReleaseImage(image);
+        }
+        recorder.stop();
+        recorder.release();
+    }
+
+    public static BufferedImage FrameToBufferedImage(Frame frame) {
+        //创建BufferedImage对象
+        Java2DFrameConverter converter = new Java2DFrameConverter();
+        BufferedImage bufferedImage = converter.getBufferedImage(frame);
+        return bufferedImage;
+    }
+
+    public static void main(String[] args) {
+        try {
+            videoMerge("D:\\data\\merge.mp4", "D:\\data\\video\\");
+        } catch (FrameRecorder.Exception e) {
+            e.printStackTrace();
+        }
+    }
+}

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

@@ -79,6 +79,8 @@ spring:
     exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure
   datasource:
     druid:
+      removeAbandoned: true
+      removeAbandonedTimeout: 300
       stat-view-servlet:
         enabled: true
         loginUsername: admin
@@ -152,6 +154,8 @@ mybatis-plus:
       log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
 #jeecg专用配置
 jeecg:
+  ffmpeg:
+    bin: D:\java\ffmpeg\bin\ffmpeg.exe
   path:
     #文件上传根目录 设置
     upload: D://upFiles

+ 3 - 0
jeecg-boot-module-system/src/main/resources/application-prod.yml

@@ -141,6 +141,9 @@ mybatis-plus:
       table-underline: true
 #jeecg专用配置
 jeecg:
+  ffmpeg:
+    bin: ffmpeg
+  #    bin: D:\java\ffmpeg\bin\ffmpeg.exe
   path:
     #文件上传根目录 设置
     upload: /mnt/upload

+ 145 - 20
jeecg-boot-module-system/src/test/java/org/jeecg/SampleTest.java

@@ -4,15 +4,20 @@ import cn.com.ctop.bytedance.service.IReportService;
 import cn.com.ctop.common.module.entity.CtopOauthToken;
 import cn.com.ctop.common.module.mapper.CtopOauthTokenMapper;
 import cn.com.ctop.common.module.service.ICtopOauthTokenService;
+import cn.com.ctop.common.module.service.IUserAllocationService;
 import cn.com.ctop.common.module.utils.CtopAdConstant;
 import cn.com.ctop.common.module.utils.HttpUtils;
+import cn.com.ctop.common.module.utils.OSSUtils;
+import cn.com.ctop.kuaishou.modules.batch.service.IKuaiShouCreativeService;
 import cn.com.ctop.kuaishou.modules.batch.service.IKuaiShouHistoryReportTaskService;
 import cn.com.ctop.kuaishou.modules.batch.service.IKuaishouInterfaceService;
+import cn.com.ctop.toutiao.service.IByteDanceAdvertiserDataService;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import lombok.extern.slf4j.Slf4j;
 import org.jeecg.common.util.DateUtils;
+import org.jeecg.modules.ctop.service.IBytedanceFundDailyService;
 import org.jeecg.modules.ctop.service.IPerformanceSaleService;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -20,7 +25,10 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.test.context.junit4.SpringRunner;
 
+import java.io.FileInputStream;
+import java.io.InputStream;
 import java.text.SimpleDateFormat;
+import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
 import java.util.concurrent.CountDownLatch;
@@ -52,6 +60,74 @@ public class SampleTest {
             SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
             Date parse = simpleDateFormat.parse("2020-03-12");
             kuaishouInterfaceService.getAdvertiserReportDaily(token, parse, parse);
+
+
+//            reportTaskService.createTask(3727345L, "871fc2c248782a94ad2962c941555abc", "");
+//            reportTaskService.getTaskList();
+
+/*
+            reportTaskService.createTask(3727345L, "871fc2c248782a94ad2962c941555abc");
+            reportTaskService.getTaskList();*/
+
+
+
+         /*   String url = "https://ad.e.kuaishou.com/rest/openapi/v1/async_task/list";
+            Map<String, String> headers = new HashMap<>();
+            headers.put("Content-Type", " application/json");
+            headers.put("Access-Token", "eb9a0d18072eabc339ee26ad010ecd6b");
+            JSONObject param = new JSONObject();
+            param.put("advertiser_id", 142402);
+            JSONArray taskIds = new JSONArray();
+            taskIds.add(1229917);
+
+            param.put("task_ids", taskIds);
+            String result = HttpUtils.kuaiShouhttpPostRequest(url, param.toJSONString(), headers);
+            JSONObject resultJson = JSONObject.parseObject(result);
+
+
+          /*  String url = "https://ad.e.kuaishou.com/rest/openapi/v1/async_task/download";
+
+            Map<String, String> headers = new HashMap<>();
+            headers.put("Access-Token", "eb9a0d18072eabc339ee26ad010ecd6b");
+
+            Map<String,Object> param = new HashMap<>();
+            param.put("advertiser_id", 142402);
+            param.put("task_id", "1229917");
+            String result = HttpUtils.KuaiShouttpGetRequest(url, param,headers);*/
+
+
+            /*URL url = new URL("https://ad.e.kuaishou.com/rest/openapi/v1/async_task/download?task_id=1229917&advertiser_id=142402");
+            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
+            //设置超时间为3秒
+            conn.setConnectTimeout(10 * 1000);
+            //防止屏蔽程序抓取而返回403错误
+            conn.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)");
+            conn.setRequestProperty("Access-Token", "6a1fbe20e49fe519ec8120aac5c9e55a");
+            //得到输入流
+            InputStream inputStream = conn.getInputStream();
+            //获取自己数组
+            byte[] getData = readInputStream(inputStream);
+
+            //文件保存位置
+            File saveDir = new File("D:\\file");
+            if (!saveDir.exists()) {
+                saveDir.mkdirs();
+            }
+            String fileName = "123.csv";
+            File file = new File(saveDir + File.separator + fileName);
+            FileOutputStream fos = new FileOutputStream(file);
+            fos.write(getData);
+            if (fos != null) {
+                fos.close();
+            }
+            if (inputStream != null) {
+                inputStream.close();
+            }*/
+         /*   String localPath = "D:\\file\\123.csv";
+
+            reportDailyAccountMapper.loadAccountDailyReport(142402L,localPath);*/
+
+
         } catch (Exception e) {
             e.printStackTrace();
 
@@ -63,26 +139,28 @@ public class SampleTest {
     private static ExecutorService executorService = Executors.newFixedThreadPool(10);
     private static CountDownLatch countDownLatch = null;
 
+    @Autowired
+    private IBytedanceFundDailyService fundDailyService;
     @Test
     public void testLoadJob() {
-        List<CtopOauthToken> tokens = tokenService.getTokenListByType(CtopAdConstant.PLATFORM_TYPE_BYTEDANCE);
+        String endDate = "2020-04-07";
+        String startDate = "2019-09-01";
+        CtopOauthToken token = tokenService.getTokenByAccountId(1654676647522317L);
+//        List<CtopOauthToken> tokens = tokenService.getTokenListByType(CtopAdConstant.PLATFORM_TYPE_BYTEDANCE);
+        List<CtopOauthToken> tokens = new ArrayList<>();
+        tokens.add(token);
         if (null != tokens && tokens.size() > 0) {
             countDownLatch = new CountDownLatch(tokens.size());
-            tokens.forEach(token -> {
+            tokens.forEach(getToken -> {
                 //拉取往期数据
                 executorService.submit(new Runnable() {
                     @Override
                     public void run() {
                         try {
-                            Date date = new Date();
-                            for (int i = 0; i < 180; i++) {
-                                Date startDate = DateUtils.addDay(date, -i);
-                                reportService.getMaterialReportByPage(token, DateUtils.formatDate(startDate), DateUtils.formatDate(startDate), 1);
-                            }
+                            fundDailyService.loadFundDataByPage(getToken, startDate, endDate, 1);
+                            countDownLatch.countDown();
                         } catch (Exception e) {
                             e.printStackTrace();
-                        } finally {
-                            countDownLatch.countDown();
                         }
                     }
                 });
@@ -96,14 +174,41 @@ public class SampleTest {
         }
     }
 
+    @Test
+    public void loadCampaignDate() {
+        Date endDate = DateUtils.addDay(new Date(), -1);
+        Date startDate = DateUtils.addDay(new Date(), -10);
+        //1:查询当日数据
+        List<CtopOauthToken> tokens = tokenService.getTokenListByType(CtopAdConstant.PLATFORM_TYPE_BYTEDANCE);
+        if (null == tokens || tokens.size() <= 0) {
+            log.info("定时获取头条数据异常:为获取到可用的token");
+            return;
+        }
+//        executorService = Executors.newFixedThreadPool(10);
+        tokens.forEach(token -> {
+//            executorService.submit(new Runnable() {
+//                @Override
+//                public void run() {
+            //获取广告主信息数据
+            reportService.getCampaignReportByPage(token, startDate, endDate, CtopAdConstant.BYTEDANCE_REPORT_TYPE_DAILY, 1);
+//                }
+//            });
+        });
+    }
+
     @Autowired
     private IReportService reportService;
+    @Autowired
+    private IUserAllocationService userAllocationService;
 
     @Test
     public void wanHuaTong() {
         String url = "https://ad.oceanengine.com/open_api/2/kaleidoscope/job/smart_cut/submit/";
 
         JSONObject conditions = new JSONObject();
+
+        // 1629785592929294
+
         conditions.put("advertiser_id", "1659671533108238");
         JSONObject job = new JSONObject();
         job.put("job_conf_id", 10);
@@ -153,35 +258,55 @@ public class SampleTest {
 
     }
 
+
+    @Autowired
+    private IKuaiShouCreativeService creativeService;
+
     @Test
     public void testSalePerformance() {
         performanceSaleService.loadSalsePerformance();
     }
 
+    @Test
+    public void loadBtPlanData() {
+        List<CtopOauthToken> tokens = tokenService.getTokenListByType(CtopAdConstant.PLATFORM_TYPE_BYTEDANCE);
+        tokens.forEach(token -> {
+            advertiserDataService.getAdvertiserPlan(token, "", null, null);
+        });
+    }
+
+    @Autowired
+    private IByteDanceAdvertiserDataService advertiserDataService;
+
     @Autowired
     private IPerformanceSaleService performanceSaleService;
 
+    @Autowired
+    private IKuaiShouHistoryReportTaskService historyReportTaskService;
 
     @Test
-    public void suZhao() {
+    public void testLoadData() throws Exception {
+        CtopOauthToken token = tokenService.getTokenByAccountId(5473041L);
+        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);
+    }
 
+    @Test
+    public void suZhao() {
         Long accountId = 3917130L;
         String token = "0a42e23921e486108105263e75561404";
-        kuaishouInterfaceService.getVideoList("e91c778d7de1bd0e9d8f3213d1e0e57c",3820093L, null,null,1);
+//        kuaishouInterfaceService.getVideoList("e91c778d7de1bd0e9d8f3213d1e0e57c",3820093L, null,null,1);
     }
 
     @Test
-    public void testLoadMatData() {
-        CtopOauthToken token = tokenService.getTokenByAccountId(1660215200335886L);
-        Date date = new Date();
-        //2020-03-20
-        for (int i = 0; i < 180; i++) {
-            Date startDate = DateUtils.addDay(date, -i);
-            reportService.getMaterialReportByPage(token, DateUtils.formatDate(startDate), DateUtils.formatDate(startDate), 1);
-        }
-//        reportService.getMaterialReportByPage(token, "2020-03-20", "2020-03-20",1);
+    public void test() throws Exception {
+        InputStream file = new FileInputStream("D:\\data\\模板视频\\原始模板4.mp4");
+        OSSUtils.uploadFile2OSS(file, "model/video/", "1234.mp4");
     }
+
+
 }
 
 

+ 10 - 4
module-common/src/main/java/cn/com/ctop/common/module/mapper/xml/MailLogMapper.xml

@@ -4,7 +4,6 @@
 
 
     <select id="selectCountByAccountIdAndDate" resultType="java.lang.Integer">
-
         select
         count(1)
         from
@@ -23,6 +22,7 @@
      left join sys_user t2
      on t1.user_id = t2.id
      where t1.project_id = #{projectId}
+     and t2.`status` = 1
      and t2.email != ''
     </select>
 
@@ -34,14 +34,20 @@
      ctop_project_member t1
      left join ctop_corp_wexin_user t2
      on t1.user_id = t2.user_id
+     LEFT JOIN sys_user t3
+     on  t1.user_id = t3.id
      where t1.project_id = #{projectId}
+     and t3.`status` = 1
      and t2.wexin_id != ''
     </select>
 
     <select id="getWChatIdByUserId" resultType="java.lang.String">
-    select wexin_id
-    from ctop_corp_wexin_user
-    where  user_id = #{userId}
+    select t1.wexin_id
+    from ctop_corp_wexin_user t1
+    left join  sys_user t2
+    on  t1.user_id = t2.id
+    where  t1.user_id = #{userId}
+    and t2.`status` = 1
 
     </select>
 

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

@@ -15,5 +15,5 @@ public interface IUserAllocationService extends IService<UserAllocation> {
 
     UserAllocation getByAccountId(Long accountId);
 
-    List<UserAllocation> getByProjectId(long projectId, String systemType);
+    List<UserAllocation> getByProjectId(Long projectId, String systemType);
 }

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

@@ -154,7 +154,10 @@ public class CtopOauthTokenServiceImpl extends ServiceImpl<CtopOauthTokenMapper,
     @Override
     public List<CtopOauthToken> getTokenListByType(String platformType) {
         QueryWrapper<CtopOauthToken> queryWrapper = new QueryWrapper<>();
-        queryWrapper.eq("media_id", platformType).orderByDesc("account_id");
+        if (null != platformType && !platformType.trim().equals("")) {
+            queryWrapper.eq("media_id", platformType);
+        }
+        queryWrapper.orderByDesc("account_id");
         return this.list(queryWrapper);
     }
 

+ 4 - 2
module-common/src/main/java/cn/com/ctop/common/module/service/impl/UserAllocationServiceImpl.java

@@ -26,9 +26,11 @@ public class UserAllocationServiceImpl extends ServiceImpl<UserAllocationMapper,
     }
 
     @Override
-    public List<UserAllocation> getByProjectId(long projectId, String systemType) {
+    public List<UserAllocation> getByProjectId(Long projectId, String systemType) {
         QueryWrapper<UserAllocation> queryWrapper = new QueryWrapper<>();
-        queryWrapper.eq("project_id", projectId);
+        if (null != projectId && projectId != 0) {
+            queryWrapper.eq("project_id", projectId);
+        }
         if (null != systemType && !systemType.trim().equals("")) {
             queryWrapper.eq("system_type", systemType);
         }

+ 19 - 3
module-common/src/main/java/cn/com/ctop/common/module/utils/CtopAdConstant.java

@@ -37,10 +37,21 @@ public class CtopAdConstant {
      */
     public static final String SYSTEM_SALE_AM_CODE = "f5a68aa2acf86e842100f0fa4b050d28";
 
-
-    public static final BigDecimal BYTEDANCE_MEDIA_TASK_COST = new BigDecimal("200000000");
-    public static final BigDecimal KUAISHOU_MEDIA_TASK_COST = new BigDecimal("200000000");
+    /**
+     * 头条销售媒体季度任务
+     */
+    public static final BigDecimal BYTEDANCE_MEDIA_TASK_COST = new BigDecimal("150000000");
+    /**
+     * 快手销售媒体季度任务
+     */
+    public static final BigDecimal KUAISHOU_MEDIA_TASK_COST = new BigDecimal("147000000");
+    /**
+     * 头条销售季度个人任务
+     */
     public static final BigDecimal BYTEDANCE_PERSONAL_TASK_COST = new BigDecimal("2400000");
+    /**
+     * 快手销售季度个人任务
+     */
     public static final BigDecimal KUAISHOU_PERSONAL_TASK_COST = new BigDecimal("2400000");
 
     /**
@@ -52,6 +63,11 @@ public class CtopAdConstant {
      */
     public static final String HB_BYTEDANCE_SALE_ORG_CODE = "A01A11A02";
 
+    public static final String BYTEDANCE_GENDER_TYPE_NONE = "NONE";
+    public static final String BYTEDANCE_GENDER_TYPE_GENDER_MALE = "GENDER_MALE";
+    public static final String BYTEDANCE_GENDER_TYPE_GENDER_FEMALE = "GENDER_FEMALE";
+
+
     public static final Integer COMMON_STATUS_ENABLED = 1;
 
     public static final Integer COMMON_STATUS_NOT_ENABLED = 0;

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

@@ -106,4 +106,10 @@ public class LoadFileUtil {
         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();
+        }
+    }
 }

+ 72 - 42
module-common/src/main/java/cn/com/ctop/common/module/utils/OSSUtils.java

@@ -1,25 +1,21 @@
 package cn.com.ctop.common.module.utils;
 
+import com.aliyun.oss.ClientException;
 import com.aliyun.oss.OSS;
 import com.aliyun.oss.OSSClientBuilder;
-import com.aliyun.oss.model.Bucket;
-import com.aliyun.oss.model.OSSObject;
-import com.aliyun.oss.model.ObjectMetadata;
-import com.aliyun.oss.model.PutObjectResult;
+import com.aliyun.oss.OSSException;
+import com.aliyun.oss.model.*;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.context.annotation.PropertySource;
 
-import java.io.ByteArrayInputStream;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.InputStream;
+import java.io.*;
 import java.util.Date;
 
 /**
- * @author yumeng
+ * @author syh
  * 2019年11月12日10:04:00
  */
 @Configuration
@@ -57,6 +53,45 @@ public class OSSUtils {
         return new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
     }
 
+    public static void uploadFile(String fileName) throws IOException {
+
+        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
+
+        try {
+            UploadFileRequest uploadFileRequest = new UploadFileRequest(bucketName, "sadsda");
+            // The local file to upload---it must exist.
+            uploadFileRequest.setUploadFile(fileName);
+            // Sets the concurrent upload task number to 5.
+            uploadFileRequest.setTaskNum(5);
+            // Sets the part size to 1MB.
+            uploadFileRequest.setPartSize(1024 * 1024 * 1);
+            // Enables the checkpoint file. By default it's off.
+            uploadFileRequest.setEnableCheckpoint(true);
+
+            UploadFileResult uploadResult = ossClient.uploadFile(uploadFileRequest);
+
+            CompleteMultipartUploadResult multipartUploadResult = uploadResult.getMultipartUploadResult();
+            System.out.println(multipartUploadResult.getETag());
+
+        } catch (OSSException oe) {
+            System.out.println("Caught an OSSException, which means your request made it to OSS, "
+                    + "but was rejected with an error response for some reason.");
+            System.out.println("Error Message: " + oe.getErrorMessage());
+            System.out.println("Error Code:       " + oe.getErrorCode());
+            System.out.println("Request ID:      " + oe.getRequestId());
+            System.out.println("Host ID:           " + oe.getHostId());
+        } catch (ClientException ce) {
+            System.out.println("Caught an ClientException, which means the client encountered "
+                    + "a serious internal problem while trying to communicate with OSS, "
+                    + "such as not being able to access the network.");
+            System.out.println("Error Message: " + ce.getMessage());
+        } catch (Throwable e) {
+            e.printStackTrace();
+        } finally {
+            ossClient.shutdown();
+        }
+    }
+
     /**
      * 创建存储空间
      *
@@ -158,7 +193,6 @@ public class OSSUtils {
             // 上传文件 (上传文件流的形式)
             PutObjectResult putResult = ossClient.putObject(bucketName, folder + fileName, is, metadata);
             Date expiration = new Date(System.currentTimeMillis() + 3600L * 1000 * 24 * 365 * 10);
-            String url = ossClient.generatePresignedUrl(bucketName, folder + fileName, expiration).toString();
             // 解析结果
             resultStr = putResult.getETag();
         } catch (Exception e) {
@@ -169,45 +203,41 @@ public class OSSUtils {
     }
 
     /**
-     * 上传文件至OSS
+     * 上传到OSS服务器 如果同名文件会覆盖服务器上的
      *
-     * @param file 上传文件(文件全路径如:D:\\image\\cake.jpg)
-     * @return String 返回访问链接
+     * @param instream
+     *            文件流
+     * @param remoteFileName
+     *            文件名称 包括后缀名
+     * @return 出错返回"" ,唯一MD5数字签名
      */
-    public static String uploadFile2Oss(File file) {
-        String resultStr = null;
+    public static String uploadFile2OSS(InputStream instream, String folder, String remoteFileName) {
+        String ret = "";
         try {
             OSS ossClient = OSSUtils.getOssClient();
-            // 以输入流的形式上传文件
-            InputStream is = new FileInputStream(file);
-            // 文件名
-            String fileName = file.getName();
-            // 文件大小
-            Long fileSize = file.length();
             // 创建上传Object的Metadata
-            ObjectMetadata metadata = new ObjectMetadata();
-            // 上传的文件的长度
-            metadata.setContentLength(is.available());
-            // 指定该Object被下载时的网页的缓存行为
-            metadata.setCacheControl("no-cache");
-            // 指定该Object下设置Header
-            metadata.setHeader("Pragma", "no-cache");
-            // 指定该Object被下载时的内容编码格式
-            metadata.setContentEncoding("utf-8");
-            // 文件的MIME,定义文件的类型及网页编码,决定浏览器将以什么形式、什么编码读取文件。如果用户没有指定则根据Key或文件名的扩展名生成,
-            // 如果没有扩展名则填默认值application/octet-stream
-            metadata.setContentType(getContentType(fileName));
-            // 指定该Object被下载时的名称(指示MINME用户代理如何显示附加的文件,打开或下载,及文件名称)
-            metadata.setContentDisposition("filename/filesize=" + fileName + "/" + fileSize + "Byte.");
-            Date expiration = new Date(System.currentTimeMillis() + 3600L * 1000 * 24 * 365 * 10);
-            resultStr = ossClient.generatePresignedUrl(bucketName, folder + fileName, expiration).toString();
-        } catch (Exception e) {
-            e.printStackTrace();
-            logger.error("上传阿里云OSS服务器异常." + e.getMessage(), e);
+            ObjectMetadata objectMetadata = new ObjectMetadata();
+            objectMetadata.setContentLength(instream.available());
+            objectMetadata.setCacheControl("no-cache");
+            objectMetadata.setHeader("Pragma", "no-cache");
+            objectMetadata.setContentType(getContentType(remoteFileName));
+            objectMetadata.setContentDisposition("inline;filename=" + remoteFileName);
+            // 上传文件
+            ossClient.putObject(bucketName, folder + remoteFileName, instream, objectMetadata);
+            return "https://ctop-media.oss-cn-beijing.aliyuncs.com/" + folder + remoteFileName;
+        } catch (IOException e) {
+            logger.error(e.getMessage(), e);
+        } finally {
+            try {
+                if (instream != null) {
+                    instream.close();
+                }
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
         }
-        return resultStr;
+        return ret;
     }
-
     /**
      * 通过文件名判断并获取OSS服务文件上传时文件的contentType
      *

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

@@ -46,7 +46,8 @@ public enum StatusCode {
     KUAISHOU_CRAWLER_APP_SUCCESS("爬虫运行正常", 0, true),
     KUAISHOU_CRAWLER_APP_TASK_END("爬虫任务运行结束", 1, true),
     KUAISHOU_CRAWLER_APP_JOB_StART("任务开始执行开始", 0, true),
-    KUAISHOU_CRAWLER_APP_JOB_END("任务运行结束", 1, true);
+    KUAISHOU_CRAWLER_APP_JOB_END("任务运行结束", 1, true),
+    MODEL_VIDEO_NOT_EXIST("模板视频不存在或者已经被删除", 0, false);
     private String desc;
     private int code;
     private boolean flag;

+ 1 - 1
module-common/src/main/resources/config.properties

@@ -4,4 +4,4 @@ aliyun.accessKeySecret=1rkPz7JNoXk8sJevPaeYHWqfkQXBGh
 # Aliyun OSS Config
 aliyun.oss.endpoint=http://oss-cn-beijing.aliyuncs.com
 aliyun.oss.bucketName=ctop-media
-aliyun.oss.folder=file
+aliyun.oss.folder=model/video/

+ 2 - 61
module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/batch/controller/KuaiShouController.java

@@ -3,18 +3,12 @@ package cn.com.ctop.kuaishou.modules.batch.controller;
 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 com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
-import org.jeecg.common.util.DateUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
-import org.springframework.web.multipart.MultipartFile;
 
-import javax.servlet.http.HttpServletRequest;
 import java.io.IOException;
-import java.util.Date;
 import java.util.HashMap;
 import java.util.Map;
 
@@ -74,29 +68,6 @@ public class KuaiShouController {
     }
 
 
-    @RequestMapping("/getCampaignList")
-    public void getCampaignList() {
-        String accessToken = "18cf38d50da314dcbd9cb6db9c43bcbf";
-        Long advertiserId = 1595407L;
-        kuaishouInterfaceService.getCampaignList(accessToken, advertiserId, DateUtils.addDay(new Date(),-1), new Date(), 1);
-
-    }
-
-    @RequestMapping("/getGroupList")
-    public void getGroupList() {
-        String accessToken = "604d2f2ffe5573c3500ffee358ba9b3c";
-        Long advertiserId = 1595407L;
-        kuaishouInterfaceService.getGroupList(accessToken, advertiserId, DateUtils.addDay(new Date(),-1), new Date(), 1);
-
-    }
-
-    @RequestMapping("/getCreativeList")
-    public void getCreativeList() {
-        String accessToken = "604d2f2ffe5573c3500ffee358ba9b3c";
-        Long advertiserId = 1595407L;
-        kuaishouInterfaceService.getCreativeList(accessToken, advertiserId, DateUtils.addDay(new Date(),-1), new Date(), 1);
-    }
-
     @RequestMapping("/getDeepConversionInfos")
     public void getDeepConversionInfos() {
         String accessToken = "cbe9caeffcc2c5ccd97a05bf909896da";
@@ -105,11 +76,6 @@ public class KuaiShouController {
     }
 
 
-
-
-
-
-
     @RequestMapping("/image/get")
     public void imageGet() {
         String accessToken = "360d43b49553684a011d6607322582b1";
@@ -135,15 +101,7 @@ public class KuaiShouController {
         kuaishouInterfaceService.getAppList(advertiserId, accessToken);
 
     }
-
-    @RequestMapping(value = "/app/update", consumes = "multipart/form-data;charset=utf-8")
-    public void appUpdate(@RequestParam("multipartFile") MultipartFile multipartFile, HttpServletRequest request) throws IOException {
-        String accessToken = "360d43b49553684a011d6607322582b1";
-        Long advertiserId = 23212L;
-        JSONObject requestJson = new JSONObject();
-        kuaishouInterfaceService.appUpdate(advertiserId, accessToken, requestJson, multipartFile, request);
-    }
-
+    
 
     @Autowired
     private ICtopOauthTokenService tokenService;
@@ -161,11 +119,7 @@ public class KuaiShouController {
         if (null != type) {
             if (type == 1) {
                 //广告主
-                if (null != temporalGranularity && "hourly".equals(temporalGranularity)) {
-                    result.put("data", kuaishouInterfaceService.getAccountHourlyReport(token.getAccessToken(), token.getAccountId(), startDate, endDate, 500, 1));
-                } else {
-                    result.put("data", kuaishouInterfaceService.getAccountDailyReport(token.getAccessToken(), token.getAccountId(), startDate, endDate, 500, 1));
-                }
+
             } else if (type == 2) {
                 //广告组
                 if (null != temporalGranularity && "hourly".equals(temporalGranularity)) {
@@ -197,18 +151,5 @@ public class KuaiShouController {
         kuaishouInterfaceService.advertiserInfo(23212L, "10b6ad966b7e958d1510a78a5315ec5c");
     }
 
-    @RequestMapping("getImageList")
-    public void getImageList() {
-        String accessToken = "604d2f2ffe5573c3500ffee358ba9b3c";
-        Long advertiserId = 1595407L;
-        kuaishouInterfaceService.getImageList(accessToken, advertiserId, new Date(), new Date(), 1);
-    }
-
-    @RequestMapping("getVideoList")
-    public void getVideoList() {
-        String accessToken = "e8959cf08e59e78b91b22aa4ed593c00";
-        Long advertiserId = 1022694L;
-        kuaishouInterfaceService.getVideoList(accessToken, advertiserId, DateUtils.addDay(new Date(), -1), new Date(), 1);
-    }
 
 }

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

@@ -1,91 +0,0 @@
-package cn.com.ctop.kuaishou.modules.batch.controller;
-
-import cn.com.ctop.common.module.entity.CtopOauthToken;
-import cn.com.ctop.common.module.entity.UserAllocation;
-import cn.com.ctop.common.module.mapper.CtopOauthTokenMapper;
-import cn.com.ctop.common.module.mapper.UserAllocationMapper;
-import cn.com.ctop.common.module.utils.Check;
-import cn.com.ctop.kuaishou.modules.batch.service.IKuaishouInterfaceService;
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import lombok.extern.slf4j.Slf4j;
-import org.jeecg.common.util.DateUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
-
-import java.text.ParseException;
-import java.util.List;
-
-/**
- * @Description: 快手-本地图片保存
- * @Author: jeecg-boot
- * @Date: 2019-08-14
- * @Version: V1.0
- */
-@Slf4j
-
-@RestController
-@RequestMapping("/kuaishou/getReport")
-public class KuaiShouReportController {
-    @Autowired
-    private UserAllocationMapper userAllocationMapper;
-    @Autowired
-    private CtopOauthTokenMapper ctopOauthTokenMapper;
-    @Autowired
-    private IKuaishouInterfaceService kuaishouInterfaceService;
-
-    @RequestMapping(value = "/historyData")
-    public String queryPageList() throws ParseException {
-        QueryWrapper<UserAllocation> queryWrapper = new QueryWrapper<>();
-        queryWrapper.eq("media_id", 2);
-        queryWrapper.groupBy("account_id");
-        List<UserAllocation> userAllocations = userAllocationMapper.selectList(queryWrapper);
-        String nowDate = DateUtils.getNowDate("yyyy-MM-dd");
-        String anotherDay = DateUtils.getAnotherDay("yyyy-MM-dd", nowDate, -1);
-        if (!Check.isNull(userAllocations)) {
-            for (UserAllocation allocation : userAllocations) {
-                String beginDate = null;
-                String hourDate = null;
-                Long accountId = allocation.getAccountId();
-                if (!Check.isNull(accountId)) {
-                    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 = ctopOauthTokenMapper.selectOne(tokenQueryWrapper);
-                    if (!Check.isNull(ctopOauthToken)) {
-                        String accessToken = ctopOauthToken.getAccessToken();
-                        Long advertiserId = ctopOauthToken.getAccountId();
-                        for (int i = 0; i < 6; i++) {
-                            if (i == 0) {
-                                String monthBefore = DateUtils.getMonthBefore("yyyy-MM-dd", nowDate, -1);
-                                kuaishouInterfaceService.getAccountDailyReport(accessToken, advertiserId, monthBefore, anotherDay, 500, 1);
-                                beginDate = monthBefore;
-                            } else if (i > 0) {
-                                String startDate = DateUtils.getAnotherDay("yyyy-MM-dd", beginDate, -1);
-                                String monthBefore = DateUtils.getMonthBefore("yyyy-MM-dd", beginDate, -1);
-                                if (i == 5) {
-                                    monthBefore = DateUtils.getAnotherDay("yyyy-MM-dd", monthBefore, 4);
-                                }
-                                kuaishouInterfaceService.getAccountDailyReport(accessToken, advertiserId, monthBefore, startDate, 500, 1);
-                                beginDate = monthBefore;
-                            }
-                        }
-                        for (int i = 0; i < 7; i++) {
-                            if (i == 0) {
-                                kuaishouInterfaceService.getAccountHourlyReport(accessToken, advertiserId, nowDate, nowDate, 500, 1);
-                                hourDate = nowDate;
-                            } else if (i > 0) {
-                                String hourAnotherDay = DateUtils.getAnotherDay("yyyy-MM-dd", hourDate, -1);
-                                kuaishouInterfaceService.getAccountHourlyReport(accessToken, advertiserId, hourAnotherDay, hourAnotherDay, 500, 1);
-                                hourDate = hourAnotherDay;
-                            }
-                        }
-                    }
-                }
-            }
-        }
-        return null;
-    }
-}

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

@@ -1,249 +0,0 @@
-package cn.com.ctop.kuaishou.modules.batch.controller;
-
-import cn.com.ctop.common.module.utils.StringUtils;
-import cn.com.ctop.kuaishou.modules.report.entity.KuaishouReportHourlyCreativeStatistic;
-import cn.com.ctop.kuaishou.modules.report.service.IKuaishouReportHourlyCreativeStatisticService;
-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 2019-11-01
- */
-@Slf4j
-@Api(tags = "时报清洗数据")
-@RestController
-@RequestMapping("/ctop/kuaishouReportHourlyCreativeStatistic")
-public class KuaishouReportHourlyCreativeStatisticController {
-    @Autowired
-    private IKuaishouReportHourlyCreativeStatisticService kuaishouReportHourlyCreativeStatisticService;
-
-    /**
-     * 分页列表查询
-     *
-     * @param kuaishouReportHourlyCreativeStatistic
-     * @param pageNo
-     * @param pageSize
-     * @param req
-     * @return
-     */
-    @AutoLog(value = "时报清洗数据-分页列表查询")
-    @ApiOperation(value = "时报清洗数据-分页列表查询", notes = "时报清洗数据-分页列表查询")
-    @GetMapping(value = "/list")
-    public Result<IPage<KuaishouReportHourlyCreativeStatistic>> queryPageList(KuaishouReportHourlyCreativeStatistic kuaishouReportHourlyCreativeStatistic,
-                                                                              @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
-                                                                              @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
-                                                                              HttpServletRequest req) {
-        Result<IPage<KuaishouReportHourlyCreativeStatistic>> result = new Result<IPage<KuaishouReportHourlyCreativeStatistic>>();
-        QueryWrapper<KuaishouReportHourlyCreativeStatistic> queryWrapper = QueryGenerator.initQueryWrapper(kuaishouReportHourlyCreativeStatistic, req.getParameterMap());
-        Page<KuaishouReportHourlyCreativeStatistic> page = new Page<KuaishouReportHourlyCreativeStatistic>(pageNo, pageSize);
-        IPage<KuaishouReportHourlyCreativeStatistic> pageList = kuaishouReportHourlyCreativeStatisticService.page(page, queryWrapper);
-        result.setSuccess(true);
-        result.setResult(pageList);
-        return result;
-    }
-
-    /**
-     * 添加
-     *
-     * @param kuaishouReportHourlyCreativeStatistic
-     * @return
-     */
-    @AutoLog(value = "时报清洗数据-添加")
-    @ApiOperation(value = "时报清洗数据-添加", notes = "时报清洗数据-添加")
-    @PostMapping(value = "/add")
-    public Result<KuaishouReportHourlyCreativeStatistic> add(@RequestBody KuaishouReportHourlyCreativeStatistic kuaishouReportHourlyCreativeStatistic) {
-        Result<KuaishouReportHourlyCreativeStatistic> result = new Result<KuaishouReportHourlyCreativeStatistic>();
-        try {
-            kuaishouReportHourlyCreativeStatisticService.save(kuaishouReportHourlyCreativeStatistic);
-            result.success("添加成功!");
-        } catch (Exception e) {
-            log.error(e.getMessage(), e);
-            result.error500("操作失败");
-        }
-        return result;
-    }
-
-    /**
-     * 编辑
-     *
-     * @param kuaishouReportHourlyCreativeStatistic
-     * @return
-     */
-    @AutoLog(value = "时报清洗数据-编辑")
-    @ApiOperation(value = "时报清洗数据-编辑", notes = "时报清洗数据-编辑")
-    @PutMapping(value = "/edit")
-    public Result<KuaishouReportHourlyCreativeStatistic> edit(@RequestBody KuaishouReportHourlyCreativeStatistic kuaishouReportHourlyCreativeStatistic) {
-        Result<KuaishouReportHourlyCreativeStatistic> result = new Result<KuaishouReportHourlyCreativeStatistic>();
-        KuaishouReportHourlyCreativeStatistic kuaishouReportHourlyCreativeStatisticEntity = kuaishouReportHourlyCreativeStatisticService.getById(kuaishouReportHourlyCreativeStatistic.getId());
-        if (kuaishouReportHourlyCreativeStatisticEntity == null) {
-            result.error500("未找到对应实体");
-        } else {
-            boolean ok = kuaishouReportHourlyCreativeStatisticService.updateById(kuaishouReportHourlyCreativeStatistic);
-            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 {
-            kuaishouReportHourlyCreativeStatisticService.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<KuaishouReportHourlyCreativeStatistic> deleteBatch(@RequestParam(name = "ids", required = true) String ids) {
-        Result<KuaishouReportHourlyCreativeStatistic> result = new Result<KuaishouReportHourlyCreativeStatistic>();
-        if (ids == null || "".equals(ids.trim())) {
-            result.error500("参数不识别!");
-        } else {
-            this.kuaishouReportHourlyCreativeStatisticService.removeByIds(Arrays.asList(ids.split(StringUtils.COMMA)));
-            result.success("删除成功!");
-        }
-        return result;
-    }
-
-    /**
-     * 通过id查询
-     *
-     * @param id
-     * @return
-     */
-    @AutoLog(value = "时报清洗数据-通过id查询")
-    @ApiOperation(value = "时报清洗数据-通过id查询", notes = "时报清洗数据-通过id查询")
-    @GetMapping(value = "/queryById")
-    public Result<KuaishouReportHourlyCreativeStatistic> queryById(@RequestParam(name = "id", required = true) String id) {
-        Result<KuaishouReportHourlyCreativeStatistic> result = new Result<KuaishouReportHourlyCreativeStatistic>();
-        KuaishouReportHourlyCreativeStatistic kuaishouReportHourlyCreativeStatistic = kuaishouReportHourlyCreativeStatisticService.getById(id);
-        if (kuaishouReportHourlyCreativeStatistic == null) {
-            result.error500("未找到对应实体");
-        } else {
-            result.setResult(kuaishouReportHourlyCreativeStatistic);
-            result.setSuccess(true);
-        }
-        return result;
-    }
-
-    /**
-     * 导出excel
-     *
-     * @param request
-     * @param response
-     */
-    @RequestMapping(value = "/exportXls")
-    public ModelAndView exportXls(HttpServletRequest request, HttpServletResponse response) {
-        // Step.1 组装查询条件
-        QueryWrapper<KuaishouReportHourlyCreativeStatistic> queryWrapper = null;
-        try {
-            String paramsStr = request.getParameter("paramsStr");
-            if (oConvertUtils.isNotEmpty(paramsStr)) {
-                String deString = URLDecoder.decode(paramsStr, "UTF-8");
-                KuaishouReportHourlyCreativeStatistic kuaishouReportHourlyCreativeStatistic = JSON.parseObject(deString, KuaishouReportHourlyCreativeStatistic.class);
-                queryWrapper = QueryGenerator.initQueryWrapper(kuaishouReportHourlyCreativeStatistic, request.getParameterMap());
-            }
-        } catch (UnsupportedEncodingException e) {
-            e.printStackTrace();
-        }
-
-        //Step.2 AutoPoi 导出Excel
-        ModelAndView mv = new ModelAndView(new JeecgEntityExcelView());
-        List<KuaishouReportHourlyCreativeStatistic> pageList = kuaishouReportHourlyCreativeStatisticService.list(queryWrapper);
-        //导出文件名称
-        mv.addObject(NormalExcelConstants.FILE_NAME, "时报清洗数据列表");
-        mv.addObject(NormalExcelConstants.CLASS, KuaishouReportHourlyCreativeStatistic.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<KuaishouReportHourlyCreativeStatistic> listKuaishouReportHourlyCreativeStatistics = ExcelImportUtil.importExcel(file.getInputStream(), KuaishouReportHourlyCreativeStatistic.class, params);
-                kuaishouReportHourlyCreativeStatisticService.saveBatch(listKuaishouReportHourlyCreativeStatistics);
-                return Result.ok("文件导入成功!数据行数:" + listKuaishouReportHourlyCreativeStatistics.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("文件导入失败!");
-    }
-
-}

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

@@ -7,12 +7,9 @@ import cn.com.ctop.kuaishou.modules.material.entity.KuaishouResultToken;
 import cn.com.ctop.kuaishou.modules.report.entity.*;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
-import org.springframework.web.multipart.MultipartFile;
 
-import javax.servlet.http.HttpServletRequest;
 import java.text.ParseException;
 import java.util.Date;
-import java.util.List;
 import java.util.Map;
 
 /**
@@ -20,24 +17,92 @@ import java.util.Map;
  * 2019年11月12日11:08:52
  */
 public interface IKuaishouInterfaceService {
-    KuaishouResult<KuaishouReportHourlyAccount> getAccountHourlyReport(String accessToken, Long advertiserId, String startDate, String endDate, int pageSize, int pageNum);
-
-    KuaishouResult<KuaishouReportDailyAccount> getAccountDailyReport(String accessToken, Long advertiserId, String startDate, String endDate, int pageSize, int pageNum);
 
+    /**
+     * 计划日报
+     *
+     * @param accessToken
+     * @param advertiserId
+     * @param startDate
+     * @param endDate
+     * @param pageSize
+     * @param pageNum
+     * @return
+     */
     KuaishouResult<KuaishouReportDailyCampaign> getCampaignDailyReport(String accessToken, Long advertiserId, String startDate, String endDate, int pageSize, int pageNum);
 
+    /**
+     * 计划时报
+     *
+     * @param accessToken
+     * @param advertiserId
+     * @param startDate
+     * @param endDate
+     * @param pageSize
+     * @param pageNum
+     * @return
+     */
     KuaishouResult<KuaishouReportHourlyCampaign> getCampaignHourlyReport(String accessToken, Long advertiserId, String startDate, String endDate, int pageSize, int pageNum);
 
+    /**
+     * 组日报
+     *
+     * @param accessToken
+     * @param advertiserId
+     * @param startDate
+     * @param endDate
+     * @param pageSize
+     * @param pageNum
+     * @return
+     */
     KuaishouResult<KuaishouReportDailyGroup> getGroupDailyReport(String accessToken, Long advertiserId, String startDate, String endDate, int pageSize, int pageNum);
 
+    /**
+     * 组时报
+     *
+     * @param accessToken
+     * @param advertiserId
+     * @param startDate
+     * @param endDate
+     * @param pageSize
+     * @param pageNum
+     * @return
+     */
     KuaishouResult<KuaishouReportHourlyGroup> getGroupHourlyReport(String accessToken, Long advertiserId, String startDate, String endDate, int pageSize, int pageNum);
 
+    /**
+     * 创意日报 暂停使用
+     *
+     * @param accessToken
+     * @param advertiserId
+     * @param startDate
+     * @param endDate
+     * @param pageSize
+     * @param pageNum
+     * @return
+     */
     KuaishouResult<KuaishouReportDailyCreative> getCreativeDailyReport(String accessToken, Long advertiserId, String startDate, String endDate, int pageSize, int pageNum);
 
+    /**
+     * 创意时报 暂停使用
+     *
+     * @param accessToken
+     * @param advertiserId
+     * @param startDate
+     * @param endDate
+     * @param pageSize
+     * @param pageNum
+     * @return
+     */
     KuaishouResult<KuaishouReportHourlyCreative> getCreativeHourlyReport(String accessToken, Long advertiserId, String startDate, String endDate, int pageSize, int pageNum);
 
-    void loadAllKuaishouData(List<CtopOauthToken> tokens);
 
+    /**
+     * 获取历史数据
+     *
+     * @param token
+     * @throws ParseException
+     */
     void loadKuaishouDataSingle(CtopOauthToken token) throws ParseException;
 
     /**
@@ -63,15 +128,6 @@ public interface IKuaishouInterfaceService {
 
 
     /**
-     * 获取广告计划信息  全量
-     *
-     * @param accessToken
-     * @param advertiserId
-     */
-    void getCampaignList(String accessToken, Long advertiserId, Date startDate, Date endDate, Integer page);
-
-
-    /**
      * 获取广告计划信息  单条
      *
      * @param accessToken
@@ -79,14 +135,6 @@ public interface IKuaishouInterfaceService {
      */
     void getCampaign(String accessToken, Long advertiserId, Long campaignId);
 
-    /**
-     * 获取广告组信息 全量
-     *
-     * @param accessToken
-     * @param advertiserId
-     * @param page
-     */
-    void getGroupList(String accessToken, Long advertiserId, Date startDate, Date endDate, Integer page);
 
     /**
      * 获取广告组信息 单条
@@ -98,17 +146,24 @@ public interface IKuaishouInterfaceService {
     void getGroup(String accessToken, Long advertiserId, Long unitId);
 
 
+    /**
+     * 获取创意列表
+     *
+     * @param token
+     * @param startDate
+     * @param endDate
+     */
     void getCreativeList(CtopOauthToken token, Date startDate, Date endDate);
 
-    void getVideoInfo(String accessToken, Long advertiserId, String photoId);
-
     /**
-     * 获取创意信息
+     * 获取视频信息
      *
      * @param accessToken
      * @param advertiserId
+     * @param photoId
      */
-    void getCreativeList(String accessToken, Long advertiserId, Date startDate, Date endDate, Integer page);
+    void getVideoInfo(String accessToken, Long advertiserId, String photoId);
+
 
     /**
      * 获取token
@@ -127,6 +182,13 @@ public interface IKuaishouInterfaceService {
      */
     Map<String, Object> getDeepConversionInfos(Long advertiserId, String accessToken);
 
+    /**
+     * 取可选的深度转化类型
+     *
+     * @param advertiserId
+     * @param accessToken
+     * @return
+     */
     JSONObject getDeepConversionInfosV2(Long advertiserId, String accessToken);
 
 
@@ -139,7 +201,14 @@ public interface IKuaishouInterfaceService {
      */
     Map<String, Object> creativeCreate(String accessToken, Long advertiserId, JSONObject requestJson);
 
-    void getCreativeByCreativeId(String accessToken, Long advertiserId, Date startDate, Date endDate, Integer page, Long creativeId);
+    /**
+     * 根据创意id 获取创意信息
+     *
+     * @param accessToken
+     * @param advertiserId
+     * @param creativeId
+     */
+    void getCreativeByCreativeId(String accessToken, Long advertiserId, Long creativeId);
 
     /**
      * 文件上传
@@ -216,17 +285,6 @@ public interface IKuaishouInterfaceService {
 
 
     /**
-     * 修改应用
-     *
-     * @param advertiserId
-     * @param accessToken
-     * @param requestJson
-     * @param multipartFile
-     * @param request
-     */
-    void appUpdate(Long advertiserId, String accessToken, JSONObject requestJson, MultipartFile multipartFile, HttpServletRequest request);
-
-    /**
      * 创建 url应用
      *
      * @param accountId
@@ -245,59 +303,117 @@ public interface IKuaishouInterfaceService {
      */
     Map<String, Object> advertiserInfo(Long accountId, String accessToken);
 
+    /**
+     * 获取视频列表
+     *
+     * @param token
+     * @param startDate
+     * @param endDate
+     */
     void getVideoList(CtopOauthToken token, Date startDate, Date endDate);
 
-    void getVideoList(String token, Long advertiserId, Date startDate, Date endDate, int page);
 
+    /**
+     * 获取广告主分天报表
+     *
+     * @param token
+     * @param startDate
+     * @param endDate
+     */
     void getAdvertiserReportDaily(CtopOauthToken token, Date startDate, Date endDate);
 
+    /**
+     * 获取计划分天报表
+     *
+     * @param token
+     * @param startDate
+     * @param endDate
+     */
     void getAdvertiserCampaignReportDaily(CtopOauthToken token, Date startDate, Date endDate);
 
+    /**
+     * 获取广告计划分天报表 暂停使用
+     *
+     * @param token
+     * @param startDate
+     * @param endDate
+     */
     void getAdvertiserGroupReportDaily(CtopOauthToken token, Date startDate, Date endDate);
 
+    /**
+     * 获取创意分天报表 暂停使用
+     *
+     * @param token
+     * @param startDate
+     * @param endDate
+     * @param campaignIds
+     */
     void getAdvertiserCreativeReportDaily(CtopOauthToken token, Date startDate, Date endDate, JSONArray campaignIds);
 
+    /**
+     * 获取广告主时报
+     *
+     * @param token
+     * @param startDate
+     * @param endDate
+     */
     void getAdvertiserReportHourly(CtopOauthToken token, Date startDate, Date endDate);
 
+    /**
+     * 获取计划时报
+     *
+     * @param token
+     * @param startDate
+     * @param endDate
+     */
     void getAdvertiserCampaignReportHourly(CtopOauthToken token, Date startDate, Date endDate);
 
+    /**
+     * 获取组时报
+     *
+     * @param token
+     * @param startDate
+     * @param endDate
+     */
     void getAdvertiserGroupReportHourly(CtopOauthToken token, Date startDate, Date endDate);
 
+    /**
+     * 获取创意时报 暂停使用
+     *
+     * @param token
+     * @param startDate
+     * @param endDate
+     */
     void getAdvertiserCreativeReportHourly(CtopOauthToken token, Date startDate, Date endDate);
 
+    /**
+     * 获取计划列表
+     *
+     * @param token
+     * @param startDate
+     * @param endDate
+     */
     void getCampaignList(CtopOauthToken token, Date startDate, Date endDate);
 
-    void getGroupList(CtopOauthToken token, Date startDate, Date endDate);
-
-    void loadData() throws InterruptedException;
-
-    void updateCreativeReportHourlyStatistic(CtopOauthToken token, Date getDate);
-
-    void deleteHourlyReport(Date deleteDate);
-
     /**
-     * 获取快手图片列表
+     * 获取组列表
      *
      * @param token
      * @param startDate
      * @param endDate
      */
-    void getImageList(CtopOauthToken token, Date startDate, Date endDate);
-
-
-    void getImageList2(CtopOauthToken token, Date startDate, Date endDate, Integer page);
+    void getGroupList(CtopOauthToken token, Date startDate, Date endDate);
 
 
     /**
-     * 获取快手图片列表--测试使用
+     * 获取快手图片列表
      *
      * @param token
-     * @param accountId
      * @param startDate
      * @param endDate
-     * @param page
      */
-    void getImageList(String token, Long accountId, Date startDate, Date endDate, int page);
+    void getImageList(CtopOauthToken token, Date startDate, Date endDate);
+
 
     /**
      * 获取账户余额
@@ -346,16 +462,13 @@ public interface IKuaishouInterfaceService {
     JSONArray getAppSearch(Long accountId, String accessToken, String appName);
 
 
-    void getVideoList2(CtopOauthToken token, Date startDate, Date endDate, Integer page);
-
-    void getCreativeList2(CtopOauthToken token, Date startDate, Date endDate, Integer page);
-
-    void getCreative(String token, Long advertiserId, Long creativeId);
-
-
-    void getAdvertiserCreativeReportDailyV2(Long campaignId, CtopOauthToken ctopOauthToken, Date startDate, Date endDate);
-
-
+    /**
+     * 获取素造素材列表
+     *
+     * @param token
+     * @param accountId
+     * @param page
+     */
     void getSuZaoList(String token, Long accountId, int page);
 
 

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

@@ -434,7 +434,7 @@ public class KuaiShouUpdateServiceImpl implements IKuaiShouUpdateService {
                         deleteMap.put("creative_id", creativeId);
                         creativeMapper.deleteByMap(deleteMap);
                     } else {
-                        interfaceService.getCreative(token, advertiserId, creativeId);
+                        interfaceService.getCreativeByCreativeId(token, advertiserId, creativeId);
                     }
 
                     returnMap.put("code", 0);
@@ -646,7 +646,7 @@ public class KuaiShouUpdateServiceImpl implements IKuaiShouUpdateService {
 
                         try {
                             Thread.sleep(500);
-                            interfaceService.getCreative(accessToken, creativeJson.getLong("advertiser_id"), data.getLong("creative_id"));
+                            interfaceService.getCreativeByCreativeId(accessToken, creativeJson.getLong("advertiser_id"), data.getLong("creative_id"));
                         } catch (InterruptedException e) {
                             e.printStackTrace();
                         }

Diferenças do arquivo suprimidas por serem muito extensas
+ 118 - 1009
module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/batch/service/impl/KuaishouInterfaceServiceImpl.java


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

@@ -1,11 +1,16 @@
 package cn.com.ctop.kuaishou.modules.report.mapper;
 
 import cn.com.ctop.kuaishou.modules.report.entity.KuaishouReportDailyCreative;
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import org.apache.ibatis.annotations.Param;
 
+import java.util.List;
+
 public interface KuaishouReportDailyCreativeMapper extends BaseMapper<KuaishouReportDailyCreative> {
     void loadCreativeDailyReport(@Param("accountId") Long accountId, @Param("localPath") String localPath);
 
     void formatCreativeDailyReportData(@Param("accountId") Long accountId, @Param("statDate") String statDate);
+
+    List<JSONObject> selectCodeByDate(@Param("startDate") String startDate, @Param("endDate") String endDate);
 }

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

@@ -1,18 +0,0 @@
-package cn.com.ctop.kuaishou.modules.report.mapper;
-
-import cn.com.ctop.kuaishou.modules.report.entity.KuaishouReportHourlyCreativeStatistic;
-import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import org.apache.ibatis.annotations.Param;
-
-/**
- * 时报清洗数据
- *
- * @author: jeecg-boot
- * @date: 2019-11-01
- * @cersion: V1.0
- */
-public interface KuaishouReportHourlyCreativeStatisticMapper extends BaseMapper<KuaishouReportHourlyCreativeStatistic> {
-    void updateCreativeReportHourlyStatistic(@Param(value = "accountId") Long accountId, @Param(value = "date") String dateString);
-
-    void deleteHourlyReport(@Param(value = "date") String dateString);
-}

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

@@ -97,4 +97,19 @@
         </if>
     </update>
 
+    <select id="selectCodeByDate" resultType="com.alibaba.fastjson.JSONObject">
+   select
+   GROUP_CONCAT(DISTINCT(account_id)) accountId,
+   sum(charge) charge,
+   signature signature
+   from
+   ctop_kuaishou_report_daily_creative
+   where stat_date &gt;= #{startDate}
+   and stat_date &lt;= #{endDate}
+   and signature is not null
+   group by signature
+
+
+    </select>
+
 </mapper>

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

@@ -1,157 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
-<mapper namespace="cn.com.ctop.kuaishou.modules.report.mapper.KuaishouReportHourlyCreativeStatisticMapper">
-	<insert id="updateCreativeReportHourlyStatistic">
-        REPLACE INTO `ctop_kuaishou_report_hourly_creative_statistic` (
-	`id`,
-	`account_id`,
-	`account_name`,
-	`unit_id`,
-	`unit_name`,
-	`campaign_id`,
-	`campaign_name`,
-	`creative_id`,
-	`creative_name`,
-	`stat_date`,
-	`stat_hour`,
-	`charge`,
-	`photo_click`,
-	`photo_show`,
-	`aclick`,
-	`bclick`,
-	`photo_click_ratio`,
-	`action_ratio`,
-	`impression_1k_cost`,
-	`event_credit_grant_landing_page_cost`,
-	`event_credit_grant_landing_page`,
-	`event_jin_jian_landing_page_cost`,
-	`event_jin_jian_landing_page`,
-	`form_action_ratio`,
-	`form_cost`,
-	`form_count`,
-	`event_order_paid_cost`,
-	`event_order_paid_purchase_amount`,
-	`event_order_paid`,
-	`event_credit_grant_app_ratio`,
-	`event_credit_grant_app_cost`,
-	`event_credit_grant_app`,
-	`event_pay_purchase_amount_first_day`,
-	`event_jin_jian_app_cost`,
-	`event_jin_jian_app`,
-	`event_register_cost`,
-	`event_register`,
-	`event_pay_roi`,
-	`event_pay_purchase_amount`,
-	`event_pay`,
-	`event_pay_first_day_roi`,
-	`event_pay_first_day`,
-	`photo_click_cost`,
-	`action_cost`,
-	`share`,
-	`comment`,
-	`photo_like`,
-	`follow`,
-	`report`,
-	`block`,
-	`negative`,
-	`activation`,
-	`submit`,
-	`cancel_follow`,
-	`download_started`,
-	`download_completed`,
-	`create_time`,
-	`update_time`,
-	`signature`,
-	`url`
-) SELECT
-	*
-FROM
-	(
-		SELECT
-			ckrhc.`id`,
-			ckrhc.`account_id`,
-			cua.account_name,
-			ckg.unit_id,
-			ckg.unit_name,
-			ckc.campaign_id,
-			ckc.campaign_name,
-			ckrhc.`creative_id`,
-			ckr.creative_name,
-			ckrhc.`stat_date`,
-			ckrhc.`stat_hour`,
-			ckrhc.`charge`,
-			ckrhc.`photo_click`,
-			ckrhc.`photo_show`,
-			ckrhc.`aclick`,
-			ckrhc.`bclick`,
-			ckrhc.`photo_click_ratio`,
-			ckrhc.`action_ratio`,
-			ckrhc.`impression_1k_cost`,
-			ckrhc.`event_credit_grant_landing_page_cost`,
-			ckrhc.`event_credit_grant_landing_page`,
-			ckrhc.`event_jin_jian_landing_page_cost`,
-			ckrhc.`event_jin_jian_landing_page`,
-			ckrhc.`form_action_ratio`,
-			ckrhc.`form_cost`,
-			ckrhc.`form_count`,
-			ckrhc.`event_order_paid_cost`,
-			ckrhc.`event_order_paid_purchase_amount`,
-			ckrhc.`event_order_paid`,
-			ckrhc.`event_credit_grant_app_ratio`,
-			ckrhc.`event_credit_grant_app_cost`,
-			ckrhc.`event_credit_grant_app`,
-			ckrhc.`event_pay_purchase_amount_first_day`,
-			ckrhc.`event_jin_jian_app_cost`,
-			ckrhc.`event_jin_jian_app`,
-			ckrhc.`event_register_cost`,
-			ckrhc.`event_register`,
-			ckrhc.`event_pay_roi`,
-			ckrhc.`event_pay_purchase_amount`,
-			ckrhc.`event_pay`,
-			ckrhc.`event_pay_first_day_roi`,
-			ckrhc.`event_pay_first_day`,
-			ckrhc.`photo_click_cost`,
-			ckrhc.`action_cost`,
-			ckrhc.`share`,
-			ckrhc.`comment`,
-			ckrhc.`photo_like`,
-			ckrhc.`follow`,
-			ckrhc.`report`,
-			ckrhc.`block`,
-			ckrhc.`negative`,
-			ckrhc.`activation`,
-			ckrhc.`submit`,
-			ckrhc.`cancel_follow`,
-			ckrhc.`download_started`,
-			ckrhc.`download_completed`,
-			ckrhc.`create_time`,
-			ckrhc.`update_time`,
-			ckvg.signature,
-			ckvg.url
-		FROM
-			(
-				SELECT
-					*
-				FROM
-					ctop_kuaishou_report_hourly_creative
-				WHERE
-					account_id = #{accountId} and stat_date = #{date}) ckrhc,
-					ctop_kuaishou_creative ckr,
-					ctop_user_allocation cua,
-					ctop_kuaishou_campaign ckc,
-					ctop_kuaishou_group ckg,
-					ctop_kuaishou_video_get ckvg
-				WHERE
-					ckrhc.creative_id = ckr.creative_id
-				AND ckr.account_id = cua.account_id
-				AND ckr.campaign_id = ckc.campaign_id
-				AND ckr.unit_id = ckg.unit_id
-				AND ckr.photo_id = ckvg.photo_id
-				AND ckr.account_id = ckvg.account_id
-			) t
-    </insert>
-
-	<delete id="deleteHourlyReport">
-		delete from ctop_kuaishou_report_hourly_creative where stat_date &lt;= #{date}
-	</delete>
-</mapper>

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

@@ -1,22 +0,0 @@
-package cn.com.ctop.kuaishou.modules.report.service;
-
-import cn.com.ctop.common.module.entity.CtopOauthToken;
-import cn.com.ctop.kuaishou.modules.report.entity.KuaishouReportHourlyCreativeStatistic;
-import com.baomidou.mybatisplus.extension.service.IService;
-
-import java.util.Date;
-
-/**
- * 时报清洗数据
- *
- * @author jeecg-boot
- * @version V1.0
- * @date 2019-11-01
- */
-public interface IKuaishouReportHourlyCreativeStatisticService extends IService<KuaishouReportHourlyCreativeStatistic> {
-
-    void updateCreativeReportHourlyStatistic(CtopOauthToken token, Date getDate);
-
-    void deleteHourlyReport(Date deleteDate);
-    void deleteHourlyReportByStatDate(String deleteDate);
-}

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

@@ -1,44 +0,0 @@
-package cn.com.ctop.kuaishou.modules.report.service.impl;
-
-import cn.com.ctop.common.module.entity.CtopOauthToken;
-import cn.com.ctop.kuaishou.modules.report.entity.KuaishouReportHourlyCreativeStatistic;
-import cn.com.ctop.kuaishou.modules.report.mapper.KuaishouReportHourlyCreativeStatisticMapper;
-import cn.com.ctop.kuaishou.modules.report.service.IKuaishouReportHourlyCreativeStatisticService;
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-
-import java.text.SimpleDateFormat;
-import java.util.Date;
-
-/**
- * 时报清洗数据
- *
- * @author jeecg-boot
- * @version V1.0
- * @date 2019-11-01
- */
-@Service
-public class KuaishouReportHourlyCreativeStatisticServiceImpl extends ServiceImpl<KuaishouReportHourlyCreativeStatisticMapper, KuaishouReportHourlyCreativeStatistic> implements IKuaishouReportHourlyCreativeStatisticService {
-    @Autowired
-    private KuaishouReportHourlyCreativeStatisticMapper statisticMapper;
-
-    @Override
-    public void updateCreativeReportHourlyStatistic(CtopOauthToken token, Date getDate) {
-        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
-        String dateString = format.format(getDate);
-        statisticMapper.updateCreativeReportHourlyStatistic(token.getAccountId(), dateString);
-    }
-
-    @Override
-    public void deleteHourlyReport(Date deleteDate) {
-        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
-        String dateString = format.format(deleteDate);
-        statisticMapper.deleteHourlyReport(dateString);
-    }
-
-    @Override
-    public void deleteHourlyReportByStatDate(String deleteDate) {
-        statisticMapper.deleteHourlyReport(deleteDate);
-    }
-}

+ 0 - 0
module-kuaishou/src/main/resources/kuaishou_config.properties


Alguns arquivos não foram mostrados porque muitos arquivos mudaram nesse diff