Bladeren bron

1、创建事件记录增加锁
2、增加人员简历简易的保存接口(众聘使用)
3、拆开简历查看接口
4、增加招聘端的账户记录接口
5、完善发布职位的扣除余额积分逻辑
6、完善结算众聘职位的增加余额积分逻辑

rayson 1 jaar geleden
bovenliggende
commit
7f2b14b116
24 gewijzigde bestanden met toevoegingen van 402 en 77 verwijderingen
  1. 6 0
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/dal/redis/RedisKeyConstants.java
  2. 43 18
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/service/event/EventRecordServiceImpl.java
  3. 6 6
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/service/event/EventTrackServiceImpl.java
  4. 1 0
      menduner/menduner-system-api/src/main/java/com/citu/module/menduner/system/enums/ErrorCodeConstants.java
  5. 5 3
      menduner/menduner-system-api/src/main/java/com/citu/module/menduner/system/enums/account/PointBizTypeEnum.java
  6. 8 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/app/person/AppPersonResumeController.java
  7. 35 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/app/person/resume/AppPersonInfoSaveSimpleReqVO.java
  8. 7 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/appadmin/hire/AppAdminHireJobCvRelController.java
  9. 9 4
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/appadmin/person/AppAdminPersonCvController.java
  10. 45 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/appadmin/record/AppAdminAccountRecordController.java
  11. 21 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/appadmin/record/vo/AppAdminAccountRecordPageReqVO.java
  12. 10 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/appadmin/record/vo/AppAdminAccountRecordRespVO.java
  13. 16 12
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/mysql/record/EnterpriseAccountRecordMapper.java
  14. 4 5
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/mysql/record/UserAccountRecordMapper.java
  15. 1 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/framework/datapermission/config/DataPermissionConfiguration.java
  16. 9 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/hire/HireCommissionRatioServiceImpl.java
  17. 131 6
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/hire/HireJobIntegrationServiceImpl.java
  18. 0 3
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/job/JobAdvertisedServiceImpl.java
  19. 9 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/person/info/PersonInfoService.java
  20. 17 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/person/info/PersonInfoServiceImpl.java
  21. 5 8
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/record/EnterpriseAccountRecordService.java
  22. 12 12
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/record/EnterpriseAccountRecordServiceImpl.java
  23. 1 0
      menduner/menduner-system-biz/src/main/resources/i18n/messages_en_US.properties
  24. 1 0
      menduner/menduner-system-biz/src/main/resources/i18n/messages_zh_CN.properties

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

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

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

@@ -2,6 +2,7 @@ package com.citu.module.menduner.reward.service.event;
 
 
 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.PageResult;
 import com.citu.framework.common.util.object.BeanUtils;
@@ -13,6 +14,8 @@ import com.citu.module.menduner.reward.dal.mysql.event.EventRecordMapper;
 import com.citu.module.menduner.reward.enums.event.EventMetricTypeEnum;
 import com.citu.module.menduner.system.api.account.UserAccountApi;
 import lombok.extern.slf4j.Slf4j;
+import org.redisson.api.RLock;
+import org.redisson.api.RedissonClient;
 import org.springframework.stereotype.Service;
 import org.springframework.validation.annotation.Validated;
 
@@ -21,8 +24,10 @@ import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.LocalTime;
 import java.util.List;
