Преглед изворни кода

Merge branch 'master' into test

syh пре 5 година
родитељ
комит
ecf290a8b8
100 измењених фајлова са 4278 додато и 1185 уклоњено
  1. 119 1
      jeecg-boot-base-common/src/main/java/org/jeecg/common/util/DateUtils.java
  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. 34 92
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/controller/AdvertiserController.java
  5. 0 48
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/controller/AuthController.java
  6. 2 1
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/controller/BindAccountAuthController.java
  7. 7 21
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/controller/ByteDanceAdvertiserPostController.java
  8. 5 8
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/controller/CallbackController.java
  9. 19 11
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/controller/EduLessonController.java
  10. 250 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/controller/EduLessonNewController.java
  11. 248 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/controller/KuaiShouDefectMaterialController.java
  12. 34 33
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/controller/KuaishouAgentAccountController.java
  13. 3 2
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/controller/KuaishouEffectAdInfoController.java
  14. 5 3
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/controller/KuaishouHotPhotoInfoController.java
  15. 3 2
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/controller/KuaishouInspiredAdController.java
  16. 13 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/controller/MaterialAscriptionController.java
  17. 47 2
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/controller/MaterialImageInfoController.java
  18. 48 5
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/controller/MaterialInfoController.java
  19. 2 2
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/controller/ProjectController.java
  20. 1 2
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/controller/ProjectMemberController.java
  21. 21 155
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/controller/TestController.java
  22. 10 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/controller/VideoModelController.java
  23. 100 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/entity/EduLessonNew.java
  24. 92 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/entity/KuaiShouDefectMaterial.java
  25. 4 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/entity/SalePerformanceDetail.java
  26. 6 6
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/job/BytedanceAdvertiserHourlyReportLoadJob.java
  27. 6 6
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/job/BytedanceCreativeHourlyReportLoadJob.java
  28. 15 6
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/job/BytedancePlanHourlyReportLoadJob.java
  29. 0 40
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/job/DeleteCreativeStaticJob.java
  30. 0 2
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/job/KuaishouDailyAccountReportLoadJob.java
  31. 0 4
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/job/KuaishouDailyCampaignReportLoadJob.java
  32. 0 3
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/job/KuaishouDailyCreativeReportLoadJob.java
  33. 0 3
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/job/KuaishouDailyGroupReportLoadJob.java
  34. 0 4
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/job/KuaishouHourlyCreativeReportLoadJob.java
  35. 59 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/job/ToutiaoMaterialsLoadJob.java
  36. 5 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/mapper/AdvertiserMapper.java
  37. 15 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/mapper/EduLessonNewMapper.java
  38. 15 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/mapper/KuaiShouDefectMaterialMapper.java
  39. 21 4
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/mapper/xml/AdvertiserMapper.xml
  40. 5 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/mapper/xml/EduLessonNewMapper.xml
  41. 5 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/mapper/xml/KuaiShouDefectMaterialMapper.xml
  42. 5 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/service/IAdvertiserService.java
  43. 15 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/service/IEduLessonNewService.java
  44. 0 4
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/service/IFfmpegService.java
  45. 16 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/service/IKuaiShouDefectMaterialService.java
  46. 11 1
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/service/impl/AdvertiserServiceImpl.java
  47. 0 1
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/service/impl/BidWarningServiceImpl.java
  48. 5 4
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/service/impl/CrawlerServiceImpl.java
  49. 19 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/service/impl/EduLessonNewServiceImpl.java
  50. 0 140
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/service/impl/FfmpegServiceImpl.java
  51. 90 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/service/impl/KuaiShouDefectMaterialServiceImpl.java
  52. 51 40
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/service/impl/PerformanceSaleServiceImpl.java
  53. 5 3
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/service/impl/RefreshTokenServiceImpl.java
  54. 0 142
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/demo/opencv/FFmpegUtils.java
  55. 23 23
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/excelutil/entity/YdPlanAggregateEntity.java
  56. 164 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/opencv/controller/ModelVideoCompositeInfoController.java
  57. 178 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/opencv/controller/ModelVideoInfoConfigController.java
  58. 180 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/opencv/controller/ModelVideoInfoController.java
  59. 248 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/opencv/controller/ModelVideoInfoTagController.java
  60. 77 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/opencv/entity/ModelVideoCompositeInfo.java
  61. 76 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/opencv/entity/ModelVideoInfo.java
  62. 117 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/opencv/entity/ModelVideoInfoConfig.java
  63. 73 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/opencv/entity/ModelVideoInfoTag.java
  64. 15 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/opencv/mapper/ModelVideoCompositeInfoMapper.java
  65. 15 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/opencv/mapper/ModelVideoInfoConfigMapper.java
  66. 15 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/opencv/mapper/ModelVideoInfoMapper.java
  67. 15 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/opencv/mapper/ModelVideoInfoTagMapper.java
  68. 5 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/opencv/mapper/xml/ModelVideoCompositeInfoMapper.xml
  69. 5 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/opencv/mapper/xml/ModelVideoInfoConfigMapper.xml
  70. 5 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/opencv/mapper/xml/ModelVideoInfoMapper.xml
  71. 5 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/opencv/mapper/xml/ModelVideoInfoTagMapper.xml
  72. 21 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/opencv/service/IFfmpegService.java
  73. 15 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/opencv/service/IModelVideoCompositeInfoService.java
  74. 16 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/opencv/service/IModelVideoInfoConfigService.java
  75. 15 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/opencv/service/IModelVideoInfoService.java
  76. 15 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/opencv/service/IModelVideoInfoTagService.java
  77. 548 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/opencv/service/impl/FfmpegServiceImpl.java
  78. 19 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/opencv/service/impl/ModelVideoCompositeInfoServiceImpl.java
  79. 27 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/opencv/service/impl/ModelVideoInfoConfigServiceImpl.java
  80. 19 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/opencv/service/impl/ModelVideoInfoServiceImpl.java
  81. 19 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/opencv/service/impl/ModelVideoInfoTagServiceImpl.java
  82. 1 1
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/demo/opencv/Avutils.java
  83. 1 1
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/demo/opencv/CornerCheck.java
  84. 1 1
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/demo/opencv/ImageUtils.java
  85. 1 1
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/demo/opencv/Perspective.java
  86. 1 1
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/demo/opencv/Test.java
  87. 6 10
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/demo/opencv/VideoProcessing.java
  88. 170 6
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/controller/PerformanceController2.java
  89. 3 2
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/controller/SysUserController.java
  90. 3 2
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/entity/EffiRateComparator.java
  91. 24 4
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/IPerformanceService2.java
  92. 651 307
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/impl/PerformanceServiceImpl2.java
  93. 1 1
      jeecg-boot-module-system/src/main/resources/application-prod.yml
  94. 3 1
      jeecg-boot-module-system/src/main/resources/application-test.yml
  95. 1 2
      jeecg-boot-module-system/src/main/resources/application.yml
  96. 28 18
      jeecg-boot-module-system/src/test/java/org/jeecg/SampleTest.java
  97. 4 0
      module-common/src/main/java/cn/com/ctop/common/module/entity/CtopOauthToken.java
  98. 2 0
      module-common/src/main/java/cn/com/ctop/common/module/mapper/CtopOauthTokenMapper.java
  99. 5 0
      module-common/src/main/java/cn/com/ctop/common/module/mapper/MaterialInfoMapper.java
  100. 0 0
      module-common/src/main/java/cn/com/ctop/common/module/mapper/xml/CtopOauthTokenMapper.xml

+ 119 - 1
jeecg-boot-base-common/src/main/java/org/jeecg/common/util/DateUtils.java

