Browse Source

1、增加众聘简历投递模块
2、增加众聘赏金比例分配
3、

rayson 1 năm trước cách đây
mục cha
commit
c98537f19c
86 tập tin đã thay đổi với 2573 bổ sung286 xóa
  1. 8 8
      citu-framework/citu-spring-boot-starter-mybatis/src/main/java/com/citu/framework/mybatis/core/mapper/BaseMapperX.java
  2. 7 0
      menduner/menduner-common/src/main/java/com/citu/module/menduner/common/util/LoginUserContext.java
  3. 1 1
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/controller/app/record/AppPointRecordController.java
  4. 1 1
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/controller/app/sigin/AppSignInConfigController.java
  5. 1 1
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/controller/app/sigin/AppSignInRecordController.java
  6. 1 1
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/controller/app/user/AppUserPointController.java
  7. 1 1
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/service/record/PointRecordService.java
  8. 17 1
      menduner/menduner-system-api/src/main/java/com/citu/module/menduner/system/enums/ErrorCodeConstants.java
  9. 23 0
      menduner/menduner-system-api/src/main/java/com/citu/module/menduner/system/enums/hire/HireJobCvRelStatusEnum.java
  10. 94 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/admin/hire/HireCommissionRatioController.java
  11. 94 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/admin/hire/HireJobCvRelController.java
  12. 4 4
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/admin/sync/SyncController.java
  13. 94 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/admin/user/UserAccountController.java
  14. 3 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/app/enterprise/AppEnterpriseUserBindController.java
  15. 11 10
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/app/job/AppJobAdvertisedController.java
  16. 20 15
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/app/job/vo/AppJobAdvertisedPageReqVO.java
  17. 2 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/app/job/vo/AppJobAdvertisedSearchPageReqVO.java
  18. 43 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/appadmin/hire/AppAdminHireCommissionRatioController.java
  19. 75 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/appadmin/hire/AppAdminHireJobCvRelController.java
  20. 12 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/appadmin/hire/vo/AppAdminHireCommissionRatioRespVO.java
  21. 39 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/appadmin/hire/vo/AppAdminHireJobCvRelPageReqVO.java
  22. 47 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/appadmin/hire/vo/AppAdminHireJobCvRelRespVO.java
  23. 3 3
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/appadmin/job/AppAdminJobAdvertisedController.java
  24. 3 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/appadmin/job/vo/AppAdminJobPageReqVO.java
  25. 7 1
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/appadmin/job/vo/AppAdminJobSaveReqVO.java
  26. 2 2
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/appadmin/person/AppAdminPersonCvController.java
  27. 1 1
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/appadmin/person/cv/AppAdminJobCvRelPageReqVO.java
  28. 1 1
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/appadmin/person/cv/AppAdminJobCvRelRespVO.java
  29. 0 3
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/appadmin/person/vo/AppAdminPersonSimpleRespVO.java
  30. 9 1
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/appadmin/user/AppAdminUserController.java
  31. 3 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/appadmin/user/vo/AppAdminUserPageReqVO.java
  32. 2 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/appadmin/user/vo/AppAdminUserRespVO.java
  33. 30 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/hire/HireCommissionRatioPageReqVO.java
  34. 37 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/hire/HireCommissionRatioRespVO.java
  35. 30 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/hire/HireCommissionRatioSaveReqVO.java
  36. 51 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/hire/HireJobCvRelPageReqVO.java
  37. 59 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/hire/HireJobCvRelRespVO.java
  38. 54 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/hire/HireJobCvRelSaveReqVO.java
  39. 2 5
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/job/JobAdvertisedPageReqVO.java
  40. 8 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/job/JobAdvertisedRespVO.java
  41. 7 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/job/JobAdvertisedSaveReqVO.java
  42. 6 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/job/JobAdvertisedSimpleRespVO.java
  43. 32 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/user/account/UserAccountPageReqVO.java
  44. 33 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/user/account/UserAccountRespVO.java
  45. 23 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/user/account/UserAccountSaveReqVO.java
  46. 14 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/convert/HireCommissionRatioConvert.java
  47. 45 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/dataobject/hire/HireCommissionRatioDO.java
  48. 67 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/dataobject/hire/HireJobCvRelDO.java
  49. 8 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/dataobject/job/JobAdvertisedDO.java
  50. 41 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/dataobject/user/UserAccountDO.java
  51. 15 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/es/job/ESJobAdvertisedMergeDO.java
  52. 1 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/mysql/enterprise/EnterpriseUserBindMapper.java
  53. 33 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/mysql/hire/HireCommissionRatioMapper.java
  54. 84 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/mysql/hire/HireJobCvRelMapper.java
  55. 31 6
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/mysql/job/JobAdvertisedMapper.java
  56. 2 6
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/mysql/job/JobCvRelMapper.java
  57. 27 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/mysql/user/UserAccountMapper.java
  58. 8 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/framework/datapermission/config/DataPermissionConfiguration.java
  59. 42 1
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/mq/consumer/ESConsumer.java
  60. 5 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/enterprise/bind/EnterpriseUserBindService.java
  61. 13 2
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/enterprise/bind/EnterpriseUserBindServiceImpl.java
  62. 69 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/hire/HireCommissionRatioService.java
  63. 113 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/hire/HireCommissionRatioServiceImpl.java
  64. 87 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/hire/HireJobCvRelService.java
  65. 120 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/hire/HireJobCvRelServiceImpl.java
  66. 33 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/hire/HireJobIntegrationService.java
  67. 38 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/hire/HireJobIntegrationServiceImpl.java
  68. 6 4
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/job/JobAdvertisedService.java
  69. 17 182
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/job/JobAdvertisedServiceImpl.java
  70. 2 1
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/job/JobCvRelService.java
  71. 3 3
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/job/JobIntegrationService.java
  72. 4 3
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/job/JobIntegrationServiceImpl.java
  73. 1 4
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/position/PositionServiceImpl.java
  74. 1 1
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/skill/SkillService.java
  75. 2 4
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/sync/ESDataSyncService.java
  76. 1 6
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/sync/ESDataSyncServiceImpl.java
  77. 55 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/user/UserAccountService.java
  78. 72 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/user/UserAccountServiceImpl.java
  79. 4 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/util/ESQueryBuildUtils.java
  80. 16 1
      menduner/menduner-system-biz/src/main/resources/i18n/messages_en_US.properties
  81. 15 0
      menduner/menduner-system-biz/src/main/resources/i18n/messages_zh_CN.properties
  82. 132 0
      menduner/menduner-system-biz/src/test/java/com/citu/module/menduner/system/service/hire/HireCommissionRatioServiceImplTest.java
  83. 160 0
      menduner/menduner-system-biz/src/test/java/com/citu/module/menduner/system/service/hire/HireJobCvRelServiceImplTest.java
  84. 132 0
      menduner/menduner-system-biz/src/test/java/com/citu/module/menduner/system/service/user/UserAccountServiceImplTest.java
  85. 5 1
      menduner/menduner-system-biz/src/test/resources/sql/clean.sql
  86. 48 1
      menduner/menduner-system-biz/src/test/resources/sql/create_tables.sql

+ 8 - 8
citu-framework/citu-spring-boot-starter-mybatis/src/main/java/com/citu/framework/mybatis/core/mapper/BaseMapperX.java

@@ -1,12 +1,6 @@
 package com.citu.framework.mybatis.core.mapper;
 
 import cn.hutool.core.collection.CollUtil;
-import com.citu.framework.common.pojo.PageParam;
-import com.citu.framework.common.pojo.PageResult;
-import com.citu.framework.common.pojo.SortablePageParam;
-import com.citu.framework.common.pojo.SortingField;
-import com.citu.framework.mybatis.core.enums.SqlConstants;
-import com.citu.framework.mybatis.core.util.MyBatisUtils;
 import com.baomidou.mybatisplus.annotation.DbType;
 import com.baomidou.mybatisplus.core.conditions.Wrapper;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
@@ -15,6 +9,12 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.support.SFunction;
 import com.baomidou.mybatisplus.extension.toolkit.Db;
+import com.citu.framework.common.pojo.PageParam;
+import com.citu.framework.common.pojo.PageResult;
+import com.citu.framework.common.pojo.SortablePageParam;
+import com.citu.framework.common.pojo.SortingField;
+import com.citu.framework.mybatis.core.enums.SqlConstants;
+import com.citu.framework.mybatis.core.util.MyBatisUtils;
 import com.github.yulichang.base.MPJBaseMapper;
 import com.github.yulichang.interfaces.MPJBaseJoin;
 import com.github.yulichang.wrapper.MPJLambdaWrapper;
@@ -26,7 +26,7 @@ import java.util.Objects;
 
 /**
  * 在 MyBatis Plus 的 BaseMapper 的基础上拓展,提供更多的能力
- *
+ * <p>
  * 1. {@link BaseMapper} 为 MyBatis Plus 的基础接口,提供基础的 CRUD 能力
  * 2. {@link MPJBaseMapper} 为 MyBatis Plus Join 的基础接口,提供连表 Join 能力
  */
