Pārlūkot izejas kodu

Merge branch 'master' into develop_zqc

# Conflicts:
#	menduner/menduner-flames-api/src/test/java/com/citupro/flames/FlamesApplicationTests.java
DESKTOP-VAEGFGM\zqc 8 mēneši atpakaļ
vecāks
revīzija
b9f1c48146
100 mainītis faili ar 1616 papildinājumiem un 210 dzēšanām
  1. 2 1
      citu-framework/citu-common/src/main/java/com/citu/framework/common/util/validation/ValidationUtils.java
  2. 1 0
      citu-framework/citu-spring-boot-starter-baidu-aip/src/main/java/com/citu/framework/baiduaip/core/AipOcrClient.java
  3. 4 0
      citu-framework/citu-spring-boot-starter-baidu-aip/src/main/java/com/citu/framework/baiduaip/core/ocr/BusinessLicenseOcr.java
  4. 7 4
      citu-framework/citu-spring-boot-starter-excel/src/main/java/com/citu/framework/excel/core/util/ExcelUtils.java
  5. 4 4
      citu-framework/citu-spring-boot-starter-web/src/main/java/com/citu/framework/apilog/core/interceptor/ApiAccessLogInterceptor.java
  6. 1 1
      citu-gateway/src/main/resources/bootstrap.yaml
  7. 1 1
      citu-gateway/src/main/resources/logback-spring.xml
  8. 1 1
      citu-module-bpm/citu-module-bpm-biz/src/main/resources/bootstrap.yaml
  9. 1 1
      citu-module-bpm/citu-module-bpm-biz/src/main/resources/logback-spring.xml
  10. 1 1
      citu-module-crm/citu-module-crm-biz/src/main/resources/bootstrap.yaml
  11. 1 1
      citu-module-crm/citu-module-crm-biz/src/main/resources/logback-spring.xml
  12. 1 1
      citu-module-erp/citu-module-erp-biz/src/main/resources/bootstrap.yaml
  13. 1 1
      citu-module-erp/citu-module-erp-biz/src/main/resources/logback-spring.xml
  14. 1 1
      citu-module-infra/citu-module-infra-biz/src/main/resources/bootstrap.yaml
  15. 1 1
      citu-module-infra/citu-module-infra-biz/src/main/resources/logback-spring.xml
  16. 1 1
      citu-module-mall/citu-module-product-biz/src/main/resources/bootstrap.yaml
  17. 1 1
      citu-module-mall/citu-module-product-biz/src/main/resources/logback-spring.xml
  18. 1 1
      citu-module-mall/citu-module-promotion-biz/src/main/resources/bootstrap.yaml
  19. 1 1
      citu-module-mall/citu-module-promotion-biz/src/main/resources/logback-spring.xml
  20. 1 1
      citu-module-mall/citu-module-statistics-biz/src/main/resources/bootstrap.yaml
  21. 1 1
      citu-module-mall/citu-module-statistics-biz/src/main/resources/logback-spring.xml
  22. 1 1
      citu-module-mall/citu-module-trade-biz/src/main/resources/bootstrap.yaml
  23. 1 1
      citu-module-mall/citu-module-trade-biz/src/main/resources/logback-spring.xml
  24. 9 8
      citu-module-member/citu-module-member-biz/src/main/java/com/citu/module/member/dal/dataobject/invoice/InvoiceListDO.java
  25. 9 9
      citu-module-member/citu-module-member-biz/src/main/java/com/citu/module/member/dal/dataobject/invoice/InvoiceTitleDO.java
  26. 4 3
      citu-module-member/citu-module-member-biz/src/main/java/com/citu/module/member/service/signin/MemberSignInRecordServiceImpl.java
  27. 1 1
      citu-module-member/citu-module-member-biz/src/main/resources/bootstrap.yaml
  28. 1 1
      citu-module-member/citu-module-member-biz/src/main/resources/logback-spring.xml
  29. 1 1
      citu-module-mp/citu-module-mp-biz/src/main/resources/bootstrap.yaml
  30. 1 1
      citu-module-mp/citu-module-mp-biz/src/main/resources/logback-spring.xml
  31. 1 1
      citu-module-pay/citu-module-pay-biz/src/main/resources/bootstrap.yaml
  32. 1 1
      citu-module-pay/citu-module-pay-biz/src/main/resources/logback-spring.xml
  33. 1 1
      citu-module-report/citu-module-report-biz/src/main/resources/bootstrap.yaml
  34. 1 1
      citu-module-report/citu-module-report-biz/src/main/resources/logback-spring.xml
  35. 3 3
      citu-module-system/citu-module-system-api/src/main/java/com/citu/module/system/enums/sms/SmsSceneEnum.java
  36. 53 0
      citu-module-system/citu-module-system-biz/src/main/java/com/citu/module/system/controller/app/captcha/AppCaptchaController.java
  37. 1 1
      citu-module-system/citu-module-system-biz/src/main/java/com/citu/module/system/service/social/SocialClientServiceImpl.java
  38. 7 1
      citu-module-system/citu-module-system-biz/src/main/resources/application.yaml
  39. 1 1
      citu-module-system/citu-module-system-biz/src/main/resources/bootstrap.yaml
  40. 1 1
      citu-module-system/citu-module-system-biz/src/main/resources/logback-spring.xml
  41. 46 0
      menduner/menduner-common/src/main/java/com/citu/module/menduner/common/enums/EventAsyncUrlEnum.java
  42. 1 1
      menduner/menduner-common/src/main/java/com/citu/module/menduner/common/enums/MathOperationEnum.java
  43. 6 4
      menduner/menduner-common/src/main/java/com/citu/module/menduner/common/enums/PointBizTypeEnum.java
  44. 32 0
      menduner/menduner-common/src/main/java/com/citu/module/menduner/common/message/EventAsyncConfirmMessage.java
  45. 4 3
      menduner/menduner-common/src/main/java/com/citu/module/menduner/common/message/UserPointSendMessage.java
  46. 23 0
      menduner/menduner-common/src/main/java/com/citu/module/menduner/common/util/LoginUserContext.java
  47. 6 6
      menduner/menduner-flames-biz/src/main/java/com/citupro/module/menduner/flames/controller/app/AdvertisementMessageController.java
  48. 1 3
      menduner/menduner-im-biz/src/main/java/com/citu/module/menduner/im/service/UserServiceImpl.java
  49. 1 1
      menduner/menduner-im-biz/src/main/resources/bootstrap.yaml
  50. 1 1
      menduner/menduner-im-biz/src/main/resources/logback-spring.xml
  51. 1 1
      menduner/menduner-mall-biz/src/main/resources/bootstrap.yaml
  52. 1 1
      menduner/menduner-mall-biz/src/main/resources/logback-spring.xml
  53. 1 1
      menduner/menduner-reward-biz/Dockerfile
  54. 0 4
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/controller/admin/event/EventTrackController.java
  55. 3 0
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/controller/base/event/EventRecordPageReqVO.java
  56. 4 0
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/controller/base/event/EventRecordRespVO.java
  57. 4 0
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/dal/dataobject/event/EventRecordDO.java
  58. 1 3
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/dal/mysql/config/PointRuleConfigMapper.java
  59. 6 4
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/dal/mysql/event/EventRecordMapper.java
  60. 2 2
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/dal/redis/RedisKeyConstants.java
  61. 43 0
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/mq/consumer/EventAsyncConfirmConsumer.java
  62. 1 1
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/mq/producer/UserPointProducer.java
  63. 1 1
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/service/config/PointRuleConfigService.java
  64. 2 2
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/service/config/PointRuleConfigServiceImpl.java
  65. 4 2
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/service/event/EventRecordService.java
  66. 6 5
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/service/event/EventRecordServiceImpl.java
  67. 13 0
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/service/event/EventTrackService.java
  68. 45 31
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/service/event/EventTrackServiceImpl.java
  69. 5 5
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/service/signin/SignInRecordServiceImpl.java
  70. 1 1
      menduner/menduner-reward-biz/src/main/resources/bootstrap.yaml
  71. 1 1
      menduner/menduner-reward-biz/src/main/resources/logback-spring.xml
  72. 12 0
      menduner/menduner-system-api/src/main/java/com/citu/module/menduner/system/enums/CommonConstants.java
  73. 106 5
      menduner/menduner-system-api/src/main/java/com/citu/module/menduner/system/enums/ErrorCodeConstants.java
  74. 13 0
      menduner/menduner-system-api/src/main/java/com/citu/module/menduner/system/enums/TradeOrderTypeMq.java
  75. 11 1
      menduner/menduner-system-api/src/main/java/com/citu/module/menduner/system/enums/order/TradeOrderTypeEnum.java
  76. 1 1
      menduner/menduner-system-api/src/main/java/com/citu/module/menduner/system/enums/user/MdeUserTypeEnum.java
  77. 32 0
      menduner/menduner-system-api/src/main/java/com/citu/module/menduner/system/enums/user/UserVipFlagEnum.java
  78. 10 0
      menduner/menduner-system-biz/pom.xml
  79. 73 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/aop/VipEntitlementCheck.java
  80. 189 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/aop/VipEntitlementCheckAspect.java
  81. 2 2
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/api/account/UserAccountApiImpl.java
  82. 1 1
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/api/user/UserApiImpl.java
  83. 8 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/admin/area/AreaController.java
  84. 94 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/admin/brand/BrandController.java
  85. 94 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/admin/content/MorningNewsController.java
  86. 9 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/admin/enterprise/EnterpriseBusinessController.java
  87. 9 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/admin/enterprise/EnterpriseController.java
  88. 95 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/admin/enterprise/EnterprisePackageController.java
  89. 52 41
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/admin/job/JobAdvertisedController.java
  90. 95 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/admin/job/JobFairController.java
  91. 1 1
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/admin/order/TradeOrderController.java
  92. 10 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/admin/position/PositionController.java
  93. 94 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/admin/redeem/RedeemController.java
  94. 2 4
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/admin/user/UserAccountController.java
  95. 94 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/admin/user/UserEntitlementController.java
  96. 94 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/admin/user/UserPackageController.java
  97. 12 3
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/app/common/auth/AppMdeAuthController.java
  98. 2 2
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/app/common/auth/enterprise/AppEnterpriseAuthLoginReqVO.java
  99. 2 2
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/app/common/auth/enterprise/AppEnterpriseAuthSmsLoginReqVO.java
  100. 1 1
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/app/common/auth/enterprise/AppEnterpriseAuthSwitchLoginReqVO.java

+ 2 - 1
citu-framework/citu-common/src/main/java/com/citu/framework/common/util/validation/ValidationUtils.java