+import java.util.concurrent.TimeUnit;
 
 import static com.citu.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static com.citu.module.menduner.reward.dal.redis.RedisKeyConstants.EVENT_RECORD_LOCK;
 import static com.citu.module.menduner.reward.enums.ErrorCodeConstants.EVENT_RECORD_NOT_EXISTS;
 
 /**
@@ -44,6 +49,9 @@ public class EventRecordServiceImpl implements EventRecordService {
     @Resource
     private UserAccountApi userAccountApi;
 
+    @Resource
+    private RedissonClient redissonClient;
+
 
     @Override
     public Long createEventRecord(EventRecordSaveReqVO createReqVO) {
@@ -138,25 +146,42 @@ public class EventRecordServiceImpl implements EventRecordService {
     @Override
     @DSTransactional
     public void createEventRecord(Long userId, String url) {
-        //TODO 读多写多场景,不好使用缓存,暂时直接写库
-
-        // 查询今天记录
-        EventRecordDO record =
-                eventRecordMapper.get(userId, url, LocalDate.now().atStartOfDay());
-        if (null == record) {
-            // 没有今天的记录
-            //新增
-            eventRecordMapper.insert(EventRecordDO.builder()
-                    .userId(userId)
-                    .url(url)
-                    .date(LocalDate.now().atStartOfDay())
-                    .count(1)
-                    .build());
-        } else {
-            // 修改次数
-            record.setCount(record.getCount() + 1);
-            eventRecordMapper.updateById(record);
+        //TODO 读多写多场景,读写分离,不好使用缓存,暂时直接写库
+
+        // 尝试加锁
+        LocalDateTime time = LocalDate.now().atStartOfDay();
+        String lockKey = StrUtil.format(EVENT_RECORD_LOCK, userId, url, time);
+        RLock lock = redissonClient.getLock(lockKey);
+        try {
+            // 尝试获取锁,等待时间为30秒,锁自动续期时间为10分钟
+            if (lock.tryLock(30, 10, TimeUnit.MINUTES)) {
+
+                // 查询今天记录
+                EventRecordDO record =
+                        eventRecordMapper.get(userId, url, time);
+                if (null == record) {
+                    // 没有今天的记录
+                    //新增
+                    eventRecordMapper.insert(EventRecordDO.builder()
+                            .userId(userId)
+                            .url(url)
+                            .date(time)
+                            .count(1)
+                            .build());
+                } else {
+                    // 修改次数
+                    record.setCount(record.getCount() + 1);
+                    eventRecordMapper.updateById(record);
+                }
+
+            }
+        } catch (Exception ex) {
+            ex.printStackTrace();
+            throw new RuntimeException("Failed to acquire lock");
+        } finally {
+            lock.unlock();
         }
     }
 
+
 }

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

@@ -13,8 +13,6 @@ import com.citu.module.menduner.reward.core.PointRule;
 import com.citu.module.menduner.reward.core.RuleMatch;
 import com.citu.module.menduner.reward.dal.dataobject.config.Condition;
 import com.citu.module.menduner.reward.dal.dataobject.config.PointRuleConfigDO;
-import com.citu.module.menduner.system.enums.MathOperationEnum;
-import com.citu.module.menduner.system.enums.account.PointBizTypeEnum;
 import com.citu.module.menduner.reward.mq.message.UserPointSendMessage;
 import com.citu.module.menduner.reward.mq.producer.UserPointProducer;
 import com.citu.module.menduner.reward.rule.DynamicPointRule;
@@ -22,6 +20,8 @@ import com.citu.module.menduner.reward.rule.DynamicRuleAction;
 import com.citu.module.menduner.reward.service.config.PointRuleConfigService;
 import com.citu.module.menduner.system.api.url.MendunerSystemUrlApi;
 import com.citu.module.menduner.system.api.url.UrlInfoRespVO;
+import com.citu.module.menduner.system.enums.MathOperationEnum;
+import com.citu.module.menduner.system.enums.account.PointBizTypeEnum;
 import lombok.extern.slf4j.Slf4j;
 import org.jeasy.rules.api.Facts;
 import org.springframework.stereotype.Service;
@@ -127,8 +127,10 @@ public class EventTrackServiceImpl implements EventTrackService {
             // 将处理结果添加到响应列表中
             respVOList.add(respVO);
         }
-
+        // 调用服务记录事件访问
+        eventRecordService.createEventRecord(loginUser.getId(), url);
         return respVOList;
+
     }
 
     /**
@@ -154,9 +156,6 @@ public class EventTrackServiceImpl implements EventTrackService {
 
         // 执行规则匹配和相关操作
         execute(pointRule, loginUser, config, url, respVO);
-        // 调用服务记录事件访问
-        eventRecordService.createEventRecord(loginUser.getId(), url);
-
         return respVO;
     }
 
@@ -257,6 +256,7 @@ public class EventTrackServiceImpl implements EventTrackService {
 
     /**
      * 执行匹配
+     *
      * @param pointRule 积分规则对象
      **/
     private void match(PointRule pointRule,

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

@@ -318,6 +318,7 @@ public interface ErrorCodeConstants {
     ErrorCode HIRE_COMMISSION_RATIO_NOT_EXISTS = new ErrorCode(1_100_037_001, "佣金比例不存在");
     ErrorCode HIRE_COMMISSION_RATIO_RATE_NOT_NULL = new ErrorCode(1_100_037_002, "佣金比例不能为空");
     ErrorCode HIRE_COMMISSION_RATIO_RATE_NOT_LESS_THAN_ZERO = new ErrorCode(1_100_037_003, "佣金比例不能小于0");
+    ErrorCode HIRE_COMMISSION_RATIO_RATE_NOT_MORE_THAN_ONE = new ErrorCode(1_100_037_004, "佣金比例合计不能小于或大于100%");
 
     // ========== 用户账户 1_100_038_000 ==========
     ErrorCode USER_ACCOUNT_NOT_EXISTS = new ErrorCode(1_100_038_001, "用户账户不存在");

+ 5 - 3
menduner/menduner-system-api/src/main/java/com/citu/module/menduner/system/enums/account/PointBizTypeEnum.java

@@ -16,14 +16,16 @@ import java.util.Objects;
 @Getter
 public enum PointBizTypeEnum {
 
-    SIGN(1, "签到", "签到获得 {} 积分", true),
+    RECHARGE(1, "充值", "充值获得 {} 余额", true),
     ADMIN(2, "管理员修改", "管理员修改 {} 积分", true),
-    EVENT(3, "事件跟踪", "访问[{}],{}{} 积分", true),
     PUBLISH(3, "职位发布", "发布职位,扣除 {} 积分", false),
     PLATFORM_COMMISSION(4, "平台抽成", "平台抽取 {} ", true),
     RECOMMENDED_POSITIONS(5, "推荐职位", "推荐职位,获得 {}", true),
     DELIVERY_PERSON(6, "投递人", "投递人,获得 {}", true),
-    GIFT(7, "赠与", "赠与,获得 {}", true);
+    GIFT(7, "赠与", "赠与,获得 {}", true),
+    SIGN(98, "签到", "签到获得 {} 积分", true),
+    EVENT(99, "事件跟踪", "访问[{}],{}{} 积分", true),
+    ;
 
     /**
      * 类型

+ 8 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/app/person/AppPersonResumeController.java

@@ -12,6 +12,7 @@ import com.citu.module.menduner.system.controller.app.person.projectexp.AppProje
 import com.citu.module.menduner.system.controller.app.person.projectexp.AppProjectExpSaveReqVO;
 import com.citu.module.menduner.system.controller.app.person.resume.AppPersonAdvantageSaveReqVO;
 import com.citu.module.menduner.system.controller.app.person.resume.AppPersonInfoSaveReqVO;
+import com.citu.module.menduner.system.controller.app.person.resume.AppPersonInfoSaveSimpleReqVO;
 import com.citu.module.menduner.system.controller.app.person.trainexp.AppTrainExpRespVO;
 import com.citu.module.menduner.system.controller.app.person.trainexp.AppTrainExpSaveReqVO;
 import com.citu.module.menduner.system.controller.app.person.skill.AppPersonSkillRespVO;
@@ -84,6 +85,13 @@ public class AppPersonResumeController {
         return success(personInfoService.saveInfo(reqVO));
     }
 
+    @PreAuthenticated
+    @PostMapping("/info/simple/save")
+    @Operation(summary = "保存简易基本信息")
+    public CommonResult<Boolean> saveSimple(@Valid @RequestBody AppPersonInfoSaveSimpleReqVO reqVO) {
+        return success(personInfoService.saveSimple(reqVO));
+    }
+
     @PreAuthenticated
     @PostMapping("/job/status/update")
     @Operation(summary = "修改求职类型")

+ 35 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/app/person/resume/AppPersonInfoSaveSimpleReqVO.java

@@ -0,0 +1,35 @@
+package com.citu.module.menduner.system.controller.app.person.resume;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+
+@Data
+@Schema(description = "menduner 人才简历-简易基本信息 Request VO")
+public class AppPersonInfoSaveSimpleReqVO {
+
+    @NotBlank(message = "{1_100_001_003}")
+    @Schema(description = "真实姓名", example = "王五")
+    private String name;
+
+    @Schema(description = "用户性别")
+    private String sex;
+
+    @NotBlank(message = "{1_100_001_004}")
+    @Schema(description = "联系手机号")
+    private String phone;
+
+    @NotBlank(message = "{1_100_001_008}")
+    @Schema(description = "求职状态(0离职-随时到岗 1在职-月内到岗 2在职-考虑机会 3在职-暂不考虑)", example = "1")
+    private String jobStatus;
+
+    @NotBlank(message = "{1_100_001_006}")
+    @Schema(description = "工作经验", example = "1")
+    private String expType;
+
+    @NotBlank(message = "{1_100_001_007}")
+    @Schema(description = "学历", example = "2")
+    private String eduType;
+
+}

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

@@ -50,6 +50,13 @@ public class AppAdminHireJobCvRelController {
         return success(integrationService.getRecommendUser());
     }
 
+    @PreAuthenticated
+    @PostMapping("/look")
+    @Operation(summary = "查看简历附件")
+    public CommonResult<Boolean> look(@RequestParam("id") Long id) {
+        return success(service.look(id));
+    }
+
     @PreAuthenticated
     @PostMapping("/eliminate")
     @Operation(summary = "淘汰,不合适")

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

@@ -46,13 +46,18 @@ public class AppAdminPersonCvController {
     @PreAuthenticated
     @GetMapping("/detail")
     @Operation(summary = "获取人才在线简历详情")
-    public CommonResult<AppAdminPersonDetailRespVO> detail(
-            @RequestParam("id") Long id,
-            @RequestParam("userId") Long userId) {
-        jobCvRelService.look(id);
+    public CommonResult<AppAdminPersonDetailRespVO> detail(@RequestParam("userId") Long userId) {
         return success(personIntegrationService.detail(userId));
     }
 
+
+    @PreAuthenticated
+    @PostMapping("/look")
+    @Operation(summary = "查看简历附件")
+    public CommonResult<Boolean> look(@RequestParam("id") Long id) {
+        return success(jobCvRelService.look(id));
+    }
+
     @PreAuthenticated
     @PostMapping("/eliminate")
     @Operation(summary = "淘汰,不合适")

+ 45 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/appadmin/record/AppAdminAccountRecordController.java

@@ -0,0 +1,45 @@
+package com.citu.module.menduner.system.controller.appadmin.record;
+
+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.appadmin.record.vo.AppAdminAccountRecordPageReqVO;
+import com.citu.module.menduner.system.controller.appadmin.record.vo.AppAdminAccountRecordRespVO;
+import com.citu.module.menduner.system.controller.base.account.record.EnterpriseAccountRecordPageReqVO;
+import com.citu.module.menduner.system.controller.base.account.record.EnterpriseAccountRecordRespVO;
+import com.citu.module.menduner.system.convert.EnterpriseAccountRecordConvert;
+import com.citu.module.menduner.system.dal.dataobject.record.EnterpriseAccountRecordDO;
+import com.citu.module.menduner.system.service.record.EnterpriseAccountRecordService;
+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.validation.Valid;
+
+import static com.citu.framework.common.pojo.CommonResult.success;
+
+@Tag(name = "招聘端 - 企业账户变动记录")
+@RestController
+@RequestMapping("/menduner/system/enterprise/account/record")
+@Validated
+public class AppAdminAccountRecordController {
+
+    @Resource
+    private EnterpriseAccountRecordService service;
+
+    @GetMapping("/page")
+    @PreAuthenticated
+    @Operation(summary = "分页")
+    public CommonResult<PageResult<AppAdminAccountRecordRespVO>> page
+            (@Valid AppAdminAccountRecordPageReqVO pageVO) {
+        return success(service.page(pageVO));
+    }
+
+
+
+}

+ 21 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/appadmin/record/vo/AppAdminAccountRecordPageReqVO.java

@@ -0,0 +1,21 @@
+package com.citu.module.menduner.system.controller.appadmin.record.vo;
+
+import com.citu.framework.common.pojo.PageParam;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.ToString;
+
+@Schema(description = "招聘端 - 企业账户变动记录分页 Request VO")
+@Data
+@ToString(callSuper = true)
+public class AppAdminAccountRecordPageReqVO extends PageParam {
+
+    @Schema(description = "业务类型", example = "1")
+    private Integer bizType;
+
+    @Schema(description = "积分标题", example = "呵呵")
+    private String title;
+
+    @Schema(description = "记录类型(0 变动积分 | 1 变动余额)")
+    private String type;
+}

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

@@ -0,0 +1,10 @@
+package com.citu.module.menduner.system.controller.appadmin.record.vo;
+
+import com.citu.module.menduner.system.controller.base.account.record.EnterpriseAccountRecordRespVO;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+@Schema(description = "招聘端 - 企业账户变动积分记录 Response VO")
+@Data
+public class AppAdminAccountRecordRespVO extends EnterpriseAccountRecordRespVO {
+}

+ 16 - 12
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/mysql/record/EnterpriseAccountRecordMapper.java

@@ -1,12 +1,12 @@
 package com.citu.module.menduner.system.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.system.controller.appadmin.record.vo.AppAdminAccountRecordPageReqVO;
+import com.citu.module.menduner.system.controller.appadmin.record.vo.AppAdminAccountRecordRespVO;
 import com.citu.module.menduner.system.controller.base.account.record.EnterpriseAccountRecordPageReqVO;
 import com.citu.module.menduner.system.dal.dataobject.record.EnterpriseAccountRecordDO;
-import com.citu.module.menduner.system.dal.dataobject.record.UserAccountRecordDO;
 import com.citu.module.menduner.system.enums.account.AccountRecordTypeEnum;
 import com.github.yulichang.wrapper.MPJLambdaWrapper;
 import org.apache.ibatis.annotations.Mapper;
@@ -81,16 +81,20 @@ public interface EnterpriseAccountRecordMapper extends BaseMapperX<EnterpriseAcc
         return selectJoinOne(Integer.class, wrapperX);
     }
 
-    default PageResult<EnterpriseAccountRecordDO> selectPageByUserId(
-            Long enterpriseId,
-            Long userId,
-            String type,
-            PageParam pageVO) {
-        return selectPage(pageVO, new LambdaQueryWrapperX<EnterpriseAccountRecordDO>()
-                .eq(EnterpriseAccountRecordDO::getEnterpriseId, enterpriseId)
-                .eq(EnterpriseAccountRecordDO::getUserId, userId)
-                .eq(EnterpriseAccountRecordDO::getType, type)
-                .orderByDesc(EnterpriseAccountRecordDO::getCreateTime));
+
+    default PageResult<AppAdminAccountRecordRespVO> page
+            (AppAdminAccountRecordPageReqVO reqVO,
+             Long enterpriseId,
+             Long userId) {
+        MPJLambdaWrapper<EnterpriseAccountRecordDO> query = new MPJLambdaWrapper<>();
+        query.selectAll(EnterpriseAccountRecordDO.class);
+        query.eqIfExists(EnterpriseAccountRecordDO::getType, reqVO.getType());
+        query.eqIfExists(EnterpriseAccountRecordDO::getBizType, reqVO.getBizType());
+        query.likeIfExists(EnterpriseAccountRecordDO::getTitle, reqVO.getTitle());
+        query.eq(EnterpriseAccountRecordDO::getEnterpriseId, enterpriseId);
+        query.eq(EnterpriseAccountRecordDO::getUserId, userId);
+        query.orderByDesc(EnterpriseAccountRecordDO::getUpdateTime);
+        return selectJoinPage(reqVO, AppAdminAccountRecordRespVO.class, query);
     }
 
 }

+ 4 - 5
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/mysql/record/UserAccountRecordMapper.java

@@ -11,7 +11,6 @@ import com.github.yulichang.wrapper.MPJLambdaWrapper;
 import org.apache.ibatis.annotations.Mapper;
 
 import java.time.LocalDateTime;
-import java.util.List;
 
 /**
  * 用户账户变动记录 Mapper
@@ -39,9 +38,9 @@ public interface UserAccountRecordMapper extends BaseMapperX<UserAccountRecordDO
      * @param endDate   结束时间
      **/
     default Integer sumPoint(Long userId,
-                          String url,
-                          LocalDateTime startDate,
-                          LocalDateTime endDate) {
+                             String url,
+                             LocalDateTime startDate,
+                             LocalDateTime endDate) {
         MPJLambdaWrapper<UserAccountRecordDO> wrapperX = new MPJLambdaWrapper<UserAccountRecordDO>();
         wrapperX.selectSum(UserAccountRecordDO::getPoint);
         wrapperX.eq(UserAccountRecordDO::getUserId, userId);
@@ -55,7 +54,7 @@ public interface UserAccountRecordMapper extends BaseMapperX<UserAccountRecordDO
             wrapperX.le(UserAccountRecordDO::getCreateTime, endDate);
         }
 
-        return selectJoinOne(Integer.class,wrapperX);
+        return selectJoinOne(Integer.class, wrapperX);
     }
 
     default PageResult<UserAccountRecordDO> selectPageByUserId(Long userId, String type, PageParam pageVO) {

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

@@ -7,6 +7,7 @@ import com.citu.module.menduner.system.dal.dataobject.enterprise.EnterprisePostD
 import com.citu.module.menduner.system.dal.dataobject.hire.HireJobCvRelDO;
 import com.citu.module.menduner.system.dal.dataobject.job.JobAdvertisedDO;
 import com.citu.module.menduner.system.dal.dataobject.job.JobCvRelDO;
+import com.citu.module.menduner.system.dal.dataobject.record.EnterpriseAccountRecordDO;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 

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

@@ -13,8 +13,11 @@ 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_MORE_THAN_ONE;
 
 /**
  * 众聘-佣金比例 Service 实现类
@@ -80,6 +83,12 @@ public class HireCommissionRatioServiceImpl implements HireCommissionRatioServic
     public void save(HireCommissionRatioSaveReqVO reqVO) {
         HireCommissionRatioDO hireCommissionRatio =
                 get();
+
+        // 计算总比例率,确保比例之和不超过100%
+        BigDecimal totalRate = reqVO.getHeadhuntRate().add(reqVO.getRecommendRate()).add(reqVO.getCvRate());
+        if (totalRate.compareTo(BigDecimal.valueOf(100L)) != 0) {
+            throw exception(HIRE_COMMISSION_RATIO_RATE_NOT_MORE_THAN_ONE);
+        }
         if(null == hireCommissionRatio) {
             createHireCommissionRatio(reqVO);
             return;

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

@@ -6,20 +6,24 @@ import com.citu.framework.common.pojo.PageResult;
 import com.citu.module.menduner.system.controller.appadmin.hire.vo.AppAdminHireJobCvRelPageReqVO;
 import com.citu.module.menduner.system.controller.appadmin.hire.vo.AppAdminHireJobCvRelRespVO;
 import com.citu.module.menduner.system.controller.appadmin.person.vo.AppAdminPersonSimpleRespVO;
-import com.citu.module.menduner.system.controller.base.job.JobAdvertisedRespVO;
 import com.citu.module.menduner.system.dal.dataobject.hire.HireCommissionRatioDO;
 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.MathOperationEnum;
+import com.citu.module.menduner.system.enums.account.BalanceBizTypeEnum;
+import com.citu.module.menduner.system.enums.account.PointBizTypeEnum;
 import com.citu.module.menduner.system.enums.hire.HireJobCvRelStatusEnum;
-import com.citu.module.menduner.system.service.enterprise.account.EnterpriseAccountService;
+import com.citu.module.menduner.system.service.record.EnterpriseAccountRecordService;
 import com.citu.module.menduner.system.service.record.UserAccountRecordService;
 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.math.RoundingMode;
 import java.util.List;
 
 import static com.citu.framework.common.exception.util.ServiceExceptionUtil.exception;
@@ -44,7 +48,7 @@ public class HireJobIntegrationServiceImpl implements HireJobIntegrationService
     private UserAccountRecordService userAccountRecordService;
 
     @Resource
-    private EnterpriseAccountService enterpriseAccountService;
+    private EnterpriseAccountRecordService enterpriseAccountRecordService;
 
 
     @Override
@@ -78,10 +82,131 @@ public class HireJobIntegrationServiceImpl implements HireJobIntegrationService
             throw exception(HIRE_COMMISSION_RATIO_NOT_EXISTS);
         }
 
-       JobAdvertisedDO job = jobAdvertisedMapper.selectById(cv.getJobId());
+        JobAdvertisedDO job = jobAdvertisedMapper.selectById(cv.getJobId());
 
-        job.getHirePrice();
+        if (null != job.getHirePrice()) {
+            // 余额结算
+            priceSettlement(job, ratio, cv);
+        }
+
+        if (null != job.getHirePoint()) {
+            // 积分结算
+            pointSettlement(job, ratio, cv);
+        }
+        return true;
+    }
+
+    /**
+     * 余额结算
+     *
+     * @param job   职位信息
+     * @param ratio 佣金比例
+     * @param cv    投递信息
+     **/
+    public void priceSettlement(JobAdvertisedDO job, HireCommissionRatioDO ratio, HireJobCvRelDO cv) {
+        BigDecimal hirePrice = job.getHirePrice();
+        // 总比例
+        BigDecimal totalRate = BigDecimal.valueOf(100);
+        // 猎头佣金
+        BigDecimal headhuntPrice = hirePrice.multiply(ratio.getHeadhuntRate())
+                .divide(totalRate, 2, RoundingMode.HALF_UP);
+        // 推荐人佣金
+        BigDecimal recommendPrice = hirePrice.multiply(ratio.getRecommendRate())
+                .divide(totalRate, 2, RoundingMode.HALF_UP);
+        // 投递人佣金
+        BigDecimal cvPrice = hirePrice.multiply(ratio.getCvRate())
+                .divide(totalRate, 2, RoundingMode.HALF_UP);
+
+        // 猎头 (平台自己)
+        enterpriseAccountRecordService.createBalanceRecord(
+                1L,
+                1L,
+                BalanceBizTypeEnum.PLATFORM_COMMISSION.getName(),
+                MathOperationEnum.ADD,
+                headhuntPrice,
+                BalanceBizTypeEnum.PLATFORM_COMMISSION,
+                String.valueOf(job.getId())
+        );
+
+        // 推荐人
+        userAccountRecordService.createBalanceRecord(
+                cv.getRecommendUserId(),
+                BalanceBizTypeEnum.RECOMMENDED_POSITIONS.getName(),
+                MathOperationEnum.ADD,
+                recommendPrice,
+                BalanceBizTypeEnum.RECOMMENDED_POSITIONS,
+                String.valueOf(job.getId())
+        );
+
+        // 投递人
+        userAccountRecordService.createBalanceRecord(
+                cv.getUserId(),
+                BalanceBizTypeEnum.RECOMMENDED_POSITIONS.getName(),
+                MathOperationEnum.ADD,
+                cvPrice,
+                BalanceBizTypeEnum.RECOMMENDED_POSITIONS,
+                String.valueOf(job.getId())
+        );
+    }
 
-        return false;
+    /**
+     * 积分结算
+     *
+     * @param job   职位信息
+     * @param ratio 佣金比例
+     * @param cv    投递信息
+     **/
+    public void pointSettlement(JobAdvertisedDO job, HireCommissionRatioDO ratio, HireJobCvRelDO cv) {
+        Integer hirePoint = job.getHirePoint();
+        int totalRate = 100; // 总比例
+
+        // 猎头佣金
+        int headhuntPoint = (int) (hirePoint * ratio.getHeadhuntRate().intValue() / (long) totalRate);
+
+        // 推荐人佣金
+        int recommendPoint = (int) (hirePoint * ratio.getRecommendRate().intValue() / (long) totalRate);
+
+        // 投递人佣金
+        int cvPoint = (int) (hirePoint * ratio.getCvRate().intValue() / (long) totalRate);
+
+        // 由于比例之和可能不等于100%,剩余的点数可能需要进行分配或处理
+        int remainingPoint = hirePoint - (headhuntPoint + recommendPoint + cvPoint);
+
+        // 这里你可以选择将剩余点数分配给任意一方,或者按照比例再次分配
+        // 将剩余点数全部分配给猎头
+        headhuntPoint += remainingPoint;
+
+        // 猎头 (平台自己)
+        enterpriseAccountRecordService.createPointRecord(
+                1L,
+                1L,
+                PointBizTypeEnum.PLATFORM_COMMISSION.getName(),
+                MathOperationEnum.ADD,
+                headhuntPoint,
+                PointBizTypeEnum.PLATFORM_COMMISSION,
+                String.valueOf(job.getId())
+        );
+
+        // 推荐人
+        userAccountRecordService.createPointRecord(
+                cv.getRecommendUserId(),
+                "",
+                PointBizTypeEnum.RECOMMENDED_POSITIONS.getName(),
+                MathOperationEnum.ADD,
+                recommendPoint,
+                PointBizTypeEnum.RECOMMENDED_POSITIONS,
+                String.valueOf(job.getId())
+        );
+
+        // 投递人
+        userAccountRecordService.createPointRecord(
+                cv.getUserId(),
+                "",
+                PointBizTypeEnum.RECOMMENDED_POSITIONS.getName(),
+                MathOperationEnum.ADD,
+                cvPoint,
+                PointBizTypeEnum.RECOMMENDED_POSITIONS,
+                String.valueOf(job.getId())
+        );
     }
 }

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

@@ -67,9 +67,6 @@ public class JobAdvertisedServiceImpl implements JobAdvertisedService {
     @Resource
     private EnterpriseUserBindService userBindService;
 
-    @Resource
-    private EnterpriseAccountService enterpriseAccountService;
-
     @Resource
     private EnterpriseAccountRecordService accountRecordService;
 

+ 9 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/person/info/PersonInfoService.java

@@ -3,6 +3,7 @@ package com.citu.module.menduner.system.service.person.info;
 import com.citu.framework.common.pojo.PageResult;
 import com.citu.module.menduner.system.controller.app.person.resume.AppPersonAdvantageSaveReqVO;
 import com.citu.module.menduner.system.controller.app.person.resume.AppPersonInfoSaveReqVO;
+import com.citu.module.menduner.system.controller.app.person.resume.AppPersonInfoSaveSimpleReqVO;
 import com.citu.module.menduner.system.dal.dataobject.person.PersonInfoDO;
 import com.citu.module.menduner.system.controller.base.person.info.PersonInfoPageReqVO;
 import com.citu.module.menduner.system.controller.base.person.info.PersonInfoSaveReqVO;
@@ -71,6 +72,14 @@ public interface PersonInfoService {
      */
     boolean saveInfo(@Valid @RequestBody AppPersonInfoSaveReqVO reqVO);
 
+    /**
+     * 保存简历简易基本信息
+     *
+     * @param reqVO 基本信息
+     * @return 保存|成功|失败
+     */
+    boolean saveSimple(AppPersonInfoSaveSimpleReqVO reqVO);
+
     /**
      * 保存简历人才优势
      *

+ 17 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/person/info/PersonInfoServiceImpl.java

@@ -5,6 +5,7 @@ import com.citu.framework.common.pojo.PageResult;
 import com.citu.framework.common.util.object.BeanUtils;
 import com.citu.module.menduner.system.controller.app.person.resume.AppPersonAdvantageSaveReqVO;
 import com.citu.module.menduner.system.controller.app.person.resume.AppPersonInfoSaveReqVO;
+import com.citu.module.menduner.system.controller.app.person.resume.AppPersonInfoSaveSimpleReqVO;
 import com.citu.module.menduner.system.controller.base.person.info.PersonInfoPageReqVO;
 import com.citu.module.menduner.system.controller.base.person.info.PersonInfoSaveReqVO;
 import com.citu.module.menduner.system.dal.dataobject.person.PersonInfoDO;
@@ -97,6 +98,22 @@ public class PersonInfoServiceImpl implements PersonInfoService {
         return true;
     }
 
+    @Override
+    @DSTransactional
+    public boolean saveSimple(AppPersonInfoSaveSimpleReqVO reqVO) {
+        Long userId = LoginUserContext.getUserId();
+        PersonInfoDO info = personInfoMapper.selectOne(PersonInfoDO::getUserId, userId);
+        PersonInfoDO userInfo = BeanUtils.toBean(reqVO, PersonInfoDO.class);
+        userInfo.setUserId(userId);
+        if (null == info) {
+            personInfoMapper.insert(userInfo);
+        } else {
+            userInfo.setId(info.getId());
+            personInfoMapper.updateById(userInfo);
+        }
+        return true;
+    }
+
     @Override
     @DSTransactional // 单机+多数据源方案,使用 @DSTransactional 保证本地事务,以及数据源的切换
     public boolean saveAdvantage(AppPersonAdvantageSaveReqVO reqVO) {

+ 5 - 8
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/record/EnterpriseAccountRecordService.java

@@ -2,6 +2,8 @@ package com.citu.module.menduner.system.service.record;
 
 import com.citu.framework.common.pojo.PageParam;
 import com.citu.framework.common.pojo.PageResult;
+import com.citu.module.menduner.system.controller.appadmin.record.vo.AppAdminAccountRecordPageReqVO;
+import com.citu.module.menduner.system.controller.appadmin.record.vo.AppAdminAccountRecordRespVO;
 import com.citu.module.menduner.system.controller.base.account.record.EnterpriseAccountRecordPageReqVO;
 import com.citu.module.menduner.system.dal.dataobject.record.EnterpriseAccountRecordDO;
 import com.citu.module.menduner.system.enums.MathOperationEnum;
@@ -89,18 +91,13 @@ public interface EnterpriseAccountRecordService {
                           LocalDateTime endDate
     );
 
-    // ========== 求职端 ==========
+    // ========== 招聘端 ==========
 
     /**
      * 分页获取当前企业账户余额变动记录
      *
-     * @param userId 企业id
-     * @param type   记录类型
-     * @param pageVO 分页
+     * @param reqVO reqVO 查询参数
      * @return PageResult<PointRecordDO>
      **/
-    PageResult<EnterpriseAccountRecordDO> page(Long enterpriseId,
-                                               Long userId,
-                                               String type,
-                                               PageParam pageVO);
+    PageResult<AppAdminAccountRecordRespVO> page(AppAdminAccountRecordPageReqVO reqVO);
 }

+ 12 - 12
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/record/EnterpriseAccountRecordServiceImpl.java

@@ -4,10 +4,11 @@ import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
 import com.baomidou.dynamic.datasource.annotation.DSTransactional;
 import com.citu.framework.common.exception.util.ServiceExceptionUtil;
-import com.citu.framework.common.pojo.PageParam;
 import com.citu.framework.common.pojo.PageResult;
-import com.citu.module.menduner.system.api.account.AccountRespDTO;
-import com.citu.module.menduner.system.api.account.EnterpriseAccountApi;
+import com.citu.framework.security.core.LoginUser;
+import com.citu.module.menduner.common.util.LoginUserContext;
+import com.citu.module.menduner.system.controller.appadmin.record.vo.AppAdminAccountRecordPageReqVO;
+import com.citu.module.menduner.system.controller.appadmin.record.vo.AppAdminAccountRecordRespVO;
 import com.citu.module.menduner.system.controller.base.account.record.EnterpriseAccountRecordPageReqVO;
 import com.citu.module.menduner.system.dal.dataobject.enterprise.EnterpriseAccountDO;
 import com.citu.module.menduner.system.dal.dataobject.record.EnterpriseAccountRecordDO;
@@ -24,7 +25,6 @@ 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.module.menduner.system.enums.ErrorCodeConstants.USER_BALANCE_NOT_ENOUGH;
 import static com.citu.module.menduner.system.enums.ErrorCodeConstants.USER_POINT_NOT_ENOUGH;
@@ -63,7 +63,7 @@ public class EnterpriseAccountRecordServiceImpl implements EnterpriseAccountReco
             return;
         }
         // 1. 校验用户积分余额
-        EnterpriseAccountDO enterpriseAccount =  enterpriseAccountService
+        EnterpriseAccountDO enterpriseAccount = enterpriseAccountService
                 .createEnterpriseAccountIfAbsent(enterpriseId, userId);
         Integer userPoint = ObjectUtil.defaultIfNull(enterpriseAccount.getPoint(), 0);
         int totalPoint = userPoint + point; // 用户变动后的积分
@@ -123,7 +123,7 @@ public class EnterpriseAccountRecordServiceImpl implements EnterpriseAccountReco
         }
 
         // 1. 校验用户余额
-        EnterpriseAccountDO enterpriseAccount =  enterpriseAccountService.
+        EnterpriseAccountDO enterpriseAccount = enterpriseAccountService.
                 createEnterpriseAccountIfAbsent(enterpriseId, userId);
 
         BigDecimal userBalance = ObjectUtil.defaultIfNull(enterpriseAccount.getBalance(), BigDecimal.ZERO);
@@ -171,7 +171,7 @@ public class EnterpriseAccountRecordServiceImpl implements EnterpriseAccountReco
                                  String url,
                                  LocalDateTime startDate,
                                  LocalDateTime endDate) {
-        Integer pointCount = mapper.sumPoint(enterpriseId,userId, startDate, endDate);
+        Integer pointCount = mapper.sumPoint(enterpriseId, userId, startDate, endDate);
         if (null == pointCount) {
             return 0;
         }
@@ -179,10 +179,10 @@ public class EnterpriseAccountRecordServiceImpl implements EnterpriseAccountReco
     }
 
     @Override
