code review:会员等级

This commit is contained in:
YunaiV 2023-08-22 12:53:29 +08:00
parent 800c44a46e
commit 292f23c4b2
4 changed files with 18 additions and 6 deletions

View File

@ -52,6 +52,7 @@ public class MemberLevelLogDO extends BaseDO {
* 会员此时的经验
*/
private Integer userExperience;
// TODO @疯狂是不是 remark description 可以合并成 description 就够了
/**
* 备注
*/

View File

@ -55,6 +55,8 @@ public interface MemberExperienceLogService {
*/
List<MemberExperienceLogDO> getExperienceLogList(MemberExperienceLogExportReqVO exportReqVO);
// TODO @疯狂类似 MemberLevelLogService 的方法这里也需要提供一个通用的方法用于创建经验变动记录
/**
* 创建 手动调整 经验变动记录
*

View File

@ -56,6 +56,8 @@ public interface MemberLevelLogService {
*/
List<MemberLevelLogDO> getLevelLogList(MemberLevelLogExportReqVO exportReqVO);
// TODO @疯狂 createCancelLogcreateAdjustLogcreateAutoUpgradeLog 几个日志合并成一个通用的日志方法整体的内容交给 MemberLevelService 去做以及对应的 level 变化的通知
/**
* 创建记录 取消等级
*

View File

@ -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();