瀏覽代碼

Merge remote-tracking branch 'origin/master'

yumeng 5 年之前
父節點
當前提交
67ca78669f
共有 100 個文件被更改,包括 19001 次插入727 次删除
  1. 1 1
      jeecg-boot-base-common/src/main/java/org/jeecg/common/constant/CommonConstant.java
  2. 13 5
      jeecg-boot-base-common/src/main/java/org/jeecg/common/constant/CommonSendStatus.java
  3. 3 0
      jeecg-boot-base-common/src/main/java/org/jeecg/common/constant/CtopAdConstant.java
  4. 3 2
      jeecg-boot-base-common/src/main/java/org/jeecg/common/system/base/controller/JeecgController.java
  5. 179 177
      jeecg-boot-base-common/src/main/java/org/jeecg/common/system/controller/CommonController.java
  6. 4 2
      jeecg-boot-base-common/src/main/java/org/jeecg/common/system/util/JeecgDataAutorUtils.java
  7. 4 2
      jeecg-boot-base-common/src/main/java/org/jeecg/common/util/BrowserUtils.java
  8. 2 2
      jeecg-boot-base-common/src/main/java/org/jeecg/common/util/PasswordUtil.java
  9. 6 3
      jeecg-boot-base-common/src/main/java/org/jeecg/common/util/SqlInjectionUtil.java
  10. 8 2
      jeecg-boot-base-common/src/main/java/org/jeecg/common/util/encryption/EncryptedString.java
  11. 12 4
      jeecg-boot-base-common/src/main/java/org/jeecg/common/util/jsonschema/validate/TreeSelectProperty.java
  12. 16 8
      jeecg-boot-module-system/src/main/java/org/jeecg/JeecgOneToMainUtil.java
  13. 1 1
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/controller/ByteDanceImageInfoController.java
  14. 1 1
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/controller/ByteDanceUserOrientationTemplateController.java
  15. 253 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/controller/BytedanceAdvertiserDailyReportController.java
  16. 253 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/controller/BytedanceAdvertiserHourlyReportController.java
  17. 253 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/controller/BytedanceCampaignDailyReportController.java
  18. 253 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/controller/BytedanceCampaignHourlyReportController.java
  19. 253 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/controller/BytedanceCreativeDailyReportController.java
  20. 253 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/controller/BytedanceCreativeHourlyReportController.java
  21. 253 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/controller/BytedancePlanDailyReportController.java
  22. 253 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/controller/BytedancePlanHourlyReportController.java
  23. 1 1
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/controller/BytedanceUrlInfoController.java
  24. 4 3
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/controller/ReportController.java
  25. 1 1
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/controller/SourceFileController.java
  26. 606 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/entity/BytedanceAdvertiserDailyReport.java
  27. 610 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/entity/BytedanceAdvertiserHourlyReport.java
  28. 627 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/entity/BytedanceCampaignDailyReport.java
  29. 627 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/entity/BytedanceCampaignHourlyReport.java
  30. 657 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/entity/BytedanceCreativeDailyReport.java
  31. 654 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/entity/BytedanceCreativeHourlyReport.java
  32. 640 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/entity/BytedancePlanDailyReport.java
  33. 640 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/entity/BytedancePlanHourlyReport.java
  34. 17 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/mapper/BytedanceAdvertiserDailyReportMapper.java
  35. 17 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/mapper/BytedanceAdvertiserHourlyReportMapper.java
  36. 17 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/mapper/BytedanceCampaignDailyReportMapper.java
  37. 17 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/mapper/BytedanceCampaignHourlyReportMapper.java
  38. 17 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/mapper/BytedanceCreativeDailyReportMapper.java
  39. 17 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/mapper/BytedanceCreativeHourlyReportMapper.java
  40. 17 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/mapper/BytedancePlanDailyReportMapper.java
  41. 17 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/mapper/BytedancePlanHourlyReportMapper.java
  42. 5 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/mapper/xml/BytedanceAdvertiserDailyReportMapper.xml
  43. 5 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/mapper/xml/BytedanceAdvertiserHourlyReportMapper.xml
  44. 5 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/mapper/xml/BytedanceCampaignDailyReportMapper.xml
  45. 5 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/mapper/xml/BytedanceCampaignHourlyReportMapper.xml
  46. 5 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/mapper/xml/BytedanceCreativeDailyReportMapper.xml
  47. 5 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/mapper/xml/BytedanceCreativeHourlyReportMapper.xml
  48. 5 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/mapper/xml/BytedancePlanDailyReportMapper.xml
  49. 5 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/mapper/xml/BytedancePlanHourlyReportMapper.xml
  50. 14 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/service/IBytedanceAdvertiserDailyReportService.java
  51. 14 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/service/IBytedanceAdvertiserHourlyReportService.java
  52. 14 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/service/IBytedanceCampaignDailyReportService.java
  53. 14 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/service/IBytedanceCampaignHourlyReportService.java
  54. 14 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/service/IBytedanceCreativeDailyReportService.java
  55. 14 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/service/IBytedanceCreativeHourlyReportService.java
  56. 14 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/service/IBytedancePlanDailyReportService.java
  57. 14 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/service/IBytedancePlanHourlyReportService.java
  58. 13 159
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/service/impl/ByteDanceAdvertisePlanServiceImpl.java
  59. 0 3
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/service/impl/ByteDanceAdvertiserDataServiceImpl.java
  60. 5 55
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/service/impl/ByteDanceCampaignTemplateServiceImpl.java
  61. 19 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/service/impl/BytedanceAdvertiserDailyReportServiceImpl.java
  62. 19 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/service/impl/BytedanceAdvertiserHourlyReportServiceImpl.java
  63. 19 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/service/impl/BytedanceCampaignDailyReportServiceImpl.java
  64. 19 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/service/impl/BytedanceCampaignHourlyReportServiceImpl.java
  65. 19 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/service/impl/BytedanceCreativeDailyReportServiceImpl.java
  66. 19 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/service/impl/BytedanceCreativeHourlyReportServiceImpl.java
  67. 19 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/service/impl/BytedancePlanDailyReportServiceImpl.java
  68. 19 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/service/impl/BytedancePlanHourlyReportServiceImpl.java
  69. 4 5
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/service/impl/CreateInternalServiceImpl.java
  70. 5 10
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/service/impl/FileInfoServiceImpl.java
  71. 159 247
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/service/impl/ReportServiceImpl.java
  72. 6 4
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/sign/itext5/ItextUtils.java
  73. 2 2
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/sign/itext5/Pkcs.java
  74. 3 2
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/sign/itext5/SignHighPdf.java
  75. 11 25
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/sign/itext5/SignPdf.java
  76. 443 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/vue/BytedanceAdvertiserDailyReportList.vue
  77. 444 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/vue/BytedanceAdvertiserHourlyReportList.vue
  78. 453 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/vue/BytedanceCampaignDailyReportList.vue
  79. 453 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/vue/BytedanceCampaignHourlyReportList.vue
  80. 458 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/vue/BytedanceCreativeDailyReportList.vue
  81. 458 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/vue/BytedanceCreativeHourlyReportList.vue
  82. 458 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/vue/BytedancePlanDailyReportList.vue
  83. 458 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/vue/BytedancePlanHourlyReportList.vue
  84. 446 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/vue/modules/BytedanceAdvertiserDailyReportModal.vue
  85. 453 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/vue/modules/BytedanceAdvertiserDailyReportModal__Style#Drawer.vue
  86. 446 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/vue/modules/BytedanceAdvertiserHourlyReportModal.vue
  87. 453 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/vue/modules/BytedanceAdvertiserHourlyReportModal__Style#Drawer.vue
  88. 458 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/vue/modules/BytedanceCampaignDailyReportModal.vue
  89. 465 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/vue/modules/BytedanceCampaignDailyReportModal__Style#Drawer.vue
  90. 458 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/vue/modules/BytedanceCampaignHourlyReportModal.vue
  91. 465 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/vue/modules/BytedanceCampaignHourlyReportModal__Style#Drawer.vue
  92. 464 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/vue/modules/BytedanceCreativeDailyReportModal.vue
  93. 471 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/vue/modules/BytedanceCreativeDailyReportModal__Style#Drawer.vue
  94. 464 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/vue/modules/BytedanceCreativeHourlyReportModal.vue
  95. 471 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/vue/modules/BytedanceCreativeHourlyReportModal__Style#Drawer.vue
  96. 464 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/vue/modules/BytedancePlanDailyReportModal.vue
  97. 471 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/vue/modules/BytedancePlanDailyReportModal__Style#Drawer.vue
  98. 464 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/vue/modules/BytedancePlanHourlyReportModal.vue
  99. 471 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/vue/modules/BytedancePlanHourlyReportModal__Style#Drawer.vue
  100. 0 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/demo/test/service/impl/JeecgDemoServiceImpl.java

+ 1 - 1
jeecg-boot-base-common/src/main/java/org/jeecg/common/constant/CommonConstant.java

@@ -52,7 +52,7 @@ public interface CommonConstant {
     public static String LOGIN_USER_CACHERULES_PERMISSION  = "loginUser_cacheRules::Permissions_";
     public static String LOGIN_USER_CACHERULES_PERMISSION  = "loginUser_cacheRules::Permissions_";
     /** 登录用户令牌缓存KEY前缀 */
     /** 登录用户令牌缓存KEY前缀 */
 
 
-    public static final int  TOKEN_EXPIRE_TIME  = 3600; //3600秒即是一小时
+    public static final int TOKEN_EXPIRE_TIME = 3600;
     
     
     public static final String PREFIX_USER_TOKEN  = "PREFIX_USER_TOKEN_";
     public static final String PREFIX_USER_TOKEN  = "PREFIX_USER_TOKEN_";
     
     

+ 13 - 5
jeecg-boot-base-common/src/main/java/org/jeecg/common/constant/CommonSendStatus.java

@@ -6,9 +6,17 @@ package org.jeecg.common.constant;
  *
  *
  */
  */
 public interface CommonSendStatus {
 public interface CommonSendStatus {
-	public static final String UNPUBLISHED_STATUS_0 = "0";	//未发布
-	
-	public static final String PUBLISHED_STATUS_1 = "1";		//已发布
-	
-	public static final String REVOKE_STATUS_2 = "2";			//撤销
+    /**
+     * 未发布
+     */
+    public static final String UNPUBLISHED_STATUS_0 = "0";
+
+    /**
+     * 已发布
+     */
+    public static final String PUBLISHED_STATUS_1 = "1";
+    /**
+     * 撤销
+     */
+    public static final String REVOKE_STATUS_2 = "2";
 }
 }

+ 3 - 0
jeecg-boot-base-common/src/main/java/org/jeecg/common/constant/CtopAdConstant.java

@@ -10,5 +10,8 @@ public class CtopAdConstant {
     public static final String PLATFORM_TYPE_BYTEDANCE_PY = "bytedance";
     public static final String PLATFORM_TYPE_BYTEDANCE_PY = "bytedance";
     public static final String PLATFORM_TYPE_KUAISHOU_PY = "kuaishou";
     public static final String PLATFORM_TYPE_KUAISHOU_PY = "kuaishou";
 
 
+    public static final String BYTEDANCE_REPORT_TYPE_DAILY = "STAT_TIME_GRANULARITY_DAILY";
+    public static final String BYTEDANCE_REPORT_TYPE_HOURLY = "STAT_TIME_GRANULARITY_HOURLY";
+
 
 
 }
 }

+ 3 - 2
jeecg-boot-base-common/src/main/java/org/jeecg/common/system/base/controller/JeecgController.java

@@ -56,7 +56,8 @@ public class JeecgController<T extends JeecgEntity, S extends JeecgService<T>> {
 		ModelAndView mv = new ModelAndView(new JeecgEntityExcelView());
 		ModelAndView mv = new ModelAndView(new JeecgEntityExcelView());
 		List<T> pageList = service.list(queryWrapper);
 		List<T> pageList = service.list(queryWrapper);
 		// 导出文件名称
 		// 导出文件名称
-		mv.addObject(NormalExcelConstants.FILE_NAME, title); //此处设置的filename无效 ,前端会重更新设置一下
+        //此处设置的filename无效 ,前端会重更新设置一下
+        mv.addObject(NormalExcelConstants.FILE_NAME, title);
 		mv.addObject(NormalExcelConstants.CLASS, clazz);
 		mv.addObject(NormalExcelConstants.CLASS, clazz);
 		mv.addObject(NormalExcelConstants.PARAMS, new ExportParams(title + "报表", "导出人:"+sysUser.getRealname(), title + "表"));
 		mv.addObject(NormalExcelConstants.PARAMS, new ExportParams(title + "报表", "导出人:"+sysUser.getRealname(), title + "表"));
 		mv.addObject(NormalExcelConstants.DATA_LIST, pageList);
 		mv.addObject(NormalExcelConstants.DATA_LIST, pageList);
@@ -74,7 +75,7 @@ public class JeecgController<T extends JeecgEntity, S extends JeecgService<T>> {
 		MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
 		MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
 		Map<String, MultipartFile> fileMap = multipartRequest.getFileMap();
 		Map<String, MultipartFile> fileMap = multipartRequest.getFileMap();
 		for (Map.Entry<String, MultipartFile> entity : fileMap.entrySet()) {
 		for (Map.Entry<String, MultipartFile> entity : fileMap.entrySet()) {
-			MultipartFile file = entity.getValue();// 获取上传文件对象
+            MultipartFile file = entity.getValue();
 			ImportParams params = new ImportParams();
 			ImportParams params = new ImportParams();
 			params.setTitleRows(2);
 			params.setTitleRows(2);
 			params.setHeadRows(1);
 			params.setHeadRows(1);

+ 179 - 177
jeecg-boot-base-common/src/main/java/org/jeecg/common/system/controller/CommonController.java

@@ -40,181 +40,183 @@ import lombok.extern.slf4j.Slf4j;
 @RequestMapping("/sys/common")
 @RequestMapping("/sys/common")
 public class CommonController {
 public class CommonController {
 
 
-	@Value(value = "${jeecg.path.upload}")
-	private String uploadpath;
-
-	/**
-	 * @Author 政辉
-	 * @return
-	 */
-	@GetMapping("/403")
-	public Result<?> noauth()  {
-		return Result.error("没有权限,请联系管理员授权");
-	}
-	
-	@PostMapping(value = "/upload")
-	public Result<?> upload(HttpServletRequest request, HttpServletResponse response) {
-		Result<?> result = new Result<>();
-		try {
-			String ctxPath = uploadpath;
-			String fileName = null;
-			String bizPath = "files";
-			String nowday = new SimpleDateFormat("yyyyMMdd").format(new Date());
-			File file = new File(ctxPath + File.separator + bizPath + File.separator + nowday);
-			if (!file.exists()) {
-				file.mkdirs();// 创建文件根目录
-			}
-			MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
-			MultipartFile mf = multipartRequest.getFile("file");// 获取上传文件对象
-			String orgName = mf.getOriginalFilename();// 获取文件名
-			fileName = orgName.substring(0, orgName.lastIndexOf(".")) + "_" + System.currentTimeMillis() + orgName.substring(orgName.indexOf("."));
-			String savePath = file.getPath() + File.separator + fileName;
-			File savefile = new File(savePath);
-			FileCopyUtils.copy(mf.getBytes(), savefile);
-			String dbpath = bizPath + File.separator + nowday + File.separator + fileName;
-			if (dbpath.contains("\\")) {
-				dbpath = dbpath.replace("\\", "/");
-			}
-			result.setMessage(dbpath);
-			result.setSuccess(true);
-		} catch (IOException e) {
-			result.setSuccess(false);
-			result.setMessage(e.getMessage());
-			log.error(e.getMessage(), e);
-		}
-		return result;
-	}
-
-	/**
-	 * 预览图片
-	 * 请求地址:http://localhost:8080/common/view/{user/20190119/e1fe9925bc315c60addea1b98eb1cb1349547719_1547866868179.jpg}
-	 * 
-	 * @param request
-	 * @param response
-	 */
-	@GetMapping(value = "/view/**")
-	public void view(HttpServletRequest request, HttpServletResponse response) {
-		// ISO-8859-1 ==> UTF-8 进行编码转换
-		String imgPath = extractPathFromPattern(request);
-		// 其余处理略
-		InputStream inputStream = null;
-		OutputStream outputStream = null;
-		try {
-			imgPath = imgPath.replace("..", "");
-			if (imgPath.endsWith(",")) {
-				imgPath = imgPath.substring(0, imgPath.length() - 1);
-			}
-			response.setContentType("image/jpeg;charset=utf-8");
-			String localPath = uploadpath;
-			String imgurl = localPath + File.separator + imgPath;
-			inputStream = new BufferedInputStream(new FileInputStream(imgurl));
-			outputStream = response.getOutputStream();
-			byte[] buf = new byte[1024];
-			int len;
-			while ((len = inputStream.read(buf)) > 0) {
-				outputStream.write(buf, 0, len);
-			}
-			response.flushBuffer();
-		} catch (IOException e) {
-			log.error("预览图片失败" + e.getMessage());
-			// e.printStackTrace();
-		} finally {
-			if (inputStream != null) {
-				try {
-					inputStream.close();
-				} catch (IOException e) {
-					log.error(e.getMessage(), e);
-				}
-			}
-			if (outputStream != null) {
-				try {
-					outputStream.close();
-				} catch (IOException e) {
-					log.error(e.getMessage(), e);
-				}
-			}
-		}
-
-	}
-	
-	/**
-	 * 下载文件
-	 * 请求地址:http://localhost:8080/common/download/{user/20190119/e1fe9925bc315c60addea1b98eb1cb1349547719_1547866868179.jpg}
-	 * 
-	 * @param request
-	 * @param response
-	 * @throws Exception 
-	 */
-	@GetMapping(value = "/download/**")
-	public void download(HttpServletRequest request, HttpServletResponse response) throws Exception {
-		// ISO-8859-1 ==> UTF-8 进行编码转换
-		String filePath = extractPathFromPattern(request);
-		// 其余处理略
-		InputStream inputStream = null;
-		OutputStream outputStream = null;
-		try {
-			filePath = filePath.replace("..", "");
-			if (filePath.endsWith(",")) {
-				filePath = filePath.substring(0, filePath.length() - 1);
-			}
-			String localPath = uploadpath;
-			String downloadFilePath = localPath + File.separator + filePath;
-			File file = new File(downloadFilePath);
-	         if (file.exists()) {
-	        	 response.setContentType("application/force-download");// 设置强制下载不打开            
-	 			response.addHeader("Content-Disposition", "attachment;fileName=" + new String(file.getName().getBytes("UTF-8"),"iso-8859-1"));
-	 			inputStream = new BufferedInputStream(new FileInputStream(file));
-	 			outputStream = response.getOutputStream();
-	 			byte[] buf = new byte[1024];
-	 			int len;
-	 			while ((len = inputStream.read(buf)) > 0) {
-	 				outputStream.write(buf, 0, len);
-	 			}
-	 			response.flushBuffer();
-	         }
-			
-		} catch (Exception e) {
-			log.info("文件下载失败" + e.getMessage());
-			// e.printStackTrace();
-		} finally {
-			if (inputStream != null) {
-				try {
-					inputStream.close();
-				} catch (IOException e) {
-					e.printStackTrace();
-				}
-			}
-			if (outputStream != null) {
-				try {
-					outputStream.close();
-				} catch (IOException e) {
-					e.printStackTrace();
-				}
-			}
-		}
-
-	}
-	/**
-	 * @功能:pdf预览Iframe
-	 * @param modelAndView
-	 * @return
-	 */
-	@RequestMapping("/pdf/pdfPreviewIframe")
-	public ModelAndView pdfPreviewIframe(ModelAndView modelAndView) {
-		modelAndView.setViewName("pdfPreviewIframe");
-		return modelAndView;
-	}
-
-	/**
-	  *  把指定URL后的字符串全部截断当成参数 
-	  *  这么做是为了防止URL中包含中文或者特殊字符(/等)时,匹配不了的问题
-	 * @param request
-	 * @return
-	 */
-	private static String extractPathFromPattern(final HttpServletRequest request) {
-		String path = (String) request.getAttribute(HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE);
-		String bestMatchPattern = (String) request.getAttribute(HandlerMapping.BEST_MATCHING_PATTERN_ATTRIBUTE);
-		return new AntPathMatcher().extractPathWithinPattern(bestMatchPattern, path);
-	}
-	
+    @Value(value = "${jeecg.path.upload}")
+    private String uploadpath;
+
+    /**
+     * @return
+     * @Author 政辉
+     */
+    @GetMapping("/403")
+    public Result<?> noauth() {
+        return Result.error("没有权限,请联系管理员授权");
+    }
+
+    @PostMapping(value = "/upload")
+    public Result<?> upload(HttpServletRequest request, HttpServletResponse response) {
+        Result<?> result = new Result<>();
+        try {
+            String ctxPath = uploadpath;
+            String fileName = null;
+            String bizPath = "files";
+            String nowday = new SimpleDateFormat("yyyyMMdd").format(new Date());
+            File file = new File(ctxPath + File.separator + bizPath + File.separator + nowday);
+            if (!file.exists()) {
+                file.mkdirs();
+            }
+            MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
+            MultipartFile mf = multipartRequest.getFile("file");
+            // 获取文件名
+            String orgName = mf.getOriginalFilename();
+            fileName = orgName.substring(0, orgName.lastIndexOf(".")) + "_" + System.currentTimeMillis() + orgName.substring(orgName.indexOf("."));
+            String savePath = file.getPath() + File.separator + fileName;
+            File savefile = new File(savePath);
+            FileCopyUtils.copy(mf.getBytes(), savefile);
+            String dbpath = bizPath + File.separator + nowday + File.separator + fileName;
+            if (dbpath.contains("\\")) {
+                dbpath = dbpath.replace("\\", "/");
+            }
+            result.setMessage(dbpath);
+            result.setSuccess(true);
+        } catch (IOException e) {
+            result.setSuccess(false);
+            result.setMessage(e.getMessage());
+            log.error(e.getMessage(), e);
+        }
+        return result;
+    }
+
+    /**
+     * 预览图片
+     * 请求地址:http://localhost:8080/common/view/{user/20190119/e1fe9925bc315c60addea1b98eb1cb1349547719_1547866868179.jpg}
+     *
+     * @param request
+     * @param response
+     */
+    @GetMapping(value = "/view/**")
+    public void view(HttpServletRequest request, HttpServletResponse response) {
+        // ISO-8859-1 ==> UTF-8 进行编码转换
+        String imgPath = extractPathFromPattern(request);
+        // 其余处理略
+        InputStream inputStream = null;
+        OutputStream outputStream = null;
+        try {
+            imgPath = imgPath.replace("..", "");
+            if (imgPath.endsWith(",")) {
+                imgPath = imgPath.substring(0, imgPath.length() - 1);
+            }
+            response.setContentType("image/jpeg;charset=utf-8");
+            String localPath = uploadpath;
+            String imgurl = localPath + File.separator + imgPath;
+            inputStream = new BufferedInputStream(new FileInputStream(imgurl));
+            outputStream = response.getOutputStream();
+            byte[] buf = new byte[1024];
+            int len;
+            while ((len = inputStream.read(buf)) > 0) {
+                outputStream.write(buf, 0, len);
+            }
+            response.flushBuffer();
+        } catch (IOException e) {
+            log.error("预览图片失败" + e.getMessage());
+        } finally {
+            if (inputStream != null) {
+                try {
+                    inputStream.close();
+                } catch (IOException e) {
+                    log.error(e.getMessage(), e);
+                }
+            }
+            if (outputStream != null) {
+                try {
+                    outputStream.close();
+                } catch (IOException e) {
+                    log.error(e.getMessage(), e);
+                }
+            }
+        }
+
+    }
+
+    /**
+     * 下载文件
+     * 请求地址:http://localhost:8080/common/download/{user/20190119/e1fe9925bc315c60addea1b98eb1cb1349547719_1547866868179.jpg}
+     *
+     * @param request
+     * @param response
+     * @throws Exception
+     */
+    @GetMapping(value = "/download/**")
+    public void download(HttpServletRequest request, HttpServletResponse response) throws Exception {
+        // ISO-8859-1 ==> UTF-8 进行编码转换
+        String filePath = extractPathFromPattern(request);
+        // 其余处理略
+        InputStream inputStream = null;
+        OutputStream outputStream = null;
+        try {
+            filePath = filePath.replace("..", "");
+            if (filePath.endsWith(",")) {
+                filePath = filePath.substring(0, filePath.length() - 1);
+            }
+            String localPath = uploadpath;
+            String downloadFilePath = localPath + File.separator + filePath;
+            File file = new File(downloadFilePath);
+            if (file.exists()) {
+                // 设置强制下载不打开      
+                response.setContentType("application/force-download");
+                response.addHeader("Content-Disposition", "attachment;fileName=" + new String(file.getName().getBytes("UTF-8"), "iso-8859-1"));
+                inputStream = new BufferedInputStream(new FileInputStream(file));
+                outputStream = response.getOutputStream();
+                byte[] buf = new byte[1024];
+                int len;
+                while ((len = inputStream.read(buf)) > 0) {
+                    outputStream.write(buf, 0, len);
+                }
+                response.flushBuffer();
+            }
+
+        } catch (Exception e) {
+            log.info("文件下载失败" + e.getMessage());
+        } finally {
+            if (inputStream != null) {
+                try {
+                    inputStream.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+            if (outputStream != null) {
+                try {
+                    outputStream.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+
+    }
+
+    /**
+     * @param modelAndView
+     * @return
+     * @功能:pdf预览Iframe
+     */
+    @RequestMapping("/pdf/pdfPreviewIframe")
+    public ModelAndView pdfPreviewIframe(ModelAndView modelAndView) {
+        modelAndView.setViewName("pdfPreviewIframe");
+        return modelAndView;
+    }
+
+    /**
+     * 把指定URL后的字符串全部截断当成参数
+     * 这么做是为了防止URL中包含中文或者特殊字符(/等)时,匹配不了的问题
+     *
+     * @param request
+     * @return
+     */
+    private static String extractPathFromPattern(final HttpServletRequest request) {
+        String path = (String) request.getAttribute(HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE);
+        String bestMatchPattern = (String) request.getAttribute(HandlerMapping.BEST_MATCHING_PATTERN_ATTRIBUTE);
+        return new AntPathMatcher().extractPathWithinPattern(bestMatchPattern, path);
+    }
+
 }
 }

+ 4 - 2
jeecg-boot-base-common/src/main/java/org/jeecg/common/system/util/JeecgDataAutorUtils.java

@@ -33,7 +33,8 @@ public class JeecgDataAutorUtils {
 	 */
 	 */
 	public static synchronized void installDataSearchConditon(HttpServletRequest request, List<SysPermissionDataRule> dataRules) {
 	public static synchronized void installDataSearchConditon(HttpServletRequest request, List<SysPermissionDataRule> dataRules) {
 		@SuppressWarnings("unchecked")
 		@SuppressWarnings("unchecked")
-		List<SysPermissionDataRule> list = (List<SysPermissionDataRule>)loadDataSearchConditon();// 1.先从request获取MENU_DATA_AUTHOR_RULES,如果存则获取到LIST
+        // 1.先从request获取MENU_DATA_AUTHOR_RULES,如果存则获取到LIST
+                List<SysPermissionDataRule> list = (List<SysPermissionDataRule>) loadDataSearchConditon();
 		if (list==null) {
 		if (list==null) {
 			// 2.如果不存在,则new一个list
 			// 2.如果不存在,则new一个list
 			list = new ArrayList<SysPermissionDataRule>();
 			list = new ArrayList<SysPermissionDataRule>();
@@ -41,7 +42,8 @@ public class JeecgDataAutorUtils {
 		for (SysPermissionDataRule tsDataRule : dataRules) {
 		for (SysPermissionDataRule tsDataRule : dataRules) {
 			list.add(tsDataRule);
 			list.add(tsDataRule);
 		}
 		}
-		request.setAttribute(MENU_DATA_AUTHOR_RULES, list); // 3.往list里面增量存指
+        // 3.往list里面增量存指
+        request.setAttribute(MENU_DATA_AUTHOR_RULES, list);
 	}
 	}
 
 
 	/**
 	/**

+ 4 - 2
jeecg-boot-base-common/src/main/java/org/jeecg/common/util/BrowserUtils.java

@@ -13,8 +13,10 @@ import javax.servlet.http.HttpServletRequest;
  * 
  * 
  */
  */
 public class BrowserUtils {
 public class BrowserUtils {
-	
-	// 判断是否是IE
+
+    /**
+     * 判断是否是IE
+     */
     public static boolean isIe(HttpServletRequest request) {
     public static boolean isIe(HttpServletRequest request) {
 		return (request.getHeader("USER-AGENT").toLowerCase().indexOf("msie") > 0 || request
 		return (request.getHeader("USER-AGENT").toLowerCase().indexOf("msie") > 0 || request
 				.getHeader("USER-AGENT").toLowerCase().indexOf("rv:11.0") > 0) ? true
 				.getHeader("USER-AGENT").toLowerCase().indexOf("rv:11.0") > 0) ? true

+ 2 - 2
jeecg-boot-base-common/src/main/java/org/jeecg/common/util/PasswordUtil.java

@@ -17,8 +17,8 @@ public class PasswordUtil {
 	/**
 	/**
 	 * 定义使用的算法为:PBEWITHMD5andDES算法
 	 * 定义使用的算法为:PBEWITHMD5andDES算法
 	 */
 	 */
-	public static final String ALGORITHM = "PBEWithMD5AndDES";//加密算法
-    public static final String SALT = "63293188";//密钥
+    public static final String ALGORITHM = "PBEWithMD5AndDES";
+    public static final String SALT = "63293188";
 
 
 	/**
 	/**
 	 * 定义迭代次数为1000次
 	 * 定义迭代次数为1000次

+ 6 - 3
jeecg-boot-base-common/src/main/java/org/jeecg/common/util/SqlInjectionUtil.java

@@ -21,7 +21,8 @@ public class SqlInjectionUtil {
 		if (value == null || "".equals(value)) {
 		if (value == null || "".equals(value)) {
 			return;
 			return;
 		}
 		}
-		value = value.toLowerCase();// 统一转为小写
+        // 统一转为小写
+        value = value.toLowerCase();
         String[] xssArr = XSS_STR.split("\\|");
         String[] xssArr = XSS_STR.split("\\|");
 		for (int i = 0; i < xssArr.length; i++) {
 		for (int i = 0; i < xssArr.length; i++) {
 			if (value.indexOf(xssArr[i]) > -1) {
 			if (value.indexOf(xssArr[i]) > -1) {
@@ -44,7 +45,8 @@ public class SqlInjectionUtil {
 			if (value == null || "".equals(value)) {
 			if (value == null || "".equals(value)) {
 				return;
 				return;
 			}
 			}
-			value = value.toLowerCase();// 统一转为小写
+            // 统一转为小写
+            value = value.toLowerCase();
 			for (int i = 0; i < xssArr.length; i++) {
 			for (int i = 0; i < xssArr.length; i++) {
 				if (value.indexOf(xssArr[i]) > -1) {
 				if (value.indexOf(xssArr[i]) > -1) {
 					log.error("请注意,值可能存在SQL注入风险!---> {}", value);
 					log.error("请注意,值可能存在SQL注入风险!---> {}", value);
@@ -67,7 +69,8 @@ public class SqlInjectionUtil {
 		if (value == null || "".equals(value)) {
 		if (value == null || "".equals(value)) {
 			return;
 			return;
 		}
 		}
-		value = value.toLowerCase();// 统一转为小写
+        // 统一转为小写
+        value = value.toLowerCase();
 		for (int i = 0; i < xssArr.length; i++) {
 		for (int i = 0; i < xssArr.length; i++) {
 			if (value.indexOf(xssArr[i]) > -1) {
 			if (value.indexOf(xssArr[i]) > -1) {
 				log.error("请注意,值可能存在SQL注入风险!---> {}", value);
 				log.error("请注意,值可能存在SQL注入风险!---> {}", value);

+ 8 - 2
jeecg-boot-base-common/src/main/java/org/jeecg/common/util/encryption/EncryptedString.java

@@ -6,7 +6,13 @@ import lombok.Data;
 @Data
 @Data
 public class  EncryptedString {
 public class  EncryptedString {
 
 
-    public static  String key = "1234567890adbcde";//长度为16个字符
+    /**
+     * 长度为16个字符
+     */
+    public static String key = "1234567890adbcde";
 
 
-    public static  String iv  = "1234567890hjlkew";//长度为16个字符
+    /**
+     * 长度为16个字符
+     */
+    public static String iv = "1234567890hjlkew";
 }
 }

+ 12 - 4
jeecg-boot-base-common/src/main/java/org/jeecg/common/util/jsonschema/validate/TreeSelectProperty.java

@@ -15,10 +15,18 @@ import com.alibaba.fastjson.JSONObject;
 public class TreeSelectProperty extends CommonProperty {
 public class TreeSelectProperty extends CommonProperty {
 	
 	
 	private static final long serialVersionUID = 3786503639885610767L;
 	private static final long serialVersionUID = 3786503639885610767L;
-	
-	private String dict;//表名,文本,id
-	private String pidField;//父级字段 默认pid
-	private String pidValue;//父级节点的值 暂时没用到 默认为0
+    /**
+     * 表名,文本,id
+     */
+    private String dict;
+    /**
+     * 父级字段 默认pid
+     */
+    private String pidField;
+    /**
+     * 父级节点的值 暂时没用到 默认为0
+     */
+    private String pidValue;
 	private String hasChildField;
 	private String hasChildField;
 	
 	
 	public String getDict() {
 	public String getDict() {

+ 16 - 8
jeecg-boot-module-system/src/main/java/org/jeecg/JeecgOneToMainUtil.java

@@ -22,19 +22,27 @@ public class JeecgOneToMainUtil {
 	public static void main(String[] args) {
 	public static void main(String[] args) {
 		//第一步:设置主表配置
 		//第一步:设置主表配置
 		MainTableVo mainTable = new MainTableVo();
 		MainTableVo mainTable = new MainTableVo();
-        mainTable.setTableName("sys_category");//表名
-        mainTable.setEntityName("Category");     //实体名
-        mainTable.setEntityPackage("ctop");     //包名
-        mainTable.setFtlDescription("主分类信息");     //描述
+        //表名
+        mainTable.setTableName("sys_category");
+        //实体名
+        mainTable.setEntityName("Category");
+        //包名
+        mainTable.setEntityPackage("ctop");
+        //描述
+        mainTable.setFtlDescription("主分类信息");
 		
 		
 		//第二步:设置子表集合配置
 		//第二步:设置子表集合配置
 		List<SubTableVo> subTables = new ArrayList<SubTableVo>();
 		List<SubTableVo> subTables = new ArrayList<SubTableVo>();
 		//[1].子表一
 		//[1].子表一
 		SubTableVo po = new SubTableVo();
 		SubTableVo po = new SubTableVo();
-        po.setTableName("sys_category");//表名
-        po.setEntityName("Category");        //实体名
-        po.setEntityPackage("ctop");            //包名
-        po.setFtlDescription("子分类信息");       //描述
+        //表名
+        po.setTableName("sys_category");
+        //实体名
+        po.setEntityName("Category");
+        //包名
+        po.setEntityPackage("ctop");
+        //描述
+        po.setFtlDescription("子分类信息");
 		//子表外键参数配置
 		//子表外键参数配置
 		/*说明: 
 		/*说明: 
 		 * a) 子表引用主表主键ID作为外键,外键字段必须以_ID结尾;
 		 * a) 子表引用主表主键ID作为外键,外键字段必须以_ID结尾;

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

@@ -222,7 +222,7 @@ public class ByteDanceImageInfoController {
         MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
         MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
         Map<String, MultipartFile> fileMap = multipartRequest.getFileMap();
         Map<String, MultipartFile> fileMap = multipartRequest.getFileMap();
         for (Map.Entry<String, MultipartFile> entity : fileMap.entrySet()) {
         for (Map.Entry<String, MultipartFile> entity : fileMap.entrySet()) {
-            MultipartFile file = entity.getValue();// 获取上传文件对象
+            MultipartFile file = entity.getValue();
             ImportParams params = new ImportParams();
             ImportParams params = new ImportParams();
             params.setTitleRows(2);
             params.setTitleRows(2);
             params.setHeadRows(1);
             params.setHeadRows(1);

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

@@ -222,7 +222,7 @@ public class ByteDanceUserOrientationTemplateController {
         MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
         MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
         Map<String, MultipartFile> fileMap = multipartRequest.getFileMap();
         Map<String, MultipartFile> fileMap = multipartRequest.getFileMap();
         for (Map.Entry<String, MultipartFile> entity : fileMap.entrySet()) {
         for (Map.Entry<String, MultipartFile> entity : fileMap.entrySet()) {
-            MultipartFile file = entity.getValue();// 获取上传文件对象
+            MultipartFile file = entity.getValue();
             ImportParams params = new ImportParams();
             ImportParams params = new ImportParams();
             params.setTitleRows(2);
             params.setTitleRows(2);
             params.setHeadRows(1);
             params.setHeadRows(1);

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

@@ -0,0 +1,253 @@
+package org.jeecg.modules.ctop.controller;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.net.URLDecoder;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.common.system.query.QueryGenerator;
+import org.jeecg.common.aspect.annotation.AutoLog;
+import org.jeecg.common.util.oConvertUtils;
+import org.jeecg.modules.ctop.entity.BytedanceAdvertiserDailyReport;
+import org.jeecg.modules.ctop.service.IBytedanceAdvertiserDailyReportService;
+
+import java.util.Date;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import lombok.extern.slf4j.Slf4j;
+
+import org.jeecgframework.poi.excel.ExcelImportUtil;
+import org.jeecgframework.poi.excel.def.NormalExcelConstants;
+import org.jeecgframework.poi.excel.entity.ExportParams;
+import org.jeecgframework.poi.excel.entity.ImportParams;
+import org.jeecgframework.poi.excel.view.JeecgEntityExcelView;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.multipart.MultipartHttpServletRequest;
+import org.springframework.web.servlet.ModelAndView;
+import com.alibaba.fastjson.JSON;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+
+/**
+ * @Description: 广告主日报表
+ * @Author: jeecg-boot
+ * @Date: 2019-09-10
+ * @Version: V1.0
+ */
+@Slf4j
+@Api(tags = "广告主日报表")
+@RestController
+@RequestMapping("/ctop/bytedanceAdvertiserDailyReport")
+public class BytedanceAdvertiserDailyReportController {
+    @Autowired
+    private IBytedanceAdvertiserDailyReportService bytedanceAdvertiserDailyReportService;
+
+    /**
+     * 分页列表查询
+     *
+     * @param bytedanceAdvertiserDailyReport
+     * @param pageNo
+     * @param pageSize
+     * @param req
+     * @return
+     */
+    @AutoLog(value = "广告主日报表-分页列表查询")
+    @ApiOperation(value = "广告主日报表-分页列表查询", notes = "广告主日报表-分页列表查询")
+    @GetMapping(value = "/list")
+    public Result<IPage<BytedanceAdvertiserDailyReport>> queryPageList(BytedanceAdvertiserDailyReport bytedanceAdvertiserDailyReport,
+                                                                       @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
+                                                                       @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
+                                                                       HttpServletRequest req) {
+        Result<IPage<BytedanceAdvertiserDailyReport>> result = new Result<IPage<BytedanceAdvertiserDailyReport>>();
+        QueryWrapper<BytedanceAdvertiserDailyReport> queryWrapper = QueryGenerator.initQueryWrapper(bytedanceAdvertiserDailyReport, req.getParameterMap());
+        Page<BytedanceAdvertiserDailyReport> page = new Page<BytedanceAdvertiserDailyReport>(pageNo, pageSize);
+        IPage<BytedanceAdvertiserDailyReport> pageList = bytedanceAdvertiserDailyReportService.page(page, queryWrapper);
+        result.setSuccess(true);
+        result.setResult(pageList);
+        return result;
+    }
+
+    /**
+     * 添加
+     *
+     * @param bytedanceAdvertiserDailyReport
+     * @return
+     */
+    @AutoLog(value = "广告主日报表-添加")
+    @ApiOperation(value = "广告主日报表-添加", notes = "广告主日报表-添加")
+    @PostMapping(value = "/add")
+    public Result<BytedanceAdvertiserDailyReport> add(@RequestBody BytedanceAdvertiserDailyReport bytedanceAdvertiserDailyReport) {
+        Result<BytedanceAdvertiserDailyReport> result = new Result<BytedanceAdvertiserDailyReport>();
+        try {
+            bytedanceAdvertiserDailyReportService.save(bytedanceAdvertiserDailyReport);
+            result.success("添加成功!");
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+            result.error500("操作失败");
+        }
+        return result;
+    }
+
+    /**
+     * 编辑
+     *
+     * @param bytedanceAdvertiserDailyReport
+     * @return
+     */
+    @AutoLog(value = "广告主日报表-编辑")
+    @ApiOperation(value = "广告主日报表-编辑", notes = "广告主日报表-编辑")
+    @PutMapping(value = "/edit")
+    public Result<BytedanceAdvertiserDailyReport> edit(@RequestBody BytedanceAdvertiserDailyReport bytedanceAdvertiserDailyReport) {
+        Result<BytedanceAdvertiserDailyReport> result = new Result<BytedanceAdvertiserDailyReport>();
+        BytedanceAdvertiserDailyReport bytedanceAdvertiserDailyReportEntity = bytedanceAdvertiserDailyReportService.getById(bytedanceAdvertiserDailyReport.getId());
+        if (bytedanceAdvertiserDailyReportEntity == null) {
+            result.error500("未找到对应实体");
+        } else {
+            boolean ok = bytedanceAdvertiserDailyReportService.updateById(bytedanceAdvertiserDailyReport);
+            //TODO 返回false说明什么?
+            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 {
+            bytedanceAdvertiserDailyReportService.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<BytedanceAdvertiserDailyReport> deleteBatch(@RequestParam(name = "ids", required = true) String ids) {
+        Result<BytedanceAdvertiserDailyReport> result = new Result<BytedanceAdvertiserDailyReport>();
+        if (ids == null || "".equals(ids.trim())) {
+            result.error500("参数不识别!");
+        } else {
+            this.bytedanceAdvertiserDailyReportService.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<BytedanceAdvertiserDailyReport> queryById(@RequestParam(name = "id", required = true) String id) {
+        Result<BytedanceAdvertiserDailyReport> result = new Result<BytedanceAdvertiserDailyReport>();
+        BytedanceAdvertiserDailyReport bytedanceAdvertiserDailyReport = bytedanceAdvertiserDailyReportService.getById(id);
+        if (bytedanceAdvertiserDailyReport == null) {
+            result.error500("未找到对应实体");
+        } else {
+            result.setResult(bytedanceAdvertiserDailyReport);
+            result.setSuccess(true);
+        }
+        return result;
+    }
+
+    /**
+     * 导出excel
+     *
+     * @param request
+     * @param response
+     */
+    @RequestMapping(value = "/exportXls")
+    public ModelAndView exportXls(HttpServletRequest request, HttpServletResponse response) {
+        // Step.1 组装查询条件
+        QueryWrapper<BytedanceAdvertiserDailyReport> queryWrapper = null;
+        try {
+            String paramsStr = request.getParameter("paramsStr");
+            if (oConvertUtils.isNotEmpty(paramsStr)) {
+                String deString = URLDecoder.decode(paramsStr, "UTF-8");
+                BytedanceAdvertiserDailyReport bytedanceAdvertiserDailyReport = JSON.parseObject(deString, BytedanceAdvertiserDailyReport.class);
+                queryWrapper = QueryGenerator.initQueryWrapper(bytedanceAdvertiserDailyReport, request.getParameterMap());
+            }
+        } catch (UnsupportedEncodingException e) {
+            e.printStackTrace();
+        }
+
+        //Step.2 AutoPoi 导出Excel
+        ModelAndView mv = new ModelAndView(new JeecgEntityExcelView());
+        List<BytedanceAdvertiserDailyReport> pageList = bytedanceAdvertiserDailyReportService.list(queryWrapper);
+        //导出文件名称
+        mv.addObject(NormalExcelConstants.FILE_NAME, "广告主日报表列表");
+        mv.addObject(NormalExcelConstants.CLASS, BytedanceAdvertiserDailyReport.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<BytedanceAdvertiserDailyReport> listBytedanceAdvertiserDailyReports = ExcelImportUtil.importExcel(file.getInputStream(), BytedanceAdvertiserDailyReport.class, params);
+                bytedanceAdvertiserDailyReportService.saveBatch(listBytedanceAdvertiserDailyReports);
+                return Result.ok("文件导入成功!数据行数:" + listBytedanceAdvertiserDailyReports.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("文件导入失败!");
+    }
+
+}

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

@@ -0,0 +1,253 @@
+package org.jeecg.modules.ctop.controller;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.net.URLDecoder;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.common.system.query.QueryGenerator;
+import org.jeecg.common.aspect.annotation.AutoLog;
+import org.jeecg.common.util.oConvertUtils;
+import org.jeecg.modules.ctop.entity.BytedanceAdvertiserHourlyReport;
+import org.jeecg.modules.ctop.service.IBytedanceAdvertiserHourlyReportService;
+
+import java.util.Date;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import lombok.extern.slf4j.Slf4j;
+
+import org.jeecgframework.poi.excel.ExcelImportUtil;
+import org.jeecgframework.poi.excel.def.NormalExcelConstants;
+import org.jeecgframework.poi.excel.entity.ExportParams;
+import org.jeecgframework.poi.excel.entity.ImportParams;
+import org.jeecgframework.poi.excel.view.JeecgEntityExcelView;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.multipart.MultipartHttpServletRequest;
+import org.springframework.web.servlet.ModelAndView;
+import com.alibaba.fastjson.JSON;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+
+/**
+ * @Description: 广告主小时级别报表信息
+ * @Author: jeecg-boot
+ * @Date: 2019-09-10
+ * @Version: V1.0
+ */
+@Slf4j
+@Api(tags = "广告主小时级别报表信息")
+@RestController
+@RequestMapping("/ctop/bytedanceAdvertiserHourlyReport")
+public class BytedanceAdvertiserHourlyReportController {
+    @Autowired
+    private IBytedanceAdvertiserHourlyReportService bytedanceAdvertiserHourlyReportService;
+
+    /**
+     * 分页列表查询
+     *
+     * @param bytedanceAdvertiserHourlyReport
+     * @param pageNo
+     * @param pageSize
+     * @param req
+     * @return
+     */
+    @AutoLog(value = "广告主小时级别报表信息-分页列表查询")
+    @ApiOperation(value = "广告主小时级别报表信息-分页列表查询", notes = "广告主小时级别报表信息-分页列表查询")
+    @GetMapping(value = "/list")
+    public Result<IPage<BytedanceAdvertiserHourlyReport>> queryPageList(BytedanceAdvertiserHourlyReport bytedanceAdvertiserHourlyReport,
+                                                                        @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
+                                                                        @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
+                                                                        HttpServletRequest req) {
+        Result<IPage<BytedanceAdvertiserHourlyReport>> result = new Result<IPage<BytedanceAdvertiserHourlyReport>>();
+        QueryWrapper<BytedanceAdvertiserHourlyReport> queryWrapper = QueryGenerator.initQueryWrapper(bytedanceAdvertiserHourlyReport, req.getParameterMap());
+        Page<BytedanceAdvertiserHourlyReport> page = new Page<BytedanceAdvertiserHourlyReport>(pageNo, pageSize);
+        IPage<BytedanceAdvertiserHourlyReport> pageList = bytedanceAdvertiserHourlyReportService.page(page, queryWrapper);
+        result.setSuccess(true);
+        result.setResult(pageList);
+        return result;
+    }
+
+    /**
+     * 添加
+     *
+     * @param bytedanceAdvertiserHourlyReport
+     * @return
+     */
+    @AutoLog(value = "广告主小时级别报表信息-添加")
+    @ApiOperation(value = "广告主小时级别报表信息-添加", notes = "广告主小时级别报表信息-添加")
+    @PostMapping(value = "/add")
+    public Result<BytedanceAdvertiserHourlyReport> add(@RequestBody BytedanceAdvertiserHourlyReport bytedanceAdvertiserHourlyReport) {
+        Result<BytedanceAdvertiserHourlyReport> result = new Result<BytedanceAdvertiserHourlyReport>();
+        try {
+            bytedanceAdvertiserHourlyReportService.save(bytedanceAdvertiserHourlyReport);
+            result.success("添加成功!");
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+            result.error500("操作失败");
+        }
+        return result;
+    }
+
+    /**
+     * 编辑
+     *
+     * @param bytedanceAdvertiserHourlyReport
+     * @return
+     */
+    @AutoLog(value = "广告主小时级别报表信息-编辑")
+    @ApiOperation(value = "广告主小时级别报表信息-编辑", notes = "广告主小时级别报表信息-编辑")
+    @PutMapping(value = "/edit")
+    public Result<BytedanceAdvertiserHourlyReport> edit(@RequestBody BytedanceAdvertiserHourlyReport bytedanceAdvertiserHourlyReport) {
+        Result<BytedanceAdvertiserHourlyReport> result = new Result<BytedanceAdvertiserHourlyReport>();
+        BytedanceAdvertiserHourlyReport bytedanceAdvertiserHourlyReportEntity = bytedanceAdvertiserHourlyReportService.getById(bytedanceAdvertiserHourlyReport.getId());
+        if (bytedanceAdvertiserHourlyReportEntity == null) {
+            result.error500("未找到对应实体");
+        } else {
+            boolean ok = bytedanceAdvertiserHourlyReportService.updateById(bytedanceAdvertiserHourlyReport);
+            //TODO 返回false说明什么?
+            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 {
+            bytedanceAdvertiserHourlyReportService.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<BytedanceAdvertiserHourlyReport> deleteBatch(@RequestParam(name = "ids", required = true) String ids) {
+        Result<BytedanceAdvertiserHourlyReport> result = new Result<BytedanceAdvertiserHourlyReport>();
+        if (ids == null || "".equals(ids.trim())) {
+            result.error500("参数不识别!");
+        } else {
+            this.bytedanceAdvertiserHourlyReportService.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<BytedanceAdvertiserHourlyReport> queryById(@RequestParam(name = "id", required = true) String id) {
+        Result<BytedanceAdvertiserHourlyReport> result = new Result<BytedanceAdvertiserHourlyReport>();
+        BytedanceAdvertiserHourlyReport bytedanceAdvertiserHourlyReport = bytedanceAdvertiserHourlyReportService.getById(id);
+        if (bytedanceAdvertiserHourlyReport == null) {
+            result.error500("未找到对应实体");
+        } else {
+            result.setResult(bytedanceAdvertiserHourlyReport);
+            result.setSuccess(true);
+        }
+        return result;
+    }
+
+    /**
+     * 导出excel
+     *
+     * @param request
+     * @param response
+     */
+    @RequestMapping(value = "/exportXls")
+    public ModelAndView exportXls(HttpServletRequest request, HttpServletResponse response) {
+        // Step.1 组装查询条件
+        QueryWrapper<BytedanceAdvertiserHourlyReport> queryWrapper = null;
+        try {
+            String paramsStr = request.getParameter("paramsStr");
+            if (oConvertUtils.isNotEmpty(paramsStr)) {
+                String deString = URLDecoder.decode(paramsStr, "UTF-8");
+                BytedanceAdvertiserHourlyReport bytedanceAdvertiserHourlyReport = JSON.parseObject(deString, BytedanceAdvertiserHourlyReport.class);
+                queryWrapper = QueryGenerator.initQueryWrapper(bytedanceAdvertiserHourlyReport, request.getParameterMap());
+            }
+        } catch (UnsupportedEncodingException e) {
+            e.printStackTrace();
+        }
+
+        //Step.2 AutoPoi 导出Excel
+        ModelAndView mv = new ModelAndView(new JeecgEntityExcelView());
+        List<BytedanceAdvertiserHourlyReport> pageList = bytedanceAdvertiserHourlyReportService.list(queryWrapper);
+        //导出文件名称
+        mv.addObject(NormalExcelConstants.FILE_NAME, "广告主小时级别报表信息列表");
+        mv.addObject(NormalExcelConstants.CLASS, BytedanceAdvertiserHourlyReport.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<BytedanceAdvertiserHourlyReport> listBytedanceAdvertiserHourlyReports = ExcelImportUtil.importExcel(file.getInputStream(), BytedanceAdvertiserHourlyReport.class, params);
+                bytedanceAdvertiserHourlyReportService.saveBatch(listBytedanceAdvertiserHourlyReports);
+                return Result.ok("文件导入成功!数据行数:" + listBytedanceAdvertiserHourlyReports.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("文件导入失败!");
+    }
+
+}

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

@@ -0,0 +1,253 @@
+package org.jeecg.modules.ctop.controller;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.net.URLDecoder;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.common.system.query.QueryGenerator;
+import org.jeecg.common.aspect.annotation.AutoLog;
+import org.jeecg.common.util.oConvertUtils;
+import org.jeecg.modules.ctop.entity.BytedanceCampaignDailyReport;
+import org.jeecg.modules.ctop.service.IBytedanceCampaignDailyReportService;
+
+import java.util.Date;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import lombok.extern.slf4j.Slf4j;
+
+import org.jeecgframework.poi.excel.ExcelImportUtil;
+import org.jeecgframework.poi.excel.def.NormalExcelConstants;
+import org.jeecgframework.poi.excel.entity.ExportParams;
+import org.jeecgframework.poi.excel.entity.ImportParams;
+import org.jeecgframework.poi.excel.view.JeecgEntityExcelView;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.multipart.MultipartHttpServletRequest;
+import org.springframework.web.servlet.ModelAndView;
+import com.alibaba.fastjson.JSON;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+
+/**
+ * @Description: 广告组日报表信息
+ * @Author: jeecg-boot
+ * @Date: 2019-09-11
+ * @Version: V1.0
+ */
+@Slf4j
+@Api(tags = "广告组日报表信息")
+@RestController
+@RequestMapping("/ctop/bytedanceCampaignDailyReport")
+public class BytedanceCampaignDailyReportController {
+    @Autowired
+    private IBytedanceCampaignDailyReportService bytedanceCampaignDailyReportService;
+
+    /**
+     * 分页列表查询
+     *
+     * @param bytedanceCampaignDailyReport
+     * @param pageNo
+     * @param pageSize
+     * @param req
+     * @return
+     */
+    @AutoLog(value = "广告组日报表信息-分页列表查询")
+    @ApiOperation(value = "广告组日报表信息-分页列表查询", notes = "广告组日报表信息-分页列表查询")
+    @GetMapping(value = "/list")
+    public Result<IPage<BytedanceCampaignDailyReport>> queryPageList(BytedanceCampaignDailyReport bytedanceCampaignDailyReport,
+                                                                     @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
+                                                                     @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
+                                                                     HttpServletRequest req) {
+        Result<IPage<BytedanceCampaignDailyReport>> result = new Result<IPage<BytedanceCampaignDailyReport>>();
+        QueryWrapper<BytedanceCampaignDailyReport> queryWrapper = QueryGenerator.initQueryWrapper(bytedanceCampaignDailyReport, req.getParameterMap());
+        Page<BytedanceCampaignDailyReport> page = new Page<BytedanceCampaignDailyReport>(pageNo, pageSize);
+        IPage<BytedanceCampaignDailyReport> pageList = bytedanceCampaignDailyReportService.page(page, queryWrapper);
+        result.setSuccess(true);
+        result.setResult(pageList);
+        return result;
+    }
+
+    /**
+     * 添加
+     *
+     * @param bytedanceCampaignDailyReport
+     * @return
+     */
+    @AutoLog(value = "广告组日报表信息-添加")
+    @ApiOperation(value = "广告组日报表信息-添加", notes = "广告组日报表信息-添加")
+    @PostMapping(value = "/add")
+    public Result<BytedanceCampaignDailyReport> add(@RequestBody BytedanceCampaignDailyReport bytedanceCampaignDailyReport) {
+        Result<BytedanceCampaignDailyReport> result = new Result<BytedanceCampaignDailyReport>();
+        try {
+            bytedanceCampaignDailyReportService.save(bytedanceCampaignDailyReport);
+            result.success("添加成功!");
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+            result.error500("操作失败");
+        }
+        return result;
+    }
+
+    /**
+     * 编辑
+     *
+     * @param bytedanceCampaignDailyReport
+     * @return
+     */
+    @AutoLog(value = "广告组日报表信息-编辑")
+    @ApiOperation(value = "广告组日报表信息-编辑", notes = "广告组日报表信息-编辑")
+    @PutMapping(value = "/edit")
+    public Result<BytedanceCampaignDailyReport> edit(@RequestBody BytedanceCampaignDailyReport bytedanceCampaignDailyReport) {
+        Result<BytedanceCampaignDailyReport> result = new Result<BytedanceCampaignDailyReport>();
+        BytedanceCampaignDailyReport bytedanceCampaignDailyReportEntity = bytedanceCampaignDailyReportService.getById(bytedanceCampaignDailyReport.getId());
+        if (bytedanceCampaignDailyReportEntity == null) {
+            result.error500("未找到对应实体");
+        } else {
+            boolean ok = bytedanceCampaignDailyReportService.updateById(bytedanceCampaignDailyReport);
+            //TODO 返回false说明什么?
+            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 {
+            bytedanceCampaignDailyReportService.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<BytedanceCampaignDailyReport> deleteBatch(@RequestParam(name = "ids", required = true) String ids) {
+        Result<BytedanceCampaignDailyReport> result = new Result<BytedanceCampaignDailyReport>();
+        if (ids == null || "".equals(ids.trim())) {
+            result.error500("参数不识别!");
+        } else {
+            this.bytedanceCampaignDailyReportService.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<BytedanceCampaignDailyReport> queryById(@RequestParam(name = "id", required = true) String id) {
+        Result<BytedanceCampaignDailyReport> result = new Result<BytedanceCampaignDailyReport>();
+        BytedanceCampaignDailyReport bytedanceCampaignDailyReport = bytedanceCampaignDailyReportService.getById(id);
+        if (bytedanceCampaignDailyReport == null) {
+            result.error500("未找到对应实体");
+        } else {
+            result.setResult(bytedanceCampaignDailyReport);
+            result.setSuccess(true);
+        }
+        return result;
+    }
+
+    /**
+     * 导出excel
+     *
+     * @param request
+     * @param response
+     */
+    @RequestMapping(value = "/exportXls")
+    public ModelAndView exportXls(HttpServletRequest request, HttpServletResponse response) {
+        // Step.1 组装查询条件
+        QueryWrapper<BytedanceCampaignDailyReport> queryWrapper = null;
+        try {
+            String paramsStr = request.getParameter("paramsStr");
+            if (oConvertUtils.isNotEmpty(paramsStr)) {
+                String deString = URLDecoder.decode(paramsStr, "UTF-8");
+                BytedanceCampaignDailyReport bytedanceCampaignDailyReport = JSON.parseObject(deString, BytedanceCampaignDailyReport.class);
+                queryWrapper = QueryGenerator.initQueryWrapper(bytedanceCampaignDailyReport, request.getParameterMap());
+            }
+        } catch (UnsupportedEncodingException e) {
+            e.printStackTrace();
+        }
+
+        //Step.2 AutoPoi 导出Excel
+        ModelAndView mv = new ModelAndView(new JeecgEntityExcelView());
+        List<BytedanceCampaignDailyReport> pageList = bytedanceCampaignDailyReportService.list(queryWrapper);
+        //导出文件名称
+        mv.addObject(NormalExcelConstants.FILE_NAME, "广告组日报表信息列表");
+        mv.addObject(NormalExcelConstants.CLASS, BytedanceCampaignDailyReport.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<BytedanceCampaignDailyReport> listBytedanceCampaignDailyReports = ExcelImportUtil.importExcel(file.getInputStream(), BytedanceCampaignDailyReport.class, params);
+                bytedanceCampaignDailyReportService.saveBatch(listBytedanceCampaignDailyReports);
+                return Result.ok("文件导入成功!数据行数:" + listBytedanceCampaignDailyReports.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("文件导入失败!");
+    }
+
+}

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

@@ -0,0 +1,253 @@
+package org.jeecg.modules.ctop.controller;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.net.URLDecoder;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.common.system.query.QueryGenerator;
+import org.jeecg.common.aspect.annotation.AutoLog;
+import org.jeecg.common.util.oConvertUtils;
+import org.jeecg.modules.ctop.entity.BytedanceCampaignHourlyReport;
+import org.jeecg.modules.ctop.service.IBytedanceCampaignHourlyReportService;
+
+import java.util.Date;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import lombok.extern.slf4j.Slf4j;
+
+import org.jeecgframework.poi.excel.ExcelImportUtil;
+import org.jeecgframework.poi.excel.def.NormalExcelConstants;
+import org.jeecgframework.poi.excel.entity.ExportParams;
+import org.jeecgframework.poi.excel.entity.ImportParams;
+import org.jeecgframework.poi.excel.view.JeecgEntityExcelView;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.multipart.MultipartHttpServletRequest;
+import org.springframework.web.servlet.ModelAndView;
+import com.alibaba.fastjson.JSON;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+
+/**
+ * @Description: 广告组时报表信息
+ * @Author: jeecg-boot
+ * @Date: 2019-09-11
+ * @Version: V1.0
+ */
+@Slf4j
+@Api(tags = "广告组时报表信息")
+@RestController
+@RequestMapping("/ctop/bytedanceCampaignHourlyReport")
+public class BytedanceCampaignHourlyReportController {
+    @Autowired
+    private IBytedanceCampaignHourlyReportService bytedanceCampaignHourlyReportService;
+
+    /**
+     * 分页列表查询
+     *
+     * @param bytedanceCampaignHourlyReport
+     * @param pageNo
+     * @param pageSize
+     * @param req
+     * @return
+     */
+    @AutoLog(value = "广告组时报表信息-分页列表查询")
+    @ApiOperation(value = "广告组时报表信息-分页列表查询", notes = "广告组时报表信息-分页列表查询")
+    @GetMapping(value = "/list")
+    public Result<IPage<BytedanceCampaignHourlyReport>> queryPageList(BytedanceCampaignHourlyReport bytedanceCampaignHourlyReport,
+                                                                      @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
+                                                                      @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
+                                                                      HttpServletRequest req) {
+        Result<IPage<BytedanceCampaignHourlyReport>> result = new Result<IPage<BytedanceCampaignHourlyReport>>();
+        QueryWrapper<BytedanceCampaignHourlyReport> queryWrapper = QueryGenerator.initQueryWrapper(bytedanceCampaignHourlyReport, req.getParameterMap());
+        Page<BytedanceCampaignHourlyReport> page = new Page<BytedanceCampaignHourlyReport>(pageNo, pageSize);
+        IPage<BytedanceCampaignHourlyReport> pageList = bytedanceCampaignHourlyReportService.page(page, queryWrapper);
+        result.setSuccess(true);
+        result.setResult(pageList);
+        return result;
+    }
+
+    /**
+     * 添加
+     *
+     * @param bytedanceCampaignHourlyReport
+     * @return
+     */
+    @AutoLog(value = "广告组时报表信息-添加")
+    @ApiOperation(value = "广告组时报表信息-添加", notes = "广告组时报表信息-添加")
+    @PostMapping(value = "/add")
+    public Result<BytedanceCampaignHourlyReport> add(@RequestBody BytedanceCampaignHourlyReport bytedanceCampaignHourlyReport) {
+        Result<BytedanceCampaignHourlyReport> result = new Result<BytedanceCampaignHourlyReport>();
+        try {
+            bytedanceCampaignHourlyReportService.save(bytedanceCampaignHourlyReport);
+            result.success("添加成功!");
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+            result.error500("操作失败");
+        }
+        return result;
+    }
+
+    /**
+     * 编辑
+     *
+     * @param bytedanceCampaignHourlyReport
+     * @return
+     */
+    @AutoLog(value = "广告组时报表信息-编辑")
+    @ApiOperation(value = "广告组时报表信息-编辑", notes = "广告组时报表信息-编辑")
+    @PutMapping(value = "/edit")
+    public Result<BytedanceCampaignHourlyReport> edit(@RequestBody BytedanceCampaignHourlyReport bytedanceCampaignHourlyReport) {
+        Result<BytedanceCampaignHourlyReport> result = new Result<BytedanceCampaignHourlyReport>();
+        BytedanceCampaignHourlyReport bytedanceCampaignHourlyReportEntity = bytedanceCampaignHourlyReportService.getById(bytedanceCampaignHourlyReport.getId());
+        if (bytedanceCampaignHourlyReportEntity == null) {
+            result.error500("未找到对应实体");
+        } else {
+            boolean ok = bytedanceCampaignHourlyReportService.updateById(bytedanceCampaignHourlyReport);
+            //TODO 返回false说明什么?
+            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 {
+            bytedanceCampaignHourlyReportService.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<BytedanceCampaignHourlyReport> deleteBatch(@RequestParam(name = "ids", required = true) String ids) {
+        Result<BytedanceCampaignHourlyReport> result = new Result<BytedanceCampaignHourlyReport>();
+        if (ids == null || "".equals(ids.trim())) {
+            result.error500("参数不识别!");
+        } else {
+            this.bytedanceCampaignHourlyReportService.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<BytedanceCampaignHourlyReport> queryById(@RequestParam(name = "id", required = true) String id) {
+        Result<BytedanceCampaignHourlyReport> result = new Result<BytedanceCampaignHourlyReport>();
+        BytedanceCampaignHourlyReport bytedanceCampaignHourlyReport = bytedanceCampaignHourlyReportService.getById(id);
+        if (bytedanceCampaignHourlyReport == null) {
+            result.error500("未找到对应实体");
+        } else {
+            result.setResult(bytedanceCampaignHourlyReport);
+            result.setSuccess(true);
+        }
+        return result;
+    }
+
+    /**
+     * 导出excel
+     *
+     * @param request
+     * @param response
+     */
+    @RequestMapping(value = "/exportXls")
+    public ModelAndView exportXls(HttpServletRequest request, HttpServletResponse response) {
+        // Step.1 组装查询条件
+        QueryWrapper<BytedanceCampaignHourlyReport> queryWrapper = null;
+        try {
+            String paramsStr = request.getParameter("paramsStr");
+            if (oConvertUtils.isNotEmpty(paramsStr)) {
+                String deString = URLDecoder.decode(paramsStr, "UTF-8");
+                BytedanceCampaignHourlyReport bytedanceCampaignHourlyReport = JSON.parseObject(deString, BytedanceCampaignHourlyReport.class);
+                queryWrapper = QueryGenerator.initQueryWrapper(bytedanceCampaignHourlyReport, request.getParameterMap());
+            }
+        } catch (UnsupportedEncodingException e) {
+            e.printStackTrace();
+        }
+
+        //Step.2 AutoPoi 导出Excel
+        ModelAndView mv = new ModelAndView(new JeecgEntityExcelView());
+        List<BytedanceCampaignHourlyReport> pageList = bytedanceCampaignHourlyReportService.list(queryWrapper);
+        //导出文件名称
+        mv.addObject(NormalExcelConstants.FILE_NAME, "广告组时报表信息列表");
+        mv.addObject(NormalExcelConstants.CLASS, BytedanceCampaignHourlyReport.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<BytedanceCampaignHourlyReport> listBytedanceCampaignHourlyReports = ExcelImportUtil.importExcel(file.getInputStream(), BytedanceCampaignHourlyReport.class, params);
+                bytedanceCampaignHourlyReportService.saveBatch(listBytedanceCampaignHourlyReports);
+                return Result.ok("文件导入成功!数据行数:" + listBytedanceCampaignHourlyReports.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("文件导入失败!");
+    }
+
+}

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

@@ -0,0 +1,253 @@
+package org.jeecg.modules.ctop.controller;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.net.URLDecoder;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.common.system.query.QueryGenerator;
+import org.jeecg.common.aspect.annotation.AutoLog;
+import org.jeecg.common.util.oConvertUtils;
+import org.jeecg.modules.ctop.entity.BytedanceCreativeDailyReport;
+import org.jeecg.modules.ctop.service.IBytedanceCreativeDailyReportService;
+
+import java.util.Date;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import lombok.extern.slf4j.Slf4j;
+
+import org.jeecgframework.poi.excel.ExcelImportUtil;
+import org.jeecgframework.poi.excel.def.NormalExcelConstants;
+import org.jeecgframework.poi.excel.entity.ExportParams;
+import org.jeecgframework.poi.excel.entity.ImportParams;
+import org.jeecgframework.poi.excel.view.JeecgEntityExcelView;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.multipart.MultipartHttpServletRequest;
+import org.springframework.web.servlet.ModelAndView;
+import com.alibaba.fastjson.JSON;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+
+/**
+ * @Description: 广告创意日报表信息
+ * @Author: jeecg-boot
+ * @Date: 2019-09-11
+ * @Version: V1.0
+ */
+@Slf4j
+@Api(tags = "广告创意日报表信息")
+@RestController
+@RequestMapping("/ctop/bytedanceCreativeDailyReport")
+public class BytedanceCreativeDailyReportController {
+    @Autowired
+    private IBytedanceCreativeDailyReportService bytedanceCreativeDailyReportService;
+
+    /**
+     * 分页列表查询
+     *
+     * @param bytedanceCreativeDailyReport
+     * @param pageNo
+     * @param pageSize
+     * @param req
+     * @return
+     */
+    @AutoLog(value = "广告创意日报表信息-分页列表查询")
+    @ApiOperation(value = "广告创意日报表信息-分页列表查询", notes = "广告创意日报表信息-分页列表查询")
+    @GetMapping(value = "/list")
+    public Result<IPage<BytedanceCreativeDailyReport>> queryPageList(BytedanceCreativeDailyReport bytedanceCreativeDailyReport,
+                                                                     @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
+                                                                     @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
+                                                                     HttpServletRequest req) {
+        Result<IPage<BytedanceCreativeDailyReport>> result = new Result<IPage<BytedanceCreativeDailyReport>>();
+        QueryWrapper<BytedanceCreativeDailyReport> queryWrapper = QueryGenerator.initQueryWrapper(bytedanceCreativeDailyReport, req.getParameterMap());
+        Page<BytedanceCreativeDailyReport> page = new Page<BytedanceCreativeDailyReport>(pageNo, pageSize);
+        IPage<BytedanceCreativeDailyReport> pageList = bytedanceCreativeDailyReportService.page(page, queryWrapper);
+        result.setSuccess(true);
+        result.setResult(pageList);
+        return result;
+    }
+
+    /**
+     * 添加
+     *
+     * @param bytedanceCreativeDailyReport
+     * @return
+     */
+    @AutoLog(value = "广告创意日报表信息-添加")
+    @ApiOperation(value = "广告创意日报表信息-添加", notes = "广告创意日报表信息-添加")
+    @PostMapping(value = "/add")
+    public Result<BytedanceCreativeDailyReport> add(@RequestBody BytedanceCreativeDailyReport bytedanceCreativeDailyReport) {
+        Result<BytedanceCreativeDailyReport> result = new Result<BytedanceCreativeDailyReport>();
+        try {
+            bytedanceCreativeDailyReportService.save(bytedanceCreativeDailyReport);
+            result.success("添加成功!");
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+            result.error500("操作失败");
+        }
+        return result;
+    }
+
+    /**
+     * 编辑
+     *
+     * @param bytedanceCreativeDailyReport
+     * @return
+     */
+    @AutoLog(value = "广告创意日报表信息-编辑")
+    @ApiOperation(value = "广告创意日报表信息-编辑", notes = "广告创意日报表信息-编辑")
+    @PutMapping(value = "/edit")
+    public Result<BytedanceCreativeDailyReport> edit(@RequestBody BytedanceCreativeDailyReport bytedanceCreativeDailyReport) {
+        Result<BytedanceCreativeDailyReport> result = new Result<BytedanceCreativeDailyReport>();
+        BytedanceCreativeDailyReport bytedanceCreativeDailyReportEntity = bytedanceCreativeDailyReportService.getById(bytedanceCreativeDailyReport.getId());
+        if (bytedanceCreativeDailyReportEntity == null) {
+            result.error500("未找到对应实体");
+        } else {
+            boolean ok = bytedanceCreativeDailyReportService.updateById(bytedanceCreativeDailyReport);
+            //TODO 返回false说明什么?
+            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 {
+            bytedanceCreativeDailyReportService.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<BytedanceCreativeDailyReport> deleteBatch(@RequestParam(name = "ids", required = true) String ids) {
+        Result<BytedanceCreativeDailyReport> result = new Result<BytedanceCreativeDailyReport>();
+        if (ids == null || "".equals(ids.trim())) {
+            result.error500("参数不识别!");
+        } else {
+            this.bytedanceCreativeDailyReportService.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<BytedanceCreativeDailyReport> queryById(@RequestParam(name = "id", required = true) String id) {
+        Result<BytedanceCreativeDailyReport> result = new Result<BytedanceCreativeDailyReport>();
+        BytedanceCreativeDailyReport bytedanceCreativeDailyReport = bytedanceCreativeDailyReportService.getById(id);
+        if (bytedanceCreativeDailyReport == null) {
+            result.error500("未找到对应实体");
+        } else {
+            result.setResult(bytedanceCreativeDailyReport);
+            result.setSuccess(true);
+        }
+        return result;
+    }
+
+    /**
+     * 导出excel
+     *
+     * @param request
+     * @param response
+     */
+    @RequestMapping(value = "/exportXls")
+    public ModelAndView exportXls(HttpServletRequest request, HttpServletResponse response) {
+        // Step.1 组装查询条件
+        QueryWrapper<BytedanceCreativeDailyReport> queryWrapper = null;
+        try {
+            String paramsStr = request.getParameter("paramsStr");
+            if (oConvertUtils.isNotEmpty(paramsStr)) {
+                String deString = URLDecoder.decode(paramsStr, "UTF-8");
+                BytedanceCreativeDailyReport bytedanceCreativeDailyReport = JSON.parseObject(deString, BytedanceCreativeDailyReport.class);
+                queryWrapper = QueryGenerator.initQueryWrapper(bytedanceCreativeDailyReport, request.getParameterMap());
+            }
+        } catch (UnsupportedEncodingException e) {
+            e.printStackTrace();
+        }
+
+        //Step.2 AutoPoi 导出Excel
+        ModelAndView mv = new ModelAndView(new JeecgEntityExcelView());
+        List<BytedanceCreativeDailyReport> pageList = bytedanceCreativeDailyReportService.list(queryWrapper);
+        //导出文件名称
+        mv.addObject(NormalExcelConstants.FILE_NAME, "广告创意日报表信息列表");
+        mv.addObject(NormalExcelConstants.CLASS, BytedanceCreativeDailyReport.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<BytedanceCreativeDailyReport> listBytedanceCreativeDailyReports = ExcelImportUtil.importExcel(file.getInputStream(), BytedanceCreativeDailyReport.class, params);
+                bytedanceCreativeDailyReportService.saveBatch(listBytedanceCreativeDailyReports);
+                return Result.ok("文件导入成功!数据行数:" + listBytedanceCreativeDailyReports.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("文件导入失败!");
+    }
+
+}

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

@@ -0,0 +1,253 @@
+package org.jeecg.modules.ctop.controller;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.net.URLDecoder;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.common.system.query.QueryGenerator;
+import org.jeecg.common.aspect.annotation.AutoLog;
+import org.jeecg.common.util.oConvertUtils;
+import org.jeecg.modules.ctop.entity.BytedanceCreativeHourlyReport;
+import org.jeecg.modules.ctop.service.IBytedanceCreativeHourlyReportService;
+
+import java.util.Date;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import lombok.extern.slf4j.Slf4j;
+
+import org.jeecgframework.poi.excel.ExcelImportUtil;
+import org.jeecgframework.poi.excel.def.NormalExcelConstants;
+import org.jeecgframework.poi.excel.entity.ExportParams;
+import org.jeecgframework.poi.excel.entity.ImportParams;
+import org.jeecgframework.poi.excel.view.JeecgEntityExcelView;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.multipart.MultipartHttpServletRequest;
+import org.springframework.web.servlet.ModelAndView;
+import com.alibaba.fastjson.JSON;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+
+/**
+ * @Description: 广告创意日报表信息
+ * @Author: jeecg-boot
+ * @Date: 2019-09-11
+ * @Version: V1.0
+ */
+@Slf4j
+@Api(tags = "广告创意日报表信息")
+@RestController
+@RequestMapping("/ctop/bytedanceCreativeHourlyReport")
+public class BytedanceCreativeHourlyReportController {
+    @Autowired
+    private IBytedanceCreativeHourlyReportService bytedanceCreativeHourlyReportService;
+
+    /**
+     * 分页列表查询
+     *
+     * @param bytedanceCreativeHourlyReport
+     * @param pageNo
+     * @param pageSize
+     * @param req
+     * @return
+     */
+    @AutoLog(value = "广告创意日报表信息-分页列表查询")
+    @ApiOperation(value = "广告创意日报表信息-分页列表查询", notes = "广告创意日报表信息-分页列表查询")
+    @GetMapping(value = "/list")
+    public Result<IPage<BytedanceCreativeHourlyReport>> queryPageList(BytedanceCreativeHourlyReport bytedanceCreativeHourlyReport,
+                                                                      @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
+                                                                      @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
+                                                                      HttpServletRequest req) {
+        Result<IPage<BytedanceCreativeHourlyReport>> result = new Result<IPage<BytedanceCreativeHourlyReport>>();
+        QueryWrapper<BytedanceCreativeHourlyReport> queryWrapper = QueryGenerator.initQueryWrapper(bytedanceCreativeHourlyReport, req.getParameterMap());
+        Page<BytedanceCreativeHourlyReport> page = new Page<BytedanceCreativeHourlyReport>(pageNo, pageSize);
+        IPage<BytedanceCreativeHourlyReport> pageList = bytedanceCreativeHourlyReportService.page(page, queryWrapper);
+        result.setSuccess(true);
+        result.setResult(pageList);
+        return result;
+    }
+
+    /**
+     * 添加
+     *
+     * @param bytedanceCreativeHourlyReport
+     * @return
+     */
+    @AutoLog(value = "广告创意日报表信息-添加")
+    @ApiOperation(value = "广告创意日报表信息-添加", notes = "广告创意日报表信息-添加")
+    @PostMapping(value = "/add")
+    public Result<BytedanceCreativeHourlyReport> add(@RequestBody BytedanceCreativeHourlyReport bytedanceCreativeHourlyReport) {
+        Result<BytedanceCreativeHourlyReport> result = new Result<BytedanceCreativeHourlyReport>();
+        try {
+            bytedanceCreativeHourlyReportService.save(bytedanceCreativeHourlyReport);
+            result.success("添加成功!");
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+            result.error500("操作失败");
+        }
+        return result;
+    }
+
+    /**
+     * 编辑
+     *
+     * @param bytedanceCreativeHourlyReport
+     * @return
+     */
+    @AutoLog(value = "广告创意日报表信息-编辑")
+    @ApiOperation(value = "广告创意日报表信息-编辑", notes = "广告创意日报表信息-编辑")
+    @PutMapping(value = "/edit")
+    public Result<BytedanceCreativeHourlyReport> edit(@RequestBody BytedanceCreativeHourlyReport bytedanceCreativeHourlyReport) {
+        Result<BytedanceCreativeHourlyReport> result = new Result<BytedanceCreativeHourlyReport>();
+        BytedanceCreativeHourlyReport bytedanceCreativeHourlyReportEntity = bytedanceCreativeHourlyReportService.getById(bytedanceCreativeHourlyReport.getId());
+        if (bytedanceCreativeHourlyReportEntity == null) {
+            result.error500("未找到对应实体");
+        } else {
+            boolean ok = bytedanceCreativeHourlyReportService.updateById(bytedanceCreativeHourlyReport);
+            //TODO 返回false说明什么?
+            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 {
+            bytedanceCreativeHourlyReportService.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<BytedanceCreativeHourlyReport> deleteBatch(@RequestParam(name = "ids", required = true) String ids) {
+        Result<BytedanceCreativeHourlyReport> result = new Result<BytedanceCreativeHourlyReport>();
+        if (ids == null || "".equals(ids.trim())) {
+            result.error500("参数不识别!");
+        } else {
+            this.bytedanceCreativeHourlyReportService.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<BytedanceCreativeHourlyReport> queryById(@RequestParam(name = "id", required = true) String id) {
+        Result<BytedanceCreativeHourlyReport> result = new Result<BytedanceCreativeHourlyReport>();
+        BytedanceCreativeHourlyReport bytedanceCreativeHourlyReport = bytedanceCreativeHourlyReportService.getById(id);
+        if (bytedanceCreativeHourlyReport == null) {
+            result.error500("未找到对应实体");
+        } else {
+            result.setResult(bytedanceCreativeHourlyReport);
+            result.setSuccess(true);
+        }
+        return result;
+    }
+
+    /**
+     * 导出excel
+     *
+     * @param request
+     * @param response
+     */
+    @RequestMapping(value = "/exportXls")
+    public ModelAndView exportXls(HttpServletRequest request, HttpServletResponse response) {
+        // Step.1 组装查询条件
+        QueryWrapper<BytedanceCreativeHourlyReport> queryWrapper = null;
+        try {
+            String paramsStr = request.getParameter("paramsStr");
+            if (oConvertUtils.isNotEmpty(paramsStr)) {
+                String deString = URLDecoder.decode(paramsStr, "UTF-8");
+                BytedanceCreativeHourlyReport bytedanceCreativeHourlyReport = JSON.parseObject(deString, BytedanceCreativeHourlyReport.class);
+                queryWrapper = QueryGenerator.initQueryWrapper(bytedanceCreativeHourlyReport, request.getParameterMap());
+            }
+        } catch (UnsupportedEncodingException e) {
+            e.printStackTrace();
+        }
+
+        //Step.2 AutoPoi 导出Excel
+        ModelAndView mv = new ModelAndView(new JeecgEntityExcelView());
+        List<BytedanceCreativeHourlyReport> pageList = bytedanceCreativeHourlyReportService.list(queryWrapper);
+        //导出文件名称
+        mv.addObject(NormalExcelConstants.FILE_NAME, "广告创意日报表信息列表");
+        mv.addObject(NormalExcelConstants.CLASS, BytedanceCreativeHourlyReport.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<BytedanceCreativeHourlyReport> listBytedanceCreativeHourlyReports = ExcelImportUtil.importExcel(file.getInputStream(), BytedanceCreativeHourlyReport.class, params);
+                bytedanceCreativeHourlyReportService.saveBatch(listBytedanceCreativeHourlyReports);
+                return Result.ok("文件导入成功!数据行数:" + listBytedanceCreativeHourlyReports.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("文件导入失败!");
+    }
+
+}

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

@@ -0,0 +1,253 @@
+package org.jeecg.modules.ctop.controller;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.net.URLDecoder;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.common.system.query.QueryGenerator;
+import org.jeecg.common.aspect.annotation.AutoLog;
+import org.jeecg.common.util.oConvertUtils;
+import org.jeecg.modules.ctop.entity.BytedancePlanDailyReport;
+import org.jeecg.modules.ctop.service.IBytedancePlanDailyReportService;
+
+import java.util.Date;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import lombok.extern.slf4j.Slf4j;
+
+import org.jeecgframework.poi.excel.ExcelImportUtil;
+import org.jeecgframework.poi.excel.def.NormalExcelConstants;
+import org.jeecgframework.poi.excel.entity.ExportParams;
+import org.jeecgframework.poi.excel.entity.ImportParams;
+import org.jeecgframework.poi.excel.view.JeecgEntityExcelView;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.multipart.MultipartHttpServletRequest;
+import org.springframework.web.servlet.ModelAndView;
+import com.alibaba.fastjson.JSON;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+
+/**
+ * @Description: 广告计划日报表信息
+ * @Author: jeecg-boot
+ * @Date: 2019-09-11
+ * @Version: V1.0
+ */
+@Slf4j
+@Api(tags = "广告计划日报表信息")
+@RestController
+@RequestMapping("/ctop/bytedancePlanDailyReport")
+public class BytedancePlanDailyReportController {
+    @Autowired
+    private IBytedancePlanDailyReportService bytedancePlanDailyReportService;
+
+    /**
+     * 分页列表查询
+     *
+     * @param bytedancePlanDailyReport
+     * @param pageNo
+     * @param pageSize
+     * @param req
+     * @return
+     */
+    @AutoLog(value = "广告计划日报表信息-分页列表查询")
+    @ApiOperation(value = "广告计划日报表信息-分页列表查询", notes = "广告计划日报表信息-分页列表查询")
+    @GetMapping(value = "/list")
+    public Result<IPage<BytedancePlanDailyReport>> queryPageList(BytedancePlanDailyReport bytedancePlanDailyReport,
+                                                                 @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
+                                                                 @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
+                                                                 HttpServletRequest req) {
+        Result<IPage<BytedancePlanDailyReport>> result = new Result<IPage<BytedancePlanDailyReport>>();
+        QueryWrapper<BytedancePlanDailyReport> queryWrapper = QueryGenerator.initQueryWrapper(bytedancePlanDailyReport, req.getParameterMap());
+        Page<BytedancePlanDailyReport> page = new Page<BytedancePlanDailyReport>(pageNo, pageSize);
+        IPage<BytedancePlanDailyReport> pageList = bytedancePlanDailyReportService.page(page, queryWrapper);
+        result.setSuccess(true);
+        result.setResult(pageList);
+        return result;
+    }
+
+    /**
+     * 添加
+     *
+     * @param bytedancePlanDailyReport
+     * @return
+     */
+    @AutoLog(value = "广告计划日报表信息-添加")
+    @ApiOperation(value = "广告计划日报表信息-添加", notes = "广告计划日报表信息-添加")
+    @PostMapping(value = "/add")
+    public Result<BytedancePlanDailyReport> add(@RequestBody BytedancePlanDailyReport bytedancePlanDailyReport) {
+        Result<BytedancePlanDailyReport> result = new Result<BytedancePlanDailyReport>();
+        try {
+            bytedancePlanDailyReportService.save(bytedancePlanDailyReport);
+            result.success("添加成功!");
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+            result.error500("操作失败");
+        }
+        return result;
+    }
+
+    /**
+     * 编辑
+     *
+     * @param bytedancePlanDailyReport
+     * @return
+     */
+    @AutoLog(value = "广告计划日报表信息-编辑")
+    @ApiOperation(value = "广告计划日报表信息-编辑", notes = "广告计划日报表信息-编辑")
+    @PutMapping(value = "/edit")
+    public Result<BytedancePlanDailyReport> edit(@RequestBody BytedancePlanDailyReport bytedancePlanDailyReport) {
+        Result<BytedancePlanDailyReport> result = new Result<BytedancePlanDailyReport>();
+        BytedancePlanDailyReport bytedancePlanDailyReportEntity = bytedancePlanDailyReportService.getById(bytedancePlanDailyReport.getId());
+        if (bytedancePlanDailyReportEntity == null) {
+            result.error500("未找到对应实体");
+        } else {
+            boolean ok = bytedancePlanDailyReportService.updateById(bytedancePlanDailyReport);
+            //TODO 返回false说明什么?
+            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 {
+            bytedancePlanDailyReportService.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<BytedancePlanDailyReport> deleteBatch(@RequestParam(name = "ids", required = true) String ids) {
+        Result<BytedancePlanDailyReport> result = new Result<BytedancePlanDailyReport>();
+        if (ids == null || "".equals(ids.trim())) {
+            result.error500("参数不识别!");
+        } else {
+            this.bytedancePlanDailyReportService.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<BytedancePlanDailyReport> queryById(@RequestParam(name = "id", required = true) String id) {
+        Result<BytedancePlanDailyReport> result = new Result<BytedancePlanDailyReport>();
+        BytedancePlanDailyReport bytedancePlanDailyReport = bytedancePlanDailyReportService.getById(id);
+        if (bytedancePlanDailyReport == null) {
+            result.error500("未找到对应实体");
+        } else {
+            result.setResult(bytedancePlanDailyReport);
+            result.setSuccess(true);
+        }
+        return result;
+    }
+
+    /**
+     * 导出excel
+     *
+     * @param request
+     * @param response
+     */
+    @RequestMapping(value = "/exportXls")
+    public ModelAndView exportXls(HttpServletRequest request, HttpServletResponse response) {
+        // Step.1 组装查询条件
+        QueryWrapper<BytedancePlanDailyReport> queryWrapper = null;
+        try {
+            String paramsStr = request.getParameter("paramsStr");
+            if (oConvertUtils.isNotEmpty(paramsStr)) {
+                String deString = URLDecoder.decode(paramsStr, "UTF-8");
+                BytedancePlanDailyReport bytedancePlanDailyReport = JSON.parseObject(deString, BytedancePlanDailyReport.class);
+                queryWrapper = QueryGenerator.initQueryWrapper(bytedancePlanDailyReport, request.getParameterMap());
+            }
+        } catch (UnsupportedEncodingException e) {
+            e.printStackTrace();
+        }
+
+        //Step.2 AutoPoi 导出Excel
+        ModelAndView mv = new ModelAndView(new JeecgEntityExcelView());
+        List<BytedancePlanDailyReport> pageList = bytedancePlanDailyReportService.list(queryWrapper);
+        //导出文件名称
+        mv.addObject(NormalExcelConstants.FILE_NAME, "广告计划日报表信息列表");
+        mv.addObject(NormalExcelConstants.CLASS, BytedancePlanDailyReport.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<BytedancePlanDailyReport> listBytedancePlanDailyReports = ExcelImportUtil.importExcel(file.getInputStream(), BytedancePlanDailyReport.class, params);
+                bytedancePlanDailyReportService.saveBatch(listBytedancePlanDailyReports);
+                return Result.ok("文件导入成功!数据行数:" + listBytedancePlanDailyReports.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("文件导入失败!");
+    }
+
+}

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

@@ -0,0 +1,253 @@
+package org.jeecg.modules.ctop.controller;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.net.URLDecoder;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.common.system.query.QueryGenerator;
+import org.jeecg.common.aspect.annotation.AutoLog;
+import org.jeecg.common.util.oConvertUtils;
+import org.jeecg.modules.ctop.entity.BytedancePlanHourlyReport;
+import org.jeecg.modules.ctop.service.IBytedancePlanHourlyReportService;
+
+import java.util.Date;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import lombok.extern.slf4j.Slf4j;
+
+import org.jeecgframework.poi.excel.ExcelImportUtil;
+import org.jeecgframework.poi.excel.def.NormalExcelConstants;
+import org.jeecgframework.poi.excel.entity.ExportParams;
+import org.jeecgframework.poi.excel.entity.ImportParams;
+import org.jeecgframework.poi.excel.view.JeecgEntityExcelView;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.multipart.MultipartHttpServletRequest;
+import org.springframework.web.servlet.ModelAndView;
+import com.alibaba.fastjson.JSON;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+
+/**
+ * @Description: 广告计划时报表信息
+ * @Author: jeecg-boot
+ * @Date: 2019-09-11
+ * @Version: V1.0
+ */
+@Slf4j
+@Api(tags = "广告计划时报表信息")
+@RestController
+@RequestMapping("/ctop/bytedancePlanHourlyReport")
+public class BytedancePlanHourlyReportController {
+    @Autowired
+    private IBytedancePlanHourlyReportService bytedancePlanHourlyReportService;
+
+    /**
+     * 分页列表查询
+     *
+     * @param bytedancePlanHourlyReport
+     * @param pageNo
+     * @param pageSize
+     * @param req
+     * @return
+     */
+    @AutoLog(value = "广告计划时报表信息-分页列表查询")
+    @ApiOperation(value = "广告计划时报表信息-分页列表查询", notes = "广告计划时报表信息-分页列表查询")
+    @GetMapping(value = "/list")
+    public Result<IPage<BytedancePlanHourlyReport>> queryPageList(BytedancePlanHourlyReport bytedancePlanHourlyReport,
+                                                                  @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
+                                                                  @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
+                                                                  HttpServletRequest req) {
+        Result<IPage<BytedancePlanHourlyReport>> result = new Result<IPage<BytedancePlanHourlyReport>>();
+        QueryWrapper<BytedancePlanHourlyReport> queryWrapper = QueryGenerator.initQueryWrapper(bytedancePlanHourlyReport, req.getParameterMap());
+        Page<BytedancePlanHourlyReport> page = new Page<BytedancePlanHourlyReport>(pageNo, pageSize);
+        IPage<BytedancePlanHourlyReport> pageList = bytedancePlanHourlyReportService.page(page, queryWrapper);
+        result.setSuccess(true);
+        result.setResult(pageList);
+        return result;
+    }
+
+    /**
+     * 添加
+     *
+     * @param bytedancePlanHourlyReport
+     * @return
+     */
+    @AutoLog(value = "广告计划时报表信息-添加")
+    @ApiOperation(value = "广告计划时报表信息-添加", notes = "广告计划时报表信息-添加")
+    @PostMapping(value = "/add")
+    public Result<BytedancePlanHourlyReport> add(@RequestBody BytedancePlanHourlyReport bytedancePlanHourlyReport) {
+        Result<BytedancePlanHourlyReport> result = new Result<BytedancePlanHourlyReport>();
+        try {
+            bytedancePlanHourlyReportService.save(bytedancePlanHourlyReport);
+            result.success("添加成功!");
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+            result.error500("操作失败");
+        }
+        return result;
+    }
+
+    /**
+     * 编辑
+     *
+     * @param bytedancePlanHourlyReport
+     * @return
+     */
+    @AutoLog(value = "广告计划时报表信息-编辑")
+    @ApiOperation(value = "广告计划时报表信息-编辑", notes = "广告计划时报表信息-编辑")
+    @PutMapping(value = "/edit")
+    public Result<BytedancePlanHourlyReport> edit(@RequestBody BytedancePlanHourlyReport bytedancePlanHourlyReport) {
+        Result<BytedancePlanHourlyReport> result = new Result<BytedancePlanHourlyReport>();
+        BytedancePlanHourlyReport bytedancePlanHourlyReportEntity = bytedancePlanHourlyReportService.getById(bytedancePlanHourlyReport.getId());
+        if (bytedancePlanHourlyReportEntity == null) {
+            result.error500("未找到对应实体");
+        } else {
+            boolean ok = bytedancePlanHourlyReportService.updateById(bytedancePlanHourlyReport);
+            //TODO 返回false说明什么?
+            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 {
+            bytedancePlanHourlyReportService.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<BytedancePlanHourlyReport> deleteBatch(@RequestParam(name = "ids", required = true) String ids) {
+        Result<BytedancePlanHourlyReport> result = new Result<BytedancePlanHourlyReport>();
+        if (ids == null || "".equals(ids.trim())) {
+            result.error500("参数不识别!");
+        } else {
+            this.bytedancePlanHourlyReportService.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<BytedancePlanHourlyReport> queryById(@RequestParam(name = "id", required = true) String id) {
+        Result<BytedancePlanHourlyReport> result = new Result<BytedancePlanHourlyReport>();
+        BytedancePlanHourlyReport bytedancePlanHourlyReport = bytedancePlanHourlyReportService.getById(id);
+        if (bytedancePlanHourlyReport == null) {
+            result.error500("未找到对应实体");
+        } else {
+            result.setResult(bytedancePlanHourlyReport);
+            result.setSuccess(true);
+        }
+        return result;
+    }
+
+    /**
+     * 导出excel
+     *
+     * @param request
+     * @param response
+     */
+    @RequestMapping(value = "/exportXls")
+    public ModelAndView exportXls(HttpServletRequest request, HttpServletResponse response) {
+        // Step.1 组装查询条件
+        QueryWrapper<BytedancePlanHourlyReport> queryWrapper = null;
+        try {
+            String paramsStr = request.getParameter("paramsStr");
+            if (oConvertUtils.isNotEmpty(paramsStr)) {
+                String deString = URLDecoder.decode(paramsStr, "UTF-8");
+                BytedancePlanHourlyReport bytedancePlanHourlyReport = JSON.parseObject(deString, BytedancePlanHourlyReport.class);
+                queryWrapper = QueryGenerator.initQueryWrapper(bytedancePlanHourlyReport, request.getParameterMap());
+            }
+        } catch (UnsupportedEncodingException e) {
+            e.printStackTrace();
+        }
+
+        //Step.2 AutoPoi 导出Excel
+        ModelAndView mv = new ModelAndView(new JeecgEntityExcelView());
+        List<BytedancePlanHourlyReport> pageList = bytedancePlanHourlyReportService.list(queryWrapper);
+        //导出文件名称
+        mv.addObject(NormalExcelConstants.FILE_NAME, "广告计划时报表信息列表");
+        mv.addObject(NormalExcelConstants.CLASS, BytedancePlanHourlyReport.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<BytedancePlanHourlyReport> listBytedancePlanHourlyReports = ExcelImportUtil.importExcel(file.getInputStream(), BytedancePlanHourlyReport.class, params);
+                bytedancePlanHourlyReportService.saveBatch(listBytedancePlanHourlyReports);
+                return Result.ok("文件导入成功!数据行数:" + listBytedancePlanHourlyReports.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("文件导入失败!");
+    }
+
+}

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

@@ -226,7 +226,7 @@ public class BytedanceUrlInfoController {
         MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
         MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
         Map<String, MultipartFile> fileMap = multipartRequest.getFileMap();
         Map<String, MultipartFile> fileMap = multipartRequest.getFileMap();
         for (Map.Entry<String, MultipartFile> entity : fileMap.entrySet()) {
         for (Map.Entry<String, MultipartFile> entity : fileMap.entrySet()) {
-            MultipartFile file = entity.getValue();// 获取上传文件对象
+            MultipartFile file = entity.getValue();
             ImportParams params = new ImportParams();
             ImportParams params = new ImportParams();
             params.setTitleRows(2);
             params.setTitleRows(2);
             params.setHeadRows(1);
             params.setHeadRows(1);

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

@@ -36,7 +36,7 @@ public class ReportController {
      * 头条广告计划报表信息
      * 头条广告计划报表信息
      * 只支持查询2016-10-26及以后的日期
      * 只支持查询2016-10-26及以后的日期
      * 单次获取最大条数1000
      * 单次获取最大条数1000
-     * @return
+     * @return 广告组报表数据
      */
      */
     @GetMapping("campaign")
     @GetMapping("campaign")
     public Map<String, Object> campaignReport(@RequestBody JSONObject conditions) {
     public Map<String, Object> campaignReport(@RequestBody JSONObject conditions) {
@@ -45,8 +45,8 @@ public class ReportController {
 
 
     /**
     /**
      * 头条广告计划报表信息
      * 头条广告计划报表信息
-     * @param conditions
-     * @return
+     * @param conditions 查询条件
+     * @return 广告计划报表数据
      */
      */
     @GetMapping("ad")
     @GetMapping("ad")
     public Map<String, Object> adReport(@RequestBody JSONObject conditions) {
     public Map<String, Object> adReport(@RequestBody JSONObject conditions) {
@@ -67,6 +67,7 @@ public class ReportController {
      * 代理商数据
      * 代理商数据
      * @param conditions
      * @param conditions
      * @return
      * @return
+     * TODO 尚未完善
      */
      */
     @GetMapping("agent")
     @GetMapping("agent")
     public Map<String, Object> agentReport(@RequestBody JSONObject conditions) {
     public Map<String, Object> agentReport(@RequestBody JSONObject conditions) {

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

@@ -227,7 +227,7 @@ public class SourceFileController {
         MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
         MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
         Map<String, MultipartFile> fileMap = multipartRequest.getFileMap();
         Map<String, MultipartFile> fileMap = multipartRequest.getFileMap();
         for (Map.Entry<String, MultipartFile> entity : fileMap.entrySet()) {
         for (Map.Entry<String, MultipartFile> entity : fileMap.entrySet()) {
-            MultipartFile file = entity.getValue();// 获取上传文件对象
+            MultipartFile file = entity.getValue();
             ImportParams params = new ImportParams();
             ImportParams params = new ImportParams();
             params.setTitleRows(2);
             params.setTitleRows(2);
             params.setHeadRows(1);
             params.setHeadRows(1);

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

@@ -0,0 +1,606 @@
+package org.jeecg.modules.ctop.entity;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+import com.alibaba.fastjson.JSONObject;
+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;
+
+/**
+ * @Description: 广告主日报表
+ * @Author: jeecg-boot
+ * @Date: 2019-09-10
+ * @Version: V1.0
+ */
+@Data
+@TableName("ctop_bytedance_report_advertiser_daily")
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value = "ctop_bytedance_report_advertiser_daily对象", description = "广告主日报表")
+public class BytedanceAdvertiserDailyReport {
+
+    /**
+     * id
+     */
+    @TableId(type = IdType.AUTO)
+    @ApiModelProperty(value = "id")
+    private Long id;
+    /**
+     * 广告主id
+     */
+    @Excel(name = "广告主id", width = 15)
+    @ApiModelProperty(value = "广告主id")
+    private Long advertiserId;
+    /**
+     * 数据起始时间
+     */
+    @Excel(name = "数据起始时间", width = 15)
+    @ApiModelProperty(value = "数据起始时间")
+    private String statDatetime;
+    /**
+     * 展示量
+     */
+    @Excel(name = "展示量", width = 15)
+    @ApiModelProperty(value = "展示量")
+    private Long showNum;
+    /**
+     * 点击量
+     */
+    @Excel(name = "点击量", width = 15)
+    @ApiModelProperty(value = "点击量")
+    private Long click;
+    /**
+     * 转化量
+     */
+    @Excel(name = "转化量", width = 15)
+    @ApiModelProperty(value = "转化量")
+    private Long convertNum;
+    /**
+     * 总花费
+     */
+    @Excel(name = "总花费", width = 15)
+    @ApiModelProperty(value = "总花费")
+    private java.math.BigDecimal cost;
+    /**
+     * 应用下载-激活
+     */
+    @Excel(name = "应用下载-激活", width = 15)
+    @ApiModelProperty(value = "应用下载-激活")
+    private Long active;
+    /**
+     * 应用下载-安卓下载完成
+     */
+    @Excel(name = "应用下载-安卓下载完成", width = 15)
+    @ApiModelProperty(value = "应用下载-安卓下载完成")
+    private Long downloadFinish;
+    /**
+     * 应用下载-安卓下载开始
+     */
+    @Excel(name = "应用下载-安卓下载开始", width = 15)
+    @ApiModelProperty(value = "应用下载-安卓下载开始")
+    private Long downloadStart;
+    /**
+     * 应用下载-点击安装数
+     */
+    @Excel(name = "应用下载-点击安装数", width = 15)
+    @ApiModelProperty(value = "应用下载-点击安装数")
+    private Long clickInstall;
+    /**
+     * 应用下载-安卓安装完成
+     */
+    @Excel(name = "应用下载-安卓安装完成", width = 15)
+    @ApiModelProperty(value = "应用下载-安卓安装完成")
+    private Long installFinish;
+    /**
+     * 应用下载-注册
+     */
+    @Excel(name = "应用下载-注册", width = 15)
+    @ApiModelProperty(value = "应用下载-注册")
+    private Long register;
+    /**
+     * 应用下载-付费数
+     */
+    @Excel(name = "应用下载-付费数", width = 15)
+    @ApiModelProperty(value = "应用下载-付费数")
+    private Long payCount;
+    /**
+     * 应用下载-到达uv
+     */
+    @Excel(name = "应用下载-到达uv", width = 15)
+    @ApiModelProperty(value = "应用下载-到达uv")
+    private Long inAppUv;
+    /**
+     * 应用下载-详情页到站uv
+     */
+    @Excel(name = "应用下载-详情页到站uv", width = 15)
+    @ApiModelProperty(value = "应用下载-详情页到站uv")
+    private Long inAppDetailUv;
+    /**
+     * 应用下载-加入购物车
+     */
+    @Excel(name = "应用下载-加入购物车", width = 15)
+    @ApiModelProperty(value = "应用下载-加入购物车")
+    private Long inAppCart;
+    /**
+     * 应用下载-提交订单
+     */
+    @Excel(name = "应用下载-提交订单", width = 15)
+    @ApiModelProperty(value = "应用下载-提交订单")
+    private Long inAppOrder;
+    /**
+     * 应用下载-付费
+     */
+    @Excel(name = "应用下载-付费", width = 15)
+    @ApiModelProperty(value = "应用下载-付费")
+    private Long inAppPay;
+    /**
+     * 落地页-电话拨打数
+     */
+    @Excel(name = "落地页-电话拨打数", width = 15)
+    @ApiModelProperty(value = "落地页-电话拨打数")
+    private Long phone;
+    /**
+     * 表单提交数
+     */
+    @Excel(name = "表单提交数", width = 15)
+    @ApiModelProperty(value = "表单提交数")
+    private Long form;
+    /**
+     * 落地页-地图搜索
+     */
+    @Excel(name = "落地页-地图搜索", width = 15)
+    @ApiModelProperty(value = "落地页-地图搜索")
+    private Long mapSearch;
+    /**
+     * 落地页-按钮button
+     */
+    @Excel(name = "落地页-按钮button", width = 15)
+    @ApiModelProperty(value = "落地页-按钮button")
+    private Long button;
+    /**
+     * 落地页-关键页面浏览
+     */
+    @Excel(name = "落地页-关键页面浏览", width = 15)
+    @ApiModelProperty(value = "落地页-关键页面浏览")
+    private Long view;
+    /**
+     * 落地页-QQ咨询数
+     */
+    @Excel(name = "落地页-QQ咨询数", width = 15)
+    @ApiModelProperty(value = "落地页-QQ咨询数")
+    private Long qq;
+    /**
+     * 落地页-抽奖数
+     */
+    @Excel(name = "落地页-抽奖数", width = 15)
+    @ApiModelProperty(value = "落地页-抽奖数")
+    private Long lottery;
+    /**
+     * 落地页-投票
+     */
+    @Excel(name = "落地页-投票", width = 15)
+    @ApiModelProperty(value = "落地页-投票")
+    private Long vote;
+    /**
+     * 落地页-页面跳转
+     */
+    @Excel(name = "落地页-页面跳转", width = 15)
+    @ApiModelProperty(value = "落地页-页面跳转")
+    private Long redirect;
+    /**
+     * 落地页-商品购买
+     */
+    @Excel(name = "落地页-商品购买", width = 15)
+    @ApiModelProperty(value = "落地页-商品购买")
+    private Long shopping;
+    /**
+     * 落地页-在线咨询
+     */
+    @Excel(name = "落地页-在线咨询", width = 15)
+    @ApiModelProperty(value = "落地页-在线咨询")
+    private Long consult;
+    /**
+     * 落地页-微信
+     */
+    @Excel(name = "落地页-微信", width = 15)
+    @ApiModelProperty(value = "落地页-微信")
+    private Long wechat;
+    /**
+     * 落地页-智能电话确认拨打
+     */
+    @Excel(name = "落地页-智能电话确认拨打", width = 15)
+    @ApiModelProperty(value = "落地页-智能电话确认拨打")
+    private Long phoneConfirm;
+    /**
+     * 落地页-智能电话确认接通
+     */
+    @Excel(name = "落地页-智能电话确认接通", width = 15)
+    @ApiModelProperty(value = "落地页-智能电话确认接通")
+    private Long phoneConnect;
+    /**
+     * 落地页-智能电话有效咨询
+     */
+    @Excel(name = "落地页-智能电话有效咨询", width = 15)
+    @ApiModelProperty(value = "落地页-智能电话有效咨询")
+    private Long consultEffective;
+    /**
+     * 视频-总播放
+     */
+    @Excel(name = "视频-总播放", width = 15)
+    @ApiModelProperty(value = "视频-总播放")
+    private Long totalPlay;
+    /**
+     * 视频-有效播放
+     */
+    @Excel(name = "视频-有效播放", width = 15)
+    @ApiModelProperty(value = "视频-有效播放")
+    private Long validPlay;
+    /**
+     * 视频-wifi播放
+     */
+    @Excel(name = "视频-wifi播放", width = 15)
+    @ApiModelProperty(value = "视频-wifi播放")
+    private Long wifiPlay;
+    /**
+     * 视频-播放时长,单位ms
+     */
+    @Excel(name = "视频-播放时长,单位ms", width = 15)
+    @ApiModelProperty(value = "视频-播放时长,单位ms")
+    private Long playDurationSum;
+    /**
+     * 视频-播放25%进度总数
+     */
+    @Excel(name = "视频-播放25%进度总数", width = 15)
+    @ApiModelProperty(value = "视频-播放25%进度总数")
+    private Long play25FeedBreak;
+    /**
+     * 视频-播放50%进度总数
+     */
+    @Excel(name = "视频-播放50%进度总数", width = 15)
+    @ApiModelProperty(value = "视频-播放50%进度总数")
+    private Long play50FeedBreak;
+    /**
+     * 视频-播放75%进度总数
+     */
+    @Excel(name = "视频-播放75%进度总数", width = 15)
+    @ApiModelProperty(value = "视频-播放75%进度总数")
+    private Long play75FeedBreak;
+    /**
+     * 视频-播放100%进度总数
+     */
+    @Excel(name = "视频-播放100%进度总数", width = 15)
+    @ApiModelProperty(value = "视频-播放100%进度总数")
+    private Long play100FeedBreak;
+    /**
+     * 附加创意-电话按钮
+     */
+    @Excel(name = "附加创意-电话按钮", width = 15)
+    @ApiModelProperty(value = "附加创意-电话按钮")
+    private Long advancedCreativePhoneClick;
+    /**
+     * 附加创意-在线咨询
+     */
+    @Excel(name = "附加创意-在线咨询", width = 15)
+    @ApiModelProperty(value = "附加创意-在线咨询")
+    private Long advancedCreativeCounselClick;
+    /**
+     * 附加创意-表单提交
+     */
+    @Excel(name = "附加创意-表单提交", width = 15)
+    @ApiModelProperty(value = "附加创意-表单提交")
+    private Long advancedCreativeFormClick;
+    /**
+     * 互动数据-分享数
+     */
+    @Excel(name = "互动数据-分享数", width = 15)
+    @ApiModelProperty(value = "互动数据-分享数")
+    private Long share;
+    /**
+     * 互动数据-评论数
+     */
+    @Excel(name = "互动数据-评论数", width = 15)
+    @ApiModelProperty(value = "互动数据-评论数")
+    private Long comment;
+    /**
+     * 互动数据-点赞数
+     */
+    @Excel(name = "互动数据-点赞数", width = 15)
+    @ApiModelProperty(value = "互动数据-点赞数")
+    private Long likeNum;
+    /**
+     * 互动数据-关注数
+     */
+    @Excel(name = "互动数据-关注数", width = 15)
+    @ApiModelProperty(value = "互动数据-关注数")
+    private Long follow;
+    /**
+     * 互动数据-主页访问量
+     */
+    @Excel(name = "互动数据-主页访问量", width = 15)
+    @ApiModelProperty(value = "互动数据-主页访问量")
+    private Long homeVisited;
+    /**
+     * 互动数据-挑战赛查看数
+     */
+    @Excel(name = "互动数据-挑战赛查看数", width = 15)
+    @ApiModelProperty(value = "互动数据-挑战赛查看数")
+    private Long iesChallengeClick;
+    /**
+     * 互动数据-音乐查看数
+     */
+    @Excel(name = "互动数据-音乐查看数", width = 15)
+    @ApiModelProperty(value = "互动数据-音乐查看数")
+    private Long iesMusicClick;
+    /**
+     * 互动数据-单次互动成本
+     */
+    @Excel(name = "互动数据-单次互动成本", width = 15)
+    @ApiModelProperty(value = "互动数据-单次互动成本")
+    private java.math.BigDecimal interactPerCost;
+    /**
+     * 次留数
+     */
+    @Excel(name = "次留数", width = 15)
+    @ApiModelProperty(value = "次留数")
+    private Long nextDayOpen;
+    /**
+     * 次留率
+     */
+    @Excel(name = "次留率", width = 15)
+    @ApiModelProperty(value = "次留率")
+    private java.math.BigDecimal nextDayOpenRate;
+    /**
+     * 次留成本
+     */
+    @Excel(name = "次留成本", width = 15)
+    @ApiModelProperty(value = "次留成本")
+    private java.math.BigDecimal nextDayOpenCost;
+    @Excel(name = "创建时间")
+    @ApiModelProperty(value = "创建时间")
+    private Date createTime;
+    @Excel(name = "修改时间")
+    @ApiModelProperty(value = "修改时间")
+    private Date updateTime;
+
+    public BytedanceAdvertiserDailyReport(JSONObject data) {
+        Long playFeedBreak75 = data.getLong("play_75_feed_break");
+        if (null != playFeedBreak75) {
+            this.play75FeedBreak = playFeedBreak75;
+        }
+        Long nextDayOpen = data.getLong("next_day_open");
+        if (null != nextDayOpen) {
+            this.nextDayOpen = nextDayOpen;
+        }
+        Long convertNum = data.getLong("convert");
+        if (null != convertNum) {
+            this.convertNum = convertNum;
+        }
+        Long inAppCart = data.getLong("in_app_cart");
+        if (null != inAppCart) {
+            this.inAppCart = inAppCart;
+        }
+        Long play25FeedBreak = data.getLong("play_25_feed_break");
+        if (null != play25FeedBreak) {
+            this.play25FeedBreak = play25FeedBreak;
+        }
+        Long consultEffective = data.getLong("consult_effective");
+        if (null != consultEffective) {
+            this.consultEffective = consultEffective;
+        }
+        Long view = data.getLong("view");
+        if (null != view) {
+            this.view = view;
+        }
+        Long phoneConfirm = data.getLong("phone_confirm");
+        if (null != phoneConfirm) {
+            this.phoneConfirm = phoneConfirm;
+        }
+        Long iesMusicClick = data.getLong("ies_music_click");
+        if (null != iesMusicClick) {
+            this.iesMusicClick = iesMusicClick;
+        }
+        Long wifiPlay = data.getLong("wifi_play");
+        if (null != wifiPlay) {
+            this.wifiPlay = wifiPlay;
+        }
+        String statDatetime = data.getString("stat_datetime");
+        if (null != statDatetime && !"".equals(statDatetime.trim())) {
+            this.statDatetime = statDatetime;
+        }
+        Long shopping = data.getLong("shopping");
+        if (null != shopping) {
+            this.shopping = shopping;
+        }
+        Long qq = data.getLong("qq");
+        if (null != qq) {
+            this.qq = qq;
+        }
+        Long like = data.getLong("like");
+        if (null != like) {
+            this.likeNum = like;
+        }
+        Long play50FeedBreak = data.getLong("play_50_feed_break");
+        if (null != play50FeedBreak) {
+            this.play50FeedBreak = play50FeedBreak;
+        }
+        Long active = data.getLong("active");
+        if (null != active) {
+            this.active = active;
+        }
+        Long click = data.getLong("click");
+        if (null != click) {
+            this.click = click;
+        }
+        Long advancedCreativePhoneClick = data.getLong("advanced_creative_phone_click");
+        if (null != advancedCreativePhoneClick) {
+            this.advancedCreativePhoneClick = advancedCreativePhoneClick;
+        }
+        Long downloadStart = data.getLong("download_start");
+        if (null != downloadStart) {
+            this.downloadStart = downloadStart;
+        }
+        Long homeVisited = data.getLong("home_visited");
+        if (null != homeVisited) {
+            this.homeVisited = homeVisited;
+        }
+        Long phone = data.getLong("phone");
+        if (null != phone) {
+            this.phone = phone;
+        }
+        Long inAppPay = data.getLong("in_app_pay");
+        if (null != inAppPay) {
+            this.inAppPay = inAppPay;
+        }
+        BigDecimal nextDayOpenCost = data.getBigDecimal("next_day_open_cost");
+        if (null != nextDayOpenCost) {
+            this.nextDayOpenCost = nextDayOpenCost;
+        }
+        Long iesChallengeClick = data.getLong("ies_challenge_click");
+        if (null != iesChallengeClick) {
+            this.iesChallengeClick = iesChallengeClick;
+        }
+        Long totalPlay = data.getLong("total_play");
+        if (null != totalPlay) {
+            this.totalPlay = totalPlay;
+        }
+        Long show = data.getLong("show");
+        if (null != show) {
+            this.showNum = show;
+        }
+        BigDecimal nextDayOpenRate = data.getBigDecimal("next_day_open_rate");
+        if (null != nextDayOpenRate) {
+            this.nextDayOpenRate = nextDayOpenRate;
+        }
+        Long mapSearch = data.getLong("map_search");
+        if (null != mapSearch) {
+            this.mapSearch = mapSearch;
+        }
+        Long clickInstall = data.getLong("click_install");
+        if (null != clickInstall) {
+            this.clickInstall = clickInstall;
+        }
+        BigDecimal interactPerCost = data.getBigDecimal("interact_per_cost");
+        if (null != interactPerCost) {
+            this.interactPerCost = interactPerCost;
+        }
+        Long advertiserId = data.getLong("advertiser_id");
+        if (null != advertiserId) {
+            this.advertiserId = advertiserId;
+        }
+        Long button = data.getLong("button");
+        if (null != button) {
+            this.button = button;
+        }
+        Long playDurationSum = data.getLong("play_duration_sum");
+        if (null != playDurationSum) {
+            this.playDurationSum = playDurationSum;
+        }
+        Long play100FeedBreak = data.getLong("play_100_feed_break");
+        if (null != play100FeedBreak) {
+            this.play100FeedBreak = play100FeedBreak;
+        }
+        Long advancedCreativeCounselClick = data.getLong("advanced_creative_counsel_click");
+        if (null != advancedCreativeCounselClick) {
+            this.advancedCreativeCounselClick = advancedCreativeCounselClick;
+        }
+        Long share = data.getLong("share");
+        if (null != share) {
+            this.share = share;
+        }
+        Long consult = data.getLong("consult");
+        if (null != consult) {
+            this.consult = consult;
+        }
+        Long vote = data.getLong("vote");
+        if (null != vote) {
+            this.vote = vote;
+        }
+        Long validPlay = data.getLong("valid_play");
+        if (null != validPlay) {
+            this.validPlay = validPlay;
+        }
+        Long redirect = data.getLong("redirect");
+        if (null != redirect) {
+            this.redirect = redirect;
+        }
+        Long payCount = data.getLong("pay_count");
+        if (null != payCount) {
+            this.payCount = payCount;
+        }
+        Long advancedCreativeFormClick = data.getLong("advanced_creative_form_click");
+        if (null != advancedCreativeFormClick) {
+            this.advancedCreativeFormClick = advancedCreativeFormClick;
+        }
+        BigDecimal cost = data.getBigDecimal("cost");
+        if (null != cost) {
+            this.cost = cost;
+        }
+        Long downloadFinish = data.getLong("download_finish");
+        if (null != downloadFinish) {
+            this.downloadFinish = downloadFinish;
+        }
+        Long wechat = data.getLong("wechat");
+        if (null != wechat) {
+            this.wechat = wechat;
+        }
+        Long lottery = data.getLong("lottery");
+        if (null != lottery) {
+            this.lottery = lottery;
+        }
+        Long inAppOrder = data.getLong("in_app_order");
+        if (null != inAppOrder) {
+            this.inAppOrder = inAppOrder;
+        }
+        Long installFinish = data.getLong("install_finish");
+        if (null != installFinish) {
+            this.installFinish = installFinish;
+        }
+        Long follow = data.getLong("follow");
+        if (null != follow) {
+            this.follow = follow;
+        }
+//		Long message = data.getLong("message");
+//		if(null!=message){
+//			this.message = message;
+//		}
+        Long inAppDetailUv = data.getLong("in_app_detail_uv");
+        if (null != inAppDetailUv) {
+            this.inAppDetailUv = inAppDetailUv;
+        }
+        Long form = data.getLong("form");
+        if (null != form) {
+            this.form = form;
+        }
+//		BigDecimal convert_cost = data.getBigDecimal("convert_cost");
+//		if(null!=convert_cost){
+//			this.convertCost = convert_cost;
+//		}
+        Long comment = data.getLong("comment");
+        if (null != comment) {
+            this.comment = comment;
+        }
+        Long inAppUv = data.getLong("in_app_uv");
+        if (null != inAppUv) {
+            this.inAppUv = inAppUv;
+        }
+        Long register = data.getLong("register");
+        if (null != register) {
+            this.register = register;
+        }
+    }
+
+    public BytedanceAdvertiserDailyReport() {
+    }
+}

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

@@ -0,0 +1,610 @@
+package org.jeecg.modules.ctop.entity;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+import com.alibaba.fastjson.JSONObject;
+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;
+
+/**
+ * @Description: 广告主小时级别报表信息
+ * @Author: jeecg-boot
+ * @Date: 2019-09-10
+ * @Version: V1.0
+ */
+@Data
+@TableName("ctop_bytedance_report_advertiser_hourly")
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value = "ctop_bytedance_report_advertiser_hourly对象", description = "广告主小时级别报表信息")
+public class BytedanceAdvertiserHourlyReport {
+
+    /**
+     * id
+     */
+    @TableId(type = IdType.AUTO)
+    @ApiModelProperty(value = "id")
+    private Long id;
+    /**
+     * 广告主id
+     */
+    @Excel(name = "广告主id", width = 15)
+    @ApiModelProperty(value = "广告主id")
+    private Long advertiserId;
+    /**
+     * 数据起始时间
+     */
+    @Excel(name = "数据起始时间", width = 15)
+    @ApiModelProperty(value = "数据起始时间")
+    private String statDatetime;
+    /**
+     * 展示量
+     */
+    @Excel(name = "展示量", width = 15)
+    @ApiModelProperty(value = "展示量")
+    private Long showNum;
+    /**
+     * 点击量
+     */
+    @Excel(name = "点击量", width = 15)
+    @ApiModelProperty(value = "点击量")
+    private Long click;
+    /**
+     * 转化量
+     */
+    @Excel(name = "转化量", width = 15)
+    @ApiModelProperty(value = "转化量")
+    private Long convertNum;
+    /**
+     * 总花费
+     */
+    @Excel(name = "总花费", width = 15)
+    @ApiModelProperty(value = "总花费")
+    private java.math.BigDecimal cost;
+    /**
+     * 应用下载-激活
+     */
+    @Excel(name = "应用下载-激活", width = 15)
+    @ApiModelProperty(value = "应用下载-激活")
+    private Long active;
+    /**
+     * 应用下载-安卓下载完成
+     */
+    @Excel(name = "应用下载-安卓下载完成", width = 15)
+    @ApiModelProperty(value = "应用下载-安卓下载完成")
+    private Long downloadFinish;
+    /**
+     * 应用下载-安卓下载开始
+     */
+    @Excel(name = "应用下载-安卓下载开始", width = 15)
+    @ApiModelProperty(value = "应用下载-安卓下载开始")
+    private Long downloadStart;
+    /**
+     * 应用下载-点击安装数
+     */
+    @Excel(name = "应用下载-点击安装数", width = 15)
+    @ApiModelProperty(value = "应用下载-点击安装数")
+    private Long clickInstall;
+    /**
+     * 应用下载-安卓安装完成
+     */
+    @Excel(name = "应用下载-安卓安装完成", width = 15)
+    @ApiModelProperty(value = "应用下载-安卓安装完成")
+    private Long installFinish;
+    /**
+     * 应用下载-注册
+     */
+    @Excel(name = "应用下载-注册", width = 15)
+    @ApiModelProperty(value = "应用下载-注册")
+    private Long register;
+    /**
+     * 应用下载-付费数
+     */
+    @Excel(name = "应用下载-付费数", width = 15)
+    @ApiModelProperty(value = "应用下载-付费数")
+    private Long payCount;
+    /**
+     * 应用下载-到达uv
+     */
+    @Excel(name = "应用下载-到达uv", width = 15)
+    @ApiModelProperty(value = "应用下载-到达uv")
+    private Long inAppUv;
+    /**
+     * 应用下载-详情页到站uv
+     */
+    @Excel(name = "应用下载-详情页到站uv", width = 15)
+    @ApiModelProperty(value = "应用下载-详情页到站uv")
+    private Long inAppDetailUv;
+    /**
+     * 应用下载-加入购物车
+     */
+    @Excel(name = "应用下载-加入购物车", width = 15)
+    @ApiModelProperty(value = "应用下载-加入购物车")
+    private Long inAppCart;
+    /**
+     * 应用下载-提交订单
+     */
+    @Excel(name = "应用下载-提交订单", width = 15)
+    @ApiModelProperty(value = "应用下载-提交订单")
+    private Long inAppOrder;
+    /**
+     * 应用下载-付费
+     */
+    @Excel(name = "应用下载-付费", width = 15)
+    @ApiModelProperty(value = "应用下载-付费")
+    private Long inAppPay;
+    /**
+     * 落地页-电话拨打数
+     */
+    @Excel(name = "落地页-电话拨打数", width = 15)
+    @ApiModelProperty(value = "落地页-电话拨打数")
+    private Long phone;
+    /**
+     * 表单提交数
+     */
+    @Excel(name = "表单提交数", width = 15)
+    @ApiModelProperty(value = "表单提交数")
+    private Long form;
+    /**
+     * 落地页-地图搜索
+     */
+    @Excel(name = "落地页-地图搜索", width = 15)
+    @ApiModelProperty(value = "落地页-地图搜索")
+    private Long mapSearch;
+    /**
+     * 落地页-按钮button
+     */
+    @Excel(name = "落地页-按钮button", width = 15)
+    @ApiModelProperty(value = "落地页-按钮button")
+    private Long button;
+    /**
+     * 落地页-关键页面浏览
+     */
+    @Excel(name = "落地页-关键页面浏览", width = 15)
+    @ApiModelProperty(value = "落地页-关键页面浏览")
+    private Long view;
+    /**
+     * 落地页-QQ咨询数
+     */
+    @Excel(name = "落地页-QQ咨询数", width = 15)
+    @ApiModelProperty(value = "落地页-QQ咨询数")
+    private Long qq;
+    /**
+     * 落地页-抽奖数
+     */
+    @Excel(name = "落地页-抽奖数", width = 15)
+    @ApiModelProperty(value = "落地页-抽奖数")
+    private Long lottery;
+    /**
+     * 落地页-投票
+     */
+    @Excel(name = "落地页-投票", width = 15)
+    @ApiModelProperty(value = "落地页-投票")
+    private Long vote;
+    /**
+     * 落地页-页面跳转
+     */
+    @Excel(name = "落地页-页面跳转", width = 15)
+    @ApiModelProperty(value = "落地页-页面跳转")
+    private Long redirect;
+    /**
+     * 落地页-商品购买
+     */
+    @Excel(name = "落地页-商品购买", width = 15)
+    @ApiModelProperty(value = "落地页-商品购买")
+    private Long shopping;
+    /**
+     * 落地页-在线咨询
+     */
+    @Excel(name = "落地页-在线咨询", width = 15)
+    @ApiModelProperty(value = "落地页-在线咨询")
+    private Long consult;
+    /**
+     * 落地页-微信
+     */
+    @Excel(name = "落地页-微信", width = 15)
+    @ApiModelProperty(value = "落地页-微信")
+    private Long wechat;
+    /**
+     * 落地页-智能电话确认拨打
+     */
+    @Excel(name = "落地页-智能电话确认拨打", width = 15)
+    @ApiModelProperty(value = "落地页-智能电话确认拨打")
+    private Long phoneConfirm;
+    /**
+     * 落地页-智能电话确认接通
+     */
+    @Excel(name = "落地页-智能电话确认接通", width = 15)
+    @ApiModelProperty(value = "落地页-智能电话确认接通")
+    private Long phoneConnect;
+    /**
+     * 落地页-智能电话有效咨询
+     */
+    @Excel(name = "落地页-智能电话有效咨询", width = 15)
+    @ApiModelProperty(value = "落地页-智能电话有效咨询")
+    private Long consultEffective;
+    /**
+     * 视频-总播放
+     */
+    @Excel(name = "视频-总播放", width = 15)
+    @ApiModelProperty(value = "视频-总播放")
+    private Long totalPlay;
+    /**
+     * 视频-有效播放
+     */
+    @Excel(name = "视频-有效播放", width = 15)
+    @ApiModelProperty(value = "视频-有效播放")
+    private Long validPlay;
+    /**
+     * 视频-wifi播放
+     */
+    @Excel(name = "视频-wifi播放", width = 15)
+    @ApiModelProperty(value = "视频-wifi播放")
+    private Long wifiPlay;
+    /**
+     * 视频-播放时长,单位ms
+     */
+    @Excel(name = "视频-播放时长,单位ms", width = 15)
+    @ApiModelProperty(value = "视频-播放时长,单位ms")
+    private Long playDurationSum;
+    /**
+     * 视频-播放25%进度总数
+     */
+    @Excel(name = "视频-播放25%进度总数", width = 15)
+    @ApiModelProperty(value = "视频-播放25%进度总数")
+    private Long play25FeedBreak;
+    /**
+     * 视频-播放50%进度总数
+     */
+    @Excel(name = "视频-播放50%进度总数", width = 15)
+    @ApiModelProperty(value = "视频-播放50%进度总数")
+    private Long play50FeedBreak;
+    /**
+     * 视频-播放75%进度总数
+     */
+    @Excel(name = "视频-播放75%进度总数", width = 15)
+    @ApiModelProperty(value = "视频-播放75%进度总数")
+    private Long play75FeedBreak;
+    /**
+     * 视频-播放100%进度总数
+     */
+    @Excel(name = "视频-播放100%进度总数", width = 15)
+    @ApiModelProperty(value = "视频-播放100%进度总数")
+    private Long play100FeedBreak;
+    /**
+     * 附加创意-电话按钮
+     */
+    @Excel(name = "附加创意-电话按钮", width = 15)
+    @ApiModelProperty(value = "附加创意-电话按钮")
+    private Long advancedCreativePhoneClick;
+    /**
+     * 附加创意-在线咨询
+     */
+    @Excel(name = "附加创意-在线咨询", width = 15)
+    @ApiModelProperty(value = "附加创意-在线咨询")
+    private Long advancedCreativeCounselClick;
+    /**
+     * 附加创意-表单提交
+     */
+    @Excel(name = "附加创意-表单提交", width = 15)
+    @ApiModelProperty(value = "附加创意-表单提交")
+    private Long advancedCreativeFormClick;
+    /**
+     * 互动数据-分享数
+     */
+    @Excel(name = "互动数据-分享数", width = 15)
+    @ApiModelProperty(value = "互动数据-分享数")
+    private Long share;
+    /**
+     * 互动数据-评论数
+     */
+    @Excel(name = "互动数据-评论数", width = 15)
+    @ApiModelProperty(value = "互动数据-评论数")
+    private Long comment;
+    /**
+     * 互动数据-点赞数
+     */
+    @Excel(name = "互动数据-点赞数", width = 15)
+    @ApiModelProperty(value = "互动数据-点赞数")
+    private Long likeNum;
+    /**
+     * 互动数据-关注数
+     */
+    @Excel(name = "互动数据-关注数", width = 15)
+    @ApiModelProperty(value = "互动数据-关注数")
+    private Long follow;
+    /**
+     * 互动数据-主页访问量
+     */
+    @Excel(name = "互动数据-主页访问量", width = 15)
+    @ApiModelProperty(value = "互动数据-主页访问量")
+    private Long homeVisited;
+    /**
+     * 互动数据-挑战赛查看数
+     */
+    @Excel(name = "互动数据-挑战赛查看数", width = 15)
+    @ApiModelProperty(value = "互动数据-挑战赛查看数")
+    private Long iesChallengeClick;
+    /**
+     * 互动数据-音乐查看数
+     */
+    @Excel(name = "互动数据-音乐查看数", width = 15)
+    @ApiModelProperty(value = "互动数据-音乐查看数")
+    private Long iesMusicClick;
+    /**
+     * 互动数据-单次互动成本
+     */
+    @Excel(name = "互动数据-单次互动成本", width = 15)
+    @ApiModelProperty(value = "互动数据-单次互动成本")
+    private java.math.BigDecimal interactPerCost;
+    /**
+     * 次留数
+     */
+    @Excel(name = "次留数", width = 15)
+    @ApiModelProperty(value = "次留数")
+    private Long nextDayOpen;
+    /**
+     * 次留率
+     */
+    @Excel(name = "次留率", width = 15)
+    @ApiModelProperty(value = "次留率")
+    private java.math.BigDecimal nextDayOpenRate;
+    /**
+     * 次留成本
+     */
+    @Excel(name = "次留成本", width = 15)
+    @ApiModelProperty(value = "次留成本")
+    private java.math.BigDecimal nextDayOpenCost;
+    /**
+     * createTime
+     */
+    @ApiModelProperty(value = "createTime")
+    private Date createTime;
+    /**
+     * updateTime
+     */
+    @ApiModelProperty(value = "updateTime")
+    private Date updateTime;
+
+    public BytedanceAdvertiserHourlyReport(JSONObject data) {
+        Long playFeedBreak75 = data.getLong("play_75_feed_break");
+        if (null != playFeedBreak75) {
+            this.play75FeedBreak = playFeedBreak75;
+        }
+        Long nextDayOpen = data.getLong("next_day_open");
+        if (null != nextDayOpen) {
+            this.nextDayOpen = nextDayOpen;
+        }
+        Long convertNum = data.getLong("convert");
+        if (null != convertNum) {
+            this.convertNum = convertNum;
+        }
+        Long inAppCart = data.getLong("in_app_cart");
+        if (null != inAppCart) {
+            this.inAppCart = inAppCart;
+        }
+        Long play25FeedBreak = data.getLong("play_25_feed_break");
+        if (null != play25FeedBreak) {
+            this.play25FeedBreak = play25FeedBreak;
+        }
+        Long consultEffective = data.getLong("consult_effective");
+        if (null != consultEffective) {
+            this.consultEffective = consultEffective;
+        }
+        Long view = data.getLong("view");
+        if (null != view) {
+            this.view = view;
+        }
+        Long phoneConfirm = data.getLong("phone_confirm");
+        if (null != phoneConfirm) {
+            this.phoneConfirm = phoneConfirm;
+        }
+        Long iesMusicClick = data.getLong("ies_music_click");
+        if (null != iesMusicClick) {
+            this.iesMusicClick = iesMusicClick;
+        }
+        Long wifiPlay = data.getLong("wifi_play");
+        if (null != wifiPlay) {
+            this.wifiPlay = wifiPlay;
+        }
+        String statDatetime = data.getString("stat_datetime");
+        if (null != statDatetime && !"".equals(statDatetime.trim())) {
+            this.statDatetime = statDatetime;
+        }
+        Long shopping = data.getLong("shopping");
+        if (null != shopping) {
+            this.shopping = shopping;
+        }
+        Long qq = data.getLong("qq");
+        if (null != qq) {
+            this.qq = qq;
+        }
+        Long like = data.getLong("like");
+        if (null != like) {
+            this.likeNum = like;
+        }
+        Long play50FeedBreak = data.getLong("play_50_feed_break");
+        if (null != play50FeedBreak) {
+            this.play50FeedBreak = play50FeedBreak;
+        }
+        Long active = data.getLong("active");
+        if (null != active) {
+            this.active = active;
+        }
+        Long click = data.getLong("click");
+        if (null != click) {
+            this.click = click;
+        }
+        Long advancedCreativePhoneClick = data.getLong("advanced_creative_phone_click");
+        if (null != advancedCreativePhoneClick) {
+            this.advancedCreativePhoneClick = advancedCreativePhoneClick;
+        }
+        Long downloadStart = data.getLong("download_start");
+        if (null != downloadStart) {
+            this.downloadStart = downloadStart;
+        }
+        Long homeVisited = data.getLong("home_visited");
+        if (null != homeVisited) {
+            this.homeVisited = homeVisited;
+        }
+        Long phone = data.getLong("phone");
+        if (null != phone) {
+            this.phone = phone;
+        }
+        Long inAppPay = data.getLong("in_app_pay");
+        if (null != inAppPay) {
+            this.inAppPay = inAppPay;
+        }
+        BigDecimal nextDayOpenCost = data.getBigDecimal("next_day_open_cost");
+        if (null != nextDayOpenCost) {
+            this.nextDayOpenCost = nextDayOpenCost;
+        }
+        Long iesChallengeClick = data.getLong("ies_challenge_click");
+        if (null != iesChallengeClick) {
+            this.iesChallengeClick = iesChallengeClick;
+        }
+        Long totalPlay = data.getLong("total_play");
+        if (null != totalPlay) {
+            this.totalPlay = totalPlay;
+        }
+        Long show = data.getLong("show");
+        if (null != show) {
+            this.showNum = show;
+        }
+        BigDecimal nextDayOpenRate = data.getBigDecimal("next_day_open_rate");
+        if (null != nextDayOpenRate) {
+            this.nextDayOpenRate = nextDayOpenRate;
+        }
+        Long mapSearch = data.getLong("map_search");
+        if (null != mapSearch) {
+            this.mapSearch = mapSearch;
+        }
+        Long clickInstall = data.getLong("click_install");
+        if (null != clickInstall) {
+            this.clickInstall = clickInstall;
+        }
+        BigDecimal interactPerCost = data.getBigDecimal("interact_per_cost");
+        if (null != interactPerCost) {
+            this.interactPerCost = interactPerCost;
+        }
+        Long advertiserId = data.getLong("advertiser_id");
+        if (null != advertiserId) {
+            this.advertiserId = advertiserId;
+        }
+        Long button = data.getLong("button");
+        if (null != button) {
+            this.button = button;
+        }
+        Long playDurationSum = data.getLong("play_duration_sum");
+        if (null != playDurationSum) {
+            this.playDurationSum = playDurationSum;
+        }
+        Long play100FeedBreak = data.getLong("play_100_feed_break");
+        if (null != play100FeedBreak) {
+            this.play100FeedBreak = play100FeedBreak;
+        }
+        Long advancedCreativeCounselClick = data.getLong("advanced_creative_counsel_click");
+        if (null != advancedCreativeCounselClick) {
+            this.advancedCreativeCounselClick = advancedCreativeCounselClick;
+        }
+        Long share = data.getLong("share");
+        if (null != share) {
+            this.share = share;
+        }
+        Long consult = data.getLong("consult");
+        if (null != consult) {
+            this.consult = consult;
+        }
+        Long vote = data.getLong("vote");
+        if (null != vote) {
+            this.vote = vote;
+        }
+        Long validPlay = data.getLong("valid_play");
+        if (null != validPlay) {
+            this.validPlay = validPlay;
+        }
+        Long redirect = data.getLong("redirect");
+        if (null != redirect) {
+            this.redirect = redirect;
+        }
+        Long payCount = data.getLong("pay_count");
+        if (null != payCount) {
+            this.payCount = payCount;
+        }
+        Long advancedCreativeFormClick = data.getLong("advanced_creative_form_click");
+        if (null != advancedCreativeFormClick) {
+            this.advancedCreativeFormClick = advancedCreativeFormClick;
+        }
+        BigDecimal cost = data.getBigDecimal("cost");
+        if (null != cost) {
+            this.cost = cost;
+        }
+        Long downloadFinish = data.getLong("download_finish");
+        if (null != downloadFinish) {
+            this.downloadFinish = downloadFinish;
+        }
+        Long wechat = data.getLong("wechat");
+        if (null != wechat) {
+            this.wechat = wechat;
+        }
+        Long lottery = data.getLong("lottery");
+        if (null != lottery) {
+            this.lottery = lottery;
+        }
+        Long inAppOrder = data.getLong("in_app_order");
+        if (null != inAppOrder) {
+            this.inAppOrder = inAppOrder;
+        }
+        Long installFinish = data.getLong("install_finish");
+        if (null != installFinish) {
+            this.installFinish = installFinish;
+        }
+        Long follow = data.getLong("follow");
+        if (null != follow) {
+            this.follow = follow;
+        }
+//		Long message = data.getLong("message");
+//		if(null!=message){
+//			this.message = message;
+//		}
+        Long inAppDetailUv = data.getLong("in_app_detail_uv");
+        if (null != inAppDetailUv) {
+            this.inAppDetailUv = inAppDetailUv;
+        }
+        Long form = data.getLong("form");
+        if (null != form) {
+            this.form = form;
+        }
+//		BigDecimal convert_cost = data.getBigDecimal("convert_cost");
+//		if(null!=convert_cost){
+//			this.convertCost = convert_cost;
+//		}
+        Long comment = data.getLong("comment");
+        if (null != comment) {
+            this.comment = comment;
+        }
+        Long inAppUv = data.getLong("in_app_uv");
+        if (null != inAppUv) {
+            this.inAppUv = inAppUv;
+        }
+        Long register = data.getLong("register");
+        if (null != register) {
+            this.register = register;
+        }
+    }
+
+    public BytedanceAdvertiserHourlyReport() {
+    }
+}

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

@@ -0,0 +1,627 @@
+package org.jeecg.modules.ctop.entity;
+
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+import org.jeecgframework.poi.excel.annotation.Excel;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 广告组日报表信息
+ *
+ * @author jeecg-boot
+ * @version V1.0
+ * @date 2019-09-11
+ */
+@Data
+@TableName("ctop_bytedance_report_campaign_daily")
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value = "ctop_bytedance_report_campaign_daily对象", description = "广告组日报表信息")
+public class BytedanceCampaignDailyReport {
+
+    /**
+     * id
+     */
+    @TableId(type = IdType.AUTO)
+    @ApiModelProperty(value = "id")
+    private Long id;
+    /**
+     * 广告主id
+     */
+    @Excel(name = "广告主id", width = 15)
+    @ApiModelProperty(value = "广告主id")
+    private Long advertiserId;
+    /**
+     * 数据起始时间
+     */
+    @Excel(name = "数据起始时间", width = 15)
+    @ApiModelProperty(value = "数据起始时间")
+    private String statDatetime;
+    /**
+     * 展示量
+     */
+    @Excel(name = "展示量", width = 15)
+    @ApiModelProperty(value = "展示量")
+    private Long showNum;
+    /**
+     * 点击量
+     */
+    @Excel(name = "点击量", width = 15)
+    @ApiModelProperty(value = "点击量")
+    private Long click;
+    /**
+     * 转化量
+     */
+    @Excel(name = "转化量", width = 15)
+    @ApiModelProperty(value = "转化量")
+    private Long convertNum;
+    /**
+     * 总花费
+     */
+    @Excel(name = "总花费", width = 15)
+    @ApiModelProperty(value = "总花费")
+    private java.math.BigDecimal cost;
+    /**
+     * 应用下载-激活
+     */
+    @Excel(name = "应用下载-激活", width = 15)
+    @ApiModelProperty(value = "应用下载-激活")
+    private Long active;
+    /**
+     * 应用下载-安卓下载完成
+     */
+    @Excel(name = "应用下载-安卓下载完成", width = 15)
+    @ApiModelProperty(value = "应用下载-安卓下载完成")
+    private Long downloadFinish;
+    /**
+     * 应用下载-安卓下载开始
+     */
+    @Excel(name = "应用下载-安卓下载开始", width = 15)
+    @ApiModelProperty(value = "应用下载-安卓下载开始")
+    private Long downloadStart;
+    /**
+     * 应用下载-点击安装数
+     */
+    @Excel(name = "应用下载-点击安装数", width = 15)
+    @ApiModelProperty(value = "应用下载-点击安装数")
+    private Long clickInstall;
+    /**
+     * 应用下载-安卓安装完成
+     */
+    @Excel(name = "应用下载-安卓安装完成", width = 15)
+    @ApiModelProperty(value = "应用下载-安卓安装完成")
+    private Long installFinish;
+    /**
+     * 应用下载-注册
+     */
+    @Excel(name = "应用下载-注册", width = 15)
+    @ApiModelProperty(value = "应用下载-注册")
+    private Long register;
+    /**
+     * 应用下载-付费数
+     */
+    @Excel(name = "应用下载-付费数", width = 15)
+    @ApiModelProperty(value = "应用下载-付费数")
+    private Long payCount;
+    /**
+     * 应用下载-到达uv
+     */
+    @Excel(name = "应用下载-到达uv", width = 15)
+    @ApiModelProperty(value = "应用下载-到达uv")
+    private Long inAppUv;
+    /**
+     * 应用下载-详情页到站uv
+     */
+    @Excel(name = "应用下载-详情页到站uv", width = 15)
+    @ApiModelProperty(value = "应用下载-详情页到站uv")
+    private Long inAppDetailUv;
+    /**
+     * 应用下载-加入购物车
+     */
+    @Excel(name = "应用下载-加入购物车", width = 15)
+    @ApiModelProperty(value = "应用下载-加入购物车")
+    private Long inAppCart;
+    /**
+     * 应用下载-提交订单
+     */
+    @Excel(name = "应用下载-提交订单", width = 15)
+    @ApiModelProperty(value = "应用下载-提交订单")
+    private Long inAppOrder;
+    /**
+     * 应用下载-付费
+     */
+    @Excel(name = "应用下载-付费", width = 15)
+    @ApiModelProperty(value = "应用下载-付费")
+    private Long inAppPay;
+    /**
+     * 落地页-电话拨打数
+     */
+    @Excel(name = "落地页-电话拨打数", width = 15)
+    @ApiModelProperty(value = "落地页-电话拨打数")
+    private Long phone;
+    /**
+     * 表单提交数
+     */
+    @Excel(name = "表单提交数", width = 15)
+    @ApiModelProperty(value = "表单提交数")
+    private Long form;
+    /**
+     * 落地页-地图搜索
+     */
+    @Excel(name = "落地页-地图搜索", width = 15)
+    @ApiModelProperty(value = "落地页-地图搜索")
+    private Long mapSearch;
+    /**
+     * 落地页-按钮button
+     */
+    @Excel(name = "落地页-按钮button", width = 15)
+    @ApiModelProperty(value = "落地页-按钮button")
+    private Long button;
+    /**
+     * 落地页-关键页面浏览
+     */
+    @Excel(name = "落地页-关键页面浏览", width = 15)
+    @ApiModelProperty(value = "落地页-关键页面浏览")
+    private Long view;
+    /**
+     * 落地页-QQ咨询数
+     */
+    @Excel(name = "落地页-QQ咨询数", width = 15)
+    @ApiModelProperty(value = "落地页-QQ咨询数")
+    private Long qq;
+    /**
+     * 落地页-抽奖数
+     */
+    @Excel(name = "落地页-抽奖数", width = 15)
+    @ApiModelProperty(value = "落地页-抽奖数")
+    private Long lottery;
+    /**
+     * 落地页-投票
+     */
+    @Excel(name = "落地页-投票", width = 15)
+    @ApiModelProperty(value = "落地页-投票")
+    private Long vote;
+    /**
+     * 落地页-页面跳转
+     */
+    @Excel(name = "落地页-页面跳转", width = 15)
+    @ApiModelProperty(value = "落地页-页面跳转")
+    private Long redirect;
+    /**
+     * 落地页-商品购买
+     */
+    @Excel(name = "落地页-商品购买", width = 15)
+    @ApiModelProperty(value = "落地页-商品购买")
+    private Long shopping;
+    /**
+     * 落地页-在线咨询
+     */
+    @Excel(name = "落地页-在线咨询", width = 15)
+    @ApiModelProperty(value = "落地页-在线咨询")
+    private Long consult;
+    /**
+     * 落地页-微信
+     */
+    @Excel(name = "落地页-微信", width = 15)
+    @ApiModelProperty(value = "落地页-微信")
+    private Long wechat;
+    /**
+     * 落地页-智能电话确认拨打
+     */
+    @Excel(name = "落地页-智能电话确认拨打", width = 15)
+    @ApiModelProperty(value = "落地页-智能电话确认拨打")
+    private Long phoneConfirm;
+    /**
+     * 落地页-智能电话确认接通
+     */
+    @Excel(name = "落地页-智能电话确认接通", width = 15)
+    @ApiModelProperty(value = "落地页-智能电话确认接通")
+    private Long phoneConnect;
+    /**
+     * 落地页-智能电话有效咨询
+     */
+    @Excel(name = "落地页-智能电话有效咨询", width = 15)
+    @ApiModelProperty(value = "落地页-智能电话有效咨询")
+    private Long consultEffective;
+    /**
+     * 视频-总播放
+     */
+    @Excel(name = "视频-总播放", width = 15)
+    @ApiModelProperty(value = "视频-总播放")
+    private Long totalPlay;
+    /**
+     * 视频-有效播放
+     */
+    @Excel(name = "视频-有效播放", width = 15)
+    @ApiModelProperty(value = "视频-有效播放")
+    private Long validPlay;
+    /**
+     * 视频-wifi播放
+     */
+    @Excel(name = "视频-wifi播放", width = 15)
+    @ApiModelProperty(value = "视频-wifi播放")
+    private Long wifiPlay;
+    /**
+     * 视频-播放时长,单位ms
+     */
+    @Excel(name = "视频-播放时长,单位ms", width = 15)
+    @ApiModelProperty(value = "视频-播放时长,单位ms")
+    private Long playDurationSum;
+    /**
+     * 视频-播放25%进度总数
+     */
+    @Excel(name = "视频-播放25%进度总数", width = 15)
+    @ApiModelProperty(value = "视频-播放25%进度总数")
+    private Long play25FeedBreak;
+    /**
+     * 视频-播放50%进度总数
+     */
+    @Excel(name = "视频-播放50%进度总数", width = 15)
+    @ApiModelProperty(value = "视频-播放50%进度总数")
+    private Long play50FeedBreak;
+    /**
+     * 视频-播放75%进度总数
+     */
+    @Excel(name = "视频-播放75%进度总数", width = 15)
+    @ApiModelProperty(value = "视频-播放75%进度总数")
+    private Long play75FeedBreak;
+    /**
+     * 视频-播放100%进度总数
+     */
+    @Excel(name = "视频-播放100%进度总数", width = 15)
+    @ApiModelProperty(value = "视频-播放100%进度总数")
+    private Long play100FeedBreak;
+    /**
+     * 附加创意-电话按钮
+     */
+    @Excel(name = "附加创意-电话按钮", width = 15)
+    @ApiModelProperty(value = "附加创意-电话按钮")
+    private Long advancedCreativePhoneClick;
+    /**
+     * 附加创意-在线咨询
+     */
+    @Excel(name = "附加创意-在线咨询", width = 15)
+    @ApiModelProperty(value = "附加创意-在线咨询")
+    private Long advancedCreativeCounselClick;
+    /**
+     * 附加创意-表单提交
+     */
+    @Excel(name = "附加创意-表单提交", width = 15)
+    @ApiModelProperty(value = "附加创意-表单提交")
+    private Long advancedCreativeFormClick;
+    /**
+     * 互动数据-分享数
+     */
+    @Excel(name = "互动数据-分享数", width = 15)
+    @ApiModelProperty(value = "互动数据-分享数")
+    private Long share;
+    /**
+     * 互动数据-评论数
+     */
+    @Excel(name = "互动数据-评论数", width = 15)
+    @ApiModelProperty(value = "互动数据-评论数")
+    private Long comment;
+    /**
+     * 互动数据-点赞数
+     */
+    @Excel(name = "互动数据-点赞数", width = 15)
+    @ApiModelProperty(value = "互动数据-点赞数")
+    private Long likeNum;
+    /**
+     * 互动数据-关注数
+     */
+    @Excel(name = "互动数据-关注数", width = 15)
+    @ApiModelProperty(value = "互动数据-关注数")
+    private Long follow;
+    /**
+     * 互动数据-主页访问量
+     */
+    @Excel(name = "互动数据-主页访问量", width = 15)
+    @ApiModelProperty(value = "互动数据-主页访问量")
+    private Long homeVisited;
+    /**
+     * 互动数据-挑战赛查看数
+     */
+    @Excel(name = "互动数据-挑战赛查看数", width = 15)
+    @ApiModelProperty(value = "互动数据-挑战赛查看数")
+    private Long iesChallengeClick;
+    /**
+     * 互动数据-音乐查看数
+     */
+    @Excel(name = "互动数据-音乐查看数", width = 15)
+    @ApiModelProperty(value = "互动数据-音乐查看数")
+    private Long iesMusicClick;
+    /**
+     * 互动数据-单次互动成本
+     */
+    @Excel(name = "互动数据-单次互动成本", width = 15)
+    @ApiModelProperty(value = "互动数据-单次互动成本")
+    private java.math.BigDecimal interactPerCost;
+    /**
+     * 次留数
+     */
+    @Excel(name = "次留数", width = 15)
+    @ApiModelProperty(value = "次留数")
+    private Long nextDayOpen;
+    /**
+     * 次留率
+     */
+    @Excel(name = "次留率", width = 15)
+    @ApiModelProperty(value = "次留率")
+    private java.math.BigDecimal nextDayOpenRate;
+    /**
+     * 次留成本
+     */
+    @Excel(name = "次留成本", width = 15)
+    @ApiModelProperty(value = "次留成本")
+    private java.math.BigDecimal nextDayOpenCost;
+    /**
+     * 广告组id
+     */
+    @Excel(name = "广告组id", width = 15)
+    @ApiModelProperty(value = "广告组id")
+    private Long campaignId;
+    /**
+     * 广告组名称
+     */
+    @Excel(name = "广告组名称", width = 15)
+    @ApiModelProperty(value = "广告组名称")
+    private String campaignName;
+    /**
+     * createTime
+     */
+    @ApiModelProperty(value = "createTime")
+    private Date createTime;
+    /**
+     * updateTime
+     */
+    @ApiModelProperty(value = "updateTime")
+    private Date updateTime;
+
+    public BytedanceCampaignDailyReport(JSONObject data) {
+        Long playFeedBreak75 = data.getLong("play_75_feed_break");
+        if (null != playFeedBreak75) {
+            this.play75FeedBreak = playFeedBreak75;
+        }
+        Long nextDayOpen = data.getLong("next_day_open");
+        if (null != nextDayOpen) {
+            this.nextDayOpen = nextDayOpen;
+        }
+        Long convert = data.getLong("convert");
+        if (null != convert) {
+            this.convertNum = convert;
+        }
+        Long inAppCart = data.getLong("in_app_cart");
+        if (null != inAppCart) {
+            this.inAppCart = inAppCart;
+        }
+        Long play25FeedBreak = data.getLong("play_25_feed_break");
+        if (null != play25FeedBreak) {
+            this.play25FeedBreak = play25FeedBreak;
+        }
+        Long consultEffective = data.getLong("consult_effective");
+        if (null != consultEffective) {
+            this.consultEffective = consultEffective;
+        }
+        Long view = data.getLong("view");
+        if (null != view) {
+            this.view = view;
+        }
+        Long phoneConfirm = data.getLong("phone_confirm");
+        if (null != phoneConfirm) {
+            this.phoneConfirm = phoneConfirm;
+        }
+        Long iesMusicClick = data.getLong("ies_music_click");
+        if (null != iesMusicClick) {
+            this.iesMusicClick = iesMusicClick;
+        }
+        Long wifiPlay = data.getLong("wifi_play");
+        if (null != wifiPlay) {
+            this.wifiPlay = wifiPlay;
+        }
+        String statDatetime = data.getString("stat_datetime");
+        if (null != statDatetime && !"".equals(statDatetime.trim())) {
+            this.statDatetime = statDatetime;
+        }
+        Long shopping = data.getLong("shopping");
+        if (null != shopping) {
+            this.shopping = shopping;
+        }
+        Long qq = data.getLong("qq");
+        if (null != qq) {
+            this.qq = qq;
+        }
+        Long like = data.getLong("like");
+        if (null != like) {
+            this.likeNum = like;
+        }
+        Long play50FeedBreak = data.getLong("play_50_feed_break");
+        if (null != play50FeedBreak) {
+            this.play50FeedBreak = play50FeedBreak;
+        }
+        Long active = data.getLong("active");
+        if (null != active) {
+            this.active = active;
+        }
+        Long click = data.getLong("click");
+        if (null != click) {
+            this.click = click;
+        }
+        Long advancedCreativePhoneClick = data.getLong("advanced_creative_phone_click");
+        if (null != advancedCreativePhoneClick) {
+            this.advancedCreativePhoneClick = advancedCreativePhoneClick;
+        }
+        Long downloadStart = data.getLong("download_start");
+        if (null != downloadStart) {
+            this.downloadStart = downloadStart;
+        }
+        Long homeVisited = data.getLong("home_visited");
+        if (null != homeVisited) {
+            this.homeVisited = homeVisited;
+        }
+        Long phone = data.getLong("phone");
+        if (null != phone) {
+            this.phone = phone;
+        }
+        Long inAppPay = data.getLong("in_app_pay");
+        if (null != inAppPay) {
+            this.inAppPay = inAppPay;
+        }
+        BigDecimal nextDayOpenCost = data.getBigDecimal("next_day_open_cost");
+        if (null != nextDayOpenCost) {
+            this.nextDayOpenCost = nextDayOpenCost;
+        }
+        Long iesChallengeClick = data.getLong("ies_challenge_click");
+        if (null != iesChallengeClick) {
+            this.iesChallengeClick = iesChallengeClick;
+        }
+        Long totalPlay = data.getLong("total_play");
+        if (null != totalPlay) {
+            this.totalPlay = totalPlay;
+        }
+        Long show = data.getLong("show");
+        if (null != show) {
+            this.showNum = show;
+        }
+        BigDecimal nextDayOpenRate = data.getBigDecimal("next_day_open_rate");
+        if (null != nextDayOpenRate) {
+            this.nextDayOpenRate = nextDayOpenRate;
+        }
+        Long mapSearch = data.getLong("map_search");
+        if (null != mapSearch) {
+            this.mapSearch = mapSearch;
+        }
+        Long clickInstall = data.getLong("click_install");
+        if (null != clickInstall) {
+            this.clickInstall = clickInstall;
+        }
+        BigDecimal interactPerCost = data.getBigDecimal("interact_per_cost");
+        if (null != interactPerCost) {
+            this.interactPerCost = interactPerCost;
+        }
+        Long advertiserId = data.getLong("advertiser_id");
+        if (null != advertiserId) {
+            this.advertiserId = advertiserId;
+        }
+        Long button = data.getLong("button");
+        if (null != button) {
+            this.button = button;
+        }
+        Long playDurationSum = data.getLong("play_duration_sum");
+        if (null != playDurationSum) {
+            this.playDurationSum = playDurationSum;
+        }
+        Long play100FeedBreak = data.getLong("play_100_feed_break");
+        if (null != play100FeedBreak) {
+            this.play100FeedBreak = play100FeedBreak;
+        }
+        Long advancedCreativeCounselClick = data.getLong("advanced_creative_counsel_click");
+        if (null != advancedCreativeCounselClick) {
+            this.advancedCreativeCounselClick = advancedCreativeCounselClick;
+        }
+        Long share = data.getLong("share");
+        if (null != share) {
+            this.share = share;
+        }
+        Long consult = data.getLong("consult");
+        if (null != consult) {
+            this.consult = consult;
+        }
+        Long vote = data.getLong("vote");
+        if (null != vote) {
+            this.vote = vote;
+        }
+        Long validPlay = data.getLong("valid_play");
+        if (null != validPlay) {
+            this.validPlay = validPlay;
+        }
+        Long redirect = data.getLong("redirect");
+        if (null != redirect) {
+            this.redirect = redirect;
+        }
+        Long payCount = data.getLong("pay_count");
+        if (null != payCount) {
+            this.payCount = payCount;
+        }
+        Long advancedCreativeFormClick = data.getLong("advanced_creative_form_click");
+        if (null != advancedCreativeFormClick) {
+            this.advancedCreativeFormClick = advancedCreativeFormClick;
+        }
+        BigDecimal cost = data.getBigDecimal("cost");
+        if (null != cost) {
+            this.cost = cost;
+        }
+        Long downloadFinish = data.getLong("download_finish");
+        if (null != downloadFinish) {
+            this.downloadFinish = downloadFinish;
+        }
+        Long wechat = data.getLong("wechat");
+        if (null != wechat) {
+            this.wechat = wechat;
+        }
+        Long lottery = data.getLong("lottery");
+        if (null != lottery) {
+            this.lottery = lottery;
+        }
+        Long inAppOrder = data.getLong("in_app_order");
+        if (null != inAppOrder) {
+            this.inAppOrder = inAppOrder;
+        }
+        Long installFinish = data.getLong("install_finish");
+        if (null != installFinish) {
+            this.installFinish = installFinish;
+        }
+        Long follow = data.getLong("follow");
+        if (null != follow) {
+            this.follow = follow;
+        }
+//		Long message = data.getLong("message");
+//		if(null!=message){
+//			this.message = message;
+//		}
+        Long inAppDetailUv = data.getLong("in_app_detail_uv");
+        if (null != inAppDetailUv) {
+            this.inAppDetailUv = inAppDetailUv;
+        }
+        Long form = data.getLong("form");
+        if (null != form) {
+            this.form = form;
+        }
+//		BigDecimal convert_cost = data.getBigDecimal("convert_cost");
+//		if(null!=convert_cost){
+//			this.convertCost = convert_cost;
+//		}
+        Long comment = data.getLong("comment");
+        if (null != comment) {
+            this.comment = comment;
+        }
+        Long inAppUv = data.getLong("in_app_uv");
+        if (null != inAppUv) {
+            this.inAppUv = inAppUv;
+        }
+        Long register = data.getLong("register");
+        if (null != register) {
+            this.register = register;
+        }
+        Long campaignId = data.getLong("campaign_id");
+        if (null != campaignId) {
+            this.campaignId = campaignId;
+        }
+        String campaignName = data.getString("campaign_name");
+        if (null != campaignName) {
+            this.campaignName = campaignName;
+        }
+    }
+
+    public BytedanceCampaignDailyReport() {
+    }
+}

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

@@ -0,0 +1,627 @@
+package org.jeecg.modules.ctop.entity;
+
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+import org.jeecgframework.poi.excel.annotation.Excel;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 广告组时报表信息
+ *
+ * @author jeecg-boot
+ * @version V1.0
+ * @date 2019-09-11
+ */
+@Data
+@TableName("ctop_bytedance_report_campaign_hourly")
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value = "ctop_bytedance_report_campaign_hourly对象", description = "广告组时报表信息")
+public class BytedanceCampaignHourlyReport {
+
+    /**
+     * id
+     */
+    @TableId(type = IdType.AUTO)
+    @ApiModelProperty(value = "id")
+    private Long id;
+    /**
+     * 广告主id
+     */
+    @Excel(name = "广告主id", width = 15)
+    @ApiModelProperty(value = "广告主id")
+    private Long advertiserId;
+    /**
+     * 数据起始时间
+     */
+    @Excel(name = "数据起始时间", width = 15)
+    @ApiModelProperty(value = "数据起始时间")
+    private String statDatetime;
+    /**
+     * 展示量
+     */
+    @Excel(name = "展示量", width = 15)
+    @ApiModelProperty(value = "展示量")
+    private Long showNum;
+    /**
+     * 点击量
+     */
+    @Excel(name = "点击量", width = 15)
+    @ApiModelProperty(value = "点击量")
+    private Long click;
+    /**
+     * 转化量
+     */
+    @Excel(name = "转化量", width = 15)
+    @ApiModelProperty(value = "转化量")
+    private Long convertNum;
+    /**
+     * 总花费
+     */
+    @Excel(name = "总花费", width = 15)
+    @ApiModelProperty(value = "总花费")
+    private java.math.BigDecimal cost;
+    /**
+     * 应用下载-激活
+     */
+    @Excel(name = "应用下载-激活", width = 15)
+    @ApiModelProperty(value = "应用下载-激活")
+    private Long active;
+    /**
+     * 应用下载-安卓下载完成
+     */
+    @Excel(name = "应用下载-安卓下载完成", width = 15)
+    @ApiModelProperty(value = "应用下载-安卓下载完成")
+    private Long downloadFinish;
+    /**
+     * 应用下载-安卓下载开始
+     */
+    @Excel(name = "应用下载-安卓下载开始", width = 15)
+    @ApiModelProperty(value = "应用下载-安卓下载开始")
+    private Long downloadStart;
+    /**
+     * 应用下载-点击安装数
+     */
+    @Excel(name = "应用下载-点击安装数", width = 15)
+    @ApiModelProperty(value = "应用下载-点击安装数")
+    private Long clickInstall;
+    /**
+     * 应用下载-安卓安装完成
+     */
+    @Excel(name = "应用下载-安卓安装完成", width = 15)
+    @ApiModelProperty(value = "应用下载-安卓安装完成")
+    private Long installFinish;
+    /**
+     * 应用下载-注册
+     */
+    @Excel(name = "应用下载-注册", width = 15)
+    @ApiModelProperty(value = "应用下载-注册")
+    private Long register;
+    /**
+     * 应用下载-付费数
+     */
+    @Excel(name = "应用下载-付费数", width = 15)
+    @ApiModelProperty(value = "应用下载-付费数")
+    private Long payCount;
+    /**
+     * 应用下载-到达uv
+     */
+    @Excel(name = "应用下载-到达uv", width = 15)
+    @ApiModelProperty(value = "应用下载-到达uv")
+    private Long inAppUv;
+    /**
+     * 应用下载-详情页到站uv
+     */
+    @Excel(name = "应用下载-详情页到站uv", width = 15)
+    @ApiModelProperty(value = "应用下载-详情页到站uv")
+    private Long inAppDetailUv;
+    /**
+     * 应用下载-加入购物车
+     */
+    @Excel(name = "应用下载-加入购物车", width = 15)
+    @ApiModelProperty(value = "应用下载-加入购物车")
+    private Long inAppCart;
+    /**
+     * 应用下载-提交订单
+     */
+    @Excel(name = "应用下载-提交订单", width = 15)
+    @ApiModelProperty(value = "应用下载-提交订单")
+    private Long inAppOrder;
+    /**
+     * 应用下载-付费
+     */
+    @Excel(name = "应用下载-付费", width = 15)
+    @ApiModelProperty(value = "应用下载-付费")
+    private Long inAppPay;
+    /**
+     * 落地页-电话拨打数
+     */
+    @Excel(name = "落地页-电话拨打数", width = 15)
+    @ApiModelProperty(value = "落地页-电话拨打数")
+    private Long phone;
+    /**
+     * 表单提交数
+     */
+    @Excel(name = "表单提交数", width = 15)
+    @ApiModelProperty(value = "表单提交数")
+    private Long form;
+    /**
+     * 落地页-地图搜索
+     */
+    @Excel(name = "落地页-地图搜索", width = 15)
+    @ApiModelProperty(value = "落地页-地图搜索")
+    private Long mapSearch;
+    /**
+     * 落地页-按钮button
+     */
+    @Excel(name = "落地页-按钮button", width = 15)
+    @ApiModelProperty(value = "落地页-按钮button")
+    private Long button;
+    /**
+     * 落地页-关键页面浏览
+     */
+    @Excel(name = "落地页-关键页面浏览", width = 15)
+    @ApiModelProperty(value = "落地页-关键页面浏览")
+    private Long view;
+    /**
+     * 落地页-QQ咨询数
+     */
+    @Excel(name = "落地页-QQ咨询数", width = 15)
+    @ApiModelProperty(value = "落地页-QQ咨询数")
+    private Long qq;
+    /**
+     * 落地页-抽奖数
+     */
+    @Excel(name = "落地页-抽奖数", width = 15)
+    @ApiModelProperty(value = "落地页-抽奖数")
+    private Long lottery;
+    /**
+     * 落地页-投票
+     */
+    @Excel(name = "落地页-投票", width = 15)
+    @ApiModelProperty(value = "落地页-投票")
+    private Long vote;
+    /**
+     * 落地页-页面跳转
+     */
+    @Excel(name = "落地页-页面跳转", width = 15)
+    @ApiModelProperty(value = "落地页-页面跳转")
+    private Long redirect;
+    /**
+     * 落地页-商品购买
+     */
+    @Excel(name = "落地页-商品购买", width = 15)
+    @ApiModelProperty(value = "落地页-商品购买")
+    private Long shopping;
+    /**
+     * 落地页-在线咨询
+     */
+    @Excel(name = "落地页-在线咨询", width = 15)
+    @ApiModelProperty(value = "落地页-在线咨询")
+    private Long consult;
+    /**
+     * 落地页-微信
+     */
+    @Excel(name = "落地页-微信", width = 15)
+    @ApiModelProperty(value = "落地页-微信")
+    private Long wechat;
+    /**
+     * 落地页-智能电话确认拨打
+     */
+    @Excel(name = "落地页-智能电话确认拨打", width = 15)
+    @ApiModelProperty(value = "落地页-智能电话确认拨打")
+    private Long phoneConfirm;
+    /**
+     * 落地页-智能电话确认接通
+     */
+    @Excel(name = "落地页-智能电话确认接通", width = 15)
+    @ApiModelProperty(value = "落地页-智能电话确认接通")
+    private Long phoneConnect;
+    /**
+     * 落地页-智能电话有效咨询
+     */
+    @Excel(name = "落地页-智能电话有效咨询", width = 15)
+    @ApiModelProperty(value = "落地页-智能电话有效咨询")
+    private Long consultEffective;
+    /**
+     * 视频-总播放
+     */
+    @Excel(name = "视频-总播放", width = 15)
+    @ApiModelProperty(value = "视频-总播放")
+    private Long totalPlay;
+    /**
+     * 视频-有效播放
+     */
+    @Excel(name = "视频-有效播放", width = 15)
+    @ApiModelProperty(value = "视频-有效播放")
+    private Long validPlay;
+    /**
+     * 视频-wifi播放
+     */
+    @Excel(name = "视频-wifi播放", width = 15)
+    @ApiModelProperty(value = "视频-wifi播放")
+    private Long wifiPlay;
+    /**
+     * 视频-播放时长,单位ms
+     */
+    @Excel(name = "视频-播放时长,单位ms", width = 15)
+    @ApiModelProperty(value = "视频-播放时长,单位ms")
+    private Long playDurationSum;
+    /**
+     * 视频-播放25%进度总数
+     */
+    @Excel(name = "视频-播放25%进度总数", width = 15)
+    @ApiModelProperty(value = "视频-播放25%进度总数")
+    private Long play25FeedBreak;
+    /**
+     * 视频-播放50%进度总数
+     */
+    @Excel(name = "视频-播放50%进度总数", width = 15)
+    @ApiModelProperty(value = "视频-播放50%进度总数")
+    private Long play50FeedBreak;
+    /**
+     * 视频-播放75%进度总数
+     */
+    @Excel(name = "视频-播放75%进度总数", width = 15)
+    @ApiModelProperty(value = "视频-播放75%进度总数")
+    private Long play75FeedBreak;
+    /**
+     * 视频-播放100%进度总数
+     */
+    @Excel(name = "视频-播放100%进度总数", width = 15)
+    @ApiModelProperty(value = "视频-播放100%进度总数")
+    private Long play100FeedBreak;
+    /**
+     * 附加创意-电话按钮
+     */
+    @Excel(name = "附加创意-电话按钮", width = 15)
+    @ApiModelProperty(value = "附加创意-电话按钮")
+    private Long advancedCreativePhoneClick;
+    /**
+     * 附加创意-在线咨询
+     */
+    @Excel(name = "附加创意-在线咨询", width = 15)
+    @ApiModelProperty(value = "附加创意-在线咨询")
+    private Long advancedCreativeCounselClick;
+    /**
+     * 附加创意-表单提交
+     */
+    @Excel(name = "附加创意-表单提交", width = 15)
+    @ApiModelProperty(value = "附加创意-表单提交")
+    private Long advancedCreativeFormClick;
+    /**
+     * 互动数据-分享数
+     */
+    @Excel(name = "互动数据-分享数", width = 15)
+    @ApiModelProperty(value = "互动数据-分享数")
+    private Long share;
+    /**
+     * 互动数据-评论数
+     */
+    @Excel(name = "互动数据-评论数", width = 15)
+    @ApiModelProperty(value = "互动数据-评论数")
+    private Long comment;
+    /**
+     * 互动数据-点赞数
+     */
+    @Excel(name = "互动数据-点赞数", width = 15)
+    @ApiModelProperty(value = "互动数据-点赞数")
+    private Long likeNum;
+    /**
+     * 互动数据-关注数
+     */
+    @Excel(name = "互动数据-关注数", width = 15)
+    @ApiModelProperty(value = "互动数据-关注数")
+    private Long follow;
+    /**
+     * 互动数据-主页访问量
+     */
+    @Excel(name = "互动数据-主页访问量", width = 15)
+    @ApiModelProperty(value = "互动数据-主页访问量")
+    private Long homeVisited;
+    /**
+     * 互动数据-挑战赛查看数
+     */
+    @Excel(name = "互动数据-挑战赛查看数", width = 15)
+    @ApiModelProperty(value = "互动数据-挑战赛查看数")
+    private Long iesChallengeClick;
+    /**
+     * 互动数据-音乐查看数
+     */
+    @Excel(name = "互动数据-音乐查看数", width = 15)
+    @ApiModelProperty(value = "互动数据-音乐查看数")
+    private Long iesMusicClick;
+    /**
+     * 互动数据-单次互动成本
+     */
+    @Excel(name = "互动数据-单次互动成本", width = 15)
+    @ApiModelProperty(value = "互动数据-单次互动成本")
+    private java.math.BigDecimal interactPerCost;
+    /**
+     * 次留数
+     */
+    @Excel(name = "次留数", width = 15)
+    @ApiModelProperty(value = "次留数")
+    private Long nextDayOpen;
+    /**
+     * 次留率
+     */
+    @Excel(name = "次留率", width = 15)
+    @ApiModelProperty(value = "次留率")
+    private java.math.BigDecimal nextDayOpenRate;
+    /**
+     * 次留成本
+     */
+    @Excel(name = "次留成本", width = 15)
+    @ApiModelProperty(value = "次留成本")
+    private java.math.BigDecimal nextDayOpenCost;
+    /**
+     * 广告组id
+     */
+    @Excel(name = "广告组id", width = 15)
+    @ApiModelProperty(value = "广告组id")
+    private Long campaignId;
+    /**
+     * 广告组名称
+     */
+    @Excel(name = "广告组名称", width = 15)
+    @ApiModelProperty(value = "广告组名称")
+    private String campaignName;
+    /**
+     * createTime
+     */
+    @ApiModelProperty(value = "createTime")
+    private Date createTime;
+    /**
+     * updateTime
+     */
+    @ApiModelProperty(value = "updateTime")
+    private Date updateTime;
+
+    public BytedanceCampaignHourlyReport(JSONObject data) {
+        Long playFeedBreak75 = data.getLong("play_75_feed_break");
+        if (null != playFeedBreak75) {
+            this.play75FeedBreak = playFeedBreak75;
+        }
+        Long nextDayOpen = data.getLong("next_day_open");
+        if (null != nextDayOpen) {
+            this.nextDayOpen = nextDayOpen;
+        }
+        Long convert = data.getLong("convert");
+        if (null != convert) {
+            this.convertNum = convert;
+        }
+        Long inAppCart = data.getLong("in_app_cart");
+        if (null != inAppCart) {
+            this.inAppCart = inAppCart;
+        }
+        Long play25FeedBreak = data.getLong("play_25_feed_break");
+        if (null != play25FeedBreak) {
+            this.play25FeedBreak = play25FeedBreak;
+        }
+        Long consultEffective = data.getLong("consult_effective");
+        if (null != consultEffective) {
+            this.consultEffective = consultEffective;
+        }
+        Long view = data.getLong("view");
+        if (null != view) {
+            this.view = view;
+        }
+        Long phoneConfirm = data.getLong("phone_confirm");
+        if (null != phoneConfirm) {
+            this.phoneConfirm = phoneConfirm;
+        }
+        Long iesMusicClick = data.getLong("ies_music_click");
+        if (null != iesMusicClick) {
+            this.iesMusicClick = iesMusicClick;
+        }
+        Long wifiPlay = data.getLong("wifi_play");
+        if (null != wifiPlay) {
+            this.wifiPlay = wifiPlay;
+        }
+        String statDatetime = data.getString("stat_datetime");
+        if (null != statDatetime && !"".equals(statDatetime.trim())) {
+            this.statDatetime = statDatetime;
+        }
+        Long shopping = data.getLong("shopping");
+        if (null != shopping) {
+            this.shopping = shopping;
+        }
+        Long qq = data.getLong("qq");
+        if (null != qq) {
+            this.qq = qq;
+        }
+        Long like = data.getLong("like");
+        if (null != like) {
+            this.likeNum = like;
+        }
+        Long play50FeedBreak = data.getLong("play_50_feed_break");
+        if (null != play50FeedBreak) {
+            this.play50FeedBreak = play50FeedBreak;
+        }
+        Long active = data.getLong("active");
+        if (null != active) {
+            this.active = active;
+        }
+        Long click = data.getLong("click");
+        if (null != click) {
+            this.click = click;
+        }
+        Long advancedCreativePhoneClick = data.getLong("advanced_creative_phone_click");
+        if (null != advancedCreativePhoneClick) {
+            this.advancedCreativePhoneClick = advancedCreativePhoneClick;
+        }
+        Long downloadStart = data.getLong("download_start");
+        if (null != downloadStart) {
+            this.downloadStart = downloadStart;
+        }
+        Long homeVisited = data.getLong("home_visited");
+        if (null != homeVisited) {
+            this.homeVisited = homeVisited;
+        }
+        Long phone = data.getLong("phone");
+        if (null != phone) {
+            this.phone = phone;
+        }
+        Long inAppPay = data.getLong("in_app_pay");
+        if (null != inAppPay) {
+            this.inAppPay = inAppPay;
+        }
+        BigDecimal nextDayOpenCost = data.getBigDecimal("next_day_open_cost");
+        if (null != nextDayOpenCost) {
+            this.nextDayOpenCost = nextDayOpenCost;
+        }
+        Long iesChallengeClick = data.getLong("ies_challenge_click");
+        if (null != iesChallengeClick) {
+            this.iesChallengeClick = iesChallengeClick;
+        }
+        Long totalPlay = data.getLong("total_play");
+        if (null != totalPlay) {
+            this.totalPlay = totalPlay;
+        }
+        Long show = data.getLong("show");
+        if (null != show) {
+            this.showNum = show;
+        }
+        BigDecimal nextDayOpenRate = data.getBigDecimal("next_day_open_rate");
+        if (null != nextDayOpenRate) {
+            this.nextDayOpenRate = nextDayOpenRate;
+        }
+        Long mapSearch = data.getLong("map_search");
+        if (null != mapSearch) {
+            this.mapSearch = mapSearch;
+        }
+        Long clickInstall = data.getLong("click_install");
+        if (null != clickInstall) {
+            this.clickInstall = clickInstall;
+        }
+        BigDecimal interactPerCost = data.getBigDecimal("interact_per_cost");
+        if (null != interactPerCost) {
+            this.interactPerCost = interactPerCost;
+        }
+        Long advertiserId = data.getLong("advertiser_id");
+        if (null != advertiserId) {
+            this.advertiserId = advertiserId;
+        }
+        Long button = data.getLong("button");
+        if (null != button) {
+            this.button = button;
+        }
+        Long playDurationSum = data.getLong("play_duration_sum");
+        if (null != playDurationSum) {
+            this.playDurationSum = playDurationSum;
+        }
+        Long play100FeedBreak = data.getLong("play_100_feed_break");
+        if (null != play100FeedBreak) {
+            this.play100FeedBreak = play100FeedBreak;
+        }
+        Long advancedCreativeCounselClick = data.getLong("advanced_creative_counsel_click");
+        if (null != advancedCreativeCounselClick) {
+            this.advancedCreativeCounselClick = advancedCreativeCounselClick;
+        }
+        Long share = data.getLong("share");
+        if (null != share) {
+            this.share = share;
+        }
+        Long consult = data.getLong("consult");
+        if (null != consult) {
+            this.consult = consult;
+        }
+        Long vote = data.getLong("vote");
+        if (null != vote) {
+            this.vote = vote;
+        }
+        Long validPlay = data.getLong("valid_play");
+        if (null != validPlay) {
+            this.validPlay = validPlay;
+        }
+        Long redirect = data.getLong("redirect");
+        if (null != redirect) {
+            this.redirect = redirect;
+        }
+        Long payCount = data.getLong("pay_count");
+        if (null != payCount) {
+            this.payCount = payCount;
+        }
+        Long advancedCreativeFormClick = data.getLong("advanced_creative_form_click");
+        if (null != advancedCreativeFormClick) {
+            this.advancedCreativeFormClick = advancedCreativeFormClick;
+        }
+        BigDecimal cost = data.getBigDecimal("cost");
+        if (null != cost) {
+            this.cost = cost;
+        }
+        Long downloadFinish = data.getLong("download_finish");
+        if (null != downloadFinish) {
+            this.downloadFinish = downloadFinish;
+        }
+        Long wechat = data.getLong("wechat");
+        if (null != wechat) {
+            this.wechat = wechat;
+        }
+        Long lottery = data.getLong("lottery");
+        if (null != lottery) {
+            this.lottery = lottery;
+        }
+        Long inAppOrder = data.getLong("in_app_order");
+        if (null != inAppOrder) {
+            this.inAppOrder = inAppOrder;
+        }
+        Long installFinish = data.getLong("install_finish");
+        if (null != installFinish) {
+            this.installFinish = installFinish;
+        }
+        Long follow = data.getLong("follow");
+        if (null != follow) {
+            this.follow = follow;
+        }
+//		Long message = data.getLong("message");
+//		if(null!=message){
+//			this.message = message;
+//		}
+        Long inAppDetailUv = data.getLong("in_app_detail_uv");
+        if (null != inAppDetailUv) {
+            this.inAppDetailUv = inAppDetailUv;
+        }
+        Long form = data.getLong("form");
+        if (null != form) {
+            this.form = form;
+        }
+//		BigDecimal convert_cost = data.getBigDecimal("convert_cost");
+//		if(null!=convert_cost){
+//			this.convertCost = convert_cost;
+//		}
+        Long comment = data.getLong("comment");
+        if (null != comment) {
+            this.comment = comment;
+        }
+        Long inAppUv = data.getLong("in_app_uv");
+        if (null != inAppUv) {
+            this.inAppUv = inAppUv;
+        }
+        Long register = data.getLong("register");
+        if (null != register) {
+            this.register = register;
+        }
+        Long campaignId = data.getLong("campaign_id");
+        if (null != campaignId) {
+            this.campaignId = campaignId;
+        }
+        String campaignName = data.getString("campaign_name");
+        if (null != campaignName) {
+            this.campaignName = campaignName;
+        }
+    }
+
+    public BytedanceCampaignHourlyReport() {
+    }
+}

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

@@ -0,0 +1,657 @@
+package org.jeecg.modules.ctop.entity;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+import com.alibaba.fastjson.JSONObject;
+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;
+
+/**
+ * @Description: 广告创意日报表信息
+ * @Author: jeecg-boot
+ * @Date: 2019-09-11
+ * @Version: V1.0
+ */
+@Data
+@TableName("ctop_bytedance_report_creative_daily")
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value = "ctop_bytedance_report_creative_daily对象", description = "广告创意日报表信息")
+public class BytedanceCreativeDailyReport {
+
+    /**
+     * id
+     */
+    @TableId(type = IdType.UUID)
+    @ApiModelProperty(value = "id")
+    private Long id;
+    /**
+     * 广告主id
+     */
+    @Excel(name = "广告主id", width = 15)
+    @ApiModelProperty(value = "广告主id")
+    private Long advertiserId;
+    /**
+     * 数据起始时间
+     */
+    @Excel(name = "数据起始时间", width = 15)
+    @ApiModelProperty(value = "数据起始时间")
+    private String statDatetime;
+    /**
+     * 展示量
+     */
+    @Excel(name = "展示量", width = 15)
+    @ApiModelProperty(value = "展示量")
+    private Long showNum;
+    /**
+     * 点击量
+     */
+    @Excel(name = "点击量", width = 15)
+    @ApiModelProperty(value = "点击量")
+    private Long click;
+    /**
+     * 转化量
+     */
+    @Excel(name = "转化量", width = 15)
+    @ApiModelProperty(value = "转化量")
+    private Long convertNum;
+    /**
+     * 总花费
+     */
+    @Excel(name = "总花费", width = 15)
+    @ApiModelProperty(value = "总花费")
+    private java.math.BigDecimal cost;
+    /**
+     * 应用下载-激活
+     */
+    @Excel(name = "应用下载-激活", width = 15)
+    @ApiModelProperty(value = "应用下载-激活")
+    private Long active;
+    /**
+     * 应用下载-安卓下载完成
+     */
+    @Excel(name = "应用下载-安卓下载完成", width = 15)
+    @ApiModelProperty(value = "应用下载-安卓下载完成")
+    private Long downloadFinish;
+    /**
+     * 应用下载-安卓下载开始
+     */
+    @Excel(name = "应用下载-安卓下载开始", width = 15)
+    @ApiModelProperty(value = "应用下载-安卓下载开始")
+    private Long downloadStart;
+    /**
+     * 应用下载-点击安装数
+     */
+    @Excel(name = "应用下载-点击安装数", width = 15)
+    @ApiModelProperty(value = "应用下载-点击安装数")
+    private Long clickInstall;
+    /**
+     * 应用下载-安卓安装完成
+     */
+    @Excel(name = "应用下载-安卓安装完成", width = 15)
+    @ApiModelProperty(value = "应用下载-安卓安装完成")
+    private Long installFinish;
+    /**
+     * 应用下载-注册
+     */
+    @Excel(name = "应用下载-注册", width = 15)
+    @ApiModelProperty(value = "应用下载-注册")
+    private Long register;
+    /**
+     * 应用下载-付费数
+     */
+    @Excel(name = "应用下载-付费数", width = 15)
+    @ApiModelProperty(value = "应用下载-付费数")
+    private Long payCount;
+    /**
+     * 应用下载-到达uv
+     */
+    @Excel(name = "应用下载-到达uv", width = 15)
+    @ApiModelProperty(value = "应用下载-到达uv")
+    private Long inAppUv;
+    /**
+     * 应用下载-详情页到站uv
+     */
+    @Excel(name = "应用下载-详情页到站uv", width = 15)
+    @ApiModelProperty(value = "应用下载-详情页到站uv")
+    private Long inAppDetailUv;
+    /**
+     * 应用下载-加入购物车
+     */
+    @Excel(name = "应用下载-加入购物车", width = 15)
+    @ApiModelProperty(value = "应用下载-加入购物车")
+    private Long inAppCart;
+    /**
+     * 应用下载-提交订单
+     */
+    @Excel(name = "应用下载-提交订单", width = 15)
+    @ApiModelProperty(value = "应用下载-提交订单")
+    private Long inAppOrder;
+    /**
+     * 应用下载-付费
+     */
+    @Excel(name = "应用下载-付费", width = 15)
+    @ApiModelProperty(value = "应用下载-付费")
+    private Long inAppPay;
+    /**
+     * 落地页-电话拨打数
+     */
+    @Excel(name = "落地页-电话拨打数", width = 15)
+    @ApiModelProperty(value = "落地页-电话拨打数")
+    private Long phone;
+    /**
+     * 表单提交数
+     */
+    @Excel(name = "表单提交数", width = 15)
+    @ApiModelProperty(value = "表单提交数")
+    private Long form;
+    /**
+     * 落地页-地图搜索
+     */
+    @Excel(name = "落地页-地图搜索", width = 15)
+    @ApiModelProperty(value = "落地页-地图搜索")
+    private Long mapSearch;
+    /**
+     * 落地页-按钮button
+     */
+    @Excel(name = "落地页-按钮button", width = 15)
+    @ApiModelProperty(value = "落地页-按钮button")
+    private Long button;
+    /**
+     * 落地页-关键页面浏览
+     */
+    @Excel(name = "落地页-关键页面浏览", width = 15)
+    @ApiModelProperty(value = "落地页-关键页面浏览")
+    private Long view;
+    /**
+     * 落地页-QQ咨询数
+     */
+    @Excel(name = "落地页-QQ咨询数", width = 15)
+    @ApiModelProperty(value = "落地页-QQ咨询数")
+    private Long qq;
+    /**
+     * 落地页-抽奖数
+     */
+    @Excel(name = "落地页-抽奖数", width = 15)
+    @ApiModelProperty(value = "落地页-抽奖数")
+    private Long lottery;
+    /**
+     * 落地页-投票
+     */
+    @Excel(name = "落地页-投票", width = 15)
+    @ApiModelProperty(value = "落地页-投票")
+    private Long vote;
+    /**
+     * 落地页-页面跳转
+     */
+    @Excel(name = "落地页-页面跳转", width = 15)
+    @ApiModelProperty(value = "落地页-页面跳转")
+    private Long redirect;
+    /**
+     * 落地页-商品购买
+     */
+    @Excel(name = "落地页-商品购买", width = 15)
+    @ApiModelProperty(value = "落地页-商品购买")
+    private Long shopping;
+    /**
+     * 落地页-在线咨询
+     */
+    @Excel(name = "落地页-在线咨询", width = 15)
+    @ApiModelProperty(value = "落地页-在线咨询")
+    private Long consult;
+    /**
+     * 落地页-微信
+     */
+    @Excel(name = "落地页-微信", width = 15)
+    @ApiModelProperty(value = "落地页-微信")
+    private Long wechat;
+    /**
+     * 落地页-智能电话确认拨打
+     */
+    @Excel(name = "落地页-智能电话确认拨打", width = 15)
+    @ApiModelProperty(value = "落地页-智能电话确认拨打")
+    private Long phoneConfirm;
+    /**
+     * 落地页-智能电话确认接通
+     */
+    @Excel(name = "落地页-智能电话确认接通", width = 15)
+    @ApiModelProperty(value = "落地页-智能电话确认接通")
+    private Long phoneConnect;
+    /**
+     * 落地页-智能电话有效咨询
+     */
+    @Excel(name = "落地页-智能电话有效咨询", width = 15)
+    @ApiModelProperty(value = "落地页-智能电话有效咨询")
+    private Long consultEffective;
+    /**
+     * 视频-总播放
+     */
+    @Excel(name = "视频-总播放", width = 15)
+    @ApiModelProperty(value = "视频-总播放")
+    private Long totalPlay;
+    /**
+     * 视频-有效播放
+     */
+    @Excel(name = "视频-有效播放", width = 15)
+    @ApiModelProperty(value = "视频-有效播放")
+    private Long validPlay;
+    /**
+     * 视频-wifi播放
+     */
+    @Excel(name = "视频-wifi播放", width = 15)
+    @ApiModelProperty(value = "视频-wifi播放")
+    private Long wifiPlay;
+    /**
+     * 视频-播放时长,单位ms
+     */
+    @Excel(name = "视频-播放时长,单位ms", width = 15)
+    @ApiModelProperty(value = "视频-播放时长,单位ms")
+    private Long playDurationSum;
+    /**
+     * 视频-播放25%进度总数
+     */
+    @Excel(name = "视频-播放25%进度总数", width = 15)
+    @ApiModelProperty(value = "视频-播放25%进度总数")
+    private Long play25FeedBreak;
+    /**
+     * 视频-播放50%进度总数
+     */
+    @Excel(name = "视频-播放50%进度总数", width = 15)
+    @ApiModelProperty(value = "视频-播放50%进度总数")
+    private Long play50FeedBreak;
+    /**
+     * 视频-播放75%进度总数
+     */
+    @Excel(name = "视频-播放75%进度总数", width = 15)
+    @ApiModelProperty(value = "视频-播放75%进度总数")
+    private Long play75FeedBreak;
+    /**
+     * 视频-播放100%进度总数
+     */
+    @Excel(name = "视频-播放100%进度总数", width = 15)
+    @ApiModelProperty(value = "视频-播放100%进度总数")
+    private Long play100FeedBreak;
+    /**
+     * 附加创意-电话按钮
+     */
+    @Excel(name = "附加创意-电话按钮", width = 15)
+    @ApiModelProperty(value = "附加创意-电话按钮")
+    private Long advancedCreativePhoneClick;
+    /**
+     * 附加创意-在线咨询
+     */
+    @Excel(name = "附加创意-在线咨询", width = 15)
+    @ApiModelProperty(value = "附加创意-在线咨询")
+    private Long advancedCreativeCounselClick;
+    /**
+     * 附加创意-表单提交
+     */
+    @Excel(name = "附加创意-表单提交", width = 15)
+    @ApiModelProperty(value = "附加创意-表单提交")
+    private Long advancedCreativeFormClick;
+    /**
+     * 互动数据-分享数
+     */
+    @Excel(name = "互动数据-分享数", width = 15)
+    @ApiModelProperty(value = "互动数据-分享数")
+    private Long share;
+    /**
+     * 互动数据-评论数
+     */
+    @Excel(name = "互动数据-评论数", width = 15)
+    @ApiModelProperty(value = "互动数据-评论数")
+    private Long comment;
+    /**
+     * 互动数据-点赞数
+     */
+    @Excel(name = "互动数据-点赞数", width = 15)
+    @ApiModelProperty(value = "互动数据-点赞数")
+    private Long likeNum;
+    /**
+     * 互动数据-关注数
+     */
+    @Excel(name = "互动数据-关注数", width = 15)
+    @ApiModelProperty(value = "互动数据-关注数")
+    private Long follow;
+    /**
+     * 互动数据-主页访问量
+     */
+    @Excel(name = "互动数据-主页访问量", width = 15)
+    @ApiModelProperty(value = "互动数据-主页访问量")
+    private Long homeVisited;
+    /**
+     * 互动数据-挑战赛查看数
+     */
+    @Excel(name = "互动数据-挑战赛查看数", width = 15)
+    @ApiModelProperty(value = "互动数据-挑战赛查看数")
+    private Long iesChallengeClick;
+    /**
+     * 互动数据-音乐查看数
+     */
+    @Excel(name = "互动数据-音乐查看数", width = 15)
+    @ApiModelProperty(value = "互动数据-音乐查看数")
+    private Long iesMusicClick;
+    /**
+     * 互动数据-单次互动成本
+     */
+    @Excel(name = "互动数据-单次互动成本", width = 15)
+    @ApiModelProperty(value = "互动数据-单次互动成本")
+    private java.math.BigDecimal interactPerCost;
+    /**
+     * 次留数
+     */
+    @Excel(name = "次留数", width = 15)
+    @ApiModelProperty(value = "次留数")
+    private Long nextDayOpen;
+    /**
+     * 次留率
+     */
+    @Excel(name = "次留率", width = 15)
+    @ApiModelProperty(value = "次留率")
+    private java.math.BigDecimal nextDayOpenRate;
+    /**
+     * 次留成本
+     */
+    @Excel(name = "次留成本", width = 15)
+    @ApiModelProperty(value = "次留成本")
+    private java.math.BigDecimal nextDayOpenCost;
+    /**
+     * 广告组id
+     */
+    @Excel(name = "广告计划id", width = 15)
+    @ApiModelProperty(value = "广告计划id")
+    private Long adId;
+    /**
+     * 广告组名称
+     */
+    @Excel(name = "广告计划名称", width = 15)
+    @ApiModelProperty(value = "广告组名称")
+    private String adName;
+    /**
+     * campaignId
+     */
+    @Excel(name = "广告组id", width = 15)
+    @ApiModelProperty(value = "广告组id")
+    private Long campaignId;
+    /**
+     * 广告组名称
+     */
+    @Excel(name = "广告组名称", width = 15)
+    @ApiModelProperty(value = "广告组名称")
+    private String campaignName;
+    @Excel(name = "创意id", width = 15)
+    @ApiModelProperty(value = "创意id")
+    private Long creativeId;
+    /**
+     * createTime
+     */
+    @ApiModelProperty(value = "createTime")
+    private Date createTime;
+    /**
+     * updateTime
+     */
+    @ApiModelProperty(value = "updateTime")
+    private Date updateTime;
+
+    public BytedanceCreativeDailyReport(JSONObject data) {
+        Long playFeedBreak75 = data.getLong("play_75_feed_break");
+        if (null != playFeedBreak75) {
+            this.play75FeedBreak = playFeedBreak75;
+        }
+        Long next_day_open = data.getLong("next_day_open");
+        if (null != next_day_open) {
+            this.nextDayOpen = next_day_open;
+        }
+        Long convert = data.getLong("convert");
+        if (null != convert) {
+            this.convertNum = convert;
+        }
+        Long in_app_cart = data.getLong("in_app_cart");
+        if (null != in_app_cart) {
+            this.inAppCart = in_app_cart;
+        }
+        Long play_25_feed_break = data.getLong("play_25_feed_break");
+        if (null != play_25_feed_break) {
+            this.play25FeedBreak = play_25_feed_break;
+        }
+        Long consult_effective = data.getLong("consult_effective");
+        if (null != consult_effective) {
+            this.consultEffective = consult_effective;
+        }
+        Long view = data.getLong("view");
+        if (null != view) {
+            this.view = view;
+        }
+        Long phone_confirm = data.getLong("phone_confirm");
+        if (null != phone_confirm) {
+            this.phoneConfirm = phone_confirm;
+        }
+        Long ies_music_click = data.getLong("ies_music_click");
+        if (null != ies_music_click) {
+            this.iesMusicClick = ies_music_click;
+        }
+        Long wifi_play = data.getLong("wifi_play");
+        if (null != wifi_play) {
+            this.wifiPlay = wifi_play;
+        }
+        String stat_datetime = data.getString("stat_datetime");
+        if (null != stat_datetime && !"".equals(stat_datetime.trim())) {
+            this.statDatetime = stat_datetime;
+        }
+        Long shopping = data.getLong("shopping");
+        if (null != shopping) {
+            this.shopping = shopping;
+        }
+        Long qq = data.getLong("qq");
+        if (null != qq) {
+            this.qq = qq;
+        }
+        Long like = data.getLong("like");
+        if (null != like) {
+            this.likeNum = like;
+        }
+        Long play_50_feed_break = data.getLong("play_50_feed_break");
+        if (null != play_50_feed_break) {
+            this.play50FeedBreak = play_50_feed_break;
+        }
+        Long active = data.getLong("active");
+        if (null != active) {
+            this.active = active;
+        }
+        Long click = data.getLong("click");
+        if (null != click) {
+            this.click = click;
+        }
+        Long advanced_creative_phone_click = data.getLong("advanced_creative_phone_click");
+        if (null != advanced_creative_phone_click) {
+            this.advancedCreativePhoneClick = advanced_creative_phone_click;
+        }
+        Long download_start = data.getLong("download_start");
+        if (null != download_start) {
+            this.downloadStart = download_start;
+        }
+        Long home_visited = data.getLong("home_visited");
+        if (null != home_visited) {
+            this.homeVisited = home_visited;
+        }
+        Long phone = data.getLong("phone");
+        if (null != phone) {
+            this.phone = phone;
+        }
+        Long in_app_pay = data.getLong("in_app_pay");
+        if (null != in_app_pay) {
+            this.inAppPay = in_app_pay;
+        }
+        BigDecimal next_day_open_cost = data.getBigDecimal("next_day_open_cost");
+        if (null != next_day_open_cost) {
+            this.nextDayOpenCost = next_day_open_cost;
+        }
+        Long ies_challenge_click = data.getLong("ies_challenge_click");
+        if (null != ies_challenge_click) {
+            this.iesChallengeClick = ies_challenge_click;
+        }
+        Long total_play = data.getLong("total_play");
+        if (null != total_play) {
+            this.totalPlay = total_play;
+        }
+        Long show = data.getLong("show");
+        if (null != show) {
+            this.showNum = show;
+        }
+        BigDecimal next_day_open_rate = data.getBigDecimal("next_day_open_rate");
+        if (null != next_day_open_rate) {
+            this.nextDayOpenRate = next_day_open_rate;
+        }
+        Long map_search = data.getLong("map_search");
+        if (null != map_search) {
+            this.mapSearch = map_search;
+        }
+        Long click_install = data.getLong("click_install");
+        if (null != click_install) {
+            this.clickInstall = click_install;
+        }
+        BigDecimal interact_per_cost = data.getBigDecimal("interact_per_cost");
+        if (null != interact_per_cost) {
+            this.interactPerCost = interact_per_cost;
+        }
+        Long advertiser_id = data.getLong("advertiser_id");
+        if (null != advertiser_id) {
+            this.advertiserId = advertiser_id;
+        }
+        Long button = data.getLong("button");
+        if (null != button) {
+            this.button = button;
+        }
+        Long play_duration_sum = data.getLong("play_duration_sum");
+        if (null != play_duration_sum) {
+            this.playDurationSum = play_duration_sum;
+        }
+        Long play_100_feed_break = data.getLong("play_100_feed_break");
+        if (null != play_100_feed_break) {
+            this.play100FeedBreak = play_100_feed_break;
+        }
+        Long advanced_creative_counsel_click = data.getLong("advanced_creative_counsel_click");
+        if (null != advanced_creative_counsel_click) {
+            this.advancedCreativeCounselClick = advanced_creative_counsel_click;
+        }
+        Long share = data.getLong("share");
+        if (null != share) {
+            this.share = share;
+        }
+        Long consult = data.getLong("consult");
+        if (null != consult) {
+            this.consult = consult;
+        }
+        Long vote = data.getLong("vote");
+        if (null != vote) {
+            this.vote = vote;
+        }
+        Long valid_play = data.getLong("valid_play");
+        if (null != valid_play) {
+            this.validPlay = valid_play;
+        }
+        Long redirect = data.getLong("redirect");
+        if (null != redirect) {
+            this.redirect = redirect;
+        }
+        Long pay_count = data.getLong("pay_count");
+        if (null != pay_count) {
+            this.payCount = pay_count;
+        }
+        Long advanced_creative_form_click = data.getLong("advanced_creative_form_click");
+        if (null != advanced_creative_form_click) {
+            this.advancedCreativeFormClick = advanced_creative_form_click;
+        }
+        BigDecimal cost = data.getBigDecimal("cost");
+        if (null != cost) {
+            this.cost = cost;
+        }
+        Long download_finish = data.getLong("download_finish");
+        if (null != download_finish) {
+            this.downloadFinish = download_finish;
+        }
+        Long wechat = data.getLong("wechat");
+        if (null != wechat) {
+            this.wechat = wechat;
+        }
+        Long lottery = data.getLong("lottery");
+        if (null != lottery) {
+            this.lottery = lottery;
+        }
+        Long in_app_order = data.getLong("in_app_order");
+        if (null != in_app_order) {
+            this.inAppOrder = in_app_order;
+        }
+        Long install_finish = data.getLong("install_finish");
+        if (null != install_finish) {
+            this.installFinish = install_finish;
+        }
+        Long follow = data.getLong("follow");
+        if (null != follow) {
+            this.follow = follow;
+        }
+//		Long message = data.getLong("message");
+//		if(null!=message){
+//			this.message = message;
+//		}
+        Long in_app_detail_uv = data.getLong("in_app_detail_uv");
+        if (null != in_app_detail_uv) {
+            this.inAppDetailUv = in_app_detail_uv;
+        }
+        Long form = data.getLong("form");
+        if (null != form) {
+            this.form = form;
+        }
+//		BigDecimal convert_cost = data.getBigDecimal("convert_cost");
+//		if(null!=convert_cost){
+//			this.convertCost = convert_cost;
+//		}
+        Long comment = data.getLong("comment");
+        if (null != comment) {
+            this.comment = comment;
+        }
+        Long in_app_uv = data.getLong("in_app_uv");
+        if (null != in_app_uv) {
+            this.inAppUv = in_app_uv;
+        }
+        Long register = data.getLong("register");
+        if (null != register) {
+            this.register = register;
+        }
+        Long campaignId = data.getLong("campaign_id");
+        if (null != campaignId) {
+            this.campaignId = campaignId;
+        }
+        String campaignName = data.getString("campaign_name");
+        if (null != campaignName) {
+            this.campaignName = campaignName;
+        }
+        String adName = data.getString("ad_name");
+        if (null != adName) {
+            this.adName = adName;
+        }
+        Long adId = data.getLong("ad_id");
+        if (null != adId) {
+            this.adId = adId;
+        }
+        Long creative_id = data.getLong("creative_id");
+        if (null != creative_id) {
+            this.creativeId = creative_id;
+        }
+    }
+
+    public BytedanceCreativeDailyReport() {
+    }
+}

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

@@ -0,0 +1,654 @@
+package org.jeecg.modules.ctop.entity;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+import com.alibaba.fastjson.JSONObject;
+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;
+
+/**
+ * @Description: 广告创意日报表信息
+ * @Author: jeecg-boot
+ * @Date: 2019-09-11
+ * @Version: V1.0
+ */
+@Data
+@TableName("ctop_bytedance_report_creative_hourly")
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value = "ctop_bytedance_report_creative_hourly对象", description = "广告创意日报表信息")
+public class BytedanceCreativeHourlyReport {
+
+    /**
+     * id
+     */
+    @TableId(type = IdType.UUID)
+    @ApiModelProperty(value = "id")
+    private Long id;
+    /**
+     * 广告主id
+     */
+    @Excel(name = "广告主id", width = 15)
+    @ApiModelProperty(value = "广告主id")
+    private Long advertiserId;
+    /**
+     * 数据起始时间
+     */
+    @Excel(name = "数据起始时间", width = 15)
+    @ApiModelProperty(value = "数据起始时间")
+    private String statDatetime;
+    /**
+     * 展示量
+     */
+    @Excel(name = "展示量", width = 15)
+    @ApiModelProperty(value = "展示量")
+    private Long showNum;
+    /**
+     * 点击量
+     */
+    @Excel(name = "点击量", width = 15)
+    @ApiModelProperty(value = "点击量")
+    private Long click;
+    /**
+     * 转化量
+     */
+    @Excel(name = "转化量", width = 15)
+    @ApiModelProperty(value = "转化量")
+    private Long convertNum;
+    /**
+     * 总花费
+     */
+    @Excel(name = "总花费", width = 15)
+    @ApiModelProperty(value = "总花费")
+    private java.math.BigDecimal cost;
+    /**
+     * 应用下载-激活
+     */
+    @Excel(name = "应用下载-激活", width = 15)
+    @ApiModelProperty(value = "应用下载-激活")
+    private Long active;
+    /**
+     * 应用下载-安卓下载完成
+     */
+    @Excel(name = "应用下载-安卓下载完成", width = 15)
+    @ApiModelProperty(value = "应用下载-安卓下载完成")
+    private Long downloadFinish;
+    /**
+     * 应用下载-安卓下载开始
+     */
+    @Excel(name = "应用下载-安卓下载开始", width = 15)
+    @ApiModelProperty(value = "应用下载-安卓下载开始")
+    private Long downloadStart;
+    /**
+     * 应用下载-点击安装数
+     */
+    @Excel(name = "应用下载-点击安装数", width = 15)
+    @ApiModelProperty(value = "应用下载-点击安装数")
+    private Long clickInstall;
+    /**
+     * 应用下载-安卓安装完成
+     */
+    @Excel(name = "应用下载-安卓安装完成", width = 15)
+    @ApiModelProperty(value = "应用下载-安卓安装完成")
+    private Long installFinish;
+    /**
+     * 应用下载-注册
+     */
+    @Excel(name = "应用下载-注册", width = 15)
+    @ApiModelProperty(value = "应用下载-注册")
+    private Long register;
+    /**
+     * 应用下载-付费数
+     */
+    @Excel(name = "应用下载-付费数", width = 15)
+    @ApiModelProperty(value = "应用下载-付费数")
+    private Long payCount;
+    /**
+     * 应用下载-到达uv
+     */
+    @Excel(name = "应用下载-到达uv", width = 15)
+    @ApiModelProperty(value = "应用下载-到达uv")
+    private Long inAppUv;
+    /**
+     * 应用下载-详情页到站uv
+     */
+    @Excel(name = "应用下载-详情页到站uv", width = 15)
+    @ApiModelProperty(value = "应用下载-详情页到站uv")
+    private Long inAppDetailUv;
+    /**
+     * 应用下载-加入购物车
+     */
+    @Excel(name = "应用下载-加入购物车", width = 15)
+    @ApiModelProperty(value = "应用下载-加入购物车")
+    private Long inAppCart;
+    /**
+     * 应用下载-提交订单
+     */
+    @Excel(name = "应用下载-提交订单", width = 15)
+    @ApiModelProperty(value = "应用下载-提交订单")
+    private Long inAppOrder;
+    /**
+     * 应用下载-付费
+     */
+    @Excel(name = "应用下载-付费", width = 15)
+    @ApiModelProperty(value = "应用下载-付费")
+    private Long inAppPay;
+    /**
+     * 落地页-电话拨打数
+     */
+    @Excel(name = "落地页-电话拨打数", width = 15)
+    @ApiModelProperty(value = "落地页-电话拨打数")
+    private Long phone;
+    /**
+     * 表单提交数
+     */
+    @Excel(name = "表单提交数", width = 15)
+    @ApiModelProperty(value = "表单提交数")
+    private Long form;
+    /**
+     * 落地页-地图搜索
+     */
+    @Excel(name = "落地页-地图搜索", width = 15)
+    @ApiModelProperty(value = "落地页-地图搜索")
+    private Long mapSearch;
+    /**
+     * 落地页-按钮button
+     */
+    @Excel(name = "落地页-按钮button", width = 15)
+    @ApiModelProperty(value = "落地页-按钮button")
+    private Long button;
+    /**
+     * 落地页-关键页面浏览
+     */
+    @Excel(name = "落地页-关键页面浏览", width = 15)
+    @ApiModelProperty(value = "落地页-关键页面浏览")
+    private Long view;
+    /**
+     * 落地页-QQ咨询数
+     */
+    @Excel(name = "落地页-QQ咨询数", width = 15)
+    @ApiModelProperty(value = "落地页-QQ咨询数")
+    private Long qq;
+    /**
+     * 落地页-抽奖数
+     */
+    @Excel(name = "落地页-抽奖数", width = 15)
+    @ApiModelProperty(value = "落地页-抽奖数")
+    private Long lottery;
+    /**
+     * 落地页-投票
+     */
+    @Excel(name = "落地页-投票", width = 15)
+    @ApiModelProperty(value = "落地页-投票")
+    private Long vote;
+    /**
+     * 落地页-页面跳转
+     */
+    @Excel(name = "落地页-页面跳转", width = 15)
+    @ApiModelProperty(value = "落地页-页面跳转")
+    private Long redirect;
+    /**
+     * 落地页-商品购买
+     */
+    @Excel(name = "落地页-商品购买", width = 15)
+    @ApiModelProperty(value = "落地页-商品购买")
+    private Long shopping;
+    /**
+     * 落地页-在线咨询
+     */
+    @Excel(name = "落地页-在线咨询", width = 15)
+    @ApiModelProperty(value = "落地页-在线咨询")
+    private Long consult;
+    /**
+     * 落地页-微信
+     */
+    @Excel(name = "落地页-微信", width = 15)
+    @ApiModelProperty(value = "落地页-微信")
+    private Long wechat;
+    /**
+     * 落地页-智能电话确认拨打
+     */
+    @Excel(name = "落地页-智能电话确认拨打", width = 15)
+    @ApiModelProperty(value = "落地页-智能电话确认拨打")
+    private Long phoneConfirm;
+    /**
+     * 落地页-智能电话确认接通
+     */
+    @Excel(name = "落地页-智能电话确认接通", width = 15)
+    @ApiModelProperty(value = "落地页-智能电话确认接通")
+    private Long phoneConnect;
+    /**
+     * 落地页-智能电话有效咨询
+     */
+    @Excel(name = "落地页-智能电话有效咨询", width = 15)
+    @ApiModelProperty(value = "落地页-智能电话有效咨询")
+    private Long consultEffective;
+    /**
+     * 视频-总播放
+     */
+    @Excel(name = "视频-总播放", width = 15)
+    @ApiModelProperty(value = "视频-总播放")
+    private Long totalPlay;
+    /**
+     * 视频-有效播放
+     */
+    @Excel(name = "视频-有效播放", width = 15)
+    @ApiModelProperty(value = "视频-有效播放")
+    private Long validPlay;
+    /**
+     * 视频-wifi播放
+     */
+    @Excel(name = "视频-wifi播放", width = 15)
+    @ApiModelProperty(value = "视频-wifi播放")
+    private Long wifiPlay;
+    /**
+     * 视频-播放时长,单位ms
+     */
+    @Excel(name = "视频-播放时长,单位ms", width = 15)
+    @ApiModelProperty(value = "视频-播放时长,单位ms")
+    private Long playDurationSum;
+    /**
+     * 视频-播放25%进度总数
+     */
+    @Excel(name = "视频-播放25%进度总数", width = 15)
+    @ApiModelProperty(value = "视频-播放25%进度总数")
+    private Long play25FeedBreak;
+    /**
+     * 视频-播放50%进度总数
+     */
+    @Excel(name = "视频-播放50%进度总数", width = 15)
+    @ApiModelProperty(value = "视频-播放50%进度总数")
+    private Long play50FeedBreak;
+    /**
+     * 视频-播放75%进度总数
+     */
+    @Excel(name = "视频-播放75%进度总数", width = 15)
+    @ApiModelProperty(value = "视频-播放75%进度总数")
+    private Long play75FeedBreak;
+    /**
+     * 视频-播放100%进度总数
+     */
+    @Excel(name = "视频-播放100%进度总数", width = 15)
+    @ApiModelProperty(value = "视频-播放100%进度总数")
+    private Long play100FeedBreak;
+    /**
+     * 附加创意-电话按钮
+     */
+    @Excel(name = "附加创意-电话按钮", width = 15)
+    @ApiModelProperty(value = "附加创意-电话按钮")
+    private Long advancedCreativePhoneClick;
+    /**
+     * 附加创意-在线咨询
+     */
+    @Excel(name = "附加创意-在线咨询", width = 15)
+    @ApiModelProperty(value = "附加创意-在线咨询")
+    private Long advancedCreativeCounselClick;
+    /**
+     * 附加创意-表单提交
+     */
+    @Excel(name = "附加创意-表单提交", width = 15)
+    @ApiModelProperty(value = "附加创意-表单提交")
+    private Long advancedCreativeFormClick;
+    /**
+     * 互动数据-分享数
+     */
+    @Excel(name = "互动数据-分享数", width = 15)
+    @ApiModelProperty(value = "互动数据-分享数")
+    private Long share;
+    /**
+     * 互动数据-评论数
+     */
+    @Excel(name = "互动数据-评论数", width = 15)
+    @ApiModelProperty(value = "互动数据-评论数")
+    private Long comment;
+    /**
+     * 互动数据-点赞数
+     */
+    @Excel(name = "互动数据-点赞数", width = 15)
+    @ApiModelProperty(value = "互动数据-点赞数")
+    private Long likeNum;
+    /**
+     * 互动数据-关注数
+     */
+    @Excel(name = "互动数据-关注数", width = 15)
+    @ApiModelProperty(value = "互动数据-关注数")
+    private Long follow;
+    /**
+     * 互动数据-主页访问量
+     */
+    @Excel(name = "互动数据-主页访问量", width = 15)
+    @ApiModelProperty(value = "互动数据-主页访问量")
+    private Long homeVisited;
+    /**
+     * 互动数据-挑战赛查看数
+     */
+    @Excel(name = "互动数据-挑战赛查看数", width = 15)
+    @ApiModelProperty(value = "互动数据-挑战赛查看数")
+    private Long iesChallengeClick;
+    /**
+     * 互动数据-音乐查看数
+     */
+    @Excel(name = "互动数据-音乐查看数", width = 15)
+    @ApiModelProperty(value = "互动数据-音乐查看数")
+    private Long iesMusicClick;
+    /**
+     * 互动数据-单次互动成本
+     */
+    @Excel(name = "互动数据-单次互动成本", width = 15)
+    @ApiModelProperty(value = "互动数据-单次互动成本")
+    private java.math.BigDecimal interactPerCost;
+    /**
+     * 次留数
+     */
+    @Excel(name = "次留数", width = 15)
+    @ApiModelProperty(value = "次留数")
+    private Long nextDayOpen;
+    /**
+     * 次留率
+     */
+    @Excel(name = "次留率", width = 15)
+    @ApiModelProperty(value = "次留率")
+    private java.math.BigDecimal nextDayOpenRate;
+    /**
+     * 次留成本
+     */
+    @Excel(name = "次留成本", width = 15)
+    @ApiModelProperty(value = "次留成本")
+    private java.math.BigDecimal nextDayOpenCost;
+    /**
+     * 广告组id
+     */
+    @Excel(name = "广告组id", width = 15)
+    @ApiModelProperty(value = "广告组id")
+    private Long adId;
+    /**
+     * 广告组名称
+     */
+    @Excel(name = "广告组名称", width = 15)
+    @ApiModelProperty(value = "广告组名称")
+    private String adName;
+    /**
+     * campaignId
+     */
+    @Excel(name = "campaignId", width = 15)
+    @ApiModelProperty(value = "campaignId")
+    private Long campaignId;
+    @Excel(name = "广告组名称", width = 15)
+    @ApiModelProperty(value = "广告组名称")
+    private String campaignName;
+    @Excel(name = "创意id", width = 15)
+    @ApiModelProperty(value = "创意id")
+    private Long creativeId;
+    /**
+     * createTime
+     */
+    @ApiModelProperty(value = "createTime")
+    private Date createTime;
+    /**
+     * updateTime
+     */
+    @ApiModelProperty(value = "updateTime")
+    private Date updateTime;
+
+    public BytedanceCreativeHourlyReport(JSONObject data) {
+        Long playFeedBreak75 = data.getLong("play_75_feed_break");
+        if (null != playFeedBreak75) {
+            this.play75FeedBreak = playFeedBreak75;
+        }
+        Long next_day_open = data.getLong("next_day_open");
+        if (null != next_day_open) {
+            this.nextDayOpen = next_day_open;
+        }
+        Long convert = data.getLong("convert");
+        if (null != convert) {
+            this.convertNum = convert;
+        }
+        Long in_app_cart = data.getLong("in_app_cart");
+        if (null != in_app_cart) {
+            this.inAppCart = in_app_cart;
+        }
+        Long play_25_feed_break = data.getLong("play_25_feed_break");
+        if (null != play_25_feed_break) {
+            this.play25FeedBreak = play_25_feed_break;
+        }
+        Long consult_effective = data.getLong("consult_effective");
+        if (null != consult_effective) {
+            this.consultEffective = consult_effective;
+        }
+        Long view = data.getLong("view");
+        if (null != view) {
+            this.view = view;
+        }
+        Long phone_confirm = data.getLong("phone_confirm");
+        if (null != phone_confirm) {
+            this.phoneConfirm = phone_confirm;
+        }
+        Long ies_music_click = data.getLong("ies_music_click");
+        if (null != ies_music_click) {
+            this.iesMusicClick = ies_music_click;
+        }
+        Long wifi_play = data.getLong("wifi_play");
+        if (null != wifi_play) {
+            this.wifiPlay = wifi_play;
+        }
+        String stat_datetime = data.getString("stat_datetime");
+        if (null != stat_datetime && !"".equals(stat_datetime.trim())) {
+            this.statDatetime = stat_datetime;
+        }
+        Long shopping = data.getLong("shopping");
+        if (null != shopping) {
+            this.shopping = shopping;
+        }
+        Long qq = data.getLong("qq");
+        if (null != qq) {
+            this.qq = qq;
+        }
+        Long like = data.getLong("like");
+        if (null != like) {
+            this.likeNum = like;
+        }
+        Long play_50_feed_break = data.getLong("play_50_feed_break");
+        if (null != play_50_feed_break) {
+            this.play50FeedBreak = play_50_feed_break;
+        }
+        Long active = data.getLong("active");
+        if (null != active) {
+            this.active = active;
+        }
+        Long click = data.getLong("click");
+        if (null != click) {
+            this.click = click;
+        }
+        Long advanced_creative_phone_click = data.getLong("advanced_creative_phone_click");
+        if (null != advanced_creative_phone_click) {
+            this.advancedCreativePhoneClick = advanced_creative_phone_click;
+        }
+        Long download_start = data.getLong("download_start");
+        if (null != download_start) {
+            this.downloadStart = download_start;
+        }
+        Long home_visited = data.getLong("home_visited");
+        if (null != home_visited) {
+            this.homeVisited = home_visited;
+        }
+        Long phone = data.getLong("phone");
+        if (null != phone) {
+            this.phone = phone;
+        }
+        Long in_app_pay = data.getLong("in_app_pay");
+        if (null != in_app_pay) {
+            this.inAppPay = in_app_pay;
+        }
+        BigDecimal next_day_open_cost = data.getBigDecimal("next_day_open_cost");
+        if (null != next_day_open_cost) {
+            this.nextDayOpenCost = next_day_open_cost;
+        }
+        Long ies_challenge_click = data.getLong("ies_challenge_click");
+        if (null != ies_challenge_click) {
+            this.iesChallengeClick = ies_challenge_click;
+        }
+        Long total_play = data.getLong("total_play");
+        if (null != total_play) {
+            this.totalPlay = total_play;
+        }
+        Long show = data.getLong("show");
+        if (null != show) {
+            this.showNum = show;
+        }
+        BigDecimal next_day_open_rate = data.getBigDecimal("next_day_open_rate");
+        if (null != next_day_open_rate) {
+            this.nextDayOpenRate = next_day_open_rate;
+        }
+        Long map_search = data.getLong("map_search");
+        if (null != map_search) {
+            this.mapSearch = map_search;
+        }
+        Long click_install = data.getLong("click_install");
+        if (null != click_install) {
+            this.clickInstall = click_install;
+        }
+        BigDecimal interact_per_cost = data.getBigDecimal("interact_per_cost");
+        if (null != interact_per_cost) {
+            this.interactPerCost = interact_per_cost;
+        }
+        Long advertiser_id = data.getLong("advertiser_id");
+        if (null != advertiser_id) {
+            this.advertiserId = advertiser_id;
+        }
+        Long button = data.getLong("button");
+        if (null != button) {
+            this.button = button;
+        }
+        Long play_duration_sum = data.getLong("play_duration_sum");
+        if (null != play_duration_sum) {
+            this.playDurationSum = play_duration_sum;
+        }
+        Long play_100_feed_break = data.getLong("play_100_feed_break");
+        if (null != play_100_feed_break) {
+            this.play100FeedBreak = play_100_feed_break;
+        }
+        Long advanced_creative_counsel_click = data.getLong("advanced_creative_counsel_click");
+        if (null != advanced_creative_counsel_click) {
+            this.advancedCreativeCounselClick = advanced_creative_counsel_click;
+        }
+        Long share = data.getLong("share");
+        if (null != share) {
+            this.share = share;
+        }
+        Long consult = data.getLong("consult");
+        if (null != consult) {
+            this.consult = consult;
+        }
+        Long vote = data.getLong("vote");
+        if (null != vote) {
+            this.vote = vote;
+        }
+        Long valid_play = data.getLong("valid_play");
+        if (null != valid_play) {
+            this.validPlay = valid_play;
+        }
+        Long redirect = data.getLong("redirect");
+        if (null != redirect) {
+            this.redirect = redirect;
+        }
+        Long pay_count = data.getLong("pay_count");
+        if (null != pay_count) {
+            this.payCount = pay_count;
+        }
+        Long advanced_creative_form_click = data.getLong("advanced_creative_form_click");
+        if (null != advanced_creative_form_click) {
+            this.advancedCreativeFormClick = advanced_creative_form_click;
+        }
+        BigDecimal cost = data.getBigDecimal("cost");
+        if (null != cost) {
+            this.cost = cost;
+        }
+        Long download_finish = data.getLong("download_finish");
+        if (null != download_finish) {
+            this.downloadFinish = download_finish;
+        }
+        Long wechat = data.getLong("wechat");
+        if (null != wechat) {
+            this.wechat = wechat;
+        }
+        Long lottery = data.getLong("lottery");
+        if (null != lottery) {
+            this.lottery = lottery;
+        }
+        Long in_app_order = data.getLong("in_app_order");
+        if (null != in_app_order) {
+            this.inAppOrder = in_app_order;
+        }
+        Long install_finish = data.getLong("install_finish");
+        if (null != install_finish) {
+            this.installFinish = install_finish;
+        }
+        Long follow = data.getLong("follow");
+        if (null != follow) {
+            this.follow = follow;
+        }
+//		Long message = data.getLong("message");
+//		if(null!=message){
+//			this.message = message;
+//		}
+        Long in_app_detail_uv = data.getLong("in_app_detail_uv");
+        if (null != in_app_detail_uv) {
+            this.inAppDetailUv = in_app_detail_uv;
+        }
+        Long form = data.getLong("form");
+        if (null != form) {
+            this.form = form;
+        }
+//		BigDecimal convert_cost = data.getBigDecimal("convert_cost");
+//		if(null!=convert_cost){
+//			this.convertCost = convert_cost;
+//		}
+        Long comment = data.getLong("comment");
+        if (null != comment) {
+            this.comment = comment;
+        }
+        Long in_app_uv = data.getLong("in_app_uv");
+        if (null != in_app_uv) {
+            this.inAppUv = in_app_uv;
+        }
+        Long register = data.getLong("register");
+        if (null != register) {
+            this.register = register;
+        }
+        Long campaignId = data.getLong("campaign_id");
+        if (null != campaignId) {
+            this.campaignId = campaignId;
+        }
+        String campaignName = data.getString("campaign_name");
+        if (null != campaignName) {
+            this.campaignName = campaignName;
+        }
+        String adName = data.getString("ad_name");
+        if (null != adName) {
+            this.adName = adName;
+        }
+        Long adId = data.getLong("ad_id");
+        if (null != adId) {
+            this.adId = adId;
+        }
+        Long creative_id = data.getLong("creative_id");
+        if (null != creative_id) {
+            this.creativeId = creative_id;
+        }
+    }
+
+    public BytedanceCreativeHourlyReport() {
+    }
+}

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

@@ -0,0 +1,640 @@
+package org.jeecg.modules.ctop.entity;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+import com.alibaba.fastjson.JSONObject;
+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;
+
+/**
+ * @Description: 广告计划日报表信息
+ * @Author: jeecg-boot
+ * @Date: 2019-09-11
+ * @Version: V1.0
+ */
+@Data
+@TableName("ctop_bytedance_report_plan_daily")
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value = "ctop_bytedance_report_plan_daily对象", description = "广告计划日报表信息")
+public class BytedancePlanDailyReport {
+
+    /**
+     * id
+     */
+    @TableId(type = IdType.UUID)
+    @ApiModelProperty(value = "id")
+    private Long id;
+    /**
+     * 广告主id
+     */
+    @Excel(name = "广告主id", width = 15)
+    @ApiModelProperty(value = "广告主id")
+    private Long advertiserId;
+    /**
+     * 数据起始时间
+     */
+    @Excel(name = "数据起始时间", width = 15)
+    @ApiModelProperty(value = "数据起始时间")
+    private String statDatetime;
+    /**
+     * 展示量
+     */
+    @Excel(name = "展示量", width = 15)
+    @ApiModelProperty(value = "展示量")
+    private Long showNum;
+    /**
+     * 点击量
+     */
+    @Excel(name = "点击量", width = 15)
+    @ApiModelProperty(value = "点击量")
+    private Long click;
+    /**
+     * 转化量
+     */
+    @Excel(name = "转化量", width = 15)
+    @ApiModelProperty(value = "转化量")
+    private Long convertNum;
+    /**
+     * 总花费
+     */
+    @Excel(name = "总花费", width = 15)
+    @ApiModelProperty(value = "总花费")
+    private java.math.BigDecimal cost;
+    /**
+     * 应用下载-激活
+     */
+    @Excel(name = "应用下载-激活", width = 15)
+    @ApiModelProperty(value = "应用下载-激活")
+    private Long active;
+    /**
+     * 应用下载-安卓下载完成
+     */
+    @Excel(name = "应用下载-安卓下载完成", width = 15)
+    @ApiModelProperty(value = "应用下载-安卓下载完成")
+    private Long downloadFinish;
+    /**
+     * 应用下载-安卓下载开始
+     */
+    @Excel(name = "应用下载-安卓下载开始", width = 15)
+    @ApiModelProperty(value = "应用下载-安卓下载开始")
+    private Long downloadStart;
+    /**
+     * 应用下载-点击安装数
+     */
+    @Excel(name = "应用下载-点击安装数", width = 15)
+    @ApiModelProperty(value = "应用下载-点击安装数")
+    private Long clickInstall;
+    /**
+     * 应用下载-安卓安装完成
+     */
+    @Excel(name = "应用下载-安卓安装完成", width = 15)
+    @ApiModelProperty(value = "应用下载-安卓安装完成")
+    private Long installFinish;
+    /**
+     * 应用下载-注册
+     */
+    @Excel(name = "应用下载-注册", width = 15)
+    @ApiModelProperty(value = "应用下载-注册")
+    private Long register;
+    /**
+     * 应用下载-付费数
+     */
+    @Excel(name = "应用下载-付费数", width = 15)
+    @ApiModelProperty(value = "应用下载-付费数")
+    private Long payCount;
+    /**
+     * 应用下载-到达uv
+     */
+    @Excel(name = "应用下载-到达uv", width = 15)
+    @ApiModelProperty(value = "应用下载-到达uv")
+    private Long inAppUv;
+    /**
+     * 应用下载-详情页到站uv
+     */
+    @Excel(name = "应用下载-详情页到站uv", width = 15)
+    @ApiModelProperty(value = "应用下载-详情页到站uv")
+    private Long inAppDetailUv;
+    /**
+     * 应用下载-加入购物车
+     */
+    @Excel(name = "应用下载-加入购物车", width = 15)
+    @ApiModelProperty(value = "应用下载-加入购物车")
+    private Long inAppCart;
+    /**
+     * 应用下载-提交订单
+     */
+    @Excel(name = "应用下载-提交订单", width = 15)
+    @ApiModelProperty(value = "应用下载-提交订单")
+    private Long inAppOrder;
+    /**
+     * 应用下载-付费
+     */
+    @Excel(name = "应用下载-付费", width = 15)
+    @ApiModelProperty(value = "应用下载-付费")
+    private Long inAppPay;
+    /**
+     * 落地页-电话拨打数
+     */
+    @Excel(name = "落地页-电话拨打数", width = 15)
+    @ApiModelProperty(value = "落地页-电话拨打数")
+    private Long phone;
+    /**
+     * 表单提交数
+     */
+    @Excel(name = "表单提交数", width = 15)
+    @ApiModelProperty(value = "表单提交数")
+    private Long form;
+    /**
+     * 落地页-地图搜索
+     */
+    @Excel(name = "落地页-地图搜索", width = 15)
+    @ApiModelProperty(value = "落地页-地图搜索")
+    private Long mapSearch;
+    /**
+     * 落地页-按钮button
+     */
+    @Excel(name = "落地页-按钮button", width = 15)
+    @ApiModelProperty(value = "落地页-按钮button")
+    private Long button;
+    /**
+     * 落地页-关键页面浏览
+     */
+    @Excel(name = "落地页-关键页面浏览", width = 15)
+    @ApiModelProperty(value = "落地页-关键页面浏览")
+    private Long view;
+    /**
+     * 落地页-QQ咨询数
+     */
+    @Excel(name = "落地页-QQ咨询数", width = 15)
+    @ApiModelProperty(value = "落地页-QQ咨询数")
+    private Long qq;
+    /**
+     * 落地页-抽奖数
+     */
+    @Excel(name = "落地页-抽奖数", width = 15)
+    @ApiModelProperty(value = "落地页-抽奖数")
+    private Long lottery;
+    /**
+     * 落地页-投票
+     */
+    @Excel(name = "落地页-投票", width = 15)
+    @ApiModelProperty(value = "落地页-投票")
+    private Long vote;
+    /**
+     * 落地页-页面跳转
+     */
+    @Excel(name = "落地页-页面跳转", width = 15)
+    @ApiModelProperty(value = "落地页-页面跳转")
+    private Long redirect;
+    /**
+     * 落地页-商品购买
+     */
+    @Excel(name = "落地页-商品购买", width = 15)
+    @ApiModelProperty(value = "落地页-商品购买")
+    private Long shopping;
+    /**
+     * 落地页-在线咨询
+     */
+    @Excel(name = "落地页-在线咨询", width = 15)
+    @ApiModelProperty(value = "落地页-在线咨询")
+    private Long consult;
+    /**
+     * 落地页-微信
+     */
+    @Excel(name = "落地页-微信", width = 15)
+    @ApiModelProperty(value = "落地页-微信")
+    private Long wechat;
+    /**
+     * 落地页-智能电话确认拨打
+     */
+    @Excel(name = "落地页-智能电话确认拨打", width = 15)
+    @ApiModelProperty(value = "落地页-智能电话确认拨打")
+    private Long phoneConfirm;
+    /**
+     * 落地页-智能电话确认接通
+     */
+    @Excel(name = "落地页-智能电话确认接通", width = 15)
+    @ApiModelProperty(value = "落地页-智能电话确认接通")
+    private Long phoneConnect;
+    /**
+     * 落地页-智能电话有效咨询
+     */
+    @Excel(name = "落地页-智能电话有效咨询", width = 15)
+    @ApiModelProperty(value = "落地页-智能电话有效咨询")
+    private Long consultEffective;
+    /**
+     * 视频-总播放
+     */
+    @Excel(name = "视频-总播放", width = 15)
+    @ApiModelProperty(value = "视频-总播放")
+    private Long totalPlay;
+    /**
+     * 视频-有效播放
+     */
+    @Excel(name = "视频-有效播放", width = 15)
+    @ApiModelProperty(value = "视频-有效播放")
+    private Long validPlay;
+    /**
+     * 视频-wifi播放
+     */
+    @Excel(name = "视频-wifi播放", width = 15)
+    @ApiModelProperty(value = "视频-wifi播放")
+    private Long wifiPlay;
+    /**
+     * 视频-播放时长,单位ms
+     */
+    @Excel(name = "视频-播放时长,单位ms", width = 15)
+    @ApiModelProperty(value = "视频-播放时长,单位ms")
+    private Long playDurationSum;
+    /**
+     * 视频-播放25%进度总数
+     */
+    @Excel(name = "视频-播放25%进度总数", width = 15)
+    @ApiModelProperty(value = "视频-播放25%进度总数")
+    private Long play25FeedBreak;
+    /**
+     * 视频-播放50%进度总数
+     */
+    @Excel(name = "视频-播放50%进度总数", width = 15)
+    @ApiModelProperty(value = "视频-播放50%进度总数")
+    private Long play50FeedBreak;
+    /**
+     * 视频-播放75%进度总数
+     */
+    @Excel(name = "视频-播放75%进度总数", width = 15)
+    @ApiModelProperty(value = "视频-播放75%进度总数")
+    private Long play75FeedBreak;
+    /**
+     * 视频-播放100%进度总数
+     */
+    @Excel(name = "视频-播放100%进度总数", width = 15)
+    @ApiModelProperty(value = "视频-播放100%进度总数")
+    private Long play100FeedBreak;
+    /**
+     * 附加创意-电话按钮
+     */
+    @Excel(name = "附加创意-电话按钮", width = 15)
+    @ApiModelProperty(value = "附加创意-电话按钮")
+    private Long advancedCreativePhoneClick;
+    /**
+     * 附加创意-在线咨询
+     */
+    @Excel(name = "附加创意-在线咨询", width = 15)
+    @ApiModelProperty(value = "附加创意-在线咨询")
+    private Long advancedCreativeCounselClick;
+    /**
+     * 附加创意-表单提交
+     */
+    @Excel(name = "附加创意-表单提交", width = 15)
+    @ApiModelProperty(value = "附加创意-表单提交")
+    private Long advancedCreativeFormClick;
+    /**
+     * 互动数据-分享数
+     */
+    @Excel(name = "互动数据-分享数", width = 15)
+    @ApiModelProperty(value = "互动数据-分享数")
+    private Long share;
+    /**
+     * 互动数据-评论数
+     */
+    @Excel(name = "互动数据-评论数", width = 15)
+    @ApiModelProperty(value = "互动数据-评论数")
+    private Long comment;
+    /**
+     * 互动数据-点赞数
+     */
+    @Excel(name = "互动数据-点赞数", width = 15)
+    @ApiModelProperty(value = "互动数据-点赞数")
+    private Long likeNum;
+    /**
+     * 互动数据-关注数
+     */
+    @Excel(name = "互动数据-关注数", width = 15)
+    @ApiModelProperty(value = "互动数据-关注数")
+    private Long follow;
+    /**
+     * 互动数据-主页访问量
+     */
+    @Excel(name = "互动数据-主页访问量", width = 15)
+    @ApiModelProperty(value = "互动数据-主页访问量")
+    private Long homeVisited;
+    /**
+     * 互动数据-挑战赛查看数
+     */
+    @Excel(name = "互动数据-挑战赛查看数", width = 15)
+    @ApiModelProperty(value = "互动数据-挑战赛查看数")
+    private Long iesChallengeClick;
+    /**
+     * 互动数据-音乐查看数
+     */
+    @Excel(name = "互动数据-音乐查看数", width = 15)
+    @ApiModelProperty(value = "互动数据-音乐查看数")
+    private Long iesMusicClick;
+    /**
+     * 互动数据-单次互动成本
+     */
+    @Excel(name = "互动数据-单次互动成本", width = 15)
+    @ApiModelProperty(value = "互动数据-单次互动成本")
+    private java.math.BigDecimal interactPerCost;
+    /**
+     * 次留数
+     */
+    @Excel(name = "次留数", width = 15)
+    @ApiModelProperty(value = "次留数")
+    private Long nextDayOpen;
+    /**
+     * 次留率
+     */
+    @Excel(name = "次留率", width = 15)
+    @ApiModelProperty(value = "次留率")
+    private java.math.BigDecimal nextDayOpenRate;
+    /**
+     * 次留成本
+     */
+    @Excel(name = "次留成本", width = 15)
+    @ApiModelProperty(value = "次留成本")
+    private java.math.BigDecimal nextDayOpenCost;
+    /**
+     * 广告组id
+     */
+    @Excel(name = "广告组id", width = 15)
+    @ApiModelProperty(value = "广告组id")
+    private Long adId;
+    /**
+     * 广告组名称
+     */
+    @Excel(name = "广告组名称", width = 15)
+    @ApiModelProperty(value = "广告组名称")
+    private String adName;
+    /**
+     * campaignId
+     */
+    @Excel(name = "campaignId", width = 15)
+    @ApiModelProperty(value = "campaignId")
+    private Long campaignId;
+    /**
+     * createTime
+     */
+    @ApiModelProperty(value = "createTime")
+    private Date createTime;
+    /**
+     * updateTime
+     */
+    @ApiModelProperty(value = "updateTime")
+    private Date updateTime;
+
+    public BytedancePlanDailyReport(JSONObject data) {
+        Long playFeedBreak75 = data.getLong("play_75_feed_break");
+        if (null != playFeedBreak75) {
+            this.play75FeedBreak = playFeedBreak75;
+        }
+        Long next_day_open = data.getLong("next_day_open");
+        if (null != next_day_open) {
+            this.nextDayOpen = next_day_open;
+        }
+        Long convert = data.getLong("convert");
+        if (null != convert) {
+            this.convertNum = convert;
+        }
+        Long in_app_cart = data.getLong("in_app_cart");
+        if (null != in_app_cart) {
+            this.inAppCart = in_app_cart;
+        }
+        Long play_25_feed_break = data.getLong("play_25_feed_break");
+        if (null != play_25_feed_break) {
+            this.play25FeedBreak = play_25_feed_break;
+        }
+        Long consult_effective = data.getLong("consult_effective");
+        if (null != consult_effective) {
+            this.consultEffective = consult_effective;
+        }
+        Long view = data.getLong("view");
+        if (null != view) {
+            this.view = view;
+        }
+        Long phone_confirm = data.getLong("phone_confirm");
+        if (null != phone_confirm) {
+            this.phoneConfirm = phone_confirm;
+        }
+        Long ies_music_click = data.getLong("ies_music_click");
+        if (null != ies_music_click) {
+            this.iesMusicClick = ies_music_click;
+        }
+        Long wifi_play = data.getLong("wifi_play");
+        if (null != wifi_play) {
+            this.wifiPlay = wifi_play;
+        }
+        String stat_datetime = data.getString("stat_datetime");
+        if (null != stat_datetime && !"".equals(stat_datetime.trim())) {
+            this.statDatetime = stat_datetime;
+        }
+        Long shopping = data.getLong("shopping");
+        if (null != shopping) {
+            this.shopping = shopping;
+        }
+        Long qq = data.getLong("qq");
+        if (null != qq) {
+            this.qq = qq;
+        }
+        Long like = data.getLong("like");
+        if (null != like) {
+            this.likeNum = like;
+        }
+        Long play_50_feed_break = data.getLong("play_50_feed_break");
+        if (null != play_50_feed_break) {
+            this.play50FeedBreak = play_50_feed_break;
+        }
+        Long active = data.getLong("active");
+        if (null != active) {
+            this.active = active;
+        }
+        Long click = data.getLong("click");
+        if (null != click) {
+            this.click = click;
+        }
+        Long advanced_creative_phone_click = data.getLong("advanced_creative_phone_click");
+        if (null != advanced_creative_phone_click) {
+            this.advancedCreativePhoneClick = advanced_creative_phone_click;
+        }
+        Long download_start = data.getLong("download_start");
+        if (null != download_start) {
+            this.downloadStart = download_start;
+        }
+        Long home_visited = data.getLong("home_visited");
+        if (null != home_visited) {
+            this.homeVisited = home_visited;
+        }
+        Long phone = data.getLong("phone");
+        if (null != phone) {
+            this.phone = phone;
+        }
+        Long in_app_pay = data.getLong("in_app_pay");
+        if (null != in_app_pay) {
+            this.inAppPay = in_app_pay;
+        }
+        BigDecimal next_day_open_cost = data.getBigDecimal("next_day_open_cost");
+        if (null != next_day_open_cost) {
+            this.nextDayOpenCost = next_day_open_cost;
+        }
+        Long ies_challenge_click = data.getLong("ies_challenge_click");
+        if (null != ies_challenge_click) {
+            this.iesChallengeClick = ies_challenge_click;
+        }
+        Long total_play = data.getLong("total_play");
+        if (null != total_play) {
+            this.totalPlay = total_play;
+        }
+        Long show = data.getLong("show");
+        if (null != show) {
+            this.showNum = show;
+        }
+        BigDecimal next_day_open_rate = data.getBigDecimal("next_day_open_rate");
+        if (null != next_day_open_rate) {
+            this.nextDayOpenRate = next_day_open_rate;
+        }
+        Long map_search = data.getLong("map_search");
+        if (null != map_search) {
+            this.mapSearch = map_search;
+        }
+        Long click_install = data.getLong("click_install");
+        if (null != click_install) {
+            this.clickInstall = click_install;
+        }
+        BigDecimal interact_per_cost = data.getBigDecimal("interact_per_cost");
+        if (null != interact_per_cost) {
+            this.interactPerCost = interact_per_cost;
+        }
+        Long advertiser_id = data.getLong("advertiser_id");
+        if (null != advertiser_id) {
+            this.advertiserId = advertiser_id;
+        }
+        Long button = data.getLong("button");
+        if (null != button) {
+            this.button = button;
+        }
+        Long play_duration_sum = data.getLong("play_duration_sum");
+        if (null != play_duration_sum) {
+            this.playDurationSum = play_duration_sum;
+        }
+        Long play_100_feed_break = data.getLong("play_100_feed_break");
+        if (null != play_100_feed_break) {
+            this.play100FeedBreak = play_100_feed_break;
+        }
+        Long advanced_creative_counsel_click = data.getLong("advanced_creative_counsel_click");
+        if (null != advanced_creative_counsel_click) {
+            this.advancedCreativeCounselClick = advanced_creative_counsel_click;
+        }
+        Long share = data.getLong("share");
+        if (null != share) {
+            this.share = share;
+        }
+        Long consult = data.getLong("consult");
+        if (null != consult) {
+            this.consult = consult;
+        }
+        Long vote = data.getLong("vote");
+        if (null != vote) {
+            this.vote = vote;
+        }
+        Long valid_play = data.getLong("valid_play");
+        if (null != valid_play) {
+            this.validPlay = valid_play;
+        }
+        Long redirect = data.getLong("redirect");
+        if (null != redirect) {
+            this.redirect = redirect;
+        }
+        Long pay_count = data.getLong("pay_count");
+        if (null != pay_count) {
+            this.payCount = pay_count;
+        }
+        Long advanced_creative_form_click = data.getLong("advanced_creative_form_click");
+        if (null != advanced_creative_form_click) {
+            this.advancedCreativeFormClick = advanced_creative_form_click;
+        }
+        BigDecimal cost = data.getBigDecimal("cost");
+        if (null != cost) {
+            this.cost = cost;
+        }
+        Long download_finish = data.getLong("download_finish");
+        if (null != download_finish) {
+            this.downloadFinish = download_finish;
+        }
+        Long wechat = data.getLong("wechat");
+        if (null != wechat) {
+            this.wechat = wechat;
+        }
+        Long lottery = data.getLong("lottery");
+        if (null != lottery) {
+            this.lottery = lottery;
+        }
+        Long in_app_order = data.getLong("in_app_order");
+        if (null != in_app_order) {
+            this.inAppOrder = in_app_order;
+        }
+        Long install_finish = data.getLong("install_finish");
+        if (null != install_finish) {
+            this.installFinish = install_finish;
+        }
+        Long follow = data.getLong("follow");
+        if (null != follow) {
+            this.follow = follow;
+        }
+//		Long message = data.getLong("message");
+//		if(null!=message){
+//			this.message = message;
+//		}
+        Long in_app_detail_uv = data.getLong("in_app_detail_uv");
+        if (null != in_app_detail_uv) {
+            this.inAppDetailUv = in_app_detail_uv;
+        }
+        Long form = data.getLong("form");
+        if (null != form) {
+            this.form = form;
+        }
+//		BigDecimal convert_cost = data.getBigDecimal("convert_cost");
+//		if(null!=convert_cost){
+//			this.convertCost = convert_cost;
+//		}
+        Long comment = data.getLong("comment");
+        if (null != comment) {
+            this.comment = comment;
+        }
+        Long in_app_uv = data.getLong("in_app_uv");
+        if (null != in_app_uv) {
+            this.inAppUv = in_app_uv;
+        }
+        Long register = data.getLong("register");
+        if (null != register) {
+            this.register = register;
+        }
+        Long campaignId = data.getLong("campaign_id");
+        if (null != campaignId) {
+            this.campaignId = campaignId;
+        }
+        String adName = data.getString("ad_name");
+        if (null != adName) {
+            this.adName = adName;
+        }
+        Long adId = data.getLong("ad_id");
+        if (null != adId) {
+            this.adId = adId;
+        }
+    }
+
+    public BytedancePlanDailyReport() {
+    }
+}

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

@@ -0,0 +1,640 @@
+package org.jeecg.modules.ctop.entity;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+import com.alibaba.fastjson.JSONObject;
+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;
+
+/**
+ * @Description: 广告计划时报表信息
+ * @Author: jeecg-boot
+ * @Date: 2019-09-11
+ * @Version: V1.0
+ */
+@Data
+@TableName("ctop_bytedance_report_plan_hourly")
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value = "ctop_bytedance_report_plan_hourly对象", description = "广告计划时报表信息")
+public class BytedancePlanHourlyReport {
+
+    /**
+     * id
+     */
+    @TableId(type = IdType.UUID)
+    @ApiModelProperty(value = "id")
+    private Long id;
+    /**
+     * 广告主id
+     */
+    @Excel(name = "广告主id", width = 15)
+    @ApiModelProperty(value = "广告主id")
+    private Long advertiserId;
+    /**
+     * 数据起始时间
+     */
+    @Excel(name = "数据起始时间", width = 15)
+    @ApiModelProperty(value = "数据起始时间")
+    private String statDatetime;
+    /**
+     * 展示量
+     */
+    @Excel(name = "展示量", width = 15)
+    @ApiModelProperty(value = "展示量")
+    private Long showNum;
+    /**
+     * 点击量
+     */
+    @Excel(name = "点击量", width = 15)
+    @ApiModelProperty(value = "点击量")
+    private Long click;
+    /**
+     * 转化量
+     */
+    @Excel(name = "转化量", width = 15)
+    @ApiModelProperty(value = "转化量")
+    private Long convertNum;
+    /**
+     * 总花费
+     */
+    @Excel(name = "总花费", width = 15)
+    @ApiModelProperty(value = "总花费")
+    private java.math.BigDecimal cost;
+    /**
+     * 应用下载-激活
+     */
+    @Excel(name = "应用下载-激活", width = 15)
+    @ApiModelProperty(value = "应用下载-激活")
+    private Long active;
+    /**
+     * 应用下载-安卓下载完成
+     */
+    @Excel(name = "应用下载-安卓下载完成", width = 15)
+    @ApiModelProperty(value = "应用下载-安卓下载完成")
+    private Long downloadFinish;
+    /**
+     * 应用下载-安卓下载开始
+     */
+    @Excel(name = "应用下载-安卓下载开始", width = 15)
+    @ApiModelProperty(value = "应用下载-安卓下载开始")
+    private Long downloadStart;
+    /**
+     * 应用下载-点击安装数
+     */
+    @Excel(name = "应用下载-点击安装数", width = 15)
+    @ApiModelProperty(value = "应用下载-点击安装数")
+    private Long clickInstall;
+    /**
+     * 应用下载-安卓安装完成
+     */
+    @Excel(name = "应用下载-安卓安装完成", width = 15)
+    @ApiModelProperty(value = "应用下载-安卓安装完成")
+    private Long installFinish;
+    /**
+     * 应用下载-注册
+     */
+    @Excel(name = "应用下载-注册", width = 15)
+    @ApiModelProperty(value = "应用下载-注册")
+    private Long register;
+    /**
+     * 应用下载-付费数
+     */
+    @Excel(name = "应用下载-付费数", width = 15)
+    @ApiModelProperty(value = "应用下载-付费数")
+    private Long payCount;
+    /**
+     * 应用下载-到达uv
+     */
+    @Excel(name = "应用下载-到达uv", width = 15)
+    @ApiModelProperty(value = "应用下载-到达uv")
+    private Long inAppUv;
+    /**
+     * 应用下载-详情页到站uv
+     */
+    @Excel(name = "应用下载-详情页到站uv", width = 15)
+    @ApiModelProperty(value = "应用下载-详情页到站uv")
+    private Long inAppDetailUv;
+    /**
+     * 应用下载-加入购物车
+     */
+    @Excel(name = "应用下载-加入购物车", width = 15)
+    @ApiModelProperty(value = "应用下载-加入购物车")
+    private Long inAppCart;
+    /**
+     * 应用下载-提交订单
+     */
+    @Excel(name = "应用下载-提交订单", width = 15)
+    @ApiModelProperty(value = "应用下载-提交订单")
+    private Long inAppOrder;
+    /**
+     * 应用下载-付费
+     */
+    @Excel(name = "应用下载-付费", width = 15)
+    @ApiModelProperty(value = "应用下载-付费")
+    private Long inAppPay;
+    /**
+     * 落地页-电话拨打数
+     */
+    @Excel(name = "落地页-电话拨打数", width = 15)
+    @ApiModelProperty(value = "落地页-电话拨打数")
+    private Long phone;
+    /**
+     * 表单提交数
+     */
+    @Excel(name = "表单提交数", width = 15)
+    @ApiModelProperty(value = "表单提交数")
+    private Long form;
+    /**
+     * 落地页-地图搜索
+     */
+    @Excel(name = "落地页-地图搜索", width = 15)
+    @ApiModelProperty(value = "落地页-地图搜索")
+    private Long mapSearch;
+    /**
+     * 落地页-按钮button
+     */
+    @Excel(name = "落地页-按钮button", width = 15)
+    @ApiModelProperty(value = "落地页-按钮button")
+    private Long button;
+    /**
+     * 落地页-关键页面浏览
+     */
+    @Excel(name = "落地页-关键页面浏览", width = 15)
+    @ApiModelProperty(value = "落地页-关键页面浏览")
+    private Long view;
+    /**
+     * 落地页-QQ咨询数
+     */
+    @Excel(name = "落地页-QQ咨询数", width = 15)
+    @ApiModelProperty(value = "落地页-QQ咨询数")
+    private Long qq;
+    /**
+     * 落地页-抽奖数
+     */
+    @Excel(name = "落地页-抽奖数", width = 15)
+    @ApiModelProperty(value = "落地页-抽奖数")
+    private Long lottery;
+    /**
+     * 落地页-投票
+     */
+    @Excel(name = "落地页-投票", width = 15)
+    @ApiModelProperty(value = "落地页-投票")
+    private Long vote;
+    /**
+     * 落地页-页面跳转
+     */
+    @Excel(name = "落地页-页面跳转", width = 15)
+    @ApiModelProperty(value = "落地页-页面跳转")
+    private Long redirect;
+    /**
+     * 落地页-商品购买
+     */
+    @Excel(name = "落地页-商品购买", width = 15)
+    @ApiModelProperty(value = "落地页-商品购买")
+    private Long shopping;
+    /**
+     * 落地页-在线咨询
+     */
+    @Excel(name = "落地页-在线咨询", width = 15)
+    @ApiModelProperty(value = "落地页-在线咨询")
+    private Long consult;
+    /**
+     * 落地页-微信
+     */
+    @Excel(name = "落地页-微信", width = 15)
+    @ApiModelProperty(value = "落地页-微信")
+    private Long wechat;
+    /**
+     * 落地页-智能电话确认拨打
+     */
+    @Excel(name = "落地页-智能电话确认拨打", width = 15)
+    @ApiModelProperty(value = "落地页-智能电话确认拨打")
+    private Long phoneConfirm;
+    /**
+     * 落地页-智能电话确认接通
+     */
+    @Excel(name = "落地页-智能电话确认接通", width = 15)
+    @ApiModelProperty(value = "落地页-智能电话确认接通")
+    private Long phoneConnect;
+    /**
+     * 落地页-智能电话有效咨询
+     */
+    @Excel(name = "落地页-智能电话有效咨询", width = 15)
+    @ApiModelProperty(value = "落地页-智能电话有效咨询")
+    private Long consultEffective;
+    /**
+     * 视频-总播放
+     */
+    @Excel(name = "视频-总播放", width = 15)
+    @ApiModelProperty(value = "视频-总播放")
+    private Long totalPlay;
+    /**
+     * 视频-有效播放
+     */
+    @Excel(name = "视频-有效播放", width = 15)
+    @ApiModelProperty(value = "视频-有效播放")
+    private Long validPlay;
+    /**
+     * 视频-wifi播放
+     */
+    @Excel(name = "视频-wifi播放", width = 15)
+    @ApiModelProperty(value = "视频-wifi播放")
+    private Long wifiPlay;
+    /**
+     * 视频-播放时长,单位ms
+     */
+    @Excel(name = "视频-播放时长,单位ms", width = 15)
+    @ApiModelProperty(value = "视频-播放时长,单位ms")
+    private Long playDurationSum;
+    /**
+     * 视频-播放25%进度总数
+     */
+    @Excel(name = "视频-播放25%进度总数", width = 15)
+    @ApiModelProperty(value = "视频-播放25%进度总数")
+    private Long play25FeedBreak;
+    /**
+     * 视频-播放50%进度总数
+     */
+    @Excel(name = "视频-播放50%进度总数", width = 15)
+    @ApiModelProperty(value = "视频-播放50%进度总数")
+    private Long play50FeedBreak;
+    /**
+     * 视频-播放75%进度总数
+     */
+    @Excel(name = "视频-播放75%进度总数", width = 15)
+    @ApiModelProperty(value = "视频-播放75%进度总数")
+    private Long play75FeedBreak;
+    /**
+     * 视频-播放100%进度总数
+     */
+    @Excel(name = "视频-播放100%进度总数", width = 15)
+    @ApiModelProperty(value = "视频-播放100%进度总数")
+    private Long play100FeedBreak;
+    /**
+     * 附加创意-电话按钮
+     */
+    @Excel(name = "附加创意-电话按钮", width = 15)
+    @ApiModelProperty(value = "附加创意-电话按钮")
+    private Long advancedCreativePhoneClick;
+    /**
+     * 附加创意-在线咨询
+     */
+    @Excel(name = "附加创意-在线咨询", width = 15)
+    @ApiModelProperty(value = "附加创意-在线咨询")
+    private Long advancedCreativeCounselClick;
+    /**
+     * 附加创意-表单提交
+     */
+    @Excel(name = "附加创意-表单提交", width = 15)
+    @ApiModelProperty(value = "附加创意-表单提交")
+    private Long advancedCreativeFormClick;
+    /**
+     * 互动数据-分享数
+     */
+    @Excel(name = "互动数据-分享数", width = 15)
+    @ApiModelProperty(value = "互动数据-分享数")
+    private Long share;
+    /**
+     * 互动数据-评论数
+     */
+    @Excel(name = "互动数据-评论数", width = 15)
+    @ApiModelProperty(value = "互动数据-评论数")
+    private Long comment;
+    /**
+     * 互动数据-点赞数
+     */
+    @Excel(name = "互动数据-点赞数", width = 15)
+    @ApiModelProperty(value = "互动数据-点赞数")
+    private Long likeNum;
+    /**
+     * 互动数据-关注数
+     */
+    @Excel(name = "互动数据-关注数", width = 15)
+    @ApiModelProperty(value = "互动数据-关注数")
+    private Long follow;
+    /**
+     * 互动数据-主页访问量
+     */
+    @Excel(name = "互动数据-主页访问量", width = 15)
+    @ApiModelProperty(value = "互动数据-主页访问量")
+    private Long homeVisited;
+    /**
+     * 互动数据-挑战赛查看数
+     */
+    @Excel(name = "互动数据-挑战赛查看数", width = 15)
+    @ApiModelProperty(value = "互动数据-挑战赛查看数")
+    private Long iesChallengeClick;
+    /**
+     * 互动数据-音乐查看数
+     */
+    @Excel(name = "互动数据-音乐查看数", width = 15)
+    @ApiModelProperty(value = "互动数据-音乐查看数")
+    private Long iesMusicClick;
+    /**
+     * 互动数据-单次互动成本
+     */
+    @Excel(name = "互动数据-单次互动成本", width = 15)
+    @ApiModelProperty(value = "互动数据-单次互动成本")
+    private java.math.BigDecimal interactPerCost;
+    /**
+     * 次留数
+     */
+    @Excel(name = "次留数", width = 15)
+    @ApiModelProperty(value = "次留数")
+    private Long nextDayOpen;
+    /**
+     * 次留率
+     */
+    @Excel(name = "次留率", width = 15)
+    @ApiModelProperty(value = "次留率")
+    private java.math.BigDecimal nextDayOpenRate;
+    /**
+     * 次留成本
+     */
+    @Excel(name = "次留成本", width = 15)
+    @ApiModelProperty(value = "次留成本")
+    private java.math.BigDecimal nextDayOpenCost;
+    /**
+     * 广告组id
+     */
+    @Excel(name = "广告组id", width = 15)
+    @ApiModelProperty(value = "广告组id")
+    private Long adId;
+    /**
+     * 广告组名称
+     */
+    @Excel(name = "广告组名称", width = 15)
+    @ApiModelProperty(value = "广告组名称")
+    private String adName;
+    /**
+     * campaignId
+     */
+    @Excel(name = "campaignId", width = 15)
+    @ApiModelProperty(value = "campaignId")
+    private Long campaignId;
+    /**
+     * createTime
+     */
+    @ApiModelProperty(value = "createTime")
+    private Date createTime;
+    /**
+     * updateTime
+     */
+    @ApiModelProperty(value = "updateTime")
+    private Date updateTime;
+
+    public BytedancePlanHourlyReport(JSONObject data) {
+        Long playFeedBreak75 = data.getLong("play_75_feed_break");
+        if (null != playFeedBreak75) {
+            this.play75FeedBreak = playFeedBreak75;
+        }
+        Long next_day_open = data.getLong("next_day_open");
+        if (null != next_day_open) {
+            this.nextDayOpen = next_day_open;
+        }
+        Long convert = data.getLong("convert");
+        if (null != convert) {
+            this.convertNum = convert;
+        }
+        Long in_app_cart = data.getLong("in_app_cart");
+        if (null != in_app_cart) {
+            this.inAppCart = in_app_cart;
+        }
+        Long play_25_feed_break = data.getLong("play_25_feed_break");
+        if (null != play_25_feed_break) {
+            this.play25FeedBreak = play_25_feed_break;
+        }
+        Long consult_effective = data.getLong("consult_effective");
+        if (null != consult_effective) {
+            this.consultEffective = consult_effective;
+        }
+        Long view = data.getLong("view");
+        if (null != view) {
+            this.view = view;
+        }
+        Long phone_confirm = data.getLong("phone_confirm");
+        if (null != phone_confirm) {
+            this.phoneConfirm = phone_confirm;
+        }
+        Long ies_music_click = data.getLong("ies_music_click");
+        if (null != ies_music_click) {
+            this.iesMusicClick = ies_music_click;
+        }
+        Long wifi_play = data.getLong("wifi_play");
+        if (null != wifi_play) {
+            this.wifiPlay = wifi_play;
+        }
+        String stat_datetime = data.getString("stat_datetime");
+        if (null != stat_datetime && !"".equals(stat_datetime.trim())) {
+            this.statDatetime = stat_datetime;
+        }
+        Long shopping = data.getLong("shopping");
+        if (null != shopping) {
+            this.shopping = shopping;
+        }
+        Long qq = data.getLong("qq");
+        if (null != qq) {
+            this.qq = qq;
+        }
+        Long like = data.getLong("like");
+        if (null != like) {
+            this.likeNum = like;
+        }
+        Long play_50_feed_break = data.getLong("play_50_feed_break");
+        if (null != play_50_feed_break) {
+            this.play50FeedBreak = play_50_feed_break;
+        }
+        Long active = data.getLong("active");
+        if (null != active) {
+            this.active = active;
+        }
+        Long click = data.getLong("click");
+        if (null != click) {
+            this.click = click;
+        }
+        Long advanced_creative_phone_click = data.getLong("advanced_creative_phone_click");
+        if (null != advanced_creative_phone_click) {
+            this.advancedCreativePhoneClick = advanced_creative_phone_click;
+        }
+        Long download_start = data.getLong("download_start");
+        if (null != download_start) {
+            this.downloadStart = download_start;
+        }
+        Long home_visited = data.getLong("home_visited");
+        if (null != home_visited) {
+            this.homeVisited = home_visited;
+        }
+        Long phone = data.getLong("phone");
+        if (null != phone) {
+            this.phone = phone;
+        }
+        Long in_app_pay = data.getLong("in_app_pay");
+        if (null != in_app_pay) {
+            this.inAppPay = in_app_pay;
+        }
+        BigDecimal next_day_open_cost = data.getBigDecimal("next_day_open_cost");
+        if (null != next_day_open_cost) {
+            this.nextDayOpenCost = next_day_open_cost;
+        }
+        Long ies_challenge_click = data.getLong("ies_challenge_click");
+        if (null != ies_challenge_click) {
+            this.iesChallengeClick = ies_challenge_click;
+        }
+        Long total_play = data.getLong("total_play");
+        if (null != total_play) {
+            this.totalPlay = total_play;
+        }
+        Long show = data.getLong("show");
+        if (null != show) {
+            this.showNum = show;
+        }
+        BigDecimal next_day_open_rate = data.getBigDecimal("next_day_open_rate");
+        if (null != next_day_open_rate) {
+            this.nextDayOpenRate = next_day_open_rate;
+        }
+        Long map_search = data.getLong("map_search");
+        if (null != map_search) {
+            this.mapSearch = map_search;
+        }
+        Long click_install = data.getLong("click_install");
+        if (null != click_install) {
+            this.clickInstall = click_install;
+        }
+        BigDecimal interact_per_cost = data.getBigDecimal("interact_per_cost");
+        if (null != interact_per_cost) {
+            this.interactPerCost = interact_per_cost;
+        }
+        Long advertiser_id = data.getLong("advertiser_id");
+        if (null != advertiser_id) {
+            this.advertiserId = advertiser_id;
+        }
+        Long button = data.getLong("button");
+        if (null != button) {
+            this.button = button;
+        }
+        Long play_duration_sum = data.getLong("play_duration_sum");
+        if (null != play_duration_sum) {
+            this.playDurationSum = play_duration_sum;
+        }
+        Long play_100_feed_break = data.getLong("play_100_feed_break");
+        if (null != play_100_feed_break) {
+            this.play100FeedBreak = play_100_feed_break;
+        }
+        Long advanced_creative_counsel_click = data.getLong("advanced_creative_counsel_click");
+        if (null != advanced_creative_counsel_click) {
+            this.advancedCreativeCounselClick = advanced_creative_counsel_click;
+        }
+        Long share = data.getLong("share");
+        if (null != share) {
+            this.share = share;
+        }
+        Long consult = data.getLong("consult");
+        if (null != consult) {
+            this.consult = consult;
+        }
+        Long vote = data.getLong("vote");
+        if (null != vote) {
+            this.vote = vote;
+        }
+        Long valid_play = data.getLong("valid_play");
+        if (null != valid_play) {
+            this.validPlay = valid_play;
+        }
+        Long redirect = data.getLong("redirect");
+        if (null != redirect) {
+            this.redirect = redirect;
+        }
+        Long pay_count = data.getLong("pay_count");
+        if (null != pay_count) {
+            this.payCount = pay_count;
+        }
+        Long advanced_creative_form_click = data.getLong("advanced_creative_form_click");
+        if (null != advanced_creative_form_click) {
+            this.advancedCreativeFormClick = advanced_creative_form_click;
+        }
+        BigDecimal cost = data.getBigDecimal("cost");
+        if (null != cost) {
+            this.cost = cost;
+        }
+        Long download_finish = data.getLong("download_finish");
+        if (null != download_finish) {
+            this.downloadFinish = download_finish;
+        }
+        Long wechat = data.getLong("wechat");
+        if (null != wechat) {
+            this.wechat = wechat;
+        }
+        Long lottery = data.getLong("lottery");
+        if (null != lottery) {
+            this.lottery = lottery;
+        }
+        Long in_app_order = data.getLong("in_app_order");
+        if (null != in_app_order) {
+            this.inAppOrder = in_app_order;
+        }
+        Long install_finish = data.getLong("install_finish");
+        if (null != install_finish) {
+            this.installFinish = install_finish;
+        }
+        Long follow = data.getLong("follow");
+        if (null != follow) {
+            this.follow = follow;
+        }
+//		Long message = data.getLong("message");
+//		if(null!=message){
+//			this.message = message;
+//		}
+        Long in_app_detail_uv = data.getLong("in_app_detail_uv");
+        if (null != in_app_detail_uv) {
+            this.inAppDetailUv = in_app_detail_uv;
+        }
+        Long form = data.getLong("form");
+        if (null != form) {
+            this.form = form;
+        }
+//		BigDecimal convert_cost = data.getBigDecimal("convert_cost");
+//		if(null!=convert_cost){
+//			this.convertCost = convert_cost;
+//		}
+        Long comment = data.getLong("comment");
+        if (null != comment) {
+            this.comment = comment;
+        }
+        Long in_app_uv = data.getLong("in_app_uv");
+        if (null != in_app_uv) {
+            this.inAppUv = in_app_uv;
+        }
+        Long register = data.getLong("register");
+        if (null != register) {
+            this.register = register;
+        }
+        Long campaignId = data.getLong("campaign_id");
+        if (null != campaignId) {
+            this.campaignId = campaignId;
+        }
+        String adName = data.getString("ad_name");
+        if (null != adName) {
+            this.adName = adName;
+        }
+        Long adId = data.getLong("ad_id");
+        if (null != adId) {
+            this.adId = adId;
+        }
+    }
+
+    public BytedancePlanHourlyReport() {
+    }
+}

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

@@ -0,0 +1,17 @@
+package org.jeecg.modules.ctop.mapper;
+
+import java.util.List;
+
+import org.apache.ibatis.annotations.Param;
+import org.jeecg.modules.ctop.entity.BytedanceAdvertiserDailyReport;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * @Description: 广告主日报表
+ * @Author: jeecg-boot
+ * @Date: 2019-09-10
+ * @Version: V1.0
+ */
+public interface BytedanceAdvertiserDailyReportMapper extends BaseMapper<BytedanceAdvertiserDailyReport> {
+
+}

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

@@ -0,0 +1,17 @@
+package org.jeecg.modules.ctop.mapper;
+
+import java.util.List;
+
+import org.apache.ibatis.annotations.Param;
+import org.jeecg.modules.ctop.entity.BytedanceAdvertiserHourlyReport;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * @Description: 广告主小时级别报表信息
+ * @Author: jeecg-boot
+ * @Date: 2019-09-10
+ * @Version: V1.0
+ */
+public interface BytedanceAdvertiserHourlyReportMapper extends BaseMapper<BytedanceAdvertiserHourlyReport> {
+
+}

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

@@ -0,0 +1,17 @@
+package org.jeecg.modules.ctop.mapper;
+
+import java.util.List;
+
+import org.apache.ibatis.annotations.Param;
+import org.jeecg.modules.ctop.entity.BytedanceCampaignDailyReport;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * @Description: 广告组日报表信息
+ * @Author: jeecg-boot
+ * @Date: 2019-09-11
+ * @Version: V1.0
+ */
+public interface BytedanceCampaignDailyReportMapper extends BaseMapper<BytedanceCampaignDailyReport> {
+
+}

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

@@ -0,0 +1,17 @@
+package org.jeecg.modules.ctop.mapper;
+
+import java.util.List;
+
+import org.apache.ibatis.annotations.Param;
+import org.jeecg.modules.ctop.entity.BytedanceCampaignHourlyReport;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * @Description: 广告组时报表信息
+ * @Author: jeecg-boot
+ * @Date: 2019-09-11
+ * @Version: V1.0
+ */
+public interface BytedanceCampaignHourlyReportMapper extends BaseMapper<BytedanceCampaignHourlyReport> {
+
+}

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

@@ -0,0 +1,17 @@
+package org.jeecg.modules.ctop.mapper;
+
+import java.util.List;
+
+import org.apache.ibatis.annotations.Param;
+import org.jeecg.modules.ctop.entity.BytedanceCreativeDailyReport;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * @Description: 广告创意日报表信息
+ * @Author: jeecg-boot
+ * @Date: 2019-09-11
+ * @Version: V1.0
+ */
+public interface BytedanceCreativeDailyReportMapper extends BaseMapper<BytedanceCreativeDailyReport> {
+
+}

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

@@ -0,0 +1,17 @@
+package org.jeecg.modules.ctop.mapper;
+
+import java.util.List;
+
+import org.apache.ibatis.annotations.Param;
+import org.jeecg.modules.ctop.entity.BytedanceCreativeHourlyReport;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * @Description: 广告创意日报表信息
+ * @Author: jeecg-boot
+ * @Date: 2019-09-11
+ * @Version: V1.0
+ */
+public interface BytedanceCreativeHourlyReportMapper extends BaseMapper<BytedanceCreativeHourlyReport> {
+
+}

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

@@ -0,0 +1,17 @@
+package org.jeecg.modules.ctop.mapper;
+
+import java.util.List;
+
+import org.apache.ibatis.annotations.Param;
+import org.jeecg.modules.ctop.entity.BytedancePlanDailyReport;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * @Description: 广告计划日报表信息
+ * @Author: jeecg-boot
+ * @Date: 2019-09-11
+ * @Version: V1.0
+ */
+public interface BytedancePlanDailyReportMapper extends BaseMapper<BytedancePlanDailyReport> {
+
+}

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

@@ -0,0 +1,17 @@
+package org.jeecg.modules.ctop.mapper;
+
+import java.util.List;
+
+import org.apache.ibatis.annotations.Param;
+import org.jeecg.modules.ctop.entity.BytedancePlanHourlyReport;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * @Description: 广告计划时报表信息
+ * @Author: jeecg-boot
+ * @Date: 2019-09-11
+ * @Version: V1.0
+ */
+public interface BytedancePlanHourlyReportMapper extends BaseMapper<BytedancePlanHourlyReport> {
+
+}

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

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

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

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

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

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

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

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

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

@@ -0,0 +1,14 @@
+package org.jeecg.modules.ctop.service;
+
+import org.jeecg.modules.ctop.entity.BytedanceAdvertiserDailyReport;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * @Description: 广告主日报表
+ * @Author: jeecg-boot
+ * @Date: 2019-09-10
+ * @Version: V1.0
+ */
+public interface IBytedanceAdvertiserDailyReportService extends IService<BytedanceAdvertiserDailyReport> {
+
+}

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

@@ -0,0 +1,14 @@
+package org.jeecg.modules.ctop.service;
+
+import org.jeecg.modules.ctop.entity.BytedanceAdvertiserHourlyReport;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * @Description: 广告主小时级别报表信息
+ * @Author: jeecg-boot
+ * @Date: 2019-09-10
+ * @Version: V1.0
+ */
+public interface IBytedanceAdvertiserHourlyReportService extends IService<BytedanceAdvertiserHourlyReport> {
+
+}

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

@@ -0,0 +1,14 @@
+package org.jeecg.modules.ctop.service;
+
+import org.jeecg.modules.ctop.entity.BytedanceCampaignDailyReport;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * @Description: 广告组日报表信息
+ * @Author: jeecg-boot
+ * @Date: 2019-09-11
+ * @Version: V1.0
+ */
+public interface IBytedanceCampaignDailyReportService extends IService<BytedanceCampaignDailyReport> {
+
+}

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

@@ -0,0 +1,14 @@
+package org.jeecg.modules.ctop.service;
+
+import org.jeecg.modules.ctop.entity.BytedanceCampaignHourlyReport;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * @Description: 广告组时报表信息
+ * @Author: jeecg-boot
+ * @Date: 2019-09-11
+ * @Version: V1.0
+ */
+public interface IBytedanceCampaignHourlyReportService extends IService<BytedanceCampaignHourlyReport> {
+
+}

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

@@ -0,0 +1,14 @@
+package org.jeecg.modules.ctop.service;
+
+import org.jeecg.modules.ctop.entity.BytedanceCreativeDailyReport;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * @Description: 广告创意日报表信息
+ * @Author: jeecg-boot
+ * @Date: 2019-09-11
+ * @Version: V1.0
+ */
+public interface IBytedanceCreativeDailyReportService extends IService<BytedanceCreativeDailyReport> {
+
+}

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

@@ -0,0 +1,14 @@
+package org.jeecg.modules.ctop.service;
+
+import org.jeecg.modules.ctop.entity.BytedanceCreativeHourlyReport;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * @Description: 广告创意日报表信息
+ * @Author: jeecg-boot
+ * @Date: 2019-09-11
+ * @Version: V1.0
+ */
+public interface IBytedanceCreativeHourlyReportService extends IService<BytedanceCreativeHourlyReport> {
+
+}

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

@@ -0,0 +1,14 @@
+package org.jeecg.modules.ctop.service;
+
+import org.jeecg.modules.ctop.entity.BytedancePlanDailyReport;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * @Description: 广告计划日报表信息
+ * @Author: jeecg-boot
+ * @Date: 2019-09-11
+ * @Version: V1.0
+ */
+public interface IBytedancePlanDailyReportService extends IService<BytedancePlanDailyReport> {
+
+}

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

@@ -0,0 +1,14 @@
+package org.jeecg.modules.ctop.service;
+
+import org.jeecg.modules.ctop.entity.BytedancePlanHourlyReport;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * @Description: 广告计划时报表信息
+ * @Author: jeecg-boot
+ * @Date: 2019-09-11
+ * @Version: V1.0
+ */
+public interface IBytedancePlanHourlyReportService extends IService<BytedancePlanHourlyReport> {
+
+}

+ 13 - 159
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/service/impl/ByteDanceAdvertisePlanServiceImpl.java

@@ -1,17 +1,10 @@
 package org.jeecg.modules.ctop.service.impl;
 package org.jeecg.modules.ctop.service.impl;
 
 
+import cn.com.ctop.common.utils.HttpUtils;
 import cn.com.ctop.common.utils.PropertiesUtils;
 import cn.com.ctop.common.utils.PropertiesUtils;
 import com.alibaba.fastjson.JSONObject;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import lombok.extern.slf4j.Slf4j;
 import lombok.extern.slf4j.Slf4j;
-import org.apache.http.client.ClientProtocolException;
-import org.apache.http.client.methods.CloseableHttpResponse;
-import org.apache.http.client.methods.HttpEntityEnclosingRequestBase;
-import org.apache.http.client.methods.HttpPost;
-import org.apache.http.entity.ContentType;
-import org.apache.http.entity.StringEntity;
-import org.apache.http.impl.client.CloseableHttpClient;
-import org.apache.http.impl.client.HttpClientBuilder;
 import org.jeecg.modules.ctop.entity.ByteDanceAdvertisePlan;
 import org.jeecg.modules.ctop.entity.ByteDanceAdvertisePlan;
 import org.jeecg.modules.ctop.entity.BytedanceDeliveryTargetTemplate;
 import org.jeecg.modules.ctop.entity.BytedanceDeliveryTargetTemplate;
 import org.jeecg.modules.ctop.entity.BytedanceUrlInfo;
 import org.jeecg.modules.ctop.entity.BytedanceUrlInfo;
@@ -24,10 +17,6 @@ import org.jeecg.modules.ctop.service.ICtopOauthTokenService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
 
 
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.net.URI;
 import java.util.HashMap;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.Map;
 
 
@@ -42,13 +31,10 @@ import java.util.Map;
 public class ByteDanceAdvertisePlanServiceImpl extends ServiceImpl<ByteDanceAdvertisePlanMapper, ByteDanceAdvertisePlan> implements IByteDanceAdvertisePlanService {
 public class ByteDanceAdvertisePlanServiceImpl extends ServiceImpl<ByteDanceAdvertisePlanMapper, ByteDanceAdvertisePlan> implements IByteDanceAdvertisePlanService {
     @Autowired
     @Autowired
     private BytedanceUrlInfoMapper urlInfoMapper;
     private BytedanceUrlInfoMapper urlInfoMapper;
-
     @Autowired
     @Autowired
     private BytedanceDeliveryTargetTemplateMapper deliveryTargetTemplateMapper;
     private BytedanceDeliveryTargetTemplateMapper deliveryTargetTemplateMapper;
-
     @Autowired
     @Autowired
     private ICtopOauthTokenService tokenService;
     private ICtopOauthTokenService tokenService;
-
     @Autowired
     @Autowired
     private ByteDanceAdvertisePlanMapper planMapper;
     private ByteDanceAdvertisePlanMapper planMapper;
 
 
@@ -93,182 +79,50 @@ public class ByteDanceAdvertisePlanServiceImpl extends ServiceImpl<ByteDanceAdve
     }
     }
 
 
     private Map<String, Object> getAdConvertByUrlInfo(CtopOauthToken token, BytedanceUrlInfo urlInfo) {
     private Map<String, Object> getAdConvertByUrlInfo(CtopOauthToken token, BytedanceUrlInfo urlInfo) {
-        String accessToken = token.getAccessToken();
         final Long advertiserId = token.getAccountId();
         final Long advertiserId = token.getAccountId();
         // 请求地址
         // 请求地址
         String url = "https://ad.toutiao.com/open_api/2/tools/ad_convert/select/";
         String url = "https://ad.toutiao.com/open_api/2/tools/ad_convert/select/";
-
         // 请求参数
         // 请求参数
-        Map data = new HashMap() {
-            {
-                put("advertiser_id", advertiserId);
-            }
-        };
+        Map<String, Object> params = new HashMap();
+        params.put("advertiser_id", advertiserId);
         //落地页或IOS下载链接
         //落地页或IOS下载链接
         if ("page".equals(urlInfo.getType()) || "page".equals(urlInfo.getType())) {
         if ("page".equals(urlInfo.getType()) || "page".equals(urlInfo.getType())) {
-            data.put("external_url", urlInfo.getUrl());
+            params.put("external_url", urlInfo.getUrl());
         }
         }
         //安卓下载链接
         //安卓下载链接
         if ("android".equals(urlInfo.getType())) {
         if ("android".equals(urlInfo.getType())) {
-            data.put("package_name", urlInfo.getPackageName());
+            params.put("package_name", urlInfo.getPackageName());
         }
         }
-
-        // 构造请求
-        HttpEntityEnclosingRequestBase httpEntity = new HttpEntityEnclosingRequestBase() {
-            @Override
-            public String getMethod() {
-                return "GET";
-            }
-        };
-        httpEntity.setHeader("Access-Token", accessToken);
-        CloseableHttpResponse response = null;
-        CloseableHttpClient client = null;
-        try {
-            client = HttpClientBuilder.create().build();
-            httpEntity.setURI(URI.create(url));
-            httpEntity.setEntity(new StringEntity(JSONObject.toJSONString(data), ContentType.APPLICATION_JSON));
-            response = client.execute(httpEntity);
-            if (response != null && response.getStatusLine().getStatusCode() == 200) {
-                BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
-                StringBuffer result = new StringBuffer();
-                String line = "";
-                while ((line = bufferedReader.readLine()) != null) {
-                    result.append(line);
-                }
-                bufferedReader.close();
-                return JSONObject.parseObject(result.toString());
-            }
-        } catch (ClientProtocolException e) {
-            e.printStackTrace();
-        } catch (IOException e) {
-            e.printStackTrace();
-        } finally {
-            try {
-                if (response != null) {
-                    response.close();
-                }
-                client.close();
-            } catch (IOException e) {
-                e.printStackTrace();
-            }
-        }
-        return null;
+        return HttpUtils.bytedanceGetRequest(token.getAccessToken(), url, params);
     }
     }
 
 
     public JSONObject getAdConvert(CtopOauthToken token, BytedanceDeliveryTargetTemplate targetTemplate) {
     public JSONObject getAdConvert(CtopOauthToken token, BytedanceDeliveryTargetTemplate targetTemplate) {
-        String accessToken = token.getAccessToken();
         final Long advertiserId = token.getAccountId();
         final Long advertiserId = token.getAccountId();
         // 请求地址
         // 请求地址
         String url = "https://ad.toutiao.com/open_api/2/tools/ad_convert/select/";
         String url = "https://ad.toutiao.com/open_api/2/tools/ad_convert/select/";
-
         // 请求参数
         // 请求参数
-        Map data = new HashMap() {
-            {
-                put("advertiser_id", advertiserId);
-            }
-        };
+        Map<String, Object> params = new HashMap();
+        params.put("advertiser_id", advertiserId);
         //落地页
         //落地页
         if ("EXTERNAL_URL".equals(targetTemplate.getDownloadType())) {
         if ("EXTERNAL_URL".equals(targetTemplate.getDownloadType())) {
-            data.put("external_url", targetTemplate.getDownloadUrl());
+            params.put("external_url", targetTemplate.getDownloadUrl());
         }
         }
         //下载链接
         //下载链接
         if ("DOWNLOAD_URL".equals(targetTemplate.getDownloadType())) {
         if ("DOWNLOAD_URL".equals(targetTemplate.getDownloadType())) {
             if ("ios".equals(targetTemplate.getDownloadMode())) {
             if ("ios".equals(targetTemplate.getDownloadMode())) {
-                data.put("download_url", targetTemplate.getDownloadUrl());
+                params.put("download_url", targetTemplate.getDownloadUrl());
             }
             }
             if ("android".equals(targetTemplate.getDownloadMode())) {
             if ("android".equals(targetTemplate.getDownloadMode())) {
-                data.put("package_name", targetTemplate.getPackageName());
+                params.put("package_name", targetTemplate.getPackageName());
             }
             }
         }
         }
-
-
-        // 构造请求
-        HttpEntityEnclosingRequestBase httpEntity = new HttpEntityEnclosingRequestBase() {
-            @Override
-            public String getMethod() {
-                return "GET";
-            }
-        };
-
-        httpEntity.setHeader("Access-Token", accessToken);
-
-        CloseableHttpResponse response = null;
-        CloseableHttpClient client = null;
-
-        try {
-            client = HttpClientBuilder.create().build();
-            httpEntity.setURI(URI.create(url));
-            httpEntity.setEntity(new StringEntity(JSONObject.toJSONString(data), ContentType.APPLICATION_JSON));
-
-            response = client.execute(httpEntity);
-            if (response != null && response.getStatusLine().getStatusCode() == 200) {
-                BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
-                StringBuffer result = new StringBuffer();
-                String line = "";
-                while ((line = bufferedReader.readLine()) != null) {
-                    result.append(line);
-                }
-                bufferedReader.close();
-                return JSONObject.parseObject(result.toString());
-            }
-
-        } catch (ClientProtocolException e) {
-            e.printStackTrace();
-        } catch (IOException e) {
-            e.printStackTrace();
-        } finally {
-            try {
-                if (response != null) {
-                    response.close();
-                }
-                client.close();
-            } catch (IOException e) {
-                e.printStackTrace();
-            }
-        }
-        return null;
+        return HttpUtils.bytedanceGetRequest(token.getAccessToken(), url, params);
     }
     }
 
 
 
 
     public JSONObject createAd(JSONObject data, String token) {
     public JSONObject createAd(JSONObject data, String token) {
         // 请求地址
         // 请求地址
         String url = PropertiesUtils.getValue("bytedance_config", "bytedance_api_url") + PropertiesUtils.getValue("bytedance_config", "bytedance_v2_ad_create");
         String url = PropertiesUtils.getValue("bytedance_config", "bytedance_api_url") + PropertiesUtils.getValue("bytedance_config", "bytedance_v2_ad_create");
-        // 构造请求
-        HttpPost httpEntity = new HttpPost(url);
-        httpEntity.setHeader("Access-Token", token);
-        CloseableHttpResponse response = null;
-        CloseableHttpClient client = null;
-
-        try {
-            client = HttpClientBuilder.create().build();
-            httpEntity.setEntity(new StringEntity(data.toJSONString(), ContentType.APPLICATION_JSON));
-
-            response = client.execute(httpEntity);
-            if (response != null && response.getStatusLine().getStatusCode() == 200) {
-                BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
-                StringBuffer result = new StringBuffer();
-                String line = "";
-                while ((line = bufferedReader.readLine()) != null) {
-                    result.append(line);
-                }
-                bufferedReader.close();
-                return JSONObject.parseObject(result.toString());
-            }
-
-        } catch (ClientProtocolException e) {
-            e.printStackTrace();
-        } catch (IOException e) {
-            e.printStackTrace();
-        } finally {
-            try {
-                if (response != null) {
-                    response.close();
-                }
-                client.close();
-            } catch (IOException e) {
-                e.printStackTrace();
-            }
-        }
-        return null;
+        return HttpUtils.bytedancePostRequest(token, url, data);
     }
     }
 }
 }

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

@@ -550,7 +550,6 @@ public class ByteDanceAdvertiserDataServiceImpl implements IByteDanceAdvertiserD
         }
         }
         JSONArray returnCreativeIds = data.getJSONArray("creative_ids");
         JSONArray returnCreativeIds = data.getJSONArray("creative_ids");
         if (null != returnCreativeIds && returnCreativeIds.size() > 0) {
         if (null != returnCreativeIds && returnCreativeIds.size() > 0) {
-            //TODO 获取广告计划信息 需要注意这里的逻辑 有漏洞,后期修改
             getAdvertiserCreative(accountId, creativeIds);
             getAdvertiserCreative(accountId, creativeIds);
         }
         }
         resultMap.put("code", 0);
         resultMap.put("code", 0);
@@ -648,7 +647,6 @@ public class ByteDanceAdvertiserDataServiceImpl implements IByteDanceAdvertiserD
         for (int i = 0; i < data.size(); i++) {
         for (int i = 0; i < data.size(); i++) {
             JSONObject dataObject = data.getJSONObject(i);
             JSONObject dataObject = data.getJSONObject(i);
             ByteDanceCreative creative = new ByteDanceCreative(dataObject, accountId);
             ByteDanceCreative creative = new ByteDanceCreative(dataObject, accountId);
-            //清除清数据,插入新数据
             creativeMapper.deleteById(creative.getId());
             creativeMapper.deleteById(creative.getId());
             creativeMapper.insert(creative);
             creativeMapper.insert(creative);
         }
         }
@@ -693,7 +691,6 @@ public class ByteDanceAdvertiserDataServiceImpl implements IByteDanceAdvertiserD
         for (int i = 0; i < data.size(); i++) {
         for (int i = 0; i < data.size(); i++) {
             JSONObject dataObject = data.getJSONObject(i);
             JSONObject dataObject = data.getJSONObject(i);
             ByteDanceCampaign campaign = new ByteDanceCampaign(dataObject, accountId);
             ByteDanceCampaign campaign = new ByteDanceCampaign(dataObject, accountId);
-            //清除清数据,插入新数据
             campaignMapper.deleteById(campaign.getId());
             campaignMapper.deleteById(campaign.getId());
             campaignMapper.insert(campaign);
             campaignMapper.insert(campaign);
         }
         }

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

@@ -8,13 +8,6 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import lombok.extern.slf4j.Slf4j;
 import lombok.extern.slf4j.Slf4j;
-import org.apache.http.client.ClientProtocolException;
-import org.apache.http.client.methods.CloseableHttpResponse;
-import org.apache.http.client.methods.HttpPost;
-import org.apache.http.entity.ContentType;
-import org.apache.http.entity.StringEntity;
-import org.apache.http.impl.client.CloseableHttpClient;
-import org.apache.http.impl.client.HttpClientBuilder;
 import org.apache.shiro.SecurityUtils;
 import org.apache.shiro.SecurityUtils;
 import org.jeecg.common.api.vo.Result;
 import org.jeecg.common.api.vo.Result;
 import org.jeecg.common.system.query.QueryGenerator;
 import org.jeecg.common.system.query.QueryGenerator;
@@ -32,9 +25,6 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
 
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletRequest;
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStreamReader;
 import java.text.SimpleDateFormat;
 import java.text.SimpleDateFormat;
 import java.util.Date;
 import java.util.Date;
 import java.util.HashMap;
 import java.util.HashMap;
@@ -137,20 +127,16 @@ public class ByteDanceCampaignTemplateServiceImpl extends ServiceImpl<ByteDanceC
     @Override
     @Override
     public Map<String, Object> getSuggestCover(String accountId, String videoId) {
     public Map<String, Object> getSuggestCover(String accountId, String videoId) {
         CtopOauthToken token = tokenService.getOauthTokenByAccountId(accountId);
         CtopOauthToken token = tokenService.getOauthTokenByAccountId(accountId);
-        JSONObject result = suggestVideo(token, videoId);
-        return null;
+        return suggestVideo(token, videoId);
     }
     }
 
 
     public JSONObject suggestVideo(CtopOauthToken token, String videoId) {
     public JSONObject suggestVideo(CtopOauthToken token, String videoId) {
         // 请求地址
         // 请求地址
         String url = "https://ad.toutiao.com/open_api/2/tools/video_cover/suggest/";
         String url = "https://ad.toutiao.com/open_api/2/tools/video_cover/suggest/";
         // 请求参数
         // 请求参数
-        Map data = new HashMap() {
-            {
-                put("advertiser_id", token.getAccountId());
-                put("video_id", videoId);
-            }
-        };
+        Map<String, Object> data = new HashMap();
+        data.put("advertiser_id", token.getAccountId());
+        data.put("video_id", videoId);
         return HttpUtils.bytedanceGetRequest(token.getAccessToken(), url, data);
         return HttpUtils.bytedanceGetRequest(token.getAccessToken(), url, data);
     }
     }
 
 
@@ -232,43 +218,7 @@ public class ByteDanceCampaignTemplateServiceImpl extends ServiceImpl<ByteDanceC
     }
     }
 
 
     public JSONObject createCampaign(JSONObject data, String token) {
     public JSONObject createCampaign(JSONObject data, String token) {
-        // 请求地址
         String url = PropertiesUtils.getValue("bytedance_config", "bytedance_api_url") + PropertiesUtils.getValue("bytedance_config", "bytedance_v2_campaign_create");
         String url = PropertiesUtils.getValue("bytedance_config", "bytedance_api_url") + PropertiesUtils.getValue("bytedance_config", "bytedance_v2_campaign_create");
-        // 构造请求
-        HttpPost httpEntity = new HttpPost(url);
-        httpEntity.setHeader("Access-Token", token);
-        CloseableHttpResponse response = null;
-        CloseableHttpClient client = null;
-        try {
-            client = HttpClientBuilder.create().build();
-            httpEntity.setEntity(new StringEntity(data.toJSONString(), ContentType.APPLICATION_JSON));
-
-            response = client.execute(httpEntity);
-            if (response != null && response.getStatusLine().getStatusCode() == 200) {
-                BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
-                StringBuffer result = new StringBuffer();
-                String line = "";
-                while ((line = bufferedReader.readLine()) != null) {
-                    result.append(line);
-                }
-                bufferedReader.close();
-                return JSONObject.parseObject(result.toString());
-            }
-
-        } catch (ClientProtocolException e) {
-            e.printStackTrace();
-        } catch (IOException e) {
-            e.printStackTrace();
-        } finally {
-            try {
-                if (response != null) {
-                    response.close();
-                }
-                client.close();
-            } catch (IOException e) {
-                e.printStackTrace();
-            }
-        }
-        return null;
+        return HttpUtils.bytedancePostRequest(token, url, data);
     }
     }
 }
 }

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

@@ -0,0 +1,19 @@
+package org.jeecg.modules.ctop.service.impl;
+
+import org.jeecg.modules.ctop.entity.BytedanceAdvertiserDailyReport;
+import org.jeecg.modules.ctop.mapper.BytedanceAdvertiserDailyReportMapper;
+import org.jeecg.modules.ctop.service.IBytedanceAdvertiserDailyReportService;
+import org.springframework.stereotype.Service;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+
+/**
+ * @Description: 广告主日报表
+ * @Author: jeecg-boot
+ * @Date: 2019-09-10
+ * @Version: V1.0
+ */
+@Service
+public class BytedanceAdvertiserDailyReportServiceImpl extends ServiceImpl<BytedanceAdvertiserDailyReportMapper, BytedanceAdvertiserDailyReport> implements IBytedanceAdvertiserDailyReportService {
+
+}

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

@@ -0,0 +1,19 @@
+package org.jeecg.modules.ctop.service.impl;
+
+import org.jeecg.modules.ctop.entity.BytedanceAdvertiserHourlyReport;
+import org.jeecg.modules.ctop.mapper.BytedanceAdvertiserHourlyReportMapper;
+import org.jeecg.modules.ctop.service.IBytedanceAdvertiserHourlyReportService;
+import org.springframework.stereotype.Service;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+
+/**
+ * @Description: 广告主小时级别报表信息
+ * @Author: jeecg-boot
+ * @Date: 2019-09-10
+ * @Version: V1.0
+ */
+@Service
+public class BytedanceAdvertiserHourlyReportServiceImpl extends ServiceImpl<BytedanceAdvertiserHourlyReportMapper, BytedanceAdvertiserHourlyReport> implements IBytedanceAdvertiserHourlyReportService {
+
+}

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

@@ -0,0 +1,19 @@
+package org.jeecg.modules.ctop.service.impl;
+
+import org.jeecg.modules.ctop.entity.BytedanceCampaignDailyReport;
+import org.jeecg.modules.ctop.mapper.BytedanceCampaignDailyReportMapper;
+import org.jeecg.modules.ctop.service.IBytedanceCampaignDailyReportService;
+import org.springframework.stereotype.Service;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+
+/**
+ * @Description: 广告组日报表信息
+ * @Author: jeecg-boot
+ * @Date: 2019-09-11
+ * @Version: V1.0
+ */
+@Service
+public class BytedanceCampaignDailyReportServiceImpl extends ServiceImpl<BytedanceCampaignDailyReportMapper, BytedanceCampaignDailyReport> implements IBytedanceCampaignDailyReportService {
+
+}

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

@@ -0,0 +1,19 @@
+package org.jeecg.modules.ctop.service.impl;
+
+import org.jeecg.modules.ctop.entity.BytedanceCampaignHourlyReport;
+import org.jeecg.modules.ctop.mapper.BytedanceCampaignHourlyReportMapper;
+import org.jeecg.modules.ctop.service.IBytedanceCampaignHourlyReportService;
+import org.springframework.stereotype.Service;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+
+/**
+ * @Description: 广告组时报表信息
+ * @Author: jeecg-boot
+ * @Date: 2019-09-11
+ * @Version: V1.0
+ */
+@Service
+public class BytedanceCampaignHourlyReportServiceImpl extends ServiceImpl<BytedanceCampaignHourlyReportMapper, BytedanceCampaignHourlyReport> implements IBytedanceCampaignHourlyReportService {
+
+}

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

@@ -0,0 +1,19 @@
+package org.jeecg.modules.ctop.service.impl;
+
+import org.jeecg.modules.ctop.entity.BytedanceCreativeDailyReport;
+import org.jeecg.modules.ctop.mapper.BytedanceCreativeDailyReportMapper;
+import org.jeecg.modules.ctop.service.IBytedanceCreativeDailyReportService;
+import org.springframework.stereotype.Service;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+
+/**
+ * @Description: 广告创意日报表信息
+ * @Author: jeecg-boot
+ * @Date: 2019-09-11
+ * @Version: V1.0
+ */
+@Service
+public class BytedanceCreativeDailyReportServiceImpl extends ServiceImpl<BytedanceCreativeDailyReportMapper, BytedanceCreativeDailyReport> implements IBytedanceCreativeDailyReportService {
+
+}

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

@@ -0,0 +1,19 @@
+package org.jeecg.modules.ctop.service.impl;
+
+import org.jeecg.modules.ctop.entity.BytedanceCreativeHourlyReport;
+import org.jeecg.modules.ctop.mapper.BytedanceCreativeHourlyReportMapper;
+import org.jeecg.modules.ctop.service.IBytedanceCreativeHourlyReportService;
+import org.springframework.stereotype.Service;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+
+/**
+ * @Description: 广告创意日报表信息
+ * @Author: jeecg-boot
+ * @Date: 2019-09-11
+ * @Version: V1.0
+ */
+@Service
+public class BytedanceCreativeHourlyReportServiceImpl extends ServiceImpl<BytedanceCreativeHourlyReportMapper, BytedanceCreativeHourlyReport> implements IBytedanceCreativeHourlyReportService {
+
+}

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

@@ -0,0 +1,19 @@
+package org.jeecg.modules.ctop.service.impl;
+
+import org.jeecg.modules.ctop.entity.BytedancePlanDailyReport;
+import org.jeecg.modules.ctop.mapper.BytedancePlanDailyReportMapper;
+import org.jeecg.modules.ctop.service.IBytedancePlanDailyReportService;
+import org.springframework.stereotype.Service;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+
+/**
+ * @Description: 广告计划日报表信息
+ * @Author: jeecg-boot
+ * @Date: 2019-09-11
+ * @Version: V1.0
+ */
+@Service
+public class BytedancePlanDailyReportServiceImpl extends ServiceImpl<BytedancePlanDailyReportMapper, BytedancePlanDailyReport> implements IBytedancePlanDailyReportService {
+
+}

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

@@ -0,0 +1,19 @@
+package org.jeecg.modules.ctop.service.impl;
+
+import org.jeecg.modules.ctop.entity.BytedancePlanHourlyReport;
+import org.jeecg.modules.ctop.mapper.BytedancePlanHourlyReportMapper;
+import org.jeecg.modules.ctop.service.IBytedancePlanHourlyReportService;
+import org.springframework.stereotype.Service;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+
+/**
+ * @Description: 广告计划时报表信息
+ * @Author: jeecg-boot
+ * @Date: 2019-09-11
+ * @Version: V1.0
+ */
+@Service
+public class BytedancePlanHourlyReportServiceImpl extends ServiceImpl<BytedancePlanHourlyReportMapper, BytedancePlanHourlyReport> implements IBytedancePlanHourlyReportService {
+
+}

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

@@ -25,7 +25,6 @@ import org.openqa.selenium.chrome.ChromeOptions;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
-import sun.misc.BASE64Decoder;
 
 
 import java.util.*;
 import java.util.*;
 
 
@@ -99,8 +98,8 @@ public class CreateInternalServiceImpl implements ICreateInternalService {
                     fateadmUtil.Justice(orderId);
                     fateadmUtil.Justice(orderId);
                 }
                 }
                 String captcha = jsonNode.get("captcha").asText();
                 String captcha = jsonNode.get("captcha").asText();
-                BASE64Decoder decoder = new BASE64Decoder();
-                FateadmHttpUtil.HttpResp resp = fateadmUtil.Predict("30400", decoder.decodeBuffer(captcha));
+                Base64.Decoder decoder = Base64.getDecoder();
+                FateadmHttpUtil.HttpResp resp = fateadmUtil.Predict("30400", decoder.decode(captcha));
                 param.put("captcha", resp.pred_resl);
                 param.put("captcha", resp.pred_resl);
                 orderId = resp.req_id;
                 orderId = resp.req_id;
                 res = HttpUtils2.httpPostParamRequest("https://sso.toutiao.com/account_login/", param, header);
                 res = HttpUtils2.httpPostParamRequest("https://sso.toutiao.com/account_login/", param, header);
@@ -211,8 +210,8 @@ public class CreateInternalServiceImpl implements ICreateInternalService {
                     fateadmUtil.Justice(orderId);
                     fateadmUtil.Justice(orderId);
                 }
                 }
                 String captcha = jsonNode.get("captcha").asText();
                 String captcha = jsonNode.get("captcha").asText();
-                BASE64Decoder decoder = new BASE64Decoder();
-                FateadmHttpUtil.HttpResp resp = fateadmUtil.Predict("30400", decoder.decodeBuffer(captcha));
+                Base64.Decoder decoder = Base64.getDecoder();
+                FateadmHttpUtil.HttpResp resp = fateadmUtil.Predict("30400", decoder.decode(captcha));
                 param.put("captcha", resp.pred_resl);
                 param.put("captcha", resp.pred_resl);
                 orderId = resp.req_id;
                 orderId = resp.req_id;
                 res = HttpUtils2.httpPostParamRequest("https://sso.toutiao.com/account_login/", param, header);
                 res = HttpUtils2.httpPostParamRequest("https://sso.toutiao.com/account_login/", param, header);

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

@@ -233,17 +233,13 @@ public class FileInfoServiceImpl extends ServiceImpl<FileInfoMapper, FileInfo> i
         return null;
         return null;
     }
     }
 
 
-    public JSONObject getCreativeWord(CtopOauthToken token, Long accountId) {
+    public JSONObject getCreativeWord(CtopOauthToken token, Long advertiserId) {
         // 请求地址
         // 请求地址
         String url = "https://ad.toutiao.com/open_api/2/tools/creative_word/select/";
         String url = "https://ad.toutiao.com/open_api/2/tools/creative_word/select/";
         // 请求参数
         // 请求参数
-        Map data = new HashMap() {
-            {
-                put("advertiser_id", accountId);
-            }
-        };
-        JSONObject resultObject = HttpUtils.bytedanceGetRequest(token.getAccessToken(), url, data);
-        return resultObject;
+        Map<String, Object> data = new HashMap();
+        data.put("advertiser_id", advertiserId);
+        return HttpUtils.bytedanceGetRequest(token.getAccessToken(), url, data);
     }
     }
 
 
     public JSONObject searchIndustry(CtopOauthToken token, Integer level) {
     public JSONObject searchIndustry(CtopOauthToken token, Integer level) {
@@ -252,8 +248,7 @@ public class FileInfoServiceImpl extends ServiceImpl<FileInfoMapper, FileInfo> i
         if (null != level) {
         if (null != level) {
             url += "?level=" + level;
             url += "?level=" + level;
         }
         }
-        JSONObject resultObject = HttpUtils.bytedanceGetRequest(token.getAccessToken(), url, new HashMap<>());
-        return resultObject;
+        return HttpUtils.bytedanceGetRequest(token.getAccessToken(), url, new HashMap<>());
     }
     }
 
 
     public JSONObject uploadAdImage(CtopOauthToken token, String imageUrl, String advertiserId) {
     public JSONObject uploadAdImage(CtopOauthToken token, String imageUrl, String advertiserId) {

+ 159 - 247
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/service/impl/ReportServiceImpl.java

@@ -1,32 +1,24 @@
 package org.jeecg.modules.ctop.service.impl;
 package org.jeecg.modules.ctop.service.impl;
 
 
 import cn.com.ctop.common.utils.CsvUtils;
 import cn.com.ctop.common.utils.CsvUtils;
+import cn.com.ctop.common.utils.HttpUtils;
+import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import org.apache.http.client.ClientProtocolException;
-import org.apache.http.client.methods.CloseableHttpResponse;
-import org.apache.http.client.methods.HttpEntityEnclosingRequestBase;
-import org.apache.http.entity.ContentType;
-import org.apache.http.entity.StringEntity;
-import org.apache.http.impl.client.CloseableHttpClient;
-import org.apache.http.impl.client.HttpClientBuilder;
+import lombok.extern.slf4j.Slf4j;
 import org.apache.poi.hssf.usermodel.HSSFDataFormat;
 import org.apache.poi.hssf.usermodel.HSSFDataFormat;
 import org.apache.poi.ss.usermodel.Cell;
 import org.apache.poi.ss.usermodel.Cell;
 import org.apache.poi.ss.usermodel.CellStyle;
 import org.apache.poi.ss.usermodel.CellStyle;
 import org.apache.poi.ss.usermodel.Row;
 import org.apache.poi.ss.usermodel.Row;
 import org.apache.poi.xssf.usermodel.XSSFSheet;
 import org.apache.poi.xssf.usermodel.XSSFSheet;
 import org.apache.poi.xssf.usermodel.XSSFWorkbook;
 import org.apache.poi.xssf.usermodel.XSSFWorkbook;
+import org.jeecg.common.constant.CtopAdConstant;
 import org.jeecg.common.util.ResultMapUtils;
 import org.jeecg.common.util.ResultMapUtils;
 import org.jeecg.common.util.StatusCode;
 import org.jeecg.common.util.StatusCode;
-import org.jeecg.modules.ctop.entity.CtopOauthToken;
-import org.jeecg.modules.ctop.entity.CustomerPlanStatisticInfo;
-import org.jeecg.modules.ctop.entity.PlatformCampaignStatisticInfo;
+import org.jeecg.modules.ctop.entity.*;
 import org.jeecg.modules.ctop.mapper.CustomerPlanStatisticInfoMapper;
 import org.jeecg.modules.ctop.mapper.CustomerPlanStatisticInfoMapper;
 import org.jeecg.modules.ctop.mapper.PlatformCampaignStatisticInfoMapper;
 import org.jeecg.modules.ctop.mapper.PlatformCampaignStatisticInfoMapper;
-import org.jeecg.modules.ctop.service.ICtopOauthTokenService;
-import org.jeecg.modules.ctop.service.ICustomerPlanStatisticInfoService;
-import org.jeecg.modules.ctop.service.IPlatformCampaignStatisticInfoService;
-import org.jeecg.modules.ctop.service.IReportService;
+import org.jeecg.modules.ctop.service.*;
 import org.jeecg.modules.ctop.vo.StatisticCampaignVo;
 import org.jeecg.modules.ctop.vo.StatisticCampaignVo;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.beans.factory.annotation.Value;
@@ -35,7 +27,6 @@ import org.springframework.stereotype.Service;
 import java.io.*;
 import java.io.*;
 import java.math.BigDecimal;
 import java.math.BigDecimal;
 import java.net.HttpURLConnection;
 import java.net.HttpURLConnection;
-import java.net.URI;
 import java.net.URL;
 import java.net.URL;
 import java.text.SimpleDateFormat;
 import java.text.SimpleDateFormat;
 import java.util.Date;
 import java.util.Date;
@@ -43,6 +34,10 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.List;
 import java.util.Map;
 import java.util.Map;
 
 
+/**
+ * @author 宋英豪
+ */
+@Slf4j
 @Service
 @Service
 public class ReportServiceImpl implements IReportService {
 public class ReportServiceImpl implements IReportService {
     @Value("${jeecg.path.csv-upload}")
     @Value("${jeecg.path.csv-upload}")
@@ -59,109 +54,177 @@ public class ReportServiceImpl implements IReportService {
     private PlatformCampaignStatisticInfoMapper platformCampaignStatisticInfoMapper;
     private PlatformCampaignStatisticInfoMapper platformCampaignStatisticInfoMapper;
     @Autowired
     @Autowired
     private ICtopOauthTokenService tokenService;
     private ICtopOauthTokenService tokenService;
+    @Autowired
+    private IBytedanceAdvertiserDailyReportService advertiserDailyReportService;
+    @Autowired
+    private IBytedanceAdvertiserHourlyReportService advertiserHourlyReportService;
+    @Autowired
+    private IBytedanceCampaignDailyReportService campaignDailyReportService;
+    @Autowired
+    private IBytedanceCampaignHourlyReportService campaignHourlyReportService;
+    @Autowired
+    private IBytedancePlanDailyReportService planDailyReportService;
+    @Autowired
+    private IBytedancePlanHourlyReportService planHourlyReportService;
+    @Autowired
+    private IBytedanceCreativeDailyReportService creativeDailyReportService;
+    @Autowired
+    private IBytedanceCreativeHourlyReportService creativeHourlyReportService;
 
 
     @Override
     @Override
     public Map<String, Object> getAdvertiserReport(JSONObject conditions) {
     public Map<String, Object> getAdvertiserReport(JSONObject conditions) {
+        String time_granularity = "STAT_TIME_GRANULARITY_HOURLY";
         conditions = new JSONObject();
         conditions = new JSONObject();
-        conditions.put("advertiser_id", 74099510334L);
+        conditions.put("advertiser_id", 111463131228L);
         conditions.put("start_date", "2019-06-01");
         conditions.put("start_date", "2019-06-01");
-        conditions.put("end_date", "2019-07-01");
-        conditions.put("page_size", 50);
+        conditions.put("end_date", "2019-06-10");
+        conditions.put("page_size", 1000);
         conditions.put("page", 1);
         conditions.put("page", 1);
+        conditions.put("time_granularity", time_granularity);
         Long accountId = conditions.getLong("advertiser_id");
         Long accountId = conditions.getLong("advertiser_id");
-//        Long accountId = 74099510334L;
         CtopOauthToken token = tokenService.getOauthTokenByAccountId(accountId + "");
         CtopOauthToken token = tokenService.getOauthTokenByAccountId(accountId + "");
         JSONObject getObject = getAdvertiserStat(token, conditions);
         JSONObject getObject = getAdvertiserStat(token, conditions);
+        Integer code = getObject.getInteger("code");
+        String message = getObject.getString("message");
+        if (null == code || code != 0) {
+            log.error("广告主数据获取异常:{}", message);
+        } else {
+            JSONArray dataArray = getObject.getJSONObject("data").getJSONArray("list");
+            if (null != dataArray && dataArray.size() > 0) {
+                for (int i = 0; i < dataArray.size(); i++) {
+                    JSONObject data = dataArray.getJSONObject(i);
+                    if (null != time_granularity && time_granularity.equals(CtopAdConstant.BYTEDANCE_REPORT_TYPE_HOURLY)) {
+                        BytedanceAdvertiserHourlyReport hourlyReport = new BytedanceAdvertiserHourlyReport(data);
+                        advertiserHourlyReportService.saveOrUpdate(hourlyReport);
+                    } else {
+                        BytedanceAdvertiserDailyReport dailyReport = new BytedanceAdvertiserDailyReport(data);
+                        advertiserDailyReportService.saveOrUpdate(dailyReport);
+                    }
+                }
+            }
+        }
         return getObject;
         return getObject;
     }
     }
 
 
     @Override
     @Override
     public Map<String, Object> getCampaignReport(JSONObject conditions) {
     public Map<String, Object> getCampaignReport(JSONObject conditions) {
-        Long accountId = conditions.getLong("accountId");
+        String time_granularity = CtopAdConstant.BYTEDANCE_REPORT_TYPE_DAILY;
+        conditions = new JSONObject();
+        conditions.put("advertiser_id", 111463131228L);
+        conditions.put("start_date", "2019-06-01");
+        conditions.put("end_date", "2019-06-10");
+        conditions.put("page_size", 1000);
+        conditions.put("page", 1);
+        conditions.put("time_granularity", time_granularity);
+        Long accountId = conditions.getLong("advertiser_id");
         CtopOauthToken token = tokenService.getOauthTokenByAccountId(accountId + "");
         CtopOauthToken token = tokenService.getOauthTokenByAccountId(accountId + "");
         JSONObject getObject = getAdStat(token, conditions);
         JSONObject getObject = getAdStat(token, conditions);
-        return new HashMap<>();
+        Integer code = getObject.getInteger("code");
+        String message = getObject.getString("message");
+        if (null == code || code != 0) {
+            log.error("广告组报表数据获取异常:{}", message);
+        } else {
+            JSONArray dataArray = getObject.getJSONObject("data").getJSONArray("list");
+            if (null != dataArray && dataArray.size() > 0) {
+                for (int i = 0; i < dataArray.size(); i++) {
+                    JSONObject data = dataArray.getJSONObject(i);
+                    if (null != time_granularity && time_granularity.equals("STAT_TIME_GRANULARITY_HOURLY")) {
+                        BytedanceCampaignHourlyReport hourlyReport = new BytedanceCampaignHourlyReport(data);
+                        campaignHourlyReportService.saveOrUpdate(hourlyReport);
+                    } else {
+                        BytedanceCampaignDailyReport dailyReport = new BytedanceCampaignDailyReport(data);
+                        campaignDailyReportService.saveOrUpdate(dailyReport);
+                    }
+                }
+            }
+        }
+        return getObject;
     }
     }
 
 
     private JSONObject getAdStat(CtopOauthToken token, JSONObject conditions) {
     private JSONObject getAdStat(CtopOauthToken token, JSONObject conditions) {
-        final Long advertiserId = token.getAccountId();
+        Long advertiserId = token.getAccountId();
         // 请求地址
         // 请求地址
         String url = "https://ad.toutiao.com/open_api/2/report/ad/get/";
         String url = "https://ad.toutiao.com/open_api/2/report/ad/get/";
-        final Map filtering = new HashMap() {
-            {
-                put("campaign_id", 1L);
-            }
-        };
+        Map<String, Object> filtering = new HashMap<>();
+        filtering.put("campaign_id", 1L);
         // 请求参数
         // 请求参数
-        final Map data = new HashMap() {
-            {
-                put("advertiser_id", advertiserId);
-                put("start_date", "2018-04-01");
-                put("end_date", "2018-05-01");
-                put("time_granularity", "STAT_TIME_GRANULARITY_DAILY");
-                put("group_by", new String[]{"STAT_GROUP_BY_FIELD_ID"});
-                put("filtering", filtering);
-
-            }
-        };
-
-        // 构造请求
-        HttpEntityEnclosingRequestBase httpEntity = new HttpEntityEnclosingRequestBase() {
-            @Override
-            public String getMethod() {
-                return "GET";
-            }
-        };
-        httpEntity.setHeader("Access-Token", token.getAccessToken());
-        CloseableHttpResponse response = null;
-        CloseableHttpClient client = null;
-        try {
-            client = HttpClientBuilder.create().build();
-            httpEntity.setURI(URI.create(url));
-            httpEntity.setEntity(new StringEntity(JSONObject.toJSONString(data), ContentType.APPLICATION_JSON));
-
-            response = client.execute(httpEntity);
-            if (response != null && response.getStatusLine().getStatusCode() == 200) {
-                BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
-                StringBuffer result = new StringBuffer();
-                String line = "";
-                while ((line = bufferedReader.readLine()) != null) {
-                    result.append(line);
-                }
-                bufferedReader.close();
-                return JSONObject.parseObject(result.toString());
-            }
-
-        } catch (ClientProtocolException e) {
-            e.printStackTrace();
-        } catch (IOException e) {
-            e.printStackTrace();
-        } finally {
-            try {
-                if (response != null) {
-                    response.close();
-                }
-                client.close();
-            } catch (IOException e) {
-                e.printStackTrace();
-            }
-        }
-        return null;
+        Map<String, Object> params = new HashMap<>();
+        params.put("advertiser_id", advertiserId);
+        params.put("start_date", "2018-04-01");
+        params.put("end_date", "2018-05-01");
+        params.put("time_granularity", "STAT_TIME_GRANULARITY_DAILY");
+        params.put("group_by", new String[]{"STAT_GROUP_BY_FIELD_ID"});
+        params.put("filtering", filtering);
+        return HttpUtils.bytedanceGetRequest(token.getAccessToken(), url, params);
     }
     }
 
 
     @Override
     @Override
     public Map<String, Object> getAdReport(JSONObject conditions) {
     public Map<String, Object> getAdReport(JSONObject conditions) {
-        Long accountId = conditions.getLong("accountId");
+        String time_granularity = CtopAdConstant.BYTEDANCE_REPORT_TYPE_DAILY;
+        conditions = new JSONObject();
+        conditions.put("advertiser_id", 111463131228L);
+        conditions.put("start_date", "2019-06-01");
+        conditions.put("end_date", "2019-06-10");
+        conditions.put("page_size", 1000);
+        conditions.put("page", 1);
+        conditions.put("time_granularity", time_granularity);
+        Long accountId = conditions.getLong("advertiser_id");
         CtopOauthToken token = tokenService.getOauthTokenByAccountId(accountId + "");
         CtopOauthToken token = tokenService.getOauthTokenByAccountId(accountId + "");
         JSONObject getObject = getAdStat(token, conditions);
         JSONObject getObject = getAdStat(token, conditions);
+        Integer code = getObject.getInteger("code");
+        String message = getObject.getString("message");
+        if (null == code || code != 0) {
+            log.error("广告计划报表数据获取异常:{}", message);
+        } else {
+            JSONArray dataArray = getObject.getJSONObject("data").getJSONArray("list");
+            if (null != dataArray && dataArray.size() > 0) {
+                for (int i = 0; i < dataArray.size(); i++) {
+                    JSONObject data = dataArray.getJSONObject(i);
+                    if (null != time_granularity && time_granularity.equals("STAT_TIME_GRANULARITY_HOURLY")) {
+                        BytedancePlanHourlyReport hourlyReport = new BytedancePlanHourlyReport(data);
+                        planHourlyReportService.saveOrUpdate(hourlyReport);
+                    } else {
+                        BytedancePlanDailyReport dailyReport = new BytedancePlanDailyReport(data);
+                        planDailyReportService.saveOrUpdate(dailyReport);
+                    }
+                }
+            }
+        }
         return getObject;
         return getObject;
     }
     }
 
 
     @Override
     @Override
     public Map<String, Object> getCreativeReport(JSONObject conditions) {
     public Map<String, Object> getCreativeReport(JSONObject conditions) {
-        Long accountId = conditions.getLong("accountId");
+        String time_granularity = CtopAdConstant.BYTEDANCE_REPORT_TYPE_DAILY;
+        conditions = new JSONObject();
+        conditions.put("advertiser_id", 111463131228L);
+        conditions.put("start_date", "2019-06-01");
+        conditions.put("end_date", "2019-06-10");
+        conditions.put("page_size", 1000);
+        conditions.put("page", 1);
+        conditions.put("time_granularity", time_granularity);
+        Long accountId = conditions.getLong("advertiser_id");
         CtopOauthToken token = tokenService.getOauthTokenByAccountId(accountId + "");
         CtopOauthToken token = tokenService.getOauthTokenByAccountId(accountId + "");
         JSONObject getObject = getCreativeStat(token, conditions);
         JSONObject getObject = getCreativeStat(token, conditions);
+        Integer code = getObject.getInteger("code");
+        String message = getObject.getString("message");
+        if (null == code || code != 0) {
+            log.error("广告创意报表数据获取异常:{}", message);
+        } else {
+            JSONArray dataArray = getObject.getJSONObject("data").getJSONArray("list");
+            if (null != dataArray && dataArray.size() > 0) {
+                for (int i = 0; i < dataArray.size(); i++) {
+                    JSONObject data = dataArray.getJSONObject(i);
+                    if (null != time_granularity && time_granularity.equals("STAT_TIME_GRANULARITY_HOURLY")) {
+                        BytedanceCreativeHourlyReport hourlyReport = new BytedanceCreativeHourlyReport(data);
+                        creativeHourlyReportService.saveOrUpdate(hourlyReport);
+                    } else {
+                        BytedanceCreativeDailyReport dailyReport = new BytedanceCreativeDailyReport(data);
+                        creativeDailyReportService.saveOrUpdate(dailyReport);
+                    }
+                }
+            }
+        }
         return getObject;
         return getObject;
     }
     }
 
 
@@ -608,7 +671,7 @@ public class ReportServiceImpl implements IReportService {
         // 请求地址
         // 请求地址
         String url = "https://ad.toutiao.com/open_api/2/report/agent/get/";
         String url = "https://ad.toutiao.com/open_api/2/report/agent/get/";
         // 请求参数
         // 请求参数
-        Map data = new HashMap() {
+        Map params = new HashMap() {
             {
             {
                 put("advertiser_id", token.getAccountId());
                 put("advertiser_id", token.getAccountId());
                 put("start_date", "2018-04-01");
                 put("start_date", "2018-04-01");
@@ -616,46 +679,8 @@ public class ReportServiceImpl implements IReportService {
                 put("time_granularity", "STAT_TIME_GRANULARITY_DAILY");
                 put("time_granularity", "STAT_TIME_GRANULARITY_DAILY");
             }
             }
         };
         };
-        // 构造请求
-        HttpEntityEnclosingRequestBase httpEntity = new HttpEntityEnclosingRequestBase() {
-            @Override
-            public String getMethod() {
-                return "GET";
-            }
-        };
-        httpEntity.setHeader("Access-Token", token.getAccessToken());
-        CloseableHttpResponse response = null;
-        CloseableHttpClient client = null;
-        try {
-            client = HttpClientBuilder.create().build();
-            httpEntity.setURI(URI.create(url));
-            httpEntity.setEntity(new StringEntity(JSONObject.toJSONString(data), ContentType.APPLICATION_JSON));
-            response = client.execute(httpEntity);
-            if (response != null && response.getStatusLine().getStatusCode() == 200) {
-                BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
-                StringBuffer result = new StringBuffer();
-                String line = "";
-                while ((line = bufferedReader.readLine()) != null) {
-                    result.append(line);
-                }
-                bufferedReader.close();
-                return JSONObject.parseObject(result.toString());
-            }
-        } catch (ClientProtocolException e) {
-            e.printStackTrace();
-        } catch (IOException e) {
-            e.printStackTrace();
-        } finally {
-            try {
-                if (response != null) {
-                    response.close();
-                }
-                client.close();
-            } catch (IOException e) {
-                e.printStackTrace();
-            }
-        }
-        return null;
+        JSONObject data = HttpUtils.bytedanceGetRequest(token.getAccessToken(), url, params);
+        return data;
     }
     }
 
 
     public JSONObject getCreativeStat(CtopOauthToken token, JSONObject conditions) {
     public JSONObject getCreativeStat(CtopOauthToken token, JSONObject conditions) {
@@ -667,7 +692,7 @@ public class ReportServiceImpl implements IReportService {
             }
             }
         };
         };
         // 请求参数
         // 请求参数
-        final Map data = new HashMap() {
+        final Map params = new HashMap() {
             {
             {
                 put("advertiser_id", token.getAccountId());
                 put("advertiser_id", token.getAccountId());
                 put("start_date", "2018-04-01");
                 put("start_date", "2018-04-01");
@@ -677,47 +702,8 @@ public class ReportServiceImpl implements IReportService {
                 put("filtering", filtering);
                 put("filtering", filtering);
             }
             }
         };
         };
-
-        // 构造请求
-        HttpEntityEnclosingRequestBase httpEntity = new HttpEntityEnclosingRequestBase() {
-            @Override
-            public String getMethod() {
-                return "GET";
-            }
-        };
-        httpEntity.setHeader("Access-Token", token.getAccessToken());
-        CloseableHttpResponse response = null;
-        CloseableHttpClient client = null;
-        try {
-            client = HttpClientBuilder.create().build();
-            httpEntity.setURI(URI.create(url));
-            httpEntity.setEntity(new StringEntity(JSONObject.toJSONString(data), ContentType.APPLICATION_JSON));
-            response = client.execute(httpEntity);
-            if (response != null && response.getStatusLine().getStatusCode() == 200) {
-                BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
-                StringBuffer result = new StringBuffer();
-                String line = "";
-                while ((line = bufferedReader.readLine()) != null) {
-                    result.append(line);
-                }
-                bufferedReader.close();
-                return JSONObject.parseObject(result.toString());
-            }
-        } catch (ClientProtocolException e) {
-            e.printStackTrace();
-        } catch (IOException e) {
-            e.printStackTrace();
-        } finally {
-            try {
-                if (response != null) {
-                    response.close();
-                }
-                client.close();
-            } catch (IOException e) {
-                e.printStackTrace();
-            }
-        }
-        return null;
+        JSONObject data = HttpUtils.bytedanceGetRequest(token.getAccessToken(), url, params);
+        return data;
     }
     }
 
 
     public static JSONObject getCampaignStat(CtopOauthToken token, JSONObject conditions) {
     public static JSONObject getCampaignStat(CtopOauthToken token, JSONObject conditions) {
@@ -729,7 +715,7 @@ public class ReportServiceImpl implements IReportService {
             }
             }
         };
         };
         // 请求参数
         // 请求参数
-        final Map data = new HashMap() {
+        final Map params = new HashMap() {
             {
             {
                 put("page", 1000);
                 put("page", 1000);
                 put("pageSize", conditions.getInteger("page_size"));
                 put("pageSize", conditions.getInteger("page_size"));
@@ -741,46 +727,8 @@ public class ReportServiceImpl implements IReportService {
                 put("filtering", filtering);
                 put("filtering", filtering);
             }
             }
         };
         };
-        // 构造请求
-        HttpEntityEnclosingRequestBase httpEntity = new HttpEntityEnclosingRequestBase() {
-            @Override
-            public String getMethod() {
-                return "GET";
-            }
-        };
-        httpEntity.setHeader("Access-Token", token.getAccessToken());
-        CloseableHttpResponse response = null;
-        CloseableHttpClient client = null;
-        try {
-            client = HttpClientBuilder.create().build();
-            httpEntity.setURI(URI.create(url));
-            httpEntity.setEntity(new StringEntity(JSONObject.toJSONString(data), ContentType.APPLICATION_JSON));
-            response = client.execute(httpEntity);
-            if (response != null && response.getStatusLine().getStatusCode() == 200) {
-                BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
-                StringBuffer result = new StringBuffer();
-                String line = "";
-                while ((line = bufferedReader.readLine()) != null) {
-                    result.append(line);
-                }
-                bufferedReader.close();
-                return JSONObject.parseObject(result.toString());
-            }
-        } catch (ClientProtocolException e) {
-            e.printStackTrace();
-        } catch (IOException e) {
-            e.printStackTrace();
-        } finally {
-            try {
-                if (response != null) {
-                    response.close();
-                }
-                client.close();
-            } catch (IOException e) {
-                e.printStackTrace();
-            }
-        }
-        return null;
+        JSONObject data = HttpUtils.bytedanceGetRequest(token.getAccessToken(), url, params);
+        return data;
     }
     }
 
 
     public JSONObject getAdvertiserStat(CtopOauthToken token, JSONObject conditions) {
     public JSONObject getAdvertiserStat(CtopOauthToken token, JSONObject conditions) {
@@ -788,53 +736,17 @@ public class ReportServiceImpl implements IReportService {
         // 请求地址
         // 请求地址
         String url = "https://ad.toutiao.com/open_api/2/report/advertiser/get/";
         String url = "https://ad.toutiao.com/open_api/2/report/advertiser/get/";
         // 请求参数
         // 请求参数
-        Map data = new HashMap() {
+        Map params = new HashMap() {
             {
             {
                 put("advertiser_id", advertiserId);
                 put("advertiser_id", advertiserId);
                 put("start_date", conditions.getString("start_date"));
                 put("start_date", conditions.getString("start_date"));
                 put("end_date", conditions.getString("end_date"));
                 put("end_date", conditions.getString("end_date"));
-//                put("time_granularity", conditions.getString("timeGranularity"));
+                put("time_granularity", conditions.getString("time_granularity"));
                 put("page", conditions.getString("page"));
                 put("page", conditions.getString("page"));
                 put("page_size", conditions.getString("page_size"));
                 put("page_size", conditions.getString("page_size"));
             }
             }
         };
         };
-        // 构造请求
-        HttpEntityEnclosingRequestBase httpEntity = new HttpEntityEnclosingRequestBase() {
-            @Override
-            public String getMethod() {
-                return "GET";
-            }
-        };
-        httpEntity.setHeader("Access-Token", token.getAccessToken());
-        CloseableHttpResponse response = null;
-        CloseableHttpClient client = null;
-        try {
-            client = HttpClientBuilder.create().build();
-            httpEntity.setURI(URI.create(url));
-            httpEntity.setEntity(new StringEntity(JSONObject.toJSONString(data), ContentType.APPLICATION_JSON));
-            response = client.execute(httpEntity);
-            if (response != null && response.getStatusLine().getStatusCode() == 200) {
-                BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
-                StringBuffer result = new StringBuffer();
-                String line = "";
-                while ((line = bufferedReader.readLine()) != null) {
-                    result.append(line);
-                }
-                bufferedReader.close();
-                return JSONObject.parseObject(result.toString());
-            }
-        } catch (Exception e) {
-            e.printStackTrace();
-        } finally {
-            try {
-                if (response != null) {
-                    response.close();
-                }
-                client.close();
-            } catch (IOException e) {
-                e.printStackTrace();
-            }
-        }
-        return null;
+        JSONObject data = HttpUtils.bytedanceGetRequest(token.getAccessToken(), url, params);
+        return data;
     }
     }
 }
 }

+ 6 - 4
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/sign/itext5/ItextUtils.java

@@ -45,7 +45,8 @@ public class ItextUtils {
     private static KeyPair getKey() throws NoSuchAlgorithmException {
     private static KeyPair getKey() throws NoSuchAlgorithmException {
         // 密钥对 生成器,RSA算法 生成的  提供者是 BouncyCastle
         // 密钥对 生成器,RSA算法 生成的  提供者是 BouncyCastle
         KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA", new BouncyCastleProvider());
         KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA", new BouncyCastleProvider());
-        generator.initialize(1024);  // 密钥长度 1024
+        // 密钥长度 1024
+        generator.initialize(1024);
         // 证书中的密钥 公钥和私钥
         // 证书中的密钥 公钥和私钥
         KeyPair keyPair = generator.generateKeyPair();
         KeyPair keyPair = generator.generateKeyPair();
         return keyPair;
         return keyPair;
@@ -185,11 +186,12 @@ public class ItextUtils {
         String subjectStr = "CN=huangjinjin,OU=用户,O=借款人,C=CN,E=huangjinjin@sina.com,L=北京,ST=北京";
         String subjectStr = "CN=huangjinjin,OU=用户,O=借款人,C=CN,E=huangjinjin@sina.com,L=北京,ST=北京";
         String certificateCrl = "https://gitbook.cn";
         String certificateCrl = "https://gitbook.cn";
         Map<String, byte[]> result = createCert("123456", issuerStr, subjectStr, certificateCrl);
         Map<String, byte[]> result = createCert("123456", issuerStr, subjectStr, certificateCrl);
-
-//		FileOutputStream outPutStream = new FileOutputStream("C:/pdf/keystore.p12"); // 生成.p12
+// 生成.p12
+//		FileOutputStream outPutStream = new FileOutputStream("C:/pdf/keystore.p12");
 //		outPutStream.write(result.get("keyStoreData"));
 //		outPutStream.write(result.get("keyStoreData"));
 //		outPutStream.close();
 //		outPutStream.close();
-        FileOutputStream fos = new FileOutputStream(new File("D:/sign/zheng.cer"));//生成.p12颁发给用户的证书
+        //生成.p12颁发给用户的证书
+        FileOutputStream fos = new FileOutputStream(new File("D:/sign/zheng.cer"));
         fos.write(result.get("certificateData"));
         fos.write(result.get("certificateData"));
         fos.flush();
         fos.flush();
         fos.close();
         fos.close();

+ 2 - 2
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/sign/itext5/Pkcs.java

@@ -269,8 +269,8 @@ public class Pkcs {
         String subjectStr = "CN=huangjinjin,OU=gitbook研发部,O=gitbook有限公司,C=CN,E=huangjinjin@sina.com,L=北京,ST=北京";
         String subjectStr = "CN=huangjinjin,OU=gitbook研发部,O=gitbook有限公司,C=CN,E=huangjinjin@sina.com,L=北京,ST=北京";
         String certificateCrl = "https://gitbook.cn";
         String certificateCrl = "https://gitbook.cn";
         Map<String, byte[]> result = createCert("123456", issuerStr, subjectStr, certificateCrl);
         Map<String, byte[]> result = createCert("123456", issuerStr, subjectStr, certificateCrl);
-
-        FileOutputStream outPutStream = new FileOutputStream("D:/keystore.p12"); // ca.jks
+        // ca.jks
+        FileOutputStream outPutStream = new FileOutputStream("D:/keystore.p12");
         outPutStream.write(result.get("keyStoreData"));
         outPutStream.write(result.get("keyStoreData"));
         outPutStream.close();
         outPutStream.close();
         FileOutputStream fos = new FileOutputStream(new File("D:/keystore.cer"));
         FileOutputStream fos = new FileOutputStream(new File("D:/keystore.cer"));

+ 3 - 2
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/sign/itext5/SignHighPdf.java

@@ -53,7 +53,8 @@ public class SignHighPdf {
             Security.addProvider(provider);
             Security.addProvider(provider);
             KeyStore ks = KeyStore.getInstance("PKCS12", new BouncyCastleProvider());
             KeyStore ks = KeyStore.getInstance("PKCS12", new BouncyCastleProvider());
             fos = new FileInputStream(keyStorePath);
             fos = new FileInputStream(keyStorePath);
-            ks.load(fos, password.toCharArray()); // 私钥密码
+            // 私钥密码
+            ks.load(fos, password.toCharArray());
             String alias = (String) ks.aliases().nextElement();
             String alias = (String) ks.aliases().nextElement();
             PrivateKey key = (PrivateKey) ks.getKey(alias, password.toCharArray());
             PrivateKey key = (PrivateKey) ks.getKey(alias, password.toCharArray());
             Certificate[] chain = ks.getCertificateChain(alias);
             Certificate[] chain = ks.getCertificateChain(alias);
@@ -127,7 +128,7 @@ public class SignHighPdf {
 
 
     public static void main(String[] args) throws Exception {
     public static void main(String[] args) throws Exception {
         //对已经签章的signed.pdf文件再次签章,这次是高清签章
         //对已经签章的signed.pdf文件再次签章,这次是高清签章
-        byte[] fileData = sign("123456", "C:\\Users\\syh\\Desktop\\keystore.p12",//
+        byte[] fileData = sign("123456", "C:\\Users\\syh\\Desktop\\keystore.p12",
                 "C:\\Users\\syh\\Desktop\\test.pdf", 350, 290, "华佗\n2017-12-20");
                 "C:\\Users\\syh\\Desktop\\test.pdf", 350, 290, "华佗\n2017-12-20");
         FileOutputStream f = new FileOutputStream(new File("C:\\Users\\syh\\Desktop\\signed2.pdf"));
         FileOutputStream f = new FileOutputStream(new File("C:\\Users\\syh\\Desktop\\signed2.pdf"));
         f.write(fileData);
         f.write(fileData);

+ 11 - 25
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/sign/itext5/SignPdf.java

@@ -1,35 +1,21 @@
 package org.jeecg.modules.ctop.sign.itext5;
 package org.jeecg.modules.ctop.sign.itext5;
 
 
-import java.io.*;
-import java.security.KeyStore;
-import java.security.PrivateKey;
-import java.security.Security;
-import java.security.Signature;
-import java.security.cert.Certificate;
-import java.security.cert.X509Certificate;
-import java.util.UUID;
-
-import cn.hutool.core.codec.Base64;
-import org.bouncycastle.jce.provider.BouncyCastleProvider;
-
 import com.itextpdf.text.Image;
 import com.itextpdf.text.Image;
 import com.itextpdf.text.Rectangle;
 import com.itextpdf.text.Rectangle;
 import com.itextpdf.text.pdf.PdfReader;
 import com.itextpdf.text.pdf.PdfReader;
 import com.itextpdf.text.pdf.PdfSignatureAppearance;
 import com.itextpdf.text.pdf.PdfSignatureAppearance;
 import com.itextpdf.text.pdf.PdfSignatureAppearance.RenderingMode;
 import com.itextpdf.text.pdf.PdfSignatureAppearance.RenderingMode;
 import com.itextpdf.text.pdf.PdfStamper;
 import com.itextpdf.text.pdf.PdfStamper;
-import com.itextpdf.text.pdf.security.BouncyCastleDigest;
-import com.itextpdf.text.pdf.security.DigestAlgorithms;
-import com.itextpdf.text.pdf.security.ExternalDigest;
-import com.itextpdf.text.pdf.security.ExternalSignature;
-import com.itextpdf.text.pdf.security.MakeSignature;
+import com.itextpdf.text.pdf.security.*;
 import com.itextpdf.text.pdf.security.MakeSignature.CryptoStandard;
 import com.itextpdf.text.pdf.security.MakeSignature.CryptoStandard;
-import com.itextpdf.text.pdf.security.PrivateKeySignature;
-import sun.security.pkcs.ContentInfo;
-import sun.security.pkcs.PKCS7;
-import sun.security.pkcs.SignerInfo;
-import sun.security.x509.AlgorithmId;
-import sun.security.x509.X500Name;
+import org.bouncycastle.jce.provider.BouncyCastleProvider;
+
+import java.io.*;
+import java.security.KeyStore;
+import java.security.PrivateKey;
+import java.security.Security;
+import java.security.cert.Certificate;
+import java.util.UUID;
 
 
 
 
 public class SignPdf {
 public class SignPdf {
@@ -102,8 +88,8 @@ public class SignPdf {
     }
     }
 
 
     public static void main(String[] args) throws Exception {
     public static void main(String[] args) throws Exception {
-        byte[] fileData = sign("123456", "C:\\Users\\宋英豪\\Desktop\\sign\\keystore.p12", //
-                "C:\\Users\\宋英豪\\Desktop\\sign\\test.pdf",//
+        byte[] fileData = sign("123456", "C:\\Users\\宋英豪\\Desktop\\sign\\keystore.p12",
+                "C:\\Users\\宋英豪\\Desktop\\sign\\test.pdf",
                 "C:\\Users\\宋英豪\\Desktop\\sign\\sign.jpg", 100, 290);
                 "C:\\Users\\宋英豪\\Desktop\\sign\\sign.jpg", 100, 290);
         FileOutputStream f = new FileOutputStream(new File("C:\\Users\\宋英豪\\Desktop\\sign\\signed.pdf"));
         FileOutputStream f = new FileOutputStream(new File("C:\\Users\\宋英豪\\Desktop\\sign\\signed.pdf"));
         f.write(fileData);
         f.write(fileData);

+ 443 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/vue/BytedanceAdvertiserDailyReportList.vue

@@ -0,0 +1,443 @@
+<template>
+    <a-card :bordered="false">
+
+        <!-- 查询区域 -->
+        <div class="table-page-search-wrapper">
+            <a-form layout="inline">
+                <a-row :gutter="24">
+
+                    <a-col :md="6" :sm="8">
+                        <a-form-item label="广告主id">
+                            <a-input placeholder="请输入广告主id" v-model="queryParam.advertiserId"></a-input>
+                        </a-form-item>
+                    </a-col>
+                    <a-col :md="6" :sm="8">
+                        <a-form-item label="数据起始时间">
+                            <a-input placeholder="请输入数据起始时间" v-model="queryParam.statDatetime"></a-input>
+                        </a-form-item>
+                    </a-col>
+                    <template v-if="toggleSearchStatus">
+                        <a-col :md="6" :sm="8">
+                            <a-form-item label="展示量">
+                                <a-input placeholder="请输入展示量" v-model="queryParam.show"></a-input>
+                            </a-form-item>
+                        </a-col>
+                        <a-col :md="6" :sm="8">
+                            <a-form-item label="点击量">
+                                <a-input placeholder="请输入点击量" v-model="queryParam.click"></a-input>
+                            </a-form-item>
+                        </a-col>
+                        <a-col :md="6" :sm="8">
+                            <a-form-item label="转化量">
+                                <a-input placeholder="请输入转化量" v-model="queryParam.convert"></a-input>
+                            </a-form-item>
+                        </a-col>
+                    </template>
+                    <a-col :md="6" :sm="8">
+            <span style="float: left;overflow: hidden;" class="table-page-search-submitButtons">
+              <a-button type="primary" @click="searchQuery" icon="search">查询</a-button>
+              <a-button type="primary" @click="searchReset" icon="reload" style="margin-left: 8px">重置</a-button>
+              <a @click="handleToggleSearch" style="margin-left: 8px">
+                {{ toggleSearchStatus ? '收起' : '展开' }}
+                <a-icon :type="toggleSearchStatus ? 'up' : 'down'"/>
+              </a>
+            </span>
+                    </a-col>
+
+                </a-row>
+            </a-form>
+        </div>
+
+        <!-- 操作按钮区域 -->
+        <div class="table-operator">
+            <a-button @click="handleAdd" type="primary" icon="plus">新增</a-button>
+            <a-button type="primary" icon="download" @click="handleExportXls('广告主日报表')">导出</a-button>
+            <a-upload name="file" :showUploadList="false" :multiple="false" :headers="tokenHeader"
+                      :action="importExcelUrl" @change="handleImportExcel">
+                <a-button type="primary" icon="import">导入</a-button>
+            </a-upload>
+            <a-dropdown v-if="selectedRowKeys.length > 0">
+                <a-menu slot="overlay">
+                    <a-menu-item key="1" @click="batchDel">
+                        <a-icon type="delete"/>
+                        删除
+                    </a-menu-item>
+                </a-menu>
+                <a-button style="margin-left: 8px"> 批量操作
+                    <a-icon type="down"/>
+                </a-button>
+            </a-dropdown>
+        </div>
+
+        <!-- table区域-begin -->
+        <div>
+            <div class="ant-alert ant-alert-info" style="margin-bottom: 16px;">
+                <i class="anticon anticon-info-circle ant-alert-icon"></i> 已选择 <a style="font-weight: 600">{{
+                selectedRowKeys.length }}</a>项
+                <a style="margin-left: 24px" @click="onClearSelected">清空</a>
+            </div>
+
+            <a-table
+                    ref="table"
+                    size="middle"
+                    bordered
+                    rowKey="id"
+                    :columns="columns"
+                    :dataSource="dataSource"
+                    :pagination="ipagination"
+                    :loading="loading"
+                    :rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}"
+                    @change="handleTableChange">
+
+        <span slot="action" slot-scope="text, record">
+          <a @click="handleEdit(record)">编辑</a>
+
+          <a-divider type="vertical"/>
+          <a-dropdown>
+            <a class="ant-dropdown-link">更多 <a-icon type="down"/></a>
+            <a-menu slot="overlay">
+              <a-menu-item>
+                <a-popconfirm title="确定删除吗?" @confirm="() => handleDelete(record.id)">
+                  <a>删除</a>
+                </a-popconfirm>
+              </a-menu-item>
+            </a-menu>
+          </a-dropdown>
+        </span>
+
+            </a-table>
+        </div>
+        <!-- table区域-end -->
+
+        <!-- 表单区域 -->
+        <bytedanceAdvertiserDailyReport-modal ref="modalForm" @ok="modalFormOk"></bytedanceAdvertiserDailyReport-modal>
+    </a-card>
+</template>
+
+<script>
+    import BytedanceAdvertiserDailyReportModal from './modules/BytedanceAdvertiserDailyReportModal'
+    import {JeecgListMixin} from '@/mixins/JeecgListMixin'
+
+    export default {
+        name: "BytedanceAdvertiserDailyReportList",
+        mixins: [JeecgListMixin],
+        components: {
+            BytedanceAdvertiserDailyReportModal
+        },
+        data() {
+            return {
+                description: '广告主日报表管理页面',
+                // 表头
+                columns: [
+                    {
+                        title: '#',
+                        dataIndex: '',
+                        key: 'rowIndex',
+                        width: 60,
+                        align: "center",
+                        customRender: function (t, r, index) {
+                            return parseInt(index) + 1;
+                        }
+                    },
+                    {
+                        title: '广告主id',
+                        align: "center",
+                        dataIndex: 'advertiserId'
+                    },
+                    {
+                        title: '数据起始时间',
+                        align: "center",
+                        dataIndex: 'statDatetime'
+                    },
+                    {
+                        title: '展示量',
+                        align: "center",
+                        dataIndex: 'show'
+                    },
+                    {
+                        title: '点击量',
+                        align: "center",
+                        dataIndex: 'click'
+                    },
+                    {
+                        title: '转化量',
+                        align: "center",
+                        dataIndex: 'convert'
+                    },
+                    {
+                        title: '总花费',
+                        align: "center",
+                        dataIndex: 'cost'
+                    },
+                    {
+                        title: '应用下载-激活',
+                        align: "center",
+                        dataIndex: 'active'
+                    },
+                    {
+                        title: '应用下载-安卓下载完成',
+                        align: "center",
+                        dataIndex: 'downloadFinish'
+                    },
+                    {
+                        title: '应用下载-安卓下载开始',
+                        align: "center",
+                        dataIndex: 'downloadStart'
+                    },
+                    {
+                        title: '应用下载-点击安装数',
+                        align: "center",
+                        dataIndex: 'clickInstall'
+                    },
+                    {
+                        title: '应用下载-安卓安装完成',
+                        align: "center",
+                        dataIndex: 'installFinish'
+                    },
+                    {
+                        title: '应用下载-注册',
+                        align: "center",
+                        dataIndex: 'register'
+                    },
+                    {
+                        title: '应用下载-付费数',
+                        align: "center",
+                        dataIndex: 'payCount'
+                    },
+                    {
+                        title: '应用下载-到达uv',
+                        align: "center",
+                        dataIndex: 'inAppUv'
+                    },
+                    {
+                        title: '应用下载-详情页到站uv',
+                        align: "center",
+                        dataIndex: 'inAppDetailUv'
+                    },
+                    {
+                        title: '应用下载-加入购物车',
+                        align: "center",
+                        dataIndex: 'inAppCart'
+                    },
+                    {
+                        title: '应用下载-提交订单',
+                        align: "center",
+                        dataIndex: 'inAppOrder'
+                    },
+                    {
+                        title: '应用下载-付费',
+                        align: "center",
+                        dataIndex: 'inAppPay'
+                    },
+                    {
+                        title: '落地页-电话拨打数',
+                        align: "center",
+                        dataIndex: 'phone'
+                    },
+                    {
+                        title: '表单提交数',
+                        align: "center",
+                        dataIndex: 'form'
+                    },
+                    {
+                        title: '落地页-地图搜索',
+                        align: "center",
+                        dataIndex: 'mapSearch'
+                    },
+                    {
+                        title: '落地页-按钮button',
+                        align: "center",
+                        dataIndex: 'button'
+                    },
+                    {
+                        title: '落地页-关键页面浏览',
+                        align: "center",
+                        dataIndex: 'view'
+                    },
+                    {
+                        title: '落地页-QQ咨询数',
+                        align: "center",
+                        dataIndex: 'qq'
+                    },
+                    {
+                        title: '落地页-抽奖数',
+                        align: "center",
+                        dataIndex: 'lottery'
+                    },
+                    {
+                        title: '落地页-投票',
+                        align: "center",
+                        dataIndex: 'vote'
+                    },
+                    {
+                        title: '落地页-页面跳转',
+                        align: "center",
+                        dataIndex: 'redirect'
+                    },
+                    {
+                        title: '落地页-商品购买',
+                        align: "center",
+                        dataIndex: 'shopping'
+                    },
+                    {
+                        title: '落地页-在线咨询',
+                        align: "center",
+                        dataIndex: 'consult'
+                    },
+                    {
+                        title: '落地页-微信',
+                        align: "center",
+                        dataIndex: 'wechat'
+                    },
+                    {
+                        title: '落地页-智能电话确认拨打',
+                        align: "center",
+                        dataIndex: 'phoneConfirm'
+                    },
+                    {
+                        title: '落地页-智能电话确认接通',
+                        align: "center",
+                        dataIndex: 'phoneConnect'
+                    },
+                    {
+                        title: '落地页-智能电话有效咨询',
+                        align: "center",
+                        dataIndex: 'consultEffective'
+                    },
+                    {
+                        title: '视频-总播放',
+                        align: "center",
+                        dataIndex: 'totalPlay'
+                    },
+                    {
+                        title: '视频-有效播放',
+                        align: "center",
+                        dataIndex: 'validPlay'
+                    },
+                    {
+                        title: '视频-wifi播放',
+                        align: "center",
+                        dataIndex: 'wifiPlay'
+                    },
+                    {
+                        title: '视频-播放时长,单位ms',
+                        align: "center",
+                        dataIndex: 'playDurationSum'
+                    },
+                    {
+                        title: '视频-播放25%进度总数',
+                        align: "center",
+                        dataIndex: 'play25FeedBreak'
+                    },
+                    {
+                        title: '视频-播放50%进度总数',
+                        align: "center",
+                        dataIndex: 'play50FeedBreak'
+                    },
+                    {
+                        title: '视频-播放75%进度总数',
+                        align: "center",
+                        dataIndex: 'play75FeedBreak'
+                    },
+                    {
+                        title: '视频-播放100%进度总数',
+                        align: "center",
+                        dataIndex: 'play100FeedBreak'
+                    },
+                    {
+                        title: '附加创意-电话按钮',
+                        align: "center",
+                        dataIndex: 'advancedCreativePhoneClick'
+                    },
+                    {
+                        title: '附加创意-在线咨询',
+                        align: "center",
+                        dataIndex: 'advancedCreativeCounselClick'
+                    },
+                    {
+                        title: '附加创意-表单提交',
+                        align: "center",
+                        dataIndex: 'advancedCreativeFormClick'
+                    },
+                    {
+                        title: '互动数据-分享数',
+                        align: "center",
+                        dataIndex: 'share'
+                    },
+                    {
+                        title: '互动数据-评论数',
+                        align: "center",
+                        dataIndex: 'comment'
+                    },
+                    {
+                        title: '互动数据-点赞数',
+                        align: "center",
+                        dataIndex: 'like'
+                    },
+                    {
+                        title: '互动数据-关注数',
+                        align: "center",
+                        dataIndex: 'follow'
+                    },
+                    {
+                        title: '互动数据-主页访问量',
+                        align: "center",
+                        dataIndex: 'homeVisited'
+                    },
+                    {
+                        title: '互动数据-挑战赛查看数',
+                        align: "center",
+                        dataIndex: 'iesChallengeClick'
+                    },
+                    {
+                        title: '互动数据-音乐查看数',
+                        align: "center",
+                        dataIndex: 'iesMusicClick'
+                    },
+                    {
+                        title: '互动数据-单次互动成本',
+                        align: "center",
+                        dataIndex: 'interactPerCost'
+                    },
+                    {
+                        title: '次留数',
+                        align: "center",
+                        dataIndex: 'nextDayOpen'
+                    },
+                    {
+                        title: '次留率',
+                        align: "center",
+                        dataIndex: 'nextDayOpenRate'
+                    },
+                    {
+                        title: '次留成本',
+                        align: "center",
+                        dataIndex: 'nextDayOpenCost'
+                    },
+                    {
+                        title: '操作',
+                        dataIndex: 'action',
+                        align: "center",
+                        scopedSlots: {customRender: 'action'},
+                    }
+                ],
+                url: {
+                    list: "/ctop/bytedanceAdvertiserDailyReport/list",
+                    delete: "/ctop/bytedanceAdvertiserDailyReport/delete",
+                    deleteBatch: "/ctop/bytedanceAdvertiserDailyReport/deleteBatch",
+                    exportXlsUrl: "ctop/bytedanceAdvertiserDailyReport/exportXls",
+                    importExcelUrl: "ctop/bytedanceAdvertiserDailyReport/importExcel",
+                },
+            }
+        },
+        computed: {
+            importExcelUrl: function () {
+                return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`;
+            }
+        },
+        methods: {}
+    }
+</script>
+<style scoped>
+    @import '~@assets/less/common.less'
+</style>

+ 444 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/vue/BytedanceAdvertiserHourlyReportList.vue

@@ -0,0 +1,444 @@
+<template>
+    <a-card :bordered="false">
+
+        <!-- 查询区域 -->
+        <div class="table-page-search-wrapper">
+            <a-form layout="inline">
+                <a-row :gutter="24">
+
+                    <a-col :md="6" :sm="8">
+                        <a-form-item label="广告主id">
+                            <a-input placeholder="请输入广告主id" v-model="queryParam.advertiserId"></a-input>
+                        </a-form-item>
+                    </a-col>
+                    <a-col :md="6" :sm="8">
+                        <a-form-item label="数据起始时间">
+                            <a-input placeholder="请输入数据起始时间" v-model="queryParam.statDatetime"></a-input>
+                        </a-form-item>
+                    </a-col>
+                    <template v-if="toggleSearchStatus">
+                        <a-col :md="6" :sm="8">
+                            <a-form-item label="展示量">
+                                <a-input placeholder="请输入展示量" v-model="queryParam.showNum"></a-input>
+                            </a-form-item>
+                        </a-col>
+                        <a-col :md="6" :sm="8">
+                            <a-form-item label="点击量">
+                                <a-input placeholder="请输入点击量" v-model="queryParam.click"></a-input>
+                            </a-form-item>
+                        </a-col>
+                        <a-col :md="6" :sm="8">
+                            <a-form-item label="转化量">
+                                <a-input placeholder="请输入转化量" v-model="queryParam.convertNum"></a-input>
+                            </a-form-item>
+                        </a-col>
+                    </template>
+                    <a-col :md="6" :sm="8">
+            <span style="float: left;overflow: hidden;" class="table-page-search-submitButtons">
+              <a-button type="primary" @click="searchQuery" icon="search">查询</a-button>
+              <a-button type="primary" @click="searchReset" icon="reload" style="margin-left: 8px">重置</a-button>
+              <a @click="handleToggleSearch" style="margin-left: 8px">
+                {{ toggleSearchStatus ? '收起' : '展开' }}
+                <a-icon :type="toggleSearchStatus ? 'up' : 'down'"/>
+              </a>
+            </span>
+                    </a-col>
+
+                </a-row>
+            </a-form>
+        </div>
+
+        <!-- 操作按钮区域 -->
+        <div class="table-operator">
+            <a-button @click="handleAdd" type="primary" icon="plus">新增</a-button>
+            <a-button type="primary" icon="download" @click="handleExportXls('广告主小时级别报表信息')">导出</a-button>
+            <a-upload name="file" :showUploadList="false" :multiple="false" :headers="tokenHeader"
+                      :action="importExcelUrl" @change="handleImportExcel">
+                <a-button type="primary" icon="import">导入</a-button>
+            </a-upload>
+            <a-dropdown v-if="selectedRowKeys.length > 0">
+                <a-menu slot="overlay">
+                    <a-menu-item key="1" @click="batchDel">
+                        <a-icon type="delete"/>
+                        删除
+                    </a-menu-item>
+                </a-menu>
+                <a-button style="margin-left: 8px"> 批量操作
+                    <a-icon type="down"/>
+                </a-button>
+            </a-dropdown>
+        </div>
+
+        <!-- table区域-begin -->
+        <div>
+            <div class="ant-alert ant-alert-info" style="margin-bottom: 16px;">
+                <i class="anticon anticon-info-circle ant-alert-icon"></i> 已选择 <a style="font-weight: 600">{{
+                selectedRowKeys.length }}</a>项
+                <a style="margin-left: 24px" @click="onClearSelected">清空</a>
+            </div>
+
+            <a-table
+                    ref="table"
+                    size="middle"
+                    bordered
+                    rowKey="id"
+                    :columns="columns"
+                    :dataSource="dataSource"
+                    :pagination="ipagination"
+                    :loading="loading"
+                    :rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}"
+                    @change="handleTableChange">
+
+        <span slot="action" slot-scope="text, record">
+          <a @click="handleEdit(record)">编辑</a>
+
+          <a-divider type="vertical"/>
+          <a-dropdown>
+            <a class="ant-dropdown-link">更多 <a-icon type="down"/></a>
+            <a-menu slot="overlay">
+              <a-menu-item>
+                <a-popconfirm title="确定删除吗?" @confirm="() => handleDelete(record.id)">
+                  <a>删除</a>
+                </a-popconfirm>
+              </a-menu-item>
+            </a-menu>
+          </a-dropdown>
+        </span>
+
+            </a-table>
+        </div>
+        <!-- table区域-end -->
+
+        <!-- 表单区域 -->
+        <bytedanceAdvertiserHourlyReport-modal ref="modalForm"
+                                               @ok="modalFormOk"></bytedanceAdvertiserHourlyReport-modal>
+    </a-card>
+</template>
+
+<script>
+    import BytedanceAdvertiserHourlyReportModal from './modules/BytedanceAdvertiserHourlyReportModal'
+    import {JeecgListMixin} from '@/mixins/JeecgListMixin'
+
+    export default {
+        name: "BytedanceAdvertiserHourlyReportList",
+        mixins: [JeecgListMixin],
+        components: {
+            BytedanceAdvertiserHourlyReportModal
+        },
+        data() {
+            return {
+                description: '广告主小时级别报表信息管理页面',
+                // 表头
+                columns: [
+                    {
+                        title: '#',
+                        dataIndex: '',
+                        key: 'rowIndex',
+                        width: 60,
+                        align: "center",
+                        customRender: function (t, r, index) {
+                            return parseInt(index) + 1;
+                        }
+                    },
+                    {
+                        title: '广告主id',
+                        align: "center",
+                        dataIndex: 'advertiserId'
+                    },
+                    {
+                        title: '数据起始时间',
+                        align: "center",
+                        dataIndex: 'statDatetime'
+                    },
+                    {
+                        title: '展示量',
+                        align: "center",
+                        dataIndex: 'showNum'
+                    },
+                    {
+                        title: '点击量',
+                        align: "center",
+                        dataIndex: 'click'
+                    },
+                    {
+                        title: '转化量',
+                        align: "center",
+                        dataIndex: 'convertNum'
+                    },
+                    {
+                        title: '总花费',
+                        align: "center",
+                        dataIndex: 'cost'
+                    },
+                    {
+                        title: '应用下载-激活',
+                        align: "center",
+                        dataIndex: 'active'
+                    },
+                    {
+                        title: '应用下载-安卓下载完成',
+                        align: "center",
+                        dataIndex: 'downloadFinish'
+                    },
+                    {
+                        title: '应用下载-安卓下载开始',
+                        align: "center",
+                        dataIndex: 'downloadStart'
+                    },
+                    {
+                        title: '应用下载-点击安装数',
+                        align: "center",
+                        dataIndex: 'clickInstall'
+                    },
+                    {
+                        title: '应用下载-安卓安装完成',
+                        align: "center",
+                        dataIndex: 'installFinish'
+                    },
+                    {
+                        title: '应用下载-注册',
+                        align: "center",
+                        dataIndex: 'register'
+                    },
+                    {
+                        title: '应用下载-付费数',
+                        align: "center",
+                        dataIndex: 'payCount'
+                    },
+                    {
+                        title: '应用下载-到达uv',
+                        align: "center",
+                        dataIndex: 'inAppUv'
+                    },
+                    {
+                        title: '应用下载-详情页到站uv',
+                        align: "center",
+                        dataIndex: 'inAppDetailUv'
+                    },
+                    {
+                        title: '应用下载-加入购物车',
+                        align: "center",
+                        dataIndex: 'inAppCart'
+                    },
+                    {
+                        title: '应用下载-提交订单',
+                        align: "center",
+                        dataIndex: 'inAppOrder'
+                    },
+                    {
+                        title: '应用下载-付费',
+                        align: "center",
+                        dataIndex: 'inAppPay'
+                    },
+                    {
+                        title: '落地页-电话拨打数',
+                        align: "center",
+                        dataIndex: 'phone'
+                    },
+                    {
+                        title: '表单提交数',
+                        align: "center",
+                        dataIndex: 'form'
+                    },
+                    {
+                        title: '落地页-地图搜索',
+                        align: "center",
+                        dataIndex: 'mapSearch'
+                    },
+                    {
+                        title: '落地页-按钮button',
+                        align: "center",
+                        dataIndex: 'button'
+                    },
+                    {
+                        title: '落地页-关键页面浏览',
+                        align: "center",
+                        dataIndex: 'view'
+                    },
+                    {
+                        title: '落地页-QQ咨询数',
+                        align: "center",
+                        dataIndex: 'qq'
+                    },
+                    {
+                        title: '落地页-抽奖数',
+                        align: "center",
+                        dataIndex: 'lottery'
+                    },
+                    {
+                        title: '落地页-投票',
+                        align: "center",
+                        dataIndex: 'vote'
+                    },
+                    {
+                        title: '落地页-页面跳转',
+                        align: "center",
+                        dataIndex: 'redirect'
+                    },
+                    {
+                        title: '落地页-商品购买',
+                        align: "center",
+                        dataIndex: 'shopping'
+                    },
+                    {
+                        title: '落地页-在线咨询',
+                        align: "center",
+                        dataIndex: 'consult'
+                    },
+                    {
+                        title: '落地页-微信',
+                        align: "center",
+                        dataIndex: 'wechat'
+                    },
+                    {
+                        title: '落地页-智能电话确认拨打',
+                        align: "center",
+                        dataIndex: 'phoneConfirm'
+                    },
+                    {
+                        title: '落地页-智能电话确认接通',
+                        align: "center",
+                        dataIndex: 'phoneConnect'
+                    },
+                    {
+                        title: '落地页-智能电话有效咨询',
+                        align: "center",
+                        dataIndex: 'consultEffective'
+                    },
+                    {
+                        title: '视频-总播放',
+                        align: "center",
+                        dataIndex: 'totalPlay'
+                    },
+                    {
+                        title: '视频-有效播放',
+                        align: "center",
+                        dataIndex: 'validPlay'
+                    },
+                    {
+                        title: '视频-wifi播放',
+                        align: "center",
+                        dataIndex: 'wifiPlay'
+                    },
+                    {
+                        title: '视频-播放时长,单位ms',
+                        align: "center",
+                        dataIndex: 'playDurationSum'
+                    },
+                    {
+                        title: '视频-播放25%进度总数',
+                        align: "center",
+                        dataIndex: 'play25FeedBreak'
+                    },
+                    {
+                        title: '视频-播放50%进度总数',
+                        align: "center",
+                        dataIndex: 'play50FeedBreak'
+                    },
+                    {
+                        title: '视频-播放75%进度总数',
+                        align: "center",
+                        dataIndex: 'play75FeedBreak'
+                    },
+                    {
+                        title: '视频-播放100%进度总数',
+                        align: "center",
+                        dataIndex: 'play100FeedBreak'
+                    },
+                    {
+                        title: '附加创意-电话按钮',
+                        align: "center",
+                        dataIndex: 'advancedCreativePhoneClick'
+                    },
+                    {
+                        title: '附加创意-在线咨询',
+                        align: "center",
+                        dataIndex: 'advancedCreativeCounselClick'
+                    },
+                    {
+                        title: '附加创意-表单提交',
+                        align: "center",
+                        dataIndex: 'advancedCreativeFormClick'
+                    },
+                    {
+                        title: '互动数据-分享数',
+                        align: "center",
+                        dataIndex: 'share'
+                    },
+                    {
+                        title: '互动数据-评论数',
+                        align: "center",
+                        dataIndex: 'comment'
+                    },
+                    {
+                        title: '互动数据-点赞数',
+                        align: "center",
+                        dataIndex: 'likeNum'
+                    },
+                    {
+                        title: '互动数据-关注数',
+                        align: "center",
+                        dataIndex: 'follow'
+                    },
+                    {
+                        title: '互动数据-主页访问量',
+                        align: "center",
+                        dataIndex: 'homeVisited'
+                    },
+                    {
+                        title: '互动数据-挑战赛查看数',
+                        align: "center",
+                        dataIndex: 'iesChallengeClick'
+                    },
+                    {
+                        title: '互动数据-音乐查看数',
+                        align: "center",
+                        dataIndex: 'iesMusicClick'
+                    },
+                    {
+                        title: '互动数据-单次互动成本',
+                        align: "center",
+                        dataIndex: 'interactPerCost'
+                    },
+                    {
+                        title: '次留数',
+                        align: "center",
+                        dataIndex: 'nextDayOpen'
+                    },
+                    {
+                        title: '次留率',
+                        align: "center",
+                        dataIndex: 'nextDayOpenRate'
+                    },
+                    {
+                        title: '次留成本',
+                        align: "center",
+                        dataIndex: 'nextDayOpenCost'
+                    },
+                    {
+                        title: '操作',
+                        dataIndex: 'action',
+                        align: "center",
+                        scopedSlots: {customRender: 'action'},
+                    }
+                ],
+                url: {
+                    list: "/ctop/bytedanceAdvertiserHourlyReport/list",
+                    delete: "/ctop/bytedanceAdvertiserHourlyReport/delete",
+                    deleteBatch: "/ctop/bytedanceAdvertiserHourlyReport/deleteBatch",
+                    exportXlsUrl: "ctop/bytedanceAdvertiserHourlyReport/exportXls",
+                    importExcelUrl: "ctop/bytedanceAdvertiserHourlyReport/importExcel",
+                },
+            }
+        },
+        computed: {
+            importExcelUrl: function () {
+                return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`;
+            }
+        },
+        methods: {}
+    }
+</script>
+<style scoped>
+    @import '~@assets/less/common.less'
+</style>

+ 453 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/vue/BytedanceCampaignDailyReportList.vue

@@ -0,0 +1,453 @@
+<template>
+    <a-card :bordered="false">
+
+        <!-- 查询区域 -->
+        <div class="table-page-search-wrapper">
+            <a-form layout="inline">
+                <a-row :gutter="24">
+
+                    <a-col :md="6" :sm="8">
+                        <a-form-item label="广告主id">
+                            <a-input placeholder="请输入广告主id" v-model="queryParam.advertiserId"></a-input>
+                        </a-form-item>
+                    </a-col>
+                    <a-col :md="6" :sm="8">
+                        <a-form-item label="数据起始时间">
+                            <a-input placeholder="请输入数据起始时间" v-model="queryParam.statDatetime"></a-input>
+                        </a-form-item>
+                    </a-col>
+                    <template v-if="toggleSearchStatus">
+                        <a-col :md="6" :sm="8">
+                            <a-form-item label="展示量">
+                                <a-input placeholder="请输入展示量" v-model="queryParam.showNum"></a-input>
+                            </a-form-item>
+                        </a-col>
+                        <a-col :md="6" :sm="8">
+                            <a-form-item label="点击量">
+                                <a-input placeholder="请输入点击量" v-model="queryParam.click"></a-input>
+                            </a-form-item>
+                        </a-col>
+                        <a-col :md="6" :sm="8">
+                            <a-form-item label="转化量">
+                                <a-input placeholder="请输入转化量" v-model="queryParam.convertNum"></a-input>
+                            </a-form-item>
+                        </a-col>
+                    </template>
+                    <a-col :md="6" :sm="8">
+            <span style="float: left;overflow: hidden;" class="table-page-search-submitButtons">
+              <a-button type="primary" @click="searchQuery" icon="search">查询</a-button>
+              <a-button type="primary" @click="searchReset" icon="reload" style="margin-left: 8px">重置</a-button>
+              <a @click="handleToggleSearch" style="margin-left: 8px">
+                {{ toggleSearchStatus ? '收起' : '展开' }}
+                <a-icon :type="toggleSearchStatus ? 'up' : 'down'"/>
+              </a>
+            </span>
+                    </a-col>
+
+                </a-row>
+            </a-form>
+        </div>
+
+        <!-- 操作按钮区域 -->
+        <div class="table-operator">
+            <a-button @click="handleAdd" type="primary" icon="plus">新增</a-button>
+            <a-button type="primary" icon="download" @click="handleExportXls('广告组日报表信息')">导出</a-button>
+            <a-upload name="file" :showUploadList="false" :multiple="false" :headers="tokenHeader"
+                      :action="importExcelUrl" @change="handleImportExcel">
+                <a-button type="primary" icon="import">导入</a-button>
+            </a-upload>
+            <a-dropdown v-if="selectedRowKeys.length > 0">
+                <a-menu slot="overlay">
+                    <a-menu-item key="1" @click="batchDel">
+                        <a-icon type="delete"/>
+                        删除
+                    </a-menu-item>
+                </a-menu>
+                <a-button style="margin-left: 8px"> 批量操作
+                    <a-icon type="down"/>
+                </a-button>
+            </a-dropdown>
+        </div>
+
+        <!-- table区域-begin -->
+        <div>
+            <div class="ant-alert ant-alert-info" style="margin-bottom: 16px;">
+                <i class="anticon anticon-info-circle ant-alert-icon"></i> 已选择 <a style="font-weight: 600">{{
+                selectedRowKeys.length }}</a>项
+                <a style="margin-left: 24px" @click="onClearSelected">清空</a>
+            </div>
+
+            <a-table
+                    ref="table"
+                    size="middle"
+                    bordered
+                    rowKey="id"
+                    :columns="columns"
+                    :dataSource="dataSource"
+                    :pagination="ipagination"
+                    :loading="loading"
+                    :rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}"
+                    @change="handleTableChange">
+
+        <span slot="action" slot-scope="text, record">
+          <a @click="handleEdit(record)">编辑</a>
+
+          <a-divider type="vertical"/>
+          <a-dropdown>
+            <a class="ant-dropdown-link">更多 <a-icon type="down"/></a>
+            <a-menu slot="overlay">
+              <a-menu-item>
+                <a-popconfirm title="确定删除吗?" @confirm="() => handleDelete(record.id)">
+                  <a>删除</a>
+                </a-popconfirm>
+              </a-menu-item>
+            </a-menu>
+          </a-dropdown>
+        </span>
+
+            </a-table>
+        </div>
+        <!-- table区域-end -->
+
+        <!-- 表单区域 -->
+        <bytedanceCampaignDailyReport-modal ref="modalForm" @ok="modalFormOk"></bytedanceCampaignDailyReport-modal>
+    </a-card>
+</template>
+
+<script>
+    import BytedanceCampaignDailyReportModal from './modules/BytedanceCampaignDailyReportModal'
+    import {JeecgListMixin} from '@/mixins/JeecgListMixin'
+
+    export default {
+        name: "BytedanceCampaignDailyReportList",
+        mixins: [JeecgListMixin],
+        components: {
+            BytedanceCampaignDailyReportModal
+        },
+        data() {
+            return {
+                description: '广告组日报表信息管理页面',
+                // 表头
+                columns: [
+                    {
+                        title: '#',
+                        dataIndex: '',
+                        key: 'rowIndex',
+                        width: 60,
+                        align: "center",
+                        customRender: function (t, r, index) {
+                            return parseInt(index) + 1;
+                        }
+                    },
+                    {
+                        title: '广告主id',
+                        align: "center",
+                        dataIndex: 'advertiserId'
+                    },
+                    {
+                        title: '数据起始时间',
+                        align: "center",
+                        dataIndex: 'statDatetime'
+                    },
+                    {
+                        title: '展示量',
+                        align: "center",
+                        dataIndex: 'showNum'
+                    },
+                    {
+                        title: '点击量',
+                        align: "center",
+                        dataIndex: 'click'
+                    },
+                    {
+                        title: '转化量',
+                        align: "center",
+                        dataIndex: 'convertNum'
+                    },
+                    {
+                        title: '总花费',
+                        align: "center",
+                        dataIndex: 'cost'
+                    },
+                    {
+                        title: '应用下载-激活',
+                        align: "center",
+                        dataIndex: 'active'
+                    },
+                    {
+                        title: '应用下载-安卓下载完成',
+                        align: "center",
+                        dataIndex: 'downloadFinish'
+                    },
+                    {
+                        title: '应用下载-安卓下载开始',
+                        align: "center",
+                        dataIndex: 'downloadStart'
+                    },
+                    {
+                        title: '应用下载-点击安装数',
+                        align: "center",
+                        dataIndex: 'clickInstall'
+                    },
+                    {
+                        title: '应用下载-安卓安装完成',
+                        align: "center",
+                        dataIndex: 'installFinish'
+                    },
+                    {
+                        title: '应用下载-注册',
+                        align: "center",
+                        dataIndex: 'register'
+                    },
+                    {
+                        title: '应用下载-付费数',
+                        align: "center",
+                        dataIndex: 'payCount'
+                    },
+                    {
+                        title: '应用下载-到达uv',
+                        align: "center",
+                        dataIndex: 'inAppUv'
+                    },
+                    {
+                        title: '应用下载-详情页到站uv',
+                        align: "center",
+                        dataIndex: 'inAppDetailUv'
+                    },
+                    {
+                        title: '应用下载-加入购物车',
+                        align: "center",
+                        dataIndex: 'inAppCart'
+                    },
+                    {
+                        title: '应用下载-提交订单',
+                        align: "center",
+                        dataIndex: 'inAppOrder'
+                    },
+                    {
+                        title: '应用下载-付费',
+                        align: "center",
+                        dataIndex: 'inAppPay'
+                    },
+                    {
+                        title: '落地页-电话拨打数',
+                        align: "center",
+                        dataIndex: 'phone'
+                    },
+                    {
+                        title: '表单提交数',
+                        align: "center",
+                        dataIndex: 'form'
+                    },
+                    {
+                        title: '落地页-地图搜索',
+                        align: "center",
+                        dataIndex: 'mapSearch'
+                    },
+                    {
+                        title: '落地页-按钮button',
+                        align: "center",
+                        dataIndex: 'button'
+                    },
+                    {
+                        title: '落地页-关键页面浏览',
+                        align: "center",
+                        dataIndex: 'view'
+                    },
+                    {
+                        title: '落地页-QQ咨询数',
+                        align: "center",
+                        dataIndex: 'qq'
+                    },
+                    {
+                        title: '落地页-抽奖数',
+                        align: "center",
+                        dataIndex: 'lottery'
+                    },
+                    {
+                        title: '落地页-投票',
+                        align: "center",
+                        dataIndex: 'vote'
+                    },
+                    {
+                        title: '落地页-页面跳转',
+                        align: "center",
+                        dataIndex: 'redirect'
+                    },
+                    {
+                        title: '落地页-商品购买',
+                        align: "center",
+                        dataIndex: 'shopping'
+                    },
+                    {
+                        title: '落地页-在线咨询',
+                        align: "center",
+                        dataIndex: 'consult'
+                    },
+                    {
+                        title: '落地页-微信',
+                        align: "center",
+                        dataIndex: 'wechat'
+                    },
+                    {
+                        title: '落地页-智能电话确认拨打',
+                        align: "center",
+                        dataIndex: 'phoneConfirm'
+                    },
+                    {
+                        title: '落地页-智能电话确认接通',
+                        align: "center",
+                        dataIndex: 'phoneConnect'
+                    },
+                    {
+                        title: '落地页-智能电话有效咨询',
+                        align: "center",
+                        dataIndex: 'consultEffective'
+                    },
+                    {
+                        title: '视频-总播放',
+                        align: "center",
+                        dataIndex: 'totalPlay'
+                    },
+                    {
+                        title: '视频-有效播放',
+                        align: "center",
+                        dataIndex: 'validPlay'
+                    },
+                    {
+                        title: '视频-wifi播放',
+                        align: "center",
+                        dataIndex: 'wifiPlay'
+                    },
+                    {
+                        title: '视频-播放时长,单位ms',
+                        align: "center",
+                        dataIndex: 'playDurationSum'
+                    },
+                    {
+                        title: '视频-播放25%进度总数',
+                        align: "center",
+                        dataIndex: 'play25FeedBreak'
+                    },
+                    {
+                        title: '视频-播放50%进度总数',
+                        align: "center",
+                        dataIndex: 'play50FeedBreak'
+                    },
+                    {
+                        title: '视频-播放75%进度总数',
+                        align: "center",
+                        dataIndex: 'play75FeedBreak'
+                    },
+                    {
+                        title: '视频-播放100%进度总数',
+                        align: "center",
+                        dataIndex: 'play100FeedBreak'
+                    },
+                    {
+                        title: '附加创意-电话按钮',
+                        align: "center",
+                        dataIndex: 'advancedCreativePhoneClick'
+                    },
+                    {
+                        title: '附加创意-在线咨询',
+                        align: "center",
+                        dataIndex: 'advancedCreativeCounselClick'
+                    },
+                    {
+                        title: '附加创意-表单提交',
+                        align: "center",
+                        dataIndex: 'advancedCreativeFormClick'
+                    },
+                    {
+                        title: '互动数据-分享数',
+                        align: "center",
+                        dataIndex: 'share'
+                    },
+                    {
+                        title: '互动数据-评论数',
+                        align: "center",
+                        dataIndex: 'comment'
+                    },
+                    {
+                        title: '互动数据-点赞数',
+                        align: "center",
+                        dataIndex: 'likeNum'
+                    },
+                    {
+                        title: '互动数据-关注数',
+                        align: "center",
+                        dataIndex: 'follow'
+                    },
+                    {
+                        title: '互动数据-主页访问量',
+                        align: "center",
+                        dataIndex: 'homeVisited'
+                    },
+                    {
+                        title: '互动数据-挑战赛查看数',
+                        align: "center",
+                        dataIndex: 'iesChallengeClick'
+                    },
+                    {
+                        title: '互动数据-音乐查看数',
+                        align: "center",
+                        dataIndex: 'iesMusicClick'
+                    },
+                    {
+                        title: '互动数据-单次互动成本',
+                        align: "center",
+                        dataIndex: 'interactPerCost'
+                    },
+                    {
+                        title: '次留数',
+                        align: "center",
+                        dataIndex: 'nextDayOpen'
+                    },
+                    {
+                        title: '次留率',
+                        align: "center",
+                        dataIndex: 'nextDayOpenRate'
+                    },
+                    {
+                        title: '次留成本',
+                        align: "center",
+                        dataIndex: 'nextDayOpenCost'
+                    },
+                    {
+                        title: '广告组id',
+                        align: "center",
+                        dataIndex: 'campaignId'
+                    },
+                    {
+                        title: '广告组名称',
+                        align: "center",
+                        dataIndex: 'campaignName'
+                    },
+                    {
+                        title: '操作',
+                        dataIndex: 'action',
+                        align: "center",
+                        scopedSlots: {customRender: 'action'},
+                    }
+                ],
+                url: {
+                    list: "/ctop/bytedanceCampaignDailyReport/list",
+                    delete: "/ctop/bytedanceCampaignDailyReport/delete",
+                    deleteBatch: "/ctop/bytedanceCampaignDailyReport/deleteBatch",
+                    exportXlsUrl: "ctop/bytedanceCampaignDailyReport/exportXls",
+                    importExcelUrl: "ctop/bytedanceCampaignDailyReport/importExcel",
+                },
+            }
+        },
+        computed: {
+            importExcelUrl: function () {
+                return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`;
+            }
+        },
+        methods: {}
+    }
+</script>
+<style scoped>
+    @import '~@assets/less/common.less'
+</style>

+ 453 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/vue/BytedanceCampaignHourlyReportList.vue

@@ -0,0 +1,453 @@
+<template>
+    <a-card :bordered="false">
+
+        <!-- 查询区域 -->
+        <div class="table-page-search-wrapper">
+            <a-form layout="inline">
+                <a-row :gutter="24">
+
+                    <a-col :md="6" :sm="8">
+                        <a-form-item label="广告主id">
+                            <a-input placeholder="请输入广告主id" v-model="queryParam.advertiserId"></a-input>
+                        </a-form-item>
+                    </a-col>
+                    <a-col :md="6" :sm="8">
+                        <a-form-item label="数据起始时间">
+                            <a-input placeholder="请输入数据起始时间" v-model="queryParam.statDatetime"></a-input>
+                        </a-form-item>
+                    </a-col>
+                    <template v-if="toggleSearchStatus">
+                        <a-col :md="6" :sm="8">
+                            <a-form-item label="展示量">
+                                <a-input placeholder="请输入展示量" v-model="queryParam.showNum"></a-input>
+                            </a-form-item>
+                        </a-col>
+                        <a-col :md="6" :sm="8">
+                            <a-form-item label="点击量">
+                                <a-input placeholder="请输入点击量" v-model="queryParam.click"></a-input>
+                            </a-form-item>
+                        </a-col>
+                        <a-col :md="6" :sm="8">
+                            <a-form-item label="转化量">
+                                <a-input placeholder="请输入转化量" v-model="queryParam.convertNum"></a-input>
+                            </a-form-item>
+                        </a-col>
+                    </template>
+                    <a-col :md="6" :sm="8">
+            <span style="float: left;overflow: hidden;" class="table-page-search-submitButtons">
+              <a-button type="primary" @click="searchQuery" icon="search">查询</a-button>
+              <a-button type="primary" @click="searchReset" icon="reload" style="margin-left: 8px">重置</a-button>
+              <a @click="handleToggleSearch" style="margin-left: 8px">
+                {{ toggleSearchStatus ? '收起' : '展开' }}
+                <a-icon :type="toggleSearchStatus ? 'up' : 'down'"/>
+              </a>
+            </span>
+                    </a-col>
+
+                </a-row>
+            </a-form>
+        </div>
+
+        <!-- 操作按钮区域 -->
+        <div class="table-operator">
+            <a-button @click="handleAdd" type="primary" icon="plus">新增</a-button>
+            <a-button type="primary" icon="download" @click="handleExportXls('广告组时报表信息')">导出</a-button>
+            <a-upload name="file" :showUploadList="false" :multiple="false" :headers="tokenHeader"
+                      :action="importExcelUrl" @change="handleImportExcel">
+                <a-button type="primary" icon="import">导入</a-button>
+            </a-upload>
+            <a-dropdown v-if="selectedRowKeys.length > 0">
+                <a-menu slot="overlay">
+                    <a-menu-item key="1" @click="batchDel">
+                        <a-icon type="delete"/>
+                        删除
+                    </a-menu-item>
+                </a-menu>
+                <a-button style="margin-left: 8px"> 批量操作
+                    <a-icon type="down"/>
+                </a-button>
+            </a-dropdown>
+        </div>
+
+        <!-- table区域-begin -->
+        <div>
+            <div class="ant-alert ant-alert-info" style="margin-bottom: 16px;">
+                <i class="anticon anticon-info-circle ant-alert-icon"></i> 已选择 <a style="font-weight: 600">{{
+                selectedRowKeys.length }}</a>项
+                <a style="margin-left: 24px" @click="onClearSelected">清空</a>
+            </div>
+
+            <a-table
+                    ref="table"
+                    size="middle"
+                    bordered
+                    rowKey="id"
+                    :columns="columns"
+                    :dataSource="dataSource"
+                    :pagination="ipagination"
+                    :loading="loading"
+                    :rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}"
+                    @change="handleTableChange">
+
+        <span slot="action" slot-scope="text, record">
+          <a @click="handleEdit(record)">编辑</a>
+
+          <a-divider type="vertical"/>
+          <a-dropdown>
+            <a class="ant-dropdown-link">更多 <a-icon type="down"/></a>
+            <a-menu slot="overlay">
+              <a-menu-item>
+                <a-popconfirm title="确定删除吗?" @confirm="() => handleDelete(record.id)">
+                  <a>删除</a>
+                </a-popconfirm>
+              </a-menu-item>
+            </a-menu>
+          </a-dropdown>
+        </span>
+
+            </a-table>
+        </div>
+        <!-- table区域-end -->
+
+        <!-- 表单区域 -->
+        <bytedanceCampaignHourlyReport-modal ref="modalForm" @ok="modalFormOk"></bytedanceCampaignHourlyReport-modal>
+    </a-card>
+</template>
+
+<script>
+    import BytedanceCampaignHourlyReportModal from './modules/BytedanceCampaignHourlyReportModal'
+    import {JeecgListMixin} from '@/mixins/JeecgListMixin'
+
+    export default {
+        name: "BytedanceCampaignHourlyReportList",
+        mixins: [JeecgListMixin],
+        components: {
+            BytedanceCampaignHourlyReportModal
+        },
+        data() {
+            return {
+                description: '广告组时报表信息管理页面',
+                // 表头
+                columns: [
+                    {
+                        title: '#',
+                        dataIndex: '',
+                        key: 'rowIndex',
+                        width: 60,
+                        align: "center",
+                        customRender: function (t, r, index) {
+                            return parseInt(index) + 1;
+                        }
+                    },
+                    {
+                        title: '广告主id',
+                        align: "center",
+                        dataIndex: 'advertiserId'
+                    },
+                    {
+                        title: '数据起始时间',
+                        align: "center",
+                        dataIndex: 'statDatetime'
+                    },
+                    {
+                        title: '展示量',
+                        align: "center",
+                        dataIndex: 'showNum'
+                    },
+                    {
+                        title: '点击量',
+                        align: "center",
+                        dataIndex: 'click'
+                    },
+                    {
+                        title: '转化量',
+                        align: "center",
+                        dataIndex: 'convertNum'
+                    },
+                    {
+                        title: '总花费',
+                        align: "center",
+                        dataIndex: 'cost'
+                    },
+                    {
+                        title: '应用下载-激活',
+                        align: "center",
+                        dataIndex: 'active'
+                    },
+                    {
+                        title: '应用下载-安卓下载完成',
+                        align: "center",
+                        dataIndex: 'downloadFinish'
+                    },
+                    {
+                        title: '应用下载-安卓下载开始',
+                        align: "center",
+                        dataIndex: 'downloadStart'
+                    },
+                    {
+                        title: '应用下载-点击安装数',
+                        align: "center",
+                        dataIndex: 'clickInstall'
+                    },
+                    {
+                        title: '应用下载-安卓安装完成',
+                        align: "center",
+                        dataIndex: 'installFinish'
+                    },
+                    {
+                        title: '应用下载-注册',
+                        align: "center",
+                        dataIndex: 'register'
+                    },
+                    {
+                        title: '应用下载-付费数',
+                        align: "center",
+                        dataIndex: 'payCount'
+                    },
+                    {
+                        title: '应用下载-到达uv',
+                        align: "center",
+                        dataIndex: 'inAppUv'
+                    },
+                    {
+                        title: '应用下载-详情页到站uv',
+                        align: "center",
+                        dataIndex: 'inAppDetailUv'
+                    },
+                    {
+                        title: '应用下载-加入购物车',
+                        align: "center",
+                        dataIndex: 'inAppCart'
+                    },
+                    {
+                        title: '应用下载-提交订单',
+                        align: "center",
+                        dataIndex: 'inAppOrder'
+                    },
+                    {
+                        title: '应用下载-付费',
+                        align: "center",
+                        dataIndex: 'inAppPay'
+                    },
+                    {
+                        title: '落地页-电话拨打数',
+                        align: "center",
+                        dataIndex: 'phone'
+                    },
+                    {
+                        title: '表单提交数',
+                        align: "center",
+                        dataIndex: 'form'
+                    },
+                    {
+                        title: '落地页-地图搜索',
+                        align: "center",
+                        dataIndex: 'mapSearch'
+                    },
+                    {
+                        title: '落地页-按钮button',
+                        align: "center",
+                        dataIndex: 'button'
+                    },
+                    {
+                        title: '落地页-关键页面浏览',
+                        align: "center",
+                        dataIndex: 'view'
+                    },
+                    {
+                        title: '落地页-QQ咨询数',
+                        align: "center",
+                        dataIndex: 'qq'
+                    },
+                    {
+                        title: '落地页-抽奖数',
+                        align: "center",
+                        dataIndex: 'lottery'
+                    },
+                    {
+                        title: '落地页-投票',
+                        align: "center",
+                        dataIndex: 'vote'
+                    },
+                    {
+                        title: '落地页-页面跳转',
+                        align: "center",
+                        dataIndex: 'redirect'
+                    },
+                    {
+                        title: '落地页-商品购买',
+                        align: "center",
+                        dataIndex: 'shopping'
+                    },
+                    {
+                        title: '落地页-在线咨询',
+                        align: "center",
+                        dataIndex: 'consult'
+                    },
+                    {
+                        title: '落地页-微信',
+                        align: "center",
+                        dataIndex: 'wechat'
+                    },
+                    {
+                        title: '落地页-智能电话确认拨打',
+                        align: "center",
+                        dataIndex: 'phoneConfirm'
+                    },
+                    {
+                        title: '落地页-智能电话确认接通',
+                        align: "center",
+                        dataIndex: 'phoneConnect'
+                    },
+                    {
+                        title: '落地页-智能电话有效咨询',
+                        align: "center",
+                        dataIndex: 'consultEffective'
+                    },
+                    {
+                        title: '视频-总播放',
+                        align: "center",
+                        dataIndex: 'totalPlay'
+                    },
+                    {
+                        title: '视频-有效播放',
+                        align: "center",
+                        dataIndex: 'validPlay'
+                    },
+                    {
+                        title: '视频-wifi播放',
+                        align: "center",
+                        dataIndex: 'wifiPlay'
+                    },
+                    {
+                        title: '视频-播放时长,单位ms',
+                        align: "center",
+                        dataIndex: 'playDurationSum'
+                    },
+                    {
+                        title: '视频-播放25%进度总数',
+                        align: "center",
+                        dataIndex: 'play25FeedBreak'
+                    },
+                    {
+                        title: '视频-播放50%进度总数',
+                        align: "center",
+                        dataIndex: 'play50FeedBreak'
+                    },
+                    {
+                        title: '视频-播放75%进度总数',
+                        align: "center",
+                        dataIndex: 'play75FeedBreak'
+                    },
+                    {
+                        title: '视频-播放100%进度总数',
+                        align: "center",
+                        dataIndex: 'play100FeedBreak'
+                    },
+                    {
+                        title: '附加创意-电话按钮',
+                        align: "center",
+                        dataIndex: 'advancedCreativePhoneClick'
+                    },
+                    {
+                        title: '附加创意-在线咨询',
+                        align: "center",
+                        dataIndex: 'advancedCreativeCounselClick'
+                    },
+                    {
+                        title: '附加创意-表单提交',
+                        align: "center",
+                        dataIndex: 'advancedCreativeFormClick'
+                    },
+                    {
+                        title: '互动数据-分享数',
+                        align: "center",
+                        dataIndex: 'share'
+                    },
+                    {
+                        title: '互动数据-评论数',
+                        align: "center",
+                        dataIndex: 'comment'
+                    },
+                    {
+                        title: '互动数据-点赞数',
+                        align: "center",
+                        dataIndex: 'likeNum'
+                    },
+                    {
+                        title: '互动数据-关注数',
+                        align: "center",
+                        dataIndex: 'follow'
+                    },
+                    {
+                        title: '互动数据-主页访问量',
+                        align: "center",
+                        dataIndex: 'homeVisited'
+                    },
+                    {
+                        title: '互动数据-挑战赛查看数',
+                        align: "center",
+                        dataIndex: 'iesChallengeClick'
+                    },
+                    {
+                        title: '互动数据-音乐查看数',
+                        align: "center",
+                        dataIndex: 'iesMusicClick'
+                    },
+                    {
+                        title: '互动数据-单次互动成本',
+                        align: "center",
+                        dataIndex: 'interactPerCost'
+                    },
+                    {
+                        title: '次留数',
+                        align: "center",
+                        dataIndex: 'nextDayOpen'
+                    },
+                    {
+                        title: '次留率',
+                        align: "center",
+                        dataIndex: 'nextDayOpenRate'
+                    },
+                    {
+                        title: '次留成本',
+                        align: "center",
+                        dataIndex: 'nextDayOpenCost'
+                    },
+                    {
+                        title: '广告组id',
+                        align: "center",
+                        dataIndex: 'campaignId'
+                    },
+                    {
+                        title: '广告组名称',
+                        align: "center",
+                        dataIndex: 'campaignName'
+                    },
+                    {
+                        title: '操作',
+                        dataIndex: 'action',
+                        align: "center",
+                        scopedSlots: {customRender: 'action'},
+                    }
+                ],
+                url: {
+                    list: "/ctop/bytedanceCampaignHourlyReport/list",
+                    delete: "/ctop/bytedanceCampaignHourlyReport/delete",
+                    deleteBatch: "/ctop/bytedanceCampaignHourlyReport/deleteBatch",
+                    exportXlsUrl: "ctop/bytedanceCampaignHourlyReport/exportXls",
+                    importExcelUrl: "ctop/bytedanceCampaignHourlyReport/importExcel",
+                },
+            }
+        },
+        computed: {
+            importExcelUrl: function () {
+                return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`;
+            }
+        },
+        methods: {}
+    }
+</script>
+<style scoped>
+    @import '~@assets/less/common.less'
+</style>

+ 458 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/vue/BytedanceCreativeDailyReportList.vue

@@ -0,0 +1,458 @@
+<template>
+    <a-card :bordered="false">
+
+        <!-- 查询区域 -->
+        <div class="table-page-search-wrapper">
+            <a-form layout="inline">
+                <a-row :gutter="24">
+
+                    <a-col :md="6" :sm="8">
+                        <a-form-item label="广告主id">
+                            <a-input placeholder="请输入广告主id" v-model="queryParam.advertiserId"></a-input>
+                        </a-form-item>
+                    </a-col>
+                    <a-col :md="6" :sm="8">
+                        <a-form-item label="数据起始时间">
+                            <a-input placeholder="请输入数据起始时间" v-model="queryParam.statDatetime"></a-input>
+                        </a-form-item>
+                    </a-col>
+                    <template v-if="toggleSearchStatus">
+                        <a-col :md="6" :sm="8">
+                            <a-form-item label="展示量">
+                                <a-input placeholder="请输入展示量" v-model="queryParam.showNum"></a-input>
+                            </a-form-item>
+                        </a-col>
+                        <a-col :md="6" :sm="8">
+                            <a-form-item label="点击量">
+                                <a-input placeholder="请输入点击量" v-model="queryParam.click"></a-input>
+                            </a-form-item>
+                        </a-col>
+                        <a-col :md="6" :sm="8">
+                            <a-form-item label="转化量">
+                                <a-input placeholder="请输入转化量" v-model="queryParam.convertNum"></a-input>
+                            </a-form-item>
+                        </a-col>
+                    </template>
+                    <a-col :md="6" :sm="8">
+            <span style="float: left;overflow: hidden;" class="table-page-search-submitButtons">
+              <a-button type="primary" @click="searchQuery" icon="search">查询</a-button>
+              <a-button type="primary" @click="searchReset" icon="reload" style="margin-left: 8px">重置</a-button>
+              <a @click="handleToggleSearch" style="margin-left: 8px">
+                {{ toggleSearchStatus ? '收起' : '展开' }}
+                <a-icon :type="toggleSearchStatus ? 'up' : 'down'"/>
+              </a>
+            </span>
+                    </a-col>
+
+                </a-row>
+            </a-form>
+        </div>
+
+        <!-- 操作按钮区域 -->
+        <div class="table-operator">
+            <a-button @click="handleAdd" type="primary" icon="plus">新增</a-button>
+            <a-button type="primary" icon="download" @click="handleExportXls('广告创意日报表信息')">导出</a-button>
+            <a-upload name="file" :showUploadList="false" :multiple="false" :headers="tokenHeader"
+                      :action="importExcelUrl" @change="handleImportExcel">
+                <a-button type="primary" icon="import">导入</a-button>
+            </a-upload>
+            <a-dropdown v-if="selectedRowKeys.length > 0">
+                <a-menu slot="overlay">
+                    <a-menu-item key="1" @click="batchDel">
+                        <a-icon type="delete"/>
+                        删除
+                    </a-menu-item>
+                </a-menu>
+                <a-button style="margin-left: 8px"> 批量操作
+                    <a-icon type="down"/>
+                </a-button>
+            </a-dropdown>
+        </div>
+
+        <!-- table区域-begin -->
+        <div>
+            <div class="ant-alert ant-alert-info" style="margin-bottom: 16px;">
+                <i class="anticon anticon-info-circle ant-alert-icon"></i> 已选择 <a style="font-weight: 600">{{
+                selectedRowKeys.length }}</a>项
+                <a style="margin-left: 24px" @click="onClearSelected">清空</a>
+            </div>
+
+            <a-table
+                    ref="table"
+                    size="middle"
+                    bordered
+                    rowKey="id"
+                    :columns="columns"
+                    :dataSource="dataSource"
+                    :pagination="ipagination"
+                    :loading="loading"
+                    :rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}"
+                    @change="handleTableChange">
+
+        <span slot="action" slot-scope="text, record">
+          <a @click="handleEdit(record)">编辑</a>
+
+          <a-divider type="vertical"/>
+          <a-dropdown>
+            <a class="ant-dropdown-link">更多 <a-icon type="down"/></a>
+            <a-menu slot="overlay">
+              <a-menu-item>
+                <a-popconfirm title="确定删除吗?" @confirm="() => handleDelete(record.id)">
+                  <a>删除</a>
+                </a-popconfirm>
+              </a-menu-item>
+            </a-menu>
+          </a-dropdown>
+        </span>
+
+            </a-table>
+        </div>
+        <!-- table区域-end -->
+
+        <!-- 表单区域 -->
+        <bytedanceCreativeDailyReport-modal ref="modalForm" @ok="modalFormOk"></bytedanceCreativeDailyReport-modal>
+    </a-card>
+</template>
+
+<script>
+    import BytedanceCreativeDailyReportModal from './modules/BytedanceCreativeDailyReportModal'
+    import {JeecgListMixin} from '@/mixins/JeecgListMixin'
+
+    export default {
+        name: "BytedanceCreativeDailyReportList",
+        mixins: [JeecgListMixin],
+        components: {
+            BytedanceCreativeDailyReportModal
+        },
+        data() {
+            return {
+                description: '广告创意日报表信息管理页面',
+                // 表头
+                columns: [
+                    {
+                        title: '#',
+                        dataIndex: '',
+                        key: 'rowIndex',
+                        width: 60,
+                        align: "center",
+                        customRender: function (t, r, index) {
+                            return parseInt(index) + 1;
+                        }
+                    },
+                    {
+                        title: '广告主id',
+                        align: "center",
+                        dataIndex: 'advertiserId'
+                    },
+                    {
+                        title: '数据起始时间',
+                        align: "center",
+                        dataIndex: 'statDatetime'
+                    },
+                    {
+                        title: '展示量',
+                        align: "center",
+                        dataIndex: 'showNum'
+                    },
+                    {
+                        title: '点击量',
+                        align: "center",
+                        dataIndex: 'click'
+                    },
+                    {
+                        title: '转化量',
+                        align: "center",
+                        dataIndex: 'convertNum'
+                    },
+                    {
+                        title: '总花费',
+                        align: "center",
+                        dataIndex: 'cost'
+                    },
+                    {
+                        title: '应用下载-激活',
+                        align: "center",
+                        dataIndex: 'active'
+                    },
+                    {
+                        title: '应用下载-安卓下载完成',
+                        align: "center",
+                        dataIndex: 'downloadFinish'
+                    },
+                    {
+                        title: '应用下载-安卓下载开始',
+                        align: "center",
+                        dataIndex: 'downloadStart'
+                    },
+                    {
+                        title: '应用下载-点击安装数',
+                        align: "center",
+                        dataIndex: 'clickInstall'
+                    },
+                    {
+                        title: '应用下载-安卓安装完成',
+                        align: "center",
+                        dataIndex: 'installFinish'
+                    },
+                    {
+                        title: '应用下载-注册',
+                        align: "center",
+                        dataIndex: 'register'
+                    },
+                    {
+                        title: '应用下载-付费数',
+                        align: "center",
+                        dataIndex: 'payCount'
+                    },
+                    {
+                        title: '应用下载-到达uv',
+                        align: "center",
+                        dataIndex: 'inAppUv'
+                    },
+                    {
+                        title: '应用下载-详情页到站uv',
+                        align: "center",
+                        dataIndex: 'inAppDetailUv'
+                    },
+                    {
+                        title: '应用下载-加入购物车',
+                        align: "center",
+                        dataIndex: 'inAppCart'
+                    },
+                    {
+                        title: '应用下载-提交订单',
+                        align: "center",
+                        dataIndex: 'inAppOrder'
+                    },
+                    {
+                        title: '应用下载-付费',
+                        align: "center",
+                        dataIndex: 'inAppPay'
+                    },
+                    {
+                        title: '落地页-电话拨打数',
+                        align: "center",
+                        dataIndex: 'phone'
+                    },
+                    {
+                        title: '表单提交数',
+                        align: "center",
+                        dataIndex: 'form'
+                    },
+                    {
+                        title: '落地页-地图搜索',
+                        align: "center",
+                        dataIndex: 'mapSearch'
+                    },
+                    {
+                        title: '落地页-按钮button',
+                        align: "center",
+                        dataIndex: 'button'
+                    },
+                    {
+                        title: '落地页-关键页面浏览',
+                        align: "center",
+                        dataIndex: 'view'
+                    },
+                    {
+                        title: '落地页-QQ咨询数',
+                        align: "center",
+                        dataIndex: 'qq'
+                    },
+                    {
+                        title: '落地页-抽奖数',
+                        align: "center",
+                        dataIndex: 'lottery'
+                    },
+                    {
+                        title: '落地页-投票',
+                        align: "center",
+                        dataIndex: 'vote'
+                    },
+                    {
+                        title: '落地页-页面跳转',
+                        align: "center",
+                        dataIndex: 'redirect'
+                    },
+                    {
+                        title: '落地页-商品购买',
+                        align: "center",
+                        dataIndex: 'shopping'
+                    },
+                    {
+                        title: '落地页-在线咨询',
+                        align: "center",
+                        dataIndex: 'consult'
+                    },
+                    {
+                        title: '落地页-微信',
+                        align: "center",
+                        dataIndex: 'wechat'
+                    },
+                    {
+                        title: '落地页-智能电话确认拨打',
+                        align: "center",
+                        dataIndex: 'phoneConfirm'
+                    },
+                    {
+                        title: '落地页-智能电话确认接通',
+                        align: "center",
+                        dataIndex: 'phoneConnect'
+                    },
+                    {
+                        title: '落地页-智能电话有效咨询',
+                        align: "center",
+                        dataIndex: 'consultEffective'
+                    },
+                    {
+                        title: '视频-总播放',
+                        align: "center",
+                        dataIndex: 'totalPlay'
+                    },
+                    {
+                        title: '视频-有效播放',
+                        align: "center",
+                        dataIndex: 'validPlay'
+                    },
+                    {
+                        title: '视频-wifi播放',
+                        align: "center",
+                        dataIndex: 'wifiPlay'
+                    },
+                    {
+                        title: '视频-播放时长,单位ms',
+                        align: "center",
+                        dataIndex: 'playDurationSum'
+                    },
+                    {
+                        title: '视频-播放25%进度总数',
+                        align: "center",
+                        dataIndex: 'play25FeedBreak'
+                    },
+                    {
+                        title: '视频-播放50%进度总数',
+                        align: "center",
+                        dataIndex: 'play50FeedBreak'
+                    },
+                    {
+                        title: '视频-播放75%进度总数',
+                        align: "center",
+                        dataIndex: 'play75FeedBreak'
+                    },
+                    {
+                        title: '视频-播放100%进度总数',
+                        align: "center",
+                        dataIndex: 'play100FeedBreak'
+                    },
+                    {
+                        title: '附加创意-电话按钮',
+                        align: "center",
+                        dataIndex: 'advancedCreativePhoneClick'
+                    },
+                    {
+                        title: '附加创意-在线咨询',
+                        align: "center",
+                        dataIndex: 'advancedCreativeCounselClick'
+                    },
+                    {
+                        title: '附加创意-表单提交',
+                        align: "center",
+                        dataIndex: 'advancedCreativeFormClick'
+                    },
+                    {
+                        title: '互动数据-分享数',
+                        align: "center",
+                        dataIndex: 'share'
+                    },
+                    {
+                        title: '互动数据-评论数',
+                        align: "center",
+                        dataIndex: 'comment'
+                    },
+                    {
+                        title: '互动数据-点赞数',
+                        align: "center",
+                        dataIndex: 'likeNum'
+                    },
+                    {
+                        title: '互动数据-关注数',
+                        align: "center",
+                        dataIndex: 'follow'
+                    },
+                    {
+                        title: '互动数据-主页访问量',
+                        align: "center",
+                        dataIndex: 'homeVisited'
+                    },
+                    {
+                        title: '互动数据-挑战赛查看数',
+                        align: "center",
+                        dataIndex: 'iesChallengeClick'
+                    },
+                    {
+                        title: '互动数据-音乐查看数',
+                        align: "center",
+                        dataIndex: 'iesMusicClick'
+                    },
+                    {
+                        title: '互动数据-单次互动成本',
+                        align: "center",
+                        dataIndex: 'interactPerCost'
+                    },
+                    {
+                        title: '次留数',
+                        align: "center",
+                        dataIndex: 'nextDayOpen'
+                    },
+                    {
+                        title: '次留率',
+                        align: "center",
+                        dataIndex: 'nextDayOpenRate'
+                    },
+                    {
+                        title: '次留成本',
+                        align: "center",
+                        dataIndex: 'nextDayOpenCost'
+                    },
+                    {
+                        title: '广告组id',
+                        align: "center",
+                        dataIndex: 'adId'
+                    },
+                    {
+                        title: '广告组名称',
+                        align: "center",
+                        dataIndex: 'adName'
+                    },
+                    {
+                        title: 'campaignId',
+                        align: "center",
+                        dataIndex: 'campaignId'
+                    },
+                    {
+                        title: '操作',
+                        dataIndex: 'action',
+                        align: "center",
+                        scopedSlots: {customRender: 'action'},
+                    }
+                ],
+                url: {
+                    list: "/ctop/bytedanceCreativeDailyReport/list",
+                    delete: "/ctop/bytedanceCreativeDailyReport/delete",
+                    deleteBatch: "/ctop/bytedanceCreativeDailyReport/deleteBatch",
+                    exportXlsUrl: "ctop/bytedanceCreativeDailyReport/exportXls",
+                    importExcelUrl: "ctop/bytedanceCreativeDailyReport/importExcel",
+                },
+            }
+        },
+        computed: {
+            importExcelUrl: function () {
+                return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`;
+            }
+        },
+        methods: {}
+    }
+</script>
+<style scoped>
+    @import '~@assets/less/common.less'
+</style>

+ 458 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/vue/BytedanceCreativeHourlyReportList.vue

@@ -0,0 +1,458 @@
+<template>
+    <a-card :bordered="false">
+
+        <!-- 查询区域 -->
+        <div class="table-page-search-wrapper">
+            <a-form layout="inline">
+                <a-row :gutter="24">
+
+                    <a-col :md="6" :sm="8">
+                        <a-form-item label="广告主id">
+                            <a-input placeholder="请输入广告主id" v-model="queryParam.advertiserId"></a-input>
+                        </a-form-item>
+                    </a-col>
+                    <a-col :md="6" :sm="8">
+                        <a-form-item label="数据起始时间">
+                            <a-input placeholder="请输入数据起始时间" v-model="queryParam.statDatetime"></a-input>
+                        </a-form-item>
+                    </a-col>
+                    <template v-if="toggleSearchStatus">
+                        <a-col :md="6" :sm="8">
+                            <a-form-item label="展示量">
+                                <a-input placeholder="请输入展示量" v-model="queryParam.showNum"></a-input>
+                            </a-form-item>
+                        </a-col>
+                        <a-col :md="6" :sm="8">
+                            <a-form-item label="点击量">
+                                <a-input placeholder="请输入点击量" v-model="queryParam.click"></a-input>
+                            </a-form-item>
+                        </a-col>
+                        <a-col :md="6" :sm="8">
+                            <a-form-item label="转化量">
+                                <a-input placeholder="请输入转化量" v-model="queryParam.convertNum"></a-input>
+                            </a-form-item>
+                        </a-col>
+                    </template>
+                    <a-col :md="6" :sm="8">
+            <span style="float: left;overflow: hidden;" class="table-page-search-submitButtons">
+              <a-button type="primary" @click="searchQuery" icon="search">查询</a-button>
+              <a-button type="primary" @click="searchReset" icon="reload" style="margin-left: 8px">重置</a-button>
+              <a @click="handleToggleSearch" style="margin-left: 8px">
+                {{ toggleSearchStatus ? '收起' : '展开' }}
+                <a-icon :type="toggleSearchStatus ? 'up' : 'down'"/>
+              </a>
+            </span>
+                    </a-col>
+
+                </a-row>
+            </a-form>
+        </div>
+
+        <!-- 操作按钮区域 -->
+        <div class="table-operator">
+            <a-button @click="handleAdd" type="primary" icon="plus">新增</a-button>
+            <a-button type="primary" icon="download" @click="handleExportXls('广告创意日报表信息')">导出</a-button>
+            <a-upload name="file" :showUploadList="false" :multiple="false" :headers="tokenHeader"
+                      :action="importExcelUrl" @change="handleImportExcel">
+                <a-button type="primary" icon="import">导入</a-button>
+            </a-upload>
+            <a-dropdown v-if="selectedRowKeys.length > 0">
+                <a-menu slot="overlay">
+                    <a-menu-item key="1" @click="batchDel">
+                        <a-icon type="delete"/>
+                        删除
+                    </a-menu-item>
+                </a-menu>
+                <a-button style="margin-left: 8px"> 批量操作
+                    <a-icon type="down"/>
+                </a-button>
+            </a-dropdown>
+        </div>
+
+        <!-- table区域-begin -->
+        <div>
+            <div class="ant-alert ant-alert-info" style="margin-bottom: 16px;">
+                <i class="anticon anticon-info-circle ant-alert-icon"></i> 已选择 <a style="font-weight: 600">{{
+                selectedRowKeys.length }}</a>项
+                <a style="margin-left: 24px" @click="onClearSelected">清空</a>
+            </div>
+
+            <a-table
+                    ref="table"
+                    size="middle"
+                    bordered
+                    rowKey="id"
+                    :columns="columns"
+                    :dataSource="dataSource"
+                    :pagination="ipagination"
+                    :loading="loading"
+                    :rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}"
+                    @change="handleTableChange">
+
+        <span slot="action" slot-scope="text, record">
+          <a @click="handleEdit(record)">编辑</a>
+
+          <a-divider type="vertical"/>
+          <a-dropdown>
+            <a class="ant-dropdown-link">更多 <a-icon type="down"/></a>
+            <a-menu slot="overlay">
+              <a-menu-item>
+                <a-popconfirm title="确定删除吗?" @confirm="() => handleDelete(record.id)">
+                  <a>删除</a>
+                </a-popconfirm>
+              </a-menu-item>
+            </a-menu>
+          </a-dropdown>
+        </span>
+
+            </a-table>
+        </div>
+        <!-- table区域-end -->
+
+        <!-- 表单区域 -->
+        <bytedanceCreativeHourlyReport-modal ref="modalForm" @ok="modalFormOk"></bytedanceCreativeHourlyReport-modal>
+    </a-card>
+</template>
+
+<script>
+    import BytedanceCreativeHourlyReportModal from './modules/BytedanceCreativeHourlyReportModal'
+    import {JeecgListMixin} from '@/mixins/JeecgListMixin'
+
+    export default {
+        name: "BytedanceCreativeHourlyReportList",
+        mixins: [JeecgListMixin],
+        components: {
+            BytedanceCreativeHourlyReportModal
+        },
+        data() {
+            return {
+                description: '广告创意日报表信息管理页面',
+                // 表头
+                columns: [
+                    {
+                        title: '#',
+                        dataIndex: '',
+                        key: 'rowIndex',
+                        width: 60,
+                        align: "center",
+                        customRender: function (t, r, index) {
+                            return parseInt(index) + 1;
+                        }
+                    },
+                    {
+                        title: '广告主id',
+                        align: "center",
+                        dataIndex: 'advertiserId'
+                    },
+                    {
+                        title: '数据起始时间',
+                        align: "center",
+                        dataIndex: 'statDatetime'
+                    },
+                    {
+                        title: '展示量',
+                        align: "center",
+                        dataIndex: 'showNum'
+                    },
+                    {
+                        title: '点击量',
+                        align: "center",
+                        dataIndex: 'click'
+                    },
+                    {
+                        title: '转化量',
+                        align: "center",
+                        dataIndex: 'convertNum'
+                    },
+                    {
+                        title: '总花费',
+                        align: "center",
+                        dataIndex: 'cost'
+                    },
+                    {
+                        title: '应用下载-激活',
+                        align: "center",
+                        dataIndex: 'active'
+                    },
+                    {
+                        title: '应用下载-安卓下载完成',
+                        align: "center",
+                        dataIndex: 'downloadFinish'
+                    },
+                    {
+                        title: '应用下载-安卓下载开始',
+                        align: "center",
+                        dataIndex: 'downloadStart'
+                    },
+                    {
+                        title: '应用下载-点击安装数',
+                        align: "center",
+                        dataIndex: 'clickInstall'
+                    },
+                    {
+                        title: '应用下载-安卓安装完成',
+                        align: "center",
+                        dataIndex: 'installFinish'
+                    },
+                    {
+                        title: '应用下载-注册',
+                        align: "center",
+                        dataIndex: 'register'
+                    },
+                    {
+                        title: '应用下载-付费数',
+                        align: "center",
+                        dataIndex: 'payCount'
+                    },
+                    {
+                        title: '应用下载-到达uv',
+                        align: "center",
+                        dataIndex: 'inAppUv'
+                    },
+                    {
+                        title: '应用下载-详情页到站uv',
+                        align: "center",
+                        dataIndex: 'inAppDetailUv'
+                    },
+                    {
+                        title: '应用下载-加入购物车',
+                        align: "center",
+                        dataIndex: 'inAppCart'
+                    },
+                    {
+                        title: '应用下载-提交订单',
+                        align: "center",
+                        dataIndex: 'inAppOrder'
+                    },
+                    {
+                        title: '应用下载-付费',
+                        align: "center",
+                        dataIndex: 'inAppPay'
+                    },
+                    {
+                        title: '落地页-电话拨打数',
+                        align: "center",
+                        dataIndex: 'phone'
+                    },
+                    {
+                        title: '表单提交数',
+                        align: "center",
+                        dataIndex: 'form'
+                    },
+                    {
+                        title: '落地页-地图搜索',
+                        align: "center",
+                        dataIndex: 'mapSearch'
+                    },
+                    {
+                        title: '落地页-按钮button',
+                        align: "center",
+                        dataIndex: 'button'
+                    },
+                    {
+                        title: '落地页-关键页面浏览',
+                        align: "center",
+                        dataIndex: 'view'
+                    },
+                    {
+                        title: '落地页-QQ咨询数',
+                        align: "center",
+                        dataIndex: 'qq'
+                    },
+                    {
+                        title: '落地页-抽奖数',
+                        align: "center",
+                        dataIndex: 'lottery'
+                    },
+                    {
+                        title: '落地页-投票',
+                        align: "center",
+                        dataIndex: 'vote'
+                    },
+                    {
+                        title: '落地页-页面跳转',
+                        align: "center",
+                        dataIndex: 'redirect'
+                    },
+                    {
+                        title: '落地页-商品购买',
+                        align: "center",
+                        dataIndex: 'shopping'
+                    },
+                    {
+                        title: '落地页-在线咨询',
+                        align: "center",
+                        dataIndex: 'consult'
+                    },
+                    {
+                        title: '落地页-微信',
+                        align: "center",
+                        dataIndex: 'wechat'
+                    },
+                    {
+                        title: '落地页-智能电话确认拨打',
+                        align: "center",
+                        dataIndex: 'phoneConfirm'
+                    },
+                    {
+                        title: '落地页-智能电话确认接通',
+                        align: "center",
+                        dataIndex: 'phoneConnect'
+                    },
+                    {
+                        title: '落地页-智能电话有效咨询',
+                        align: "center",
+                        dataIndex: 'consultEffective'
+                    },
+                    {
+                        title: '视频-总播放',
+                        align: "center",
+                        dataIndex: 'totalPlay'
+                    },
+                    {
+                        title: '视频-有效播放',
+                        align: "center",
+                        dataIndex: 'validPlay'
+                    },
+                    {
+                        title: '视频-wifi播放',
+                        align: "center",
+                        dataIndex: 'wifiPlay'
+                    },
+                    {
+                        title: '视频-播放时长,单位ms',
+                        align: "center",
+                        dataIndex: 'playDurationSum'
+                    },
+                    {
+                        title: '视频-播放25%进度总数',
+                        align: "center",
+                        dataIndex: 'play25FeedBreak'
+                    },
+                    {
+                        title: '视频-播放50%进度总数',
+                        align: "center",
+                        dataIndex: 'play50FeedBreak'
+                    },
+                    {
+                        title: '视频-播放75%进度总数',
+                        align: "center",
+                        dataIndex: 'play75FeedBreak'
+                    },
+                    {
+                        title: '视频-播放100%进度总数',
+                        align: "center",
+                        dataIndex: 'play100FeedBreak'
+                    },
+                    {
+                        title: '附加创意-电话按钮',
+                        align: "center",
+                        dataIndex: 'advancedCreativePhoneClick'
+                    },
+                    {
+                        title: '附加创意-在线咨询',
+                        align: "center",
+                        dataIndex: 'advancedCreativeCounselClick'
+                    },
+                    {
+                        title: '附加创意-表单提交',
+                        align: "center",
+                        dataIndex: 'advancedCreativeFormClick'
+                    },
+                    {
+                        title: '互动数据-分享数',
+                        align: "center",
+                        dataIndex: 'share'
+                    },
+                    {
+                        title: '互动数据-评论数',
+                        align: "center",
+                        dataIndex: 'comment'
+                    },
+                    {
+                        title: '互动数据-点赞数',
+                        align: "center",
+                        dataIndex: 'likeNum'
+                    },
+                    {
+                        title: '互动数据-关注数',
+                        align: "center",
+                        dataIndex: 'follow'
+                    },
+                    {
+                        title: '互动数据-主页访问量',
+                        align: "center",
+                        dataIndex: 'homeVisited'
+                    },
+                    {
+                        title: '互动数据-挑战赛查看数',
+                        align: "center",
+                        dataIndex: 'iesChallengeClick'
+                    },
+                    {
+                        title: '互动数据-音乐查看数',
+                        align: "center",
+                        dataIndex: 'iesMusicClick'
+                    },
+                    {
+                        title: '互动数据-单次互动成本',
+                        align: "center",
+                        dataIndex: 'interactPerCost'
+                    },
+                    {
+                        title: '次留数',
+                        align: "center",
+                        dataIndex: 'nextDayOpen'
+                    },
+                    {
+                        title: '次留率',
+                        align: "center",
+                        dataIndex: 'nextDayOpenRate'
+                    },
+                    {
+                        title: '次留成本',
+                        align: "center",
+                        dataIndex: 'nextDayOpenCost'
+                    },
+                    {
+                        title: '广告组id',
+                        align: "center",
+                        dataIndex: 'adId'
+                    },
+                    {
+                        title: '广告组名称',
+                        align: "center",
+                        dataIndex: 'adName'
+                    },
+                    {
+                        title: 'campaignId',
+                        align: "center",
+                        dataIndex: 'campaignId'
+                    },
+                    {
+                        title: '操作',
+                        dataIndex: 'action',
+                        align: "center",
+                        scopedSlots: {customRender: 'action'},
+                    }
+                ],
+                url: {
+                    list: "/ctop/bytedanceCreativeHourlyReport/list",
+                    delete: "/ctop/bytedanceCreativeHourlyReport/delete",
+                    deleteBatch: "/ctop/bytedanceCreativeHourlyReport/deleteBatch",
+                    exportXlsUrl: "ctop/bytedanceCreativeHourlyReport/exportXls",
+                    importExcelUrl: "ctop/bytedanceCreativeHourlyReport/importExcel",
+                },
+            }
+        },
+        computed: {
+            importExcelUrl: function () {
+                return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`;
+            }
+        },
+        methods: {}
+    }
+</script>
+<style scoped>
+    @import '~@assets/less/common.less'
+</style>

+ 458 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/vue/BytedancePlanDailyReportList.vue

@@ -0,0 +1,458 @@
+<template>
+    <a-card :bordered="false">
+
+        <!-- 查询区域 -->
+        <div class="table-page-search-wrapper">
+            <a-form layout="inline">
+                <a-row :gutter="24">
+
+                    <a-col :md="6" :sm="8">
+                        <a-form-item label="广告主id">
+                            <a-input placeholder="请输入广告主id" v-model="queryParam.advertiserId"></a-input>
+                        </a-form-item>
+                    </a-col>
+                    <a-col :md="6" :sm="8">
+                        <a-form-item label="数据起始时间">
+                            <a-input placeholder="请输入数据起始时间" v-model="queryParam.statDatetime"></a-input>
+                        </a-form-item>
+                    </a-col>
+                    <template v-if="toggleSearchStatus">
+                        <a-col :md="6" :sm="8">
+                            <a-form-item label="展示量">
+                                <a-input placeholder="请输入展示量" v-model="queryParam.showNum"></a-input>
+                            </a-form-item>
+                        </a-col>
+                        <a-col :md="6" :sm="8">
+                            <a-form-item label="点击量">
+                                <a-input placeholder="请输入点击量" v-model="queryParam.click"></a-input>
+                            </a-form-item>
+                        </a-col>
+                        <a-col :md="6" :sm="8">
+                            <a-form-item label="转化量">
+                                <a-input placeholder="请输入转化量" v-model="queryParam.convertNum"></a-input>
+                            </a-form-item>
+                        </a-col>
+                    </template>
+                    <a-col :md="6" :sm="8">
+            <span style="float: left;overflow: hidden;" class="table-page-search-submitButtons">
+              <a-button type="primary" @click="searchQuery" icon="search">查询</a-button>
+              <a-button type="primary" @click="searchReset" icon="reload" style="margin-left: 8px">重置</a-button>
+              <a @click="handleToggleSearch" style="margin-left: 8px">
+                {{ toggleSearchStatus ? '收起' : '展开' }}
+                <a-icon :type="toggleSearchStatus ? 'up' : 'down'"/>
+              </a>
+            </span>
+                    </a-col>
+
+                </a-row>
+            </a-form>
+        </div>
+
+        <!-- 操作按钮区域 -->
+        <div class="table-operator">
+            <a-button @click="handleAdd" type="primary" icon="plus">新增</a-button>
+            <a-button type="primary" icon="download" @click="handleExportXls('广告计划日报表信息')">导出</a-button>
+            <a-upload name="file" :showUploadList="false" :multiple="false" :headers="tokenHeader"
+                      :action="importExcelUrl" @change="handleImportExcel">
+                <a-button type="primary" icon="import">导入</a-button>
+            </a-upload>
+            <a-dropdown v-if="selectedRowKeys.length > 0">
+                <a-menu slot="overlay">
+                    <a-menu-item key="1" @click="batchDel">
+                        <a-icon type="delete"/>
+                        删除
+                    </a-menu-item>
+                </a-menu>
+                <a-button style="margin-left: 8px"> 批量操作
+                    <a-icon type="down"/>
+                </a-button>
+            </a-dropdown>
+        </div>
+
+        <!-- table区域-begin -->
+        <div>
+            <div class="ant-alert ant-alert-info" style="margin-bottom: 16px;">
+                <i class="anticon anticon-info-circle ant-alert-icon"></i> 已选择 <a style="font-weight: 600">{{
+                selectedRowKeys.length }}</a>项
+                <a style="margin-left: 24px" @click="onClearSelected">清空</a>
+            </div>
+
+            <a-table
+                    ref="table"
+                    size="middle"
+                    bordered
+                    rowKey="id"
+                    :columns="columns"
+                    :dataSource="dataSource"
+                    :pagination="ipagination"
+                    :loading="loading"
+                    :rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}"
+                    @change="handleTableChange">
+
+        <span slot="action" slot-scope="text, record">
+          <a @click="handleEdit(record)">编辑</a>
+
+          <a-divider type="vertical"/>
+          <a-dropdown>
+            <a class="ant-dropdown-link">更多 <a-icon type="down"/></a>
+            <a-menu slot="overlay">
+              <a-menu-item>
+                <a-popconfirm title="确定删除吗?" @confirm="() => handleDelete(record.id)">
+                  <a>删除</a>
+                </a-popconfirm>
+              </a-menu-item>
+            </a-menu>
+          </a-dropdown>
+        </span>
+
+            </a-table>
+        </div>
+        <!-- table区域-end -->
+
+        <!-- 表单区域 -->
+        <bytedancePlanDailyReport-modal ref="modalForm" @ok="modalFormOk"></bytedancePlanDailyReport-modal>
+    </a-card>
+</template>
+
+<script>
+    import BytedancePlanDailyReportModal from './modules/BytedancePlanDailyReportModal'
+    import {JeecgListMixin} from '@/mixins/JeecgListMixin'
+
+    export default {
+        name: "BytedancePlanDailyReportList",
+        mixins: [JeecgListMixin],
+        components: {
+            BytedancePlanDailyReportModal
+        },
+        data() {
+            return {
+                description: '广告计划日报表信息管理页面',
+                // 表头
+                columns: [
+                    {
+                        title: '#',
+                        dataIndex: '',
+                        key: 'rowIndex',
+                        width: 60,
+                        align: "center",
+                        customRender: function (t, r, index) {
+                            return parseInt(index) + 1;
+                        }
+                    },
+                    {
+                        title: '广告主id',
+                        align: "center",
+                        dataIndex: 'advertiserId'
+                    },
+                    {
+                        title: '数据起始时间',
+                        align: "center",
+                        dataIndex: 'statDatetime'
+                    },
+                    {
+                        title: '展示量',
+                        align: "center",
+                        dataIndex: 'showNum'
+                    },
+                    {
+                        title: '点击量',
+                        align: "center",
+                        dataIndex: 'click'
+                    },
+                    {
+                        title: '转化量',
+                        align: "center",
+                        dataIndex: 'convertNum'
+                    },
+                    {
+                        title: '总花费',
+                        align: "center",
+                        dataIndex: 'cost'
+                    },
+                    {
+                        title: '应用下载-激活',
+                        align: "center",
+                        dataIndex: 'active'
+                    },
+                    {
+                        title: '应用下载-安卓下载完成',
+                        align: "center",
+                        dataIndex: 'downloadFinish'
+                    },
+                    {
+                        title: '应用下载-安卓下载开始',
+                        align: "center",
+                        dataIndex: 'downloadStart'
+                    },
+                    {
+                        title: '应用下载-点击安装数',
+                        align: "center",
+                        dataIndex: 'clickInstall'
+                    },
+                    {
+                        title: '应用下载-安卓安装完成',
+                        align: "center",
+                        dataIndex: 'installFinish'
+                    },
+                    {
+                        title: '应用下载-注册',
+                        align: "center",
+                        dataIndex: 'register'
+                    },
+                    {
+                        title: '应用下载-付费数',
+                        align: "center",
+                        dataIndex: 'payCount'
+                    },
+                    {
+                        title: '应用下载-到达uv',
+                        align: "center",
+                        dataIndex: 'inAppUv'
+                    },
+                    {
+                        title: '应用下载-详情页到站uv',
+                        align: "center",
+                        dataIndex: 'inAppDetailUv'
+                    },
+                    {
+                        title: '应用下载-加入购物车',
+                        align: "center",
+                        dataIndex: 'inAppCart'
+                    },
+                    {
+                        title: '应用下载-提交订单',
+                        align: "center",
+                        dataIndex: 'inAppOrder'
+                    },
+                    {
+                        title: '应用下载-付费',
+                        align: "center",
+                        dataIndex: 'inAppPay'
+                    },
+                    {
+                        title: '落地页-电话拨打数',
+                        align: "center",
+                        dataIndex: 'phone'
+                    },
+                    {
+                        title: '表单提交数',
+                        align: "center",
+                        dataIndex: 'form'
+                    },
+                    {
+                        title: '落地页-地图搜索',
+                        align: "center",
+                        dataIndex: 'mapSearch'
+                    },
+                    {
+                        title: '落地页-按钮button',
+                        align: "center",
+                        dataIndex: 'button'
+                    },
+                    {
+                        title: '落地页-关键页面浏览',
+                        align: "center",
+                        dataIndex: 'view'
+                    },
+                    {
+                        title: '落地页-QQ咨询数',
+                        align: "center",
+                        dataIndex: 'qq'
+                    },
+                    {
+                        title: '落地页-抽奖数',
+                        align: "center",
+                        dataIndex: 'lottery'
+                    },
+                    {
+                        title: '落地页-投票',
+                        align: "center",
+                        dataIndex: 'vote'
+                    },
+                    {
+                        title: '落地页-页面跳转',
+                        align: "center",
+                        dataIndex: 'redirect'
+                    },
+                    {
+                        title: '落地页-商品购买',
+                        align: "center",
+                        dataIndex: 'shopping'
+                    },
+                    {
+                        title: '落地页-在线咨询',
+                        align: "center",
+                        dataIndex: 'consult'
+                    },
+                    {
+                        title: '落地页-微信',
+                        align: "center",
+                        dataIndex: 'wechat'
+                    },
+                    {
+                        title: '落地页-智能电话确认拨打',
+                        align: "center",
+                        dataIndex: 'phoneConfirm'
+                    },
+                    {
+                        title: '落地页-智能电话确认接通',
+                        align: "center",
+                        dataIndex: 'phoneConnect'
+                    },
+                    {
+                        title: '落地页-智能电话有效咨询',
+                        align: "center",
+                        dataIndex: 'consultEffective'
+                    },
+                    {
+                        title: '视频-总播放',
+                        align: "center",
+                        dataIndex: 'totalPlay'
+                    },
+                    {
+                        title: '视频-有效播放',
+                        align: "center",
+                        dataIndex: 'validPlay'
+                    },
+                    {
+                        title: '视频-wifi播放',
+                        align: "center",
+                        dataIndex: 'wifiPlay'
+                    },
+                    {
+                        title: '视频-播放时长,单位ms',
+                        align: "center",
+                        dataIndex: 'playDurationSum'
+                    },
+                    {
+                        title: '视频-播放25%进度总数',
+                        align: "center",
+                        dataIndex: 'play25FeedBreak'
+                    },
+                    {
+                        title: '视频-播放50%进度总数',
+                        align: "center",
+                        dataIndex: 'play50FeedBreak'
+                    },
+                    {
+                        title: '视频-播放75%进度总数',
+                        align: "center",
+                        dataIndex: 'play75FeedBreak'
+                    },
+                    {
+                        title: '视频-播放100%进度总数',
+                        align: "center",
+                        dataIndex: 'play100FeedBreak'
+                    },
+                    {
+                        title: '附加创意-电话按钮',
+                        align: "center",
+                        dataIndex: 'advancedCreativePhoneClick'
+                    },
+                    {
+                        title: '附加创意-在线咨询',
+                        align: "center",
+                        dataIndex: 'advancedCreativeCounselClick'
+                    },
+                    {
+                        title: '附加创意-表单提交',
+                        align: "center",
+                        dataIndex: 'advancedCreativeFormClick'
+                    },
+                    {
+                        title: '互动数据-分享数',
+                        align: "center",
+                        dataIndex: 'share'
+                    },
+                    {
+                        title: '互动数据-评论数',
+                        align: "center",
+                        dataIndex: 'comment'
+                    },
+                    {
+                        title: '互动数据-点赞数',
+                        align: "center",
+                        dataIndex: 'likeNum'
+                    },
+                    {
+                        title: '互动数据-关注数',
+                        align: "center",
+                        dataIndex: 'follow'
+                    },
+                    {
+                        title: '互动数据-主页访问量',
+                        align: "center",
+                        dataIndex: 'homeVisited'
+                    },
+                    {
+                        title: '互动数据-挑战赛查看数',
+                        align: "center",
+                        dataIndex: 'iesChallengeClick'
+                    },
+                    {
+                        title: '互动数据-音乐查看数',
+                        align: "center",
+                        dataIndex: 'iesMusicClick'
+                    },
+                    {
+                        title: '互动数据-单次互动成本',
+                        align: "center",
+                        dataIndex: 'interactPerCost'
+                    },
+                    {
+                        title: '次留数',
+                        align: "center",
+                        dataIndex: 'nextDayOpen'
+                    },
+                    {
+                        title: '次留率',
+                        align: "center",
+                        dataIndex: 'nextDayOpenRate'
+                    },
+                    {
+                        title: '次留成本',
+                        align: "center",
+                        dataIndex: 'nextDayOpenCost'
+                    },
+                    {
+                        title: '广告组id',
+                        align: "center",
+                        dataIndex: 'adId'
+                    },
+                    {
+                        title: '广告组名称',
+                        align: "center",
+                        dataIndex: 'adName'
+                    },
+                    {
+                        title: 'campaignId',
+                        align: "center",
+                        dataIndex: 'campaignId'
+                    },
+                    {
+                        title: '操作',
+                        dataIndex: 'action',
+                        align: "center",
+                        scopedSlots: {customRender: 'action'},
+                    }
+                ],
+                url: {
+                    list: "/ctop/bytedancePlanDailyReport/list",
+                    delete: "/ctop/bytedancePlanDailyReport/delete",
+                    deleteBatch: "/ctop/bytedancePlanDailyReport/deleteBatch",
+                    exportXlsUrl: "ctop/bytedancePlanDailyReport/exportXls",
+                    importExcelUrl: "ctop/bytedancePlanDailyReport/importExcel",
+                },
+            }
+        },
+        computed: {
+            importExcelUrl: function () {
+                return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`;
+            }
+        },
+        methods: {}
+    }
+</script>
+<style scoped>
+    @import '~@assets/less/common.less'
+</style>

+ 458 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/vue/BytedancePlanHourlyReportList.vue

@@ -0,0 +1,458 @@
+<template>
+    <a-card :bordered="false">
+
+        <!-- 查询区域 -->
+        <div class="table-page-search-wrapper">
+            <a-form layout="inline">
+                <a-row :gutter="24">
+
+                    <a-col :md="6" :sm="8">
+                        <a-form-item label="广告主id">
+                            <a-input placeholder="请输入广告主id" v-model="queryParam.advertiserId"></a-input>
+                        </a-form-item>
+                    </a-col>
+                    <a-col :md="6" :sm="8">
+                        <a-form-item label="数据起始时间">
+                            <a-input placeholder="请输入数据起始时间" v-model="queryParam.statDatetime"></a-input>
+                        </a-form-item>
+                    </a-col>
+                    <template v-if="toggleSearchStatus">
+                        <a-col :md="6" :sm="8">
+                            <a-form-item label="展示量">
+                                <a-input placeholder="请输入展示量" v-model="queryParam.showNum"></a-input>
+                            </a-form-item>
+                        </a-col>
+                        <a-col :md="6" :sm="8">
+                            <a-form-item label="点击量">
+                                <a-input placeholder="请输入点击量" v-model="queryParam.click"></a-input>
+                            </a-form-item>
+                        </a-col>
+                        <a-col :md="6" :sm="8">
+                            <a-form-item label="转化量">
+                                <a-input placeholder="请输入转化量" v-model="queryParam.convertNum"></a-input>
+                            </a-form-item>
+                        </a-col>
+                    </template>
+                    <a-col :md="6" :sm="8">
+            <span style="float: left;overflow: hidden;" class="table-page-search-submitButtons">
+              <a-button type="primary" @click="searchQuery" icon="search">查询</a-button>
+              <a-button type="primary" @click="searchReset" icon="reload" style="margin-left: 8px">重置</a-button>
+              <a @click="handleToggleSearch" style="margin-left: 8px">
+                {{ toggleSearchStatus ? '收起' : '展开' }}
+                <a-icon :type="toggleSearchStatus ? 'up' : 'down'"/>
+              </a>
+            </span>
+                    </a-col>
+
+                </a-row>
+            </a-form>
+        </div>
+
+        <!-- 操作按钮区域 -->
+        <div class="table-operator">
+            <a-button @click="handleAdd" type="primary" icon="plus">新增</a-button>
+            <a-button type="primary" icon="download" @click="handleExportXls('广告计划时报表信息')">导出</a-button>
+            <a-upload name="file" :showUploadList="false" :multiple="false" :headers="tokenHeader"
+                      :action="importExcelUrl" @change="handleImportExcel">
+                <a-button type="primary" icon="import">导入</a-button>
+            </a-upload>
+            <a-dropdown v-if="selectedRowKeys.length > 0">
+                <a-menu slot="overlay">
+                    <a-menu-item key="1" @click="batchDel">
+                        <a-icon type="delete"/>
+                        删除
+                    </a-menu-item>
+                </a-menu>
+                <a-button style="margin-left: 8px"> 批量操作
+                    <a-icon type="down"/>
+                </a-button>
+            </a-dropdown>
+        </div>
+
+        <!-- table区域-begin -->
+        <div>
+            <div class="ant-alert ant-alert-info" style="margin-bottom: 16px;">
+                <i class="anticon anticon-info-circle ant-alert-icon"></i> 已选择 <a style="font-weight: 600">{{
+                selectedRowKeys.length }}</a>项
+                <a style="margin-left: 24px" @click="onClearSelected">清空</a>
+            </div>
+
+            <a-table
+                    ref="table"
+                    size="middle"
+                    bordered
+                    rowKey="id"
+                    :columns="columns"
+                    :dataSource="dataSource"
+                    :pagination="ipagination"
+                    :loading="loading"
+                    :rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}"
+                    @change="handleTableChange">
+
+        <span slot="action" slot-scope="text, record">
+          <a @click="handleEdit(record)">编辑</a>
+
+          <a-divider type="vertical"/>
+          <a-dropdown>
+            <a class="ant-dropdown-link">更多 <a-icon type="down"/></a>
+            <a-menu slot="overlay">
+              <a-menu-item>
+                <a-popconfirm title="确定删除吗?" @confirm="() => handleDelete(record.id)">
+                  <a>删除</a>
+                </a-popconfirm>
+              </a-menu-item>
+            </a-menu>
+          </a-dropdown>
+        </span>
+
+            </a-table>
+        </div>
+        <!-- table区域-end -->
+
+        <!-- 表单区域 -->
+        <bytedancePlanHourlyReport-modal ref="modalForm" @ok="modalFormOk"></bytedancePlanHourlyReport-modal>
+    </a-card>
+</template>
+
+<script>
+    import BytedancePlanHourlyReportModal from './modules/BytedancePlanHourlyReportModal'
+    import {JeecgListMixin} from '@/mixins/JeecgListMixin'
+
+    export default {
+        name: "BytedancePlanHourlyReportList",
+        mixins: [JeecgListMixin],
+        components: {
+            BytedancePlanHourlyReportModal
+        },
+        data() {
+            return {
+                description: '广告计划时报表信息管理页面',
+                // 表头
+                columns: [
+                    {
+                        title: '#',
+                        dataIndex: '',
+                        key: 'rowIndex',
+                        width: 60,
+                        align: "center",
+                        customRender: function (t, r, index) {
+                            return parseInt(index) + 1;
+                        }
+                    },
+                    {
+                        title: '广告主id',
+                        align: "center",
+                        dataIndex: 'advertiserId'
+                    },
+                    {
+                        title: '数据起始时间',
+                        align: "center",
+                        dataIndex: 'statDatetime'
+                    },
+                    {
+                        title: '展示量',
+                        align: "center",
+                        dataIndex: 'showNum'
+                    },
+                    {
+                        title: '点击量',
+                        align: "center",
+                        dataIndex: 'click'
+                    },
+                    {
+                        title: '转化量',
+                        align: "center",
+                        dataIndex: 'convertNum'
+                    },
+                    {
+                        title: '总花费',
+                        align: "center",
+                        dataIndex: 'cost'
+                    },
+                    {
+                        title: '应用下载-激活',
+                        align: "center",
+                        dataIndex: 'active'
+                    },
+                    {
+                        title: '应用下载-安卓下载完成',
+                        align: "center",
+                        dataIndex: 'downloadFinish'
+                    },
+                    {
+                        title: '应用下载-安卓下载开始',
+                        align: "center",
+                        dataIndex: 'downloadStart'
+                    },
+                    {
+                        title: '应用下载-点击安装数',
+                        align: "center",
+                        dataIndex: 'clickInstall'
+                    },
+                    {
+                        title: '应用下载-安卓安装完成',
+                        align: "center",
+                        dataIndex: 'installFinish'
+                    },
+                    {
+                        title: '应用下载-注册',
+                        align: "center",
+                        dataIndex: 'register'
+                    },
+                    {
+                        title: '应用下载-付费数',
+                        align: "center",
+                        dataIndex: 'payCount'
+                    },
+                    {
+                        title: '应用下载-到达uv',
+                        align: "center",
+                        dataIndex: 'inAppUv'
+                    },
+                    {
+                        title: '应用下载-详情页到站uv',
+                        align: "center",
+                        dataIndex: 'inAppDetailUv'
+                    },
+                    {
+                        title: '应用下载-加入购物车',
+                        align: "center",
+                        dataIndex: 'inAppCart'
+                    },
+                    {
+                        title: '应用下载-提交订单',
+                        align: "center",
+                        dataIndex: 'inAppOrder'
+                    },
+                    {
+                        title: '应用下载-付费',
+                        align: "center",
+                        dataIndex: 'inAppPay'
+                    },
+                    {
+                        title: '落地页-电话拨打数',
+                        align: "center",
+                        dataIndex: 'phone'
+                    },
+                    {
+                        title: '表单提交数',
+                        align: "center",
+                        dataIndex: 'form'
+                    },
+                    {
+                        title: '落地页-地图搜索',
+                        align: "center",
+                        dataIndex: 'mapSearch'
+                    },
+                    {
+                        title: '落地页-按钮button',
+                        align: "center",
+                        dataIndex: 'button'
+                    },
+                    {
+                        title: '落地页-关键页面浏览',
+                        align: "center",
+                        dataIndex: 'view'
+                    },
+                    {
+                        title: '落地页-QQ咨询数',
+                        align: "center",
+                        dataIndex: 'qq'
+                    },
+                    {
+                        title: '落地页-抽奖数',
+                        align: "center",
+                        dataIndex: 'lottery'
+                    },
+                    {
+                        title: '落地页-投票',
+                        align: "center",
+                        dataIndex: 'vote'
+                    },
+                    {
+                        title: '落地页-页面跳转',
+                        align: "center",
+                        dataIndex: 'redirect'
+                    },
+                    {
+                        title: '落地页-商品购买',
+                        align: "center",
+                        dataIndex: 'shopping'
+                    },
+                    {
+                        title: '落地页-在线咨询',
+                        align: "center",
+                        dataIndex: 'consult'
+                    },
+                    {
+                        title: '落地页-微信',
+                        align: "center",
+                        dataIndex: 'wechat'
+                    },
+                    {
+                        title: '落地页-智能电话确认拨打',
+                        align: "center",
+                        dataIndex: 'phoneConfirm'
+                    },
+                    {
+                        title: '落地页-智能电话确认接通',
+                        align: "center",
+                        dataIndex: 'phoneConnect'
+                    },
+                    {
+                        title: '落地页-智能电话有效咨询',
+                        align: "center",
+                        dataIndex: 'consultEffective'
+                    },
+                    {
+                        title: '视频-总播放',
+                        align: "center",
+                        dataIndex: 'totalPlay'
+                    },
+                    {
+                        title: '视频-有效播放',
+                        align: "center",
+                        dataIndex: 'validPlay'
+                    },
+                    {
+                        title: '视频-wifi播放',
+                        align: "center",
+                        dataIndex: 'wifiPlay'
+                    },
+                    {
+                        title: '视频-播放时长,单位ms',
+                        align: "center",
+                        dataIndex: 'playDurationSum'
+                    },
+                    {
+                        title: '视频-播放25%进度总数',
+                        align: "center",
+                        dataIndex: 'play25FeedBreak'
+                    },
+                    {
+                        title: '视频-播放50%进度总数',
+                        align: "center",
+                        dataIndex: 'play50FeedBreak'
+                    },
+                    {
+                        title: '视频-播放75%进度总数',
+                        align: "center",
+                        dataIndex: 'play75FeedBreak'
+                    },
+                    {
+                        title: '视频-播放100%进度总数',
+                        align: "center",
+                        dataIndex: 'play100FeedBreak'
+                    },
+                    {
+                        title: '附加创意-电话按钮',
+                        align: "center",
+                        dataIndex: 'advancedCreativePhoneClick'
+                    },
+                    {
+                        title: '附加创意-在线咨询',
+                        align: "center",
+                        dataIndex: 'advancedCreativeCounselClick'
+                    },
+                    {
+                        title: '附加创意-表单提交',
+                        align: "center",
+                        dataIndex: 'advancedCreativeFormClick'
+                    },
+                    {
+                        title: '互动数据-分享数',
+                        align: "center",
+                        dataIndex: 'share'
+                    },
+                    {
+                        title: '互动数据-评论数',
+                        align: "center",
+                        dataIndex: 'comment'
+                    },
+                    {
+                        title: '互动数据-点赞数',
+                        align: "center",
+                        dataIndex: 'likeNum'
+                    },
+                    {
+                        title: '互动数据-关注数',
+                        align: "center",
+                        dataIndex: 'follow'
+                    },
+                    {
+                        title: '互动数据-主页访问量',
+                        align: "center",
+                        dataIndex: 'homeVisited'
+                    },
+                    {
+                        title: '互动数据-挑战赛查看数',
+                        align: "center",
+                        dataIndex: 'iesChallengeClick'
+                    },
+                    {
+                        title: '互动数据-音乐查看数',
+                        align: "center",
+                        dataIndex: 'iesMusicClick'
+                    },
+                    {
+                        title: '互动数据-单次互动成本',
+                        align: "center",
+                        dataIndex: 'interactPerCost'
+                    },
+                    {
+                        title: '次留数',
+                        align: "center",
+                        dataIndex: 'nextDayOpen'
+                    },
+                    {
+                        title: '次留率',
+                        align: "center",
+                        dataIndex: 'nextDayOpenRate'
+                    },
+                    {
+                        title: '次留成本',
+                        align: "center",
+                        dataIndex: 'nextDayOpenCost'
+                    },
+                    {
+                        title: '广告组id',
+                        align: "center",
+                        dataIndex: 'adId'
+                    },
+                    {
+                        title: '广告组名称',
+                        align: "center",
+                        dataIndex: 'adName'
+                    },
+                    {
+                        title: 'campaignId',
+                        align: "center",
+                        dataIndex: 'campaignId'
+                    },
+                    {
+                        title: '操作',
+                        dataIndex: 'action',
+                        align: "center",
+                        scopedSlots: {customRender: 'action'},
+                    }
+                ],
+                url: {
+                    list: "/ctop/bytedancePlanHourlyReport/list",
+                    delete: "/ctop/bytedancePlanHourlyReport/delete",
+                    deleteBatch: "/ctop/bytedancePlanHourlyReport/deleteBatch",
+                    exportXlsUrl: "ctop/bytedancePlanHourlyReport/exportXls",
+                    importExcelUrl: "ctop/bytedancePlanHourlyReport/importExcel",
+                },
+            }
+        },
+        computed: {
+            importExcelUrl: function () {
+                return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`;
+            }
+        },
+        methods: {}
+    }
+</script>
+<style scoped>
+    @import '~@assets/less/common.less'
+</style>

File diff suppressed because it is too large
+ 446 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/vue/modules/BytedanceAdvertiserDailyReportModal.vue


File diff suppressed because it is too large
+ 453 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/vue/modules/BytedanceAdvertiserDailyReportModal__Style#Drawer.vue


File diff suppressed because it is too large
+ 446 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/vue/modules/BytedanceAdvertiserHourlyReportModal.vue


File diff suppressed because it is too large
+ 453 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/vue/modules/BytedanceAdvertiserHourlyReportModal__Style#Drawer.vue


File diff suppressed because it is too large
+ 458 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/vue/modules/BytedanceCampaignDailyReportModal.vue


File diff suppressed because it is too large
+ 465 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/vue/modules/BytedanceCampaignDailyReportModal__Style#Drawer.vue


File diff suppressed because it is too large
+ 458 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/vue/modules/BytedanceCampaignHourlyReportModal.vue


File diff suppressed because it is too large
+ 465 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/vue/modules/BytedanceCampaignHourlyReportModal__Style#Drawer.vue


File diff suppressed because it is too large
+ 464 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/vue/modules/BytedanceCreativeDailyReportModal.vue


File diff suppressed because it is too large
+ 471 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/vue/modules/BytedanceCreativeDailyReportModal__Style#Drawer.vue


File diff suppressed because it is too large
+ 464 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/vue/modules/BytedanceCreativeHourlyReportModal.vue


File diff suppressed because it is too large
+ 471 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/vue/modules/BytedanceCreativeHourlyReportModal__Style#Drawer.vue


File diff suppressed because it is too large
+ 464 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/vue/modules/BytedancePlanDailyReportModal.vue


File diff suppressed because it is too large
+ 471 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/vue/modules/BytedancePlanDailyReportModal__Style#Drawer.vue


File diff suppressed because it is too large
+ 464 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/vue/modules/BytedancePlanHourlyReportModal.vue


File diff suppressed because it is too large
+ 471 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/vue/modules/BytedancePlanHourlyReportModal__Style#Drawer.vue


+ 0 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/demo/test/service/impl/JeecgDemoServiceImpl.java


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