@@ -25,6 +25,30 @@ public class DateUtils extends PropertyEditorSupport {
     private static final long MINUTE_IN_MILLIS = 60 * 1000;
     private static final long SECOND_IN_MILLIS = 1000;
 
+
+    public static boolean compare(String beginDate, String nowDate) throws ParseException {
+        //如果想比较日期则写成"yyyy-MM-dd"就可以了
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+        //将字符串形式的时间转化为Date类型的时间
+        Date a = sdf.parse(beginDate);
+        Date b = sdf.parse(nowDate);
+        //Date类的一个方法,如果a早于b返回true,否则返回false
+        if (a.before(b)) {
+            return true;
+        } else {
+            return false;
+        }
+
+		/*
+		 * 如果你不喜欢用上面这个太流氓的方法,也可以根据将Date转换成毫秒
+		if(a.getTime()-b.getTime()<0)
+			return true;
+		else
+			return false;
+		*/
+    }
+
+
     public static String getDateByDateStr(String dateStr) throws ParseException {
         SimpleDateFormat dsdf = new SimpleDateFormat("yyyy-MM-dd");
         Date parse = dsdf.parse(dateStr);
@@ -753,6 +777,10 @@ public class DateUtils extends PropertyEditorSupport {
         return sdf.format(calendar.getTime());
     }
 
+    //public static void main(String[] args) throws ParseException {
+    //    System.out.println(DateUtils.addDay( "2020-01-03",  7));
+    //}
+
     public static Date addDay(Date date, int day) {
         Calendar calendar = Calendar.getInstance();
         calendar.setTime(date);
@@ -1170,7 +1198,97 @@ public class DateUtils extends PropertyEditorSupport {
 
         return resultMap;
     }
-}
 
+    /***
+     * 两日期之间相差天数
+     * @param dateStart
+     * @param dateEnd
+     * @return
+     */
+    public static long getDiscrepantDays(String dateStart, String dateEnd){
+        //设置转换的日期格式
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+
+        //结束时间
+        Date startDate = null;
+        Date endDate = null;
+        try {
+            //开始时间
+            startDate = sdf.parse(dateStart);
+            endDate = sdf.parse(dateEnd);
+        } catch (ParseException e) {
+            e.printStackTrace();
+        }
+
+        //得到相差的天数 betweenDate
+        long betweenDate = (endDate.getTime() - startDate.getTime())/(60*60*24*1000);
+
+        //打印控制台相差的天数
+        System.out.println(betweenDate);
+        return betweenDate;
+    }
+
+    /***
+     * 两个日期之间间隔的月数(不考虑日期的情况)
+     */
+    public static int calDiffMonth(Date start, Date end){
+        GregorianCalendar startCalendar = new GregorianCalendar();
+        startCalendar.setTime(start);
+        GregorianCalendar endCalendar = new GregorianCalendar();
+        endCalendar.setTime(end);
+
+        int startYear=startCalendar.get(Calendar.YEAR);
+        int startMonth=startCalendar.get(Calendar.MONTH)+1;
+        int startDay=startCalendar.get(Calendar.DAY_OF_MONTH);
+        int endYear=endCalendar.get(Calendar.YEAR);
+        int endMonth=endCalendar.get(Calendar.MONTH)+1;
+        int endDay=endCalendar.get(Calendar.DAY_OF_MONTH);
+
+        return (endYear-startYear)*12 + (endMonth - startMonth);
+    }
+
+    public static int getDaysOfMonth(int year, int month) {
+        Calendar calendar = Calendar.getInstance();
+        calendar.set(year, month - 1, 1);
+        return calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
+    }
+
+    public static int getFirstDateOfMonth(int year, int month) {
+        Calendar calendar = Calendar.getInstance();
+        calendar.set(year, month - 1, 1);
+        return calendar.getActualMinimum(Calendar.DAY_OF_MONTH);
+    }
+
+    /**
+     * 获取指定日期下个月的第一天
+     * @param dateStr
+     * @param format
+     * @return
+     */
+    public static Map<String, String> getMaxMinDaysOfAddMonth(String dateStr,String format, int addMonth){
+        SimpleDateFormat sdf = new SimpleDateFormat(format);
+        Map<String, String> dateMap = new HashMap<>();
+        try {
+            Date date = sdf.parse(dateStr);
+            Calendar calendar = Calendar.getInstance();
+            calendar.setTime(date);
+            calendar.add(Calendar.MONTH, addMonth);
+            calendar.set(Calendar.DAY_OF_MONTH,1);
+            dateMap.put("startDate", sdf.format(calendar.getTime()));
+
+            calendar.set(Calendar.DAY_OF_MONTH, calendar.getActualMaximum(Calendar.DATE));
+            dateMap.put("endDate", sdf.format(calendar.getTime()));
+            return dateMap;
+        } catch (ParseException e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+    public static void main(String[] args) throws ParseException {
+        System.out.println(calDiffMonth(DateUtils.parseDate("2019-04-01","yyyy-MM-dd"),new Date()));
+    }
+
+}
 
 

+ 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);

+ 34 - 92
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,92 +319,46 @@ public class AdvertiserController {
     }
 
     /**
-     * 导出excel
-     *
-     * @param request
-     * @param response
-     */
-    @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;
-    }
-
-    /**
-     * 通过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();
-                }
-            }
-        }
-        return Result.ok("文件导入失败!");
+    @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;
     }
 
     /**
-     * 导出伊对报表
+     * 导出报表
      *
      * @return
      */
-    @RequestMapping(value = "/ydWeekReportList")
+    @RequestMapping(value = "/exportYdDailyReport")
     @ResponseBody
-    public Map<String, Object> ydReportList(HttpServletRequest request, HttpServletResponse response, @RequestBody JSONObject data) throws Exception {
+    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);
-        result.put("data", vos);
-        ResultMapUtils.setResultMap(result, StatusCode.COMMON_SUCCESS);
-        return result;
+        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);
+        }
+        excelWriter.finish();
+        outputStream.flush();
+        outputStream.close();
     }
 
     /**
@@ -437,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);
                 }
             }
@@ -472,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);
                 }
             }

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

@@ -1,48 +0,0 @@
-package org.jeecg.modules.ctop.controller;
-
-import cn.com.ctop.common.module.service.IBindAccountAuthService;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Controller;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestParam;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import java.util.UUID;
-
-/**
- * TODO 可以删除
- */
-@Controller
-@RequestMapping("/auth")
-public class AuthController {
-    private static final Logger logger = LoggerFactory.getLogger(AuthController.class);
-
-    @Autowired
-    private IBindAccountAuthService bindAccountAuthService;
-
-
-    @RequestMapping("/begin")
-    public String authBegin(HttpServletRequest request,
-                            HttpServletResponse response,
-                            @RequestParam("auth_type") String authType) {
-        try {
-            String codeUrl = "";
-            switch (authType) {
-                case "bytedance":
-                    codeUrl = bindAccountAuthService.getByteDanceCodeUrl(UUID.randomUUID().toString());
-                    return "redirect:" + codeUrl;
-                case "kuaishou":
-                    codeUrl = bindAccountAuthService.getKuaishouCodeUrl(UUID.randomUUID().toString());
-                    return "redirect:" + codeUrl;
-                default:
-            }
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-
-        return "auth_error";
-    }
-}

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

@@ -69,9 +69,10 @@ public class BindAccountAuthController {
             }
 
             String authorizationType = json.getString("authorizationType");
+            Integer agentType = json.getInteger("agentType"); // 0 三方代理商 1 本代理商
 
             if ("kuaishou".equals(authorizationType)) {
-                codeUrl = bindAccountAuthService.getKuaishouCodeUrl(JSONObject.toJSONString(json));
+                codeUrl = bindAccountAuthService.getKuaishouCodeUrl(JSONObject.toJSONString(json), agentType);
             }
             if ("bytedance".equals(authorizationType)) {
                 codeUrl = bindAccountAuthService.getByteDanceCodeUrl(JSONObject.toJSONString(json));

+ 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;

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

@@ -16,13 +16,11 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import org.apache.commons.lang.StringUtils;
 import org.jeecg.common.api.vo.Result;
 import org.jeecg.common.constant.CommonConstant;
-import org.jeecg.common.system.api.ISysBaseApi;
 import org.jeecg.common.system.util.JwtUtil;
 import org.jeecg.common.util.RedisUtil;
 import org.jeecg.modules.system.entity.SysDepart;
 import org.jeecg.modules.system.entity.SysUser;
 import org.jeecg.modules.system.service.ISysDepartService;
-import org.jeecg.modules.system.service.ISysLogService;
 import org.jeecg.modules.system.service.ISysUserService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -48,10 +46,7 @@ public class CallbackController {
     private static final Logger logger = LoggerFactory.getLogger(CallbackController.class);
     @Autowired
     private ISysUserService sysUserService;
-    @Autowired
-    private ISysBaseApi sysBaseApi;
-    @Autowired
-    private ISysLogService logService;
+
     @Autowired
     private RedisUtil redisUtil;
     @Autowired
@@ -132,8 +127,10 @@ public class CallbackController {
             if (Check.isNull(json)) {
                 throw new Exception("回调信息为空");
             }
+            logger.info("快手授权返回信息:{}", json);
+            Integer agentType = json.getInteger("agentType");
             if (StringUtils.isNotBlank(authCode)) {
-                KuaishouResultToken accessToken = kuaishouInterfaceService.getAccessToken(authCode);
+                KuaishouResultToken accessToken = kuaishouInterfaceService.getAccessToken(authCode, agentType);
                 if (accessToken.getCode() != 0) {
                     throw new Exception("快手回调token返回错误");
                 }
@@ -144,7 +141,6 @@ public class CallbackController {
                         return "授权绑定失败!";
                     }
 
-
                     String advertiserId = json.getString("advertiserId");
                     //指定分配人姓名
                     String userName = json.getString("userName");
@@ -164,6 +160,7 @@ public class CallbackController {
                     topOauthToken.setAccountId(accountId);
                     topOauthToken.setMediaId("2");
                     topOauthToken.setAdvertiserId(advertiserId);
+                    topOauthToken.setAgentType(agentType);
                     topOauthToken.setAccessToken(token.getAccessToken());
                     long accessTokenExpireIn = token.getAccessTokenExpiresIn() * 1000L;
                     long now = System.currentTimeMillis();

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

@@ -3,25 +3,14 @@ package org.jeecg.modules.ctop.controller;
 import cn.com.ctop.manage.modules.edu.entity.EduLesson;
 import cn.com.ctop.manage.modules.edu.service.IEduLessonService;
 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.ctop.entity.DramaInfo;
-import org.jeecg.modules.system.entity.SysCategory;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 
-import javax.servlet.http.HttpServletRequest;
-import java.util.ArrayList;
 import java.util.List;
 
 @Slf4j
@@ -47,6 +36,25 @@ public class EduLessonController {
         result.setSuccess(true);
         return result;
     }
+
+    @GetMapping(value = "/system/lesson")
+    public Result<List<String>> getSystemLessonList() {
+        Result<List<String>> result = new Result<>();
+        List<String> list = eduLessonService.getTitleList("汇创视频培训");
+        result.setResult(list);
+        result.setSuccess(true);
+        return result;
+    }
+
+    @GetMapping(value = "/system/topic")
+    public Result<List<String>> getSystemTopicList(String title) {
+        Result<List<String>> result = new Result<>();
+        List<String> list = eduLessonService.getTopicList("汇创视频培训", title);
+        result.setResult(list);
+        result.setSuccess(true);
+        return result;
+    }
+
     @GetMapping(value = "/ocean/lesson")
     public Result<List<String>> getOceanLessonList(){
         Result<List<String>> result = new Result<>();

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

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

+ 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("文件导入失败!");
+    }
+
+}

+ 34 - 33
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/controller/KuaishouAgentAccountController.java

@@ -1,40 +1,40 @@
 package org.jeecg.modules.ctop.controller;
 
-import java.io.OutputStream;
-import java.util.*;
-import java.io.IOException;
-import java.io.UnsupportedEncodingException;
-import java.net.URLDecoder;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
 import cn.com.ctop.common.module.utils.ExportExcelUtils;
-import org.apache.poi.xssf.usermodel.XSSFWorkbook;
-import org.jeecg.common.api.vo.Result;
-import org.jeecg.common.system.query.QueryGenerator;
-import org.jeecg.common.aspect.annotation.AutoLog;
-import org.jeecg.common.util.oConvertUtils;
 import cn.com.ctop.kuaishou.modules.report.entity.KuaishouAgentAccount;
 import cn.com.ctop.kuaishou.modules.report.service.IKuaishouAgentAccountService;
+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.apache.poi.xssf.usermodel.XSSFWorkbook;
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.common.aspect.annotation.AutoLog;
+import org.jeecg.common.system.query.QueryGenerator;
+import org.jeecg.common.util.DateUtils;
+import org.jeecg.common.util.oConvertUtils;
 import org.jeecgframework.poi.excel.ExcelImportUtil;
-import org.jeecgframework.poi.excel.def.NormalExcelConstants;
-import org.jeecgframework.poi.excel.entity.ExportParams;
 import org.jeecgframework.poi.excel.entity.ImportParams;
 import org.jeecgframework.poi.excel.view.JeecgEntityExcelView;
-
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 import org.springframework.web.multipart.MultipartHttpServletRequest;
 import org.springframework.web.servlet.ModelAndView;
-import com.alibaba.fastjson.JSON;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
+
+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.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
 
  /**
  * 快手代理商账户表
@@ -49,7 +49,7 @@ import io.swagger.annotations.ApiOperation;
 public class KuaishouAgentAccountController {
 	@Autowired
 	private IKuaishouAgentAccountService kuaishouAgentAccountService;
-	
+
 	/**
 	  * 分页列表查询
 	 * @param kuaishouAgentAccount
@@ -73,7 +73,7 @@ public class KuaishouAgentAccountController {
 		result.setResult(pageList);
 		return result;
 	}
-	
+
 	/**
 	  *   添加
 	 * @param kuaishouAgentAccount
@@ -93,8 +93,8 @@ public class KuaishouAgentAccountController {
 		}
 		return result;
 	}
-	
-	/**
+
+     /**
 	  *  编辑
 	 * @param kuaishouAgentAccount
 	 * @return
@@ -113,11 +113,11 @@ public class KuaishouAgentAccountController {
 				result.success("修改成功!");
 			}
 		}
-		
-		return result;
+
+        return result;
 	}
-	
-	/**
+
+     /**
 	  *   通过id删除
 	 * @param id
 	 * @return
@@ -134,8 +134,8 @@ public class KuaishouAgentAccountController {
 		}
 		return Result.ok("删除成功!");
 	}
-	
-	/**
+
+     /**
 	  *  批量删除
 	 * @param ids
 	 * @return
@@ -153,8 +153,8 @@ public class KuaishouAgentAccountController {
 		}
 		return result;
 	}
-	
-	/**
+
+     /**
 	  * 通过id查询
 	 * @param id
 	 * @return
@@ -212,6 +212,7 @@ public class KuaishouAgentAccountController {
 			rowData.add(kuaishouAgentAccount.getDirectRebate());
 			rowData.add(kuaishouAgentAccount.getTotalBalance());
 			rowData.add(kuaishouAgentAccount.getCorporationName());
+            rowData.add(DateUtils.formatDate(kuaishouAgentAccount.getCreateTime()));
 			if(kuaishouAgentAccount.getReviewStatus() == 1){
 				rowData.add("审核中");
 			}else if(kuaishouAgentAccount.getReviewStatus() == 2){
@@ -222,7 +223,7 @@ public class KuaishouAgentAccountController {
 			result.add(rowData);
 		}
 	  }
-	  String[] accountHeaders = {"广告主ID", "用户ID", "广告主名称", "现金余额", "信用余额", "返点余额", "框返余额", "激励余额", "总余额", "公司名称", "审核状态"};
+      String[] accountHeaders = {"广告主ID", "用户ID", "广告主名称", "现金余额", "信用余额", "返点余额", "框返余额", "激励余额", "总余额", "公司名称", "开户时间", "审核状态"};
 	  OutputStream os = response.getOutputStream();
 	  ExportExcelUtils eeu = new ExportExcelUtils();
 	  XSSFWorkbook workbook = new XSSFWorkbook();

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

@@ -64,9 +64,10 @@ public class KuaishouEffectAdInfoController {
                                                              @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
                                                              @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
                                                              HttpServletRequest req) {
-        Result<IPage<KuaishouEffectAdInfo>> result = new Result<IPage<KuaishouEffectAdInfo>>();
+        Result<IPage<KuaishouEffectAdInfo>> result = new Result<>();
         QueryWrapper<KuaishouEffectAdInfo> queryWrapper = QueryGenerator.initQueryWrapper(kuaishouEffectAdInfo, req.getParameterMap());
-        Page<KuaishouEffectAdInfo> page = new Page<KuaishouEffectAdInfo>(pageNo, pageSize);
+        queryWrapper.orderByDesc("create_time");
+        Page<KuaishouEffectAdInfo> page = new Page<>(pageNo, pageSize);
         IPage<KuaishouEffectAdInfo> pageList = kuaishouEffectAdInfoService.page(page, queryWrapper);
         result.setSuccess(true);
         result.setResult(pageList);

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

@@ -49,16 +49,18 @@ public class KuaishouHotPhotoInfoController {
                                                              @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
                                                              @RequestParam(name = "sortType", defaultValue = "1") Integer sortType,
                                                              HttpServletRequest req) {
-        Result<IPage<KuaishouHotPhotoInfo>> result = new Result<IPage<KuaishouHotPhotoInfo>>();
+        Result<IPage<KuaishouHotPhotoInfo>> result = new Result<>();
         QueryWrapper<KuaishouHotPhotoInfo> queryWrapper = QueryGenerator.initQueryWrapper(kuaishouHotPhotoInfo, req.getParameterMap());
         if (sortType == 1) {
-            queryWrapper.orderByDesc("playing_time");
+            queryWrapper.orderByDesc("create_time");
         } else if (sortType == 2) {
+            queryWrapper.orderByDesc("playing_time");
+        } else if (sortType == 3) {
             queryWrapper.orderByDesc("like_time");
         } else {
             queryWrapper.orderByDesc("comment_time");
         }
-        Page<KuaishouHotPhotoInfo> page = new Page<KuaishouHotPhotoInfo>(pageNo, pageSize);
+        Page<KuaishouHotPhotoInfo> page = new Page<>(pageNo, pageSize);
         IPage<KuaishouHotPhotoInfo> pageList = kuaishouHotPhotoInfoService.page(page, queryWrapper);
         result.setSuccess(true);
         result.setResult(pageList);

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

@@ -64,9 +64,10 @@ public class KuaishouInspiredAdController {
                                                            @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
                                                            @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
                                                            HttpServletRequest req) {
-        Result<IPage<KuaishouInspiredAd>> result = new Result<IPage<KuaishouInspiredAd>>();
+        Result<IPage<KuaishouInspiredAd>> result = new Result<>();
         QueryWrapper<KuaishouInspiredAd> queryWrapper = QueryGenerator.initQueryWrapper(kuaishouInspiredAd, req.getParameterMap());
-        Page<KuaishouInspiredAd> page = new Page<KuaishouInspiredAd>(pageNo, pageSize);
+        queryWrapper.orderByDesc("create_time");
+        Page<KuaishouInspiredAd> page = new Page<>(pageNo, pageSize);
         IPage<KuaishouInspiredAd> pageList = kuaishouInspiredAdService.page(page, queryWrapper);
         result.setSuccess(true);
         result.setResult(pageList);

+ 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;
+
     }
 
 

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

@@ -45,10 +45,7 @@ import java.io.IOException;
 import java.io.UnsupportedEncodingException;
 import java.net.URLDecoder;
 import java.text.ParseException;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 
 /**
  * 素材信息
@@ -180,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)) {
@@ -496,4 +493,50 @@ public class MaterialInfoController {
         return Result.ok("文件导入失败!");
     }
 
+    @AutoLog(value = "获取有效素材")
+    @ApiOperation(value = "获取有效素材", notes = "获取有效素材")
+    @GetMapping(value = "/effiMaterialInfo")
+    public Result<IPage<MaterialInfo>> effiMaterialInfo(MaterialInfo materialInfo,
+                                                        @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
+                                                        @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
+                                                        HttpServletRequest req) {
+        Result<IPage<MaterialInfo>> result = new Result<>();
+        QueryWrapper<MaterialInfo> queryWrapper = new QueryWrapper<>();
+
+        List<String> effiList = materialInfoService.getEffiCode();
+        Object createTime = materialInfo.getCreateTime();
+        materialInfo.setCreateTime(null);
+        queryWrapper.in("code", effiList);
+        queryWrapper.groupBy("code");
+        //queryWrapper = QueryGenerator.initQueryWrapper(materialInfo, req.getParameterMap());
+
+        Page<MaterialInfo> page = new Page<>(pageNo, pageSize);
+        IPage<MaterialInfo> pageList = materialInfoService.page(page, queryWrapper);
+
+        List<MaterialInfo> materialInfoList = pageList.getRecords();
+        if (materialInfoList.size() != 0) {
+            for (MaterialInfo material : materialInfoList) {
+                //判断是否已经同步到快手平台
+                Integer kuaishouMaterialUpCount = materialInfoService.getKuaishouUpVideoCount(material.getCode());
+                if (kuaishouMaterialUpCount > 0) {
+                    material.setKuaishouVideoIsUp(1);
+                } else {
+                    material.setKuaishouVideoIsUp(0);
+                }
+                //判断是否已经同步到抖音平台
+                Integer toutiaoMaterialUpCount = materialInfoService.getToutiaoUpVideoCount(material.getCode());
+                if (toutiaoMaterialUpCount > 0) {
+                    material.setToutiaoVideoIsUp(1);
+                } else {
+                    material.setToutiaoVideoIsUp(0);
+                }
+            }
+        }
+        result.setSuccess(true);
+        result.setResult(pageList);
+        return result;
+    }
+
+
+
 }

+ 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");

+ 21 - 155
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,6 +86,27 @@ public class TestController {
     private IKuaishouInterfaceService kuaishouInterfaceService;
 
 
+    @GetMapping(value = "/createTask")
+    public String createTask(Long accountId) {
+        Result<String> result = new Result<String>();
+        try {
+            QueryWrapper<CtopOauthToken> oauthTokenQueryWrapper = new QueryWrapper<>();
+            oauthTokenQueryWrapper.eq("media_id", 2);
+            oauthTokenQueryWrapper.eq("account_id", accountId);
+            oauthTokenQueryWrapper.last("limit 1");
+            CtopOauthToken token = oauthTokenMapper.selectOne(oauthTokenQueryWrapper);
+            String endDateStr = DateUtils.getDate("yyyy-MM-dd");
+            String startDate = DateUtils.addMonth(endDateStr, -6);
+            historyReportTaskService.createTask(token.getAccountId(), token.getAccessToken(), startDate, endDateStr, CtopAdConstant.KUAISHOU_LOAD_JOB_TYPE_HISTORY);
+
+        } catch (Exception e) {
+            e.printStackTrace();
+            result.setSuccess(false);
+        }
+        return "success";
+    }
+
+
     @GetMapping(value = "/getHistoryData")
     public String getHistoryData() {
         Result<String> result = new Result<String>();
@@ -165,25 +182,6 @@ public class TestController {
 
     static ExecutorService executorService = Executors.newFixedThreadPool(10);
 
-    @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";
-    }
-
 
     @GetMapping(value = "/gerCreative")
     public void gerCreative() {
@@ -234,38 +232,6 @@ 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);
-
-                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);
-
-                    }
-
-                }
-
-
-            }
-        };
-        thread.start();
-    }
 
     @GetMapping("loadBytedanceHistoryData")
     public Map<String, Object> loadBytedanceHistoryData() {
@@ -290,77 +256,8 @@ public class TestController {
 
     @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);
@@ -404,37 +301,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);
-                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

+ 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 {
+
+}

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

@@ -0,0 +1,100 @@
+package org.jeecg.modules.ctop.entity;
+
+import cn.com.ctop.common.module.utils.CtopAdConstant;
+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-22
+ */
+@Data
+@TableName("ctop_edu_lesson_new")
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value = "ctop_edu_lesson_new对象", description = "内部培训视频信息")
+public class EduLessonNew {
+
+    /**
+     * 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 Integer fileType;
+    /**
+     * 节点类型
+     */
+    @Excel(name = "节点类型", width = 15)
+    @ApiModelProperty(value = "节点类型")
+    private Integer nodeType;
+    /**
+     * 父id
+     */
+    @Excel(name = "父id", width = 15)
+    @ApiModelProperty(value = "父id")
+    private Integer parentId;
+    /**
+     * author
+     */
+    @Excel(name = "author", width = 15)
+    @ApiModelProperty(value = "author")
+    private String author;
+    /**
+     * desc
+     */
+    @Excel(name = "desc", width = 15)
+    @ApiModelProperty(value = "desc")
+    private String desc;
+    /**
+     * fileId
+     */
+    @Excel(name = "fileId", width = 15)
+    @ApiModelProperty(value = "fileId")
+    private String fileId;
+    /**
+     * enabled
+     */
+    @Excel(name = "enabled", width = 15)
+    @ApiModelProperty(value = "enabled")
+    private Integer enabled;
+    /**
+     * createTime
+     */
+    @ApiModelProperty(value = "createTime")
+    private Date createTime;
+    /**
+     * updateTime
+     */
+    @ApiModelProperty(value = "updateTime")
+    private Date updateTime;
+
+    public EduLessonNew() {
+        this.enabled = CtopAdConstant.COMMON_STATUS_ENABLED;
+        this.createTime = new Date();
+        this.updateTime = new Date();
+    }
+}

+ 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;
     /**
      * 年
      */

+ 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);
                 }
 
             });

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

