Commit dc382d80bb4a2460694f6e9657b17d0284c41e9d

Authored by owen
1 parent b7f54a30

会员: 重构会员等级逻辑

Showing 17 changed files with 130 additions and 205 deletions
yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/api/level/MemberLevelApi.java
... ... @@ -14,8 +14,8 @@ public interface MemberLevelApi {
14 14 *
15 15 * @param userId 会员ID
16 16 * @param experience 经验
17   - * @param bizType 业务类型
  17 + * @param bizType 业务类型 {@link MemberExperienceBizTypeEnum}
18 18 * @param bizId 业务编号
19 19 */
20   - void plusExperience(Long userId, Integer experience, MemberExperienceBizTypeEnum bizType, String bizId);
  20 + void plusExperience(Long userId, Integer experience, Integer bizType, String bizId);
21 21 }
... ...
yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/enums/ErrorCodeConstants.java
... ... @@ -50,6 +50,7 @@ public interface ErrorCodeConstants {
50 50  
51 51 ErrorCode LEVEL_LOG_NOT_EXISTS = new ErrorCode(1004011100, "用户等级记录不存在");
52 52 ErrorCode EXPERIENCE_LOG_NOT_EXISTS = new ErrorCode(1004011200, "用户经验记录不存在");
  53 + ErrorCode EXPERIENCE_BIZ_NOT_SUPPORT = new ErrorCode(1004011201, "用户经验业务类型不支持");
53 54  
54 55 //========== 用户分组 1004012000 ==========
55 56 ErrorCode GROUP_NOT_EXISTS = new ErrorCode(1004012000, "用户分组不存在");
... ...
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/api/level/MemberLevelApiImpl.java
1 1 package cn.iocoder.yudao.module.member.api.level;
2 2  
  3 +import cn.hutool.core.util.EnumUtil;
3 4 import cn.iocoder.yudao.module.member.enums.MemberExperienceBizTypeEnum;
4 5 import cn.iocoder.yudao.module.member.service.level.MemberLevelService;
5 6 import org.springframework.stereotype.Service;
6 7 import org.springframework.validation.annotation.Validated;
7 8  
8 9 import javax.annotation.Resource;
  10 +import java.util.Objects;
  11 +
  12 +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
  13 +import static cn.iocoder.yudao.module.member.enums.ErrorCodeConstants.EXPERIENCE_BIZ_NOT_SUPPORT;
9 14  
10 15 /**
11 16 * 会员等级 API 实现类
... ... @@ -19,7 +24,12 @@ public class MemberLevelApiImpl implements MemberLevelApi {
19 24 @Resource
20 25 private MemberLevelService memberLevelService;
21 26  
22   - public void plusExperience(Long userId, Integer experience, MemberExperienceBizTypeEnum bizType, String bizId) {
23   - memberLevelService.plusExperience(userId, experience, bizType, bizId);
  27 + public void plusExperience(Long userId, Integer experience, Integer bizType, String bizId) {
  28 + MemberExperienceBizTypeEnum bizTypeEnum = EnumUtil.getBy(MemberExperienceBizTypeEnum.class, e -> Objects.equals(bizType, e.getValue()));
  29 + if (bizTypeEnum == null) {
  30 + throw exception(EXPERIENCE_BIZ_NOT_SUPPORT);
  31 + }
  32 +
  33 + memberLevelService.addExperience(userId, experience, bizTypeEnum, bizId);
24 34 }
25 35 }
... ...
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/level/MemberExperienceRecordController.java
... ... @@ -36,7 +36,7 @@ public class MemberExperienceRecordController {
36 36 @Parameter(name = "id", description = "编号", required = true, example = "1024")
37 37 @PreAuthorize("@ss.hasPermission('member:experience-record:query')")
38 38 public CommonResult<MemberExperienceRecordRespVO> getExperienceLog(@RequestParam("id") Long id) {
39   - MemberExperienceRecordDO experienceLog = experienceLogService.getExperienceLog(id);
  39 + MemberExperienceRecordDO experienceLog = experienceLogService.getExperienceRecord(id);
40 40 return success(MemberExperienceRecordConvert.INSTANCE.convert(experienceLog));
41 41 }
42 42  
... ... @@ -44,7 +44,7 @@ public class MemberExperienceRecordController {
44 44 @Operation(summary = "获得会员经验记录分页")
45 45 @PreAuthorize("@ss.hasPermission('member:experience-record:query')")
46 46 public CommonResult<PageResult<MemberExperienceRecordRespVO>> getExperienceLogPage(@Valid MemberExperienceRecordPageReqVO pageVO) {
47   - PageResult<MemberExperienceRecordDO> pageResult = experienceLogService.getExperienceLogPage(pageVO);
  47 + PageResult<MemberExperienceRecordDO> pageResult = experienceLogService.getExperienceRecordPage(pageVO);
48 48 return success(MemberExperienceRecordConvert.INSTANCE.convertPage(pageResult));
49 49 }
50 50  
... ...
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/level/MemberLevelRecordController.java
... ... @@ -36,7 +36,7 @@ public class MemberLevelRecordController {
36 36 @Parameter(name = "id", description = "编号", required = true, example = "1024")
37 37 @PreAuthorize("@ss.hasPermission('member:level-record:query')")
38 38 public CommonResult<MemberLevelRecordRespVO> getLevelLog(@RequestParam("id") Long id) {
39   - MemberLevelRecordDO levelLog = levelLogService.getLevelLog(id);
  39 + MemberLevelRecordDO levelLog = levelLogService.getLevelRecord(id);
40 40 return success(MemberLevelRecordConvert.INSTANCE.convert(levelLog));
41 41 }
42 42  
... ... @@ -44,7 +44,7 @@ public class MemberLevelRecordController {
44 44 @Operation(summary = "获得会员等级记录分页")
45 45 @PreAuthorize("@ss.hasPermission('member:level-record:query')")
46 46 public CommonResult<PageResult<MemberLevelRecordRespVO>> getLevelLogPage(@Valid MemberLevelRecordPageReqVO pageVO) {
47   - PageResult<MemberLevelRecordDO> pageResult = levelLogService.getLevelLogPage(pageVO);
  47 + PageResult<MemberLevelRecordDO> pageResult = levelLogService.getLevelRecordPage(pageVO);
48 48 return success(MemberLevelRecordConvert.INSTANCE.convertPage(pageResult));
49 49 }
50 50 }
... ...
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/convert/level/MemberExperienceRecordConvert.java
... ... @@ -24,4 +24,7 @@ public interface MemberExperienceRecordConvert {
24 24  
25 25 PageResult<MemberExperienceRecordRespVO> convertPage(PageResult<MemberExperienceRecordDO> page);
26 26  
  27 + MemberExperienceRecordDO convert(Long userId, Integer experience, Integer totalExperience,
  28 + String bizId, Integer bizType,
  29 + String title, String description);
27 30 }
... ...
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/convert/level/MemberLevelRecordConvert.java
... ... @@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.member.convert.level;
2 2  
3 3 import cn.iocoder.yudao.framework.common.pojo.PageResult;
4 4 import cn.iocoder.yudao.module.member.controller.admin.level.vo.log.MemberLevelRecordRespVO;
  5 +import cn.iocoder.yudao.module.member.dal.dataobject.level.MemberLevelDO;
5 6 import cn.iocoder.yudao.module.member.dal.dataobject.level.MemberLevelRecordDO;
6 7 import org.mapstruct.Mapper;
7 8 import org.mapstruct.factory.Mappers;
... ... @@ -24,4 +25,13 @@ public interface MemberLevelRecordConvert {
24 25  
25 26 PageResult<MemberLevelRecordRespVO> convertPage(PageResult<MemberLevelRecordDO> page);
26 27  
  28 + default MemberLevelRecordDO copyTo(MemberLevelDO from, MemberLevelRecordDO to) {
  29 + if (from != null) {
  30 + to.setLevelId(from.getId());
  31 + to.setLevel(from.getLevel());
  32 + to.setDiscount(from.getDiscount());
  33 + to.setExperience(from.getExperience());
  34 + }
  35 + return to;
  36 + }
27 37 }
... ...
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/dataobject/level/MemberLevelRecordDO.java
... ... @@ -52,7 +52,6 @@ public class MemberLevelRecordDO extends BaseDO {
52 52 * 会员此时的经验
53 53 */
54 54 private Integer userExperience;
55   - // TODO @疯狂:是不是 remark 和 description 可以合并成 description 就够了
56 55 /**
57 56 * 备注
58 57 */
... ...
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/user/MemberUserMapper.java
... ... @@ -7,7 +7,6 @@ import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
7 7 import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
8 8 import cn.iocoder.yudao.module.member.controller.admin.user.vo.MemberUserPageReqVO;
9 9 import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO;
10   -import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
11 10 import org.apache.ibatis.annotations.Mapper;
12 11  
13 12 import java.util.List;
... ... @@ -50,19 +49,6 @@ public interface MemberUserMapper extends BaseMapperX&lt;MemberUserDO&gt; {
50 49 .orderByDesc(MemberUserDO::getId));
51 50 }
52 51  
53   - /**
54   - * 取消会员的等级
55   - *
56   - * @param userId 会员编号
57   - * @return 受影响的行数
58   - */
59   - default int updateUserLevelToNull(Long userId) {
60   - return update(null, new LambdaUpdateWrapper<MemberUserDO>()
61   - .eq(MemberUserDO::getId, userId)
62   - .set(MemberUserDO::getExperience, 0)
63   - .set(MemberUserDO::getLevelId, null));
64   - }
65   -
66 52 default Long selectCountByGroupId(Long groupId) {
67 53 return selectCount(MemberUserDO::getGroupId, groupId);
68 54 }
... ...
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/level/MemberExperienceRecordService.java
... ... @@ -21,7 +21,7 @@ public interface MemberExperienceRecordService {
21 21 * @param id 编号
22 22 * @return 会员经验记录
23 23 */
24   - MemberExperienceRecordDO getExperienceLog(Long id);
  24 + MemberExperienceRecordDO getExperienceRecord(Long id);
25 25  
26 26 /**
27 27 * 获得会员经验记录列表
... ... @@ -29,7 +29,7 @@ public interface MemberExperienceRecordService {
29 29 * @param ids 编号
30 30 * @return 会员经验记录列表
31 31 */
32   - List<MemberExperienceRecordDO> getExperienceLogList(Collection<Long> ids);
  32 + List<MemberExperienceRecordDO> getExperienceRecordList(Collection<Long> ids);
33 33  
34 34 /**
35 35 * 获得会员经验记录分页
... ... @@ -37,26 +37,7 @@ public interface MemberExperienceRecordService {
37 37 * @param pageReqVO 分页查询
38 38 * @return 会员经验记录分页
39 39 */
40   - PageResult<MemberExperienceRecordDO> getExperienceLogPage(MemberExperienceRecordPageReqVO pageReqVO);
41   -
42   - /**
43   - * 获得会员经验记录列表, 用于 Excel 导出
44   - *
45   - * @param exportReqVO 查询条件
46   - * @return 会员经验记录列表
47   - */
48   - List<MemberExperienceLogDO> getExperienceLogList(MemberExperienceLogExportReqVO exportReqVO);
49   -
50   - // TODO @疯狂:类似 MemberLevelLogService 的方法,这里也需要提供一个通用的方法,用于创建经验变动记录
51   -
52   - /**
53   - * 创建 手动调整 经验变动记录
54   - *
55   - * @param userId 会员编号
56   - * @param experience 变动经验值
57   - * @param totalExperience 会员当前的经验
58   - */
59   - void createAdjustLog(Long userId, int experience, int totalExperience);
  40 + PageResult<MemberExperienceRecordDO> getExperienceRecordPage(MemberExperienceRecordPageReqVO pageReqVO);
60 41  
61 42 /**
62 43 * 根据业务类型, 创建 经验变动记录
... ... @@ -67,5 +48,6 @@ public interface MemberExperienceRecordService {
67 48 * @param bizType 业务类型
68 49 * @param bizId 业务ID
69 50 */
70   - void createBizLog(Long userId, int experience, int totalExperience, MemberExperienceBizTypeEnum bizType, String bizId);
  51 + void createExperienceRecord(Long userId, Integer experience, Integer totalExperience,
  52 + MemberExperienceBizTypeEnum bizType, String bizId);
71 53 }
... ...
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/level/MemberExperienceRecordServiceImpl.java
... ... @@ -3,6 +3,7 @@ package cn.iocoder.yudao.module.member.service.level;
3 3 import cn.hutool.core.util.StrUtil;
4 4 import cn.iocoder.yudao.framework.common.pojo.PageResult;
5 5 import cn.iocoder.yudao.module.member.controller.admin.level.vo.experience.MemberExperienceRecordPageReqVO;
  6 +import cn.iocoder.yudao.module.member.convert.level.MemberExperienceRecordConvert;
