Browse Source

feat: 会员自动升级

xdd 1 tháng trước cách đây
mục cha
commit
d5ab3d2aa8

+ 1 - 0
fs-service/src/main/java/com/fs/his/service/IFsUserService.java

@@ -223,4 +223,5 @@ public interface IFsUserService
     void handleFsUserWx(FsUser user, LoginMaWxParam param, WxMaJscode2SessionResult session);
 
     R removeUser(Long id);
+
 }

+ 67 - 0
fs-service/src/main/java/com/fs/hisStore/domain/UserUpgradeLog.java

@@ -0,0 +1,67 @@
+package com.fs.hisStore.domain;
+
+import lombok.Data;
+import lombok.Builder;
+import lombok.NoArgsConstructor;
+import lombok.AllArgsConstructor;
+import java.util.Date;
+
+/**
+ * 用户等级升级记录表
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class UserUpgradeLog {
+
+    /**
+     * 主键ID
+     */
+    private Long id;
+
+    /**
+     * 用户ID
+     */
+    private Long userId;
+
+    /**
+     * 旧等级
+     */
+    private Integer oldLevel;
+
+    /**
+     * 新等级
+     */
+    private Integer newLevel;
+
+    /**
+     * 旧上级用户ID
+     */
+    private Long oldSpreadUserId;
+
+    /**
+     * 新上级用户ID
+     */
+    private Long newSpreadUserId;
+
+    /**
+     * 升级时间
+     */
+    private Date upgradeTime;
+
+    /**
+     * 升级原因
+     */
+    private String upgradeReason;
+
+    /**
+     * 操作人
+     */
+    private String operator;
+
+    /**
+     * 备注
+     */
+    private String remark;
+}

+ 76 - 0
fs-service/src/main/java/com/fs/hisStore/mapper/UserUpgradeLogMapper.java

@@ -0,0 +1,76 @@
+package com.fs.hisStore.mapper;
+
+import com.fs.hisStore.domain.UserUpgradeLog;
+import org.apache.ibatis.annotations.*;
+import java.util.List;
+
+/**
+ * 用户等级升级记录表Mapper接口
+ */
+public interface UserUpgradeLogMapper {
+
+    /**
+     * 根据ID查询记录
+     *
+     * @param id 主键ID
+     * @return 用户等级升级记录
+     */
+    @Select("SELECT * FROM fs_user_upgrade_log WHERE id = #{id}")
+    UserUpgradeLog selectById(@Param("id") Long id);
+
+    /**
+     * 根据用户ID查询记录列表
+     *
+     * @param userId 用户ID
+     * @return 用户等级升级记录列表
+     */
+    @Select("SELECT * FROM fs_user_upgrade_log WHERE user_id = #{userId} ORDER BY upgrade_time DESC")
+    List<UserUpgradeLog> selectByUserId(@Param("userId") Long userId);
+
+    /**
+     * 插入记录
+     *
+     * @param record 用户等级升级记录
+     * @return 影响行数
+     */
+    @Insert("<script>" +
+            "INSERT INTO fs_user_upgrade_log" +
+            "(user_id, old_level, new_level, old_spread_user_id, new_spread_user_id, upgrade_time, upgrade_reason, operator, remark)" +
+            "VALUES" +
+            "(#{userId}, #{oldLevel}, #{newLevel}, #{oldSpreadUserId}, #{newSpreadUserId}, #{upgradeTime}, #{upgradeReason}, " +
+            "<if test='operator != null'>#{operator}</if><if test='operator == null'>'SYSTEM'</if>, #{remark})" +
+            "</script>")
+    int insert(UserUpgradeLog record);
+
+    /**
+     * 更新记录
+     *
+     * @param record 用户等级升级记录
+     * @return 影响行数
+     */
+    @Update("<script>" +
+            "UPDATE fs_user_upgrade_log" +
+            "<set>" +
+            "<if test='userId != null'>user_id = #{userId},</if>" +
+            "<if test='oldLevel != null'>old_level = #{oldLevel},</if>" +
+            "<if test='newLevel != null'>new_level = #{newLevel},</if>" +
+            "<if test='oldSpreadUserId != null'>old_spread_user_id = #{oldSpreadUserId},</if>" +
+            "<if test='newSpreadUserId != null'>new_spread_user_id = #{newSpreadUserId},</if>" +
+            "<if test='upgradeTime != null'>upgrade_time = #{upgradeTime},</if>" +
+            "<if test='upgradeReason != null'>upgrade_reason = #{upgradeReason},</if>" +
+            "<if test='operator != null'>operator = #{operator},</if>" +
+            "<if test='remark != null'>remark = #{remark},</if>" +
+            "</set>" +
+            "WHERE id = #{id}" +
+            "</script>")
+    int update(UserUpgradeLog record);
+
+    /**
+     * 删除记录
+     *
+     * @param id 主键ID
+     * @return 影响行数
+     */
+    @Delete("DELETE FROM fs_user_upgrade_log WHERE id = #{id}")
+    int deleteById(@Param("id") Long id);
+}