@@ -1,5 +1,6 @@
 package org.jeecg.modules.ctop.job;
 
+import cn.com.ctop.bytedance.service.IBytedancePlanDailyReportService;
 import cn.com.ctop.bytedance.service.IReportService;
 import cn.com.ctop.common.module.entity.CtopOauthToken;
 import cn.com.ctop.common.module.service.ICtopOauthTokenService;
@@ -37,12 +38,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 +47,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 {
@@ -64,9 +65,17 @@ public class BytedancePlanHourlyReportLoadJob implements Job {
         } catch (InterruptedException e) {
             e.printStackTrace();
         }
-        //清洗玫瑰相亲渠道号数据
+        //清洗缘多多数据渠道号
+        if (null != hour && "00".equals(hour)) {
+            Date lastday = DateUtils.addDay(getDate, -1);
+            planDailyReportService.cleanYddHourlyChannelCode(113, lastday);
+        }
+        planDailyReportService.cleanYddHourlyChannelCode(113, getDate);
 
         log.info("头条计划时报数据获取完成");
         executorService.shutdown();
     }
+
+    @Autowired
+    private IBytedancePlanDailyReportService planDailyReportService;
 }

+ 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();
-    }
-
-}

+ 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);
-                }
             }
 
         };

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

@@ -0,0 +1,59 @@
+package org.jeecg.modules.ctop.job;
+
+import cn.com.ctop.bytedance.service.IBytedanceReportService;
+import cn.com.ctop.common.module.entity.CtopOauthToken;
+import cn.com.ctop.common.module.service.ICtopOauthTokenService;
+import cn.com.ctop.kuaishou.modules.batch.service.IKuaishouInterfaceService;
+import lombok.extern.slf4j.Slf4j;
+import org.jeecg.common.util.DateUtils;
+import org.quartz.Job;
+import org.quartz.JobExecutionContext;
+import org.quartz.JobExecutionException;
+import org.springframework.beans.factory.annotation.Autowired;
+
+import java.util.Date;
+import java.util.List;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+
+@Slf4j
+public class ToutiaoMaterialsLoadJob implements Job {
+    @Autowired
+    private ICtopOauthTokenService tokenService;
+    @Autowired
+    private IBytedanceReportService bytedanceReportService;
+
+    static ExecutorService executorService = null;
+
+    @Override
+    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
+        Thread thread = new Thread() {
+            @Override
+            public void run() {
+                //增加接口的开始和结束日期
+                String startDate = DateUtils.formatDate(DateUtils.addDay(new Date(), -1));
+                String endDate = startDate;
+                //获取头条token数据
+                List<CtopOauthToken> tokens = tokenService.selectToutiaoToken();
+                executorService = Executors.newFixedThreadPool(8);
+                tokens.forEach(token -> {
+                    executorService.submit(new Runnable() {
+                        @Override
+                        public void run() {
+                            try {
+                                //获取头条素材报表数据
+                                bytedanceReportService.bytedanceMaterialReport(token,startDate,endDate);
+                            } catch (Exception e) {
+                                e.printStackTrace();
+                            } finally {
+                            }
+                        }
+                    });
+                });
+                log.info("头条素材数据同步完成,"+ "开始时间:" + startDate + ",结束时间:" + endDate);
+            }
+        };
+        thread.start();
+
+    }
+}

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

