Commit 9b6f5bd5030d3c06b5e41dff9af46403576a776c

Authored by YunaiV
1 parent 06199895

code review:会员等级

Showing 18 changed files with 63 additions and 181 deletions
sql/mysql/member_level.sql deleted
1   --- 会员表增加字段
2   -alter table member_user add column experience int not null default 0 comment '经验';
3   -alter table member_user add column level_id bigint comment '等级编号';
4   -
5   --- 增加3张表
6   -create table member_level
7   -(
8   - id bigint auto_increment comment '编号' primary key,
9   - name varchar(30) default '' not null comment '等级名称',
10   - experience int default 0 not null comment '升级经验',
11   - level int default 0 not null comment '等级',
12   - discount_percent tinyint default 100 not null comment '享受折扣',
13   - icon varchar(255) default '' not null comment '等级图标',
14   - background_url varchar(255) default '' not null comment '等级背景图',
15   - status tinyint default 0 not null comment '状态',
16   - creator varchar(64) default '' null comment '创建者',
17   - create_time datetime default CURRENT_TIMESTAMP not null comment '创建时间',
18   - updater varchar(64) default '' null comment '更新者',
19   - update_time datetime default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment '更新时间',
20   - deleted bit default b'0' not null comment '是否删除',
21   - tenant_id bigint default 0 not null comment '租户编号'
22   -)
23   - comment '会员等级';
24   -
25   -create table member_level_record
26   -(
27   - id bigint auto_increment comment '编号' primary key,
28   - user_id bigint default 0 not null comment '用户编号',
29   - level_id bigint default 0 not null comment '等级编号',
30   - level int default 0 not null comment '会员等级',
31   - discount_percent tinyint default 100 not null comment '享受折扣',
32   - experience int default 0 not null comment '升级经验',
33   - user_experience int default 0 not null comment '会员此时的经验',
34   - remark varchar(255) default '' not null comment '备注',
35   - description varchar(255) default '' not null comment '描述',
36   - creator varchar(64) default '' null comment '创建者',
37   - create_time datetime default CURRENT_TIMESTAMP not null comment '创建时间',
38   - updater varchar(64) default '' null comment '更新者',
39   - update_time datetime default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment '更新时间',
40   - deleted bit default b'0' not null comment '是否删除',
41   - tenant_id bigint default 0 not null comment '租户编号'
42   -)
43   - comment '会员等级记录';
44   -
45   -create index idx_user_id on member_level_record (user_id) comment '会员等级记录-用户编号';
46   -
47   -create table member_experience_record
48   -(
49   - id bigint auto_increment comment '编号' primary key,
50   - user_id bigint default 0 not null comment '用户编号',
51   - biz_id varchar(64) default '' not null comment '业务编号',
52   - biz_type tinyint default 0 not null comment '业务类型',
53   - title varchar(30) default '' not null comment '标题',
54   - experience int default 0 not null comment '经验',
55   - total_experience int default 0 not null comment '变更后的经验',
56   - description varchar(512) default '' not null comment '描述',
57   - creator varchar(64) default '' null comment '创建者',
58   - create_time datetime default CURRENT_TIMESTAMP not null comment '创建时间',
59   - updater varchar(64) default '' null comment '更新者',
60   - update_time datetime default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment '更新时间',
61   - deleted bit default b'0' not null comment '是否删除',
62   - tenant_id bigint default 0 not null comment '租户编号'
63   -)
64   - comment '会员经验记录';
65   -
66   -create index idx_user_id on member_experience_record (user_id) comment '会员经验记录-用户编号';
67   -create index idx_user_biz_type on member_experience_record (user_id, biz_type) comment '会员经验记录-用户业务类型';
68   -
69   --- 增加字典
70   -insert system_dict_type(name, type) values ('会员经验业务类型', 'member_experience_biz_type');
71   -insert system_dict_data(dict_type, label, value, sort) values ('member_experience_biz_type', '管理员调整', '0', 0);
72   -insert system_dict_data(dict_type, label, value, sort) values ('member_experience_biz_type', '邀新奖励', '1', 1);
73   -insert system_dict_data(dict_type, label, value, sort) values ('member_experience_biz_type', '下单奖励', '2', 2);
74   -insert system_dict_data(dict_type, label, value, sort) values ('member_experience_biz_type', '退单扣除', '3', 3);
75   -insert system_dict_data(dict_type, label, value, sort) values ('member_experience_biz_type', '签到奖励', '4', 4);
76   -insert system_dict_data(dict_type, label, value, sort) values ('member_experience_biz_type', '抽奖奖励', '5', 5);
77   -
78   --- 菜单 SQL
79   -INSERT INTO system_menu(name, permission, type, sort, parent_id, path, icon, component, status, component_name)
80   -VALUES ('会员等级', '', 2, 3, 2262, 'level', '', 'member/level/index', 0, 'MemberLevel');
81   -
82   --- 按钮父菜单ID
83   --- 暂时只支持 MySQL。如果你是 Oracle、PostgreSQL、SQLServer 的话,需要手动修改 @parentId 的部分的代码
84   -SELECT @parentId := LAST_INSERT_ID();
85   -
86   --- 按钮 SQL
87   -INSERT INTO system_menu(name, permission, type, sort, parent_id, path, icon, component, status)
88   -VALUES ('会员等级查询', 'member:level:query', 3, 1, @parentId, '', '', '', 0);
89   -INSERT INTO system_menu(name, permission, type, sort, parent_id, path, icon, component, status)
90   -VALUES ('会员等级创建', 'member:level:create', 3, 2, @parentId, '', '', '', 0);
91   -INSERT INTO system_menu(name, permission, type, sort, parent_id, path, icon, component, status)
92   -VALUES ('会员等级更新', 'member:level:update', 3, 3, @parentId, '', '', '', 0);
93   -INSERT INTO system_menu(name, permission, type, sort, parent_id, path, icon, component, status)
94   -VALUES ('会员等级删除', 'member:level:delete', 3, 4, @parentId, '', '', '', 0);
95   -
96   --- 会员用户管理: 增加按钮权限
97   -INSERT INTO system_menu(name, permission, type, sort, parent_id, path, icon, component, status)
98   -VALUES ('用户等级修改', 'member:user:update-level', 3, 5, 2309, '', '', '', 0);
99 0 \ No newline at end of file
yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/api/level/MemberLevelApi.java
... ... @@ -3,7 +3,7 @@ package cn.iocoder.yudao.module.member.api.level;
3 3 import cn.iocoder.yudao.module.member.enums.MemberExperienceBizTypeEnum;
4 4  
5 5 /**
6   - * 会员等级 API接口
  6 + * 会员等级 API 接口
7 7 *
8 8 * @author owen
9 9 */
... ... @@ -17,5 +17,6 @@ public interface MemberLevelApi {
17 17 * @param bizType 业务类型 {@link MemberExperienceBizTypeEnum}
18 18 * @param bizId 业务编号
19 19 */
20   - void plusExperience(Long userId, Integer experience, Integer bizType, String bizId);
  20 + void addExperience(Long userId, Integer experience, Integer bizType, String bizId);
  21 +
21 22 }
... ...
yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/enums/ErrorCodeConstants.java
... ... @@ -48,8 +48,6 @@ public interface ErrorCodeConstants {
48 48 ErrorCode LEVEL_EXPERIENCE_MAX = new ErrorCode(1004011004, "升级经验必须小于下一个等级[{}]设置的升级经验[{}]");
49 49 ErrorCode LEVEL_HAS_USER = new ErrorCode(1004011005, "用户等级下存在用户,无法删除");
50 50  
51   - ErrorCode LEVEL_LOG_NOT_EXISTS = new ErrorCode(1004011100, "用户等级记录不存在");
52   - ErrorCode EXPERIENCE_LOG_NOT_EXISTS = new ErrorCode(1004011200, "用户经验记录不存在");
53 51 ErrorCode EXPERIENCE_BIZ_NOT_SUPPORT = new ErrorCode(1004011201, "用户经验业务类型不支持");
54 52  
55 53 //========== 用户分组 1004012000 ==========
... ...
yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/enums/MemberExperienceBizTypeEnum.java
... ... @@ -11,18 +11,20 @@ import lombok.Getter;
11 11 @Getter
12 12 @AllArgsConstructor
13 13 public enum MemberExperienceBizTypeEnum {
  14 +
14 15 /**
15 16 * 管理员调整、邀请新用户、下单、退单、签到、抽奖
16 17 */
17   - ADMIN(0, "管理员调整","管理员调整获得{}经验"),
18   - INVITE_REGISTER(1, "邀新奖励","邀请好友获得{}经验"),
19   - ORDER(2, "下单奖励", "下单获得{}经验"),
20   - REFUND(3, "退单扣除","退单获得{}经验"),
21   - SIGN_IN(4, "签到奖励","签到获得{}经验"),
22   - LOTTERY(5, "抽奖奖励","抽奖获得{}经验"),
  18 + ADMIN(0, "管理员调整","管理员调整获得 {} 经验"),
  19 + INVITE_REGISTER(1, "邀新奖励","邀请好友获得 {} 经验"),
  20 + ORDER(2, "下单奖励", "下单获得 {} 经验"),
  21 + REFUND(3, "退单扣除","退单获得 {} 经验"),
  22 + SIGN_IN(4, "签到奖励","签到获得 {} 经验"),
  23 + LOTTERY(5, "抽奖奖励","抽奖获得 {} 经验"),
23 24 ;
24 25  
25   - private final int value;
  26 + private final int type;
26 27 private final String title;
27   - private final String desc;
  28 + private final String description;
  29 +
28 30 }
... ...
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/api/level/MemberLevelApiImpl.java
... ... @@ -24,12 +24,15 @@ public class MemberLevelApiImpl implements MemberLevelApi {
24 24 @Resource
25 25 private MemberLevelService memberLevelService;
26 26  
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()));
  27 + @Override
  28 + public void addExperience(Long userId, Integer experience, Integer bizType, String bizId) {
  29 + // TODO @疯狂:可以在 MemberExperienceBizTypeEnum 增加一个方法,获得哈。
  30 + MemberExperienceBizTypeEnum bizTypeEnum = EnumUtil.getBy(MemberExperienceBizTypeEnum.class,
  31 + e -> Objects.equals(bizType, e.getType()));
29 32 if (bizTypeEnum == null) {
30 33 throw exception(EXPERIENCE_BIZ_NOT_SUPPORT);
31 34 }
32   -
33 35 memberLevelService.addExperience(userId, experience, bizTypeEnum, bizId);
34 36 }
  37 +
