瀏覽代碼

1、增加用户账户变动记录

rayson 1 年之前
父節點
當前提交
a76e56b741
共有 82 個文件被更改,包括 1930 次插入568 次删除
  1. 1 0
      menduner/menduner-reward-api/src/main/java/com/citu/module/menduner/reward/enums/ErrorCodeConstants.java
  2. 21 0
      menduner/menduner-reward-api/src/main/java/com/citu/module/menduner/reward/enums/record/AccountRecordTypeEnum.java
  3. 49 0
      menduner/menduner-reward-api/src/main/java/com/citu/module/menduner/reward/enums/record/BalanceBizTypeEnum.java
  4. 1 1
      menduner/menduner-reward-api/src/main/java/com/citu/module/menduner/reward/enums/record/PointBizTypeEnum.java
  5. 22 5
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/controller/admin/record/PointRecordController.java
  6. 8 35
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/controller/admin/user/UserPointController.java
  7. 10 8
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/controller/app/user/AppUserPointController.java
  8. 49 0
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/controller/base/record/UserAccountPointRecordRespVO.java
  9. 28 0
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/controller/base/record/UserAccountRecordPageReqVO.java
  10. 18 0
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/convert/UserAccountRecordConvert.java
  11. 93 0
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/dal/dataobject/record/UserAccountRecordDO.java
  12. 67 0
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/dal/mysql/record/UserAccountRecordMapper.java
  13. 2 5
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/framework/rpc/config/RpcConfiguration.java
  14. 8 7
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/service/record/PointRecordServiceImpl.java
  15. 91 0
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/service/record/UserAccountRecordService.java
  16. 179 0
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/service/record/UserAccountRecordServiceImpl.java
  17. 0 83
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/service/user/UserPointService.java
  18. 0 102
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/service/user/UserPointServiceImpl.java
  19. 1 0
      menduner/menduner-reward-biz/src/main/resources/i18n/messages_en_US.properties
  20. 1 0
      menduner/menduner-reward-biz/src/main/resources/i18n/messages_zh_CN.properties
  21. 47 0
      menduner/menduner-system-api/src/main/java/com/citu/module/menduner/system/api/user/UserAccountApi.java
  22. 21 0
      menduner/menduner-system-api/src/main/java/com/citu/module/menduner/system/api/user/UserAccountRespDTO.java
  23. 41 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/api/user/UserAccountApiImpl.java
  24. 64 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/admin/enterprise/EnterpriseAccountController.java
  25. 31 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/admin/enterprise/vo/EnterpriseAccountPageRespVO.java
  26. 2 3
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/admin/hire/HireCommissionRatioController.java
  27. 8 39
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/admin/user/UserAccountController.java
  28. 28 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/admin/user/vo/UserAccountPageRespVO.java
  29. 55 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/app/hire/AppHireJobCvRelController.java
  30. 15 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/app/hire/vo/AppHireJobCvRelQueryReqVO.java
  31. 28 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/app/hire/vo/AppHireJobCvRelRespVO.java
  32. 14 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/app/user/AppMdeUserController.java
  33. 10 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/app/user/vo/AppUserAccountRespVO.java
  34. 0 43
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/appadmin/hire/AppAdminHireCommissionRatioController.java
  35. 0 12
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/appadmin/hire/vo/AppAdminHireCommissionRatioRespVO.java
  36. 1 1
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/appadmin/hire/vo/AppAdminHireJobCvRelPageReqVO.java
  37. 3 23
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/appadmin/hire/vo/AppAdminHireJobCvRelRespVO.java
  38. 3 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/appadmin/job/vo/AppAdminJobSaveReqVO.java
  39. 2 37
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/appadmin/person/vo/AppAdminPersonSimpleRespVO.java
  40. 22 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/appadmin/user/AppAdminUserController.java
  41. 10 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/appadmin/user/vo/AppAdminEnterpriseAccountRespVO.java
  42. 44 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/enterprise/account/EnterpriseAccountPageReqVO.java
  43. 41 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/enterprise/account/EnterpriseAccountRespVO.java
  44. 30 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/enterprise/account/EnterpriseAccountSaveReqVO.java
  45. 8 4
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/hire/HireCommissionRatioPageReqVO.java
  46. 9 9
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/hire/HireCommissionRatioRespVO.java
  47. 9 9
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/hire/HireCommissionRatioSaveReqVO.java
  48. 4 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/job/JobAdvertisedRespVO.java
  49. 3 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/job/JobAdvertisedSaveReqVO.java
  50. 3 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/job/JobAdvertisedSimpleRespVO.java
  51. 43 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/person/info/PersonSimpleRespVO.java
  52. 11 2
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/user/account/UserAccountPageReqVO.java
  53. 4 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/user/account/UserAccountRespVO.java
  54. 4 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/user/account/UserAccountSaveReqVO.java
  55. 4 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/convert/EnterpriseConvert.java
  56. 0 4
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/convert/HireCommissionRatioConvert.java
  57. 14 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/convert/UserConvert.java
  58. 49 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/dataobject/enterprise/EnterpriseAccountDO.java
  59. 6 6
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/dataobject/hire/HireCommissionRatioDO.java
  60. 4 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/dataobject/job/JobAdvertisedDO.java
  61. 4 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/dataobject/user/UserAccountDO.java
  62. 5 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/es/job/ESJobAdvertisedMergeDO.java
  63. 142 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/mysql/enterprise/EnterpriseAccountMapper.java
  64. 8 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/mysql/enterprise/EnterpriseUserBindMapper.java
  65. 2 5
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/mysql/hire/HireCommissionRatioMapper.java
  66. 32 3
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/mysql/hire/HireJobCvRelMapper.java
  67. 0 5
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/mysql/person/PersonInfoMapper.java
  68. 94 1
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/mysql/user/UserAccountMapper.java
  69. 59 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/enterprise/account/EnterpriseAccountService.java
  70. 72 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/enterprise/account/EnterpriseAccountServiceImpl.java
  71. 4 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/enterprise/bind/EnterpriseUserBindService.java
  72. 23 4
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/enterprise/bind/EnterpriseUserBindServiceImpl.java
  73. 0 1
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/enterprise/post/EnterprisePostService.java
  74. 1 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/enterprise/post/EnterprisePostServiceImpl.java
  75. 5 13
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/hire/HireCommissionRatioService.java
  76. 2 38
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/hire/HireCommissionRatioServiceImpl.java
  77. 22 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/hire/HireJobCvRelService.java
  78. 36 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/hire/HireJobCvRelServiceImpl.java
  79. 34 20
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/user/UserAccountService.java
  80. 41 30
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/user/UserAccountServiceImpl.java
  81. 0 8
      menduner/menduner-system-biz/src/test/java/com/citu/module/menduner/system/service/hire/HireCommissionRatioServiceImplTest.java
  82. 0 2
      menduner/menduner-system-biz/src/test/java/com/citu/module/menduner/system/service/job/JobAdvertisedServiceImplTest.java

+ 1 - 0
menduner/menduner-reward-api/src/main/java/com/citu/module/menduner/reward/enums/ErrorCodeConstants.java

