Browse Source

1、增加忠诚家里异步确认逻辑
2、增加用户邀请、企业注册用户增加积分逻辑
3、增加企业设置发布职位类型权限逻辑

rayson 9 tháng trước cách đây
mục cha
commit
63b6265c9e
30 tập tin đã thay đổi với 411 bổ sung57 xóa
  1. 34 0
      menduner/menduner-common/src/main/java/com/citu/module/menduner/common/enums/EventAsyncUrlEnum.java
  2. 4 4
      menduner/menduner-common/src/main/java/com/citu/module/menduner/common/enums/PointBizTypeEnum.java
  3. 32 0
      menduner/menduner-common/src/main/java/com/citu/module/menduner/common/message/EventAsyncConfirmMessage.java
  4. 43 0
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/mq/consumer/EventAsyncConfirmConsumer.java
  5. 1 0
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/mq/consumer/UserPointConsumer.java
  6. 1 1
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/mq/message/UserPointSendMessage.java
  7. 13 0
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/service/event/EventTrackService.java
  8. 44 25
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/service/event/EventTrackServiceImpl.java
  9. 1 1
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/service/signin/SignInRecordServiceImpl.java
  10. 1 1
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/api/account/UserAccountApiImpl.java
  11. 9 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/admin/enterprise/EnterpriseController.java
  12. 1 3
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/admin/user/UserAccountController.java
  13. 3 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/app/jobhunt/auth/vo/AppMdeAuthSmsRegisterReqVO.java
  14. 25 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/app/recruit/enterprise/AppRecruitEnterpriseController.java
  15. 8 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/app/recruit/job/AppRecruitJobAdvertisedController.java
  16. 19 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/enterprise/vo/EnterprisePubJobTypePermUpdateReqVO.java
  17. 3 1
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/enterprise/vo/EnterpriseSaveReqVO.java
  18. 1 1
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/dataobject/user/MdeUserDO.java
  19. 34 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/mq/producer/PointOperateProducer.java
  20. 23 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/auth/MdeAuthServiceImpl.java
  21. 12 1
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/enterprise/EnterpriseService.java
  22. 23 2
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/enterprise/EnterpriseServiceImpl.java
  23. 23 10
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/enterprise/register/EnterpriseRegisterServiceImpl.java
  24. 5 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/job/JobAdvertisedService.java
  25. 16 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/job/JobAdvertisedServiceImpl.java
  26. 1 1
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/record/UserAccountRecordService.java
  27. 3 1
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/record/UserAccountRecordServiceImpl.java
  28. 1 1
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/redeem/RedeemServiceImpl.java
  29. 10 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/user/MdeUserService.java
  30. 17 4
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/user/MdeUserServiceImpl.java

+ 34 - 0
menduner/menduner-common/src/main/java/com/citu/module/menduner/common/enums/EventAsyncUrlEnum.java

@@ -0,0 +1,34 @@
+package com.citu.module.menduner.common.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * 异步事件地址枚举
+ *
+ * @author Rayson
+ */
+@AllArgsConstructor
+@Getter
+public enum EventAsyncUrlEnum {
+
+    INVITE_USER("/event/async/invite/user", "邀请用户注册", true,"?userId="),
+    REGISTER_ENTERPRISE("/event/async/enterprise/register", "企业用户注册", false,null),
+
+    ;
+
+    private final String url;
+    private final String name;
+    private final boolean scene;
+    private final String sceneStr;
+
+    public static EventAsyncUrlEnum from(String url) {
+        for (EventAsyncUrlEnum eventAsyncUrlEnum : EventAsyncUrlEnum.values()) {
+            if (eventAsyncUrlEnum.getUrl().equals(url)) {
+                return eventAsyncUrlEnum;
+            }
+        }
+        return null;
+    }
+
+}

+ 4 - 4
menduner/menduner-system-api/src/main/java/com/citu/module/menduner/system/enums/account/PointBizTypeEnum.java → menduner/menduner-common/src/main/java/com/citu/module/menduner/common/enums/PointBizTypeEnum.java

@@ -1,7 +1,6 @@
-package com.citu.module.menduner.system.enums.account;
+package com.citu.module.menduner.common.enums;
 
 import cn.hutool.core.util.EnumUtil;
-import com.citu.module.menduner.system.enums.MathOperationEnum;
 import lombok.AllArgsConstructor;
 import lombok.Getter;
 
