Pārlūkot izejas kodu

1、优化用户套餐
2、增加用户套餐接口
3、优化订单处理逻辑

rayson 9 mēneši atpakaļ
vecāks
revīzija
b196a85f51
29 mainītis faili ar 1497 papildinājumiem un 22 dzēšanām
  1. 4 4
      citu-framework/citu-spring-boot-starter-web/src/main/java/com/citu/framework/apilog/core/interceptor/ApiAccessLogInterceptor.java
  2. 6 0
      menduner/menduner-system-api/src/main/java/com/citu/module/menduner/system/enums/ErrorCodeConstants.java
  3. 94 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/admin/user/UserEntitlementController.java
  4. 94 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/admin/user/UserPackageController.java
  5. 2 2
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/app/jobhunt/person/AppPersonController.java
  6. 8 2
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/app/jobhunt/user/AppMdeUserController.java
  7. 38 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/app/jobhunt/user/AppUserPackageController.java
  8. 5 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/app/jobhunt/user/vo/AppMdeUserRespVO.java
  9. 46 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/user/vip/UserEntitlementPageReqVO.java
  10. 52 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/user/vip/UserEntitlementRespVO.java
  11. 50 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/user/vip/UserEntitlementSaveReqVO.java
  12. 54 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/user/vip/UserPackagePageReqVO.java
  13. 76 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/user/vip/UserPackageRespVO.java
  14. 68 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/user/vip/UserPackageSaveReqVO.java
  15. 59 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/dataobject/user/UserEntitlementDO.java
  16. 83 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/dataobject/user/UserPackageDO.java
  17. 32 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/mysql/user/UserEntitlementMapper.java
  18. 35 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/mysql/user/UserPackageMapper.java
  19. 49 9
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/mq/consumer/UserMemberConsumer.java
  20. 1 1
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/person/block/PersonEnterpriseBlockService.java
  21. 3 3
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/person/block/PersonEnterpriseBlockServiceImpl.java
  22. 59 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/user/UserEntitlementService.java
  23. 75 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/user/UserEntitlementServiceImpl.java
  24. 64 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/user/UserPackageService.java
  25. 79 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/user/UserPackageServiceImpl.java
  26. 152 0
      menduner/menduner-system-biz/src/test/java/com/citu/module/menduner/system/service/user/UserEntitlementServiceImplTest.java
  27. 164 0
      menduner/menduner-system-biz/src/test/java/com/citu/module/menduner/system/service/user/UserPackageServiceImplTest.java
  28. 3 1
      menduner/menduner-system-biz/src/test/resources/sql/clean.sql
  29. 42 0
      menduner/menduner-system-biz/src/test/resources/sql/create_tables.sql

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

+ 6 - 0
menduner/menduner-system-api/src/main/java/com/citu/module/menduner/system/enums/ErrorCodeConstants.java

@@ -504,4 +504,10 @@ public interface ErrorCodeConstants {
 
     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, "用户套餐不存在");
+
+    // ========== 用户权益记录 1_100_052_000 ==========
+    ErrorCode USER_ENTITLEMENT_NOT_EXISTS = new ErrorCode(1_100_052_001, "用户权益记录不存在");
+
 }

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

+ 2 - 2
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/app/jobhunt/person/AppPersonController.java