+ 14 - 0
fs-service/src/main/java/com/fs/hisStore/service/IFsUserScrmService.java

@@ -272,4 +272,18 @@ public interface IFsUserScrmService
     List<FSUserVO> selectFsUserVOListByProject(FsUserScrm fsUser);
 
     FsUserScrm selectFsUserByOpenId(String openid);
+
+    /**
+     * 查询用户等级 1 2 3 分别对应分销的等级
+     * @param userId
+     * @return
+     */
+    Integer queryUserLevel(Long userId);
+
+
+    /**
+     * 升级用户等级 如果用户是1级用户升级无效 如果用户是2级用户升级为1级用户 如果用户是3级升级为2级用户
+     * @param userId
+     */
+    int upgradeUser(Long userId);
 }

+ 137 - 4
fs-service/src/main/java/com/fs/hisStore/service/impl/FsUserScrmServiceImpl.java

@@ -31,16 +31,13 @@ import com.fs.course.vo.newfs.FsCourseAnalysisCountVO;
 import com.fs.course.vo.newfs.FsCourseAnalysisVO;
 import com.fs.course.vo.newfs.FsUserCourseVideoPageListVO;
 import com.fs.his.vo.OptionsVO;
+import com.fs.hisStore.mapper.*;
 import com.fs.qw.param.QwFsUserParam;
 import com.fs.qw.vo.QwFsUserVO;
 import com.fs.hisStore.domain.*;
 import com.fs.hisStore.dto.FsStoreCartDTO;
 import com.fs.hisStore.dto.FsUserTransferParamDTO;
 import com.fs.hisStore.enums.BillDetailEnum;
-import com.fs.hisStore.mapper.FsStoreOrderScrmMapper;
-import com.fs.hisStore.mapper.FsStoreProductAttrValueScrmMapper;
-import com.fs.hisStore.mapper.FsUserCourseCountScrmMapper;
-import com.fs.hisStore.mapper.FsUserScrmMapper;
 import com.fs.hisStore.param.SelectCusListPageParam;
 import com.fs.hisStore.param.h5.CourseAnalysisParam;
 import com.fs.hisStore.param.h5.FsUserPageListParam;
@@ -138,6 +135,9 @@ public class FsUserScrmServiceImpl implements IFsUserScrmService
     @Autowired
     private IFsUserProjectTagScrmService userProjectTagService;
 