@@ -23,12 +22,13 @@ public enum PointBizTypeEnum {
     RECOMMENDED_POSITIONS(5, "推荐职位", "推荐职位,获得 {}", true),
     DELIVERY_PERSON(6, "投递人", "投递人,获得 {}", true),
     GIFT(7, "赠与", "赠与,获得 {}", true),
-    NOT_RECOMMENDED(8,"无推荐人,推荐人佣金给到平台","推荐职位,获得 {}",true),
+    NOT_RECOMMENDED(8, "无推荐人,推荐人佣金给到平台", "推荐职位,获得 {}", true),
     REDEEM(9, "积分兑换", "兑换,扣除 {} 积分", false),
+    INVITE(10, "邀请注册", "邀请注册,获得 {} 积分", true),
+    MEMBERSHIP(11, "购买会员套餐", "购买会员套餐,获取 {} 积分", true),
     SIGN(98, "签到", "签到获得 {} 积分", true),
     EVENT(99, "事件跟踪", "访问[{}],{}{} 积分", true),
     RECOMMEND_TASK(100, "完成任务", "[{}],{}{} 积分", true),
-
     ;
 
     /**

+ 32 - 0
menduner/menduner-common/src/main/java/com/citu/module/menduner/common/message/EventAsyncConfirmMessage.java

@@ -0,0 +1,32 @@
+package com.citu.module.menduner.common.message;
+
+import com.citu.module.menduner.common.enums.PointBizTypeEnum;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+@Schema(description = "事件异步确认")
+public class EventAsyncConfirmMessage {
+
+    public static final String TOPIC = "EVENT_ASYNC_CONFIRM_TOPIC";
+
+
+    @Schema(description = "用户id", example = "2")
+    private Long userId;
+
+    @Schema(description = "事件地址")
+    private String url;
+
+    @Schema(description = "场景")
+    private String scene;
+
+    @Schema(description = "事件类型")
+    private PointBizTypeEnum bizType;
+
+}

+ 43 - 0
menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/mq/consumer/EventAsyncConfirmConsumer.java

@@ -0,0 +1,43 @@
+package com.citu.module.menduner.reward.mq.consumer;
+
+import com.citu.module.menduner.common.message.EventAsyncConfirmMessage;
+import com.citu.module.menduner.common.enums.EventAsyncUrlEnum;
+import com.citu.module.menduner.reward.service.event.EventTrackService;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
+import org.apache.rocketmq.spring.core.RocketMQListener;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+
+/**
+ * 事件异步确认消费者
+ **/
+@Slf4j
+@Component
+@RocketMQMessageListener(
+        topic = EventAsyncConfirmMessage.TOPIC,
+        consumerGroup = EventAsyncConfirmMessage.TOPIC + "_CONSUMER"
+)
+public class EventAsyncConfirmConsumer implements RocketMQListener<EventAsyncConfirmMessage> {
+
+    @Resource
+    private EventTrackService eventTrackService;
+
+    @Override
+    public void onMessage(EventAsyncConfirmMessage message) {
+        log.info("事件异步确认 onMessage: {}", message);
+        EventAsyncUrlEnum enums = EventAsyncUrlEnum.from(message.getUrl());
+        if (null == enums) {
+            log.error("事件地址不存在,无法解析事件地址[{}]", message.getUrl());
+            return;
+        }
+
+        eventTrackService.trigger(message.getUserId(),
+                message.getUrl(),
+                enums.isScene()?message.getScene():null,
+                message.getBizType()
+                );
+
+    }
+}

+ 1 - 0
menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/mq/consumer/UserPointConsumer.java

@@ -47,6 +47,7 @@ public class UserPointConsumer implements RocketMQListener<UserPointSendMessage>
     @Override
     public void prepareStart(DefaultMQPushConsumer consumer) {
         // 不重试,失败说明扣除失败,额度不足等
+        // TODO 万一是服务没有上线,而不是异常,怎么处理?
         consumer.setMaxReconsumeTimes(0);
     }
 }

+ 1 - 1
menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/mq/message/UserPointSendMessage.java

@@ -1,7 +1,7 @@
 package com.citu.module.menduner.reward.mq.message;
 
 import com.citu.module.menduner.system.enums.MathOperationEnum;
-import com.citu.module.menduner.system.enums.account.PointBizTypeEnum;
+import com.citu.module.menduner.common.enums.PointBizTypeEnum;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.AllArgsConstructor;
 import lombok.Builder;

+ 13 - 0
menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/service/event/EventTrackService.java

@@ -1,5 +1,6 @@
 package com.citu.module.menduner.reward.service.event;
 
+import com.citu.module.menduner.common.enums.PointBizTypeEnum;
 import com.citu.module.menduner.reward.controller.base.common.TreeRespVO;
 import com.citu.module.menduner.reward.controller.base.config.TaskReqVO;
 import com.citu.module.menduner.reward.controller.base.config.TaskRespVO;