@@ -87,8 +87,8 @@ public class AppPersonController {
     @PreAuthenticated
     @DeleteMapping("/enterprise-block/un-block")
     @Operation(summary = "屏蔽-取消屏蔽企业")
-    public CommonResult<Boolean> unBlock(@Valid @RequestBody PersonEnterpriseBlockSaveReqVO reqVO) {
-        blockService.unBlock(reqVO);
+    public CommonResult<Boolean> unBlock(@RequestParam("enterpriseId") Long enterpriseId) {
+        blockService.unBlock(enterpriseId);
         return success(true);
     }
 

+ 8 - 2
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/app/jobhunt/user/AppMdeUserController.java

@@ -1,17 +1,18 @@
 package com.citu.module.menduner.system.controller.app.jobhunt.user;
 
 
-import com.citu.framework.baiduaip.core.AipOcrClient;
 import com.citu.framework.common.pojo.CommonResult;
 import com.citu.framework.common.util.object.BeanUtils;
 import com.citu.framework.security.core.annotations.PreAuthenticated;
 import com.citu.module.menduner.common.util.LoginUserContext;
 import com.citu.module.menduner.system.controller.app.jobhunt.user.vo.*;
+import com.citu.module.menduner.system.controller.base.user.vip.UserEntitlementRespVO;
 import com.citu.module.menduner.system.convert.UserConvert;
 import com.citu.module.menduner.system.dal.dataobject.user.MdeUserDO;
 import com.citu.module.menduner.system.dal.dataobject.user.UserAccountDO;
 import com.citu.module.menduner.system.service.user.MdeUserService;
 import com.citu.module.menduner.system.service.user.UserAccountService;
+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;
@@ -35,13 +36,18 @@ public class AppMdeUserController {
     @Resource
     private UserAccountService userAccountService;
 
+    @Resource
+    private UserEntitlementService userEntitlementService;
+
     @GetMapping("/get")
     @Operation(summary = "获得用户信息")
     @Parameter(name = "id", description = "编号", required = true, example = "1024")
     @PreAuthenticated
     public CommonResult<AppMdeUserRespVO> getMdeUser(@RequestParam("id") Long id) {
         MdeUserDO mdeUser = mdeUserService.getMdeUser(id);
-        return success(BeanUtils.toBean(mdeUser, AppMdeUserRespVO.class));
+        AppMdeUserRespVO resp = BeanUtils.toBean(mdeUser, AppMdeUserRespVO.class);
+        resp.setEntitlement(BeanUtils.toBean(userEntitlementService.getByUserId(id), UserEntitlementRespVO.class));
+        return success(resp);
     }
 
     @GetMapping("/get/account")

+ 38 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/app/jobhunt/user/AppUserPackageController.java

@@ -0,0 +1,38 @@
+package com.citu.module.menduner.system.controller.app.jobhunt.user;
+
+
+import com.citu.framework.common.pojo.CommonResult;
+import com.citu.framework.common.util.object.BeanUtils;
+import com.citu.module.menduner.system.controller.base.user.vip.UserPackageRespVO;
+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.tags.Tag;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+import static com.citu.framework.common.pojo.CommonResult.success;
+
+@Tag(name = "求职端 - 用户套餐")
+@RestController
+@RequestMapping("/menduner/system/user-package")
+@Validated
+public class AppUserPackageController {
+
+    @Resource
+    private UserPackageService userPackageService;
+
+
+    @GetMapping("/list")
+    @Operation(summary = "获得用户套餐列表")
+    public CommonResult<List<UserPackageRespVO>> list() {
+        List<UserPackageDO> list = userPackageService.getList();
+        return success(BeanUtils.toBean(list, UserPackageRespVO.class));
+    }
+
+}

+ 5 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/app/jobhunt/user/vo/AppMdeUserRespVO.java

@@ -5,6 +5,7 @@ import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
 import com.alibaba.excel.annotation.ExcelProperty;
 import com.citu.framework.excel.core.annotations.DictFormat;
 import com.citu.framework.excel.core.convert.DictConvert;
+import com.citu.module.menduner.system.controller.base.user.vip.UserEntitlementRespVO;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 
@@ -70,4 +71,8 @@ public class AppMdeUserRespVO {
     @ExcelProperty("创建时间")
     private LocalDateTime createTime;
 
+    @Schema(description = "权益")
+    @ExcelProperty("权益")
+    private UserEntitlementRespVO entitlement;
+
 }

+ 46 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/user/vip/UserEntitlementPageReqVO.java

@@ -0,0 +1,46 @@
+package com.citu.module.menduner.system.controller.base.user.vip;
+
+
+import com.citu.framework.common.pojo.PageParam;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.time.LocalDateTime;
+
+import static com.citu.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
+
+@Schema(description = "管理后台 - 用户权益记录分页 Request VO")
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+public class UserEntitlementPageReqVO extends PageParam {
+
+    @Schema(description = "用户id", example = "12958")
+    private Long userId;
+
+    @Schema(description = "简历刷新次数", example = "24045")
+    private Integer resumeRefreshCount;
+
+    @Schema(description = "简历屏蔽")
+    private Boolean resumePrivacy;
+
+    @Schema(description = "优先推荐")
+    private Boolean priorityRecommend;
+
+    @Schema(description = "简历模板下载")
+    private Boolean resumeTemplate;
+
+    @Schema(description = "谁看过我")
+    private Boolean viewersList;
+
+    @Schema(description = "薪酬报告")
+    private Boolean salaryReport;
+
+    @Schema(description = "创建时间")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDateTime[] createTime;
+
+}

+ 52 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/user/vip/UserEntitlementRespVO.java

@@ -0,0 +1,52 @@
+package com.citu.module.menduner.system.controller.base.user.vip;
+
+
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+@Schema(description = "管理后台 - 用户权益记录 Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class UserEntitlementRespVO {
+
+    @Schema(description = "id", requiredMode = Schema.RequiredMode.REQUIRED, example = "2831")
+    @ExcelProperty("id")
+    private Long id;
+
+    @Schema(description = "用户id", requiredMode = Schema.RequiredMode.REQUIRED, example = "12958")
+    @ExcelProperty("用户id")
+    private Long userId;
+
+    @Schema(description = "简历刷新次数", requiredMode = Schema.RequiredMode.REQUIRED, example = "24045")
+    @ExcelProperty("简历刷新次数")
+    private Integer resumeRefreshCount;
+
+    @Schema(description = "简历屏蔽", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("简历屏蔽")
+    private Boolean resumePrivacy;
+
+    @Schema(description = "优先推荐", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("优先推荐")
+    private Boolean priorityRecommend;
+
+    @Schema(description = "简历模板下载", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("简历模板下载")
+    private Boolean resumeTemplate;
+
+    @Schema(description = "谁看过我", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("谁看过我")
+    private Boolean viewersList;
+
+    @Schema(description = "薪酬报告", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("薪酬报告")
+    private Boolean salaryReport;
+
+    @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("创建时间")
+    private LocalDateTime createTime;
+
+}

+ 50 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/user/vip/UserEntitlementSaveReqVO.java

@@ -0,0 +1,50 @@
+package com.citu.module.menduner.system.controller.base.user.vip;
+
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.validation.constraints.NotNull;
+
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+@Schema(description = "管理后台 - 用户权益记录新增/修改 Request VO")
+@Data
+public class UserEntitlementSaveReqVO {
+
+    @Schema(description = "id", requiredMode = Schema.RequiredMode.REQUIRED, example = "2831")
+    private Long id;
+
+    @Schema(description = "用户id", requiredMode = Schema.RequiredMode.REQUIRED, example = "12958")
+    @NotNull(message = "用户id不能为空")
+    private Long userId;
+
+    @Schema(description = "简历刷新次数", requiredMode = Schema.RequiredMode.REQUIRED, example = "24045")
+    @NotNull(message = "简历刷新次数不能为空")
+    private Integer resumeRefreshCount;
+
+    @Schema(description = "简历屏蔽", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotNull(message = "简历屏蔽不能为空")
+    private Boolean resumePrivacy;
+
+    @Schema(description = "优先推荐", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotNull(message = "优先推荐不能为空")
+    private Boolean priorityRecommend;
+
+    @Schema(description = "简历模板下载", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotNull(message = "简历模板下载不能为空")
+    private Boolean resumeTemplate;
+
+    @Schema(description = "谁看过我", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotNull(message = "谁看过我不能为空")
+    private Boolean viewersList;
+
+    @Schema(description = "薪酬报告", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotNull(message = "薪酬报告不能为空")
+    private Boolean salaryReport;
+
+}

+ 54 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/user/vip/UserPackagePageReqVO.java

@@ -0,0 +1,54 @@
+package com.citu.module.menduner.system.controller.base.user.vip;
+
+import com.citu.framework.common.pojo.PageParam;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.time.LocalDateTime;
+
+import static com.citu.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
+
+@Schema(description = "管理后台 - 用户套餐分页 Request VO")
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+public class UserPackagePageReqVO extends PageParam {
+
+    @Schema(description = "套餐名称", example = "赵六")
+    private String name;
+
+    @Schema(description = "是否推荐")
+    private Boolean recommend;
+
+    @Schema(description = "简历刷新次数", example = "17350")
+    private Integer resumeRefreshCount;
+
+    @Schema(description = "简历屏蔽")
+    private Boolean resumePrivacy;
+
+    @Schema(description = "优先推荐")
+    private Boolean priorityRecommend;
+
+    @Schema(description = "简历模板下载")
+    private Boolean resumeTemplate;
+
+    @Schema(description = "谁看过我")
+    private Boolean viewersList;
+
+    @Schema(description = "薪酬报告")
+    private Boolean salaryReport;
+
+    @Schema(description = "排序")
+    private Integer sort;
+
+    @Schema(description = "状态(0正常 1停用 2隐藏)", example = "1")
+    private String status;
+
+    @Schema(description = "创建时间")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDateTime[] createTime;
+
+}

+ 76 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/user/vip/UserPackageRespVO.java

@@ -0,0 +1,76 @@
+package com.citu.module.menduner.system.controller.base.user.vip;
+
+
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+@Schema(description = "管理后台 - 用户套餐 Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class UserPackageRespVO {
+
+    @Schema(description = "id", requiredMode = Schema.RequiredMode.REQUIRED, example = "30694")
+    @ExcelProperty("id")
+    private Long id;
+
+    @Schema(description = "套餐名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "赵六")
+    @ExcelProperty("套餐名称")
+    private String name;
+
+    @Schema(description = "套餐价格", requiredMode = Schema.RequiredMode.REQUIRED, example = "26437")
+    @ExcelProperty("套餐价格")
+    private Long price;
+
+    @Schema(description = "天数", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("天数")
+    private Integer day;
+
+    @Schema(description = "是否推荐", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("是否推荐")
+    private Boolean recommend;
+
+    @Schema(description = "说明文本", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("说明文本")
+    private String text;
+
+    @Schema(description = "简历刷新次数", requiredMode = Schema.RequiredMode.REQUIRED, example = "17350")
+    @ExcelProperty("简历刷新次数")
+    private Integer resumeRefreshCount;
+
+    @Schema(description = "简历屏蔽", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("简历屏蔽")
+    private Boolean resumePrivacy;
+
+    @Schema(description = "优先推荐", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("优先推荐")
+    private Boolean priorityRecommend;
+
+    @Schema(description = "简历模板下载", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("简历模板下载")
+    private Boolean resumeTemplate;
+
+    @Schema(description = "谁看过我", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("谁看过我")
+    private Boolean viewersList;
+
+    @Schema(description = "薪酬报告", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("薪酬报告")
+    private Boolean salaryReport;
+
+    @Schema(description = "排序")
+    @ExcelProperty("排序")
+    private Integer sort;
+
+    @Schema(description = "状态(0正常 1停用 2隐藏)", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+    @ExcelProperty("状态(0正常 1停用 2隐藏)")
+    private String status;
+
+    @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("创建时间")
+    private LocalDateTime createTime;
+
+}

+ 68 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/user/vip/UserPackageSaveReqVO.java

@@ -0,0 +1,68 @@
+package com.citu.module.menduner.system.controller.base.user.vip;
+
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+
+@Schema(description = "管理后台 - 用户套餐新增/修改 Request VO")
+@Data
+public class UserPackageSaveReqVO {
+
+    @Schema(description = "id", requiredMode = Schema.RequiredMode.REQUIRED, example = "30694")
+    private Long id;
+
+    @Schema(description = "套餐名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "赵六")
+    @NotEmpty(message = "套餐名称不能为空")
+    private String name;
+
+    @Schema(description = "套餐价格", requiredMode = Schema.RequiredMode.REQUIRED, example = "26437")
+    @NotNull(message = "套餐价格不能为空")
+    private Long price;
+
+    @Schema(description = "天数", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotNull(message = "天数不能为空")
+    private Integer day;
+
+    @Schema(description = "是否推荐", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotNull(message = "是否推荐不能为空")
+    private Boolean recommend;
+
+    @Schema(description = "说明文本", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotEmpty(message = "说明文本不能为空")
+    private String text;
+
+    @Schema(description = "简历刷新次数", requiredMode = Schema.RequiredMode.REQUIRED, example = "17350")
+    @NotNull(message = "简历刷新次数不能为空")
+    private Integer resumeRefreshCount;
+
+    @Schema(description = "简历屏蔽", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotNull(message = "简历屏蔽不能为空")
+    private Boolean resumePrivacy;
+
+    @Schema(description = "优先推荐", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotNull(message = "优先推荐不能为空")
+    private Boolean priorityRecommend;
+
+    @Schema(description = "简历模板下载", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotNull(message = "简历模板下载不能为空")
+    private Boolean resumeTemplate;
+
+    @Schema(description = "谁看过我", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotNull(message = "谁看过我不能为空")
+    private Boolean viewersList;
+
+    @Schema(description = "薪酬报告", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotNull(message = "薪酬报告不能为空")
+    private Boolean salaryReport;
+
+    @Schema(description = "排序")
+    private Integer sort;
+
+    @Schema(description = "状态(0正常 1停用 2隐藏)", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+    @NotEmpty(message = "状态(0正常 1停用 2隐藏)不能为空")
+    private String status;
+
+}

+ 59 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/dataobject/user/UserEntitlementDO.java

@@ -0,0 +1,59 @@
+package com.citu.module.menduner.system.dal.dataobject.user;
+
+
+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
+ *
+ * @author Rayson
+ */
+@TableName("mde_user_entitlement")
+@KeySequence("mde_user_entitlement_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class UserEntitlementDO extends BaseDO {
+
+    /**
+     * id
+     */
+    @TableId
+    private Long id;
+    /**
+     * 用户id
+     */
+    private Long userId;
+    /**
+     * 简历刷新次数
+     */
+    private Integer resumeRefreshCount;
+    /**
+     * 简历屏蔽
+     */
+    private Boolean resumePrivacy;
+    /**
+     * 优先推荐
+     */
+    private Boolean priorityRecommend;
+    /**
+     * 简历模板下载
+     */
+    private Boolean resumeTemplate;
+    /**
+     * 谁看过我
+     */
+    private Boolean viewersList;
+    /**
+     * 薪酬报告
+     */
+    private Boolean salaryReport;
+
+}

+ 83 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/dataobject/user/UserPackageDO.java

@@ -0,0 +1,83 @@
+package com.citu.module.menduner.system.dal.dataobject.user;
+
+
+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
+ *
+ * @author Rayson
+ */
+@TableName("mde_user_package")
+@KeySequence("mde_user_package_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class UserPackageDO extends BaseDO {
+
+    /**
+     * id
+     */
+    @TableId
+    private Long id;
+    /**
+     * 套餐名称
+     */
+    private String name;
+    /**
+     * 套餐价格
+     */
+    private Long price;
+    /**
+     * 天数
+     */
+    private Integer day;
+    /**
+     * 是否推荐
+     */
+    private Boolean recommend;
+    /**
+     * 说明文本
+     */
+    private String text;
+    /**
+     * 简历刷新次数
+     */
+    private Integer resumeRefreshCount;
+    /**
+     * 简历屏蔽
+     */
+    private Boolean resumePrivacy;
+    /**
+     * 优先推荐
+     */
+    private Boolean priorityRecommend;
+    /**
+     * 简历模板下载
+     */
+    private Boolean resumeTemplate;
+    /**
+     * 谁看过我
+     */
+    private Boolean viewersList;
+    /**
+     * 薪酬报告
+     */
+    private Boolean salaryReport;
+    /**
+     * 排序
+     */
+    private Integer sort;
+    /**
+     * 状态(0正常 1停用 2隐藏)
+     */
+    private String status;
+
+}

+ 32 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/mysql/user/UserEntitlementMapper.java

@@ -0,0 +1,32 @@
+package com.citu.module.menduner.system.dal.mysql.user;
+
+
+import com.citu.framework.common.pojo.PageResult;
+import com.citu.framework.mybatis.core.mapper.BaseMapperX;
+import com.citu.framework.mybatis.core.query.LambdaQueryWrapperX;
+import com.citu.module.menduner.system.controller.base.user.vip.UserEntitlementPageReqVO;
+import com.citu.module.menduner.system.dal.dataobject.user.UserEntitlementDO;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 用户权益记录 Mapper
+ *
+ * @author Rayson
+ */
+@Mapper
+public interface UserEntitlementMapper extends BaseMapperX<UserEntitlementDO> {
+
+    default PageResult<UserEntitlementDO> selectPage(UserEntitlementPageReqVO reqVO) {
+        return selectPage(reqVO, new LambdaQueryWrapperX<UserEntitlementDO>()
+                .eqIfPresent(UserEntitlementDO::getUserId, reqVO.getUserId())
+                .eqIfPresent(UserEntitlementDO::getResumeRefreshCount, reqVO.getResumeRefreshCount())
+                .eqIfPresent(UserEntitlementDO::getResumePrivacy, reqVO.getResumePrivacy())
+                .eqIfPresent(UserEntitlementDO::getPriorityRecommend, reqVO.getPriorityRecommend())
+                .eqIfPresent(UserEntitlementDO::getResumeTemplate, reqVO.getResumeTemplate())
+                .eqIfPresent(UserEntitlementDO::getViewersList, reqVO.getViewersList())
+                .eqIfPresent(UserEntitlementDO::getSalaryReport, reqVO.getSalaryReport())
+                .betweenIfPresent(UserEntitlementDO::getCreateTime, reqVO.getCreateTime())
+                .orderByDesc(UserEntitlementDO::getId));
+    }
+
+}

+ 35 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/mysql/user/UserPackageMapper.java

@@ -0,0 +1,35 @@
+package com.citu.module.menduner.system.dal.mysql.user;
+
+
+import com.citu.framework.common.pojo.PageResult;
+import com.citu.framework.mybatis.core.mapper.BaseMapperX;
+import com.citu.framework.mybatis.core.query.LambdaQueryWrapperX;
+import com.citu.module.menduner.system.controller.base.user.vip.UserPackagePageReqVO;
+import com.citu.module.menduner.system.dal.dataobject.user.UserPackageDO;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 用户套餐 Mapper
+ *
+ * @author Rayson
+ */
+@Mapper
+public interface UserPackageMapper extends BaseMapperX<UserPackageDO> {
+
+    default PageResult<UserPackageDO> selectPage(UserPackagePageReqVO reqVO) {
+        return selectPage(reqVO, new LambdaQueryWrapperX<UserPackageDO>()
+                .likeIfPresent(UserPackageDO::getName, reqVO.getName())
+                .eqIfPresent(UserPackageDO::getRecommend, reqVO.getRecommend())
+                .eqIfPresent(UserPackageDO::getResumeRefreshCount, reqVO.getResumeRefreshCount())
+                .eqIfPresent(UserPackageDO::getResumePrivacy, reqVO.getResumePrivacy())
+                .eqIfPresent(UserPackageDO::getPriorityRecommend, reqVO.getPriorityRecommend())
+                .eqIfPresent(UserPackageDO::getResumeTemplate, reqVO.getResumeTemplate())
+                .eqIfPresent(UserPackageDO::getViewersList, reqVO.getViewersList())
+                .eqIfPresent(UserPackageDO::getSalaryReport, reqVO.getSalaryReport())
+                .eqIfPresent(UserPackageDO::getSort, reqVO.getSort())
+                .eqIfPresent(UserPackageDO::getStatus, reqVO.getStatus())
+                .betweenIfPresent(UserPackageDO::getCreateTime, reqVO.getCreateTime())
+                .orderByDesc(UserPackageDO::getId));
+    }
+
+}

+ 49 - 9
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/mq/consumer/UserMemberConsumer.java

@@ -1,11 +1,16 @@
 package com.citu.module.menduner.system.mq.consumer;
 
+import com.baomidou.dynamic.datasource.annotation.DSTransactional;
+import com.citu.module.menduner.system.controller.base.user.vip.UserEntitlementSaveReqVO;
 import com.citu.module.menduner.system.dal.dataobject.order.TradeOrderDO;
 import com.citu.module.menduner.system.dal.dataobject.user.MdeUserDO;
+import com.citu.module.menduner.system.dal.dataobject.user.UserEntitlementDO;
+import com.citu.module.menduner.system.dal.dataobject.user.UserPackageDO;
 import com.citu.module.menduner.system.enums.TradeOrderTypeMq;
-import com.citu.module.menduner.system.enums.user.UserVipFlagEnum;
 import com.citu.module.menduner.system.service.order.TradeOrderService;
 import com.citu.module.menduner.system.service.user.MdeUserService;
+import com.citu.module.menduner.system.service.user.UserEntitlementService;
+import com.citu.module.menduner.system.service.user.UserPackageService;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
 import org.apache.rocketmq.spring.core.RocketMQListener;
@@ -35,6 +40,12 @@ public class UserMemberConsumer implements RocketMQListener<Long> {
     @Resource
     private MdeUserService mdeUserService;
 
+    @Resource
+    private UserPackageService userPackageService;
+
+    @Resource
+    private UserEntitlementService userEntitleService;
+
     /**
      * 判断给定的时间是否已过期
      **/
@@ -47,27 +58,29 @@ public class UserMemberConsumer implements RocketMQListener<Long> {
     }
 
     @Override
+    @DSTransactional
     public void onMessage(Long orderId) {
         log.info("接收到队列消息[{}]", orderId);
         TradeOrderDO order = tradeOrderService.getOrder(orderId);
-        UserVipFlagEnum vipFlagEnum = UserVipFlagEnum.from(order.getType());
+//        UserVipFlagEnum vipFlagEnum = UserVipFlagEnum.from(order.getType());
         // 查询用户
         MdeUserDO user = mdeUserService.getMdeUser(order.getUserId());
-        if (null == vipFlagEnum || null == user) {
+        UserPackageDO packageDO = userPackageService.getUserPackage(order.getSpuId());
+        if (null == packageDO || null == user) {
             throw exception(MDE_USER_NOT_EXISTS);
         }
         // 不算今天
-        long day = Long.parseLong(vipFlagEnum.getFlag()) + 1;
+        long day = packageDO.getDay() + 1;
 
         if (!StringUtils.hasText(user.getVipFlag())) {
             // 没有开过会员
-            user.setVipFlag(vipFlagEnum.getFlag());
+            user.setVipFlag(String.valueOf(packageDO.getId()));
             user.setVipExpireDate(LocalDateTime.now().plusDays(day));
         } else {
             // 开过会员
             if (isExpired(user.getVipExpireDate())) {
                 // 过期值覆盖
-                user.setVipFlag(vipFlagEnum.getFlag());
+                user.setVipFlag(String.valueOf(packageDO.getId()));
                 // 不算今天
                 user.setVipExpireDate(LocalDateTime.now().plusDays(day));
             } else {
@@ -75,14 +88,14 @@ public class UserMemberConsumer implements RocketMQListener<Long> {
                 //  累加时间,如果当前权益大于user.getVipFlag()则覆盖,并且累加时间
                 // TODO 不允许小于当前权益
                 Long currentVipFlag = Long.parseLong(user.getVipFlag());
-                Long newVipFlag = Long.parseLong(vipFlagEnum.getFlag());
+                Long newVipFlag = packageDO.getId();
 
                 if (currentVipFlag == Long.parseLong(user.getVipFlag())) {
                     // 买一样的,加天数
                     user.setVipExpireDate(user.getVipExpireDate().plusDays(day));
                 } else if (newVipFlag > currentVipFlag) {
                     // 新套餐大于套餐
-                    user.setVipFlag(vipFlagEnum.getFlag());
+                    user.setVipFlag(String.valueOf(packageDO.getId()));
                     user.setVipExpireDate(user.getVipExpireDate().plusDays(day));
                 } else {
                     // 新套餐小于套餐
@@ -90,8 +103,35 @@ public class UserMemberConsumer implements RocketMQListener<Long> {
                 }
             }
         }
-
+        // 修改会员权益
         mdeUserService.updateVip(user.getId(), user.getVipFlag(), user.getVipExpireDate());
+        // 查询用户权益
+        UserEntitlementDO entitlement = userEntitleService.getByUserId(user.getId());
+
+        if (null == entitlement) {
+            userEntitleService.createUserEntitlement(UserEntitlementSaveReqVO.builder()
+                    .userId(user.getId())
+                    .resumeRefreshCount(packageDO.getResumeRefreshCount())
+                    .resumePrivacy(packageDO.getResumePrivacy())
+                    .priorityRecommend(packageDO.getPriorityRecommend())
+                    .resumeTemplate(packageDO.getResumeTemplate())
+                    .viewersList(packageDO.getViewersList())
+                    .salaryReport(packageDO.getSalaryReport())
+                    .build()
+            );
+        } else {
+            userEntitleService.updateUserEntitlement(UserEntitlementSaveReqVO.builder()
+                    .userId(user.getId())
+                    .resumeRefreshCount(packageDO.getResumeRefreshCount() + packageDO.getResumeRefreshCount())
+                    // 覆盖权限,以新套餐为准,不会出现,买大权益套餐还能买小权益套餐的情况
+                    .resumePrivacy(packageDO.getResumePrivacy())
+                    .priorityRecommend(packageDO.getPriorityRecommend())
+                    .resumeTemplate(packageDO.getResumeTemplate())
+                    .viewersList(packageDO.getViewersList())
+                    .salaryReport(packageDO.getSalaryReport())
+                    .build()
+            );
+        }
 
     }
 }

+ 1 - 1
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/person/block/PersonEnterpriseBlockService.java

@@ -16,7 +16,7 @@ public interface PersonEnterpriseBlockService {
     void block(PersonEnterpriseBlockSaveReqVO reqVO);
 
     /** 取消屏蔽企业 */
-    void unBlock(PersonEnterpriseBlockSaveReqVO reqVO);
+    void unBlock(Long enterpriseId);
 
     /** 分页查询屏蔽企业列表 */
     PageResult<EnterpriseBaseSimpleRespVO> page(PageParam page);

+ 3 - 3
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/person/block/PersonEnterpriseBlockServiceImpl.java

@@ -56,14 +56,14 @@ public class PersonEnterpriseBlockServiceImpl implements PersonEnterpriseBlockSe
 
     @Override
     @DSTransactional
-    public void unBlock(PersonEnterpriseBlockSaveReqVO reqVO) {
+    public void unBlock(Long enterpriseId) {
         Long userId = LoginUserContext.getUserId();
         if (null == userId) {
             // 未登录
             return;
         }
-        if (null != mapper.selectByUserIdAndEnterpriseId(userId, reqVO.getEnterpriseId())) {
-            mapper.deleteByUserIdAndEnterpriseId(userId, reqVO.getEnterpriseId());
+        if (null != mapper.selectByUserIdAndEnterpriseId(userId, enterpriseId)) {
+            mapper.deleteByUserIdAndEnterpriseId(userId, enterpriseId);
         }
     }
 

+ 59 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/user/UserEntitlementService.java

@@ -0,0 +1,59 @@
+package com.citu.module.menduner.system.service.user;
+
+
+import com.citu.framework.common.pojo.PageResult;
+import com.citu.module.menduner.system.controller.base.user.vip.UserEntitlementPageReqVO;
+import com.citu.module.menduner.system.controller.base.user.vip.UserEntitlementSaveReqVO;
+import com.citu.module.menduner.system.dal.dataobject.user.UserEntitlementDO;
+
+import javax.validation.Valid;
+
+/**
+ * 用户权益记录 Service 接口
+ *
+ * @author Rayson
+ */
+public interface UserEntitlementService {
+
+    /**
+     * 创建用户权益记录
+     *
+     * @param createReqVO 创建信息
+     * @return 编号
+     */
+    Long createUserEntitlement(@Valid UserEntitlementSaveReqVO createReqVO);
+
+    /**
+     * 更新用户权益记录
+     *
+     * @param updateReqVO 更新信息
+     */
+    void updateUserEntitlement(@Valid UserEntitlementSaveReqVO updateReqVO);
+
+    /**
+     * 删除用户权益记录
+     *
+     * @param id 编号
+     */
+    void deleteUserEntitlement(Long id);
+
+    /**
+     * 获得用户权益记录
+     *
+     * @param id 编号
+     * @return 用户权益记录
+     */
+    UserEntitlementDO getUserEntitlement(Long id);
+
+    /**
+     * 获得用户权益记录分页
+     *
+     * @param pageReqVO 分页查询
+     * @return 用户权益记录分页
+     */
+    PageResult<UserEntitlementDO> getUserEntitlementPage(UserEntitlementPageReqVO pageReqVO);
+
+
+    UserEntitlementDO getByUserId(Long userId);
+
+}

+ 75 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/user/UserEntitlementServiceImpl.java

@@ -0,0 +1,75 @@
+package com.citu.module.menduner.system.service.user;
+
+import com.citu.framework.common.pojo.PageResult;
+import com.citu.framework.common.util.object.BeanUtils;
+import com.citu.module.menduner.system.controller.base.user.vip.UserEntitlementPageReqVO;
+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.dal.mysql.user.UserEntitlementMapper;
+import org.springframework.stereotype.Service;
+import org.springframework.validation.annotation.Validated;
+
+import javax.annotation.Resource;
+
+import static com.citu.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static com.citu.module.menduner.system.enums.ErrorCodeConstants.USER_ENTITLEMENT_NOT_EXISTS;
+
+/**
+ * 用户权益记录 Service 实现类
+ *
+ * @author Rayson
+ */
+@Service
+@Validated
+public class UserEntitlementServiceImpl implements UserEntitlementService {
+
+    @Resource
+    private UserEntitlementMapper userEntitlementMapper;
+
+    @Override
+    public Long createUserEntitlement(UserEntitlementSaveReqVO createReqVO) {
+        // 插入
+        UserEntitlementDO userEntitlement = BeanUtils.toBean(createReqVO, UserEntitlementDO.class);
+        userEntitlementMapper.insert(userEntitlement);
+        // 返回
+        return userEntitlement.getId();
+    }
+
+    @Override
+    public void updateUserEntitlement(UserEntitlementSaveReqVO updateReqVO) {
+        // 校验存在
+        validateUserEntitlementExists(updateReqVO.getId());
+        // 更新
+        UserEntitlementDO updateObj = BeanUtils.toBean(updateReqVO, UserEntitlementDO.class);
+        userEntitlementMapper.updateById(updateObj);
+    }
+
+    @Override
+    public void deleteUserEntitlement(Long id) {
+        // 校验存在
+        validateUserEntitlementExists(id);
+        // 删除
+        userEntitlementMapper.deleteById(id);
+    }
+
+    private void validateUserEntitlementExists(Long id) {
+        if (userEntitlementMapper.selectById(id) == null) {
+            throw exception(USER_ENTITLEMENT_NOT_EXISTS);
+        }
+    }
+
+    @Override
+    public UserEntitlementDO getUserEntitlement(Long id) {
+        return userEntitlementMapper.selectById(id);
+    }
+
+    @Override
+    public PageResult<UserEntitlementDO> getUserEntitlementPage(UserEntitlementPageReqVO pageReqVO) {
+        return userEntitlementMapper.selectPage(pageReqVO);
+    }
+
+    @Override
+    public UserEntitlementDO getByUserId(Long userId) {
+        return userEntitlementMapper.selectOne(UserEntitlementDO::getUserId, userId);
+    }
+}

+ 64 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/user/UserPackageService.java

@@ -0,0 +1,64 @@
+package com.citu.module.menduner.system.service.user;
+
+
+import com.citu.framework.common.pojo.PageResult;
+import com.citu.module.menduner.system.controller.base.user.vip.UserPackagePageReqVO;
+import com.citu.module.menduner.system.controller.base.user.vip.UserPackageSaveReqVO;
+import com.citu.module.menduner.system.dal.dataobject.user.UserPackageDO;
+
+import javax.validation.Valid;
+import java.util.List;
+
+/**
+ * 用户套餐 Service 接口
+ *
+ * @author Rayson
+ */
+public interface UserPackageService {
+
+    /**
+     * 创建用户套餐
+     *
+     * @param createReqVO 创建信息
+     * @return 编号
+     */
+    Long createUserPackage(@Valid UserPackageSaveReqVO createReqVO);
+
+    /**
+     * 更新用户套餐
+     *
+     * @param updateReqVO 更新信息
+     */
+    void updateUserPackage(@Valid UserPackageSaveReqVO updateReqVO);
+
+    /**
+     * 删除用户套餐
+     *
+     * @param id 编号
+     */
+    void deleteUserPackage(Long id);
+
+    /**
+     * 获得用户套餐
+     *
+     * @param id 编号
+     * @return 用户套餐
+     */
+    UserPackageDO getUserPackage(Long id);
+
+    /**
+     * 获得用户套餐分页
+     *
+     * @param pageReqVO 分页查询
+     * @return 用户套餐分页
+     */
+    PageResult<UserPackageDO> getUserPackagePage(UserPackagePageReqVO pageReqVO);
+
+    /**
+     * 获得用户套餐列表
+     *
+     * @return 用户套餐列表
+     */
+    List<UserPackageDO> getList();
+
+}

+ 79 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/user/UserPackageServiceImpl.java

@@ -0,0 +1,79 @@
+package com.citu.module.menduner.system.service.user;
+
+
+import com.citu.framework.common.enums.CommonStatusEnum;
+import com.citu.framework.common.pojo.PageResult;
+import com.citu.framework.common.util.object.BeanUtils;
+import com.citu.module.menduner.system.controller.base.user.vip.UserPackagePageReqVO;
+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.dal.mysql.user.UserPackageMapper;
+import org.springframework.stereotype.Service;
+import org.springframework.validation.annotation.Validated;
+
+import javax.annotation.Resource;
+
+import java.util.List;
+
+import static com.citu.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static com.citu.module.menduner.system.enums.ErrorCodeConstants.USER_PACKAGE_NOT_EXISTS;
+
+/**
+ * 用户套餐 Service 实现类
+ *
+ * @author Rayson
+ */
+@Service
+@Validated
+public class UserPackageServiceImpl implements UserPackageService {
+
+    @Resource
+    private UserPackageMapper userPackageMapper;
+
+    @Override
+    public Long createUserPackage(UserPackageSaveReqVO createReqVO) {
+        // 插入
+        UserPackageDO userPackage = BeanUtils.toBean(createReqVO, UserPackageDO.class);
+        userPackageMapper.insert(userPackage);
+        // 返回
+        return userPackage.getId();
+    }
+
+    @Override
+    public void updateUserPackage(UserPackageSaveReqVO updateReqVO) {
+        // 校验存在
+        validateUserPackageExists(updateReqVO.getId());
+        // 更新
+        UserPackageDO updateObj = BeanUtils.toBean(updateReqVO, UserPackageDO.class);
+        userPackageMapper.updateById(updateObj);
+    }
+
+    @Override
+    public void deleteUserPackage(Long id) {
+        // 校验存在
+        validateUserPackageExists(id);
+        // 删除
+        userPackageMapper.deleteById(id);
+    }
+
+    private void validateUserPackageExists(Long id) {
+        if (userPackageMapper.selectById(id) == null) {
+            throw exception(USER_PACKAGE_NOT_EXISTS);
+        }
+    }
+
+    @Override
+    public UserPackageDO getUserPackage(Long id) {
+        return userPackageMapper.selectById(id);
+    }
+
+    @Override
+    public PageResult<UserPackageDO> getUserPackagePage(UserPackagePageReqVO pageReqVO) {
+        return userPackageMapper.selectPage(pageReqVO);
+    }
+
+    @Override
+    public List<UserPackageDO> getList() {
+        return userPackageMapper.selectList(UserPackageDO::getStatus, CommonStatusEnum.ENABLE.getStatus());
+    }
+}

+ 152 - 0
menduner/menduner-system-biz/src/test/java/com/citu/module/menduner/system/service/user/UserEntitlementServiceImplTest.java

@@ -0,0 +1,152 @@
+package com.citu.module.menduner.system.service.user;
+
+
+import com.citu.framework.common.pojo.PageResult;
+import com.citu.framework.test.core.ut.BaseDbUnitTest;
+import com.citu.module.menduner.system.controller.base.user.vip.UserEntitlementPageReqVO;
+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.dal.mysql.user.UserEntitlementMapper;
+import org.junit.jupiter.api.Disabled;
+import org.junit.jupiter.api.Test;
+import org.springframework.context.annotation.Import;
+
+import javax.annotation.Resource;
+
+import static com.citu.framework.common.util.date.LocalDateTimeUtils.buildBetweenTime;
+import static com.citu.framework.common.util.object.ObjectUtils.cloneIgnoreId;
+import static com.citu.framework.test.core.util.AssertUtils.assertPojoEquals;
+import static com.citu.framework.test.core.util.AssertUtils.assertServiceException;
+import static com.citu.framework.test.core.util.RandomUtils.randomLongId;
+import static com.citu.framework.test.core.util.RandomUtils.randomPojo;
+import static com.citu.module.menduner.system.enums.ErrorCodeConstants.USER_ENTITLEMENT_NOT_EXISTS;
+import static org.junit.jupiter.api.Assertions.*;
+
+/**
+ * {@link UserEntitlementServiceImpl} 的单元测试类
+ *
+ * @author Rayson
+ */
+@Import(UserEntitlementServiceImpl.class)
+public class UserEntitlementServiceImplTest extends BaseDbUnitTest {
+
+    @Resource
+    private UserEntitlementServiceImpl userEntitlementService;
+
+    @Resource
+    private UserEntitlementMapper userEntitlementMapper;
+
+    @Test
+    public void testCreateUserEntitlement_success() {
+        // 准备参数
+        UserEntitlementSaveReqVO createReqVO = randomPojo(UserEntitlementSaveReqVO.class).setId(null);
+
+        // 调用
+        Long userEntitlementId = userEntitlementService.createUserEntitlement(createReqVO);
+        // 断言
+        assertNotNull(userEntitlementId);
+        // 校验记录的属性是否正确
+        UserEntitlementDO userEntitlement = userEntitlementMapper.selectById(userEntitlementId);
+        assertPojoEquals(createReqVO, userEntitlement, "id");
+    }
+
+    @Test
+    public void testUpdateUserEntitlement_success() {
+        // mock 数据
+        UserEntitlementDO dbUserEntitlement = randomPojo(UserEntitlementDO.class);
+        userEntitlementMapper.insert(dbUserEntitlement);// @Sql: 先插入出一条存在的数据
+        // 准备参数
+        UserEntitlementSaveReqVO updateReqVO = randomPojo(UserEntitlementSaveReqVO.class, o -> {
+            o.setId(dbUserEntitlement.getId()); // 设置更新的 ID
+        });
+
+        // 调用
+        userEntitlementService.updateUserEntitlement(updateReqVO);
+        // 校验是否更新正确
+        UserEntitlementDO userEntitlement = userEntitlementMapper.selectById(updateReqVO.getId()); // 获取最新的
+        assertPojoEquals(updateReqVO, userEntitlement);
+    }
+
+    @Test
+    public void testUpdateUserEntitlement_notExists() {
+        // 准备参数
+        UserEntitlementSaveReqVO updateReqVO = randomPojo(UserEntitlementSaveReqVO.class);
+
+        // 调用, 并断言异常
+        assertServiceException(() -> userEntitlementService.updateUserEntitlement(updateReqVO), USER_ENTITLEMENT_NOT_EXISTS);
+    }
+
+    @Test
+    public void testDeleteUserEntitlement_success() {
+        // mock 数据
+        UserEntitlementDO dbUserEntitlement = randomPojo(UserEntitlementDO.class);
+        userEntitlementMapper.insert(dbUserEntitlement);// @Sql: 先插入出一条存在的数据
+        // 准备参数
+        Long id = dbUserEntitlement.getId();
+
+        // 调用
+        userEntitlementService.deleteUserEntitlement(id);
+        // 校验数据不存在了
+        assertNull(userEntitlementMapper.selectById(id));
+    }
+
+    @Test
+    public void testDeleteUserEntitlement_notExists() {
+        // 准备参数
+        Long id = randomLongId();
+
+        // 调用, 并断言异常
+        assertServiceException(() -> userEntitlementService.deleteUserEntitlement(id), USER_ENTITLEMENT_NOT_EXISTS);
+    }
+
+    @Test
+    @Disabled  // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解
+    public void testGetUserEntitlementPage() {
+        // mock 数据
+        UserEntitlementDO dbUserEntitlement = randomPojo(UserEntitlementDO.class, o -> { // 等会查询到
+            o.setUserId(null);
+            o.setResumeRefreshCount(null);
+            o.setResumePrivacy(null);
+            o.setPriorityRecommend(null);
+            o.setResumeTemplate(null);
+            o.setViewersList(null);
+            o.setSalaryReport(null);
+            o.setCreateTime(null);
+        });
+        userEntitlementMapper.insert(dbUserEntitlement);
+        // 测试 userId 不匹配
+        userEntitlementMapper.insert(cloneIgnoreId(dbUserEntitlement, o -> o.setUserId(null)));
+        // 测试 resumeRefreshCount 不匹配
+        userEntitlementMapper.insert(cloneIgnoreId(dbUserEntitlement, o -> o.setResumeRefreshCount(null)));
+        // 测试 resumePrivacy 不匹配
+        userEntitlementMapper.insert(cloneIgnoreId(dbUserEntitlement, o -> o.setResumePrivacy(null)));
+        // 测试 priorityRecommend 不匹配
+        userEntitlementMapper.insert(cloneIgnoreId(dbUserEntitlement, o -> o.setPriorityRecommend(null)));
+        // 测试 resumeTemplate 不匹配
+        userEntitlementMapper.insert(cloneIgnoreId(dbUserEntitlement, o -> o.setResumeTemplate(null)));
+        // 测试 viewersList 不匹配
+        userEntitlementMapper.insert(cloneIgnoreId(dbUserEntitlement, o -> o.setViewersList(null)));
+        // 测试 salaryReport 不匹配
+        userEntitlementMapper.insert(cloneIgnoreId(dbUserEntitlement, o -> o.setSalaryReport(null)));
+        // 测试 createTime 不匹配
+        userEntitlementMapper.insert(cloneIgnoreId(dbUserEntitlement, o -> o.setCreateTime(null)));
+        // 准备参数
+        UserEntitlementPageReqVO reqVO = new UserEntitlementPageReqVO();
+        reqVO.setUserId(null);
+        reqVO.setResumeRefreshCount(null);
+        reqVO.setResumePrivacy(null);
+        reqVO.setPriorityRecommend(null);
+        reqVO.setResumeTemplate(null);
+        reqVO.setViewersList(null);
+        reqVO.setSalaryReport(null);
+        reqVO.setCreateTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28));
+
+        // 调用
+        PageResult<UserEntitlementDO> pageResult = userEntitlementService.getUserEntitlementPage(reqVO);
+        // 断言
+        assertEquals(1, pageResult.getTotal());
+        assertEquals(1, pageResult.getList().size());
+        assertPojoEquals(dbUserEntitlement, pageResult.getList().get(0));
+    }
+
+}

+ 164 - 0
menduner/menduner-system-biz/src/test/java/com/citu/module/menduner/system/service/user/UserPackageServiceImplTest.java

@@ -0,0 +1,164 @@
+package com.citu.module.menduner.system.service.user;
+
+
+import com.citu.framework.common.pojo.PageResult;
+import com.citu.framework.test.core.ut.BaseDbUnitTest;
+import com.citu.module.menduner.system.controller.base.user.vip.UserPackagePageReqVO;
+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.dal.mysql.user.UserPackageMapper;
+import org.junit.jupiter.api.Disabled;
+import org.junit.jupiter.api.Test;
+import org.springframework.context.annotation.Import;
+
+import javax.annotation.Resource;
+
+import static com.citu.framework.common.util.date.LocalDateTimeUtils.buildBetweenTime;
+import static com.citu.framework.common.util.object.ObjectUtils.cloneIgnoreId;
+import static com.citu.framework.test.core.util.AssertUtils.assertPojoEquals;
+import static com.citu.framework.test.core.util.AssertUtils.assertServiceException;
+import static com.citu.framework.test.core.util.RandomUtils.randomLongId;
+import static com.citu.framework.test.core.util.RandomUtils.randomPojo;
+import static com.citu.module.menduner.system.enums.ErrorCodeConstants.USER_PACKAGE_NOT_EXISTS;
+import static org.junit.jupiter.api.Assertions.*;
+
+/**
+ * {@link UserPackageServiceImpl} 的单元测试类
+ *
+ * @author Rayson
+ */
+@Import(UserPackageServiceImpl.class)
+public class UserPackageServiceImplTest extends BaseDbUnitTest {
+
+    @Resource
+    private UserPackageServiceImpl userPackageService;
+
+    @Resource
+    private UserPackageMapper userPackageMapper;
+
+    @Test
+    public void testCreateUserPackage_success() {
+        // 准备参数
+        UserPackageSaveReqVO createReqVO = randomPojo(UserPackageSaveReqVO.class).setId(null);
+
+        // 调用
+        Long userPackageId = userPackageService.createUserPackage(createReqVO);
+        // 断言
+        assertNotNull(userPackageId);
+        // 校验记录的属性是否正确
+        UserPackageDO userPackage = userPackageMapper.selectById(userPackageId);
+        assertPojoEquals(createReqVO, userPackage, "id");
+    }
+
+    @Test
+    public void testUpdateUserPackage_success() {
+        // mock 数据
+        UserPackageDO dbUserPackage = randomPojo(UserPackageDO.class);
+        userPackageMapper.insert(dbUserPackage);// @Sql: 先插入出一条存在的数据
+        // 准备参数
+        UserPackageSaveReqVO updateReqVO = randomPojo(UserPackageSaveReqVO.class, o -> {
+            o.setId(dbUserPackage.getId()); // 设置更新的 ID
+        });
+
+        // 调用
+        userPackageService.updateUserPackage(updateReqVO);
+        // 校验是否更新正确
+        UserPackageDO userPackage = userPackageMapper.selectById(updateReqVO.getId()); // 获取最新的
+        assertPojoEquals(updateReqVO, userPackage);
+    }
+
+    @Test
+    public void testUpdateUserPackage_notExists() {
+        // 准备参数
+        UserPackageSaveReqVO updateReqVO = randomPojo(UserPackageSaveReqVO.class);
+
+        // 调用, 并断言异常
+        assertServiceException(() -> userPackageService.updateUserPackage(updateReqVO), USER_PACKAGE_NOT_EXISTS);
+    }
+
+    @Test
+    public void testDeleteUserPackage_success() {
+        // mock 数据
+        UserPackageDO dbUserPackage = randomPojo(UserPackageDO.class);
+        userPackageMapper.insert(dbUserPackage);// @Sql: 先插入出一条存在的数据
+        // 准备参数
+        Long id = dbUserPackage.getId();
+
+        // 调用
+        userPackageService.deleteUserPackage(id);
+        // 校验数据不存在了
+        assertNull(userPackageMapper.selectById(id));
+    }
+
+    @Test
+    public void testDeleteUserPackage_notExists() {
+        // 准备参数
+        Long id = randomLongId();
+
+        // 调用, 并断言异常
+        assertServiceException(() -> userPackageService.deleteUserPackage(id), USER_PACKAGE_NOT_EXISTS);
+    }
+
+    @Test
+    @Disabled  // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解
+    public void testGetUserPackagePage() {
+        // mock 数据
+        UserPackageDO dbUserPackage = randomPojo(UserPackageDO.class, o -> { // 等会查询到
+            o.setName(null);
+            o.setRecommend(null);
+            o.setResumeRefreshCount(null);
+            o.setResumePrivacy(null);
+            o.setPriorityRecommend(null);
+            o.setResumeTemplate(null);
+            o.setViewersList(null);
+            o.setSalaryReport(null);
+            o.setSort(null);
+            o.setStatus(null);
+            o.setCreateTime(null);
+        });
+        userPackageMapper.insert(dbUserPackage);
+        // 测试 name 不匹配
+        userPackageMapper.insert(cloneIgnoreId(dbUserPackage, o -> o.setName(null)));
+        // 测试 recommend 不匹配
+        userPackageMapper.insert(cloneIgnoreId(dbUserPackage, o -> o.setRecommend(null)));
+        // 测试 resumeRefreshCount 不匹配
+        userPackageMapper.insert(cloneIgnoreId(dbUserPackage, o -> o.setResumeRefreshCount(null)));
+        // 测试 resumePrivacy 不匹配
+        userPackageMapper.insert(cloneIgnoreId(dbUserPackage, o -> o.setResumePrivacy(null)));
+        // 测试 priorityRecommend 不匹配
+        userPackageMapper.insert(cloneIgnoreId(dbUserPackage, o -> o.setPriorityRecommend(null)));
+        // 测试 resumeTemplate 不匹配
+        userPackageMapper.insert(cloneIgnoreId(dbUserPackage, o -> o.setResumeTemplate(null)));
+        // 测试 viewersList 不匹配
+        userPackageMapper.insert(cloneIgnoreId(dbUserPackage, o -> o.setViewersList(null)));
+        // 测试 salaryReport 不匹配
+        userPackageMapper.insert(cloneIgnoreId(dbUserPackage, o -> o.setSalaryReport(null)));
+        // 测试 sort 不匹配
+        userPackageMapper.insert(cloneIgnoreId(dbUserPackage, o -> o.setSort(null)));
+        // 测试 status 不匹配
+        userPackageMapper.insert(cloneIgnoreId(dbUserPackage, o -> o.setStatus(null)));
+        // 测试 createTime 不匹配
+        userPackageMapper.insert(cloneIgnoreId(dbUserPackage, o -> o.setCreateTime(null)));
+        // 准备参数
+        UserPackagePageReqVO reqVO = new UserPackagePageReqVO();
+        reqVO.setName(null);
+        reqVO.setRecommend(null);
+        reqVO.setResumeRefreshCount(null);
+        reqVO.setResumePrivacy(null);
+        reqVO.setPriorityRecommend(null);
+        reqVO.setResumeTemplate(null);
+        reqVO.setViewersList(null);
+        reqVO.setSalaryReport(null);
+        reqVO.setSort(null);
+        reqVO.setStatus(null);
+        reqVO.setCreateTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28));
+
+        // 调用
+        PageResult<UserPackageDO> pageResult = userPackageService.getUserPackagePage(reqVO);
+        // 断言
+        assertEquals(1, pageResult.getTotal());
+        assertEquals(1, pageResult.getList().size());
+        assertPojoEquals(dbUserPackage, pageResult.getList().get(0));
+    }
+
+}

+ 3 - 1
menduner/menduner-system-biz/src/test/resources/sql/clean.sql

@@ -39,4 +39,6 @@ DELETE FROM "mde_enterprise_auth";
 DELETE FROM "mde_tag";
 DELETE FROM "mde_hunt";
 DELETE FROM "mde_user_auth";
-DELETE FROM "mde_redeem";
+DELETE FROM "mde_redeem";
+DELETE FROM "mde_user_package";
+DELETE FROM "mde_user_entitlement";

+ 42 - 0
menduner/menduner-system-biz/src/test/resources/sql/create_tables.sql

@@ -701,3 +701,45 @@ CREATE TABLE IF NOT EXISTS "mde_redeem" (
     "tenant_id" bigint NOT NULL,
     PRIMARY KEY ("id")
 ) COMMENT '兑换';
+
+CREATE TABLE IF NOT EXISTS "mde_user_package" (
+    "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY,
+    "name" varchar NOT NULL,
+    "price" bigint NOT NULL,
+    "day" int NOT NULL,
+    "recommend" bit NOT NULL,
+    "text" varchar NOT NULL,
+    "resume_refresh_count" bit NOT NULL,
+    "resume_privacy" bit NOT NULL,
+    "priority_recommend" bit NOT NULL,
+    "resume_template" bit NOT NULL,
+    "viewers_list" bit NOT NULL,
+    "salary_report" bit NOT NULL,
+    "sort" int,
+    "status" varchar NOT NULL,
+    "creator" varchar DEFAULT '',
+    "create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
+    "updater" varchar DEFAULT '',
+    "update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
+    "deleted" bit NOT NULL DEFAULT FALSE,
+    "tenant_id" bigint NOT NULL,
+    PRIMARY KEY ("id")
+) COMMENT '用户套餐';
+
+CREATE TABLE IF NOT EXISTS "mde_user_entitlement" (
+    "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY,
+    "user_id" bigint NOT NULL,
+    "resume_refresh_count" int NOT NULL,
+    "resume_privacy" bit NOT NULL,
+    "priority_recommend" bit NOT NULL,
+    "resume_template" bit NOT NULL,
+    "viewers_list" bit NOT NULL,
+    "salary_report" bit NOT NULL,
+    "creator" varchar DEFAULT '',
+    "create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
+    "updater" varchar DEFAULT '',
+    "update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
+    "deleted" bit NOT NULL DEFAULT FALSE,
+    "tenant_id" bigint NOT NULL,
+    PRIMARY KEY ("id")
+) COMMENT '用户权益记录';