Просмотр исходного кода

1、优化vip权益效验逻辑
2、增加企业套餐模块
2、增加企业用户权益记录模块

rayson 1 год назад
Родитель
Сommit
4077ba5c64
61 измененных файлов с 1815 добавлено и 187 удалено
  1. 53 0
      citu-module-system/citu-module-system-biz/src/main/java/com/citu/module/system/controller/app/captcha/AppCaptchaController.java
  2. 23 0
      menduner/menduner-common/src/main/java/com/citu/module/menduner/common/util/LoginUserContext.java
  3. 29 0
      menduner/menduner-system-api/src/main/java/com/citu/module/menduner/system/enums/ErrorCodeConstants.java
  4. 58 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/aop/VipEntitlementCheck.java
  5. 153 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/aop/VipEntitlementCheckAspect.java
  6. 95 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/admin/enterprise/EnterprisePackageController.java
  7. 52 41
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/admin/job/JobAdvertisedController.java
  8. 2 2
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/app/recruit/job/AppRecruitJobAdvertisedController.java
  9. 10 2
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/app/recruit/user/AppRecruitUserController.java
  10. 4 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/app/recruit/user/vo/AppRecruitUserRespVO.java
  11. 31 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/enterprise/vip/EnterpriseEntitlementPageReqVO.java
  12. 44 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/enterprise/vip/EnterpriseEntitlementRespVO.java
  13. 27 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/enterprise/vip/EnterpriseEntitlementSaveReqVO.java
  14. 35 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/enterprise/vip/EnterprisePackagePageReqVO.java
  15. 64 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/enterprise/vip/EnterprisePackageRespVO.java
  16. 55 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/enterprise/vip/EnterprisePackageSaveReqVO.java
  17. 0 3
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/job/JobAdvertisedPageReqVO.java
  18. 3 3
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/job/JobAdvertisedRenewalReqVO.java
  19. 0 8
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/job/JobAdvertisedSaveReqVO.java
  20. 2 3
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/dataobject/enterprise/EnterpriseAuthDO.java
  21. 47 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/dataobject/enterprise/EnterpriseEntitlementDO.java
  22. 71 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/dataobject/enterprise/EnterprisePackageDO.java
  23. 2 2
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/dataobject/enterprise/EnterpriseTalentPoolDO.java
  24. 2 2
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/dataobject/enterprise/EnterpriseUserApplyDO.java
  25. 2 2
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/dataobject/hire/HireCommissionRatioDO.java
  26. 2 1
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/dataobject/hunt/HuntDO.java
  27. 2 1
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/dataobject/interview/InterviewInviteDO.java
  28. 2 1
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/dataobject/invite/EnterpriseInviteDO.java
  29. 2 1
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/dataobject/invite/EnterpriseInviteRecordDO.java
  30. 2 1
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/dataobject/order/TradeOrderDO.java
  31. 2 4
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/dataobject/record/UserAccountRecordDO.java
  32. 2 4
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/dataobject/redeem/RedeemDO.java
  33. 5 6
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/dataobject/tag/TagDO.java
  34. 2 2
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/dataobject/unfit/UnfitCandidateDO.java
  35. 2 4
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/dataobject/user/UserAccountDO.java
  36. 2 2
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/dataobject/user/UserAuthDO.java
  37. 2 2
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/dataobject/user/UserEntitlementDO.java
  38. 2 2
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/dataobject/user/UserPackageDO.java
  39. 27 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/mysql/enterprise/EnterpriseEntitlementMapper.java
  40. 28 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/mysql/enterprise/EnterprisePackageMapper.java
  41. 10 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/mysql/enterprise/EnterpriseUserBindMapper.java
  42. 8 8
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/mysql/person/PersonInfoMapper.java
  43. 2 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/framework/rpc/config/RpcConfiguration.java
  44. 5 1
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/eduexp/EduExpServiceImpl.java
  45. 8 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/enterprise/bind/EnterpriseUserBindService.java
  46. 5 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/enterprise/bind/EnterpriseUserBindServiceImpl.java
  47. 68 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/enterprise/vip/EnterpriseEntitlementService.java
  48. 128 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/enterprise/vip/EnterpriseEntitlementServiceImpl.java
  49. 62 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/enterprise/vip/EnterprisePackageService.java
  50. 80 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/enterprise/vip/EnterprisePackageServiceImpl.java
  51. 12 4
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/job/JobAdvertisedService.java
  52. 117 66
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/job/JobAdvertisedServiceImpl.java
  53. 5 2
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/projectexp/ProjectExpServiceImpl.java
  54. 5 2
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/trainexp/TrainExpServiceImpl.java
  55. 3 1
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/util/JoinHelper.java
  56. 16 1
      menduner/menduner-system-biz/src/main/resources/i18n/messages_en_US.properties
  57. 16 1
      menduner/menduner-system-biz/src/main/resources/i18n/messages_zh_CN.properties
  58. 141 0
      menduner/menduner-system-biz/src/test/java/com/citu/module/menduner/system/service/enterprise/EnterpriseEntitlementServiceImplTest.java
  59. 137 0
      menduner/menduner-system-biz/src/test/java/com/citu/module/menduner/system/service/enterprise/EnterprisePackageServiceImplTest.java
  60. 3 1
      menduner/menduner-system-biz/src/test/resources/sql/clean.sql
  61. 36 1
      menduner/menduner-system-biz/src/test/resources/sql/create_tables.sql

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

+ 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.notEqual(loginUser.getUserType(), UserTypeEnum.ADMIN.getValue())) {
+            return true;
+        }
+        return false;
+    }
+
 }

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

@@ -280,6 +280,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, "企业招聘者浏览不存在");
 
@@ -521,4 +525,29 @@ public interface ErrorCodeConstants {
     // ========== 用户权益记录 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, "企业额度已超过");
+
 }

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

@@ -0,0 +1,58 @@
+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 type();
+
+    /**
+     * 用户类型
+     **/
+    String userType() default ENTERPRISE;
+
+    /**
+     * 操作
+     **/
+    OperationType operate();
+
+    /**
+     * 是否后台管理员操作
+     **/
+    boolean system() default false;
+
+    enum OperationType {
+        ADD, DEDUCT
+    }
+}

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

@@ -0,0 +1,153 @@
+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.OPERATE_PUBLISH_JOB;
+import static com.citu.module.menduner.system.aop.VipEntitlementCheck.OPERATE_SEARCH;
+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 void 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 {
+            joinPoint.proceed();
+            process(isEnterprise, enterpriseId, userId, vipEntitlementCheck.type(), vipEntitlementCheck.operate());
+        } 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);
+    }
+
+
+    /**
+     * 权益处理
+     *
+     * @param type     权益类型
+     * @param operator 操作
+     */
+    public void process(String type, VipEntitlementCheck.OperationType operator) {
+        Long enterpriseId = LoginUserContext.getEnterpriseId3();
+        process(null != enterpriseId, enterpriseId, LoginUserContext.getUserId(), 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);
+                }
+                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(entitlementRespVO.getSearchCount() + amount);
+                break;
+            default:
+                return;
+        }
+        enterpriseEntitlementService.update(EnterpriseEntitlementDO.builder()
+                .id(entitlementRespVO.getId())
+                .publishJobCount(entitlementRespVO.getPublishJobCount())
+                .searchCount(entitlementRespVO.getSearchCount())
+                .build());
+    }
+
+}

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

+ 2 - 2
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/app/recruit/job/AppRecruitJobAdvertisedController.java

@@ -1,7 +1,6 @@
 package com.citu.module.menduner.system.controller.app.recruit.job;
 
 
-import cn.hutool.core.collection.CollUtil;
 import com.citu.framework.apilog.core.annotation.ApiAccessLog;
 import com.citu.framework.common.pojo.CommonResult;
 import com.citu.framework.common.pojo.PageParam;
@@ -13,6 +12,7 @@ import com.citu.framework.excel.core.util.ExcelUtils;
 import com.citu.framework.security.core.annotations.PreAuthenticated;
 import com.citu.module.menduner.system.controller.app.recruit.job.vo.*;
 import com.citu.module.menduner.system.controller.base.job.JobAdvertisedImportExcelVO;
+import com.citu.module.menduner.system.controller.base.job.JobAdvertisedRenewalReqVO;
 import com.citu.module.menduner.system.convert.JobAdvertisedConvert;
 import com.citu.module.menduner.system.enums.eduexp.EducationTypeEnum;
 import com.citu.module.menduner.system.enums.job.JobStatusEnum;
