Jelajahi Sumber

Merge remote-tracking branch 'origin/master'

# Conflicts:
#	module-common/src/main/java/cn/com/ctop/common/utils/ImageUtils.java
#	module-toutiao/src/main/java/cn/com/ctop/toutiao/test/Test.java
xuzuoyun 5 tahun lalu
induk
melakukan
2e94069f66
100 mengubah file dengan 3921 tambahan dan 1853 penghapusan
  1. 14 0
      jeecg-boot-base-common/src/main/java/org/jeecg/common/constant/CtopAdConstant.java
  2. 2 2
      jeecg-boot-base-common/src/main/java/org/jeecg/common/system/api/ISysBaseApi.java
  3. 5 2
      jeecg-boot-base-common/src/main/java/org/jeecg/common/system/query/QueryGenerator.java
  4. 3 3
      jeecg-boot-base-common/src/main/java/org/jeecg/common/system/util/JeecgDataAutorUtils.java
  5. 3 1
      jeecg-boot-base-common/src/main/java/org/jeecg/common/system/util/JwtUtil.java
  6. 41 64
      jeecg-boot-base-common/src/main/java/org/jeecg/common/util/DateUtils.java
  7. 32 28
      jeecg-boot-base-common/src/main/java/org/jeecg/common/util/DySmsHelper.java
  8. 2 0
      jeecg-boot-base-common/src/main/java/org/jeecg/common/util/LoadFileUtil.java
  9. 34 3
      jeecg-boot-base-common/src/main/java/org/jeecg/common/util/MD5Util.java
  10. 6 1
      jeecg-boot-base-common/src/main/java/org/jeecg/common/util/MyClassLoader.java
  11. 2 2
      jeecg-boot-base-common/src/main/java/org/jeecg/common/util/PasswordUtil.java
  12. 5 5
      jeecg-boot-base-common/src/main/java/org/jeecg/common/util/SqlInjectionUtil.java
  13. 4 0
      jeecg-boot-base-common/src/main/java/org/jeecg/common/util/StatusCode.java
  14. 152 161
      jeecg-boot-base-common/src/main/java/org/jeecg/common/util/YouBianCodeUtil.java
  15. 5 3
      jeecg-boot-base-common/src/main/java/org/jeecg/common/util/encryption/AesEncryptUtil.java
  16. 21 78
      jeecg-boot-base-common/src/main/java/org/jeecg/common/util/jsonschema/CommonProperty.java
  17. 8 8
      jeecg-boot-base-common/src/main/java/org/jeecg/common/util/jsonschema/JsonSchemaDescrip.java
  18. 3 3
      jeecg-boot-base-common/src/main/java/org/jeecg/common/util/jsonschema/JsonschemaUtil.java
  19. 7 27
      jeecg-boot-base-common/src/main/java/org/jeecg/common/util/jsonschema/validate/DictProperty.java
  20. 16 10
      jeecg-boot-base-common/src/main/java/org/jeecg/common/util/oConvertUtils.java
  21. 28 12
      jeecg-boot-module-system/pom.xml
  22. 0 5
      jeecg-boot-module-system/src/main/java/org/jeecg/JeecgApplication.java
  23. 1 1
      jeecg-boot-module-system/src/main/java/org/jeecg/JeecgOneGUI.java
  24. 1 1
      jeecg-boot-module-system/src/main/java/org/jeecg/config/RedisConfig.java
  25. 34 17
      jeecg-boot-module-system/src/main/java/org/jeecg/config/ShiroConfig.java
  26. 2 14
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/controller/AdCoverController.java
  27. 210 202
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/controller/AdvertiserController.java
  28. 202 195
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/controller/AuthTaskController.java
  29. 1 2
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/controller/BindAccountAuthController.java
  30. 17 12
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/controller/BindAccountLoginController.java
  31. 1 1
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/controller/ByteDanceAdvertisePlanController.java
  32. 1 1
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/controller/ByteDanceAdvertiserBudgetController.java
  33. 1 1
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/controller/ByteDanceAdvertiserController.java
  34. 14 19
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/controller/ByteDanceAdvertiserPostController.java
  35. 1 1
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/controller/ByteDanceBudgetTemplateController.java
  36. 1 1
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/controller/ByteDanceCampaignController.java
  37. 1 1
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/controller/ByteDanceCampaignTemplateController.java
  38. 1 1
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/controller/ByteDanceCreativeController.java
  39. 1 1
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/controller/ByteDanceCreativeMaterialController.java
  40. 8 8
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/controller/ByteDanceCreativeTemplateController.java
  41. 1 1
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/controller/ByteDanceCustomAudienceController.java
  42. 100 45
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/controller/ByteDanceTemplateController.java
  43. 1 1
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/controller/BytedanceAdvertisePlanTemplateController.java
  44. 0 242
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/controller/CTopOauthTokenController.java
  45. 11 11
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/controller/CallbackController.java
  46. 247 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/controller/CtopOauthTokenController.java
  47. 35 12
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/controller/ReportController.java
  48. 13 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/controller/SignController.java
  49. 253 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/controller/SourceFileController.java
  50. 5 4
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/controller/TestController.java
  51. 3 1
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/controller/UserAllocationController.java
  52. 12 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/entity/BindAccountLogin.java
  53. 2 2
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/entity/ByteDanceCampaign.java
  54. 1 1
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/entity/ByteDanceCustomAudience.java
  55. 1 1
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/entity/ByteDanceImageInfo.java
  56. 1 1
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/entity/ByteDanceVideoInfo.java
  57. 4 4
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/entity/CTopOauthToken.java
  58. 1 1
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/entity/FileInfo.java
  59. 1 1
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/entity/PlatformCampaignStatisticInfo.java
  60. 60 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/entity/SourceFile.java
  61. 2 2
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/job/KuaishouAdvertiserCrawlerJob.java
  62. 0 20
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/mapper/CTopOauthTokenMapper.java
  63. 20 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/mapper/CtopOauthTokenMapper.java
  64. 6 2
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/mapper/PlatformCampaignStatisticInfoMapper.java
  65. 17 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/mapper/SourceFileMapper.java
  66. 3 3
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/mapper/xml/CTopOauthTokenMapper.xml
  67. 286 37
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/mapper/xml/PlatformCampaignStatisticInfoMapper.xml
  68. 1 1
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/kuaishou/mapper/xml/KuaiShouGroupCreateMapper.xml
  69. 1 1
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/service/IBindAccountLoginService.java
  70. 5 3
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/service/IByteDanceAdvertisePlanService.java
  71. 0 3
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/service/IByteDanceAdvertiserDataService.java
  72. 2 2
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/service/IByteDanceCampaignTemplateService.java
  73. 0 2
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/service/IBytedanceDeliveryTargetTemplateService.java
  74. 2 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/service/ICreateInternalService.java
  75. 3 3
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/service/ICTopOauthTokenService.java
  76. 7 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/service/IFileInfoService.java
  77. 14 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/service/ISourceFileService.java
  78. 0 1
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/service/impl/AuthTaskServiceImpl.java
  79. 3 6
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/service/impl/BindAccountAuthServiceImpl.java
  80. 20 6
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/service/impl/BindAccountLoginServiceImpl.java
  81. 95 20
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/service/impl/ByteDanceAdvertisePlanServiceImpl.java
  82. 59 68
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/service/impl/ByteDanceAdvertiserDataServiceImpl.java
  83. 0 7
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/service/impl/ByteDanceBudgetTemplateServiceImpl.java
  84. 22 25
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/service/impl/ByteDanceCampaignTemplateServiceImpl.java
  85. 15 20
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/service/impl/ByteDanceCreativeServiceImpl.java
  86. 2 6
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/service/impl/ByteDanceUserOrientationTemplateServiceImpl.java
  87. 21 21
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/service/impl/BytedanceAdvertisePlanTemplateServiceImpl.java
  88. 2 14
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/service/impl/BytedanceDeliveryTargetTemplateServiceImpl.java
  89. 259 111
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/service/impl/CreateInternalServiceImpl.java
  90. 18 27
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/service/impl/CTopOauthTokenServiceImpl.java
  91. 80 98
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/service/impl/FileInfoServiceImpl.java
  92. 16 14
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/service/impl/RefreshTokenServiceImpl.java
  93. 109 105
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/service/impl/ReportServiceImpl.java
  94. 19 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/service/impl/SourceFileServiceImpl.java
  95. 10 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/sign/itext5/Extension.java
  96. 544 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/sign/itext5/GenX509Cert.java
  97. 197 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/sign/itext5/ItextUtils.java
  98. 281 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/sign/itext5/Pkcs.java
  99. 137 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/sign/itext5/SignHighPdf.java
  100. 0 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/sign/itext5/SignImage.java

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

@@ -0,0 +1,14 @@
+package org.jeecg.common.constant;
+
+/**
+ * 广告相关常量数据
+ */
+public class CtopAdConstant {
+    public static final String PLATFORM_TYPE_BYTEDANCE = "1";
+    public static final String PLATFORM_TYPE_KUAISHOU = "2";
+
+    public static final String PLATFORM_TYPE_BYTEDANCE_PY = "bytedance";
+    public static final String PLATFORM_TYPE_KUAISHOU_PY = "kuaishou";
+
+
+}

+ 2 - 2
jeecg-boot-base-common/src/main/java/org/jeecg/common/system/api/ISysBaseApi.java

@@ -16,11 +16,11 @@ public interface ISysBaseApi {
 
 	/**
 	 * 日志添加
-	 * @param LogContent 内容
+     * @param logContent 内容
 	 * @param logType 日志类型(0:操作日志;1:登录日志;2:定时任务)
 	 * @param operatetype 操作类型(1:添加;2:修改;3:删除;)
 	 */
-	void addLog(String LogContent, Integer logType, Integer operatetype);
+    void addLog(String logContent, Integer logType, Integer operatetype);
 	
 	/**
 	  * 根据用户账号查询登录用户信息

+ 5 - 2
jeecg-boot-base-common/src/main/java/org/jeecg/common/system/query/QueryGenerator.java

@@ -157,8 +157,11 @@ public class QueryGenerator {
 		doSuperQuery(queryWrapper, parameterMap);
 		
 	}
-	
-	//多字段排序 TODO 需要修改前端
+
+    /**
+     * 多字段排序
+     * TODO 需要修改前端
+     */
 	public static void doMultiFieldsOrder(QueryWrapper<?> queryWrapper,Map<String, String[]> parameterMap) {
 		String column=null,order=null;
 		if(parameterMap!=null&& parameterMap.containsKey(ORDER_COLUMN)) {

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

@@ -29,7 +29,7 @@ public class JeecgDataAutorUtils {
 	 * 往链接请求里面,传入数据查询条件
 	 * 
 	 * @param request
-	 * @param MENU_DATA_AUTHOR_RULES
+     * @param dataRules
 	 */
 	public static synchronized void installDataSearchConditon(HttpServletRequest request, List<SysPermissionDataRule> dataRules) {
 		@SuppressWarnings("unchecked")
@@ -60,7 +60,7 @@ public class JeecgDataAutorUtils {
      *
 	 * @return
 	 */
-	public static synchronized String loadDataSearchConditonSQLString() {
+    public static synchronized String loadDataSearchConditonSqlString() {
 		return (String) SpringContextUtils.getHttpServletRequest().getAttribute(MENU_DATA_AUTHOR_RULE_SQL);
 	}
 
@@ -70,7 +70,7 @@ public class JeecgDataAutorUtils {
 	 * @param request
 	 */
 	public static synchronized void installDataSearchConditon(HttpServletRequest request, String sql) {
-		String ruleSql = (String)loadDataSearchConditonSQLString();
+        String ruleSql = (String) loadDataSearchConditonSqlString();
 		if (!StringUtils.hasText(ruleSql)) {
 			request.setAttribute(MENU_DATA_AUTHOR_RULE_SQL,sql);
 		}

+ 3 - 1
jeecg-boot-base-common/src/main/java/org/jeecg/common/system/util/JwtUtil.java

@@ -30,7 +30,9 @@ import org.jeecg.common.util.oConvertUtils;
  **/
 public class JwtUtil {
 
-	// 过期时间30分钟
+    /**
+     * 过期时间30分钟
+     */
 	public static final long EXPIRE_TIME = 30 * 60 * 1000;
 
 	/**

+ 41 - 64
jeecg-boot-base-common/src/main/java/org/jeecg/common/util/DateUtils.java

@@ -17,23 +17,20 @@ import org.springframework.util.StringUtils;
  * @Version 1.0
  */
 public class DateUtils extends PropertyEditorSupport {
-    // 各种时间格式
-    public static final SimpleDateFormat date_sdf = new SimpleDateFormat("yyyy-MM-dd");
-    // 各种时间格式
-    public static final SimpleDateFormat yyyyMMdd = new SimpleDateFormat("yyyyMMdd");
-    // 各种时间格式
-    public static final SimpleDateFormat date_sdf_wz = new SimpleDateFormat("yyyy年MM月dd日");
-    public static final SimpleDateFormat time_sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
-    public static final SimpleDateFormat yyyymmddhhmmss = new SimpleDateFormat("yyyyMMddHHmmss");
-    public static final SimpleDateFormat short_time_sdf = new SimpleDateFormat("HH:mm");
-    public static final SimpleDateFormat datetimeFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
-    // 以毫秒表示的时间
+    /**
+     * 以毫秒表示的时间
+     */
     private static final long DAY_IN_MILLIS = 24 * 3600 * 1000;
     private static final long HOUR_IN_MILLIS = 3600 * 1000;
     private static final long MINUTE_IN_MILLIS = 60 * 1000;
     private static final long SECOND_IN_MILLIS = 1000;
 
-    // 指定模式的时间格式
+    /**
+     * 指定模式的时间格式
+     *
+     * @param pattern
+     * @return
+     */
     private static SimpleDateFormat getDateFormat(String pattern) {
         return new SimpleDateFormat(pattern);
     }
@@ -75,41 +72,6 @@ public class DateUtils extends PropertyEditorSupport {
     }
 
     /**
-     * 指定毫秒数表示的日期
-     *
-     * @param millis 毫秒数
-     * @return 指定毫秒数表示的日期
-     */
-    public static Date getDate(long millis) {
-        return new Date(millis);
-    }
-
-    /**
-     * 时间戳转换为字符串
-     *
-     * @param time
-     * @return
-     */
-    public static String timestamptoStr(Timestamp time) {
-        Date date = null;
-        if (null != time) {
-            date = new Date(time.getTime());
-        }
-        return date2Str(date_sdf);
-    }
-
-    /**
-     * 字符串转换时间戳
-     *
-     * @param str
-     * @return
-     */
-    public static Timestamp str2Timestamp(String str) {
-        Date date = str2Date(str, date_sdf);
-        return new Timestamp(date.getTime());
-    }
-
-    /**
      * 字符串转换成日期
      *
      * @param str
@@ -134,12 +96,13 @@ public class DateUtils extends PropertyEditorSupport {
      * 日期转换为字符串
      * @return 字符串
      */
-    public static String date2Str(SimpleDateFormat dateSdf) {
+    public static String date2Str() {
+        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
         Date date = getDate();
         if (null == date) {
             return null;
         }
-        return date_sdf.format(date);
+        return format.format(date);
     }
 
     /**
@@ -155,7 +118,6 @@ public class DateUtils extends PropertyEditorSupport {
         try {
             getDate = sformat.parse(date);
         } catch (ParseException e) {
-            // TODO Auto-generated catch block
             e.printStackTrace();
         }
         return sformat.format(getDate);
@@ -163,7 +125,6 @@ public class DateUtils extends PropertyEditorSupport {
 
     /**
      * 日期转换为字符串
-     *
      * @param date   日期
      * @return 字符串
      */
@@ -223,6 +184,7 @@ public class DateUtils extends PropertyEditorSupport {
      * @return 当前时间的标准形式字符串
      */
     public static String now() {
+        SimpleDateFormat datetimeFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
         return datetimeFormat.format(getCalendar().getTime());
     }
 
@@ -311,7 +273,8 @@ public class DateUtils extends PropertyEditorSupport {
      * @return 默认日期按“年-月-日“格式显示
      */
     public static String formatDate() {
-        return date_sdf.format(getCalendar().getTime());
+        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
+        return format.format(getCalendar().getTime());
     }
 
     /**
@@ -320,6 +283,7 @@ public class DateUtils extends PropertyEditorSupport {
      * @return 默认日期按“yyyy-MM-dd HH:mm:ss“格式显示
      */
     public static String formatDateTime() {
+        SimpleDateFormat datetimeFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
         return datetimeFormat.format(getCalendar().getTime());
     }
 
@@ -337,7 +301,8 @@ public class DateUtils extends PropertyEditorSupport {
      * @return 指定日期按“年-月-日“格式显示
      */
     public static String formatDate(Calendar cal) {
-        return date_sdf.format(cal.getTime());
+        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
+        return format.format(cal.getTime());
     }
 
     /**
@@ -347,7 +312,8 @@ public class DateUtils extends PropertyEditorSupport {
      * @return 指定日期按“年-月-日“格式显示
      */
     public static String formatDate(Date date) {
-        return date_sdf.format(date);
+        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
+        return format.format(date);
     }
 
     /**
@@ -357,7 +323,8 @@ public class DateUtils extends PropertyEditorSupport {
      * @return 指定毫秒数表示日期按“年-月-日“格式显示
      */
     public static String formatDate(long millis) {
-        return date_sdf.format(new Date(millis));
+        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
+        return format.format(new Date(millis));
     }
 
     /**
@@ -403,7 +370,8 @@ public class DateUtils extends PropertyEditorSupport {
      * @return 默认日期按“年-月-日 时:分“格式显示
      */
     public static String formatTime() {
-        return time_sdf.format(getCalendar().getTime());
+        SimpleDateFormat timeSdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
+        return timeSdf.format(getCalendar().getTime());
     }
 
     /**
@@ -413,7 +381,8 @@ public class DateUtils extends PropertyEditorSupport {
      * @return 指定毫秒数表示日期按“年-月-日 时:分“格式显示
      */
     public static String formatTime(long millis) {
-        return time_sdf.format(new Date(millis));
+        SimpleDateFormat timeSdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
+        return timeSdf.format(new Date(millis));
     }
 
     /**
@@ -423,7 +392,8 @@ public class DateUtils extends PropertyEditorSupport {
      * @return 指定日期按“年-月-日 时:分“格式显示
      */
     public static String formatTime(Calendar cal) {
-        return time_sdf.format(cal.getTime());
+        SimpleDateFormat timeSdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
+        return timeSdf.format(cal.getTime());
     }
 
     /**
@@ -433,7 +403,8 @@ public class DateUtils extends PropertyEditorSupport {
      * @return 指定日期按“年-月-日 时:分“格式显示
      */
     public static String formatTime(Date date) {
-        return time_sdf.format(date);
+        SimpleDateFormat timeSdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
+        return timeSdf.format(date);
     }
 
     // ////////////////////////////////////////////////////////////////////////////
@@ -447,7 +418,8 @@ public class DateUtils extends PropertyEditorSupport {
      * @return 默认日期按“时:分“格式显示
      */
     public static String formatShortTime() {
-        return short_time_sdf.format(getCalendar().getTime());
+        SimpleDateFormat shortTimeSdf = new SimpleDateFormat("HH:mm");
+        return shortTimeSdf.format(getCalendar().getTime());
     }
 
     /**
@@ -457,7 +429,8 @@ public class DateUtils extends PropertyEditorSupport {
      * @return 指定毫秒数表示日期按“时:分“格式显示
      */
     public static String formatShortTime(long millis) {
-        return short_time_sdf.format(new Date(millis));
+        SimpleDateFormat shortTimeSdf = new SimpleDateFormat("HH:mm");
+        return shortTimeSdf.format(new Date(millis));
     }
 
     /**
@@ -467,7 +440,8 @@ public class DateUtils extends PropertyEditorSupport {
      * @return 指定日期按“时:分“格式显示
      */
     public static String formatShortTime(Calendar cal) {
-        return short_time_sdf.format(cal.getTime());
+        SimpleDateFormat shortTimeSdf = new SimpleDateFormat("HH:mm");
+        return shortTimeSdf.format(cal.getTime());
     }
 
     /**
@@ -477,7 +451,8 @@ public class DateUtils extends PropertyEditorSupport {
      * @return 指定日期按“时:分“格式显示
      */
     public static String formatShortTime(Date date) {
-        return short_time_sdf.format(date);
+        SimpleDateFormat shortTimeSdf = new SimpleDateFormat("HH:mm");
+        return shortTimeSdf.format(date);
     }
 
     // ////////////////////////////////////////////////////////////////////////////
@@ -585,10 +560,12 @@ public class DateUtils extends PropertyEditorSupport {
      */
     @Override
     public void setAsText(String text) throws IllegalArgumentException {
+        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
+        SimpleDateFormat datetimeFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
         if (StringUtils.hasText(text)) {
             try {
                 if (text.indexOf(":") == -1 && text.length() == 10) {
-                    setValue(date_sdf.parse(text));
+                    setValue(format.parse(text));
                 } else if (text.indexOf(":") > 0 && text.length() == 19) {
                     setValue(datetimeFormat.parse(text));
                 } else {

+ 32 - 28
jeecg-boot-base-common/src/main/java/org/jeecg/common/util/DySmsHelper.java

@@ -17,53 +17,62 @@ import com.aliyuncs.profile.IClientProfile;
  * 工程依赖了2个jar包(存放在工程的libs目录下)
  * 1:aliyun-java-sdk-core.jar
  * 2:aliyun-java-sdk-dysmsapi.jar
- *
+ * <p>
  * 备注:Demo工程编码采用UTF-8
  * 国际短信发送请勿参照此DEMO
  */
 public class DySmsHelper {
 
-	private final static Logger logger=LoggerFactory.getLogger(DySmsHelper.class);
+    private final static Logger logger = LoggerFactory.getLogger(DySmsHelper.class);
 
-    //产品名称:云通信短信API产品,开发者无需替换
-    static final String product = "Dysmsapi";
-    //产品域名,开发者无需替换
-    static final String domain = "dysmsapi.aliyuncs.com";
+    /**
+     * 产品名称:云通信短信API产品,开发者无需替换
+     */
+    static final String PRODUCT = "Dysmsapi";
+    /**
+     * 产品域名,开发者无需替换
+     */
+    static final String DOMAIN = "dysmsapi.aliyuncs.com";
+
+    /**
+     * TODO 此处需要替换成开发者自己的AK(在阿里云访问控制台寻找)
+     *
+     * @return
+     */
 
-    // TODO 此处需要替换成开发者自己的AK(在阿里云访问控制台寻找)
-    static final String accessKeyId = "?";
-    static final String accessKeySecret = "?";
+    static final String ACCESS_KEY_ID = "?";
+    static final String ACCESS_KEY_SECRET = "?";
 
     /**
-         * 登陆时采用的短信发送模板编码
+     * 登陆时采用的短信发送模板编码
      */
-    public static final String LOGIN_TEMPLATE_CODE="SMS_167040816";
+    public static final String LOGIN_TEMPLATE_CODE = "SMS_167040816";
 
     /**
      * 忘记密码时采用的短信发送模板编码
      */
-    public static final String FORGET_PASSWORD_TEMPLATE_CODE="SMS_167040816";
+    public static final String FORGET_PASSWORD_TEMPLATE_CODE = "SMS_167040816";
 
 
     /**
      * 注册时采用的短信发送模板编码
      */
-    public static final String REGISTER_TEMPLATE_CODE="SMS_144146309";
+    public static final String REGISTER_TEMPLATE_CODE = "SMS_144146309";
 
     /**
-         * 必填:短信签名-可在短信控制台中找到
+     * 必填:短信签名-可在短信控制台中找到
      */
-    public static final String signName="JEECG";
+    public static final String SIGN_NAME = "JEECG";
 
 
-    public static boolean sendSms(String phone,String code,String templateCode) throws ClientException {
-    	//可自助调整超时时间
+    public static boolean sendSms(String phone, String code, String templateCode) throws ClientException {
+        //可自助调整超时时间
         System.setProperty("sun.net.client.defaultConnectTimeout", "10000");
         System.setProperty("sun.net.client.defaultReadTimeout", "10000");
 
         //初始化acsClient,暂不支持region化
-        IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou", accessKeyId, accessKeySecret);
-        DefaultProfile.addEndpoint("cn-hangzhou", "cn-hangzhou", product, domain);
+        IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou", ACCESS_KEY_ID, ACCESS_KEY_SECRET);
+        DefaultProfile.addEndpoint("cn-hangzhou", "cn-hangzhou", PRODUCT, DOMAIN);
         IAcsClient acsClient = new DefaultAcsClient(profile);
 
         //组装请求对象-具体描述见控制台-文档部分内容
@@ -71,11 +80,11 @@ public class DySmsHelper {
         //必填:待发送手机号
         request.setPhoneNumbers(phone);
         //必填:短信签名-可在短信控制台中找到
-        request.setSignName(signName);
+        request.setSignName(SIGN_NAME);
         //必填:短信模板-可在短信控制台中找到
         request.setTemplateCode("SMS_167040816");
         //可选:模板中的变量替换JSON串,如模板内容为"亲爱的${name},您的验证码为${code}"时,此处的值为
-        request.setTemplateParam("{\"code\":\""+code+"\"}");
+        request.setTemplateParam("{\"code\":\"" + code + "\"}");
 
         //选填-上行短信扩展码(无特殊需求用户请忽略此字段)
         //request.setSmsUpExtendCode("90997");
@@ -84,22 +93,17 @@ public class DySmsHelper {
         //request.setOutId("yourOutId");
 
         boolean result = false;
-
         //hint 此处可能会抛出异常,注意catch
         SendSmsResponse sendSmsResponse = acsClient.getAcsResponse(request);
         logger.info("短信接口返回的数据----------------");
-        logger.info("{Code:" + sendSmsResponse.getCode()+",Message:" + sendSmsResponse.getMessage()+",RequestId:"+ sendSmsResponse.getRequestId()+",BizId:"+sendSmsResponse.getBizId()+"}");
+        logger.info("{Code:" + sendSmsResponse.getCode() + ",Message:" + sendSmsResponse.getMessage() + ",RequestId:" + sendSmsResponse.getRequestId() + ",BizId:" + sendSmsResponse.getBizId() + "}");
         if ("OK".equals(sendSmsResponse.getCode())) {
             result = true;
         }
         return result;
-
     }
 
-
     public static void main(String[] args) throws ClientException, InterruptedException {
-
-    	sendSms("13800138000", "123456", FORGET_PASSWORD_TEMPLATE_CODE);
-
+        sendSms("13800138000", "123456", FORGET_PASSWORD_TEMPLATE_CODE);
     }
 }

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

@@ -30,6 +30,8 @@ public class LoadFileUtil {
     public static String downLoadFromUrl(String urlStr, String savePath) throws IOException {
         String fileName = AesEncryptUtil.getURLDecoderString(urlStr.substring(urlStr.lastIndexOf("/") + 1));
         URL url = new URL(urlStr);
+
+        System.setProperty("https.protocols", "TLSv1,TLSv1.1,TLSv1.2,SSLv3");
         HttpURLConnection conn = (HttpURLConnection) url.openConnection();
         //设置超时间为3秒
         conn.setConnectTimeout(60 * 1000);

+ 34 - 3
jeecg-boot-base-common/src/main/java/org/jeecg/common/util/MD5Util.java

@@ -1,9 +1,39 @@
 package org.jeecg.common.util;
 
 import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
 
 public class MD5Util {
 
+    private static ThreadLocal<MessageDigest> MD5 = new ThreadLocal<MessageDigest>() {
+        @Override
+        protected MessageDigest initialValue() {
+            try {
+                return MessageDigest.getInstance("MD5");
+            } catch (NoSuchAlgorithmException e) {
+                throw new IllegalStateException("No md5 algorithm found");
+            }
+        }
+    };
+
+    public static String toHexStr(byte[] bytes) {
+        int j = bytes.length;
+        char[] str = new char[j * 2];
+        int k = 0;
+        for (int i = 0; i < j; i++) {
+            byte byte0 = bytes[i];
+            str[k++] = HEX_DIGITS_CHAR[byte0 >>> 4 & 0xf];
+            str[k++] = HEX_DIGITS_CHAR[byte0 & 0xf];
+        }
+        return String.valueOf(str);
+    }
+
+    public static String getMd5(String msg) {
+        MessageDigest md5 = MD5.get();
+        md5.reset();
+        return toHexStr(md5.digest(msg.getBytes()));
+    }
+
     public static String byteArrayToHexString(byte[] b) {
 		StringBuffer resultSb = new StringBuffer();
 		for (int i = 0; i < b.length; i++){
@@ -19,10 +49,10 @@ public class MD5Util {
 		}
 		int d1 = n / 16;
 		int d2 = n % 16;
-		return hexDigits[d1] + hexDigits[d2];
+        return HEX_DIGITS[d1] + HEX_DIGITS[d2];
 	}
 
-    public static String Md5Encode(String origin, String charsetname) {
+    public static String md5Encode(String origin, String charsetname) {
 		String resultString = null;
 		try {
 			resultString = new String(origin);
@@ -37,7 +67,8 @@ public class MD5Util {
 		return resultString;
 	}
 
-    private static final String[] hexDigits = {"0", "1", "2", "3", "4", "5",
+    private static final String[] HEX_DIGITS = {"0", "1", "2", "3", "4", "5",
 			"6", "7", "8", "9", "a", "b", "c", "d", "e", "f" };
+    private static final char[] HEX_DIGITS_CHAR = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
 
 }

+ 6 - 1
jeecg-boot-base-common/src/main/java/org/jeecg/common/util/MyClassLoader.java

@@ -15,7 +15,12 @@ public class MyClassLoader extends ClassLoader {
 		return myclass;
 	}
 
-	// 获得类的全名,包括包名
+    /**
+     * 获得类的全名,包括包名
+     *
+     * @param object
+     * @return
+     */
 	public static String getPackPath(Object object) {
 		// 检查用户传入的参数是否为空
 		if (object == null) {

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

@@ -18,7 +18,7 @@ public class PasswordUtil {
 	 * 定义使用的算法为:PBEWITHMD5andDES算法
 	 */
 	public static final String ALGORITHM = "PBEWithMD5AndDES";//加密算法
-	public static final String Salt = "63293188";//密钥
+    public static final String SALT = "63293188";//密钥
 
 	/**
 	 * 定义迭代次数为1000次
@@ -39,7 +39,7 @@ public class PasswordUtil {
 
 	public static byte[] getStaticSalt() {
 		// 产出盐
-		return Salt.getBytes();
+        return SALT.getBytes();
 	}
 
 	/**

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

@@ -9,7 +9,7 @@ import lombok.extern.slf4j.Slf4j;
  */
 @Slf4j
 public class SqlInjectionUtil {
-	final static String xssStr = "'|and |exec |insert |select |delete |update |drop |count |chr |mid |master |truncate |char |declare |;|or |+|,";
+    final static String XSS_STR = "'|and |exec |insert |select |delete |update |drop |count |chr |mid |master |truncate |char |declare |;|or |+|,";
 
 	/**
 	 * sql注入过滤处理,遇到注入关键字抛异常
@@ -22,7 +22,7 @@ public class SqlInjectionUtil {
 			return;
 		}
 		value = value.toLowerCase();// 统一转为小写
-		String[] xssArr = xssStr.split("\\|");
+        String[] xssArr = XSS_STR.split("\\|");
 		for (int i = 0; i < xssArr.length; i++) {
 			if (value.indexOf(xssArr[i]) > -1) {
 				log.error("请注意,值可能存在SQL注入风险!---> {}", value);
@@ -34,12 +34,12 @@ public class SqlInjectionUtil {
 
 	/**
 	 * sql注入过滤处理,遇到注入关键字抛异常
-	 * 
-	 * @param value
+	 *
+     * @param values
 	 * @return
 	 */
 	public static void filterContent(String[] values) {
-		String[] xssArr = xssStr.split("\\|");
+        String[] xssArr = XSS_STR.split("\\|");
 		for (String value : values) {
 			if (value == null || "".equals(value)) {
 				return;

+ 4 - 0
jeecg-boot-base-common/src/main/java/org/jeecg/common/util/StatusCode.java

@@ -21,6 +21,10 @@ public enum StatusCode {
     BYTEDANCE_IMAGE_UPLOAD_FAIL("今日头条图片文件上传失败", -203, false),
     TEMPLATE_NAME_HAS_EXIST("模板名称已存在", -204, false),
     TEMPLATE_NAME_IS_NULL("模板名称为空", -205, false),
+    FILE_HAS_NOT_UPLOAD("文件尚未上传", -206, false),
+    ACCOUNT_HAS_NOT_EXIST("改用户信息不存在", -207, false),
+    USERNAME_OR_PASSWORD_ERROR("登录用户名或密码错误", -208, false),
+    FILE_HAS_UPLOAD("文件已经上传过", 0, false),
     COMMON_SERVER_ERROR("服务器内部错误", -102, false);
     private String desc;
     private int code;

+ 152 - 161
jeecg-boot-base-common/src/main/java/org/jeecg/common/util/YouBianCodeUtil.java

@@ -6,168 +6,159 @@ import io.netty.util.internal.StringUtil;
  * 流水号生成规则(按默认规则递增,数字从1-99开始递增,数字到99,递增字母;位数不够增加位数)
  * A001
  * A001A002
- * @Author zhangdaihao
  *
+ * @Author zhangdaihao
  */
 public class YouBianCodeUtil {
-
-	// 数字位数(默认生成3位的数字)
-
-	private static final int numLength = 2;//代表数字位数
-
-	public static final int zhanweiLength = 1+numLength;
-
-	/**
-	 * 根据前一个code,获取同级下一个code
-	 * 例如:当前最大code为D01A04,下一个code为:D01A05
-	 * 
-	 * @param code
-	 * @return
-	 */
-	public static synchronized String getNextYouBianCode(String code) {
-		String newcode = "";
-		if (code == null || code =="") {
-			String zimu = "A";
-			String num = getStrNum(1);
-			newcode = zimu + num;
-		} else {
-			String before_code = code.substring(0, code.length() - 1- numLength);
-			String after_code = code.substring(code.length() - 1 - numLength,code.length());
-			char after_code_zimu = after_code.substring(0, 1).charAt(0);
-			Integer after_code_num = Integer.parseInt(after_code.substring(1));
-//			org.jeecgframework.core.util.LogUtil.info(after_code);
-//			org.jeecgframework.core.util.LogUtil.info(after_code_zimu);
-//			org.jeecgframework.core.util.LogUtil.info(after_code_num);
-
-			String nextNum = "";
-			char nextZimu = 'A';
-			// 先判断数字等于999*,则计数从1重新开始,递增
-			if (after_code_num == getMaxNumByLength(numLength)) {
-				nextNum = getNextStrNum(0);
-			} else {
-				nextNum = getNextStrNum(after_code_num);
-			}
-			// 先判断数字等于999*,则字母从A重新开始,递增
-			if(after_code_num == getMaxNumByLength(numLength)) {
-				nextZimu = getNextZiMu(after_code_zimu);
-			}else{
-				nextZimu = after_code_zimu;
-			}
-
-			// 例如Z99,下一个code就是Z99A01
-			if ('Z' == after_code_zimu && getMaxNumByLength(numLength) == after_code_num) {
-				newcode = code + (nextZimu + nextNum);
-			} else {
-				newcode = before_code + (nextZimu + nextNum);
-			}
-		}
-		return newcode;
-
-	}
-
-	/**
-	 * 根据父亲code,获取下级的下一个code
-	 * 
-	 * 例如:父亲CODE:A01
-	 *       当前CODE:A01B03
-	 *       获取的code:A01B04
-	 *       
-	 * @param parentCode   上级code
-	 * @param localCode    同级code
-	 * @return
-	 */
-	public static synchronized String getSubYouBianCode(String parentCode,String localCode) {
-		if(localCode!=null && localCode!=""){
-
-//			return parentCode + getNextYouBianCode(localCode);
-			return getNextYouBianCode(localCode);
-
-		}else{
-			parentCode = parentCode + "A"+ getNextStrNum(0);
-		}
-		return parentCode;
-	}
-
-	
-
-	/**
-	 * 将数字前面位数补零
-	 * 
-	 * @param num
-	 * @return
-	 */
-	private static String getNextStrNum(int num) {
-		return getStrNum(getNextNum(num));
-	}
-
-	/**
-	 * 将数字前面位数补零
-	 * 
-	 * @param num
-	 * @return
-	 */
-	private static String getStrNum(int num) {
-		String s = String.format("%0" + numLength + "d", num);
-		return s;
-	}
-
-	/**
-	 * 递增获取下个数字
-	 * 
-	 * @param num
-	 * @return
-	 */
-	private static int getNextNum(int num) {
-		num++;
-		return num;
-	}
-
-	/**
-	 * 递增获取下个字母
-	 * 
-	 * @param num
-	 * @return
-	 */
-	private static char getNextZiMu(char zimu) {
-		if (zimu == 'Z') {
-			return 'A';
-		}
-		zimu++;
-		return zimu;
-	}
-	
-	/**
-	 * 根据数字位数获取最大值
-	 * @param length
-	 * @return
-	 */
-	private static int getMaxNumByLength(int length){
-		if(length==0){
-			return 0;
-		}
-		String max_num = "";
-		for (int i=0;i<length;i++){
-			max_num = max_num + "9";
-		}
-		return Integer.parseInt(max_num);
-	}
-	public static String[] cutYouBianCode(String code){
-		if(code==null || StringUtil.isNullOrEmpty(code)){
-			return null;
-		}else{
-			//获取标准长度为numLength+1,截取的数量为code.length/numLength+1
-			int c = code.length()/(numLength+1);
-			String[] cutcode = new String[c];
-			for(int i =0 ; i <c;i++){
-				cutcode[i] = code.substring(0,(i+1)*(numLength+1));
-			}
-			return cutcode;
-		}
-		
-	}
-	public static void main(String[] args) {
-		// org.jeecgframework.core.util.LogUtil.info(getNextZiMu('C'));
-		// org.jeecgframework.core.util.LogUtil.info(getNextNum(8));
-	    // org.jeecgframework.core.util.LogUtil.info(cutYouBianCode("C99A01B01")[2]);
-	}
+    /**
+     * 代表数字位数
+     * 数字位数(默认生成3位的数字)
+     */
+    private static final int NUM_LENGTH = 2;
+
+    public static final int ZHANWEI_LENGTH = 1 + NUM_LENGTH;
+
+    /**
+     * 根据前一个code,获取同级下一个code
+     * 例如:当前最大code为D01A04,下一个code为:D01A05
+     *
+     * @param code
+     * @return
+     */
+    public static synchronized String getNextYouBianCode(String code) {
+        String newcode = "";
+        if (code == null || code == "") {
+            String zimu = "A";
+            String num = getStrNum(1);
+            newcode = zimu + num;
+        } else {
+            String beforeCode = code.substring(0, code.length() - 1 - NUM_LENGTH);
+            String afterCode = code.substring(code.length() - 1 - NUM_LENGTH, code.length());
+            char afterCodeZimu = afterCode.substring(0, 1).charAt(0);
+            Integer afterCodeNum = Integer.parseInt(afterCode.substring(1));
+
+            String nextNum = "";
+            char nextZimu = 'A';
+            // 先判断数字等于999*,则计数从1重新开始,递增
+            if (afterCodeNum == getMaxNumByLength(NUM_LENGTH)) {
+                nextNum = getNextStrNum(0);
+            } else {
+                nextNum = getNextStrNum(afterCodeNum);
+            }
+            // 先判断数字等于999*,则字母从A重新开始,递增
+            if (afterCodeNum == getMaxNumByLength(NUM_LENGTH)) {
+                nextZimu = getNextZiMu(afterCodeZimu);
+            } else {
+                nextZimu = afterCodeZimu;
+            }
+
+            // 例如Z99,下一个code就是Z99A01
+            if ('Z' == afterCodeZimu && getMaxNumByLength(NUM_LENGTH) == afterCodeZimu) {
+                newcode = code + (nextZimu + nextNum);
+            } else {
+                newcode = beforeCode + (nextZimu + nextNum);
+            }
+        }
+        return newcode;
+
+    }
+
+    /**
+     * 根据父亲code,获取下级的下一个code
+     * <p>
+     * 例如:父亲CODE:A01
+     * 当前CODE:A01B03
+     * 获取的code:A01B04
+     *
+     * @param parentCode 上级code
+     * @param localCode  同级code
+     * @return
+     */
+    public static synchronized String getSubYouBianCode(String parentCode, String localCode) {
+        if (localCode != null && localCode != "") {
+            return getNextYouBianCode(localCode);
+        } else {
+            parentCode = parentCode + "A" + getNextStrNum(0);
+        }
+        return parentCode;
+    }
+
+
+    /**
+     * 将数字前面位数补零
+     *
+     * @param num
+     * @return
+     */
+    private static String getNextStrNum(int num) {
+        return getStrNum(getNextNum(num));
+    }
+
+    /**
+     * 将数字前面位数补零
+     *
+     * @param num
+     * @return
+     */
+    private static String getStrNum(int num) {
+        String s = String.format("%0" + NUM_LENGTH + "d", num);
+        return s;
+    }
+
+    /**
+     * 递增获取下个数字
+     *
+     * @param num
+     * @return
+     */
+    private static int getNextNum(int num) {
+        num++;
+        return num;
+    }
+
+    /**
+     * 递增获取下个字母
+     *
+     * @param zimu
+     * @return
+     */
+    private static char getNextZiMu(char zimu) {
+        if (zimu == 'Z') {
+            return 'A';
+        }
+        zimu++;
+        return zimu;
+    }
+
+    /**
+     * 根据数字位数获取最大值
+     *
+     * @param length
+     * @return
+     */
+    private static int getMaxNumByLength(int length) {
+        if (length == 0) {
+            return 0;
+        }
+        String maxNum = "";
+        for (int i = 0; i < length; i++) {
+            maxNum = maxNum + "9";
+        }
+        return Integer.parseInt(maxNum);
+    }
+
+    public static String[] cutYouBianCode(String code) {
+        if (code == null || StringUtil.isNullOrEmpty(code)) {
+            return null;
+        } else {
+            //获取标准长度为numLength+1,截取的数量为code.length/numLength+1
+            int c = code.length() / (NUM_LENGTH + 1);
+            String[] cutcode = new String[c];
+            for (int i = 0; i < c; i++) {
+                cutcode[i] = code.substring(0, (i + 1) * (NUM_LENGTH + 1));
+            }
+            return cutcode;
+        }
+
+    }
 }

+ 5 - 3
jeecg-boot-base-common/src/main/java/org/jeecg/common/util/encryption/AesEncryptUtil.java

@@ -12,7 +12,9 @@ import java.io.UnsupportedEncodingException;
  */
 public class AesEncryptUtil {
 
-    //使用AES-128-CBC加密模式,key需要为16位,key和iv可以相同!
+    /**
+     * 使用AES-128-CBC加密模式,key需要为16位,key和iv可以相同!
+     */
     private static String KEY = EncryptedString.key;
 
     private static String IV = EncryptedString.iv;
@@ -28,8 +30,8 @@ public class AesEncryptUtil {
      */
     public static String encrypt(String data, String key, String iv) throws Exception {
         try {
-
-            Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");//"算法/模式/补码方式"NoPadding PkcsPadding
+            //"算法/模式/补码方式"NoPadding PkcsPadding
+            Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");
             int blockSize = cipher.getBlockSize();
 
             byte[] dataBytes = data.getBytes();

+ 21 - 78
jeecg-boot-base-common/src/main/java/org/jeecg/common/util/jsonschema/CommonProperty.java

@@ -4,6 +4,7 @@ import java.io.Serializable;
 import java.util.List;
 import java.util.Map;
 
+import lombok.Data;
 import org.jeecg.common.system.vo.DictModel;
 
 import com.alibaba.fastjson.JSONObject;
@@ -11,14 +12,10 @@ import com.alibaba.fastjson.JSONObject;
 /**
  * 验证通用属性
  */
+@Data
 public abstract class CommonProperty implements Serializable{
-
 	private static final long serialVersionUID = -426159949502493187L;
-
-
 	protected String key;
-	
-	
 	/**
 	 * <p>此关键字的值必须是字符串或数组。如果它是一个数组,那么数组的元素必须是字符串,并且必须是唯一的。
 	 * <p>字符串值必须是六种基本类型之一(“null”,“boolean”,“object”,“array”,“number”或“string”),或“integer”,它匹配任何数字,零分数部分。
@@ -45,78 +42,26 @@ public abstract class CommonProperty implements Serializable{
 	 *	如果实例的值等于关键字的值,则实例将针对此关键字成功验证。
 	 */
 	protected Object constant;
-	
-	//三个自定义 属性
-	protected String view;// 展示类型
-	protected String title;//数据库字段备注
-	protected Integer order;//字段显示排序
-	
-	protected boolean disabled;//是否禁用
-	
-	public boolean isDisabled() {
-		return disabled;
-	}
-
-	public void setDisabled(boolean disabled) {
-		this.disabled = disabled;
-	}
-
-	public String getView() {
-		return view;
-	}
-
-	public void setView(String view) {
-		this.view = view;
-	}
-
-	public String getKey() {
-		return key;
-	}
-
-	public void setKey(String key) {
-		this.key = key;
-	}
-
-	public String getType() {
-		return type;
-	}
-
-	public void setType(String type) {
-		this.type = type;
-	}
-
-	public List<DictModel> getInclude() {
-		return include;
-	}
-
-	public void setInclude(List<DictModel> include) {
-		this.include = include;
-	}
-
-	public Object getConstant() {
-		return constant;
-	}
-
-	public void setConstant(Object constant) {
-		this.constant = constant;
-	}
-	
-	public String getTitle() {
-		return title;
-	}
-
-	public void setTitle(String title) {
-		this.title = title;
-	}
-
-	public Integer getOrder() {
-		return order;
-	}
-
-	public void setOrder(Integer order) {
-		this.order = order;
-	}
 
+    /**
+     * 三个自定义 属性
+     */
+    /**
+     * 展示类型
+     */
+    protected String view;
+    /**
+     * 数据库字段备注
+     */
+    protected String title;
+    /**
+     * 字段显示排序
+     */
+    protected Integer order;
+    /**
+     * 是否禁用
+     */
+    protected boolean disabled;
 	/**
 	 * 返回一个map有两个key
 	 * <P>key ---> Property JSON的key
@@ -152,6 +97,4 @@ public abstract class CommonProperty implements Serializable{
 		}
 		return json;
 	}
-	
-
 }

+ 8 - 8
jeecg-boot-base-common/src/main/java/org/jeecg/common/util/jsonschema/JsonSchemaDescrip.java

@@ -13,9 +13,9 @@ public class JsonSchemaDescrip implements Serializable{
 	 * 
 	 */
 	private static final long serialVersionUID = 7682073117441544718L;
-	
-	
-	private String $schema = "http://json-schema.org/draft-07/schema#";
+
+
+    private String SCHEMA = "http://json-schema.org/draft-07/schema#";
 	
 	/**
 	 * 用它给我们的模式提供了标题。
@@ -43,12 +43,12 @@ public class JsonSchemaDescrip implements Serializable{
 		this.required = required;
 	}
 
-	public String get$schema() {
-		return $schema;
-	}
+    public String getSchema() {
+        return SCHEMA;
+    }
 
-	public void set$schema(String $schema) {
-		this.$schema = $schema;
+    public void setSchema(String schema) {
+        this.SCHEMA = schema;
 	}
 
 	public String getTitle() {

+ 3 - 3
jeecg-boot-base-common/src/main/java/org/jeecg/common/util/jsonschema/JsonschemaUtil.java

@@ -21,7 +21,7 @@ public class JsonschemaUtil {
 	 */
 	public static JSONObject getJsonSchema(JsonSchemaDescrip descrip, List<CommonProperty> propertyList) {
 		JSONObject obj = new JSONObject();
-		obj.put("$schema", descrip.get$schema());
+        obj.put("$schema", descrip.getSchema());
 		obj.put("type", descrip.getType());
 		obj.put("title", descrip.getTitle());
 
@@ -35,7 +35,7 @@ public class JsonschemaUtil {
 		}
 		obj.put("properties", properties);
 		//鬼知道这里为什么报错 org.jeecg.modules.system.model.DictModel cannot be cast to org.jeecg.modules.system.model.DictModel
-		//log.info("---JSONSchema--->"+obj.toJSONString());
+        log.info("---JSONSchema--->" + obj.toJSONString());
 		return obj;
 	}
 	
@@ -63,7 +63,7 @@ public class JsonschemaUtil {
 			properties.put(map.get("key").toString(), map.get("prop"));
 		}
 		obj.put("properties", properties);
-		//log.info("---JSONSchema--->"+obj.toString());
+        log.info("---JSONSchema--->" + obj.toString());
 		return obj;
 	}
 

+ 7 - 27
jeecg-boot-base-common/src/main/java/org/jeecg/common/util/jsonschema/validate/DictProperty.java

@@ -3,6 +3,7 @@ package org.jeecg.common.util.jsonschema.validate;
 import java.util.HashMap;
 import java.util.Map;
 
+import lombok.Data;
 import org.jeecg.common.util.jsonschema.CommonProperty;
 
 import com.alibaba.fastjson.JSONObject;
@@ -12,41 +13,20 @@ import com.alibaba.fastjson.JSONObject;
  * @author 86729
  *
  */
+@Data
 public class DictProperty extends CommonProperty {
 	
 	private static final long serialVersionUID = 3786503639885610767L;
-	
-	//字典三属性
+
+    /**
+     * 字典三属性
+     */
+
 	private String dictCode;
 	private String dictTable;
 	private String dictText;
-	
-	public String getDictCode() {
-		return dictCode;
-	}
-
-	public void setDictCode(String dictCode) {
-		this.dictCode = dictCode;
-	}
-
-	public String getDictTable() {
-		return dictTable;
-	}
-
-	public void setDictTable(String dictTable) {
-		this.dictTable = dictTable;
-	}
-
-	public String getDictText() {
-		return dictText;
-	}
-
-	public void setDictText(String dictText) {
-		this.dictText = dictText;
-	}
 
 	public DictProperty() {}
-	
 	/**
 	 *  构造器
 	 */

+ 16 - 10
jeecg-boot-base-common/src/main/java/org/jeecg/common/util/oConvertUtils.java

@@ -1,5 +1,7 @@
 package org.jeecg.common.util;
 
+import org.apache.commons.lang.StringEscapeUtils;
+
 import java.io.UnsupportedEncodingException;
 import java.lang.reflect.Field;
 import java.math.BigDecimal;
@@ -54,7 +56,7 @@ public class oConvertUtils {
 		return temp;
 	}
 
-    public static String StrToUtf(String strIn, String sourceCode, String targetCode) {
+    public static String strToUtf(String strIn, String sourceCode, String targetCode) {
 		strIn = "";
 		try {
 			strIn = new String(strIn.getBytes("ISO-8859-1"), "GBK");
@@ -206,9 +208,9 @@ public class oConvertUtils {
 	 * @param s
 	 * @return
 	 */
-	/*public static String escapeJava(Object s) {
+    public static String escapeJava(Object s) {
 		return StringEscapeUtils.escapeJava(getString(s));
-	}*/
+    }
 	
 	public static String getString(Object object) {
 		if (isEmpty(object)) {
@@ -298,12 +300,15 @@ public class oConvertUtils {
 	 * @throws SocketException
 	 */
 	public static String getRealIp() throws SocketException {
-		String localip = null;// 本地IP,如果没有配置外网IP则返回它
-		String netip = null;// 外网IP
+        // 本地IP,如果没有配置外网IP则返回它
+        String localip = null;
+        // 外网IP
+        String netip = null;
 
 		Enumeration<NetworkInterface> netInterfaces = NetworkInterface.getNetworkInterfaces();
 		InetAddress ip = null;
-		boolean finded = false;// 是否找到外网IP
+        // 是否找到外网IP
+        boolean finded = false;
 		while (netInterfaces.hasMoreElements() && !finded) {
 			NetworkInterface ni = netInterfaces.nextElement();
 			Enumeration<InetAddress> address = ni.getInetAddresses();
@@ -463,8 +468,8 @@ public class oConvertUtils {
 	 * 将下划线大写方式命名的字符串转换为驼峰式。
 	 * 如果转换前的下划线大写方式命名的字符串为空,则返回空字符串。</br>
 	 * 例如:hello_world,test_id->helloWorld,testId
-	 * 
-	 * @param name
+	 *
+     * @param names
 	 *            转换前的下划线大写方式命名的字符串
 	 * @return 转换后的驼峰式命名的字符串
 	 */
@@ -503,7 +508,7 @@ public class oConvertUtils {
 			return name.substring(0, 1).toUpperCase() + name.substring(1).toLowerCase();
 		}
 		// 用下划线将原始字符串分割
-		String camels[] = name.split("_");
+        String[] camels = name.split("_");
 		for (String camel : camels) {
 			// 跳过原始字符串中开头、结尾的下换线或双重下划线
 			if (camel.isEmpty()) {
@@ -527,7 +532,8 @@ public class oConvertUtils {
         	return para.toLowerCase(); 
         }
         StringBuilder sb=new StringBuilder(para);
-        int temp=0;//定位
+        //定位
+        int temp = 0;
         //从第三个字符开始 避免命名不规范 
         for(int i=2;i<para.length();i++){
             if(Character.isUpperCase(para.charAt(i))){

+ 28 - 12
jeecg-boot-module-system/pom.xml

@@ -28,6 +28,11 @@
                 <enabled>false</enabled>
             </snapshots>
         </repository>
+        <repository>
+            <id>com.e-iceblue</id>
+            <name>e-iceblue</name>
+            <url>http://repo.e-iceblue.com/nexus/content/groups/public/</url>
+        </repository>
     </repositories>
 
     <dependencies>
@@ -36,6 +41,10 @@
             <artifactId>jeecg-boot-base-common</artifactId>
             <version>2.0.2</version>
         </dependency>
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>jcl-over-slf4j</artifactId>
+        </dependency>
 
         <dependency>
             <groupId>cn.com.ctop</groupId>
@@ -64,11 +73,26 @@
             <artifactId>commons-csv</artifactId>
             <version>1.5</version>
         </dependency>
-
+        <!--签章-->
+        <dependency>
+            <groupId>org.bouncycastle</groupId>
+            <artifactId>bcprov-jdk15on</artifactId>
+            <version>1.49</version>
+        </dependency>
         <dependency>
-            <groupId>cn.edu.hfut.dmic.webcollector</groupId>
-            <artifactId>WebCollector</artifactId>
-            <version>2.52</version>
+            <groupId>org.bouncycastle</groupId>
+            <artifactId>bcpkix-jdk15on</artifactId>
+            <version>1.49</version>
+        </dependency>
+        <dependency>
+            <groupId>com.itextpdf</groupId>
+            <artifactId>itextpdf</artifactId>
+            <version>5.5.13</version>
+        </dependency>
+        <dependency>
+            <groupId>e-iceblue</groupId>
+            <artifactId>spire.pdf</artifactId>
+            <version>2.7.8</version>
         </dependency>
     </dependencies>
 
@@ -78,14 +102,6 @@
                 <groupId>org.springframework.boot</groupId>
                 <artifactId>spring-boot-maven-plugin</artifactId>
             </plugin>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-resources-plugin</artifactId>
-                <configuration>
-                    <delimiters>@</delimiters>
-                    <useDefaultDelimiters>false</useDefaultDelimiters>
-                </configuration>
-            </plugin>
         </plugins>
         <resources>
             <!-- 解决MyBatis配置文件引入问题 -->

+ 0 - 5
jeecg-boot-module-system/src/main/java/org/jeecg/JeecgApplication.java

@@ -1,8 +1,6 @@
 package org.jeecg;
 
 import lombok.extern.slf4j.Slf4j;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
@@ -27,13 +25,10 @@ import java.net.UnknownHostException;
 
 
 public class JeecgApplication {
-    Logger logger = LoggerFactory.getLogger(JeecgApplication.class);
     public static void main(String[] args) throws UnknownHostException {
         ConfigurableApplicationContext application = SpringApplication.run(JeecgApplication.class, args);
         Environment env = application.getEnvironment();
         String ip = InetAddress.getLocalHost().getHostAddress();
-
-
         String port = env.getProperty("server.port");
         String path = env.getProperty("server.servlet.context-path");
         log.info("\n----------------------------------------------------------\n\t" +

+ 1 - 1
jeecg-boot-module-system/src/main/java/org/jeecg/JeecgOneGUI.java

@@ -8,7 +8,7 @@ import org.jeecgframework.codegenerate.window.CodeWindow;
  * @site www.jeecg.org
  * @Version:V1.0.1
  */
-public class JeecgOneGUI {
+public class JeecgOneGui {
 
 	/** 详细使用手册: http://jeecg-boot.mydoc.io/?t=338140 */
     public static void main(String[] args) {

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

@@ -27,7 +27,7 @@ import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.ObjectMapper.DefaultTyping;
 
 @Configuration
-@EnableCaching // 开启缓存支持
+@EnableCaching
 public class RedisConfig extends CachingConfigurerSupport {
 
 	@Resource

+ 34 - 17
jeecg-boot-module-system/src/main/java/org/jeecg/config/ShiroConfig.java

@@ -43,21 +43,35 @@ public class ShiroConfig {
 		// 拦截器
 		Map<String, String> filterChainDefinitionMap = new LinkedHashMap<String, String>();
 		// 配置不会被拦截的链接 顺序判断
-		filterChainDefinitionMap.put("/sys/login", "anon"); //登录接口排除
-
-		filterChainDefinitionMap.put("/sys/getEncryptedString", "anon"); //获取加密串
-		filterChainDefinitionMap.put("/sys/sms", "anon");//短信验证码
-		filterChainDefinitionMap.put("/sys/phoneLogin", "anon");//手机登录		
-		filterChainDefinitionMap.put("/sys/user/checkOnlyUser", "anon");//校验用户是否存在
-		filterChainDefinitionMap.put("/sys/user/register", "anon");//用户注册
-		filterChainDefinitionMap.put("/sys/user/querySysUser", "anon");//根据手机号获取用户信息
-		filterChainDefinitionMap.put("/sys/user/phoneVerification", "anon");//用户忘记密码验证手机号
-		filterChainDefinitionMap.put("/sys/user/passwordChange", "anon");//用户更改密码
-		filterChainDefinitionMap.put("/auth/2step-code", "anon");//登录验证码
-		filterChainDefinitionMap.put("/sys/common/view/**", "anon");//图片预览不限制token
-		filterChainDefinitionMap.put("/sys/common/download/**", "anon");//文件下载不限制token
-		filterChainDefinitionMap.put("/sys/common/pdf/**", "anon");//pdf预览
-		filterChainDefinitionMap.put("/generic/**", "anon");//pdf预览需要文件
+        //登录接口排除
+        filterChainDefinitionMap.put("/sys/login", "anon");
+
+        //获取加密串
+        filterChainDefinitionMap.put("/sys/getEncryptedString", "anon");
+        //短信验证码
+        filterChainDefinitionMap.put("/sys/sms", "anon");
+        //手机登录
+        filterChainDefinitionMap.put("/sys/phoneLogin", "anon");
+        //校验用户是否存在
+        filterChainDefinitionMap.put("/sys/user/checkOnlyUser", "anon");
+        //用户注册
+        filterChainDefinitionMap.put("/sys/user/register", "anon");
+        //根据手机号获取用户信息
+        filterChainDefinitionMap.put("/sys/user/querySysUser", "anon");
+        //用户忘记密码验证手机号
+        filterChainDefinitionMap.put("/sys/user/phoneVerification", "anon");
+        //用户更改密码
+        filterChainDefinitionMap.put("/sys/user/passwordChange", "anon");
+        //登录验证码
+        filterChainDefinitionMap.put("/auth/2step-code", "anon");
+        //图片预览不限制token
+        filterChainDefinitionMap.put("/sys/common/view/**", "anon");
+        //文件下载不限制token
+        filterChainDefinitionMap.put("/sys/common/download/**", "anon");
+        //pdf预览
+        filterChainDefinitionMap.put("/sys/common/pdf/**", "anon");
+        //pdf预览需要文件
+        filterChainDefinitionMap.put("/generic/**", "anon");
 		filterChainDefinitionMap.put("/", "anon");
 		filterChainDefinitionMap.put("/doc.html", "anon");
 		filterChainDefinitionMap.put("/**/*.js", "anon");
@@ -82,8 +96,10 @@ public class ShiroConfig {
 		filterChainDefinitionMap.put("/actuator/metrics/**", "anon");
 		filterChainDefinitionMap.put("/actuator/httptrace/**", "anon");
 		filterChainDefinitionMap.put("/actuator/redis/**", "anon");
-        filterChainDefinitionMap.put("/test/**", "anon"); //模板测试
-        filterChainDefinitionMap.put("/report/**", "anon"); //模板测试
+        //模板测试
+        filterChainDefinitionMap.put("/test/**", "anon");
+        //报表测试
+        filterChainDefinitionMap.put("/report/**", "anon");
 
 		//oauth接口
         filterChainDefinitionMap.put("/auth/**", "anon");
@@ -95,6 +111,7 @@ public class ShiroConfig {
         filterChainDefinitionMap.put("/toutiao/industry/list", "anon");
         filterChainDefinitionMap.put("/template/bytedance/industry/list", "anon");
         filterChainDefinitionMap.put("/template/convert/list", "anon");
+		filterChainDefinitionMap.put("/template/convert/list/url", "anon");
         //文件上传接口
 		filterChainDefinitionMap.put("/upload/**", "anon");
 

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

@@ -108,22 +108,10 @@ public class AdCoverController {
         return result;
     }
 
-    //    @RequestMapping(value = "/list", method = RequestMethod.GET)
-//    //@RequiresPermissions("sys:user:list")
-//    public Result<IPage<SysUser>> queryPageList(SysUser user, @RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
-//                                                @RequestParam(name="pageSize", defaultValue="10") Integer pageSize, HttpServletRequest req) {
-//        Result<IPage<SysUser>> result = new Result<IPage<SysUser>>();
-//        QueryWrapper<SysUser> queryWrapper = QueryGenerator.initQueryWrapper(user, req.getParameterMap());
-//        Page<SysUser> page = new Page<SysUser>(pageNo, pageSize);
-//        IPage<SysUser> pageList = sysUserService.page(page, queryWrapper);
-//        result.setSuccess(true);
-//        result.setResult(pageList);
-//        return result;
-//    }
     @ResponseBody
     @RequestMapping(value="/detail", method = RequestMethod.GET)
     public Result<Map<String,Object>> getDetail(@RequestParam(name="photoId") Long photoId, @RequestParam(name="userId") Long userId){
-        Result<Map<String,Object>> result = new Result<Map<String,Object>>();
+        Result<Map<String, Object>> result = new Result<>();
         AppAd ad = new AppAd();
         ad.setPhotoId(photoId);
         QueryWrapper<AppAd> queryWrapper = QueryGenerator.initQueryWrapper(ad,null);
@@ -160,7 +148,7 @@ public class AdCoverController {
     @ResponseBody
     @RequestMapping(value="/adlist", method = RequestMethod.GET)
     public Result<List<AppAd>> getAdList(@RequestParam(name="photoId") String photoId, @RequestParam(name="userId") Long userId){
-        Result<List<AppAd>> result = new Result<List<AppAd>>();
+        Result<List<AppAd>> result = new Result<>();
         AppAd ad = new AppAd();
         ad.setPhotoId(Long.valueOf(photoId));
         QueryWrapper<AppAd> queryWrapper = QueryGenerator.initQueryWrapper(ad,null);

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

@@ -6,6 +6,7 @@ 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;
@@ -34,40 +35,42 @@ import com.alibaba.fastjson.JSON;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 
- /**
+/**
  * @Description: 广告主信息表
  * @Author: jeecg-boot
- * @Date:   2019-06-11
+ * @Date: 2019-06-11
  * @Version: V1.0
  */
 @Slf4j
-@Api(tags="广告主信息表")
+@Api(tags = "广告主信息表")
 @RestController
 @RequestMapping("/ctop/advertiser")
 public class AdvertiserController {
-	@Autowired
-	private IAdvertiserService advertiserService;
-     @Autowired
-     private ISysCategoryService sysCategoryService;
-	/**
-	  * 分页列表查询
-	 * @param advertiser
-	 * @param pageNo
-	 * @param pageSize
-	 * @param req
-	 * @return
-	 */
-	@AutoLog(value = "广告主信息表-分页列表查询")
-	@ApiOperation(value="广告主信息表-分页列表查询", notes="广告主信息表-分页列表查询")
-	@GetMapping(value = "/list")
-	public Result<IPage<Advertiser>> queryPageList(Advertiser advertiser,
-									  @RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
-									  @RequestParam(name="pageSize", defaultValue="10") Integer pageSize,
-									  HttpServletRequest req) {
-		Result<IPage<Advertiser>> result = new Result<IPage<Advertiser>>();
-		QueryWrapper<Advertiser> queryWrapper = QueryGenerator.initQueryWrapper(advertiser, req.getParameterMap());
-		Page<Advertiser> page = new Page<Advertiser>(pageNo, pageSize);
-		IPage<Advertiser> pageList = advertiserService.page(page, queryWrapper);
+    @Autowired
+    private IAdvertiserService advertiserService;
+    @Autowired
+    private ISysCategoryService sysCategoryService;
+
+    /**
+     * 分页列表查询
+     *
+     * @param advertiser
+     * @param pageNo
+     * @param pageSize
+     * @param req
+     * @return
+     */
+    @AutoLog(value = "广告主信息表-分页列表查询")
+    @ApiOperation(value = "广告主信息表-分页列表查询", notes = "广告主信息表-分页列表查询")
+    @GetMapping(value = "/list")
+    public Result<IPage<Advertiser>> queryPageList(Advertiser advertiser,
+                                                   @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
+                                                   @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
+                                                   HttpServletRequest req) {
+        Result<IPage<Advertiser>> result = new Result<IPage<Advertiser>>();
+        QueryWrapper<Advertiser> queryWrapper = QueryGenerator.initQueryWrapper(advertiser, req.getParameterMap());
+        Page<Advertiser> page = new Page<Advertiser>(pageNo, pageSize);
+        IPage<Advertiser> pageList = advertiserService.page(page, queryWrapper);
         if (pageList != null && pageList.getRecords() != null && pageList.getRecords().size() > 0) {
             List<Advertiser> list = new ArrayList<>();
             for (int i = 0; i < pageList.getRecords().size(); i++) {
@@ -81,184 +84,189 @@ public class AdvertiserController {
             }
             pageList.setRecords(list);
         }
-		result.setSuccess(true);
-		result.setResult(pageList);
-		return result;
-	}
-	
-	/**
-	  *   添加
-	 * @param advertiser
-	 * @return
-	 */
-	@AutoLog(value = "广告主信息表-添加")
-	@ApiOperation(value="广告主信息表-添加", notes="广告主信息表-添加")
-	@PostMapping(value = "/add")
-	public Result<Advertiser> add(@RequestBody Advertiser advertiser) {
-		Result<Advertiser> result = new Result<Advertiser>();
-		try {
-			advertiserService.save(advertiser);
-			result.success("添加成功!");
-		} catch (Exception e) {
-			log.error(e.getMessage(),e);
-			result.error500("操作失败");
-		}
-		return result;
-	}
-	
-	/**
-	  *  编辑
-	 * @param advertiser
-	 * @return
-	 */
-	@AutoLog(value = "广告主信息表-编辑")
-	@ApiOperation(value="广告主信息表-编辑", notes="广告主信息表-编辑")
-	@PutMapping(value = "/edit")
-	public Result<Advertiser> edit(@RequestBody Advertiser advertiser) {
-		Result<Advertiser> result = new Result<Advertiser>();
-		Advertiser advertiserEntity = advertiserService.getById(advertiser.getId());
-		if(advertiserEntity==null) {
-			result.error500("未找到对应实体");
-		}else {
-			boolean ok = advertiserService.updateById(advertiser);
-			//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<Advertiser> delete(@RequestParam(name="id",required=true) String id) {
-		Result<Advertiser> result = new Result<Advertiser>();
-		Advertiser advertiser = advertiserService.getById(id);
-		if(advertiser==null) {
-			result.error500("未找到对应实体");
-		}else {
-			boolean ok = advertiserService.removeById(id);
-			if(ok) {
-				result.success("删除成功!");
-			}
-		}
-		
-		return result;
-	}
-	
-	/**
-	  *  批量删除
-	 * @param ids
-	 * @return
-	 */
-	@AutoLog(value = "广告主信息表-批量删除")
-	@ApiOperation(value="广告主信息表-批量删除", notes="广告主信息表-批量删除")
-	@DeleteMapping(value = "/deleteBatch")
-	public Result<Advertiser> deleteBatch(@RequestParam(name="ids",required=true) String ids) {
-		Result<Advertiser> result = new Result<Advertiser>();
-		if(ids==null || "".equals(ids.trim())) {
-			result.error500("参数不识别!");
-		}else {
-			this.advertiserService.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<Advertiser> queryById(@RequestParam(name="id",required=true) String id) {
-		Result<Advertiser> result = new Result<Advertiser>();
-		Advertiser advertiser = advertiserService.getById(id);
-		if(advertiser==null) {
-			result.error500("未找到对应实体");
-		}else {
-			result.setResult(advertiser);
-			result.setSuccess(true);
-		}
-		return result;
-	}
+        result.setSuccess(true);
+        result.setResult(pageList);
+        return result;
+    }
+
+    /**
+     * 添加
+     *
+     * @param advertiser
+     * @return
+     */
+    @AutoLog(value = "广告主信息表-添加")
+    @ApiOperation(value = "广告主信息表-添加", notes = "广告主信息表-添加")
+    @PostMapping(value = "/add")
+    public Result<Advertiser> add(@RequestBody Advertiser advertiser) {
+        Result<Advertiser> result = new Result<Advertiser>();
+        try {
+            advertiserService.save(advertiser);
+            result.success("添加成功!");
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+            result.error500("操作失败");
+        }
+        return result;
+    }
 
-  /**
-      * 导出excel
-   *
-   * @param request
-   * @param response
-   */
-  @RequestMapping(value = "/exportXls")
-  public ModelAndView exportXls(HttpServletRequest request, HttpServletResponse response) {
-      // Step.1 组装查询条件
-      QueryWrapper<Advertiser> queryWrapper = null;
-      try {
-          String paramsStr = request.getParameter("paramsStr");
-          if (oConvertUtils.isNotEmpty(paramsStr)) {
-              String deString = URLDecoder.decode(paramsStr, "UTF-8");
-              Advertiser advertiser = JSON.parseObject(deString, Advertiser.class);
-              queryWrapper = QueryGenerator.initQueryWrapper(advertiser, request.getParameterMap());
-          }
-      } catch (UnsupportedEncodingException e) {
-          e.printStackTrace();
-      }
+    /**
+     * 编辑
+     *
+     * @param advertiser
+     * @return
+     */
+    @AutoLog(value = "广告主信息表-编辑")
+    @ApiOperation(value = "广告主信息表-编辑", notes = "广告主信息表-编辑")
+    @PutMapping(value = "/edit")
+    public Result<Advertiser> edit(@RequestBody Advertiser advertiser) {
+        Result<Advertiser> result = new Result<Advertiser>();
+        Advertiser advertiserEntity = advertiserService.getById(advertiser.getId());
+        if (advertiserEntity == null) {
+            result.error500("未找到对应实体");
+        } else {
+            boolean ok = advertiserService.updateById(advertiser);
+            //TODO 返回false说明什么?
+            if (ok) {
+                result.success("修改成功!");
+            }
+        }
 
-      //Step.2 AutoPoi 导出Excel
-      ModelAndView mv = new ModelAndView(new JeecgEntityExcelView());
-      List<Advertiser> pageList = advertiserService.list(queryWrapper);
-      //导出文件名称
-      mv.addObject(NormalExcelConstants.FILE_NAME, "广告主信息表列表");
-      mv.addObject(NormalExcelConstants.CLASS, Advertiser.class);
-      mv.addObject(NormalExcelConstants.PARAMS, new ExportParams("广告主信息表列表数据", "导出人:Jeecg", "导出信息"));
-      mv.addObject(NormalExcelConstants.DATA_LIST, pageList);
-      return mv;
-  }
+        return result;
+    }
 
-  /**
-      * 通过excel导入数据
-   *
-   * @param request
-   * @param response
-   * @return
-   */
-  @RequestMapping(value = "/importExcel", method = RequestMethod.POST)
-  public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {
-      MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
-      Map<String, MultipartFile> fileMap = multipartRequest.getFileMap();
-      for (Map.Entry<String, MultipartFile> entity : fileMap.entrySet()) {
-          MultipartFile file = entity.getValue();// 获取上传文件对象
-          ImportParams params = new ImportParams();
-          params.setTitleRows(2);
-          params.setHeadRows(1);
-          params.setNeedSave(true);
-          try {
-              List<Advertiser> listAdvertisers = ExcelImportUtil.importExcel(file.getInputStream(), Advertiser.class, params);
-              for (Advertiser advertiserExcel : listAdvertisers) {
-                  advertiserService.save(advertiserExcel);
-              }
-              return Result.ok("文件导入成功!数据行数:" + listAdvertisers.size());
-          } catch (Exception e) {
-              log.error(e.getMessage(),e);
-              return Result.error("文件导入失败:"+e.getMessage());
-          } finally {
-              try {
-                  file.getInputStream().close();
-              } catch (IOException e) {
-                  e.printStackTrace();
-              }
-          }
-      }
-      return Result.ok("文件导入失败!");
-  }
+    /**
+     * 通过id删除
+     *
+     * @param id
+     * @return
+     */
+    @AutoLog(value = "广告主信息表-通过id删除")
+    @ApiOperation(value = "广告主信息表-通过id删除", notes = "广告主信息表-通过id删除")
+    @DeleteMapping(value = "/delete")
+    public Result<Advertiser> delete(@RequestParam(name = "id", required = true) String id) {
+        Result<Advertiser> result = new Result<Advertiser>();
+        Advertiser advertiser = advertiserService.getById(id);
+        if (advertiser == null) {
+            result.error500("未找到对应实体");
+        } else {
+            boolean ok = advertiserService.removeById(id);
+            if (ok) {
+                result.success("删除成功!");
+            }
+        }
+
+        return result;
+    }
+
+    /**
+     * 批量删除
+     *
+     * @param ids
+     * @return
+     */
+    @AutoLog(value = "广告主信息表-批量删除")
+    @ApiOperation(value = "广告主信息表-批量删除", notes = "广告主信息表-批量删除")
+    @DeleteMapping(value = "/deleteBatch")
+    public Result<Advertiser> deleteBatch(@RequestParam(name = "ids", required = true) String ids) {
+        Result<Advertiser> result = new Result<Advertiser>();
+        if (ids == null || "".equals(ids.trim())) {
+            result.error500("参数不识别!");
+        } else {
+            this.advertiserService.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<Advertiser> queryById(@RequestParam(name = "id", required = true) String id) {
+        Result<Advertiser> result = new Result<Advertiser>();
+        Advertiser advertiser = advertiserService.getById(id);
+        if (advertiser == null) {
+            result.error500("未找到对应实体");
+        } else {
+            result.setResult(advertiser);
+            result.setSuccess(true);
+        }
+        return result;
+    }
+
+    /**
+     * 导出excel
+     *
+     * @param request
+     * @param response
+     */
+    @RequestMapping(value = "/exportXls")
+    public ModelAndView exportXls(HttpServletRequest request, HttpServletResponse response) {
+        // Step.1 组装查询条件
+        QueryWrapper<Advertiser> queryWrapper = null;
+        try {
+            String paramsStr = request.getParameter("paramsStr");
+            if (oConvertUtils.isNotEmpty(paramsStr)) {
+                String deString = URLDecoder.decode(paramsStr, "UTF-8");
+                Advertiser advertiser = JSON.parseObject(deString, Advertiser.class);
+                queryWrapper = QueryGenerator.initQueryWrapper(advertiser, request.getParameterMap());
+            }
+        } catch (UnsupportedEncodingException e) {
+            e.printStackTrace();
+        }
+
+        //Step.2 AutoPoi 导出Excel
+        ModelAndView mv = new ModelAndView(new JeecgEntityExcelView());
+        List<Advertiser> pageList = advertiserService.list(queryWrapper);
+        //导出文件名称
+        mv.addObject(NormalExcelConstants.FILE_NAME, "广告主信息表列表");
+        mv.addObject(NormalExcelConstants.CLASS, Advertiser.class);
+        mv.addObject(NormalExcelConstants.PARAMS, new ExportParams("广告主信息表列表数据", "导出人:Jeecg", "导出信息"));
+        mv.addObject(NormalExcelConstants.DATA_LIST, pageList);
+        return mv;
+    }
+
+    /**
+     * 通过excel导入数据
+     *
+     * @param request
+     * @param response
+     * @return
+     */
+    @RequestMapping(value = "/importExcel", method = RequestMethod.POST)
+    public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {
+        MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
+        Map<String, MultipartFile> fileMap = multipartRequest.getFileMap();
+        for (Map.Entry<String, MultipartFile> entity : fileMap.entrySet()) {
+            // 获取上传文件对象
+            MultipartFile file = entity.getValue();
+            ImportParams params = new ImportParams();
+            params.setTitleRows(2);
+            params.setHeadRows(1);
+            params.setNeedSave(true);
+            try {
+                List<Advertiser> listAdvertisers = ExcelImportUtil.importExcel(file.getInputStream(), Advertiser.class, params);
+                for (Advertiser advertiserExcel : listAdvertisers) {
+                    advertiserService.save(advertiserExcel);
+                }
+                return Result.ok("文件导入成功!数据行数:" + listAdvertisers.size());
+            } catch (Exception e) {
+                log.error(e.getMessage(), e);
+                return Result.error("文件导入失败:" + e.getMessage());
+            } finally {
+                try {
+                    file.getInputStream().close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+        return Result.ok("文件导入失败!");
+    }
 }

+ 202 - 195
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/controller/AuthTaskController.java

@@ -33,211 +33,218 @@ import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
 
- /**
-  * TODO 相关AuthTask 需要删除
+/**
+ * TODO 相关AuthTask 需要删除
+ *
  * @Description: 关联用户分配
  * @Author: jeecg-boot
- * @Date:   2019-07-31
+ * @Date: 2019-07-31
  * @Version: V1.0
  */
 @Slf4j
-@Api(tags="关联用户分配")
+@Api(tags = "关联用户分配")
 @RestController
 @RequestMapping("/ctop/authTask")
 public class AuthTaskController {
-	@Autowired
-	private IAuthTaskService authTaskService;
-	
-	/**
-	  * 分页列表查询
-	 * @param authTask
-	 * @param pageNo
-	 * @param pageSize
-	 * @param req
-	 * @return
-	 */
-	@AutoLog(value = "关联用户分配-分页列表查询")
-	@ApiOperation(value="关联用户分配-分页列表查询", notes="关联用户分配-分页列表查询")
-	@GetMapping(value = "/list")
-	public Result<IPage<AuthTask>> queryPageList(AuthTask authTask,
-									  @RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
-									  @RequestParam(name="pageSize", defaultValue="10") Integer pageSize,
-									  HttpServletRequest req) {
-		Result<IPage<AuthTask>> result = new Result<IPage<AuthTask>>();
-		QueryWrapper<AuthTask> queryWrapper = QueryGenerator.initQueryWrapper(authTask, req.getParameterMap());
-		Page<AuthTask> page = new Page<AuthTask>(pageNo, pageSize);
-		IPage<AuthTask> pageList = authTaskService.page(page, queryWrapper);
-		result.setSuccess(true);
-		result.setResult(pageList);
-		return result;
-	}
-	
-	/**
-	  *   添加
-	 * @param authTask
-	 * @return
-	 */
-	@AutoLog(value = "关联用户分配-添加")
-	@ApiOperation(value="关联用户分配-添加", notes="关联用户分配-添加")
-	@PostMapping(value = "/add")
-	public Result<AuthTask> add(@RequestBody AuthTask authTask) {
-		Result<AuthTask> result = new Result<AuthTask>();
-		try {
-			authTaskService.save(authTask);
-			result.success("添加成功!");
-		} catch (Exception e) {
-			log.error(e.getMessage(),e);
-			result.error500("操作失败");
-		}
-		return result;
-	}
-	
-	/**
-	  *  编辑
-	 * @param authTask
-	 * @return
-	 */
-	@AutoLog(value = "关联用户分配-编辑")
-	@ApiOperation(value="关联用户分配-编辑", notes="关联用户分配-编辑")
-	@PutMapping(value = "/edit")
-	public Result<AuthTask> edit(@RequestBody AuthTask authTask) {
-		Result<AuthTask> result = new Result<AuthTask>();
-		AuthTask authTaskEntity = authTaskService.getById(authTask.getId());
-		if(authTaskEntity==null) {
-			result.error500("未找到对应实体");
-		}else {
-			boolean ok = authTaskService.updateById(authTask);
-			//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 {
-			authTaskService.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<AuthTask> deleteBatch(@RequestParam(name="ids",required=true) String ids) {
-		Result<AuthTask> result = new Result<AuthTask>();
-		if(ids==null || "".equals(ids.trim())) {
-			result.error500("参数不识别!");
-		}else {
-			this.authTaskService.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<AuthTask> queryById(@RequestParam(name="id",required=true) String id) {
-		Result<AuthTask> result = new Result<AuthTask>();
-		AuthTask authTask = authTaskService.getById(id);
-		if(authTask==null) {
-			result.error500("未找到对应实体");
-		}else {
-			result.setResult(authTask);
-			result.setSuccess(true);
-		}
-		return result;
-	}
+    @Autowired
+    private IAuthTaskService authTaskService;
 
-  /**
-      * 导出excel
-   *
-   * @param request
-   * @param response
-   */
-  @RequestMapping(value = "/exportXls")
-  public ModelAndView exportXls(HttpServletRequest request, HttpServletResponse response) {
-      // Step.1 组装查询条件
-      QueryWrapper<AuthTask> queryWrapper = null;
-      try {
-          String paramsStr = request.getParameter("paramsStr");
-          if (oConvertUtils.isNotEmpty(paramsStr)) {
-              String deString = URLDecoder.decode(paramsStr, "UTF-8");
-              AuthTask authTask = JSON.parseObject(deString, AuthTask.class);
-              queryWrapper = QueryGenerator.initQueryWrapper(authTask, request.getParameterMap());
-          }
-      } catch (UnsupportedEncodingException e) {
-          e.printStackTrace();
-      }
+    /**
+     * 分页列表查询
+     *
+     * @param authTask
+     * @param pageNo
+     * @param pageSize
+     * @param req
+     * @return
+     */
+    @AutoLog(value = "关联用户分配-分页列表查询")
+    @ApiOperation(value = "关联用户分配-分页列表查询", notes = "关联用户分配-分页列表查询")
+    @GetMapping(value = "/list")
+    public Result<IPage<AuthTask>> queryPageList(AuthTask authTask,
+                                                 @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
+                                                 @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
+                                                 HttpServletRequest req) {
+        Result<IPage<AuthTask>> result = new Result<IPage<AuthTask>>();
+        QueryWrapper<AuthTask> queryWrapper = QueryGenerator.initQueryWrapper(authTask, req.getParameterMap());
+        Page<AuthTask> page = new Page<AuthTask>(pageNo, pageSize);
+        IPage<AuthTask> pageList = authTaskService.page(page, queryWrapper);
+        result.setSuccess(true);
+        result.setResult(pageList);
+        return result;
+    }
 
-      //Step.2 AutoPoi 导出Excel
-      ModelAndView mv = new ModelAndView(new JeecgEntityExcelView());
-      List<AuthTask> pageList = authTaskService.list(queryWrapper);
-      //导出文件名称
-      mv.addObject(NormalExcelConstants.FILE_NAME, "关联用户分配列表");
-      mv.addObject(NormalExcelConstants.CLASS, AuthTask.class);
-      mv.addObject(NormalExcelConstants.PARAMS, new ExportParams("关联用户分配列表数据", "导出人:Jeecg", "导出信息"));
-      mv.addObject(NormalExcelConstants.DATA_LIST, pageList);
-      return mv;
-  }
+    /**
+     * 添加
+     *
+     * @param authTask
+     * @return
+     */
+    @AutoLog(value = "关联用户分配-添加")
+    @ApiOperation(value = "关联用户分配-添加", notes = "关联用户分配-添加")
+    @PostMapping(value = "/add")
+    public Result<AuthTask> add(@RequestBody AuthTask authTask) {
+        Result<AuthTask> result = new Result<AuthTask>();
+        try {
+            authTaskService.save(authTask);
+            result.success("添加成功!");
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+            result.error500("操作失败");
+        }
+        return result;
+    }
 
-  /**
-      * 通过excel导入数据
-   *
-   * @param request
-   * @param response
-   * @return
-   */
-  @RequestMapping(value = "/importExcel", method = RequestMethod.POST)
-  public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {
-      MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
-      Map<String, MultipartFile> fileMap = multipartRequest.getFileMap();
-      for (Map.Entry<String, MultipartFile> entity : fileMap.entrySet()) {
-          MultipartFile file = entity.getValue();// 获取上传文件对象
-          ImportParams params = new ImportParams();
-          params.setTitleRows(2);
-          params.setHeadRows(1);
-          params.setNeedSave(true);
-          try {
-              List<AuthTask> listAuthTasks = ExcelImportUtil.importExcel(file.getInputStream(), AuthTask.class, params);
-              authTaskService.saveBatch(listAuthTasks);
-              return Result.ok("文件导入成功!数据行数:" + listAuthTasks.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("文件导入失败!");
-  }
+    /**
+     * 编辑
+     *
+     * @param authTask
+     * @return
+     */
+    @AutoLog(value = "关联用户分配-编辑")
+    @ApiOperation(value = "关联用户分配-编辑", notes = "关联用户分配-编辑")
+    @PutMapping(value = "/edit")
+    public Result<AuthTask> edit(@RequestBody AuthTask authTask) {
+        Result<AuthTask> result = new Result<AuthTask>();
+        AuthTask authTaskEntity = authTaskService.getById(authTask.getId());
+        if (authTaskEntity == null) {
+            result.error500("未找到对应实体");
+        } else {
+            boolean ok = authTaskService.updateById(authTask);
+            //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 {
+            authTaskService.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<AuthTask> deleteBatch(@RequestParam(name = "ids", required = true) String ids) {
+        Result<AuthTask> result = new Result<AuthTask>();
+        if (ids == null || "".equals(ids.trim())) {
+            result.error500("参数不识别!");
+        } else {
+            this.authTaskService.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<AuthTask> queryById(@RequestParam(name = "id", required = true) String id) {
+        Result<AuthTask> result = new Result<AuthTask>();
+        AuthTask authTask = authTaskService.getById(id);
+        if (authTask == null) {
+            result.error500("未找到对应实体");
+        } else {
+            result.setResult(authTask);
+            result.setSuccess(true);
+        }
+        return result;
+    }
+
+    /**
+     * 导出excel
+     *
+     * @param request
+     * @param response
+     */
+    @RequestMapping(value = "/exportXls")
+    public ModelAndView exportXls(HttpServletRequest request, HttpServletResponse response) {
+        // Step.1 组装查询条件
+        QueryWrapper<AuthTask> queryWrapper = null;
+        try {
+            String paramsStr = request.getParameter("paramsStr");
+            if (oConvertUtils.isNotEmpty(paramsStr)) {
+                String deString = URLDecoder.decode(paramsStr, "UTF-8");
+                AuthTask authTask = JSON.parseObject(deString, AuthTask.class);
+                queryWrapper = QueryGenerator.initQueryWrapper(authTask, request.getParameterMap());
+            }
+        } catch (UnsupportedEncodingException e) {
+            e.printStackTrace();
+        }
+
+        //Step.2 AutoPoi 导出Excel
+        ModelAndView mv = new ModelAndView(new JeecgEntityExcelView());
+        List<AuthTask> pageList = authTaskService.list(queryWrapper);
+        //导出文件名称
+        mv.addObject(NormalExcelConstants.FILE_NAME, "关联用户分配列表");
+        mv.addObject(NormalExcelConstants.CLASS, AuthTask.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<AuthTask> listAuthTasks = ExcelImportUtil.importExcel(file.getInputStream(), AuthTask.class, params);
+                authTaskService.saveBatch(listAuthTasks);
+                return Result.ok("文件导入成功!数据行数:" + listAuthTasks.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 - 2
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/controller/BindAccountAuthController.java

@@ -62,7 +62,6 @@ public class BindAccountAuthController {
         try {
             String advertiserId = json.getString("advertiserId");
             if (Check.isNull(advertiserId)) {
-//                System.err.println("advertiserId不能为空");
                 result.setSuccess(false);
                 return result;
             }
@@ -263,7 +262,7 @@ public class BindAccountAuthController {
         MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
         Map<String, MultipartFile> fileMap = multipartRequest.getFileMap();
         for (Map.Entry<String, MultipartFile> entity : fileMap.entrySet()) {
-            MultipartFile file = entity.getValue();// 获取上传文件对象
+            MultipartFile file = entity.getValue();
             ImportParams params = new ImportParams();
             params.setTitleRows(2);
             params.setHeadRows(1);

+ 17 - 12
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/controller/BindAccountLoginController.java

@@ -65,24 +65,30 @@ public class BindAccountLoginController {
      */
     @PostMapping(value = "/login")
     public Result<IPage<BindAccountLogin>> login(@RequestBody JSONObject json) {
-        Result<IPage<BindAccountLogin>> result = new Result<IPage<BindAccountLogin>>();
+        Result<IPage<BindAccountLogin>> result = new Result<>();
         String advertiserId = json.getString("advertiserId");
         if (Check.isNull(advertiserId)) {
             System.err.println("advertiserId不能为空");
             result.setSuccess(false);
             return result;
         }
+        //创建人
+        String userId = json.getString("userId");
         String password = json.getString("password");
         String loginType = json.getString("loginType");
-        String accountName = json.getString("accountName"); //账号
-        boolean trueOrFalse = bindAccountLoginService.bindLogin(advertiserId, accountName, password, loginType);
+        //账号
+        String accountName = json.getString("accountName");
+        boolean trueOrFalse = bindAccountLoginService.bindLogin(advertiserId, accountName, password, loginType, userId);
         if (trueOrFalse) {
             String realName = json.getString("realName");
-            String departmentId = json.getString("departmentId"); //部门id
-            String distributionName = json.getString("distributionName");//指定分配人姓名
-            String advertiserName = json.getString("advertiser_name"); // 广告主名称
-            String mediaId = json.getString("mediaId"); // 媒体类型: 1 头条 2 快手
-            String userId = json.getString("userId"); //创建人
+            //部门id
+            String departmentId = json.getString("departmentId");
+            //指定分配人姓名
+            String distributionName = json.getString("distributionName");
+            // 广告主名称
+            String advertiserName = json.getString("advertiser_name");
+            // 媒体类型: 1 头条 2 快手
+            String mediaId = json.getString("mediaId");
             UserAllocation userAllocation = new UserAllocation();
             userAllocation.setDistributionName(distributionName);
             userAllocation.setUserId(userId);
@@ -119,9 +125,9 @@ public class BindAccountLoginController {
                                                          @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
                                                          @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
                                                          HttpServletRequest req) {
-        Result<IPage<BindAccountLogin>> result = new Result<IPage<BindAccountLogin>>();
+        Result<IPage<BindAccountLogin>> result = new Result<>();
         QueryWrapper<BindAccountLogin> queryWrapper = QueryGenerator.initQueryWrapper(bindAccountLogin, req.getParameterMap());
-        Page<BindAccountLogin> page = new Page<BindAccountLogin>(pageNo, pageSize);
+        Page<BindAccountLogin> page = new Page<>(pageNo, pageSize);
         IPage<BindAccountLogin> pageList = bindAccountLoginService.page(page, queryWrapper);
         result.setSuccess(true);
         result.setResult(pageList);
@@ -138,7 +144,7 @@ public class BindAccountLoginController {
     @ApiOperation(value = "账号绑定-登陆-添加", notes = "账号绑定-登陆-添加")
     @PostMapping(value = "/add")
     public Result<BindAccountLogin> add(@RequestBody BindAccountLogin bindAccountLogin) {
-        Result<BindAccountLogin> result = new Result<BindAccountLogin>();
+        Result<BindAccountLogin> result = new Result<>();
         try {
             bindAccountLoginService.save(bindAccountLogin);
             result.success("添加成功!");
@@ -165,7 +171,6 @@ public class BindAccountLoginController {
             result.error500("未找到对应实体");
         } else {
             boolean ok = bindAccountLoginService.updateById(bindAccountLogin);
-            //TODO 返回false说明什么?
             if (ok) {
                 result.success("修改成功!");
             }

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

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

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

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

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

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

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

@@ -1,7 +1,5 @@
 package org.jeecg.modules.ctop.controller;
 
-import com.alibaba.fastjson.JSONArray;
-import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -9,12 +7,17 @@ import org.apache.shiro.SecurityUtils;
 import org.jeecg.common.api.vo.Result;
 import org.jeecg.common.system.query.QueryGenerator;
 import org.jeecg.common.system.vo.LoginUser;
-import org.jeecg.modules.ctop.entity.*;
-import org.jeecg.modules.ctop.service.*;
+import org.jeecg.modules.ctop.entity.ByteDanceCustomAudience;
+import org.jeecg.modules.ctop.service.IByteDanceAdvertiserDataService;
+import org.jeecg.modules.ctop.service.IByteDanceCustomAudienceService;
+import org.jeecg.modules.ctop.service.IFileInfoService;
 import org.jeecg.modules.system.entity.SysDictItem;
 import org.jeecg.modules.system.service.ISysDictItemService;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.*;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
 
 import javax.servlet.http.HttpServletRequest;
 import java.util.Map;
@@ -29,6 +32,12 @@ import java.util.Map;
 public class ByteDanceAdvertiserPostController {
     @Autowired
     private IByteDanceAdvertiserDataService advertiserDataService;
+    @Autowired
+    private IFileInfoService fileInfoService;
+    @Autowired
+    private IByteDanceCustomAudienceService audienceService;
+    @Autowired
+    private ISysDictItemService sysDictItemService;
 
     /**
      * 1:获取广告主信息
@@ -121,8 +130,6 @@ public class ByteDanceAdvertiserPostController {
         return advertiserDataService.getAdvertiserCreativeMaterial(accountId, creativeIds);
     }
 
-    @Autowired
-    private IByteDanceCreativeService creativeService;
     /**
      * 12:广告组更新状态信息 @param accountId 本平台广告主id
      */
@@ -174,9 +181,6 @@ public class ByteDanceAdvertiserPostController {
         return fileInfoService.getIndustryList(accountId, level);
     }
 
-    @Autowired
-    private IFileInfoService fileInfoService;
-
     /**
      * @param audience
      * @param pageNo
@@ -200,10 +204,6 @@ public class ByteDanceAdvertiserPostController {
         return result;
     }
 
-    @Autowired
-    private IByteDanceCustomAudienceService audienceService;
-
-
     /**
      * @param sysDictItem
      * @param pageNo
@@ -224,9 +224,4 @@ public class ByteDanceAdvertiserPostController {
         result.setResult(pageList);
         return result;
     }
-
-    @Autowired
-    private ISysDictItemService sysDictItemService;
-    @Autowired
-    private IByteDanceAdvertisePlanService advertisePlanService;
 }

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

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

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

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

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

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

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

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

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

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

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

@@ -63,9 +63,9 @@ public class ByteDanceCreativeTemplateController {
                                                                   @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
                                                                   @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
                                                                   HttpServletRequest req) {
-        Result<IPage<ByteDanceCreativeTemplate>> result = new Result<IPage<ByteDanceCreativeTemplate>>();
+        Result<IPage<ByteDanceCreativeTemplate>> result = new Result<>();
         QueryWrapper<ByteDanceCreativeTemplate> queryWrapper = QueryGenerator.initQueryWrapper(byteDanceCreativeTemplate, req.getParameterMap());
-        Page<ByteDanceCreativeTemplate> page = new Page<ByteDanceCreativeTemplate>(pageNo, pageSize);
+        Page<ByteDanceCreativeTemplate> page = new Page<>(pageNo, pageSize);
         IPage<ByteDanceCreativeTemplate> pageList = byteDanceCreativeTemplateService.page(page, queryWrapper);
         result.setSuccess(true);
         result.setResult(pageList);
@@ -82,7 +82,7 @@ public class ByteDanceCreativeTemplateController {
     @ApiOperation(value = "广告创意模板-添加", notes = "广告创意模板-添加")
     @PostMapping(value = "/add")
     public Result<ByteDanceCreativeTemplate> add(@RequestBody ByteDanceCreativeTemplate byteDanceCreativeTemplate) {
-        Result<ByteDanceCreativeTemplate> result = new Result<ByteDanceCreativeTemplate>();
+        Result<ByteDanceCreativeTemplate> result = new Result<>();
         try {
             byteDanceCreativeTemplateService.save(byteDanceCreativeTemplate);
             result.success("添加成功!");
@@ -103,7 +103,7 @@ public class ByteDanceCreativeTemplateController {
     @ApiOperation(value = "广告创意模板-编辑", notes = "广告创意模板-编辑")
     @PutMapping(value = "/edit")
     public Result<ByteDanceCreativeTemplate> edit(@RequestBody ByteDanceCreativeTemplate byteDanceCreativeTemplate) {
-        Result<ByteDanceCreativeTemplate> result = new Result<ByteDanceCreativeTemplate>();
+        Result<ByteDanceCreativeTemplate> result = new Result<>();
         ByteDanceCreativeTemplate byteDanceCreativeTemplateEntity = byteDanceCreativeTemplateService.getById(byteDanceCreativeTemplate.getId());
         if (byteDanceCreativeTemplateEntity == null) {
             result.error500("未找到对应实体");
@@ -147,7 +147,7 @@ public class ByteDanceCreativeTemplateController {
     @ApiOperation(value = "广告创意模板-批量删除", notes = "广告创意模板-批量删除")
     @DeleteMapping(value = "/deleteBatch")
     public Result<ByteDanceCreativeTemplate> deleteBatch(@RequestParam(name = "ids", required = true) String ids) {
-        Result<ByteDanceCreativeTemplate> result = new Result<ByteDanceCreativeTemplate>();
+        Result<ByteDanceCreativeTemplate> result = new Result<>();
         if (ids == null || "".equals(ids.trim())) {
             result.error500("参数不识别!");
         } else {
@@ -167,7 +167,7 @@ public class ByteDanceCreativeTemplateController {
     @ApiOperation(value = "广告创意模板-通过id查询", notes = "广告创意模板-通过id查询")
     @GetMapping(value = "/queryById")
     public Result<ByteDanceCreativeTemplate> queryById(@RequestParam(name = "id", required = true) String id) {
-        Result<ByteDanceCreativeTemplate> result = new Result<ByteDanceCreativeTemplate>();
+        Result<ByteDanceCreativeTemplate> result = new Result<>();
         ByteDanceCreativeTemplate byteDanceCreativeTemplate = byteDanceCreativeTemplateService.getById(id);
         if (byteDanceCreativeTemplate == null) {
             result.error500("未找到对应实体");
@@ -222,7 +222,8 @@ public class ByteDanceCreativeTemplateController {
         MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
         Map<String, MultipartFile> fileMap = multipartRequest.getFileMap();
         for (Map.Entry<String, MultipartFile> entity : fileMap.entrySet()) {
-            MultipartFile file = entity.getValue();// 获取上传文件对象
+            // 获取上传文件对象
+            MultipartFile file = entity.getValue();
             ImportParams params = new ImportParams();
             params.setTitleRows(2);
             params.setHeadRows(1);
@@ -244,5 +245,4 @@ public class ByteDanceCreativeTemplateController {
         }
         return Result.ok("文件导入失败!");
     }
-
 }

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

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

+ 100 - 45
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/controller/ByteDanceTemplateController.java

@@ -5,8 +5,10 @@ import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import lombok.extern.slf4j.Slf4j;
 import org.apache.shiro.SecurityUtils;
 import org.jeecg.common.api.vo.Result;
+import org.jeecg.common.constant.CtopAdConstant;
 import org.jeecg.common.system.query.QueryGenerator;
 import org.jeecg.common.system.vo.LoginUser;
 import org.jeecg.modules.ctop.entity.*;
@@ -20,27 +22,50 @@ import javax.servlet.http.HttpServletResponse;
 import java.util.HashMap;
 import java.util.Map;
 
+@Slf4j
 @RestController
 @RequestMapping("template")
 public class ByteDanceTemplateController {
+    @Autowired
+    private IByteDanceCreativeService creativeService;
+    @Autowired
+    private IUserAllocationService userAllocationService;
+    @Autowired
+    private IBytedanceUrlInfoService urlInfoService;
+    @Autowired
+    private IFileInfoService fileInfoService;
+    @Autowired
+    private IByteDanceAdvertisePlanService planService;
+    @Autowired
+    private IByteDanceCampaignService campaignService;
+    @Autowired
+    private IByteDanceUserOrientationTemplateService orientationTemplateService;
+    @Autowired
+    private IByteDanceCampaignTemplateService campaignTemplateService;
+    @Autowired
+    private IByteDanceBudgetTemplateService budgetTemplateService;
+    @Autowired
+    private IBytedanceDeliveryTargetTemplateService deliveryTargetTemplateService;
+    @Autowired
+    private IBytedanceAdvertisePlanTemplateService advertisePlanTemplateService;
+
     /**
      * 广告组模板
      *
-     * @param template
-     * @param req
-     * @return
+     * @param template 广告组模板信息
+     * @return map
      */
     @PostMapping("campaign/insert")
-    public Map<String, Object> campaignTemplateInsert(@RequestBody ByteDanceCampaignTemplate template, HttpServletRequest req) {
+    public Map<String, Object> campaignTemplateInsert(@RequestBody ByteDanceCampaignTemplate template) {
         return campaignTemplateService.insertTemplate(template);
     }
 
     /**
      * 智能封面
      *
-     * @param accountId
-     * @param videoId
-     * @return
+     * @param accountId 广告主id
+     * @param videoId 视频id
+     * @return map
      */
     @GetMapping("cover/suggest")
     public Map<String, Object> suggestCover(String accountId, String videoId) {
@@ -50,46 +75,54 @@ public class ByteDanceTemplateController {
     /**
      * 预算与出价模板
      *
-     * @param template
-     * @param request
-     * @param response
-     * @return
+     * @param template 预算与出价模板信息
+     * @return map
      */
     @PostMapping("budget/insert")
-    public Map<String, Object> budgetTemplateInsert(@RequestBody ByteDanceBudgetTemplate template, HttpServletRequest request, HttpServletResponse response) {
+    public Map<String, Object> budgetTemplateInsert(@RequestBody ByteDanceBudgetTemplate template) {
         return budgetTemplateService.insertTemplate(template);
     }
 
     /**
      * 投放目标
      *
-     * @param template
-     * @param req
-     * @return
+     * @param template 投放目标信息
+     * @return map
      */
     @PostMapping("deliverytarget/insert")
-    public Map<String, Object> diliverytargetTemplateInsert(@RequestBody BytedanceDeliveryTargetTemplate template, HttpServletRequest req) {
+    public Map<String, Object> diliverytargetTemplateInsert(@RequestBody BytedanceDeliveryTargetTemplate template) {
         return deliveryTargetTemplateService.insertTemplate(template);
     }
 
+    /**
+     * 获取投放目标信息
+     *
+     * @param targetId 投放目标id
+     * @return map
+     */
     @GetMapping("deliveryTarget/get")
     public Map<String, Object> diliverytargetTemplateGet(Long targetId) {
         return deliveryTargetTemplateService.get(targetId);
     }
+
     /**
      * 广告创意创建
-     *
-     * @param template
-     * @return
+     * @param template 广告创意信息
+     * @return map
      */
     @PostMapping("creative/insert")
     public Map<String, Object> creativeInsert(@RequestBody JSONObject template) {
         return creativeService.insertBatch(template);
     }
 
-    @Autowired
-    private IByteDanceCreativeService creativeService;
-
+    /**
+     * 获取快手授权用户信息列表
+     * @param userAllocation 用户信息
+     * @param pageNo 页码数
+     * @param pageSize 每页数据条数
+     * @param req 请求信息
+     * @return map
+     */
     @PostMapping(value = "allocation/list")
     public Result<IPage<UserAllocation>> queryPageList(@RequestBody UserAllocation userAllocation,
                                                        @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
@@ -107,7 +140,32 @@ public class ByteDanceTemplateController {
     }
 
     @Autowired
-    private IUserAllocationService userAllocationService;
+    private IBindAccountLoginService bindAccountLoginService;
+
+    /**
+     * 获取头条授权用户信息列表
+     *
+     * @param accountLogin
+     * @param pageNo
+     * @param pageSize
+     * @param req
+     * @return
+     */
+    @PostMapping(value = "bind/login/list")
+    public Result<IPage<BindAccountLogin>> queryBindLoginList(@RequestBody BindAccountLogin accountLogin,
+                                                              @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
+                                                              @RequestParam(name = "pageSize", defaultValue = "100") Integer pageSize,
+                                                              HttpServletRequest req) {
+        Result<IPage<BindAccountLogin>> result = new Result<>();
+        QueryWrapper<BindAccountLogin> queryWrapper = QueryGenerator.initQueryWrapper(accountLogin, req.getParameterMap());
+        LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();
+        queryWrapper.eq("user_id", user.getId()).eq("login_type", CtopAdConstant.PLATFORM_TYPE_BYTEDANCE_PY);
+        Page<BindAccountLogin> page = new Page<>(pageNo, pageSize);
+        IPage<BindAccountLogin> pageList = bindAccountLoginService.page(page, queryWrapper);
+        result.setSuccess(true);
+        result.setResult(pageList);
+        return result;
+    }
 
     /**
      * 用户定向
@@ -133,11 +191,10 @@ public class ByteDanceTemplateController {
         return urlInfoService.insertLink(urlInfo);
     }
 
-    @Autowired
-    private IBytedanceUrlInfoService urlInfoService;
     /**
      * 广告计划模板
-     *  方法废弃
+     * 方法废弃
+     *
      * @param template
      * @param req
      * @return
@@ -211,6 +268,17 @@ public class ByteDanceTemplateController {
     }
 
     /**
+     * @param accountId
+     * @param urlId     链接id
+     * @return 查询计划可用转化id
+     */
+    @GetMapping(value = "convert/list/url")
+    public Map<String, Object> convertListByUrlId(Long accountId, Long urlId) {
+        return planService.getAdConvertListByUrlId(accountId, urlId);
+    }
+
+
+    /**
      * @param req
      * @return
      * @功能:获取头条行业信息列表
@@ -220,9 +288,6 @@ public class ByteDanceTemplateController {
         return fileInfoService.getByteDanceIndustryList(req);
     }
 
-    @Autowired
-    private IFileInfoService fileInfoService;
-
     /**
      * @param pageNo
      * @param pageSize
@@ -243,11 +308,6 @@ public class ByteDanceTemplateController {
         return result;
     }
 
-    @Autowired
-    private IByteDanceAdvertisePlanService planService;
-    @Autowired
-    private IByteDanceCampaignService campaignService;
-
     /**
      * 投放目标
      *
@@ -270,17 +330,12 @@ public class ByteDanceTemplateController {
      */
     @GetMapping("site/list")
     public JSONObject getSiteList(Long accountId) {
-        return deliveryTargetTemplateService.getSiteList(accountId);
+        return fileInfoService.getSiteList(accountId);
+    }
+
+    @GetMapping("creative/words/get")
+    public Map<String, Object> getCreativeWords(Long accountId) {
+        return fileInfoService.getCreativeWords(accountId);
     }
-    @Autowired
-    private IByteDanceUserOrientationTemplateService orientationTemplateService;
-    @Autowired
-    private IByteDanceCampaignTemplateService campaignTemplateService;
-    @Autowired
-    private IByteDanceBudgetTemplateService budgetTemplateService;
-    @Autowired
-    private IBytedanceDeliveryTargetTemplateService deliveryTargetTemplateService;
-    @Autowired
-    private IBytedanceAdvertisePlanTemplateService advertisePlanTemplateService;
 
 }

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

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

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

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

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

@@ -10,9 +10,9 @@ import com.alibaba.fastjson.JSONObject;
 import constant.KuaishouInterfaceConstant;
 import org.apache.commons.lang.StringUtils;
 import org.jeecg.modules.ctop.entity.ByteDanceAdvertiser;
-import org.jeecg.modules.ctop.entity.CTopOauthToken;
+import org.jeecg.modules.ctop.entity.CtopOauthToken;
 import org.jeecg.modules.ctop.entity.UserAllocation;
-import org.jeecg.modules.ctop.mapper.CTopOauthTokenMapper;
+import org.jeecg.modules.ctop.mapper.CtopOauthTokenMapper;
 import org.jeecg.modules.ctop.mapper.UserAllocationMapper;
 import org.jeecg.modules.ctop.service.IBindAccountAuthService;
 import org.jeecg.modules.ctop.service.IByteDanceAdvertiserDataService;
@@ -40,7 +40,7 @@ public class CallbackController {
     private IKuaishouInterfaceService kuaishouInterfaceService;
 
     @Autowired
-    private CTopOauthTokenMapper cTopOauthTokenMapper;
+    private CtopOauthTokenMapper cTopOauthTokenMapper;
     @Autowired
     private IBindAccountAuthService bindAccountAuthService;
 
@@ -104,7 +104,7 @@ public class CallbackController {
                     if (i > 0) {
                         logger.info("同步分配用户表完成,task_id:{},accountId:{}", state, accountId);
                     }
-                    CTopOauthToken topOauthToken = new CTopOauthToken();
+                    CtopOauthToken topOauthToken = new CtopOauthToken();
                     Map<String, Object> deleteMap = new HashMap<>();
                     deleteMap.put("advertiser_id", advertiserId);
                     deleteMap.put("account_id", accountId);
@@ -155,7 +155,7 @@ public class CallbackController {
     private IByteDanceAdvertiserDataService advertiserDataService;
 
     public Map<String, Object> getByteDanceAccessToken(String authCode, String state) {
-        Map<String, Object> param = new HashMap<String, Object>();
+        Map<String, Object> param = new HashMap<>();
         param.put("app_id", PropertiesUtils.getValue("bytedance_config", "bytedance_appid"));
         param.put("secret", PropertiesUtils.getValue("bytedance_config", "bytedance_secret"));
         param.put("grant_type", "auth_code");
@@ -175,7 +175,7 @@ public class CallbackController {
                 logger.error("获取token失败,state:{},message:{}", state, message);
                 throw new Exception("token返回码异常");
             }
-            String advertiser_id = json.getString("advertiserId");//广告主id
+            String advertiserId = json.getString("advertiserId");//广告主id
             String mediaId = json.getString("mediaId"); // 媒体类型: 1 头条 2 快手
             String realName = json.getString("realName");
             String departmentId = json.getString("departmentId"); //部门id
@@ -184,9 +184,9 @@ public class CallbackController {
             String userId = json.getString("userId"); //创建人
 
             JSONObject data = resultObject.getJSONObject("data");
-            CTopOauthToken token = new CTopOauthToken(advertiser_id, data);
+            CtopOauthToken token = new CtopOauthToken(advertiserId, data);
             Map<String, Object> deleteMap = new HashMap<>();
-            deleteMap.put("advertiser_id", advertiser_id);
+            deleteMap.put("advertiser_id", advertiserId);
             deleteMap.put("account_id", token.getAccountId());
             cTopOauthTokenMapper.deleteByMap(deleteMap); //删除 广告主id下的相关授权信息
             cTopOauthTokenMapper.insert(token);
@@ -207,12 +207,12 @@ public class CallbackController {
             userAllocation.setAdvertiserName(advertiserName);
             userAllocation.setMediaId(mediaId);
             userAllocation.setAuthName(advertiserData.getName());
-            userAllocation.setAdvertiserId(advertiser_id);
+            userAllocation.setAdvertiserId(advertiserId);
             userAllocation.setCreateTime(new Date());
             userAllocation.setUpdateTime(new Date());
             allocationMapper.deleteById(userAllocation.getId());
             Map<String, Object> deleteUserMap = new HashMap<>();
-            deleteUserMap.put("advertiser_id", advertiser_id);
+            deleteUserMap.put("advertiser_id", advertiserId);
             deleteUserMap.put("account_id", token.getAccountId());
             allocationMapper.deleteByMap(deleteUserMap);
             int i = allocationMapper.insert(userAllocation);
@@ -220,7 +220,7 @@ public class CallbackController {
                 logger.info("同步分配用户表完成,task_id:{},accountId:{}", state, token.getAccountId());
 
             }
-            bindAccountAuthService.addBindAccount(token.getAccountId(), KuaishouInterfaceConstant.LOGIN_TYPE_BYTEDANCE, advertiser_id); //账号绑定
+            bindAccountAuthService.addBindAccount(token.getAccountId(), KuaishouInterfaceConstant.LOGIN_TYPE_BYTEDANCE, advertiserId); //账号绑定
             returnMap.put("code", 0);
             returnMap.put("desc", "success");
         } catch (Exception e) {

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

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

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

@@ -4,14 +4,13 @@ import com.alibaba.fastjson.JSONObject;
 import org.jeecg.common.util.DateUtils;
 import org.jeecg.common.util.ResultMapUtils;
 import org.jeecg.common.util.StatusCode;
-import org.jeecg.modules.ctop.entity.CTopOauthToken;
-import org.jeecg.modules.ctop.service.ICTopOauthTokenService;
+import org.jeecg.modules.ctop.entity.CtopOauthToken;
+import org.jeecg.modules.ctop.service.ICtopOauthTokenService;
 import org.jeecg.modules.ctop.service.IReportService;
 import org.jeecg.modules.kuaishou.service.IKuaishouInterfaceService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
-import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import java.io.*;
 import java.util.Date;
@@ -21,30 +20,54 @@ import java.util.Map;
 @RestController
 @RequestMapping("report")
 public class ReportController {
-    @GetMapping("advertiser")
-//    public Map<String, Object> advertiserReport(@RequestBody JSONObject conditions) {
-    public Map<String, Object> advertiserReport() {
-        JSONObject conditions = new JSONObject();
+    /**
+     * 头条广告主报表信息
+     * 只支持查询2016-10-26及以后的日期
+     * 单次获取最大条数1000
+     *
+     * @return
+     */
+    @GetMapping("bytedance/advertiser")
+    public Map<String, Object> advertiserReport(@RequestBody JSONObject conditions) {
         return reportService.getAdvertiserReport(conditions);
     }
 
+    /**
+     * 头条广告计划报表信息
+     * 只支持查询2016-10-26及以后的日期
+     * 单次获取最大条数1000
+     * @return
+     */
     @GetMapping("campaign")
-//    public Map<String, Object> campaignReport(@RequestBody JSONObject conditions) {
-    public Map<String, Object> campaignReport() {
-        JSONObject conditions = new JSONObject();
+    public Map<String, Object> campaignReport(@RequestBody JSONObject conditions) {
         return reportService.getCampaignReport(conditions);
     }
 
+    /**
+     * 头条广告计划报表信息
+     * @param conditions
+     * @return
+     */
     @GetMapping("ad")
     public Map<String, Object> adReport(@RequestBody JSONObject conditions) {
         return reportService.getAdReport(conditions);
     }
 
+    /**
+     * 头条广告创意报表信息
+     * @param conditions
+     * @return
+     */
     @GetMapping("creative")
     public Map<String, Object> creativeReport(@RequestBody JSONObject conditions) {
         return reportService.getCreativeReport(conditions);
     }
 
+    /**
+     * 代理商数据
+     * @param conditions
+     * @return
+     */
     @GetMapping("agent")
     public Map<String, Object> agentReport(@RequestBody JSONObject conditions) {
         return reportService.getAgentReport(conditions);
@@ -56,7 +79,7 @@ public class ReportController {
     @GetMapping("jietiao/kuaishou/insert")
     public Map<String, Object> jietiaoKuaishouInsert(String accountId) {
         Map<String, Object> result = new HashMap<>();
-        CTopOauthToken token = tokenService.getOauthTokenByAccountId(accountId);
+        CtopOauthToken token = tokenService.getOauthTokenByAccountId(accountId);
         Date now = new Date();
         String startDate = DateUtils.formatDate(now, "yyyy-MM-dd");
         kuaishouInterfaceService.getCampaignDailyReport(token.getAccessToken(), token.getAccountId(), startDate, startDate, 1000, 1);
@@ -64,7 +87,7 @@ public class ReportController {
     }
 
     @Autowired
-    private ICTopOauthTokenService tokenService;
+    private ICtopOauthTokenService tokenService;
     @Autowired
     private IKuaishouInterfaceService kuaishouInterfaceService;
 

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

@@ -0,0 +1,13 @@
+package org.jeecg.modules.ctop.controller;
+
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * 签章controller
+ */
+@RestController
+@RequestMapping("sign")
+public class SignController {
+
+}

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

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

@@ -4,9 +4,12 @@ import com.alibaba.fastjson.JSONObject;
 import org.jeecg.modules.ctop.service.ICreateInternalService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
+import java.util.Map;
+
 @RestController
 @RequestMapping("/test")
 public class TestController {
@@ -14,9 +17,7 @@ public class TestController {
     private ICreateInternalService createInternalService;
 
     @PostMapping(value = "/create")
-    public void authorization() {
-        JSONObject json = new JSONObject();
-        System.err.println(json);
-        createInternalService.createInternal(json);
+    public Map<String, Object> authorization(@RequestBody JSONObject jsonObject) {
+        return createInternalService.createInternal(jsonObject);
     }
 }

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

@@ -69,6 +69,7 @@ public class UserAllocationController {
         LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();
         QueryWrapper<UserAllocation> queryWrapper = QueryGenerator.initQueryWrapper(userAllocation, req.getParameterMap());
         queryWrapper.eq("user_id", user.getId());
+        queryWrapper.orderByDesc("id");
         Page<UserAllocation> page = new Page<UserAllocation>(pageNo, pageSize);
         IPage<UserAllocation> pageList = userAllocationService.page(page, queryWrapper);
         result.setSuccess(true);
@@ -226,7 +227,8 @@ public class UserAllocationController {
         MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
         Map<String, MultipartFile> fileMap = multipartRequest.getFileMap();
         for (Map.Entry<String, MultipartFile> entity : fileMap.entrySet()) {
-            MultipartFile file = entity.getValue();// 获取上传文件对象
+            // 获取上传文件对象
+            MultipartFile file = entity.getValue();
             ImportParams params = new ImportParams();
             params.setTitleRows(2);
             params.setHeadRows(1);

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

@@ -40,6 +40,18 @@ public class BindAccountLogin {
     @ApiModelProperty(value = "广告id")
     private String advertiserId;
     /**
+     * 广告id
+     */
+    @Excel(name = "平台账户id", width = 15)
+    @ApiModelProperty(value = "平台账户id")
+    private String accountId;
+    /**
+     * 广告id
+     */
+    @Excel(name = "用户Id", width = 15)
+    @ApiModelProperty(value = "用户id")
+    private String userId;
+    /**
      * 账号
      */
     @Excel(name = "账号", width = 15)

+ 2 - 2
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/entity/ByteDanceCampaign.java

@@ -157,7 +157,7 @@ public class ByteDanceCampaign {
 		this.updateTime = now;
     }
 
-	public ByteDanceCampaign(Long id, CTopOauthToken oauthToken, String campaignName, String budgetMode, Integer budget, String landingType) {
+    public ByteDanceCampaign(Long id, CtopOauthToken oauthToken, String campaignName, String budgetMode, Integer budget, String landingType) {
 		this.id = id;
 		this.advertiserId = oauthToken.getAdvertiserId();
 		this.name = campaignName;
@@ -170,7 +170,7 @@ public class ByteDanceCampaign {
 		this.updateTime = now;
 	}
 
-	public ByteDanceCampaign(Long id, CTopOauthToken token, ByteDanceCampaignTemplate template) {
+    public ByteDanceCampaign(Long id, CtopOauthToken token, ByteDanceCampaignTemplate template) {
 		this.id = id;
 		this.advertiserId = token.getAdvertiserId();
 		this.name = template.getCampaignName();

+ 1 - 1
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/entity/ByteDanceCustomAudience.java

@@ -105,7 +105,7 @@ public class ByteDanceCustomAudience {
     public ByteDanceCustomAudience() {
     }
 
-    public ByteDanceCustomAudience(CTopOauthToken token, JSONObject dataObject) {
+    public ByteDanceCustomAudience(CtopOauthToken token, JSONObject dataObject) {
         this.id = dataObject.getLong("custom_audience_id");
         this.accountId = token.getAccountId();
         this.advertiserId = token.getAdvertiserId();

+ 1 - 1
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/entity/ByteDanceImageInfo.java

@@ -100,7 +100,7 @@ public class ByteDanceImageInfo {
     @ApiModelProperty(value = "updateTime")
     private Date updateTime;
 
-    public ByteDanceImageInfo(JSONObject data, CTopOauthToken token) {
+    public ByteDanceImageInfo(JSONObject data, CtopOauthToken token) {
         this.id = data.getString("id");
         this.fileId = id;
         this.accountId = token.getAccountId();

+ 1 - 1
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/entity/ByteDanceVideoInfo.java

@@ -96,7 +96,7 @@ public class ByteDanceVideoInfo {
     @ApiModelProperty(value = "updateTime")
     private Date updateTime;
 
-    public ByteDanceVideoInfo(JSONObject data, CTopOauthToken token) {
+    public ByteDanceVideoInfo(JSONObject data, CtopOauthToken token) {
         this.id = data.getString("video_id");
         this.fileId = id;
         this.accountId = token.getAccountId();

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

@@ -27,7 +27,7 @@ import java.util.Date;
 @EqualsAndHashCode(callSuper = false)
 @Accessors(chain = true)
 @ApiModel(value = "ctop_oauth_token对象", description = "oauth授权码")
-public class CTopOauthToken {
+public class CtopOauthToken {
 
     /**
      * 主键ID
@@ -98,7 +98,7 @@ public class CTopOauthToken {
     @ApiModelProperty(value = "修改时间")
     private Date updateTime;
 
-    public CTopOauthToken(String userId, JSONObject data) {
+    public CtopOauthToken(String userId, JSONObject data) {
         this.advertiserId = userId;
         this.mediaId = "1";
         this.accountId = data.getLong("advertiser_id");
@@ -115,10 +115,10 @@ public class CTopOauthToken {
         this.updateTime = now;
     }
 
-    public CTopOauthToken() {
+    public CtopOauthToken() {
     }
 
-    public CTopOauthToken(CTopOauthToken token, JSONObject data) {
+    public CtopOauthToken(CtopOauthToken token, JSONObject data) {
         this.advertiserId = token.getAdvertiserId();
         this.mediaId = "1";
         this.accountId = token.getAccountId();

+ 1 - 1
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/entity/FileInfo.java

@@ -96,7 +96,7 @@ public class FileInfo {
     @ApiModelProperty(value = "updateTime")
     private Date updateTime;
 
-    public FileInfo(String md5Hex, JSONObject data, String advertiserId, CTopOauthToken token, String imageUrl, String imagePath, String fileType, String platformType) {
+    public FileInfo(String md5Hex, JSONObject data, String advertiserId, CtopOauthToken token, String imageUrl, String imagePath, String fileType, String platformType) {
         this.type = fileType;
         if ("IMAGE".equals(type)) {
             this.fileId = data.getString("id");

+ 1 - 1
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/entity/PlatformCampaignStatisticInfo.java

@@ -199,7 +199,7 @@ public class PlatformCampaignStatisticInfo {
                 if (campaignInfo.indexOf("-") >= 0) {
                     this.campaignCode = campaignInfo.substring(0, campaignInfo.indexOf("-"));
                 } else {
-                    this.campaignCode = campaignCode;
+                    this.campaignCode = campaignInfo;
                 }
             } else {
                 this.campaignCode = "";

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

@@ -0,0 +1,60 @@
+package org.jeecg.modules.ctop.entity;
+
+import java.io.Serializable;
+import java.util.Date;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.TableField;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.springframework.format.annotation.DateTimeFormat;
+import org.jeecgframework.poi.excel.annotation.Excel;
+
+/**
+ * @Description: 统一资源库文件信息
+ * @Author: jeecg-boot
+ * @Date: 2019-09-02
+ * @Version: V1.0
+ */
+@Data
+@TableName("ctop_source_file")
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value = "ctop_source_file对象", description = "统一资源库文件信息")
+public class SourceFile {
+
+    /**
+     * id
+     */
+    @TableId(type = IdType.AUTO)
+    @ApiModelProperty(value = "id")
+    private Long id;
+    /**
+     * MD5code码(唯一性校验)
+     */
+    @Excel(name = "MD5code码(唯一性校验)", width = 15)
+    @ApiModelProperty(value = "MD5code码(唯一性校验)")
+    private String code;
+    /**
+     * url
+     */
+    @Excel(name = "url", width = 15)
+    @ApiModelProperty(value = "url")
+    private String url;
+    /**
+     * createTime
+     */
+    @ApiModelProperty(value = "createTime")
+    private Date createTime;
+    /**
+     * updateTime
+     */
+    @ApiModelProperty(value = "updateTime")
+    private Date updateTime;
+}

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

@@ -12,14 +12,14 @@ import java.util.List;
 
 public class KuaishouAdvertiserCrawlerJob implements Job {
     @Autowired
-    private IKuaishouAdAccountService KuaishouAdAccountService;
+    private IKuaishouAdAccountService kuaishouAdAccountService;
     @Autowired
     private IKuaishouAppService kuaishouAppService;
     @Override
     public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
         try{
 
-            List<KuaishouAdAccount> list = KuaishouAdAccountService.querySyncAccount();
+            List<KuaishouAdAccount> list = kuaishouAdAccountService.querySyncAccount();
             if (list != null){
                 for(KuaishouAdAccount account : list){
                     kuaishouAppService.adAccountFetch(account,"");

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

@@ -1,20 +0,0 @@
-package org.jeecg.modules.ctop.mapper;
-
-import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import org.jeecg.modules.ctop.entity.CTopOauthToken;
-
-import java.util.List;
-
-/**
- * @Description: oauth授权码
- * @Author: jeecg-boot
- * @Date: 2019-07-09
- * @Version: V1.0
- */
-public interface CTopOauthTokenMapper extends BaseMapper<CTopOauthToken> {
-    List<CTopOauthToken> selectAll();
-
-    int updateByPrimaryKeySelective(CTopOauthToken oauthToken);
-
-    CTopOauthToken selectByAccountId(Long accountId);
-}

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

@@ -0,0 +1,20 @@
+package org.jeecg.modules.ctop.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.jeecg.modules.ctop.entity.CtopOauthToken;
+
+import java.util.List;
+
+/**
+ * @Description: oauth授权码
+ * @Author: jeecg-boot
+ * @Date: 2019-07-09
+ * @Version: V1.0
+ */
+public interface CtopOauthTokenMapper extends BaseMapper<CtopOauthToken> {
+    List<CtopOauthToken> selectAll();
+
+    int updateByPrimaryKeySelective(CtopOauthToken oauthToken);
+
+    CtopOauthToken selectByAccountId(Long accountId);
+}

+ 6 - 2
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/mapper/PlatformCampaignStatisticInfoMapper.java

@@ -14,7 +14,11 @@ import org.jeecg.modules.ctop.vo.StatisticCampaignVo;
  * @Version: V1.0
  */
 public interface PlatformCampaignStatisticInfoMapper extends BaseMapper<PlatformCampaignStatisticInfo> {
-    List<StatisticCampaignVo> getVoByParams(@Param("statisticDate") String statisticDate, @Param("accountId") Long accountId);
+    List<StatisticCampaignVo> getVoByParams(@Param("accountId") Long accountId);
 
-    StatisticCampaignVo getTotalStatisticVoByparams(@Param("statisticDate") String statisticDate, @Param("accountId") Long accountId);
+    StatisticCampaignVo getTotalStatisticVoByparams(@Param("accountId") Long accountId);
+
+    List<StatisticCampaignVo> sumZeroVoByParams(@Param("accountId") Long accountId);
+
+    List<StatisticCampaignVo> sumZaodianVoByParams(@Param("accountId") Long accountId1);
 }

+ 17 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/mapper/SourceFileMapper.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.SourceFile;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * @Description: 统一资源库文件信息
+ * @Author: jeecg-boot
+ * @Date: 2019-09-02
+ * @Version: V1.0
+ */
+public interface SourceFileMapper extends BaseMapper<SourceFile> {
+
+}

+ 3 - 3
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/mapper/xml/CTopOauthTokenMapper.xml

@@ -1,8 +1,8 @@
 <?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.CTopOauthTokenMapper">
+<mapper namespace="org.jeecg.modules.ctop.mapper.CtopOauthTokenMapper">
 
-    <resultMap id="BaseResultMap" type="org.jeecg.modules.ctop.entity.CTopOauthToken">
+    <resultMap id="BaseResultMap" type="org.jeecg.modules.ctop.entity.CtopOauthToken">
         <result column="id" property="id" jdbcType="BIGINT"/>
         <result column="media_id" property="mediaId" jdbcType="VARCHAR"/>
         <result column="advertiser_id" property="advertiserId" jdbcType="VARCHAR"/>
@@ -26,7 +26,7 @@
     </select>
 
 
-    <update id="updateByPrimaryKeySelective" parameterType="org.jeecg.modules.ctop.entity.CTopOauthToken">
+    <update id="updateByPrimaryKeySelective" parameterType="org.jeecg.modules.ctop.entity.CtopOauthToken">
         update ctop_oauth_token
         <set>
 

+ 286 - 37
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/mapper/xml/PlatformCampaignStatisticInfoMapper.xml

@@ -6,30 +6,30 @@
         <result column="proxy" property="proxy"/>
         <result column="deliverySystem" property="deliverySystem"/>
         <result column="channelName" property="channelName"/>
-        <result column="content" property="content"/>
+		<result column="content" property="content"/>
         <result column="meterial" property="meterial"/>
         <result column="priceType" property="priceType"/>
-        <result column="directCondition" property="directCondition"/>
+		<result column="directCondition" property="directCondition"/>
         <result column="basicDirect" property="basicDirect"/>
         <result column="cost" property="cost"/>
         <result column="coverViews" property="coverViews"/>
         <result column="coverClick" property="coverClick"/>
         <result column="creditRegistRateDay" property="creditRegistRateDay"/>
-        <result column="creditRateDay" property="creditRateDay"/>
+		<result column="creditRateDay" property="creditRateDay"/>
         <result column="completeRateDay" property="completeRateDay"/>
         <result column="registCreditRate" property="registCreditRate"/>
         <result column="registCompleteRate" property="registCompleteRate"/>
         <result column="creditRate" property="creditRate"/>
-        <result column="completeRate" property="completeRate"/>
+		<result column="completeRate" property="completeRate"/>
         <result column="materialViews" property="materialViews"/>
         <result column="actions" property="actions"/>
-        <result column="clickRate" property="clickRate"/>
-        <result column="actionClickRate" property="actionClickRate"/>
-        <result column="abctr" property="abctr"/>
+		<result column="clickRate" property="clickRate"/>
+		<result column="actionClickRate" property="actionClickRate"/>
+		<result column="abctr" property="abctr"/>
         <result column="clickPrice" property="clickPrice"/>
         <result column="actionPrice" property="actionPrice"/>
         <result column="registUserNum" property="registUserNum"/>
-        <result column="complateUserNum" property="complateUserNum"/>
+		<result column="complateUserNum" property="complateUserNum"/>
         <result column="creditUserNum" property="creditUserNum"/>
         <result column="registCompleteNum" property="registCompleteNum"/>
         <result column="registCreditNum" property="registCreditNum"/>
@@ -38,11 +38,11 @@
         <result column="creditPrice" property="creditPrice"/>
         <result column="registCompletePrice" property="registCompletePrice"/>
         <result column="registCreditPrice" property="registCreditPrice"/>
-        <result column="clickRegistRate" property="clickRegistRate"/>
-        <result column="actionRegistRate" property="actionRegistRate"/>
+		<result column="clickRegistRate" property="clickRegistRate"/>
+		<result column="actionRegistRate" property="actionRegistRate"/>
     </resultMap>
 
-    <select id="getTotalStatisticVoByparams" resultMap="voMap">
+	<select id="getTotalStatisticVoByparams" resultMap="voMap">
         SELECT
 	SUM(a.cost) AS 'cost',
 	SUM(a.coverViews) AS 'coverViews',
@@ -101,8 +101,7 @@ FROM
 				FROM
 					ctop_kuaishou_customer_plan_statistic_info a44
 				WHERE
-					a44.statistic_date = #{statisticDate}
-				AND a44.campaign_code = c.campaign_code
+				a44.campaign_code = c.campaign_code
 				ORDER BY
 					a44.id DESC
 				LIMIT 1
@@ -124,8 +123,7 @@ FROM
 				FROM
 					ctop_kuaishou_customer_plan_statistic_info a1
 				WHERE
-					a1.statistic_date = #{statisticDate}
-				AND a1.campaign_code = c.campaign_code
+				    a1.campaign_code = c.campaign_code
 			) AS 'registUserNum',
 			(
 				SELECT
@@ -133,8 +131,7 @@ FROM
 				FROM
 					ctop_kuaishou_customer_plan_statistic_info a2
 				WHERE
-					a2.statistic_date = #{statisticDate}
-				AND a2.campaign_code = c.campaign_code
+				    a2.campaign_code = c.campaign_code
 			) AS 'complateUserNum',
 			(
 				SELECT
@@ -142,8 +139,7 @@ FROM
 				FROM
 					ctop_kuaishou_customer_plan_statistic_info a3
 				WHERE
-					a3.statistic_date = #{statisticDate}
-				AND a3.campaign_code = c.campaign_code
+					a3.campaign_code = c.campaign_code
 			) AS 'creditUserNum',
 			(
 				SELECT
@@ -151,8 +147,7 @@ FROM
 				FROM
 					ctop_kuaishou_customer_plan_statistic_info a4
 				WHERE
-					a4.statistic_date = #{statisticDate}
-				AND a4.campaign_code = c.campaign_code
+					a4.campaign_code = c.campaign_code
 			) AS 'registCompleteNum',
 			(
 				SELECT
@@ -162,14 +157,12 @@ FROM
 				FROM
 					ctop_kuaishou_customer_plan_statistic_info a5
 				WHERE
-					a5.statistic_date = #{statisticDate}
-				AND a5.campaign_code = c.campaign_code
+				  a5.campaign_code = c.campaign_code
 			) AS 'registCreditNum'
 		FROM
 			ctop_kuaishou_platform_campaign_statistic_info AS c
 		WHERE
 			c.account_id = #{accountId}
-			and c.statistic_date = #{statisticDate}
 		ORDER BY
 			c.campaign_info
 	) AS h) AS a
@@ -201,8 +194,7 @@ FROM
 				FROM
 					ctop_kuaishou_customer_plan_statistic_info a
 				WHERE
-					a.statistic_date = #{statisticDate}
-				AND a.campaign_code = c.campaign_code
+				 a.campaign_code = c.campaign_code
 				ORDER BY
 					a.id DESC
 				LIMIT 1
@@ -224,8 +216,7 @@ FROM
 				FROM
 					ctop_kuaishou_customer_plan_statistic_info a1
 				WHERE
-					a1.statistic_date = #{statisticDate}
-				AND a1.campaign_code = c.campaign_code
+					a1.campaign_code = c.campaign_code
 			) AS 'registUserNum',
 			(
 				SELECT
@@ -233,8 +224,7 @@ FROM
 				FROM
 					ctop_kuaishou_customer_plan_statistic_info a2
 				WHERE
-					a2.statistic_date = #{statisticDate}
-				AND a2.campaign_code = c.campaign_code
+					a2.campaign_code = c.campaign_code
 			) AS 'complateUserNum',
 			(
 				SELECT
@@ -242,8 +232,7 @@ FROM
 				FROM
 					ctop_kuaishou_customer_plan_statistic_info a3
 				WHERE
-					a3.statistic_date = #{statisticDate}
-				AND a3.campaign_code = c.campaign_code
+					a3.campaign_code = c.campaign_code
 			) AS 'creditUserNum',
 			(
 				SELECT
@@ -251,8 +240,7 @@ FROM
 				FROM
 					ctop_kuaishou_customer_plan_statistic_info a4
 				WHERE
-					a4.statistic_date = #{statisticDate}
-				AND a4.campaign_code = c.campaign_code
+					a4.campaign_code = c.campaign_code
 			) AS 'registCompleteNum',
 			(
 				SELECT
@@ -262,16 +250,277 @@ FROM
 				FROM
 					ctop_kuaishou_customer_plan_statistic_info a5
 				WHERE
-					a5.statistic_date = #{statisticDate}
-				AND a5.campaign_code = c.campaign_code
+					a5.campaign_code = c.campaign_code
 			) AS 'registCreditNum'
 		FROM
 			ctop_kuaishou_platform_campaign_statistic_info AS c
 		WHERE
 			c.account_id = #{accountId}
-			and c.statistic_date = #{statisticDate}
+			and c.cost!=0
 		ORDER BY
 			c.campaign_info
 	) AS h
     </select>
+
+	<select id="sumZeroVoByParams" resultMap="voMap">
+SELECT
+	a.statisticDate AS 'statisticDate',
+			'汇创思拓' AS 'proxy',
+			'消费0用户统计信息' as 'channelName',
+			'消费0用户' AS 'content',
+	SUM(a.cost) AS 'cost',
+	SUM(a.coverViews) AS 'coverViews',
+	SUM(a.coverClick) AS 'coverClick',
+	SUM(a.materialViews) AS 'materialViews',
+	SUM(a.actions) AS'actions',
+	SUM(a.coverClick) / SUM(a.coverViews) * 100 AS 'clickRate',
+	SUM(a.actions) / SUM(a.coverClick) * 100 AS 'actionClickRate',
+	SUM(a.actions) / SUM(a.coverClick) * SUM(a.coverClick) / SUM(a.coverViews) * 10000 AS 'abctr',
+	SUM(a.cost) / SUM(a.coverClick) 'clickPrice',
+	SUM(a.cost) / SUM(a.actions) 'actionPrice',
+	sum(a.registUserNum) AS 'registUserNum',
+	sum(a.complateUserNum) AS 'complateUserNum',
+	sum(a.creditUserNum) AS 'creditUserNum',
+	sum(a.registCompleteNum) AS 'registCompleteNum',
+	sum(a.registCreditNum) AS 'registCreditNum',
+	SUM(a.cost) / sum(a.registUserNum) AS 'registPrice',
+	SUM(a.cost) / sum(a.complateUserNum) AS 'completePrice',
+	SUM(a.cost) / sum(a.creditUserNum) AS 'creditPrice',
+	SUM(a.cost) / sum(a.registCompleteNum) AS 'registCompletePrice',
+	SUM(a.cost) / sum(a.registCreditNum) AS 'registCreditPrice',
+	sum(a.registUserNum) / SUM(a.coverClick) * 100 AS 'clickRegistRate',
+	sum(a.registUserNum) / SUM(a.actions) * 100 AS 'actionRegistRate',
+	sum(a.complateUserNum) / sum(a.registUserNum) * 100 AS 'completeRate',
+	sum(a.creditUserNum) / sum(a.complateUserNum) * 100 AS 'creditRate',
+	sum(a.registCompleteNum) / sum(a.registUserNum) * 100 AS 'registCompleteRate',
+	sum(a.creditUserNum) / sum(a.complateUserNum) * 100 AS 'registCreditRate',
+	sum(a.registCompleteNum) / sum(a.complateUserNum) * 100 AS 'completeRateDay',
+	sum(a.registCreditNum) / sum(a.creditUserNum) * 100 AS 'creditRateDay',
+	sum(a.registCreditNum) / sum(a.registUserNum) * 100 AS 'creditRegistRateDay'
+FROM
+	(
+	SELECT
+	h.*, h.cost / h.registUserNum AS 'registPrice',
+	h.cost / h.complateUserNum AS 'completePrice',
+	h.cost / h.creditUserNum AS 'creditPrice',
+	h.cost / h.registCompleteNum AS 'registCompletePrice',
+	h.cost / h.registCreditNum AS 'registCreditPrice',
+	h.registUserNum / h.coverClick * 100 AS 'clickRegistRate',
+	h.registUserNum / h.actions * 100 AS 'actionRegistRate',
+	h.complateUserNum / h.registUserNum * 100 AS 'completeRate',
+	h.creditUserNum / h.complateUserNum * 100 AS 'creditRate',
+	h.registCompleteNum / h.registUserNum * 100 AS 'registCompleteRate',
+	h.creditUserNum / h.complateUserNum * 100 AS 'registCreditRate',
+	h.registCompleteNum / h.complateUserNum * 100 AS 'completeRateDay',
+	h.registCreditNum / h.creditUserNum * 100 AS 'creditRateDay',
+	h.registCreditNum / h.registUserNum * 100 AS 'creditRegistRateDay'
+FROM
+	(
+		SELECT
+			c.statistic_date AS 'statisticDate',
+			'汇创思拓' AS 'proxy',
+			(
+				SELECT
+					a44.child_channel
+				FROM
+					ctop_kuaishou_customer_plan_statistic_info a44
+				WHERE
+					a44.campaign_code = c.campaign_code
+				ORDER BY
+					a44.id DESC
+				LIMIT 1
+			) AS 'channelName',
+			c.campaign_info AS 'content',
+			c.cost AS 'cost',
+			c.cover_exposure AS 'coverViews',
+			c.cover_click AS 'coverClick',
+			c.metarial_exposure AS 'materialViews',
+			c.action AS 'actions',
+			c.cover_click / c.cover_exposure * 100 AS 'clickRate',
+			c.action / c.cover_click * 100 AS 'actionClickRate',
+			c.action / c.cover_click * c.cover_click / c.cover_exposure * 10000 AS 'abctr',
+			c.cost / c.cover_click 'clickPrice',
+			c.cost / c.action 'actionPrice',
+			(
+				SELECT
+					SUM(a1.regist_account_num)
+				FROM
+					ctop_kuaishou_customer_plan_statistic_info a1
+				WHERE
+					a1.campaign_code = c.campaign_code
+			) AS 'registUserNum',
+			(
+				SELECT
+					SUM(a2.complete_user)
+				FROM
+					ctop_kuaishou_customer_plan_statistic_info a2
+				WHERE
+					a2.campaign_code = c.campaign_code
+			) AS 'complateUserNum',
+			(
+				SELECT
+					SUM(a3.estimated_credit_number)
+				FROM
+					ctop_kuaishou_customer_plan_statistic_info a3
+				WHERE
+					a3.campaign_code = c.campaign_code
+			) AS 'creditUserNum',
+			(
+				SELECT
+					SUM(a4.regist_complate_number)
+				FROM
+					ctop_kuaishou_customer_plan_statistic_info a4
+				WHERE
+					a4.campaign_code = c.campaign_code
+			) AS 'registCompleteNum',
+			(
+				SELECT
+					SUM(
+						a5.estimated_regist_credit_number
+					)
+				FROM
+					ctop_kuaishou_customer_plan_statistic_info a5
+				WHERE
+					a5.campaign_code = c.campaign_code
+			) AS 'registCreditNum'
+		FROM
+			ctop_kuaishou_platform_campaign_statistic_info AS c
+		WHERE
+			c.account_id = #{accountId} and c.campaign_code != 'biaodan'
+			AND c.cost = 0
+		ORDER BY
+			c.campaign_info
+	) AS h) AS a
+    </select>
+
+	<select id="sumZaodianVoByParams" resultMap="voMap">
+		SELECT
+	a.statisticDate AS 'statisticDate',
+			'汇创思拓' AS 'proxy',
+			'消费0用户统计信息' as 'channelName',
+			'早点消费0用户' AS 'content',
+	SUM(a.cost) AS 'cost',
+	SUM(a.coverViews) AS 'coverViews',
+	SUM(a.coverClick) AS 'coverClick',
+	SUM(a.materialViews) AS 'materialViews',
+	SUM(a.actions) AS'actions',
+	SUM(a.coverClick) / SUM(a.coverViews) * 100 AS 'clickRate',
+	SUM(a.actions) / SUM(a.coverClick) * 100 AS 'actionClickRate',
+	SUM(a.actions) / SUM(a.coverClick) * SUM(a.coverClick) / SUM(a.coverViews) * 10000 AS 'abctr',
+	SUM(a.cost) / SUM(a.coverClick) 'clickPrice',
+	SUM(a.cost) / SUM(a.actions) 'actionPrice',
+	sum(a.registUserNum)/SUM(1) AS 'registUserNum',
+	sum(a.complateUserNum)/SUM(1) AS 'complateUserNum',
+	sum(a.creditUserNum)/SUM(1) AS 'creditUserNum',
+	sum(a.registCompleteNum)/SUM(1) AS 'registCompleteNum',
+	sum(a.registCreditNum)/SUM(1) AS 'registCreditNum',
+	SUM(a.cost) / sum(a.registUserNum) AS 'registPrice',
+	SUM(a.cost) / sum(a.complateUserNum) AS 'completePrice',
+	SUM(a.cost) / sum(a.creditUserNum) AS 'creditPrice',
+	SUM(a.cost) / sum(a.registCompleteNum) AS 'registCompletePrice',
+	SUM(a.cost) / sum(a.registCreditNum) AS 'registCreditPrice',
+	sum(a.registUserNum) / SUM(a.coverClick) * 100 AS 'clickRegistRate',
+	sum(a.registUserNum) / SUM(a.actions) * 100 AS 'actionRegistRate',
+	sum(a.complateUserNum) / sum(a.registUserNum) * 100 AS 'completeRate',
+	sum(a.creditUserNum) / sum(a.complateUserNum) * 100 AS 'creditRate',
+	sum(a.registCompleteNum) / sum(a.registUserNum) * 100 AS 'registCompleteRate',
+	sum(a.creditUserNum) / sum(a.complateUserNum) * 100 AS 'registCreditRate',
+	sum(a.registCompleteNum) / sum(a.complateUserNum) * 100 AS 'completeRateDay',
+	sum(a.registCreditNum) / sum(a.creditUserNum) * 100 AS 'creditRateDay',
+	sum(a.registCreditNum) / sum(a.registUserNum) * 100 AS 'creditRegistRateDay'
+FROM
+	(
+	SELECT
+	h.*, h.cost / h.registUserNum AS 'registPrice',
+	h.cost / h.complateUserNum AS 'completePrice',
+	h.cost / h.creditUserNum AS 'creditPrice',
+	h.cost / h.registCompleteNum AS 'registCompletePrice',
+	h.cost / h.registCreditNum AS 'registCreditPrice',
+	h.registUserNum / h.coverClick * 100 AS 'clickRegistRate',
+	h.registUserNum / h.actions * 100 AS 'actionRegistRate',
+	h.complateUserNum / h.registUserNum * 100 AS 'completeRate',
+	h.creditUserNum / h.complateUserNum * 100 AS 'creditRate',
+	h.registCompleteNum / h.registUserNum * 100 AS 'registCompleteRate',
+	h.creditUserNum / h.complateUserNum * 100 AS 'registCreditRate',
+	h.registCompleteNum / h.complateUserNum * 100 AS 'completeRateDay',
+	h.registCreditNum / h.creditUserNum * 100 AS 'creditRateDay',
+	h.registCreditNum / h.registUserNum * 100 AS 'creditRegistRateDay'
+FROM
+	(
+		SELECT
+			c.statistic_date AS 'statisticDate',
+			'汇创思拓' AS 'proxy',
+			(
+				SELECT
+					a44.child_channel
+				FROM
+					ctop_kuaishou_customer_plan_statistic_info a44
+				WHERE
+					a44.campaign_code = c.campaign_code
+				ORDER BY
+					a44.id DESC
+				LIMIT 1
+			) AS 'channelName',
+			c.campaign_info AS 'content',
+			c.cost AS 'cost',
+			c.cover_exposure AS 'coverViews',
+			c.cover_click AS 'coverClick',
+			c.metarial_exposure AS 'materialViews',
+			c.action AS 'actions',
+			c.cover_click / c.cover_exposure * 100 AS 'clickRate',
+			c.action / c.cover_click * 100 AS 'actionClickRate',
+			c.action / c.cover_click * c.cover_click / c.cover_exposure * 10000 AS 'abctr',
+			c.cost / c.cover_click 'clickPrice',
+			c.cost / c.action 'actionPrice',
+			(
+				SELECT
+					SUM(a1.regist_account_num)
+				FROM
+					ctop_kuaishou_customer_plan_statistic_info a1
+				WHERE
+					a1.campaign_code = c.campaign_code
+			) AS 'registUserNum',
+			(
+				SELECT
+					SUM(a2.complete_user)
+				FROM
+					ctop_kuaishou_customer_plan_statistic_info a2
+				WHERE
+					a2.campaign_code = c.campaign_code
+			) AS 'complateUserNum',
+			(
+				SELECT
+					SUM(a3.estimated_credit_number)
+				FROM
+					ctop_kuaishou_customer_plan_statistic_info a3
+				WHERE
+					a3.campaign_code = c.campaign_code
+			) AS 'creditUserNum',
+			(
+				SELECT
+					SUM(a4.regist_complate_number)
+				FROM
+					ctop_kuaishou_customer_plan_statistic_info a4
+				WHERE
+					a4.campaign_code = c.campaign_code
+			) AS 'registCompleteNum',
+			(
+				SELECT
+					SUM(
+						a5.estimated_regist_credit_number
+					)
+				FROM
+					ctop_kuaishou_customer_plan_statistic_info a5
+				WHERE
+					a5.campaign_code = c.campaign_code
+			) AS 'registCreditNum'
+		FROM
+			ctop_kuaishou_platform_campaign_statistic_info AS c
+		WHERE
+			c.account_id = #{accountId} and c.campaign_code = 'biaodan'
+			AND c.cost = 0
+		ORDER BY
+			c.campaign_info
+	) AS h) AS a
+	</select>
 </mapper>

+ 1 - 1
jeecg-boot-module-system/src/main/java/org/jeecg/modules/kuaishou/mapper/xml/KuaiShouGroupCreateMapper.xml

@@ -1,5 +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.kuaishou.mapper.KuaiShouGroupCreateMapper">
+<mapper namespace="org.jeecg.modules.ctop.mapper.SourceFileMapper">
 
 </mapper>

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

@@ -12,7 +12,7 @@ import org.jeecg.modules.ctop.entity.BindAccountLogin;
 public interface IBindAccountLoginService extends IService<BindAccountLogin> {
 
 
-    boolean bindLogin(String advertiserId, String accountName, String password, String loginType);
+    boolean bindLogin(String advertiserId, String accountName, String password, String loginType, String userId);
 
 
 }

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

@@ -1,8 +1,8 @@
 package org.jeecg.modules.ctop.service;
 
-import org.jeecg.modules.ctop.entity.ByteDanceAdvertisePlan;
 import com.baomidou.mybatisplus.extension.service.IService;
-import org.jeecg.modules.ctop.entity.CTopOauthToken;
+import org.jeecg.modules.ctop.entity.ByteDanceAdvertisePlan;
+import org.jeecg.modules.ctop.entity.CtopOauthToken;
 
 import java.util.Map;
 
@@ -14,7 +14,9 @@ import java.util.Map;
  */
 public interface IByteDanceAdvertisePlanService extends IService<ByteDanceAdvertisePlan> {
 
-    Map<String, Object> advertiserPlanCreate(CTopOauthToken token, Long campaignId, String dataString);
+    Map<String, Object> advertiserPlanCreate(CtopOauthToken token, Long campaignId, String dataString);
 
     Map<String, Object> getAdConvertList(Long accountId, Long targetId);
+
+    Map<String, Object> getAdConvertListByUrlId(Long accountId, Long urlId);
 }

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

@@ -1,8 +1,5 @@
 package org.jeecg.modules.ctop.service;
 
-import org.jeecg.modules.ctop.entity.ByteDanceCampaignTemplate;
-import org.jeecg.modules.ctop.entity.CTopOauthToken;
-
 import java.util.Map;
 
 public interface IByteDanceAdvertiserDataService {

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

@@ -4,7 +4,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import org.jeecg.common.api.vo.Result;
 import org.jeecg.modules.ctop.entity.ByteDanceCampaignTemplate;
 import com.baomidou.mybatisplus.extension.service.IService;
-import org.jeecg.modules.ctop.entity.CTopOauthToken;
+import org.jeecg.modules.ctop.entity.CtopOauthToken;
 
 import javax.servlet.http.HttpServletRequest;
 import java.util.Map;
@@ -21,7 +21,7 @@ public interface IByteDanceCampaignTemplateService extends IService<ByteDanceCam
 
     Result<IPage<ByteDanceCampaignTemplate>> getList(ByteDanceCampaignTemplate template, Integer pageNo, Integer pageSize, HttpServletRequest req);
 
-    Map<String, Object> campaignCreate(CTopOauthToken token, ByteDanceCampaignTemplate template);
+    Map<String, Object> campaignCreate(CtopOauthToken token, ByteDanceCampaignTemplate template);
 
     Map<String, Object> campaignCreate(String getAccountId, Long campaignId, String getName);
 

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

@@ -21,7 +21,5 @@ public interface IBytedanceDeliveryTargetTemplateService extends IService<Byteda
 
     Result<IPage<BytedanceDeliveryTargetTemplate>> getList(BytedanceDeliveryTargetTemplate template, Integer pageNo, Integer pageSize, HttpServletRequest req);
 
-    JSONObject getSiteList(Long accountId);
-
     Map<String, Object> get(Long targetId);
 }

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

@@ -6,4 +6,6 @@ import java.util.Map;
 
 public interface ICreateInternalService {
     Map<String, Object> createInternal(JSONObject requestJson);
+
+    Map<String, Object> checkAccountPassword(String account, String password);
 }

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

@@ -1,7 +1,7 @@
 package org.jeecg.modules.ctop.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
-import org.jeecg.modules.ctop.entity.CTopOauthToken;
+import org.jeecg.modules.ctop.entity.CtopOauthToken;
 
 import java.util.Map;
 
@@ -11,9 +11,9 @@ import java.util.Map;
  * @Date: 2019-07-09
  * @Version: V1.0
  */
-public interface ICTopOauthTokenService extends IService<CTopOauthToken> {
+public interface ICtopOauthTokenService extends IService<CtopOauthToken> {
 
-    CTopOauthToken getOauthTokenByAccountId(String accountId);
+    CtopOauthToken getOauthTokenByAccountId(String accountId);
 
     Map<String, Object> getByteDanceAccessToken(String accountId);
 

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

@@ -1,6 +1,7 @@
 package org.jeecg.modules.ctop.service;
 
 import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
 import io.swagger.models.auth.In;
 import org.jeecg.modules.ctop.entity.FileInfo;
 import com.baomidou.mybatisplus.extension.service.IService;
@@ -28,4 +29,10 @@ public interface IFileInfoService extends IService<FileInfo> {
     JSONArray getByteDanceIndustryList(HttpServletRequest req);
 
     List<FileInfo> getFileInfoByMd5(String md5);
+
+    Map<String, Object> checkFile(String code);
+
+    Map<String, Object> getCreativeWords(Long accountId);
+
+    public JSONObject getSiteList(Long accountId);
 }

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

@@ -0,0 +1,14 @@
+package org.jeecg.modules.ctop.service;
+
+import org.jeecg.modules.ctop.entity.SourceFile;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * @Description: 统一资源库文件信息
+ * @Author: jeecg-boot
+ * @Date: 2019-09-02
+ * @Version: V1.0
+ */
+public interface ISourceFileService extends IService<SourceFile> {
+
+}

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

@@ -2,7 +2,6 @@ package org.jeecg.modules.ctop.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import org.jeecg.modules.ctop.entity.AuthTask;
-import org.jeecg.modules.ctop.entity.CTopOauthToken;
 import org.jeecg.modules.ctop.mapper.AuthTaskMapper;
 import org.jeecg.modules.ctop.service.IAuthTaskService;
 import org.springframework.beans.factory.annotation.Autowired;

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

@@ -4,11 +4,10 @@ import cn.com.ctop.common.utils.PropertiesUtils;
 import cn.com.ctop.toutiao.common.BytedanceInterfaceConstant;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import constant.KuaishouInterfaceConstant;
+import lombok.extern.slf4j.Slf4j;
 import org.jeecg.modules.ctop.entity.BindAccountAuth;
 import org.jeecg.modules.ctop.mapper.BindAccountAuthMapper;
 import org.jeecg.modules.ctop.service.IBindAccountAuthService;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
@@ -24,10 +23,9 @@ import java.util.Map;
  * @Date: 2019-07-31
  * @Version: V1.0
  */
+@Slf4j
 @Service
 public class BindAccountAuthServiceImpl extends ServiceImpl<BindAccountAuthMapper, BindAccountAuth> implements IBindAccountAuthService {
-    private static final Logger logger = LoggerFactory.getLogger(BindAccountAuthServiceImpl.class);
-
     @Autowired
     private BindAccountAuthMapper bindAccountAuthMapper;
 
@@ -47,13 +45,12 @@ public class BindAccountAuthServiceImpl extends ServiceImpl<BindAccountAuthMappe
         bindAccountAuthMapper.deleteByMap(deleteMap);
         BindAccountAuth bindAccount = new BindAccountAuth();
         bindAccount.setAccountId(accountId);
-
         bindAccount.setAdvertiserId(state);
         bindAccount.setUpdateTime(new Date());
         bindAccount.setAuthType(authType);
         int i = bindAccountAuthMapper.insert(bindAccount);
         if (i > 0) {
-            logger.info("授权账号绑定成功,本地id:{},accountId:{}", bindAccount.getAdvertiserId(), accountId);
+            log.info("授权账号绑定成功,本地id:{},accountId:{}", bindAccount.getAdvertiserId(), accountId);
         }
     }
 

+ 20 - 6
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/service/impl/BindAccountLoginServiceImpl.java

@@ -2,9 +2,12 @@ package org.jeecg.modules.ctop.service.impl;
 
 import cn.com.ctop.common.utils.Check;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import lombok.extern.slf4j.Slf4j;
+import org.jeecg.common.constant.CtopAdConstant;
 import org.jeecg.modules.ctop.entity.BindAccountLogin;
 import org.jeecg.modules.ctop.mapper.BindAccountLoginMapper;
 import org.jeecg.modules.ctop.service.IBindAccountLoginService;
+import org.jeecg.modules.ctop.service.ICreateInternalService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -20,15 +23,15 @@ import java.util.Map;
  * @Date: 2019-07-31
  * @Version: V1.0
  */
+@Slf4j
 @Service
 public class BindAccountLoginServiceImpl extends ServiceImpl<BindAccountLoginMapper, BindAccountLogin> implements IBindAccountLoginService {
-    private static final Logger logger = LoggerFactory.getLogger(BindAccountLoginServiceImpl.class);
-
     @Autowired
     private BindAccountLoginMapper bindAccountLoginMapper;
-
+    @Autowired
+    private ICreateInternalService createInternalService;
     @Override
-    public boolean bindLogin(String advertiserId, String accountName, String password, String loginType) {
+    public boolean bindLogin(String advertiserId, String accountName, String password, String loginType, String userId) {
         Map<String, Object> requestMap = new HashMap<>();
         requestMap.put("advertiser_id", advertiserId);
         requestMap.put("account_name", accountName);
@@ -37,17 +40,28 @@ public class BindAccountLoginServiceImpl extends ServiceImpl<BindAccountLoginMap
         if (!Check.isNull(bindAccounts)) {
             return false;
         }
+        String accountId = "";
+        //头条登录
+        if (null != loginType && loginType.equals(CtopAdConstant.PLATFORM_TYPE_BYTEDANCE_PY)) {
+            Map<String, Object> result = createInternalService.checkAccountPassword(accountName, password);
+            Boolean checkSuccess = (Boolean) result.get("success");
+            if (!checkSuccess) {
+                return false;
+            }
+            accountId = (String) result.get("id");
+        }
         BindAccountLogin bindAccountLogin = new BindAccountLogin();
         bindAccountLogin.setAdvertiserId(advertiserId);
         bindAccountLogin.setAccountName(accountName);
         bindAccountLogin.setPassword(password);
+        bindAccountLogin.setAccountId(accountId);
         bindAccountLogin.setLoginType(loginType);
+        bindAccountLogin.setUserId(userId);
         int i = bindAccountLoginMapper.insert(bindAccountLogin);
         if (i > 0) {
-            logger.info("登录账号绑定成功,广告主id:{}", bindAccountLogin.getAdvertiserId());
+            log.info("登录账号绑定成功,广告主id:{}", bindAccountLogin.getAdvertiserId());
             return true;
         }
-
         return false;
     }
 

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

@@ -2,6 +2,8 @@ package org.jeecg.modules.ctop.service.impl;
 
 import cn.com.ctop.common.utils.PropertiesUtils;
 import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+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;
@@ -12,18 +14,16 @@ 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.BytedanceDeliveryTargetTemplate;
-import org.jeecg.modules.ctop.entity.CTopOauthToken;
+import org.jeecg.modules.ctop.entity.BytedanceUrlInfo;
+import org.jeecg.modules.ctop.entity.CtopOauthToken;
 import org.jeecg.modules.ctop.mapper.ByteDanceAdvertisePlanMapper;
 import org.jeecg.modules.ctop.mapper.BytedanceDeliveryTargetTemplateMapper;
+import org.jeecg.modules.ctop.mapper.BytedanceUrlInfoMapper;
 import org.jeecg.modules.ctop.service.IByteDanceAdvertisePlanService;
-import org.jeecg.modules.ctop.service.ICTopOauthTokenService;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import org.jeecg.modules.ctop.service.ICtopOauthTokenService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-
 import java.io.BufferedReader;
 import java.io.IOException;
 import java.io.InputStreamReader;
@@ -37,12 +37,23 @@ import java.util.Map;
  * @Date: 2019-07-22
  * @Version: V1.0
  */
+@Slf4j
 @Service
 public class ByteDanceAdvertisePlanServiceImpl extends ServiceImpl<ByteDanceAdvertisePlanMapper, ByteDanceAdvertisePlan> implements IByteDanceAdvertisePlanService {
-    private static final Logger logger = LoggerFactory.getLogger(ByteDanceAdvertisePlanServiceImpl.class);
+    @Autowired
+    private BytedanceUrlInfoMapper urlInfoMapper;
+
+    @Autowired
+    private BytedanceDeliveryTargetTemplateMapper deliveryTargetTemplateMapper;
+
+    @Autowired
+    private ICtopOauthTokenService tokenService;
+
+    @Autowired
+    private ByteDanceAdvertisePlanMapper planMapper;
 
     @Override
-    public Map<String, Object> advertiserPlanCreate(CTopOauthToken token, Long campaignId, String dataString) {
+    public Map<String, Object> advertiserPlanCreate(CtopOauthToken token, Long campaignId, String dataString) {
         Map<String, Object> resultMap = new HashMap<>();
         JSONObject data = JSONObject.parseObject(dataString);
         data.put("advertiser_id", token.getAccountId());
@@ -51,7 +62,7 @@ public class ByteDanceAdvertisePlanServiceImpl extends ServiceImpl<ByteDanceAdve
         Integer code = result.getInteger("code");
         String message = result.getString("message");
         if (null == code || code != 0) {
-            logger.info("广告计划创建失败,广告主id:{},message:{}", token.getAdvertiserId(), message);
+            log.info("广告计划创建失败,广告主id:{},message:{}", token.getAdvertiserId(), message);
             resultMap.put("code", -1);
             resultMap.put("message", message);
             return resultMap;
@@ -69,15 +80,82 @@ public class ByteDanceAdvertisePlanServiceImpl extends ServiceImpl<ByteDanceAdve
 
     @Override
     public Map<String, Object> getAdConvertList(Long accountId, Long targetId) {
-        CTopOauthToken token = tokenService.getOauthTokenByAccountId(accountId + "");
+        CtopOauthToken token = tokenService.getOauthTokenByAccountId(accountId + "");
         BytedanceDeliveryTargetTemplate targetTemplate = deliveryTargetTemplateMapper.selectById(targetId);
         return getAdConvert(token, targetTemplate);
     }
 
-    @Autowired
-    private BytedanceDeliveryTargetTemplateMapper deliveryTargetTemplateMapper;
+    @Override
+    public Map<String, Object> getAdConvertListByUrlId(Long accountId, Long urlId) {
+        CtopOauthToken token = tokenService.getOauthTokenByAccountId(accountId + "");
+        BytedanceUrlInfo urlInfo = urlInfoMapper.selectById(urlId);
+        return getAdConvertByUrlInfo(token, urlInfo);
+    }
+
+    private Map<String, Object> getAdConvertByUrlInfo(CtopOauthToken token, BytedanceUrlInfo urlInfo) {
+        String accessToken = token.getAccessToken();
+        final Long advertiserId = token.getAccountId();
+        // 请求地址
+        String url = "https://ad.toutiao.com/open_api/2/tools/ad_convert/select/";
+
+        // 请求参数
+        Map data = new HashMap() {
+            {
+                put("advertiser_id", advertiserId);
+            }
+        };
+        //落地页或IOS下载链接
+        if ("page".equals(urlInfo.getType()) || "page".equals(urlInfo.getType())) {
+            data.put("external_url", urlInfo.getUrl());
+        }
+        //安卓下载链接
+        if ("android".equals(urlInfo.getType())) {
+            data.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;
+    }
 
-    public JSONObject getAdConvert(CTopOauthToken token, BytedanceDeliveryTargetTemplate targetTemplate) {
+    public JSONObject getAdConvert(CtopOauthToken token, BytedanceDeliveryTargetTemplate targetTemplate) {
         String accessToken = token.getAccessToken();
         final Long advertiserId = token.getAccountId();
         // 请求地址
@@ -89,10 +167,12 @@ public class ByteDanceAdvertisePlanServiceImpl extends ServiceImpl<ByteDanceAdve
                 put("advertiser_id", advertiserId);
             }
         };
-        if ("EXTERNAL_URL".equals(targetTemplate.getDownloadType())) {//落地页
+        //落地页
+        if ("EXTERNAL_URL".equals(targetTemplate.getDownloadType())) {
             data.put("external_url", targetTemplate.getDownloadUrl());
         }
-        if ("DOWNLOAD_URL".equals(targetTemplate.getDownloadType())) {//落地页
+        //下载链接
+        if ("DOWNLOAD_URL".equals(targetTemplate.getDownloadType())) {
             if ("ios".equals(targetTemplate.getDownloadMode())) {
                 data.put("download_url", targetTemplate.getDownloadUrl());
             }
@@ -149,8 +229,6 @@ public class ByteDanceAdvertisePlanServiceImpl extends ServiceImpl<ByteDanceAdve
         return null;
     }
 
-    @Autowired
-    private ByteDanceAdvertisePlanMapper planMapper;
 
     public JSONObject createAd(JSONObject data, String token) {
         // 请求地址
@@ -193,7 +271,4 @@ public class ByteDanceAdvertisePlanServiceImpl extends ServiceImpl<ByteDanceAdve
         }
         return null;
     }
-
-    @Autowired
-    private ICTopOauthTokenService tokenService;
 }

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

@@ -4,12 +4,11 @@ import cn.com.ctop.common.utils.HttpUtils;
 import cn.com.ctop.common.utils.PropertiesUtils;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
+import lombok.extern.slf4j.Slf4j;
 import org.jeecg.modules.ctop.entity.*;
 import org.jeecg.modules.ctop.mapper.*;
 import org.jeecg.modules.ctop.service.IByteDanceAdvertiserDataService;
-import org.jeecg.modules.ctop.service.ICTopOauthTokenService;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import org.jeecg.modules.ctop.service.ICtopOauthTokenService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
@@ -21,16 +20,32 @@ import java.util.TreeMap;
 /**
  * @author 宋英豪
  */
+@Slf4j
 @Service
 public class ByteDanceAdvertiserDataServiceImpl implements IByteDanceAdvertiserDataService {
-    private static final Logger logger = LoggerFactory.getLogger(ByteDanceAdvertiserDataServiceImpl.class);
-
     @Autowired
-    private ICTopOauthTokenService tokenService;
+    private ICtopOauthTokenService tokenService;
+    @Autowired
+    private ByteDanceAdvertisePlanMapper advertisePlanMapper;
+    @Autowired
+    private ByteDanceCampaignTemplateMapper campaignTemplateMapper;
+    @Autowired
+    private ByteDanceCustomAudienceMapper audienceMapper;
+    @Autowired
+    private ByteDanceCreativeMaterialMapper creativeMaterialMapper;
+    @Autowired
+    private ByteDanceCreativeMapper creativeMapper;
+    @Autowired
+    private ByteDanceAdvertiserBudgetMapper advertiserBudgetMapper;
+    @Autowired
+    private ByteDanceCampaignMapper campaignMapper;
+    @Autowired
+    private ByteDanceAdvertiserMapper advertiserMapper;
+
     @Override
     public Map<String, Object> getAdvertiserInfo(String accountId) {
         Map<String, Object> resultMap = new HashMap<>();
-        CTopOauthToken cTopOauthToken = tokenService.getOauthTokenByAccountId(accountId);
+        CtopOauthToken cTopOauthToken = tokenService.getOauthTokenByAccountId(accountId);
         //2: 根据token以及用户id获取用户信息数据
         String url = PropertiesUtils.getValue("bytedance_config", "bytedance_api_url") + PropertiesUtils.getValue("bytedance_config", "bytedance_v2_advertiser_info");
         Map<String, String> headers = new HashMap<>();
@@ -44,7 +59,7 @@ public class ByteDanceAdvertiserDataServiceImpl implements IByteDanceAdvertiserD
         Integer code = jsonObject.getInteger("code");
 
         if (null == code || !code.equals(0)) {
-            logger.info("获取广告主信息接口异常==》accountId:{},message:{}", accountId, jsonObject.getString("message"));
+            log.info("获取广告主信息接口异常==》accountId:{},message:{}", accountId, jsonObject.getString("message"));
             resultMap.put("success", false);
             resultMap.put("code", -1);
             resultMap.put("message", "获取广告主信息接口异常");
@@ -72,7 +87,7 @@ public class ByteDanceAdvertiserDataServiceImpl implements IByteDanceAdvertiserD
     }
 
     private void getAdvertiserPlanByPageNumber(String accountId, Integer pageNumber, String ids) {
-        CTopOauthToken cTopOauthToken = tokenService.getOauthTokenByAccountId(accountId);
+        CtopOauthToken cTopOauthToken = tokenService.getOauthTokenByAccountId(accountId);
         //2: 根据token以及用户id获取用户信息数据
         String url = PropertiesUtils.getValue("bytedance_config", "bytedance_api_url") + PropertiesUtils.getValue("bytedance_config", "bytedance_v2_ad_get");
         Map<String, String> headers = new HashMap<>();
@@ -99,12 +114,12 @@ public class ByteDanceAdvertiserDataServiceImpl implements IByteDanceAdvertiserD
         Integer code = jsonObject.getInteger("code");
 
         if (null == code || !code.equals(0)) {
-            logger.error("获取广告计划信息接口异常==》accountId:{},message:{}", accountId, jsonObject.getString("message"));
+            log.error("获取广告计划信息接口异常==》accountId:{},message:{}", accountId, jsonObject.getString("message"));
             return;
         }
         JSONArray data = jsonObject.getJSONObject("data").getJSONArray("list");
         if (null == data || data.size() <= 0) {
-            logger.error("获取广告计划信息不存在==》accountId:{},message:{}", accountId, jsonObject.getString("message"));
+            log.error("获取广告计划信息不存在==》accountId:{},message:{}", accountId, jsonObject.getString("message"));
             return;
         }
         for (int i = 0; i < data.size(); i++) {
@@ -117,9 +132,6 @@ public class ByteDanceAdvertiserDataServiceImpl implements IByteDanceAdvertiserD
         getAdvertiserPlanByPageNumber(accountId, pageNumber + 1, ids);
     }
 
-    @Autowired
-    private ByteDanceAdvertisePlanMapper advertisePlanMapper;
-
     @Override
     public Map<String, Object> getAdvertiserPlan(String accountId, String ids) {
         getAdvertiserPlanByPageNumber(accountId, 1, ids);
@@ -141,7 +153,7 @@ public class ByteDanceAdvertiserDataServiceImpl implements IByteDanceAdvertiserD
     @Override
     public Map<String, Object> getAdvertiserBudget(String accountId) {
         Map<String, Object> resultMap = new HashMap<>();
-        CTopOauthToken cTopOauthToken = tokenService.getOauthTokenByAccountId(accountId);
+        CtopOauthToken cTopOauthToken = tokenService.getOauthTokenByAccountId(accountId);
         //2: 根据token以及用户id获取用户信息数据
         String url = PropertiesUtils.getValue("bytedance_config", "bytedance_api_url") + PropertiesUtils.getValue("bytedance_config", "bytedance_v2_campaign_get");
         Map<String, String> headers = new HashMap<>();
@@ -155,14 +167,14 @@ public class ByteDanceAdvertiserDataServiceImpl implements IByteDanceAdvertiserD
         Integer code = jsonObject.getInteger("code");
 
         if (null == code || !code.equals(0)) {
-            logger.info("获取广告预算信息接口异常==》accountId:{},message:{}", accountId, jsonObject.getString("message"));
+            log.info("获取广告预算信息接口异常==》accountId:{},message:{}", accountId, jsonObject.getString("message"));
             resultMap.put("code", -1);
             resultMap.put("message", "获取广告预算信息接口异常");
             return resultMap;
         }
         JSONArray data = jsonObject.getJSONArray("data");
         if (null == data || data.size() <= 0) {
-            logger.info("广告主预算信息不存在==》accountId:{},message:{}", accountId, jsonObject.getString("message"));
+            log.info("广告主预算信息不存在==》accountId:{},message:{}", accountId, jsonObject.getString("message"));
             resultMap.put("code", 0);
             resultMap.put("message", "获取广告主预算信息完成");
             return resultMap;
@@ -191,7 +203,7 @@ public class ByteDanceAdvertiserDataServiceImpl implements IByteDanceAdvertiserD
     @Override
     public Map<String, Object> getAdvertiserCreativeMaterial(String accountId, String creativeIds) {
         Map<String, Object> resultMap = new HashMap<>();
-        CTopOauthToken cTopOauthToken = tokenService.getOauthTokenByAccountId(accountId);
+        CtopOauthToken cTopOauthToken = tokenService.getOauthTokenByAccountId(accountId);
         //2: 根据token以及用户id获取用户信息数据
         String url = PropertiesUtils.getValue("bytedance_config", "bytedance_api_url") + PropertiesUtils.getValue("bytedance_config", "bytedance_v2_creative_material_get");
         Map<String, String> headers = new HashMap<>();
@@ -206,14 +218,14 @@ public class ByteDanceAdvertiserDataServiceImpl implements IByteDanceAdvertiserD
         Integer code = jsonObject.getInteger("code");
 
         if (null == code || !code.equals(0)) {
-            logger.info("获取广告主创意素材信息接口异常==》accountId:{},message:{}", accountId, jsonObject.getString("message"));
+            log.info("获取广告主创意素材信息接口异常==》accountId:{},message:{}", accountId, jsonObject.getString("message"));
             resultMap.put("code", -1);
             resultMap.put("message", "获取广告主创意素材信息接口异常");
             return resultMap;
         }
         JSONArray data = jsonObject.getJSONArray("data");
         if (null == data || data.size() <= 0) {
-            logger.info("广告主创意素材信息不存在==》accountId:{},message:{}", accountId, jsonObject.getString("message"));
+            log.info("广告主创意素材信息不存在==》accountId:{},message:{}", accountId, jsonObject.getString("message"));
             resultMap.put("code", 0);
             resultMap.put("message", "获取广告主预算信息完成");
             return resultMap;
@@ -240,7 +252,7 @@ public class ByteDanceAdvertiserDataServiceImpl implements IByteDanceAdvertiserD
                 ids.add(Long.parseLong(getIds[i]));
             }
         }
-        CTopOauthToken cTopOauthToken = tokenService.getOauthTokenByAccountId(accountId);
+        CtopOauthToken cTopOauthToken = tokenService.getOauthTokenByAccountId(accountId);
         //2: 根据token以及用户id获取用户信息数据
         String url = PropertiesUtils.getValue("bytedance_config", "bytedance_api_url") + PropertiesUtils.getValue("bytedance_config", "bytedance_v2_campaign_update_status");
         Map<String, String> headers = new HashMap<>();
@@ -256,14 +268,14 @@ public class ByteDanceAdvertiserDataServiceImpl implements IByteDanceAdvertiserD
         Integer code = jsonObject.getInteger("code");
 
         if (null == code || !code.equals(0)) {
-            logger.info("广告组更新状态接口异常==》accountId:{},message:{}", accountId, jsonObject.getString("message"));
+            log.info("广告组更新状态接口异常==》accountId:{},message:{}", accountId, jsonObject.getString("message"));
             resultMap.put("code", -1);
             resultMap.put("message", "广告组更新状态接口异常");
             return resultMap;
         }
         JSONObject data = jsonObject.getJSONObject("data");
         if (null == data) {
-            logger.info("广告组更新状态异常==》accountId:{},message:{}", accountId, jsonObject.getString("message"));
+            log.info("广告组更新状态异常==》accountId:{},message:{}", accountId, jsonObject.getString("message"));
             resultMap.put("code", -1);
             resultMap.put("message", "广告组更新状态异常");
             return resultMap;
@@ -287,7 +299,7 @@ public class ByteDanceAdvertiserDataServiceImpl implements IByteDanceAdvertiserD
     @Override
     public Map<String, Object> advertiserCampaignUpdate(String accountId, Long campaignId, String budgetMode, Integer budget, String campaignName) {
         Map<String, Object> resultMap = new HashMap<>();
-        CTopOauthToken cTopOauthToken = tokenService.getOauthTokenByAccountId(accountId);
+        CtopOauthToken cTopOauthToken = tokenService.getOauthTokenByAccountId(accountId);
         ByteDanceCampaign campaign = campaignMapper.selectById(campaignId);
         //2: 根据token以及用户id获取用户信息数据
         String url = PropertiesUtils.getValue("bytedance_config", "bytedance_api_url") + PropertiesUtils.getValue("bytedance_config", "bytedance_v2_campaign_update");
@@ -314,14 +326,14 @@ public class ByteDanceAdvertiserDataServiceImpl implements IByteDanceAdvertiserD
         Integer code = jsonObject.getInteger("code");
 
         if (null == code || !code.equals(0)) {
-            logger.info("广告组更新接口异常==》accountId:{},message:{}", accountId, jsonObject.getString("message"));
+            log.info("广告组更新接口异常==》accountId:{},message:{}", accountId, jsonObject.getString("message"));
             resultMap.put("code", -1);
             resultMap.put("message", "广告组更新接口异常");
             return resultMap;
         }
         JSONObject data = jsonObject.getJSONObject("data");
         if (null == data) {
-            logger.info("广告组更新异常==》accountId:{},message:{}", accountId, jsonObject.getString("message"));
+            log.info("广告组更新异常==》accountId:{},message:{}", accountId, jsonObject.getString("message"));
             resultMap.put("code", -1);
             resultMap.put("message", "广告组更新异常");
             return resultMap;
@@ -353,7 +365,7 @@ public class ByteDanceAdvertiserDataServiceImpl implements IByteDanceAdvertiserD
                 ids.add(Long.parseLong(getIds[i]));
             }
         }
-        CTopOauthToken cTopOauthToken = tokenService.getOauthTokenByAccountId(accountId);
+        CtopOauthToken cTopOauthToken = tokenService.getOauthTokenByAccountId(accountId);
         //2: 根据token以及用户id获取用户信息数据
         String url = PropertiesUtils.getValue("bytedance_config", "bytedance_api_url") + PropertiesUtils.getValue("bytedance_config", "bytedance_v2_ad_update_status");
         Map<String, String> headers = new HashMap<>();
@@ -369,14 +381,14 @@ public class ByteDanceAdvertiserDataServiceImpl implements IByteDanceAdvertiserD
         Integer code = jsonObject.getInteger("code");
 
         if (null == code || !code.equals(0)) {
-            logger.error("广告计划更新状态接口异常==》accountId:{},message:{}", accountId, jsonObject.getString("message"));
+            log.error("广告计划更新状态接口异常==》accountId:{},message:{}", accountId, jsonObject.getString("message"));
             resultMap.put("code", -1);
             resultMap.put("message", "广告计划更新状态接口异常");
             return resultMap;
         }
         JSONObject data = jsonObject.getJSONObject("data");
         if (null == data) {
-            logger.info("广告计划更新状态异常==》accountId:{},message:{}", accountId, jsonObject.getString("message"));
+            log.info("广告计划更新状态异常==》accountId:{},message:{}", accountId, jsonObject.getString("message"));
             resultMap.put("code", -1);
             resultMap.put("message", "广告计划更新状态异常");
             return resultMap;
@@ -408,7 +420,7 @@ public class ByteDanceAdvertiserDataServiceImpl implements IByteDanceAdvertiserD
                 data.add(object);
             }
         }
-        CTopOauthToken cTopOauthToken = tokenService.getOauthTokenByAccountId(accountId);
+        CtopOauthToken cTopOauthToken = tokenService.getOauthTokenByAccountId(accountId);
         //2: 根据token以及用户id获取用户信息数据
         String url = PropertiesUtils.getValue("bytedance_config", "bytedance_api_url") + PropertiesUtils.getValue("bytedance_config", "bytedance_v2_ad_update_bid");
         Map<String, String> headers = new HashMap<>();
@@ -423,14 +435,14 @@ public class ByteDanceAdvertiserDataServiceImpl implements IByteDanceAdvertiserD
         Integer code = jsonObject.getInteger("code");
 
         if (null == code || !code.equals(0)) {
-            logger.info("修改计划出价接口异常==》accountId:{},message:{}", accountId, jsonObject.getString("message"));
+            log.info("修改计划出价接口异常==》accountId:{},message:{}", accountId, jsonObject.getString("message"));
             resultMap.put("code", -1);
             resultMap.put("message", "修改计划出价接口异常");
             return resultMap;
         }
         JSONObject getData = jsonObject.getJSONObject("data");
         if (null == getData) {
-            logger.info("修改计划出价异常==》accountId:{},message:{}", accountId, jsonObject.getString("message"));
+            log.info("修改计划出价异常==》accountId:{},message:{}", accountId, jsonObject.getString("message"));
             resultMap.put("code", -1);
             resultMap.put("message", "修改计划出价异常");
             return resultMap;
@@ -462,7 +474,7 @@ public class ByteDanceAdvertiserDataServiceImpl implements IByteDanceAdvertiserD
                 data.add(object);
             }
         }
-        CTopOauthToken cTopOauthToken = tokenService.getOauthTokenByAccountId(accountId);
+        CtopOauthToken cTopOauthToken = tokenService.getOauthTokenByAccountId(accountId);
         //2: 根据token以及用户id获取用户信息数据
         String url = PropertiesUtils.getValue("bytedance_config", "bytedance_api_url") + PropertiesUtils.getValue("bytedance_config", "bytedance_v2_ad_update_budget");
         Map<String, String> headers = new HashMap<>();
@@ -476,14 +488,14 @@ public class ByteDanceAdvertiserDataServiceImpl implements IByteDanceAdvertiserD
         JSONObject jsonObject = JSONObject.parseObject(result);
         Integer code = jsonObject.getInteger("code");
         if (null == code || !code.equals(0)) {
-            logger.info("修改计划预算接口异常==》accountId:{},message:{}", accountId, jsonObject.getString("message"));
+            log.info("修改计划预算接口异常==》accountId:{},message:{}", accountId, jsonObject.getString("message"));
             resultMap.put("code", -1);
             resultMap.put("message", "修改计划预算接口异常");
             return resultMap;
         }
         JSONObject getData = jsonObject.getJSONObject("data");
         if (null == getData) {
-            logger.info("修改计划预算异常==》accountId:{},message:{}", accountId, jsonObject.getString("message"));
+            log.info("修改计划预算异常==》accountId:{},message:{}", accountId, jsonObject.getString("message"));
             resultMap.put("code", -1);
             resultMap.put("message", "修改计划预算异常");
             return resultMap;
@@ -508,7 +520,7 @@ public class ByteDanceAdvertiserDataServiceImpl implements IByteDanceAdvertiserD
                 ids.add(Long.parseLong(getCreativeIds[i]));
             }
         }
-        CTopOauthToken cTopOauthToken = tokenService.getOauthTokenByAccountId(accountId);
+        CtopOauthToken cTopOauthToken = tokenService.getOauthTokenByAccountId(accountId);
         //2: 根据token以及用户id获取用户信息数据
         String url = PropertiesUtils.getValue("bytedance_config", "bytedance_api_url") + PropertiesUtils.getValue("bytedance_config", "bytedance_v2_creative_update_status");
         Map<String, String> headers = new HashMap<>();
@@ -524,14 +536,14 @@ public class ByteDanceAdvertiserDataServiceImpl implements IByteDanceAdvertiserD
         Integer code = jsonObject.getInteger("code");
 
         if (null == code || !code.equals(0)) {
-            logger.info("修改创意状态接口异常==》accountId:{},message:{}", accountId, jsonObject.getString("message"));
+            log.info("修改创意状态接口异常==》accountId:{},message:{}", accountId, jsonObject.getString("message"));
             resultMap.put("code", -1);
             resultMap.put("message", "修改创意状态接口异常");
             return resultMap;
         }
         JSONObject data = jsonObject.getJSONObject("data");
         if (null == data) {
-            logger.info("修改创意状态异常==》accountId:{},message:{}", accountId, jsonObject.getString("message"));
+            log.info("修改创意状态异常==》accountId:{},message:{}", accountId, jsonObject.getString("message"));
             resultMap.put("code", -1);
             resultMap.put("message", "修改创意状态异常");
             return resultMap;
@@ -554,7 +566,7 @@ public class ByteDanceAdvertiserDataServiceImpl implements IByteDanceAdvertiserD
     @Override
     public Map<String, Object> advertiserCustomAudienceSelect(String accountId) {
         Map<String, Object> resultMap = new HashMap<>();
-        CTopOauthToken token = tokenService.getOauthTokenByAccountId(accountId);
+        CtopOauthToken token = tokenService.getOauthTokenByAccountId(accountId);
 
         String url = PropertiesUtils.getValue("bytedance_config", "bytedance_api_url") + PropertiesUtils.getValue("bytedance_config", "bytedance_v2_dmp_custom_audience_select");
         Map<String, String> headers = new HashMap<>();
@@ -571,7 +583,7 @@ public class ByteDanceAdvertiserDataServiceImpl implements IByteDanceAdvertiserD
         Integer code = jsonObject.getInteger("code");
 
         if (null == code || !code.equals(0)) {
-            logger.info("获取人群包信息接口异常==》accountId:{},message:{}", token.getAdvertiserId(), jsonObject.getString("message"));
+            log.info("获取人群包信息接口异常==》accountId:{},message:{}", token.getAdvertiserId(), jsonObject.getString("message"));
             resultMap.put("success", false);
             resultMap.put("message", "获取人群包信息接口异常");
             resultMap.put("code", -1);
@@ -579,7 +591,7 @@ public class ByteDanceAdvertiserDataServiceImpl implements IByteDanceAdvertiserD
         }
         JSONArray data = jsonObject.getJSONObject("data").getJSONArray("custom_audience_list");
         if (null == data || data.size() <= 0) {
-            logger.info("人群包信息不存在==》accountId:{},message:{}", token.getAdvertiserId(), jsonObject.getString("message"));
+            log.info("人群包信息不存在==》accountId:{},message:{}", token.getAdvertiserId(), jsonObject.getString("message"));
             resultMap.put("success", false);
             resultMap.put("message", "人群包信息不存在");
             resultMap.put("code", -1);
@@ -598,18 +610,8 @@ public class ByteDanceAdvertiserDataServiceImpl implements IByteDanceAdvertiserD
         return resultMap;
     }
 
-    @Autowired
-    private ByteDanceCampaignTemplateMapper campaignTemplateMapper;
-
-
-    @Autowired
-    private ByteDanceCustomAudienceMapper audienceMapper;
-
-    @Autowired
-    private ByteDanceCreativeMaterialMapper creativeMaterialMapper;
-
     private void getAdvertiserCreativeByPageNumber(String accountId, Integer pageNumber, String ids) {
-        CTopOauthToken cTopOauthToken = tokenService.getOauthTokenByAccountId(accountId);
+        CtopOauthToken cTopOauthToken = tokenService.getOauthTokenByAccountId(accountId);
         //2: 根据token以及用户id获取用户信息数据
         String url = PropertiesUtils.getValue("bytedance_config", "bytedance_api_url") + PropertiesUtils.getValue("bytedance_config", "bytedance_v2_creative_get");
         Map<String, String> headers = new HashMap<>();
@@ -635,12 +637,12 @@ public class ByteDanceAdvertiserDataServiceImpl implements IByteDanceAdvertiserD
         Integer code = jsonObject.getInteger("code");
 
         if (null == code || !code.equals(0)) {
-            logger.info("获取广告主广告创意信息接口异常==》accountId:{},message:{}", accountId, jsonObject.getString("message"));
+            log.info("获取广告主广告创意信息接口异常==》accountId:{},message:{}", accountId, jsonObject.getString("message"));
             return;
         }
         JSONArray data = jsonObject.getJSONObject("data").getJSONArray("list");
         if (null == data || data.size() <= 0) {
-            logger.info("广告主广告创意信息不存在==》accountId:{},message:{}", accountId, jsonObject.getString("message"));
+            log.info("广告主广告创意信息不存在==》accountId:{},message:{}", accountId, jsonObject.getString("message"));
             return;
         }
         for (int i = 0; i < data.size(); i++) {
@@ -653,13 +655,8 @@ public class ByteDanceAdvertiserDataServiceImpl implements IByteDanceAdvertiserD
         getAdvertiserCreativeByPageNumber(accountId, pageNumber + 1, ids);
     }
 
-    @Autowired
-    private ByteDanceCreativeMapper creativeMapper;
-    @Autowired
-    private ByteDanceAdvertiserBudgetMapper advertiserBudgetMapper;
-
     private void getAdvertiserCampaignByPageNumber(String accountId, Integer pageNumber, String ids) {
-        CTopOauthToken cTopOauthToken = tokenService.getOauthTokenByAccountId(accountId);
+        CtopOauthToken cTopOauthToken = tokenService.getOauthTokenByAccountId(accountId);
         //2: 根据token以及用户id获取用户信息数据
         String url = PropertiesUtils.getValue("bytedance_config", "bytedance_api_url") + PropertiesUtils.getValue("bytedance_config", "bytedance_v2_campaign_get");
         Map<String, String> headers = new HashMap<>();
@@ -685,12 +682,12 @@ public class ByteDanceAdvertiserDataServiceImpl implements IByteDanceAdvertiserD
         Integer code = jsonObject.getInteger("code");
 
         if (null == code || !code.equals(0)) {
-            logger.error("获取广告组信息接口异常==》accountId:{},message:{}", accountId, jsonObject.getString("message"));
+            log.error("获取广告组信息接口异常==》accountId:{},message:{}", accountId, jsonObject.getString("message"));
             return;
         }
         JSONArray data = jsonObject.getJSONObject("data").getJSONArray("list");
         if (null == data || data.size() <= 0) {
-            logger.error("获取广告组信息不存在==》accountId:{},message:{}", accountId, jsonObject.getString("message"));
+            log.error("获取广告组信息不存在==》accountId:{},message:{}", accountId, jsonObject.getString("message"));
             return;
         }
         for (int i = 0; i < data.size(); i++) {
@@ -702,10 +699,4 @@ public class ByteDanceAdvertiserDataServiceImpl implements IByteDanceAdvertiserD
         }
         getAdvertiserCampaignByPageNumber(accountId, pageNumber + 1, ids);
     }
-
-    @Autowired
-    private ByteDanceCampaignMapper campaignMapper;
-
-    @Autowired
-    private ByteDanceAdvertiserMapper advertiserMapper;
 }

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

@@ -13,8 +13,6 @@ import org.jeecg.common.util.StatusCode;
 import org.jeecg.modules.ctop.entity.ByteDanceBudgetTemplate;
 import org.jeecg.modules.ctop.mapper.ByteDanceBudgetTemplateMapper;
 import org.jeecg.modules.ctop.service.IByteDanceBudgetTemplateService;
-import org.jeecg.modules.ctop.service.ICTopOauthTokenService;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import javax.servlet.http.HttpServletRequest;
@@ -81,9 +79,4 @@ public class ByteDanceBudgetTemplateServiceImpl extends ServiceImpl<ByteDanceBud
         result.setResult(pageList);
         return result;
     }
-
-    @Autowired
-    private ICTopOauthTokenService tokenService;
-    @Autowired
-    private ByteDanceBudgetTemplateMapper budgetTemplateMapper;
 }

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

@@ -7,9 +7,9 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+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;
@@ -23,13 +23,11 @@ import org.jeecg.common.util.ResultMapUtils;
 import org.jeecg.common.util.StatusCode;
 import org.jeecg.modules.ctop.entity.ByteDanceCampaign;
 import org.jeecg.modules.ctop.entity.ByteDanceCampaignTemplate;
-import org.jeecg.modules.ctop.entity.CTopOauthToken;
+import org.jeecg.modules.ctop.entity.CtopOauthToken;
 import org.jeecg.modules.ctop.mapper.ByteDanceCampaignMapper;
 import org.jeecg.modules.ctop.mapper.ByteDanceCampaignTemplateMapper;
 import org.jeecg.modules.ctop.service.IByteDanceCampaignTemplateService;
-import org.jeecg.modules.ctop.service.ICTopOauthTokenService;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import org.jeecg.modules.ctop.service.ICtopOauthTokenService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
@@ -37,7 +35,6 @@ import javax.servlet.http.HttpServletRequest;
 import java.io.BufferedReader;
 import java.io.IOException;
 import java.io.InputStreamReader;
-import java.net.URI;
 import java.text.SimpleDateFormat;
 import java.util.Date;
 import java.util.HashMap;
@@ -49,9 +46,15 @@ import java.util.Map;
  * @Date: 2019-07-22
  * @Version: V1.0
  */
+@Slf4j
 @Service
 public class ByteDanceCampaignTemplateServiceImpl extends ServiceImpl<ByteDanceCampaignTemplateMapper, ByteDanceCampaignTemplate> implements IByteDanceCampaignTemplateService {
-    private static final Logger logger = LoggerFactory.getLogger(ByteDanceCampaignTemplateServiceImpl.class);
+    @Autowired
+    private ByteDanceCampaignTemplateMapper campaignTemplateMapper;
+    @Autowired
+    private ICtopOauthTokenService tokenService;
+    @Autowired
+    private ByteDanceCampaignMapper campaignMapper;
     @Override
     public Map<String, Object> insertTemplate(ByteDanceCampaignTemplate template) {
         Map<String, Object> resultMap = new HashMap<>();
@@ -81,6 +84,7 @@ public class ByteDanceCampaignTemplateServiceImpl extends ServiceImpl<ByteDanceC
         ResultMapUtils.setResultMap(resultMap, StatusCode.COMMON_SUCCESS.getCode());
         return resultMap;
     }
+
     @Override
     public Result<IPage<ByteDanceCampaignTemplate>> getList(ByteDanceCampaignTemplate template, Integer pageNo, Integer pageSize, HttpServletRequest req) {
         Result<IPage<ByteDanceCampaignTemplate>> result = new Result<>();
@@ -98,7 +102,7 @@ public class ByteDanceCampaignTemplateServiceImpl extends ServiceImpl<ByteDanceC
     @Override
     public Map<String, Object> campaignCreate(String accountId, String campaignName, String budgetMode, Integer budget, String landingType) {
         Map<String, Object> resultMap = new HashMap<>();
-        CTopOauthToken token = tokenService.getOauthTokenByAccountId(accountId);
+        CtopOauthToken token = tokenService.getOauthTokenByAccountId(accountId);
         //2: 根据token以及用户id获取用户信息数据
         JSONObject params = new JSONObject();
         params.put("advertiser_id", token.getAccountId());
@@ -110,14 +114,14 @@ public class ByteDanceCampaignTemplateServiceImpl extends ServiceImpl<ByteDanceC
         Integer code = result.getInteger("code");
 
         if (null == code || !code.equals(0)) {
-            logger.info("创建广告组接口异常==》accountId:{},message:{}", accountId, result.getString("message"));
+            log.info("创建广告组接口异常==》accountId:{},message:{}", accountId, result.getString("message"));
             resultMap.put("code", -1);
             resultMap.put("message", "创建广告组接口异常");
             return resultMap;
         }
         JSONObject data = result.getJSONObject("data");
         if (null == data) {
-            logger.info("广告组创建异常==》accountId:{},message:{}", accountId, result.getString("message"));
+            log.info("广告组创建异常==》accountId:{},message:{}", accountId, result.getString("message"));
             resultMap.put("code", -1);
             resultMap.put("message", "广告组创建异常");
             return resultMap;
@@ -132,12 +136,12 @@ public class ByteDanceCampaignTemplateServiceImpl extends ServiceImpl<ByteDanceC
 
     @Override
     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;
     }
 
-    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/";
         // 请求参数
@@ -151,7 +155,7 @@ public class ByteDanceCampaignTemplateServiceImpl extends ServiceImpl<ByteDanceC
     }
 
     @Override
-    public Map<String, Object> campaignCreate(CTopOauthToken token, ByteDanceCampaignTemplate template) {
+    public Map<String, Object> campaignCreate(CtopOauthToken token, ByteDanceCampaignTemplate template) {
         Map<String, Object> resultMap = new HashMap<>();
         //2: 根据token以及用户id获取用户信息数据
         JSONObject params = new JSONObject();
@@ -164,14 +168,14 @@ public class ByteDanceCampaignTemplateServiceImpl extends ServiceImpl<ByteDanceC
         Integer code = result.getInteger("code");
 
         if (null == code || !code.equals(0)) {
-            logger.info("创建广告组接口异常==》accountId:{},message:{}", token.getAccountId(), result.getString("message"));
+            log.info("创建广告组接口异常==》accountId:{},message:{}", token.getAccountId(), result.getString("message"));
             resultMap.put("code", -1);
             resultMap.put("message", result.getString("message"));
             return resultMap;
         }
         JSONObject data = result.getJSONObject("data");
         if (null == data) {
-            logger.info("广告组创建异常==》accountId:{},message:{}", token.getAccountId(), result.getString("message"));
+            log.info("广告组创建异常==》accountId:{},message:{}", token.getAccountId(), result.getString("message"));
             resultMap.put("code", -1);
             resultMap.put("message", "广告组创建异常");
             return resultMap;
@@ -188,7 +192,7 @@ public class ByteDanceCampaignTemplateServiceImpl extends ServiceImpl<ByteDanceC
     @Override
     public Map<String, Object> campaignCreate(String getAccountId, Long campaignId, String name) {
         ByteDanceCampaignTemplate template = campaignTemplateMapper.selectById(campaignId);
-        CTopOauthToken token = tokenService.getOauthTokenByAccountId(getAccountId);
+        CtopOauthToken token = tokenService.getOauthTokenByAccountId(getAccountId);
         Map<String, Object> resultMap = new HashMap<>();
         //2: 根据token以及用户id获取用户信息数据
         JSONObject params = new JSONObject();
@@ -202,7 +206,7 @@ public class ByteDanceCampaignTemplateServiceImpl extends ServiceImpl<ByteDanceC
         Integer code = result.getInteger("code");
 
         if (null == code || !code.equals(0)) {
-            logger.info("创建广告组接口异常==》accountId:{},message:{}", token.getAccountId(), result.getString("message"));
+            log.info("创建广告组接口异常==》accountId:{},message:{}", token.getAccountId(), result.getString("message"));
             resultMap.put("success", false);
             resultMap.put("code", -1);
             resultMap.put("message", result.getString("message"));
@@ -210,7 +214,7 @@ public class ByteDanceCampaignTemplateServiceImpl extends ServiceImpl<ByteDanceC
         }
         JSONObject data = result.getJSONObject("data");
         if (null == data) {
-            logger.info("广告组创建异常==》accountId:{},message:{}", token.getAccountId(), result.getString("message"));
+            log.info("广告组创建异常==》accountId:{},message:{}", token.getAccountId(), result.getString("message"));
             resultMap.put("success", false);
             resultMap.put("code", -1);
             resultMap.put("message", "广告组创建异常");
@@ -267,11 +271,4 @@ public class ByteDanceCampaignTemplateServiceImpl extends ServiceImpl<ByteDanceC
         }
         return null;
     }
-
-    @Autowired
-    private ByteDanceCampaignTemplateMapper campaignTemplateMapper;
-    @Autowired
-    private ICTopOauthTokenService tokenService;
-    @Autowired
-    private ByteDanceCampaignMapper campaignMapper;
 }

+ 15 - 20
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/service/impl/ByteDanceCreativeServiceImpl.java

@@ -4,6 +4,7 @@ import cn.com.ctop.common.utils.PropertiesUtils;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+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;
@@ -14,11 +15,9 @@ import org.apache.http.impl.client.HttpClientBuilder;
 import org.jeecg.common.util.ResultMapUtils;
 import org.jeecg.common.util.StatusCode;
 import org.jeecg.modules.ctop.entity.ByteDanceCreative;
-import org.jeecg.modules.ctop.entity.CTopOauthToken;
+import org.jeecg.modules.ctop.entity.CtopOauthToken;
 import org.jeecg.modules.ctop.mapper.ByteDanceCreativeMapper;
 import org.jeecg.modules.ctop.service.*;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
@@ -34,15 +33,25 @@ import java.util.Map;
  * @Date: 2019-07-22
  * @Version: V1.0
  */
+@Slf4j
 @Service
 public class ByteDanceCreativeServiceImpl extends ServiceImpl<ByteDanceCreativeMapper, ByteDanceCreative> implements IByteDanceCreativeService {
-    private static final Logger logger = LoggerFactory.getLogger(ByteDanceCreativeServiceImpl.class);
+    @Autowired
+    private IFileInfoService fileInfoService;
+    @Autowired
+    private IByteDanceCampaignTemplateService campaignTemplateService;
+    @Autowired
+    private IBytedanceAdvertisePlanTemplateService planTemplateService;
+    @Autowired
+    private IByteDanceAdvertiserDataService advertiserDataService;
+    @Autowired
+    private ICtopOauthTokenService tokenService;
 
     @Override
     public Map<String, Object> creativeCreate(String accountId, Long adId, String dataString) {
         Map<String, Object> resultMap = new HashMap<>();
         //1:获取token
-        CTopOauthToken token = tokenService.getOauthTokenByAccountId(accountId);
+        CtopOauthToken token = tokenService.getOauthTokenByAccountId(accountId);
         JSONObject data = JSONObject.parseObject(dataString);
         data.put("advertiser_id", token.getAccountId());
         data.put("ad_id", adId);
@@ -51,7 +60,7 @@ public class ByteDanceCreativeServiceImpl extends ServiceImpl<ByteDanceCreativeM
         Integer code = result.getInteger("code");
         String message = result.getString("message");
         if (null == code || code != 0) {
-            logger.info("广告创意创建失败,accountId:{},message:{}", accountId, message);
+            log.info("广告创意创建失败,accountId:{},message:{}", accountId, message);
             resultMap.put("success", false);
             resultMap.put("code", -1);
             resultMap.put("message", message);
@@ -64,12 +73,6 @@ public class ByteDanceCreativeServiceImpl extends ServiceImpl<ByteDanceCreativeM
         return resultMap;
     }
 
-    @Autowired
-    private IFileInfoService fileInfoService;
-    @Autowired
-    private IByteDanceCampaignTemplateService campaignTemplateService;
-    @Autowired
-    private IBytedanceAdvertisePlanTemplateService planTemplateService;
 
     @Override
     public Map<String, Object> insertBatch(JSONObject template) {
@@ -256,14 +259,9 @@ public class ByteDanceCreativeServiceImpl extends ServiceImpl<ByteDanceCreativeM
     }
 
 
-    @Autowired
-    private IByteDanceAdvertiserDataService advertiserDataService;
-
     public JSONObject createCreative(JSONObject data, String token) {
-
         // 构造请求
         String url = PropertiesUtils.getValue("bytedance_config", "bytedance_api_url") + PropertiesUtils.getValue("bytedance_config", "bytedance_v2_creative_create_v2");
-        // 构造请求
         HttpPost httpEntity = new HttpPost(url);
         httpEntity.setHeader("Access-Token", token);
         CloseableHttpResponse response = null;
@@ -299,7 +297,4 @@ public class ByteDanceCreativeServiceImpl extends ServiceImpl<ByteDanceCreativeM
         }
         return null;
     }
-
-    @Autowired
-    private ICTopOauthTokenService tokenService;
 }

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

@@ -11,7 +11,6 @@ import org.jeecg.common.system.vo.LoginUser;
 import org.jeecg.modules.ctop.entity.ByteDanceUserOrientationTemplate;
 import org.jeecg.modules.ctop.mapper.ByteDanceUserOrientationTemplateMapper;
 import org.jeecg.modules.ctop.service.IByteDanceUserOrientationTemplateService;
-import org.jeecg.modules.ctop.service.ICTopOauthTokenService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
@@ -27,6 +26,8 @@ import java.util.Map;
  */
 @Service
 public class ByteDanceUserOrientationTemplateServiceImpl extends ServiceImpl<ByteDanceUserOrientationTemplateMapper, ByteDanceUserOrientationTemplate> implements IByteDanceUserOrientationTemplateService {
+    @Autowired
+    private ByteDanceUserOrientationTemplateMapper templateMapper;
 
     @Override
     public Map<String, Object> insertTemplate(ByteDanceUserOrientationTemplate template) {
@@ -53,9 +54,4 @@ public class ByteDanceUserOrientationTemplateServiceImpl extends ServiceImpl<Byt
         result.setResult(pageList);
         return result;
     }
-
-    @Autowired
-    private ICTopOauthTokenService tokenService;
-    @Autowired
-    private ByteDanceUserOrientationTemplateMapper templateMapper;
 }

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

@@ -8,7 +8,7 @@ import org.jeecg.modules.ctop.entity.*;
 import org.jeecg.modules.ctop.mapper.*;
 import org.jeecg.modules.ctop.service.IByteDanceAdvertisePlanService;
 import org.jeecg.modules.ctop.service.IBytedanceAdvertisePlanTemplateService;
-import org.jeecg.modules.ctop.service.ICTopOauthTokenService;
+import org.jeecg.modules.ctop.service.ICtopOauthTokenService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
@@ -25,6 +25,22 @@ import java.util.Map;
 @Service
 public class BytedanceAdvertisePlanTemplateServiceImpl extends ServiceImpl<BytedanceAdvertisePlanTemplateMapper, BytedanceAdvertisePlanTemplate> implements IBytedanceAdvertisePlanTemplateService {
 
+    @Autowired
+    private ByteDanceCampaignMapper campaignMapper;
+    @Autowired
+    private ByteDanceBudgetTemplateMapper budgetTemplateMapper;
+    @Autowired
+    private BytedanceDeliveryTargetTemplateMapper deliveryTargetTemplateMapper;
+    @Autowired
+    private ByteDanceUserOrientationTemplateMapper userOrientationTemplateMapper;
+
+    @Autowired
+    private IByteDanceAdvertisePlanService advertisePlanService;
+    @Autowired
+    private BytedanceAdvertisePlanTemplateMapper templateMapper;
+    @Autowired
+    private ICtopOauthTokenService tokenService;
+
     @Override
     public Map<String, Object> insertTemplate(BytedanceAdvertisePlanTemplate template, String accountId) {
         Map<String, Object> resultMap = new HashMap<>();
@@ -48,7 +64,7 @@ public class BytedanceAdvertisePlanTemplateServiceImpl extends ServiceImpl<Byted
      */
     @Override
     public Map<String, Object> planCreate(Long campaignId, String getAccountId, String deliveryRange, Long userorentationId, Long budgetId, Long deliverytargetId, String getName, String convertId) {
-        CTopOauthToken token = tokenService.getOauthTokenByAccountId(getAccountId);
+        CtopOauthToken token = tokenService.getOauthTokenByAccountId(getAccountId);
         ByteDanceBudgetTemplate budgetTemplate = budgetTemplateMapper.selectById(budgetId);
         BytedanceDeliveryTargetTemplate deliveryTargetTemplate = deliveryTargetTemplateMapper.selectById(deliverytargetId);
         ByteDanceUserOrientationTemplate userOrientationTemplate = userOrientationTemplateMapper.selectById(userorentationId);
@@ -82,8 +98,8 @@ public class BytedanceAdvertisePlanTemplateServiceImpl extends ServiceImpl<Byted
         //(3):预算与出价
         //广告预算类型 日预算、总预算
         data.put("budget_mode", budgetTemplate.getBudgetPriceMode());
-        //广告预算
-        data.put("budget", budgetTemplate.getBudgetPrice());//需要大于bid
+        //广告预算 //需要大于bid
+        data.put("budget", budgetTemplate.getBudgetPrice());
         //转化出价(ocpm请填写 cpa_bid)
         data.put("cpa_bid", budgetTemplate.getConvertPrice());
         data.put("convert_id", convertId);
@@ -96,8 +112,8 @@ public class BytedanceAdvertisePlanTemplateServiceImpl extends ServiceImpl<Byted
         /**
          * 广告投放指定时间段
          * 广告投放时段,默认全时段投放,格式是48*7位字符串,且都是0或1。也就是以半个小时为最小粒度,周一至周日每天分为48个区段,0为不投放,1为投放,不传、全传0、全传1均代表全时段投放。
+         * data.put("schedule_time", "2019-07-31 01:00");
          */
-//        data.put("schedule_time", "2019-07-31 01:00");
         //付费方式
         data.put("pricing", budgetTemplate.getPriceType());
         //广告投放速度类型 (投放方式) 优先跑量,均衡投放,优先低成本
@@ -108,20 +124,4 @@ public class BytedanceAdvertisePlanTemplateServiceImpl extends ServiceImpl<Byted
         data.put("name", getName + "_计划_" + System.currentTimeMillis());
         return advertisePlanService.advertiserPlanCreate(token, campaignId, data.toJSONString());
     }
-
-    @Autowired
-    private ByteDanceCampaignMapper campaignMapper;
-    @Autowired
-    private ByteDanceBudgetTemplateMapper budgetTemplateMapper;
-    @Autowired
-    private BytedanceDeliveryTargetTemplateMapper deliveryTargetTemplateMapper;
-    @Autowired
-    private ByteDanceUserOrientationTemplateMapper userOrientationTemplateMapper;
-
-    @Autowired
-    private IByteDanceAdvertisePlanService advertisePlanService;
-    @Autowired
-    private BytedanceAdvertisePlanTemplateMapper templateMapper;
-    @Autowired
-    private ICTopOauthTokenService tokenService;
 }

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

@@ -16,7 +16,6 @@ import org.jeecg.modules.ctop.entity.BytedanceUrlInfo;
 import org.jeecg.modules.ctop.mapper.BytedanceDeliveryTargetTemplateMapper;
 import org.jeecg.modules.ctop.mapper.BytedanceUrlInfoMapper;
 import org.jeecg.modules.ctop.service.IBytedanceDeliveryTargetTemplateService;
-import org.jeecg.modules.ctop.service.ICTopOauthTokenService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
@@ -33,6 +32,8 @@ import java.util.Map;
  */
 @Service
 public class BytedanceDeliveryTargetTemplateServiceImpl extends ServiceImpl<BytedanceDeliveryTargetTemplateMapper, BytedanceDeliveryTargetTemplate> implements IBytedanceDeliveryTargetTemplateService {
+    @Autowired
+    BytedanceUrlInfoMapper urlInfoMapper;
 
     @Override
     public Map<String, Object> insertTemplate(BytedanceDeliveryTargetTemplate template) {
@@ -72,9 +73,6 @@ public class BytedanceDeliveryTargetTemplateServiceImpl extends ServiceImpl<Byte
         return resultMap;
     }
 
-    @Autowired
-    BytedanceUrlInfoMapper urlInfoMapper;
-
     @Override
     public Result<IPage<BytedanceDeliveryTargetTemplate>> getList(BytedanceDeliveryTargetTemplate template, Integer pageNo, Integer pageSize, HttpServletRequest req) {
         Result<IPage<BytedanceDeliveryTargetTemplate>> result = new Result<>();
@@ -90,11 +88,6 @@ public class BytedanceDeliveryTargetTemplateServiceImpl extends ServiceImpl<Byte
     }
 
     @Override
-    public JSONObject getSiteList(Long accountId) {
-        return null;
-    }
-
-    @Override
     public Map<String, Object> get(Long targetId) {
         Map<String, Object> result = new HashMap<>();
         if (null == targetId || targetId == 0) {
@@ -110,9 +103,4 @@ public class BytedanceDeliveryTargetTemplateServiceImpl extends ServiceImpl<Byte
         result.put("data", template);
         return result;
     }
-
-    @Autowired
-    private ICTopOauthTokenService tokenService;
-    @Autowired
-    private BytedanceDeliveryTargetTemplateMapper deliveryTargetTemplateMapper;
 }

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

@@ -1,55 +1,177 @@
 package org.jeecg.modules.ctop.service.impl;
 
-import cn.com.ctop.common.utils.HttpUtils;
+import cn.com.ctop.common.utils.HttpUtils2;
 import cn.com.ctop.crawler.modules.core.util.FateadmHttpUtil;
 import cn.com.ctop.crawler.modules.core.util.FateadmUtil;
 import com.alibaba.fastjson.JSONObject;
 import com.fasterxml.jackson.databind.DeserializationFeature;
 import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.ObjectMapper;
+import lombok.extern.slf4j.Slf4j;
 import org.apache.http.impl.cookie.BasicClientCookie;
+import org.jeecg.common.util.ResultMapUtils;
+import org.jeecg.common.util.StatusCode;
+import org.jeecg.modules.ctop.entity.BindAccountLogin;
+import org.jeecg.modules.ctop.entity.BytedanceUrlInfo;
+import org.jeecg.modules.ctop.mapper.BindAccountLoginMapper;
+import org.jeecg.modules.ctop.mapper.BytedanceUrlInfoMapper;
 import org.jeecg.modules.ctop.service.ICreateInternalService;
+import org.openqa.selenium.By;
 import org.openqa.selenium.Cookie;
 import org.openqa.selenium.WebDriver;
+import org.openqa.selenium.WebElement;
 import org.openqa.selenium.chrome.ChromeDriver;
 import org.openqa.selenium.chrome.ChromeOptions;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 import sun.misc.BASE64Decoder;
 
 import java.util.*;
 
+@Slf4j
 @Service
 public class CreateInternalServiceImpl implements ICreateInternalService {
-    private static final Logger logger = LoggerFactory.getLogger(CreateInternalServiceImpl.class);
-
     @Value("${jeecg.path.chrome-driver}")
     private String chromeDriver;
+    @Autowired
+    private BindAccountLoginMapper bindAccountLoginMapper;
+
+    @Autowired
+    private BytedanceUrlInfoMapper urlInfoMapper;
 
     @Override
-    public Map<String, Object> createInternal(JSONObject requestJson) {
+    public Map<String, Object> checkAccountPassword(String account, String password) {
+        Map<String, Object> resultMap = new HashMap<>();
+        //selenium打开登录页面
         String url = "https://ad.oceanengine.com/pages/login/index.html";
         System.getProperties().setProperty("webdriver.chrome.driver", chromeDriver);
         ChromeOptions chromeOptions = new ChromeOptions();
-//        chromeOptions.addArguments("--headless");
-//        chromeOptions.addArguments("--incognito");
+        chromeOptions.addArguments("--headless");
         chromeOptions.addArguments("--no-sandbox");
-//        chromeOptions.addArguments("--disable-gpu");
         chromeOptions.addArguments("--window-size=1920,1080");
-        chromeOptions.addArguments("--user-agent=" + HttpUtils.USER_AGENT);
+        chromeOptions.addArguments("--user-agent=" + HttpUtils2.USER_AGENT);
         chromeOptions.setAcceptInsecureCerts(true);
         WebDriver webDriver = new ChromeDriver(chromeOptions);
         try {
+            webDriver.get(url);  //获取登录页面
+            for (Cookie cookie : webDriver.manage().getCookies()) {
+                BasicClientCookie ck = new BasicClientCookie(cookie.getName(), cookie.getValue());
+                ck.setDomain("ad.oceanengine.com");
+                ck.setExpiryDate(cookie.getExpiry());
+                ck.setPath(cookie.getPath());
+                HttpUtils2.cookieStore.addCookie(ck);
+            }
+            Map<String, String> header = new HashMap<>();
+            header.put("Accept", "*/*");
+            header.put("Connection", "keep-alive");
+            header.put("Host", "sso.toutiao.com");
+            header.put("Content-Type", "application/x-www-form-urlencoded");
+            header.put("Origin", "https://ad.oceanengine.com");
+            header.put("Referer", "https://ad.oceanengine.com/pages/login/index.html");
+            Map<String, Object> param = new HashMap<>();
+            param.put("mobile", "");
+            param.put("code", "");
+            param.put("account", account);
+            param.put("password", password);
+            param.put("captcha", "hqde");
+            param.put("is_30_days_no_login", "true");
+            param.put("service", "https://ad.oceanengine.com");
+            String res = HttpUtils2.httpPostParamRequest("https://sso.toutiao.com/account_login/", param, header);
+
+            ObjectMapper mapper = new ObjectMapper();
+            mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+            JsonNode jsonNode = mapper.readTree(res);
+            //errorcode == 1102 验证码错误,请重新输入验证码
+            //errorcode == 1101 验证码为空
+
+            Integer errorCode = jsonNode.get("error_code").asInt();
+            String orderId = null;
+            while (errorCode != 0) {
+                //用户名或者密码错误
+                if (null != errorCode && errorCode == 1009) {
+                    ResultMapUtils.setResultMap(resultMap, StatusCode.USERNAME_OR_PASSWORD_ERROR.getCode());
+                    return resultMap;
+                }
+                FateadmUtil fateadmUtil = new FateadmUtil();
+                fateadmUtil.init();
+                if (orderId != null) {
+                    fateadmUtil.Justice(orderId);
+                }
+                String captcha = jsonNode.get("captcha").asText();
+                BASE64Decoder decoder = new BASE64Decoder();
+                FateadmHttpUtil.HttpResp resp = fateadmUtil.Predict("30400", decoder.decodeBuffer(captcha));
+                param.put("captcha", resp.pred_resl);
+                orderId = resp.req_id;
+                res = HttpUtils2.httpPostParamRequest("https://sso.toutiao.com/account_login/", param, header);
+                System.out.println("res:" + res);
+                jsonNode = mapper.readTree(res);
+                errorCode = jsonNode.get("error_code").asInt();
+            }
+            if (errorCode == 0) {
+                //表示登录成功
+                String csrftoken = "";
+                List<org.apache.http.cookie.Cookie> cookies = HttpUtils2.cookieStore.getCookies();
+                for (org.apache.http.cookie.Cookie ck : cookies) {
+                    Cookie cookie = new Cookie(ck.getName(), ck.getValue(), "." + ck.getDomain(), ck.getPath(), ck.getExpiryDate());
+                    webDriver.manage().addCookie(cookie);
+                }
 
+                webDriver.get("https://ad.oceanengine.com/pages/promotion.html#/ad");//登录成功 进入推广页面
+                Thread.sleep(3000);
+                WebElement element = webDriver.findElement(By.xpath("//div[contains(@class,'-user-account-id')] "));
+                if (null != element) {
+                    ResultMapUtils.setResultMap(resultMap, StatusCode.COMMON_SUCCESS.getCode());
+                    String text = element.getText();
+                    text = text.replace("ID:", "").trim();
+                    resultMap.put("id", text);
+                } else {
+                    ResultMapUtils.setResultMap(resultMap, StatusCode.COMMON_SERVER_ERROR.getCode());
+                }
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            ResultMapUtils.setResultMap(resultMap, StatusCode.COMMON_SERVER_ERROR.getCode());
+        } finally {
+            //获得cookie
+            Set<Cookie> coo = webDriver.manage().getCookies();
+            //清除所有的缓存
+            webDriver.manage().deleteAllCookies();
+            webDriver.quit();
+            return resultMap;
+        }
+    }
+    @Override
+    public Map<String, Object> createInternal(JSONObject requestJson) {
+        Map<String, Object> resultMap = new HashMap<>();
+        //1:获取用户名密码
+        Long accountId = requestJson.getLong("accountId");
+        BindAccountLogin bindAccountLogin = bindAccountLoginMapper.selectById(accountId);
+        if (null == bindAccountLogin) {
+            ResultMapUtils.setResultMap(resultMap, StatusCode.ACCOUNT_HAS_NOT_EXIST.getCode());
+            return resultMap;
+        }
+        String url = "https://ad.oceanengine.com/pages/login/index.html";
+        System.getProperties().setProperty("webdriver.chrome.driver", chromeDriver);
+        ChromeOptions chromeOptions = new ChromeOptions();
+        chromeOptions.addArguments("--headless");
+        /**
+         * chromeOptions.addArguments("--incognito");
+         * chromeOptions.addArguments("--disable-gpu");
+         */
+        chromeOptions.addArguments("--no-sandbox");
+        chromeOptions.addArguments("--window-size=1920,1080");
+        chromeOptions.addArguments("--user-agent=" + HttpUtils2.USER_AGENT);
+        chromeOptions.setAcceptInsecureCerts(true);
+        WebDriver webDriver = new ChromeDriver(chromeOptions);
+        try {
             webDriver.get(url);  //获取登录页面
             for (Cookie cookie : webDriver.manage().getCookies()) {
                 BasicClientCookie ck = new BasicClientCookie(cookie.getName(), cookie.getValue());
                 ck.setDomain("ad.oceanengine.com");
                 ck.setExpiryDate(cookie.getExpiry());
                 ck.setPath(cookie.getPath());
-                HttpUtils.cookieStore.addCookie(ck);
+                HttpUtils2.cookieStore.addCookie(ck);
             }
             String html = webDriver.getPageSource();
             Map<String, String> header = new HashMap<String, String>();
@@ -62,22 +184,25 @@ public class CreateInternalServiceImpl implements ICreateInternalService {
             Map<String, Object> param = new HashMap<>();
             param.put("mobile", "");
             param.put("code", "");
-            param.put("account", "dcd_ad@bytedance.com");
-            param.put("password", "typdDCD@2018");
+            param.put("account", bindAccountLogin.getAccountName());
+            param.put("password", bindAccountLogin.getPassword());
             param.put("captcha", "hqde");
             param.put("is_30_days_no_login", "true");
             param.put("service", "https://ad.oceanengine.com");
-            String res = HttpUtils.httpPostParamRequest("https://sso.toutiao.com/account_login/", param, header);
-            System.out.println("res:" + new String(res.getBytes("GBK"), "UTF8"));
+            String res = HttpUtils2.httpPostParamRequest("https://sso.toutiao.com/account_login/", param, header);
 
             ObjectMapper mapper = new ObjectMapper();
             mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
             JsonNode jsonNode = mapper.readTree(res);
-            //errorcode == 1009 表示用户名或者密码错误
             //errorcode == 1102 验证码错误,请重新输入验证码
             //errorcode == 1101 验证码为空
 
             Integer errorCode = jsonNode.get("error_code").asInt();
+            //用户名或者密码错误
+            if (null != errorCode && errorCode == 1009) {
+                ResultMapUtils.setResultMap(resultMap, StatusCode.USERNAME_OR_PASSWORD_ERROR.getCode());
+                return resultMap;
+            }
             String orderId = null;
             while (errorCode != 0) {
                 FateadmUtil fateadmUtil = new FateadmUtil();
@@ -90,14 +215,14 @@ public class CreateInternalServiceImpl implements ICreateInternalService {
                 FateadmHttpUtil.HttpResp resp = fateadmUtil.Predict("30400", decoder.decodeBuffer(captcha));
                 param.put("captcha", resp.pred_resl);
                 orderId = resp.req_id;
-                res = HttpUtils.httpPostParamRequest("https://sso.toutiao.com/account_login/", param, header);
+                res = HttpUtils2.httpPostParamRequest("https://sso.toutiao.com/account_login/", param, header);
                 System.out.println("res:" + res);
                 jsonNode = mapper.readTree(res);
                 errorCode = jsonNode.get("error_code").asInt();
             }
             if (errorCode == 0) {
                 String csrftoken = "";
-                List<org.apache.http.cookie.Cookie> cookies = HttpUtils.cookieStore.getCookies();
+                List<org.apache.http.cookie.Cookie> cookies = HttpUtils2.cookieStore.getCookies();
                 for (org.apache.http.cookie.Cookie ck : cookies) {
                     Cookie cookie = new Cookie(ck.getName(), ck.getValue(), "." + ck.getDomain(), ck.getPath(), ck.getExpiryDate());
                     webDriver.manage().addCookie(cookie);
@@ -106,16 +231,17 @@ public class CreateInternalServiceImpl implements ICreateInternalService {
                 webDriver.get("https://ad.oceanengine.com/pages/promotion.html#/ad");//登录成功 进入推广页面
                 Thread.sleep(3000);
                 webDriver.get("https://ad.oceanengine.com/pages/campaign/create.html");//创建广告组页面
-                Map<String, Object> param2 = new HashMap<String, Object>();
-                Map<String, Object> param3 = new HashMap<String, Object>();
+                String templateName = requestJson.getString("templateName");
+                Map<String, Object> campaignParam = new HashMap<>();
                 String uuid = UUID.randomUUID().toString();
-                param3.put("budget", 0);
-                param3.put("budget_mode", -1);
-                param2.put("campaign_id", "");
-                param2.put("campaign_name", uuid.substring(1, 7));
-                param2.put("landing_type", 3);
-                param2.put("campaign_type", 1);
-                param2.put("budget", param3);
+                campaignParam.put("campaign_id", "");
+                campaignParam.put("campaign_name", templateName + "-广告组-" + uuid.substring(1, 7));
+                campaignParam.put("landing_type", 3);
+                campaignParam.put("campaign_type", 1);
+                Map<String, Object> budgetMap = new HashMap<>();
+                budgetMap.put("budget", 0);
+                budgetMap.put("budget_mode", -1);
+                campaignParam.put("budget", budgetMap);
                 for (Cookie cookie : webDriver.manage().getCookies()) {
                     if ("csrftoken".equals(cookie.getName())) {
                         csrftoken = cookie.getValue();
@@ -124,8 +250,9 @@ public class CreateInternalServiceImpl implements ICreateInternalService {
                     ck.setDomain("ad.oceanengine.com");
                     ck.setExpiryDate(cookie.getExpiry());
                     ck.setPath(cookie.getPath());
-                    HttpUtils.cookieStore.addCookie(ck);
+                    HttpUtils2.cookieStore.addCookie(ck);
                 }
+
                 header.put("Accept", "application/json, text/javascript, */*; q=0.01");
                 header.put("Connection", "keep-alive");
                 header.put("Host", "ad.oceanengine.com");
@@ -134,96 +261,117 @@ public class CreateInternalServiceImpl implements ICreateInternalService {
                 header.put("X-CSRFToken", csrftoken);
                 header.put("X-Requested-With", "XMLHttpRequest");
                 header.put("Referer", "https://ad.oceanengine.com/pages/campaign/create.html");
-                res = HttpUtils.httpPostRequest("https://ad.oceanengine.com/overture/campaign/create/", param2, header);// 创建广告组返回信息
+                res = HttpUtils2.httpPostRequest("https://ad.oceanengine.com/overture/campaign/create/", campaignParam, header);// 创建广告组返回信息
                 System.out.println(res);
-                JsonNode node = mapper.readTree(res);
-                String campaignId = node.get("data").get("campaign_id").asText();  //广告组id
-                String url2 = "https://ad.oceanengine.com/pages/ad/create.html?campaign_id=" + campaignId + "&landing_type=3&temp_id=ADvQb";
-                webDriver.get(url2);
-                header.put("Referer", url2);
-                for (Cookie cookie : webDriver.manage().getCookies()) {
-                    BasicClientCookie ck = new BasicClientCookie(cookie.getName(), cookie.getValue());
-                    ck.setDomain("ad.oceanengine.com");
-                    ck.setExpiryDate(cookie.getExpiry());
-                    ck.setPath(cookie.getPath());
-                    HttpUtils.cookieStore.addCookie(ck);
-                }
-
-                Map<String, Object> param4 = new HashMap<String, Object>();
-                param4.put("location_type", 4);
-                param4.put("aweme_account_fans", 0);
-                String tokenStr = HttpUtils.httpPostRequest("https://ad.oceanengine.com/api/v1/hl/ad/audience/estimate/", param4, header);
-                JsonNode tokenNode = mapper.readTree(tokenStr);
-                Map<String, Object> param5 = new HashMap<String, Object>();
-                param5.put("name", requestJson.getString("templateName"));//模板名称
-                Integer deliveryRange = requestJson.getInteger("deliveryRange");
-                param5.put("delivery_range", deliveryRange);  //投放形式
-                if (deliveryRange == 2) {
-                    param5.put("union_video_type", requestJson.getInteger("deliveryForm")); //投放形式 1:激励视频 2:原生
-                }
-                param5.put("classify", requestJson.getString("adCategory")); //广告类别
-                param5.put("projectid", ""); //
-                Integer downloadType = requestJson.getInteger("downloadType");
-                param5.put("download_type", downloadType); //下载方式  1:下载包 2:h5
-                if (downloadType == 1) {
-                    param5.put("download_url", requestJson.getString("downloadUrl"));
-                }
-                if (downloadType == 2) {
-                    param5.put("external_url", requestJson.getString("externalUrl"));  // 落地页链接
-                }
-                param5.put("delivery_range", 1);  // 投放范围
-                param5.put("classify", 5);  //广告类别  5 内广
-                param5.put("projectid", "");
-                param5.put("localGeolocation", new ArrayList<String>());
-                param5.put("external_action", 4);
-                param5.put("open_url", ""); //  应用直达链接
-                param5.put("style_type", 0);
-                param5.put("location_type", 4); //受众位置类型
-                param5.put("hide_if_exists", 0); // 过滤已安装,当推广目标为安卓应用下载时可填,0表示不过滤,1表示过滤,默认为不过滤
-                param5.put("interest_tag_mode", 0); //兴趣分类
-                param5.put("token", tokenNode.get("data").get("token").asText());
-                param5.put("toutiao", 100000005);  //头条预估数据
-                param5.put("aweme", 150000005); //抖音预估数据
-                param5.put("video_app", 40000005);//西瓜预估数据
-                param5.put("hotsoon", 40000005); //火山预估数据
-                param5.put("aweme_account_fans", 0); //账号粉丝相似人群
-                param5.put("auto_extend_enabled", 0);// 智能放量????
-                param5.put("budget_mode", requestJson.getIntValue("budgetPriceMode"));  // 广告预算类型  0 日预算  1 总预算
-                param5.put("budget", requestJson.getIntValue("budgetPrice")); //广告预算
-                int scheduleType = requestJson.getIntValue("dateQuantum");
-                param5.put("schedule_type", scheduleType); //广告投放时间类型   默认1 1:不限  2:按时间???
-                if (scheduleType == 2) {
-                    param5.put("start_time", requestJson.getString("startDate")); //广告投放起始时间
-                    param5.put("end_time", requestJson.getString("endDate"));//广告投放结束时间
-                }
-                param5.put("week_schedule", new ArrayList<String>());  //投放时段
-                param5.put("week_time", new ArrayList<ArrayList<Integer>>());//投放时段
-                int pricing = requestJson.getIntValue("pricing");
-                param5.put("pricing", pricing); //计划出价类型  9 按展示付费  7 按点击付费 8 按转化付费
-                param5.put("cpa_phrase", 2); //出价为OCPC时,计划处于哪个阶段??
-                param5.put("is_union_slot", "");
-                param5.put("hide_if_converted", 1); //过滤已转化用户类型字段,只有转化为目标时可填 优化目标为转化才展示
-                param5.put("flow_control_mode", requestJson.getIntValue("flowControlMode")); //投放速度/投放方式使用字段
-                if (pricing == 9) {
-                    param5.put("cpa_bid", requestJson.getIntValue("convertPrice"));
-                } else {
-                    param5.put("bid", requestJson.getIntValue("convertPrice"));
+                Integer itratorNum = requestJson.getInteger("itratorNum");
+                if (null != itratorNum && itratorNum > 0) {
+                    //循环创建广告计划
+                    for (int i = 0; i < itratorNum; i++) {
+                        JsonNode node = mapper.readTree(res);
+                        String campaignId = node.get("data").get("campaign_id").asText();  //广告组id
+                        String url2 = "https://ad.oceanengine.com/pages/ad/create.html?campaign_id=" + campaignId + "&landing_type=3&temp_id=ADvQb";
+                        webDriver.get(url2);
+                        header.put("Referer", url2);
+                        for (Cookie cookie : webDriver.manage().getCookies()) {
+                            BasicClientCookie ck = new BasicClientCookie(cookie.getName(), cookie.getValue());
+                            ck.setDomain("ad.oceanengine.com");
+                            ck.setExpiryDate(cookie.getExpiry());
+                            ck.setPath(cookie.getPath());
+                            HttpUtils2.cookieStore.addCookie(ck);
+                        }
+                        Map<String, Object> audienceParam = new HashMap<>();
+                        audienceParam.put("location_type", 4);
+                        audienceParam.put("aweme_account_fans", 0);
+                        String tokenStr = HttpUtils2.httpPostRequest("https://ad.oceanengine.com/api/v1/hl/ad/audience/estimate/", audienceParam, header);
+                        JsonNode tokenNode = mapper.readTree(tokenStr);
+                        Map<String, Object> planParam = new HashMap<>();
+                        planParam.put("name", templateName + "-广告计划-" + uuid.substring(1, 7) + i);//模板名称
+                        Integer deliveryRange = requestJson.getInteger("deliveryRange");
+                        planParam.put("delivery_range", deliveryRange);  //投放形式
+                        if (deliveryRange == 2) {
+                            planParam.put("union_video_type", requestJson.getInteger("deliveryForm")); //投放形式 1:激励视频 2:原生
+                        }
+                        planParam.put("classify", requestJson.getString("adCategory")); //广告类别
+                        planParam.put("projectid", ""); //
+                        Integer downloadType = requestJson.getInteger("downloadType");
+                        planParam.put("download_type", downloadType); //下载方式  1:下载包 2:h5
+                        Long urlId = requestJson.getLong("urlId");
+                        BytedanceUrlInfo urlInfo = urlInfoMapper.selectById(urlId);
+                        if (downloadType == 1) {
+                            planParam.put("download_url", urlInfo.getUrl());
+                            planParam.put("package", urlInfo.getPackageName());
+                        }
+                        if (downloadType == 2) {
+                            planParam.put("external_url", urlInfo.getUrl());  // 落地页链接
+                        }
+                        planParam.put("delivery_range", 1);  // 投放范围
+                        planParam.put("classify", 5);  //广告类别  5 内广
+                        planParam.put("projectid", "");
+                        planParam.put("localGeolocation", new ArrayList<String>());
+                        planParam.put("external_action", 4);
+                        planParam.put("open_url", ""); //  应用直达链接
+                        planParam.put("style_type", 0);
+                        planParam.put("location_type", 4); //受众位置类型
+                        planParam.put("hide_if_exists", 0); // 过滤已安装,当推广目标为安卓应用下载时可填,0表示不过滤,1表示过滤,默认为不过滤
+                        planParam.put("interest_tag_mode", 0); //兴趣分类
+                        planParam.put("token", tokenNode.get("data").get("token").asText());
+                        planParam.put("toutiao", 100000005);  //头条预估数据
+                        planParam.put("aweme", 150000005); //抖音预估数据
+                        planParam.put("video_app", 40000005);//西瓜预估数据
+                        planParam.put("hotsoon", 40000005); //火山预估数据
+                        planParam.put("aweme_account_fans", 0); //账号粉丝相似人群
+                        planParam.put("auto_extend_enabled", 0);// 智能放量????
+                        planParam.put("budget_mode", requestJson.getIntValue("budgetPriceMode"));  // 广告预算类型  0 日预算  1 总预算
+                        planParam.put("budget", requestJson.getIntValue("budgetPrice")); //广告预算
+                        int scheduleType = requestJson.getIntValue("dateQuantum");
+                        planParam.put("schedule_type", scheduleType); //广告投放时间类型   默认1 1:不限  2:按时间???
+                        if (scheduleType == 2) {
+                            planParam.put("start_time", requestJson.getString("startDate")); //广告投放起始时间
+                            planParam.put("end_time", requestJson.getString("endDate"));//广告投放结束时间
+                        }
+                        planParam.put("week_schedule", new ArrayList<String>());  //投放时段
+                        planParam.put("week_time", new ArrayList<ArrayList<Integer>>());//投放时段
+                        int pricing = requestJson.getIntValue("pricing");
+                        planParam.put("pricing", pricing); //计划出价类型  9 按展示付费  7 按点击付费 8 按转化付费
+                        planParam.put("cpa_phrase", 2); //出价为OCPC时,计划处于哪个阶段??
+                        planParam.put("is_union_slot", "");
+                        planParam.put("hide_if_converted", 1); //过滤已转化用户类型字段,只有转化为目标时可填 优化目标为转化才展示
+                        planParam.put("flow_control_mode", requestJson.getIntValue("flowControlMode")); //投放速度/投放方式使用字段
+                        if (pricing == 9) {
+                            planParam.put("cpa_bid", requestJson.getIntValue("convertPrice"));
+                        } else {
+                            planParam.put("bid", requestJson.getIntValue("convertPrice"));
+                        }
+                        planParam.put("smart_bid_type", requestJson.getIntValue("bidType")); //自动出价类型,OCPM支持
+                        planParam.put("adjust_cpa", 0); //是否调整自动出价   允许值: "0", "1"  默认值: 0
+                        planParam.put("app_bid_ratio", new Object());
+                        planParam.put("campaign_id", campaignId);
+                        String downLoadMode = requestJson.getString("downloadMode");
+                        planParam.put("app_type", 201); //app 类型 201 应用推广 安卓 201 应用推广 ios
+                        String createResult = HttpUtils2.httpPostRequest("https://ad.oceanengine.com/overture/ad/create/", planParam, header);
+                        JSONObject result = JSONObject.parseObject(createResult);
+                        System.out.println(result.toJSONString());
+                        String status = result.getString("status");
+                        String msg = result.getString("msg");
+                        if (null != status && !"success".equals(status)) {
+                            resultMap.put("code", -1);
+                            resultMap.put("message", msg);
+                            resultMap.put("success", false);
+                            return resultMap;
+                        }
+                    }
                 }
-                param5.put("package", requestJson.getString("packageName"));
-                param5.put("smart_bid_type", requestJson.getIntValue("bidType")); //自动出价类型,OCPM支持
-                param5.put("adjust_cpa", 0); //是否调整自动出价   允许值: "0", "1"  默认值: 0
-                param5.put("app_bid_ratio", new Object());
-                param5.put("name", "自动创建测试b");  //广计划名称
-                param5.put("campaign_id", campaignId);
-                param5.put("app_type", 201); //app 类型 201 应用推广 安卓 201 应用推广 ios
-                String createResult = HttpUtils.httpPostRequest("https://ad.oceanengine.com/overture/ad/create/", param5, header);
-                System.out.println(createResult);
             }
         } catch (Exception e) {
             e.printStackTrace();
         } finally {
+            //获得cookie
+            Set<Cookie> coo = webDriver.manage().getCookies();
+            //清除所有的缓存
+            webDriver.manage().deleteAllCookies();
             webDriver.quit();
         }
-        return null;
+        ResultMapUtils.setResultMap(resultMap, StatusCode.COMMON_SUCCESS.getCode());
+        return resultMap;
     }
 }

+ 18 - 27
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/service/impl/CTopOauthTokenServiceImpl.java

@@ -8,11 +8,10 @@ import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import constant.KuaishouInterfaceConstant;
-import org.jeecg.modules.ctop.entity.CTopOauthToken;
-import org.jeecg.modules.ctop.mapper.CTopOauthTokenMapper;
-import org.jeecg.modules.ctop.service.ICTopOauthTokenService;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import lombok.extern.slf4j.Slf4j;
+import org.jeecg.modules.ctop.entity.CtopOauthToken;
+import org.jeecg.modules.ctop.mapper.CtopOauthTokenMapper;
+import org.jeecg.modules.ctop.service.ICtopOauthTokenService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
@@ -26,33 +25,30 @@ import java.util.Map;
  * @Date: 2019-07-09
  * @Version: V1.0
  */
+@Slf4j
 @Service
-public class CTopOauthTokenServiceImpl extends ServiceImpl<CTopOauthTokenMapper, CTopOauthToken> implements ICTopOauthTokenService {
-    private static final Logger logger = LoggerFactory.getLogger(CTopOauthTokenServiceImpl.class);
-
-
+public class CtopOauthTokenServiceImpl extends ServiceImpl<CtopOauthTokenMapper, CtopOauthToken> implements ICtopOauthTokenService {
     @Autowired
-    private CTopOauthTokenMapper cTopOauthTokenMapper;
+    private CtopOauthTokenMapper cTopOauthTokenMapper;
 
     @Override
-    public CTopOauthToken getOauthTokenByAccountId(String accountId) {
-        QueryWrapper<CTopOauthToken> queryWrapper = new QueryWrapper<>();
+    public CtopOauthToken getOauthTokenByAccountId(String accountId) {
+        QueryWrapper<CtopOauthToken> queryWrapper = new QueryWrapper<>();
         queryWrapper.eq("account_id", accountId).orderByDesc("create_time");
         queryWrapper.last("limit 1");
-        CTopOauthToken cTopOauthToken = cTopOauthTokenMapper.selectOne(queryWrapper);
+        CtopOauthToken cTopOauthToken = cTopOauthTokenMapper.selectOne(queryWrapper);
         return cTopOauthToken;
     }
 
     /**
      * 刷新token
-     *
      * @param accountId
      * @return
      */
     @Override
     public Map<String, Object> getByteDanceAccessToken(String accountId) {
         Map<String, Object> resultMap = new HashMap<>();
-        CTopOauthToken token = this.getOauthTokenByAccountId(accountId);
+        CtopOauthToken token = this.getOauthTokenByAccountId(accountId);
         if (null == token) {
             resultMap.put("message", "token信息不存在");
             resultMap.put("code", -1);
@@ -68,16 +64,16 @@ public class CTopOauthTokenServiceImpl extends ServiceImpl<CTopOauthTokenMapper,
         JSONObject resultObject = JSONObject.parseObject(result);
         Integer code = resultObject.getInteger("code");
         if (null == code || code != 0) {
-            logger.info("刷新token异常;accountId:{}", accountId);
+            log.info("刷新token异常;accountId:{}", accountId);
             resultMap.put("message", "刷新token异常");
             resultMap.put("code", -1);
             return resultMap;
         }
         JSONObject data = resultObject.getJSONObject("data");
-        CTopOauthToken refreshToken = new CTopOauthToken(token, data);
+        CtopOauthToken refreshToken = new CtopOauthToken(token, data);
         cTopOauthTokenMapper.deleteById(token.getId());
         cTopOauthTokenMapper.insert(refreshToken);
-        logger.info("头条刷新token成功:accountId:{}", accountId);
+        log.info("头条刷新token成功:accountId:{}", accountId);
         resultMap.put("message", "token刷新成功");
         resultMap.put("code", 0);
         return resultMap;
@@ -85,7 +81,6 @@ public class CTopOauthTokenServiceImpl extends ServiceImpl<CTopOauthTokenMapper,
 
     /**
      * 快手 刷新token
-     *
      * @param accountId
      * @param refreshToken
      * @return
@@ -105,7 +100,7 @@ public class CTopOauthTokenServiceImpl extends ServiceImpl<CTopOauthTokenMapper,
             if (!Check.isNull(resultJson)) {
                 Integer code = resultJson.getInteger("code");
                 if (code == 0) {
-                    CTopOauthToken oauthToken = cTopOauthTokenMapper.selectByAccountId(accountId);
+                    CtopOauthToken oauthToken = cTopOauthTokenMapper.selectByAccountId(accountId);
                     if (!Check.isNull(oauthToken)) {
                         JSONObject dataJson = resultJson.getJSONObject("data");
                         if (!Check.isNull(dataJson)) {
@@ -122,23 +117,19 @@ public class CTopOauthTokenServiceImpl extends ServiceImpl<CTopOauthTokenMapper,
                             oauthToken.setUpdateTime(new Date());
                             int i = cTopOauthTokenMapper.updateByPrimaryKeySelective(oauthToken);
                             if (i > 0) {
-                                logger.info("快手刷新token成功,accountId:{}", accountId);
-
+                                log.info("快手刷新token成功,accountId:{}", accountId);
                             }
                         }
                     }
                 } else {
-                    logger.error("快手刷新token失败,accountId:{},result:{}", accountId, resultJson);
-
+                    log.error("快手刷新token失败,accountId:{},result:{}", accountId, resultJson);
                 }
             } else {
-                logger.error("快手刷新token返回结果为空,accountId:{}", accountId);
+                log.error("快手刷新token返回结果为空,accountId:{}", accountId);
             }
         } catch (Exception e) {
             e.printStackTrace();
-
         }
-
         return null;
     }
 }

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

@@ -1,38 +1,34 @@
 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.toutiao.common.BytedanceInterfaceConstant;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.codec.digest.DigestUtils;
 import org.apache.http.HttpEntity;
 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.entity.mime.MultipartEntityBuilder;
 import org.apache.http.entity.mime.content.FileBody;
 import org.apache.http.impl.client.CloseableHttpClient;
 import org.apache.http.impl.client.HttpClientBuilder;
 import org.jeecg.common.util.ResultMapUtils;
 import org.jeecg.common.util.StatusCode;
-import org.jeecg.modules.ctop.entity.CTopOauthToken;
+import org.jeecg.modules.ctop.entity.CtopOauthToken;
 import org.jeecg.modules.ctop.entity.FileInfo;
-import org.jeecg.modules.ctop.mapper.ByteDanceImageInfoMapper;
-import org.jeecg.modules.ctop.mapper.ByteDanceVideoInfoMapper;
+import org.jeecg.modules.ctop.entity.SourceFile;
 import org.jeecg.modules.ctop.mapper.FileInfoMapper;
-import org.jeecg.modules.ctop.service.IByteDanceImageInfoService;
-import org.jeecg.modules.ctop.service.ICTopOauthTokenService;
+import org.jeecg.modules.ctop.service.ICtopOauthTokenService;
 import org.jeecg.modules.ctop.service.IFileInfoService;
+import org.jeecg.modules.ctop.service.ISourceFileService;
 import org.jeecg.modules.system.entity.SysCategory;
 import org.jeecg.modules.system.mapper.SysCategoryMapper;
 import org.jeecg.modules.system.service.ISysCategoryService;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
@@ -53,27 +49,39 @@ import java.util.Map;
  * @Date: 2019-07-28
  * @Version: V1.0
  */
+@Slf4j
 @Service
 public class FileInfoServiceImpl extends ServiceImpl<FileInfoMapper, FileInfo> implements IFileInfoService {
-    private static final Logger logger = LoggerFactory.getLogger(FileInfoServiceImpl.class);
-    private FileInfo fileInfo;
+    @Value("${jeecg.path.image-upload}")
+    private String imageUploadPath;
+    @Value("${jeecg.path.video-upload}")
+    private String videoUploadPath;
+    @Autowired
+    FileInfoMapper fileInfoMapper;
+    @Autowired
+    private ISourceFileService sourceFileService;
+    @Autowired
+    private ISysCategoryService categoryService;
+    @Autowired
+    private SysCategoryMapper sysCategoryMapper;
+    @Autowired
+    private ICtopOauthTokenService tokenService;
 
     @Override
     public Map<String, Object> uploadVideoToBytedance(String accountId, String videoUrl) {
         Map<String, Object> resultMap = new HashMap<>();
         //TODO查询是否已经上传过头条平台
-        CTopOauthToken token = tokenService.getOauthTokenByAccountId(accountId);
+        CtopOauthToken token = tokenService.getOauthTokenByAccountId(accountId);
         JSONObject resultObject = uploadAdvideo(token, videoUrl, token.getAccountId() + "");
         System.out.println(resultObject);
         Integer code = resultObject.getInteger("code");
         String message = resultObject.getString("message");
         if (null == code || code != 0) {
-            logger.info("视频文件上传失败,accountId:{},message:{}", accountId, message);
+            log.info("视频文件上传失败,accountId:{},message:{}", accountId, message);
             ResultMapUtils.setResultMap(resultMap, StatusCode.BYTEDANCE_VIDEO_UPLOAD_FAIL.getCode());
             return resultMap;
         }
-        fileInfo = (FileInfo) resultObject.get("file");
-
+        FileInfo fileInfo = (FileInfo) resultObject.get("file");
         ResultMapUtils.setResultMap(resultMap, StatusCode.COMMON_SUCCESS.getCode());
         resultMap.put("videoId", fileInfo.getFileId());
         return resultMap;
@@ -87,7 +95,7 @@ public class FileInfoServiceImpl extends ServiceImpl<FileInfoMapper, FileInfo> i
             ResultMapUtils.setResultMap(resultMap, StatusCode.IMAGE_NUMBER_SHORTAGE.getCode());
             return resultMap;
         }
-        CTopOauthToken token = tokenService.getOauthTokenByAccountId(accountId);
+        CtopOauthToken token = tokenService.getOauthTokenByAccountId(accountId);
         JSONArray imageIds = new JSONArray();
         for (int i = 0; i < imageUrls.length; i++) {
             JSONObject resultObject = uploadAdImage(token, imageUrls[i], token.getAccountId() + "");
@@ -95,7 +103,7 @@ public class FileInfoServiceImpl extends ServiceImpl<FileInfoMapper, FileInfo> i
             Integer code = resultObject.getInteger("code");
             String message = resultObject.getString("message");
             if (null == code || code != 0) {
-                logger.info("图片文件上传失败,accountId:{},message:{}", accountId, message);
+                log.info("图片文件上传失败,accountId:{},message:{}", accountId, message);
                 ResultMapUtils.setResultMap(resultMap, StatusCode.BYTEDANCE_VIDEO_UPLOAD_FAIL.getCode());
                 return resultMap;
             }
@@ -107,20 +115,15 @@ public class FileInfoServiceImpl extends ServiceImpl<FileInfoMapper, FileInfo> i
         return resultMap;
     }
 
-    @Autowired
-    private ByteDanceVideoInfoMapper videoInfoMapper;
-    @Autowired
-    private ByteDanceImageInfoMapper imageInfoMapper;
-
     @Override
     public Map<String, Object> uploadImageToBytedance(String accountId, String imageUrl) {
         Map<String, Object> resultMap = new HashMap<>();
-        CTopOauthToken token = tokenService.getOauthTokenByAccountId(accountId);
+        CtopOauthToken token = tokenService.getOauthTokenByAccountId(accountId);
         JSONObject resultObject = uploadAdImage(token, imageUrl, token.getAccountId() + "");
         Integer code = resultObject.getInteger("code");
         String message = resultObject.getString("message");
         if (null == code || code != 0) {
-            logger.info("图片文件上传失败,accountId:{},message:{}", accountId, message);
+            log.info("图片文件上传失败,accountId:{},message:{}", accountId, message);
             ResultMapUtils.setResultMap(resultMap, StatusCode.BYTEDANCE_IMAGE_UPLOAD_FAIL.getCode());
             return resultMap;
         }
@@ -132,14 +135,10 @@ public class FileInfoServiceImpl extends ServiceImpl<FileInfoMapper, FileInfo> i
         return resultMap;
     }
 
-    @Autowired
-    private IByteDanceImageInfoService imageInfoService;
-    @Autowired
-    FileInfoMapper fileInfoMapper;
     @Override
     public Map<String, Object> getIndustryList(String accountId, Integer level) {
         Map<String, Object> resultMap = new HashMap<>();
-        CTopOauthToken token = tokenService.getOauthTokenByAccountId(accountId);
+        CtopOauthToken token = tokenService.getOauthTokenByAccountId(accountId);
         JSONObject result = searchIndustry(token, level);
         JSONArray list = result.getJSONObject("data").getJSONArray("list");
         for (int i = 0; i < list.size(); i++) {
@@ -202,62 +201,62 @@ public class FileInfoServiceImpl extends ServiceImpl<FileInfoMapper, FileInfo> i
         return fileInfoMapper.selectList(queryWrapper);
     }
 
+    @Override
+    /**
+     * 校验文件唯一性
+     */
+    public Map<String, Object> checkFile(String code) {
+        Map<String, Object> result = new HashMap<>();
+        QueryWrapper<SourceFile> wrapper = new QueryWrapper<>();
+        wrapper.eq("code", code).orderByDesc("id").last("limit 1");
+        SourceFile file = sourceFileService.getOne(wrapper);
+        if (null != file) {
+            //文件已存在
+            ResultMapUtils.setResultMap(result, StatusCode.FILE_HAS_UPLOAD.getCode());
+            result.put("url", file.getUrl());
+            return result;
+        } else {
+            //文件尚未上传
+            ResultMapUtils.setResultMap(result, StatusCode.FILE_HAS_NOT_UPLOAD.getCode());
+            return result;
+        }
+    }
 
-    @Autowired
-    private ISysCategoryService categoryService;
+    @Override
+    public Map<String, Object> getCreativeWords(Long accountId) {
+        CtopOauthToken token = tokenService.getOauthTokenByAccountId(accountId + "");
+        return getCreativeWord(token, accountId);
+    }
 
-    @Autowired
-    private SysCategoryMapper sysCategoryMapper;
+    @Override
+    public JSONObject getSiteList(Long accountId) {
+        return null;
+    }
+
+    public JSONObject getCreativeWord(CtopOauthToken token, Long accountId) {
+        // 请求地址
+        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;
+    }
 
-    public JSONObject searchIndustry(CTopOauthToken token, Integer level) {
+    public JSONObject searchIndustry(CtopOauthToken token, Integer level) {
         // 请求地址
         String url = "https://ad.toutiao.com/open_api/2/tools/industry/get/";
         if (null != level) {
             url += "?level=" + level;
         }
-        // 构造请求
-        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(new JSONObject().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;
+        JSONObject resultObject = HttpUtils.bytedanceGetRequest(token.getAccessToken(), url, new HashMap<>());
+        return resultObject;
     }
 
-    public JSONObject uploadAdImage(CTopOauthToken token, String imageUrl, String advertiserId) {
+    public JSONObject uploadAdImage(CtopOauthToken token, String imageUrl, String advertiserId) {
         JSONObject result = new JSONObject();
         //1:下载文件到本地
         String imagePath = downLoadByURL(imageUrl);
@@ -284,7 +283,7 @@ public class FileInfoServiceImpl extends ServiceImpl<FileInfoMapper, FileInfo> i
         //文件上传
         JSONObject bytedanceObject = imageUpload(token, advertiserId, imageUrl);
         if (null == bytedanceObject) {
-            logger.info("今日头条图片上传失败");
+            log.info("今日头条图片上传失败");
             result.put("code", -1);
             result.put("message", "今日头条文件上传失败");
             return result;
@@ -299,7 +298,7 @@ public class FileInfoServiceImpl extends ServiceImpl<FileInfoMapper, FileInfo> i
         return result;
     }
 
-    private JSONObject imageUpload(CTopOauthToken token, String advertiserId, String imageUrl) {
+    private JSONObject imageUpload(CtopOauthToken token, String advertiserId, String imageUrl) {
         JSONObject result = null;
         // 请求地址
         String url = PropertiesUtils.getValue("bytedance_config", "bytedance_api_url") + PropertiesUtils.getValue("bytedance_config", "bytedance_v2_file_image_ad");
@@ -347,10 +346,6 @@ public class FileInfoServiceImpl extends ServiceImpl<FileInfoMapper, FileInfo> i
         return null;
     }
 
-    @Value("${jeecg.path.image-upload}")
-    private String imageUploadPath;
-    @Value("${jeecg.path.video-upload}")
-    private String videoUploadPath;
 
     public String downLoadByURL(String fileUrl) {
         //获取文件名,文件名实际上在URL中可以找到
@@ -383,7 +378,7 @@ public class FileInfoServiceImpl extends ServiceImpl<FileInfoMapper, FileInfo> i
         }
     }
 
-    public JSONObject uploadAdvideo(CTopOauthToken token, String videoUrl, String advertiserId) {
+    public JSONObject uploadAdvideo(CtopOauthToken token, String videoUrl, String advertiserId) {
         JSONObject result = new JSONObject();
         //1:下载文件到本地
         String videoPath = downLoadByURL(videoUrl);
@@ -411,7 +406,7 @@ public class FileInfoServiceImpl extends ServiceImpl<FileInfoMapper, FileInfo> i
         //文件上传
         JSONObject bytedanceObject = videoUpload(token, advertiserId, videoPath);
         if (null == bytedanceObject) {
-            logger.info("今日头条视频上传失败");
+            log.info("今日头条视频上传失败");
             result.put("code", -1);
             result.put("message", "今日头条视频上传失败");
             return result;
@@ -424,10 +419,9 @@ public class FileInfoServiceImpl extends ServiceImpl<FileInfoMapper, FileInfo> i
         result.put("message", "视频上传成功");
         result.put("success", true);
         return result;
-
     }
 
-    private JSONObject videoUpload(CTopOauthToken token, String advertiserId, String videoPath) {
+    private JSONObject videoUpload(CtopOauthToken token, String advertiserId, String videoPath) {
         CloseableHttpResponse response = null;
         CloseableHttpClient client = null;
         // 请求地址
@@ -437,7 +431,6 @@ public class FileInfoServiceImpl extends ServiceImpl<FileInfoMapper, FileInfo> i
         httpPost.setHeader("Access-Token", token.getAccessToken());
         // 文件参数
         try {
-
             FileBody file = new FileBody(new File(videoPath));
             MultipartEntityBuilder entityBuilder = MultipartEntityBuilder.create()
                     .addPart("video_file", file);
@@ -473,15 +466,4 @@ public class FileInfoServiceImpl extends ServiceImpl<FileInfoMapper, FileInfo> i
         }
         return null;
     }
-
-    @Autowired
-    private ICTopOauthTokenService tokenService;
-
-    public static void main(String[] args) throws Exception {
-
-//        FileUtils.copyURLToFile(new URL("https://ctop-media.oss-cn-beijing.aliyuncs.com/%E9%AB%98%E6%B8%85%E7%89%882-1565344662650.mp4"),new File("D://1234.mp4"));
-//        File file = new File("https://ctop-media.oss-cn-beijing.aliyuncs.com/%E9%AB%98%E6%B8%85%E7%89%882-1565344662650.mp4");
-//        FileInputStream fis = new FileInputStream(file);
-//        fis.read();
-    }
 }

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

@@ -1,9 +1,11 @@
 package org.jeecg.modules.ctop.service.impl;
 
 import cn.com.ctop.common.utils.Check;
-import org.jeecg.modules.ctop.entity.CTopOauthToken;
-import org.jeecg.modules.ctop.mapper.CTopOauthTokenMapper;
-import org.jeecg.modules.ctop.service.ICTopOauthTokenService;
+import lombok.extern.slf4j.Slf4j;
+import org.jeecg.common.constant.CtopAdConstant;
+import org.jeecg.modules.ctop.entity.CtopOauthToken;
+import org.jeecg.modules.ctop.mapper.CtopOauthTokenMapper;
+import org.jeecg.modules.ctop.service.ICtopOauthTokenService;
 import org.jeecg.modules.ctop.service.IRefreshTokenService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -12,35 +14,35 @@ import org.springframework.stereotype.Service;
 
 import java.util.List;
 
+@Slf4j
 @Service
 public class RefreshTokenServiceImpl implements IRefreshTokenService {
-    private static final Logger logger = LoggerFactory.getLogger(RefreshTokenServiceImpl.class);
     @Autowired
-    private CTopOauthTokenMapper oauthTokenMapper;
+    private CtopOauthTokenMapper oauthTokenMapper;
     @Autowired
-    private ICTopOauthTokenService oauthTokenService;
+    private ICtopOauthTokenService oauthTokenService;
 
     /**
      * 获取所有token
-     *
      * @return
      */
     @Override
     public void getRefresh() {
-        List<CTopOauthToken> oauthTokens = oauthTokenMapper.selectAll();
-        logger.info("需要刷新token列表长度:{}", oauthTokens.size());
+        List<CtopOauthToken> oauthTokens = oauthTokenMapper.selectAll();
+        log.info("需要刷新token列表长度:{}", oauthTokens.size());
         if (!Check.isNull(oauthTokens)) {
-            for (CTopOauthToken oauthToken : oauthTokens) {
-                if ("1".equals(oauthToken.getMediaId().trim())) { //头条
+            for (CtopOauthToken oauthToken : oauthTokens) {
+                //头条
+                if (CtopAdConstant.PLATFORM_TYPE_BYTEDANCE.equals(oauthToken.getMediaId().trim())) {
                     oauthTokenService.getByteDanceAccessToken(String.valueOf(oauthToken.getAccountId()));
                 }
-                if ("2".equals(oauthToken.getMediaId().trim())) { //快手
+                //快手
+                if (CtopAdConstant.PLATFORM_TYPE_KUAISHOU.equals(oauthToken.getMediaId().trim())) {
                     oauthTokenService.getKuaiShouRefreshToken(oauthToken.getAccountId(), oauthToken.getRefreshToken());
                 }
-
             }
         } else {
-            logger.error("----------------------刷新token获取数据返回结果为空----------------------------------");
+            log.error("----------------------刷新token获取数据返回结果为空----------------------------------");
         }
     }
 }

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

@@ -1,7 +1,6 @@
 package org.jeecg.modules.ctop.service.impl;
 
 import cn.com.ctop.common.utils.CsvUtils;
-import cn.com.ctop.common.utils.OSSUtils;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import org.apache.http.client.ClientProtocolException;
@@ -19,12 +18,12 @@ import org.apache.poi.xssf.usermodel.XSSFSheet;
 import org.apache.poi.xssf.usermodel.XSSFWorkbook;
 import org.jeecg.common.util.ResultMapUtils;
 import org.jeecg.common.util.StatusCode;
-import org.jeecg.modules.ctop.entity.CTopOauthToken;
+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.mapper.CustomerPlanStatisticInfoMapper;
 import org.jeecg.modules.ctop.mapper.PlatformCampaignStatisticInfoMapper;
-import org.jeecg.modules.ctop.service.ICTopOauthTokenService;
+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;
@@ -34,6 +33,7 @@ import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 
 import java.io.*;
+import java.math.BigDecimal;
 import java.net.HttpURLConnection;
 import java.net.URI;
 import java.net.URL;
@@ -45,6 +45,21 @@ import java.util.Map;
 
 @Service
 public class ReportServiceImpl implements IReportService {
+    @Value("${jeecg.path.csv-upload}")
+    private String csvUploadPath;
+    @Autowired
+    private IPlatformCampaignStatisticInfoService platformCampaignStatisticInfoService;
+    @Autowired
+    private ICustomerPlanStatisticInfoService customerPlanStatisticInfoService;
+    @Autowired
+    private PlatformCampaignStatisticInfoMapper statisticInfoMapper;
+    @Autowired
+    private CustomerPlanStatisticInfoMapper customerPlanStatisticInfoMapper;
+    @Autowired
+    private PlatformCampaignStatisticInfoMapper platformCampaignStatisticInfoMapper;
+    @Autowired
+    private ICtopOauthTokenService tokenService;
+
     @Override
     public Map<String, Object> getAdvertiserReport(JSONObject conditions) {
         conditions = new JSONObject();
@@ -55,7 +70,7 @@ public class ReportServiceImpl implements IReportService {
         conditions.put("page", 1);
         Long accountId = conditions.getLong("advertiser_id");
 //        Long accountId = 74099510334L;
-        CTopOauthToken token = tokenService.getOauthTokenByAccountId(accountId + "");
+        CtopOauthToken token = tokenService.getOauthTokenByAccountId(accountId + "");
         JSONObject getObject = getAdvertiserStat(token, conditions);
         return getObject;
     }
@@ -63,23 +78,20 @@ public class ReportServiceImpl implements IReportService {
     @Override
     public Map<String, Object> getCampaignReport(JSONObject conditions) {
         Long accountId = conditions.getLong("accountId");
-        CTopOauthToken token = tokenService.getOauthTokenByAccountId(accountId + "");
+        CtopOauthToken token = tokenService.getOauthTokenByAccountId(accountId + "");
         JSONObject getObject = getAdStat(token, conditions);
         return new HashMap<>();
     }
 
-    private JSONObject getAdStat(CTopOauthToken token, JSONObject conditions) {
+    private JSONObject getAdStat(CtopOauthToken token, JSONObject conditions) {
         final Long advertiserId = token.getAccountId();
-
         // 请求地址
         String url = "https://ad.toutiao.com/open_api/2/report/ad/get/";
-
         final Map filtering = new HashMap() {
             {
                 put("campaign_id", 1L);
             }
         };
-
         // 请求参数
         final Map data = new HashMap() {
             {
@@ -100,12 +112,9 @@ public class ReportServiceImpl implements IReportService {
                 return "GET";
             }
         };
-
         httpEntity.setHeader("Access-Token", token.getAccessToken());
-
         CloseableHttpResponse response = null;
         CloseableHttpClient client = null;
-
         try {
             client = HttpClientBuilder.create().build();
             httpEntity.setURI(URI.create(url));
@@ -143,7 +152,7 @@ public class ReportServiceImpl implements IReportService {
     @Override
     public Map<String, Object> getAdReport(JSONObject conditions) {
         Long accountId = conditions.getLong("accountId");
-        CTopOauthToken token = tokenService.getOauthTokenByAccountId(accountId + "");
+        CtopOauthToken token = tokenService.getOauthTokenByAccountId(accountId + "");
         JSONObject getObject = getAdStat(token, conditions);
         return getObject;
     }
@@ -151,7 +160,7 @@ public class ReportServiceImpl implements IReportService {
     @Override
     public Map<String, Object> getCreativeReport(JSONObject conditions) {
         Long accountId = conditions.getLong("accountId");
-        CTopOauthToken token = tokenService.getOauthTokenByAccountId(accountId + "");
+        CtopOauthToken token = tokenService.getOauthTokenByAccountId(accountId + "");
         JSONObject getObject = getCreativeStat(token, conditions);
         return getObject;
     }
@@ -159,7 +168,7 @@ public class ReportServiceImpl implements IReportService {
     @Override
     public Map<String, Object> getAgentReport(JSONObject conditions) {
         Long accountId = conditions.getLong("accountId");
-        CTopOauthToken token = tokenService.getOauthTokenByAccountId(accountId + "");
+        CtopOauthToken token = tokenService.getOauthTokenByAccountId(accountId + "");
         JSONObject getObject = getCreativeStat(token, conditions);
         return getObject;
     }
@@ -167,7 +176,7 @@ public class ReportServiceImpl implements IReportService {
     @Override
     public void insertCustomerInfo(String csvPath, String charset) {
         try {
-            List<String[]> data = CsvUtils.ReadCSV(csvPath, charset);
+            List<String[]> data = CsvUtils.readCSV(csvPath, charset);
             if (null != data && data.size() > 1) {
                 for (int i = 1; i < data.size(); i++) {
                     String[] record = data.get(i);
@@ -183,7 +192,7 @@ public class ReportServiceImpl implements IReportService {
     @Override
     public void insertPlatformInfo(String csvPath, String charset, Long accountId) {
         try {
-            List<String[]> data = CsvUtils.ReadCSV(csvPath, charset);
+            List<String[]> data = CsvUtils.readCSV(csvPath, charset);
             if (null != data && data.size() > 1) {
                 for (int i = 1; i < data.size(); i++) {
                     String[] record = data.get(i);
@@ -196,9 +205,6 @@ public class ReportServiceImpl implements IReportService {
         }
     }
 
-    @Value("${jeecg.path.csv-upload}")
-    private String csvUploadPath;
-
     @Override
     public Map<String, Object> debitAuto(JSONObject data) {
         Map<String, Object> resultMap = new HashMap<>();
@@ -206,21 +212,31 @@ public class ReportServiceImpl implements IReportService {
         String accountFourKsDataUrl = data.getString("accountFourKsDataUrl");
         String debitDataUrl = data.getString("debitDataUrl");
         //1:文件下载入库
-        String accountOneKsDataPath = downLoadByURL(accountOneKsDataUrl);
-        String accountFourKsDataPath = downLoadByURL(accountFourKsDataUrl);
-        String debitDataPath = downLoadByURL(debitDataUrl);
+        String accountOneKsDataPath = downLoadByUrl(accountOneKsDataUrl);
+        String accountFourKsDataPath = downLoadByUrl(accountFourKsDataUrl);
+        String debitDataPath = downLoadByUrl(debitDataUrl);
         SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy/M/dd");
         //2:文件入库
         //2.1 清除数据库原始数据
         QueryWrapper<CustomerPlanStatisticInfo> planWrapper = new QueryWrapper<>();
-        planWrapper.eq("statistic_date", simpleDateFormat.format(new Date()));
+        planWrapper.isNotNull("id");
         customerPlanStatisticInfoService.remove(planWrapper);
 
         QueryWrapper<PlatformCampaignStatisticInfo> campaignWrapper = new QueryWrapper<>();
-        campaignWrapper.eq("statistic_date", simpleDateFormat.format(new Date()));
+        campaignWrapper.isNotNull("id");
         platformCampaignStatisticInfoService.remove(campaignWrapper);
 
         this.insertPlatformInfo(accountOneKsDataPath, "gb2312", 1L);
+        QueryWrapper<PlatformCampaignStatisticInfo> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("campaign_code", "biaodan").orderByDesc("id").last("limit 1");
+        PlatformCampaignStatisticInfo statisticInfo = platformCampaignStatisticInfoMapper.selectOne(queryWrapper);
+        if (null != statisticInfo) {
+            PlatformCampaignStatisticInfo updateInfo = new PlatformCampaignStatisticInfo();
+            updateInfo.setCampaignCode("biaodan2");
+            QueryWrapper<PlatformCampaignStatisticInfo> updateWrapper = new QueryWrapper<>();
+            updateWrapper.ne("campaign_info", statisticInfo.getCampaignInfo()).eq("campaign_code", statisticInfo.getCampaignCode());
+            platformCampaignStatisticInfoMapper.update(updateInfo, updateWrapper);
+        }
         this.insertPlatformInfo(accountFourKsDataPath, "gb2312", 4L);
         this.insertCustomerInfo(debitDataPath, "utf8");
         //3:根据模板生成相应的excel模板文件
@@ -239,16 +255,9 @@ public class ReportServiceImpl implements IReportService {
         }
     }
 
-    @Autowired
-    private IPlatformCampaignStatisticInfoService platformCampaignStatisticInfoService;
-    @Autowired
-    private ICustomerPlanStatisticInfoService customerPlanStatisticInfoService;
-
     public String getExcelDataPath(String date, Long accountId1, Long accountId4) throws Exception {
-
-        List<StatisticCampaignVo> statisticCampaign4Vos = statisticInfoMapper.getVoByParams(date, accountId4);
-        List<StatisticCampaignVo> statisticCampaign1Vos = statisticInfoMapper.getVoByParams(date, accountId1);
-
+        List<StatisticCampaignVo> statisticCampaign1Vos = statisticInfoMapper.getVoByParams(accountId1);
+        List<StatisticCampaignVo> statisticCampaign4Vos = statisticInfoMapper.getVoByParams(accountId4);
         File f = new File(csvUploadPath + "template.xlsx");
         InputStream inputStream = new FileInputStream(f);
         XSSFWorkbook xssfWorkbook = new XSSFWorkbook(inputStream);
@@ -259,14 +268,35 @@ public class ReportServiceImpl implements IReportService {
         int index;
         for (index = 1; index < statisticCampaign1Vos.size() + 1; index++) {
             StatisticCampaignVo vo = statisticCampaign1Vos.get(index - 1);
-            System.out.println(vo.toString());
             String content = vo.getContent();
             String[] contents = content.split("-");
             Row row = xssfSheet.getRow(index);
             setExcelRow(numbericCellStyle, vo, contents, row, "single");
         }
+        List<StatisticCampaignVo> zero1Vos = statisticInfoMapper.sumZeroVoByParams(accountId1);
+        List<StatisticCampaignVo> zaodianVos = statisticInfoMapper.sumZaodianVoByParams(accountId1);
+        if (null != zero1Vos && zero1Vos.size() > 0) {
+            for (int z = 0; z < zero1Vos.size(); z++) {
+                StatisticCampaignVo vo = zero1Vos.get(z);
+                Row row = xssfSheet.getRow(index);
+                String content = vo.getContent();
+                String[] contents = content.split("-");
+                setExcelRow(numbericCellStyle, vo, contents, row, "single");
+                index++;
+            }
+        }
+        if (null != zaodianVos && zaodianVos.size() > 0) {
+            for (int z = 0; z < zaodianVos.size(); z++) {
+                StatisticCampaignVo vo = zaodianVos.get(z);
+                Row row = xssfSheet.getRow(index);
+                String content = vo.getContent();
+                String[] contents = content.split("-");
+                setExcelRow(numbericCellStyle, vo, contents, row, "single");
+                index++;
+            }
+        }
         Row totalRow1 = xssfSheet.getRow(index);
-        StatisticCampaignVo total = statisticInfoMapper.getTotalStatisticVoByparams(date, accountId1);
+        StatisticCampaignVo total = statisticInfoMapper.getTotalStatisticVoByparams(accountId1);
         if (null != total) {
             setExcelRow(numbericCellStyle, total, new String[]{}, totalRow1, "total1");
         }
@@ -274,19 +304,28 @@ public class ReportServiceImpl implements IReportService {
         for (int j = 0; j < statisticCampaign4Vos.size(); j++) {
             index++;
             StatisticCampaignVo vo = statisticCampaign4Vos.get(j);
-            System.out.println(vo.toString());
             String content = vo.getContent();
             String[] contents = content.split("-");
             Row row = xssfSheet.getRow(index);
             setExcelRow(numbericCellStyle, vo, contents, row, "single");
         }
+        List<StatisticCampaignVo> zero4Vos = statisticInfoMapper.sumZeroVoByParams(accountId4);
+        if (null != zero4Vos && zero4Vos.size() > 0) {
+            for (int z = 0; z < zero4Vos.size(); z++) {
+                index++;
+                StatisticCampaignVo vo = zero4Vos.get(z);
+                Row row = xssfSheet.getRow(index);
+                String content = vo.getContent();
+                String[] contents = content.split("-");
+                setExcelRow(numbericCellStyle, vo, contents, row, "single");
+            }
+        }
         index++;
         Row totalRow4 = xssfSheet.getRow(index);
-        StatisticCampaignVo total1 = statisticInfoMapper.getTotalStatisticVoByparams(date, accountId4);
+        StatisticCampaignVo total1 = statisticInfoMapper.getTotalStatisticVoByparams(accountId4);
         if (null != total1) {
             setExcelRow(numbericCellStyle, total1, new String[]{}, totalRow4, "total4");
         }
-
         SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-m-dd");
         String path = csvUploadPath + "report_" + dateFormat.format(new Date()) + ".xlsx";
         FileOutputStream fileOutputStream = new FileOutputStream(path);
@@ -296,17 +335,14 @@ public class ReportServiceImpl implements IReportService {
 
     }
 
-    @Autowired
-    private PlatformCampaignStatisticInfoMapper statisticInfoMapper;
-
     private void setExcelRow(CellStyle numbericCellStyle, StatisticCampaignVo vo, String[] contents, Row row, String type) {
         for (int j = 0; j < 38; j++) {
             Cell cell = row.createCell(j);
             if (j == 0) {
                 //日期
-                if (null != type && type.equals("single")) {
+                if (null != type && "single".equals(type)) {
                     cell.setCellValue(vo.getStatisticDate());
-                } else if (null != type && type.equals("total1")) {
+                } else if (null != type && "total1".equals(type)) {
                     cell.setCellValue("户一总计");
                 } else {
                     cell.setCellValue("户四总计");
@@ -422,107 +458,112 @@ public class ReportServiceImpl implements IReportService {
             } else if (j == 19) {
                 //注册用户
                 if (null != vo.getRegistUserNum() && !"".equals(vo.getRegistUserNum())) {
-                    cell.setCellValue(Integer.parseInt(vo.getRegistUserNum()));
+                    BigDecimal decimal = new BigDecimal(vo.getRegistUserNum());
+                    cell.setCellValue(decimal.intValue());
                 }
             } else if (j == 20) {
                 //完件用户
                 if (null != vo.getComplateUserNum() && !"".equals(vo.getComplateUserNum())) {
-                    cell.setCellValue(Integer.parseInt(vo.getComplateUserNum()));
+                    BigDecimal decimal = new BigDecimal(vo.getComplateUserNum());
+                    cell.setCellValue(decimal.intValue());
                 }
             } else if (j == 21) {
                 //授信用户
                 if (null != vo.getCreditUserNum() && !"".equals(vo.getCreditUserNum())) {
-                    cell.setCellValue(Integer.parseInt(vo.getCreditUserNum()));
+                    BigDecimal decimal = new BigDecimal(vo.getCreditUserNum());
+                    cell.setCellValue(decimal.intValue());
                 }
             } else if (j == 22) {
                 //当日注册且完件数
                 if (null != vo.getRegistCompleteNum() && !"".equals(vo.getRegistCompleteNum())) {
-                    cell.setCellValue(Integer.parseInt(vo.getRegistCompleteNum()));
+                    BigDecimal decimal = new BigDecimal(vo.getRegistCompleteNum());
+                    cell.setCellValue(decimal.intValue());
                 }
             } else if (j == 23) {
                 //当日注册且授信数
                 if (null != vo.getRegistCreditNum() && !"".equals(vo.getRegistCreditNum())) {
-                    cell.setCellValue(Integer.parseInt(vo.getRegistCreditNum()));
+                    BigDecimal decimal = new BigDecimal(vo.getRegistCreditNum());
+                    cell.setCellValue(decimal.intValue());
                 }
-            } else if (j == 25) {
+            } else if (j == 24) {
                 //注册成本
                 if (null != vo.getRegistPrice() && !"".equals(vo.getRegistPrice())) {
                     cell.setCellValue(Float.parseFloat(vo.getRegistPrice()));
                     cell.setCellStyle(numbericCellStyle);
                 }
-            } else if (j == 26) {
+            } else if (j == 25) {
                 //完件成本
                 if (null != vo.getCompletePrice() && !"".equals(vo.getCompletePrice())) {
                     cell.setCellValue(Float.parseFloat(vo.getCompletePrice()));
                     cell.setCellStyle(numbericCellStyle);
                 }
-            } else if (j == 27) {
+            } else if (j == 26) {
                 //授信成本
                 if (null != vo.getCreditPrice() && !"".equals(vo.getCreditPrice())) {
                     cell.setCellValue(Float.parseFloat(vo.getCreditPrice()));
                     cell.setCellStyle(numbericCellStyle);
                 }
-            } else if (j == 28) {
+            } else if (j == 27) {
                 //当日注册且完件成本
                 if (null != vo.getRegistCompletePrice() && !"".equals(vo.getRegistCompletePrice())) {
                     cell.setCellValue(Float.parseFloat(vo.getRegistCompletePrice()));
                     cell.setCellStyle(numbericCellStyle);
                 }
-            } else if (j == 29) {
+            } else if (j == 28) {
                 //当日注册且授信成本
                 if (null != vo.getRegistCreditPrice() && !"".equals(vo.getRegistCreditPrice())) {
                     cell.setCellValue(Float.parseFloat(vo.getRegistCreditPrice()));
                     cell.setCellStyle(numbericCellStyle);
                 }
-            } else if (j == 30) {
+            } else if (j == 29) {
                 //点击注册率
                 if (null != vo.getClickRegistRate() && !"".equals(vo.getClickRegistRate())) {
                     cell.setCellValue(Float.parseFloat(vo.getClickRegistRate()));
                     cell.setCellStyle(numbericCellStyle);
                 }
-            } else if (j == 31) {
+            } else if (j == 30) {
                 //行为注册率
                 if (null != vo.getActionRegistRate() && !"".equals(vo.getActionRegistRate())) {
                     cell.setCellValue(Float.parseFloat(vo.getActionRegistRate()));
                     cell.setCellStyle(numbericCellStyle);
                 }
-            } else if (j == 32) {
+            } else if (j == 31) {
                 //完件率
                 if (null != vo.getCompleteRate() && !"".equals(vo.getCompleteRate())) {
                     cell.setCellValue(Float.parseFloat(vo.getCompleteRate()));
                     cell.setCellStyle(numbericCellStyle);
                 }
-            } else if (j == 33) {
+            } else if (j == 32) {
                 //授信率
                 if (null != vo.getCreditRate() && !"".equals(vo.getCreditRate())) {
                     cell.setCellValue(Float.parseFloat(vo.getCreditRate()));
                     cell.setCellStyle(numbericCellStyle);
                 }
-            } else if (j == 34) {
+            } else if (j == 33) {
                 //当日完件率
                 if (null != vo.getRegistCompleteRate() && !"".equals(vo.getRegistCompleteRate())) {
                     cell.setCellValue(Float.parseFloat(vo.getRegistCompleteRate()));
                     cell.setCellStyle(numbericCellStyle);
                 }
-            } else if (j == 35) {
+            } else if (j == 34) {
                 //当日授信率
                 if (null != vo.getRegistCreditRate() && !"".equals(vo.getRegistCreditRate())) {
                     cell.setCellValue(Float.parseFloat(vo.getRegistCreditRate()));
                     cell.setCellStyle(numbericCellStyle);
                 }
-            } else if (j == 36) {
+            } else if (j == 35) {
                 //当日完件/完件
                 if (null != vo.getCompleteRateDay() && !"".equals(vo.getCompleteRateDay())) {
                     cell.setCellValue(Float.parseFloat(vo.getCompleteRateDay()));
                     cell.setCellStyle(numbericCellStyle);
                 }
-            } else if (j == 37) {
+            } else if (j == 36) {
                 //当日授信/授信
                 if (null != vo.getCreditRateDay() && !"".equals(vo.getCreditRateDay())) {
                     cell.setCellValue(Float.parseFloat(vo.getCreditRateDay()));
                     cell.setCellStyle(numbericCellStyle);
                 }
-            } else if (j == 38) {
+            } else if (j == 37) {
                 //当日授信/注册
                 if (null != vo.getCreditRegistRateDay() && !"".equals(vo.getCreditRegistRateDay())) {
                     cell.setCellValue(Float.parseFloat(vo.getCreditRegistRateDay()));
@@ -532,7 +573,7 @@ public class ReportServiceImpl implements IReportService {
         }
     }
 
-    public String downLoadByURL(String fileUrl) {
+    public String downLoadByUrl(String fileUrl) {
         //获取文件名,文件名实际上在URL中可以找到
         String fileName = fileUrl.substring(fileUrl.lastIndexOf("/") + 1);
         //这里服务器上要将此图保存的路径
@@ -563,12 +604,7 @@ public class ReportServiceImpl implements IReportService {
         }
     }
 
-    @Autowired
-    private CustomerPlanStatisticInfoMapper customerPlanStatisticInfoMapper;
-    @Autowired
-    private PlatformCampaignStatisticInfoMapper platformCampaignStatisticInfoMapper;
-
-    public JSONObject getAgentStat(CTopOauthToken token, JSONObject conditions) {
+    public JSONObject getAgentStat(CtopOauthToken token, JSONObject conditions) {
         // 请求地址
         String url = "https://ad.toutiao.com/open_api/2/report/agent/get/";
         // 请求参数
@@ -588,15 +624,12 @@ public class ReportServiceImpl implements IReportService {
             }
         };
         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()));
@@ -625,17 +658,14 @@ public class ReportServiceImpl implements IReportService {
         return null;
     }
 
-    public JSONObject getCreativeStat(CTopOauthToken token, JSONObject conditions) {
-
+    public JSONObject getCreativeStat(CtopOauthToken token, JSONObject conditions) {
         // 请求地址
         String url = "https://ad.toutiao.com/open_api/2/report/creative/get/";
-
         final Map filtering = new HashMap() {
             {
                 put("campaign_id", 1L);
             }
         };
-
         // 请求参数
         final Map data = new HashMap() {
             {
@@ -645,7 +675,6 @@ public class ReportServiceImpl implements IReportService {
                 put("time_granularity", "STAT_TIME_GRANULARITY_DAILY");
                 put("group_by", new String[]{"STAT_GROUP_BY_FIELD_ID"});
                 put("filtering", filtering);
-
             }
         };
 
@@ -656,17 +685,13 @@ public class ReportServiceImpl implements IReportService {
                 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()));
@@ -678,7 +703,6 @@ public class ReportServiceImpl implements IReportService {
                 bufferedReader.close();
                 return JSONObject.parseObject(result.toString());
             }
-
         } catch (ClientProtocolException e) {
             e.printStackTrace();
         } catch (IOException e) {
@@ -696,16 +720,14 @@ public class ReportServiceImpl implements IReportService {
         return null;
     }
 
-    public static JSONObject getCampaignStat(CTopOauthToken token, JSONObject conditions) {
+    public static JSONObject getCampaignStat(CtopOauthToken token, JSONObject conditions) {
         // 请求地址
         String url = "https://ad.toutiao.com/open_api/2/report/campaign/get/";
-
         final Map filtering = new HashMap() {
             {
                 put("campaign_ids", new Long[]{1L, 2L});
             }
         };
-
         // 请求参数
         final Map data = new HashMap() {
             {
@@ -717,10 +739,8 @@ public class ReportServiceImpl implements IReportService {
                 put("time_granularity", conditions.getString("timeGranularity"));
                 put("group_by", conditions.getJSONArray("groupBy"));
                 put("filtering", filtering);
-
             }
         };
-
         // 构造请求
         HttpEntityEnclosingRequestBase httpEntity = new HttpEntityEnclosingRequestBase() {
             @Override
@@ -728,17 +748,13 @@ public class ReportServiceImpl implements IReportService {
                 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()));
@@ -750,7 +766,6 @@ public class ReportServiceImpl implements IReportService {
                 bufferedReader.close();
                 return JSONObject.parseObject(result.toString());
             }
-
         } catch (ClientProtocolException e) {
             e.printStackTrace();
         } catch (IOException e) {
@@ -768,15 +783,10 @@ public class ReportServiceImpl implements IReportService {
         return null;
     }
 
-    @Autowired
-    private ICTopOauthTokenService tokenService;
-
-    public JSONObject getAdvertiserStat(CTopOauthToken token, JSONObject conditions) {
+    public JSONObject getAdvertiserStat(CtopOauthToken token, JSONObject conditions) {
         final Long advertiserId = token.getAccountId();
-
         // 请求地址
         String url = "https://ad.toutiao.com/open_api/2/report/advertiser/get/";
-
         // 请求参数
         Map data = new HashMap() {
             {
@@ -788,7 +798,6 @@ public class ReportServiceImpl implements IReportService {
                 put("page_size", conditions.getString("page_size"));
             }
         };
-
         // 构造请求
         HttpEntityEnclosingRequestBase httpEntity = new HttpEntityEnclosingRequestBase() {
             @Override
@@ -796,17 +805,13 @@ public class ReportServiceImpl implements IReportService {
                 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()));
@@ -818,7 +823,6 @@ public class ReportServiceImpl implements IReportService {
                 bufferedReader.close();
                 return JSONObject.parseObject(result.toString());
             }
-
         } catch (Exception e) {
             e.printStackTrace();
         } finally {

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

@@ -0,0 +1,19 @@
+package org.jeecg.modules.ctop.service.impl;
+
+import org.jeecg.modules.ctop.entity.SourceFile;
+import org.jeecg.modules.ctop.mapper.SourceFileMapper;
+import org.jeecg.modules.ctop.service.ISourceFileService;
+import org.springframework.stereotype.Service;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+
+/**
+ * @Description: 统一资源库文件信息
+ * @Author: jeecg-boot
+ * @Date: 2019-09-02
+ * @Version: V1.0
+ */
+@Service
+public class SourceFileServiceImpl extends ServiceImpl<SourceFileMapper, SourceFile> implements ISourceFileService {
+
+}

+ 10 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/sign/itext5/Extension.java

@@ -0,0 +1,10 @@
+package org.jeecg.modules.ctop.sign.itext5;
+
+import lombok.Data;
+
+@Data
+public class Extension {
+    private String oid;
+    private boolean critical;
+    private byte[] value;
+}

+ 544 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/sign/itext5/GenX509Cert.java

@@ -0,0 +1,544 @@
+//package org.jeecg.modules.ctop.sign.itext5;
+//
+//import java.io.File;
+//import java.io.FileInputStream;
+//import java.io.FileNotFoundException;
+//import java.io.FileOutputStream;
+//import java.io.IOException;
+//import java.math.BigInteger;
+//import java.security.KeyPair;
+//import java.security.KeyPairGenerator;
+//import java.security.KeyStore;
+//import java.security.NoSuchAlgorithmException;
+//import java.security.PrivateKey;
+//import java.security.PublicKey;
+//import java.security.SecureRandom;
+//import java.security.Signature;
+//import java.security.SignatureException;
+//import java.security.cert.Certificate;
+//import java.security.cert.CertificateException;
+//import java.security.cert.X509Certificate;
+//import java.util.Date;
+//import java.util.HashMap;
+//import java.util.Map;
+//import java.util.Vector;
+//import java.util.Map.Entry;
+//
+//
+//import sun.security.util.ObjectIdentifier;
+//import sun.security.x509.AlgorithmId;
+//import sun.security.x509.CertAndKeyGen;
+//import sun.security.x509.CertificateAlgorithmId;
+//import sun.security.x509.CertificateExtensions;
+//import sun.security.x509.CertificateSerialNumber;
+//import sun.security.x509.CertificateValidity;
+//import sun.security.x509.CertificateVersion;
+//import sun.security.x509.CertificateX509Key;
+//import sun.security.x509.ExtendedKeyUsageExtension;
+//import sun.security.x509.KeyIdentifier;
+//import sun.security.x509.KeyUsageExtension;
+//import sun.security.x509.SerialNumber;
+//import sun.security.x509.SubjectKeyIdentifierExtension;
+//import sun.security.x509.X500Name;
+//import sun.security.x509.X500Signer;
+//import sun.security.x509.X509CertImpl;
+//import sun.security.x509.X509CertInfo;
+//
+//public class GenX509Cert {
+//    private SecureRandom sr = new SecureRandom();
+//
+//
+//    private String root = "Root";// 根证书前缀
+//    private static String rootUser = "签名服务器";// 证书颁发者
+//
+//
+//    public GenX509Cert() {
+//        try {
+//            sr = SecureRandom.getInstance("SHA1PRNG", "SUN");
+//        } catch (Exception e) {
+//            System.err.println("实例化SecureRandom出错:"+e.getMessage());
+//        }
+//    }
+//
+//
+//    public void createCert(X509Certificate certificate, PrivateKey rootPrivKey,
+//                           KeyPair kp, String certPath, String user, String password,
+//                           String sbh, String ip) throws Exception {
+//        byte certbytes[] = certificate.getEncoded();
+//        X509CertImpl x509certimpl = new X509CertImpl(certbytes);
+//
+//
+//        X509CertInfo x509certinfo = (X509CertInfo) x509certimpl
+//                .get("x509.info");
+//
+//
+//        x509certinfo.set("key", new CertificateX509Key(kp.getPublic()));
+//
+//
+//        CertificateExtensions certificateextensions = new CertificateExtensions();
+//        certificateextensions.set("SubjectKeyIdentifier",
+//                new SubjectKeyIdentifierExtension((new KeyIdentifier(kp
+//                        .getPublic())).getIdentifier()));
+//        x509certinfo.set("extensions", certificateextensions);
+//
+//
+//// 设置issuer域
+//        X500Name issuer = new X500Name("CN=" + rootUser
+//                + ",OU=hackwp,O=wp,L=BJ,S=BJ,C=CN");
+//        x509certinfo.set("issuer.dname", issuer);
+//        X500Name subject = new X500Name("CN=" + user
+//                + ", OU=wps, O=wps, L=BJ, ST=BJ, C=CN");
+//        x509certinfo.set("subject.dname", subject);
+//
+//
+//        Signature signature = Signature.getInstance("MD5WithRSA");
+//        signature.initSign(kp.getPrivate());
+//        X500Signer signer = new X500Signer(signature, issuer);
+//
+//
+//        AlgorithmId algorithmid = signer.getAlgorithmId();
+//        x509certinfo
+//                .set("algorithmID", new CertificateAlgorithmId(algorithmid));
+//
+//
+//        Date bdate = new Date();
+//        Date edate = new Date();
+//// 天 小时 分 秒 毫秒
+//        edate.setTime(bdate.getTime() + 3650L * 24L * 60L * 60L * 1000L);
+//// validity为有效时间长度 单位为秒
+//        CertificateValidity certificatevalidity = new CertificateValidity(
+//                bdate, edate);
+//        x509certinfo.set("validity", certificatevalidity);
+//// 设置有效期域(包含开始时间和到期时间)域名等同与x509certinfo.VALIDITY
+//        x509certinfo.set("serialNumber", new CertificateSerialNumber(
+//                (int) (new Date().getTime() / 1000L)));
+//// 设置序列号域
+//        CertificateVersion cv = new CertificateVersion(CertificateVersion.V3);
+//        x509certinfo.set(X509CertInfo.VERSION, cv);
+//// 设置版本号 只有v1 ,v2,v3这几个合法值
+///**
+// *以上是证书的基本信息 如果要添加用户扩展信息 则比较麻烦 首先要确定version必须是v3否则不行 然后按照以下步骤
+// **/
+//
+//
+//        String userData = "Digital Signature, Non-Repudiation, Key Encipherment, Data Encipherment (f0)";
+//
+//
+//        byte l = (byte) userData.length();// 数据总长17位
+//        byte f = 0x04;
+//        byte[] bs = new byte[userData.length() + 2];
+//        bs[0] = f;
+//        bs[1] = l;
+//        for (int i = 2; i < bs.length; i++) {
+//            bs[i] = (byte) userData.charAt(i - 2);
+//        }
+//
+//
+//        KeyUsageExtension keyUsage = new KeyUsageExtension();
+//        keyUsage.set(KeyUsageExtension.DIGITAL_SIGNATURE, true);
+//        keyUsage.set(KeyUsageExtension.NON_REPUDIATION, true);
+//        keyUsage.set(KeyUsageExtension.KEY_ENCIPHERMENT, true);
+//        keyUsage.set(KeyUsageExtension.DATA_ENCIPHERMENT, true);
+//
+//
+//// 增强密钥用法
+//        ObjectIdentifier ekeyOid = new ObjectIdentifier(new int[] { 1, 3, 6, 1,
+//                5, 5, 7, 3, 3 });
+//        Vector<ObjectIdentifier> vkeyOid = new Vector<ObjectIdentifier>();
+//        vkeyOid.add(ekeyOid);
+//        ExtendedKeyUsageExtension exKeyUsage = new ExtendedKeyUsageExtension(
+//                vkeyOid);
+//
+//
+//        CertificateExtensions exts = new CertificateExtensions();
+//
+//
+//        exts.set("keyUsage", keyUsage);
+//        exts.set("extendedKeyUsage", exKeyUsage);
+//
+//
+//// 如果有多个extension则都放入CertificateExtensions 类中,
+//        x509certinfo.set(X509CertInfo.EXTENSIONS, exts);
+//
+//
+//        X509CertImpl x509certimpl1 = new X509CertImpl(x509certinfo);
+//        SerialNumber sn = new SerialNumber(new BigInteger(ip
+//                + System.currentTimeMillis()));
+//        x509certimpl1.set(X509CertImpl.SERIAL_ID, sn);// 设置证书序列号
+//        x509certimpl1.sign(rootPrivKey, "MD5WithRSA");// 使用另一个证书的私钥来签名此证书 这里使用
+//// md5散列 用rsa来加密
+//        Certificate[] certChain = { x509certimpl1 };
+//        savePfx(Util.certCA, kp.getPrivate(), password, certChain, certPath);
+//
+//
+//// 生成文件
+//        x509certimpl1.verify(certificate.getPublicKey(), null);
+//    }
+//
+//
+//    /**
+//     * 保存pfx文件,里面包括公钥,私钥,证书链别名
+//     *
+//     * @param alias
+//     * @param privKey
+//     * @param pwd
+//     * @param certChain
+//     * @param filepath
+//     * @throws Exception
+//     */
+//    public void savePfx(String alias, PrivateKey privKey, String pwd,
+//                        Certificate[] certChain, String filepath) throws Exception {
+//        FileOutputStream out = null;
+//        try {
+//            KeyStore outputKeyStore = KeyStore.getInstance("pkcs12");
+//            outputKeyStore.load(null, pwd.toCharArray());
+//            outputKeyStore.setKeyEntry(alias, privKey, pwd.toCharArray(),
+//                    certChain);
+//            out = new FileOutputStream(filepath);
+//            outputKeyStore.store(out, pwd.toCharArray());
+//        } finally {
+//            if (out != null)
+//                out.close();
+//        }
+//
+//
+//    }
+//
+//
+//    /**
+//     * 生成用户证书
+//     *
+//     * @param sbh
+//     *            纳税人识别号(文件名,不包含后缀)
+//     * @param user
+//     *            证书使用者
+//     * @param path
+//     *            证书保存路径(不包括文件名),如要保存在D盘的home目录下则输入:D:/home
+//     * @param password
+//     *            证书密码
+//     * @param ip
+//     *            客户端请求的ip
+//     * @return map里面包含两个key,一个code,一个msg,如果code等于0000则为生成成功,如果code不等于0000则为生成失败,
+//     *         msg里面保存失败原因
+//     */
+//    public Map<String, String> createCA(String sbh, String user, String path,
+//                                        String password, String ip) {
+//        Map<String, String> map = new HashMap<String, String>();
+//        if (sbh == null || "".equals(sbh)) {
+//            map.put("code", "-1");
+//            map.put("msg", "纳税人识别号不能为空");
+//            return map;
+//        }
+//        if (user == null || "".equals(user)) {
+//            map.put("code", "-1");
+//            map.put("msg", "证书使用者不能为空");
+//            return map;
+//        }
+//        if (path == null || "".equals(path)) {
+//            map.put("code", "-1");
+//            map.put("msg", "保存路径不能为空");
+//            return map;
+//        }
+//        if (password == null || "".equals(password)) {
+//            map.put("code", "-1");
+//            map.put("msg", "证书密码不能为空");
+//            return map;
+//        }
+//        if (!Util.ipCheck(ip)) {// 验证IP地址是否合法
+//            map.put("code", "-1");
+//            map.put("msg", "IP地址不合法");
+//            return map;
+//        }
+//        if(!new File(path).exists()){
+//            map.put("code", "5555");
+//            map.put("msg", "保存文件的目录不存在");
+//            return map;
+//        }
+//        String rootPath = path + File.separator + root + sbh + ".pfx";
+//        String certPath = path + File.separator + sbh + ".pfx";
+//        File file = new File(rootPath);
+//        if (file.exists()) {
+//            map.put("code", "6666");
+//            map.put("msg", "文件已存在");
+//            return map;
+//        }
+//        try {
+//            CertAndKeyGen cak = new CertAndKeyGen("RSA", "MD5WithRSA", null);
+//// 参数分别为 公钥算法 签名算法 providername(因为不知道确切的 只好使用null 既使用默认的provider)
+//            cak.generate(1024);
+//            cak.setRandom(sr);
+//// 生成一对key 参数为key的长度 对于rsa不能小于512
+//            X500Name subject = new X500Name(
+//                    "CN=root,OU=root,O=wp,L=BJ,S=BJ,C=CN");
+//// subject name
+//            X509Certificate certificate = cak.getSelfCertificate(subject,
+//                    new Date(), 365L * 24L * 60L * 60L * 1000L * 5L);
+//
+//
+//            X509Certificate[] certs = { certificate };
+//
+//
+//            savePfx(Util.rootCA, cak.getPrivateKey(), password, certs, rootPath);
+//            ip = Util.getIpNum(ip);
+//            signCert(rootPath, certPath, user, password, sbh, ip);
+//            map.put("code", "0000");
+//            map.put("msg", "用户证书生成成功");
+//            return map;
+//        } catch (Exception e) {
+//            if (file != null) {
+//                file.delete();
+//            }
+//            File file2 = new File(certPath);
+//            if (file2.exists())
+//                file2.delete();
+//            map.put("code", "9999");
+//            map.put("msg", "生成用户证书发生异常:" + e.getMessage());
+//            return map;
+//        }
+//    }
+//
+//
+//    /**
+//     *
+//     * @param rootPath
+//     *            根证书路径
+//     * @param certPath
+//     *            用户证书路径
+//     * @param user
+//     *            证书使用者
+//     * @param password
+//     *            证书密码
+//     * @param sbh
+//     *            纳税人识别号
+//     * @param ip
+//     *            请求地址的ip
+//     * @throws Exception
+//     */
+//    public void signCert(String rootPath, String certPath, String user,
+//                         String password, String sbh, String ip) throws Exception {
+//        FileInputStream ksfis = null;
+//        try {
+//            KeyStore ks = KeyStore.getInstance("pkcs12");
+//
+//
+//            ksfis = new FileInputStream(rootPath);
+//            char[] storePwd = password.toCharArray();
+//            char[] keyPwd = password.toCharArray();
+//
+//
+//            ks.load(ksfis, storePwd);
+//
+//
+//// 从密钥仓库得到私钥
+//            PrivateKey privK = (PrivateKey) ks.getKey(Util.rootCA, keyPwd);
+//
+//
+//            X509Certificate certificate = (X509Certificate) ks
+//                    .getCertificate(Util.rootCA);
+//
+//
+//            createCert(certificate, privK, genKey(), certPath, user, password,
+//                    sbh, ip);
+//        } finally {
+//            if (ksfis != null)
+//                ksfis.close();
+//        }
+//    }
+//
+//
+//    public KeyPair genKey() throws NoSuchAlgorithmException {
+//        KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");
+//        kpg.initialize(1024, sr);
+//        KeyPair kp = kpg.generateKeyPair();
+//        return kp;
+//    }
+//
+//
+//    /**
+//     * 获取证书序列号和公钥
+//     *
+//     * @param path
+//     *            证读取证书的路径
+//     * @param pass
+//     *            读取证书的密码
+//     * @return
+//     */
+//    public Map<String, String> getCertMessage(String path, String pass) {
+//        Map<String, String> map = new HashMap<String, String>();
+//        KeyStore ks;
+//        FileInputStream fis = null;
+//        if (pass == null || "".equals(pass) || path == null || "".equals(path)) {
+//            map.put("code", "-1");
+//            map.put("msg", "参数错误");
+//            return map;
+//        }
+//        try {
+//            ks = KeyStore.getInstance("PKCS12");
+//            fis = new FileInputStream(path);
+//
+//
+//            char[] nPassword = null;
+//            if ((pass == null) || pass.trim().equals("")) {
+//                nPassword = null;
+//            } else {
+//                nPassword = pass.toCharArray();
+//            }
+//            ks.load(fis, nPassword);
+//
+//
+//            X509Certificate cert = (X509Certificate) ks
+//                    .getCertificate(Util.certCA);
+//            PublicKey pubkey = cert.getPublicKey();
+//
+//
+//            byte pb[] = Serializer.serialize(pubkey);
+//            map.put("code", "0000");
+//            map.put("msg", "数据返回成功");
+//            map.put("certNumber", cert.getSerialNumber().toString());
+//            map.put("cert", Base64Utils.encode(pb));
+//            return map;
+//        } catch (FileNotFoundException e) {
+//            map.put("code", "1111");
+//            map.put("msg", "文件没有找到:" + e.getMessage());
+//            return map;
+//        } catch (CertificateException e) {
+//            map.put("code", "2222");
+//            map.put("msg", "读取证书异常:" + e.getMessage());
+//            return map;
+//        } catch (IOException e) {
+//            map.put("code", "4444");
+//            map.put("msg", "IO异常:" + e.getMessage());
+//            return map;
+//        } catch (Exception e) {
+//            map.put("code", "9999");
+//            map.put("msg", "未知异常:" + e.getMessage());
+//            return map;
+//        }finally{
+//            if(fis!=null)
+//                try {
+//                    fis.close();
+//                } catch (IOException e) {
+//                    e.printStackTrace();
+//                }
+//        }
+//    }
+//
+//
+//    /**
+//     * 签名数据
+//     *
+//     * @param path
+//     *            读取证书路径
+//     * @param pass
+//     *            读取证书密码
+//     * @param data
+//     *            待签名数据
+//     * @return
+//     */
+//    public Map<String, String> signData(String path, String pass, String data) {
+//        Map<String, String> map = new HashMap<String, String>();
+//        KeyStore ks;
+//        FileInputStream fis = null;
+//        if (pass == null || "".equals(pass) || path == null || "".equals(path)
+//                || data == null || "".equals(data)) {
+//            map.put("code", "-1");
+//            map.put("msg", "参数错误");
+//            return map;
+//        }
+//        try {
+//            ks = KeyStore.getInstance("PKCS12");
+//
+//
+//            fis = new FileInputStream(path);
+//
+//
+//            char[] nPassword = null;
+//            if ((pass == null) || pass.trim().equals("")) {
+//                nPassword = null;
+//            } else {
+//                nPassword = pass.toCharArray();
+//            }
+//            ks.load(fis, nPassword);
+//            X509Certificate cert = (X509Certificate) ks.getCertificate(Util.certCA);
+//
+//
+//            PrivateKey prikey = (PrivateKey) ks.getKey(Util.certCA, nPassword);
+//
+//
+//            Signature sig = Signature.getInstance("MD5WithRSA");
+//            sig.initSign(prikey);
+//            sig.update(data.getBytes("UTF-8"));
+//            byte b[] = sig.sign();
+//
+//            map.put("code", "0000");
+//            map.put("msg", "数据返回成功");
+//            map.put("certNumber", cert.getSerialNumber().toString());
+//            map.put("sign", Base64Utils.encode(b));
+//            return map;
+//        } catch (FileNotFoundException e) {
+//            map.put("code", "1111");
+//            map.put("msg", "文件没有找到:" + e.getMessage());
+//            return map;
+//        } catch (CertificateException e) {
+//            map.put("code", "2222");
+//            map.put("msg", "读取证书异常:" + e.getMessage());
+//            return map;
+//        } catch (NoSuchAlgorithmException e) {
+//            map.put("code", "2222");
+//            map.put("msg", "读取证书异常:" + e.getMessage());
+//            return map;
+//        } catch (SignatureException e) {
+//            map.put("code", "3333");
+//            map.put("msg", "签名异常:" + e.getMessage());
+//            return map;
+//        } catch (IOException e) {
+//            map.put("code", "4444");
+//            map.put("msg", "IO异常:" + e.getMessage());
+//            return map;
+//        } catch (Exception e) {
+//            map.put("code", "9999");
+//            map.put("msg", "未知异常:" + e.getMessage());
+//            return map;
+//        } finally {
+//            if (fis != null)
+//                try {
+//                    fis.close();
+//                } catch (IOException e) {
+//                    System.out.println(e.getMessage());
+//                }
+//        }
+//    }
+//
+//
+//    public void verify(String key,String sign,String signData) throws Exception{
+//        byte []pb = Base64Utils.decode(key);
+//        PublicKey pk = (PublicKey) Serializer.unserialize(pb);
+//        Signature sig2=Signature.getInstance("MD5WithRSA");
+//        sig2.initVerify(pk);
+//        sig2.update(sign.getBytes("UTF-8"));
+//        System.out.println("验签结果是:"+sig2.verify(Base64Utils.decode(signData)));
+//    }
+//    public static void main(String[] args) {
+//        try {
+//            GenX509Cert gcert = new GenX509Cert();
+//            String data = "adowdn@#&kajdk";
+//            Map<String, String> map = gcert.createCA("133456", "小科", "e:",
+//                    "123456", "10.26.27.28");
+//            System.out.println(map.get("code") + "\t" + map.get("msg"));
+//            Map<String, String> map1 = gcert.getCertMessage("e:/133456.pfx",
+//                    "123456");
+//            for (Entry<String, String> e : map1.entrySet()) {
+//                System.out.println(e.getKey() + "-->" + e.getValue());
+//            }
+//            Map<String, String> map2 = gcert.signData("e:/133456.pfx",
+//                    "123456", data);
+//            for (Entry<String, String> e : map2.entrySet()) {
+//                System.out.println(e.getKey() + "-->" + e.getValue());
+//            }
+//            gcert.verify(map1.get("cert"), data, map2.get("sign"));
+//        } catch (Exception e) {
+//            e.printStackTrace();
+//        }
+//    }
+//
+//}

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

@@ -0,0 +1,197 @@
+package org.jeecg.modules.ctop.sign.itext5;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.math.BigInteger;
+import java.security.KeyPair;
+import java.security.KeyPairGenerator;
+import java.security.KeyStore;
+import java.security.NoSuchAlgorithmException;
+import java.security.PrivateKey;
+import java.security.PublicKey;
+import java.security.SecureRandom;
+import java.security.cert.Certificate;
+import java.security.cert.CertificateFactory;
+import java.security.cert.X509Certificate;
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Random;
+
+import org.bouncycastle.asn1.ASN1ObjectIdentifier;
+import org.bouncycastle.asn1.ASN1Primitive;
+import org.bouncycastle.asn1.x500.X500Name;
+import org.bouncycastle.asn1.x509.BasicConstraints;
+import org.bouncycastle.asn1.x509.CRLDistPoint;
+import org.bouncycastle.asn1.x509.DistributionPoint;
+import org.bouncycastle.asn1.x509.DistributionPointName;
+import org.bouncycastle.asn1.x509.GeneralName;
+import org.bouncycastle.asn1.x509.GeneralNames;
+import org.bouncycastle.asn1.x509.KeyUsage;
+import org.bouncycastle.cert.X509CertificateHolder;
+import org.bouncycastle.cert.X509v3CertificateBuilder;
+import org.bouncycastle.cert.jcajce.JcaX509v3CertificateBuilder;
+import org.bouncycastle.jce.provider.BouncyCastleProvider;
+import org.bouncycastle.operator.ContentSigner;
+import org.bouncycastle.operator.jcajce.JcaContentSignerBuilder;
+
+public class ItextUtils {
+    private static KeyPair getKey() throws NoSuchAlgorithmException {
+        // 密钥对 生成器,RSA算法 生成的  提供者是 BouncyCastle
+        KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA", new BouncyCastleProvider());
+        generator.initialize(1024);  // 密钥长度 1024
+        // 证书中的密钥 公钥和私钥
+        KeyPair keyPair = generator.generateKeyPair();
+        return keyPair;
+    }
+
+    /**
+     * @param password       密码
+     * @param issuerStr      颁发机构信息
+     * @param subjectStr     使用者信息
+     * @param certificateCrl 颁发地址
+     * @return
+     */
+    public static Map<String, byte[]> createCert(String password, String issuerStr, String subjectStr, String certificateCrl) {
+
+        Map<String, byte[]> result = new HashMap<String, byte[]>();
+        ByteArrayOutputStream out = null;
+        try {
+            //  生成JKS证书
+            //  KeyStore keyStore = KeyStore.getInstance("JKS");
+            //  标志生成PKCS12证书
+            KeyStore keyStore = KeyStore.getInstance("PKCS7", new BouncyCastleProvider());
+            keyStore.load(null, null);
+            KeyPair keyPair = getKey();
+            //  issuer与 subject相同的证书就是CA证书
+            Certificate cert = generateCertificateV3(issuerStr, subjectStr, keyPair, result, certificateCrl, null);
+            // cretkey随便写,标识别名
+            keyStore.setKeyEntry("cretkey", keyPair.getPrivate(), password.toCharArray(), new Certificate[]{cert});
+            out = new ByteArrayOutputStream();
+            cert.verify(keyPair.getPublic());
+            keyStore.store(out, password.toCharArray());
+            byte[] keyStoreData = out.toByteArray();
+            result.put("keyStoreData", keyStoreData);
+            return result;
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            if (out != null) {
+                try {
+                    out.close();
+                } catch (IOException e) {
+                }
+            }
+        }
+        return result;
+    }
+
+    /**
+     * @param issuerStr
+     * @param subjectStr
+     * @param keyPair
+     * @param result
+     * @param certificateCrl
+     * @param extensions
+     * @return
+     */
+    public static Certificate generateCertificateV3(String issuerStr, String subjectStr, KeyPair keyPair, Map<String, byte[]> result,
+                                                    String certificateCrl, List<Extension> extensions) {
+
+        ByteArrayInputStream bout = null;
+        X509Certificate cert = null;
+        try {
+            PublicKey publicKey = keyPair.getPublic();
+            PrivateKey privateKey = keyPair.getPrivate();
+            Date notBefore = new Date();
+            Calendar rightNow = Calendar.getInstance();
+            rightNow.setTime(notBefore);
+            // 日期加1年
+            rightNow.add(Calendar.YEAR, 1);
+            Date notAfter = rightNow.getTime();
+            // 证书序列号
+            BigInteger serial = BigInteger.probablePrime(256, new Random());
+            X509v3CertificateBuilder builder = new JcaX509v3CertificateBuilder(
+                    new X500Name(issuerStr), serial, notBefore, notAfter, new X500Name(subjectStr), publicKey);
+            JcaContentSignerBuilder jBuilder = new JcaContentSignerBuilder("SHA1withRSA");
+            SecureRandom secureRandom = new SecureRandom();
+            jBuilder.setSecureRandom(secureRandom);
+            ContentSigner singer = jBuilder.setProvider(new BouncyCastleProvider()).build(privateKey);
+            // 分发点
+            ASN1ObjectIdentifier crlDistributionPoints = new ASN1ObjectIdentifier("2.5.29.31");
+            GeneralName generalName = new GeneralName(GeneralName.uniformResourceIdentifier, certificateCrl);
+            GeneralNames seneralNames = new GeneralNames(generalName);
+            DistributionPointName distributionPoint = new DistributionPointName(seneralNames);
+            DistributionPoint[] points = new DistributionPoint[1];
+            points[0] = new DistributionPoint(distributionPoint, null, null);
+            CRLDistPoint crlDistPoint = new CRLDistPoint(points);
+            builder.addExtension(crlDistributionPoints, true, crlDistPoint);
+            // 用途
+            ASN1ObjectIdentifier keyUsage = new ASN1ObjectIdentifier("2.5.29.15");
+            // | KeyUsage.nonRepudiation | KeyUsage.keyCertSign
+            builder.addExtension(keyUsage, true, new KeyUsage(KeyUsage.digitalSignature | KeyUsage.keyEncipherment));
+            // 基本限制 X509Extension.java
+            ASN1ObjectIdentifier basicConstraints = new ASN1ObjectIdentifier("2.5.29.19");
+            builder.addExtension(basicConstraints, true, new BasicConstraints(true));
+            // privKey:使用自己的私钥进行签名,CA证书
+            if (extensions != null) {
+                for (Extension ext : extensions) {
+                    builder.addExtension(
+                            new ASN1ObjectIdentifier(ext.getOid()),
+                            ext.isCritical(),
+                            ASN1Primitive.fromByteArray(ext.getValue()));
+                }
+            }
+            X509CertificateHolder holder = builder.build(singer);
+            CertificateFactory cf = CertificateFactory.getInstance("X.509");
+            bout = new ByteArrayInputStream(holder.toASN1Structure().getEncoded());
+            cert = (X509Certificate) cf.generateCertificate(bout);
+            byte[] certBuf = holder.getEncoded();
+            SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
+            // 证书数据
+            result.put("certificateData", certBuf);
+            //公钥
+            result.put("publicKey", publicKey.getEncoded());
+            //私钥
+            result.put("privateKey", privateKey.getEncoded());
+            //证书有效开始时间
+            result.put("notBefore", format.format(notBefore).getBytes("utf-8"));
+            //证书有效结束时间
+            result.put("notAfter", format.format(notAfter).getBytes("utf-8"));
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            if (bout != null) {
+                try {
+                    bout.close();
+                } catch (IOException e) {
+                }
+            }
+        }
+        return cert;
+    }
+
+    public static void main(String[] args) throws Exception {
+        // CN: 名字与姓氏    OU : 组织单位名称
+        // O :组织名称  L : 城市或区域名称  E : 电子邮件
+        // ST: 州或省份名称  C: 单位的两字母国家代码
+        String issuerStr = "CN=天天凭证,OU=研发部,O=gitbook有限公司,C=CN,E=gitbook@sina.com,L=北京,ST=北京";
+        String subjectStr = "CN=huangjinjin,OU=用户,O=借款人,C=CN,E=huangjinjin@sina.com,L=北京,ST=北京";
+        String certificateCrl = "https://gitbook.cn";
+        Map<String, byte[]> result = createCert("123456", issuerStr, subjectStr, certificateCrl);
+
+//		FileOutputStream outPutStream = new FileOutputStream("C:/pdf/keystore.p12"); // 生成.p12
+//		outPutStream.write(result.get("keyStoreData"));
+//		outPutStream.close();
+        FileOutputStream fos = new FileOutputStream(new File("D:/sign/zheng.cer"));//生成.p12颁发给用户的证书
+        fos.write(result.get("certificateData"));
+        fos.flush();
+        fos.close();
+    }
+}

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

@@ -0,0 +1,281 @@
+package org.jeecg.modules.ctop.sign.itext5;
+
+import java.io.*;
+import java.math.BigInteger;
+import java.security.*;
+import java.security.cert.*;
+import java.security.cert.Certificate;
+import java.text.SimpleDateFormat;
+import java.util.*;
+
+import org.bouncycastle.asn1.ASN1ObjectIdentifier;
+import org.bouncycastle.asn1.ASN1Primitive;
+import org.bouncycastle.asn1.x500.X500Name;
+import org.bouncycastle.asn1.x509.BasicConstraints;
+import org.bouncycastle.asn1.x509.CRLDistPoint;
+import org.bouncycastle.asn1.x509.DistributionPoint;
+import org.bouncycastle.asn1.x509.DistributionPointName;
+import org.bouncycastle.asn1.x509.GeneralName;
+import org.bouncycastle.asn1.x509.GeneralNames;
+import org.bouncycastle.asn1.x509.KeyUsage;
+import org.bouncycastle.cert.X509CertificateHolder;
+import org.bouncycastle.cert.X509v3CertificateBuilder;
+import org.bouncycastle.cert.jcajce.JcaX509v3CertificateBuilder;
+import org.bouncycastle.cms.CMSSignedData;
+import org.bouncycastle.cms.SignerInformation;
+import org.bouncycastle.cms.SignerInformationStore;
+import org.bouncycastle.jce.provider.BouncyCastleProvider;
+import org.bouncycastle.operator.ContentSigner;
+import org.bouncycastle.operator.jcajce.JcaContentSignerBuilder;
+
+public class Pkcs {
+
+    private static KeyPair getKey() throws NoSuchAlgorithmException {
+        KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA",
+                new BouncyCastleProvider());
+        generator.initialize(1024);
+        // 证书中的密钥 公钥和私钥
+        KeyPair keyPair = generator.generateKeyPair();
+        return keyPair;
+    }
+
+    /**
+     * @param password       密码
+     * @param issuerStr      颁发机构信息
+     * @param subjectStr     使用者信息
+     * @param certificateCrl 颁发地址
+     * @return
+     */
+    public static Map<String, byte[]> createCert(String password,
+                                                 String issuerStr, String subjectStr, String certificateCrl) {
+        Map<String, byte[]> result = new HashMap<String, byte[]>();
+        ByteArrayOutputStream out = null;
+        try {
+            // 生成JKS证书
+            // KeyStore keyStore = KeyStore.getInstance("JKS");
+            // 标志生成PKCS12证书
+            KeyStore keyStore = KeyStore.getInstance("PKCS12",
+                    new BouncyCastleProvider());
+            keyStore.load(null, null);
+            KeyPair keyPair = getKey();
+            // issuer与 subject相同的证书就是CA证书
+            Certificate cert = generateCertificateV3(issuerStr, subjectStr,
+                    keyPair, result, certificateCrl, null);
+            // cretkey随便写,标识别名
+            keyStore.setKeyEntry("cretkey", keyPair.getPrivate(),
+                    password.toCharArray(), new Certificate[]{cert});
+            out = new ByteArrayOutputStream();
+            cert.verify(keyPair.getPublic());
+            keyStore.store(out, password.toCharArray());
+            byte[] keyStoreData = out.toByteArray();
+            result.put("keyStoreData", keyStoreData);
+            return result;
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            if (out != null) {
+                try {
+                    out.close();
+                } catch (IOException e) {
+                }
+            }
+        }
+        return result;
+    }
+
+    /**
+     * @param issuerStr
+     * @param subjectStr
+     * @param keyPair
+     * @param result
+     * @param certificateCrl
+     * @param extensions
+     * @return
+     */
+    public static Certificate generateCertificateV3(String issuerStr,
+                                                    String subjectStr, KeyPair keyPair, Map<String, byte[]> result,
+                                                    String certificateCrl, List<Extension> extensions) {
+        ByteArrayInputStream bout = null;
+        X509Certificate cert = null;
+        try {
+            PublicKey publicKey = keyPair.getPublic();
+            PrivateKey privateKey = keyPair.getPrivate();
+            Date notBefore = new Date();
+            Calendar rightNow = Calendar.getInstance();
+            rightNow.setTime(notBefore);
+            // 日期加1年
+            rightNow.add(Calendar.YEAR, 1);
+            Date notAfter = rightNow.getTime();
+            // 证书序列号
+            BigInteger serial = BigInteger.probablePrime(256, new Random());
+            X509v3CertificateBuilder builder = new JcaX509v3CertificateBuilder(
+                    new X500Name(issuerStr), serial, notBefore, notAfter,
+                    new X500Name(subjectStr), publicKey);
+            JcaContentSignerBuilder jBuilder = new JcaContentSignerBuilder(
+                    "SHA1withRSA");
+            SecureRandom secureRandom = new SecureRandom();
+            jBuilder.setSecureRandom(secureRandom);
+            ContentSigner singer = jBuilder.setProvider(
+                    new BouncyCastleProvider()).build(privateKey);
+            // 分发点
+            ASN1ObjectIdentifier crlDistributionPoints = new ASN1ObjectIdentifier(
+                    "2.5.29.31");
+            GeneralName generalName = new GeneralName(
+                    GeneralName.uniformResourceIdentifier, certificateCrl);
+            GeneralNames seneralNames = new GeneralNames(generalName);
+            DistributionPointName distributionPoint = new DistributionPointName(
+                    seneralNames);
+            DistributionPoint[] points = new DistributionPoint[1];
+            points[0] = new DistributionPoint(distributionPoint, null, null);
+            CRLDistPoint crlDistPoint = new CRLDistPoint(points);
+            builder.addExtension(crlDistributionPoints, true, crlDistPoint);
+            // 用途
+            ASN1ObjectIdentifier keyUsage = new ASN1ObjectIdentifier(
+                    "2.5.29.15");
+            // | KeyUsage.nonRepudiation | KeyUsage.keyCertSign
+            builder.addExtension(keyUsage, true, new KeyUsage(
+                    KeyUsage.digitalSignature | KeyUsage.keyEncipherment));
+            // 基本限制 X509Extension.java
+            ASN1ObjectIdentifier basicConstraints = new ASN1ObjectIdentifier(
+                    "2.5.29.19");
+            builder.addExtension(basicConstraints, true, new BasicConstraints(
+                    true));
+            // privKey:使用自己的私钥进行签名,CA证书
+            if (extensions != null) {
+                for (Extension ext : extensions) {
+                    builder.addExtension(
+                            new ASN1ObjectIdentifier(ext.getOid()),
+                            ext.isCritical(),
+                            ASN1Primitive.fromByteArray(ext.getValue()));
+                }
+            }
+            X509CertificateHolder holder = builder.build(singer);
+            CertificateFactory cf = CertificateFactory.getInstance("X.509");
+            bout = new ByteArrayInputStream(holder.toASN1Structure()
+                    .getEncoded());
+            cert = (X509Certificate) cf.generateCertificate(bout);
+            byte[] certBuf = holder.getEncoded();
+            SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
+            // 证书数据
+            result.put("certificateData", certBuf);
+            //公钥
+            result.put("publicKey", publicKey.getEncoded());
+            //私钥
+            result.put("privateKey", privateKey.getEncoded());
+            //证书有效开始时间
+            result.put("notBefore", format.format(notBefore).getBytes("utf-8"));
+            //证书有效结束时间
+            result.put("notAfter", format.format(notAfter).getBytes("utf-8"));
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            if (bout != null) {
+                try {
+                    bout.close();
+                } catch (IOException e) {
+                }
+            }
+        }
+        return cert;
+    }
+
+    /**
+     * 使用java自带的安全包。由于jdk中没有对PKCS#7格式签名数据的处理。在做验证时需要三个参数:原文;签名数据和签名者证书/签名者公钥,都是BASE64编码
+     *
+     * @param signData
+     * @param signedData
+     * @param cert
+     * @return
+     */
+    public boolean signedDataVerify(byte[] signData, byte[] signedData, byte[] cert) {
+        boolean verifyRet = true;
+        try {
+            // 创建Factory对象
+            CertificateFactory oCf = CertificateFactory.getInstance("X.509");
+            // 创建X509证书对象
+            InputStream ois = new ByteArrayInputStream(cert);
+            X509Certificate oCert = (X509Certificate) oCf.generateCertificate(ois);
+            // 创建签名对象
+            Signature oSign = Signature.getInstance("SHA1withRSA");
+            // 初始化签名对象
+            oSign.initVerify(oCert);
+            // 传入签名原文
+            oSign.update(signData);
+            // 验证数字签名
+            verifyRet = oSign.verify(signedData);
+        } catch (Exception e) {
+            verifyRet = false;
+            e.printStackTrace();
+            System.out.println("验证数字签名失败");
+        }
+        return verifyRet;
+    }
+
+    /**
+     * 通过bouncycastle的CMSSignedData可以实现pkcs#7格式签名数据的验证,利用CMSSignedData生成pkcs#7格式签名数据。由于pkcs#7里面包含了原文和证书信息,所以参数只需要签名值即可
+     *
+     * @param signedData
+     * @return
+     */
+    public boolean signedDataVerify(byte[] signedData) {
+        boolean verifyRet = true;
+        try {
+            // 新建PKCS#7签名数据处理对象
+            CMSSignedData sign = new CMSSignedData(signedData);
+
+            // 添加BouncyCastle作为安全提供
+            Security.addProvider(new
+                    org.bouncycastle.jce.provider.BouncyCastleProvider());
+
+            // 获得证书信息
+            CertStore certs = sign.getCertificatesAndCRLs("Collection", "BC");
+
+            // 获得签名者信息
+            SignerInformationStore signers = sign.getSignerInfos();
+            Collection c = signers.getSigners();
+            Iterator it = c.iterator();
+
+            // 当有多个签名者信息时需要全部验证
+            while (it.hasNext()) {
+                SignerInformation signer = (SignerInformation) it.next();
+
+                // 证书链
+                Collection certCollection = certs.getCertificates((CertSelector) signer
+                        .getSID());
+                Iterator certIt = certCollection.iterator();
+                X509Certificate cert = (X509Certificate) certIt.next();
+
+                // 验证数字签名
+                if (signer.verify(cert.getPublicKey(), "BC")) {
+                    verifyRet = true;
+                } else {
+                    verifyRet = false;
+                }
+            }
+
+        } catch (Exception e) {
+            verifyRet = false;
+            e.printStackTrace();
+            System.out.println("验证数字签名失败");
+        }
+        return verifyRet;
+    }
+
+    public static void main(String[] args) throws Exception {
+        // CN: 名字与姓氏    OU : 组织单位名称
+        // O :组织名称  L : 城市或区域名称  E : 电子邮件
+        // ST: 州或省份名称  C: 单位的两字母国家代码
+        String issuerStr = "CN=在线医院,OU=gitbook研发部,O=gitbook有限公司,C=CN,E=gitbook@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";
+        Map<String, byte[]> result = createCert("123456", issuerStr, subjectStr, certificateCrl);
+
+        FileOutputStream outPutStream = new FileOutputStream("D:/keystore.p12"); // ca.jks
+        outPutStream.write(result.get("keyStoreData"));
+        outPutStream.close();
+        FileOutputStream fos = new FileOutputStream(new File("D:/keystore.cer"));
+        fos.write(result.get("certificateData"));
+        fos.flush();
+        fos.close();
+    }
+}

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

@@ -0,0 +1,137 @@
+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.cert.Certificate;
+
+import org.bouncycastle.jce.provider.BouncyCastleProvider;
+
+import com.itextpdf.awt.AsianFontMapper;
+import com.itextpdf.text.BaseColor;
+import com.itextpdf.text.Element;
+import com.itextpdf.text.Font;
+import com.itextpdf.text.Paragraph;
+import com.itextpdf.text.Rectangle;
+import com.itextpdf.text.pdf.BaseFont;
+import com.itextpdf.text.pdf.ColumnText;
+import com.itextpdf.text.pdf.PdfReader;
+import com.itextpdf.text.pdf.PdfSignatureAppearance;
+import com.itextpdf.text.pdf.PdfStamper;
+import com.itextpdf.text.pdf.PdfStream;
+import com.itextpdf.text.pdf.PdfTemplate;
+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.MakeSignature.CryptoStandard;
+import com.itextpdf.text.pdf.security.PrivateKeySignature;
+
+
+public class SignHighPdf {
+
+    /**
+     * @param password     秘钥密码
+     * @param keyStorePath 秘钥文件路径
+     * @param signPdfSrc   签名的PDF文件
+     * @param x
+     * @param y
+     * @return
+     */
+    public static byte[] sign(String password, String keyStorePath, String signPdfSrc,
+                              float x, float y,
+                              String signText) {
+        File signPdfSrcFile = new File(signPdfSrc);
+        PdfReader reader = null;
+        ByteArrayOutputStream signPdfData = null;
+        PdfStamper stp = null;
+        FileInputStream fos = null;
+        try {
+            BouncyCastleProvider provider = new BouncyCastleProvider();
+            Security.addProvider(provider);
+            KeyStore ks = KeyStore.getInstance("PKCS12", new BouncyCastleProvider());
+            fos = new FileInputStream(keyStorePath);
+            ks.load(fos, password.toCharArray()); // 私钥密码
+            String alias = (String) ks.aliases().nextElement();
+            PrivateKey key = (PrivateKey) ks.getKey(alias, password.toCharArray());
+            Certificate[] chain = ks.getCertificateChain(alias);
+            reader = new PdfReader(signPdfSrc);
+            signPdfData = new ByteArrayOutputStream();
+            // 临时pdf文件
+            File temp = new File(signPdfSrcFile.getParent(), System.currentTimeMillis() + ".pdf");
+            stp = PdfStamper.createSignature(reader, signPdfData, '\0', temp, true);
+            PdfSignatureAppearance sap = stp.getSignatureAppearance();
+            sap.setReason("数字签名,不可改变");
+            // 是对应x轴和y轴坐标
+            sap.setVisibleSignature(new Rectangle(x, y, x + 150, y + 65), 1,
+                    "sr" + String.valueOf(System.nanoTime()));
+            /////////////////layer 0 Creating the appearance for layer 0
+            PdfTemplate n0 = sap.getLayer(0);
+            n0.reset();
+            float lx = n0.getBoundingBox().getLeft();
+            float by = n0.getBoundingBox().getBottom();
+            float width = n0.getBoundingBox().getWidth();
+            float height = n0.getBoundingBox().getHeight();
+            n0.setRGBColorFill(255, 0, 0);
+            n0.rectangle(lx, by, 5, height);
+            n0.rectangle(lx, by, width, 5);
+            n0.rectangle(lx, by + height - 5, width, 5);
+            n0.rectangle(lx + width - 5, by, 5, height);
+            n0.fill();
+            ///////////////////////layer 2
+            PdfTemplate n2 = sap.getLayer(2);
+            n2.setCharacterSpacing(0.0f);
+            ColumnText ct = new ColumnText(n2);
+            ct.setSimpleColumn(n2.getBoundingBox());
+            n2.setRGBColorFill(255, 0, 0);
+            //做一个占位的动作
+            Paragraph p1 = new Paragraph(" ");
+            BaseFont bf = BaseFont.createFont(AsianFontMapper.ChineseSimplifiedFont, AsianFontMapper.ChineseSimplifiedEncoding_H,
+                    BaseFont.NOT_EMBEDDED);
+            Font font1 = new Font(bf, 5, Font.BOLD, BaseColor.RED);
+            Font font2 = new Font(bf, 13, Font.BOLD, BaseColor.RED);
+            p1.setFont(font1);
+            ct.addElement(p1);
+            Paragraph p = new Paragraph(signText);
+            p.setAlignment(Element.ALIGN_CENTER);
+            p.setFont(font2);
+            ct.addElement(p);
+            ct.go();
+            stp.getWriter().setCompressionLevel(PdfStream.BEST_COMPRESSION);
+            ExternalDigest digest = new BouncyCastleDigest();
+            ExternalSignature signature = new PrivateKeySignature(key, DigestAlgorithms.SHA512, provider.getName());
+            MakeSignature.signDetached(sap, digest, signature, chain, null, null, null, 0, CryptoStandard.CADES);
+            stp.close();
+            reader.close();
+            return signPdfData.toByteArray();
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            if (signPdfData != null) {
+                try {
+                    signPdfData.close();
+                } catch (IOException e) {
+                }
+            }
+            if (fos != null) {
+                try {
+                    fos.close();
+                } catch (IOException e) {
+                }
+            }
+        }
+        return null;
+    }
+
+    public static void main(String[] args) throws Exception {
+        //对已经签章的signed.pdf文件再次签章,这次是高清签章
+        byte[] fileData = sign("123456", "C:\\Users\\syh\\Desktop\\keystore.p12",//
+                "C:\\Users\\syh\\Desktop\\test.pdf", 350, 290, "华佗\n2017-12-20");
+        FileOutputStream f = new FileOutputStream(new File("C:\\Users\\syh\\Desktop\\signed2.pdf"));
+        f.write(fileData);
+        f.close();
+    }
+
+}

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


Beberapa file tidak ditampilkan karena terlalu banyak file yang berubah dalam diff ini