35 38 }
... ...
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/level/MemberExperienceRecordController.java
... ... @@ -35,7 +35,7 @@ public class MemberExperienceRecordController {
35 35 @Operation(summary = "获得会员经验记录")
36 36 @Parameter(name = "id", description = "编号", required = true, example = "1024")
37 37 @PreAuthorize("@ss.hasPermission('member:experience-record:query')")
38   - public CommonResult<MemberExperienceRecordRespVO> getExperienceLog(@RequestParam("id") Long id) {
  38 + public CommonResult<MemberExperienceRecordRespVO> getExperienceRecord(@RequestParam("id") Long id) {
39 39 MemberExperienceRecordDO experienceLog = experienceLogService.getExperienceRecord(id);
40 40 return success(MemberExperienceRecordConvert.INSTANCE.convert(experienceLog));
41 41 }
... ... @@ -43,7 +43,8 @@ public class MemberExperienceRecordController {
43 43 @GetMapping("/page")
44 44 @Operation(summary = "获得会员经验记录分页")
45 45 @PreAuthorize("@ss.hasPermission('member:experience-record:query')")
46   - public CommonResult<PageResult<MemberExperienceRecordRespVO>> getExperienceLogPage(@Valid MemberExperienceRecordPageReqVO pageVO) {
  46 + public CommonResult<PageResult<MemberExperienceRecordRespVO>> getExperienceRecordPage(
  47 + @Valid MemberExperienceRecordPageReqVO pageVO) {
47 48 PageResult<MemberExperienceRecordDO> pageResult = experienceLogService.getExperienceRecordPage(pageVO);
48 49 return success(MemberExperienceRecordConvert.INSTANCE.convertPage(pageResult));
49 50 }
... ...
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/level/MemberLevelRecordController.java
... ... @@ -35,7 +35,7 @@ public class MemberLevelRecordController {
35 35 @Operation(summary = "获得会员等级记录")
36 36 @Parameter(name = "id", description = "编号", required = true, example = "1024")
37 37 @PreAuthorize("@ss.hasPermission('member:level-record:query')")
38   - public CommonResult<MemberLevelRecordRespVO> getLevelLog(@RequestParam("id") Long id) {
  38 + public CommonResult<MemberLevelRecordRespVO> getLevelRecord(@RequestParam("id") Long id) {
39 39 MemberLevelRecordDO levelLog = levelLogService.getLevelRecord(id);
40 40 return success(MemberLevelRecordConvert.INSTANCE.convert(levelLog));
41 41 }
... ... @@ -43,8 +43,10 @@ public class MemberLevelRecordController {
43 43 @GetMapping("/page")
44 44 @Operation(summary = "获得会员等级记录分页")
45 45 @PreAuthorize("@ss.hasPermission('member:level-record:query')")
46   - public CommonResult<PageResult<MemberLevelRecordRespVO>> getLevelLogPage(@Valid MemberLevelRecordPageReqVO pageVO) {
  46 + public CommonResult<PageResult<MemberLevelRecordRespVO>> getLevelRecordPage(
  47 + @Valid MemberLevelRecordPageReqVO pageVO) {
47 48 PageResult<MemberLevelRecordDO> pageResult = levelLogService.getLevelRecordPage(pageVO);
48 49 return success(MemberLevelRecordConvert.INSTANCE.convertPage(pageResult));
49 50 }
  51 +
50 52 }
... ...
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/level/vo/level/MemberLevelListReqVO.java
... ... @@ -4,7 +4,7 @@ import io.swagger.v3.oas.annotations.media.Schema;
4 4 import lombok.Data;
5 5 import lombok.ToString;
6 6  
7   -@Schema(description = "管理后台 - 会员等级分页 Request VO")
  7 +@Schema(description = "管理后台 - 会员等级列表筛选 Request VO")
8 8 @Data
9 9 @ToString(callSuper = true)
10 10 public class MemberLevelListReqVO {
... ...
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/user/MemberUserController.java
... ... @@ -25,10 +25,14 @@ import org.springframework.web.bind.annotation.*;
25 25  
26 26 import javax.annotation.Resource;
27 27 import javax.validation.Valid;
28   -import java.util.*;
  28 +import java.util.Collection;
  29 +import java.util.List;
  30 +import java.util.Objects;
  31 +import java.util.Set;
29 32 import java.util.stream.Collectors;
30 33  
31 34 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
  35 +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
32 36  
33 37 @Tag(name = "管理后台 - 会员用户")
34 38 @RestController
... ... @@ -79,26 +83,19 @@ public class MemberUserController {
79 83 return success(PageResult.empty());
80 84 }
81 85  
82   - Set<Long> groupIds = new HashSet<>(pageResult.getList().size());
83   -
84 86 // 处理用户标签返显
85 87 Set<Long> tagIds = pageResult.getList().stream()
86   - .peek(m -> {
87   - if (m.getGroupId() != null) {
88   - groupIds.add(m.getGroupId());
89   - }
90   - })
91 88 .map(MemberUserDO::getTagIds)
92 89 .filter(Objects::nonNull)
93 90 .flatMap(Collection::stream)
94 91 .collect(Collectors.toSet());
95 92 List<MemberTagDO> tags = memberTagService.getTagList(tagIds);
96   -
97 93 // 处理用户级别返显
98   - List<MemberLevelDO> levels = memberLevelService.getEnableLevelList();
  94 + List<MemberLevelDO> levels = memberLevelService.getLevelList(
  95 + convertSet(pageResult.getList(), MemberUserDO::getLevelId));
99 96 // 处理用户分组返显
100   - List<MemberGroupDO> groups = memberGroupService.getGroupList(groupIds);
101   -
  97 + List<MemberGroupDO> groups = memberGroupService.getGroupList(
  98 + convertSet(pageResult.getList(), MemberUserDO::getGroupId));
102 99 return success(MemberUserConvert.INSTANCE.convertPage(pageResult, tags, levels, groups));
103 100 }
104 101  
... ...
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/convert/user/MemberUserConvert.java
... ... @@ -42,12 +42,10 @@ public interface MemberUserConvert {
42 42 List<MemberLevelDO> levels,
43 43 List<MemberGroupDO> groups) {
44 44 PageResult<MemberUserRespVO> result = convertPage(pageResult);
45   -
46 45 // 处理关联数据
47 46 Map<Long, String> tagMap = convertMap(tags, MemberTagDO::getId, MemberTagDO::getName);
48 47 Map<Long, String> levelMap = convertMap(levels, MemberLevelDO::getId, MemberLevelDO::getName);
49 48 Map<Long, String> groupMap = convertMap(groups, MemberGroupDO::getId, MemberGroupDO::getName);
50   -
51 49 // 填充关联数据
52 50 for (MemberUserRespVO vo : result.getList()) {
53 51 vo.setTagNames(convertList(vo.getTagIds(), tagMap::get));
... ... @@ -56,4 +54,5 @@ public interface MemberUserConvert {
56 54 }
57 55 return result;
58 56 }
  57 +
59 58 }
... ...
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/group/MemberGroupServiceImpl.java
... ... @@ -69,6 +69,7 @@ public class MemberGroupServiceImpl implements MemberGroupService {
69 69 }
70 70 }
71 71  
  72 + // TODO @疯狂:不要直接调用 memberUserMapper,需要对方 service 提供方法
72 73 void validateGroupHasUser(Long id) {
73 74 Long count = memberUserMapper.selectCountByGroupId(id);
74 75 if (count > 0) {
... ...
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/level/MemberExperienceRecordServiceImpl.java
... ... @@ -26,7 +26,6 @@ public class MemberExperienceRecordServiceImpl implements MemberExperienceRecord
26 26 @Resource
27 27 private MemberExperienceRecordMapper experienceLogMapper;
28 28  
29   -
30 29 @Override
31 30 public MemberExperienceRecordDO getExperienceRecord(Long id) {
32 31 return experienceLogMapper.selectById(id);
... ... @@ -45,12 +44,11 @@ public class MemberExperienceRecordServiceImpl implements MemberExperienceRecord
45 44 @Override
46 45 public void createExperienceRecord(Long userId, Integer experience, Integer totalExperience,
47 46 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);
  47 + String description = StrUtil.format(bizType.getDescription(), experience);
  48 + MemberExperienceRecordDO record = MemberExperienceRecordConvert.INSTANCE.convert(
  49 + userId, experience, totalExperience,
  50 + bizId, bizType.getType(), bizType.getTitle(), description);
  51 + experienceLogMapper.insert(record);
54 52 }
55 53  
56 54 }
... ...
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/level/MemberLevelRecordService.java
... ... @@ -4,9 +4,6 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult;
4 4 import cn.iocoder.yudao.module.member.controller.admin.level.vo.log.MemberLevelRecordPageReqVO;
5 5 import cn.iocoder.yudao.module.member.dal.dataobject.level.MemberLevelRecordDO;
6 6  
7   -import java.util.Collection;
8   -import java.util.List;
9   -
10 7 /**
11 8 * 会员等级记录 Service 接口
12 9 *
... ... @@ -23,14 +20,6 @@ public interface MemberLevelRecordService {
23 20 MemberLevelRecordDO getLevelRecord(Long id);
24 21  
25 22 /**
26   - * 获得会员等级记录列表
27   - *
28   - * @param ids 编号
29   - * @return 会员等级记录列表
30   - */
31   - List<MemberLevelRecordDO> getLevelRecordList(Collection<Long> ids);
32   -
33   - /**
34 23 * 获得会员等级记录分页
35 24 *
36 25 * @param pageReqVO 分页查询
... ... @@ -44,4 +33,5 @@ public interface MemberLevelRecordService {
44 33 * @param levelRecord 会员等级记录
45 34 */
46 35 void createLevelRecord(MemberLevelRecordDO levelRecord);
  36 +
47 37 }
... ...
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/level/MemberLevelRecordServiceImpl.java
... ... @@ -8,11 +8,6 @@ import org.springframework.stereotype.Service;
8 8 import org.springframework.validation.annotation.Validated;
9 9  
10 10 import javax.annotation.Resource;
11   -import java.util.Collection;
12   -import java.util.List;
13   -
14   -import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
15   -import static cn.iocoder.yudao.module.member.enums.ErrorCodeConstants.LEVEL_LOG_NOT_EXISTS;
16 11  
17 12 /**
18 13 * 会员等级记录 Service 实现类
... ... @@ -26,23 +21,12 @@ public class MemberLevelRecordServiceImpl implements MemberLevelRecordService {
26 21 @Resource
27 22 private MemberLevelRecordMapper levelLogMapper;
28 23  
29   - private void validateLevelLogExists(Long id) {
30   - if (levelLogMapper.selectById(id) == null) {
31   - throw exception(LEVEL_LOG_NOT_EXISTS);
32   - }
33   - }
34   -
35 24 @Override
36 25 public MemberLevelRecordDO getLevelRecord(Long id) {
37 26 return levelLogMapper.selectById(id);
38 27 }
39 28  
40 29 @Override
41   - public List<MemberLevelRecordDO> getLevelRecordList(Collection<Long> ids) {
42   - return levelLogMapper.selectBatchIds(ids);
43   - }
44   -
45   - @Override
46 30 public PageResult<MemberLevelRecordDO> getLevelRecordPage(MemberLevelRecordPageReqVO pageReqVO) {
47 31 return levelLogMapper.selectPage(pageReqVO);
48 32 }
... ...
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/level/MemberLevelService.java
... ... @@ -65,7 +65,6 @@ public interface MemberLevelService {
65 65 */
66 66 List<MemberLevelDO> getLevelList(MemberLevelListReqVO listReqVO);
67 67  
68   -
69 68 /**
70 69 * 获得指定状态的会员等级列表
71 70 *
... ... @@ -74,7 +73,6 @@ public interface MemberLevelService {
74 73 */
75 74 List<MemberLevelDO> getLevelListByStatus(Integer status);
76 75  
77   -
78 76 /**
79 77 * 获得开启状态的会员等级列表
80 78 *
... ... @@ -100,4 +98,5 @@ public interface MemberLevelService {
100 98 * @param bizId 业务编号
101 99 */
102 100 void addExperience(Long userId, Integer experience, MemberExperienceBizTypeEnum bizType, String bizId);
  101 +
103 102 }
... ...
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/level/MemberLevelServiceImpl.java
... ... @@ -25,6 +25,7 @@ import org.springframework.validation.annotation.Validated;
25 25  
26 26 import javax.annotation.Resource;
27 27 import java.util.Collection;
  28 +import java.util.Collections;
28 29 import java.util.Comparator;
29 30 import java.util.List;
30 31  
... ... @@ -153,11 +154,12 @@ public class MemberLevelServiceImpl implements MemberLevelService {
153 154 validateExperienceOutRange(list, id, level, experience);
154 155 }
155 156  
  157 + // TODO 有 Service 提供接口哈,不直接调用对方的 memberUserMapper
156 158 @VisibleForTesting
157 159 void validateLevelHasUser(Long id) {
158 160 Long count = memberUserMapper.selectCountByLevelId(id);
159 161 if (count > 0) {
160   - throw exception(GROUP_HAS_USER);
  162 + throw exception(LEVEL_HAS_USER);
161 163 }
162 164 }
163 165  
... ... @@ -168,6 +170,9 @@ public class MemberLevelServiceImpl implements MemberLevelService {
168 170  
169 171 @Override
170 172 public List<MemberLevelDO> getLevelList(Collection<Long> ids) {
  173 + if (CollUtil.isEmpty(ids)) {
  174 + return Collections.emptyList();
  175 + }
171 176 return levelMapper.selectBatchIds(ids);
172 177 }
173 178  
... ... @@ -184,7 +189,7 @@ public class MemberLevelServiceImpl implements MemberLevelService {
184 189 @Override
185 190 @Transactional(rollbackFor = Exception.class)
186 191 public void updateUserLevel(MemberUserUpdateLevelReqVO updateReqVO) {
187   - MemberUserDO user = memberUserMapper.selectById(updateReqVO.getId());
  192 + MemberUserDO user = memberUserService.getUser(updateReqVO.getId());
188 193 if (user == null) {
189 194 throw exception(USER_NOT_EXISTS);
190 195 }
... ... @@ -193,6 +198,7 @@ public class MemberLevelServiceImpl implements MemberLevelService {
193 198 return;
194 199 }
195 200  
  201 + // 记录等级变动
196 202 MemberLevelRecordDO levelRecord = new MemberLevelRecordDO()
197 203 .setUserId(user.getId())
198 204 .setRemark(updateReqVO.getReason());
... ... @@ -211,17 +217,16 @@ public class MemberLevelServiceImpl implements MemberLevelService {
211 217 levelRecord.setUserExperience(memberLevel.getExperience());
212 218 levelRecord.setDescription("管理员调整为:" + memberLevel.getName());
213 219 }
214   -
215   - // 记录等级变动
216 220 memberLevelRecordService.createLevelRecord(levelRecord);
217 221  
218 222 // 记录会员经验变动
219 223 memberExperienceRecordService.createExperienceRecord(user.getId(),
220 224 levelRecord.getExperience(), levelRecord.getUserExperience(),
221   - MemberExperienceBizTypeEnum.ADMIN, MemberExperienceBizTypeEnum.ADMIN.getValue() + "");
  225 + MemberExperienceBizTypeEnum.ADMIN, String.valueOf(MemberExperienceBizTypeEnum.ADMIN.getType()));
222 226  
223 227 // 更新会员表上的等级编号、经验值
224   - memberUserService.updateLevelIdAndExperience(user.getId(), updateReqVO.getLevelId(), levelRecord.getUserExperience());
  228 + memberUserService.updateUserLevel(user.getId(), updateReqVO.getLevelId(),
  229 + levelRecord.getUserExperience());
225 230  
226 231 // 给会员发送等级变动消息
227 232 notifyMemberLevelChange(user.getId(), memberLevel);
... ... @@ -259,7 +264,7 @@ public class MemberLevelServiceImpl implements MemberLevelService {
259 264 }
260 265  
261 266 // 更新会员表上的等级编号、经验值
262   - memberUserService.updateLevelIdAndExperience(user.getId(), levelRecord.getLevelId(), userExperience);
  267 + memberUserService.updateUserLevel(user.getId(), levelRecord.getLevelId(), userExperience);
263 268 }
264 269  
265 270 /**
... ...
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/user/MemberUserService.java
... ... @@ -133,5 +133,6 @@ public interface MemberUserService {
133 133 * @param levelId 用户等级
134 134 * @param experience 用户经验
135 135 */
136   - void updateLevelIdAndExperience(Long id, Long levelId, Integer experience);
  136 + void updateUserLevel(Long id, Long levelId, Integer experience);
  137 +
137 138 }
... ...
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/user/MemberUserServiceImpl.java
1 1 package cn.iocoder.yudao.module.member.service.user;
2 2  
3 3 import cn.hutool.core.util.IdUtil;
  4 +import cn.hutool.core.util.ObjectUtil;
4 5 import cn.hutool.core.util.StrUtil;
5 6 import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
6 7 import cn.iocoder.yudao.framework.common.pojo.PageResult;
... ... @@ -229,11 +230,9 @@ public class MemberUserServiceImpl implements MemberUserService {
229 230 }
230 231  
231 232 @Override
232   - public void updateLevelIdAndExperience(Long id, Long levelId, Integer experience) {
233   - if (levelId == null) {
234   - // 0 代表无等级:防止UpdateById时,会被过滤掉的问题
235   - levelId = 0L;
236   - }
  233 + public void updateUserLevel(Long id, Long levelId, Integer experience) {
  234 + // 0 代表无等级:防止UpdateById时,会被过滤掉的问题
  235 + levelId = ObjectUtil.defaultIfNull(levelId, 0L);
237 236 memberUserMapper.updateById(new MemberUserDO()
238 237 .setId(id)
239 238 .setLevelId(levelId).setExperience(experience)
... ...