@@ -27,7 +27,8 @@ public class ValidationUtils {
 
     private static final Pattern PATTERN_EMAIL = Pattern.compile(
             "^[_A-Za-z0-9-]+(\\.[_A-Za-z0-9-]+)*@"
-                    + "[A-Za-z0-9]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$"
+                    + "[A-Za-z0-9][A-Za-z0-9-]*(?:\\.[A-Za-z0-9-]+)*"
+                    + "(?:\\.[A-Za-z]{2,})$"
     );
 
 

+ 1 - 0
citu-framework/citu-spring-boot-starter-baidu-aip/src/main/java/com/citu/framework/baiduaip/core/AipOcrClient.java

@@ -74,6 +74,7 @@ public class AipOcrClient {
             getWordsResultAttribute("实收资本", wordsResult);
             getWordsResultAttribute("税务登记号", wordsResult);
 
+            businessLicenseOcr.setBusinessUrl(imageUrl);
 
             return businessLicenseOcr;
         } catch (Exception ex) {

+ 4 - 0
citu-framework/citu-spring-boot-starter-baidu-aip/src/main/java/com/citu/framework/baiduaip/core/ocr/BusinessLicenseOcr.java

@@ -77,4 +77,8 @@ public class BusinessLicenseOcr {
      * 经营范围
      */
     private String businessScope;
+    /**
+     * 营业执照照片
+     */
+    private String businessUrl;
 }

+ 7 - 4
citu-framework/citu-spring-boot-starter-excel/src/main/java/com/citu/framework/excel/core/util/ExcelUtils.java

@@ -20,6 +20,9 @@ import java.util.List;
  * @author Rayson
  */
 public class ExcelUtils {
+    private final static String XLSX = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
+    private final static String XLS = "application/vnd.ms-excel;charset=UTF-8";
+
 
     /**
      * 将列表以 Excel 响应给前端
@@ -34,6 +37,9 @@ public class ExcelUtils {
      */
     public static <T> void write(HttpServletResponse response, String filename, String sheetName,
                                  Class<T> head, List<T> data) throws IOException {
+        // 设置 header 和 contentType。写在最后的原因是,避免报错时,响应 contentType 已经被修改了
+        response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(filename, StandardCharsets.UTF_8.name()));
+        response.setContentType(filename.contains(".xlsx") ? XLSX : XLS);
         // 输出 Excel
         EasyExcel.write(response.getOutputStream(), head)
                 .autoCloseStream(false) // 不要自动关闭,交给 Servlet 自己处理
@@ -41,9 +47,6 @@ public class ExcelUtils {
                 .registerWriteHandler(new SelectSheetWriteHandler(head)) // 基于固定 sheet 实现下拉框
                 .registerConverter(new LongStringConverter()) // 避免 Long 类型丢失精度
                 .sheet(sheetName).doWrite(data);
-        // 设置 header 和 contentType。写在最后的原因是,避免报错时,响应 contentType 已经被修改了
-        response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(filename, StandardCharsets.UTF_8.name()));
-        response.setContentType("application/vnd.ms-excel;charset=UTF-8");
     }
 
     /**
@@ -59,7 +62,7 @@ public class ExcelUtils {
             throws IOException {
         // 设置 header 和 contentType。写在最后的原因是,避免报错时,响应 contentType 已经被修改了
         response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(filename, StandardCharsets.UTF_8.name()));
-        response.setContentType("application/vnd.ms-excel;charset=UTF-8");
+        response.setContentType(filename.contains(".xlsx") ? XLSX : XLS);
         try (ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream()).autoCloseStream(false).build()) {
             for (ExcelWriteDTO writeDTO : writeDTOList) {
                 WriteSheet writeSheet = null;

+ 4 - 4
citu-framework/citu-spring-boot-starter-web/src/main/java/com/citu/framework/apilog/core/interceptor/ApiAccessLogInterceptor.java

@@ -40,9 +40,9 @@ public class ApiAccessLogInterceptor implements HandlerInterceptor {
             Map<String, String> queryString = ServletUtils.getParamMap(request);
             String requestBody = ServletUtils.isJsonRequest(request) ? ServletUtils.getBody(request) : null;
             if (CollUtil.isEmpty(queryString) && StrUtil.isEmpty(requestBody)) {
-                log.info("[preHandle][开始请求 URL({}) 无参数]", request.getRequestURI());
+                log.info("[preHandle][开始请求 方式({}) URL({}) 无参数]",request.getMethod(),request.getRequestURI());
             } else {
-                log.info("[preHandle][开始请求 URL({}) 参数({})]", request.getRequestURI(),
+                log.info("[preHandle][开始请求 方式({})  URL({}) 参数({})]",request.getMethod(), request.getRequestURI(),
                         StrUtil.blankToDefault(requestBody, queryString.toString()));
             }
             // 计时
@@ -59,8 +59,8 @@ public class ApiAccessLogInterceptor implements HandlerInterceptor {
         if (!SpringUtils.isProd()) {
             StopWatch stopWatch = (StopWatch) request.getAttribute(ATTRIBUTE_STOP_WATCH);
             stopWatch.stop();
-            log.info("[afterCompletion][完成请求 URL({}) 耗时({} ms)]",
-                    request.getRequestURI(), stopWatch.getTotalTimeMillis());
+            log.info("[afterCompletion][完成请求 方式({}) URL({}) 耗时({} ms)]",
+                    request.getMethod(),request.getRequestURI(), stopWatch.getTotalTimeMillis());
         }
     }
 

+ 1 - 1
citu-gateway/src/main/resources/bootstrap.yaml

@@ -11,4 +11,4 @@ server:
 # 日志文件配置。注意,如果 logging.file.name 不放在 bootstrap.yaml 配置文件,而是放在 application.yaml 中,会导致出现 LOG_FILE_IS_UNDEFINED 文件
 logging:
   file:
-    name: ${user.home}/logs/${spring.application.name}.log # 日志文件名,全路径
+    name: ${user.home}/logs/${spring.application.name}/${spring.application.name}.log # 日志文件名,全路径

+ 1 - 1
citu-gateway/src/main/resources/logback-spring.xml

@@ -31,7 +31,7 @@
             <!-- 启动服务时,是否清理历史日志,一般不建议清理 -->
             <cleanHistoryOnStart>${LOGBACK_ROLLINGPOLICY_CLEAN_HISTORY_ON_START:-false}</cleanHistoryOnStart>
             <!-- 日志文件,到达多少容量,进行滚动 -->
-            <maxFileSize>${LOGBACK_ROLLINGPOLICY_MAX_FILE_SIZE:-10MB}</maxFileSize>
+            <maxFileSize>${LOGBACK_ROLLINGPOLICY_MAX_FILE_SIZE:-200MB}</maxFileSize>
             <!-- 日志文件的总大小,0 表示不限制 -->
             <totalSizeCap>${LOGBACK_ROLLINGPOLICY_TOTAL_SIZE_CAP:-0}</totalSizeCap>
             <!-- 日志文件的保留天数 -->

+ 1 - 1
citu-module-bpm/citu-module-bpm-biz/src/main/resources/bootstrap.yaml

@@ -11,4 +11,4 @@ server:
 # 日志文件配置。注意,如果 logging.file.name 不放在 bootstrap.yaml 配置文件,而是放在 application.yaml 中,会导致出现 LOG_FILE_IS_UNDEFINED 文件
 logging:
   file:
-    name: ${user.home}/logs/${spring.application.name}.log # 日志文件名,全路径
+    name: ${user.home}/logs/${spring.application.name}/${spring.application.name}.log # 日志文件名,全路径

+ 1 - 1
citu-module-bpm/citu-module-bpm-biz/src/main/resources/logback-spring.xml

@@ -31,7 +31,7 @@
             <!-- 启动服务时,是否清理历史日志,一般不建议清理 -->
             <cleanHistoryOnStart>${LOGBACK_ROLLINGPOLICY_CLEAN_HISTORY_ON_START:-false}</cleanHistoryOnStart>
             <!-- 日志文件,到达多少容量,进行滚动 -->
-            <maxFileSize>${LOGBACK_ROLLINGPOLICY_MAX_FILE_SIZE:-10MB}</maxFileSize>
+            <maxFileSize>${LOGBACK_ROLLINGPOLICY_MAX_FILE_SIZE:-200MB}</maxFileSize>
             <!-- 日志文件的总大小,0 表示不限制 -->
             <totalSizeCap>${LOGBACK_ROLLINGPOLICY_TOTAL_SIZE_CAP:-0}</totalSizeCap>
             <!-- 日志文件的保留天数 -->

+ 1 - 1
citu-module-crm/citu-module-crm-biz/src/main/resources/bootstrap.yaml

@@ -11,4 +11,4 @@ server:
 # 日志文件配置。注意,如果 logging.file.name 不放在 bootstrap.yaml 配置文件,而是放在 application.yaml 中,会导致出现 LOG_FILE_IS_UNDEFINED 文件
 logging:
   file:
-    name: ${user.home}/logs/${spring.application.name}.log # 日志文件名,全路径
+    name: ${user.home}/logs/${spring.application.name}/${spring.application.name}.log # 日志文件名,全路径

+ 1 - 1
citu-module-crm/citu-module-crm-biz/src/main/resources/logback-spring.xml

@@ -31,7 +31,7 @@
             <!-- 启动服务时,是否清理历史日志,一般不建议清理 -->
             <cleanHistoryOnStart>${LOGBACK_ROLLINGPOLICY_CLEAN_HISTORY_ON_START:-false}</cleanHistoryOnStart>
             <!-- 日志文件,到达多少容量,进行滚动 -->
-            <maxFileSize>${LOGBACK_ROLLINGPOLICY_MAX_FILE_SIZE:-10MB}</maxFileSize>
+            <maxFileSize>${LOGBACK_ROLLINGPOLICY_MAX_FILE_SIZE:-200MB}</maxFileSize>
             <!-- 日志文件的总大小,0 表示不限制 -->
             <totalSizeCap>${LOGBACK_ROLLINGPOLICY_TOTAL_SIZE_CAP:-0}</totalSizeCap>
             <!-- 日志文件的保留天数 -->

+ 1 - 1
citu-module-erp/citu-module-erp-biz/src/main/resources/bootstrap.yaml

@@ -11,4 +11,4 @@ server:
 # 日志文件配置。注意,如果 logging.file.name 不放在 bootstrap.yaml 配置文件,而是放在 application.yaml 中,会导致出现 LOG_FILE_IS_UNDEFINED 文件
 logging:
   file:
-    name: ${user.home}/logs/${spring.application.name}.log # 日志文件名,全路径
+    name: ${user.home}/logs/${spring.application.name}/${spring.application.name}.log # 日志文件名,全路径

+ 1 - 1
citu-module-erp/citu-module-erp-biz/src/main/resources/logback-spring.xml

@@ -31,7 +31,7 @@
             <!-- 启动服务时,是否清理历史日志,一般不建议清理 -->
             <cleanHistoryOnStart>${LOGBACK_ROLLINGPOLICY_CLEAN_HISTORY_ON_START:-false}</cleanHistoryOnStart>
             <!-- 日志文件,到达多少容量,进行滚动 -->
-            <maxFileSize>${LOGBACK_ROLLINGPOLICY_MAX_FILE_SIZE:-10MB}</maxFileSize>
+            <maxFileSize>${LOGBACK_ROLLINGPOLICY_MAX_FILE_SIZE:-200MB}</maxFileSize>
             <!-- 日志文件的总大小,0 表示不限制 -->
             <totalSizeCap>${LOGBACK_ROLLINGPOLICY_TOTAL_SIZE_CAP:-0}</totalSizeCap>
             <!-- 日志文件的保留天数 -->

+ 1 - 1
citu-module-infra/citu-module-infra-biz/src/main/resources/bootstrap.yaml

@@ -11,4 +11,4 @@ server:
 # 日志文件配置。注意,如果 logging.file.name 不放在 bootstrap.yaml 配置文件,而是放在 application.yaml 中,会导致出现 LOG_FILE_IS_UNDEFINED 文件
 logging:
   file:
-    name: ${user.home}/logs/${spring.application.name}.log # 日志文件名,全路径
+    name: ${user.home}/logs/${spring.application.name}/${spring.application.name}.log # 日志文件名,全路径

+ 1 - 1
citu-module-infra/citu-module-infra-biz/src/main/resources/logback-spring.xml

@@ -31,7 +31,7 @@
             <!-- 启动服务时,是否清理历史日志,一般不建议清理 -->
             <cleanHistoryOnStart>${LOGBACK_ROLLINGPOLICY_CLEAN_HISTORY_ON_START:-false}</cleanHistoryOnStart>
             <!-- 日志文件,到达多少容量,进行滚动 -->
-            <maxFileSize>${LOGBACK_ROLLINGPOLICY_MAX_FILE_SIZE:-10MB}</maxFileSize>
+            <maxFileSize>${LOGBACK_ROLLINGPOLICY_MAX_FILE_SIZE:-200MB}</maxFileSize>
             <!-- 日志文件的总大小,0 表示不限制 -->
             <totalSizeCap>${LOGBACK_ROLLINGPOLICY_TOTAL_SIZE_CAP:-0}</totalSizeCap>
             <!-- 日志文件的保留天数 -->

+ 1 - 1
citu-module-mall/citu-module-product-biz/src/main/resources/bootstrap.yaml

@@ -11,4 +11,4 @@ server:
 # 日志文件配置。注意,如果 logging.file.name 不放在 bootstrap.yaml 配置文件,而是放在 application.yaml 中,会导致出现 LOG_FILE_IS_UNDEFINED 文件
 logging:
   file:
-    name: ${user.home}/logs/${spring.application.name}.log # 日志文件名,全路径
+    name: ${user.home}/logs/${spring.application.name}/${spring.application.name}.log # 日志文件名,全路径

+ 1 - 1
citu-module-mall/citu-module-product-biz/src/main/resources/logback-spring.xml

@@ -31,7 +31,7 @@
             <!-- 启动服务时,是否清理历史日志,一般不建议清理 -->
             <cleanHistoryOnStart>${LOGBACK_ROLLINGPOLICY_CLEAN_HISTORY_ON_START:-false}</cleanHistoryOnStart>
             <!-- 日志文件,到达多少容量,进行滚动 -->
-            <maxFileSize>${LOGBACK_ROLLINGPOLICY_MAX_FILE_SIZE:-10MB}</maxFileSize>
+            <maxFileSize>${LOGBACK_ROLLINGPOLICY_MAX_FILE_SIZE:-200MB}</maxFileSize>
             <!-- 日志文件的总大小,0 表示不限制 -->
             <totalSizeCap>${LOGBACK_ROLLINGPOLICY_TOTAL_SIZE_CAP:-0}</totalSizeCap>
             <!-- 日志文件的保留天数 -->

+ 1 - 1
citu-module-mall/citu-module-promotion-biz/src/main/resources/bootstrap.yaml

@@ -11,4 +11,4 @@ server:
 # 日志文件配置。注意,如果 logging.file.name 不放在 bootstrap.yaml 配置文件,而是放在 application.yaml 中,会导致出现 LOG_FILE_IS_UNDEFINED 文件
 logging:
   file:
-    name: ${user.home}/logs/${spring.application.name}.log # 日志文件名,全路径
+    name: ${user.home}/logs/${spring.application.name}/${spring.application.name}.log # 日志文件名,全路径

+ 1 - 1
citu-module-mall/citu-module-promotion-biz/src/main/resources/logback-spring.xml

@@ -31,7 +31,7 @@
             <!-- 启动服务时,是否清理历史日志,一般不建议清理 -->
             <cleanHistoryOnStart>${LOGBACK_ROLLINGPOLICY_CLEAN_HISTORY_ON_START:-false}</cleanHistoryOnStart>
             <!-- 日志文件,到达多少容量,进行滚动 -->
-            <maxFileSize>${LOGBACK_ROLLINGPOLICY_MAX_FILE_SIZE:-10MB}</maxFileSize>
+            <maxFileSize>${LOGBACK_ROLLINGPOLICY_MAX_FILE_SIZE:-200MB}</maxFileSize>
             <!-- 日志文件的总大小,0 表示不限制 -->
             <totalSizeCap>${LOGBACK_ROLLINGPOLICY_TOTAL_SIZE_CAP:-0}</totalSizeCap>
             <!-- 日志文件的保留天数 -->

+ 1 - 1
citu-module-mall/citu-module-statistics-biz/src/main/resources/bootstrap.yaml

@@ -11,4 +11,4 @@ server:
 # 日志文件配置。注意,如果 logging.file.name 不放在 bootstrap.yaml 配置文件,而是放在 application.yaml 中,会导致出现 LOG_FILE_IS_UNDEFINED 文件
 logging:
   file:
-    name: ${user.home}/logs/${spring.application.name}.log # 日志文件名,全路径
+    name: ${user.home}/logs/${spring.application.name}/${spring.application.name}.log # 日志文件名,全路径

+ 1 - 1
citu-module-mall/citu-module-statistics-biz/src/main/resources/logback-spring.xml

@@ -31,7 +31,7 @@
             <!-- 启动服务时,是否清理历史日志,一般不建议清理 -->
             <cleanHistoryOnStart>${LOGBACK_ROLLINGPOLICY_CLEAN_HISTORY_ON_START:-false}</cleanHistoryOnStart>
             <!-- 日志文件,到达多少容量,进行滚动 -->
-            <maxFileSize>${LOGBACK_ROLLINGPOLICY_MAX_FILE_SIZE:-10MB}</maxFileSize>
+            <maxFileSize>${LOGBACK_ROLLINGPOLICY_MAX_FILE_SIZE:-200MB}</maxFileSize>
             <!-- 日志文件的总大小,0 表示不限制 -->
             <totalSizeCap>${LOGBACK_ROLLINGPOLICY_TOTAL_SIZE_CAP:-0}</totalSizeCap>
             <!-- 日志文件的保留天数 -->

+ 1 - 1
citu-module-mall/citu-module-trade-biz/src/main/resources/bootstrap.yaml

@@ -11,4 +11,4 @@ server:
 # 日志文件配置。注意,如果 logging.file.name 不放在 bootstrap.yaml 配置文件,而是放在 application.yaml 中,会导致出现 LOG_FILE_IS_UNDEFINED 文件
 logging:
   file:
-    name: ${user.home}/logs/${spring.application.name}.log # 日志文件名,全路径
+    name: ${user.home}/logs/${spring.application.name}/${spring.application.name}.log # 日志文件名,全路径

+ 1 - 1
citu-module-mall/citu-module-trade-biz/src/main/resources/logback-spring.xml

@@ -31,7 +31,7 @@
             <!-- 启动服务时,是否清理历史日志,一般不建议清理 -->
             <cleanHistoryOnStart>${LOGBACK_ROLLINGPOLICY_CLEAN_HISTORY_ON_START:-false}</cleanHistoryOnStart>
             <!-- 日志文件,到达多少容量,进行滚动 -->
-            <maxFileSize>${LOGBACK_ROLLINGPOLICY_MAX_FILE_SIZE:-10MB}</maxFileSize>
+            <maxFileSize>${LOGBACK_ROLLINGPOLICY_MAX_FILE_SIZE:-200MB}</maxFileSize>
             <!-- 日志文件的总大小,0 表示不限制 -->
             <totalSizeCap>${LOGBACK_ROLLINGPOLICY_TOTAL_SIZE_CAP:-0}</totalSizeCap>
             <!-- 日志文件的保留天数 -->

+ 9 - 8
citu-module-member/citu-module-member-biz/src/main/java/com/citu/module/member/dal/dataobject/invoice/InvoiceListDO.java

@@ -1,9 +1,11 @@
 package com.citu.module.member.dal.dataobject.invoice;
 
-import lombok.*;
-import java.util.*;
-import com.baomidou.mybatisplus.annotation.*;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.KeySequence;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
 import com.citu.framework.mybatis.core.dataobject.BaseDO;
+import lombok.*;
 
 /**
  * 发票清单 DO
@@ -63,7 +65,6 @@ public class InvoiceListDO extends BaseDO {
     private Long price;
 
 
-
     /**
      * 单位地址
      */
@@ -72,17 +73,17 @@ public class InvoiceListDO extends BaseDO {
     /**
      * 单位电话
      */
-    private String        enterprisePhone;
+    private String enterprisePhone;
 
     /**
-     *企业开户行名称
+     * 企业开户行名称
      */
     private String enterpriseBankTitle;
 
     /**
-     *银行基本户账号
+     * 银行基本户账号
      */
-    private String        enterpriseBankNo;
+    private String enterpriseBankNo;
 
     /**
      * 0.增值 1.普票

+ 9 - 9
citu-module-member/citu-module-member-biz/src/main/java/com/citu/module/member/dal/dataobject/invoice/InvoiceTitleDO.java

@@ -1,11 +1,11 @@
 package com.citu.module.member.dal.dataobject.invoice;
 
-import lombok.*;
-import java.util.*;
-import java.time.LocalDateTime;
-import java.time.LocalDateTime;
-import com.baomidou.mybatisplus.annotation.*;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.KeySequence;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
 import com.citu.framework.mybatis.core.dataobject.BaseDO;
+import lombok.*;
 
 /**
  * 发票抬头 DO
@@ -60,17 +60,17 @@ public class InvoiceTitleDO extends BaseDO {
     /**
      * 单位电话
      */
-    private String        enterprisePhone;
+    private String enterprisePhone;
 
     /**
-     *企业开户行名称
+     * 企业开户行名称
      */
     private String enterpriseBankTitle;
 
     /**
-     *银行基本户账号
+     * 银行基本户账号
      */
-    private String        enterpriseBankNo;
+    private String enterpriseBankNo;
 
     /**
      * 0.增值 1.普票

+ 4 - 3
citu-module-member/citu-module-member-biz/src/main/java/com/citu/module/member/service/signin/MemberSignInRecordServiceImpl.java

@@ -75,11 +75,12 @@ public class MemberSignInRecordServiceImpl implements MemberSignInRecordService
         }
         summary.setTodaySignIn(DateUtils.isToday(lastRecord.getCreateTime()));
 
-        // 4.1 校验今天是否签到,没有签到则直接返回
-        if (!summary.getTodaySignIn()) {
+        // 4.1 检查今天是否未签到且记录不是昨天创建的,如果是则直接返回
+        if (!summary.getTodaySignIn() && !DateUtils.isYesterday(lastRecord.getCreateTime())) {
             return summary;
         }
-        // 4.2 连续签到天数
+
+        // 4.2 要么是今天签到了,要么是昨天的记录,设置连续签到天数
         summary.setContinuousDay(lastRecord.getDay());
         return summary;
     }

+ 1 - 1
citu-module-member/citu-module-member-biz/src/main/resources/bootstrap.yaml

@@ -11,4 +11,4 @@ server:
 # 日志文件配置。注意,如果 logging.file.name 不放在 bootstrap.yaml 配置文件,而是放在 application.yaml 中,会导致出现 LOG_FILE_IS_UNDEFINED 文件
 logging:
   file:
-    name: ${user.home}/logs/${spring.application.name}.log # 日志文件名,全路径
+    name: ${user.home}/logs/${spring.application.name}/${spring.application.name}.log # 日志文件名,全路径

+ 1 - 1
citu-module-member/citu-module-member-biz/src/main/resources/logback-spring.xml

@@ -31,7 +31,7 @@
             <!-- 启动服务时,是否清理历史日志,一般不建议清理 -->
             <cleanHistoryOnStart>${LOGBACK_ROLLINGPOLICY_CLEAN_HISTORY_ON_START:-false}</cleanHistoryOnStart>
             <!-- 日志文件,到达多少容量,进行滚动 -->
-            <maxFileSize>${LOGBACK_ROLLINGPOLICY_MAX_FILE_SIZE:-10MB}</maxFileSize>
+            <maxFileSize>${LOGBACK_ROLLINGPOLICY_MAX_FILE_SIZE:-200MB}</maxFileSize>
             <!-- 日志文件的总大小,0 表示不限制 -->
             <totalSizeCap>${LOGBACK_ROLLINGPOLICY_TOTAL_SIZE_CAP:-0}</totalSizeCap>
             <!-- 日志文件的保留天数 -->

+ 1 - 1
citu-module-mp/citu-module-mp-biz/src/main/resources/bootstrap.yaml

@@ -11,4 +11,4 @@ server:
 # 日志文件配置。注意,如果 logging.file.name 不放在 bootstrap.yaml 配置文件,而是放在 application.yaml 中,会导致出现 LOG_FILE_IS_UNDEFINED 文件
 logging:
   file:
-    name: ${user.home}/logs/${spring.application.name}.log # 日志文件名,全路径
+    name: ${user.home}/logs/${spring.application.name}/${spring.application.name}.log # 日志文件名,全路径

+ 1 - 1
citu-module-mp/citu-module-mp-biz/src/main/resources/logback-spring.xml

@@ -31,7 +31,7 @@
             <!-- 启动服务时,是否清理历史日志,一般不建议清理 -->
             <cleanHistoryOnStart>${LOGBACK_ROLLINGPOLICY_CLEAN_HISTORY_ON_START:-false}</cleanHistoryOnStart>
             <!-- 日志文件,到达多少容量,进行滚动 -->
-            <maxFileSize>${LOGBACK_ROLLINGPOLICY_MAX_FILE_SIZE:-10MB}</maxFileSize>
+            <maxFileSize>${LOGBACK_ROLLINGPOLICY_MAX_FILE_SIZE:-200MB}</maxFileSize>
             <!-- 日志文件的总大小,0 表示不限制 -->
             <totalSizeCap>${LOGBACK_ROLLINGPOLICY_TOTAL_SIZE_CAP:-0}</totalSizeCap>
             <!-- 日志文件的保留天数 -->

+ 1 - 1
citu-module-pay/citu-module-pay-biz/src/main/resources/bootstrap.yaml

@@ -11,4 +11,4 @@ server:
 # 日志文件配置。注意,如果 logging.file.name 不放在 bootstrap.yaml 配置文件,而是放在 application.yaml 中,会导致出现 LOG_FILE_IS_UNDEFINED 文件
 logging:
   file:
-    name: ${user.home}/logs/${spring.application.name}.log # 日志文件名,全路径
+    name: ${user.home}/logs/${spring.application.name}/${spring.application.name}.log # 日志文件名,全路径

+ 1 - 1
citu-module-pay/citu-module-pay-biz/src/main/resources/logback-spring.xml

@@ -31,7 +31,7 @@
             <!-- 启动服务时,是否清理历史日志,一般不建议清理 -->
             <cleanHistoryOnStart>${LOGBACK_ROLLINGPOLICY_CLEAN_HISTORY_ON_START:-false}</cleanHistoryOnStart>
             <!-- 日志文件,到达多少容量,进行滚动 -->
-            <maxFileSize>${LOGBACK_ROLLINGPOLICY_MAX_FILE_SIZE:-10MB}</maxFileSize>
+            <maxFileSize>${LOGBACK_ROLLINGPOLICY_MAX_FILE_SIZE:-200MB}</maxFileSize>
             <!-- 日志文件的总大小,0 表示不限制 -->
             <totalSizeCap>${LOGBACK_ROLLINGPOLICY_TOTAL_SIZE_CAP:-0}</totalSizeCap>
             <!-- 日志文件的保留天数 -->

+ 1 - 1
citu-module-report/citu-module-report-biz/src/main/resources/bootstrap.yaml

@@ -11,4 +11,4 @@ server:
 # 日志文件配置。注意,如果 logging.file.name 不放在 bootstrap.yaml 配置文件,而是放在 application.yaml 中,会导致出现 LOG_FILE_IS_UNDEFINED 文件
 logging:
   file:
-    name: ${user.home}/logs/${spring.application.name}.log # 日志文件名,全路径
+    name: ${user.home}/logs/${spring.application.name}/${spring.application.name}.log # 日志文件名,全路径

+ 1 - 1
citu-module-report/citu-module-report-biz/src/main/resources/logback-spring.xml

@@ -31,7 +31,7 @@
             <!-- 启动服务时,是否清理历史日志,一般不建议清理 -->
             <cleanHistoryOnStart>${LOGBACK_ROLLINGPOLICY_CLEAN_HISTORY_ON_START:-false}</cleanHistoryOnStart>
             <!-- 日志文件,到达多少容量,进行滚动 -->
-            <maxFileSize>${LOGBACK_ROLLINGPOLICY_MAX_FILE_SIZE:-10MB}</maxFileSize>
+            <maxFileSize>${LOGBACK_ROLLINGPOLICY_MAX_FILE_SIZE:-200MB}</maxFileSize>
             <!-- 日志文件的总大小,0 表示不限制 -->
             <totalSizeCap>${LOGBACK_ROLLINGPOLICY_TOTAL_SIZE_CAP:-0}</totalSizeCap>
             <!-- 日志文件的保留天数 -->

+ 3 - 3
citu-module-system/citu-module-system-api/src/main/java/com/citu/module/system/enums/sms/SmsSceneEnum.java

@@ -23,10 +23,10 @@ public enum SmsSceneEnum implements IntArrayValuable {
 
     ADMIN_MEMBER_LOGIN(21, "admin-sms-login", "后台用户 - 手机号登录"),
 
-    MENDUNER_LOGIN(30, "menduner-user-sms-login", "menduner - 手机号登陆"),
+    MENDUNER_LOGIN(30, "menduner-user-sms-login", "手机号登陆"),
     MENDUNER_UPDATE_MOBILE(31, "menduner-user-update-mobile", "修改手机"),
-    MENDUNER_UPDATE_PASSWORD(32, "menduner-user-update-password", "menduner - 修改密码"),
-    MENDUNER_RESET_PASSWORD(33, "menduner-user-reset-password", "menduner - 忘记密码");
+    MENDUNER_UPDATE_PASSWORD(32, "menduner-user-update-password", "修改密码"),
+    MENDUNER_RESET_PASSWORD(33, "menduner-user-reset-password", "忘记密码");
 
     public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(SmsSceneEnum::getScene).toArray();
 

+ 53 - 0
citu-module-system/citu-module-system-biz/src/main/java/com/citu/module/system/controller/app/captcha/AppCaptchaController.java

@@ -0,0 +1,53 @@
+package com.citu.module.system.controller.app.captcha;
+
+import cn.hutool.core.util.StrUtil;
+import com.citu.framework.common.util.servlet.ServletUtils;
+import com.xingyuv.captcha.model.common.ResponseModel;
+import com.xingyuv.captcha.model.vo.CaptchaVO;
+import com.xingyuv.captcha.service.CaptchaService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+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 javax.annotation.Resource;
+import javax.annotation.security.PermitAll;
+import javax.servlet.http.HttpServletRequest;
+
+@Tag(name = "用户端 - 验证码")
+@RestController("appCaptchaController")
+@RequestMapping("/system/captcha")
+public class AppCaptchaController {
+
+    @Resource
+    private CaptchaService captchaService;
+
+    @PostMapping({"/get"})
+    @Operation(summary = "获得验证码")
+    @PermitAll
+    public ResponseModel get(@RequestBody CaptchaVO data, HttpServletRequest request) {
+        assert request.getRemoteHost() != null;
+        data.setBrowserInfo(getRemoteId(request));
+        return captchaService.get(data);
+    }
+
+    @PostMapping("/check")
+    @Operation(summary = "校验验证码")
+    @PermitAll
+    public ResponseModel check(@RequestBody CaptchaVO data, HttpServletRequest request) {
+        data.setBrowserInfo(getRemoteId(request));
+        return captchaService.check(data);
+    }
+
+    public static String getRemoteId(HttpServletRequest request) {
+        String ip = ServletUtils.getClientIP(request);
+        String ua = request.getHeader("user-agent");
+        if (StrUtil.isNotBlank(ip)) {
+            return ip + ua;
+        }
+        return request.getRemoteAddr() + ua;
+    }
+
+}

+ 1 - 1
citu-module-system/citu-module-system-biz/src/main/java/com/citu/module/system/service/social/SocialClientServiceImpl.java

@@ -78,7 +78,7 @@ public class SocialClientServiceImpl implements SocialClientService {
      *
      * 1. release:正式版
      * 2. trial:体验版
-     * 3. developer:开发版
+     * 3. develop:开发版
      */
     @Value("${citu.wxa-code.env-version:release}")
     public String envVersion;

+ 7 - 1
citu-module-system/citu-module-system-biz/src/main/resources/application.yaml

@@ -189,8 +189,14 @@ citu:
   sms-code: # 短信验证码相关的配置项
     expire-times: 10m
     send-frequency: 1m
-    send-maximum-quantity-per-day: 10
+    send-maximum-quantity-per-day: 2000
     begin-code: 123680 # 这里配置 9999 的原因是,测试方便。
     end-code: 999999 # 这里配置 9999 的原因是,测试方便。
+  # 小程序码要打开的小程序版本
+  wxa-code:
+    env-version: develop
+  # 订阅消息跳转小程序类型
+  wxa-subscribe-message:
+    miniprogram-state: formal
 
 debug: false

+ 1 - 1
citu-module-system/citu-module-system-biz/src/main/resources/bootstrap.yaml

@@ -11,4 +11,4 @@ server:
 # 日志文件配置。注意,如果 logging.file.name 不放在 bootstrap.yaml 配置文件,而是放在 application.yaml 中,会导致出现 LOG_FILE_IS_UNDEFINED 文件
 logging:
   file:
-    name: ${user.home}/logs/${spring.application.name}.log # 日志文件名,全路径
+    name: ${user.home}/logs/${spring.application.name}/${spring.application.name}.log # 日志文件名,全路径

+ 1 - 1
citu-module-system/citu-module-system-biz/src/main/resources/logback-spring.xml

@@ -31,7 +31,7 @@
             <!-- 启动服务时,是否清理历史日志,一般不建议清理 -->
             <cleanHistoryOnStart>${LOGBACK_ROLLINGPOLICY_CLEAN_HISTORY_ON_START:-false}</cleanHistoryOnStart>
             <!-- 日志文件,到达多少容量,进行滚动 -->
-            <maxFileSize>${LOGBACK_ROLLINGPOLICY_MAX_FILE_SIZE:-10MB}</maxFileSize>
+            <maxFileSize>${LOGBACK_ROLLINGPOLICY_MAX_FILE_SIZE:-200MB}</maxFileSize>
             <!-- 日志文件的总大小,0 表示不限制 -->
             <totalSizeCap>${LOGBACK_ROLLINGPOLICY_TOTAL_SIZE_CAP:-0}</totalSizeCap>
             <!-- 日志文件的保留天数 -->

+ 46 - 0
menduner/menduner-common/src/main/java/com/citu/module/menduner/common/enums/EventAsyncUrlEnum.java

@@ -0,0 +1,46 @@
+package com.citu.module.menduner.common.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * 异步事件地址枚举
+ *
+ * @author Rayson
+ */
+@AllArgsConstructor
+@Getter
+public enum EventAsyncUrlEnum {
+
+    INVITE_USER("/event/async/invite/user", "邀请用户注册", true,"?userId="),
+    REGISTER_ENTERPRISE("/event/async/enterprise/register", "企业注册申请操作人帮忙注册个人用户", true,"?userId="),
+    // 购买14天用户会员
+    USER_MEMBER_BUY_14_DAYS("/event/async/user/member/buy/14/day", "购买14天用户会员", false,null),
+    // 购买30天用户会员
+    USER_MEMBER_BUY_30_DAYS("/event/async/user/member/buy/30/day", "购买30天用户会员", false,null),
+    // 购买60天用户会员
+    USER_MEMBER_BUY_60_DAYS("/event/async/user/member/buy/60/day", "购买60天用户会员", false,null),
+    // 购买90天用户会员
+    USER_MEMBER_BUY_90_DAYS("/event/async/user/member/buy/90/day", "购买90天用户会员", false,null),
+    // 购买180天用户会员
+    USER_MEMBER_BUY_180_DAYS("/event/async/user/member/buy/180/day", "购买180天用户会员", false,null),
+    // 购买365天用户会员
+    USER_MEMBER_BUY_365_DAYS("/event/async/user/member/buy/365/day", "购买365天用户会员", false,null),
+
+    ;
+
+    private final String url;
+    private final String name;
+    private final boolean scene;
+    private final String sceneStr;
+
+    public static EventAsyncUrlEnum from(String url) {
+        for (EventAsyncUrlEnum eventAsyncUrlEnum : EventAsyncUrlEnum.values()) {
+            if (eventAsyncUrlEnum.getUrl().equals(url)) {
+                return eventAsyncUrlEnum;
+            }
+        }
+        return null;
+    }
+
+}

+ 1 - 1
menduner/menduner-system-api/src/main/java/com/citu/module/menduner/system/enums/MathOperationEnum.java → menduner/menduner-common/src/main/java/com/citu/module/menduner/common/enums/MathOperationEnum.java

@@ -1,4 +1,4 @@
-package com.citu.module.menduner.system.enums;
+package com.citu.module.menduner.common.enums;
 
 import cn.hutool.core.util.EnumUtil;
 import lombok.AllArgsConstructor;

+ 6 - 4
menduner/menduner-system-api/src/main/java/com/citu/module/menduner/system/enums/account/PointBizTypeEnum.java → menduner/menduner-common/src/main/java/com/citu/module/menduner/common/enums/PointBizTypeEnum.java

@@ -1,7 +1,6 @@
-package com.citu.module.menduner.system.enums.account;
+package com.citu.module.menduner.common.enums;
 
 import cn.hutool.core.util.EnumUtil;
-import com.citu.module.menduner.system.enums.MathOperationEnum;
 import lombok.AllArgsConstructor;
 import lombok.Getter;
 
@@ -23,9 +22,12 @@ public enum PointBizTypeEnum {
     RECOMMENDED_POSITIONS(5, "推荐职位", "推荐职位,获得 {}", true),
     DELIVERY_PERSON(6, "投递人", "投递人,获得 {}", true),
     GIFT(7, "赠与", "赠与,获得 {}", true),
-    NOT_RECOMMENDED(8,"无推荐人,推荐人佣金给到平台","推荐职位,获得 {}",true),
+    NOT_RECOMMENDED(8, "无推荐人,推荐人佣金给到平台", "推荐职位,获得 {}", true),
+    REDEEM(9, "积分兑换", "兑换,扣除 {} 积分", false),
+    INVITE(10, "邀请注册", "邀请注册,获得 {} 积分", true),
+    MEMBERSHIP(11, "购买会员套餐", "购买会员套餐,获取 {} 积分", true),
     SIGN(98, "签到", "签到获得 {} 积分", true),
-    EVENT(99, "事件跟踪", "访问[{}],{}{} 积分", true),
+    EVENT(99, "事件跟踪", "[{}],{}{} 积分", true),
     RECOMMEND_TASK(100, "完成任务", "[{}],{}{} 积分", true),
     ;
 

+ 32 - 0
menduner/menduner-common/src/main/java/com/citu/module/menduner/common/message/EventAsyncConfirmMessage.java

@@ -0,0 +1,32 @@
+package com.citu.module.menduner.common.message;
+
+import com.citu.module.menduner.common.enums.PointBizTypeEnum;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+@Schema(description = "事件异步确认")
+public class EventAsyncConfirmMessage {
+
+    public static final String TOPIC = "EVENT_ASYNC_CONFIRM_TOPIC";
+
+
+    @Schema(description = "用户id", example = "2")
+    private Long userId;
+
+    @Schema(description = "事件地址")
+    private String url;
+
+    @Schema(description = "场景")
+    private String scene;
+
+    @Schema(description = "事件类型")
+    private PointBizTypeEnum bizType;
+
+}

+ 4 - 3
menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/mq/message/UserPointSendMessage.java → menduner/menduner-common/src/main/java/com/citu/module/menduner/common/message/UserPointSendMessage.java

@@ -1,7 +1,8 @@
-package com.citu.module.menduner.reward.mq.message;
+package com.citu.module.menduner.common.message;
 
-import com.citu.module.menduner.system.enums.MathOperationEnum;
-import com.citu.module.menduner.system.enums.account.PointBizTypeEnum;
+
+import com.citu.module.menduner.common.enums.MathOperationEnum;
+import com.citu.module.menduner.common.enums.PointBizTypeEnum;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.AllArgsConstructor;
 import lombok.Builder;

+ 23 - 0
menduner/menduner-common/src/main/java/com/citu/module/menduner/common/util/LoginUserContext.java

@@ -1,6 +1,8 @@
 package com.citu.module.menduner.common.util;
 
 import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.ObjectUtil;
+import com.citu.framework.common.enums.UserTypeEnum;
 import com.citu.framework.security.core.LoginUser;
 import com.citu.framework.security.core.util.SecurityFrameworkUtils;
 
@@ -89,6 +91,17 @@ public class LoginUserContext {
         return Long.valueOf(loginUser.getInfo().get(LoginUser.INFO_KEY_DATA_ID));
     }
 
+    /**
+     * 获取当前登录的用户的企业id
+     **/
+    public static Long getEnterpriseId3() {
+        LoginUser loginUser = get();
+        if (!checkEnterprise(loginUser)) {
+            return null;
+        }
+        return Long.valueOf(loginUser.getInfo().get(LoginUser.INFO_KEY_DATA_ID));
+    }
+
     /**
      * 效验当前用户企业信息是否存在
      **/
@@ -130,4 +143,14 @@ public class LoginUserContext {
         return true;
     }
 
+
+    /** 验证是否是系统后台管理员 **/
+    public static boolean checkIsSystemUser() {
+        LoginUser loginUser = LoginUserContext.get();
+        if (ObjectUtil.equal(loginUser.getUserType(), UserTypeEnum.ADMIN.getValue())) {
+            return true;
+        }
+        return false;
+    }
+
 }

+ 6 - 6
menduner/menduner-flames-biz/src/main/java/com/citupro/module/menduner/flames/controller/app/AdvertisementMessageController.java

@@ -1,15 +1,15 @@
 package com.citupro.module.menduner.flames.controller.app;
 
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-
 import com.citu.framework.common.pojo.CommonResult;
 import com.citupro.module.menduner.flames.controller.base.reqvo.AdvertisementMessageIdReqVo;
 import com.citupro.module.menduner.flames.controller.base.reqvo.AdvertisementMessageListReqVo;
-import com.citupro.module.menduner.flames.controller.base.vo.AdvertisementMessageInfoVo;
 import com.citupro.module.menduner.flames.dal.mysql.AdvertisementMessage;
 import com.citupro.module.menduner.flames.service.AdvertisementMessageService;
-import org.springframework.web.bind.annotation.*;
 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;
 
 /**
  * @author auto
@@ -20,7 +20,7 @@ import org.springframework.beans.factory.annotation.Autowired;
  */
 @RequestMapping("/flames")
 @RestController
-public class AdvertisementMessageController  {
+public class AdvertisementMessageController {
     @SuppressWarnings("all")
     private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(AdvertisementMessageController.class);
     @Autowired
@@ -68,7 +68,7 @@ public class AdvertisementMessageController  {
     /**
      * @param idReqVo
      * @return R
-     * @eo.name  通过id删除广告
+     * @eo.name 通过id删除广告
      * @eo.url /advertisement/message/del
      * @eo.method post
      * @eo.request-type json

+ 1 - 3
menduner/menduner-im-biz/src/main/java/com/citu/module/menduner/im/service/UserServiceImpl.java

@@ -1,11 +1,9 @@
 package com.citu.module.menduner.im.service;
 
 import cn.hutool.core.util.IdUtil;
-import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.citu.framework.common.exception.enums.GlobalErrorCodeConstants;
 import com.citu.framework.common.pojo.CommonResult;
-import com.citu.framework.security.core.util.SecurityFrameworkUtils;
 import com.citu.module.menduner.common.util.LoginUserContext;
 import com.citu.module.menduner.im.controller.app.base.user.ImUserInfoVo;
 import com.citu.module.menduner.im.controller.app.base.user.ImUserReqVo;
@@ -17,7 +15,7 @@ import com.citu.module.menduner.im.service.wukong.WuKongUserService;
 import com.citu.module.menduner.system.api.user.UserApi;
 import com.citu.module.menduner.system.api.user.UserInfoReqDTO;
 import com.citu.module.menduner.system.api.user.UserInfoRespDTO;
-import com.citu.module.menduner.system.enums.MdeUserTypeEnum;
+import com.citu.module.menduner.system.enums.user.MdeUserTypeEnum;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;

+ 1 - 1
menduner/menduner-im-biz/src/main/resources/bootstrap.yaml

@@ -30,7 +30,7 @@ server:
 # 日志文件配置。注意,如果 logging.file.name 不放在 bootstrap.yaml 配置文件,而是放在 application.yaml 中,会导致出现 LOG_FILE_IS_UNDEFINED 文件
 logging:
   file:
-    name: ${user.home}/logs/${spring.application.name}.log # 日志文件名,全路径
+    name: ${user.home}/logs/${spring.application.name}/${spring.application.name}.log # 日志文件名,全路径
 citu:
   info:
     version: 1.0.0

+ 1 - 1
menduner/menduner-im-biz/src/main/resources/logback-spring.xml

@@ -31,7 +31,7 @@
             <!-- 启动服务时,是否清理历史日志,一般不建议清理 -->
             <cleanHistoryOnStart>${LOGBACK_ROLLINGPOLICY_CLEAN_HISTORY_ON_START:-false}</cleanHistoryOnStart>
             <!-- 日志文件,到达多少容量,进行滚动 -->
-            <maxFileSize>${LOGBACK_ROLLINGPOLICY_MAX_FILE_SIZE:-10MB}</maxFileSize>
+            <maxFileSize>${LOGBACK_ROLLINGPOLICY_MAX_FILE_SIZE:-200MB}</maxFileSize>
             <!-- 日志文件的总大小,0 表示不限制 -->
             <totalSizeCap>${LOGBACK_ROLLINGPOLICY_TOTAL_SIZE_CAP:-0}</totalSizeCap>
             <!-- 日志文件的保留天数 -->

+ 1 - 1
menduner/menduner-mall-biz/src/main/resources/bootstrap.yaml

@@ -30,7 +30,7 @@ server:
 # 日志文件配置。注意,如果 logging.file.name 不放在 bootstrap.yaml 配置文件,而是放在 application.yaml 中,会导致出现 LOG_FILE_IS_UNDEFINED 文件
 logging:
   file:
-    name: ${user.home}/logs/${spring.application.name}.log # 日志文件名,全路径
+    name: ${user.home}/logs/${spring.application.name}/${spring.application.name}.log # 日志文件名,全路径
 citu:
   info:
     version: 1.0.0

+ 1 - 1
menduner/menduner-mall-biz/src/main/resources/logback-spring.xml

@@ -31,7 +31,7 @@
             <!-- 启动服务时,是否清理历史日志,一般不建议清理 -->
             <cleanHistoryOnStart>${LOGBACK_ROLLINGPOLICY_CLEAN_HISTORY_ON_START:-false}</cleanHistoryOnStart>
             <!-- 日志文件,到达多少容量,进行滚动 -->
-            <maxFileSize>${LOGBACK_ROLLINGPOLICY_MAX_FILE_SIZE:-10MB}</maxFileSize>
+            <maxFileSize>${LOGBACK_ROLLINGPOLICY_MAX_FILE_SIZE:-200MB}</maxFileSize>
             <!-- 日志文件的总大小,0 表示不限制 -->
             <totalSizeCap>${LOGBACK_ROLLINGPOLICY_TOTAL_SIZE_CAP:-0}</totalSizeCap>
             <!-- 日志文件的保留天数 -->

+ 1 - 1
menduner/menduner-reward-biz/Dockerfile

@@ -10,7 +10,7 @@ ADD target/menduner-reward-biz.jar app.jar
 ENV TZ=Asia/Shanghai JAVA_OPTS="-Xms512m -Xmx512m"
 
 ## 暴露后端项目的 48080 端口
-EXPOSE 48200
+EXPOSE 48300
 
 ## 启动后端项目
 CMD java ${JAVA_OPTS} -Djava.security.egd=file:/dev/./urandom -jar app.jar

+ 0 - 4
menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/controller/admin/event/EventTrackController.java

@@ -32,7 +32,6 @@ public class EventTrackController {
 
 
     @PermitAll
-    @PreAuthenticated
     @GetMapping("/list")
     @Operation(summary = "获取规则配置跟踪列表")
     public CommonResult<List<EventTrackUrlRespVO>> list() {
@@ -40,14 +39,12 @@ public class EventTrackController {
     }
 
     @PermitAll
-    @PreAuthenticated
     @PostMapping("/click")
     @Operation(summary = "点击")
     public CommonResult<List<EventTrackPointRespVO>> click(@RequestParam("url") String url) throws Exception {
         return success(service.click(url));
     }
 
-    @PermitAll
     @PreAuthenticated
     @GetMapping("/get/mark/task")
     @Operation(summary = "获取标记事件任务")
@@ -56,7 +53,6 @@ public class EventTrackController {
     }
 
 
-    @PermitAll
     @PreAuthenticated
     @GetMapping("/get/url/list")
     @Operation(summary = "获取事件地址列表")

+ 3 - 0
menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/controller/base/event/EventRecordPageReqVO.java

@@ -23,6 +23,9 @@ public class EventRecordPageReqVO extends PageParam {
     @Schema(description = "事件地址", example = "https://www.iocoder.cn")
     private String url;
 
+    @Schema(description = "场景")
+    private String scene;
+
     @Schema(description = "日期")
     @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
     private LocalDateTime[] date;

+ 4 - 0
menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/controller/base/event/EventRecordRespVO.java

@@ -25,6 +25,10 @@ public class EventRecordRespVO {
     @ExcelProperty("事件地址")
     private String url;
 
+    @Schema(description = "场景")
+    @ExcelProperty("场景")
+    private String scene;
+
     @Schema(description = "日期", requiredMode = Schema.RequiredMode.REQUIRED)
     @ExcelProperty("日期")
     private LocalDateTime date;

+ 4 - 0
menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/dal/dataobject/event/EventRecordDO.java

@@ -36,6 +36,10 @@ public class EventRecordDO extends BaseDO {
      * 事件地址
      */
     private String url;
+    /**
+     * 场景
+     */
+    private String scene;
     /**
      * 日期
      */

+ 1 - 3
menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/dal/mysql/config/PointRuleConfigMapper.java

@@ -68,10 +68,9 @@ public interface PointRuleConfigMapper extends BaseMapperX<PointRuleConfigDO> {
      * 查询任务
      *
      * @param userId 用户id
-     * @param type   事件类型
      * @param mark   标记
      */
-    default List<TaskRespVO> selectTask(Long userId, String type, String mark, LocalDateTime startTime, LocalDateTime endTime) {
+    default List<TaskRespVO> selectTask(Long userId,  String mark, LocalDateTime startTime, LocalDateTime endTime) {
         MPJLambdaWrapperX<PointRuleConfigDO> query = new MPJLambdaWrapperX<>();
         query.selectAs(PointRuleConfigDO::getTitle, TaskRespVO::getTitle);
         query.selectAs(PointRuleConfigDO::getUrl, TaskRespVO::getUrl);
@@ -91,7 +90,6 @@ public interface PointRuleConfigMapper extends BaseMapperX<PointRuleConfigDO> {
 
         // 增加条件
         query.eq(PointRuleConfigDO::getStatus, PointRuleConfigStatusEnum.ENABLE.getStatus());
-        query.eq(PointRuleConfigDO::getType, type);
         query.eqIfPresent(PointRuleConfigDO::getMark, mark);
 
         query.orderByAsc(PointRuleConfigDO::getSort);

+ 6 - 4
menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/dal/mysql/event/EventRecordMapper.java

@@ -30,11 +30,12 @@ public interface EventRecordMapper extends BaseMapperX<EventRecordDO> {
                 .orderByDesc(EventRecordDO::getId));
     }
 
-    default List<EventRecordDO> getList(Long userId, String url,  LocalDateTime startDate, LocalDateTime endDate) {
+    default List<EventRecordDO> getList(Long userId, String url, String scene,
+                                        LocalDateTime startDate, LocalDateTime endDate) {
         LambdaQueryWrapperX<EventRecordDO> wrapperX = new LambdaQueryWrapperX<EventRecordDO>();
         wrapperX.eq(EventRecordDO::getUserId, userId)
-                .eq(EventRecordDO::getUrl, url);
-
+                .eq(EventRecordDO::getUrl, url)
+                .eqIfPresent(EventRecordDO::getScene, scene);
         if (null != startDate) {
             wrapperX.ge(EventRecordDO::getDate, startDate);
         }
@@ -70,10 +71,11 @@ public interface EventRecordMapper extends BaseMapperX<EventRecordDO> {
     }
 
     // 根据用户ID、地址、指标ID、当天时间查询事件记录
-    default EventRecordDO get(Long userId, String url, LocalDateTime date) {
+    default EventRecordDO get(Long userId, String url, String scene, LocalDateTime date) {
         LambdaQueryWrapperX<EventRecordDO> wrapperX = new LambdaQueryWrapperX<EventRecordDO>();
         wrapperX.eq(EventRecordDO::getUserId, userId)
                 .eq(EventRecordDO::getUrl, url)
+                .eqIfPresent(EventRecordDO::getScene, scene)
                 .eq(EventRecordDO::getDate, date);
         return selectOne(wrapperX);
     }

+ 2 - 2
menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/dal/redis/RedisKeyConstants.java

@@ -35,9 +35,9 @@ public interface RedisKeyConstants {
     /**
      * 事件记录锁
      * <p>
-     * KEY 格式:event_record_lock:  userId : url  : time
+     * KEY 格式:event_record_lock:  userId : url : scene  : time
      */
-    String EVENT_RECORD_LOCK = "event_record_lock:{}:{}:{}";
+    String EVENT_RECORD_LOCK = "event_record_lock:{}:{}:{}:{}";
 
 
 }

+ 43 - 0
menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/mq/consumer/EventAsyncConfirmConsumer.java

@@ -0,0 +1,43 @@
+package com.citu.module.menduner.reward.mq.consumer;
+
+import com.citu.module.menduner.common.message.EventAsyncConfirmMessage;
+import com.citu.module.menduner.common.enums.EventAsyncUrlEnum;
+import com.citu.module.menduner.reward.service.event.EventTrackService;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
+import org.apache.rocketmq.spring.core.RocketMQListener;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+
+/**
+ * 事件异步确认消费者
+ **/
+@Slf4j
+@Component
+@RocketMQMessageListener(
+        topic = EventAsyncConfirmMessage.TOPIC,
+        consumerGroup = EventAsyncConfirmMessage.TOPIC + "_CONSUMER"
+)
+public class EventAsyncConfirmConsumer implements RocketMQListener<EventAsyncConfirmMessage> {
+
+    @Resource
+    private EventTrackService eventTrackService;
+
+    @Override
+    public void onMessage(EventAsyncConfirmMessage message) {
+        log.info("事件异步确认 onMessage: {}", message);
+        EventAsyncUrlEnum enums = EventAsyncUrlEnum.from(message.getUrl());
+        if (null == enums) {
+            log.error("事件地址不存在,无法解析事件地址[{}]", message.getUrl());
+            return;
+        }
+
+        eventTrackService.trigger(message.getUserId(),
+                message.getUrl(),
+                enums.isScene()?message.getScene():null,
+                message.getBizType()
+                );
+
+    }
+}

+ 1 - 1
menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/mq/producer/UserPointProducer.java

@@ -1,6 +1,6 @@
 package com.citu.module.menduner.reward.mq.producer;
 
-import com.citu.module.menduner.reward.mq.message.UserPointSendMessage;
+import com.citu.module.menduner.common.message.UserPointSendMessage;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.rocketmq.spring.core.RocketMQTemplate;
 import org.springframework.messaging.Message;

+ 1 - 1
menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/service/config/PointRuleConfigService.java

@@ -83,5 +83,5 @@ public interface PointRuleConfigService {
     /**
      * 获取任务
      **/
-    List<TaskRespVO> selectTask(Long userId, String type, String mark, LocalDateTime startTime, LocalDateTime endTime);
+    List<TaskRespVO> selectTask(Long userId, String mark, LocalDateTime startTime, LocalDateTime endTime);
 }

+ 2 - 2
menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/service/config/PointRuleConfigServiceImpl.java

@@ -179,7 +179,7 @@ public class PointRuleConfigServiceImpl implements PointRuleConfigService {
     }
 
     @Override
-    public List<TaskRespVO> selectTask(Long userId, String type, String mark, LocalDateTime startTime, LocalDateTime endTime) {
-        return mapper.selectTask(userId, type, mark,  startTime,  endTime);
+    public List<TaskRespVO> selectTask(Long userId,String mark, LocalDateTime startTime, LocalDateTime endTime) {
+        return mapper.selectTask(userId,mark,  startTime,  endTime);
     }
 }

+ 4 - 2
menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/service/event/EventRecordService.java

@@ -59,17 +59,19 @@ public interface EventRecordService {
      *
      * @param userId      用户id
      * @param url         事件地址
+     * @param scene    场景
      * @param metricValue 事件指标值
      * @return 事件记录分页
      */
-    Integer getEventCount(Long userId, String url, String metricValue);
+    Integer getEventCount(Long userId, String url, String scene, String metricValue);
 
     /**
      * 创建事件记录
      *
      * @param userId 用户id
      * @param url    事件地址
+     * @param scene    场景
      */
-    void createEventRecord(Long userId, String url);
+    void createEventRecord(Long userId, String url, String scene);
 
 }

+ 6 - 5
menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/service/event/EventRecordServiceImpl.java

@@ -127,7 +127,7 @@ public class EventRecordServiceImpl implements EventRecordService {
     }
 
     @Override
-    public Integer getEventCount(Long userId, String url, String metricValue) {
+    public Integer getEventCount(Long userId, String url, String scene, String metricValue) {
         //TODO 读多写多场景,不好使用缓存,暂时查库
         EventMetricDO eventMetric = eventMetricService.getByValue(metricValue);
         LocalDateTime[] dateRange = generateDateRange(eventMetric);
@@ -136,7 +136,7 @@ public class EventRecordServiceImpl implements EventRecordService {
         } else if (eventMetric.getValue().contains("point")) {
             return userAccountApi.getPointCount(userId, null, dateRange[0], dateRange[1]).getCheckedData();
         }
-        List<EventRecordDO> list = eventRecordMapper.getList(userId, url, dateRange[0], dateRange[1]);
+        List<EventRecordDO> list = eventRecordMapper.getList(userId, url,scene, dateRange[0], dateRange[1]);
         if (ObjectUtil.isEmpty(list)) {
             return 0;
         }
@@ -145,12 +145,12 @@ public class EventRecordServiceImpl implements EventRecordService {
 
     @Override
     @DSTransactional
-    public void createEventRecord(Long userId, String url) {
+    public void createEventRecord(Long userId, String url, String scene) {
         //TODO 读多写多场景,读写分离,不好使用缓存,暂时直接写库
 
         // 尝试加锁
         LocalDateTime time = LocalDate.now().atStartOfDay();
-        String lockKey = StrUtil.format(EVENT_RECORD_LOCK, userId, url, time);
+        String lockKey = StrUtil.format(EVENT_RECORD_LOCK, userId, url, scene, time);
         RLock lock = redissonClient.getLock(lockKey);
         try {
             // 尝试获取锁,等待时间为30秒,锁自动续期时间为10分钟
@@ -158,13 +158,14 @@ public class EventRecordServiceImpl implements EventRecordService {
 
                 // 查询今天记录
                 EventRecordDO record =
-                        eventRecordMapper.get(userId, url, time);
+                        eventRecordMapper.get(userId, url, scene, time);
                 if (null == record) {
                     // 没有今天的记录
                     //新增
                     eventRecordMapper.insert(EventRecordDO.builder()
                             .userId(userId)
                             .url(url)
+                            .scene(scene)
                             .date(time)
                             .count(1)
                             .build());

+ 13 - 0
menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/service/event/EventTrackService.java

@@ -1,5 +1,6 @@
 package com.citu.module.menduner.reward.service.event;
 
+import com.citu.module.menduner.common.enums.PointBizTypeEnum;
 import com.citu.module.menduner.reward.controller.base.common.TreeRespVO;
 import com.citu.module.menduner.reward.controller.base.config.TaskReqVO;
 import com.citu.module.menduner.reward.controller.base.config.TaskRespVO;
@@ -21,6 +22,7 @@ public interface EventTrackService {
 
     /**
      * 点击事件跟踪
+     *
      * @param url
      **/
     List<EventTrackPointRespVO> click(String url) throws Exception;
@@ -33,7 +35,18 @@ public interface EventTrackService {
 
     /**
      * 根据标记值获取标记事件的任务
+     *
      * @param reqVO 查询条件
      **/
     List<TaskRespVO> getMarkTask(TaskReqVO reqVO);
+
+    /**
+     * 触发事件
+     *
+     * @param userId  用户id
+     * @param url     触发地址
+     * @param scene   场景
+     * @param bizType 事件类型
+     **/
+    List<EventTrackPointRespVO> trigger(Long userId, String url, String scene, PointBizTypeEnum bizType);
 }

+ 45 - 31
menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/service/event/EventTrackServiceImpl.java

@@ -4,6 +4,7 @@ import cn.hutool.core.collection.CollectionUtil;
 import com.baomidou.dynamic.datasource.annotation.DSTransactional;
 import com.citu.framework.security.core.LoginUser;
 import com.citu.module.menduner.common.dto.TimeRangeBaseReqVO;
+import com.citu.module.menduner.common.enums.PointBizTypeEnum;
 import com.citu.module.menduner.common.util.LoginUserContext;
 import com.citu.module.menduner.reward.controller.base.common.TreeRespVO;
 import com.citu.module.menduner.reward.controller.base.config.TaskReqVO;
@@ -17,15 +18,14 @@ import com.citu.module.menduner.reward.core.RuleMatch;
 import com.citu.module.menduner.reward.dal.dataobject.config.Condition;
 import com.citu.module.menduner.reward.dal.dataobject.config.PointRuleConfigDO;
 import com.citu.module.menduner.reward.enums.config.PointRuleConfigTypeEnum;
-import com.citu.module.menduner.reward.mq.message.UserPointSendMessage;
+import com.citu.module.menduner.common.message.UserPointSendMessage;
 import com.citu.module.menduner.reward.mq.producer.UserPointProducer;
 import com.citu.module.menduner.reward.rule.DynamicPointRule;
 import com.citu.module.menduner.reward.rule.DynamicRuleAction;
 import com.citu.module.menduner.reward.service.config.PointRuleConfigService;
 import com.citu.module.menduner.system.api.url.MendunerSystemUrlApi;
 import com.citu.module.menduner.system.api.url.UrlInfoRespVO;
-import com.citu.module.menduner.system.enums.MathOperationEnum;
-import com.citu.module.menduner.system.enums.account.PointBizTypeEnum;
+import com.citu.module.menduner.common.enums.MathOperationEnum;
 import lombok.extern.slf4j.Slf4j;
 import org.jeasy.rules.api.Facts;
 import org.springframework.stereotype.Service;
@@ -110,20 +110,20 @@ public class EventTrackServiceImpl implements EventTrackService {
     @Override
     public List<TaskRespVO> getMarkTask(TaskReqVO reqVO) {
         LocalDateTime[] timeRange = null;
-        if(TaskReqVO.TYPE_RECOMMEND.equals(reqVO.getType())) {
-            timeRange =generateDateTimeRange(TimeRangeBaseReqVO.builder().type(TimeRangeBaseReqVO.ALL).build());
-        }else {
+        if (TaskReqVO.TYPE_RECOMMEND.equals(reqVO.getType())) {
+            timeRange = generateDateTimeRange(TimeRangeBaseReqVO.builder().type(TimeRangeBaseReqVO.ALL).build());
+        } else {
             LocalDate today = LocalDate.now();
             LocalDateTime startOfDay = today.atStartOfDay();  // 当天的开始时间
             LocalDateTime endOfDay = today.atTime(23, 59, 59);  // 当天的结束时间
-            timeRange =generateDateTimeRange(TimeRangeBaseReqVO.builder()
+            timeRange = generateDateTimeRange(TimeRangeBaseReqVO.builder()
                     .type(TimeRangeBaseReqVO.TYPE_CUSTOM)
                     // time 是数组,第一个元素是开始时间,第二个元素是结束时间,改为当天的起始和结束
                     .time(new LocalDateTime[]{startOfDay, endOfDay})
                     .build());
         }
+        // TODO 两个相同url的任务但是不同配置不同数据,只要该url触发过了都会显示true?怎么解决?
         return ruleConfigService.selectTask(LoginUserContext.getUserId(),
-                PointRuleConfigTypeEnum.MARK.getType(),
                 reqVO.getMark(),
                 timeRange[0],
                 timeRange[1]
@@ -133,7 +133,6 @@ public class EventTrackServiceImpl implements EventTrackService {
     @Override
     @DSTransactional
     public List<EventTrackPointRespVO> click(String url) {
-        List<EventTrackPointRespVO> respVOList = new ArrayList<>();
         // 获取当前登录用户信息
         LoginUser loginUser = LoginUserContext.get2();
 
@@ -142,7 +141,16 @@ public class EventTrackServiceImpl implements EventTrackService {
             return Collections.singletonList(EventTrackPointRespVO.builder().build());
         }
 
-        // 获取指定URL的积分规则配置列表
+        Long userId = loginUser.getId();
+
+        return trigger(userId, url, null, null);
+
+    }
+
+    @Override
+    @DSTransactional
+    public List<EventTrackPointRespVO> trigger(Long userId, String url, String scene, PointBizTypeEnum bizType) {List<EventTrackPointRespVO> respVOList = new ArrayList<>();
+        // 获取指定URL的积分规则配置列表,因为是查询地址的配置,所以不需要带上动态的场景
         List<PointRuleConfigDO> configList = ruleConfigService.getByUrlList(url);
 
         if (CollectionUtil.isEmpty(configList)) {
@@ -153,28 +161,29 @@ public class EventTrackServiceImpl implements EventTrackService {
         // 遍历处理每个积分规则配置
         for (PointRuleConfigDO config : configList) {
             // 处理单个积分规则
-            EventTrackPointRespVO respVO = processPointRule(config, loginUser, url);
+            EventTrackPointRespVO respVO = processPointRule(config, userId, url, scene, bizType);
             // 将处理结果添加到响应列表中
             respVOList.add(respVO);
         }
         // 调用服务记录事件访问
-        eventRecordService.createEventRecord(loginUser.getId(), url);
+        eventRecordService.createEventRecord(userId, url, scene);
         return respVOList;
-
     }
 
     /**
      * 处理单个积分规则
      *
-     * @param config    规则配置
-     * @param loginUser 操作用户
-     * @param url       事件地址
+     * @param config  规则配置
+     * @param userId  操作用户
+     * @param url     事件地址
+     * @param bizType 事件类型
      * @return EventTrackPointRespVO
      **/
-    private EventTrackPointRespVO processPointRule(PointRuleConfigDO config, LoginUser loginUser, String url) {
+    private EventTrackPointRespVO processPointRule(PointRuleConfigDO config,
+                                                   Long userId, String url, String scene, PointBizTypeEnum bizType) {
         EventTrackPointRespVO respVO = new EventTrackPointRespVO();
         // 获取触发规则的执行上下文信息
-        Map<String, Object> triggerMap = getRuleContextMap(loginUser.getId(), config.getUrl(), config.getTriggerRule());
+        Map<String, Object> triggerMap = getRuleContextMap(userId, config.getUrl(), scene, config.getTriggerRule());
         // 创建积分规则对象
         PointRule pointRule = createPointRule(config, triggerMap, null);
 
@@ -185,7 +194,7 @@ public class EventTrackServiceImpl implements EventTrackService {
         respVO.setPoint(pointRule.getPoint());
 
         // 执行规则匹配和相关操作
-        execute(pointRule, loginUser, config, url, respVO);
+        execute(pointRule, userId, config, url, bizType, respVO);
         return respVO;
     }
 
@@ -193,16 +202,17 @@ public class EventTrackServiceImpl implements EventTrackService {
      * 执行规则匹配和相关操作
      *
      * @param pointRule 规则对象
-     * @param loginUser 操作用户
+     * @param userId    操作用户
      * @param config    规则配置
      * @param url       事件地址
+     * @param bizType   事件类型
      * @param respVO    响应对象
      **/
-    private void execute(PointRule pointRule, LoginUser loginUser, PointRuleConfigDO config,
-                         String url, EventTrackPointRespVO respVO) {
+    private void execute(PointRule pointRule, Long userId, PointRuleConfigDO config,
+                         String url, PointBizTypeEnum bizType, EventTrackPointRespVO respVO) {
         DynamicRuleAction<PointRule> action = (t) -> {
             // 发送用户积分变更消息
-            userPointProducer.send(buildUserPointSendMessage(loginUser, config, t, url));
+            userPointProducer.send(buildUserPointSendMessage(userId, config, t, url, bizType));
             // 标记规则匹配成功
             respVO.match();
         };
@@ -214,20 +224,24 @@ public class EventTrackServiceImpl implements EventTrackService {
     /**
      * 构建用户积分变更消息对象
      *
-     * @param loginUser 操作用户
+     * @param userId    操作用户
      * @param config    规则配置
      * @param pointRule 规则对象
      * @param url       事件地址
+     * @param bizType   事件类型
      * @return UserPointSendMessage
      **/
-    private UserPointSendMessage buildUserPointSendMessage(LoginUser loginUser, PointRuleConfigDO config,
-                                                           PointRule pointRule, String url) {
-        PointBizTypeEnum bizType = PointBizTypeEnum.EVENT;
+    private UserPointSendMessage buildUserPointSendMessage(Long userId, PointRuleConfigDO config,
+                                                           PointRule pointRule, String url, PointBizTypeEnum bizType) {
+        PointBizTypeEnum defaultBizType = PointBizTypeEnum.EVENT;
         if (PointRuleConfigTypeEnum.MARK.getType().equals(config.getType())) {
-            bizType = PointBizTypeEnum.RECOMMEND_TASK;
+            defaultBizType = PointBizTypeEnum.RECOMMEND_TASK;
+        }
+        if (null == bizType) {
+            bizType = defaultBizType;
         }
         return UserPointSendMessage.builder()
-                .userId(loginUser.getId())
+                .userId(userId)
                 .url(url)
                 .title(config.getTitle())
                 .operation(MathOperationEnum.ADD.getOperator().equals(config.getOperation())
@@ -247,13 +261,13 @@ public class EventTrackServiceImpl implements EventTrackService {
      * @param url       url
      * @return Map<String, Object>
      **/
-    private Map<String, Object> getRuleContextMap(Long userId, String url, Condition condition) {
+    private Map<String, Object> getRuleContextMap(Long userId, String url, String scene, Condition condition) {
         Map<String, Object> map = new LinkedHashMap<>();
         List<String> keyList = EasyRulesEngine.extractUniqueKeys(condition);
 
         for (String key : keyList) {
             if (!map.containsKey(key)) {
-                map.put(key, eventRecordService.getEventCount(userId, url, key));
+                map.put(key, eventRecordService.getEventCount(userId, url, scene, key));
             }
         }
 

+ 5 - 5
menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/service/signin/SignInRecordServiceImpl.java

@@ -15,8 +15,8 @@ import com.citu.module.menduner.reward.dal.dataobject.signin.SignInRecordDO;
 import com.citu.module.menduner.reward.dal.mysql.signin.SignInRecordMapper;
 import com.citu.module.menduner.system.api.account.AccountRecordSaveReqDTO;
 import com.citu.module.menduner.system.api.account.UserAccountApi;
-import com.citu.module.menduner.system.enums.MathOperationEnum;
-import com.citu.module.menduner.system.enums.account.PointBizTypeEnum;
+import com.citu.module.menduner.common.enums.MathOperationEnum;
+import com.citu.module.menduner.common.enums.PointBizTypeEnum;
 import org.springframework.stereotype.Service;
 import org.springframework.validation.annotation.Validated;
 
@@ -121,11 +121,11 @@ public class SignInRecordServiceImpl implements SignInRecordService {
         }
         summary.setTodaySignIn(DateUtils.isToday(lastRecord.getCreateTime()));
 
-        // 4.1 校验今天是否签到,没有签到则直接返回
-        if (!summary.getTodaySignIn()) {
+        // 4.1 检查今天是否未签到且记录不是昨天创建的,如果是则直接返回
+        if (!summary.getTodaySignIn() && !DateUtils.isYesterday(lastRecord.getCreateTime())) {
             return summary;
         }
-        // 4.2 连续签到天数
+        // 4.2 要么是今天签到了,要么是昨天的记录,设置连续签到天数
         summary.setContinuousDay(lastRecord.getDay());
         return summary;
     }

+ 1 - 1
menduner/menduner-reward-biz/src/main/resources/bootstrap.yaml

@@ -11,4 +11,4 @@ server:
 # 日志文件配置。注意,如果 logging.file.name 不放在 bootstrap.yaml 配置文件,而是放在 application.yaml 中,会导致出现 LOG_FILE_IS_UNDEFINED 文件
 logging:
   file:
-    name: ${user.home}/logs/${spring.application.name}.log # 日志文件名,全路径
+    name: ${user.home}/logs/${spring.application.name}/${spring.application.name}.log # 日志文件名,全路径

+ 1 - 1
menduner/menduner-reward-biz/src/main/resources/logback-spring.xml

@@ -31,7 +31,7 @@
             <!-- 启动服务时,是否清理历史日志,一般不建议清理 -->
             <cleanHistoryOnStart>${LOGBACK_ROLLINGPOLICY_CLEAN_HISTORY_ON_START:-false}</cleanHistoryOnStart>
             <!-- 日志文件,到达多少容量,进行滚动 -->
-            <maxFileSize>${LOGBACK_ROLLINGPOLICY_MAX_FILE_SIZE:-10MB}</maxFileSize>
+            <maxFileSize>${LOGBACK_ROLLINGPOLICY_MAX_FILE_SIZE:-200MB}</maxFileSize>
             <!-- 日志文件的总大小,0 表示不限制 -->
             <totalSizeCap>${LOGBACK_ROLLINGPOLICY_TOTAL_SIZE_CAP:-0}</totalSizeCap>
             <!-- 日志文件的保留天数 -->

+ 12 - 0
menduner/menduner-system-api/src/main/java/com/citu/module/menduner/system/enums/CommonConstants.java

@@ -0,0 +1,12 @@
+package com.citu.module.menduner.system.enums;
+
+/**
+ * 公共常量
+ **/
+public class CommonConstants {
+    /** 邮箱验证码 **/
+    public static final String EMAIL_TEMPLATE_CODE = "menduner-code";
+
+    /** 邮箱初始化密码 **/
+    public static final String EMAIL_ENTERPRISE_INIT_PASSWORD = "menduner-enterprise-init-password";
+}

+ 106 - 5
menduner/menduner-system-api/src/main/java/com/citu/module/menduner/system/enums/ErrorCodeConstants.java

@@ -26,6 +26,9 @@ public interface ErrorCodeConstants {
     ErrorCode MDE_COMMON_USER_ID_NOT_NULL = new ErrorCode(1_099_000_006, "用户id不能为空");
     ErrorCode MDE_COMMON_ENTERPRISE_ID_NOT_NULL = new ErrorCode(1_099_000_007, "企业id不能为空");
     ErrorCode MDE_COMMON_USER_TYPE_NOT_NULL = new ErrorCode(1_099_000_008, "用户类型不能为空");
+    ErrorCode MDE_FILE_FORMAT_ERROR = new ErrorCode(1_099_000_009, "文件格式不正确,仅支持.doc, .docx, .pdf文件");
+
+    ErrorCode MDE_FILE_NOT_NULL = new ErrorCode(1_099_000_010, "文件附件不能为空");
 
 
     // ========== 人员信息-个人档案 1_100_001_000 ==========
@@ -146,6 +149,8 @@ public interface ErrorCodeConstants {
 
     ErrorCode MDE_USER_MOBILE_EXISTS_OTHER = new ErrorCode(1_100_016_025, "该手机号已被其他用户使用");
 
+    ErrorCode MDE_USER_EMAIL_CODE_NOT_NULL= new ErrorCode(1_100_016_026, "邮箱验证码不能为空");
+
     // ========== AUTH 模块 1_100_017_000 ==========
     ErrorCode MDE_AUTH_LOGIN_BAD_CREDENTIALS = new ErrorCode(1_100_017_001, "登录失败,账号密码不正确");
     ErrorCode MDE_AUTH_LOGIN_USER_DISABLED = new ErrorCode(1_100_017_002, "登录失败,账号被禁用");
@@ -169,7 +174,13 @@ public interface ErrorCodeConstants {
     ErrorCode MDE_AUTH_TOKEN_NOT_NULL = new ErrorCode(1_100_017_018, "访问令牌不能为空");
 
     ErrorCode MDE_USER_EMAIL_NOT_REGISTERED = new ErrorCode(1_100_017_019, "邮箱号未注册");
+    ErrorCode MDE_USER_EMAIL_CODE_ERROR = new ErrorCode(1_100_017_020, "邮箱验证码不正确");
+
+    ErrorCode MDE_USER_EMAIL_INIT_PASSWORD=
+            new ErrorCode(1_100_017_021, "您是首次登录,初始化密码已发往您的邮箱");
 
+    ErrorCode MDE_USER_PHONE_INIT_PASSWORD=
+            new ErrorCode(1_100_017_022, "密码不安全,请修改密码后登录");
 
     // ========== 角色模块 1_100_018_000 ==========
     ErrorCode MDE_ROLE_NOT_EXISTS = new ErrorCode(1_100_018_001, "角色不存在");
@@ -208,6 +219,9 @@ public interface ErrorCodeConstants {
 
     ErrorCode MDE_BUSINESS_LICENSE_OCR_FAIL = new ErrorCode(1_100_020_004, "营业执照图片识别失败,请重新上传清晰合法图片");
 
+    ErrorCode MDE_BUSINESS_LICENSE_OCR_CODE_DUPLICATE =
+            new ErrorCode(1_100_020_005, "统一社会信用代码已被其他企业使用");
+
     // ========== 企业注册申请 1_100_021_000 ==========
     ErrorCode MDE_ENTERPRISE_REGISTER_NOT_EXISTS = new ErrorCode(1_100_021_001, "企业注册申请不存在");
     ErrorCode MDE_ENTERPRISE_REGISTER_AUDITING_APPROVED =
@@ -216,8 +230,8 @@ public interface ErrorCodeConstants {
             new ErrorCode(1_100_021_003, "企业注册申请已审批通过,无法拒绝");
 
     ErrorCode MDE_ENTERPRISE_REGISTER_NAME_NOT_NULL = new ErrorCode(1_100_021_004, "企业名称不能为空");
-    ErrorCode MDE_ENTERPRISE_REGISTER_PHONE_NOT_NULL = new ErrorCode(1_100_021_005, "联系电话不能为空");
-    ErrorCode MDE_ENTERPRISE_REGISTER_EMAIL_NOT_NULL = new ErrorCode(1_100_021_006, "联系邮箱不能为空");
+    ErrorCode MDE_ENTERPRISE_REGISTER_PHONE_NOT_NULL = new ErrorCode(1_100_021_005, "管理员联系电话不能为空");
+    ErrorCode MDE_ENTERPRISE_REGISTER_EMAIL_NOT_NULL = new ErrorCode(1_100_021_006, "管理员联系邮箱不能为空");
     ErrorCode MDE_ENTERPRISE_REGISTER_BUSINESS_LICENSE_URL_NOT_NULL =
             new ErrorCode(1_100_021_007, "未上传营业执照");
 
@@ -237,15 +251,14 @@ public interface ErrorCodeConstants {
             = new ErrorCode(1_100_021_012, "统一社会信用代码已被注册");
 
 
-    ErrorCode MDE_ENTERPRISE_REGISTER_CONTACT_NAME_NOT_NULL = new ErrorCode(1_100_021_013, "联系人名称不能为空");
+    ErrorCode MDE_ENTERPRISE_REGISTER_CONTACT_NAME_NOT_NULL = new ErrorCode(1_100_021_013, "管理员名称不能为空");
 
     ErrorCode MDE_ENTERPRISE_REGISTER_PASSWORD_NOT_NULL = new ErrorCode(1_100_021_014, "密码不能为空");
     ErrorCode MDE_ENTERPRISE_REGISTER_PASSWORD_LENGTH = new ErrorCode(1_100_021_015, "密码长度为 8-16 位");
 
     ErrorCode MDE_ENTERPRISE_REGISTER_STATUS_APPLYING = new ErrorCode(1_100_021_016, "企业注册申请中");
 
-
-    ErrorCode MDE_ENTERPRISE_REGISTER_EMAIL_DUPLICATE = new ErrorCode(1_100_021_017, "该邮箱已被其他企业注册");
+    ErrorCode MDE_ENTERPRISE_REGISTER_EMAIL_DUPLICATE = new ErrorCode(1_100_021_017, "[{}]该邮箱已被其他企业注册");
 
     // ========== 企业地址 1_100_022_001 ==========
     ErrorCode MDE_ENTERPRISE_ADDRESS_NOT_EXISTS = new ErrorCode(1_100_022_001, "企业地址不存在");
@@ -257,6 +270,10 @@ public interface ErrorCodeConstants {
     ErrorCode MDE_ENTERPRISE_USER_BIND_IS_ADMIN = new ErrorCode(1_100_023_004, "该账户为管理员账户,无法操作");
     ErrorCode MDE_ENTERPRISE_USER_BIND_PASSWORD_NOT_NULL = new ErrorCode(1_100_023_005, "新密码不能为空");
     ErrorCode MDE_ENTERPRISE_USER_BIND_PASSWORD_LENGTH = new ErrorCode(1_100_023_006, "新密码长度为 8-16 位");
+    ErrorCode MDE_ENTERPRISE_USER_BIND_EMAIL_DUPLICATE = new ErrorCode(1_100_023_007, "该邮箱已被其他企业注册");
+    ErrorCode MDE_ENTERPRISE_USER_BIND_EMAIL_NOT_NULL = new ErrorCode(1_100_023_008, "企业用户登录邮箱不能为空");
+    ErrorCode MDE_ENTERPRISE_USER_BIND_EMAIL_FORMAT_ERROR = new ErrorCode(1_100_023_009, "企业用户登录邮箱格式不正确");
+
 
 
     // ========== 企业岗位信息 1_100_024_000 ==========
@@ -281,6 +298,10 @@ public interface ErrorCodeConstants {
     ErrorCode MDE_JOB_ADVERTISED_NAME_DUPLICATE = new ErrorCode(1_100_025_012, "职位名称({})已存在,请修改后重新保存");
     ErrorCode MDE_JOB_ADVERTISED_TIME_ERROR = new ErrorCode(1_100_025_013, "到期时间不能小于当前时间");
 
+    ErrorCode MDE_JOB_ADVERTISED_STATUS_ENABLE_ERROR = new ErrorCode(1_100_025_014, "职位已开启,请勿重复操作");
+    ErrorCode MDE_JOB_ADVERTISED_STATUS_CLOSE_ERROR = new ErrorCode(1_100_025_015, "职位已关闭,请勿重复操作");
+
+
     // ========== 企业招聘者浏览 1_100_026_000 ==========
     ErrorCode ENTERPRISE_USER_LOOK_NOT_EXISTS = new ErrorCode(1_100_026_001, "企业招聘者浏览不存在");
 
@@ -360,6 +381,9 @@ public interface ErrorCodeConstants {
     ErrorCode JOB_CV_REL_URL_NOT_NULL = new ErrorCode(1_100_035_008, "简历附件地址不能为空");
     ErrorCode JOB_CV_REL_STATUS_NOT_NULL = new ErrorCode(1_100_035_009, "投递的简历状态不能为空");
 
+
+    ErrorCode JOB_CV_REL_STATUS_NOT_REVOKE = new ErrorCode(1_100_035_010, "简历已被查看,无法撤回");
+
     // ========== 众聘-简历投递 1_100_036_000 ==========
     ErrorCode HIRE_JOB_CV_REL_NOT_EXISTS = new ErrorCode(1_100_036_001, "投递简历不存在");
     ErrorCode HIRE_JOB_CV_REL_JOB_ID_NOT_NULL = new ErrorCode(1_100_036_002, "发布的职位id不能为空");
@@ -396,6 +420,8 @@ public interface ErrorCodeConstants {
     ErrorCode ENTERPRISE_INVITE_CODE_NOT_NULL = new ErrorCode(1_100_040_005, "邀请码不能为空");
     ErrorCode ENTERPRISE_INVITE_INVALID_DAYS_NOT_NULL = new ErrorCode(1_100_040_006, "失效天数不能为空");
 
+    ErrorCode ENTERPRISE_INVITE_EMAIL_NOT_NULL = new ErrorCode(1_100_040_007, "企业登录邮箱不能为空");
+
     // ========== 企业邀请记录 1_100_041_000 ==========
     ErrorCode ENTERPRISE_INVITE_RECORD_NOT_EXISTS = new ErrorCode(1_100_041_001, "企业邀请记录不存在");
 
@@ -481,7 +507,82 @@ public interface ErrorCodeConstants {
     ErrorCode ORDER_GOODS_PRICE_NOT_NULL = new ErrorCode(1_100_046_013, "商品金额不能为空");
 
     ErrorCode ORDER_CANCEL_FAIL_STATUS_NOT_UNPAID = new ErrorCode(1_100_046_014, "交易订单取消失败,订单不是【待支付】状态");
+    ErrorCode ORDER_TYPE_NOT_NULL = new ErrorCode(1_100_046_015, "订单类型不能为空");
+
 
     // ========== 用户实名制 1_100_047_000 ==========
     ErrorCode USER_AUTH_NOT_EXISTS = new ErrorCode(1_100_047_001, "用户实名制不存在");
+
+    // ========== 品牌 1_100_048_000 ==========
+    ErrorCode BRAND_NOT_EXISTS = new ErrorCode(1_100_048_001, "品牌不存在");
+
+    // ========== 兑换 1_100_049_000 ==========
+    ErrorCode REDEEM_NOT_EXISTS = new ErrorCode(1_100_049_001, "兑换不存在");
+
+    ErrorCode REDEEM_NAME_NOT_NULL = new ErrorCode(1_100_049_002, "商品名不能为空");
+    ErrorCode REDEEM_URL_NOT_NULL = new ErrorCode(1_100_049_003, "商品图片地址不能为空");
+    ErrorCode REDEEM_POINT_NOT_NULL = new ErrorCode(1_100_049_004, "兑换积分不能为空");
+    ErrorCode REDEEM_CONTACT_NAME_NOT_NULL = new ErrorCode(1_100_049_005, "联系人姓名不能为空");
+    ErrorCode REDEEM_CONTACT_PHONE_NOT_NULL = new ErrorCode(1_100_049_006, "联系电话不能为空");
+    ErrorCode REDEEM_TYPE_NOT_NULL = new ErrorCode(1_100_049_007, "商品类型不能为空");
+
+    // ========== 人才屏蔽企业关系 1_100_050_000 ==========
+    ErrorCode PERSON_ENTERPRISE_BLOCK_NOT_EXISTS = new ErrorCode(1_100_050_001, "人才屏蔽企业关系不存在");
+
+    ErrorCode PERSON_ENTERPRISE_BLOCK_ALREADY_BLOCK = new ErrorCode(1_100_050_002, "企业已屏蔽,请勿重复点击");
+
+    // ========== 用户套餐 1_100_051_000 ==========
+    ErrorCode USER_PACKAGE_NOT_EXISTS = new ErrorCode(1_100_051_001, "用户套餐不存在");
+    ErrorCode USER_PACKAGE_NAME_NOT_NULL = new ErrorCode(1_100_051_002, "套餐名称不能为空");
+    ErrorCode USER_PACKAGE_PRICE_NOT_NULL = new ErrorCode(1_100_051_003, "套餐价格不能为空");
+    ErrorCode USER_PACKAGE_DAY_NOT_NULL = new ErrorCode(1_100_051_004, "天数不能为空");
+    ErrorCode USER_PACKAGE_RECOMMEND_NOT_NULL = new ErrorCode(1_100_051_005, "是否推荐不能为空");
+    ErrorCode USER_PACKAGE_TEXT_NOT_NULL = new ErrorCode(1_100_051_006, "说明文本不能为空");
+    ErrorCode USER_PACKAGE_RESUME_REFRESH_COUNT_NOT_NULL = new ErrorCode(1_100_051_007, "简历刷新次数不能为空");
+    ErrorCode USER_PACKAGE_RESUME_PRIVACY_NOT_NULL = new ErrorCode(1_100_051_008, "是否开启简历屏蔽不能为空");
+    ErrorCode USER_PACKAGE_PRIORITY_RECOMMEND_NOT_NULL = new ErrorCode(1_100_051_009, "是否开启优先推荐不能为空");
+    ErrorCode USER_PACKAGE_RESUME_TEMPLATE_NOT_NULL = new ErrorCode(1_100_051_010, "是否开启简历模板下载不能为空");
+    ErrorCode USER_PACKAGE_VIEWERS_LIST_NOT_NULL = new ErrorCode(1_100_051_011, "是否开启谁看过我不能为空");
+    ErrorCode USER_PACKAGE_SALARY_REPORT_NOT_NULL = new ErrorCode(1_100_051_012, "是否开启薪酬报告不能为空");
+
+    // ========== 用户权益记录 1_100_052_000 ==========
+    ErrorCode USER_ENTITLEMENT_NOT_EXISTS = new ErrorCode(1_100_052_001, "用户权益记录不存在");
+
+    // ========== 企业套餐 1_100_053_000 ==========
+    ErrorCode ENTERPRISE_PACKAGE_NOT_EXISTS = new ErrorCode(1_100_053_001, "企业套餐不存在");
+
+    ErrorCode ENTERPRISE_PACKAGE_NAME_NOT_NULL = new ErrorCode(1_100_053_002, "套餐名称不能为空");
+
+    ErrorCode ENTERPRISE_PACKAGE_PRICE_NOT_NULL = new ErrorCode(1_100_053_003, "套餐价格不能为空");
+
+    ErrorCode ENTERPRISE_PACKAGE_DAY_NOT_NULL = new ErrorCode(1_100_053_004, "天数不能为空");
+
+    ErrorCode ENTERPRISE_PACKAGE_DEFAULT_PACKAGE_NOT_NULL = new ErrorCode(1_100_053_005, "是否默认不能为空");
+
+    ErrorCode ENTERPRISE_PACKAGE_RECOMMEND_NOT_NULL = new ErrorCode(1_100_053_006, "是否推荐不能为空");
+
+    ErrorCode ENTERPRISE_PACKAGE_TEXT_NOT_NULL = new ErrorCode(1_100_053_007, "说明文本不能为空");
+
+    ErrorCode ENTERPRISE_PACKAGE_PUBLISH_JOB_COUNT_NOT_NULL = new ErrorCode(1_100_053_008, "允许发布职位数量不能为空");
+
+    ErrorCode ENTERPRISE_PACKAGE_SEARCH_COUNT_NOT_NULL = new ErrorCode(1_100_053_009, "允许搜索人才的数量不能为空");
+
+
+    // ========== 企业权益记录 1_100_054_000 ==========
+    ErrorCode ENTERPRISE_ENTITLEMENT_NOT_EXISTS = new ErrorCode(1_100_054_001, "企业权益记录不存在");
+
+    ErrorCode ENTERPRISE_ENTITLEMENT_QUOTA_OVERFLOW = new ErrorCode(1_100_054_002, "企业额度已超过");
+
+    // ========== 早报资讯 1_100_055_000 ==========
+    ErrorCode MORNING_NEWS_NOT_EXISTS = new ErrorCode(1_100_055_001, "早报资讯不存在");
+
+    // ========== 招聘会 1_100_056_000 ==========
+    ErrorCode JOB_FAIR_NOT_EXISTS = new ErrorCode(1_100_056_001, "招聘会不存在");
+    ErrorCode JOB_FAIR_JOB_ID_NOT_NULL = new ErrorCode(1_100_056_002, "招聘职位id不能为空");
+    ErrorCode JOB_FAIR_JOB_NAME_NOT_NULL = new ErrorCode(1_100_056_003, "招聘会名称不能为空");
+    ErrorCode JOB_FAIR_TIME_OVER = new ErrorCode(1_100_056_004, "招聘会时间已过,暂停招聘");
+
+    // ========== 招聘职位扩展 1_100_057_000 ==========
+    ErrorCode JOB_EXTEND_JOB_ID_NOT_NULL = new ErrorCode(1_100_057_001, "招聘职位id不能为空");
+
 }

+ 13 - 0
menduner/menduner-system-api/src/main/java/com/citu/module/menduner/system/enums/TradeOrderTypeMq.java

@@ -6,6 +6,16 @@ package com.citu.module.menduner.system.enums;
  **/
 public class TradeOrderTypeMq {
 
+    /**
+     * 企业支付
+     */
+    public static final String PAY_APP_ENTERPRISE_KEY = "enterprise";
+    /**
+     * 用户支付
+     */
+    public static final String PAY_APP_USER_KEY = "user";
+
+
     /** 平台订单 **/
     public static final String PLATFORM_ORDER_TOPIC = "PLATFORM_ORDER_TOPIC";
 
@@ -15,5 +25,8 @@ public class TradeOrderTypeMq {
     /** 发布众聘职位订单 **/
     public static final String PUBLISH_JOB_HIRE_ORDER_TOPIC = "PUBLISH_JOB_HIRE_ORDER_TOPIC";
 
+    /** 用户会员套餐订单 **/
+    public static final String USER_MEMBER_ORDER_TOPIC = "USER_MEMBER_ORDER_TOPIC";
+
 
 }

+ 11 - 1
menduner/menduner-system-api/src/main/java/com/citu/module/menduner/system/enums/order/TradeOrderTypeEnum.java

@@ -16,7 +16,17 @@ public enum TradeOrderTypeEnum {
     PLATFORM_ORDER("0", "平台", TradeOrderTypeMq.PLATFORM_ORDER_TOPIC),
     PUBLISH_JOB_ORDER("1", "发布职位", TradeOrderTypeMq.PUBLISH_JOB_ORDER_TOPIC),
     PUBLISH_JOB_HIRE_ORDER("2", "发布众聘职位", TradeOrderTypeMq.PUBLISH_JOB_HIRE_ORDER_TOPIC),
-
+    // 会员
+    // 用户-14天
+    USER_MEMBER_14_DAY("3", "会员套餐-14天", TradeOrderTypeMq.USER_MEMBER_ORDER_TOPIC),
+    // 用户-30天
+    USER_MEMBER_30_DAY("4", "会员套餐-30天", TradeOrderTypeMq.USER_MEMBER_ORDER_TOPIC),
+    // 用户-60天
+    USER_MEMBER_60_DAY("5", "会员套餐-30天", TradeOrderTypeMq.USER_MEMBER_ORDER_TOPIC),
+    // 用户-90天
+    USER_MEMBER_90_DAY("6", "会员套餐-90天", TradeOrderTypeMq.USER_MEMBER_ORDER_TOPIC),
+    // 用户-365天
+    USER_MEMBER_365_DAY("7", "会员套餐-365天", TradeOrderTypeMq.USER_MEMBER_ORDER_TOPIC),
     ;
 
     /**

+ 1 - 1
menduner/menduner-system-api/src/main/java/com/citu/module/menduner/system/enums/MdeUserTypeEnum.java → menduner/menduner-system-api/src/main/java/com/citu/module/menduner/system/enums/user/MdeUserTypeEnum.java

@@ -1,4 +1,4 @@
-package com.citu.module.menduner.system.enums;
+package com.citu.module.menduner.system.enums.user;
 
 import lombok.AllArgsConstructor;
 import lombok.Getter;

+ 32 - 0
menduner/menduner-system-api/src/main/java/com/citu/module/menduner/system/enums/user/UserVipFlagEnum.java

@@ -0,0 +1,32 @@
+package com.citu.module.menduner.system.enums.user;
+
+import com.citu.module.menduner.system.enums.order.TradeOrderTypeEnum;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * 用户vip标识 14 | 30 | 60 | 90 | 365
+ **/
+@Getter
+@AllArgsConstructor
+public enum UserVipFlagEnum {
+    USER_MEMBER_14_DAY("14","3", "14天"),
+    USER_MEMBER_30_DAY("30", "4","30天"),
+    USER_MEMBER_60_DAY("60", "5","60天"),
+    USER_MEMBER_90_DAY("90", "6","90天"),
+    USER_MEMBER_365_DAY("365", "7","365天");
+
+    private final String flag;
+    /** 对应 {@link TradeOrderTypeEnum} **/
+    private final String relationType;
+    private final String name;
+
+    public static UserVipFlagEnum from(String relationType) {
+        for (UserVipFlagEnum item : UserVipFlagEnum.values()) {
+            if (item.getRelationType().equals(relationType)) {
+                return item;
+            }
+        }
+        return null;
+    }
+}

+ 10 - 0
menduner/menduner-system-biz/pom.xml

@@ -55,6 +55,16 @@
             <artifactId>citu-spring-boot-starter-job</artifactId>
         </dependency>
 
+        <dependency>
+            <groupId>org.apache.tika</groupId>
+            <artifactId>tika-core</artifactId> <!-- 文件客户端:文件类型的识别 -->
+        </dependency>
+
+        <dependency>
+            <groupId>com.citu</groupId>
+            <artifactId>citu-spring-boot-starter-protection</artifactId>
+        </dependency>
+
         <dependency>
             <groupId>com.xingyuv</groupId>
             <artifactId>spring-boot-starter-captcha-plus</artifactId> <!-- 验证码,一般用于登录使用 -->

+ 73 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/aop/VipEntitlementCheck.java

@@ -0,0 +1,73 @@
+package com.citu.module.menduner.system.aop;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * vip 权益效验判断
+ **/
+@Target(ElementType.METHOD)
+@Retention(RetentionPolicy.RUNTIME)
+public @interface VipEntitlementCheck {
+    // ========== 用户类型 =========
+    /**
+     * 用户vip
+     **/
+    String USER = "user";
+    /**
+     * 企业vip
+     **/
+    String ENTERPRISE = "enterprise";
+
+    // ========== 权益类型 =========
+    /**
+     * 企业权益-发布职位
+     **/
+    String OPERATE_PUBLISH_JOB = "publishJob";
+
+    /**
+     * 企业权益-搜索人才
+     **/
+    String OPERATE_SEARCH = "search";
+
+    /**
+     * 企业权益-查看简历
+     **/
+    String OPERATE_LOOK_CV = "lookCv";
+
+    /**
+     * 企业权益-是否开启人才地图
+     **/
+    String OPERATE_PERSON_MAP = "person_map";
+
+    /**
+     * 企业权益-是否允许发布众聘职位
+     **/
+    String OPERATE_HIRE_JOB = "hire_job";
+
+    /**
+     * 权益类型
+     **/
+    String type();
+
+    /**
+     * 用户类型
+     **/
+    String userType() default ENTERPRISE;
+
+    /**
+     * 操作
+     **/
+    OperationType operate();
+
+    /**
+     * 是否后台管理员操作
+     **/
+    boolean system() default false;
+
+    enum OperationType {
+        ADD, DEDUCT
+    }
+}

+ 189 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/aop/VipEntitlementCheckAspect.java

@@ -0,0 +1,189 @@
+package com.citu.module.menduner.system.aop;
+
+import com.citu.module.menduner.common.util.LoginUserContext;
+import com.citu.module.menduner.system.controller.base.enterprise.vip.EnterpriseEntitlementRespVO;
+import com.citu.module.menduner.system.dal.dataobject.enterprise.EnterpriseEntitlementDO;
+import com.citu.module.menduner.system.service.enterprise.vip.EnterpriseEntitlementService;
+import com.citu.module.menduner.system.service.user.UserEntitlementService;
+import org.aspectj.lang.ProceedingJoinPoint;
+import org.aspectj.lang.annotation.Around;
+import org.aspectj.lang.annotation.Aspect;
+import org.springframework.context.annotation.Lazy;
+import org.springframework.stereotype.Component;
+import org.springframework.util.StringUtils;
+
+import javax.annotation.Resource;
+
+import static com.citu.framework.common.exception.enums.GlobalErrorCodeConstants.FORBIDDEN;
+import static com.citu.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static com.citu.module.menduner.system.aop.VipEntitlementCheck.*;
+import static com.citu.module.menduner.system.enums.ErrorCodeConstants.ENTERPRISE_ENTITLEMENT_QUOTA_OVERFLOW;
+
+/**
+ * TODO 临时这么写,还未沟通具体逻辑
+ **/
+@Aspect
+@Component
+public class VipEntitlementCheckAspect {
+
+    @Resource
+    @Lazy
+    private UserEntitlementService userEntitlementService;
+
+    @Resource
+    @Lazy
+    private EnterpriseEntitlementService enterpriseEntitlementService;
+
+
+    @Around("@annotation(vipEntitlementCheck)")
+    public Object around(ProceedingJoinPoint joinPoint, VipEntitlementCheck vipEntitlementCheck) {
+
+        boolean isEnterprise = VipEntitlementCheck.ENTERPRISE.equals(vipEntitlementCheck.userType());
+        Long userId = LoginUserContext.getUserId();
+        Long enterpriseId = LoginUserContext.getEnterpriseId3();
+        validate(isEnterprise, enterpriseId, userId, vipEntitlementCheck.type(), vipEntitlementCheck.operate());
+        try {
+            Object result = joinPoint.proceed();
+            process(isEnterprise, enterpriseId, userId, vipEntitlementCheck.type(), vipEntitlementCheck.operate());
+            return result;
+        } catch (Throwable e) {
+            e.getStackTrace();
+            throw exception(FORBIDDEN);
+        }
+    }
+
+    /**
+     * 验证权限
+     */
+    public void validate(String type) {
+        Long enterpriseId = LoginUserContext.getEnterpriseId3();
+        validate(null != enterpriseId, enterpriseId, LoginUserContext.getUserId(), type, null);
+    }
+
+    public void validate(String type, VipEntitlementCheck.OperationType operator) {
+        Long enterpriseId = LoginUserContext.getEnterpriseId3();
+        validate(null != enterpriseId, enterpriseId, LoginUserContext.getUserId(), type, operator);
+    }
+
+    public void validate(String type, boolean isTrigger) {
+        if (!isTrigger) {
+            // 如果为false则不执行
+            return;
+        }
+        validate(type);
+    }
+
+
+    /**
+     * 权益处理
+     *
+     * @param type     权益类型
+     * @param operator 操作
+     */
+    public void process(String type, VipEntitlementCheck.OperationType operator) {
+        Long enterpriseId = LoginUserContext.getEnterpriseId3();
+        process(null != enterpriseId, enterpriseId, LoginUserContext.getUserId(), type, operator);
+    }
+
+    public void process(String type, VipEntitlementCheck.OperationType operator, boolean isTrigger) {
+        if (!isTrigger) {
+            // 如果为false则不执行
+            return;
+        }
+        process(type, operator);
+    }
+
+
+    private void validate(boolean isEnterprise, Long enterpriseId,
+                          Long userId, String type,
+                          VipEntitlementCheck.OperationType operator) {
+
+        if (!isEnterprise || LoginUserContext.checkIsSystemUser()) {
+            return;
+        }
+        // 企业
+        enterpriseId = LoginUserContext.getEnterpriseId();
+        EnterpriseEntitlementRespVO entitlementRespVO =
+                enterpriseEntitlementService.getByEnterpriseIdAndUserId(enterpriseId, userId);
+
+        // 效验权限
+        if (!StringUtils.hasText(type)) {
+            // 没有权限
+            throw exception(FORBIDDEN);
+        }
+        if (null == operator || VipEntitlementCheck.OperationType.ADD.equals(operator)) {
+            // 新增不做效验
+            return;
+        }
+        switch (type) {
+            case OPERATE_PUBLISH_JOB:
+                if (entitlementRespVO.getPublishJobCount() <= 0) {
+                    throw exception(ENTERPRISE_ENTITLEMENT_QUOTA_OVERFLOW);
+                }
+                break;
+            case OPERATE_SEARCH:
+                if (entitlementRespVO.getSearchCount() <= 0) {
+                    throw exception(ENTERPRISE_ENTITLEMENT_QUOTA_OVERFLOW);
+                }
+            case OPERATE_LOOK_CV:
+                if (entitlementRespVO.getLookCvCount() <= 0) {
+                    throw exception(ENTERPRISE_ENTITLEMENT_QUOTA_OVERFLOW);
+                }
+                break;
+            default:
+                throw exception(FORBIDDEN);
+        }
+    }
+
+    private void process(boolean isEnterprise,
+                         Long enterpriseId, Long userId,
+                         String type, VipEntitlementCheck.OperationType operator) {
+        if (!isEnterprise || LoginUserContext.checkIsSystemUser()) {
+            // 用户
+            return;
+        }
+        // TODO 设计业务的应该通过业务查询计数,但是如果按照这种办法,旧数据那些发布了很多职位的怎么办?
+        // TODO 目前只单纯写个加减1,还未沟通具体逻辑
+
+        // 企业
+        EnterpriseEntitlementRespVO entitlementRespVO =
+                enterpriseEntitlementService.getByEnterpriseIdAndUserId(enterpriseId, userId);
+        int amount = VipEntitlementCheck.OperationType.ADD.equals(operator) ? 1 : -1;
+        int num = 0;
+        switch (type) {
+            case OPERATE_PUBLISH_JOB:
+                num = entitlementRespVO.getPublishJobCount() + amount;
+                if (num > entitlementRespVO.getPackageInfo().getPublishJobCount()) {
+                    // 用户持有的额度大于套餐的额度
+                    // return;
+                }
+                entitlementRespVO.setPublishJobCount(num);
+                break;
+            case OPERATE_SEARCH:
+                num = entitlementRespVO.getSearchCount() + amount;
+                if (num > entitlementRespVO.getPackageInfo().getPublishJobCount()) {
+                    // 用户持有的额度大于套餐的额度
+                    // return;
+                }
+                entitlementRespVO.setSearchCount(num);
+                break;
+            case OPERATE_LOOK_CV:
+                num = entitlementRespVO.getLookCvCount() + amount;
+                if (num > entitlementRespVO.getPackageInfo().getLookCvCount()) {
+                    // 用户持有的额度大于套餐的额度
+                    // return;
+                }
+                entitlementRespVO.setLookCvCount(num);
+                break;
+            default:
+                return;
+        }
+        enterpriseEntitlementService.update(EnterpriseEntitlementDO.builder()
+                .id(entitlementRespVO.getId())
+                .publishJobCount(entitlementRespVO.getPublishJobCount())
+                .searchCount(entitlementRespVO.getSearchCount())
+                .lookCvCount(entitlementRespVO.getLookCvCount())
+                .build());
+    }
+
+}

+ 2 - 2
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/api/account/UserAccountApiImpl.java

@@ -2,8 +2,8 @@ package com.citu.module.menduner.system.api.account;
 
 import com.citu.framework.common.pojo.CommonResult;
 import com.citu.module.menduner.system.dal.dataobject.user.UserAccountDO;
-import com.citu.module.menduner.system.enums.MathOperationEnum;
-import com.citu.module.menduner.system.enums.account.PointBizTypeEnum;
+import com.citu.module.menduner.common.enums.MathOperationEnum;
+import com.citu.module.menduner.common.enums.PointBizTypeEnum;
 import com.citu.module.menduner.system.service.record.UserAccountRecordService;
 import com.citu.module.menduner.system.service.user.UserAccountService;
 import org.springframework.validation.annotation.Validated;

+ 1 - 1
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/api/user/UserApiImpl.java

@@ -4,7 +4,7 @@ import com.citu.framework.common.pojo.CommonResult;
 import com.citu.module.menduner.system.dal.dataobject.person.PersonInfoDO;
 import com.citu.module.menduner.system.dal.mysql.enterprise.EnterpriseUserBindMapper;
 import com.citu.module.menduner.system.dal.mysql.person.PersonInfoMapper;
-import com.citu.module.menduner.system.enums.MdeUserTypeEnum;
+import com.citu.module.menduner.system.enums.user.MdeUserTypeEnum;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.RestController;
 

+ 8 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/admin/area/AreaController.java

@@ -6,6 +6,8 @@ import com.citu.framework.common.pojo.PageParam;
 import com.citu.framework.common.pojo.PageResult;
 import com.citu.framework.common.util.object.BeanUtils;
 import com.citu.framework.excel.core.util.ExcelUtils;
+import com.citu.module.menduner.system.controller.app.jobhunt.area.vo.AppAreaChildrenRespVO;
+import com.citu.module.menduner.system.controller.app.jobhunt.area.vo.AppAreaListReqVO;
 import com.citu.module.menduner.system.controller.base.area.*;
 import com.citu.module.menduner.system.dal.dataobject.area.AreaDO;
 import com.citu.module.menduner.system.service.area.AreaService;
@@ -122,5 +124,11 @@ public class AreaController {
         return success(list);
     }
 
+    @GetMapping("/get/tree")
+    @Operation(summary = "获取区域树形")
+    public CommonResult<List<AppAreaChildrenRespVO>> getArea(@Valid AppAreaListReqVO listReqVO) {
+        List<AppAreaChildrenRespVO> list = areaService.getArea(listReqVO);
+        return success(list);
+    }
 
 }

+ 94 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/admin/brand/BrandController.java

@@ -0,0 +1,94 @@
+package com.citu.module.menduner.system.controller.admin.brand;
+
+
+import com.citu.framework.apilog.core.annotation.ApiAccessLog;
+import com.citu.framework.common.pojo.CommonResult;
+import com.citu.framework.common.pojo.PageParam;
+import com.citu.framework.common.pojo.PageResult;
+import com.citu.framework.common.util.object.BeanUtils;
+import com.citu.framework.excel.core.util.ExcelUtils;
+import com.citu.module.menduner.system.controller.base.brand.BrandPageReqVO;
+import com.citu.module.menduner.system.controller.base.brand.BrandRespVO;
+import com.citu.module.menduner.system.controller.base.brand.BrandSaveReqVO;
+import com.citu.module.menduner.system.dal.dataobject.brand.BrandDO;
+import com.citu.module.menduner.system.service.brand.BrandService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.Valid;
+import java.io.IOException;
+import java.util.List;
+
+import static com.citu.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
+import static com.citu.framework.common.pojo.CommonResult.success;
+
+@Tag(name = "管理后台 - 品牌")
+@RestController
+@RequestMapping("/menduner/system/brand")
+@Validated
+public class BrandController {
+
+    @Resource
+    private BrandService brandService;
+
+    @PostMapping("/create")
+    @Operation(summary = "创建品牌")
+    @PreAuthorize("@ss.hasPermission('menduner:system:brand:create')")
+    public CommonResult<Long> createBrand(@Valid @RequestBody BrandSaveReqVO createReqVO) {
+        return success(brandService.createBrand(createReqVO));
+    }
+
+    @PutMapping("/update")
+    @Operation(summary = "更新品牌")
+    @PreAuthorize("@ss.hasPermission('menduner:system:brand:update')")
+    public CommonResult<Boolean> updateBrand(@Valid @RequestBody BrandSaveReqVO updateReqVO) {
+        brandService.updateBrand(updateReqVO);
+        return success(true);
+    }
+
+    @DeleteMapping("/delete")
+    @Operation(summary = "删除品牌")
+    @Parameter(name = "id", description = "编号", required = true)
+    @PreAuthorize("@ss.hasPermission('menduner:system:brand:delete')")
+    public CommonResult<Boolean> deleteBrand(@RequestParam("id") Long id) {
+        brandService.deleteBrand(id);
+        return success(true);
+    }
+
+    @GetMapping("/get")
+    @Operation(summary = "获得品牌")
+    @Parameter(name = "id", description = "编号", required = true, example = "1024")
+    @PreAuthorize("@ss.hasPermission('menduner:system:brand:query')")
+    public CommonResult<BrandRespVO> getBrand(@RequestParam("id") Long id) {
+        BrandDO brand = brandService.getBrand(id);
+        return success(BeanUtils.toBean(brand, BrandRespVO.class));
+    }
+
+    @GetMapping("/page")
+    @Operation(summary = "获得品牌分页")
+    @PreAuthorize("@ss.hasPermission('menduner:system:brand:query')")
+    public CommonResult<PageResult<BrandRespVO>> getBrandPage(@Valid BrandPageReqVO pageReqVO) {
+        PageResult<BrandDO> pageResult = brandService.getBrandPage(pageReqVO);
+        return success(BeanUtils.toBean(pageResult, BrandRespVO.class));
+    }
+
+    @GetMapping("/export-excel")
+    @Operation(summary = "导出品牌 Excel")
+    @PreAuthorize("@ss.hasPermission('menduner:system:brand:export')")
+    @ApiAccessLog(operateType = EXPORT)
+    public void exportBrandExcel(@Valid BrandPageReqVO pageReqVO,
+                                 HttpServletResponse response) throws IOException {
+        pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+        List<BrandDO> list = brandService.getBrandPage(pageReqVO).getList();
+        // 导出 Excel
+        ExcelUtils.write(response, "品牌.xls", "数据", BrandRespVO.class,
+                BeanUtils.toBean(list, BrandRespVO.class));
+    }
+
+}

+ 94 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/admin/content/MorningNewsController.java

@@ -0,0 +1,94 @@
+package com.citu.module.menduner.system.controller.admin.content;
+
+
+import com.citu.framework.apilog.core.annotation.ApiAccessLog;
+import com.citu.framework.common.pojo.CommonResult;
+import com.citu.framework.common.pojo.PageParam;
+import com.citu.framework.common.pojo.PageResult;
+import com.citu.framework.common.util.object.BeanUtils;
+import com.citu.framework.excel.core.util.ExcelUtils;
+import com.citu.module.menduner.system.controller.base.content.MorningNewsPageReqVO;
+import com.citu.module.menduner.system.controller.base.content.MorningNewsRespVO;
+import com.citu.module.menduner.system.controller.base.content.MorningNewsSaveReqVO;
+import com.citu.module.menduner.system.dal.dataobject.content.MorningNewsDO;
+import com.citu.module.menduner.system.service.content.MorningNewsService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.Valid;
+import java.io.IOException;
+import java.util.List;
+
+import static com.citu.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
+import static com.citu.framework.common.pojo.CommonResult.success;
+
+@Tag(name = "管理后台 - 早报资讯")
+@RestController
+@RequestMapping("/menduner/system/morning-news")
+@Validated
+public class MorningNewsController {
+
+    @Resource
+    private MorningNewsService morningNewsService;
+
+    @PostMapping("/create")
+    @Operation(summary = "创建早报资讯")
+    @PreAuthorize("@ss.hasPermission('menduner:system:morning-news:create')")
+    public CommonResult<Long> createMorningNews(@Valid @RequestBody MorningNewsSaveReqVO createReqVO) {
+        return success(morningNewsService.createMorningNews(createReqVO));
+    }
+
+    @PutMapping("/update")
+    @Operation(summary = "更新早报资讯")
+    @PreAuthorize("@ss.hasPermission('menduner:system:morning-news:update')")
+    public CommonResult<Boolean> updateMorningNews(@Valid @RequestBody MorningNewsSaveReqVO updateReqVO) {
+        morningNewsService.updateMorningNews(updateReqVO);
+        return success(true);
+    }
+
+    @DeleteMapping("/delete")
+    @Operation(summary = "删除早报资讯")
+    @Parameter(name = "id", description = "编号", required = true)
+    @PreAuthorize("@ss.hasPermission('menduner:system:morning-news:delete')")
+    public CommonResult<Boolean> deleteMorningNews(@RequestParam("id") Long id) {
+        morningNewsService.deleteMorningNews(id);
+        return success(true);
+    }
+
+    @GetMapping("/get")
+    @Operation(summary = "获得早报资讯")
+    @Parameter(name = "id", description = "编号", required = true, example = "1024")
+    @PreAuthorize("@ss.hasPermission('menduner:system:morning-news:query')")
+    public CommonResult<MorningNewsRespVO> getMorningNews(@RequestParam("id") Long id) {
+        MorningNewsDO morningNews = morningNewsService.getMorningNews(id);
+        return success(BeanUtils.toBean(morningNews, MorningNewsRespVO.class));
+    }
+
+    @GetMapping("/page")
+    @Operation(summary = "获得早报资讯分页")
+    @PreAuthorize("@ss.hasPermission('menduner:system:morning-news:query')")
+    public CommonResult<PageResult<MorningNewsRespVO>> getMorningNewsPage(@Valid MorningNewsPageReqVO pageReqVO) {
+        PageResult<MorningNewsDO> pageResult = morningNewsService.getMorningNewsPage(pageReqVO);
+        return success(BeanUtils.toBean(pageResult, MorningNewsRespVO.class));
+    }
+
+    @GetMapping("/export-excel")
+    @Operation(summary = "导出早报资讯 Excel")
+    @PreAuthorize("@ss.hasPermission('menduner:system:morning-news:export')")
+    @ApiAccessLog(operateType = EXPORT)
+    public void exportMorningNewsExcel(@Valid MorningNewsPageReqVO pageReqVO,
+                                       HttpServletResponse response) throws IOException {
+        pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+        List<MorningNewsDO> list = morningNewsService.getMorningNewsPage(pageReqVO).getList();
+        // 导出 Excel
+        ExcelUtils.write(response, "早报资讯.xls", "数据", MorningNewsRespVO.class,
+                BeanUtils.toBean(list, MorningNewsRespVO.class));
+    }
+
+}

+ 9 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/admin/enterprise/EnterpriseBusinessController.java

@@ -70,6 +70,15 @@ public class EnterpriseBusinessController {
         return success(BeanUtils.toBean(enterpriseBusiness, EnterpriseBusinessRespVO.class));
     }
 
+    @GetMapping("/get/by")
+    @Operation(summary = "根据企业id获得企业工商信息")
+    @Parameter(name = "id", description = "企业编号", required = true, example = "1024")
+    @PreAuthorize("@ss.hasPermission('menduner:system:enterprise-business:query')")
+    public CommonResult<EnterpriseBusinessRespVO> getByEnterpriseId(@RequestParam("enterpriseId") Long enterpriseId) {
+        EnterpriseBusinessDO enterpriseBusiness = enterpriseBusinessService.getByEnterpriseId(enterpriseId);
+        return success(BeanUtils.toBean(enterpriseBusiness, EnterpriseBusinessRespVO.class));
+    }
+
     @GetMapping("/page")
     @Operation(summary = "获得企业工商信息分页")
     @PreAuthorize("@ss.hasPermission('menduner:system:enterprise-business:query')")

+ 9 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/admin/enterprise/EnterpriseController.java

@@ -104,4 +104,13 @@ public class EnterpriseController {
         return success(true);
     }
 
+    @PutMapping("/update/pub-job-type-perm")
+    @Operation(summary = "更新企业发布职位类型权限")
+    @PreAuthorize("@ss.hasPermission('menduner:system:enterprise:update')")
+    public CommonResult<Boolean> updatePubJobTypePerm(@Valid @RequestBody EnterprisePubJobTypePermUpdateReqVO reqVO) {
+        enterpriseService.updatePubJobTypePerm(reqVO);
+        return success(true);
+    }
+
+
 }

+ 95 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/admin/enterprise/EnterprisePackageController.java

@@ -0,0 +1,95 @@
+package com.citu.module.menduner.system.controller.admin.enterprise;
+
+
+import com.citu.framework.apilog.core.annotation.ApiAccessLog;
+import com.citu.framework.common.pojo.CommonResult;
+import com.citu.framework.common.pojo.PageParam;
+import com.citu.framework.common.pojo.PageResult;
+import com.citu.framework.common.util.object.BeanUtils;
+import com.citu.framework.excel.core.util.ExcelUtils;
+import com.citu.module.menduner.system.controller.base.enterprise.vip.EnterprisePackagePageReqVO;
+import com.citu.module.menduner.system.controller.base.enterprise.vip.EnterprisePackageRespVO;
+import com.citu.module.menduner.system.controller.base.enterprise.vip.EnterprisePackageSaveReqVO;
+import com.citu.module.menduner.system.dal.dataobject.enterprise.EnterprisePackageDO;
+import com.citu.module.menduner.system.service.enterprise.vip.EnterprisePackageService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.Valid;
+import java.io.IOException;
+import java.util.List;
+
+import static com.citu.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
+import static com.citu.framework.common.pojo.CommonResult.success;
+
+
+@Tag(name = "管理后台 - 企业套餐")
+@RestController
+@RequestMapping("/menduner/system/enterprise-package")
+@Validated
+public class EnterprisePackageController {
+
+    @Resource
+    private EnterprisePackageService enterprisePackageService;
+
+    @PostMapping("/create")
+    @Operation(summary = "创建企业套餐")
+    @PreAuthorize("@ss.hasPermission('menduner:system:enterprise-package:create')")
+    public CommonResult<Long> createEnterprisePackage(@Valid @RequestBody EnterprisePackageSaveReqVO createReqVO) {
+        return success(enterprisePackageService.createEnterprisePackage(createReqVO));
+    }
+
+    @PutMapping("/update")
+    @Operation(summary = "更新企业套餐")
+    @PreAuthorize("@ss.hasPermission('menduner:system:enterprise-package:update')")
+    public CommonResult<Boolean> updateEnterprisePackage(@Valid @RequestBody EnterprisePackageSaveReqVO updateReqVO) {
+        enterprisePackageService.updateEnterprisePackage(updateReqVO);
+        return success(true);
+    }
+
+    @DeleteMapping("/delete")
+    @Operation(summary = "删除企业套餐")
+    @Parameter(name = "id", description = "编号", required = true)
+    @PreAuthorize("@ss.hasPermission('menduner:system:enterprise-package:delete')")
+    public CommonResult<Boolean> deleteEnterprisePackage(@RequestParam("id") Long id) {
+        enterprisePackageService.deleteEnterprisePackage(id);
+        return success(true);
+    }
+
+    @GetMapping("/get")
+    @Operation(summary = "获得企业套餐")
+    @Parameter(name = "id", description = "编号", required = true, example = "1024")
+    @PreAuthorize("@ss.hasPermission('menduner:system:enterprise-package:query')")
+    public CommonResult<EnterprisePackageRespVO> getEnterprisePackage(@RequestParam("id") Long id) {
+        EnterprisePackageDO enterprisePackage = enterprisePackageService.getEnterprisePackage(id);
+        return success(BeanUtils.toBean(enterprisePackage, EnterprisePackageRespVO.class));
+    }
+
+    @GetMapping("/page")
+    @Operation(summary = "获得企业套餐分页")
+    @PreAuthorize("@ss.hasPermission('menduner:system:enterprise-package:query')")
+    public CommonResult<PageResult<EnterprisePackageRespVO>> getEnterprisePackagePage(@Valid EnterprisePackagePageReqVO pageReqVO) {
+        PageResult<EnterprisePackageDO> pageResult = enterprisePackageService.getEnterprisePackagePage(pageReqVO);
+        return success(BeanUtils.toBean(pageResult, EnterprisePackageRespVO.class));
+    }
+
+    @GetMapping("/export-excel")
+    @Operation(summary = "导出企业套餐 Excel")
+    @PreAuthorize("@ss.hasPermission('menduner:system:enterprise-package:export')")
+    @ApiAccessLog(operateType = EXPORT)
+    public void exportEnterprisePackageExcel(@Valid EnterprisePackagePageReqVO pageReqVO,
+                                             HttpServletResponse response) throws IOException {
+        pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+        List<EnterprisePackageDO> list = enterprisePackageService.getEnterprisePackagePage(pageReqVO).getList();
+        // 导出 Excel
+        ExcelUtils.write(response, "企业套餐.xls", "数据", EnterprisePackageRespVO.class,
+                BeanUtils.toBean(list, EnterprisePackageRespVO.class));
+    }
+
+}

+ 52 - 41
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/admin/job/JobAdvertisedController.java

@@ -1,19 +1,15 @@
 package com.citu.module.menduner.system.controller.admin.job;
 
 
-import com.citu.framework.apilog.core.annotation.ApiAccessLog;
 import com.citu.framework.common.pojo.CommonResult;
-import com.citu.framework.common.pojo.PageParam;
 import com.citu.framework.common.pojo.PageResult;
 import com.citu.framework.common.util.object.BeanUtils;
-import com.citu.framework.dict.core.DictFrameworkUtils;
-import com.citu.framework.excel.core.util.ExcelUtils;
+import com.citu.framework.common.util.string.StrUtils;
 import com.citu.module.menduner.system.controller.base.job.JobAdvertisedPageReqVO;
-import com.citu.module.menduner.system.controller.base.job.JobAdvertisedReqVO;
+import com.citu.module.menduner.system.controller.base.job.JobAdvertisedRenewalReqVO;
 import com.citu.module.menduner.system.controller.base.job.JobAdvertisedRespVO;
 import com.citu.module.menduner.system.controller.base.job.JobAdvertisedSaveReqVO;
 import com.citu.module.menduner.system.dal.dataobject.job.JobAdvertisedDO;
-import com.citu.module.menduner.system.enums.MendunerStatusEnum;
 import com.citu.module.menduner.system.service.job.JobAdvertisedService;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.Parameter;
@@ -23,12 +19,8 @@ import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
-import javax.servlet.http.HttpServletResponse;
 import javax.validation.Valid;
-import java.io.IOException;
-import java.util.List;
 
-import static com.citu.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
 import static com.citu.framework.common.pojo.CommonResult.success;
 
 @Tag(name = "管理后台 - 招聘职位")
@@ -55,15 +47,6 @@ public class JobAdvertisedController {
         return success(true);
     }
 
-    @DeleteMapping("/delete")
-    @Operation(summary = "删除招聘职位")
-    @Parameter(name = "id", description = "编号", required = true)
-    @PreAuthorize("@ss.hasPermission('menduner:system:job-advertised:delete')")
-    public CommonResult<Boolean> deleteJobAdvertised(@RequestParam("id") Long id) {
-        jobAdvertisedService.deleteJobAdvertised(id);
-        return success(true);
-    }
-
     @GetMapping("/get")
     @Operation(summary = "获得招聘职位")
     @Parameter(name = "id", description = "编号", required = true, example = "1024")
@@ -74,33 +57,13 @@ public class JobAdvertisedController {
     }
 
     @GetMapping("/page")
-    @Operation(summary = "获得聘职位分页")
+    @Operation(summary = "获得全员猎聘职位分页")
     @PreAuthorize("@ss.hasPermission('menduner:system:job-advertised:query')")
     public CommonResult<PageResult<JobAdvertisedRespVO>> getJobAdvertisedPage(@Valid JobAdvertisedPageReqVO pageReqVO) {
-        PageResult<JobAdvertisedDO> pageResult = jobAdvertisedService.getJobAdvertisedPage(pageReqVO);
+        PageResult<JobAdvertisedDO> pageResult = jobAdvertisedService.getHireJobPage(pageReqVO);
         return success(BeanUtils.toBean(pageResult, JobAdvertisedRespVO.class));
     }
 
-    @GetMapping("/list")
-    @Operation(summary = "获得招聘职位列表")
-    @PreAuthorize("@ss.hasPermission('menduner:system:job-advertised:query')")
-    public CommonResult<List<JobAdvertisedRespVO>> getJobAdvertisedList(@Valid JobAdvertisedReqVO reqVO) {
-        List<JobAdvertisedDO> list = jobAdvertisedService.list(reqVO);
-        return success(BeanUtils.toBean(list, JobAdvertisedRespVO.class));
-    }
-
-    @GetMapping("/export-excel")
-    @Operation(summary = "导出招聘职位 Excel")
-    @PreAuthorize("@ss.hasPermission('menduner:system:job-advertised:export')")
-    @ApiAccessLog(operateType = EXPORT)
-    public void exportJobAdvertisedExcel(@Valid JobAdvertisedPageReqVO pageReqVO,
-                                         HttpServletResponse response) throws IOException {
-        pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
-        List<JobAdvertisedDO> list = jobAdvertisedService.getJobAdvertisedPage(pageReqVO).getList();
-        // 导出 Excel
-        ExcelUtils.write(response, "招聘职位.xls", "数据", JobAdvertisedRespVO.class,
-                BeanUtils.toBean(list, JobAdvertisedRespVO.class));
-    }
 
     @GetMapping("/sync/graph")
     @Operation(summary = "同步知识图谱数据")
@@ -109,4 +72,52 @@ public class JobAdvertisedController {
         return success(true);
     }
 
+    @PostMapping("/enable")
+    @Operation(summary = "开启职位")
+    @PreAuthorize("@ss.hasPermission('menduner:system:job-advertised:update')")
+    public CommonResult<Boolean> enable(@RequestParam("ids") String ids) {
+        jobAdvertisedService.enable(StrUtils.splitToLong(ids));
+        return success(true);
+    }
+
+    @PostMapping("/disable")
+    @Operation(summary = "关闭职位")
+    @PreAuthorize("@ss.hasPermission('menduner:system:job-advertised:update')")
+    public CommonResult<Boolean> disable(@RequestParam("ids") String ids) {
+        jobAdvertisedService.disable(StrUtils.splitToLong(ids));
+        return success(true);
+    }
+
+    @PostMapping("/refresh")
+    @Operation(summary = "刷新职位")
+    @PreAuthorize("@ss.hasPermission('menduner:system:job-advertised:update')")
+    public CommonResult<Boolean> refresh(@RequestParam("ids") String ids) {
+        jobAdvertisedService.refresh(StrUtils.splitToLong(ids));
+        return success(true);
+    }
+
+    @PostMapping("/top")
+    @Operation(summary = "职位置顶")
+    @PreAuthorize("@ss.hasPermission('menduner:system:job-advertised:update')")
+    public CommonResult<Boolean> top(@RequestParam("ids") String ids) {
+        jobAdvertisedService.top(StrUtils.splitToLong(ids));
+        return success(true);
+    }
+
+    @PostMapping("/un-top")
+    @Operation(summary = "取消职位置顶")
+    @PreAuthorize("@ss.hasPermission('menduner:system:job-advertised:update')")
+    public CommonResult<Boolean> unTop(@RequestParam("ids") String ids) {
+        jobAdvertisedService.unTop(StrUtils.splitToLong(ids));
+        return success(true);
+    }
+
+    @PostMapping("/renewal")
+    @Operation(summary = "职位续期")
+    @PreAuthorize("@ss.hasPermission('menduner:system:job-advertised:update')")
+    public CommonResult<Boolean> renewal(@RequestBody @Valid JobAdvertisedRenewalReqVO reqVO) {
+        jobAdvertisedService.renewal(reqVO);
+        return success(true);
+    }
+
 }

+ 95 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/admin/job/JobFairController.java

@@ -0,0 +1,95 @@
+package com.citu.module.menduner.system.controller.admin.job;
+
+
+import com.citu.framework.apilog.core.annotation.ApiAccessLog;
+import com.citu.framework.common.pojo.CommonResult;
+import com.citu.framework.common.pojo.PageParam;
+import com.citu.framework.common.pojo.PageResult;
+import com.citu.framework.common.util.object.BeanUtils;
+import com.citu.framework.excel.core.util.ExcelUtils;
+import com.citu.module.menduner.system.controller.base.job.fair.JobFairPageReqVO;
+import com.citu.module.menduner.system.controller.base.job.fair.JobFairRespVO;
+import com.citu.module.menduner.system.controller.base.job.fair.JobFairSaveReqVO;
+import com.citu.module.menduner.system.dal.dataobject.job.JobFairDO;
+import com.citu.module.menduner.system.service.job.fair.JobFairService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.Valid;
+import java.io.IOException;
+import java.util.List;
+
+import static com.citu.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
+import static com.citu.framework.common.pojo.CommonResult.success;
+
+
+@Tag(name = "管理后台 - 招聘会")
+@RestController
+@RequestMapping("/menduner/system/job-fair")
+@Validated
+public class JobFairController {
+
+    @Resource
+    private JobFairService jobFairService;
+
+    @PostMapping("/create")
+    @Operation(summary = "创建招聘会")
+    @PreAuthorize("@ss.hasPermission('menduner:system:job-fair:create')")
+    public CommonResult<Long> createJobFair(@Valid @RequestBody JobFairSaveReqVO createReqVO) {
+        return success(jobFairService.createJobFair(createReqVO));
+    }
+
+    @PutMapping("/update")
+    @Operation(summary = "更新招聘会")
+    @PreAuthorize("@ss.hasPermission('menduner:system:job-fair:update')")
+    public CommonResult<Boolean> updateJobFair(@Valid @RequestBody JobFairSaveReqVO updateReqVO) {
+        jobFairService.updateJobFair(updateReqVO);
+        return success(true);
+    }
+
+    @DeleteMapping("/delete")
+    @Operation(summary = "删除招聘会")
+    @Parameter(name = "id", description = "编号", required = true)
+    @PreAuthorize("@ss.hasPermission('menduner:system:job-fair:delete')")
+    public CommonResult<Boolean> deleteJobFair(@RequestParam("id") Long id) {
+        jobFairService.deleteJobFair(id);
+        return success(true);
+    }
+
+    @GetMapping("/get")
+    @Operation(summary = "获得招聘会")
+    @Parameter(name = "id", description = "编号", required = true, example = "1024")
+    @PreAuthorize("@ss.hasPermission('menduner:system:job-fair:query')")
+    public CommonResult<JobFairRespVO> getJobFair(@RequestParam("id") Long id) {
+        JobFairDO jobFair = jobFairService.getJobFair(id);
+        return success(BeanUtils.toBean(jobFair, JobFairRespVO.class));
+    }
+
+    @GetMapping("/page")
+    @Operation(summary = "获得招聘会分页")
+    @PreAuthorize("@ss.hasPermission('menduner:system:job-fair:query')")
+    public CommonResult<PageResult<JobFairRespVO>> getJobFairPage(@Valid JobFairPageReqVO pageReqVO) {
+        PageResult<JobFairDO> pageResult = jobFairService.getJobFairPage(pageReqVO);
+        return success(BeanUtils.toBean(pageResult, JobFairRespVO.class));
+    }
+
+    @GetMapping("/export-excel")
+    @Operation(summary = "导出招聘会 Excel")
+    @PreAuthorize("@ss.hasPermission('menduner:system:job-fair:export')")
+    @ApiAccessLog(operateType = EXPORT)
+    public void exportJobFairExcel(@Valid JobFairPageReqVO pageReqVO,
+                                   HttpServletResponse response) throws IOException {
+        pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+        List<JobFairDO> list = jobFairService.getJobFairPage(pageReqVO).getList();
+        // 导出 Excel
+        ExcelUtils.write(response, "招聘会.xls", "数据", JobFairRespVO.class,
+                BeanUtils.toBean(list, JobFairRespVO.class));
+    }
+
+}

+ 1 - 1
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/admin/order/TradeOrderController.java

@@ -38,7 +38,7 @@ public class TradeOrderController {
     @Operation(summary = "创建订单")
     @PreAuthorize("@ss.hasPermission('menduner:system:trade-order:create')")
     public CommonResult<Long> createOrder(@Valid @RequestBody TradeOrderCreateReqVO createReqVO) {
-        return success(tradeOrderService.createOrder(createReqVO));
+        return success(tradeOrderService.createOrder(createReqVO,null));
     }
 
     @GetMapping("/page")

+ 10 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/admin/position/PositionController.java

@@ -6,6 +6,8 @@ import com.citu.framework.common.pojo.PageParam;
 import com.citu.framework.common.pojo.PageResult;
 import com.citu.framework.common.util.object.BeanUtils;
 import com.citu.framework.excel.core.util.ExcelUtils;
+import com.citu.module.menduner.system.controller.app.jobhunt.position.vo.AppPositionChildrenRespVO;
+import com.citu.module.menduner.system.controller.app.jobhunt.position.vo.AppPositionListReqVO;
 import com.citu.module.menduner.system.controller.base.position.PositionListReqVO;
 import com.citu.module.menduner.system.controller.base.position.PositionPageReqVO;
 import com.citu.module.menduner.system.controller.base.position.PositionRespVO;
@@ -100,6 +102,14 @@ public class PositionController {
                 BeanUtils.toBean(list, PositionRespVO.class));
     }
 
+    @GetMapping("/get/tree")
+    @Operation(summary = "获取职位树形")
+    public CommonResult<List<AppPositionChildrenRespVO>> getPosition(@Valid AppPositionListReqVO listReqVO) {
+        List<AppPositionChildrenRespVO> list = positionService.getPosition(listReqVO);
+        return success(list);
+    }
+
+
     @GetMapping("/sync/boss")
     @Operation(summary = "同步Boss职位类型")
     public void syncBossPosition() {

+ 94 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/admin/redeem/RedeemController.java

@@ -0,0 +1,94 @@
+package com.citu.module.menduner.system.controller.admin.redeem;
+
+
+import com.citu.framework.apilog.core.annotation.ApiAccessLog;
+import com.citu.framework.common.pojo.CommonResult;
+import com.citu.framework.common.pojo.PageParam;
+import com.citu.framework.common.pojo.PageResult;
+import com.citu.framework.common.util.object.BeanUtils;
+import com.citu.framework.excel.core.util.ExcelUtils;
+import com.citu.module.menduner.system.controller.base.redeem.RedeemPageReqVO;
+import com.citu.module.menduner.system.controller.base.redeem.RedeemRespVO;
+import com.citu.module.menduner.system.controller.base.redeem.RedeemSaveReqVO;
+import com.citu.module.menduner.system.dal.dataobject.redeem.RedeemDO;
+import com.citu.module.menduner.system.service.redeem.RedeemService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.Valid;
+import java.io.IOException;
+import java.util.List;
+
+import static com.citu.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
+import static com.citu.framework.common.pojo.CommonResult.success;
+
+@Tag(name = "管理后台 - 兑换")
+@RestController
+@RequestMapping("/menduner/system/redeem")
+@Validated
+public class RedeemController {
+
+    @Resource
+    private RedeemService redeemService;
+
+    @PostMapping("/create")
+    @Operation(summary = "创建兑换")
+    @PreAuthorize("@ss.hasPermission('menduner:system:redeem:create')")
+    public CommonResult<Long> createRedeem(@Valid @RequestBody RedeemSaveReqVO createReqVO) {
+        return success(redeemService.createRedeem(createReqVO));
+    }
+
+    @PutMapping("/update")
+    @Operation(summary = "更新兑换")
+    @PreAuthorize("@ss.hasPermission('menduner:system:redeem:update')")
+    public CommonResult<Boolean> updateRedeem(@Valid @RequestBody RedeemSaveReqVO updateReqVO) {
+        redeemService.updateRedeem(updateReqVO);
+        return success(true);
+    }
+
+    @DeleteMapping("/delete")
+    @Operation(summary = "删除兑换")
+    @Parameter(name = "id", description = "编号", required = true)
+    @PreAuthorize("@ss.hasPermission('menduner:system:redeem:delete')")
+    public CommonResult<Boolean> deleteRedeem(@RequestParam("id") Long id) {
+        redeemService.deleteRedeem(id);
+        return success(true);
+    }
+
+    @GetMapping("/get")
+    @Operation(summary = "获得兑换")
+    @Parameter(name = "id", description = "编号", required = true, example = "1024")
+    @PreAuthorize("@ss.hasPermission('menduner:system:redeem:query')")
+    public CommonResult<RedeemRespVO> getRedeem(@RequestParam("id") Long id) {
+        RedeemDO redeem = redeemService.getRedeem(id);
+        return success(BeanUtils.toBean(redeem, RedeemRespVO.class));
+    }
+
+    @GetMapping("/page")
+    @Operation(summary = "获得兑换分页")
+    @PreAuthorize("@ss.hasPermission('menduner:system:redeem:query')")
+    public CommonResult<PageResult<RedeemRespVO>> getRedeemPage(@Valid RedeemPageReqVO pageReqVO) {
+        PageResult<RedeemDO> pageResult = redeemService.getRedeemPage(pageReqVO);
+        return success(BeanUtils.toBean(pageResult, RedeemRespVO.class));
+    }
+
+    @GetMapping("/export-excel")
+    @Operation(summary = "导出兑换 Excel")
+    @PreAuthorize("@ss.hasPermission('menduner:system:redeem:export')")
+    @ApiAccessLog(operateType = EXPORT)
+    public void exportRedeemExcel(@Valid RedeemPageReqVO pageReqVO,
+                                  HttpServletResponse response) throws IOException {
+        pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+        List<RedeemDO> list = redeemService.getRedeemPage(pageReqVO).getList();
+        // 导出 Excel
+        ExcelUtils.write(response, "兑换.xls", "数据", RedeemRespVO.class,
+                BeanUtils.toBean(list, RedeemRespVO.class));
+    }
+
+}

+ 2 - 4
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/admin/user/UserAccountController.java

@@ -11,11 +11,9 @@ import com.citu.module.menduner.system.controller.admin.user.vo.UserAccountPageR
 import com.citu.module.menduner.system.controller.base.account.AccountPointUpdateReqVO;
 import com.citu.module.menduner.system.controller.base.user.account.UserAccountPageReqVO;
 import com.citu.module.menduner.system.controller.base.user.account.UserAccountRespVO;
-import com.citu.module.menduner.system.controller.base.workexp.WorkExpRespVO;
 import com.citu.module.menduner.system.dal.dataobject.user.UserAccountDO;
-import com.citu.module.menduner.system.dal.dataobject.workexp.WorkExpDO;
-import com.citu.module.menduner.system.enums.MathOperationEnum;
-import com.citu.module.menduner.system.enums.account.PointBizTypeEnum;
+import com.citu.module.menduner.common.enums.MathOperationEnum;
+import com.citu.module.menduner.common.enums.PointBizTypeEnum;
 import com.citu.module.menduner.system.service.record.UserAccountRecordService;
 import com.citu.module.menduner.system.service.user.UserAccountService;
 import io.swagger.v3.oas.annotations.Operation;

+ 94 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/admin/user/UserEntitlementController.java

@@ -0,0 +1,94 @@
+package com.citu.module.menduner.system.controller.admin.user;
+
+
+import com.citu.framework.apilog.core.annotation.ApiAccessLog;
+import com.citu.framework.common.pojo.CommonResult;
+import com.citu.framework.common.pojo.PageParam;
+import com.citu.framework.common.pojo.PageResult;
+import com.citu.framework.common.util.object.BeanUtils;
+import com.citu.framework.excel.core.util.ExcelUtils;
+import com.citu.module.menduner.system.controller.base.user.vip.UserEntitlementPageReqVO;
+import com.citu.module.menduner.system.controller.base.user.vip.UserEntitlementRespVO;
+import com.citu.module.menduner.system.controller.base.user.vip.UserEntitlementSaveReqVO;
+import com.citu.module.menduner.system.dal.dataobject.user.UserEntitlementDO;
+import com.citu.module.menduner.system.service.user.UserEntitlementService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.Valid;
+import java.io.IOException;
+import java.util.List;
+
+import static com.citu.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
+import static com.citu.framework.common.pojo.CommonResult.success;
+
+@Tag(name = "管理后台 - 用户权益记录")
+@RestController
+@RequestMapping("/menduner/system/user-entitlement")
+@Validated
+public class UserEntitlementController {
+
+    @Resource
+    private UserEntitlementService userEntitlementService;
+
+    @PostMapping("/create")
+    @Operation(summary = "创建用户权益记录")
+    @PreAuthorize("@ss.hasPermission('menduner:system:user-entitlement:create')")
+    public CommonResult<Long> createUserEntitlement(@Valid @RequestBody UserEntitlementSaveReqVO createReqVO) {
+        return success(userEntitlementService.createUserEntitlement(createReqVO));
+    }
+
+    @PutMapping("/update")
+    @Operation(summary = "更新用户权益记录")
+    @PreAuthorize("@ss.hasPermission('menduner:system:user-entitlement:update')")
+    public CommonResult<Boolean> updateUserEntitlement(@Valid @RequestBody UserEntitlementSaveReqVO updateReqVO) {
+        userEntitlementService.updateUserEntitlement(updateReqVO);
+        return success(true);
+    }
+
+    @DeleteMapping("/delete")
+    @Operation(summary = "删除用户权益记录")
+    @Parameter(name = "id", description = "编号", required = true)
+    @PreAuthorize("@ss.hasPermission('menduner:system:user-entitlement:delete')")
+    public CommonResult<Boolean> deleteUserEntitlement(@RequestParam("id") Long id) {
+        userEntitlementService.deleteUserEntitlement(id);
+        return success(true);
+    }
+
+    @GetMapping("/get")
+    @Operation(summary = "获得用户权益记录")
+    @Parameter(name = "id", description = "编号", required = true, example = "1024")
+    @PreAuthorize("@ss.hasPermission('menduner:system:user-entitlement:query')")
+    public CommonResult<UserEntitlementRespVO> getUserEntitlement(@RequestParam("id") Long id) {
+        UserEntitlementDO userEntitlement = userEntitlementService.getUserEntitlement(id);
+        return success(BeanUtils.toBean(userEntitlement, UserEntitlementRespVO.class));
+    }
+
+    @GetMapping("/page")
+    @Operation(summary = "获得用户权益记录分页")
+    @PreAuthorize("@ss.hasPermission('menduner:system:user-entitlement:query')")
+    public CommonResult<PageResult<UserEntitlementRespVO>> getUserEntitlementPage(@Valid UserEntitlementPageReqVO pageReqVO) {
+        PageResult<UserEntitlementDO> pageResult = userEntitlementService.getUserEntitlementPage(pageReqVO);
+        return success(BeanUtils.toBean(pageResult, UserEntitlementRespVO.class));
+    }
+
+    @GetMapping("/export-excel")
+    @Operation(summary = "导出用户权益记录 Excel")
+    @PreAuthorize("@ss.hasPermission('menduner:system:user-entitlement:export')")
+    @ApiAccessLog(operateType = EXPORT)
+    public void exportUserEntitlementExcel(@Valid UserEntitlementPageReqVO pageReqVO,
+                                           HttpServletResponse response) throws IOException {
+        pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+        List<UserEntitlementDO> list = userEntitlementService.getUserEntitlementPage(pageReqVO).getList();
+        // 导出 Excel
+        ExcelUtils.write(response, "用户权益记录.xls", "数据", UserEntitlementRespVO.class,
+                BeanUtils.toBean(list, UserEntitlementRespVO.class));
+    }
+
+}

+ 94 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/admin/user/UserPackageController.java

@@ -0,0 +1,94 @@
+package com.citu.module.menduner.system.controller.admin.user;
+
+
+import com.citu.framework.apilog.core.annotation.ApiAccessLog;
+import com.citu.framework.common.pojo.CommonResult;
+import com.citu.framework.common.pojo.PageParam;
+import com.citu.framework.common.pojo.PageResult;
+import com.citu.framework.common.util.object.BeanUtils;
+import com.citu.framework.excel.core.util.ExcelUtils;
+import com.citu.module.menduner.system.controller.base.user.vip.UserPackagePageReqVO;
+import com.citu.module.menduner.system.controller.base.user.vip.UserPackageRespVO;
+import com.citu.module.menduner.system.controller.base.user.vip.UserPackageSaveReqVO;
+import com.citu.module.menduner.system.dal.dataobject.user.UserPackageDO;
+import com.citu.module.menduner.system.service.user.UserPackageService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.Valid;
+import java.io.IOException;
+import java.util.List;
+
+import static com.citu.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
+import static com.citu.framework.common.pojo.CommonResult.success;
+
+@Tag(name = "管理后台 - 用户套餐")
+@RestController
+@RequestMapping("/menduner/system/user-package")
+@Validated
+public class UserPackageController {
+
+    @Resource
+    private UserPackageService userPackageService;
+
+    @PostMapping("/create")
+    @Operation(summary = "创建用户套餐")
+    @PreAuthorize("@ss.hasPermission('menduner:system:user-package:create')")
+    public CommonResult<Long> createUserPackage(@Valid @RequestBody UserPackageSaveReqVO createReqVO) {
+        return success(userPackageService.createUserPackage(createReqVO));
+    }
+
+    @PutMapping("/update")
+    @Operation(summary = "更新用户套餐")
+    @PreAuthorize("@ss.hasPermission('menduner:system:user-package:update')")
+    public CommonResult<Boolean> updateUserPackage(@Valid @RequestBody UserPackageSaveReqVO updateReqVO) {
+        userPackageService.updateUserPackage(updateReqVO);
+        return success(true);
+    }
+
+    @DeleteMapping("/delete")
+    @Operation(summary = "删除用户套餐")
+    @Parameter(name = "id", description = "编号", required = true)
+    @PreAuthorize("@ss.hasPermission('menduner:system:user-package:delete')")
+    public CommonResult<Boolean> deleteUserPackage(@RequestParam("id") Long id) {
+        userPackageService.deleteUserPackage(id);
+        return success(true);
+    }
+
+    @GetMapping("/get")
+    @Operation(summary = "获得用户套餐")
+    @Parameter(name = "id", description = "编号", required = true, example = "1024")
+    @PreAuthorize("@ss.hasPermission('menduner:system:user-package:query')")
+    public CommonResult<UserPackageRespVO> getUserPackage(@RequestParam("id") Long id) {
+        UserPackageDO userPackage = userPackageService.getUserPackage(id);
+        return success(BeanUtils.toBean(userPackage, UserPackageRespVO.class));
+    }
+
+    @GetMapping("/page")
+    @Operation(summary = "获得用户套餐分页")
+    @PreAuthorize("@ss.hasPermission('menduner:system:user-package:query')")
+    public CommonResult<PageResult<UserPackageRespVO>> getUserPackagePage(@Valid UserPackagePageReqVO pageReqVO) {
+        PageResult<UserPackageDO> pageResult = userPackageService.getUserPackagePage(pageReqVO);
+        return success(BeanUtils.toBean(pageResult, UserPackageRespVO.class));
+    }
+
+    @GetMapping("/export-excel")
+    @Operation(summary = "导出用户套餐 Excel")
+    @PreAuthorize("@ss.hasPermission('menduner:system:user-package:export')")
+    @ApiAccessLog(operateType = EXPORT)
+    public void exportUserPackageExcel(@Valid UserPackagePageReqVO pageReqVO,
+                                       HttpServletResponse response) throws IOException {
+        pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+        List<UserPackageDO> list = userPackageService.getUserPackagePage(pageReqVO).getList();
+        // 导出 Excel
+        ExcelUtils.write(response, "用户套餐.xls", "数据", UserPackageRespVO.class,
+                BeanUtils.toBean(list, UserPackageRespVO.class));
+    }
+
+}

+ 12 - 3
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/app/jobhunt/auth/AppMdeAuthController.java → menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/app/common/auth/AppMdeAuthController.java

@@ -1,4 +1,4 @@
-package com.citu.module.menduner.system.controller.app.jobhunt.auth;
+package com.citu.module.menduner.system.controller.app.common.auth;
 
 import cn.hutool.core.util.StrUtil;
 import com.citu.framework.common.enums.UserTypeEnum;
@@ -6,7 +6,8 @@ import com.citu.framework.common.pojo.CommonResult;
 import com.citu.framework.security.config.SecurityProperties;
 import com.citu.framework.security.core.util.SecurityFrameworkUtils;
 import com.citu.module.menduner.common.util.LoginUserContext;
-import com.citu.module.menduner.system.controller.app.jobhunt.auth.vo.*;
+import com.citu.module.menduner.system.controller.app.common.auth.vo.*;
+import com.citu.module.menduner.system.controller.app.jobhunt.user.vo.AppMdeUserResetPasswordReqVO;
 import com.citu.module.menduner.system.convert.MdeAuthConvert;
 import com.citu.module.menduner.system.service.auth.MdeAuthService;
 import com.citu.module.system.api.social.SocialClientApi;
@@ -26,7 +27,7 @@ import javax.validation.Valid;
 
 import static com.citu.framework.common.pojo.CommonResult.success;
 
-@Tag(name = "求职端 - 用户登录")
+@Tag(name = "公共 - 用户登录")
 @RestController
 @RequestMapping("/menduner/system/auth")
 @Validated
@@ -68,6 +69,14 @@ public class AppMdeAuthController {
         return success(authService.refreshToken(refreshToken));
     }
 
+    @PutMapping("/reset-password")
+    @Operation(summary = "重置密码", description = "用户忘记密码时使用")
+    public CommonResult<Boolean> resetUserPassword(@RequestBody @Valid AppMdeUserResetPasswordReqVO reqVO) {
+        authService.resetUserPassword(reqVO);
+        return success(true);
+    }
+
+
     // ========== 短信登录相关 ==========
 
     @PostMapping("/sms-login")

+ 2 - 2
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/app/jobhunt/auth/enterprise/AppEnterpriseAuthLoginReqVO.java → menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/app/common/auth/enterprise/AppEnterpriseAuthLoginReqVO.java

@@ -1,6 +1,6 @@
-package com.citu.module.menduner.system.controller.app.jobhunt.auth.enterprise;
+package com.citu.module.menduner.system.controller.app.common.auth.enterprise;
 
-import com.citu.module.menduner.system.controller.app.jobhunt.auth.vo.AppMdeAuthLoginReqVO;
+import com.citu.module.menduner.system.controller.app.common.auth.vo.AppMdeAuthLoginReqVO;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.AllArgsConstructor;
 import lombok.Builder;

+ 2 - 2
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/app/jobhunt/auth/enterprise/AppEnterpriseAuthSmsLoginReqVO.java → menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/app/common/auth/enterprise/AppEnterpriseAuthSmsLoginReqVO.java

@@ -1,6 +1,6 @@
-package com.citu.module.menduner.system.controller.app.jobhunt.auth.enterprise;
+package com.citu.module.menduner.system.controller.app.common.auth.enterprise;
 
-import com.citu.module.menduner.system.controller.app.jobhunt.auth.vo.AppMdeAuthSmsLoginReqVO;
+import com.citu.module.menduner.system.controller.app.common.auth.vo.AppMdeAuthSmsLoginReqVO;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 

+ 1 - 1
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/app/jobhunt/auth/enterprise/AppEnterpriseAuthSwitchLoginReqVO.java → menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/app/common/auth/enterprise/AppEnterpriseAuthSwitchLoginReqVO.java

@@ -1,4 +1,4 @@
-package com.citu.module.menduner.system.controller.app.jobhunt.auth.enterprise;
+package com.citu.module.menduner.system.controller.app.common.auth.enterprise;
 
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;

Daži faili netika attēloti, jo izmaiņu fails ir pārāk liels