@@ -173,7 +173,7 @@ public class AppRecruitJobAdvertisedController {
     @PreAuthenticated
     @PostMapping("/renewal")
     @Operation(summary = "职位续期")
-    public CommonResult<Boolean> renewal(@RequestBody @Valid AppRecruitJobRenewalReqVO reqVO) {
+    public CommonResult<Boolean> renewal(@RequestBody @Valid JobAdvertisedRenewalReqVO reqVO) {
         jobAdvertisedService.renewal(reqVO);
         return success(true);
     }

+ 10 - 2
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/app/recruit/user/AppRecruitUserController.java

@@ -6,8 +6,10 @@ import com.citu.framework.common.util.string.StrUtils;
 import com.citu.framework.security.core.annotations.PreAuthenticated;
 import com.citu.module.menduner.common.util.LoginUserContext;
 import com.citu.module.menduner.system.controller.app.recruit.user.vo.*;
+import com.citu.module.menduner.system.controller.base.enterprise.vip.EnterpriseEntitlementRespVO;
 import com.citu.module.menduner.system.convert.EnterpriseConvert;
 import com.citu.module.menduner.system.service.enterprise.bind.EnterpriseUserBindService;
+import com.citu.module.menduner.system.service.enterprise.vip.EnterpriseEntitlementService;
 import com.citu.module.menduner.system.service.user.UserAccountService;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.tags.Tag;
@@ -31,11 +33,18 @@ public class AppRecruitUserController {
     @Resource
     private UserAccountService accountService;
 
+    @Resource
+    private EnterpriseEntitlementService entitlementService;
+
     @PreAuthenticated
     @GetMapping("/get")
     @Operation(summary = "获取当前登录的企业用户信息")
     public CommonResult<AppRecruitUserRespVO> getEnterpriseUserBind() {
-        return success(service.getBindEnterprise());
+        AppRecruitUserRespVO resp = service.getBindEnterprise();
+        EnterpriseEntitlementRespVO entitlementRespVO = entitlementService
+                .getByEnterpriseIdAndUserId(LoginUserContext.getEnterpriseId(), LoginUserContext.getUserId());
+        resp.setEntitlement(entitlementRespVO);
+        return success(resp);
     }
 
 
@@ -108,5 +117,4 @@ public class AppRecruitUserController {
     }
 
 
-
 }

+ 4 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/app/recruit/user/vo/AppRecruitUserRespVO.java

@@ -1,6 +1,7 @@
 package com.citu.module.menduner.system.controller.app.recruit.user.vo;
 
 import com.citu.module.menduner.system.controller.base.enterprise.bind.EnterpriseUserBindSimpleRespVO;
+import com.citu.module.menduner.system.controller.base.enterprise.vip.EnterpriseEntitlementRespVO;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 
@@ -22,5 +23,8 @@ public class AppRecruitUserRespVO extends EnterpriseUserBindSimpleRespVO {
     @Schema(description = "更新时间")
     private LocalDateTime updateTime;
 
+    @Schema(description = "企业用户权益")
+    private EnterpriseEntitlementRespVO entitlement;
+
 
 }

+ 31 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/enterprise/vip/EnterpriseEntitlementPageReqVO.java

@@ -0,0 +1,31 @@
+package com.citu.module.menduner.system.controller.base.enterprise.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 EnterpriseEntitlementPageReqVO extends PageParam {
+
+    @Schema(description = "企业id", example = "9155")
+    private Long enterpriseId;
+
+    @Schema(description = "用户id", example = "412")
+    private Long userId;
+
+    @Schema(description = "创建时间")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDateTime[] createTime;
+
+}

+ 44 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/enterprise/vip/EnterpriseEntitlementRespVO.java

@@ -0,0 +1,44 @@
+package com.citu.module.menduner.system.controller.base.enterprise.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 EnterpriseEntitlementRespVO {
+
+    @Schema(description = "id", requiredMode = Schema.RequiredMode.REQUIRED, example = "20935")
+    @ExcelProperty("id")
+    private Long id;
+
+    @Schema(description = "企业id", requiredMode = Schema.RequiredMode.REQUIRED, example = "9155")
+    @ExcelProperty("企业id")
+    private Long enterpriseId;
+
+    @Schema(description = "用户id", requiredMode = Schema.RequiredMode.REQUIRED, example = "412")
+    @ExcelProperty("用户id")
+    private Long userId;
+
+    @Schema(description = "发布职位数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "28736")
+    @ExcelProperty("发布职位数量")
+    private Integer publishJobCount;
+
+    @Schema(description = "搜索人才的数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "10204")
+    @ExcelProperty("搜索人才的数量")
+    private Integer searchCount;
+
+    @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("创建时间")
+    private LocalDateTime createTime;
+
+    @Schema(description = "套餐信息")
+    @ExcelProperty("套餐信息")
+    private EnterprisePackageRespVO packageInfo;
+
+}

+ 27 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/enterprise/vip/EnterpriseEntitlementSaveReqVO.java

@@ -0,0 +1,27 @@
+package com.citu.module.menduner.system.controller.base.enterprise.vip;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+
+@Schema(description = "管理后台 - 企业权益记录新增/修改 Request VO")
+@Data
+public class EnterpriseEntitlementSaveReqVO {
+
+    @Schema(description = "id", requiredMode = Schema.RequiredMode.REQUIRED, example = "20935")
+    private Long id;
+
+    @Schema(description = "企业id", requiredMode = Schema.RequiredMode.REQUIRED, example = "9155")
+    private Long enterpriseId;
+
+    @Schema(description = "用户id", requiredMode = Schema.RequiredMode.REQUIRED, example = "412")
+    private Long userId;
+
+    @Schema(description = "发布职位数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "28736")
+    private Integer publishJobCount;
+
+    @Schema(description = "搜索人才的数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "10204")
+    private Integer searchCount;
+
+}

+ 35 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/enterprise/vip/EnterprisePackagePageReqVO.java

@@ -0,0 +1,35 @@
+package com.citu.module.menduner.system.controller.base.enterprise.vip;
+
+
+import lombok.*;
+import java.util.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+import com.citu.framework.common.pojo.PageParam;
+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 EnterprisePackagePageReqVO extends PageParam {
+
+    @Schema(description = "套餐名称", example = "李四")
+    private String name;
+
+    @Schema(description = "是否默认")
+    private Boolean defaultPackage;
+
+    @Schema(description = "是否推荐")
+    private Boolean recommend;
+
+    @Schema(description = "状态(0正常 1停用 2隐藏)", example = "1")
+    private String status;
+
+    @Schema(description = "创建时间")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDateTime[] createTime;
+
+}

+ 64 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/enterprise/vip/EnterprisePackageRespVO.java

@@ -0,0 +1,64 @@
+package com.citu.module.menduner.system.controller.base.enterprise.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 EnterprisePackageRespVO {
+
+    @Schema(description = "id", requiredMode = Schema.RequiredMode.REQUIRED, example = "1668")
+    @ExcelProperty("id")
+    private Long id;
+
+    @Schema(description = "套餐名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "李四")
+    @ExcelProperty("套餐名称")
+    private String name;
+
+    @Schema(description = "套餐价格", requiredMode = Schema.RequiredMode.REQUIRED, example = "26254")
+    @ExcelProperty("套餐价格")
+    private Long price;
+
+    @Schema(description = "天数", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("天数")
+    private Integer day;
+
+    @Schema(description = "是否默认")
+    @ExcelProperty("是否默认")
+    private Boolean defaultPackage;
+
+    @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 = "3959")
+    @ExcelProperty("发布职位数量")
+    private Integer publishJobCount;
+
+    @Schema(description = "搜索人才的数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "14562")
+    @ExcelProperty("搜索人才的数量")
+    private Integer searchCount;
+
+    @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;
+
+}

+ 55 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/enterprise/vip/EnterprisePackageSaveReqVO.java

@@ -0,0 +1,55 @@
+package com.citu.module.menduner.system.controller.base.enterprise.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 EnterprisePackageSaveReqVO {
+
+    @Schema(description = "id", requiredMode = Schema.RequiredMode.REQUIRED, example = "1668")
+    private Long id;
+
+    @Schema(description = "套餐名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "李四")
+    @NotEmpty(message = "{1_100_053_002}")
+    private String name;
+
+    @Schema(description = "套餐价格", requiredMode = Schema.RequiredMode.REQUIRED, example = "26254")
+    @NotNull(message = "{1_100_053_003}")
+    private Long price;
+
+    @Schema(description = "天数", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotNull(message = "{1_100_053_004}")
+    private Integer day;
+
+    @Schema(description = "是否默认")
+    @NotNull(message = "{1_100_053_005}")
+    private Boolean defaultPackage;
+
+    @Schema(description = "是否推荐", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotNull(message = "{1_100_053_006}")
+    private Boolean recommend;
+
+    @Schema(description = "说明文本", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotEmpty(message = "{1_100_053_007}")
+    private String text;
+
+    @Schema(description = "发布职位数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "3959")
+    @NotNull(message = "{1_100_053_008}")
+    private Integer publishJobCount;
+
+    @Schema(description = "搜索人才的数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "14562")
+    @NotNull(message = "{1_100_053_009}")
+    private Integer searchCount;
+
+    @Schema(description = "排序")
+    private Integer sort;
+
+    @Schema(description = "状态(0正常 1停用 2隐藏)", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+    @NotEmpty(message = "{1_099_000_001}")
+    private String status;
+
+}

+ 0 - 3
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/job/JobAdvertisedPageReqVO.java

@@ -43,9 +43,6 @@ public class JobAdvertisedPageReqVO extends PageParam {
     @Schema(description = "学历要求", example = "1")
     private String eduType;
 
-    @Schema(description = "职位标签")
-    private List<String> tagList;
-
     @Schema(description = "是否雇佣 (众聘)")
     private boolean hire;
 

+ 3 - 3
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/app/recruit/job/vo/AppRecruitJobRenewalReqVO.java → menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/job/JobAdvertisedRenewalReqVO.java

@@ -1,13 +1,13 @@
-package com.citu.module.menduner.system.controller.app.recruit.job.vo;
+package com.citu.module.menduner.system.controller.base.job;
 
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 
 import java.time.LocalDateTime;
 
-@Schema(description = "招聘端 - 职位续期 Request VO")
+@Schema(description = "menduner - 职位续期 Request VO")
 @Data
-public class AppRecruitJobRenewalReqVO {
+public class JobAdvertisedRenewalReqVO {
 
     @Schema(description = "id", requiredMode = Schema.RequiredMode.REQUIRED, example = "4770")
     private Long id;

+ 0 - 8
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/job/JobAdvertisedSaveReqVO.java

@@ -73,22 +73,14 @@ public class JobAdvertisedSaveReqVO {
     @Schema(description = "过期时间")
     private LocalDateTime expireTime;
 
-    @Schema(description = "是否置顶")
-    private Boolean top;
-
     @Schema(description = "经度")
     private String longitude;
 
     @Schema(description = "维度")
     private String latitude;
 
-    @Schema(description = "是否雇佣 (众聘)")
-    private Boolean hire;
-
     @Schema(description = "雇佣金额")
     private Long hirePrice;
 
-    @Schema(description = "职位状态", example = "2")
-    private String status;
 
 }

+ 2 - 3
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/dataobject/enterprise/EnterpriseAuthDO.java

@@ -4,8 +4,7 @@ package com.citu.module.menduner.system.dal.dataobject.enterprise;
 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 io.swagger.v3.oas.annotations.media.Schema;
+import com.citu.framework.tenant.core.db.TenantBaseDO;
 import lombok.*;
 
 /**
@@ -21,7 +20,7 @@ import lombok.*;
 @Builder
 @NoArgsConstructor
 @AllArgsConstructor
-public class EnterpriseAuthDO extends BaseDO {
+public class EnterpriseAuthDO extends TenantBaseDO {
 
     /**
      * id

+ 47 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/dataobject/enterprise/EnterpriseEntitlementDO.java

@@ -0,0 +1,47 @@
+package com.citu.module.menduner.system.dal.dataobject.enterprise;
+
+
+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_enterprise_entitlement")
+@KeySequence("mde_enterprise_entitlement_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class EnterpriseEntitlementDO extends BaseDO {
+
+    /**
+     * id
+     */
+    @TableId
+    private Long id;
+    /**
+     * 企业id
+     */
+    private Long enterpriseId;
+    /**
+     * 用户id
+     */
+    private Long userId;
+    /**
+     * 发布职位数量
+     */
+    private Integer publishJobCount;
+    /**
+     * 搜索人才的数量
+     */
+    private Integer searchCount;
+
+}

+ 71 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/dataobject/enterprise/EnterprisePackageDO.java

@@ -0,0 +1,71 @@
+package com.citu.module.menduner.system.dal.dataobject.enterprise;
+
+
+import com.baomidou.mybatisplus.annotation.KeySequence;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.citu.framework.tenant.core.db.TenantBaseDO;
+import lombok.*;
+
+/**
+ * 企业套餐 DO
+ *
+ * @author Rayson
+ */
+@TableName("mde_enterprise_package")
+@KeySequence("mde_enterprise_package_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class EnterprisePackageDO extends TenantBaseDO {
+
+    /**
+     * id
+     */
+    @TableId
+    private Long id;
+    /**
+     * 套餐名称
+     */
+    private String name;
+    /**
+     * 套餐价格
+     */
+    private Long price;
+    /**
+     * 天数
+     */
+    private Integer day;
+    /**
+     * 是否默认
+     */
+    private Boolean defaultPackage;
+    /**
+     * 是否推荐
+     */
+    private Boolean recommend;
+    /**
+     * 说明文本
+     */
+    private String text;
+    /**
+     * 发布职位数量
+     */
+    private Integer publishJobCount;
+    /**
+     * 搜索人才的数量
+     */
+    private Integer searchCount;
+    /**
+     * 排序
+     */
+    private Integer sort;
+    /**
+     * 状态(0正常 1停用 2隐藏)
+     */
+    private String status;
+
+}

+ 2 - 2
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/dataobject/enterprise/EnterpriseTalentPoolDO.java

@@ -3,7 +3,7 @@ package com.citu.module.menduner.system.dal.dataobject.enterprise;
 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 com.citu.framework.tenant.core.db.TenantBaseDO;
 import lombok.*;
 
 /**
@@ -19,7 +19,7 @@ import lombok.*;
 @Builder
 @NoArgsConstructor
 @AllArgsConstructor
-public class EnterpriseTalentPoolDO extends BaseDO {
+public class EnterpriseTalentPoolDO extends TenantBaseDO {
 
     /**
      * id

+ 2 - 2
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/dataobject/enterprise/EnterpriseUserApplyDO.java

@@ -3,7 +3,7 @@ package com.citu.module.menduner.system.dal.dataobject.enterprise;
 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 com.citu.framework.tenant.core.db.TenantBaseDO;
 import lombok.*;
 
 /**
@@ -19,7 +19,7 @@ import lombok.*;
 @Builder
 @NoArgsConstructor
 @AllArgsConstructor
-public class EnterpriseUserApplyDO extends BaseDO {
+public class EnterpriseUserApplyDO extends TenantBaseDO {
 
     /**
      * id

+ 2 - 2
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/dataobject/hire/HireCommissionRatioDO.java

@@ -4,7 +4,7 @@ package com.citu.module.menduner.system.dal.dataobject.hire;
 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 com.citu.framework.tenant.core.db.TenantBaseDO;
 import lombok.*;
 
 import java.math.BigDecimal;
@@ -22,7 +22,7 @@ import java.math.BigDecimal;
 @Builder
 @NoArgsConstructor
 @AllArgsConstructor
-public class HireCommissionRatioDO extends BaseDO {
+public class HireCommissionRatioDO extends TenantBaseDO {
 
     /**
      * id

+ 2 - 1
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/dataobject/hunt/HuntDO.java

@@ -5,6 +5,7 @@ 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 com.citu.framework.tenant.core.db.TenantBaseDO;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.*;
 
@@ -21,7 +22,7 @@ import lombok.*;
 @Builder
 @NoArgsConstructor
 @AllArgsConstructor
-public class HuntDO extends BaseDO {
+public class HuntDO extends TenantBaseDO {
 
     /**
      * id

+ 2 - 1
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/dataobject/interview/InterviewInviteDO.java

@@ -5,6 +5,7 @@ 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 com.citu.framework.tenant.core.db.TenantBaseDO;
 import lombok.*;
 
 import java.time.LocalDateTime;
@@ -22,7 +23,7 @@ import java.time.LocalDateTime;
 @Builder
 @NoArgsConstructor
 @AllArgsConstructor
-public class InterviewInviteDO extends BaseDO {
+public class InterviewInviteDO extends TenantBaseDO {
 
     /**
      * id

+ 2 - 1
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/dataobject/invite/EnterpriseInviteDO.java

@@ -5,6 +5,7 @@ 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 com.citu.framework.tenant.core.db.TenantBaseDO;
 import lombok.*;
 
 /**
@@ -20,7 +21,7 @@ import lombok.*;
 @Builder
 @NoArgsConstructor
 @AllArgsConstructor
-public class EnterpriseInviteDO extends BaseDO {
+public class EnterpriseInviteDO extends TenantBaseDO {
 
     /**
      * id

+ 2 - 1
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/dataobject/invite/EnterpriseInviteRecordDO.java

@@ -5,6 +5,7 @@ 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 com.citu.framework.tenant.core.db.TenantBaseDO;
 import lombok.*;
 
 /**
@@ -20,7 +21,7 @@ import lombok.*;
 @Builder
 @NoArgsConstructor
 @AllArgsConstructor
-public class EnterpriseInviteRecordDO extends BaseDO {
+public class EnterpriseInviteRecordDO extends TenantBaseDO {
 
     /**
      * id

+ 2 - 1
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/dataobject/order/TradeOrderDO.java

@@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.citu.framework.common.enums.TerminalEnum;
 import com.citu.framework.mybatis.core.dataobject.BaseDO;
+import com.citu.framework.tenant.core.db.TenantBaseDO;
 import com.citu.module.menduner.system.enums.order.TradeOrderCancelTypeEnum;
 import com.citu.module.menduner.system.enums.order.TradeOrderRefundStatusEnum;
 import com.citu.module.menduner.system.enums.order.TradeOrderStatusEnum;
@@ -27,7 +28,7 @@ import java.time.LocalDateTime;
 @Builder
 @NoArgsConstructor
 @AllArgsConstructor
-public class TradeOrderDO extends BaseDO {
+public class TradeOrderDO extends TenantBaseDO {
 
     /**
      * 订单编号,自增

+ 2 - 4
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/dataobject/record/UserAccountRecordDO.java

@@ -3,11 +3,9 @@ package com.citu.module.menduner.system.dal.dataobject.record;
 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 com.citu.framework.tenant.core.db.TenantBaseDO;
 import lombok.*;
 
-import java.math.BigDecimal;
-
 /**
  * 用户账户变动记录 DO
  *
@@ -21,7 +19,7 @@ import java.math.BigDecimal;
 @Builder
 @NoArgsConstructor
 @AllArgsConstructor
-public class UserAccountRecordDO extends BaseDO {
+public class UserAccountRecordDO extends TenantBaseDO {
 
     /**
      * 自增主键

+ 2 - 4
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/dataobject/redeem/RedeemDO.java

@@ -1,12 +1,10 @@
 package com.citu.module.menduner.system.dal.dataobject.redeem;
 
 
-import com.alibaba.excel.annotation.ExcelProperty;
 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 io.swagger.v3.oas.annotations.media.Schema;
+import com.citu.framework.tenant.core.db.TenantBaseDO;
 import lombok.*;
 
 /**
@@ -22,7 +20,7 @@ import lombok.*;
 @Builder
 @NoArgsConstructor
 @AllArgsConstructor
-public class RedeemDO extends BaseDO {
+public class RedeemDO extends TenantBaseDO {
 
     /**
      * id

+ 5 - 6
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/dataobject/tag/TagDO.java

@@ -1,12 +1,11 @@
 package com.citu.module.menduner.system.dal.dataobject.tag;
 
 
+import com.baomidou.mybatisplus.annotation.KeySequence;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.citu.framework.tenant.core.db.TenantBaseDO;
 import lombok.*;
-import java.util.*;
-import java.time.LocalDateTime;
-import java.time.LocalDateTime;
-import com.baomidou.mybatisplus.annotation.*;
-import com.citu.framework.mybatis.core.dataobject.BaseDO;
 
 /**
  * 标签管理 DO
@@ -21,7 +20,7 @@ import com.citu.framework.mybatis.core.dataobject.BaseDO;
 @Builder
 @NoArgsConstructor
 @AllArgsConstructor
-public class TagDO extends BaseDO {
+public class TagDO extends TenantBaseDO {
 
     /**
      * id

+ 2 - 2
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/dataobject/unfit/UnfitCandidateDO.java

@@ -4,7 +4,7 @@ package com.citu.module.menduner.system.dal.dataobject.unfit;
 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 com.citu.framework.tenant.core.db.TenantBaseDO;
 import lombok.*;
 
 /**
@@ -20,7 +20,7 @@ import lombok.*;
 @Builder
 @NoArgsConstructor
 @AllArgsConstructor
-public class UnfitCandidateDO extends BaseDO {
+public class UnfitCandidateDO extends TenantBaseDO {
 
     /**
      * id

+ 2 - 4
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/dataobject/user/UserAccountDO.java

@@ -4,11 +4,9 @@ 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 com.citu.framework.tenant.core.db.TenantBaseDO;
 import lombok.*;
 
-import java.math.BigDecimal;
-
 /**
  * 用户账户 DO
  *
@@ -22,7 +20,7 @@ import java.math.BigDecimal;
 @Builder
 @NoArgsConstructor
 @AllArgsConstructor
-public class UserAccountDO extends BaseDO {
+public class UserAccountDO extends TenantBaseDO {
 
     /**
      * id

+ 2 - 2
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/dataobject/user/UserAuthDO.java

@@ -2,7 +2,7 @@ package com.citu.module.menduner.system.dal.dataobject.user;
 
 
 import com.baomidou.mybatisplus.annotation.*;
-import com.citu.framework.mybatis.core.dataobject.BaseDO;
+import com.citu.framework.tenant.core.db.TenantBaseDO;
 import lombok.*;
 
 import java.time.LocalDateTime;
@@ -20,7 +20,7 @@ import java.time.LocalDateTime;
 @Builder
 @NoArgsConstructor
 @AllArgsConstructor
-public class UserAuthDO extends BaseDO {
+public class UserAuthDO extends TenantBaseDO {
 
     /**
      * id

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

@@ -4,7 +4,7 @@ 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 com.citu.framework.tenant.core.db.TenantBaseDO;
 import lombok.*;
 
 /**
@@ -20,7 +20,7 @@ import lombok.*;
 @Builder
 @NoArgsConstructor
 @AllArgsConstructor
-public class UserEntitlementDO extends BaseDO {
+public class UserEntitlementDO extends TenantBaseDO {
 
     /**
      * id

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

@@ -4,7 +4,7 @@ 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 com.citu.framework.tenant.core.db.TenantBaseDO;
 import lombok.*;
 
 /**
@@ -20,7 +20,7 @@ import lombok.*;
 @Builder
 @NoArgsConstructor
 @AllArgsConstructor
-public class UserPackageDO extends BaseDO {
+public class UserPackageDO extends TenantBaseDO {
 
     /**
      * id

+ 27 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/mysql/enterprise/EnterpriseEntitlementMapper.java

@@ -0,0 +1,27 @@
+package com.citu.module.menduner.system.dal.mysql.enterprise;
+
+
+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.enterprise.vip.EnterpriseEntitlementPageReqVO;
+import com.citu.module.menduner.system.dal.dataobject.enterprise.EnterpriseEntitlementDO;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 企业权益记录 Mapper
+ *
+ * @author Rayson
+ */
+@Mapper
+public interface EnterpriseEntitlementMapper extends BaseMapperX<EnterpriseEntitlementDO> {
+
+    default PageResult<EnterpriseEntitlementDO> selectPage(EnterpriseEntitlementPageReqVO reqVO) {
+        return selectPage(reqVO, new LambdaQueryWrapperX<EnterpriseEntitlementDO>()
+                .eqIfPresent(EnterpriseEntitlementDO::getEnterpriseId, reqVO.getEnterpriseId())
+                .eqIfPresent(EnterpriseEntitlementDO::getUserId, reqVO.getUserId())
+                .betweenIfPresent(EnterpriseEntitlementDO::getCreateTime, reqVO.getCreateTime())
+                .orderByDesc(EnterpriseEntitlementDO::getId));
+    }
+
+}

+ 28 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/mysql/enterprise/EnterprisePackageMapper.java

@@ -0,0 +1,28 @@
+package com.citu.module.menduner.system.dal.mysql.enterprise;
+
+
+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.enterprise.vip.EnterprisePackagePageReqVO;
+import com.citu.module.menduner.system.dal.dataobject.enterprise.EnterprisePackageDO;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 企业套餐 Mapper
+ *
+ * @author Rayson
+ */
+@Mapper
+public interface EnterprisePackageMapper extends BaseMapperX<EnterprisePackageDO> {
+
+    default PageResult<EnterprisePackageDO> selectPage(EnterprisePackagePageReqVO reqVO) {
+        return selectPage(reqVO, new LambdaQueryWrapperX<EnterprisePackageDO>()
+                .likeIfPresent(EnterprisePackageDO::getName, reqVO.getName())
+                .eqIfPresent(EnterprisePackageDO::getRecommend, reqVO.getRecommend())
+                .eqIfPresent(EnterprisePackageDO::getStatus, reqVO.getStatus())
+                .betweenIfPresent(EnterprisePackageDO::getCreateTime, reqVO.getCreateTime())
+                .orderByDesc(EnterprisePackageDO::getId));
+    }
+
+}

+ 10 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/mysql/enterprise/EnterpriseUserBindMapper.java

@@ -17,6 +17,7 @@ import com.citu.module.menduner.system.controller.base.enterprise.bind.Enterpris
 import com.citu.module.menduner.system.dal.dataobject.enterprise.EnterpriseDO;
 import com.citu.module.menduner.system.dal.dataobject.enterprise.EnterpriseUserBindDO;
 import com.citu.module.menduner.system.enums.MendunerStatusEnum;
+import com.citu.module.menduner.system.enums.enterprise.EnterpriseUserTypeEnum;
 import org.apache.ibatis.annotations.Mapper;
 
 import java.util.List;
@@ -104,6 +105,15 @@ public interface EnterpriseUserBindMapper extends BaseMapperX<EnterpriseUserBind
                 .eqIfPresent(EnterpriseUserBindDO::getUserId, userId)
         );
     }
+    /** 根据企业id获取企业管理员 **/
+    default EnterpriseUserBindDO selectByEnterpriseAdmin(Long enterpriseId) {
+        return selectOne(new LambdaQueryWrapperX<EnterpriseUserBindDO>()
+                .eqIfPresent(EnterpriseUserBindDO::getEnterpriseId, enterpriseId)
+                .eq(EnterpriseUserBindDO::getUserType, EnterpriseUserTypeEnum.ADMIN.getType().toString())
+        );
+    }
+
+
 
     /** 根据企业id和id查询企业用户信息 **/
     default EnterpriseUserBindDO selectByEnterpriseIdAndId(Long enterpriseId, Long id) {

+ 8 - 8
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/mysql/person/PersonInfoMapper.java

@@ -13,7 +13,7 @@ import com.citu.module.menduner.system.controller.base.person.info.PersonInfoRes
 import com.citu.module.menduner.system.dal.dataobject.enterprise.EnterpriseTalentPoolDO;
 import com.citu.module.menduner.system.dal.dataobject.job.JobInterestedDO;
 import com.citu.module.menduner.system.dal.dataobject.person.PersonInfoDO;
-import com.citu.module.menduner.system.util.MdeInnerUtils;
+import com.citu.module.menduner.system.util.JoinHelper;
 import org.apache.ibatis.annotations.Mapper;
 
 import java.time.LocalDate;
@@ -61,7 +61,7 @@ public interface PersonInfoMapper extends BaseMapperX<PersonInfoDO> {
         );
 
         // 连接用户表设置vip条件
-        MdeInnerUtils.joinAndFilterVipUser(query, PersonInfoDO::getUserId);
+        JoinHelper.joinAndFilterVipUser(query, PersonInfoDO::getUserId);
 
         query
                 .likeIfPresent(PersonInfoDO::getName, reqVO.getName())
@@ -103,9 +103,9 @@ public interface PersonInfoMapper extends BaseMapperX<PersonInfoDO> {
         query.likeIfPresent(PersonInfoDO::getName, reqVO.getName());
         query.eqIfPresent(PersonInfoDO::getSex, reqVO.getSex());
         // 连接用户表设置vip条件
-        MdeInnerUtils.joinAndFilterVipUser(query, PersonInfoDO::getUserId);
+        JoinHelper.joinAndFilterVipUser(query, PersonInfoDO::getUserId);
         // 过滤屏蔽用户
-        MdeInnerUtils.filterBlockedUsersForEnterprise(query, PersonInfoDO::getUserId,enterpriseId);
+        JoinHelper.filterBlockedUsersForEnterprise(query, PersonInfoDO::getUserId,enterpriseId);
         if (null != reqVO.getAge()) {
             LocalDate now = LocalDate.now(ZoneId.systemDefault());
             if (reqVO.getAge().length >= 1) {
@@ -151,9 +151,9 @@ public interface PersonInfoMapper extends BaseMapperX<PersonInfoDO> {
         query.selectAsClass(PersonInfoDO.class, PersonInfoRespVO.class);
 
         // 连接用户表设置vip条件
-        MdeInnerUtils.joinAndFilterVipUser(query, PersonInfoDO::getUserId);
+        JoinHelper.joinAndFilterVipUser(query, PersonInfoDO::getUserId);
         // 过滤屏蔽用户
-        MdeInnerUtils.filterBlockedUsersForEnterprise(query, PersonInfoDO::getUserId,enterpriseId);
+        JoinHelper.filterBlockedUsersForEnterprise(query, PersonInfoDO::getUserId,enterpriseId);
         // 求职意向
         query.leftJoin(JobInterestedDO.class, JobInterestedDO::getUserId, PersonInfoDO::getUserId);
 
@@ -205,9 +205,9 @@ public interface PersonInfoMapper extends BaseMapperX<PersonInfoDO> {
         query.selectAsClass(PersonInfoDO.class, PersonInfoRespVO.class);
         query.inIfPresent(PersonInfoDO::getUserId, ids);
         // 连接用户表设置vip条件
-        MdeInnerUtils.joinAndFilterVipUser(query, PersonInfoDO::getUserId);
+        JoinHelper.joinAndFilterVipUser(query, PersonInfoDO::getUserId);
         // 过滤屏蔽用户
-        MdeInnerUtils.filterBlockedUsersForEnterprise(query, PersonInfoDO::getUserId,enterpriseId);
+        JoinHelper.filterBlockedUsersForEnterprise(query, PersonInfoDO::getUserId,enterpriseId);
         query.orderByDesc(PersonInfoDO::getUpdateTime);
         return selectJoinPage(pageParam, PersonInfoRespVO.class, query);
     }

+ 2 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/framework/rpc/config/RpcConfiguration.java

@@ -5,6 +5,7 @@ import com.citu.module.pay.api.order.PayOrderApi;
 import com.citu.module.pay.api.refund.PayRefundApi;
 import com.citu.module.pay.api.wallet.PayWalletApi;
 import com.citu.module.system.api.logger.LoginLogApi;
+import com.citu.module.system.api.mail.MailSendApi;
 import com.citu.module.system.api.sms.SmsCodeApi;
 import com.citu.module.system.api.social.SocialClientApi;
 import com.citu.module.system.api.social.SocialUserApi;
@@ -17,6 +18,7 @@ import org.springframework.context.annotation.Configuration;
         LoginLogApi.class,
         SocialUserApi.class,
         SocialClientApi.class,
+        MailSendApi.class,
         PayOrderApi.class,
         PayRefundApi.class,
         PayWalletApi.class,

+ 5 - 1
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/eduexp/EduExpServiceImpl.java

@@ -3,6 +3,7 @@ package com.citu.module.menduner.system.service.eduexp;
 import com.baomidou.dynamic.datasource.annotation.DSTransactional;
 import com.citu.framework.common.pojo.PageResult;
 import com.citu.framework.common.util.object.BeanUtils;
+import com.citu.framework.mybatis.core.query.LambdaQueryWrapperX;
 import com.citu.module.menduner.common.util.LoginUserContext;
 import com.citu.module.menduner.system.controller.app.jobhunt.person.eduexp.AppEduExpSaveReqVO;
 import com.citu.module.menduner.system.controller.base.eduexp.EduExpPageReqVO;
@@ -111,6 +112,9 @@ public class EduExpServiceImpl implements EduExpService {
 
     @Override
     public List<EduExpDO> getEduExpList() {
-        return eduExpMapper.selectList(EduExpDO::getUserId, LoginUserContext.getUserId());
+        return eduExpMapper.selectList(new LambdaQueryWrapperX<EduExpDO>()
+                .eq(EduExpDO::getUserId, LoginUserContext.getUserId())
+                .orderByDesc(EduExpDO::getStartTime)
+        );
     }
 }

+ 8 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/enterprise/bind/EnterpriseUserBindService.java

@@ -100,6 +100,14 @@ public interface EnterpriseUserBindService {
      **/
     EnterpriseUserBindDO selectByEnterpriseIdAndUserId(Long enterpriseId, Long userId);
 
+    /**
+     * 获取企业管理员信息
+     *
+     * @param enterpriseId
+     * @return
+     **/
+    EnterpriseUserBindDO getByEnterpriseAdmin(Long enterpriseId);
+
     /**
      * 判断是否是管理员
      *

+ 5 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/enterprise/bind/EnterpriseUserBindServiceImpl.java

@@ -154,6 +154,11 @@ public class EnterpriseUserBindServiceImpl implements EnterpriseUserBindService
         return mapper.selectByEnterpriseIdAndUserId(enterpriseId, userId);
     }
 
+    @Override
+    public EnterpriseUserBindDO getByEnterpriseAdmin(Long enterpriseId) {
+        return mapper.selectByEnterpriseAdmin(enterpriseId);
+    }
+
     @Override
     public boolean checkIsAdmin(EnterpriseUserBindDO userBindDO) {
         if (null == userBindDO) {

+ 68 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/enterprise/vip/EnterpriseEntitlementService.java

@@ -0,0 +1,68 @@
+package com.citu.module.menduner.system.service.enterprise.vip;
+
+
+import com.citu.framework.common.pojo.PageResult;
+import com.citu.module.menduner.system.controller.base.enterprise.vip.EnterpriseEntitlementPageReqVO;
+import com.citu.module.menduner.system.controller.base.enterprise.vip.EnterpriseEntitlementRespVO;
+import com.citu.module.menduner.system.controller.base.enterprise.vip.EnterpriseEntitlementSaveReqVO;
+import com.citu.module.menduner.system.dal.dataobject.enterprise.EnterpriseEntitlementDO;
+
+import javax.validation.Valid;
+
+/**
+ * 企业权益记录 Service 接口
+ *
+ * @author Rayson
+ */
+public interface EnterpriseEntitlementService {
+
+    /**
+     * 创建企业权益记录
+     *
+     * @param createReqVO 创建信息
+     * @return 编号
+     */
+    Long createEnterpriseEntitlement(@Valid EnterpriseEntitlementSaveReqVO createReqVO);
+
+    /**
+     * 更新企业权益记录
+     *
+     * @param updateReqVO 更新信息
+     */
+    void updateEnterpriseEntitlement(@Valid EnterpriseEntitlementSaveReqVO updateReqVO);
+
+    /**
+     * 删除企业权益记录
+     *
+     * @param id 编号
+     */
+    void deleteEnterpriseEntitlement(Long id);
+
+    /**
+     * 获得企业权益记录
+     *
+     * @param id 编号
+     * @return 企业权益记录
+     */
+    EnterpriseEntitlementDO getEnterpriseEntitlement(Long id);
+
+    /**
+     * 获得企业权益记录分页
+     *
+     * @param pageReqVO 分页查询
+     * @return 企业权益记录分页
+     */
+    PageResult<EnterpriseEntitlementDO> getEnterpriseEntitlementPage(EnterpriseEntitlementPageReqVO pageReqVO);
+
+    /**
+     * 根据企业编号和用户编号获得企业权益记录
+     *
+     * @param enterpriseId 企业编号
+     * @param userId 用户编号
+     * @return 企业权益记录
+     */
+    EnterpriseEntitlementRespVO getByEnterpriseIdAndUserId(Long enterpriseId, Long userId);
+
+    /** 修改 **/
+    void update(EnterpriseEntitlementDO entitlementDO);
+}

+ 128 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/enterprise/vip/EnterpriseEntitlementServiceImpl.java

@@ -0,0 +1,128 @@
+package com.citu.module.menduner.system.service.enterprise.vip;
+
+import com.citu.framework.common.pojo.PageResult;
+import com.citu.framework.common.util.object.BeanUtils;
+import com.citu.module.menduner.system.controller.base.enterprise.vip.EnterpriseEntitlementPageReqVO;
+import com.citu.module.menduner.system.controller.base.enterprise.vip.EnterpriseEntitlementRespVO;
+import com.citu.module.menduner.system.controller.base.enterprise.vip.EnterpriseEntitlementSaveReqVO;
+import com.citu.module.menduner.system.controller.base.enterprise.vip.EnterprisePackageRespVO;
+import com.citu.module.menduner.system.dal.dataobject.enterprise.EnterpriseEntitlementDO;
+import com.citu.module.menduner.system.dal.dataobject.enterprise.EnterprisePackageDO;
+import com.citu.module.menduner.system.dal.dataobject.enterprise.EnterpriseUserBindDO;
+import com.citu.module.menduner.system.dal.mysql.enterprise.EnterpriseEntitlementMapper;
+import com.citu.module.menduner.system.service.enterprise.bind.EnterpriseUserBindService;
+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.ENTERPRISE_ENTITLEMENT_NOT_EXISTS;
+
+/**
+ * 企业权益记录 Service 实现类
+ *
+ * @author Rayson
+ */
+@Service
+@Validated
+public class EnterpriseEntitlementServiceImpl implements EnterpriseEntitlementService {
+
+    @Resource
+    private EnterpriseEntitlementMapper mapper;
+
+    @Resource
+    private EnterprisePackageService enterprisePackageService;
+
+    @Resource
+    private EnterpriseUserBindService enterpriseBindService;
+
+    @Override
+    public Long createEnterpriseEntitlement(EnterpriseEntitlementSaveReqVO createReqVO) {
+        // 插入
+        EnterpriseEntitlementDO enterpriseEntitlement = BeanUtils.toBean(createReqVO, EnterpriseEntitlementDO.class);
+        mapper.insert(enterpriseEntitlement);
+        // 返回
+        return enterpriseEntitlement.getId();
+    }
+
+    @Override
+    public void updateEnterpriseEntitlement(EnterpriseEntitlementSaveReqVO updateReqVO) {
+        // 校验存在
+        validateEnterpriseEntitlementExists(updateReqVO.getId());
+        // 更新
+        EnterpriseEntitlementDO updateObj = BeanUtils.toBean(updateReqVO, EnterpriseEntitlementDO.class);
+        mapper.updateById(updateObj);
+    }
+
+    @Override
+    public void deleteEnterpriseEntitlement(Long id) {
+        // 校验存在
+        validateEnterpriseEntitlementExists(id);
+        // 删除
+        mapper.deleteById(id);
+    }
+
+    private void validateEnterpriseEntitlementExists(Long id) {
+        if (mapper.selectById(id) == null) {
+            throw exception(ENTERPRISE_ENTITLEMENT_NOT_EXISTS);
+        }
+    }
+
+    @Override
+    public EnterpriseEntitlementDO getEnterpriseEntitlement(Long id) {
+        return mapper.selectById(id);
+    }
+
+    @Override
+    public PageResult<EnterpriseEntitlementDO> getEnterpriseEntitlementPage(EnterpriseEntitlementPageReqVO pageReqVO) {
+        return mapper.selectPage(pageReqVO);
+    }
+
+    @Override
+    public EnterpriseEntitlementRespVO getByEnterpriseIdAndUserId(Long enterpriseId, Long userId) {
+        // 获取默认套餐
+        EnterprisePackageDO packageDO = enterprisePackageService.getDefaultPackage();
+        EnterprisePackageRespVO packageVO = BeanUtils.toBean(packageDO, EnterprisePackageRespVO.class);
+        // 查询额度
+        EnterpriseEntitlementDO enterpriseEntitlement = mapper.selectOne(EnterpriseEntitlementDO::getEnterpriseId, enterpriseId,
+                EnterpriseEntitlementDO::getUserId, userId);
+        if (null != enterpriseEntitlement) {
+            EnterpriseEntitlementRespVO respVO =
+                    BeanUtils.toBean(enterpriseEntitlement, EnterpriseEntitlementRespVO.class);
+            respVO.setPackageInfo(packageVO);
+            return respVO;
+        }
+
+        // 查询用户信息
+        EnterpriseUserBindDO userBind = enterpriseBindService.selectByEnterpriseIdAndUserId(enterpriseId, userId);
+        if (enterpriseBindService.checkIsAdmin(userBind)) {
+            // 管理员
+            // 创建权益
+            EnterpriseEntitlementDO insert = EnterpriseEntitlementDO.builder()
+                    .enterpriseId(enterpriseId)
+                    .userId(userId)
+                    .publishJobCount(packageDO.getPublishJobCount())
+                    .searchCount(packageDO.getSearchCount())
+                    .build();
+            mapper.insert(insert);
+            EnterpriseEntitlementRespVO respVO =
+                    BeanUtils.toBean(insert, EnterpriseEntitlementRespVO.class);
+            respVO.setPackageInfo(packageVO);
+            return respVO;
+        }
+
+
+        // 普通用户
+        // 找出管理员
+        EnterpriseUserBindDO admin = enterpriseBindService.getByEnterpriseAdmin(userBind.getEnterpriseId());
+        // 创建 or 返回管理员的数据,额度目前都在管理员身上
+        return getByEnterpriseIdAndUserId(admin.getEnterpriseId(), admin.getUserId());
+
+    }
+
+    @Override
+    public void update(EnterpriseEntitlementDO entitlementDO) {
+        mapper.updateById(entitlementDO);
+    }
+}

+ 62 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/enterprise/vip/EnterprisePackageService.java

@@ -0,0 +1,62 @@
+package com.citu.module.menduner.system.service.enterprise.vip;
+
+
+import com.citu.framework.common.pojo.PageResult;
+import com.citu.module.menduner.system.controller.base.enterprise.vip.EnterprisePackagePageReqVO;
+import com.citu.module.menduner.system.controller.base.enterprise.vip.EnterprisePackageSaveReqVO;
+import com.citu.module.menduner.system.dal.dataobject.enterprise.EnterprisePackageDO;
+
+import javax.validation.Valid;
+
+/**
+ * 企业套餐 Service 接口
+ *
+ * @author Rayson
+ */
+public interface EnterprisePackageService {
+
+    /**
+     * 创建企业套餐
+     *
+     * @param createReqVO 创建信息
+     * @return 编号
+     */
+    Long createEnterprisePackage(@Valid EnterprisePackageSaveReqVO createReqVO);
+
+    /**
+     * 更新企业套餐
+     *
+     * @param updateReqVO 更新信息
+     */
+    void updateEnterprisePackage(@Valid EnterprisePackageSaveReqVO updateReqVO);
+
+    /**
+     * 删除企业套餐
+     *
+     * @param id 编号
+     */
+    void deleteEnterprisePackage(Long id);
+
+    /**
+     * 获得企业套餐
+     *
+     * @param id 编号
+     * @return 企业套餐
+     */
+    EnterprisePackageDO getEnterprisePackage(Long id);
+
+    /**
+     * 获得企业套餐分页
+     *
+     * @param pageReqVO 分页查询
+     * @return 企业套餐分页
+     */
+    PageResult<EnterprisePackageDO> getEnterprisePackagePage(EnterprisePackagePageReqVO pageReqVO);
+
+    /**
+     * 获得默认套餐
+     *
+     * @return 默认套餐
+     */
+    EnterprisePackageDO getDefaultPackage();
+}

+ 80 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/enterprise/vip/EnterprisePackageServiceImpl.java

@@ -0,0 +1,80 @@
+package com.citu.module.menduner.system.service.enterprise.vip;
+
+
+import com.citu.framework.common.pojo.PageResult;
+import com.citu.framework.common.util.object.BeanUtils;
+import com.citu.module.menduner.system.controller.base.enterprise.vip.EnterprisePackagePageReqVO;
+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.dal.mysql.enterprise.EnterprisePackageMapper;
+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.ENTERPRISE_PACKAGE_NOT_EXISTS;
+
+/**
+ * 企业套餐 Service 实现类
+ *
+ * @author Rayson
+ */
+@Service
+@Validated
+public class EnterprisePackageServiceImpl implements EnterprisePackageService {
+
+    @Resource
+    private EnterprisePackageMapper mapper;
+
+    @Override
+    public Long createEnterprisePackage(EnterprisePackageSaveReqVO createReqVO) {
+        // 插入
+        EnterprisePackageDO enterprisePackage = BeanUtils.toBean(createReqVO, EnterprisePackageDO.class);
+        mapper.insert(enterprisePackage);
+        // 返回
+        return enterprisePackage.getId();
+    }
+
+    @Override
+    public void updateEnterprisePackage(EnterprisePackageSaveReqVO updateReqVO) {
+        // 校验存在
+        validateEnterprisePackageExists(updateReqVO.getId());
+        // 更新
+        EnterprisePackageDO updateObj = BeanUtils.toBean(updateReqVO, EnterprisePackageDO.class);
+        mapper.updateById(updateObj);
+    }
+
+    @Override
+    public void deleteEnterprisePackage(Long id) {
+        // 校验存在
+        validateEnterprisePackageExists(id);
+        // 删除
+        mapper.deleteById(id);
+    }
+
+    private void validateEnterprisePackageExists(Long id) {
+        if (mapper.selectById(id) == null) {
+            throw exception(ENTERPRISE_PACKAGE_NOT_EXISTS);
+        }
+    }
+
+    @Override
+    public EnterprisePackageDO getEnterprisePackage(Long id) {
+        return mapper.selectById(id);
+    }
+
+    @Override
+    public PageResult<EnterprisePackageDO> getEnterprisePackagePage(EnterprisePackagePageReqVO pageReqVO) {
+        return mapper.selectPage(pageReqVO);
+    }
+
+    @Override
+    public EnterprisePackageDO getDefaultPackage() {
+        EnterprisePackageDO defaultPackage = mapper.selectOne(EnterprisePackageDO::getDefaultPackage, true);
+        if (null == defaultPackage) {
+            throw exception(ENTERPRISE_PACKAGE_NOT_EXISTS);
+        }
+        return defaultPackage;
+    }
+}

+ 12 - 4
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/job/JobAdvertisedService.java

@@ -5,7 +5,7 @@ import com.citu.framework.common.pojo.PageParam;
 import com.citu.framework.common.pojo.PageResult;
 import com.citu.module.menduner.system.controller.app.jobhunt.job.vo.AppJobAdvertisedHomeRespVO;
 import com.citu.module.menduner.system.controller.app.jobhunt.job.vo.AppJobAdvertisedPageReqVO;
-import com.citu.module.menduner.system.controller.app.recruit.job.vo.AppRecruitJobRenewalReqVO;
+import com.citu.module.menduner.system.controller.base.job.JobAdvertisedRenewalReqVO;
 import com.citu.module.menduner.system.controller.app.recruit.job.vo.AppRecruitJobSaveReqVO;
 import com.citu.module.menduner.system.controller.app.recruit.job.vo.AppRecruitJobSimpleRespVO;
 import com.citu.module.menduner.system.controller.base.CommonRespVO;
@@ -66,6 +66,14 @@ public interface JobAdvertisedService {
      */
     PageResult<JobAdvertisedDO> getJobAdvertisedPage(JobAdvertisedPageReqVO pageReqVO);
 
+    /**
+     * 获得全员猎聘职位分页
+     *
+     * @param page 分页查询
+     * @return 招聘职位分页
+     */
+    PageResult<JobAdvertisedDO> getHireJobPage(JobAdvertisedPageReqVO page);
+
     /**
      * 获得招聘职位列表
      *
@@ -137,12 +145,12 @@ public interface JobAdvertisedService {
     /**
      * 开启职位
      **/
-    boolean enable(List<Long> ids);
+    void enable(List<Long> ids);
 
     /**
      * 关闭职位
      **/
-    boolean disable(List<Long> ids);
+    void disable(List<Long> ids);
 
     /**
      * 刷新职位
@@ -169,7 +177,7 @@ public interface JobAdvertisedService {
     /**
      * 续期职位
      **/
-    void renewal(AppRecruitJobRenewalReqVO reqVO);
+    void renewal(JobAdvertisedRenewalReqVO reqVO);
 
 
     /**

+ 117 - 66
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/job/JobAdvertisedServiceImpl.java

@@ -10,21 +10,19 @@ 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.module.menduner.common.util.LoginUserContext;
+import com.citu.module.menduner.system.aop.VipEntitlementCheck;
+import com.citu.module.menduner.system.aop.VipEntitlementCheckAspect;
 import com.citu.module.menduner.system.api.python.GraphApi;
 import com.citu.module.menduner.system.api.python.GraphQueryPageDTO;
 import com.citu.module.menduner.system.api.python.GraphSendDTO;
 import com.citu.module.menduner.system.controller.app.jobhunt.job.vo.AppJobAdvertisedHomeRespVO;
 import com.citu.module.menduner.system.controller.app.jobhunt.job.vo.AppJobAdvertisedPageReqVO;
-import com.citu.module.menduner.system.controller.app.recruit.job.vo.AppRecruitJobRenewalReqVO;
 import com.citu.module.menduner.system.controller.app.recruit.job.vo.AppRecruitJobSaveReqVO;
 import com.citu.module.menduner.system.controller.app.recruit.job.vo.AppRecruitJobSimpleRespVO;
 import com.citu.module.menduner.system.controller.base.CommonRespVO;
 import com.citu.module.menduner.system.controller.base.analysis.RecruitAnalysisPageReqVO;
 import com.citu.module.menduner.system.controller.base.analysis.RecruitJobAnalysisRespVO;
-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.JobAdvertisedRespVO;
-import com.citu.module.menduner.system.controller.base.job.JobAdvertisedSaveReqVO;
+import com.citu.module.menduner.system.controller.base.job.*;
 import com.citu.module.menduner.system.convert.JobAdvertisedConvert;
 import com.citu.module.menduner.system.dal.dataobject.job.JobAdvertisedDO;
 import com.citu.module.menduner.system.dal.mysql.job.JobAdvertisedMapper;
@@ -64,29 +62,30 @@ import static com.citu.module.menduner.system.enums.ErrorCodeConstants.*;
 @Validated
 public class JobAdvertisedServiceImpl implements JobAdvertisedService {
 
+    /** 默认管理员的企业id和用户id **/
+    private static final Long DEFAULT_ENTERPRISE_ID = 1L;
+    private static final Long DEFAULT_USER_ID = 1L;
     @Resource
     private JobAdvertisedMapper mapper;
-
     @Resource
     private ESProducer esProducer;
-
     @Resource
     private GraphProducer producer;
-
     @Resource
     private GraphApi graphApi;
-
     @Resource
     private RedisTemplate<String, Object> redisTemplate;
-
+    @Resource
+    private VipEntitlementCheckAspect vipEntitlementCheckAspect;
 
     @Override
     public Long createJobAdvertised(JobAdvertisedSaveReqVO createReqVO) {
         // 插入
         JobAdvertisedDO jobAdvertised = BeanUtils.toBean(createReqVO, JobAdvertisedDO.class);
-        mapper.insert(jobAdvertised);
-        // 返回
-        return jobAdvertised.getId();
+        jobAdvertised.setStatus(JobStatusEnum.ENABLE.getStatus());
+        jobAdvertised.setTop(false);
+        jobAdvertised.setHire(true);
+        return save(jobAdvertised,  DEFAULT_ENTERPRISE_ID, DEFAULT_USER_ID);
     }
 
     @Override
@@ -95,7 +94,7 @@ public class JobAdvertisedServiceImpl implements JobAdvertisedService {
         validateJobAdvertisedExists(updateReqVO.getId());
         // 更新
         JobAdvertisedDO updateObj = BeanUtils.toBean(updateReqVO, JobAdvertisedDO.class);
-        mapper.updateById(updateObj);
+        save(updateObj, DEFAULT_ENTERPRISE_ID, DEFAULT_USER_ID);
     }
 
     @Override
@@ -122,6 +121,13 @@ public class JobAdvertisedServiceImpl implements JobAdvertisedService {
         return mapper.selectPage(pageReqVO);
     }
 
+    @Override
+    public PageResult<JobAdvertisedDO> getHireJobPage(JobAdvertisedPageReqVO page) {
+        page.setEnterpriseId(DEFAULT_ENTERPRISE_ID);
+        page.setEnterpriseId(DEFAULT_USER_ID);
+        return mapper.selectPage(page);
+    }
+
     @Override
     public List<JobAdvertisedDO> list(JobAdvertisedReqVO reqVO) {
         return mapper.list(reqVO);
@@ -335,68 +341,113 @@ public class JobAdvertisedServiceImpl implements JobAdvertisedService {
         JobAdvertisedDO job = JobAdvertisedConvert.INSTANCE.convert3(reqVO);
         Long userId = LoginUserContext.getUserId();
         Long enterpriseId = LoginUserContext.getEnterpriseId();
-        boolean exists = mapper.existByName(enterpriseId, userId, null == reqVO.getId() ? null : reqVO.getId(), reqVO.getName());
-        if (exists) {
-            throw exception(MDE_JOB_ADVERTISED_NAME_DUPLICATE, reqVO.getName());
+        return save(job, enterpriseId, userId);
+    }
+
+    /**
+     * 保存或更新职位信息。
+     *
+     * @param job          职位信息对象
+     * @param enterpriseId 企业ID
+     * @param userId       用户ID
+     * @return 保存或更新后的职位ID
+     * @throws RuntimeException 如果职位名称重复或其他验证失败
+     */
+    public Long save(JobAdvertisedDO job, Long enterpriseId, Long userId) {
+        // 检查职位名称是否重复
+        if (mapper.existByName(enterpriseId, userId, job.getId(), job.getName())) {
+            throw exception(MDE_JOB_ADVERTISED_NAME_DUPLICATE, job.getName());
         }
-        if (null == reqVO.getId()) {
-            // 新增
-            job.setUserId(userId);
-            job.setEnterpriseId(enterpriseId);
-            job.setTop(false);
-            if (!job.getHire()) {
-                // 不是众聘职位
-                job.setHirePrice(0L);
-                job.setStatus(JobStatusEnum.ENABLE.getStatus());
-            } else {
-                job.setStatus(JobStatusEnum.WAIT_ENABLE.getStatus());
-            }
-            if (StringUtils.hasText(reqVO.getStatus())) {
-                // 有保存状态则写入保存的状态
-                job.setStatus(reqVO.getStatus());
-            }
-            // 后置处理
-            jobOperateAfter(job, SyncConstants.ADD);
 
+        if (job.getId() == null) {
+            // 新增职位
+            processNewJob(job, enterpriseId, userId);
         } else {
-            // 修改
-            JobAdvertisedDO entity = get(reqVO.getId());
-            // 效验
-            validUpdate(entity, reqVO);
-            // 是否是平台职位切换成众聘的职位
-            if (reqVO.getHire() && !entity.getHire()) {
-                // 普通职位切换众聘职位则进入判断,众聘切普通不进入判断
-                job.setStatus(JobStatusEnum.WAIT_ENABLE.getStatus());
-            }
-            job.setId(entity.getId());
-            // 后置处理
-            jobOperateAfter(job, SyncConstants.UPDATE);
+            // 修改职位
+            processExistingJob(job, enterpriseId, userId);
         }
+
+        // 保存或更新职位信息
+        if (job.getId() == null) {
+            mapper.insert(job);
+        } else {
+            mapper.updateById(job);
+        }
+
         return job.getId();
     }
 
     /**
-     * 效验职位发布的编辑
+     * 处理新增职位的逻辑。
      *
-     * @param entity 职位
-     * @param reqVO  编辑的职位信息
-     **/
-    public void validUpdate(
-            JobAdvertisedDO entity,
-            AppRecruitJobSaveReqVO reqVO) {
-
-        if (reqVO.getHire()) {
-            // price 不为空 && 之前是众聘的职位(防止平台职位切换成众聘职位这种情况)
-            if (null != reqVO.getHirePrice() && entity.getHire()) {
-                if (entity.getHirePrice().compareTo(reqVO.getHirePrice()) != 0) {
+     * @param job          职位信息对象
+     * @param enterpriseId 企业ID
+     * @param userId       用户ID
+     */
+    private void processNewJob(JobAdvertisedDO job, Long enterpriseId, Long userId) {
+        // 验证权益
+        vipEntitlementCheckAspect.validate(VipEntitlementCheck.OPERATE_PUBLISH_JOB);
+
+
+        // 设置默认值
+        job.setUserId(userId);
+        job.setEnterpriseId(enterpriseId);
+        job.setTop(false);
+
+        if (!job.getHire()) {
+            // 不是众聘职位
+            job.setHirePrice(0L);
+            job.setStatus(JobStatusEnum.ENABLE.getStatus());
+        } else {
+            // 众聘职位新增后,还需要给钱才能开启
+            job.setStatus(JobStatusEnum.WAIT_ENABLE.getStatus());
+        }
+
+        if (StringUtils.hasText(job.getStatus())) {
+            // 有保存状态则写入保存的状态
+            job.setStatus(job.getStatus());
+        }
+
+        // 后置处理
+        jobOperateAfter(job, SyncConstants.ADD);
+
+        // 处理权益
+        vipEntitlementCheckAspect
+                .process(VipEntitlementCheck.OPERATE_PUBLISH_JOB, VipEntitlementCheck.OperationType.DEDUCT);
+    }
+
+    /**
+     * 处理修改职位的逻辑。
+     *
+     * @param job          职位信息对象
+     * @param enterpriseId 企业ID
+     * @param userId       用户ID
+     */
+    private void processExistingJob(JobAdvertisedDO job, Long enterpriseId, Long userId) {
+        JobAdvertisedDO existingJob = get(job.getId());
+
+        // 验证修改
+        if (job.getHire()) {
+            if (existingJob.getHire()) {
+                if (job.getHirePrice() != null && !job.getHirePrice().equals(existingJob.getHirePrice())) {
                     throw exception(MDE_JOB_ADVERTISED_BALANCE_UPDATE);
                 }
             }
         }
 
+        // 如果普通职位切换成众聘职位
+        if (job.getHire() && !existingJob.getHire()) {
+            job.setStatus(JobStatusEnum.WAIT_ENABLE.getStatus());
+        }
+
+        // 更新现有职位
+        job.setId(existingJob.getId());
 
+        // 后置处理
+        jobOperateAfter(job, SyncConstants.UPDATE);
     }
 
+
     public JobAdvertisedDO get(Long id) {
         JobAdvertisedDO job = mapper.selectById(id);
         if (null == job) {
@@ -407,34 +458,34 @@ public class JobAdvertisedServiceImpl implements JobAdvertisedService {
 
     @Override
     @DSTransactional
-    public boolean enable(List<Long> ids) {
+    @VipEntitlementCheck(type = VipEntitlementCheck.OPERATE_PUBLISH_JOB, operate = VipEntitlementCheck.OperationType.DEDUCT)
+    public void enable(List<Long> ids) {
         for (Long id : ids) {
             JobAdvertisedDO job = get(id);
             if (JobStatusEnum.ENABLE.getStatus().equals(job.getStatus())) {
                 // 已经是开启状态
-                return true;
+                throw exception(MDE_JOB_ADVERTISED_STATUS_ENABLE_ERROR);
             }
             job.setStatus(JobStatusEnum.ENABLE.getStatus());
             mapper.updateById(job);
             jobDataSync(job, SyncConstants.UPDATE);
         }
-        return true;
     }
 
     @Override
     @DSTransactional
-    public boolean disable(List<Long> ids) {
+    @VipEntitlementCheck(type = VipEntitlementCheck.OPERATE_PUBLISH_JOB, operate = VipEntitlementCheck.OperationType.ADD)
+    public void disable(List<Long> ids) {
         for (Long id : ids) {
             JobAdvertisedDO job = get(id);
             if (JobStatusEnum.DISABLE.getStatus().equals(job.getStatus())) {
                 // 已经是关闭状态
-                return true;
+                throw exception(MDE_JOB_ADVERTISED_STATUS_CLOSE_ERROR);
             }
             job.setStatus(JobStatusEnum.DISABLE.getStatus());
             mapper.updateById(job);
             jobDataSync(job, SyncConstants.UPDATE);
         }
-        return true;
     }
 
     @Override
@@ -489,7 +540,7 @@ public class JobAdvertisedServiceImpl implements JobAdvertisedService {
     }
 
     @Override
-    public void renewal(AppRecruitJobRenewalReqVO reqVO) {
+    public void renewal(JobAdvertisedRenewalReqVO reqVO) {
         JobAdvertisedDO job = get(reqVO.getId());
         if (null == reqVO.getTime() || LocalDateTime.now().isAfter(reqVO.getTime())) {
             // 时间不能小于当前时间

+ 5 - 2
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/projectexp/ProjectExpServiceImpl.java

@@ -3,12 +3,13 @@ package com.citu.module.menduner.system.service.projectexp;
 import com.baomidou.dynamic.datasource.annotation.DSTransactional;
 import com.citu.framework.common.pojo.PageResult;
 import com.citu.framework.common.util.object.BeanUtils;
+import com.citu.framework.mybatis.core.query.LambdaQueryWrapperX;
+import com.citu.module.menduner.common.util.LoginUserContext;
 import com.citu.module.menduner.system.controller.app.jobhunt.person.projectexp.AppProjectExpSaveReqVO;
 import com.citu.module.menduner.system.controller.base.projectexp.ProjectExpPageReqVO;
 import com.citu.module.menduner.system.controller.base.projectexp.ProjectExpSaveReqVO;
 import com.citu.module.menduner.system.dal.dataobject.projectexp.ProjectExpDO;
 import com.citu.module.menduner.system.dal.mysql.projectexp.ProjectExpMapper;
-import com.citu.module.menduner.common.util.LoginUserContext;
 import org.springframework.stereotype.Service;
 import org.springframework.validation.annotation.Validated;
 
@@ -111,6 +112,8 @@ public class ProjectExpServiceImpl implements ProjectExpService {
 
     @Override
     public List<ProjectExpDO> getProjectExpList() {
-        return projectExpMapper.selectList(ProjectExpDO::getUserId, LoginUserContext.getUserId());
+        return projectExpMapper.selectList(new LambdaQueryWrapperX<ProjectExpDO>()
+                .eq(ProjectExpDO::getUserId, LoginUserContext.getUserId())
+                .orderByDesc(ProjectExpDO::getStartTime));
     }
 }

+ 5 - 2
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/trainexp/TrainExpServiceImpl.java

@@ -3,12 +3,13 @@ package com.citu.module.menduner.system.service.trainexp;
 import com.baomidou.dynamic.datasource.annotation.DSTransactional;
 import com.citu.framework.common.pojo.PageResult;
 import com.citu.framework.common.util.object.BeanUtils;
+import com.citu.framework.mybatis.core.query.LambdaQueryWrapperX;
+import com.citu.module.menduner.common.util.LoginUserContext;
 import com.citu.module.menduner.system.controller.app.jobhunt.person.trainexp.AppTrainExpSaveReqVO;
 import com.citu.module.menduner.system.controller.base.trainexp.TrainExpPageReqVO;
 import com.citu.module.menduner.system.controller.base.trainexp.TrainExpSaveReqVO;
 import com.citu.module.menduner.system.dal.dataobject.trainexp.TrainExpDO;
 import com.citu.module.menduner.system.dal.mysql.trainexp.TrainExpMapper;
-import com.citu.module.menduner.common.util.LoginUserContext;
 import org.springframework.stereotype.Service;
 import org.springframework.validation.annotation.Validated;
 
@@ -106,6 +107,8 @@ public class TrainExpServiceImpl implements TrainExpService {
 
     @Override
     public List<TrainExpDO> getTrainExpList() {
-        return trainExpMapper.selectList(TrainExpDO::getUserId, LoginUserContext.getUserId());
+        return trainExpMapper.selectList(new LambdaQueryWrapperX<TrainExpDO>()
+                .eq(TrainExpDO::getUserId, LoginUserContext.getUserId())
+                .orderByDesc(TrainExpDO::getStartTime));
     }
 }

+ 3 - 1
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/util/MdeInnerUtils.java → menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/util/JoinHelper.java

@@ -12,7 +12,8 @@ import com.github.yulichang.wrapper.JoinAbstractLambdaWrapper;
 /**
  * menduner 公共需求表连接
  **/
-public class MdeInnerUtils {
+public class JoinHelper {
+
 
     /**
      * 与 MdeUserDO 表进行内连接,并添加条件 vip_expire_date > NOW() 和 ORDER BY vip_flag DESC。
@@ -31,6 +32,7 @@ public class MdeInnerUtils {
                 // .and(i -> i.gt(MdeUserDO::getVipExpireDate, LocalDateTime.now()))
         );
 
+        // 从高到低排序会员标识
         wrapperX.orderByDesc(MdeUserDO::getVipFlag, MdeUserDO::getVipExpireDate);
 
     }

+ 16 - 1
menduner/menduner-system-biz/src/main/resources/i18n/messages_en_US.properties

@@ -212,6 +212,8 @@
 1_100_025_011=Cannot modify reward points for published positions
 1_100_025_012=Position name ({}) already exists, please modify and save again
 1_100_025_013=The expiration time cannot be less than the current time
+1_100_025_014=Position has been opened, please do not repeat the operation
+1_100_025_015=Position closed, please do not repeat operation
 # ========== 企业招聘者浏览 1_100_026_000 ==========
 1_100_026_001=Enterprise recruiter browsing does not exist
 # ========== 人才-企业关注订阅 1_100_027_000 ==========
@@ -374,4 +376,17 @@
 1_100_051_011=Is it enabled? Who has seen it? I cannot leave it blank
 1_100_051_012=Whether to enable salary report cannot be empty
 # ========== 用户权益记录 1_100_052_000 ==========
-1_100_052_001=User rights record does not exist
+1_100_052_001=User rights record does not exist
+# ========== 企业套餐 1_100_053_000 ==========
+1_100_053_001=Enterprise package does not exist
+1_100_053_002=Package name cannot be empty
+1_100_053_003=Package price cannot be empty
+1_100_053_004=Days cannot be empty
+1_100_053_005=Does it default to not being empty
+1_100_053_006=Recommended cannot be empty
+1_100_053_007=Instruction text cannot be empty
+1_100_053_008=The number of positions allowed to be published cannot be empty
+1_100_053_009=The number of talents allowed to be searched cannot be empty
+# ========== 企业权益记录 1_100_054_000 ==========
+1_100_054_001=Enterprise equity record does not exist
+1_100_054_002=Enterprise credit limit has exceeded

+ 16 - 1
menduner/menduner-system-biz/src/main/resources/i18n/messages_zh_CN.properties

@@ -212,6 +212,8 @@
 1_100_025_011=不能修改已发布职位赏金积分
 1_100_025_012=职位名称({})已存在,请修改后重新保存
 1_100_025_013=到期时间不能小于当前时间
+1_100_025_014=职位已开启,请勿重复操作
+1_100_025_015=职位已关闭,请勿重复操作
 # ========== 企业招聘者浏览 1_100_026_000 ==========
 1_100_026_001=企业招聘者浏览不存在
 # ========== 人才-企业关注订阅 1_100_027_000 ==========
@@ -377,4 +379,17 @@
 1_100_051_011=是否开启谁看过我不能为空
 1_100_051_012=是否开启薪酬报告不能为空
 # ========== 用户权益记录 1_100_052_000 ==========
-1_100_052_001=用户权益记录不存在
+1_100_052_001=用户权益记录不存在
+# ========== 企业套餐 1_100_053_000 ==========
+1_100_053_001=企业套餐不存在
+1_100_053_002=套餐名称不能为空
+1_100_053_003=套餐价格不能为空
+1_100_053_004=天数不能为空
+1_100_053_005=是否默认不能为空
+1_100_053_006=是否推荐不能为空
+1_100_053_007=说明文本不能为空
+1_100_053_008=允许发布职位数量不能为空
+1_100_053_009=允许搜索人才的数量不能为空
+# ========== 企业权益记录 1_100_054_000 ==========
+1_100_054_001=企业权益记录不存在
+1_100_054_002=企业额度已超过

+ 141 - 0
menduner/menduner-system-biz/src/test/java/com/citu/module/menduner/system/service/enterprise/EnterpriseEntitlementServiceImplTest.java

@@ -0,0 +1,141 @@
+package com.citu.module.menduner.system.service.enterprise;
+
+
+import com.citu.module.menduner.system.controller.base.enterprise.vip.EnterpriseEntitlementPageReqVO;
+import com.citu.module.menduner.system.controller.base.enterprise.vip.EnterpriseEntitlementSaveReqVO;
+import com.citu.module.menduner.system.service.enterprise.vip.EnterpriseEntitlementServiceImpl;
+import org.junit.jupiter.api.Disabled;
+import org.junit.jupiter.api.Test;
+import org.springframework.boot.test.mock.mockito.MockBean;
+
+import javax.annotation.Resource;
+
+import com.citu.framework.test.core.ut.BaseDbUnitTest;
+
+import com.citu.module.menduner.system.dal.dataobject.enterprise.EnterpriseEntitlementDO;
+import com.citu.module.menduner.system.dal.mysql.enterprise.EnterpriseEntitlementMapper;
+import com.citu.framework.common.pojo.PageResult;
+
+import javax.annotation.Resource;
+import org.springframework.context.annotation.Import;
+import java.util.*;
+import java.time.LocalDateTime;
+
+import static cn.hutool.core.util.RandomUtil.*;
+import static com.citu.module.menduner.system.enums.ErrorCodeConstants.*;
+import static com.citu.framework.test.core.util.AssertUtils.*;
+import static com.citu.framework.test.core.util.RandomUtils.*;
+import static com.citu.framework.common.util.date.LocalDateTimeUtils.*;
+import static com.citu.framework.common.util.object.ObjectUtils.*;
+import static com.citu.framework.common.util.date.DateUtils.*;
+import static org.junit.jupiter.api.Assertions.*;
+import static org.mockito.Mockito.*;
+
+/**
+ * {@link EnterpriseEntitlementServiceImpl} 的单元测试类
+ *
+ * @author Rayson
+ */
+@Import(EnterpriseEntitlementServiceImpl.class)
+public class EnterpriseEntitlementServiceImplTest extends BaseDbUnitTest {
+
+    @Resource
+    private EnterpriseEntitlementServiceImpl enterpriseEntitlementService;
+
+    @Resource
+    private EnterpriseEntitlementMapper enterpriseEntitlementMapper;
+
+    @Test
+    public void testCreateEnterpriseEntitlement_success() {
+        // 准备参数
+        EnterpriseEntitlementSaveReqVO createReqVO = randomPojo(EnterpriseEntitlementSaveReqVO.class).setId(null);
+
+        // 调用
+        Long enterpriseEntitlementId = enterpriseEntitlementService.createEnterpriseEntitlement(createReqVO);
+        // 断言
+        assertNotNull(enterpriseEntitlementId);
+        // 校验记录的属性是否正确
+        EnterpriseEntitlementDO enterpriseEntitlement = enterpriseEntitlementMapper.selectById(enterpriseEntitlementId);
+        assertPojoEquals(createReqVO, enterpriseEntitlement, "id");
+    }
+
+    @Test
+    public void testUpdateEnterpriseEntitlement_success() {
+        // mock 数据
+        EnterpriseEntitlementDO dbEnterpriseEntitlement = randomPojo(EnterpriseEntitlementDO.class);
+        enterpriseEntitlementMapper.insert(dbEnterpriseEntitlement);// @Sql: 先插入出一条存在的数据
+        // 准备参数
+        EnterpriseEntitlementSaveReqVO updateReqVO = randomPojo(EnterpriseEntitlementSaveReqVO.class, o -> {
+            o.setId(dbEnterpriseEntitlement.getId()); // 设置更新的 ID
+        });
+
+        // 调用
+        enterpriseEntitlementService.updateEnterpriseEntitlement(updateReqVO);
+        // 校验是否更新正确
+        EnterpriseEntitlementDO enterpriseEntitlement = enterpriseEntitlementMapper.selectById(updateReqVO.getId()); // 获取最新的
+        assertPojoEquals(updateReqVO, enterpriseEntitlement);
+    }
+
+    @Test
+    public void testUpdateEnterpriseEntitlement_notExists() {
+        // 准备参数
+        EnterpriseEntitlementSaveReqVO updateReqVO = randomPojo(EnterpriseEntitlementSaveReqVO.class);
+
+        // 调用, 并断言异常
+        assertServiceException(() -> enterpriseEntitlementService.updateEnterpriseEntitlement(updateReqVO), ENTERPRISE_ENTITLEMENT_NOT_EXISTS);
+    }
+
+    @Test
+    public void testDeleteEnterpriseEntitlement_success() {
+        // mock 数据
+        EnterpriseEntitlementDO dbEnterpriseEntitlement = randomPojo(EnterpriseEntitlementDO.class);
+        enterpriseEntitlementMapper.insert(dbEnterpriseEntitlement);// @Sql: 先插入出一条存在的数据
+        // 准备参数
+        Long id = dbEnterpriseEntitlement.getId();
+
+        // 调用
+        enterpriseEntitlementService.deleteEnterpriseEntitlement(id);
+        // 校验数据不存在了
+        assertNull(enterpriseEntitlementMapper.selectById(id));
+    }
+
+    @Test
+    public void testDeleteEnterpriseEntitlement_notExists() {
+        // 准备参数
+        Long id = randomLongId();
+
+        // 调用, 并断言异常
+        assertServiceException(() -> enterpriseEntitlementService.deleteEnterpriseEntitlement(id), ENTERPRISE_ENTITLEMENT_NOT_EXISTS);
+    }
+
+    @Test
+    @Disabled  // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解
+    public void testGetEnterpriseEntitlementPage() {
+        // mock 数据
+        EnterpriseEntitlementDO dbEnterpriseEntitlement = randomPojo(EnterpriseEntitlementDO.class, o -> { // 等会查询到
+            o.setEnterpriseId(null);
+            o.setUserId(null);
+            o.setCreateTime(null);
+        });
+        enterpriseEntitlementMapper.insert(dbEnterpriseEntitlement);
+        // 测试 enterpriseId 不匹配
+        enterpriseEntitlementMapper.insert(cloneIgnoreId(dbEnterpriseEntitlement, o -> o.setEnterpriseId(null)));
+        // 测试 userId 不匹配
+        enterpriseEntitlementMapper.insert(cloneIgnoreId(dbEnterpriseEntitlement, o -> o.setUserId(null)));
+        // 测试 createTime 不匹配
+        enterpriseEntitlementMapper.insert(cloneIgnoreId(dbEnterpriseEntitlement, o -> o.setCreateTime(null)));
+        // 准备参数
+        EnterpriseEntitlementPageReqVO reqVO = new EnterpriseEntitlementPageReqVO();
+        reqVO.setEnterpriseId(null);
+        reqVO.setUserId(null);
+        reqVO.setCreateTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28));
+
+        // 调用
+        PageResult<EnterpriseEntitlementDO> pageResult = enterpriseEntitlementService.getEnterpriseEntitlementPage(reqVO);
+        // 断言
+        assertEquals(1, pageResult.getTotal());
+        assertEquals(1, pageResult.getList().size());
+        assertPojoEquals(dbEnterpriseEntitlement, pageResult.getList().get(0));
+    }
+
+}

+ 137 - 0
menduner/menduner-system-biz/src/test/java/com/citu/module/menduner/system/service/enterprise/EnterprisePackageServiceImplTest.java

@@ -0,0 +1,137 @@
+package com.citu.module.menduner.system.service.enterprise;
+
+
+import com.citu.framework.common.pojo.PageResult;
+import com.citu.framework.test.core.ut.BaseDbUnitTest;
+import com.citu.module.menduner.system.controller.base.enterprise.vip.EnterprisePackagePageReqVO;
+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.dal.mysql.enterprise.EnterprisePackageMapper;
+import com.citu.module.menduner.system.service.enterprise.vip.EnterprisePackageServiceImpl;
+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.ENTERPRISE_PACKAGE_NOT_EXISTS;
+import static org.junit.jupiter.api.Assertions.*;
+
+/**
+ * {@link EnterprisePackageServiceImpl} 的单元测试类
+ *
+ * @author Rayson
+ */
+@Import(EnterprisePackageServiceImpl.class)
+public class EnterprisePackageServiceImplTest extends BaseDbUnitTest {
+
+    @Resource
+    private EnterprisePackageServiceImpl enterprisePackageService;
+
+    @Resource
+    private EnterprisePackageMapper enterprisePackageMapper;
+
+    @Test
+    public void testCreateEnterprisePackage_success() {
+        // 准备参数
+        EnterprisePackageSaveReqVO createReqVO = randomPojo(EnterprisePackageSaveReqVO.class).setId(null);
+
+        // 调用
+        Long enterprisePackageId = enterprisePackageService.createEnterprisePackage(createReqVO);
+        // 断言
+        assertNotNull(enterprisePackageId);
+        // 校验记录的属性是否正确
+        EnterprisePackageDO enterprisePackage = enterprisePackageMapper.selectById(enterprisePackageId);
+        assertPojoEquals(createReqVO, enterprisePackage, "id");
+    }
+
+    @Test
+    public void testUpdateEnterprisePackage_success() {
+        // mock 数据
+        EnterprisePackageDO dbEnterprisePackage = randomPojo(EnterprisePackageDO.class);
+        enterprisePackageMapper.insert(dbEnterprisePackage);// @Sql: 先插入出一条存在的数据
+        // 准备参数
+        EnterprisePackageSaveReqVO updateReqVO = randomPojo(EnterprisePackageSaveReqVO.class, o -> {
+            o.setId(dbEnterprisePackage.getId()); // 设置更新的 ID
+        });
+
+        // 调用
+        enterprisePackageService.updateEnterprisePackage(updateReqVO);
+        // 校验是否更新正确
+        EnterprisePackageDO enterprisePackage = enterprisePackageMapper.selectById(updateReqVO.getId()); // 获取最新的
+        assertPojoEquals(updateReqVO, enterprisePackage);
+    }
+
+    @Test
+    public void testUpdateEnterprisePackage_notExists() {
+        // 准备参数
+        EnterprisePackageSaveReqVO updateReqVO = randomPojo(EnterprisePackageSaveReqVO.class);
+
+        // 调用, 并断言异常
+        assertServiceException(() -> enterprisePackageService.updateEnterprisePackage(updateReqVO), ENTERPRISE_PACKAGE_NOT_EXISTS);
+    }
+
+    @Test
+    public void testDeleteEnterprisePackage_success() {
+        // mock 数据
+        EnterprisePackageDO dbEnterprisePackage = randomPojo(EnterprisePackageDO.class);
+        enterprisePackageMapper.insert(dbEnterprisePackage);// @Sql: 先插入出一条存在的数据
+        // 准备参数
+        Long id = dbEnterprisePackage.getId();
+
+        // 调用
+        enterprisePackageService.deleteEnterprisePackage(id);
+        // 校验数据不存在了
+        assertNull(enterprisePackageMapper.selectById(id));
+    }
+
+    @Test
+    public void testDeleteEnterprisePackage_notExists() {
+        // 准备参数
+        Long id = randomLongId();
+
+        // 调用, 并断言异常
+        assertServiceException(() -> enterprisePackageService.deleteEnterprisePackage(id), ENTERPRISE_PACKAGE_NOT_EXISTS);
+    }
+
+    @Test
+    @Disabled  // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解
+    public void testGetEnterprisePackagePage() {
+        // mock 数据
+        EnterprisePackageDO dbEnterprisePackage = randomPojo(EnterprisePackageDO.class, o -> { // 等会查询到
+            o.setName(null);
+            o.setRecommend(null);
+            o.setStatus(null);
+            o.setCreateTime(null);
+        });
+        enterprisePackageMapper.insert(dbEnterprisePackage);
+        // 测试 name 不匹配
+        enterprisePackageMapper.insert(cloneIgnoreId(dbEnterprisePackage, o -> o.setName(null)));
+        // 测试 recommend 不匹配
+        enterprisePackageMapper.insert(cloneIgnoreId(dbEnterprisePackage, o -> o.setRecommend(null)));
+        // 测试 status 不匹配
+        enterprisePackageMapper.insert(cloneIgnoreId(dbEnterprisePackage, o -> o.setStatus(null)));
+        // 测试 createTime 不匹配
+        enterprisePackageMapper.insert(cloneIgnoreId(dbEnterprisePackage, o -> o.setCreateTime(null)));
+        // 准备参数
+        EnterprisePackagePageReqVO reqVO = new EnterprisePackagePageReqVO();
+        reqVO.setName(null);
+        reqVO.setRecommend(null);
+        reqVO.setStatus(null);
+        reqVO.setCreateTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28));
+
+        // 调用
+        PageResult<EnterprisePackageDO> pageResult = enterprisePackageService.getEnterprisePackagePage(reqVO);
+        // 断言
+        assertEquals(1, pageResult.getTotal());
+        assertEquals(1, pageResult.getList().size());
+        assertPojoEquals(dbEnterprisePackage, pageResult.getList().get(0));
+    }
+
+}

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

@@ -41,4 +41,6 @@ DELETE FROM "mde_hunt";
 DELETE FROM "mde_user_auth";
 DELETE FROM "mde_redeem";
 DELETE FROM "mde_user_package";
-DELETE FROM "mde_user_entitlement";
+DELETE FROM "mde_user_entitlement";
+DELETE FROM "mde_enterprise_package";
+DELETE FROM "mde_enterprise_entitlement";

+ 36 - 1
menduner/menduner-system-biz/src/test/resources/sql/create_tables.sql

@@ -742,4 +742,39 @@ CREATE TABLE IF NOT EXISTS "mde_user_entitlement" (
     "deleted" bit NOT NULL DEFAULT FALSE,
     "tenant_id" bigint NOT NULL,
     PRIMARY KEY ("id")
-) COMMENT '用户权益记录';
+) COMMENT '用户权益记录';
+
+CREATE TABLE IF NOT EXISTS "mde_enterprise_package" (
+    "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY,
+    "name" varchar NOT NULL,
+    "price" bigint NOT NULL,
+    "day" int NOT NULL,
+    "recommend" int NOT NULL,
+    "text" varchar NOT NULL,
+    "publish_job_count" int NOT NULL,
+    "search_count" int 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_enterprise_entitlement" (
+    "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY,
+    "enterprise_id" bigint NOT NULL,
+    "user_id" bigint NOT NULL,
+    "publish_job_count" int NOT NULL,
+    "search_count" int 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 '企业权益记录';