@@ -1,5 +1,6 @@
 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;
@@ -22,4 +23,8 @@ public interface AdvertiserMapper extends BaseMapper<Advertiser> {
     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/EduLessonNewMapper.java

@@ -0,0 +1,15 @@
+package org.jeecg.modules.ctop.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.jeecg.modules.ctop.entity.EduLessonNew;
+
+/**
+ * 内部培训视频信息
+ *
+ * @author: jeecg-boot
+ * @date: 2020-04-22
+ * @cersion: V1.0
+ */
+public interface EduLessonNewMapper extends BaseMapper<EduLessonNew> {
+
+}

+ 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> {
+
+}

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

@@ -97,13 +97,13 @@
             concat(#{start}, '至', #{end})as date,
             daily.campaign_name as planName,
             sum(daily.cost) as totalCost,
-            sum(daily.show_num) as show,
-            sum(daily.click) as click,
+            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
+                end
             )as clickRate,
             (case
                 when sum(daily.cost)!=0 and sum(daily.click)!=0
@@ -117,7 +117,7 @@
                 else 0
                 end
             )as ctr,
-            sum(daily.convert_num) as convert,
+            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)
@@ -153,4 +153,21 @@
         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/EduLessonNewMapper.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.EduLessonNewMapper">
+
+</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>

+ 5 - 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,9 +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);
 }

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

@@ -0,0 +1,15 @@
+package org.jeecg.modules.ctop.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.jeecg.modules.ctop.entity.EduLessonNew;
+
+/**
+ * 内部培训视频信息
+ *
+ * @author jeecg-boot
+ * @version V1.0
+ * @date 2020-04-22
+ */
+public interface IEduLessonNewService extends IService<EduLessonNew> {
+
+}

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

@@ -1,4 +0,0 @@
-package org.jeecg.modules.ctop.service;
-
-public interface IFfmpegService {
-}

+ 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);
+
+}

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

@@ -42,6 +42,11 @@ 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<KuaishouXxlEntity>();
         List<KuaishouXxlEntity> details = new ArrayList<>();