@@ -50,6 +50,7 @@ public interface ErrorCodeConstants {
     ErrorCode USER_NOT_EXISTS = new ErrorCode(1_110_005_001, "用户不存在");
     ErrorCode USER_POINT_NOT_ENOUGH = new ErrorCode(1_110_005_002, "用户积分余额不足");
     ErrorCode USER_POINT_CAN_NOT_BE_EMPTY = new ErrorCode(1_110_005_003, "变动积分不能为空");
+    ErrorCode USER_BALANCE_NOT_ENOUGH = new ErrorCode(1_110_005_004, "用户余额不足");
 
     // ========== 事件指标 1_110_006_000 ==========
     ErrorCode EVENT_METRIC_NOT_EXISTS = new ErrorCode(1_110_006_001, "事件指标不存在");

+ 21 - 0
menduner/menduner-reward-api/src/main/java/com/citu/module/menduner/reward/enums/record/AccountRecordTypeEnum.java

@@ -0,0 +1,21 @@
+package com.citu.module.menduner.reward.enums.record;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * 账户记录类型枚举
+ * (0 变动余额 | 1 变动积分)
+ *
+ * @author Rayson
+ */
+@AllArgsConstructor
+@Getter
+public enum AccountRecordTypeEnum {
+    BALANCE("0", "变动余额"),
+    POINT("1", "变动积分");
+
+    final String type;
+    final String name;
+
+}

+ 49 - 0
menduner/menduner-reward-api/src/main/java/com/citu/module/menduner/reward/enums/record/BalanceBizTypeEnum.java

@@ -0,0 +1,49 @@
+package com.citu.module.menduner.reward.enums.record;
+
+import cn.hutool.core.util.EnumUtil;
+import com.citu.framework.common.core.IntArrayValuable;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+import java.util.Objects;
+
+/**
+ * 余额的业务类型枚举
+ *
+ * @author Rayson
+ */
+@AllArgsConstructor
+@Getter
+public enum BalanceBizTypeEnum implements IntArrayValuable {
+
+    RECHARGE(1, "充值", "签到获得 {}积分", true),
+    ADMIN(2, "管理员修改", "管理员修改 {} 积分", true);
+
+    /**
+     * 类型
+     */
+    private final Integer type;
+    /**
+     * 名字
+     */
+    private final String name;
+    /**
+     * 描述
+     */
+    private final String description;
+    /**
+     * 是否为扣减积分
+     */
+    private final boolean add;
+
+    public static BalanceBizTypeEnum getByType(Integer type) {
+        return EnumUtil.getBy(BalanceBizTypeEnum.class,
+                e -> Objects.equals(type, e.getType()));
+    }
+
+    @Override
+    public int[] array() {
+        return new int[0];
+    }
+
+}

+ 1 - 1
menduner/menduner-reward-api/src/main/java/com/citu/module/menduner/reward/enums/record/PointBizTypeEnum.java

@@ -8,7 +8,7 @@ import lombok.Getter;
 import java.util.Objects;
 
 /**
- * 用户积分的业务类型枚举
+ * 积分的业务类型枚举
  *
  * @author Rayson
  */

+ 22 - 5
menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/controller/admin/record/PointRecordController.java

@@ -4,9 +4,13 @@ import com.citu.framework.common.pojo.CommonResult;
 import com.citu.framework.common.pojo.PageResult;
 import com.citu.module.menduner.reward.controller.base.record.PointRecordPageReqVO;
 import com.citu.module.menduner.reward.controller.base.record.PointRecordRespVO;
+import com.citu.module.menduner.reward.controller.base.record.UserAccountRecordPageReqVO;
 import com.citu.module.menduner.reward.convert.PointRecordConvert;
+import com.citu.module.menduner.reward.convert.UserAccountRecordConvert;
 import com.citu.module.menduner.reward.dal.dataobject.record.PointRecordDO;
+import com.citu.module.menduner.reward.dal.dataobject.record.UserAccountRecordDO;
 import com.citu.module.menduner.reward.service.record.PointRecordService;
+import com.citu.module.menduner.reward.service.record.UserAccountRecordService;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import org.springframework.security.access.prepost.PreAuthorize;
@@ -27,20 +31,33 @@ import static com.citu.framework.common.pojo.CommonResult.success;
 @Validated
 public class PointRecordController {
 
-    @Resource
-    private PointRecordService pointRecordService;
+//    @Resource
+//    private PointRecordService pointRecordService;
 
+    @Resource
+    private UserAccountRecordService accountRecordService;
+//    @GetMapping("/page")
+//    @Operation(summary = "获得用户积分记录分页")
+//    @PreAuthorize("@ss.hasPermission('menduner:reward:point-record:query')")
+//    public CommonResult<PageResult<PointRecordRespVO>> getPointRecordPage(@Valid PointRecordPageReqVO pageVO) {
+//        // 执行分页查询
+//        PageResult<PointRecordDO> pageResult = pointRecordService.getPointRecordPage(pageVO);
+//        if (CollectionUtils.isEmpty(pageResult.getList())) {
+//            return success(PageResult.empty(pageResult.getTotal()));
+//        }
+//        return success(PointRecordConvert.INSTANCE.convertPage(pageResult));
+//    }
 
     @GetMapping("/page")
     @Operation(summary = "获得用户积分记录分页")
     @PreAuthorize("@ss.hasPermission('menduner:reward:point-record:query')")
-    public CommonResult<PageResult<PointRecordRespVO>> getPointRecordPage(@Valid PointRecordPageReqVO pageVO) {
+    public CommonResult<PageResult<PointRecordRespVO>> getPointRecordPage(@Valid UserAccountRecordPageReqVO pageVO) {
         // 执行分页查询
-        PageResult<PointRecordDO> pageResult = pointRecordService.getPointRecordPage(pageVO);
+        PageResult<UserAccountRecordDO> pageResult = accountRecordService.getPointRecordPage(pageVO);
         if (CollectionUtils.isEmpty(pageResult.getList())) {
             return success(PageResult.empty(pageResult.getTotal()));
         }
-        return success(PointRecordConvert.INSTANCE.convertPage(pageResult));
+        return success(UserAccountRecordConvert.INSTANCE.convertPage(pageResult));
     }
 
 }

+ 8 - 35
menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/controller/admin/user/UserPointController.java

@@ -1,23 +1,20 @@
 package com.citu.module.menduner.reward.controller.admin.user;
 
-import cn.hutool.core.collection.CollUtil;
 import com.citu.framework.common.pojo.CommonResult;
-import com.citu.framework.common.pojo.PageResult;
-import com.citu.module.menduner.reward.controller.base.user.UserPointPageReqVO;
-import com.citu.module.menduner.reward.controller.base.user.UserPointRespVO;
 import com.citu.module.menduner.reward.controller.base.user.UserPointUpdateReqVO;
-import com.citu.module.menduner.reward.convert.UserPointConvert;
-import com.citu.module.menduner.reward.dal.dataobject.user.UserPointDO;
+import com.citu.module.menduner.reward.dal.dataobject.record.UserAccountRecordDO;
 import com.citu.module.menduner.reward.enums.MathOperationEnum;
 import com.citu.module.menduner.reward.enums.record.PointBizTypeEnum;
 import com.citu.module.menduner.reward.service.record.PointRecordService;
-import com.citu.module.menduner.reward.service.user.UserPointService;
+import com.citu.module.menduner.reward.service.record.UserAccountRecordService;
 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 org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
 
 import javax.annotation.Resource;
 import javax.validation.Valid;
@@ -31,16 +28,13 @@ import static com.citu.framework.common.pojo.CommonResult.success;
 public class UserPointController {
 
     @Resource
-    private UserPointService userService;
-
-    @Resource
-    private PointRecordService pointRecordService;
+    private UserAccountRecordService accountRecordService;
 
     @PutMapping("/update-point")
     @Operation(summary = "修改用户的积分")
     @PreAuthorize("@ss.hasPermission('menduner:reward:user-point:update')")
     public CommonResult<Boolean> updateUserPoint(@Valid @RequestBody UserPointUpdateReqVO updateReqVO) {
-        pointRecordService.createPointRecord(updateReqVO.getUserId(),
+        accountRecordService.createPointRecord(updateReqVO.getUserId(),
                 null,
                 null,
                 MathOperationEnum.ADD.getOperator().equals(updateReqVO.getOperation())
@@ -52,25 +46,4 @@ public class UserPointController {
     }
 
 
-    @GetMapping("/get")
-    @Operation(summary = "获得用户积分")
-    @Parameter(name = "id", description = "编号", required = true, example = "1024")
-    @PreAuthorize("@ss.hasPermission('menduner:reward:user-point:query')")
-    public CommonResult<UserPointRespVO> getUser(@RequestParam("id") Long id) {
-        UserPointDO user = userService.getUser(id);
-        return success(UserPointConvert.INSTANCE.convert2(user));
-    }
-
-    @GetMapping("/page")
-    @Operation(summary = "获得用户积分分页")
-    @PreAuthorize("@ss.hasPermission('menduner:reward:user-point:query')")
-    public CommonResult<PageResult<UserPointRespVO>> getUserPage(@Valid UserPointPageReqVO pageVO) {
-        PageResult<UserPointDO> pageResult = userService.getUserPage(pageVO);
-        if (CollUtil.isEmpty(pageResult.getList())) {
-            return success(PageResult.empty());
-        }
-
-        return success(UserPointConvert.INSTANCE.convertPage(pageResult));
-    }
-
 }

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

@@ -4,13 +4,14 @@ package com.citu.module.menduner.reward.controller.app.user;
 import com.citu.framework.common.pojo.CommonResult;
 import com.citu.framework.security.core.annotations.PreAuthenticated;
 import com.citu.module.menduner.common.util.LoginUserContext;
-import com.citu.module.menduner.reward.dal.dataobject.user.UserPointDO;
-
-import com.citu.module.menduner.reward.service.user.UserPointService;
+import com.citu.module.menduner.system.api.user.UserAccountApi;
+import com.citu.module.menduner.system.api.user.UserAccountRespDTO;
 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 org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
 
 import javax.annotation.Resource;
 
@@ -23,15 +24,16 @@ import static com.citu.framework.common.pojo.CommonResult.success;
 public class AppUserPointController {
 
     @Resource
-    private UserPointService userService;
+    private UserAccountApi userAccountApi;
 
 
     @GetMapping("/get")
     @Operation(summary = "获得用户积分")
     @PreAuthenticated
     public CommonResult<Integer> get() {
-        UserPointDO user =
-                userService.createUserPointIfAbsent(LoginUserContext.getUserId());
-        return success(user.getPoint());
+        UserAccountRespDTO dto =
+                userAccountApi.createUserAccountIfAbsent(LoginUserContext.getUserId())
+                        .getCheckedData();
+        return success(dto.getPoint());
     }
 }

+ 49 - 0
menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/controller/base/record/UserAccountPointRecordRespVO.java

@@ -0,0 +1,49 @@
+package com.citu.module.menduner.reward.controller.base.record;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+@Schema(description = "管理后台 - 用户账户变动积分记录 Response VO")
+@Data
+public class UserAccountPointRecordRespVO {
+
+    @Schema(description = "自增主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "31457")
+    private Long id;
+
+    @Schema(description = "用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
+    private Long userId;
+
+    @Schema(description = "记录类型(0 变动余额 | 1 变动积分)")
+    private String type;
+
+    @Schema(description = "业务编码", requiredMode = Schema.RequiredMode.REQUIRED, example = "22706")
+    private String bizId;
+
+    @Schema(description = "业务类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+    private Integer bizType;
+
+    @Schema(description = "积分标题", requiredMode = Schema.RequiredMode.REQUIRED, example = "你猜")
+    private String title;
+
+    @Schema(description = "积分描述", example = "你猜")
+    private String description;
+
+    @Schema(description = "积分", requiredMode = Schema.RequiredMode.REQUIRED, example = "100")
+    private Integer point;
+
+    @Schema(description = "变动后的积分", requiredMode = Schema.RequiredMode.REQUIRED, example = "200")
+    private Integer totalPoint;
+
+    @Schema(description = "余额", requiredMode = Schema.RequiredMode.REQUIRED, example = "100")
+    private BigDecimal balance;
+
+    @Schema(description = "变动后的余额", requiredMode = Schema.RequiredMode.REQUIRED, example = "200")
+    private BigDecimal totalBalance;
+
+    @Schema(description = "发生时间", requiredMode = Schema.RequiredMode.REQUIRED)
+    private LocalDateTime createTime;
+
+}

+ 28 - 0
menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/controller/base/record/UserAccountRecordPageReqVO.java

@@ -0,0 +1,28 @@
+package com.citu.module.menduner.reward.controller.base.record;
+
+import com.citu.framework.common.pojo.PageParam;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+
+@Schema(description = "管理后台 - 用户账户变动记录分页 Request VO")
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+public class UserAccountRecordPageReqVO extends PageParam {
+
+
+    @Schema(description = "用户编号", example = "123")
+    private Long userId;
+
+    @Schema(description = "业务类型", example = "1")
+    private Integer bizType;
+
+    @Schema(description = "积分标题", example = "呵呵")
+    private String title;
+
+    @Schema(description = "记录类型(0 变动余额 | 1 变动积分)")
+    private String type;
+
+}

+ 18 - 0
menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/convert/UserAccountRecordConvert.java

@@ -0,0 +1,18 @@
+package com.citu.module.menduner.reward.convert;
+
+import com.citu.framework.common.pojo.PageResult;
+import com.citu.module.menduner.reward.controller.base.record.PointRecordRespVO;
+import com.citu.module.menduner.reward.dal.dataobject.record.UserAccountRecordDO;
+import org.mapstruct.Mapper;
+import org.mapstruct.factory.Mappers;
+
+@Mapper
+public interface UserAccountRecordConvert {
+
+    UserAccountRecordConvert INSTANCE = Mappers.getMapper(UserAccountRecordConvert.class);
+
+    PointRecordRespVO convert(UserAccountRecordDO bean);
+
+    PageResult<PointRecordRespVO> convertPage(PageResult<UserAccountRecordDO> page);
+
+}

+ 93 - 0
menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/dal/dataobject/record/UserAccountRecordDO.java

@@ -0,0 +1,93 @@
+package com.citu.module.menduner.reward.dal.dataobject.record;
+
+import com.baomidou.mybatisplus.annotation.KeySequence;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.citu.framework.mybatis.core.dataobject.BaseDO;
+import lombok.*;
+
+import java.math.BigDecimal;
+
+/**
+ * 用户账户变动记录 DO
+ *
+ * @author Rayson
+ */
+@TableName("mde_reward_user_account_record")
+@KeySequence("mde_reward_user_account_record_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class UserAccountRecordDO extends BaseDO {
+
+    /**
+     * 自增主键
+     */
+    @TableId
+    private Long id;
+    /**
+     * 用户编号
+     */
+    private Long userId;
+    /**
+     * 记录类型(0 变动余额 | 1 变动积分)
+     */
+    private String type;
+
+    /**
+     * 业务编码
+     */
+    private String bizId;
+    /**
+     * 业务类型
+     */
+    private Integer bizType;
+
+    /**
+     * 事件地址,用于记录积分规则访问的记录
+     */
+    private String url;
+
+    /**
+     * 积分标题
+     */
+    private String title;
+    /**
+     * 积分描述
+     */
+    private String description;
+
+    /**
+     * 数学运算符 + | -
+     */
+    private String operation;
+
+    /**
+     * 变动积分
+     * <p>
+     * 1、正数表示获得积分
+     * 2、负数表示消耗积分
+     */
+    private Integer point;
+
+    /**
+     * 变动后的积分
+     */
+    private Integer totalPoint;
+
+    /**
+     * 变动余额
+     * <p>
+     * 1、正数表示获得余额
+     * 2、负数表示消耗余额
+     */
+    private BigDecimal balance;
+    /**
+     * 变动后的余额
+     */
+    private BigDecimal totalBalance;
+
+}

+ 67 - 0
menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/dal/mysql/record/UserAccountRecordMapper.java

@@ -0,0 +1,67 @@
+package com.citu.module.menduner.reward.dal.mysql.record;
+
+import com.citu.framework.common.pojo.PageParam;
+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.reward.controller.base.record.UserAccountRecordPageReqVO;
+import com.citu.module.menduner.reward.dal.dataobject.record.UserAccountRecordDO;
+import com.citu.module.menduner.reward.enums.record.AccountRecordTypeEnum;
+import org.apache.ibatis.annotations.Mapper;
+
+import java.time.LocalDateTime;
+import java.util.List;
+
+/**
+ * 用户账户变动记录 Mapper
+ *
+ * @author Rayson
+ */
+@Mapper
+public interface UserAccountRecordMapper extends BaseMapperX<UserAccountRecordDO> {
+
+    default PageResult<UserAccountRecordDO> selectPage(UserAccountRecordPageReqVO reqVO) {
+        return selectPage(reqVO, new LambdaQueryWrapperX<UserAccountRecordDO>()
+                .eqIfPresent(UserAccountRecordDO::getUserId, reqVO.getUserId())
+                .eqIfPresent(UserAccountRecordDO::getType, reqVO.getType())
+                .eqIfPresent(UserAccountRecordDO::getBizType, reqVO.getBizType())
+                .likeIfPresent(UserAccountRecordDO::getTitle, reqVO.getTitle())
+                .orderByDesc(UserAccountRecordDO::getCreateTime));
+    }
+
+    /**
+     * 获取一定时间范围内的用户积分记录
+     *
+     * @param userId    用户id
+     * @param url       事件地址
+     * @param startDate 开始时间
+     * @param endDate   结束时间
+     * @return List<UserAccountRecordDO>
+     **/
+    default List<UserAccountRecordDO> getUserPointList(Long userId,
+                                                       String url,
+                                                       LocalDateTime startDate,
+                                                       LocalDateTime endDate) {
+        LambdaQueryWrapperX<UserAccountRecordDO> wrapperX = new LambdaQueryWrapperX<UserAccountRecordDO>();
+        wrapperX.eq(UserAccountRecordDO::getUserId, userId);
+        wrapperX.eqIfPresent(UserAccountRecordDO::getUrl, url);
+        wrapperX.eq(UserAccountRecordDO::getType, AccountRecordTypeEnum.POINT.getType());
+        if (null != startDate) {
+            wrapperX.ge(UserAccountRecordDO::getCreateTime, startDate);
+        }
+
+        if (null != endDate) {
+            wrapperX.le(UserAccountRecordDO::getCreateTime, endDate);
+        }
+
+        return selectList(wrapperX);
+    }
+
+    default PageResult<UserAccountRecordDO> selectPageByUserId(Long userId, String type, PageParam pageVO) {
+        return selectPage(pageVO, new LambdaQueryWrapperX<UserAccountRecordDO>()
+                .eq(UserAccountRecordDO::getUserId, userId)
+                .eq(UserAccountRecordDO::getType, type)
+                .orderByDesc(UserAccountRecordDO::getCreateTime));
+    }
+
+}

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

@@ -1,14 +1,11 @@
 package com.citu.module.menduner.reward.framework.rpc.config;
 
 import com.citu.module.menduner.system.api.url.MendunerSystemUrlApi;
-import com.citu.module.system.api.logger.LoginLogApi;
-import com.citu.module.system.api.sms.SmsCodeApi;
-import com.citu.module.system.api.social.SocialClientApi;
-import com.citu.module.system.api.social.SocialUserApi;
+import com.citu.module.menduner.system.api.user.UserAccountApi;
 import org.springframework.cloud.openfeign.EnableFeignClients;
 import org.springframework.context.annotation.Configuration;
 
 @Configuration(proxyBeanMethods = false)
-@EnableFeignClients(clients = {MendunerSystemUrlApi.class})
+@EnableFeignClients(clients = {MendunerSystemUrlApi.class, UserAccountApi.class})
 public class RpcConfiguration {
 }

+ 8 - 7
menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/service/record/PointRecordServiceImpl.java

@@ -7,11 +7,11 @@ import com.citu.framework.common.pojo.PageParam;
 import com.citu.framework.common.pojo.PageResult;
 import com.citu.module.menduner.reward.controller.base.record.PointRecordPageReqVO;
 import com.citu.module.menduner.reward.dal.dataobject.record.PointRecordDO;
-import com.citu.module.menduner.reward.dal.dataobject.user.UserPointDO;
 import com.citu.module.menduner.reward.dal.mysql.record.PointRecordMapper;
 import com.citu.module.menduner.reward.enums.MathOperationEnum;
 import com.citu.module.menduner.reward.enums.record.PointBizTypeEnum;
-import com.citu.module.menduner.reward.service.user.UserPointService;
+import com.citu.module.menduner.system.api.user.UserAccountApi;
+import com.citu.module.menduner.system.api.user.UserAccountRespDTO;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 import org.springframework.validation.annotation.Validated;
@@ -38,7 +38,7 @@ public class PointRecordServiceImpl implements PointRecordService {
     private PointRecordMapper mapper;
 
     @Resource
-    private UserPointService userPointService;
+    private UserAccountApi userAccountApi;
 
     @Override
     public PageResult<PointRecordDO> getPointRecordPage(PointRecordPageReqVO pageReqVO) {
@@ -58,8 +58,9 @@ public class PointRecordServiceImpl implements PointRecordService {
             return;
         }
         // 1. 校验用户积分余额
-        UserPointDO user = userPointService.createUserPointIfAbsent(userId);
-        Integer userPoint = ObjectUtil.defaultIfNull(user.getPoint(), 0);
+        UserAccountRespDTO userAccountPoint = userAccountApi.createUserAccountIfAbsent(userId)
+                .getCheckedData();
+        Integer userPoint = ObjectUtil.defaultIfNull(userAccountPoint.getPoint(), 0);
         int totalPoint = userPoint + point; // 用户变动后的积分
         if (totalPoint < 0) {
             throw exception(USER_POINT_NOT_ENOUGH);
@@ -76,7 +77,7 @@ public class PointRecordServiceImpl implements PointRecordService {
         }
 
         // 2. 更新用户积分
-        boolean success = userPointService.updateUserPoint(userId, point);
+        boolean success = userAccountApi.updatePoint(userId, point).getCheckedData();
         if (!success) {
             throw exception(USER_POINT_NOT_ENOUGH);
         }
@@ -113,6 +114,6 @@ public class PointRecordServiceImpl implements PointRecordService {
 
     @Override
     public PageResult<PointRecordDO> page(Long userId, PageParam pageVO) {
-        return mapper.selectPageByUserId(userId,pageVO);
+        return mapper.selectPageByUserId(userId, pageVO);
     }
 }

+ 91 - 0
menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/service/record/UserAccountRecordService.java

@@ -0,0 +1,91 @@
+package com.citu.module.menduner.reward.service.record;
+
+import com.citu.framework.common.pojo.PageParam;
+import com.citu.framework.common.pojo.PageResult;
+import com.citu.module.menduner.reward.controller.base.record.UserAccountRecordPageReqVO;
+import com.citu.module.menduner.reward.dal.dataobject.record.UserAccountRecordDO;
+import com.citu.module.menduner.reward.enums.MathOperationEnum;
+import com.citu.module.menduner.reward.enums.record.PointBizTypeEnum;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+
+/**
+ * 用户账户变动记录 Service 接口
+ *
+ * @author Rayson
+ */
+public interface UserAccountRecordService {
+
+    /**
+     * 【管理员】获得积分记录分页
+     *
+     * @param pageReqVO 分页查询
+     * @return 签到记录分页
+     */
+    PageResult<UserAccountRecordDO> getPointRecordPage(UserAccountRecordPageReqVO pageReqVO);
+
+
+    /**
+     * 创建用户账户变动记录
+     *
+     * @param userId    用户ID
+     * @param url       事件地址
+     * @param title     规则标题
+     * @param operation 操作
+     * @param point     变动积分
+     * @param bizType   业务类型
+     * @param bizId     业务编号
+     */
+    void createPointRecord(Long userId,
+                           String url,
+                           String title,
+                           MathOperationEnum operation,
+                           Integer point,
+                           PointBizTypeEnum bizType,
+                           String bizId);
+
+    /**
+     * 创建用户账户变动记录
+     *
+     * @param userId    用户ID
+     * @param title     规则标题
+     * @param operation 操作
+     * @param balance   变动余额
+     * @param bizType   业务类型
+     * @param bizId     业务编号
+     */
+    void createBalanceRecord(Long userId,
+                           String title,
+                           MathOperationEnum operation,
+                           BigDecimal balance,
+                           PointBizTypeEnum bizType,
+                           String bizId);
+
+
+    /**
+     * 获取一段时间内的用户账户变动获得的数量
+     *
+     * @param userId    用户id
+     * @param url       事件地址
+     * @param startDate 开始时间
+     * @param endDate   结束时间
+     * @return Integer
+     * @author Rayson
+     * @date 2024/6/28 上午10:06
+     **/
+    Integer getPointCount(Long userId, String url, LocalDateTime startDate, LocalDateTime endDate);
+
+    // ========== 求职端 ==========
+
+    /**
+     * 分页获取当前用户账户变动记录
+     *
+     * @param userId 用户id
+     * @param type   记录类型
+     * @param pageVO 分页
+     * @return PageResult<PointRecordDO>
+     **/
+    PageResult<UserAccountRecordDO> page(Long userId, String type, PageParam pageVO);
+}

+ 179 - 0
menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/service/record/UserAccountRecordServiceImpl.java

@@ -0,0 +1,179 @@
+package com.citu.module.menduner.reward.service.record;
+
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.dynamic.datasource.annotation.DSTransactional;
+import com.citu.framework.common.pojo.PageParam;
+import com.citu.framework.common.pojo.PageResult;
+import com.citu.module.menduner.reward.controller.base.record.UserAccountRecordPageReqVO;
+import com.citu.module.menduner.reward.dal.dataobject.record.UserAccountRecordDO;
+import com.citu.module.menduner.reward.dal.mysql.record.UserAccountRecordMapper;
+import com.citu.module.menduner.reward.enums.MathOperationEnum;
+import com.citu.module.menduner.reward.enums.record.AccountRecordTypeEnum;
+import com.citu.module.menduner.reward.enums.record.PointBizTypeEnum;
+import com.citu.module.menduner.system.api.user.UserAccountApi;
+import com.citu.module.menduner.system.api.user.UserAccountRespDTO;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import org.springframework.validation.annotation.Validated;
+
+import javax.annotation.Resource;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+import java.util.List;
+
+import static com.citu.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static com.citu.module.menduner.reward.enums.ErrorCodeConstants.USER_BALANCE_NOT_ENOUGH;
+import static com.citu.module.menduner.reward.enums.ErrorCodeConstants.USER_POINT_NOT_ENOUGH;
+
+
+/**
+ * 用户账户变动 Service 实现类
+ *
+ * @author Rayson
+ */
+@Slf4j
+@Service
+@Validated
+public class UserAccountRecordServiceImpl implements UserAccountRecordService {
+
+    @Resource
+    private UserAccountRecordMapper mapper;
+
+    @Resource
+    private UserAccountApi userAccountApi;
+
+    @Override
+    public PageResult<UserAccountRecordDO> getPointRecordPage(UserAccountRecordPageReqVO pageReqVO) {
+        return mapper.selectPage(pageReqVO);
+    }
+
+    @Override
+    @DSTransactional
+    public void createPointRecord(Long userId,
+                                  String url,
+                                  String title,
+                                  MathOperationEnum operation,
+                                  Integer point,
+                                  PointBizTypeEnum bizType,
+                                  String bizId) {
+        if (0 == point) {
+            return;
+        }
+        // 1. 校验用户积分余额
+        UserAccountRespDTO userAccountResp = userAccountApi
+                .createUserAccountIfAbsent(userId).getCheckedData();
+        Integer userPoint = ObjectUtil.defaultIfNull(userAccountResp.getPoint(), 0);
+        int totalPoint = userPoint + point; // 用户变动后的积分
+        if (totalPoint < 0) {
+            throw exception(USER_POINT_NOT_ENOUGH);
+        }
+
+        if (MathOperationEnum.SUBTRACT.equals(operation)) {
+            if (userPoint - point < 0) {
+                throw exception(USER_POINT_NOT_ENOUGH);
+            }
+            totalPoint = userPoint - point;
+            // 减法
+            point = -Math.abs(point);
+
+        }
+
+        // 2. 更新用户积分
+        boolean success = userAccountApi.updatePoint(userId, point).getCheckedData();
+        if (!success) {
+            throw exception(USER_POINT_NOT_ENOUGH);
+        }
+
+        // 3. 增加用户账户变动
+        UserAccountRecordDO record = new UserAccountRecordDO()
+                .setUserId(userId)
+                .setType(AccountRecordTypeEnum.POINT.getType())
+                .setBizId(bizId)
+                .setBizType(bizType.getType())
+                .setTitle(bizType.getName())
+                .setUrl(url)
+                .setOperation(operation.getOperator())
+                .setDescription(StrUtil.format(bizType.getDescription(), point))
+                .setPoint(point).setTotalPoint(totalPoint);
+
+        if (PointBizTypeEnum.EVENT.equals(bizType)) {
+            if (MathOperationEnum.SUBTRACT.equals(operation)) {
+                record.setDescription(StrUtil.format(bizType.getDescription(), title, point));
+            } else {
+                record.setDescription(StrUtil.format(bizType.getDescription(), title, operation.getOperator(), point));
+            }
+        }
+        mapper.insert(record);
+    }
+
+    @Override
+    @DSTransactional
+    public void createBalanceRecord(Long userId,
+                                  String title,
+                                  MathOperationEnum operation,
+                                  BigDecimal balance,
+                                  PointBizTypeEnum bizType,
+                                  String bizId) {
+        if (0 == balance.compareTo(BigDecimal.ZERO)) {
+            return;
+        }
+
+        // 1. 校验用户余额
+        UserAccountRespDTO userAccountResp = userAccountApi.
+                createUserAccountIfAbsent(userId).getCheckedData();
+
+        BigDecimal userBalance = ObjectUtil.defaultIfNull(userAccountResp.getBalance(), BigDecimal.ZERO);
+        BigDecimal totalBalance = operation ==
+                MathOperationEnum.ADD ? userBalance.add(balance) : userBalance.subtract(balance);
+
+        if (totalBalance.compareTo(BigDecimal.ZERO) < 0) {
+            throw exception(USER_BALANCE_NOT_ENOUGH);
+        }
+
+        if (MathOperationEnum.SUBTRACT.equals(operation)) {
+            if (userBalance.subtract(balance).compareTo(BigDecimal.ZERO) < 0) {
+                throw exception(USER_BALANCE_NOT_ENOUGH);
+            }
+            totalBalance = userBalance.subtract(balance);
+            // 为记录中存储的变动值确保其为正值,同时保留变动的方向信息在operation中
+            balance = balance.abs();
+            // 标记操作为减少
+            operation = MathOperationEnum.SUBTRACT;
+        }
+
+        // 2. 更新用户余额
+        boolean success = userAccountApi.updateBalance(userId, balance).getCheckedData();
+        if (!success) {
+            throw exception(USER_BALANCE_NOT_ENOUGH);
+        }
+
+        // 3. 增加用户账户变动
+        UserAccountRecordDO record = new UserAccountRecordDO()
+                .setUserId(userId)
+                .setType(AccountRecordTypeEnum.BALANCE.getType())
+                .setBizId(bizId)
+                .setBizType(bizType.getType())
+                .setTitle(title)
+                .setOperation(operation.getOperator())
+                .setDescription(StrUtil.format(bizType.getDescription(), balance))
+                .setBalance(balance)
+                .setTotalBalance(totalBalance);
+
+        mapper.insert(record);
+    }
+
+    @Override
+    public Integer getPointCount(Long userId, String url, LocalDateTime startDate, LocalDateTime endDate) {
+        List<UserAccountRecordDO> list = mapper.getUserPointList(userId, url, startDate, endDate);
+        if (ObjectUtil.isEmpty(list)) {
+            return 0;
+        }
+        return list.stream().mapToInt(UserAccountRecordDO::getPoint).sum();
+    }
+
+    @Override
+    public PageResult<UserAccountRecordDO> page(Long userId, String type, PageParam pageVO) {
+        return mapper.selectPageByUserId(userId, type, pageVO);
+    }
+}

+ 0 - 83
menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/service/user/UserPointService.java

@@ -1,83 +0,0 @@
-package com.citu.module.menduner.reward.service.user;
-
-import com.citu.framework.common.pojo.PageResult;
-import com.citu.module.menduner.reward.controller.base.user.UserPointPageReqVO;
-import com.citu.module.menduner.reward.controller.base.user.UserPointUpdateReqVO;
-import com.citu.module.menduner.reward.dal.dataobject.user.UserPointDO;
-
-import javax.validation.Valid;
-import java.util.Collection;
-import java.util.List;
-
-/**
- * 用户积分 Service 接口
- *
- * @author Rayson
- */
-public interface UserPointService {
-
-    /**
-     * 通过用户 ID 查询用户
-     *
-     * @param id 用户ID
-     * @return 用户对象信息
-     */
-    UserPointDO getUser(Long id);
-
-    /**
-     * 通过用户 编号 查询用户
-     *
-     * @param userId 用户 编号
-     * @return 用户对象信息
-     */
-    UserPointDO getPointByUserId(Long userId);
-
-    /**
-     * 通过用户 ID 查询用户们
-     *
-     * @param ids 用户 ID
-     * @return 用户对象信息数组
-     */
-    List<UserPointDO> getUserList(Collection<Long> ids);
-
-    /**
-     * 更新用户积分
-     *
-     * @param updateReqVO 更新信息
-     */
-    void updateUser(@Valid UserPointUpdateReqVO updateReqVO);
-
-    /**
-     * 获得用户积分分页
-     *
-     * @param pageReqVO 分页查询
-     * @return 用户积分分页
-     */
-    PageResult<UserPointDO> getUserPage(UserPointPageReqVO pageReqVO);
-
-
-    /**
-     * 获得指定标签下的用户数量
-     *
-     * @param tagId 用户标签编号
-     * @return 用户数量
-     */
-    Long getUserCountByTagId(Long tagId);
-
-    /**
-     * 更新用户的积分
-     *
-     * @param userId 用户编号
-     * @param point  积分数量
-     * @return 更新结果
-     */
-    boolean updateUserPoint(Long userId, Integer point);
-
-    /**
-     * 如果用户积分不存在,则创建
-     * @param userId 用户编号
-     * @return 用户积分对象
-     */
-    UserPointDO createUserPointIfAbsent(Long userId);
-
-}

+ 0 - 102
menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/service/user/UserPointServiceImpl.java

@@ -1,102 +0,0 @@
-package com.citu.module.menduner.reward.service.user;
-
-import cn.hutool.core.collection.CollUtil;
-import cn.hutool.core.collection.ListUtil;
-import com.baomidou.dynamic.datasource.annotation.DSTransactional;
-import com.citu.framework.common.pojo.PageResult;
-import com.citu.module.menduner.reward.controller.base.user.UserPointPageReqVO;
-import com.citu.module.menduner.reward.controller.base.user.UserPointUpdateReqVO;
-import com.citu.module.menduner.reward.convert.UserPointConvert;
-import com.citu.module.menduner.reward.dal.dataobject.user.UserPointDO;
-import com.citu.module.menduner.reward.dal.mysql.user.UserPointMapper;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.stereotype.Service;
-
-import javax.annotation.Resource;
-import javax.validation.Valid;
-import java.util.Collection;
-import java.util.List;
-
-import static com.citu.framework.common.exception.util.ServiceExceptionUtil.exception;
-import static com.citu.module.menduner.reward.enums.ErrorCodeConstants.USER_NOT_EXISTS;
-
-/**
- * 用户积分 Service 实现类
- *
- * @author Rayson
- */
-@Service
-@Valid
-@Slf4j
-public class UserPointServiceImpl implements UserPointService {
-
-    @Resource
-    private UserPointMapper userPointMapper;
-
-
-    @Override
-    public UserPointDO getUser(Long id) {
-        return userPointMapper.selectById(id);
-    }
-
-    @Override
-    public UserPointDO getPointByUserId(Long userId) {
-        return userPointMapper.selectByUserId(userId);
-    }
-
-    @Override
-    public List<UserPointDO> getUserList(Collection<Long> ids) {
-        if (CollUtil.isEmpty(ids)) {
-            return ListUtil.empty();
-        }
-        return userPointMapper.selectBatchIds(ids);
-    }
-
-
-    @Override
-    @DSTransactional
-    public void updateUser(UserPointUpdateReqVO updateReqVO) {
-        // 校验存在
-        UserPointDO user = userPointMapper.selectById(updateReqVO.getUserId());
-        if (null == user) {
-            throw exception(USER_NOT_EXISTS);
-        }
-        // 更新
-        UserPointDO updateObj = UserPointConvert.INSTANCE.convert(updateReqVO);
-        userPointMapper.updateById(updateObj);
-    }
-
-
-    @Override
-    public PageResult<UserPointDO> getUserPage(UserPointPageReqVO pageReqVO) {
-        return userPointMapper.selectPage(pageReqVO);
-    }
-
-
-    @Override
-    public Long getUserCountByTagId(Long tagId) {
-        return userPointMapper.selectCountByTagId(tagId);
-    }
-
-    @Override
-    public boolean updateUserPoint(Long id, Integer point) {
-        if (point > 0) {
-            userPointMapper.updatePointIncr(id, point);
-        } else if (point < 0) {
-            return userPointMapper.updatePointDecr(id, point) > 0;
-        }
-        return true;
-    }
-
-    @Override
-    @DSTransactional
-    public UserPointDO createUserPointIfAbsent(Long userId) {
-        UserPointDO userPointDO = userPointMapper.selectByUserId(userId);
-        if (null != userPointDO) {
-          return userPointDO;
-        }
-        UserPointDO userPoint = UserPointDO.builder().userId(userId).point(0).build();
-        userPointMapper.insert(userPoint);
-        return userPoint;
-    }
-}

+ 1 - 0
menduner/menduner-reward-biz/src/main/resources/i18n/messages_en_US.properties

@@ -43,6 +43,7 @@
 1_110_005_001=User does not exist
 1_110_005_002=Insufficient user points balance
 1_110_005_003=Variable integral cannot be empty
+1_110_005_004=User balance insufficient
 # ========== 事件指标 1_110_006_000 ==========
 1_110_006_001=Event indicator does not exist
 # ========== 事件记录 1_110_007_000 ==========

+ 1 - 0
menduner/menduner-reward-biz/src/main/resources/i18n/messages_zh_CN.properties

@@ -43,6 +43,7 @@
 1_110_005_001=用户不存在
 1_110_005_002=用户积分余额不足
 1_110_005_003=变动积分不能为空
+1_110_005_004=用户余额不足
 # ========== 事件指标 1_110_006_000 ==========
 1_110_006_001=事件指标不存在
 # ========== 事件记录 1_110_007_000 ==========

+ 47 - 0
menduner/menduner-system-api/src/main/java/com/citu/module/menduner/system/api/user/UserAccountApi.java

@@ -0,0 +1,47 @@
+package com.citu.module.menduner.system.api.user;
+
+import com.citu.framework.common.pojo.CommonResult;
+import com.citu.module.menduner.system.enums.ApiConstants;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.Parameters;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+
+import java.math.BigDecimal;
+
+@FeignClient(name = ApiConstants.NAME)
+@Tag(name = "RPC 服务 - 用户账户")
+public interface UserAccountApi {
+
+    String PREFIX = ApiConstants.PREFIX + "/user-account";
+
+    @PostMapping(PREFIX + "/create")
+    @Operation(summary = "如果用户账户不存在,则创建")
+    @Parameters({
+            @Parameter(name = "userId", description = "用户编号", example = "1", required = true)
+    })
+    CommonResult<UserAccountRespDTO> createUserAccountIfAbsent(@RequestParam("userId") Long userId);
+
+
+    @PutMapping(PREFIX + "/point/update")
+    @Operation(summary = "更新用户的积分,则创建")
+    @Parameters({
+            @Parameter(name = "userId", description = "用户编号", example = "2", required = true),
+            @Parameter(name = "point", description = "积分", example = "2", required = true),
+    })
+    CommonResult<Boolean> updatePoint(@RequestParam("userId") Long userId, @RequestParam("point") Integer point);
+
+    @PutMapping(PREFIX + "/balance/update")
+    @Operation(summary = "更新用户的余额,则创建")
+    @Parameters({
+            @Parameter(name = "userId", description = "用户编号", example = "2", required = true),
+            @Parameter(name = "balance", description = "余额", example = "2", required = true),
+    })
+    CommonResult<Boolean> updateBalance(@RequestParam("userId") Long userId,
+                                        @RequestParam("balance") BigDecimal balance);
+
+}

+ 21 - 0
menduner/menduner-system-api/src/main/java/com/citu/module/menduner/system/api/user/UserAccountRespDTO.java

@@ -0,0 +1,21 @@
+package com.citu.module.menduner.system.api.user;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.math.BigDecimal;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Schema(description = "用户账户 DTO VO")
+public class UserAccountRespDTO {
+
+    @Schema(description = "积分")
+    private Integer point;
+
+    @Schema(description = "余额")
+    private BigDecimal balance;
+}

+ 41 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/api/user/UserAccountApiImpl.java

@@ -0,0 +1,41 @@
+package com.citu.module.menduner.system.api.user;
+
+import com.citu.framework.common.pojo.CommonResult;
+import com.citu.module.menduner.system.dal.dataobject.user.UserAccountDO;
+import com.citu.module.menduner.system.service.user.UserAccountService;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+
+import java.math.BigDecimal;
+
+import static com.citu.framework.common.pojo.CommonResult.success;
+
+@RestController // 提供 RESTful API 接口,给 Feign 调用
+@Validated
+public class UserAccountApiImpl implements UserAccountApi {
+
+    @Resource
+    private UserAccountService service;
+
+
+    @Override
+    public CommonResult<UserAccountRespDTO> createUserAccountIfAbsent(Long userId) {
+        UserAccountDO userAccountDO = service.createUserAccountIfAbsent(userId);
+        UserAccountRespDTO dto = new UserAccountRespDTO();
+        dto.setPoint(userAccountDO.getPoint());
+        dto.setBalance(userAccountDO.getBalance());
+        return success(dto);
+    }
+
+    @Override
+    public CommonResult<Boolean> updatePoint(Long userId, Integer point) {
+        return success(service.updatePoint(userId, point));
+    }
+
+    @Override
+    public CommonResult<Boolean> updateBalance(Long userId, BigDecimal balance) {
+        return success(service.updateBalance(userId, balance));
+    }
+}

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

@@ -0,0 +1,64 @@
+package com.citu.module.menduner.system.controller.admin.enterprise;
+
+
+import com.citu.framework.apilog.core.annotation.ApiAccessLog;
+import com.citu.framework.common.pojo.CommonResult;
+import com.citu.framework.common.pojo.PageParam;
+import com.citu.framework.common.pojo.PageResult;
+import com.citu.framework.common.util.object.BeanUtils;
+import com.citu.framework.excel.core.util.ExcelUtils;
+import com.citu.module.menduner.system.controller.admin.enterprise.vo.EnterpriseAccountPageRespVO;
+import com.citu.module.menduner.system.controller.base.enterprise.account.EnterpriseAccountPageReqVO;
+import com.citu.module.menduner.system.controller.base.enterprise.account.EnterpriseAccountRespVO;
+import com.citu.module.menduner.system.dal.dataobject.enterprise.EnterpriseAccountDO;
+import com.citu.module.menduner.system.service.enterprise.account.EnterpriseAccountService;
+import io.swagger.v3.oas.annotations.Operation;
+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.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.Valid;
+import java.io.IOException;
+import java.util.List;
+
+import static com.citu.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
+import static com.citu.framework.common.pojo.CommonResult.success;
+
+@Tag(name = "管理后台 - 企业账户")
+@RestController
+@RequestMapping("/menduner/system/enterprise-account")
+@Validated
+public class EnterpriseAccountController {
+
+    @Resource
+    private EnterpriseAccountService enterpriseAccountService;
+
+
+    @GetMapping("/page")
+    @Operation(summary = "获得企业账户分页")
+    @PreAuthorize("@ss.hasPermission('menduner:system:enterprise-account:query')")
+    public CommonResult<PageResult<EnterpriseAccountPageRespVO>> getEnterpriseAccountPage
+            (@Valid EnterpriseAccountPageReqVO pageReqVO) {
+        PageResult<EnterpriseAccountPageRespVO> pageResult = enterpriseAccountService.page2(pageReqVO);
+        return success(pageResult);
+    }
+
+    @GetMapping("/export-excel")
+    @Operation(summary = "导出企业账户 Excel")
+    @PreAuthorize("@ss.hasPermission('menduner:system:enterprise-account:export')")
+    @ApiAccessLog(operateType = EXPORT)
+    public void exportEnterpriseAccountExcel(@Valid EnterpriseAccountPageReqVO pageReqVO,
+                                             HttpServletResponse response) throws IOException {
+        pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+        List<EnterpriseAccountDO> list = enterpriseAccountService.page(pageReqVO).getList();
+        // 导出 Excel
+        ExcelUtils.write(response, "企业账户.xls", "数据", EnterpriseAccountRespVO.class,
+                BeanUtils.toBean(list, EnterpriseAccountRespVO.class));
+    }
+
+}

+ 31 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/admin/enterprise/vo/EnterpriseAccountPageRespVO.java

@@ -0,0 +1,31 @@
+package com.citu.module.menduner.system.controller.admin.enterprise.vo;
+
+import com.citu.module.menduner.system.controller.base.enterprise.account.EnterpriseAccountRespVO;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+@Schema(description = "管理后台 - 企业账户分页 Response VO")
+@Data
+public class EnterpriseAccountPageRespVO extends EnterpriseAccountRespVO {
+
+    // ========== 企业信息 ==========
+    @Schema(description = "企业全称", example = "广州xx科技")
+    private String enterpriseName;
+
+    @Schema(description = "企业别称", example = "xx科技")
+    private String anotherName;
+
+    @Schema(description = "logo图片地址", example = "https://www.iocoder.cn")
+    private String logoUrl;
+
+    // ========== 用户信息 ==========
+
+    @Schema(description = "名称", example = "x女士")
+    private String userName;
+
+    @Schema(description = "用户性别")
+    private String sex;
+
+    @Schema(description = "头像地址")
+    private String avatar;
+}

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

@@ -63,10 +63,9 @@ public class HireCommissionRatioController {
 
     @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);
+    public CommonResult<HireCommissionRatioRespVO> getHireCommissionRatio() {
+        HireCommissionRatioDO hireCommissionRatio = hireCommissionRatioService.get();
         return success(BeanUtils.toBean(hireCommissionRatio, HireCommissionRatioRespVO.class));
     }
 

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

@@ -7,17 +7,18 @@ 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.admin.user.vo.UserAccountPageRespVO;
 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 org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
 
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletResponse;
@@ -37,45 +38,13 @@ 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));
+    public CommonResult<PageResult<UserAccountPageRespVO>> getUserAccountPage(@Valid UserAccountPageReqVO pageReqVO) {
+        PageResult<UserAccountPageRespVO> pageResult = userAccountService.page2(pageReqVO);
+        return success(pageResult);
     }
 
     @GetMapping("/export-excel")
@@ -85,7 +54,7 @@ public class UserAccountController {
     public void exportUserAccountExcel(@Valid UserAccountPageReqVO pageReqVO,
                                        HttpServletResponse response) throws IOException {
         pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
-        List<UserAccountDO> list = userAccountService.getUserAccountPage(pageReqVO).getList();
+        List<UserAccountDO> list = userAccountService.page(pageReqVO).getList();
         // 导出 Excel
         ExcelUtils.write(response, "用户账户.xls", "数据", UserAccountRespVO.class,
                 BeanUtils.toBean(list, UserAccountRespVO.class));

+ 28 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/admin/user/vo/UserAccountPageRespVO.java

@@ -0,0 +1,28 @@
+package com.citu.module.menduner.system.controller.admin.user.vo;
+
+import com.citu.module.menduner.system.controller.base.user.account.UserAccountRespVO;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+@Schema(description = "管理后台 - 用户账户分页 Response VO")
+@Data
+public class UserAccountPageRespVO extends UserAccountRespVO {
+
+    // ========== 用户信息 ==========
+
+    @Schema(description = "名称", example = "x女士")
+    private String userName;
+
+    @Schema(description = "手机号码")
+    private String phone;
+
+    @Schema(description = "邮箱")
+    private String email;
+
+    @Schema(description = "用户性别")
+    private String sex;
+
+    @Schema(description = "头像地址")
+    private String avatar;
+
+}

+ 55 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/app/hire/AppHireJobCvRelController.java

@@ -0,0 +1,55 @@
+package com.citu.module.menduner.system.controller.app.hire;
+
+
+import com.citu.framework.common.pojo.CommonResult;
+import com.citu.framework.common.pojo.PageResult;
+import com.citu.framework.security.core.annotations.PreAuthenticated;
+import com.citu.module.menduner.system.controller.app.hire.vo.AppHireJobCvRelQueryReqVO;
+import com.citu.module.menduner.system.controller.app.hire.vo.AppHireJobCvRelRespVO;
+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.base.CommonRespVO;
+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.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+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 AppHireJobCvRelController {
+
+    @Resource
+    private HireJobCvRelService service;
+
+    @PreAuthenticated
+    @GetMapping("/page")
+    @Operation(summary = "获取推荐邀请投递的职位信息")
+    public CommonResult<PageResult<AppHireJobCvRelRespVO>> page
+            (@Valid AppHireJobCvRelQueryReqVO pageReqVO) {
+        return success(service.page(pageReqVO));
+    }
+
+
+    @PreAuthenticated
+    @GetMapping("/get/commend/count")
+    @Operation(summary = "获取推荐职位投递状态数量")
+    public CommonResult<List<CommonRespVO>> getRecommendCount() {
+        return success(service.getRecommendCount());
+    }
+
+
+
+}

+ 15 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/app/hire/vo/AppHireJobCvRelQueryReqVO.java

@@ -0,0 +1,15 @@
+package com.citu.module.menduner.system.controller.app.hire.vo;
+
+import com.citu.framework.common.pojo.PageParam;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+@Schema(description = "求职端 - 众聘-简历投递查询 Request VO")
+@Data
+public class AppHireJobCvRelQueryReqVO extends PageParam {
+
+    @Schema(description = "投递的简历状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+    private String status;
+
+
+}

+ 28 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/app/hire/vo/AppHireJobCvRelRespVO.java

@@ -0,0 +1,28 @@
+package com.citu.module.menduner.system.controller.app.hire.vo;
+
+import com.citu.module.menduner.system.controller.base.enterprise.vo.EnterpriseSimpleRespVO;
+import com.citu.module.menduner.system.controller.base.hire.HireJobCvRelRespVO;
+import com.citu.module.menduner.system.controller.base.job.JobAdvertisedSimpleRespVO;
+import com.citu.module.menduner.system.controller.base.person.info.PersonSimpleRespVO;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+@Schema(description = "求职端 - 众聘-简历投递 Response VO")
+@Data
+public class AppHireJobCvRelRespVO extends HireJobCvRelRespVO {
+
+    @Schema(description = "更新时间")
+    private LocalDateTime updateTime;
+
+    @Schema(description = "招聘信息")
+    private JobAdvertisedSimpleRespVO job;
+
+    @Schema(description = "投递人员信息")
+    private PersonSimpleRespVO recommendPerson;
+
+    @Schema(description = "投递企业信息")
+    private EnterpriseSimpleRespVO enterprise;
+
+}

+ 14 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/app/user/AppMdeUserController.java

@@ -5,9 +5,12 @@ import com.citu.framework.common.pojo.CommonResult;
 import com.citu.framework.common.util.object.BeanUtils;
 import com.citu.framework.security.core.annotations.PreAuthenticated;
 import com.citu.module.menduner.system.controller.app.user.vo.*;
+import com.citu.module.menduner.system.convert.UserConvert;
 import com.citu.module.menduner.system.dal.dataobject.user.MdeUserDO;
+import com.citu.module.menduner.system.dal.dataobject.user.UserAccountDO;
 import com.citu.module.menduner.system.service.user.MdeUserService;
 import com.citu.module.menduner.common.util.LoginUserContext;
+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;
@@ -28,6 +31,9 @@ public class AppMdeUserController {
     @Resource
     private MdeUserService mdeUserService;
 
+    @Resource
+    private UserAccountService userAccountService;
+
     @GetMapping("/get")
     @Operation(summary = "获得用户信息")
     @Parameter(name = "id", description = "编号", required = true, example = "1024")
@@ -37,6 +43,14 @@ public class AppMdeUserController {
         return success(BeanUtils.toBean(mdeUser, AppMdeUserRespVO.class));
     }
 
+    @GetMapping("/get/account")
+    @Operation(summary = "获得用户账户信息")
+    @PreAuthenticated
+    public CommonResult<AppUserAccountRespVO> getAccount() {
+        UserAccountDO accountDO = userAccountService.get();
+        return success(UserConvert.INSTANCE.convert(accountDO));
+    }
+
     @PutMapping("/update-phone")
     @Operation(summary = "修改用户手机")
     @PreAuthenticated

+ 10 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/app/user/vo/AppUserAccountRespVO.java

@@ -0,0 +1,10 @@
+package com.citu.module.menduner.system.controller.app.user.vo;
+
+import com.citu.module.menduner.system.controller.base.user.account.UserAccountRespVO;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+@Schema(description = "用户账户 Response VO")
+@Data
+public class AppUserAccountRespVO extends UserAccountRespVO {
+}

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

@@ -1,43 +0,0 @@
-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);
-    }
-
-}

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

@@ -1,12 +0,0 @@
-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 {
-
-}

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

@@ -11,7 +11,7 @@ import java.time.LocalDateTime;
 
 import static com.citu.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
 
-@Schema(description = "求职端 - 众聘-简历投递分页 Request VO")
+@Schema(description = "招聘端 - 众聘-简历投递分页 Request VO")
 @Data
 @EqualsAndHashCode(callSuper = true)
 @ToString(callSuper = true)

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

@@ -2,35 +2,15 @@ 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 com.citu.module.menduner.system.controller.base.hire.HireJobCvRelRespVO;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 
 import java.time.LocalDateTime;
 
-@Schema(description = "求职端 - 众聘-简历投递 Response VO")
+@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;
+public class AppAdminHireJobCvRelRespVO extends HireJobCvRelRespVO {
 
     @Schema(description = "更新时间")
     private LocalDateTime updateTime;

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

@@ -77,5 +77,8 @@ public class AppAdminJobSaveReqVO {
     @Schema(description = "雇佣金额")
     private BigDecimal hirePrice;
 
+    @Schema(description = "雇佣积分")
+    private BigDecimal hirePoint;
+
 
 }

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

@@ -1,5 +1,6 @@
 package com.citu.module.menduner.system.controller.appadmin.person.vo;
 
+import com.citu.module.menduner.system.controller.base.person.info.PersonSimpleRespVO;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 
@@ -7,42 +8,6 @@ import java.time.LocalDateTime;
 
 @Schema(description = "menduner - 人才简易信息 Response VO")
 @Data
-public class AppAdminPersonSimpleRespVO {
-
-    @Schema(description = "id", requiredMode = Schema.RequiredMode.REQUIRED, example = "25036")
-    private Long id;
-
-    @Schema(description = "用户id")
-    private Long userId;
-
-    @Schema(description = "真实姓名", example = "王五")
-    private String name;
-
-    @Schema(description = "用户性别")
-    private String sex;
-
-    @Schema(description = "头像地址")
-    private String avatar;
-
-    @Schema(description = "出生日期")
-    private LocalDateTime birthday;
-
-    @Schema(description = "求职状态(0离职-随时到岗 1在职-月内到岗 2在职-考虑机会 3在职-暂不考虑)", example = "1")
-    private String jobStatus;
-
-    @Schema(description = "工作经验", example = "1")
-    private String expType;
-
-    @Schema(description = "学历", example = "2")
-    private String eduType;
-
-    @Schema(description = "更新时间")
-    private LocalDateTime updateTime;
-
-    //    @Schema(description = "教育经历信息")
-    //    private List<AppAdminEduExpSimpleRespVO> eduExpList;
-    //
-    //    @Schema(description = "工作经验信息")
-    //    private List<AppAdminWorkExpSimpleRespVO> workExpList;
+public class AppAdminPersonSimpleRespVO extends PersonSimpleRespVO {
 
 }

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

@@ -4,9 +4,13 @@ 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.AppAdminEnterpriseAccountRespVO;
 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.convert.EnterpriseConvert;
+import com.citu.module.menduner.system.dal.dataobject.enterprise.EnterpriseAccountDO;
+import com.citu.module.menduner.system.service.enterprise.account.EnterpriseAccountService;
 import com.citu.module.menduner.system.service.enterprise.bind.EnterpriseUserBindService;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.tags.Tag;
@@ -27,6 +31,8 @@ public class AppAdminUserController {
     @Resource
     private EnterpriseUserBindService service;
 
+    @Resource
+    private EnterpriseAccountService enterpriseAccountService;
 
     @PreAuthenticated
     @GetMapping("/get")
@@ -35,6 +41,15 @@ public class AppAdminUserController {
         return success(service.getBindEnterprise());
     }
 
+
+    @GetMapping("/get/account")
+    @Operation(summary = "获得企业账户信息")
+    @PreAuthenticated
+    public CommonResult<AppAdminEnterpriseAccountRespVO> getAccount() {
+        EnterpriseAccountDO accountDO = enterpriseAccountService.get();
+        return success(EnterpriseConvert.INSTANCE.convert16(accountDO));
+    }
+
     @PreAuthenticated
     @PostMapping("/save")
     @Operation(summary = "保存用户信息")
@@ -72,4 +87,11 @@ public class AppAdminUserController {
             @RequestParam("id") Long id, @RequestParam("postId") Long postId) {
         return success(service.bindPost(id, postId));
     }
+
+    @PreAuthenticated
+    @GetMapping("/check/post")
+    @Operation(summary = "效验该岗位下是否绑定用户")
+    public CommonResult<Boolean> checkPost(@RequestParam("postId") Long postId) {
+        return success(service.checkPost(postId));
+    }
 }

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

@@ -0,0 +1,10 @@
+package com.citu.module.menduner.system.controller.appadmin.user.vo;
+
+import com.citu.module.menduner.system.controller.base.enterprise.account.EnterpriseAccountRespVO;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+@Schema(description = "menduner - 企业账户 Response VO")
+@Data
+public class AppAdminEnterpriseAccountRespVO extends EnterpriseAccountRespVO {
+}

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

@@ -0,0 +1,44 @@
+package com.citu.module.menduner.system.controller.base.enterprise.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 EnterpriseAccountPageReqVO extends PageParam {
+
+    @Schema(description = "企业id", requiredMode = Schema.RequiredMode.REQUIRED, example = "616")
+    private Long enterpriseId;
+
+    @Schema(description = "用户id", example = "19716")
+    private Long userId;
+
+    @Schema(description = "名称", example = "x女士")
+    private String userName;
+
+    @Schema(description = "手机号码")
+    private String phone;
+
+    @Schema(description = "邮箱")
+    private String email;
+
+    @Schema(description = "用户性别")
+    private String sex;
+
+    @Schema(description = "创建时间")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDateTime[] createTime;
+
+}

+ 41 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/enterprise/account/EnterpriseAccountRespVO.java

@@ -0,0 +1,41 @@
+package com.citu.module.menduner.system.controller.base.enterprise.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 EnterpriseAccountRespVO {
+
+    @Schema(description = "id", requiredMode = Schema.RequiredMode.REQUIRED, example = "31789")
+    @ExcelProperty("id")
+    private Long id;
+
+    @ExcelProperty("企业id")
+    @Schema(description = "企业id", requiredMode = Schema.RequiredMode.REQUIRED, example = "616")
+    private Long enterpriseId;
+
+    @Schema(description = "用户id", requiredMode = Schema.RequiredMode.REQUIRED, example = "19716")
+    @ExcelProperty("用户id")
+    private Long userId;
+
+    @Schema(description = "账户余额")
+    @ExcelProperty("账户余额")
+    private BigDecimal balance;
+
+    @Schema(description = "积分数量")
+    @ExcelProperty("积分数量")
+    private Integer point;
+
+    @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/enterprise/account/EnterpriseAccountSaveReqVO.java

@@ -0,0 +1,30 @@
+package com.citu.module.menduner.system.controller.base.enterprise.account;
+
+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 EnterpriseAccountSaveReqVO {
+
+    @Schema(description = "id", requiredMode = Schema.RequiredMode.REQUIRED, example = "31789")
+    private Long id;
+
+    @Schema(description = "企业id", requiredMode = Schema.RequiredMode.REQUIRED, example = "616")
+    private Long enterpriseId;
+
+    @Schema(description = "用户id", requiredMode = Schema.RequiredMode.REQUIRED, example = "19716")
+    @NotEmpty(message = "{1_099_000_006}")
+    private Long userId;
+
+    @Schema(description = "账户余额")
+    private BigDecimal balance;
+
+    @Schema(description = "积分数量")
+    private Integer point;
+
+}

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

@@ -7,6 +7,7 @@ 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;
@@ -17,11 +18,14 @@ import static com.citu.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DA
 @ToString(callSuper = true)
 public class HireCommissionRatioPageReqVO extends PageParam {
 
-    @Schema(description = "企业id", example = "24901")
-    private Long enterpriseId;
+    @Schema(description = "猎头佣金比例(0.000-100.000)", example = "6824")
+    private BigDecimal headhuntRate;
 
-    @Schema(description = "用户id", example = "6824")
-    private Long userId;
+    @Schema(description = "推荐人佣金比例(0.000-100.000)")
+    private BigDecimal recommendRate;
+
+    @Schema(description = "投递人佣金比例(0.000-100.000)")
+    private BigDecimal cvRate;
 
     @Schema(description = "创建时间")
     @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)

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

@@ -18,17 +18,17 @@ public class HireCommissionRatioRespVO {
     @ExcelProperty("id")
     private Long id;
 
-    @Schema(description = "企业id", requiredMode = Schema.RequiredMode.REQUIRED, example = "24901")
-    @ExcelProperty("企业id")
-    private Long enterpriseId;
+    @Schema(description = "猎头佣金比例(0.000-100.000)", example = "6824")
+    @ExcelProperty("猎头佣金比例")
+    private BigDecimal headhuntRate;
 
-    @Schema(description = "用户id", requiredMode = Schema.RequiredMode.REQUIRED, example = "6824")
-    @ExcelProperty("用户id")
-    private Long userId;
+    @Schema(description = "推荐人佣金比例(0.000-100.000)")
+    @ExcelProperty("推荐人佣金比例")
+    private BigDecimal recommendRate;
 
-    @Schema(description = "佣金比例(0.000-100.000)")
-    @ExcelProperty("佣金比例(0.000-100.000)")
-    private BigDecimal rate;
+    @Schema(description = "投递人佣金比例(0.000-100.000)")
+    @ExcelProperty("投递人佣金比例")
+    private BigDecimal cvRate;
 
     @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
     @ExcelProperty("创建时间")

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

@@ -4,7 +4,6 @@ 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;
 
@@ -15,16 +14,17 @@ 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;
+    @NotNull(message = "{1_100_037_002}")
+    @Schema(description = "猎头佣金比例(0.000-100.000)", example = "6824")
+    private BigDecimal headhuntRate;
 
-    @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 recommendRate;
 
     @NotNull(message = "{1_100_037_002}")
-    @Schema(description = "佣金比例(0.000-100.000)")
-    private BigDecimal rate;
+    @Schema(description = "投递人佣金比例(0.000-100.000)")
+    private BigDecimal cvRate;
+
 
 }

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

@@ -109,6 +109,10 @@ public class JobAdvertisedRespVO {
     @ExcelProperty("雇佣金额")
     private BigDecimal hirePrice;
 
+    @Schema(description = "雇佣积分")
+    @ExcelProperty("雇佣积分")
+    private BigDecimal hirePoint;
+
     @Schema(description = "职位状态", example = "2")
     @ExcelProperty(value = "职位状态", converter = DictConvert.class)
     @DictFormat(MENDUNER_STATUS)

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

@@ -89,6 +89,9 @@ public class JobAdvertisedSaveReqVO {
     @Schema(description = "雇佣金额")
     private BigDecimal hirePrice;
 
+    @Schema(description = "雇佣积分")
+    private BigDecimal hirePoint;
+
     @Schema(description = "职位状态", example = "2")
     private String status;
 

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

@@ -50,6 +50,9 @@ public class JobAdvertisedSimpleRespVO {
     @Schema(description = "雇佣金额")
     private BigDecimal hirePrice;
 
+    @Schema(description = "雇佣积分")
+    private BigDecimal hirePoint;
+
     @Schema(description = "状态", example = "1")
     private String status;
 

+ 43 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/person/info/PersonSimpleRespVO.java

@@ -0,0 +1,43 @@
+package com.citu.module.menduner.system.controller.base.person.info;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+@Schema(description = "人才简易信息 Response VO")
+@Data
+public class PersonSimpleRespVO {
+
+    @Schema(description = "id", requiredMode = Schema.RequiredMode.REQUIRED, example = "25036")
+    private Long id;
+
+    @Schema(description = "用户id")
+    private Long userId;
+
+    @Schema(description = "真实姓名", example = "王五")
+    private String name;
+
+    @Schema(description = "用户性别")
+    private String sex;
+
+    @Schema(description = "头像地址")
+    private String avatar;
+
+    @Schema(description = "出生日期")
+    private LocalDateTime birthday;
+
+    @Schema(description = "求职状态(0离职-随时到岗 1在职-月内到岗 2在职-考虑机会 3在职-暂不考虑)", example = "1")
+    private String jobStatus;
+
+    @Schema(description = "工作经验", example = "1")
+    private String expType;
+
+    @Schema(description = "学历", example = "2")
+    private String eduType;
+
+    @Schema(description = "更新时间")
+    private LocalDateTime updateTime;
+
+
+}

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

@@ -22,8 +22,17 @@ public class UserAccountPageReqVO extends PageParam {
     @Schema(description = "用户id", example = "19716")
     private Long userId;
 
-    @Schema(description = "账户余额")
-    private BigDecimal balance;
+    @Schema(description = "名称", example = "x女士")
+    private String userName;
+
+    @Schema(description = "用户性别")
+    private String sex;
+
+    @Schema(description = "手机号码")
+    private String phone;
+
+    @Schema(description = "邮箱")
+    private String email;
 
     @Schema(description = "创建时间")
     @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)

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

@@ -26,6 +26,10 @@ public class UserAccountRespVO {
     @ExcelProperty("账户余额")
     private BigDecimal balance;
 
+    @Schema(description = "积分数量")
+    @ExcelProperty("积分数量")
+    private Integer point;
+
     @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
     @ExcelProperty("创建时间")
     private LocalDateTime createTime;

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

@@ -1,5 +1,6 @@
 package com.citu.module.menduner.system.controller.base.user.account;
 
+import com.alibaba.excel.annotation.ExcelProperty;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 
@@ -20,4 +21,7 @@ public class UserAccountSaveReqVO {
     @Schema(description = "账户余额")
     private BigDecimal balance;
 
+    @Schema(description = "积分数量")
+    private Integer point;
+
 }

+ 4 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/convert/EnterpriseConvert.java

@@ -9,6 +9,7 @@ import com.citu.module.menduner.system.controller.appadmin.enterprise.vo.AppAdmi
 import com.citu.module.menduner.system.controller.appadmin.enterprise.vo.AppAdminEnterpriseBusinessSaveReqVO;
 import com.citu.module.menduner.system.controller.appadmin.enterprise.vo.AppAdminEnterpriseRespVO;
 import com.citu.module.menduner.system.controller.appadmin.enterprise.vo.AppAdminEnterpriseSaveReqVO;
+import com.citu.module.menduner.system.controller.appadmin.user.vo.AppAdminEnterpriseAccountRespVO;
 import com.citu.module.menduner.system.controller.appadmin.user.vo.AppAdminUserRespVO;
 import com.citu.module.menduner.system.controller.base.contact.AppEnterpriseUserContactRespVO;
 import com.citu.module.menduner.system.dal.dataobject.enterprise.*;
@@ -56,4 +57,7 @@ public interface EnterpriseConvert {
     EnterpriseBusinessDO convert14(AppAdminEnterpriseBusinessSaveReqVO reqVO);
 
     AppAdminEnterpriseBusinessRespVO convert15(EnterpriseBusinessDO bean);
+
+
+    AppAdminEnterpriseAccountRespVO convert16(EnterpriseAccountDO bean);
 }

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

@@ -1,7 +1,5 @@
 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;
 
@@ -9,6 +7,4 @@ import org.mapstruct.factory.Mappers;
 public interface HireCommissionRatioConvert {
 
     HireCommissionRatioConvert INSTANCE = Mappers.getMapper(HireCommissionRatioConvert.class);
-
-    AppAdminHireCommissionRatioRespVO convert(HireCommissionRatioDO bean);
 }

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

@@ -0,0 +1,14 @@
+package com.citu.module.menduner.system.convert;
+
+import com.citu.module.menduner.system.controller.app.user.vo.AppUserAccountRespVO;
+import com.citu.module.menduner.system.dal.dataobject.user.UserAccountDO;
+import org.mapstruct.Mapper;
+import org.mapstruct.factory.Mappers;
+
+@Mapper
+public interface UserConvert {
+
+    UserConvert INSTANCE = Mappers.getMapper(UserConvert.class);
+
+    AppUserAccountRespVO convert(UserAccountDO userAccountDO);
+}

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

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

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

@@ -30,16 +30,16 @@ public class HireCommissionRatioDO extends BaseDO {
     @TableId
     private Long id;
     /**
-     * 企业id
+     * 猎头佣金比例(0.000-100.000)
      */
-    private Long enterpriseId;
+    private BigDecimal headhuntRate;
     /**
-     * 用户id
+     * 推荐人佣金比例(0.000-100.000)
      */
-    private Long userId;
+    private BigDecimal recommendRate;
     /**
-     * 佣金比例(0.000-100.000)
+     * 投递人佣金比例(0.000-100.000)
      */
-    private BigDecimal rate;
+    private BigDecimal cvRate;
 
 }

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

@@ -120,6 +120,10 @@ public class JobAdvertisedDO extends TenantBaseDO {
      * 雇佣金额
      */
     private BigDecimal hirePrice;
+    /**
+     * 雇佣积分
+     */
+    private BigDecimal hirePoint;
     /**
      * 职位状态
      * <p>

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

@@ -37,5 +37,9 @@ public class UserAccountDO extends BaseDO {
      * 账户余额
      */
     private BigDecimal balance;
+    /**
+     * 积分数量
+     */
+    private Integer point;
 
 }

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

@@ -136,6 +136,11 @@ public class ESJobAdvertisedMergeDO extends ESBaseDO {
      */
     @Field(type = FieldType.Double)
     private BigDecimal hirePrice;
+    /**
+     * 雇佣积分
+     */
+    @Field(type = FieldType.Integer)
+    private BigDecimal hirePoint;
     /**
      * 职位状态
      * <p>

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

@@ -0,0 +1,142 @@
+package com.citu.module.menduner.system.dal.mysql.enterprise;
+
+
+import cn.hutool.core.lang.Assert;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+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.admin.enterprise.vo.EnterpriseAccountPageRespVO;
+import com.citu.module.menduner.system.controller.admin.user.vo.UserAccountPageRespVO;
+import com.citu.module.menduner.system.controller.base.enterprise.account.EnterpriseAccountPageReqVO;
+import com.citu.module.menduner.system.dal.dataobject.enterprise.EnterpriseAccountDO;
+import com.citu.module.menduner.system.dal.dataobject.enterprise.EnterpriseDO;
+import com.citu.module.menduner.system.dal.dataobject.enterprise.EnterpriseUserBindDO;
+import com.citu.module.menduner.system.dal.dataobject.person.PersonInfoDO;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 企业账户 Mapper
+ *
+ * @author Rayson
+ */
+@Mapper
+public interface EnterpriseAccountMapper extends BaseMapperX<EnterpriseAccountDO> {
+
+    default PageResult<EnterpriseAccountDO> selectPage(EnterpriseAccountPageReqVO reqVO) {
+        return selectPage(reqVO, new LambdaQueryWrapperX<EnterpriseAccountDO>()
+                .eqIfPresent(EnterpriseAccountDO::getEnterpriseId, reqVO.getEnterpriseId())
+                .eqIfPresent(EnterpriseAccountDO::getUserId, reqVO.getUserId())
+                .betweenIfPresent(EnterpriseAccountDO::getCreateTime, reqVO.getCreateTime())
+                .orderByDesc(EnterpriseAccountDO::getId));
+    }
+
+    default PageResult<EnterpriseAccountPageRespVO> page(EnterpriseAccountPageReqVO reqVO) {
+        MPJLambdaWrapperX<EnterpriseAccountDO> query = new MPJLambdaWrapperX<>();
+        query.selectAll(EnterpriseAccountDO.class);
+        query.selectAs(EnterpriseDO::getName, EnterpriseAccountPageRespVO::getEnterpriseName);
+        query.selectAs(EnterpriseDO::getAnotherName, EnterpriseAccountPageRespVO::getAnotherName);
+        query.selectAs(EnterpriseDO::getLogoUrl, EnterpriseAccountPageRespVO::getLogoUrl);
+
+        query.selectAs(EnterpriseUserBindDO::getName, EnterpriseAccountPageRespVO::getUserName);
+        query.selectAs(EnterpriseUserBindDO::getSex, EnterpriseAccountPageRespVO::getSex);
+        query.selectAs(EnterpriseUserBindDO::getAvatar, EnterpriseAccountPageRespVO::getAvatar);
+        query.selectAs(EnterpriseUserBindDO::getPhone, UserAccountPageRespVO::getPhone);
+        query.selectAs(EnterpriseUserBindDO::getEmail, UserAccountPageRespVO::getEmail);
+
+        query.innerJoin(EnterpriseDO.class, EnterpriseDO::getId, EnterpriseAccountDO::getEnterpriseId);
+        query.innerJoin(EnterpriseUserBindDO.class, on ->
+                on.eq(EnterpriseUserBindDO::getEnterpriseId, EnterpriseAccountDO::getEnterpriseId)
+                        .eq(EnterpriseUserBindDO::getUserId, EnterpriseAccountDO::getUserId)
+        );
+        query.eqIfPresent(EnterpriseAccountDO::getEnterpriseId, reqVO.getEnterpriseId())
+                .eqIfPresent(EnterpriseAccountDO::getUserId, reqVO.getUserId())
+                .likeIfExists(EnterpriseUserBindDO::getName, reqVO.getUserName())
+                .eqIfExists(EnterpriseUserBindDO::getSex, reqVO.getSex())
+                .likeIfExists(EnterpriseUserBindDO::getPhone, reqVO.getPhone())
+                .likeIfExists(EnterpriseUserBindDO::getEmail, reqVO.getEmail());
+
+        query.betweenIfPresent(EnterpriseAccountDO::getCreateTime, reqVO.getCreateTime())
+                .orderByDesc(EnterpriseAccountDO::getUpdateTime);
+
+
+        return selectJoinPage(reqVO, EnterpriseAccountPageRespVO.class, query);
+    }
+
+    default EnterpriseAccountDO selectByEnterpriseId(Long enterpriseId, Long userId) {
+        return selectOne(new LambdaQueryWrapperX<EnterpriseAccountDO>()
+                .eqIfPresent(EnterpriseAccountDO::getEnterpriseId, enterpriseId)
+                .eq(EnterpriseAccountDO::getEnterpriseId, userId)
+
+        );
+    }
+
+
+    /**
+     * 更新用户积分(增加)
+     *
+     * @param enterpriseId 企业编号
+     * @param userId       用户编号
+     * @param incrCount    增加积分(正数)
+     */
+    default void updatePointIncr(Long enterpriseId, Long userId, Integer incrCount) {
+        Assert.isTrue(incrCount > 0);
+        LambdaUpdateWrapper<EnterpriseAccountDO> lambdaUpdateWrapper = new LambdaUpdateWrapper<EnterpriseAccountDO>()
+                .setSql(" point = point + " + incrCount)
+                .eq(EnterpriseAccountDO::getEnterpriseId, enterpriseId)
+                .eq(EnterpriseAccountDO::getUserId, userId);
+        update(null, lambdaUpdateWrapper);
+    }
+
+    /**
+     * 更新用户积分(减少)
+     *
+     * @param enterpriseId 企业编号
+     * @param userId       用户编号
+     * @param incrCount    增加积分(负数)
+     * @return 更新行数
+     */
+    default int updatePointDecr(Long enterpriseId, Long userId, Integer incrCount) {
+        Assert.isTrue(incrCount < 0);
+        LambdaUpdateWrapper<EnterpriseAccountDO> lambdaUpdateWrapper = new LambdaUpdateWrapper<EnterpriseAccountDO>()
+                .setSql(" point = point + " + incrCount) // 负数,所以使用 + 号
+                .eq(EnterpriseAccountDO::getEnterpriseId, enterpriseId)
+                .eq(EnterpriseAccountDO::getUserId, userId);
+        return update(null, lambdaUpdateWrapper);
+    }
+
+    /**
+     * 更新用户余额(增加)
+     *
+     * @param enterpriseId 企业编号
+     * @param userId       用户编号
+     * @param incrCount    增加余额(正数)
+     */
+    default void updateBalanceIncr(Long enterpriseId, Long userId, Integer incrCount) {
+        Assert.isTrue(incrCount > 0);
+        LambdaUpdateWrapper<EnterpriseAccountDO> lambdaUpdateWrapper = new LambdaUpdateWrapper<EnterpriseAccountDO>()
+                .setSql(" balance = balance + " + incrCount)
+                .eq(EnterpriseAccountDO::getEnterpriseId, enterpriseId)
+                .eq(EnterpriseAccountDO::getUserId, userId);
+        update(null, lambdaUpdateWrapper);
+    }
+
+    /**
+     * 更新用户余额(减少)
+     *
+     * @param enterpriseId 企业编号
+     * @param userId       用户编号
+     * @param incrCount    增加余额(负数)
+     * @return 更新行数
+     */
+    default int updateBalanceDecr(Long enterpriseId, Long userId, Integer incrCount) {
+        Assert.isTrue(incrCount < 0);
+        LambdaUpdateWrapper<EnterpriseAccountDO> lambdaUpdateWrapper = new LambdaUpdateWrapper<EnterpriseAccountDO>()
+                .setSql(" balance = balance + " + incrCount) // 负数,所以使用 + 号
+                .eq(EnterpriseAccountDO::getEnterpriseId, enterpriseId)
+                .eq(EnterpriseAccountDO::getUserId, userId);
+        return update(null, lambdaUpdateWrapper);
+    }
+
+}

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

@@ -60,6 +60,14 @@ public interface EnterpriseUserBindMapper extends BaseMapperX<EnterpriseUserBind
         );
     }
 
+    default List<EnterpriseUserBindDO> selectByEnterpriseIdAndPostId(Long enterpriseId, Long postId) {
+        return selectList(new LambdaQueryWrapperX<EnterpriseUserBindDO>()
+                .eqIfPresent(EnterpriseUserBindDO::getEnterpriseId, enterpriseId)
+                .eqIfPresent(EnterpriseUserBindDO::getPostId, postId)
+        );
+    }
+
+
 
     default PageResult<AppAdminUserRespVO> selectPage(AppAdminUserPageReqVO reqVO, Long enterpriseId) {
         MPJLambdaWrapperX<EnterpriseUserBindDO> wrapper = new MPJLambdaWrapperX<>();

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

@@ -18,16 +18,13 @@ public interface HireCommissionRatioMapper extends BaseMapperX<HireCommissionRat
 
     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){
+    default HireCommissionRatioDO selectByOne() {
         return selectOne(new LambdaQueryWrapperX<HireCommissionRatioDO>()
-                .eq(HireCommissionRatioDO::getEnterpriseId, enterpriseId)
-                .eq(HireCommissionRatioDO::getUserId, userId));
+                .last("LIMIT 1"));
     }
 
 }

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

@@ -1,14 +1,18 @@
 package com.citu.module.menduner.system.dal.mysql.hire;
 
+import com.citu.framework.common.pojo.PageParam;
 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.app.hire.vo.AppHireJobCvRelQueryReqVO;
+import com.citu.module.menduner.system.controller.app.hire.vo.AppHireJobCvRelRespVO;
 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.enterprise.EnterpriseDO;
 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;
@@ -39,7 +43,6 @@ public interface HireJobCvRelMapper extends BaseMapperX<HireJobCvRelDO> {
                 .orderByDesc(HireJobCvRelDO::getId));
     }
 
-
     default PageResult<AppAdminHireJobCvRelRespVO> page(AppAdminHireJobCvRelPageReqVO reqVO) {
         // 职位投递userId inner 招聘职位userId and 职位投递userId inner 人才信息userId
         MPJLambdaWrapperX<HireJobCvRelDO> wrapper = new MPJLambdaWrapperX<>();
@@ -55,12 +58,12 @@ public interface HireJobCvRelMapper extends BaseMapperX<HireJobCvRelDO> {
         wrapper.eqIfExists(HireJobCvRelDO::getStatus, reqVO.getStatus());
 
         // 投递的职位 inner 人才信息 (投递人)
-        wrapper.innerJoin(PersonInfoDO.class, "person", PersonInfoDO::getUserId, HireJobCvRelDO::getRecommendUserId);
+        wrapper.innerJoin(PersonInfoDO.class, "person", PersonInfoDO::getUserId, HireJobCvRelDO::getUserId);
         // 人才相关的条件
         wrapper.likeIfExists("person.name", reqVO.getName());
 
         // 投递的职位 inner 人才信息 (推荐人)
-        wrapper.innerJoin(PersonInfoDO.class, PersonInfoDO::getUserId, HireJobCvRelDO::getRecommendUserId);
+        wrapper.innerJoin(PersonInfoDO.class,"recommend", PersonInfoDO::getUserId, HireJobCvRelDO::getRecommendUserId);
         // 人才相关的条件
         wrapper.likeIfExists("recommend.name", reqVO.getName());
 
@@ -68,6 +71,27 @@ public interface HireJobCvRelMapper extends BaseMapperX<HireJobCvRelDO> {
         return selectJoinPage(reqVO, AppAdminHireJobCvRelRespVO.class, wrapper);
     }
 
+    default PageResult<AppHireJobCvRelRespVO> page(AppHireJobCvRelQueryReqVO reqVO, Long userId) {
+        // 职位投递userId inner 招聘职位userId and 职位投递userId inner 人才信息userId
+        MPJLambdaWrapperX<HireJobCvRelDO> wrapper = new MPJLambdaWrapperX<>();
+        wrapper.selectAsClass(HireJobCvRelDO.class, AppHireJobCvRelRespVO.class);
+        wrapper.selectAssociation(JobAdvertisedDO.class, AppHireJobCvRelRespVO::getJob);
+        wrapper.selectAssociation(PersonInfoDO.class, AppHireJobCvRelRespVO::getRecommendPerson);
+        wrapper.selectAssociation(EnterpriseDO.class, AppHireJobCvRelRespVO::getEnterprise);
+        // 投递的职位 inner 招聘职位
+        wrapper.innerJoin(JobAdvertisedDO.class, JobAdvertisedDO::getId, HireJobCvRelDO::getJobId);
+        // 投递的职位 inner 企业信息
+        wrapper.innerJoin(EnterpriseDO.class, EnterpriseDO::getId, HireJobCvRelDO::getEnterpriseId);
+        // 投递的职位 inner 人才信息 (推荐人)
+        wrapper.innerJoin(PersonInfoDO.class, PersonInfoDO::getUserId, HireJobCvRelDO::getRecommendUserId);
+
+        wrapper.eq(HireJobCvRelDO::getRecommendUserId, userId);
+        wrapper.eq(HireJobCvRelDO::getStatus, reqVO.getStatus());
+
+        wrapper.orderByDesc(HireJobCvRelDO::getUpdateTime);
+        return selectJoinPage(reqVO, AppHireJobCvRelRespVO.class, wrapper);
+    }
+
     /**
      * 获取投递简历中的推荐人列表
      **/
@@ -81,4 +105,9 @@ public interface HireJobCvRelMapper extends BaseMapperX<HireJobCvRelDO> {
         return selectJoinList(AppAdminPersonSimpleRespVO.class, wrapper);
     }
 
+
+    default List<HireJobCvRelDO> selectByRecommendUserId(Long userId) {
+        return selectList(HireJobCvRelDO::getRecommendUserId, userId);
+    }
+
 }

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

@@ -3,13 +3,8 @@ package com.citu.module.menduner.system.dal.mysql.person;
 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.person.vo.AppAdminPersonPageReqVO;
-import com.citu.module.menduner.system.controller.appadmin.person.vo.AppAdminPersonSimpleRespVO;
 import com.citu.module.menduner.system.controller.base.person.info.PersonInfoPageReqVO;
-import com.citu.module.menduner.system.dal.dataobject.eduexp.EduExpDO;
 import com.citu.module.menduner.system.dal.dataobject.person.PersonInfoDO;
-import com.citu.module.menduner.system.dal.dataobject.workexp.WorkExpDO;
 import org.apache.ibatis.annotations.Mapper;
 
 /**

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

@@ -1,13 +1,21 @@
 package com.citu.module.menduner.system.dal.mysql.user;
 
 
+import cn.hutool.core.lang.Assert;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 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.admin.user.vo.UserAccountPageRespVO;
 import com.citu.module.menduner.system.controller.base.user.account.UserAccountPageReqVO;
+import com.citu.module.menduner.system.dal.dataobject.enterprise.EnterpriseAccountDO;
+import com.citu.module.menduner.system.dal.dataobject.person.PersonInfoDO;
 import com.citu.module.menduner.system.dal.dataobject.user.UserAccountDO;
 import org.apache.ibatis.annotations.Mapper;
 
+import java.math.BigDecimal;
+
 /**
  * 用户账户 Mapper
  *
@@ -19,9 +27,94 @@ 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));
     }
 
+    default PageResult<UserAccountPageRespVO> page(UserAccountPageReqVO reqVO) {
+        MPJLambdaWrapperX<UserAccountDO> query = new MPJLambdaWrapperX<>();
+        query.selectAll(UserAccountDO.class);
+        query.selectAs(PersonInfoDO::getName, UserAccountPageRespVO::getUserName);
+        query.selectAs(PersonInfoDO::getSex, UserAccountPageRespVO::getSex);
+        query.selectAs(PersonInfoDO::getAvatar, UserAccountPageRespVO::getAvatar);
+        query.selectAs(PersonInfoDO::getPhone, UserAccountPageRespVO::getPhone);
+        query.selectAs(PersonInfoDO::getEmail, UserAccountPageRespVO::getEmail);
+
+        query.innerJoin(PersonInfoDO.class, PersonInfoDO::getUserId, UserAccountDO::getUserId);
+        query.eqIfPresent(UserAccountDO::getUserId, reqVO.getUserId())
+                .likeIfExists(PersonInfoDO::getName, reqVO.getUserName())
+                .eqIfExists(PersonInfoDO::getSex, reqVO.getSex())
+                .likeIfExists(PersonInfoDO::getPhone, reqVO.getPhone())
+                .likeIfExists(PersonInfoDO::getEmail, reqVO.getEmail());
+
+        query.betweenIfPresent(UserAccountDO::getCreateTime, reqVO.getCreateTime())
+                .orderByDesc(UserAccountDO::getUpdateTime);
+
+        return selectJoinPage(reqVO, UserAccountPageRespVO.class, query);
+    }
+
+
+    default UserAccountDO selectByUserId(Long userId) {
+        return selectOne(new LambdaQueryWrapperX<UserAccountDO>().eq(UserAccountDO::getUserId, userId));
+    }
+
+
+    /**
+     * 更新用户积分(增加)
+     *
+     * @param id        用户编号
+     * @param incrCount 增加积分(正数)
+     */
+    default void updatePointIncr(Long id, Integer incrCount) {
+        Assert.isTrue(incrCount > 0);
+        LambdaUpdateWrapper<UserAccountDO> lambdaUpdateWrapper = new LambdaUpdateWrapper<UserAccountDO>()
+                .setSql(" point = point + " + incrCount)
+                .eq(UserAccountDO::getUserId, id);
+        update(null, lambdaUpdateWrapper);
+    }
+
+    /**
+     * 更新用户积分(减少)
+     *
+     * @param id        用户编号
+     * @param incrCount 增加积分(负数)
+     * @return 更新行数
+     */
+    default int updatePointDecr(Long id, Integer incrCount) {
+        Assert.isTrue(incrCount < 0);
+        LambdaUpdateWrapper<UserAccountDO> lambdaUpdateWrapper = new LambdaUpdateWrapper<UserAccountDO>()
+                .setSql(" point = point + " + incrCount) // 负数,所以使用 + 号
+                .eq(UserAccountDO::getUserId, id);
+        return update(null, lambdaUpdateWrapper);
+    }
+
+    /**
+     * 更新用户余额(增加)
+     *
+     * @param id        用户编号
+     * @param incrCount 增加余额(正数)
+     */
+    default void updateBalanceIncr(Long id, BigDecimal incrCount) {
+        Assert.isTrue(incrCount.compareTo(BigDecimal.ZERO) > 0);
+        LambdaUpdateWrapper<UserAccountDO> lambdaUpdateWrapper = new LambdaUpdateWrapper<UserAccountDO>()
+                .setSql(" balance = balance + " + incrCount)
+                .eq(UserAccountDO::getUserId, id);
+        update(null, lambdaUpdateWrapper);
+    }
+
+    /**
+     * 更新用户余额(减少)
+     *
+     * @param id        用户编号
+     * @param incrCount 增加余额(负数)
+     * @return 更新行数
+     */
+    default int updateBalanceDecr(Long id, BigDecimal incrCount) {
+        Assert.isTrue(incrCount.compareTo(BigDecimal.ZERO) < 0);
+        LambdaUpdateWrapper<UserAccountDO> lambdaUpdateWrapper = new LambdaUpdateWrapper<UserAccountDO>()
+                .setSql(" balance = balance + " + incrCount) // 负数,所以使用 + 号
+                .eq(UserAccountDO::getUserId, id);
+        return update(null, lambdaUpdateWrapper);
+    }
+
 }

+ 59 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/enterprise/account/EnterpriseAccountService.java

@@ -0,0 +1,59 @@
+package com.citu.module.menduner.system.service.enterprise.account;
+
+import com.citu.framework.common.pojo.PageResult;
+import com.citu.module.menduner.system.controller.admin.enterprise.vo.EnterpriseAccountPageRespVO;
+import com.citu.module.menduner.system.controller.base.enterprise.account.EnterpriseAccountPageReqVO;
+import com.citu.module.menduner.system.dal.dataobject.enterprise.EnterpriseAccountDO;
+import com.citu.module.menduner.system.dal.dataobject.user.UserAccountDO;
+
+/**
+ * 企业账户 Service 接口
+ *
+ * @author Rayson
+ */
+public interface EnterpriseAccountService {
+
+    /**
+     * 获得企业账户分页
+     *
+     * @param pageReqVO 分页查询
+     * @return 企业账户分页
+     */
+    PageResult<EnterpriseAccountDO> page(EnterpriseAccountPageReqVO pageReqVO);
+
+    /**
+     * 获得企业账户分页
+     *
+     * @param pageReqVO 分页查询
+     * @return 企业账户分页
+     */
+    PageResult<EnterpriseAccountPageRespVO> page2(EnterpriseAccountPageReqVO pageReqVO);
+
+    /**
+     * 更新用户的积分
+     *
+     * @param enterpriseId 企业编号
+     * @param userId 用户编号
+     * @param point  积分数量
+     * @return 更新结果
+     */
+    boolean updatePoint(Long enterpriseId,Long userId, Integer point);
+
+    /**
+     * 如果企业账户不存在,则创建
+     *
+     * @param enterpriseId 企业编号
+     * @param userId 用户编号
+     * @return 账户对象
+     */
+    EnterpriseAccountDO createUserPointIfAbsent(Long enterpriseId,Long userId);
+
+
+    // ========== 招聘端 ==========
+    /**
+     * 获取企业账户信息
+     *
+     * @return 账户对象
+     */
+    EnterpriseAccountDO get();
+}

+ 72 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/enterprise/account/EnterpriseAccountServiceImpl.java

@@ -0,0 +1,72 @@
+package com.citu.module.menduner.system.service.enterprise.account;
+
+import com.baomidou.dynamic.datasource.annotation.DSTransactional;
+import com.citu.framework.common.pojo.PageResult;
+import com.citu.framework.security.core.LoginUser;
+import com.citu.module.menduner.common.util.LoginUserContext;
+import com.citu.module.menduner.system.controller.admin.enterprise.vo.EnterpriseAccountPageRespVO;
+import com.citu.module.menduner.system.controller.base.enterprise.account.EnterpriseAccountPageReqVO;
+import com.citu.module.menduner.system.dal.dataobject.enterprise.EnterpriseAccountDO;
+import com.citu.module.menduner.system.dal.mysql.enterprise.EnterpriseAccountMapper;
+import org.springframework.stereotype.Service;
+import org.springframework.validation.annotation.Validated;
+
+import javax.annotation.Resource;
+import java.math.BigDecimal;
+
+/**
+ * 企业账户 Service 实现类
+ *
+ * @author Rayson
+ */
+@Service
+@Validated
+public class EnterpriseAccountServiceImpl implements EnterpriseAccountService {
+
+    @Resource
+    private EnterpriseAccountMapper enterpriseAccountMapper;
+
+    @Override
+    public PageResult<EnterpriseAccountDO> page(EnterpriseAccountPageReqVO pageReqVO) {
+        return enterpriseAccountMapper.selectPage(pageReqVO);
+    }
+
+    @Override
+    public PageResult<EnterpriseAccountPageRespVO> page2(EnterpriseAccountPageReqVO pageReqVO) {
+        return enterpriseAccountMapper.page(pageReqVO);
+    }
+
+
+    @Override
+    public boolean updatePoint(Long enterpriseId, Long userId, Integer point) {
+        if (point > 0) {
+            enterpriseAccountMapper.updatePointIncr(enterpriseId, userId, point);
+        } else if (point < 0) {
+            return enterpriseAccountMapper.updatePointDecr(enterpriseId, userId, point) > 0;
+        }
+        return true;
+    }
+
+    @Override
+    @DSTransactional
+    public EnterpriseAccountDO createUserPointIfAbsent(Long enterpriseId, Long userId) {
+        EnterpriseAccountDO accountDO = enterpriseAccountMapper.selectByEnterpriseId(enterpriseId, userId);
+        if (null != accountDO) {
+            return accountDO;
+        }
+        EnterpriseAccountDO entity = EnterpriseAccountDO.builder()
+                .enterpriseId(enterpriseId)
+                .userId(userId).balance(BigDecimal.ZERO).point(0).build();
+        enterpriseAccountMapper.insert(entity);
+        return entity;
+    }
+
+    @Override
+    public EnterpriseAccountDO get() {
+        LoginUser loginUser = LoginUserContext.get();
+        return createUserPointIfAbsent(
+                LoginUserContext.getEnterpriseId(loginUser),
+                LoginUserContext.getUserId(loginUser)
+        );
+    }
+}

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

@@ -139,4 +139,8 @@ public interface EnterpriseUserBindService {
      **/
     Boolean bindPost(Long id,Long postId);
 
+    /**
+     * 效验是否有该岗位的用户
+     **/
+    Boolean checkPost(Long postId);
 }

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

@@ -127,9 +127,11 @@ public class EnterpriseUserBindServiceImpl implements EnterpriseUserBindService
         // 获取企业岗位信息
         if (null != userBindDO.getPostId()) {
             EnterprisePostDO postDO = enterprisePostService.getEnterprisePost(userBindDO.getPostId());
-            resp.setPostNameCn(postDO.getNameCn());
-            resp.setPostNameEn(postDO.getNameEn());
-            resp.setPostCode(postDO.getCode());
+            if (null != postDO) {
+                resp.setPostNameCn(postDO.getNameCn());
+                resp.setPostNameEn(postDO.getNameEn());
+                resp.setPostCode(postDO.getCode());
+            }
         }
 
         //TODO 缓存获取在线状态
@@ -273,11 +275,28 @@ public class EnterpriseUserBindServiceImpl implements EnterpriseUserBindService
     @Override
     @DSTransactional
     public Boolean bindPost(Long id, Long postId) {
-        EnterpriseUserBindDO userBindDO = valid(id);
+        LoginUser loginUser = checkUserTypeIsAdmin();
+
+        // 查找操作的目标用户
+        EnterpriseUserBindDO userBindDO = enterpriseUserBindMapper
+                .selectByEnterpriseIdAndId(
+                        LoginUserContext.getEnterpriseId(loginUser), id);
+
+        if (null == userBindDO) {
+            throw exception(MDE_ENTERPRISE_USER_BIND_NOT_EXISTS);
+        }
         if (userBindDO.getPostId().equals(postId)) {
             return true;
         }
         userBindDO.setPostId(postId);
         return enterpriseUserBindMapper.updateById(userBindDO) == 1;
     }
+
+    @Override
+    public Boolean checkPost(Long postId) {
+        LoginUser loginUser = checkUserTypeIsAdmin();
+        return !enterpriseUserBindMapper
+                .selectByEnterpriseIdAndPostId(
+                        LoginUserContext.getEnterpriseId(loginUser), postId).isEmpty();
+    }
 }

+ 0 - 1
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/enterprise/post/EnterprisePostService.java

@@ -65,7 +65,6 @@ public interface EnterprisePostService {
      */
     List<AppEnterprisePostRespVO> selectListByEnterpriseId(Long enterpriseId);
 
-
     // ========== 招聘端 ==========
 
     /**

+ 1 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/enterprise/post/EnterprisePostServiceImpl.java

@@ -88,6 +88,7 @@ public class EnterprisePostServiceImpl implements EnterprisePostService {
         return EnterpriseConvert.INSTANCE.convertList2(list);
     }
 
+
     @Override
     @DSTransactional
     public Long create(AppAdminEnterprisePostSaveReqVO createReqVO) {

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

@@ -1,13 +1,11 @@
 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 接口
@@ -54,16 +52,10 @@ public interface HireCommissionRatioService {
      */
     PageResult<HireCommissionRatioDO> getHireCommissionRatioPage(HireCommissionRatioPageReqVO pageReqVO);
 
-    // ========== 招聘端 ==========
-
-    /**
-     * 获取佣金比例
-     **/
-    AppAdminHireCommissionRatioRespVO get();
-
     /**
-     * 修改佣金比例
-     * @param rate 佣金比例
-     **/
-    void updateRate(BigDecimal rate);
+     * 获得佣金比例信息
+     *
+     * @return 众聘-佣金比例分页
+     */
+    HireCommissionRatioDO get();
 }

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

@@ -1,26 +1,19 @@
 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 实现类
@@ -77,37 +70,8 @@ public class HireCommissionRatioServiceImpl implements HireCommissionRatioServic
     }
 
     @Override
-    public AppAdminHireCommissionRatioRespVO get() {
-        LoginUser loginUser = LoginUserContext.get();
-        HireCommissionRatioDO hireCommissionRatio = mapper.selectByEnterpriseIdAndUserId
-                (LoginUserContext.getEnterpriseId(loginUser), LoginUserContext.getUserId(loginUser));
-        return HireCommissionRatioConvert.INSTANCE.convert(hireCommissionRatio);
+    public HireCommissionRatioDO get() {
+        return mapper.selectByOne();
     }
 
-    @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);
-        }
-    }
 }

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

@@ -1,7 +1,11 @@
 package com.citu.module.menduner.system.service.hire;
 
 
+import com.citu.framework.common.pojo.PageParam;
 import com.citu.framework.common.pojo.PageResult;
+import com.citu.module.menduner.system.controller.app.hire.vo.AppHireJobCvRelQueryReqVO;
+import com.citu.module.menduner.system.controller.app.hire.vo.AppHireJobCvRelRespVO;
+import com.citu.module.menduner.system.controller.base.CommonRespVO;
 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;
@@ -54,6 +58,22 @@ public interface HireJobCvRelService {
      */
     PageResult<HireJobCvRelDO> getHireJobCvRelPage(HireJobCvRelPageReqVO pageReqVO);
 
+    // ========== 求职端 ==========
+
+    /**
+     * 获取推荐职位投递状态数量
+     *
+     * @return 推荐职位数量
+     */
+    List<CommonRespVO> getRecommendCount();
+
+    /**
+     * 获取推荐邀请投递的职位信息
+     *
+     * @param reqVO 分页查询
+     * @return 众聘-简历投递分页
+     */
+    PageResult<AppHireJobCvRelRespVO> page(AppHireJobCvRelQueryReqVO reqVO);
 
     // ========== 招聘端 ==========
 
@@ -84,4 +104,6 @@ public interface HireJobCvRelService {
      * @param id 投递简历id
      */
     boolean settlement(Long id);
+
+
 }

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

@@ -4,16 +4,26 @@ 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.common.util.LoginUserContext;
+import com.citu.module.menduner.system.controller.app.hire.vo.AppHireJobCvRelQueryReqVO;
+import com.citu.module.menduner.system.controller.app.hire.vo.AppHireJobCvRelRespVO;
+import com.citu.module.menduner.system.controller.base.CommonRespVO;
 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.dataobject.job.JobAdvertisedDO;
 import com.citu.module.menduner.system.dal.mysql.hire.HireJobCvRelMapper;
+import com.citu.module.menduner.system.dal.mysql.job.JobAdvertisedMapper;
 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.ArrayList;
+import java.util.Collections;
 import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
 
 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;
@@ -30,6 +40,7 @@ public class HireJobCvRelServiceImpl implements HireJobCvRelService {
     @Resource
     private HireJobCvRelMapper hireJobCvRelMapper;
 
+
     @Override
     public Long createHireJobCvRel(HireJobCvRelSaveReqVO createReqVO) {
         // 插入
@@ -74,6 +85,31 @@ public class HireJobCvRelServiceImpl implements HireJobCvRelService {
         return hireJobCvRelMapper.selectPage(pageReqVO);
     }
 
+    @Override
+    public List<CommonRespVO> getRecommendCount() {
+        List<CommonRespVO> list = new ArrayList<>();
+        List<HireJobCvRelDO> jobList = hireJobCvRelMapper
+                .selectByRecommendUserId(LoginUserContext.getUserId());
+        // 分组
+        Map<String, Long> groupedMap = jobList.stream()
+                .collect(
+                        Collectors.groupingBy(HireJobCvRelDO::getStatus, Collectors.counting())
+                );
+
+        for (Map.Entry<String, Long> entry : groupedMap.entrySet()) {
+            CommonRespVO respVO = new CommonRespVO();
+            respVO.setKey(entry.getKey());
+            respVO.setValue(entry.getValue().toString());
+            list.add(respVO);
+        }
+        return list;
+    }
+
+    @Override
+    public PageResult<AppHireJobCvRelRespVO> page(AppHireJobCvRelQueryReqVO reqVO) {
+        return hireJobCvRelMapper.page(reqVO,LoginUserContext.getUserId());
+    }
+
     @Override
     @DSTransactional
     public boolean look(Long id) {

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

@@ -1,11 +1,11 @@
 package com.citu.module.menduner.system.service.user;
 
 import com.citu.framework.common.pojo.PageResult;
+import com.citu.module.menduner.system.controller.admin.user.vo.UserAccountPageRespVO;
 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;
+import java.math.BigDecimal;
 
 /**
  * 用户账户 Service 接口
@@ -15,41 +15,55 @@ import javax.validation.Valid;
 public interface UserAccountService {
 
     /**
-     * 创建用户账户
+     * 获得用户账户分页
      *
-     * @param createReqVO 创建信息
-     * @return 编号
+     * @param pageReqVO 分页查询
+     * @return 用户账户分页
      */
-    Long createUserAccount(@Valid UserAccountSaveReqVO createReqVO);
+    PageResult<UserAccountDO> page(UserAccountPageReqVO pageReqVO);
 
     /**
-     * 更新用户账户
+     * 获得用户账户分页
      *
-     * @param updateReqVO 更新信息
+     * @param pageReqVO 分页查询
+     * @return 用户账户分页
      */
-    void updateUserAccount(@Valid UserAccountSaveReqVO updateReqVO);
+    PageResult<UserAccountPageRespVO> page2(UserAccountPageReqVO pageReqVO);
 
     /**
-     * 删除用户账户
+     * 更新用户的积分
      *
-     * @param id 编号
+     * @param userId 用户编号
+     * @param point  积分数量
+     * @return 更新结果
      */
-    void deleteUserAccount(Long id);
+    boolean updatePoint(Long userId, Integer point);
 
     /**
-     * 获得用户账户
+     * 更新用户的余额
      *
-     * @param id 编号
-     * @return 用户账户
+     * @param userId  用户编号
+     * @param balance 余额数量
+     * @return 更新结果
      */
-    UserAccountDO getUserAccount(Long id);
+    boolean updateBalance(Long userId, BigDecimal balance);
 
     /**
-     * 获得用户账户分页
+     * 如果用户账户不存在,则创建
      *
-     * @param pageReqVO 分页查询
-     * @return 用户账户分页
+     * @param userId 用户编号
+     * @return 账户对象
      */
-    PageResult<UserAccountDO> getUserAccountPage(UserAccountPageReqVO pageReqVO);
+    UserAccountDO createUserAccountIfAbsent(Long userId);
+
+    // ========== 求职端 ==========
+
+    /**
+     * 获取用户账户信息
+     *
+     * @return 账户对象
+     */
+    UserAccountDO get();
+
 
 }

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

@@ -1,19 +1,18 @@
 package com.citu.module.menduner.system.service.user;
 
 
+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.common.util.LoginUserContext;
+import com.citu.module.menduner.system.controller.admin.user.vo.UserAccountPageRespVO;
 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;
+import java.math.BigDecimal;
 
 /**
  * 用户账户 Service 实现类
@@ -28,45 +27,57 @@ public class UserAccountServiceImpl implements UserAccountService {
     private UserAccountMapper userAccountMapper;
 
     @Override
-    public Long createUserAccount(UserAccountSaveReqVO createReqVO) {
-        // 插入
-        UserAccountDO userAccount = BeanUtils.toBean(createReqVO, UserAccountDO.class);
-        userAccountMapper.insert(userAccount);
-        // 返回
-        return userAccount.getId();
+    public PageResult<UserAccountDO> page(UserAccountPageReqVO pageReqVO) {
+        return userAccountMapper.selectPage(pageReqVO);
     }
 
     @Override
-    public void updateUserAccount(UserAccountSaveReqVO updateReqVO) {
-        // 校验存在
-        validateUserAccountExists(updateReqVO.getId());
-        // 更新
-        UserAccountDO updateObj = BeanUtils.toBean(updateReqVO, UserAccountDO.class);
-        userAccountMapper.updateById(updateObj);
+    public PageResult<UserAccountPageRespVO> page2(UserAccountPageReqVO pageReqVO) {
+        return userAccountMapper.page(pageReqVO);
     }
 
     @Override
-    public void deleteUserAccount(Long id) {
-        // 校验存在
-        validateUserAccountExists(id);
-        // 删除
-        userAccountMapper.deleteById(id);
+    public boolean updatePoint(Long userId, Integer point) {
+        if (point > 0) {
+            userAccountMapper.updatePointIncr(userId, point);
+        } else if (point < 0) {
+            return userAccountMapper.updatePointDecr(userId, point) > 0;
+        }
+        return true;
     }
 
-    private void validateUserAccountExists(Long id) {
-        if (userAccountMapper.selectById(id) == null) {
-            throw exception(USER_ACCOUNT_NOT_EXISTS);
+    @Override
+    public boolean updateBalance(Long userId, BigDecimal balance) {
+        if (balance.compareTo(BigDecimal.ZERO) > 0) {
+            // 当余额为正数时,增加余额
+            userAccountMapper.updateBalanceIncr(userId, balance);
+        } else if (balance.compareTo(BigDecimal.ZERO) < 0) {
+            // 当余额为负数时,减少余额
+            // 注意:传递给方法的是绝对值,因为我们要减去一个正值
+            return userAccountMapper.updateBalanceDecr(userId, balance.abs()) > 0;
+
         }
+        return true;
     }
 
     @Override
-    public UserAccountDO getUserAccount(Long id) {
-        return userAccountMapper.selectById(id);
+    @DSTransactional
+    public UserAccountDO createUserAccountIfAbsent(Long userId) {
+        UserAccountDO accountDO = userAccountMapper.selectByUserId(userId);
+        if (null != accountDO) {
+            return accountDO;
+        }
+        UserAccountDO entity = UserAccountDO.builder()
+                .userId(userId)
+                .balance(BigDecimal.ZERO)
+                .point(0)
+                .build();
+        userAccountMapper.insert(entity);
+        return entity;
     }
 
     @Override
-    public PageResult<UserAccountDO> getUserAccountPage(UserAccountPageReqVO pageReqVO) {
-        return userAccountMapper.selectPage(pageReqVO);
+    public UserAccountDO get() {
+        return createUserAccountIfAbsent(LoginUserContext.getUserId());
     }
-
 }

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

@@ -104,21 +104,13 @@ public class HireCommissionRatioServiceImplTest extends BaseDbUnitTest {
     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));
 
         // 调用

+ 0 - 2
menduner/menduner-system-biz/src/test/java/com/citu/module/menduner/system/service/job/JobAdvertisedServiceImplTest.java

@@ -151,8 +151,6 @@ public class JobAdvertisedServiceImplTest extends BaseDbUnitTest {
         reqVO.setType(null);
         reqVO.setExpType(null);
         reqVO.setEduType(null);
-        reqVO.setContent(null);
-        reqVO.setRequirement(null);
         reqVO.setStatus(null);
         reqVO.setCreateTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28));