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