@@ -103,13 +108,18 @@ public class AdvertiserServiceImpl extends ServiceImpl<AdvertiserMapper, Adverti
             sheetInfoVos.add(secondVo);
             //3:获取每周素材统计
 
-            return null;
+            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);

+ 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/>";

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

@@ -124,19 +124,20 @@ public class CrawlerServiceImpl implements ICrawlerService {
             log.info("效果广告数据获取完成");
             return;
         }
-        List<KuaishouEffectAdInfo> adInfos = new ArrayList<>();
+//        List<KuaishouEffectAdInfo> adInfos = new ArrayList<>();
         for (int i = 0; i < effectAds.size(); i++) {
             JSONObject ad = effectAds.getJSONObject(i);
             Long contentId = ad.getLong("contentId");
             if (null != contentId) {
                 JSONObject content = getEffectAdDetail(contentId).getJSONObject("data").getJSONObject("effectAdDetail");
                 KuaishouEffectAdInfo adInfo = new KuaishouEffectAdInfo(content);
-                adInfos.add(adInfo);
+                effectAdInfoService.saveOrUpdate(adInfo);
+                //                adInfos.add(adInfo);
             }
         }
-        if (adInfos.size() > 0) {
+        /*if (adInfos.size() > 0) {
             effectAdInfoService.replaceBatch(adInfos);
-        }
+        }*/
         loadeffectAdByPage(pageSize, pageNum + 1);
     }
 

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

@@ -0,0 +1,19 @@
+package org.jeecg.modules.ctop.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.jeecg.modules.ctop.entity.EduLessonNew;
+import org.jeecg.modules.ctop.mapper.EduLessonNewMapper;
+import org.jeecg.modules.ctop.service.IEduLessonNewService;
+import org.springframework.stereotype.Service;
+
+/**
+ * 内部培训视频信息
+ *
+ * @author jeecg-boot
+ * @version V1.0
+ * @date 2020-04-22
+ */
+@Service
+public class EduLessonNewServiceImpl extends ServiceImpl<EduLessonNewMapper, EduLessonNew> implements IEduLessonNewService {
+
+}

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

@@ -1,140 +0,0 @@
-package org.jeecg.modules.ctop.service.impl;
-
-import lombok.extern.slf4j.Slf4j;
-import org.jeecg.modules.ctop.service.IFfmpegService;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.stereotype.Service;
-
-import java.util.ArrayList;
-import java.util.List;
-
-@Service
-@Slf4j
-public class FfmpegServiceImpl implements IFfmpegService {
-    /**
-     * FFmpeg全路径
-     */
-    @Value("${jeecg.ffmpeg.bin}")
-    private String FFMPEG_PATH;
-
-    /**
-     * 从视频中抽取音频文件
-     */
-    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);
-    }
-
-    /**
-     * 截取音频文件
-     */
-    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
-     */
-    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
-     */
-    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
-     */
-    public void MergeImageToVideo(String imagePath, Integer frameNumber, String videoFilePath) {
-        List<String> command = new ArrayList<>();
-        command.add(FFMPEG_PATH);
-        command.add("-i");
-        command.add("image2");
-        command.add("-i");
-        command.add(imagePath + "%d.jpg");
-        command.add("-vcodec");
-        command.add("copy");
-        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();
-            // 等待进程执行结束
-            process.waitFor();
-            log.info("ffmpeg命令执行完成");
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-    }
-}

+ 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);
+
+                }
+            }
+
+        }
+
+    }
+}

+ 51 - 40
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(), -15);
+        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;
             }

+ 5 - 3
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/service/impl/RefreshTokenServiceImpl.java

@@ -1,10 +1,10 @@
 package org.jeecg.modules.ctop.service.impl;
 
-import cn.com.ctop.common.module.utils.Check;
-import cn.com.ctop.common.module.utils.CtopAdConstant;
 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.utils.Check;