-    public PageResult<EnterpriseAccountRecordDO> page(Long enterpriseId,
-                                                      Long userId,
-                                                      String type,
-                                                      PageParam pageVO) {
-        return mapper.selectPageByUserId(enterpriseId, userId, type, pageVO);
+    public PageResult<AppAdminAccountRecordRespVO> page(AppAdminAccountRecordPageReqVO reqVO) {
+        LoginUser loginUser = LoginUserContext.get();
+        return mapper.page(reqVO,
+                LoginUserContext.getEnterpriseId(loginUser),
+                LoginUserContext.getUserId(loginUser));
     }
 }

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

@@ -244,6 +244,7 @@
 1_100_037_001=Commission ratio does not exist
 1_100_037_002=Commission ratio cannot be empty
 1_100_037_003=Commission ratio cannot be less than 0
+1_100_037_004=The total commission ratio cannot be less than or greater than 100%
 # ========== 用户账户 1_100_038_000 ==========
 1_100_038_001=User account does not exist
 # ========== 账户相关 1_100_039_000 ============

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

@@ -247,6 +247,7 @@
 1_100_037_001=佣金比例不存在
 1_100_037_002=佣金比例不能为空
 1_100_037_003=佣金比例不能小于0
+1_100_037_004=佣金比例合计不能小于或大于100%
 # ========== 用户账户 1_100_038_000 ==========
 1_100_038_001=用户账户不存在
 # ========== 账户记录相关 1_100_039_000 ============