+    @Autowired
+    private UserUpgradeLogMapper userUpgradeLogMapper;
+
     /**
      * 查询用户
      *
@@ -1073,6 +1073,139 @@ public class FsUserScrmServiceImpl implements IFsUserScrmService
         return fsUserMapper.selectFsUserByOpenId(openid);
     }
 
+    @Override
+    public Integer queryUserLevel(Long userId) {
+        FsUserScrm fsUserScrm = fsUserMapper.selectFsUserById(userId);
+        if(ObjectUtils.isNull(fsUserScrm.getSpreadUserId()) || ObjectUtil.equal(fsUserScrm.getSpreadUserId(),0L)){
+            return 1;
+        }
+
+        Long spreadUserId = fsUserScrm.getSpreadUserId();
+        FsUserScrm fsUserScrm1 = fsUserMapper.selectFsUserById(spreadUserId);
+        if(ObjectUtils.isNull(fsUserScrm1.getSpreadUserId()) || ObjectUtil.equal(fsUserScrm1.getSpreadUserId(),0L)){
+            return 2;
+        }
+
+
+        spreadUserId = fsUserScrm1.getSpreadUserId();
+        fsUserScrm1 = fsUserMapper.selectFsUserById(spreadUserId);
+        if(ObjectUtils.isNull(fsUserScrm1.getSpreadUserId()) || ObjectUtil.equal(fsUserScrm1.getSpreadUserId(),0L)){
+            return 3;
+        }
+
+        return 0;
+    }
+
+
+    /**
+     * 升级用户等级并记录
+     * @param userId 用户ID
+     * @return 升级结果:0-升级成功,1-用户已是1级无需升级,2-用户升级为1级,3-用户升级为2级
+     */
+    @Transactional(rollbackFor = Exception.class,propagation = Propagation.REQUIRED)
+    @Override
+    public int upgradeUser(Long userId) {
+        FsUserScrm currentUser = fsUserMapper.selectFsUserById(userId);
+        if (currentUser == null) {
+            throw new RuntimeException("用户不存在");
+        }
+
+        // 保存旧的上级ID,用于记录
+        Long oldSpreadUserId = currentUser.getSpreadUserId();
+        int oldLevel = getUserLevel(currentUser);
+        int newLevel = oldLevel;
+        Long newSpreadUserId = oldSpreadUserId;
+
+        // 检查用户是否有上级,无上级则为1级用户,不需要升级
+        if (ObjectUtils.isNull(oldSpreadUserId) || ObjectUtil.equal(oldSpreadUserId, 0L)) {
+            return 1;
+        }
+
+        Long directParentId = oldSpreadUserId;
+        FsUserScrm directParent = fsUserMapper.selectFsUserById(directParentId);
+        if (directParent == null) {
+            throw new RuntimeException("用户的上级未找到");
+        }
+
+        // 检查直接上级是否有上级,无上级则直接上级为1级用户,当前用户为2级用户
+        if (ObjectUtils.isNull(directParent.getSpreadUserId()) || ObjectUtil.equal(directParent.getSpreadUserId(), 0L)) {
+            newSpreadUserId = 0L;
+            newLevel = 1;
+            currentUser.setSpreadUserId(newSpreadUserId);
+            fsUserMapper.updateFsUser(currentUser);
+
+            saveUpgradeLog(userId, oldLevel, newLevel, oldSpreadUserId, newSpreadUserId, "系统自动升级");
+            return 2;
+        }
+
+        // 获取间接上级(上上级)信息
+        Long grandParentId = directParent.getSpreadUserId();
+        FsUserScrm grandParent = fsUserMapper.selectFsUserById(grandParentId);
+        if (grandParent == null) {
+            throw new RuntimeException("用户的上上级未找到");
+        }
+
+        // 如果间接上级没有上级,则间接上级为1级,直接上级为2级,当前用户为3级
+        if (ObjectUtils.isNull(grandParent.getSpreadUserId()) || ObjectUtil.equal(grandParent.getSpreadUserId(), 0L)) {
+            newSpreadUserId = grandParentId;
+            newLevel = 2;
+            currentUser.setSpreadUserId(newSpreadUserId);
+            fsUserMapper.updateFsUser(currentUser);
+
+            saveUpgradeLog(userId, oldLevel, newLevel, oldSpreadUserId, newSpreadUserId, "系统自动升级");
+            return 3;
+        }
+
+        return 0;
+    }
+
+    /**
+     * 根据用户关系确定用户等级
+     * @param user 用户对象
+     * @return 用户等级:1-一级用户,2-二级用户,3-三级用户,0-其他
+     */
+    private int getUserLevel(FsUserScrm user) {
+        if (ObjectUtils.isNull(user.getSpreadUserId()) || ObjectUtil.equal(user.getSpreadUserId(), 0L)) {
+            return 1; // 一级用户
+        }
+
+        FsUserScrm parent = fsUserMapper.selectFsUserById(user.getSpreadUserId());
+        if (parent == null) {
+            return 0; // 异常情况
+        }
+
+        if (ObjectUtils.isNull(parent.getSpreadUserId()) || ObjectUtil.equal(parent.getSpreadUserId(), 0L)) {
+            return 2; // 二级用户
+        }
+
+        FsUserScrm grandParent = fsUserMapper.selectFsUserById(parent.getSpreadUserId());
+        if (grandParent == null) {
+            return 0; // 异常情况
+        }
+
+        if (ObjectUtils.isNull(grandParent.getSpreadUserId()) || ObjectUtil.equal(grandParent.getSpreadUserId(), 0L)) {
+            return 3; // 三级用户
+        }
+
+        return 0;
+    }
+    /**
+     * 保存用户升级记录
+     */
+    private void saveUpgradeLog(Long userId, int oldLevel, int newLevel, Long oldSpreadUserId, Long newSpreadUserId, String reason) {
+        UserUpgradeLog log = new UserUpgradeLog();
+        log.setUserId(userId);
+        log.setOldLevel(oldLevel);
+        log.setNewLevel(newLevel);
+        log.setOldSpreadUserId(oldSpreadUserId);
+        log.setNewSpreadUserId(newSpreadUserId);
+        log.setUpgradeTime(new Date());
+        log.setUpgradeReason(reason);
+        log.setOperator("SYSTEM");
+
+        userUpgradeLogMapper.insert(log);
+    }
+
     /**
      * 查询会员选项列表
      * @param params    参数