+import cn.com.ctop.common.module.utils.CtopAdConstant;
 import lombok.extern.slf4j.Slf4j;
 import org.jeecg.modules.ctop.service.IRefreshTokenService;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -22,6 +22,7 @@ public class RefreshTokenServiceImpl implements IRefreshTokenService {
 
     /**
      * 获取所有token
+     *
      * @return
      */
     @Override
@@ -30,13 +31,14 @@ public class RefreshTokenServiceImpl implements IRefreshTokenService {
         log.info("需要刷新token列表长度:{}", oauthTokens.size());
         if (!Check.isNull(oauthTokens)) {
             for (CtopOauthToken oauthToken : oauthTokens) {
+                log.info("刷新token,accountId:{}", oauthToken.getAccountId());
                 //头条
                 if (CtopAdConstant.PLATFORM_TYPE_BYTEDANCE.equals(oauthToken.getMediaId().trim())) {
                     oauthTokenService.getByteDanceAccessToken(String.valueOf(oauthToken.getAccountId()));
                 }
                 //快手
                 if (CtopAdConstant.PLATFORM_TYPE_KUAISHOU.equals(oauthToken.getMediaId().trim())) {
-                    oauthTokenService.getKuaiShouRefreshToken(oauthToken.getAccountId(), oauthToken.getRefreshToken());
+                    oauthTokenService.getKuaiShouRefreshToken(oauthToken.getAccountId(), oauthToken.getRefreshToken(), oauthToken.getAgentType());
                 }
             }
         } else {

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

@@ -1,142 +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";
-}

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

@@ -37,13 +37,13 @@ public class YdPlanAggregateEntity extends BaseRowModel {
      * 展示
      */
     @ExcelProperty(index = 5, value = "展示")
-    private String show;
+    private String showNum;
 
     /**
      * 点击
      */
     @ExcelProperty(index = 6, value = "点击")
-    private String click;
+    private String clickNum;
 
     /**
      * 点击率(%)
@@ -67,7 +67,7 @@ public class YdPlanAggregateEntity extends BaseRowModel {
      * 转化数
      */
     @ExcelProperty(index = 10, value = "转化数")
-    private String convert;
+    private String convertNum;
 
     /**
      * 转化成本
@@ -125,22 +125,6 @@ public class YdPlanAggregateEntity extends BaseRowModel {
         this.totalCost = totalCost;
     }
 
-    public String getShow() {
-        return show;
-    }
-
-    public void setShow(String show) {
-        this.show = show;
-    }
-
-    public String getClick() {
-        return click;
-    }
-
-    public void setClick(String click) {
-        this.click = click;
-    }
-
     public String getClickRate() {
         return clickRate;
     }
@@ -165,12 +149,28 @@ public class YdPlanAggregateEntity extends BaseRowModel {
         this.ctr = ctr;
     }
 
-    public String getConvert() {
-        return convert;
+    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 setConvert(String convert) {
-        this.convert = convert;
+    public void setConvertNum(String convertNum) {
+        this.convertNum = convertNum;
     }
 
     public String getConvertPrice() {

+ 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>

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

@@ -0,0 +1,21 @@
+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);
+
+    void videoSplitToImage(String srcFilePath, String splitSrcPath);
+}

+ 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> {
+
+}

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

@@ -0,0 +1,548 @@
+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.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);
+        log.info("提取音频文件成功:{}", m4apath);
+    }
+
+    /**
+     * 截取音频文件
+     */
+    @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);
+        log.info("音频文件截取成功:{}", targetPath);
+    }
+
+    /**
+     * 音频拼接
+     * 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) {
+        StringBuffer command = new StringBuffer();
+        command.append(FFMPEG_PATH);
+        command.append(" -i ");
+        command.append(audioPart1);
+        command.append(" -i ");
+        command.append(audioPart2);
+        command.append(" -filter_complex ");
+        command.append("'[0:0] [1:0] concat=n=2:v=0:a=1 [a]'");
+        command.append(" -map ");
+        command.append("[a] ");
+        command.append(finalAudio);
+        Runtime runtime = Runtime.getRuntime();
+        Process pro = null;
+        try {
+            pro = runtime.exec(new String[]{"sh", "-c", command.toString()});
+            printProcessMsg(pro);
+            int status = pro.waitFor();
+            if (status == 0) {
+                log.info("音频文件合成成功:{}", command.toString());
+            } else {
+                log.info("音频文件合成失败:{}", command.toString());
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    /**
+     * 处理process输出流和错误流,防止进程阻塞,在process.waitFor();前调用
+     *
+     * @param exec
+     * @throws IOException
+     */
+    private void printProcessMsg(Process exec) throws IOException {
+        //防止ffmpeg进程塞满缓存造成死锁
+        InputStream error = exec.getErrorStream();
+        InputStream is = exec.getInputStream();
+
+        StringBuffer result = new StringBuffer();
+        String line = null;
+        try {
+            BufferedReader br = new BufferedReader(new InputStreamReader(error));
+            BufferedReader br2 = new BufferedReader(new InputStreamReader(is));
+
+            while ((line = br.readLine()) != null) {
+                result.append(line + "\n");
+            }
+//            log.info("FFMPEG视频转换进程错误信息:" + result.toString());
+
+            result = new StringBuffer();
+            line = null;
+
+            while ((line = br2.readLine()) != null) {
+                result.append(line + "\n");
+            }
+//            log.info("FFMPEG视频转换进程输出内容为:" + result.toString());
+        } catch (IOException e2) {
+            e2.printStackTrace();
+        } finally {
+            error.close();
+            is.close();
+        }
+
+    }
+
+    /**
+     * 音频+视频合成视频
+     *
+     * @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) {
+        StringBuffer command = new StringBuffer();
+        command.append(FFMPEG_PATH);
+        command.append(" -i ");
+        command.append(srcVideoPath);
+        command.append(" -i ");
+        command.append(srcAudioPath);
+        command.append(" -c:v");
+        command.append(" copy");
+        command.append(" -c:a");
+        command.append(" aac");
+        command.append(" -strict");
+        command.append(" experimental ");
+        command.append(finalVideoPath);
+        Runtime runtime = Runtime.getRuntime();
+        Process pro = null;
+        try {
+            pro = runtime.exec(new String[]{"sh", "-c", command.toString()});
+            printProcessMsg(pro);
+            int status = pro.waitFor();
+            if (status == 0) {
+                log.info("视频合成成功:{}", command.toString());
+            } else {
+                log.info("视频合成失败:{}", command.toString());
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    /**
+     * 将图片合成为视频
+     * 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);
+        log.info("图片合成视频成功:{}", videoFilePath);
+    }
+
+    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();
+            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);
+        Long current1 = System.currentTimeMillis();
+        log.info("替换视频下载完成:总时长{}毫秒", current1 - current);
+        String srcFilePath = LoadFileUtil.downLoadFromUrl(videoInfo.getModelVideoUrl(), srcVideoPath);
+        Long current2 = System.currentTimeMillis();
+        log.info("模板文件下载完成:总时长{}毫秒", current2 - current1);
+        String splitSrcPath = srcVideoPath + current + File.separator;
+        LoadFileUtil.checkFile(splitSrcPath);
+        String splitFillPath = fillVideoPath + current + File.separator;
+        LoadFileUtil.checkFile(splitFillPath);
+        String splitFinalPath = finalVideoPath + current + File.separator;
+        LoadFileUtil.checkFile(splitFinalPath);
+        //1:切分视频
+        videoSplitToImage(srcFilePath, splitSrcPath);
+        Long current3 = System.currentTimeMillis();
+        log.info("模板文件切分完成:总时长{}毫秒", current3 - current2);
+        videoSplitToImage(fillFilePath, splitFillPath);
+        Long current4 = System.currentTimeMillis();
+        log.info("填充文件切分完成:总时长{}毫秒", current4 - current3);
+        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 = 1; i < exchangeStartFrameNum; i++) {
+                Mat srcNoChangeImage = Imgcodecs.imread(splitSrcPath + i + ".jpg");
+                Imgcodecs.imwrite(splitFinalPath + i + ".jpg", srcNoChangeImage);
+            }
+
+            //2.2 转场动画(从fill文件夹的第一帧开始)
+            String getImageName = splitFillPath + "1.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 = 2;
+            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++;
+            }
+            Long current5 = System.currentTimeMillis();
+            log.info("图片替换完成:总时长{}毫秒", current5 - current4);
+            //3开始合成视频
+            //3.1 抽取音频文件
+            String srcM4aFilePath = splitSrcPath + "src.m4a";
+            getM4aFromMp4(srcFilePath, srcM4aFilePath);
+            Long current6 = System.currentTimeMillis();
+            log.info("抽取模板音频文件完成:总时长{}毫秒", current6 - current4);
+            String fillM4aFilePath = splitSrcPath + "fill.m4a";
+            getM4aFromMp4(fillFilePath, fillM4aFilePath);
+            Long current7 = System.currentTimeMillis();
+            log.info("抽取填充音频文件完成:总时长{}毫秒", current7 - current6);
+            //3.2 截取源模板音频文件
+            String cutM4aFilePath = splitSrcPath + "cut.m4a";
+            //计算需要截取的音频时长
+            String secondStr = getSecond(exchangeStartFrameNum);
+            cutM4a(srcM4aFilePath, cutM4aFilePath, "00:00:00.000", secondStr);
+            Long current8 = System.currentTimeMillis();
+            log.info("音频文件截取完成:总时长{}毫秒", current8 - current7);
+            //3.3 合并两个音频文件
+            String finalM4aFilePath = splitSrcPath + "final.m4a";
+            audioMosaic(cutM4aFilePath, fillM4aFilePath, finalM4aFilePath);
+            Long current9 = System.currentTimeMillis();
+            log.info("音频文件合成完成:总时长{}毫秒", current9 - current8);
+            //3.4 将最终生成的图片合成为视频
+            String noVoiceVideoFilePath = splitSrcPath + "novoice.mp4";
+            mergeImageToVideo(splitFinalPath, 25, noVoiceVideoFilePath);
+            Long current10 = System.currentTimeMillis();
+            log.info("图片合成视频完成:总时长{}毫秒", current10 - current9);
+            //3.5 合并视频和音频
+            String finalVideoFilePath = splitSrcPath + "final.mp4";
+            mergeAudioAndVideo(noVoiceVideoFilePath, finalM4aFilePath, finalVideoFilePath);
+            Long current11 = System.currentTimeMillis();
+            log.info("视频合成完成:总时长{}毫秒", current11 - current10);
+            //3.6 上传视频文件至OSS并返回url存入数据库
+            InputStream inputStream = new FileInputStream(finalVideoFilePath);
+            String finalUrl = OSSUtils.uploadFile2OSS(inputStream, "model/final/", videoInfo.getId() + "_" + current + ".mp4");
+            Long current12 = System.currentTimeMillis();
+            log.info("文件上传oss完成:总时长{}毫秒", current12 - current11);
+            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;
+    }
+
+    @Override
+    public void videoSplitToImage(String srcFilePath, String splitSrcPath) {
+        StringBuffer command = new StringBuffer();
+        command.append(FFMPEG_PATH);
+        command.append(" -i ");
+        command.append(srcFilePath);
+        command.append(" -threads 5");
+        command.append(" -preset");
+        command.append(" ultrafast ");
+        command.append(splitSrcPath + "%d.jpg");
+        Runtime runtime = Runtime.getRuntime();
+        Process pro = null;
+        try {
+            pro = runtime.exec(new String[]{"sh", "-c", command.toString()});
+            printProcessMsg(pro);
+            int status = pro.waitFor();
+            if (status == 0) {
+                log.info("视频切分成功:{}", command.toString());
+            } else {
+                log.info("视频切分失败:{}", command.toString());
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    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 {
+
+}

+ 1 - 1
jeecg-boot-module-system/src/main/java/org/jeecg/modules/demo/opencv/Avutils.java

@@ -1,4 +1,4 @@
-package org.jeecg.modules.demo.opencv;
+package org.jeecg.modules.opencv.utils;
 
 public class Avutils {
     /**

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

@@ -1,4 +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;

+ 1 - 1
jeecg-boot-module-system/src/main/java/org/jeecg/modules/demo/opencv/ImageUtils.java

@@ -1,4 +1,4 @@
-package org.jeecg.modules.demo.opencv;
+package org.jeecg.modules.opencv.utils;
 
 import org.opencv.core.*;
 import org.opencv.imgcodecs.Imgcodecs;

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

@@ -1,4 +1,4 @@
-package org.jeecg.modules.demo.opencv;
+package org.jeecg.modules.opencv.utils;
 
 
 import org.opencv.core.*;

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

@@ -1,4 +1,4 @@
-package org.jeecg.modules.demo.opencv;
+package org.jeecg.modules.opencv.utils;
 
 import org.opencv.core.Core;
 import org.opencv.core.Mat;

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

@@ -1,5 +1,6 @@
-package org.jeecg.modules.demo.opencv;
+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.*;
@@ -14,11 +15,6 @@ import static org.bytedeco.javacpp.opencv_imgcodecs.cvLoadImage;
  * 视频截帧处理
  */
 public class VideoProcessing {
-    public static String videoPath = "D:/data";
-
-    //存放截取视频某一帧的图片
-    public static String videoFramesPath = "D:/data/test/";
-
     /**
      * 将视频文件帧处理并以“jpg”格式进行存储。
      * 依赖FrameToBufferedImage方法:将frame转换为bufferedImage对象
@@ -33,21 +29,21 @@ public class VideoProcessing {
         //标识
         int flag = 0;
         try {
+
             /*获取视频文件*/
-            FFmpegFrameGrabber fFmpegFrameGrabber = new FFmpegFrameGrabber(videoPath + "/" + videoFileName);
+            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 = videoFramesPath + String.valueOf(flag) + ".jpg";
-
+                    String fileName = filePackageName + String.valueOf(flag) + ".jpg";
                     //文件储存对象
                     File outPut = new File(fileName);
                     ImageIO.write(FrameToBufferedImage(frame), "jpg", outPut);

+ 170 - 6
jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/controller/PerformanceController2.java

@@ -1,11 +1,9 @@
 package org.jeecg.modules.system.controller;
 
 import cn.com.ctop.common.module.entity.MaterialInfo;
+import cn.com.ctop.performanceaccount.entity.PerformanceAccount;
 import cn.com.ctop.performanceappraisal.entity.Performance;
-import cn.com.ctop.userefficientvideomap.entity.AccountDTO;
-import cn.com.ctop.userefficientvideomap.entity.DesignMaterialInfo;
-import cn.com.ctop.userefficientvideomap.entity.PerformanceTimeDTO;
-import cn.com.ctop.userefficientvideomap.entity.UserDto2;
+import cn.com.ctop.userefficientvideomap.entity.*;
 import cn.com.ctop.userefficientvideomap.mapper.UserEfficientVideoMapMapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -20,6 +18,7 @@ import org.jeecg.common.aspect.annotation.AutoLog;
 import org.jeecg.common.system.query.QueryGenerator;
 import org.jeecg.common.system.vo.LoginUser;
 import org.jeecg.common.util.DateUtils;
+import org.jeecg.modules.ctop.entity.Project;
 import org.jeecg.modules.system.service.IPerformanceService2;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
@@ -123,7 +122,7 @@ public class PerformanceController2 {
 
     @AutoLog(value = "根据year、quarter计算季度设计师绩效")
     @ApiOperation(value = "根据year、quarter计算季度设计师绩效", notes = "根据year、quarter计算季度设计师绩效")
-    @PostMapping(value = "/designerPerformance")
+    @GetMapping(value = "/designerPerformance")
     public Result<Map<String, Object>> designerPerformanceTask(@RequestParam(name = "year", required = true) int year,
                                                                @RequestParam(name = "quarter", required = true) int quarter) {
         Result<Map<String, Object>> result = new Result<Map<String, Object>>();
@@ -148,6 +147,13 @@ public class PerformanceController2 {
             result.error500("时间不能为空");
         }
         try {
+            //String calc = "2020-01-03";
+            //for(int i=0; i<12 ;i++){
+            //    if(i!=0){
+            //        calc = DateUtils.addDay( calc,  7);
+            //    }
+            //    performanceService.efficientVideoTask(calc);
+            //}
             performanceService.efficientVideoTask(calcDate);
             result.setSuccess(true);
         } catch (Exception e) {
@@ -544,11 +550,12 @@ public class PerformanceController2 {
         String userId = dto.getUserId();
         String startDate = dto.getStartDate();
         String endDate = dto.getEndDate();
+        Integer appType = dto.getAppType();
         if(userId==null || startDate == null || endDate == null){
             result.setSuccess(false);
             result.setMessage("userId和时间不能为空");
         }
-        List<MaterialInfo> materialInfoList = performanceService.getVideoList(userId, startDate, endDate);
+        List<MaterialInfo> materialInfoList = performanceService.getVideoList(appType, userId, startDate, endDate);
         result.setSuccess(true);
         result.setResult(materialInfoList);
         return result;
@@ -613,4 +620,161 @@ public class PerformanceController2 {
         return result;
     }
 
+
+    //头条优化季度绩效报表
+    @AutoLog(value = "头条优化季度绩效报表")
+    @ApiOperation(value = "头条优化季度绩效报表", notes = "头条优化季度绩效报表")
+    @PostMapping(value = "/getYunyingQuarterDetailByUserId")
+    public Result<List<PerformanceAccount>> getYunyingQuarterDetailByUserId(@RequestBody PerformanceTimeDTO dto,
+                                                             HttpServletRequest req) {
+        Result<List<PerformanceAccount>> result = new Result<>();
+        Integer year = dto.getYear();
+        Integer quarter = dto.getQuarter();
+        String userId = dto.getUserId();
+        Integer appType = dto.getAppType();
+        if(year==null || quarter == null || StringUtils.isBlank(userId) || appType == null){
+            result.setSuccess(false);
+            result.setMessage("时间不能为空");
+        }
+        List<PerformanceAccount> userDto2List = performanceService.getYunyingQuarterDetailByUserId(year, quarter, userId, appType);
+        result.setSuccess(true);
+        result.setResult(userDto2List);
+        return result;
+    }
+
+
+    @AutoLog(value = "项目报表-按平台获取其下所有项目信息以及消耗")
+    @ApiOperation(value = "按平台获取其下所有项目信息以及消耗", notes = "按平台获取其下所有项目信息以及消耗")
+    @PostMapping(value = "/getProjcetListByMediaType")
+    public Result<List<ProjectDTO>> getProjcetListByMediaType(@RequestBody PerformanceTimeDTO dto,
+                                                             HttpServletRequest req) {
+        Result<List<ProjectDTO>> result = new Result<>();
+        Integer year = dto.getYear();
+        Integer quarter = dto.getQuarter();
+        Integer appType = dto.getAppType();
+        if(year==null || quarter == null || appType == null ){
+            result.setSuccess(false);
+            result.setMessage("媒体类型均不能为空");
+        }
+        List<ProjectDTO> userDto2List = performanceService.getProjcetListByMediaType(year, quarter, appType);
+        result.setSuccess(true);
+        result.setResult(userDto2List);
+        return result;
+    }
+
+    @AutoLog(value = "项目报表-根据projectId获取其下账户季度消耗信息")
+    @ApiOperation(value = "根据projectId获取其下账户季度消耗信息", notes = "根据projectId获取其下账户季度消耗信息")
+    @PostMapping(value = "/getQuarterAccountDetail")
+    public Result<List<AccountDTO>> getQuarterAccountDetail(@RequestBody PerformanceTimeDTO dto,
+                                                              HttpServletRequest req) {
+        Result<List<AccountDTO>> result = new Result<>();
+        Integer year = dto.getYear();
+        Integer quarter = dto.getQuarter();
+        Integer appType = dto.getAppType();
+        Integer projectId = dto.getProjectId();
+        if(year==null || quarter == null || appType == null || projectId == null){
+            result.setSuccess(false);
+            result.setMessage("媒体类型均不能为空");
+        }
+        List<AccountDTO> userDto2List = performanceService.getQuarterAccountDetail(year, quarter, projectId, appType);
+        result.setSuccess(true);
+        result.setResult(userDto2List);
+        return result;
+    }
+
+    @AutoLog(value = "项目报表-根据accountId获取季度视频信息")
+    @ApiOperation(value = "根据accountId获取季度视频信息", notes = "根据accountId获取季度视频信息")
+    @PostMapping(value = "/getKuaishouQuarterVideoInfoByAccountId")
+    public Result<List<VideoDTO>> getKuaishouQuarterVideoInfoByAccountId(@RequestBody PerformanceTimeDTO dto,
+                                                            HttpServletRequest req) {
+        Result<List<VideoDTO>> result = new Result<>();
+        Integer year = dto.getYear();
+        Integer quarter = dto.getQuarter();
+        Long accountId = dto.getAccountId();
+        if(year==null || quarter == null || accountId == null ){
+            result.setSuccess(false);
+            result.setMessage("媒体类型均不能为空");
+        }
+        List<VideoDTO> userDto2List = performanceService.getKuaishouQuarterVideoInfoByAccountId(year, quarter, accountId);
+        result.setSuccess(true);
+        result.setResult(userDto2List);
+        return result;
+    }
+
+    @AutoLog(value = "项目报表-根据accountId获取季度视频信息")
+    @ApiOperation(value = "根据accountId获取季度视频信息", notes = "根据accountId获取季度视频信息")
+    @PostMapping(value = "/getToutiaoQuarterVideoInfoByAccountId")
+    public Result<List<VideoDTO>> getToutiaoQuarterVideoInfoByAccountId(@RequestBody PerformanceTimeDTO dto,
+                                                                         HttpServletRequest req) {
+        Result<List<VideoDTO>> result = new Result<>();
+        Integer year = dto.getYear();
+        Integer quarter = dto.getQuarter();
+        Long accountId = dto.getAccountId();
+        if(year==null || quarter == null || accountId == null ){
+            result.setSuccess(false);
+            result.setMessage("媒体类型均不能为空");
+        }
+        List<VideoDTO> userDto2List = performanceService.getToutiaoQuarterVideoInfoByAccountId(year, quarter, accountId);
+        result.setSuccess(true);
+        result.setResult(userDto2List);
+        return result;
+    }
+
+    @AutoLog(value = "项目报表-根据accountId获取季度视频信息")
+    @ApiOperation(value = "根据accountId获取季度视频信息", notes = "根据accountId获取季度视频信息")
+    @PostMapping(value = "/getUserQuarterVideo")
+    public Result<List<VideoDTO>> getUserQuarterVideo(@RequestBody PerformanceTimeDTO dto,
+                                                                        HttpServletRequest req) {
+        Result<List<VideoDTO>> result = new Result<>();
+        Integer year = dto.getYear();
+        Integer quarter = dto.getQuarter();
+        String userId = dto.getUserId();
+        if(year==null || quarter == null || userId == null ){
+            result.setSuccess(false);
+            result.setMessage("媒体类型均不能为空");
+        }
+        List<VideoDTO> userDto2List = performanceService.getUserQuarterVideo(year, quarter, userId);
+        result.setSuccess(true);
+        result.setResult(userDto2List);
+        return result;
+    }
+
+    @AutoLog(value = "项目报表-根据userId获取有效视频信息")
+    @ApiOperation(value = "根据userId获取有效视频信息", notes = "根据userId获取有效视频信息")
+    @PostMapping(value = "/getUserQuarterEffiVideo")
+    public Result<List<VideoDTO>> getUserQuarterEffiVideo(@RequestBody PerformanceTimeDTO dto,
+                                                      HttpServletRequest req) {
+        Result<List<VideoDTO>> result = new Result<>();
+        Integer year = dto.getYear();
+        Integer quarter = dto.getQuarter();
+        String userId = dto.getUserId();
+        if(year==null || quarter == null || userId == null ){
+            result.setSuccess(false);
+            result.setMessage("媒体类型均不能为空");
+        }
+        List<VideoDTO> userDto2List = performanceService.getUserQuarterEffiVideo(year, quarter, userId);
+        result.setSuccess(true);
+        result.setResult(userDto2List);
+        return result;
+    }
+
+    @AutoLog(value = "绩效-获取快手、头条下各账户下视频的季度消耗")
+    @ApiOperation(value = "绩效-获取快手、头条下各账户下视频的季度消耗", notes = "绩效-获取快手、头条下各账户下视频的季度消耗")
+    @PostMapping(value = "/getQuarterVideoInfoByAccountId")
+    public Result getQuarterVideoInfoByAccountId(@RequestBody PerformanceTimeDTO dto,
+                                                          HttpServletRequest req) {
+        Result result = new Result<>();
+        Integer year = dto.getYear();
+        Integer quarter = dto.getQuarter();
+        if(year==null || quarter == null  ){
+            result.setSuccess(false);
+            result.setMessage("媒体类型均不能为空");
+        }
+        performanceService.getQuarterVideoInfoByAccountId(year, quarter);
+        result.setSuccess(true);
+        return result;
+    }
+
+
+
 }

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

@@ -112,7 +112,7 @@ public class SysUserController {
     public Result<List<SysUserVo>> getAllUserListByCompany(String userId) {
         Result<List<SysUserVo>> result = new Result<>();
         try {
-            List<SysUserVo> userList = new ArrayList<>();
+            /*List<SysUserVo> userList = new ArrayList<>();
             String roleCode = materialReportMapper.getRoleCodeByUserId(userId);
             if (!"admin".equals(roleCode)) {
                 QueryWrapper<UserCompany> userCompanyQueryWrapper = new QueryWrapper<>();
@@ -124,7 +124,8 @@ public class SysUserController {
             } else {
                 userList = sysUserService.getAllUser();
             }
-
+*/
+            List<SysUserVo> userList = sysUserService.getAllUser();
             result.setSuccess(true);
             result.setResult(userList);
         } catch (Exception e) {

+ 3 - 2
jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/entity/EffiRateComparator.java

@@ -1,5 +1,6 @@
 package org.jeecg.modules.system.entity;
 
+import cn.com.ctop.userefficientvideomap.entity.UserDto2;
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.fasterxml.jackson.annotation.JsonFormat;
@@ -18,8 +19,8 @@ public class EffiRateComparator implements Comparator<Object> {
 
     @Override
     public int compare(Object o1, Object o2) {
-        UserDto p1 = (UserDto) o1; // 强制转换
-        UserDto p2 = (UserDto) o2;
+        UserDto2 p1 = (UserDto2) o1; // 强制转换
+        UserDto2 p2 = (UserDto2) o2;
         return (p2.getEffiRate()).compareTo(p1.getEffiRate());
     }
 }

+ 24 - 4
jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/IPerformanceService2.java

@@ -1,10 +1,9 @@
 package org.jeecg.modules.system.service;
 
 import cn.com.ctop.common.module.entity.MaterialInfo;
+import cn.com.ctop.performanceaccount.entity.PerformanceAccount;
 import cn.com.ctop.performanceappraisal.entity.Performance;
-import cn.com.ctop.userefficientvideomap.entity.AccountDTO;
-import cn.com.ctop.userefficientvideomap.entity.DesignMaterialInfo;
-import cn.com.ctop.userefficientvideomap.entity.UserDto2;
+import cn.com.ctop.userefficientvideomap.entity.*;
 import com.baomidou.mybatisplus.extension.service.IService;
 
 import java.util.List;
@@ -91,7 +90,7 @@ public interface IPerformanceService2 extends IService<Performance> {
     List<MaterialInfo> effiVideoList(Integer appType, Integer year, Integer quarter, String userId);
 
     //获取有效视频列表
-    List<MaterialInfo> getVideoList(String userId, String startDate, String endDate);
+    List<MaterialInfo> getVideoList(Integer appType, String userId, String startDate, String endDate);
 
     List<MaterialInfo> getEffiWeekVideoList(Integer appType, String startDate, String endDate, String userId);
 
@@ -118,4 +117,25 @@ public interface IPerformanceService2 extends IService<Performance> {
 
     //头条优化季度绩效报表
     List<UserDto2> toutiaoYouhuaQuarterReport(Integer year, Integer quarter);
+
+    //根据userId获取此人在季度的消耗明细
+    List<PerformanceAccount> getYunyingQuarterDetailByUserId(Integer year, Integer quarter, String userId, Integer appType);
+
+    //按平台获取其下所有项目信息以及消耗
+    List<ProjectDTO> getProjcetListByMediaType(Integer year, Integer quarter, Integer appType );
+
+    //根据projectId获取其下账户季度消耗信息
+    List<AccountDTO> getQuarterAccountDetail(Integer year, Integer quarter, Integer projectId, Integer appType);
+
+    //根据accountId获取季度视频信息
+    List<VideoDTO> getKuaishouQuarterVideoInfoByAccountId(Integer year, Integer quarter, Long accountId);
+
+    //根据accountId获取季度视频信息
+    List<VideoDTO> getToutiaoQuarterVideoInfoByAccountId(Integer year, Integer quarter, Long accountId);
+
+    List<VideoDTO> getUserQuarterVideo(Integer year, Integer quarter, String userId);
+
+    List<VideoDTO> getUserQuarterEffiVideo(Integer year, Integer quarter, String userId);
+
+    void getQuarterVideoInfoByAccountId(Integer year, Integer quarter);
 }

Разлика између датотеке није приказан због своје велике величине
+ 651 - 307
jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/impl/PerformanceServiceImpl2.java


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

@@ -142,7 +142,7 @@ mybatis-plus:
 #jeecg专用配置
 jeecg:
   ffmpeg:
-    bin: /mnt/ffmpeg/bin
+    bin: ffmpeg
   path:
     #文件上传根目录 设置
     upload: /mnt/upload

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

@@ -139,6 +139,8 @@ mybatis-plus:
       log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
 #jeecg专用配置
 jeecg:
+  ffmpeg:
+    bin: D:\java\ffmpeg\bin\ffmpeg.exe
   path:
     #文件上传根目录 设置
     #文件上传根目录 设置
@@ -168,4 +170,4 @@ oss:
   replace:
     replace-value: oss-cn-beijing-internal
     replace-old-value: oss-cn-beijing
-    download: /mnt/file/video/
+    download: /mnt/file/video/

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

@@ -1,7 +1,6 @@
 spring:
   profiles:
-    active: prod
-  #      active: @activatedProperties@
+    active: @activatedProperties@
   application:
     name: system-web
 eureka:

+ 28 - 18
jeecg-boot-module-system/src/test/java/org/jeecg/SampleTest.java

@@ -20,6 +20,8 @@ import org.jeecg.modules.ctop.service.IBytedanceFundDailyService;
 import org.jeecg.modules.ctop.service.IPerformanceSaleService;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.opencv.core.Mat;
+import org.opencv.videoio.VideoCapture;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.test.context.junit4.SpringRunner;
@@ -44,20 +46,24 @@ public class SampleTest {
     private IKuaiShouHistoryReportTaskService reportTaskService;
     @Autowired
     private CtopOauthTokenMapper tokenMapper;
+    @Autowired
+    private ICtopOauthTokenService oauthTokenService;
 
 
     @Test
     public void kuaisShouReport() {
         try {
 
-            QueryWrapper<CtopOauthToken> queryWrapper = new QueryWrapper<>();
+          /*  QueryWrapper<CtopOauthToken> queryWrapper = new QueryWrapper<>();
             queryWrapper.eq("account_id", 3727345L);
             CtopOauthToken token = tokenMapper.selectOne(queryWrapper);
 
             SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
             Date parse = simpleDateFormat.parse("2020-03-12");
-            kuaishouInterfaceService.getAdvertiserReportDaily(token, parse, parse);
+            kuaishouInterfaceService.getAdvertiserReportDaily(token, parse, parse);*/
+
 
+            oauthTokenService.getKuaiShouRefreshToken(4801802L, "3874f4adb984a371cf92e5fc9a585e6b", 1);
 
 //            reportTaskService.createTask(3727345L, "871fc2c248782a94ad2962c941555abc", "");
 //            reportTaskService.getTaskList();
@@ -138,6 +144,7 @@ public class SampleTest {
 
     @Autowired
     private IBytedanceFundDailyService fundDailyService;
+
     @Test
     public void testLoadJob() {
         String endDate = "2020-04-07";
@@ -278,29 +285,32 @@ public class SampleTest {
     @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);
-
-      /*  String url = "https://ad.e.kuaishou.com/rest/openapi/v1/file/ad/video/su_zao/list";
-
-
-        Map<String, String> headers = new HashMap<String, String>();
-        headers.put("Content-Type", "application/json");
-        headers.put("Access-Token", token);
-        Map<String, Object> param = new HashMap<String, Object>();
-
-        param.put("advertiser_id", accountId);
-        param.put("temporal_granularity", "HOURLY");
-        param.put("page", 1);
-        String result = HttpUtils.httpPostRequest(url, param, headers);
-        System.err.println(result);*/
+//        kuaishouInterfaceService.getVideoList("e91c778d7de1bd0e9d8f3213d1e0e57c",3820093L, null,null,1);
+    }
 
+    @Test
+    public void test() throws Exception {
+        VideoCapture capture = new VideoCapture("D:\\data\\模板视频\\模板3\\原始模板3.mp4");
+        int frameCnt = 0;
+        int num = 0;
+        Mat mat = new Mat();
+        capture.read(mat);
 
     }
 

+ 4 - 0
module-common/src/main/java/cn/com/ctop/common/module/entity/CtopOauthToken.java

@@ -73,6 +73,10 @@ public class CtopOauthToken {
     @Excel(name = "刷新令牌", width = 15)
     @ApiModelProperty(value = "刷新令牌")
     private String refreshToken;
+
+
+    private Integer agentType;
+
     /**
      * 刷新令牌有效期
      */

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

@@ -34,4 +34,6 @@ public interface CtopOauthTokenMapper extends BaseMapper<CtopOauthToken> {
     CtopOauthToken selectByAccountId(Long accountId);
 
     List<CtopOauthToken> selectKuaiShouToken();
+
+    List<CtopOauthToken> selectToutiaoToken();
 }

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

@@ -5,6 +5,7 @@ import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import org.apache.ibatis.annotations.Param;
 
+import java.util.List;
 import java.util.Map;
 
 /**
@@ -27,4 +28,8 @@ public interface MaterialInfoMapper extends BaseMapper<MaterialInfo> {
     Integer getToutiaoUpVideoCount(@Param("code") String code);
 
     JSONObject getGeneralizationInfo(@Param("code") String code);
+
+    List<String> getEffiSignature();
+
+    MaterialInfo getMaterialInfoByCode(@Param("code")String code);
 }

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


Неке датотеке нису приказане због велике количине промена