mirror of
				https://gitee.com/hhyykk/ipms-sjy.git
				synced 2025-11-01 02:38:43 +08:00 
			
		
		
		
	code review:会员等级
This commit is contained in:
		| @@ -52,6 +52,7 @@ public class MemberLevelLogDO extends BaseDO { | ||||
|      * 会员此时的经验 | ||||
|      */ | ||||
|     private Integer userExperience; | ||||
|     // TODO @疯狂:是不是 remark 和 description 可以合并成 description 就够了 | ||||
|     /** | ||||
|      * 备注 | ||||
|      */ | ||||
|   | ||||
| @@ -55,6 +55,8 @@ public interface MemberExperienceLogService { | ||||
|      */ | ||||
|     List<MemberExperienceLogDO> getExperienceLogList(MemberExperienceLogExportReqVO exportReqVO); | ||||
|  | ||||
|     // TODO @疯狂:类似 MemberLevelLogService 的方法,这里也需要提供一个通用的方法,用于创建经验变动记录 | ||||
|  | ||||
|     /** | ||||
|      * 创建 手动调整 经验变动记录 | ||||
|      * | ||||
|   | ||||
| @@ -56,6 +56,8 @@ public interface MemberLevelLogService { | ||||
|      */ | ||||
|     List<MemberLevelLogDO> getLevelLogList(MemberLevelLogExportReqVO exportReqVO); | ||||
|  | ||||
|     // TODO @疯狂:把 createCancelLog、createAdjustLog、createAutoUpgradeLog 几个日志合并成一个通用的日志方法;整体的内容,交给 MemberLevelService 去做;以及对应的 level 变化的通知; | ||||
|  | ||||
|     /** | ||||
|      * 创建记录: 取消等级 | ||||
|      * | ||||
|   | ||||
| @@ -140,7 +140,6 @@ public class MemberLevelServiceImpl implements MemberLevelService { | ||||
|     @VisibleForTesting | ||||
|     void validateConfigValid(Long id, String name, Integer level, Integer experience) { | ||||
|         List<MemberLevelDO> list = levelMapper.selectList(); | ||||
|  | ||||
|         // 校验名称唯一 | ||||
|         validateNameUnique(list, id, name); | ||||
|         // 校验等级唯一 | ||||
| @@ -169,9 +168,10 @@ public class MemberLevelServiceImpl implements MemberLevelService { | ||||
|         return levelMapper.selectListByStatus(status); | ||||
|     } | ||||
|  | ||||
|     @Transactional(rollbackFor = Exception.class) | ||||
|     @Override | ||||
|     @Transactional(rollbackFor = Exception.class) | ||||
|     public void updateUserLevel(MemberUserDO user, Long levelId, String reason) { | ||||
|         // TODO @疯狂:可以直接 ObjUtil.equal(user.getLevelId(), levelId),解决这 2 个场景 | ||||
|         // 未调整的情况1 | ||||
|         if (user.getLevelId() == null && levelId == null) { | ||||
|             return; | ||||
| @@ -182,6 +182,7 @@ public class MemberLevelServiceImpl implements MemberLevelService { | ||||
|         } | ||||
|  | ||||
|         // 需要后台用户填写为什么调整会员的等级 | ||||
|         // TODO @疯狂:这个 reason 是不是可以放到 validator 里做哈; | ||||
|         if (StrUtil.isBlank(reason)) { | ||||
|             throw exception(LEVEL_REASON_NOT_EXISTS); | ||||
|         } | ||||
| @@ -192,6 +193,7 @@ public class MemberLevelServiceImpl implements MemberLevelService { | ||||
|         if (levelId == null) { | ||||
|             experience = -user.getExperience(); | ||||
|  | ||||
|             // TODO @疯狂:这里的逻辑,应该和下面的 207 到 210 行的逻辑一致,都是先记录日志,再更新会员表;所以,是不是都可以类似 214 的写法哈。 | ||||
|             // 取消了会员的等级 | ||||
|             memberLevelLogService.createCancelLog(user.getId(), reason); | ||||
|             memberUserMapper.cancelUserLevel(user.getId()); | ||||
| @@ -208,36 +210,38 @@ public class MemberLevelServiceImpl implements MemberLevelService { | ||||
|             updateUserLevelIdAndExperience(user.getId(), levelId, totalExperience); | ||||
|         } | ||||
|  | ||||
|  | ||||
|         // 记录会员经验变动 | ||||
|         memberExperienceLogService.createAdjustLog(user.getId(), experience, totalExperience); | ||||
|     } | ||||
|  | ||||
|     @Transactional(rollbackFor = Exception.class) | ||||
|     // TODO @疯狂:方法名,建议改成 increase 或者 add 经验,和项目更统一一些 | ||||
|     // TODO @疯狂:bizType 改成具体数值,主要是枚举在 api 不好传递,rpc 情况下 | ||||
|     @Override | ||||
|     @Transactional(rollbackFor = Exception.class) | ||||
|     public void plusExperience(Long userId, Integer experience, MemberExperienceBizTypeEnum bizType, String bizId) { | ||||
|         if (experience == 0) { | ||||
|             return; | ||||
|         } | ||||
|  | ||||
|         MemberUserDO user = memberUserMapper.selectById(userId); | ||||
|         // TODO @疯狂:默认给 Experience 搞个 0 哈。这里就不做兜底逻辑啦 | ||||
|         if (user.getExperience() == null) { | ||||
|             user.setExperience(0); | ||||
|         } | ||||
|  | ||||
|         // 防止扣出负数 | ||||
|         // TODO @疯狂:如果经验出现负数,是不是抛出异常会更合理;按道理不应该出现的; | ||||
|         int userExperience = NumberUtil.max(user.getExperience() + experience, 0); | ||||
|  | ||||
|         // 创建经验记录 | ||||
|         memberExperienceLogService.createBizLog(userId, experience, userExperience, bizType, bizId); | ||||
|  | ||||
|         // 计算会员等级 | ||||
|         Long levelId = calcLevel(user, userExperience); | ||||
|  | ||||
|         // 更新会员表上的等级编号、经验值 | ||||
|         updateUserLevelIdAndExperience(user.getId(), levelId, userExperience); | ||||
|     } | ||||
|  | ||||
|     // TODO @疯狂:让 memberUserService 那开个方法;每个模块,不直接操作对方的 mapper; | ||||
|     private void updateUserLevelIdAndExperience(Long userId, Long levelId, Integer experience) { | ||||
|         memberUserMapper.updateById(new MemberUserDO() | ||||
|                 .setId(userId) | ||||
| @@ -252,6 +256,8 @@ public class MemberLevelServiceImpl implements MemberLevelService { | ||||
|      * @param userExperience 会员当前的经验值 | ||||
|      * @return 会员等级编号,null表示无变化 | ||||
|      */ | ||||
|     // calc | ||||
|     // TODO @疯狂:calc 改成完整的拼写哈。是不是改成 calculateNewLevel | ||||
|     private Long calcLevel(MemberUserDO user, int userExperience) { | ||||
|         List<MemberLevelDO> list = getEnableLevelList(); | ||||
|         if (CollUtil.isEmpty(list)) { | ||||
| @@ -273,6 +279,7 @@ public class MemberLevelServiceImpl implements MemberLevelService { | ||||
|             return null; | ||||
|         } | ||||
|  | ||||
|         // TODO @疯狂:这个方法,应该只做 level 的计算,不做登记的变更。 | ||||
|         // 保存等级变更记录 | ||||
|         memberLevelLogService.createAutoUpgradeLog(user, matchLevel); | ||||
|         return matchLevel.getId(); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 YunaiV
					YunaiV