@@ -186,7 +186,7 @@ public interface BaseMapperX<T> extends MPJBaseMapper<T> {
     }
 
     default Boolean insertOrUpdate(T entity) {
-        return  Db.saveOrUpdate(entity);
+        return Db.saveOrUpdate(entity);
     }
 
     default Boolean insertOrUpdateBatch(Collection<T> collection) {

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

@@ -44,6 +44,13 @@ public class LoginUserContext {
         return get().getId();
     }
 
+    /**
+     * 获取当前登录的用户id
+     **/
+    public static Long getUserId(LoginUser loginUser) {
+        return loginUser.getId();
+    }
+
     /**
      * 获取当前登录的用户id
      **/

+ 1 - 1
menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/controller/app/record/AppPointRecordController.java

@@ -25,7 +25,7 @@ import javax.validation.Valid;
 
 import static com.citu.framework.common.pojo.CommonResult.success;
 
-@Tag(name = "求职 - 积分记录")
+@Tag(name = "求职 - 积分记录")
 @RestController
 @RequestMapping("/menduner/reward/point/record")
 @Validated

+ 1 - 1
menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/controller/app/sigin/AppSignInConfigController.java

@@ -18,7 +18,7 @@ import java.util.List;
 
 import static com.citu.framework.common.pojo.CommonResult.success;
 
-@Tag(name = "求职 - 签到规则")
+@Tag(name = "求职 - 签到规则")
 @RestController
 @RequestMapping("/menduner/reward/sign-in/config")
 @Validated

+ 1 - 1
menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/controller/app/sigin/AppSignInRecordController.java

@@ -22,7 +22,7 @@ import javax.annotation.Resource;
 import static com.citu.framework.common.pojo.CommonResult.success;
 import static com.citu.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
 
-@Tag(name = "求职 - 签到记录")
+@Tag(name = "求职 - 签到记录")
 @RestController
 @RequestMapping("/menduner/reward/sign-in/record")
 @Validated

+ 1 - 1
menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/controller/app/user/AppUserPointController.java

@@ -16,7 +16,7 @@ import javax.annotation.Resource;
 
 import static com.citu.framework.common.pojo.CommonResult.success;
 
-@Tag(name = "求职 - 用户积分")
+@Tag(name = "求职 - 用户积分")
 @RestController
 @RequestMapping("/menduner/reward/user-point")
 @Validated

+ 1 - 1
menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/service/record/PointRecordService.java

@@ -59,7 +59,7 @@ public interface PointRecordService {
      **/
     Integer getPointCount(Long userId,String url, LocalDateTime startDate, LocalDateTime endDate);
 
-    // ========== 求职 ==========
+    // ========== 求职 ==========
 
     /**
      * 分页获取当前用户积分记录

+ 17 - 1
menduner/menduner-system-api/src/main/java/com/citu/module/menduner/system/enums/ErrorCodeConstants.java

@@ -300,5 +300,21 @@ public interface ErrorCodeConstants {
     ErrorCode JOB_CV_REL_URL_NOT_NULL = new ErrorCode(1_100_035_008, "简历附件地址不能为空");
     ErrorCode JOB_CV_REL_STATUS_NOT_NULL = new ErrorCode(1_100_035_009, "投递的简历状态不能为空");
 
-
+    // ========== 众聘-简历投递 1_100_036_000 ==========
+    ErrorCode HIRE_JOB_CV_REL_NOT_EXISTS = new ErrorCode(1_100_036_001, "投递简历不存在");
+    ErrorCode HIRE_JOB_CV_REL_JOB_ID_NOT_NULL = new ErrorCode(1_100_036_002, "发布的职位id不能为空");
+    ErrorCode HIRE_JOB_CV_REL_PUBLISH_USER_ID_NOT_NULL = new ErrorCode(1_100_036_003, "发布职位的用户id不能为空");
+    ErrorCode HIRE_JOB_CV_REL_RECOMMEND_USER_ID_NOT_NULL = new ErrorCode(1_100_036_004, "推荐人id不能为空");
+    ErrorCode HIRE_JOB_CV_REL_USER_ID_NOT_NULL = new ErrorCode(1_100_036_005, "投递用户id不能为空");
+    ErrorCode HIRE_JOB_CV_REL_NAME_NOT_NULL = new ErrorCode(1_100_036_006, "投递人名称不能为空");
+    ErrorCode HIRE_JOB_CV_REL_PHONE_NOT_NULL = new ErrorCode(1_100_036_007, "投递人联系电话不能为空");
+    ErrorCode HIRE_JOB_CV_REL_URL_NOT_NULL = new ErrorCode(1_100_036_008, "简历附件不能为空");
+
+    // ========== 众聘-佣金比例 1_100_037_000 ==========
+    ErrorCode HIRE_COMMISSION_RATIO_NOT_EXISTS = new ErrorCode(1_100_037_001, "佣金比例不存在");
+    ErrorCode HIRE_COMMISSION_RATIO_RATE_NOT_NULL = new ErrorCode(1_100_037_002, "佣金比例不能为空");
+    ErrorCode HIRE_COMMISSION_RATIO_RATE_NOT_LESS_THAN_ZERO = new ErrorCode(1_100_037_003, "佣金比例不能小于0");
+
+    // ========== 用户账户 1_100_038_000 ==========
+    ErrorCode USER_ACCOUNT_NOT_EXISTS = new ErrorCode(1_100_038_001, "用户账户不存在");
 }

+ 23 - 0
menduner/menduner-system-api/src/main/java/com/citu/module/menduner/system/enums/hire/HireJobCvRelStatusEnum.java

@@ -0,0 +1,23 @@
+package com.citu.module.menduner.system.enums.hire;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * 众聘简历投递状态(0 已报名 | 1 已查看 | 2 已邀约 | 3 已发offer | 4 已入职 | 5 已结算 | 99 不合适 已淘汰)
+ **/
+@Getter
+@AllArgsConstructor
+public enum HireJobCvRelStatusEnum {
+    NEW("0", "已报名"),
+    LOOK("1", "已查看"),
+    INVITE("2", "已邀约"),
+    OFFER("3", "已发offer"),
+    ENTRY("4", "已入职"),
+    SETTLEMENT("5", "已结算"),
+    ELIMINATE("99", "不合适");
+
+    private final String status;
+
+    private final String name;
+}

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

@@ -0,0 +1,94 @@
+package com.citu.module.menduner.system.controller.admin.hire;
+
+
+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.hire.HireCommissionRatioPageReqVO;
+import com.citu.module.menduner.system.controller.base.hire.HireCommissionRatioRespVO;
+import com.citu.module.menduner.system.controller.base.hire.HireCommissionRatioSaveReqVO;
+import com.citu.module.menduner.system.dal.dataobject.hire.HireCommissionRatioDO;
+import com.citu.module.menduner.system.service.hire.HireCommissionRatioService;
+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/hire-commission-ratio")
+@Validated
+public class HireCommissionRatioController {
+
+    @Resource
+    private HireCommissionRatioService hireCommissionRatioService;
+
+    @PostMapping("/create")
+    @Operation(summary = "创建众聘-佣金比例")
+    @PreAuthorize("@ss.hasPermission('menduner:system:hire-commission-ratio:create')")
+    public CommonResult<Long> createHireCommissionRatio(@Valid @RequestBody HireCommissionRatioSaveReqVO createReqVO) {
+        return success(hireCommissionRatioService.createHireCommissionRatio(createReqVO));
+    }
+
+    @PutMapping("/update")
+    @Operation(summary = "更新众聘-佣金比例")
+    @PreAuthorize("@ss.hasPermission('menduner:system:hire-commission-ratio:update')")
+    public CommonResult<Boolean> updateHireCommissionRatio(@Valid @RequestBody HireCommissionRatioSaveReqVO updateReqVO) {
+        hireCommissionRatioService.updateHireCommissionRatio(updateReqVO);
+        return success(true);
+    }
+
+    @DeleteMapping("/delete")
+    @Operation(summary = "删除众聘-佣金比例")
+    @Parameter(name = "id", description = "编号", required = true)
+    @PreAuthorize("@ss.hasPermission('menduner:system:hire-commission-ratio:delete')")
+    public CommonResult<Boolean> deleteHireCommissionRatio(@RequestParam("id") Long id) {
+        hireCommissionRatioService.deleteHireCommissionRatio(id);
+        return success(true);
+    }
+
+    @GetMapping("/get")
+    @Operation(summary = "获得众聘-佣金比例")
+    @Parameter(name = "id", description = "编号", required = true, example = "1024")
+    @PreAuthorize("@ss.hasPermission('menduner:system:hire-commission-ratio:query')")
+    public CommonResult<HireCommissionRatioRespVO> getHireCommissionRatio(@RequestParam("id") Long id) {
+        HireCommissionRatioDO hireCommissionRatio = hireCommissionRatioService.getHireCommissionRatio(id);
+        return success(BeanUtils.toBean(hireCommissionRatio, HireCommissionRatioRespVO.class));
+    }
+
+    @GetMapping("/page")
+    @Operation(summary = "获得众聘-佣金比例分页")
+    @PreAuthorize("@ss.hasPermission('menduner:system:hire-commission-ratio:query')")
+    public CommonResult<PageResult<HireCommissionRatioRespVO>> getHireCommissionRatioPage(@Valid HireCommissionRatioPageReqVO pageReqVO) {
+        PageResult<HireCommissionRatioDO> pageResult = hireCommissionRatioService.getHireCommissionRatioPage(pageReqVO);
+        return success(BeanUtils.toBean(pageResult, HireCommissionRatioRespVO.class));
+    }
+
+    @GetMapping("/export-excel")
+    @Operation(summary = "导出众聘-佣金比例 Excel")
+    @PreAuthorize("@ss.hasPermission('menduner:system:hire-commission-ratio:export')")
+    @ApiAccessLog(operateType = EXPORT)
+    public void exportHireCommissionRatioExcel(@Valid HireCommissionRatioPageReqVO pageReqVO,
+                                               HttpServletResponse response) throws IOException {
+        pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+        List<HireCommissionRatioDO> list = hireCommissionRatioService.getHireCommissionRatioPage(pageReqVO).getList();
+        // 导出 Excel
+        ExcelUtils.write(response, "众聘-佣金比例.xls", "数据", HireCommissionRatioRespVO.class,
+                BeanUtils.toBean(list, HireCommissionRatioRespVO.class));
+    }
+
+}

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

@@ -0,0 +1,94 @@
+package com.citu.module.menduner.system.controller.admin.hire;
+
+
+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.hire.HireJobCvRelPageReqVO;
+import com.citu.module.menduner.system.controller.base.hire.HireJobCvRelRespVO;
+import com.citu.module.menduner.system.controller.base.hire.HireJobCvRelSaveReqVO;
+import com.citu.module.menduner.system.dal.dataobject.hire.HireJobCvRelDO;
+import com.citu.module.menduner.system.service.hire.HireJobCvRelService;
+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/hire-job-cv-rel")
+@Validated
+public class HireJobCvRelController {
+
+    @Resource
+    private HireJobCvRelService hireJobCvRelService;
+
+    @PostMapping("/create")
+    @Operation(summary = "创建众聘-简历投递")
+    @PreAuthorize("@ss.hasPermission('menduner:system:hire-job-cv-rel:create')")
+    public CommonResult<Long> createHireJobCvRel(@Valid @RequestBody HireJobCvRelSaveReqVO createReqVO) {
+        return success(hireJobCvRelService.createHireJobCvRel(createReqVO));
+    }
+
+    @PutMapping("/update")
+    @Operation(summary = "更新众聘-简历投递")
+    @PreAuthorize("@ss.hasPermission('menduner:system:hire-job-cv-rel:update')")
+    public CommonResult<Boolean> updateHireJobCvRel(@Valid @RequestBody HireJobCvRelSaveReqVO updateReqVO) {
+        hireJobCvRelService.updateHireJobCvRel(updateReqVO);
+        return success(true);
+    }
+
+    @DeleteMapping("/delete")
+    @Operation(summary = "删除众聘-简历投递")
+    @Parameter(name = "id", description = "编号", required = true)
+    @PreAuthorize("@ss.hasPermission('menduner:system:hire-job-cv-rel:delete')")
+    public CommonResult<Boolean> deleteHireJobCvRel(@RequestParam("id") Long id) {
+        hireJobCvRelService.deleteHireJobCvRel(id);
+        return success(true);
+    }
+
+    @GetMapping("/get")
+    @Operation(summary = "获得众聘-简历投递")
+    @Parameter(name = "id", description = "编号", required = true, example = "1024")
+    @PreAuthorize("@ss.hasPermission('menduner:system:hire-job-cv-rel:query')")
+    public CommonResult<HireJobCvRelRespVO> getHireJobCvRel(@RequestParam("id") Long id) {
+        HireJobCvRelDO hireJobCvRel = hireJobCvRelService.getHireJobCvRel(id);
+        return success(BeanUtils.toBean(hireJobCvRel, HireJobCvRelRespVO.class));
+    }
+
+    @GetMapping("/page")
+    @Operation(summary = "获得众聘-简历投递分页")
+    @PreAuthorize("@ss.hasPermission('menduner:system:hire-job-cv-rel:query')")
+    public CommonResult<PageResult<HireJobCvRelRespVO>> getHireJobCvRelPage(@Valid HireJobCvRelPageReqVO pageReqVO) {
+        PageResult<HireJobCvRelDO> pageResult = hireJobCvRelService.getHireJobCvRelPage(pageReqVO);
+        return success(BeanUtils.toBean(pageResult, HireJobCvRelRespVO.class));
+    }
+
+    @GetMapping("/export-excel")
+    @Operation(summary = "导出众聘-简历投递 Excel")
+    @PreAuthorize("@ss.hasPermission('menduner:system:hire-job-cv-rel:export')")
+    @ApiAccessLog(operateType = EXPORT)
+    public void exportHireJobCvRelExcel(@Valid HireJobCvRelPageReqVO pageReqVO,
+                                        HttpServletResponse response) throws IOException {
+        pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+        List<HireJobCvRelDO> list = hireJobCvRelService.getHireJobCvRelPage(pageReqVO).getList();
+        // 导出 Excel
+        ExcelUtils.write(response, "众聘-简历投递.xls", "数据", HireJobCvRelRespVO.class,
+                BeanUtils.toBean(list, HireJobCvRelRespVO.class));
+    }
+
+}

+ 4 - 4
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/admin/sync/SyncController.java

@@ -22,10 +22,10 @@ public class SyncController {
     @Resource
     private ESDataSyncService service;
 
-    @PostMapping("/es/enterprise")
-    @Operation(summary = "同步ES企业相关数据")
-    public CommonResult<Boolean> syncEnterprise() {
-        service.syncEnterprise();
+    @PostMapping("/es")
+    @Operation(summary = "同步ES相关数据")
+    public CommonResult<Boolean> syncData() {
+        service.syncData();
         return success(true);
     }
 }

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

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

+ 3 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/app/enterprise/AppEnterpriseUserBindController.java

@@ -1,6 +1,7 @@
 package com.citu.module.menduner.system.controller.app.enterprise;
 
 import com.citu.framework.common.pojo.CommonResult;
+import com.citu.framework.security.core.annotations.PreAuthenticated;
 import com.citu.module.menduner.system.controller.app.enterprise.vo.AppEnterpriseUserBindRespVO;
 import com.citu.module.menduner.system.service.enterprise.bind.EnterpriseUserBindService;
 import io.swagger.v3.oas.annotations.Operation;
@@ -26,12 +27,14 @@ public class AppEnterpriseUserBindController {
     private EnterpriseUserBindService enterpriseUserBindService;
 
 
+    @PreAuthenticated
     @GetMapping("/get/enterprise/list")
     @Operation(summary = "获取当前用户绑定的企业列表")
     public CommonResult<List<AppEnterpriseUserBindRespVO>> getBindList() {
         return success(enterpriseUserBindService.getBindList());
     }
 
+    @PreAuthenticated
     @GetMapping("/get/enterprise/list/by/phone")
     @Operation(summary = "根据手机号获取用户绑定的企业列表")
     public CommonResult<List<AppEnterpriseUserBindRespVO>> getBindListByPhone

+ 11 - 10
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/app/job/AppJobAdvertisedController.java

@@ -50,10 +50,10 @@ public class AppJobAdvertisedController {
         return success(result);
     }
 
-    @GetMapping("/get/urgent")
-    @Operation(summary = "获取急聘招聘职位分页")
-    public CommonResult<PageResult<AppJobAdvertisedHomeRespVO>> getUrgentPage(@Valid PageParam pageParam) {
-        PageResult<AppJobAdvertisedHomeRespVO> result = jobAdvertisedService.getUrgentPage(pageParam);
+    @GetMapping("/get/hire")
+    @Operation(summary = "获取聘职位分页")
+    public CommonResult<PageResult<AppJobAdvertisedHomeRespVO>> getHirePage(@Valid PageParam pageParam) {
+        PageResult<AppJobAdvertisedHomeRespVO> result = jobAdvertisedService.getHirePage(pageParam);
         return success(result);
     }
 
@@ -64,6 +64,13 @@ public class AppJobAdvertisedController {
         return success(result);
     }
 
+    @GetMapping("/get/acquainted")
+    @Operation(summary = "获取相识职位信息分页")
+    public CommonResult<PageResult<AppJobAdvertisedHomeRespVO>> getAcquaintedPage(@Valid AppJobAdvertisedPageReqVO pageReqVO) {
+        PageResult<AppJobAdvertisedHomeRespVO> respVO = jobAdvertisedService.getAcquaintedPage(pageReqVO);
+        return success(respVO);
+    }
+
     @GetMapping("/get/detail")
     @Operation(summary = "获取招聘职位详情")
     public CommonResult<AppJobAdvertisedDetailRespVO> detail(@RequestParam("id") Long id) {
@@ -71,12 +78,6 @@ public class AppJobAdvertisedController {
         return success(respVO);
     }
 
-    @GetMapping("/get/acquainted")
-    @Operation(summary = "获取相识职位信息分页")
-    public CommonResult<PageResult<AppJobAdvertisedHomeRespVO>> detail(@Valid AppJobAdvertisedPageReqVO pageReqVO) {
-        PageResult<AppJobAdvertisedHomeRespVO> respVO = jobAdvertisedService.getAcquaintedPage(pageReqVO);
-        return success(respVO);
-    }
 
     @GetMapping("/search")
     @Operation(summary = "搜索")

+ 20 - 15
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/app/job/vo/AppJobAdvertisedPageReqVO.java

@@ -6,28 +6,26 @@ 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 java.util.List;
 
-import static com.citu.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
-
 @Schema(description = "menduner - 招聘职位分页 Request VO")
 @Data
 @EqualsAndHashCode(callSuper = true)
 @ToString(callSuper = true)
 public class AppJobAdvertisedPageReqVO extends PageParam {
+    // 推荐标识 0 | 最新标识 1 | 相识 2 | 赏金标识 3
+    public final static Integer RECOMMEND = 0;
+    public final static Integer NEW = 1;
+    public final static Integer ACQUAINTED = 2;
+    public final static Integer HIRE = 3;
+
 
-    @Schema(description = "职位id集合", example = "29465")
-    private List<Long> ids;
+    private final static String BEGIN_TIME_KEY = "beginTime";
 
     @Schema(description = "企业id", example = "29465")
     private Long enterpriseId;
 
-    @Schema(description = "发布用户id", example = "9592")
-    private Long userId;
-
     @Schema(description = "工作地区", example = "25976")
     private Long areaId;
 
@@ -49,13 +47,20 @@ public class AppJobAdvertisedPageReqVO extends PageParam {
     @Schema(description = "职位标签")
     private List<String> tagList;
 
-    @Schema(description = "职位内容")
-    private String content;
+    @Schema(description = "是否雇佣 (众聘)")
+    private Boolean hire;
+
+    @Schema(description = "是否置顶")
+    private Boolean top;
+
+    @Schema(description = "标记,详情看该类下常量")
+    private Integer mark;
 
-    @Schema(description = "职位要求")
-    private String requirement;
 
-    @Schema(description = "职位状态", example = "2")
-    private String status;
+    public AppJobAdvertisedPageReqVO(PageParam page,Integer mark) {
+        this.setPageNo(page.getPageNo());
+        this.setPageSize(page.getPageSize());
+        this.mark = mark;
+    }
 
 }

+ 2 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/app/job/vo/AppJobAdvertisedSearchPageReqVO.java

@@ -38,6 +38,8 @@ public class AppJobAdvertisedSearchPageReqVO extends PageParam {
     @Schema(description = "工作区域id集合", example = "[]")
     private List<Long> areaIds;
 
+    @Schema(description = "是否雇佣 (众聘)")
+    private Boolean hire;
 
     // ========== 企业相关 ==========
 

+ 43 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/appadmin/hire/AppAdminHireCommissionRatioController.java

@@ -0,0 +1,43 @@
+package com.citu.module.menduner.system.controller.appadmin.hire;
+
+
+import com.citu.framework.common.pojo.CommonResult;
+import com.citu.framework.security.core.annotations.PreAuthenticated;
+import com.citu.module.menduner.system.controller.appadmin.hire.vo.AppAdminHireCommissionRatioRespVO;
+import com.citu.module.menduner.system.service.hire.HireCommissionRatioService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.math.BigDecimal;
+
+import static com.citu.framework.common.pojo.CommonResult.success;
+
+@Tag(name = "招聘端 - 众聘-佣金比例")
+@RestController
+@RequestMapping("/menduner/system/hire-commission-ratio")
+@Validated
+public class AppAdminHireCommissionRatioController {
+
+    @Resource
+    private HireCommissionRatioService service;
+
+
+    @PreAuthenticated
+    @GetMapping("/get")
+    @Operation(summary = "获取佣金比例")
+    public CommonResult<AppAdminHireCommissionRatioRespVO> get() {
+        return CommonResult.success(service.get());
+    }
+
+    @PreAuthenticated
+    @PostMapping("/update")
+    @Operation(summary = "修改佣金比例")
+    public CommonResult<Boolean> update(@RequestParam("rate") BigDecimal rate) {
+        service.updateRate(rate);
+        return success(true);
+    }
+
+}

+ 75 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/appadmin/hire/AppAdminHireJobCvRelController.java

@@ -0,0 +1,75 @@
+package com.citu.module.menduner.system.controller.appadmin.hire;
+
+
+import com.citu.framework.common.pojo.CommonResult;
+import com.citu.framework.common.pojo.PageResult;
+import com.citu.framework.common.util.string.StrUtils;
+import com.citu.framework.security.core.annotations.PreAuthenticated;
+import com.citu.module.menduner.system.controller.appadmin.hire.vo.AppAdminHireJobCvRelPageReqVO;
+import com.citu.module.menduner.system.controller.appadmin.hire.vo.AppAdminHireJobCvRelRespVO;
+import com.citu.module.menduner.system.controller.appadmin.person.vo.AppAdminPersonSimpleRespVO;
+import com.citu.module.menduner.system.service.hire.HireJobCvRelService;
+import com.citu.module.menduner.system.service.hire.HireJobIntegrationService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import javax.validation.Valid;
+
+import java.util.List;
+
+import static com.citu.framework.common.pojo.CommonResult.success;
+
+@Tag(name = "招聘端 - 众聘-简历投递")
+@RestController
+@RequestMapping("/menduner/system/hire-job-cv-rel")
+@Validated
+public class AppAdminHireJobCvRelController {
+
+    @Resource
+    private HireJobCvRelService service;
+
+    @Resource
+    private HireJobIntegrationService integrationService;
+
+
+    @PreAuthenticated
+    @GetMapping("/page")
+    @Operation(summary = "获得投递职位分页")
+    public CommonResult<PageResult<AppAdminHireJobCvRelRespVO>> page
+            (@Valid AppAdminHireJobCvRelPageReqVO pageReqVO) {
+        return success(integrationService.page(pageReqVO));
+    }
+
+    @PreAuthenticated
+    @GetMapping("/recommend/list")
+    @Operation(summary = "获取推荐人的用户列表")
+    public CommonResult<List<AppAdminPersonSimpleRespVO>> getRecommendUser() {
+        return success(integrationService.getRecommendUser());
+    }
+
+    @PreAuthenticated
+    @PostMapping("/eliminate")
+    @Operation(summary = "淘汰,不合适")
+    public CommonResult<Boolean> eliminate(@RequestParam("ids") String ids) {
+        return success(service.eliminate(StrUtils.splitToLong(ids)));
+    }
+
+    @PreAuthenticated
+    @PostMapping("/entry")
+    @Operation(summary = "入职")
+    public CommonResult<Boolean> entry(@RequestParam("ids") String ids) {
+        return success(service.entry(StrUtils.splitToLong(ids)));
+    }
+
+    @PreAuthenticated
+    @PostMapping("/settlement")
+    @Operation(summary = "结算")
+    public CommonResult<Boolean> settlement(@RequestParam("ids") String ids) {
+        return success(service.settlement(StrUtils.splitToLong(ids)));
+    }
+
+
+}

+ 12 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/appadmin/hire/vo/AppAdminHireCommissionRatioRespVO.java

@@ -0,0 +1,12 @@
+package com.citu.module.menduner.system.controller.appadmin.hire.vo;
+
+
+import com.citu.module.menduner.system.controller.base.hire.HireCommissionRatioRespVO;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+@Schema(description = "求职端 - 众聘-佣金比例 Response VO")
+@Data
+public class AppAdminHireCommissionRatioRespVO extends HireCommissionRatioRespVO {
+
+}

+ 39 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/appadmin/hire/vo/AppAdminHireJobCvRelPageReqVO.java

@@ -0,0 +1,39 @@
+package com.citu.module.menduner.system.controller.appadmin.hire.vo;
+
+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 AppAdminHireJobCvRelPageReqVO extends PageParam {
+
+    @Schema(description = "推荐人", example = "21239")
+    private Long recommendUserId;
+
+    @Schema(description = "投递的岗位", example = "1")
+    private Long jobId;
+
+    @Schema(description = "投递人名称", example = "芋艿")
+    private String name;
+
+    @Schema(description = "投递人联系电话")
+    private String phone;
+
+    @Schema(description = "投递的简历状态", example = "1")
+    private String status;
+
+    @Schema(description = "创建时间")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDateTime[] createTime;
+
+}

+ 47 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/appadmin/hire/vo/AppAdminHireJobCvRelRespVO.java

@@ -0,0 +1,47 @@
+package com.citu.module.menduner.system.controller.appadmin.hire.vo;
+
+import com.citu.module.menduner.system.controller.appadmin.job.vo.AppAdminJobSimpleRespVO;
+import com.citu.module.menduner.system.controller.appadmin.person.vo.AppAdminPersonSimpleRespVO;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+@Schema(description = "求职端 - 众聘-简历投递 Response VO")
+@Data
+public class AppAdminHireJobCvRelRespVO {
+
+    @Schema(description = "id", requiredMode = Schema.RequiredMode.REQUIRED, example = "25578")
+    private Long id;
+
+    @Schema(description = "推荐人", requiredMode = Schema.RequiredMode.REQUIRED, example = "21239")
+    private Long recommendUserId;
+
+    @Schema(description = "投递用户id", example = "32103")
+    private Long userId;
+
+    @Schema(description = "投递人名称", example = "芋艿")
+    private String name;
+
+    @Schema(description = "投递人联系电话")
+    private String phone;
+
+    @Schema(description = "简历附件地址", example = "https://www.iocoder.cn")
+    private String url;
+
+    @Schema(description = "投递的简历状态")
+    private String status;
+
+    @Schema(description = "更新时间")
+    private LocalDateTime updateTime;
+
+    @Schema(description = "招聘信息")
+    private AppAdminJobSimpleRespVO job;
+
+    @Schema(description = "推荐的人员信息")
+    private AppAdminPersonSimpleRespVO recommendPerson;
+
+    @Schema(description = "投递人员信息")
+    private AppAdminPersonSimpleRespVO person;
+
+}

+ 3 - 3
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/appadmin/job/AppAdminJobAdvertisedController.java

@@ -43,15 +43,15 @@ public class AppAdminJobAdvertisedController {
     @PreAuthenticated
     @GetMapping("/detail")
     @Operation(summary = "获得招聘职位详情")
-    public CommonResult<AppAdminJobDetailRespVO> page(@RequestParam("id") Long id) {
+    public CommonResult<AppAdminJobDetailRespVO> detail(@RequestParam("id") Long id) {
         return success(JobAdvertisedConvert.INSTANCE.convert5(jobAdvertisedService.detail(id)));
     }
 
     @PreAuthenticated
     @GetMapping("/list")
     @Operation(summary = "获取发布的职位列表")
-    public CommonResult<List<AppAdminJobSimpleRespVO>> getList() {
-        return success(jobAdvertisedService.getList());
+    public CommonResult<List<AppAdminJobSimpleRespVO>> getList(@RequestParam("hire") boolean hire) {
+        return success(jobAdvertisedService.getList(hire));
     }
 
 

+ 3 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/appadmin/job/vo/AppAdminJobPageReqVO.java

@@ -51,4 +51,7 @@ public class AppAdminJobPageReqVO extends PageParam {
     @Schema(description = "是否获取过期的数据")
     private boolean hasExpiredData;
 
+    @Schema(description = "是否雇佣 (众聘)")
+    private boolean hire;
+
 }

+ 7 - 1
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/appadmin/job/vo/AppAdminJobSaveReqVO.java

@@ -62,7 +62,6 @@ public class AppAdminJobSaveReqVO {
     @Schema(description = "过期时间")
     private LocalDateTime expireTime;
 
-
     @Schema(description = "工作地址")
     private String address;
 
@@ -72,4 +71,11 @@ public class AppAdminJobSaveReqVO {
     @Schema(description = "维度")
     private String latitude;
 
+    @Schema(description = "是否雇佣 (众聘)")
+    private Boolean hire = false;
+
+    @Schema(description = "雇佣金额")
+    private BigDecimal hirePrice;
+
+
 }

+ 2 - 2
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/appadmin/person/AppAdminPersonCvController.java

@@ -4,8 +4,8 @@ import com.citu.framework.common.pojo.CommonResult;
 import com.citu.framework.common.pojo.PageResult;
 import com.citu.framework.common.util.string.StrUtils;
 import com.citu.framework.security.core.annotations.PreAuthenticated;
-import com.citu.module.menduner.system.controller.appadmin.cv.AppAdminJobCvRelPageReqVO;
-import com.citu.module.menduner.system.controller.appadmin.cv.AppAdminJobCvRelRespVO;
+import com.citu.module.menduner.system.controller.appadmin.person.cv.AppAdminJobCvRelPageReqVO;
+import com.citu.module.menduner.system.controller.appadmin.person.cv.AppAdminJobCvRelRespVO;
 import com.citu.module.menduner.system.controller.appadmin.person.vo.AppAdminPersonDetailRespVO;
 import com.citu.module.menduner.system.service.job.JobCvRelService;
 import com.citu.module.menduner.system.service.job.JobIntegrationService;

+ 1 - 1
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/appadmin/cv/AppAdminJobCvRelPageReqVO.java → menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/appadmin/person/cv/AppAdminJobCvRelPageReqVO.java

@@ -1,4 +1,4 @@
-package com.citu.module.menduner.system.controller.appadmin.cv;
+package com.citu.module.menduner.system.controller.appadmin.person.cv;
 
 import com.citu.module.menduner.system.controller.appadmin.person.vo.AppAdminPersonPageReqVO;
 import io.swagger.v3.oas.annotations.media.Schema;

+ 1 - 1
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/appadmin/cv/AppAdminJobCvRelRespVO.java → menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/appadmin/person/cv/AppAdminJobCvRelRespVO.java

@@ -1,4 +1,4 @@
-package com.citu.module.menduner.system.controller.appadmin.cv;
+package com.citu.module.menduner.system.controller.appadmin.person.cv;
 
 import com.citu.module.menduner.system.controller.appadmin.job.vo.AppAdminJobSimpleRespVO;
 import com.citu.module.menduner.system.controller.appadmin.person.vo.AppAdminPersonSimpleRespVO;

+ 0 - 3
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/appadmin/person/vo/AppAdminPersonSimpleRespVO.java

@@ -1,12 +1,9 @@
 package com.citu.module.menduner.system.controller.appadmin.person.vo;
 
-import com.citu.module.menduner.system.controller.appadmin.person.eduexp.AppAdminEduExpSimpleRespVO;
-import com.citu.module.menduner.system.controller.appadmin.person.workexp.AppAdminWorkExpSimpleRespVO;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 
 import java.time.LocalDateTime;
-import java.util.List;
 
 @Schema(description = "menduner - 人才简易信息 Response VO")
 @Data

+ 9 - 1
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/appadmin/user/AppAdminUserController.java

@@ -4,8 +4,8 @@ import com.citu.framework.common.pojo.CommonResult;
 import com.citu.framework.common.pojo.PageResult;
 import com.citu.framework.common.util.string.StrUtils;
 import com.citu.framework.security.core.annotations.PreAuthenticated;
-import com.citu.module.menduner.system.controller.appadmin.user.vo.AppAdminUserRespVO;
 import com.citu.module.menduner.system.controller.appadmin.user.vo.AppAdminUserPageReqVO;
+import com.citu.module.menduner.system.controller.appadmin.user.vo.AppAdminUserRespVO;
 import com.citu.module.menduner.system.controller.appadmin.user.vo.AppAdminUserSaveReqVO;
 import com.citu.module.menduner.system.service.enterprise.bind.EnterpriseUserBindService;
 import io.swagger.v3.oas.annotations.Operation;
@@ -64,4 +64,12 @@ public class AppAdminUserController {
             @Valid AppAdminUserPageReqVO reqVO) {
         return success(service.selectPage(reqVO));
     }
+
+    @PreAuthenticated
+    @PostMapping("/bind/post")
+    @Operation(summary = "绑定用户的岗位")
+    public CommonResult<Boolean> bindPost(
+            @RequestParam("id") Long id, @RequestParam("postId") Long postId) {
+        return success(service.bindPost(id, postId));
+    }
 }

+ 3 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/appadmin/user/vo/AppAdminUserPageReqVO.java

@@ -8,6 +8,9 @@ import lombok.Data;
 @Data
 public class AppAdminUserPageReqVO extends PageParam {
 
+    @Schema(description = "岗位id", example = "23317")
+    private Long postId;
+
     @Schema(description = "名称", example = "x女士")
     private String name;
 

+ 2 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/appadmin/user/vo/AppAdminUserRespVO.java

@@ -10,6 +10,8 @@ import java.time.LocalDateTime;
 @Data
 public class AppAdminUserRespVO extends EnterpriseUserBindSimpleRespVO {
 
+    @Schema(description = "企业岗位id", example = "25968")
+    private Long postId;
 
     @Schema(description = "联系手机号")
     private String phone;

+ 30 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/hire/HireCommissionRatioPageReqVO.java

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

+ 37 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/hire/HireCommissionRatioRespVO.java

@@ -0,0 +1,37 @@
+package com.citu.module.menduner.system.controller.base.hire;
+
+
+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.math.BigDecimal;
+import java.time.LocalDateTime;
+
+@Schema(description = "管理后台 - 众聘-佣金比例 Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class HireCommissionRatioRespVO {
+
+    @Schema(description = "id", requiredMode = Schema.RequiredMode.REQUIRED, example = "252")
+    @ExcelProperty("id")
+    private Long id;
+
+    @Schema(description = "企业id", requiredMode = Schema.RequiredMode.REQUIRED, example = "24901")
+    @ExcelProperty("企业id")
+    private Long enterpriseId;
+
+    @Schema(description = "用户id", requiredMode = Schema.RequiredMode.REQUIRED, example = "6824")
+    @ExcelProperty("用户id")
+    private Long userId;
+
+    @Schema(description = "佣金比例(0.000-100.000)")
+    @ExcelProperty("佣金比例(0.000-100.000)")
+    private BigDecimal rate;
+
+    @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("创建时间")
+    private LocalDateTime createTime;
+
+}

+ 30 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/hire/HireCommissionRatioSaveReqVO.java

@@ -0,0 +1,30 @@
+package com.citu.module.menduner.system.controller.base.hire;
+
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+import java.math.BigDecimal;
+
+@Schema(description = "管理后台 - 众聘-佣金比例新增/修改 Request VO")
+@Data
+public class HireCommissionRatioSaveReqVO {
+
+    @Schema(description = "id", requiredMode = Schema.RequiredMode.REQUIRED, example = "252")
+    private Long id;
+
+    @Schema(description = "企业id", requiredMode = Schema.RequiredMode.REQUIRED, example = "24901")
+    @NotNull(message = "{1_099_000_007}")
+    private Long enterpriseId;
+
+    @Schema(description = "用户id", requiredMode = Schema.RequiredMode.REQUIRED, example = "6824")
+    @NotEmpty(message = "{1_099_000_006}")
+    private Long userId;
+
+    @NotNull(message = "{1_100_037_002}")
+    @Schema(description = "佣金比例(0.000-100.000)")
+    private BigDecimal rate;
+
+}

+ 51 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/hire/HireJobCvRelPageReqVO.java

@@ -0,0 +1,51 @@
+package com.citu.module.menduner.system.controller.base.hire;
+
+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 HireJobCvRelPageReqVO extends PageParam {
+
+    @Schema(description = "企业id", example = "10683")
+    private Long enterpriseId;
+
+    @Schema(description = "发布的职位id", example = "30783")
+    private Long jobId;
+
+    @Schema(description = "发布职位的用户id", example = "17002")
+    private Long publishUserId;
+
+    @Schema(description = "推荐人", example = "21239")
+    private Long recommendUserId;
+
+    @Schema(description = "投递用户id", example = "32103")
+    private Long userId;
+
+    @Schema(description = "投递人名称", example = "芋艿")
+    private String name;
+
+    @Schema(description = "投递人联系电话")
+    private String phone;
+
+    @Schema(description = "简历附件地址", example = "https://www.iocoder.cn")
+    private String url;
+
+    @Schema(description = "投递的简历状态", example = "1")
+    private String status;
+
+    @Schema(description = "创建时间")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDateTime[] createTime;
+
+}

+ 59 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/hire/HireJobCvRelRespVO.java

@@ -0,0 +1,59 @@
+package com.citu.module.menduner.system.controller.base.hire;
+
+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 HireJobCvRelRespVO {
+
+    @Schema(description = "id", requiredMode = Schema.RequiredMode.REQUIRED, example = "25578")
+    @ExcelProperty("id")
+    private Long id;
+
+    @Schema(description = "企业id", requiredMode = Schema.RequiredMode.REQUIRED, example = "10683")
+    @ExcelProperty("企业id")
+    private Long enterpriseId;
+
+    @Schema(description = "发布的职位id", requiredMode = Schema.RequiredMode.REQUIRED, example = "30783")
+    @ExcelProperty("发布的职位id")
+    private Long jobId;
+
+    @Schema(description = "发布职位的用户id", requiredMode = Schema.RequiredMode.REQUIRED, example = "17002")
+    @ExcelProperty("发布职位的用户id")
+    private Long publishUserId;
+
+    @Schema(description = "推荐人", requiredMode = Schema.RequiredMode.REQUIRED, example = "21239")
+    @ExcelProperty("推荐人")
+    private Long recommendUserId;
+
+    @Schema(description = "投递用户id", requiredMode = Schema.RequiredMode.REQUIRED, example = "32103")
+    @ExcelProperty("投递用户id")
+    private Long userId;
+
+    @Schema(description = "投递人名称", example = "芋艿")
+    @ExcelProperty("投递人名称")
+    private String name;
+
+    @Schema(description = "投递人联系电话")
+    @ExcelProperty("投递人联系电话")
+    private String phone;
+
+    @Schema(description = "简历附件地址", requiredMode = Schema.RequiredMode.REQUIRED, example = "https://www.iocoder.cn")
+    @ExcelProperty("简历附件地址")
+    private String url;
+
+    @Schema(description = "投递的简历状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+    @ExcelProperty("投递的简历状态")
+    private String status;
+
+    @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("创建时间")
+    private LocalDateTime createTime;
+
+}

+ 54 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/hire/HireJobCvRelSaveReqVO.java

@@ -0,0 +1,54 @@
+package com.citu.module.menduner.system.controller.base.hire;
+
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+
+@Schema(description = "管理后台 - 众聘-简历投递新增/修改 Request VO")
+@Data
+public class HireJobCvRelSaveReqVO {
+
+    @Schema(description = "id", requiredMode = Schema.RequiredMode.REQUIRED, example = "25578")
+    private Long id;
+
+    @Schema(description = "企业id", requiredMode = Schema.RequiredMode.REQUIRED, example = "10683")
+    @NotNull(message = "{1_099_000_007}")
+    private Long enterpriseId;
+
+    @Schema(description = "发布的职位id", requiredMode = Schema.RequiredMode.REQUIRED, example = "30783")
+    @NotNull(message = "{1_100_036_002}")
+    private Long jobId;
+
+    @Schema(description = "发布职位的用户id", requiredMode = Schema.RequiredMode.REQUIRED, example = "17002")
+    @NotNull(message = "{1_100_036_003}")
+    private Long publishUserId;
+
+    @Schema(description = "推荐人", requiredMode = Schema.RequiredMode.REQUIRED, example = "21239")
+    @NotNull(message = "{1_100_036_004}")
+    private Long recommendUserId;
+
+    @Schema(description = "投递用户id", requiredMode = Schema.RequiredMode.REQUIRED, example = "32103")
+    @NotNull(message = "{1_100_036_005}")
+    private Long userId;
+
+    @NotBlank(message = "{1_100_036_006}")
+    @Schema(description = "投递人名称", example = "芋艿")
+    private String name;
+
+    @NotBlank(message = "{1_100_036_007}")
+    @Schema(description = "投递人联系电话")
+    private String phone;
+
+    @Schema(description = "简历附件地址", requiredMode = Schema.RequiredMode.REQUIRED, example = "https://www.iocoder.cn")
+    @NotBlank(message = "{1_100_036_008}")
+    private String url;
+
+    @Schema(description = "投递的简历状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+    @NotEmpty(message = "{1_099_000_001}")
+    private String status;
+
+}

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

@@ -46,11 +46,8 @@ public class JobAdvertisedPageReqVO extends PageParam {
     @Schema(description = "职位标签")
     private List<String> tagList;
 
-    @Schema(description = "职位内容")
-    private String content;
-
-    @Schema(description = "职位要求")
-    private String requirement;
+    @Schema(description = "是否雇佣 (众聘)")
+    private boolean hire;
 
     @Schema(description = "职位状态", example = "2")
     private String status;

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

@@ -101,6 +101,14 @@ public class JobAdvertisedRespVO {
     @ExcelProperty("维度")
     private String latitude;
 
+    @Schema(description = "是否雇佣 (众聘)")
+    @ExcelProperty("是否雇佣 (众聘)")
+    private Boolean hire;
+
+    @Schema(description = "雇佣金额")
+    @ExcelProperty("雇佣金额")
+    private BigDecimal hirePrice;
+
     @Schema(description = "职位状态", example = "2")
     @ExcelProperty(value = "职位状态", converter = DictConvert.class)
     @DictFormat(MENDUNER_STATUS)

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

@@ -1,5 +1,6 @@
 package com.citu.module.menduner.system.controller.base.job;
 
+import com.alibaba.excel.annotation.ExcelProperty;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 
@@ -82,6 +83,12 @@ public class JobAdvertisedSaveReqVO {
     @Schema(description = "维度")
     private String latitude;
 
+    @Schema(description = "是否雇佣 (众聘)")
+    private Boolean hire;
+
+    @Schema(description = "雇佣金额")
+    private BigDecimal hirePrice;
+
     @Schema(description = "职位状态", example = "2")
     private String status;
 

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

@@ -44,6 +44,12 @@ public class JobAdvertisedSimpleRespVO {
     @Schema(description = "职位标签", example = "[xx,xx]")
     private List<String> tagList;
 
+    @Schema(description = "是否雇佣 (众聘)")
+    private Boolean hire;
+
+    @Schema(description = "雇佣金额")
+    private BigDecimal hirePrice;
+
     @Schema(description = "状态", example = "1")
     private String status;
 

+ 32 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/user/account/UserAccountPageReqVO.java

@@ -0,0 +1,32 @@
+package com.citu.module.menduner.system.controller.base.user.account;
+
+
+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.math.BigDecimal;
+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 UserAccountPageReqVO extends PageParam {
+
+    @Schema(description = "用户id", example = "19716")
+    private Long userId;
+
+    @Schema(description = "账户余额")
+    private BigDecimal balance;
+
+    @Schema(description = "创建时间")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDateTime[] createTime;
+
+}

+ 33 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/user/account/UserAccountRespVO.java

@@ -0,0 +1,33 @@
+package com.citu.module.menduner.system.controller.base.user.account;
+
+
+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.math.BigDecimal;
+import java.time.LocalDateTime;
+
+@Schema(description = "管理后台 - 用户账户 Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class UserAccountRespVO {
+
+    @Schema(description = "id", requiredMode = Schema.RequiredMode.REQUIRED, example = "31789")
+    @ExcelProperty("id")
+    private Long id;
+
+    @Schema(description = "用户id", requiredMode = Schema.RequiredMode.REQUIRED, example = "19716")
+    @ExcelProperty("用户id")
+    private Long userId;
+
+    @Schema(description = "账户余额")
+    @ExcelProperty("账户余额")
+    private BigDecimal balance;
+
+    @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("创建时间")
+    private LocalDateTime createTime;
+
+}

+ 23 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/user/account/UserAccountSaveReqVO.java

@@ -0,0 +1,23 @@
+package com.citu.module.menduner.system.controller.base.user.account;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import javax.validation.constraints.NotEmpty;
+import java.math.BigDecimal;
+
+@Schema(description = "管理后台 - 用户账户新增/修改 Request VO")
+@Data
+public class UserAccountSaveReqVO {
+
+    @Schema(description = "id", requiredMode = Schema.RequiredMode.REQUIRED, example = "31789")
+    private Long id;
+
+    @Schema(description = "用户id", requiredMode = Schema.RequiredMode.REQUIRED, example = "19716")
+    @NotEmpty(message = "{1_099_000_006}")
+    private Long userId;
+
+    @Schema(description = "账户余额")
+    private BigDecimal balance;
+
+}

+ 14 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/convert/HireCommissionRatioConvert.java

@@ -0,0 +1,14 @@
+package com.citu.module.menduner.system.convert;
+
+import com.citu.module.menduner.system.controller.appadmin.hire.vo.AppAdminHireCommissionRatioRespVO;
+import com.citu.module.menduner.system.dal.dataobject.hire.HireCommissionRatioDO;
+import org.mapstruct.Mapper;
+import org.mapstruct.factory.Mappers;
+
+@Mapper
+public interface HireCommissionRatioConvert {
+
+    HireCommissionRatioConvert INSTANCE = Mappers.getMapper(HireCommissionRatioConvert.class);
+
+    AppAdminHireCommissionRatioRespVO convert(HireCommissionRatioDO bean);
+}

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

@@ -0,0 +1,45 @@
+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 lombok.*;
+
+import java.math.BigDecimal;
+
+/**
+ * 众聘-佣金比例 DO
+ *
+ * @author Rayson
+ */
+@TableName("mde_hire_commission_ratio")
+@KeySequence("mde_hire_commission_ratio_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class HireCommissionRatioDO extends BaseDO {
+
+    /**
+     * id
+     */
+    @TableId
+    private Long id;
+    /**
+     * 企业id
+     */
+    private Long enterpriseId;
+    /**
+     * 用户id
+     */
+    private Long userId;
+    /**
+     * 佣金比例(0.000-100.000)
+     */
+    private BigDecimal rate;
+
+}

+ 67 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/dataobject/hire/HireJobCvRelDO.java

@@ -0,0 +1,67 @@
+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 lombok.*;
+
+/**
+ * 众聘-简历投递 DO
+ *
+ * @author Rayson
+ */
+@TableName("mde_hire_job_cv_rel")
+@KeySequence("mde_hire_job_cv_rel_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class HireJobCvRelDO extends BaseDO {
+
+    /**
+     * id
+     */
+    @TableId
+    private Long id;
+    /**
+     * 企业id
+     */
+    private Long enterpriseId;
+    /**
+     * 发布的职位id
+     */
+    private Long jobId;
+    /**
+     * 发布职位的用户id
+     */
+    private Long publishUserId;
+    /**
+     * 推荐人
+     */
+    private Long recommendUserId;
+    /**
+     * 投递用户id
+     */
+    private Long userId;
+    /**
+     * 投递人名称
+     */
+    private String name;
+    /**
+     * 投递人联系电话
+     */
+    private String phone;
+    /**
+     * 简历附件地址
+     */
+    private String url;
+    /**
+     * 投递的简历状态
+     */
+    private String status;
+
+}

+ 8 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/dataobject/job/JobAdvertisedDO.java

@@ -112,6 +112,14 @@ public class JobAdvertisedDO extends TenantBaseDO {
      * 维度
      */
     private String latitude;
+    /**
+     * 是否雇佣 (众聘)
+     */
+    private Boolean hire;
+    /**
+     * 雇佣金额
+     */
+    private BigDecimal hirePrice;
     /**
      * 职位状态
      * <p>

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

@@ -0,0 +1,41 @@
+package com.citu.module.menduner.system.dal.dataobject.user;
+
+
+import com.baomidou.mybatisplus.annotation.KeySequence;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.citu.framework.mybatis.core.dataobject.BaseDO;
+import lombok.*;
+
+import java.math.BigDecimal;
+
+/**
+ * 用户账户 DO
+ *
+ * @author Rayson
+ */
+@TableName("mde_user_account")
+@KeySequence("mde_user_account_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class UserAccountDO extends BaseDO {
+
+    /**
+     * id
+     */
+    @TableId
+    private Long id;
+    /**
+     * 用户id
+     */
+    private Long userId;
+    /**
+     * 账户余额
+     */
+    private BigDecimal balance;
+
+}

+ 15 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/es/job/ESJobAdvertisedMergeDO.java

@@ -3,6 +3,7 @@ package com.citu.module.menduner.system.dal.es.job;
 
 import com.citu.framework.es.core.dataobject.ESBaseDO;
 import com.citu.module.menduner.system.enums.FieldAnalyzer;
+import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 import org.springframework.data.elasticsearch.annotations.DateFormat;
 import org.springframework.data.elasticsearch.annotations.Document;
@@ -31,10 +32,12 @@ public class ESJobAdvertisedMergeDO extends ESBaseDO {
     /**
      * 企业id
      */
+    @Field(type = FieldType.Long)
     private Long enterpriseId;
     /**
      * 发布用户id
      */
+    @Field(type = FieldType.Long)
     private Long userId;
     /**
      * 工作地区
@@ -71,10 +74,12 @@ public class ESJobAdvertisedMergeDO extends ESBaseDO {
     /**
      * 薪酬from
      */
+    @Field(type = FieldType.Double)
     private BigDecimal payFrom;
     /**
      * 薪酬to
      */
+    @Field(type = FieldType.Double)
     private BigDecimal payTo;
     /**
      * 薪酬单位
@@ -121,6 +126,16 @@ public class ESJobAdvertisedMergeDO extends ESBaseDO {
      */
     @Field(type = FieldType.Auto)
     private String latitude;
+    /**
+     * 是否雇佣 (众聘)
+     */
+    @Field(type = FieldType.Boolean)
+    private Boolean hire;
+    /**
+     * 雇佣金额
+     */
+    @Field(type = FieldType.Double)
+    private BigDecimal hirePrice;
     /**
      * 职位状态
      * <p>

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

@@ -74,6 +74,7 @@ public interface EnterpriseUserBindMapper extends BaseMapperX<EnterpriseUserBind
         wrapper.likeIfPresent(EnterpriseUserBindDO::getPhone, reqVO.getPhone());
         wrapper.likeIfPresent(EnterpriseUserBindDO::getEmail, reqVO.getEmail());
         wrapper.eqIfPresent(EnterpriseUserBindDO::getSex, reqVO.getSex());
+        wrapper.eqIfPresent(EnterpriseUserBindDO::getPostId, reqVO.getPostId());
         wrapper.eqIfPresent(EnterpriseUserBindDO::getStatus, reqVO.getStatus());
         wrapper.orderByDesc(EnterpriseUserBindDO::getUserType, EnterpriseUserBindDO::getUpdateTime);
         return selectJoinPage(reqVO, AppAdminUserRespVO.class, wrapper);

+ 33 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/mysql/hire/HireCommissionRatioMapper.java

@@ -0,0 +1,33 @@
+package com.citu.module.menduner.system.dal.mysql.hire;
+
+
+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.hire.HireCommissionRatioPageReqVO;
+import com.citu.module.menduner.system.dal.dataobject.hire.HireCommissionRatioDO;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 众聘-佣金比例 Mapper
+ *
+ * @author Rayson
+ */
+@Mapper
+public interface HireCommissionRatioMapper extends BaseMapperX<HireCommissionRatioDO> {
+
+    default PageResult<HireCommissionRatioDO> selectPage(HireCommissionRatioPageReqVO reqVO) {
+        return selectPage(reqVO, new LambdaQueryWrapperX<HireCommissionRatioDO>()
+                .eqIfPresent(HireCommissionRatioDO::getEnterpriseId, reqVO.getEnterpriseId())
+                .eqIfPresent(HireCommissionRatioDO::getUserId, reqVO.getUserId())
+                .betweenIfPresent(HireCommissionRatioDO::getCreateTime, reqVO.getCreateTime())
+                .orderByDesc(HireCommissionRatioDO::getId));
+    }
+
+   default HireCommissionRatioDO selectByEnterpriseIdAndUserId(Long enterpriseId, Long userId){
+        return selectOne(new LambdaQueryWrapperX<HireCommissionRatioDO>()
+                .eq(HireCommissionRatioDO::getEnterpriseId, enterpriseId)
+                .eq(HireCommissionRatioDO::getUserId, userId));
+    }
+
+}

+ 84 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/mysql/hire/HireJobCvRelMapper.java

@@ -0,0 +1,84 @@
+package com.citu.module.menduner.system.dal.mysql.hire;
+
+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.framework.mybatis.core.query.MPJLambdaWrapperX;
+import com.citu.module.menduner.system.controller.appadmin.hire.vo.AppAdminHireJobCvRelPageReqVO;
+import com.citu.module.menduner.system.controller.appadmin.hire.vo.AppAdminHireJobCvRelRespVO;
+import com.citu.module.menduner.system.controller.appadmin.person.cv.AppAdminJobCvRelRespVO;
+import com.citu.module.menduner.system.controller.appadmin.person.vo.AppAdminPersonSimpleRespVO;
+import com.citu.module.menduner.system.controller.base.hire.HireJobCvRelPageReqVO;
+import com.citu.module.menduner.system.dal.dataobject.hire.HireJobCvRelDO;
+import com.citu.module.menduner.system.dal.dataobject.job.JobAdvertisedDO;
+import com.citu.module.menduner.system.dal.dataobject.person.PersonInfoDO;
+import org.apache.ibatis.annotations.Mapper;
+
+import java.util.List;
+
+/**
+ * 众聘-简历投递 Mapper
+ *
+ * @author Rayson
+ */
+@Mapper
+public interface HireJobCvRelMapper extends BaseMapperX<HireJobCvRelDO> {
+
+    default PageResult<HireJobCvRelDO> selectPage(HireJobCvRelPageReqVO reqVO) {
+        return selectPage(reqVO, new LambdaQueryWrapperX<HireJobCvRelDO>()
+                .eqIfPresent(HireJobCvRelDO::getEnterpriseId, reqVO.getEnterpriseId())
+                .eqIfPresent(HireJobCvRelDO::getJobId, reqVO.getJobId())
+                .eqIfPresent(HireJobCvRelDO::getPublishUserId, reqVO.getPublishUserId())
+                .eqIfPresent(HireJobCvRelDO::getRecommendUserId, reqVO.getRecommendUserId())
+                .eqIfPresent(HireJobCvRelDO::getUserId, reqVO.getUserId())
+                .likeIfPresent(HireJobCvRelDO::getName, reqVO.getName())
+                .eqIfPresent(HireJobCvRelDO::getPhone, reqVO.getPhone())
+                .eqIfPresent(HireJobCvRelDO::getUrl, reqVO.getUrl())
+                .eqIfPresent(HireJobCvRelDO::getStatus, reqVO.getStatus())
+                .betweenIfPresent(HireJobCvRelDO::getCreateTime, reqVO.getCreateTime())
+                .orderByDesc(HireJobCvRelDO::getId));
+    }
+
+
+    default PageResult<AppAdminHireJobCvRelRespVO> page(AppAdminHireJobCvRelPageReqVO reqVO) {
+        // 职位投递userId inner 招聘职位userId and 职位投递userId inner 人才信息userId
+        MPJLambdaWrapperX<HireJobCvRelDO> wrapper = new MPJLambdaWrapperX<>();
+        wrapper.selectAsClass(HireJobCvRelDO.class, AppAdminHireJobCvRelRespVO.class);
+        wrapper.selectAssociation(JobAdvertisedDO.class, AppAdminJobCvRelRespVO::getJob);
+        wrapper.selectAssociation("person", PersonInfoDO.class, AppAdminHireJobCvRelRespVO::getPerson);
+        wrapper.selectAssociation("recommend", PersonInfoDO.class, AppAdminHireJobCvRelRespVO::getRecommendPerson);
+
+        // 投递的职位 inner 招聘职位
+        wrapper.innerJoin(JobAdvertisedDO.class, JobAdvertisedDO::getId, HireJobCvRelDO::getJobId);
+        // 招聘职位的条件
+        wrapper.eqIfExists(HireJobCvRelDO::getJobId, reqVO.getJobId());
+        wrapper.eqIfExists(HireJobCvRelDO::getStatus, reqVO.getStatus());
+
+        // 投递的职位 inner 人才信息 (投递人)
+        wrapper.innerJoin(PersonInfoDO.class, "person", PersonInfoDO::getUserId, HireJobCvRelDO::getRecommendUserId);
+        // 人才相关的条件
+        wrapper.likeIfExists("person.name", reqVO.getName());
+
+        // 投递的职位 inner 人才信息 (推荐人)
+        wrapper.innerJoin(PersonInfoDO.class, PersonInfoDO::getUserId, HireJobCvRelDO::getRecommendUserId);
+        // 人才相关的条件
+        wrapper.likeIfExists("recommend.name", reqVO.getName());
+
+        wrapper.orderByDesc(HireJobCvRelDO::getUpdateTime);
+        return selectJoinPage(reqVO, AppAdminHireJobCvRelRespVO.class, wrapper);
+    }
+
+    /**
+     * 获取投递简历中的推荐人列表
+     **/
+    default List<AppAdminPersonSimpleRespVO> getRecommendUser() {
+        MPJLambdaWrapperX<HireJobCvRelDO> wrapper = new MPJLambdaWrapperX<>();
+        wrapper.selectAsClass(HireJobCvRelDO.class, AppAdminHireJobCvRelRespVO.class);
+        wrapper.selectAssociation(PersonInfoDO.class, AppAdminHireJobCvRelRespVO::getRecommendPerson);
+        // 投递的职位 inner 人才信息 (推荐人)
+        wrapper.innerJoin(PersonInfoDO.class, PersonInfoDO::getUserId, HireJobCvRelDO::getRecommendUserId);
+        wrapper.orderByDesc(HireJobCvRelDO::getUpdateTime);
+        return selectJoinList(AppAdminPersonSimpleRespVO.class, wrapper);
+    }
+
+}

+ 31 - 6
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/mysql/job/JobAdvertisedMapper.java

@@ -8,6 +8,7 @@ import com.citu.framework.mybatis.core.mapper.BaseMapperX;
 import com.citu.framework.mybatis.core.query.LambdaQueryWrapperX;
 import com.citu.framework.mybatis.core.query.MPJLambdaWrapperX;
 import com.citu.module.menduner.system.controller.app.job.vo.AppJobAdvertisedHomeRespVO;
+import com.citu.module.menduner.system.controller.app.job.vo.AppJobAdvertisedPageReqVO;
 import com.citu.module.menduner.system.controller.app.job.vo.AppJobAdvertisedRespVO;
 import com.citu.module.menduner.system.controller.appadmin.job.vo.AppAdminJobPageReqVO;
 import com.citu.module.menduner.system.controller.appadmin.job.vo.AppAdminJobSimpleRespVO;
@@ -39,8 +40,7 @@ public interface JobAdvertisedMapper extends BaseMapperX<JobAdvertisedDO> {
                 .eqIfPresent(JobAdvertisedDO::getType, reqVO.getType())
                 .eqIfPresent(JobAdvertisedDO::getExpType, reqVO.getExpType())
                 .eqIfPresent(JobAdvertisedDO::getEduType, reqVO.getEduType())
-                .likeIfPresent(JobAdvertisedDO::getContent, reqVO.getContent())
-                .likeIfPresent(JobAdvertisedDO::getRequirement, reqVO.getRequirement())
+                .eqIfPresent(JobAdvertisedDO::getHire, reqVO.isHire())
                 .eqIfPresent(JobAdvertisedDO::getStatus, reqVO.getStatus())
                 .betweenIfPresent(JobAdvertisedDO::getCreateTime, reqVO.getCreateTime())
                 .orderByDesc(JobAdvertisedDO::getId));
@@ -59,12 +59,23 @@ public interface JobAdvertisedMapper extends BaseMapperX<JobAdvertisedDO> {
     }
 
 
-    default PageResult<AppJobAdvertisedHomeRespVO> selectPage(PageParam pageParam) {
+    default PageResult<AppJobAdvertisedHomeRespVO> selectPage(AppJobAdvertisedPageReqVO reqVO) {
         MPJLambdaWrapperX<JobAdvertisedDO> query = new MPJLambdaWrapperX<>();
         query.selectAll(JobAdvertisedDO.class);
         query.selectAll(EnterpriseDO.class);
         query.innerJoin(EnterpriseDO.class, EnterpriseDO::getId, JobAdvertisedDO::getEnterpriseId);
+
         query.eq(JobAdvertisedDO::getStatus, MendunerStatusEnum.ENABLE.getStatus());
+        query.eqIfPresent(JobAdvertisedDO::getAreaId, reqVO.getAreaId());
+        query.likeIfPresent(JobAdvertisedDO::getName, reqVO.getName());
+        query.eqIfPresent(JobAdvertisedDO::getPositionId, reqVO.getPositionId());
+        query.eqIfPresent(JobAdvertisedDO::getType, reqVO.getType());
+        query.eqIfPresent(JobAdvertisedDO::getExpType, reqVO.getExpType());
+        query.eqIfPresent(JobAdvertisedDO::getEduType, reqVO.getEduType());
+        query.eqIfPresent(JobAdvertisedDO::getEnterpriseId, reqVO.getEnterpriseId());
+        query.eqIfPresent(JobAdvertisedDO::getHire, reqVO.getHire());
+        query.eqIfPresent(JobAdvertisedDO::getTop, reqVO.getTop());
+
 
         query.and(wrapper -> wrapper
                 .ge(JobAdvertisedDO::getExpireTime, LocalDateTime.now())
@@ -72,9 +83,21 @@ public interface JobAdvertisedMapper extends BaseMapperX<JobAdvertisedDO> {
                 .isNull(JobAdvertisedDO::getExpireTime)
         );
 
-        query.orderByDesc(JobAdvertisedDO::getTop, JobAdvertisedDO::getUpdateTime);
+        if(AppJobAdvertisedPageReqVO.RECOMMEND.equals(reqVO.getMark())) {
+            // 推荐
+            query.orderByDesc(JobAdvertisedDO::getTop);
+        }
+        if(AppJobAdvertisedPageReqVO.NEW.equals(reqVO.getMark())) {
+            // 最新
+            // query.orderByDesc(JobAdvertisedDO::getUpdateTime);
+        }
+        if(AppJobAdvertisedPageReqVO.HIRE.equals(reqVO.getMark())) {
+            // 众聘
+            query.orderByDesc(JobAdvertisedDO::getHire);
+        }
+        query.orderByDesc(JobAdvertisedDO::getUpdateTime);
 
-        return selectJoinPage(pageParam, AppJobAdvertisedHomeRespVO.class, query);
+        return selectJoinPage(reqVO, AppJobAdvertisedHomeRespVO.class, query);
     }
 
     default PageResult<AppJobAdvertisedRespVO> selectByIdListPage(PageParam pageParam, List<Long> ids) {
@@ -96,6 +119,7 @@ public interface JobAdvertisedMapper extends BaseMapperX<JobAdvertisedDO> {
                 .eqIfPresent(JobAdvertisedDO::getExpType, reqVO.getExpType())
                 .eqIfPresent(JobAdvertisedDO::getEduType, reqVO.getEduType())
                 .eqIfPresent(JobAdvertisedDO::getStatus, reqVO.getStatus())
+                .eqIfPresent(JobAdvertisedDO::getHire, reqVO.isHire())
                 .betweenIfPresent(JobAdvertisedDO::getCreateTime, reqVO.getCreateTime())
                 .betweenIfPresent(JobAdvertisedDO::getExpireTime, reqVO.getExpireTime())
                 .orderByDesc(JobAdvertisedDO::getTop, JobAdvertisedDO::getUpdateTime);
@@ -113,9 +137,10 @@ public interface JobAdvertisedMapper extends BaseMapperX<JobAdvertisedDO> {
         return selectPage(reqVO, query);
     }
 
-    default List<AppAdminJobSimpleRespVO> list() {
+    default List<AppAdminJobSimpleRespVO> list(boolean hire) {
         MPJLambdaWrapperX<JobAdvertisedDO> query = new MPJLambdaWrapperX<>();
         query.selectAll(JobAdvertisedDO.class);
+        query.eqIfPresent(JobAdvertisedDO::getHire, hire);
         query.orderByDesc(JobAdvertisedDO::getUpdateTime);
         return selectJoinList(AppAdminJobSimpleRespVO.class, query);
     }

+ 2 - 6
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/mysql/job/JobCvRelMapper.java

@@ -4,15 +4,12 @@ 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.framework.mybatis.core.query.MPJLambdaWrapperX;
-import com.citu.module.menduner.system.controller.appadmin.cv.AppAdminJobCvRelPageReqVO;
-import com.citu.module.menduner.system.controller.appadmin.cv.AppAdminJobCvRelRespVO;
-import com.citu.module.menduner.system.controller.appadmin.person.vo.AppAdminPersonSimpleRespVO;
+import com.citu.module.menduner.system.controller.appadmin.person.cv.AppAdminJobCvRelPageReqVO;
+import com.citu.module.menduner.system.controller.appadmin.person.cv.AppAdminJobCvRelRespVO;
 import com.citu.module.menduner.system.controller.base.job.JobCvRelPageReqVO;
-import com.citu.module.menduner.system.dal.dataobject.eduexp.EduExpDO;
 import com.citu.module.menduner.system.dal.dataobject.job.JobAdvertisedDO;
 import com.citu.module.menduner.system.dal.dataobject.job.JobCvRelDO;
 import com.citu.module.menduner.system.dal.dataobject.person.PersonInfoDO;
-import com.citu.module.menduner.system.dal.dataobject.workexp.WorkExpDO;
 import com.citu.module.menduner.system.enums.MendunerStatusEnum;
 import org.apache.ibatis.annotations.Mapper;
 
@@ -42,7 +39,6 @@ public interface JobCvRelMapper extends BaseMapperX<JobCvRelDO> {
 
     default PageResult<AppAdminJobCvRelRespVO> selectPage(AppAdminJobCvRelPageReqVO reqVO) {
         // 职位投递userId inner 招聘职位userId and 职位投递userId inner 人才信息userId
-        // 人才信息userId inner 工作经验userId and 人才信息userId inner 教育经历userId
         MPJLambdaWrapperX<JobCvRelDO> wrapper = new MPJLambdaWrapperX<>();
         wrapper.selectAsClass(JobCvRelDO.class, AppAdminJobCvRelRespVO.class);
         wrapper.selectAssociation(JobAdvertisedDO.class, AppAdminJobCvRelRespVO::getJob);

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

@@ -0,0 +1,27 @@
+package com.citu.module.menduner.system.dal.mysql.user;
+
+
+import com.citu.framework.common.pojo.PageResult;
+import com.citu.framework.mybatis.core.mapper.BaseMapperX;
+import com.citu.framework.mybatis.core.query.LambdaQueryWrapperX;
+import com.citu.module.menduner.system.controller.base.user.account.UserAccountPageReqVO;
+import com.citu.module.menduner.system.dal.dataobject.user.UserAccountDO;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 用户账户 Mapper
+ *
+ * @author Rayson
+ */
+@Mapper
+public interface UserAccountMapper extends BaseMapperX<UserAccountDO> {
+
+    default PageResult<UserAccountDO> selectPage(UserAccountPageReqVO reqVO) {
+        return selectPage(reqVO, new LambdaQueryWrapperX<UserAccountDO>()
+                .eqIfPresent(UserAccountDO::getUserId, reqVO.getUserId())
+                .eqIfPresent(UserAccountDO::getBalance, reqVO.getBalance())
+                .betweenIfPresent(UserAccountDO::getCreateTime, reqVO.getCreateTime())
+                .orderByDesc(UserAccountDO::getId));
+    }
+
+}

+ 8 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/framework/datapermission/config/DataPermissionConfiguration.java

@@ -1,8 +1,10 @@
 package com.citu.module.menduner.system.framework.datapermission.config;
 
 
+import com.citu.framework.common.enums.UserTypeEnum;
 import com.citu.module.menduner.system.config.permission.CustomDataPermissionRuleCustomizer;
 import com.citu.module.menduner.system.dal.dataobject.enterprise.EnterprisePostDO;
+import com.citu.module.menduner.system.dal.dataobject.hire.HireJobCvRelDO;
 import com.citu.module.menduner.system.dal.dataobject.job.JobAdvertisedDO;
 import com.citu.module.menduner.system.dal.dataobject.job.JobCvRelDO;
 import org.springframework.context.annotation.Bean;
@@ -21,6 +23,8 @@ public class DataPermissionConfiguration {
     public CustomDataPermissionRuleCustomizer customDataPermissionRuleCustomizer() {
         return rule -> {
             // 添加自定义的权限规则
+            // loginUser.getUserType() == UserTypeEnum.MEMBER_ADMIN.getValue() 触发
+            // 招聘端才启用权限
 
             // 招聘职位表 where user_id = xx and enterprise_id = xx
             rule.addUserColumn(JobAdvertisedDO.class, "user_id");
@@ -36,6 +40,10 @@ public class DataPermissionConfiguration {
 
             // 企业岗位表 where  enterprise_id = xx
             rule.addDataColumn(EnterprisePostDO.class, "enterprise_id");
+
+            // 众聘 简历投递表 where publish_user_id = xx and enterprise_id = xx
+            rule.addUserColumn(HireJobCvRelDO.class, "publish_user_id");
+            rule.addDataColumn(HireJobCvRelDO.class, "enterprise_id");
         };
     }
 }

+ 42 - 1
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/mq/consumer/ESConsumer.java

@@ -12,7 +12,14 @@ import com.citu.module.menduner.system.mq.message.ESJobAdvertisedMergeSendMessag
 import lombok.extern.slf4j.Slf4j;
 import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
 import org.apache.rocketmq.spring.core.RocketMQListener;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.context.ApplicationContext;
+import org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider;
+import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
+import org.springframework.core.io.support.ResourcePatternResolver;
+import org.springframework.core.type.classreading.MetadataReader;
+import org.springframework.core.type.classreading.MetadataReaderFactory;
+import org.springframework.core.type.filter.AnnotationTypeFilter;
 import org.springframework.data.elasticsearch.annotations.Document;
 import org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate;
 import org.springframework.data.elasticsearch.core.IndexOperations;
@@ -37,6 +44,9 @@ import java.util.Map;
 )
 public class ESConsumer implements RocketMQListener<ESJobAdvertisedMergeSendMessage> {
 
+    @Value("${citu.info.base-package}")
+    private String basePackage;
+
     @Resource
     private ESJobAdvertisedMergeRepository repository;
 
@@ -161,7 +171,7 @@ public class ESConsumer implements RocketMQListener<ESJobAdvertisedMergeSendMess
         stopWatch.start("ES 数据同步");
         // 清空数据
         repository.deleteAll();
-        List<Class<?>> documentClasses = getDocumentAnnotatedClasses();
+        List<Class<?>> documentClasses = getDocumentAnnotatedClasses2();
         if (CollUtil.isEmpty(documentClasses)) {
             return;
         }
@@ -191,6 +201,37 @@ public class ESConsumer implements RocketMQListener<ESJobAdvertisedMergeSendMess
         return documentClasses;
     }
 
+    public List<Class<?>> getDocumentAnnotatedClasses2() {
+
+        ClassPathScanningCandidateComponentProvider scanner =
+                new ClassPathScanningCandidateComponentProvider(false);
+        scanner.addIncludeFilter(new AnnotationTypeFilter(Document.class)); // 设置只包含带有 @Document 注解的类
+
+        ResourcePatternResolver resourcePatternResolver = new PathMatchingResourcePatternResolver();
+        List<Class<?>> annotatedClasses = new ArrayList<>();
+
+        try {
+            for (org.springframework.core.io.Resource resource : resourcePatternResolver.getResources(
+                    ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX +
+                            basePackage.replace('.', '/') + "/**/*.class")) {
+                if (resource.isReadable()) {
+                    MetadataReaderFactory readerFactory = scanner.getMetadataReaderFactory();
+                    MetadataReader reader = readerFactory.getMetadataReader(resource);
+                    String className = reader.getClassMetadata().getClassName();
+                    Class<?> clazz = Class.forName(className);
+                    if (clazz.isAnnotationPresent(Document.class)) {
+                        annotatedClasses.add(clazz);
+                    }
+                }
+            }
+        } catch (Exception ex) {
+            ex.printStackTrace();
+        }
+        return annotatedClasses;
+
+    }
+
+
     /**
      * 清空索引
      **/

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

@@ -134,4 +134,9 @@ public interface EnterpriseUserBindService {
      **/
     PageResult<AppAdminUserRespVO> selectPage(AppAdminUserPageReqVO reqVO);
 
+    /**
+     * 绑定用户的岗位
+     **/
+    Boolean bindPost(Long id,Long postId);
+
 }

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

@@ -5,6 +5,7 @@ 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.security.core.LoginUser;
+import com.citu.module.menduner.common.util.LoginUserContext;
 import com.citu.module.menduner.system.controller.app.enterprise.vo.AppEnterpriseUserBindRespVO;
 import com.citu.module.menduner.system.controller.appadmin.user.vo.AppAdminUserPageReqVO;
 import com.citu.module.menduner.system.controller.appadmin.user.vo.AppAdminUserRespVO;
@@ -22,7 +23,6 @@ import com.citu.module.menduner.system.dal.mysql.enterprise.EnterpriseUserBindMa
 import com.citu.module.menduner.system.enums.MendunerStatusEnum;
 import com.citu.module.menduner.system.service.enterprise.post.EnterprisePostService;
 import com.citu.module.menduner.system.service.user.MdeUserService;
-import com.citu.module.menduner.common.util.LoginUserContext;
 import org.springframework.stereotype.Service;
 import org.springframework.validation.annotation.Validated;
 
@@ -33,8 +33,8 @@ import java.util.Collections;
 import java.util.List;
 
 import static com.citu.framework.common.exception.util.ServiceExceptionUtil.exception;
-import static com.citu.module.menduner.system.enums.ErrorCodeConstants.*;
 import static com.citu.module.menduner.common.util.LoginUserContext.checkUserTypeIsAdmin;
+import static com.citu.module.menduner.system.enums.ErrorCodeConstants.*;
 
 /**
  * 企业登录用户 Service 实现类
@@ -269,4 +269,15 @@ public class EnterpriseUserBindServiceImpl implements EnterpriseUserBindService
         LoginUser loginUser = checkUserTypeIsAdmin();
         return enterpriseUserBindMapper.selectPage(reqVO, LoginUserContext.getEnterpriseId(loginUser));
     }
+
+    @Override
+    @DSTransactional
+    public Boolean bindPost(Long id, Long postId) {
+        EnterpriseUserBindDO userBindDO = valid(id);
+        if (userBindDO.getPostId().equals(postId)) {
+            return true;
+        }
+        userBindDO.setPostId(postId);
+        return enterpriseUserBindMapper.updateById(userBindDO) == 1;
+    }
 }

+ 69 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/hire/HireCommissionRatioService.java

@@ -0,0 +1,69 @@
+package com.citu.module.menduner.system.service.hire;
+
+import com.citu.framework.common.pojo.PageResult;
+import com.citu.module.menduner.system.controller.appadmin.hire.vo.AppAdminHireCommissionRatioRespVO;
+import com.citu.module.menduner.system.controller.base.hire.HireCommissionRatioPageReqVO;
+import com.citu.module.menduner.system.controller.base.hire.HireCommissionRatioSaveReqVO;
+import com.citu.module.menduner.system.dal.dataobject.hire.HireCommissionRatioDO;
+
+import javax.validation.Valid;
+import java.math.BigDecimal;
+
+/**
+ * 众聘-佣金比例 Service 接口
+ *
+ * @author Rayson
+ */
+public interface HireCommissionRatioService {
+
+    /**
+     * 创建众聘-佣金比例
+     *
+     * @param createReqVO 创建信息
+     * @return 编号
+     */
+    Long createHireCommissionRatio(@Valid HireCommissionRatioSaveReqVO createReqVO);
+
+    /**
+     * 更新众聘-佣金比例
+     *
+     * @param updateReqVO 更新信息
+     */
+    void updateHireCommissionRatio(@Valid HireCommissionRatioSaveReqVO updateReqVO);
+
+    /**
+     * 删除众聘-佣金比例
+     *
+     * @param id 编号
+     */
+    void deleteHireCommissionRatio(Long id);
+
+    /**
+     * 获得众聘-佣金比例
+     *
+     * @param id 编号
+     * @return 众聘-佣金比例
+     */
+    HireCommissionRatioDO getHireCommissionRatio(Long id);
+
+    /**
+     * 获得众聘-佣金比例分页
+     *
+     * @param pageReqVO 分页查询
+     * @return 众聘-佣金比例分页
+     */
+    PageResult<HireCommissionRatioDO> getHireCommissionRatioPage(HireCommissionRatioPageReqVO pageReqVO);
+
+    // ========== 招聘端 ==========
+
+    /**
+     * 获取佣金比例
+     **/
+    AppAdminHireCommissionRatioRespVO get();
+
+    /**
+     * 修改佣金比例
+     * @param rate 佣金比例
+     **/
+    void updateRate(BigDecimal rate);
+}

+ 113 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/hire/HireCommissionRatioServiceImpl.java

@@ -0,0 +1,113 @@
+package com.citu.module.menduner.system.service.hire;
+
+
+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.security.core.LoginUser;
+import com.citu.module.menduner.common.util.LoginUserContext;
+import com.citu.module.menduner.system.controller.appadmin.hire.vo.AppAdminHireCommissionRatioRespVO;
+import com.citu.module.menduner.system.controller.base.hire.HireCommissionRatioPageReqVO;
+import com.citu.module.menduner.system.controller.base.hire.HireCommissionRatioSaveReqVO;
+import com.citu.module.menduner.system.convert.HireCommissionRatioConvert;
+import com.citu.module.menduner.system.dal.dataobject.hire.HireCommissionRatioDO;
+import com.citu.module.menduner.system.dal.mysql.hire.HireCommissionRatioMapper;
+import org.springframework.stereotype.Service;
+import org.springframework.validation.annotation.Validated;
+
+import javax.annotation.Resource;
+import java.math.BigDecimal;
+
+import static com.citu.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static com.citu.module.menduner.system.enums.ErrorCodeConstants.HIRE_COMMISSION_RATIO_NOT_EXISTS;
+import static com.citu.module.menduner.system.enums.ErrorCodeConstants.HIRE_COMMISSION_RATIO_RATE_NOT_LESS_THAN_ZERO;
+
+/**
+ * 众聘-佣金比例 Service 实现类
+ *
+ * @author Rayson
+ */
+@Service
+@Validated
+public class HireCommissionRatioServiceImpl implements HireCommissionRatioService {
+
+    @Resource
+    private HireCommissionRatioMapper mapper;
+
+    @Override
+    public Long createHireCommissionRatio(HireCommissionRatioSaveReqVO createReqVO) {
+        // 插入
+        HireCommissionRatioDO hireCommissionRatio = BeanUtils.toBean(createReqVO, HireCommissionRatioDO.class);
+        mapper.insert(hireCommissionRatio);
+        // 返回
+        return hireCommissionRatio.getId();
+    }
+
+    @Override
+    public void updateHireCommissionRatio(HireCommissionRatioSaveReqVO updateReqVO) {
+        // 校验存在
+        validateHireCommissionRatioExists(updateReqVO.getId());
+        // 更新
+        HireCommissionRatioDO updateObj = BeanUtils.toBean(updateReqVO, HireCommissionRatioDO.class);
+        mapper.updateById(updateObj);
+    }
+
+    @Override
+    public void deleteHireCommissionRatio(Long id) {
+        // 校验存在
+        validateHireCommissionRatioExists(id);
+        // 删除
+        mapper.deleteById(id);
+    }
+
+    private void validateHireCommissionRatioExists(Long id) {
+        if (mapper.selectById(id) == null) {
+            throw exception(HIRE_COMMISSION_RATIO_NOT_EXISTS);
+        }
+    }
+
+    @Override
+    public HireCommissionRatioDO getHireCommissionRatio(Long id) {
+        return mapper.selectById(id);
+    }
+
+    @Override
+    public PageResult<HireCommissionRatioDO> getHireCommissionRatioPage(HireCommissionRatioPageReqVO pageReqVO) {
+        return mapper.selectPage(pageReqVO);
+    }
+
+    @Override
+    public AppAdminHireCommissionRatioRespVO get() {
+        LoginUser loginUser = LoginUserContext.get();
+        HireCommissionRatioDO hireCommissionRatio = mapper.selectByEnterpriseIdAndUserId
+                (LoginUserContext.getEnterpriseId(loginUser), LoginUserContext.getUserId(loginUser));
+        return HireCommissionRatioConvert.INSTANCE.convert(hireCommissionRatio);
+    }
+
+    @Override
+    @DSTransactional
+    public void updateRate(BigDecimal rate) {
+        LoginUser loginUser = LoginUserContext.get();
+        if (rate.compareTo(BigDecimal.ZERO) <= 0) {
+            throw exception(HIRE_COMMISSION_RATIO_RATE_NOT_LESS_THAN_ZERO);
+        }
+        Long enterpriseId = LoginUserContext.getEnterpriseId(loginUser);
+        Long userId = LoginUserContext.getUserId(loginUser);
+        // 查找该用户的佣金比例
+        HireCommissionRatioDO hireCommissionRatio = mapper.selectByEnterpriseIdAndUserId
+                (enterpriseId, userId);
+        if (null == hireCommissionRatio) {
+            mapper.insert(
+                    HireCommissionRatioDO.builder()
+                            .enterpriseId(enterpriseId)
+                            .userId(userId)
+                            .rate(rate)
+                            .build()
+            );
+        } else {
+            // 修改
+            hireCommissionRatio.setRate(rate);
+            mapper.updateById(hireCommissionRatio);
+        }
+    }
+}

+ 87 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/hire/HireJobCvRelService.java

@@ -0,0 +1,87 @@
+package com.citu.module.menduner.system.service.hire;
+
+
+import com.citu.framework.common.pojo.PageResult;
+import com.citu.module.menduner.system.controller.base.hire.HireJobCvRelPageReqVO;
+import com.citu.module.menduner.system.controller.base.hire.HireJobCvRelSaveReqVO;
+import com.citu.module.menduner.system.dal.dataobject.hire.HireJobCvRelDO;
+
+import javax.validation.Valid;
+import java.util.List;
+
+/**
+ * 众聘-简历投递 Service 接口
+ *
+ * @author Rayson
+ */
+public interface HireJobCvRelService {
+
+    /**
+     * 创建众聘-简历投递
+     *
+     * @param createReqVO 创建信息
+     * @return 编号
+     */
+    Long createHireJobCvRel(@Valid HireJobCvRelSaveReqVO createReqVO);
+
+    /**
+     * 更新众聘-简历投递
+     *
+     * @param updateReqVO 更新信息
+     */
+    void updateHireJobCvRel(@Valid HireJobCvRelSaveReqVO updateReqVO);
+
+    /**
+     * 删除众聘-简历投递
+     *
+     * @param id 编号
+     */
+    void deleteHireJobCvRel(Long id);
+
+    /**
+     * 获得众聘-简历投递
+     *
+     * @param id 编号
+     * @return 众聘-简历投递
+     */
+    HireJobCvRelDO getHireJobCvRel(Long id);
+
+    /**
+     * 获得众聘-简历投递分页
+     *
+     * @param pageReqVO 分页查询
+     * @return 众聘-简历投递分页
+     */
+    PageResult<HireJobCvRelDO> getHireJobCvRelPage(HireJobCvRelPageReqVO pageReqVO);
+
+
+    // ========== 招聘端 ==========
+
+    /**
+     * 查看投递简历
+     *
+     * @param id 投递简历id
+     */
+    boolean look(Long id);
+
+    /**
+     * 淘汰 不合适
+     *
+     * @param ids 投递简历ids
+     */
+    boolean eliminate(List<Long> ids);
+
+    /**
+     * 入职
+     *
+     * @param ids 投递简历ids
+     */
+    boolean entry(List<Long> ids);
+
+    /**
+     * 结算
+     *
+     * @param ids 投递简历ids
+     */
+    boolean settlement(List<Long> ids);
+}

+ 120 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/hire/HireJobCvRelServiceImpl.java

@@ -0,0 +1,120 @@
+package com.citu.module.menduner.system.service.hire;
+
+
+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.module.menduner.system.controller.base.hire.HireJobCvRelPageReqVO;
+import com.citu.module.menduner.system.controller.base.hire.HireJobCvRelSaveReqVO;
+import com.citu.module.menduner.system.dal.dataobject.hire.HireJobCvRelDO;
+import com.citu.module.menduner.system.dal.mysql.hire.HireJobCvRelMapper;
+import com.citu.module.menduner.system.enums.hire.HireJobCvRelStatusEnum;
+import org.springframework.stereotype.Service;
+import org.springframework.validation.annotation.Validated;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+import static com.citu.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static com.citu.module.menduner.system.enums.ErrorCodeConstants.HIRE_JOB_CV_REL_NOT_EXISTS;
+
+/**
+ * 众聘-简历投递 Service 实现类
+ *
+ * @author Rayson
+ */
+@Service
+@Validated
+public class HireJobCvRelServiceImpl implements HireJobCvRelService {
+
+    @Resource
+    private HireJobCvRelMapper hireJobCvRelMapper;
+
+    @Override
+    public Long createHireJobCvRel(HireJobCvRelSaveReqVO createReqVO) {
+        // 插入
+        HireJobCvRelDO hireJobCvRel = BeanUtils.toBean(createReqVO, HireJobCvRelDO.class);
+        hireJobCvRelMapper.insert(hireJobCvRel);
+        // 返回
+        return hireJobCvRel.getId();
+    }
+
+    @Override
+    public void updateHireJobCvRel(HireJobCvRelSaveReqVO updateReqVO) {
+        // 校验存在
+        validateHireJobCvRelExists(updateReqVO.getId());
+        // 更新
+        HireJobCvRelDO updateObj = BeanUtils.toBean(updateReqVO, HireJobCvRelDO.class);
+        hireJobCvRelMapper.updateById(updateObj);
+    }
+
+    @Override
+    public void deleteHireJobCvRel(Long id) {
+        // 校验存在
+        validateHireJobCvRelExists(id);
+        // 删除
+        hireJobCvRelMapper.deleteById(id);
+    }
+
+    private HireJobCvRelDO validateHireJobCvRelExists(Long id) {
+        HireJobCvRelDO hireJobCvRel = hireJobCvRelMapper.selectById(id);
+        if (null == hireJobCvRel) {
+            throw exception(HIRE_JOB_CV_REL_NOT_EXISTS);
+        }
+        return hireJobCvRel;
+    }
+
+    @Override
+    public HireJobCvRelDO getHireJobCvRel(Long id) {
+        return hireJobCvRelMapper.selectById(id);
+    }
+
+    @Override
+    public PageResult<HireJobCvRelDO> getHireJobCvRelPage(HireJobCvRelPageReqVO pageReqVO) {
+        return hireJobCvRelMapper.selectPage(pageReqVO);
+    }
+
+    @Override
+    @DSTransactional
+    public boolean look(Long id) {
+        HireJobCvRelDO cv = validateHireJobCvRelExists(id);
+        if (HireJobCvRelStatusEnum.LOOK.getStatus().equals(cv.getStatus())) {
+            return true;
+        }
+        cv.setStatus(HireJobCvRelStatusEnum.LOOK.getStatus());
+        return hireJobCvRelMapper.updateById(cv) == 1;
+    }
+
+    @Override
+    @DSTransactional
+    public boolean eliminate(List<Long> ids) {
+        for (Long id : ids) {
+            HireJobCvRelDO cv = validateHireJobCvRelExists(id);
+            cv.setStatus(HireJobCvRelStatusEnum.ELIMINATE.getStatus());
+            hireJobCvRelMapper.updateById(cv);
+        }
+        return true;
+    }
+
+    @Override
+    @DSTransactional
+    public boolean entry(List<Long> ids) {
+        for (Long id : ids) {
+            HireJobCvRelDO cv = validateHireJobCvRelExists(id);
+            cv.setStatus(HireJobCvRelStatusEnum.ENTRY.getStatus());
+            hireJobCvRelMapper.updateById(cv);
+        }
+        return true;
+    }
+
+    @Override
+    @DSTransactional
+    public boolean settlement(List<Long> ids) {
+        for (Long id : ids) {
+            HireJobCvRelDO cv = validateHireJobCvRelExists(id);
+            cv.setStatus(HireJobCvRelStatusEnum.SETTLEMENT.getStatus());
+            hireJobCvRelMapper.updateById(cv);
+        }
+        return true;
+    }
+}

+ 33 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/hire/HireJobIntegrationService.java

@@ -0,0 +1,33 @@
+package com.citu.module.menduner.system.service.hire;
+
+import com.citu.framework.common.pojo.PageResult;
+import com.citu.module.menduner.system.controller.appadmin.hire.vo.AppAdminHireJobCvRelPageReqVO;
+import com.citu.module.menduner.system.controller.appadmin.hire.vo.AppAdminHireJobCvRelRespVO;
+import com.citu.module.menduner.system.controller.appadmin.person.vo.AppAdminPersonSimpleRespVO;
+
+import java.util.List;
+
+/**
+ * 众聘-招聘职位相关的整合层
+ * 解决三层架构带来的业务循环依赖设计
+ * 众聘-招聘职位相关业务涉及三种及以上关系的在该处统一处理
+ *
+ * @author Rayson
+ **/
+public interface HireJobIntegrationService {
+
+    /**
+     * 获取发布的众聘职位分页
+     * @param reqVO 条件
+     * @return PageResult<AppAdminHireJobCvRelRespVO>
+     **/
+    PageResult<AppAdminHireJobCvRelRespVO> page(AppAdminHireJobCvRelPageReqVO reqVO);
+
+
+    /**
+     * 获取推荐人的用户列表
+     * @return PageResult<AppAdminHireJobCvRelRespVO>
+     **/
+    List<AppAdminPersonSimpleRespVO> getRecommendUser();
+
+}

+ 38 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/hire/HireJobIntegrationServiceImpl.java

@@ -0,0 +1,38 @@
+package com.citu.module.menduner.system.service.hire;
+
+import cn.hutool.core.collection.CollUtil;
+import com.citu.framework.common.pojo.PageResult;
+import com.citu.module.menduner.system.controller.appadmin.hire.vo.AppAdminHireJobCvRelPageReqVO;
+import com.citu.module.menduner.system.controller.appadmin.hire.vo.AppAdminHireJobCvRelRespVO;
+import com.citu.module.menduner.system.controller.appadmin.person.vo.AppAdminPersonSimpleRespVO;
+import com.citu.module.menduner.system.dal.mysql.hire.HireJobCvRelMapper;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import org.springframework.validation.annotation.Validated;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+@Slf4j
+@Service
+@Validated
+public class HireJobIntegrationServiceImpl implements HireJobIntegrationService {
+
+    @Resource
+    private HireJobCvRelMapper hireJobCvRelMapper;
+
+
+    @Override
+    public PageResult<AppAdminHireJobCvRelRespVO> page(AppAdminHireJobCvRelPageReqVO reqVO) {
+        PageResult<AppAdminHireJobCvRelRespVO> pageResult = hireJobCvRelMapper.page(reqVO);
+        if (CollUtil.isEmpty(pageResult.getList())) {
+            return PageResult.empty();
+        }
+        return pageResult;
+    }
+
+    @Override
+    public List<AppAdminPersonSimpleRespVO> getRecommendUser() {
+        return hireJobCvRelMapper.getRecommendUser();
+    }
+}

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

@@ -63,7 +63,8 @@ public interface JobAdvertisedService {
      */
     PageResult<JobAdvertisedDO> getJobAdvertisedPage(JobAdvertisedPageReqVO pageReqVO);
 
-    // ========== 求职者 ==========
+
+    // ========== 求职端 ==========
 
     /**
      * 获取推荐招聘职位分页
@@ -82,12 +83,12 @@ public interface JobAdvertisedService {
     PageResult<AppJobAdvertisedHomeRespVO> getLatestPage(PageParam pageParam);
 
     /**
-     * 获取急聘招聘职位分页
+     * 获取聘职位分页
      *
      * @param pageParam 分页
      * @return 招聘职位分页
      **/
-    PageResult<AppJobAdvertisedHomeRespVO> getUrgentPage(PageParam pageParam);
+    PageResult<AppJobAdvertisedHomeRespVO> getHirePage(PageParam pageParam);
 
     /**
      * 获取热门企业的职位分页
@@ -152,9 +153,10 @@ public interface JobAdvertisedService {
 
     /**
      * 获取发布的职位
+     * @param hire 是否雇佣(众聘)
      * @return 简易职位信息的集合
      **/
-    List<AppAdminJobSimpleRespVO> getList();
+    List<AppAdminJobSimpleRespVO> getList(boolean hire);
 
     /**
      * 置顶职位

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

@@ -110,198 +110,33 @@ public class JobAdvertisedServiceImpl implements JobAdvertisedService {
         return jobAdvertisedMapper.selectPage(pageReqVO);
     }
 
-    public PageResult<AppJobAdvertisedHomeRespVO> generate() {
-        PageResult<AppJobAdvertisedHomeRespVO> result = new PageResult<>();
-        List<AppJobAdvertisedHomeRespVO> list = new ArrayList<>();
-
-        AppJobAdvertisedHomeRespVO respVO1 = new AppJobAdvertisedHomeRespVO();
-        respVO1.setId(1L);
-        respVO1.setAreaId(110000L);
-        respVO1.setPositionId(1L);
-        respVO1.setPayFrom(BigDecimal.valueOf(5));
-        respVO1.setPayTo(BigDecimal.valueOf(12));
-        respVO1.setPayUnit("2");
-        respVO1.setName("项目经理");
-        respVO1.setExpType("0");
-        respVO1.setEduType("0");
-        respVO1.setTagList(new ArrayList<>());
-        respVO1.setEnterpriseId(1L);
-        respVO1.setAnotherName("门墩儿科技");
-        respVO1.setIndustryId(1L);
-        respVO1.setScale("0");
-        respVO1.setLogoUrl("https://www.menduner.com/static/img/loginlogo2.7924c12.png");
-        list.add(respVO1);
-
-        AppJobAdvertisedHomeRespVO respVO2 = new AppJobAdvertisedHomeRespVO();
-        respVO2.setId(2L);
-        respVO2.setAreaId(440100L);
-        respVO2.setPositionId(2L);
-        respVO2.setPayFrom(BigDecimal.valueOf(18));
-        respVO2.setPayTo(BigDecimal.valueOf(22));
-        respVO2.setPayUnit("1");
-        respVO2.setName("车间主任");
-        respVO2.setExpType("1");
-        respVO2.setEduType("1");
-        respVO2.setTagList(new ArrayList<>());
-        respVO2.setEnterpriseId(1L);
-        respVO2.setAnotherName("门墩儿科技");
-        respVO2.setIndustryId(2L);
-        respVO2.setScale("1");
-        respVO2.setLogoUrl("https://www.menduner.com/static/img/loginlogo2.7924c12.png");
-        list.add(respVO2);
-
-
-        AppJobAdvertisedHomeRespVO respVO3 = new AppJobAdvertisedHomeRespVO();
-        respVO3.setId(3L);
-        respVO3.setAreaId(440300L);
-        respVO3.setPositionId(3L);
-        respVO3.setPayFrom(BigDecimal.valueOf(18));
-        respVO3.setPayTo(BigDecimal.valueOf(22));
-        respVO3.setPayUnit("3");
-        respVO3.setName("网管");
-        respVO3.setExpType("2");
-        respVO3.setEduType("2");
-        respVO3.setTagList(new ArrayList<>());
-        respVO3.setEnterpriseId(1L);
-        respVO3.setAnotherName("门墩儿科技");
-        respVO3.setIndustryId(3L);
-        respVO3.setScale("2");
-        respVO3.setLogoUrl("https://www.menduner.com/static/img/loginlogo2.7924c12.png");
-        list.add(respVO3);
-
-        AppJobAdvertisedHomeRespVO respVO4 = new AppJobAdvertisedHomeRespVO();
-        respVO4.setId(4L);
-        respVO4.setAreaId(440600L);
-        respVO4.setPositionId(4L);
-        respVO4.setPayFrom(BigDecimal.valueOf(2));
-        respVO4.setPayTo(BigDecimal.valueOf(3));
-        respVO4.setPayUnit("0");
-        respVO4.setName("前台");
-        respVO4.setExpType("3");
-        respVO4.setEduType("3");
-        respVO4.setTagList(new ArrayList<>());
-        respVO4.setEnterpriseId(1L);
-        respVO4.setAnotherName("门墩儿科技");
-        respVO4.setIndustryId(4L);
-        respVO4.setScale("3");
-        respVO4.setLogoUrl("https://www.menduner.com/static/img/loginlogo2.7924c12.png");
-        list.add(respVO4);
-
-        AppJobAdvertisedHomeRespVO respVO5 = new AppJobAdvertisedHomeRespVO();
-        respVO5.setId(5L);
-        respVO5.setAreaId(441200L);
-        respVO5.setPositionId(5L);
-        respVO5.setPayFrom(BigDecimal.valueOf(20));
-        respVO5.setPayTo(BigDecimal.valueOf(30));
-        respVO5.setPayUnit("1");
-        respVO5.setName("保姆");
-        respVO5.setExpType("4");
-        respVO5.setEduType("4");
-        respVO5.setTagList(ListUtil.of("年终奖", "不需要出国工作", "医药设备"));
-        respVO5.setEnterpriseId(1L);
-        respVO5.setAnotherName("门墩儿科技");
-        respVO5.setIndustryId(5L);
-        respVO5.setScale("4");
-        respVO5.setLogoUrl("https://www.menduner.com/static/img/loginlogo2.7924c12.png");
-        list.add(respVO5);
-
-        AppJobAdvertisedHomeRespVO respVO6 = new AppJobAdvertisedHomeRespVO();
-        respVO6.setId(6L);
-        respVO6.setAreaId(440800L);
-        respVO6.setPositionId(6L);
-        respVO6.setPayFrom(BigDecimal.valueOf(100));
-        respVO6.setPayTo(BigDecimal.valueOf(200));
-        respVO6.setPayUnit("3");
-        respVO6.setName("软件开发工程师");
-        respVO6.setExpType("5");
-        respVO6.setEduType("5");
-        respVO6.setTagList(ListUtil.of("无经验要求", "金融产品", "不限", "不接受居家办公", "教育培训", "互联网金融"));
-        respVO6.setEnterpriseId(1L);
-        respVO6.setAnotherName("门墩儿科技");
-        respVO6.setIndustryId(6L);
-        respVO6.setScale("5");
-        respVO6.setLogoUrl("https://www.menduner.com/static/img/loginlogo2.7924c12.png");
-        list.add(respVO6);
-
-
-        AppJobAdvertisedHomeRespVO respVO7 = new AppJobAdvertisedHomeRespVO();
-        respVO7.setId(7L);
-        respVO7.setAreaId(441900L);
-        respVO7.setPositionId(7L);
-        respVO7.setPayFrom(BigDecimal.valueOf(100));
-        respVO7.setPayTo(BigDecimal.valueOf(500));
-        respVO7.setPayUnit("1");
-        respVO7.setName("汇丰银行副行长");
-        respVO7.setExpType("6");
-        respVO7.setEduType("6");
-        respVO7.setTagList(new ArrayList<>());
-        respVO7.setEnterpriseId(1L);
-        respVO7.setAnotherName("门墩儿科技");
-        respVO7.setIndustryId(6L);
-        respVO7.setScale("5");
-        respVO7.setLogoUrl("https://www.menduner.com/static/img/loginlogo2.7924c12.png");
-        list.add(respVO7);
-
-
-        AppJobAdvertisedHomeRespVO respVO8 = new AppJobAdvertisedHomeRespVO();
-        respVO8.setId(8L);
-        respVO8.setAreaId(441700L);
-        respVO8.setPositionId(8L);
-        respVO8.setPayFrom(BigDecimal.valueOf(1.2));
-        respVO8.setPayTo(BigDecimal.valueOf(3.8));
-        respVO8.setPayUnit("0");
-        respVO8.setName("程序员");
-        respVO8.setExpType("7");
-        respVO8.setEduType("99");
-        respVO8.setTagList(new ArrayList<>());
-        respVO8.setEnterpriseId(1L);
-        respVO8.setAnotherName("门墩儿科技");
-        respVO8.setIndustryId(8L);
-        respVO8.setScale("5");
-        respVO8.setLogoUrl("https://www.menduner.com/static/img/loginlogo2.7924c12.png");
-        list.add(respVO8);
-
-        AppJobAdvertisedHomeRespVO respVO9 = new AppJobAdvertisedHomeRespVO();
-        respVO9.setId(9L);
-        respVO9.setAreaId(445300L);
-        respVO9.setPositionId(9L);
-        respVO9.setPayFrom(BigDecimal.valueOf(3.2));
-        respVO9.setPayTo(BigDecimal.valueOf(6.8));
-        respVO9.setPayUnit("0");
-        respVO9.setName("护林员");
-        respVO9.setExpType("7");
-        respVO9.setEduType("99");
-        respVO9.setTagList(new ArrayList<>());
-        respVO9.setEnterpriseId(1L);
-        respVO9.setAnotherName("门墩儿科技");
-        respVO9.setIndustryId(9L);
-        respVO9.setScale("5");
-        respVO8.setLogoUrl("https://www.menduner.com/static/img/loginlogo2.7924c12.png");
-        list.add(respVO9);
-
-        result.setList(list);
-        result.setTotal(9L);
-
-        return result;
-    }
-
     @Override
     public PageResult<AppJobAdvertisedHomeRespVO> getRecommendedPage(PageParam pageParam) {
-        return jobAdvertisedMapper.selectPage(pageParam);
+        AppJobAdvertisedPageReqVO pageReqVO =
+                new AppJobAdvertisedPageReqVO(pageParam,AppJobAdvertisedPageReqVO.RECOMMEND);
+        pageReqVO.setTop(true);
+        return jobAdvertisedMapper.selectPage(pageReqVO);
     }
 
     @Override
     public PageResult<AppJobAdvertisedHomeRespVO> getLatestPage(PageParam pageParam) {
-        return jobAdvertisedMapper.selectPage(pageParam);
+        AppJobAdvertisedPageReqVO pageReqVO =
+                new AppJobAdvertisedPageReqVO(pageParam,AppJobAdvertisedPageReqVO.NEW);
+        return jobAdvertisedMapper.selectPage(pageReqVO);
     }
 
+
     @Override
-    public PageResult<AppJobAdvertisedHomeRespVO> getUrgentPage(PageParam pageParam) {
-        return jobAdvertisedMapper.selectPage(pageParam);
+    public PageResult<AppJobAdvertisedHomeRespVO> getAcquaintedPage(AppJobAdvertisedPageReqVO pageReqVO) {
+        pageReqVO.setMark(AppJobAdvertisedPageReqVO.ACQUAINTED);
+        return jobAdvertisedMapper.selectPage(pageReqVO);
     }
 
     @Override
-    public PageResult<AppJobAdvertisedHomeRespVO> getAcquaintedPage(AppJobAdvertisedPageReqVO pageReqVO) {
+    public PageResult<AppJobAdvertisedHomeRespVO> getHirePage(PageParam pageParam) {
+        AppJobAdvertisedPageReqVO pageReqVO =
+                new AppJobAdvertisedPageReqVO(pageParam,AppJobAdvertisedPageReqVO.HIRE);
+        pageReqVO.setHire(true);
         return jobAdvertisedMapper.selectPage(pageReqVO);
     }
 
@@ -468,8 +303,8 @@ public class JobAdvertisedServiceImpl implements JobAdvertisedService {
     }
 
     @Override
-    public List<AppAdminJobSimpleRespVO> getList() {
-        return jobAdvertisedMapper.list();
+    public List<AppAdminJobSimpleRespVO> getList(boolean hire) {
+        return jobAdvertisedMapper.list(hire);
     }
 
     @Override

+ 2 - 1
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/job/JobCvRelService.java

@@ -54,7 +54,7 @@ public interface JobCvRelService {
      */
     PageResult<JobCvRelDO> getJobCvRelPage(JobCvRelPageReqVO pageReqVO);
 
-    // ========== 求职 ==========
+    // ========== 求职 ==========
 
     /**
      * 简历投递
@@ -70,6 +70,7 @@ public interface JobCvRelService {
      */
     boolean checkSend(Long jobId);
 
+    // ========== 招聘端 ==========
     /**
      * 查看投递简历
      *

+ 3 - 3
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/job/JobIntegrationService.java

@@ -5,8 +5,8 @@ import com.citu.framework.common.pojo.PageResult;
 import com.citu.module.menduner.system.controller.app.enterprise.vo.AppEnterpriseSimpleRespVO;
 import com.citu.module.menduner.system.controller.app.job.vo.AppJobAdvertisedRespVO;
 import com.citu.module.menduner.system.controller.app.job.vo.AppJobAdvertisedSearchPageReqVO;
-import com.citu.module.menduner.system.controller.appadmin.cv.AppAdminJobCvRelPageReqVO;
-import com.citu.module.menduner.system.controller.appadmin.cv.AppAdminJobCvRelRespVO;
+import com.citu.module.menduner.system.controller.appadmin.person.cv.AppAdminJobCvRelPageReqVO;
+import com.citu.module.menduner.system.controller.appadmin.person.cv.AppAdminJobCvRelRespVO;
 import com.citu.module.menduner.system.controller.appadmin.job.vo.AppAdminJobPageReqVO;
 import com.citu.module.menduner.system.controller.appadmin.job.vo.AppAdminJobRespVO;
 
@@ -19,7 +19,7 @@ import com.citu.module.menduner.system.controller.appadmin.job.vo.AppAdminJobRes
  **/
 public interface JobIntegrationService {
 
-    // ========== 求职 ==========
+    // ========== 求职 ==========
 
     /**
      * 获取已投递的招聘职位信息分页

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

@@ -6,8 +6,8 @@ import com.citu.framework.common.pojo.PageResult;
 import com.citu.module.menduner.system.controller.app.enterprise.vo.AppEnterpriseSimpleRespVO;
 import com.citu.module.menduner.system.controller.app.job.vo.AppJobAdvertisedRespVO;
 import com.citu.module.menduner.system.controller.app.job.vo.AppJobAdvertisedSearchPageReqVO;
-import com.citu.module.menduner.system.controller.appadmin.cv.AppAdminJobCvRelPageReqVO;
-import com.citu.module.menduner.system.controller.appadmin.cv.AppAdminJobCvRelRespVO;
+import com.citu.module.menduner.system.controller.appadmin.person.cv.AppAdminJobCvRelPageReqVO;
+import com.citu.module.menduner.system.controller.appadmin.person.cv.AppAdminJobCvRelRespVO;
 import com.citu.module.menduner.system.controller.appadmin.job.vo.AppAdminJobPageReqVO;
 import com.citu.module.menduner.system.controller.appadmin.job.vo.AppAdminJobRespVO;
 import com.citu.module.menduner.system.controller.base.contact.AppEnterpriseUserContactRespVO;
@@ -257,7 +257,8 @@ public class JobIntegrationServiceImpl implements JobIntegrationService {
 
         pageResult.getList().forEach(job -> {
             AppAdminJobRespVO respVO = JobAdvertisedConvert.INSTANCE.convert4(job);
-            Long count = jobCvRelDOList.stream().filter(jobCvRelDO -> jobCvRelDO.getJobId().equals(job.getId())).count();
+            Long count = jobCvRelDOList.stream()
+                    .filter(jobCvRelDO -> jobCvRelDO.getJobId().equals(job.getId())).count();
             respVO.setCount(count);
             // 计算多少天后到期
             if (null != job.getExpireTime()) {

+ 1 - 4
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/position/PositionServiceImpl.java

@@ -63,10 +63,7 @@ public class PositionServiceImpl implements PositionService {
      * @param position 职位对象
      * @param parentId 上级职位code
      * @param level    当前层级
-     * @return void
-     * @description 递归解析position
-     * @author Rayson
-     * @date 2024/5/8 上午11:47
+     * 递归解析position
      **/
     private void parseAndSavePosition(Map<String, Object> position, Long parentId, int level) {
         if (null == parentId) {

+ 1 - 1
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/skill/SkillService.java

@@ -55,7 +55,7 @@ public interface SkillService {
      */
     List<SkillDO> getSkillList(SkillListReqVO listReqVO);
 
-    // ========== 求职 ==========
+    // ========== 求职 ==========
 
     /**
      * 根据技能id获得地区列表

+ 2 - 4
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/sync/ESDataSyncService.java

@@ -5,9 +5,7 @@ package com.citu.module.menduner.system.service.sync;
  **/
 public interface ESDataSyncService {
 
-    /** 同步企业相关数据 **/
-    void syncEnterprise();
+    /** 同步数据 **/
+    void syncData();
 
-    /** 同步求职者相关数据 **/
-    void syncJobSeeker();
 }

+ 1 - 6
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/sync/ESDataSyncServiceImpl.java

@@ -29,13 +29,8 @@ public class ESDataSyncServiceImpl implements ESDataSyncService {
 
     @Async
     @Override
-    public void syncEnterprise() {
+    public void syncData() {
         esProducer.sync();
     }
 
-    @Async
-    @Override
-    public void syncJobSeeker() {
-
-    }
 }

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

@@ -0,0 +1,55 @@
+package com.citu.module.menduner.system.service.user;
+
+import com.citu.framework.common.pojo.PageResult;
+import com.citu.module.menduner.system.controller.base.user.account.UserAccountPageReqVO;
+import com.citu.module.menduner.system.controller.base.user.account.UserAccountSaveReqVO;
+import com.citu.module.menduner.system.dal.dataobject.user.UserAccountDO;
+
+import javax.validation.Valid;
+
+/**
+ * 用户账户 Service 接口
+ *
+ * @author Rayson
+ */
+public interface UserAccountService {
+
+    /**
+     * 创建用户账户
+     *
+     * @param createReqVO 创建信息
+     * @return 编号
+     */
+    Long createUserAccount(@Valid UserAccountSaveReqVO createReqVO);
+
+    /**
+     * 更新用户账户
+     *
+     * @param updateReqVO 更新信息
+     */
+    void updateUserAccount(@Valid UserAccountSaveReqVO updateReqVO);
+
+    /**
+     * 删除用户账户
+     *
+     * @param id 编号
+     */
+    void deleteUserAccount(Long id);
+
+    /**
+     * 获得用户账户
+     *
+     * @param id 编号
+     * @return 用户账户
+     */
+    UserAccountDO getUserAccount(Long id);
+
+    /**
+     * 获得用户账户分页
+     *
+     * @param pageReqVO 分页查询
+     * @return 用户账户分页
+     */
+    PageResult<UserAccountDO> getUserAccountPage(UserAccountPageReqVO pageReqVO);
+
+}

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

@@ -0,0 +1,72 @@
+package com.citu.module.menduner.system.service.user;
+
+
+import com.citu.framework.common.pojo.PageResult;
+import com.citu.framework.common.util.object.BeanUtils;
+import com.citu.module.menduner.system.controller.base.user.account.UserAccountPageReqVO;
+import com.citu.module.menduner.system.controller.base.user.account.UserAccountSaveReqVO;
+import com.citu.module.menduner.system.dal.dataobject.user.UserAccountDO;
+import com.citu.module.menduner.system.dal.mysql.user.UserAccountMapper;
+import org.springframework.stereotype.Service;
+import org.springframework.validation.annotation.Validated;
+
+import javax.annotation.Resource;
+
+import static com.citu.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static com.citu.module.menduner.system.enums.ErrorCodeConstants.USER_ACCOUNT_NOT_EXISTS;
+
+/**
+ * 用户账户 Service 实现类
+ *
+ * @author Rayson
+ */
+@Service
+@Validated
+public class UserAccountServiceImpl implements UserAccountService {
+
+    @Resource
+    private UserAccountMapper userAccountMapper;
+
+    @Override
+    public Long createUserAccount(UserAccountSaveReqVO createReqVO) {
+        // 插入
+        UserAccountDO userAccount = BeanUtils.toBean(createReqVO, UserAccountDO.class);
+        userAccountMapper.insert(userAccount);
+        // 返回
+        return userAccount.getId();
+    }
+
+    @Override
+    public void updateUserAccount(UserAccountSaveReqVO updateReqVO) {
+        // 校验存在
+        validateUserAccountExists(updateReqVO.getId());
+        // 更新
+        UserAccountDO updateObj = BeanUtils.toBean(updateReqVO, UserAccountDO.class);
+        userAccountMapper.updateById(updateObj);
+    }
+
+    @Override
+    public void deleteUserAccount(Long id) {
+        // 校验存在
+        validateUserAccountExists(id);
+        // 删除
+        userAccountMapper.deleteById(id);
+    }
+
+    private void validateUserAccountExists(Long id) {
+        if (userAccountMapper.selectById(id) == null) {
+            throw exception(USER_ACCOUNT_NOT_EXISTS);
+        }
+    }
+
+    @Override
+    public UserAccountDO getUserAccount(Long id) {
+        return userAccountMapper.selectById(id);
+    }
+
+    @Override
+    public PageResult<UserAccountDO> getUserAccountPage(UserAccountPageReqVO pageReqVO) {
+        return userAccountMapper.selectPage(pageReqVO);
+    }
+
+}

+ 4 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/util/ESQueryBuildUtils.java

@@ -90,6 +90,10 @@ public class ESQueryBuildUtils {
             boolQuery.filter
                     (QueryBuilders.termsQuery("areaId", reqVO.getAreaIds()));
         }
+        if (null != reqVO.getHire()) {
+            // 是否雇佣 (众聘)
+            boolQuery.filter(QueryBuilders.termQuery("hire", reqVO.getHire()));
+        }
 
         // 获取当前时间并格式化为字符串
         String formattedNow = LocalDateTime.now()

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

@@ -226,4 +226,19 @@
 1_100_035_003=No resume attachment selected
 1_100_035_004=Recruitment position ID cannot be empty
 1_100_035_005=This position is currently not allowed for delivery
-1_100_035_006=Recruitment for this position has been suspended
+1_100_035_006=Recruitment for this position has been suspended
+# ========== 众聘-简历投递 1_100_036_000 ==========
+1_100_036_001=The submitted resume does not exist
+1_100_036_002=The posted position ID cannot be empty
+1_100_036_003=The user ID for posting positions cannot be empty
+1_100_036_004=Referee ID cannot be empty
+1_100_036_005=The delivery user ID cannot be empty
+1_100_036_006=The name of the sender cannot be empty
+1_100_036_007=The contact phone number of the deliveryman cannot be empty
+1_100_036_008=Resume attachment cannot be empty
+# ========== 众聘-佣金比例 1_100_037_000 ==========
+1_100_037_001=Commission ratio does not exist
+1_100_037_002=Commission ratio cannot be empty
+1_100_037_003=Commission ratio cannot be less than 0
+# ========== 用户账户 1_100_038_000 ==========
+1_100_038_001=User account does not exist

+ 15 - 0
menduner/menduner-system-biz/src/main/resources/i18n/messages_zh_CN.properties

@@ -230,3 +230,18 @@
 1_100_035_007=简历附件标题不能为空
 1_100_035_008=简历附件地址不能为空
 1_100_035_009=投递的简历状态不能为空
+# ========== 众聘-简历投递 1_100_036_000 ==========
+1_100_036_001=投递简历不存在
+1_100_036_002=发布的职位id不能为空
+1_100_036_003=发布职位的用户id不能为空
+1_100_036_004=推荐人id不能为空
+1_100_036_005=投递用户id不能为空
+1_100_036_006=投递人名称不能为空
+1_100_036_007=投递人联系电话不能为空
+1_100_036_008=简历附件不能为空
+# ========== 众聘-佣金比例 1_100_037_000 ==========
+1_100_037_001=佣金比例不存在
+1_100_037_002=佣金比例不能为空
+1_100_037_003=佣金比例不能小于0
+# ========== 用户账户 1_100_038_000 ==========
+1_100_038_001=用户账户不存在

+ 132 - 0
menduner/menduner-system-biz/src/test/java/com/citu/module/menduner/system/service/hire/HireCommissionRatioServiceImplTest.java

@@ -0,0 +1,132 @@
+package com.citu.module.menduner.system.service.hire;
+
+
+import com.citu.framework.common.pojo.PageResult;
+import com.citu.framework.test.core.ut.BaseDbUnitTest;
+import com.citu.module.menduner.system.controller.base.hire.HireCommissionRatioPageReqVO;
+import com.citu.module.menduner.system.controller.base.hire.HireCommissionRatioSaveReqVO;
+import com.citu.module.menduner.system.dal.dataobject.hire.HireCommissionRatioDO;
+import com.citu.module.menduner.system.dal.mysql.hire.HireCommissionRatioMapper;
+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.HIRE_COMMISSION_RATIO_NOT_EXISTS;
+import static org.junit.jupiter.api.Assertions.*;
+
+/**
+ * {@link HireCommissionRatioServiceImpl} 的单元测试类
+ *
+ * @author Rayson
+ */
+@Import(HireCommissionRatioServiceImpl.class)
+public class HireCommissionRatioServiceImplTest extends BaseDbUnitTest {
+
+    @Resource
+    private HireCommissionRatioServiceImpl hireCommissionRatioService;
+
+    @Resource
+    private HireCommissionRatioMapper hireCommissionRatioMapper;
+
+    @Test
+    public void testCreateHireCommissionRatio_success() {
+        // 准备参数
+        HireCommissionRatioSaveReqVO createReqVO = randomPojo(HireCommissionRatioSaveReqVO.class).setId(null);
+
+        // 调用
+        Long hireCommissionRatioId = hireCommissionRatioService.createHireCommissionRatio(createReqVO);
+        // 断言
+        assertNotNull(hireCommissionRatioId);
+        // 校验记录的属性是否正确
+        HireCommissionRatioDO hireCommissionRatio = hireCommissionRatioMapper.selectById(hireCommissionRatioId);
+        assertPojoEquals(createReqVO, hireCommissionRatio, "id");
+    }
+
+    @Test
+    public void testUpdateHireCommissionRatio_success() {
+        // mock 数据
+        HireCommissionRatioDO dbHireCommissionRatio = randomPojo(HireCommissionRatioDO.class);
+        hireCommissionRatioMapper.insert(dbHireCommissionRatio);// @Sql: 先插入出一条存在的数据
+        // 准备参数
+        HireCommissionRatioSaveReqVO updateReqVO = randomPojo(HireCommissionRatioSaveReqVO.class, o -> {
+            o.setId(dbHireCommissionRatio.getId()); // 设置更新的 ID
+        });
+
+        // 调用
+        hireCommissionRatioService.updateHireCommissionRatio(updateReqVO);
+        // 校验是否更新正确
+        HireCommissionRatioDO hireCommissionRatio = hireCommissionRatioMapper.selectById(updateReqVO.getId()); // 获取最新的
+        assertPojoEquals(updateReqVO, hireCommissionRatio);
+    }
+
+    @Test
+    public void testUpdateHireCommissionRatio_notExists() {
+        // 准备参数
+        HireCommissionRatioSaveReqVO updateReqVO = randomPojo(HireCommissionRatioSaveReqVO.class);
+
+        // 调用, 并断言异常
+        assertServiceException(() -> hireCommissionRatioService.updateHireCommissionRatio(updateReqVO), HIRE_COMMISSION_RATIO_NOT_EXISTS);
+    }
+
+    @Test
+    public void testDeleteHireCommissionRatio_success() {
+        // mock 数据
+        HireCommissionRatioDO dbHireCommissionRatio = randomPojo(HireCommissionRatioDO.class);
+        hireCommissionRatioMapper.insert(dbHireCommissionRatio);// @Sql: 先插入出一条存在的数据
+        // 准备参数
+        Long id = dbHireCommissionRatio.getId();
+
+        // 调用
+        hireCommissionRatioService.deleteHireCommissionRatio(id);
+        // 校验数据不存在了
+        assertNull(hireCommissionRatioMapper.selectById(id));
+    }
+
+    @Test
+    public void testDeleteHireCommissionRatio_notExists() {
+        // 准备参数
+        Long id = randomLongId();
+
+        // 调用, 并断言异常
+        assertServiceException(() -> hireCommissionRatioService.deleteHireCommissionRatio(id), HIRE_COMMISSION_RATIO_NOT_EXISTS);
+    }
+
+    @Test
+    @Disabled  // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解
+    public void testGetHireCommissionRatioPage() {
+        // mock 数据
+        HireCommissionRatioDO dbHireCommissionRatio = randomPojo(HireCommissionRatioDO.class, o -> { // 等会查询到
+            o.setEnterpriseId(null);
+            o.setUserId(null);
+            o.setCreateTime(null);
+        });
+        hireCommissionRatioMapper.insert(dbHireCommissionRatio);
+        // 测试 enterpriseId 不匹配
+        hireCommissionRatioMapper.insert(cloneIgnoreId(dbHireCommissionRatio, o -> o.setEnterpriseId(null)));
+        // 测试 userId 不匹配
+        hireCommissionRatioMapper.insert(cloneIgnoreId(dbHireCommissionRatio, o -> o.setUserId(null)));
+        // 测试 createTime 不匹配
+        hireCommissionRatioMapper.insert(cloneIgnoreId(dbHireCommissionRatio, o -> o.setCreateTime(null)));
+        // 准备参数
+        HireCommissionRatioPageReqVO reqVO = new HireCommissionRatioPageReqVO();
+        reqVO.setEnterpriseId(null);
+        reqVO.setUserId(null);
+        reqVO.setCreateTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28));
+
+        // 调用
+        PageResult<HireCommissionRatioDO> pageResult = hireCommissionRatioService.getHireCommissionRatioPage(reqVO);
+        // 断言
+        assertEquals(1, pageResult.getTotal());
+        assertEquals(1, pageResult.getList().size());
+        assertPojoEquals(dbHireCommissionRatio, pageResult.getList().get(0));
+    }
+
+}

+ 160 - 0
menduner/menduner-system-biz/src/test/java/com/citu/module/menduner/system/service/hire/HireJobCvRelServiceImplTest.java

@@ -0,0 +1,160 @@
+package com.citu.module.menduner.system.service.hire;
+
+
+import com.citu.framework.common.pojo.PageResult;
+import com.citu.framework.test.core.ut.BaseDbUnitTest;
+import com.citu.module.menduner.system.controller.base.hire.HireJobCvRelPageReqVO;
+import com.citu.module.menduner.system.controller.base.hire.HireJobCvRelSaveReqVO;
+import com.citu.module.menduner.system.dal.dataobject.hire.HireJobCvRelDO;
+import com.citu.module.menduner.system.dal.mysql.hire.HireJobCvRelMapper;
+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.HIRE_JOB_CV_REL_NOT_EXISTS;
+import static org.junit.jupiter.api.Assertions.*;
+
+/**
+ * {@link HireJobCvRelServiceImpl} 的单元测试类
+ *
+ * @author Rayson
+ */
+@Import(HireJobCvRelServiceImpl.class)
+public class HireJobCvRelServiceImplTest extends BaseDbUnitTest {
+
+    @Resource
+    private HireJobCvRelServiceImpl hireJobCvRelService;
+
+    @Resource
+    private HireJobCvRelMapper hireJobCvRelMapper;
+
+    @Test
+    public void testCreateHireJobCvRel_success() {
+        // 准备参数
+        HireJobCvRelSaveReqVO createReqVO = randomPojo(HireJobCvRelSaveReqVO.class).setId(null);
+
+        // 调用
+        Long hireJobCvRelId = hireJobCvRelService.createHireJobCvRel(createReqVO);
+        // 断言
+        assertNotNull(hireJobCvRelId);
+        // 校验记录的属性是否正确
+        HireJobCvRelDO hireJobCvRel = hireJobCvRelMapper.selectById(hireJobCvRelId);
+        assertPojoEquals(createReqVO, hireJobCvRel, "id");
+    }
+
+    @Test
+    public void testUpdateHireJobCvRel_success() {
+        // mock 数据
+        HireJobCvRelDO dbHireJobCvRel = randomPojo(HireJobCvRelDO.class);
+        hireJobCvRelMapper.insert(dbHireJobCvRel);// @Sql: 先插入出一条存在的数据
+        // 准备参数
+        HireJobCvRelSaveReqVO updateReqVO = randomPojo(HireJobCvRelSaveReqVO.class, o -> {
+            o.setId(dbHireJobCvRel.getId()); // 设置更新的 ID
+        });
+
+        // 调用
+        hireJobCvRelService.updateHireJobCvRel(updateReqVO);
+        // 校验是否更新正确
+        HireJobCvRelDO hireJobCvRel = hireJobCvRelMapper.selectById(updateReqVO.getId()); // 获取最新的
+        assertPojoEquals(updateReqVO, hireJobCvRel);
+    }
+
+    @Test
+    public void testUpdateHireJobCvRel_notExists() {
+        // 准备参数
+        HireJobCvRelSaveReqVO updateReqVO = randomPojo(HireJobCvRelSaveReqVO.class);
+
+        // 调用, 并断言异常
+        assertServiceException(() -> hireJobCvRelService.updateHireJobCvRel(updateReqVO), HIRE_JOB_CV_REL_NOT_EXISTS);
+    }
+
+    @Test
+    public void testDeleteHireJobCvRel_success() {
+        // mock 数据
+        HireJobCvRelDO dbHireJobCvRel = randomPojo(HireJobCvRelDO.class);
+        hireJobCvRelMapper.insert(dbHireJobCvRel);// @Sql: 先插入出一条存在的数据
+        // 准备参数
+        Long id = dbHireJobCvRel.getId();
+
+        // 调用
+        hireJobCvRelService.deleteHireJobCvRel(id);
+        // 校验数据不存在了
+        assertNull(hireJobCvRelMapper.selectById(id));
+    }
+
+    @Test
+    public void testDeleteHireJobCvRel_notExists() {
+        // 准备参数
+        Long id = randomLongId();
+
+        // 调用, 并断言异常
+        assertServiceException(() -> hireJobCvRelService.deleteHireJobCvRel(id), HIRE_JOB_CV_REL_NOT_EXISTS);
+    }
+
+    @Test
+    @Disabled  // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解
+    public void testGetHireJobCvRelPage() {
+        // mock 数据
+        HireJobCvRelDO dbHireJobCvRel = randomPojo(HireJobCvRelDO.class, o -> { // 等会查询到
+            o.setEnterpriseId(null);
+            o.setJobId(null);
+            o.setPublishUserId(null);
+            o.setRecommendUserId(null);
+            o.setUserId(null);
+            o.setName(null);
+            o.setPhone(null);
+            o.setUrl(null);
+            o.setStatus(null);
+            o.setCreateTime(null);
+        });
+        hireJobCvRelMapper.insert(dbHireJobCvRel);
+        // 测试 enterpriseId 不匹配
+        hireJobCvRelMapper.insert(cloneIgnoreId(dbHireJobCvRel, o -> o.setEnterpriseId(null)));
+        // 测试 jobId 不匹配
+        hireJobCvRelMapper.insert(cloneIgnoreId(dbHireJobCvRel, o -> o.setJobId(null)));
+        // 测试 publishUserId 不匹配
+        hireJobCvRelMapper.insert(cloneIgnoreId(dbHireJobCvRel, o -> o.setPublishUserId(null)));
+        // 测试 recommendUserId 不匹配
+        hireJobCvRelMapper.insert(cloneIgnoreId(dbHireJobCvRel, o -> o.setRecommendUserId(null)));
+        // 测试 userId 不匹配
+        hireJobCvRelMapper.insert(cloneIgnoreId(dbHireJobCvRel, o -> o.setUserId(null)));
+        // 测试 name 不匹配
+        hireJobCvRelMapper.insert(cloneIgnoreId(dbHireJobCvRel, o -> o.setName(null)));
+        // 测试 phone 不匹配
+        hireJobCvRelMapper.insert(cloneIgnoreId(dbHireJobCvRel, o -> o.setPhone(null)));
+        // 测试 url 不匹配
+        hireJobCvRelMapper.insert(cloneIgnoreId(dbHireJobCvRel, o -> o.setUrl(null)));
+        // 测试 status 不匹配
+        hireJobCvRelMapper.insert(cloneIgnoreId(dbHireJobCvRel, o -> o.setStatus(null)));
+        // 测试 createTime 不匹配
+        hireJobCvRelMapper.insert(cloneIgnoreId(dbHireJobCvRel, o -> o.setCreateTime(null)));
+        // 准备参数
+        HireJobCvRelPageReqVO reqVO = new HireJobCvRelPageReqVO();
+        reqVO.setEnterpriseId(null);
+        reqVO.setJobId(null);
+        reqVO.setPublishUserId(null);
+        reqVO.setRecommendUserId(null);
+        reqVO.setUserId(null);
+        reqVO.setName(null);
+        reqVO.setPhone(null);
+        reqVO.setUrl(null);
+        reqVO.setStatus(null);
+        reqVO.setCreateTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28));
+
+        // 调用
+        PageResult<HireJobCvRelDO> pageResult = hireJobCvRelService.getHireJobCvRelPage(reqVO);
+        // 断言
+        assertEquals(1, pageResult.getTotal());
+        assertEquals(1, pageResult.getList().size());
+        assertPojoEquals(dbHireJobCvRel, pageResult.getList().get(0));
+    }
+
+}

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

@@ -0,0 +1,132 @@
+package com.citu.module.menduner.system.service.user;
+
+
+import com.citu.framework.common.pojo.PageResult;
+import com.citu.framework.test.core.ut.BaseDbUnitTest;
+import com.citu.module.menduner.system.controller.base.user.account.UserAccountPageReqVO;
+import com.citu.module.menduner.system.controller.base.user.account.UserAccountSaveReqVO;
+import com.citu.module.menduner.system.dal.dataobject.user.UserAccountDO;
+import com.citu.module.menduner.system.dal.mysql.user.UserAccountMapper;
+import org.junit.jupiter.api.Disabled;
+import org.junit.jupiter.api.Test;
+import org.springframework.context.annotation.Import;
+
+import javax.annotation.Resource;
+
+import static com.citu.framework.common.util.date.LocalDateTimeUtils.buildBetweenTime;
+import static com.citu.framework.common.util.object.ObjectUtils.cloneIgnoreId;
+import static com.citu.framework.test.core.util.AssertUtils.assertPojoEquals;
+import static com.citu.framework.test.core.util.AssertUtils.assertServiceException;
+import static com.citu.framework.test.core.util.RandomUtils.randomLongId;
+import static com.citu.framework.test.core.util.RandomUtils.randomPojo;
+import static com.citu.module.menduner.system.enums.ErrorCodeConstants.USER_ACCOUNT_NOT_EXISTS;
+import static org.junit.jupiter.api.Assertions.*;
+
+/**
+ * {@link UserAccountServiceImpl} 的单元测试类
+ *
+ * @author Rayson
+ */
+@Import(UserAccountServiceImpl.class)
+public class UserAccountServiceImplTest extends BaseDbUnitTest {
+
+    @Resource
+    private UserAccountServiceImpl userAccountService;
+
+    @Resource
+    private UserAccountMapper userAccountMapper;
+
+    @Test
+    public void testCreateUserAccount_success() {
+        // 准备参数
+        UserAccountSaveReqVO createReqVO = randomPojo(UserAccountSaveReqVO.class).setId(null);
+
+        // 调用
+        Long userAccountId = userAccountService.createUserAccount(createReqVO);
+        // 断言
+        assertNotNull(userAccountId);
+        // 校验记录的属性是否正确
+        UserAccountDO userAccount = userAccountMapper.selectById(userAccountId);
+        assertPojoEquals(createReqVO, userAccount, "id");
+    }
+
+    @Test
+    public void testUpdateUserAccount_success() {
+        // mock 数据
+        UserAccountDO dbUserAccount = randomPojo(UserAccountDO.class);
+        userAccountMapper.insert(dbUserAccount);// @Sql: 先插入出一条存在的数据
+        // 准备参数
+        UserAccountSaveReqVO updateReqVO = randomPojo(UserAccountSaveReqVO.class, o -> {
+            o.setId(dbUserAccount.getId()); // 设置更新的 ID
+        });
+
+        // 调用
+        userAccountService.updateUserAccount(updateReqVO);
+        // 校验是否更新正确
+        UserAccountDO userAccount = userAccountMapper.selectById(updateReqVO.getId()); // 获取最新的
+        assertPojoEquals(updateReqVO, userAccount);
+    }
+
+    @Test
+    public void testUpdateUserAccount_notExists() {
+        // 准备参数
+        UserAccountSaveReqVO updateReqVO = randomPojo(UserAccountSaveReqVO.class);
+
+        // 调用, 并断言异常
+        assertServiceException(() -> userAccountService.updateUserAccount(updateReqVO), USER_ACCOUNT_NOT_EXISTS);
+    }
+
+    @Test
+    public void testDeleteUserAccount_success() {
+        // mock 数据
+        UserAccountDO dbUserAccount = randomPojo(UserAccountDO.class);
+        userAccountMapper.insert(dbUserAccount);// @Sql: 先插入出一条存在的数据
+        // 准备参数
+        Long id = dbUserAccount.getId();
+
+        // 调用
+        userAccountService.deleteUserAccount(id);
+        // 校验数据不存在了
+        assertNull(userAccountMapper.selectById(id));
+    }
+
+    @Test
+    public void testDeleteUserAccount_notExists() {
+        // 准备参数
+        Long id = randomLongId();
+
+        // 调用, 并断言异常
+        assertServiceException(() -> userAccountService.deleteUserAccount(id), USER_ACCOUNT_NOT_EXISTS);
+    }
+
+    @Test
+    @Disabled  // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解
+    public void testGetUserAccountPage() {
+        // mock 数据
+        UserAccountDO dbUserAccount = randomPojo(UserAccountDO.class, o -> { // 等会查询到
+            o.setUserId(null);
+            o.setBalance(null);
+            o.setCreateTime(null);
+        });
+        userAccountMapper.insert(dbUserAccount);
+        // 测试 userId 不匹配
+        userAccountMapper.insert(cloneIgnoreId(dbUserAccount, o -> o.setUserId(null)));
+        // 测试 balance 不匹配
+        userAccountMapper.insert(cloneIgnoreId(dbUserAccount, o -> o.setBalance(null)));
+        // 测试 createTime 不匹配
+        userAccountMapper.insert(cloneIgnoreId(dbUserAccount, o -> o.setCreateTime(null)));
+        // 准备参数
+        UserAccountPageReqVO reqVO = new UserAccountPageReqVO();
+        reqVO.setUserId(null);
+        reqVO.setBalance(null);
+        reqVO.setCreateTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28));
+
+        // 调用
+        PageResult<UserAccountDO> pageResult = userAccountService.getUserAccountPage(reqVO);
+        // 断言
+        assertEquals(1, pageResult.getTotal());
+        assertEquals(1, pageResult.getList().size());
+        assertPojoEquals(dbUserAccount, pageResult.getList().get(0));
+    }
+
+}

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

@@ -25,4 +25,8 @@ DELETE FROM "mde_train_exp";
 DELETE FROM "mde_project_exp";
 DELETE FROM "mde_skill";
 DELETE FROM "mde_enterprise_user_apply";
-DELETE FROM "mde_job_cv_rel";
+DELETE FROM "mde_job_cv_rel";
+
+DELETE FROM "mde_hire_job_cv_rel";
+DELETE FROM "mde_hire_commission_ratio";
+DELETE FROM "mde_user_account";

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

@@ -506,4 +506,51 @@ CREATE TABLE IF NOT EXISTS "mde_job_cv_rel" (
     "deleted" bit NOT NULL DEFAULT FALSE,
     "tenant_id" bigint NOT NULL,
     PRIMARY KEY ("id")
-) COMMENT '招聘职位简历投递表';
+) COMMENT '招聘职位简历投递表';
+
+CREATE TABLE IF NOT EXISTS "mde_hire_job_cv_rel" (
+    "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY,
+    "enterprise_id" bigint NOT NULL,
+    "job_id" bigint NOT NULL,
+    "publish_user_id" bigint NOT NULL,
+    "recommend_user_id" bigint NOT NULL,
+    "user_id" bigint NOT NULL,
+    "name" varchar,
+    "phone" varchar,
+    "url" varchar NOT NULL,
+    "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_hire_commission_ratio" (
+    "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY,
+    "enterprise_id" bigint NOT NULL,
+    "user_id" varchar NOT NULL,
+    "rate" varchar,
+    "creator" varchar DEFAULT '',
+    "create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
+    "updater" varchar DEFAULT '',
+    "update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
+    "deleted" bit NOT NULL DEFAULT FALSE,
+    "tenant_id" bigint NOT NULL,
+    PRIMARY KEY ("id")
+) COMMENT '门墩儿-众聘-佣金比例表';
+
+CREATE TABLE IF NOT EXISTS "mde_user_account" (
+    "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY,
+    "user_id" varchar NOT NULL,
+    "balance" varchar,
+    "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 '门墩儿-用户账户表';