6 7 import cn.iocoder.yudao.module.member.dal.dataobject.level.MemberExperienceRecordDO;
7 8 import cn.iocoder.yudao.module.member.dal.mysql.level.MemberExperienceRecordMapper;
8 9 import cn.iocoder.yudao.module.member.enums.MemberExperienceBizTypeEnum;
... ... @@ -27,38 +28,29 @@ public class MemberExperienceRecordServiceImpl implements MemberExperienceRecord
27 28  
28 29  
29 30 @Override
30   - public MemberExperienceRecordDO getExperienceLog(Long id) {
  31 + public MemberExperienceRecordDO getExperienceRecord(Long id) {
31 32 return experienceLogMapper.selectById(id);
32 33 }
33 34  
34 35 @Override
35   - public List<MemberExperienceRecordDO> getExperienceLogList(Collection<Long> ids) {
  36 + public List<MemberExperienceRecordDO> getExperienceRecordList(Collection<Long> ids) {
36 37 return experienceLogMapper.selectBatchIds(ids);
37 38 }
38 39  
39 40 @Override
40   - public PageResult<MemberExperienceRecordDO> getExperienceLogPage(MemberExperienceRecordPageReqVO pageReqVO) {
  41 + public PageResult<MemberExperienceRecordDO> getExperienceRecordPage(MemberExperienceRecordPageReqVO pageReqVO) {
41 42 return experienceLogMapper.selectPage(pageReqVO);
42 43 }
43 44  
44 45 @Override
45   - public void createAdjustLog(Long userId, int experience, int totalExperience) {
46   - // 管理员调整时, 没有业务编号, 记录对应的枚举值
47   - String bizId = MemberExperienceBizTypeEnum.ADMIN.getValue() + "";
48   - this.createBizLog(userId, experience, totalExperience, MemberExperienceBizTypeEnum.ADMIN, bizId);
49   - }
50   -
51   - @Override
52   - public void createBizLog(Long userId, int experience, int totalExperience, MemberExperienceBizTypeEnum bizType, String bizId) {
53   - MemberExperienceRecordDO experienceLogDO = new MemberExperienceRecordDO();
54   - experienceLogDO.setUserId(userId);
55   - experienceLogDO.setExperience(experience);
56   - experienceLogDO.setTotalExperience(totalExperience);
57   - experienceLogDO.setBizId(bizId);
58   - experienceLogDO.setBizType(bizType.getValue());
59   - experienceLogDO.setTitle(bizType.getTitle());
60   - experienceLogDO.setDescription(StrUtil.format(bizType.getDesc(), experience));
61   - experienceLogMapper.insert(experienceLogDO);
  46 + public void createExperienceRecord(Long userId, Integer experience, Integer totalExperience,
  47 + MemberExperienceBizTypeEnum bizType, String bizId) {
  48 + String description = StrUtil.format(bizType.getDesc(), experience);
  49 + MemberExperienceRecordDO recordDO = MemberExperienceRecordConvert.INSTANCE.convert(userId,
  50 + experience, totalExperience,
  51 + bizId, bizType.getValue(), bizType.getTitle(),
  52 + description);
  53 + experienceLogMapper.insert(recordDO);
62 54 }
63 55  
64 56 }
... ...
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/level/MemberLevelRecordService.java
... ... @@ -2,9 +2,7 @@ package cn.iocoder.yudao.module.member.service.level;
2 2  
3 3 import cn.iocoder.yudao.framework.common.pojo.PageResult;
4 4 import cn.iocoder.yudao.module.member.controller.admin.level.vo.log.MemberLevelRecordPageReqVO;
5   -import cn.iocoder.yudao.module.member.dal.dataobject.level.MemberLevelDO;
6 5 import cn.iocoder.yudao.module.member.dal.dataobject.level.MemberLevelRecordDO;
7   -import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO;
8 6  
9 7 import java.util.Collection;
10 8 import java.util.List;
... ... @@ -17,19 +15,12 @@ import java.util.List;
17 15 public interface MemberLevelRecordService {
18 16  
19 17 /**
20   - * 删除会员等级记录
21   - *
22   - * @param id 编号
23   - */
24   - void deleteLevelLog(Long id);
25   -
26   - /**
27 18 * 获得会员等级记录
28 19 *
29 20 * @param id 编号
30 21 * @return 会员等级记录
31 22 */
32   - MemberLevelRecordDO getLevelLog(Long id);
  23 + MemberLevelRecordDO getLevelRecord(Long id);
33 24  
34 25 /**
35 26 * 获得会员等级记录列表
... ... @@ -37,7 +28,7 @@ public interface MemberLevelRecordService {
37 28 * @param ids 编号
38 29 * @return 会员等级记录列表
39 30 */
40   - List<MemberLevelRecordDO> getLevelLogList(Collection<Long> ids);
  31 + List<MemberLevelRecordDO> getLevelRecordList(Collection<Long> ids);
41 32  
42 33 /**
43 34 * 获得会员等级记录分页
... ... @@ -45,41 +36,12 @@ public interface MemberLevelRecordService {
45 36 * @param pageReqVO 分页查询
46 37 * @return 会员等级记录分页
47 38 */
48   - PageResult<MemberLevelRecordDO> getLevelLogPage(MemberLevelRecordPageReqVO pageReqVO);
49   -
50   - /**
51   - * 获得会员等级记录列表, 用于 Excel 导出
52   - *
53   - * @param exportReqVO 查询条件
54   - * @return 会员等级记录列表
55   - */
56   - List<MemberLevelLogDO> getLevelLogList(MemberLevelLogExportReqVO exportReqVO);
57   -
58   - // TODO @疯狂:把 createCancelLog、createAdjustLog、createAutoUpgradeLog 几个日志合并成一个通用的日志方法;整体的内容,交给 MemberLevelService 去做;以及对应的 level 变化的通知;
59   -
60   - /**
61   - * 创建记录: 取消等级
62   - *
63   - * @param userId 会员编号
64   - * @param reason 调整原因
65   - */
66   - void createCancelLog(Long userId, String reason);
67   -
68   - /**
69   - * 创建记录: 手动调整
70   - *
71   - * @param user 会员
72   - * @param level 等级
73   - * @param experience 变动经验值
74   - * @param reason 调整原因
75   - */
76   - void createAdjustLog(MemberUserDO user, MemberLevelDO level, int experience, String reason);
  39 + PageResult<MemberLevelRecordDO> getLevelRecordPage(MemberLevelRecordPageReqVO pageReqVO);
77 40  
78 41 /**
79   - * 创建记录: 自动升级
  42 + * 创建会员等级记录
80 43 *
81   - * @param user 会员
82   - * @param level 等级
  44 + * @param levelRecord 会员等级记录
83 45 */
84   - void createAutoUpgradeLog(MemberUserDO user, MemberLevelDO level);
  46 + void createLevelRecord(MemberLevelRecordDO levelRecord);
85 47 }
... ...
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/level/MemberLevelRecordServiceImpl.java
... ... @@ -2,9 +2,7 @@ package cn.iocoder.yudao.module.member.service.level;
2 2  
3 3 import cn.iocoder.yudao.framework.common.pojo.PageResult;
4 4 import cn.iocoder.yudao.module.member.controller.admin.level.vo.log.MemberLevelRecordPageReqVO;
5   -import cn.iocoder.yudao.module.member.dal.dataobject.level.MemberLevelDO;
6 5 import cn.iocoder.yudao.module.member.dal.dataobject.level.MemberLevelRecordDO;
7   -import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO;
8 6 import cn.iocoder.yudao.module.member.dal.mysql.level.MemberLevelRecordMapper;
9 7 import org.springframework.stereotype.Service;
10 8 import org.springframework.validation.annotation.Validated;
... ... @@ -28,14 +26,6 @@ public class MemberLevelRecordServiceImpl implements MemberLevelRecordService {
28 26 @Resource
29 27 private MemberLevelRecordMapper levelLogMapper;
30 28  
31   - @Override
32   - public void deleteLevelLog(Long id) {
33   - // 校验存在
34   - validateLevelLogExists(id);
35   - // 删除
36   - levelLogMapper.deleteById(id);
37   - }
38   -
39 29 private void validateLevelLogExists(Long id) {
40 30 if (levelLogMapper.selectById(id) == null) {
41 31 throw exception(LEVEL_LOG_NOT_EXISTS);
... ... @@ -43,67 +33,23 @@ public class MemberLevelRecordServiceImpl implements MemberLevelRecordService {
43 33 }
44 34  
45 35 @Override
46   - public MemberLevelRecordDO getLevelLog(Long id) {
  36 + public MemberLevelRecordDO getLevelRecord(Long id) {
47 37 return levelLogMapper.selectById(id);
48 38 }
49 39  
50 40 @Override
51   - public List<MemberLevelRecordDO> getLevelLogList(Collection<Long> ids) {
  41 + public List<MemberLevelRecordDO> getLevelRecordList(Collection<Long> ids) {
52 42 return levelLogMapper.selectBatchIds(ids);
53 43 }
54 44  
55 45 @Override
56   - public PageResult<MemberLevelRecordDO> getLevelLogPage(MemberLevelRecordPageReqVO pageReqVO) {
  46 + public PageResult<MemberLevelRecordDO> getLevelRecordPage(MemberLevelRecordPageReqVO pageReqVO) {
57 47 return levelLogMapper.selectPage(pageReqVO);
58 48 }
59 49  
60 50 @Override
61   - public void createCancelLog(Long userId, String reason) {
62   - MemberLevelRecordDO levelLogDO = new MemberLevelRecordDO();
63   - levelLogDO.setUserId(userId);
64   - levelLogDO.setRemark(reason);
65   - levelLogDO.setDescription("管理员取消");
66   - levelLogMapper.insert(levelLogDO);
67   -
68   - // 给会员发送等级变动消息
69   - notifyMember(userId, levelLogDO);
70   - }
71   -
72   - @Override
73   - public void createAdjustLog(MemberUserDO user, MemberLevelDO level, int experience, String reason) {
74   - MemberLevelRecordDO levelLogDO = new MemberLevelRecordDO();
75   - levelLogDO.setUserId(user.getId());
76   - levelLogDO.setLevelId(level.getId());
77   - levelLogDO.setLevel(level.getLevel());
78   - levelLogDO.setDiscount(level.getDiscount());
79   - levelLogDO.setUserExperience(level.getExperience());
80   - levelLogDO.setExperience(experience);
81   - levelLogDO.setRemark(reason);
82   - levelLogDO.setDescription("管理员调整为:" + level.getName());
83   - levelLogMapper.insert(levelLogDO);
84   -
85   - // 给会员发送等级变动消息
86   - notifyMember(user.getId(), levelLogDO);
87   - }
88   -
89   - @Override
90   - public void createAutoUpgradeLog(MemberUserDO user, MemberLevelDO level) {
91   - MemberLevelRecordDO levelLogDO = new MemberLevelRecordDO();
92   - levelLogDO.setUserId(user.getId());
93   - levelLogDO.setLevelId(level.getId());
94   - levelLogDO.setLevel(level.getLevel());
95   - levelLogDO.setDiscount(level.getDiscount());
96   - levelLogDO.setExperience(level.getExperience());
97   - levelLogDO.setUserExperience(user.getExperience());
98   - levelLogDO.setDescription("成为:" + level.getName());
99   - levelLogMapper.insert(levelLogDO);
100   -
101   - // 给会员发送等级变动消息
102   - notifyMember(user.getId(), levelLogDO);
103   - }
104   -
105   - private void notifyMember(Long userId, MemberLevelRecordDO level) {
106   - //todo: 给会员发消息
  51 + public void createLevelRecord(MemberLevelRecordDO levelRecord) {
  52 + levelLogMapper.insert(levelRecord);
107 53 }
108 54  
109 55 }
... ...
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/level/MemberLevelService.java
... ... @@ -100,5 +100,5 @@ public interface MemberLevelService {
100 100 * @param bizType 业务类型
101 101 * @param bizId 业务编号
102 102 */
103   - void plusExperience(Long userId, Integer experience, MemberExperienceBizTypeEnum bizType, String bizId);
  103 + void addExperience(Long userId, Integer experience, MemberExperienceBizTypeEnum bizType, String bizId);
104 104 }
... ...
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/level/MemberLevelServiceImpl.java
... ... @@ -10,11 +10,14 @@ import cn.iocoder.yudao.module.member.controller.admin.level.vo.level.MemberLeve
10 10 import cn.iocoder.yudao.module.member.controller.admin.level.vo.level.MemberLevelUpdateReqVO;
11 11 import cn.iocoder.yudao.module.member.controller.admin.user.vo.MemberUserUpdateLevelReqVO;
12 12 import cn.iocoder.yudao.module.member.convert.level.MemberLevelConvert;
  13 +import cn.iocoder.yudao.module.member.convert.level.MemberLevelRecordConvert;
13 14 import cn.iocoder.yudao.module.member.dal.dataobject.level.MemberLevelDO;
  15 +import cn.iocoder.yudao.module.member.dal.dataobject.level.MemberLevelRecordDO;
14 16 import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO;
15 17 import cn.iocoder.yudao.module.member.dal.mysql.level.MemberLevelMapper;
16 18 import cn.iocoder.yudao.module.member.dal.mysql.user.MemberUserMapper;
17 19 import cn.iocoder.yudao.module.member.enums.MemberExperienceBizTypeEnum;
  20 +import cn.iocoder.yudao.module.member.service.user.MemberUserService;
18 21 import com.google.common.annotations.VisibleForTesting;
19 22 import lombok.extern.slf4j.Slf4j;
20 23 import org.springframework.stereotype.Service;
... ... @@ -47,6 +50,8 @@ public class MemberLevelServiceImpl implements MemberLevelService {
47 50 private MemberExperienceRecordService memberExperienceRecordService;
48 51 @Resource
49 52 private MemberUserMapper memberUserMapper;
  53 + @Resource
  54 + private MemberUserService memberUserService;
50 55  
51 56 @Override
52 57 public Long createLevel(MemberLevelCreateReqVO createReqVO) {
... ... @@ -189,68 +194,73 @@ public class MemberLevelServiceImpl implements MemberLevelService {
189 194 return;
190 195 }
191 196  
192   - int experience;
193   - int totalExperience = 0;
194   - // 记录等级变动
  197 + MemberLevelRecordDO levelRecord = new MemberLevelRecordDO()
  198 + .setUserId(user.getId())
  199 + .setRemark(updateReqVO.getReason());
  200 + MemberLevelDO memberLevel = null;
195 201 if (updateReqVO.getLevelId() == null) {
196 202 // 取消用户等级时,为扣减经验
197   - experience = -user.getExperience();
198   -
199   - // 取消了会员的等级
200   - memberLevelRecordService.createCancelLog(user.getId(), updateReqVO.getReason());
201   - memberUserMapper.updateUserLevelToNull(user.getId());
  203 + levelRecord.setExperience(-user.getExperience());
  204 + levelRecord.setDescription("管理员取消了等级");
202 205 } else {
203   - MemberLevelDO level = validateLevelExists(updateReqVO.getLevelId());
  206 + memberLevel = validateLevelExists(updateReqVO.getLevelId());
  207 + // 复制等级配置
  208 + MemberLevelRecordConvert.INSTANCE.copyTo(memberLevel, levelRecord);
204 209 // 变动经验值 = 等级的升级经验 - 会员当前的经验;正数为增加经验,负数为扣减经验
205   - experience = level.getExperience() - user.getExperience();
  210 + levelRecord.setExperience(memberLevel.getExperience() - user.getExperience());
206 211 // 会员当前的经验 = 等级的升级经验
207   - totalExperience = level.getExperience();
208   -
209   - memberLevelRecordService.createAdjustLog(user, level, experience, updateReqVO.getReason());
210   -
211   - // 更新会员表上的等级编号、经验值
212   - updateUserLevelIdAndExperience(user.getId(), updateReqVO.getLevelId(), totalExperience);
  212 + levelRecord.setUserExperience(memberLevel.getExperience());
  213 + levelRecord.setDescription("管理员调整为:" + memberLevel.getName());
213 214 }
214 215  
  216 + // 记录等级变动
  217 + memberLevelRecordService.createLevelRecord(levelRecord);
  218 +
215 219 // 记录会员经验变动
216   - memberExperienceRecordService.createAdjustLog(user.getId(), experience, totalExperience);
  220 + memberExperienceRecordService.createExperienceRecord(user.getId(),
  221 + levelRecord.getExperience(), levelRecord.getUserExperience(),
  222 + MemberExperienceBizTypeEnum.ADMIN, MemberExperienceBizTypeEnum.ADMIN.getValue() + "");
  223 +
  224 + // 更新会员表上的等级编号、经验值
  225 + memberUserService.updateLevelIdAndExperience(user.getId(), updateReqVO.getLevelId(), levelRecord.getUserExperience());
  226 +
  227 + // 给会员发送等级变动消息
  228 + notifyMemberLevelChange(user.getId(), memberLevel);
217 229 }
218 230  
219   - // TODO @疯狂:方法名,建议改成 increase 或者 add 经验,和项目更统一一些
220   - // TODO @疯狂:bizType 改成具体数值,主要是枚举在 api 不好传递,rpc 情况下
221 231 @Override
222 232 @Transactional(rollbackFor = Exception.class)
223   - public void plusExperience(Long userId, Integer experience, MemberExperienceBizTypeEnum bizType, String bizId) {
  233 + public void addExperience(Long userId, Integer experience, MemberExperienceBizTypeEnum bizType, String bizId) {
224 234 if (experience == 0) {
225 235 return;
226 236 }
227 237  
228 238 MemberUserDO user = memberUserMapper.selectById(userId);
229 239  
230   - // 防止扣出负数
231 240 int userExperience = NumberUtil.max(user.getExperience() + experience, 0);
  241 + MemberLevelRecordDO levelRecord = new MemberLevelRecordDO()
  242 + .setUserId(user.getId())
  243 + .setExperience(experience)
  244 + // 防止扣出负数
  245 + .setUserExperience(userExperience);
  246 +
232 247 // 创建经验记录
233   - memberExperienceRecordService.createBizLog(userId, experience, userExperience, bizType, bizId);
  248 + memberExperienceRecordService.createExperienceRecord(userId, experience, userExperience,
  249 + bizType, bizId);
234 250  
235 251 // 计算会员等级
236 252 MemberLevelDO newLevel = calculateNewLevel(user, userExperience);
237   - Long newLevelId = null;
238 253 if (newLevel != null) {
239   - newLevelId = newLevel.getId();
  254 + // 复制等级配置
  255 + MemberLevelRecordConvert.INSTANCE.copyTo(newLevel, levelRecord);
240 256 // 保存等级变更记录
241   - memberLevelRecordService.createAutoUpgradeLog(user, newLevel);
  257 + memberLevelRecordService.createLevelRecord(levelRecord);
  258 + // 给会员发送等级变动消息
  259 + notifyMemberLevelChange(userId, newLevel);
242 260 }
243 261  
244 262 // 更新会员表上的等级编号、经验值
245   - updateUserLevelIdAndExperience(user.getId(), newLevelId, userExperience);
246   - }
247   -
248   - // TODO @疯狂:让 memberUserService 那开个方法;每个模块,不直接操作对方的 mapper;
249   - private void updateUserLevelIdAndExperience(Long userId, Long levelId, Integer experience) {
250   - memberUserMapper.updateById(new MemberUserDO()
251   - .setId(userId)
252   - .setLevelId(levelId).setExperience(experience)
253   - );
  263 + memberUserService.updateLevelIdAndExperience(user.getId(), levelRecord.getLevelId(), userExperience);
254 264 }
255 265  
256 266 /**
... ... @@ -258,7 +268,7 @@ public class MemberLevelServiceImpl implements MemberLevelService {
258 268 *
259 269 * @param user 会员
260 270 * @param userExperience 会员当前的经验值
261   - * @return 会员等级编号,null表示无变化
  271 + * @return 会员新的等级,null表示无变化
262 272 */
263 273 private MemberLevelDO calculateNewLevel(MemberUserDO user, int userExperience) {
264 274 List<MemberLevelDO> list = getEnableLevelList();
... ... @@ -283,4 +293,8 @@ public class MemberLevelServiceImpl implements MemberLevelService {
283 293  
284 294 return matchLevel;
285 295 }
  296 +
  297 + private void notifyMemberLevelChange(Long userId, MemberLevelDO level) {
  298 + //todo: 给会员发消息
  299 + }
286 300 }
... ...
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/user/MemberUserService.java
... ... @@ -126,4 +126,12 @@ public interface MemberUserService {
126 126 */
127 127 PageResult<MemberUserDO> getUserPage(MemberUserPageReqVO pageReqVO);
128 128  
  129 + /**
  130 + * 更新用户的等级和经验
  131 + *
  132 + * @param id 用户编号
  133 + * @param levelId 用户等级
  134 + * @param experience 用户经验
  135 + */
  136 + void updateLevelIdAndExperience(Long id, Long levelId, Integer experience);
129 137 }
... ...
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/user/MemberUserServiceImpl.java
... ... @@ -228,4 +228,16 @@ public class MemberUserServiceImpl implements MemberUserService {
228 228 return memberUserMapper.selectPage(pageReqVO);
229 229 }
230 230  
  231 + @Override
  232 + public void updateLevelIdAndExperience(Long id, Long levelId, Integer experience) {
  233 + if (levelId == null) {
  234 + // 0 代表无等级:防止UpdateById时,会被过滤掉的问题
  235 + levelId = 0L;
  236 + }
  237 + memberUserMapper.updateById(new MemberUserDO()
  238 + .setId(id)
  239 + .setLevelId(levelId).setExperience(experience)
  240 + );
  241 + }
  242 +
231 243 }
... ...