@@ -21,6 +22,7 @@ public interface EventTrackService {
 
     /**
      * 点击事件跟踪
+     *
      * @param url
      **/
     List<EventTrackPointRespVO> click(String url) throws Exception;
@@ -33,7 +35,18 @@ public interface EventTrackService {
 
     /**
      * 根据标记值获取标记事件的任务
+     *
      * @param reqVO 查询条件
      **/
     List<TaskRespVO> getMarkTask(TaskReqVO reqVO);
+
+    /**
+     * 触发事件
+     *
+     * @param userId  用户id
+     * @param url     触发地址
+     * @param scene   场景
+     * @param bizType 事件类型
+     **/
+    List<EventTrackPointRespVO> trigger(Long userId, String url, String scene, PointBizTypeEnum bizType);
 }

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

@@ -4,6 +4,7 @@ import cn.hutool.core.collection.CollectionUtil;
 import com.baomidou.dynamic.datasource.annotation.DSTransactional;
 import com.citu.framework.security.core.LoginUser;
 import com.citu.module.menduner.common.dto.TimeRangeBaseReqVO;
+import com.citu.module.menduner.common.enums.PointBizTypeEnum;
 import com.citu.module.menduner.common.util.LoginUserContext;
 import com.citu.module.menduner.reward.controller.base.common.TreeRespVO;
 import com.citu.module.menduner.reward.controller.base.config.TaskReqVO;
@@ -25,7 +26,6 @@ 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;
@@ -110,13 +110,13 @@ public class EventTrackServiceImpl implements EventTrackService {
     @Override
     public List<TaskRespVO> getMarkTask(TaskReqVO reqVO) {
         LocalDateTime[] timeRange = null;
-        if(TaskReqVO.TYPE_RECOMMEND.equals(reqVO.getType())) {
-            timeRange =generateDateTimeRange(TimeRangeBaseReqVO.builder().type(TimeRangeBaseReqVO.ALL).build());
-        }else {
+        if (TaskReqVO.TYPE_RECOMMEND.equals(reqVO.getType())) {
+            timeRange = generateDateTimeRange(TimeRangeBaseReqVO.builder().type(TimeRangeBaseReqVO.ALL).build());
+        } else {
             LocalDate today = LocalDate.now();
             LocalDateTime startOfDay = today.atStartOfDay();  // 当天的开始时间
             LocalDateTime endOfDay = today.atTime(23, 59, 59);  // 当天的结束时间
-            timeRange =generateDateTimeRange(TimeRangeBaseReqVO.builder()
+            timeRange = generateDateTimeRange(TimeRangeBaseReqVO.builder()
                     .type(TimeRangeBaseReqVO.TYPE_CUSTOM)
                     // time 是数组,第一个元素是开始时间,第二个元素是结束时间,改为当天的起始和结束
                     .time(new LocalDateTime[]{startOfDay, endOfDay})
@@ -142,39 +142,53 @@ public class EventTrackServiceImpl implements EventTrackService {
             return Collections.singletonList(EventTrackPointRespVO.builder().build());
         }
 
-        // 获取指定URL的积分规则配置列表
+        Long userId = loginUser.getId();
+
+        trigger(userId, url, null,null);
+        return respVOList;
+
+    }
+
+    @Override
+    @DSTransactional
+    public List<EventTrackPointRespVO> trigger(Long userId, String url, String scene, PointBizTypeEnum bizType) {
+        List<EventTrackPointRespVO> respVOList = new ArrayList<>();
+        // 获取指定URL的积分规则配置列表,因为是查询地址的配置,所以不需要带上动态的场景
         List<PointRuleConfigDO> configList = ruleConfigService.getByUrlList(url);
 
         if (CollectionUtil.isEmpty(configList)) {
             // 若未找到该URL的配置规则,同样返回一个空的响应对象
             return Collections.singletonList(EventTrackPointRespVO.builder().build());
         }
+        // 搜索出配置后,带入场景去判断处理
+        url = url + "?" + scene;
 
         // 遍历处理每个积分规则配置
         for (PointRuleConfigDO config : configList) {
             // 处理单个积分规则
-            EventTrackPointRespVO respVO = processPointRule(config, loginUser, url);
+            EventTrackPointRespVO respVO = processPointRule(config, userId, url,bizType);
             // 将处理结果添加到响应列表中
             respVOList.add(respVO);
         }
         // 调用服务记录事件访问
-        eventRecordService.createEventRecord(loginUser.getId(), url);
+        eventRecordService.createEventRecord(userId, url);
         return respVOList;
-
     }
 
     /**
      * 处理单个积分规则
      *
-     * @param config    规则配置
-     * @param loginUser 操作用户
-     * @param url       事件地址
+     * @param config 规则配置
+     * @param userId 操作用户
+     * @param url    事件地址
+     * @param bizType 事件类型
      * @return EventTrackPointRespVO
      **/
-    private EventTrackPointRespVO processPointRule(PointRuleConfigDO config, LoginUser loginUser, String url) {
+    private EventTrackPointRespVO processPointRule(PointRuleConfigDO config,
+                                                   Long userId, String url, PointBizTypeEnum bizType) {
         EventTrackPointRespVO respVO = new EventTrackPointRespVO();
         // 获取触发规则的执行上下文信息
-        Map<String, Object> triggerMap = getRuleContextMap(loginUser.getId(), config.getUrl(), config.getTriggerRule());
+        Map<String, Object> triggerMap = getRuleContextMap(userId, config.getUrl(), config.getTriggerRule());
         // 创建积分规则对象
         PointRule pointRule = createPointRule(config, triggerMap, null);
 
@@ -185,7 +199,7 @@ public class EventTrackServiceImpl implements EventTrackService {
         respVO.setPoint(pointRule.getPoint());
 
         // 执行规则匹配和相关操作
-        execute(pointRule, loginUser, config, url, respVO);
+        execute(pointRule, userId, config, url, bizType, respVO);
         return respVO;
     }
 
@@ -193,16 +207,17 @@ public class EventTrackServiceImpl implements EventTrackService {
      * 执行规则匹配和相关操作
      *
      * @param pointRule 规则对象
-     * @param loginUser 操作用户
+     * @param userId    操作用户
      * @param config    规则配置
      * @param url       事件地址
+     * @param bizType   事件类型
      * @param respVO    响应对象
      **/
-    private void execute(PointRule pointRule, LoginUser loginUser, PointRuleConfigDO config,
-                         String url, EventTrackPointRespVO respVO) {
+    private void execute(PointRule pointRule, Long userId, PointRuleConfigDO config,
+                         String url, PointBizTypeEnum bizType, EventTrackPointRespVO respVO) {
         DynamicRuleAction<PointRule> action = (t) -> {
             // 发送用户积分变更消息
-            userPointProducer.send(buildUserPointSendMessage(loginUser, config, t, url));
+            userPointProducer.send(buildUserPointSendMessage(userId, config, t, url, bizType));
             // 标记规则匹配成功
             respVO.match();
         };
@@ -214,20 +229,24 @@ public class EventTrackServiceImpl implements EventTrackService {
     /**
      * 构建用户积分变更消息对象
      *
-     * @param loginUser 操作用户
+     * @param userId    操作用户
      * @param config    规则配置
      * @param pointRule 规则对象
      * @param url       事件地址
+     * @param bizType   事件类型
      * @return UserPointSendMessage
      **/
-    private UserPointSendMessage buildUserPointSendMessage(LoginUser loginUser, PointRuleConfigDO config,
-                                                           PointRule pointRule, String url) {
-        PointBizTypeEnum bizType = PointBizTypeEnum.EVENT;
+    private UserPointSendMessage buildUserPointSendMessage(Long userId, PointRuleConfigDO config,
+                                                           PointRule pointRule, String url, PointBizTypeEnum bizType) {
+        PointBizTypeEnum defaultBizType = PointBizTypeEnum.EVENT;
         if (PointRuleConfigTypeEnum.MARK.getType().equals(config.getType())) {
-            bizType = PointBizTypeEnum.RECOMMEND_TASK;
+            defaultBizType = PointBizTypeEnum.RECOMMEND_TASK;
+        }
+        if (null == bizType) {
+            bizType = defaultBizType;
         }
         return UserPointSendMessage.builder()
-                .userId(loginUser.getId())
+                .userId(userId)
                 .url(url)
                 .title(config.getTitle())
                 .operation(MathOperationEnum.ADD.getOperator().equals(config.getOperation())

+ 1 - 1
menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/service/signin/SignInRecordServiceImpl.java

@@ -16,7 +16,7 @@ import com.citu.module.menduner.reward.dal.mysql.signin.SignInRecordMapper;
 import com.citu.module.menduner.system.api.account.AccountRecordSaveReqDTO;
 import com.citu.module.menduner.system.api.account.UserAccountApi;
 import com.citu.module.menduner.system.enums.MathOperationEnum;
-import com.citu.module.menduner.system.enums.account.PointBizTypeEnum;
+import com.citu.module.menduner.common.enums.PointBizTypeEnum;
 import org.springframework.stereotype.Service;
 import org.springframework.validation.annotation.Validated;
 

+ 1 - 1
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/api/account/UserAccountApiImpl.java

@@ -3,7 +3,7 @@ package com.citu.module.menduner.system.api.account;
 import com.citu.framework.common.pojo.CommonResult;
 import com.citu.module.menduner.system.dal.dataobject.user.UserAccountDO;
 import com.citu.module.menduner.system.enums.MathOperationEnum;
-import com.citu.module.menduner.system.enums.account.PointBizTypeEnum;
+import com.citu.module.menduner.common.enums.PointBizTypeEnum;
 import com.citu.module.menduner.system.service.record.UserAccountRecordService;
 import com.citu.module.menduner.system.service.user.UserAccountService;
 import org.springframework.validation.annotation.Validated;

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

@@ -104,4 +104,13 @@ public class EnterpriseController {
         return success(true);
     }
 
+    @PutMapping("/update/pub-job-type-perm")
+    @Operation(summary = "更新企业发布职位类型权限")
+    @PreAuthorize("@ss.hasPermission('menduner:system:enterprise:update')")
+    public CommonResult<Boolean> updatePubJobTypePerm(@Valid @RequestBody EnterprisePubJobTypePermUpdateReqVO reqVO) {
+        enterpriseService.updatePubJobTypePerm(reqVO);
+        return success(true);
+    }
+
+
 }

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

@@ -11,11 +11,9 @@ import com.citu.module.menduner.system.controller.admin.user.vo.UserAccountPageR
 import com.citu.module.menduner.system.controller.base.account.AccountPointUpdateReqVO;
 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.workexp.WorkExpRespVO;
 import com.citu.module.menduner.system.dal.dataobject.user.UserAccountDO;
-import com.citu.module.menduner.system.dal.dataobject.workexp.WorkExpDO;
 import com.citu.module.menduner.system.enums.MathOperationEnum;
-import com.citu.module.menduner.system.enums.account.PointBizTypeEnum;
+import com.citu.module.menduner.common.enums.PointBizTypeEnum;
 import com.citu.module.menduner.system.service.record.UserAccountRecordService;
 import com.citu.module.menduner.system.service.user.UserAccountService;
 import io.swagger.v3.oas.annotations.Operation;

+ 3 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/app/jobhunt/auth/vo/AppMdeAuthSmsRegisterReqVO.java

@@ -28,4 +28,7 @@ public class AppMdeAuthSmsRegisterReqVO {
     @Length(min = 4, max = 6, message = "{1_100_016_014}")
     @Pattern(regexp = "^[0-9]+$", message = "{1_100_016_016}")
     private String code;
+
+    @Schema(description = "邀请码,用户id")
+    private Long inviteCode;
 }

+ 25 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/app/recruit/enterprise/AppRecruitEnterpriseController.java

@@ -1,13 +1,16 @@
 package com.citu.module.menduner.system.controller.app.recruit.enterprise;
 
+import cn.hutool.core.collection.CollUtil;
 import com.citu.framework.baiduaip.core.AipOcrClient;
 import com.citu.framework.baiduaip.core.ocr.BusinessLicenseOcr;
 import com.citu.framework.common.pojo.CommonResult;
+import com.citu.framework.dict.core.DictFrameworkUtils;
 import com.citu.framework.security.core.annotations.PreAuthenticated;
 import com.citu.module.menduner.common.util.LoginUserContext;
 import com.citu.module.menduner.system.controller.app.recruit.enterprise.auth.AppRecruitEnterpriseAuthRespVO;
 import com.citu.module.menduner.system.controller.app.recruit.enterprise.auth.AppRecruitEnterpriseAuthSaveReqVO;
 import com.citu.module.menduner.system.controller.app.recruit.enterprise.vo.*;
+import com.citu.module.menduner.system.controller.base.CommonRespVO;
 import com.citu.module.menduner.system.service.enterprise.EnterpriseService;
 import com.citu.module.menduner.system.service.enterprise.auth.EnterpriseAuthService;
 import com.citu.module.menduner.system.service.enterprise.business.EnterpriseBusinessService;
@@ -19,9 +22,12 @@ import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
 import javax.validation.Valid;
+import java.util.ArrayList;
+import java.util.List;
 
 import static com.citu.framework.common.exception.util.ServiceExceptionUtil.exception;
 import static com.citu.framework.common.pojo.CommonResult.success;
+import static com.citu.module.menduner.system.enums.DictTypeConstants.MENDUNER_JOB_TYPE;
 import static com.citu.module.menduner.system.enums.ErrorCodeConstants.MDE_BUSINESS_LICENSE_OCR_FAIL;
 
 @Tag(name = "招聘端 - 企业信息")
@@ -146,4 +152,23 @@ public class AppRecruitEnterpriseController {
         return success(businessLicenseOcr);
     }
 
+    @PreAuthenticated
+    @GetMapping("/get/pub-job-type-perm")
+    @Operation(summary = "获取企业发布职位类型权限")
+    public CommonResult<List<CommonRespVO>> getPubJobTypePerm() {
+        List<String> pubJobTypePermList = enterpriseService.getPubJobTypePerm();
+        List<CommonRespVO> respVOList = new ArrayList<>();
+        if(CollUtil.isEmpty(pubJobTypePermList)) {
+            return CommonResult.success(respVOList);
+        }
+        for (String type : pubJobTypePermList) {
+            CommonRespVO respVO = new CommonRespVO();
+            respVO.setKey(DictFrameworkUtils.getDictDataLabel(MENDUNER_JOB_TYPE, type));
+            respVO.setValue(type);
+            respVOList.add(respVO);
+        }
+
+        return CommonResult.success(respVOList);
+    }
+
 }

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

@@ -162,6 +162,14 @@ public class AppRecruitJobAdvertisedController {
         return success(true);
     }
 
+    @PreAuthenticated
+    @PostMapping("/un-top")
+    @Operation(summary = "取消职位置顶")
+    public CommonResult<Boolean> unTop(@RequestParam("ids") String ids) {
+        jobAdvertisedService.unTop(StrUtils.splitToLong(ids));
+        return success(true);
+    }
+
     @PreAuthenticated
     @PostMapping("/renewal")
     @Operation(summary = "职位续期")

+ 19 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/enterprise/vo/EnterprisePubJobTypePermUpdateReqVO.java

@@ -0,0 +1,19 @@
+package com.citu.module.menduner.system.controller.base.enterprise.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.util.List;
+
+@Schema(description = "企业发布职位类型权限修改 Request VO")
+@Data
+public class EnterprisePubJobTypePermUpdateReqVO {
+
+
+    @Schema(description = "id", requiredMode = Schema.RequiredMode.REQUIRED, example = "20137")
+    private Long id;
+
+    @Schema(description = "允许企业发布哪些职位类型")
+    private List<String> pubJobTypePerm;
+
+}

+ 3 - 1
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/enterprise/vo/EnterpriseSaveReqVO.java

@@ -1,6 +1,5 @@
 package com.citu.module.menduner.system.controller.base.enterprise.vo;
 
-import com.alibaba.excel.annotation.ExcelProperty;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 
@@ -71,6 +70,9 @@ public class EnterpriseSaveReqVO {
     @Schema(description = "是否筹备")
     private Boolean prepare;
 
+    @Schema(description = "允许企业发布哪些职位类型")
+    private List<String> pubJobTypePerm;
+
     @Schema(description = "帐号状态(0正常 1停用)")
     private String status;
 

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

@@ -52,7 +52,7 @@ public class MdeUserDO extends TenantBaseDO {
     /**
      * 邀请码,用户id
      */
-    private String inviteCode;
+    private Long inviteCode;
     /**
      * 帐号状态(0正常 1停用)
      * <p>

+ 34 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/mq/producer/PointOperateProducer.java

@@ -0,0 +1,34 @@
+package com.citu.module.menduner.system.mq.producer;
+
+import com.citu.module.menduner.common.message.EventAsyncConfirmMessage;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.rocketmq.spring.core.RocketMQTemplate;
+import org.springframework.messaging.Message;
+import org.springframework.messaging.support.MessageBuilder;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+
+/**
+ * 积分操作 Producer
+ *
+ * @author Rayson
+ */
+@Slf4j
+@Component
+public class PointOperateProducer {
+
+    @Resource
+    private RocketMQTemplate rocketMQTemplate;
+
+    public void send(EventAsyncConfirmMessage message) {
+        Message<?> messageMq = MessageBuilder.withPayload(message).build();
+        rocketMQTemplate.syncSend(
+                EventAsyncConfirmMessage.TOPIC,
+                messageMq,
+                10000,
+                // 1s
+                1
+        );
+    }
+}

+ 23 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/auth/MdeAuthServiceImpl.java

@@ -8,10 +8,14 @@ import com.citu.framework.common.enums.UserTypeEnum;
 import com.citu.framework.common.util.monitor.TracerUtils;
 import com.citu.framework.common.util.servlet.ServletUtils;
 import com.citu.framework.common.util.validation.ValidationUtils;
+import com.citu.module.menduner.common.enums.EventAsyncUrlEnum;
+import com.citu.module.menduner.common.enums.PointBizTypeEnum;
+import com.citu.module.menduner.common.message.EventAsyncConfirmMessage;
 import com.citu.module.menduner.system.controller.app.jobhunt.auth.vo.*;
 import com.citu.module.menduner.system.convert.MdeAuthConvert;
 import com.citu.module.menduner.system.dal.dataobject.user.MdeUserDO;
 import com.citu.module.menduner.system.enums.MendunerStatusEnum;
+import com.citu.module.menduner.system.mq.producer.PointOperateProducer;
 import com.citu.module.menduner.system.service.user.MdeUserService;
 import com.citu.module.system.api.logger.LoginLogApi;
 import com.citu.module.system.api.logger.dto.LoginLogCreateReqDTO;
@@ -69,6 +73,8 @@ public class MdeAuthServiceImpl implements MdeAuthService {
     protected OAuth2TokenApi oauth2TokenApi;
     @Resource
     protected MdeEnterpriseAuthService enterpriseAuthService;
+    @Resource
+    protected PointOperateProducer pointOperateProducer;
 
     /**
      * 验证码的开关,默认为 true
@@ -219,6 +225,23 @@ public class MdeAuthServiceImpl implements MdeAuthService {
         // 创建用户并返回
         user = userService.createUserIfAbsent(reqVO.getPhone(), userIp, getTerminal().toString());
 
+        if (null != reqVO.getInviteCode()) {
+            // 给邀请人增加积分
+            // 表示  reqVO.getInviteCode() 因为邀请了用户注册, 所以给邀请人加积分,场景则表示绑定邀请方
+            pointOperateProducer.send(EventAsyncConfirmMessage.builder()
+                    // 给谁加
+                    .userId(reqVO.getInviteCode())
+                    // 加的是什么
+                    .url(EventAsyncUrlEnum.INVITE_USER.getUrl())
+                    // 场景
+                    .scene(EventAsyncUrlEnum.INVITE_USER.isScene() ?
+                            EventAsyncUrlEnum.INVITE_USER.getSceneStr() + user.getInviteCode() : null)
+                    // 什么类型
+                    .bizType(PointBizTypeEnum.INVITE)
+                    .build()
+            );
+        }
+
         // 登录
         return createTokenAfterLoginSuccess(user, reqVO.getPhone(), LoginLogTypeEnum.LOGIN_SMS, null);
     }

+ 12 - 1
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/enterprise/EnterpriseService.java

@@ -129,6 +129,13 @@ public interface EnterpriseService {
     Long createSimpleEnterprise(String name,String anotherName,
                                 List<String> pubJobTypePerm,
                                 String contactName, String phone,Boolean prepare);
+
+    /**
+     * 更新企业发布职位类型权限
+     *
+     * @param reqVO
+     **/
+    void updatePubJobTypePerm(EnterprisePubJobTypePermUpdateReqVO reqVO);
     // ========== 求职端 ==========
     /**
      * 点击执行埋点
@@ -143,7 +150,6 @@ public interface EnterpriseService {
      **/
     AppEnterpriseDetailRespVO getEnterpriseDetail(Long id);
 
-
     /**
      * 根据企业id获取简易的企业信息
      *
@@ -209,6 +215,11 @@ public interface EnterpriseService {
      **/
     AppRecruitEnterpriseRespVO get();
 
+    /**
+     * 获取企业发布职位类型权限
+     **/
+    List<String> getPubJobTypePerm();
+
     /**
      * 获取企业树
      * @param id 企业编号

+ 23 - 2
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/enterprise/EnterpriseServiceImpl.java

@@ -112,10 +112,12 @@ public class EnterpriseServiceImpl implements EnterpriseService {
         noticeES(id, SyncConstants.DELETE);
     }
 
-    private void validateEnterpriseExists(Long id) {
-        if (enterpriseMapper.selectById(id) == null) {
+    private EnterpriseDO validateEnterpriseExists(Long id) {
+        EnterpriseDO enterprise = enterpriseMapper.selectById(id);
+        if (null == enterprise) {
             throw exception(MDE_ENTERPRISE_NOT_EXISTS);
         }
+        return enterprise;
     }
 
     @Override
@@ -219,6 +221,18 @@ public class EnterpriseServiceImpl implements EnterpriseService {
         return enterprise.getId();
     }
 
+    @Override
+    public void updatePubJobTypePerm(EnterprisePubJobTypePermUpdateReqVO reqVO) {
+        // 校验存在
+        EnterpriseDO enterprise = validateEnterpriseExists(reqVO.getId());
+        enterprise.setPubJobTypePerm(reqVO.getPubJobTypePerm());
+        if (null == reqVO.getPubJobTypePerm()) {
+            enterprise.setPubJobTypePerm(new ArrayList<>());
+        }
+        enterpriseMapper.updateById(enterprise);
+    }
+
+
     @Override
     public void click(AppEnterpriseClickReqVO reqVO) {
         producer.send(MdeVisitsEnum.ENTERPRISE_CLICK, reqVO.getId());
@@ -240,6 +254,7 @@ public class EnterpriseServiceImpl implements EnterpriseService {
         return respVO;
     }
 
+
     @Override
     public EnterpriseBaseSimpleRespVO getEnterpriseSimple(Long id) {
         EnterpriseDO enterprise = enterpriseMapper.selectById(id);
@@ -367,6 +382,12 @@ public class EnterpriseServiceImpl implements EnterpriseService {
         return EnterpriseConvert.INSTANCE.convert13(selectEnterprise());
     }
 
+    @Override
+    public List<String> getPubJobTypePerm() {
+        EnterpriseDO enterprise = selectEnterprise();
+        return enterprise.getPubJobTypePerm();
+    }
+
     @Override
     @Cacheable(cacheNames = RedisKeyConstants.MDE_ENTERPRISE_TREE + "#5h", key = "#id",
             unless = "#result == null")

+ 23 - 10
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/enterprise/register/EnterpriseRegisterServiceImpl.java

@@ -7,6 +7,8 @@ import com.citu.framework.baiduaip.core.ocr.BusinessLicenseOcr;
 import com.citu.framework.common.pojo.PageResult;
 import com.citu.framework.common.util.object.BeanUtils;
 import com.citu.framework.common.util.validation.ValidationUtils;
+import com.citu.module.menduner.common.enums.EventAsyncUrlEnum;
+import com.citu.module.menduner.common.message.EventAsyncConfirmMessage;
 import com.citu.module.menduner.common.util.LoginUserContext;
 import com.citu.module.menduner.system.controller.app.jobhunt.enterprise.vo.register.AppEnterpriseRegisterReqVO;
 import com.citu.module.menduner.system.controller.app.jobhunt.enterprise.vo.register.AppEnterpriseRegisterRespVO;
@@ -23,6 +25,7 @@ import com.citu.module.menduner.system.dal.mysql.enterprise.EnterpriseRegisterMa
 import com.citu.module.menduner.system.enums.MendunerStatusEnum;
 import com.citu.module.menduner.system.enums.enterprise.EnterpriseRegisterAuditStatusEnum;
 import com.citu.module.menduner.system.enums.enterprise.EnterpriseUserTypeEnum;
+import com.citu.module.menduner.system.mq.producer.PointOperateProducer;
 import com.citu.module.menduner.system.service.enterprise.EnterpriseService;
 import com.citu.module.menduner.system.service.enterprise.bind.EnterpriseUserBindService;
 import com.citu.module.menduner.system.service.enterprise.business.EnterpriseBusinessService;
@@ -47,21 +50,18 @@ import static com.citu.module.menduner.system.enums.ErrorCodeConstants.*;
 @Validated
 public class EnterpriseRegisterServiceImpl implements EnterpriseRegisterService {
 
+    @Resource
+    protected PointOperateProducer pointOperateProducer;
     @Resource
     private EnterpriseRegisterMapper mapper;
-
     @Resource
     private EnterpriseBusinessService businessService;
-
     @Resource
     private EnterpriseService enterpriseService;
-
     @Resource
     private EnterpriseUserBindService userBindService;
-
     @Resource
     private MdeUserService mdeUserService;
-
     @Resource
     private AipOcrClient aipOcrClient;
 
@@ -144,7 +144,6 @@ public class EnterpriseRegisterServiceImpl implements EnterpriseRegisterService
         enterpriseRegister.setReason(reqVO.getReason());
         mapper.updateById(enterpriseRegister);
 
-        // TODO 增加企业的发布职位限制权限
         // 增加企业信息
         Long enterpriseId = enterpriseService.createSimpleEnterprise(
                 enterpriseRegister.getName(), enterpriseRegister.getAnotherName(),
@@ -176,17 +175,22 @@ public class EnterpriseRegisterServiceImpl implements EnterpriseRegisterService
             EnterpriseRegisterContactsReqVO contact = enterpriseRegister.getContacts().get(i);
             // 查询用户表
             MdeUserDO userDO = mdeUserService.getUserByPhone(contact.getPhone());
-            if(null == userDO) {
+            if (null == userDO) {
                 // 没有就创建
-                userDO = mdeUserService.createUserIfAbsent(contact.getPhone(),getClientIP(),getTerminal().toString());
+                userDO = mdeUserService.createUserIfAbsent(contact.getPhone(), getClientIP(), getTerminal().toString());
             }
             // 查询企业用户表
             EnterpriseUserBindDO enterpriseUserBindDO = userBindService
                     .selectByEnterpriseIdAndUserId(enterpriseId, userDO.getId());
-            if(null!=enterpriseUserBindDO) {
+            if (null != enterpriseUserBindDO) {
                 // 该用户存在该企业的账号,不做处理
                 continue;
             }
+            String userType = EnterpriseUserTypeEnum.NORMAL.getType();
+            if (0 == i) {
+                // 第一个用户是管理员
+                userType = EnterpriseUserTypeEnum.ADMIN.getType();
+            }
             // 增加企业用户
             EnterpriseUserBindDO userBindDO = EnterpriseUserBindDO.builder()
                     .enterpriseId(enterpriseId)
@@ -195,10 +199,19 @@ public class EnterpriseRegisterServiceImpl implements EnterpriseRegisterService
                     .status(MendunerStatusEnum.ENABLE.getStatus())
                     .phone(contact.getPhone())
                     .email(contact.getEmail())
-                    .userType(EnterpriseUserTypeEnum.ADMIN.getType())
+                    .userType(userType)
                     .password(contact.getPassword())
                     .build();
             userBindService.createUser(userBindDO);
+
+            // 表示  userDO.getId() 因为企业用户注册, 所以加积分
+            pointOperateProducer.send(EventAsyncConfirmMessage.builder()
+                    // 给谁加
+                    .userId(userDO.getId())
+                    // 加的是什么
+                    .url(EventAsyncUrlEnum.REGISTER_ENTERPRISE.getUrl())
+                    .build()
+            );
         }
 
 

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

@@ -161,6 +161,11 @@ public interface JobAdvertisedService {
      **/
     void top(List<Long> ids);
 
+    /**
+     * 取消置顶职位
+     **/
+    void unTop(List<Long> ids);
+
     /**
      * 续期职位
      **/

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

@@ -472,6 +472,22 @@ public class JobAdvertisedServiceImpl implements JobAdvertisedService {
         }
     }
 
+    @Override
+    @DSTransactional
+    public void unTop(List<Long> ids) {
+        for (Long id : ids) {
+            JobAdvertisedDO job = get(id);
+            if (null != job.getTop() && !job.getTop()) {
+                // 已经是不置顶状态
+                return;
+            }
+            job.setUpdateTime(LocalDateTime.now());
+            job.setTop(false);
+            mapper.updateById(job);
+            jobDataSync(job, SyncConstants.UPDATE);
+        }
+    }
+
     @Override
     public void renewal(AppRecruitJobRenewalReqVO reqVO) {
         JobAdvertisedDO job = get(reqVO.getId());

+ 1 - 1
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/record/UserAccountRecordService.java

@@ -5,7 +5,7 @@ import com.citu.framework.common.pojo.PageResult;
 import com.citu.module.menduner.system.controller.base.account.record.UserAccountRecordPageReqVO;
 import com.citu.module.menduner.system.dal.dataobject.record.UserAccountRecordDO;
 import com.citu.module.menduner.system.enums.MathOperationEnum;
-import com.citu.module.menduner.system.enums.account.PointBizTypeEnum;
+import com.citu.module.menduner.common.enums.PointBizTypeEnum;
 
 import java.time.LocalDateTime;
 

+ 3 - 1
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/record/UserAccountRecordServiceImpl.java

@@ -12,7 +12,7 @@ import com.citu.module.menduner.system.dal.dataobject.user.UserAccountDO;
 import com.citu.module.menduner.system.dal.mysql.record.UserAccountRecordMapper;
 import com.citu.module.menduner.system.enums.MathOperationEnum;
 import com.citu.module.menduner.system.enums.account.AccountRecordTypeEnum;
-import com.citu.module.menduner.system.enums.account.PointBizTypeEnum;
+import com.citu.module.menduner.common.enums.PointBizTypeEnum;
 import com.citu.module.menduner.system.service.user.UserAccountService;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
@@ -91,9 +91,11 @@ public class UserAccountRecordServiceImpl implements UserAccountRecordService {
                 .setTitle(bizType.getName())
                 .setUrl(url)
                 .setOperation(operation.getOperator())
+                // 默认
                 .setDescription(StrUtil.format(bizType.getDescription(), point))
                 .setPoint(point).setTotalPoint(totalPoint);
 
+        // 特殊处理
         if (PointBizTypeEnum.EVENT.equals(bizType) || PointBizTypeEnum.RECOMMEND_TASK.equals(bizType)) {
             if (MathOperationEnum.SUBTRACT.equals(operation)) {
                 record.setDescription(StrUtil.format(bizType.getDescription(), title, point));

+ 1 - 1
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/redeem/RedeemServiceImpl.java

@@ -11,7 +11,7 @@ import com.citu.module.menduner.system.controller.base.redeem.RedeemSaveReqVO;
 import com.citu.module.menduner.system.dal.dataobject.redeem.RedeemDO;
 import com.citu.module.menduner.system.dal.mysql.redeem.RedeemMapper;
 import com.citu.module.menduner.system.enums.MathOperationEnum;
-import com.citu.module.menduner.system.enums.account.PointBizTypeEnum;
+import com.citu.module.menduner.common.enums.PointBizTypeEnum;
 import com.citu.module.menduner.system.service.record.UserAccountRecordService;
 import org.springframework.stereotype.Service;
 import org.springframework.validation.annotation.Validated;

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

@@ -92,6 +92,16 @@ public interface MdeUserService {
      */
     MdeUserDO createUserIfAbsent(@Mobile String phone, String registerIp, String terminal);
 
+    /**
+     * 基于手机号创建用户。
+     * 如果用户已经存在,则直接进行返回
+     *
+     * @param phone     手机号
+     * @param inviteCode 邀请码
+     * @return 用户对象
+     */
+    MdeUserDO createUserIfAbsent(@Mobile String phone,Long inviteCode);
+
     /**
      * 基于手机号创建用户。
      * 如果用户已经存在,则直接进行返回

+ 17 - 4
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/user/MdeUserServiceImpl.java

@@ -36,6 +36,7 @@ import java.time.LocalDateTime;
 
 import static com.citu.framework.common.exception.util.ServiceExceptionUtil.exception;
 import static com.citu.framework.common.util.servlet.ServletUtils.getClientIP;
+import static com.citu.framework.web.core.util.WebFrameworkUtils.getTerminal;
 import static com.citu.module.menduner.system.enums.ErrorCodeConstants.*;
 import static com.citu.module.menduner.system.enums.MdeLogRecordConstants.*;
 import static com.citu.module.system.enums.ErrorCodeConstants.USER_USERNAME_EXISTS;
@@ -219,18 +220,29 @@ public class MdeUserServiceImpl implements MdeUserService {
             return user;
         }
         // 用户不存在,则进行创建
-        return createUser(phone, null, registerIp, terminal);
+        return createUser(phone, null, null, registerIp, terminal);
     }
 
+    @Override
+    @DSTransactional // 单机+多数据源方案,使用 @DSTransactional 保证本地事务,以及数据源的切换
+    public MdeUserDO createUserIfAbsent(String phone, Long inviteCode) {
+        // 用户已经存在
+        MdeUserDO user = mdeUserMapper.selectByPhone(phone);
+        if (user != null) {
+            return user;
+        }
+        // 用户不存在,则进行创建
+        return createUser(phone, null, inviteCode, getClientIP(), getTerminal().toString());
+    }
 
     @Override
     @DSTransactional // 单机+多数据源方案,使用 @DSTransactional 保证本地事务,以及数据源的切换
     public MdeUserDO createUser(String avtar, String registerIp, String terminal) {
-        return createUser(null, avtar, registerIp, terminal);
+        return createUser(null, avtar, null, registerIp, terminal);
     }
 
 
-    public MdeUserDO createUser(String phone, String avtar,
+    public MdeUserDO createUser(String phone, String avtar, Long inviteCode,
                                 String registerIp, String terminal) {
         // 生成密码
         String password = IdUtil.fastSimpleUUID();
@@ -242,6 +254,7 @@ public class MdeUserServiceImpl implements MdeUserService {
         user.setPassword(encodePassword(password)); // 加密密码
         user.setRegisterIp(registerIp).setRegisterTerminal(terminal);
         user.setAvatar(avtar); // 基础信息
+        user.setInviteCode(inviteCode);
 
         mdeUserMapper.insert(user);
         // 绑定默认角色
@@ -273,7 +286,7 @@ public class MdeUserServiceImpl implements MdeUserService {
             return user;
         }
         // 用户不存在,则进行创建
-        return createUser(reqVO.getPhone(), null, getClientIP(), TerminalEnum.H5.getTerminal().toString());
+        return createUser(reqVO.getPhone(), null, null, getClientIP(), TerminalEnum.H5.getTerminal().toString());
     }
 
     @VisibleForTesting