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 \ No newline at end of file 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,7 +3,7 @@ package cn.iocoder.yudao.module.member.api.level;
3 import cn.iocoder.yudao.module.member.enums.MemberExperienceBizTypeEnum; 3 import cn.iocoder.yudao.module.member.enums.MemberExperienceBizTypeEnum;
4 4
5 /** 5 /**
6 - * 会员等级 API接口 6 + * 会员等级 API 接口
7 * 7 *
8 * @author owen 8 * @author owen
9 */ 9 */
@@ -17,5 +17,6 @@ public interface MemberLevelApi { @@ -17,5 +17,6 @@ public interface MemberLevelApi {
17 * @param bizType 业务类型 {@link MemberExperienceBizTypeEnum} 17 * @param bizType 业务类型 {@link MemberExperienceBizTypeEnum}
18 * @param bizId 业务编号 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,8 +48,6 @@ public interface ErrorCodeConstants {
48 ErrorCode LEVEL_EXPERIENCE_MAX = new ErrorCode(1004011004, "升级经验必须小于下一个等级[{}]设置的升级经验[{}]"); 48 ErrorCode LEVEL_EXPERIENCE_MAX = new ErrorCode(1004011004, "升级经验必须小于下一个等级[{}]设置的升级经验[{}]");
49 ErrorCode LEVEL_HAS_USER = new ErrorCode(1004011005, "用户等级下存在用户,无法删除"); 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 ErrorCode EXPERIENCE_BIZ_NOT_SUPPORT = new ErrorCode(1004011201, "用户经验业务类型不支持"); 51 ErrorCode EXPERIENCE_BIZ_NOT_SUPPORT = new ErrorCode(1004011201, "用户经验业务类型不支持");
54 52
55 //========== 用户分组 1004012000 ========== 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,18 +11,20 @@ import lombok.Getter;
11 @Getter 11 @Getter
12 @AllArgsConstructor 12 @AllArgsConstructor
13 public enum MemberExperienceBizTypeEnum { 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 private final String title; 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,12 +24,15 @@ public class MemberLevelApiImpl implements MemberLevelApi {
24 @Resource 24 @Resource
25 private MemberLevelService memberLevelService; 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 if (bizTypeEnum == null) { 32 if (bizTypeEnum == null) {
30 throw exception(EXPERIENCE_BIZ_NOT_SUPPORT); 33 throw exception(EXPERIENCE_BIZ_NOT_SUPPORT);
31 } 34 }
32 -  
33 memberLevelService.addExperience(userId, experience, bizTypeEnum, bizId); 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,7 +35,7 @@ public class MemberExperienceRecordController {
35 @Operation(summary = "获得会员经验记录") 35 @Operation(summary = "获得会员经验记录")
36 @Parameter(name = "id", description = "编号", required = true, example = "1024") 36 @Parameter(name = "id", description = "编号", required = true, example = "1024")
37 @PreAuthorize("@ss.hasPermission('member:experience-record:query')") 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 MemberExperienceRecordDO experienceLog = experienceLogService.getExperienceRecord(id); 39 MemberExperienceRecordDO experienceLog = experienceLogService.getExperienceRecord(id);
40 return success(MemberExperienceRecordConvert.INSTANCE.convert(experienceLog)); 40 return success(MemberExperienceRecordConvert.INSTANCE.convert(experienceLog));
41 } 41 }
@@ -43,7 +43,8 @@ public class MemberExperienceRecordController { @@ -43,7 +43,8 @@ public class MemberExperienceRecordController {
43 @GetMapping("/page") 43 @GetMapping("/page")
44 @Operation(summary = "获得会员经验记录分页") 44 @Operation(summary = "获得会员经验记录分页")
45 @PreAuthorize("@ss.hasPermission('member:experience-record:query')") 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 PageResult<MemberExperienceRecordDO> pageResult = experienceLogService.getExperienceRecordPage(pageVO); 48 PageResult<MemberExperienceRecordDO> pageResult = experienceLogService.getExperienceRecordPage(pageVO);
48 return success(MemberExperienceRecordConvert.INSTANCE.convertPage(pageResult)); 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,7 +35,7 @@ public class MemberLevelRecordController {
35 @Operation(summary = "获得会员等级记录") 35 @Operation(summary = "获得会员等级记录")
36 @Parameter(name = "id", description = "编号", required = true, example = "1024") 36 @Parameter(name = "id", description = "编号", required = true, example = "1024")
37 @PreAuthorize("@ss.hasPermission('member:level-record:query')") 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 MemberLevelRecordDO levelLog = levelLogService.getLevelRecord(id); 39 MemberLevelRecordDO levelLog = levelLogService.getLevelRecord(id);
40 return success(MemberLevelRecordConvert.INSTANCE.convert(levelLog)); 40 return success(MemberLevelRecordConvert.INSTANCE.convert(levelLog));
41 } 41 }
@@ -43,8 +43,10 @@ public class MemberLevelRecordController { @@ -43,8 +43,10 @@ public class MemberLevelRecordController {
43 @GetMapping("/page") 43 @GetMapping("/page")
44 @Operation(summary = "获得会员等级记录分页") 44 @Operation(summary = "获得会员等级记录分页")
45 @PreAuthorize("@ss.hasPermission('member:level-record:query')") 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 PageResult<MemberLevelRecordDO> pageResult = levelLogService.getLevelRecordPage(pageVO); 48 PageResult<MemberLevelRecordDO> pageResult = levelLogService.getLevelRecordPage(pageVO);
48 return success(MemberLevelRecordConvert.INSTANCE.convertPage(pageResult)); 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,7 +4,7 @@ import io.swagger.v3.oas.annotations.media.Schema;
4 import lombok.Data; 4 import lombok.Data;
5 import lombok.ToString; 5 import lombok.ToString;
6 6
7 -@Schema(description = "管理后台 - 会员等级分页 Request VO") 7 +@Schema(description = "管理后台 - 会员等级列表筛选 Request VO")
8 @Data 8 @Data
9 @ToString(callSuper = true) 9 @ToString(callSuper = true)
10 public class MemberLevelListReqVO { 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,10 +25,14 @@ import org.springframework.web.bind.annotation.*;
25 25
26 import javax.annotation.Resource; 26 import javax.annotation.Resource;
27 import javax.validation.Valid; 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 import java.util.stream.Collectors; 32 import java.util.stream.Collectors;
30 33
31 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; 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 @Tag(name = "管理后台 - 会员用户") 37 @Tag(name = "管理后台 - 会员用户")
34 @RestController 38 @RestController
@@ -79,26 +83,19 @@ public class MemberUserController { @@ -79,26 +83,19 @@ public class MemberUserController {
79 return success(PageResult.empty()); 83 return success(PageResult.empty());
80 } 84 }
81 85
82 - Set<Long> groupIds = new HashSet<>(pageResult.getList().size());  
83 -  
84 // 处理用户标签返显 86 // 处理用户标签返显
85 Set<Long> tagIds = pageResult.getList().stream() 87 Set<Long> tagIds = pageResult.getList().stream()
86 - .peek(m -> {  
87 - if (m.getGroupId() != null) {  
88 - groupIds.add(m.getGroupId());  
89 - }  
90 - })  
91 .map(MemberUserDO::getTagIds) 88 .map(MemberUserDO::getTagIds)
92 .filter(Objects::nonNull) 89 .filter(Objects::nonNull)
93 .flatMap(Collection::stream) 90 .flatMap(Collection::stream)
94 .collect(Collectors.toSet()); 91 .collect(Collectors.toSet());
95 List<MemberTagDO> tags = memberTagService.getTagList(tagIds); 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 return success(MemberUserConvert.INSTANCE.convertPage(pageResult, tags, levels, groups)); 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,12 +42,10 @@ public interface MemberUserConvert {
42 List<MemberLevelDO> levels, 42 List<MemberLevelDO> levels,
43 List<MemberGroupDO> groups) { 43 List<MemberGroupDO> groups) {
44 PageResult<MemberUserRespVO> result = convertPage(pageResult); 44 PageResult<MemberUserRespVO> result = convertPage(pageResult);
45 -  
46 // 处理关联数据 45 // 处理关联数据
47 Map<Long, String> tagMap = convertMap(tags, MemberTagDO::getId, MemberTagDO::getName); 46 Map<Long, String> tagMap = convertMap(tags, MemberTagDO::getId, MemberTagDO::getName);
48 Map<Long, String> levelMap = convertMap(levels, MemberLevelDO::getId, MemberLevelDO::getName); 47 Map<Long, String> levelMap = convertMap(levels, MemberLevelDO::getId, MemberLevelDO::getName);
49 Map<Long, String> groupMap = convertMap(groups, MemberGroupDO::getId, MemberGroupDO::getName); 48 Map<Long, String> groupMap = convertMap(groups, MemberGroupDO::getId, MemberGroupDO::getName);
50 -  
51 // 填充关联数据 49 // 填充关联数据
52 for (MemberUserRespVO vo : result.getList()) { 50 for (MemberUserRespVO vo : result.getList()) {
53 vo.setTagNames(convertList(vo.getTagIds(), tagMap::get)); 51 vo.setTagNames(convertList(vo.getTagIds(), tagMap::get));
@@ -56,4 +54,5 @@ public interface MemberUserConvert { @@ -56,4 +54,5 @@ public interface MemberUserConvert {
56 } 54 }
57 return result; 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,6 +69,7 @@ public class MemberGroupServiceImpl implements MemberGroupService {
69 } 69 }
70 } 70 }
71 71
  72 + // TODO @疯狂:不要直接调用 memberUserMapper,需要对方 service 提供方法
72 void validateGroupHasUser(Long id) { 73 void validateGroupHasUser(Long id) {
73 Long count = memberUserMapper.selectCountByGroupId(id); 74 Long count = memberUserMapper.selectCountByGroupId(id);
74 if (count > 0) { 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,7 +26,6 @@ public class MemberExperienceRecordServiceImpl implements MemberExperienceRecord
26 @Resource 26 @Resource
27 private MemberExperienceRecordMapper experienceLogMapper; 27 private MemberExperienceRecordMapper experienceLogMapper;
28 28
29 -  
30 @Override 29 @Override
31 public MemberExperienceRecordDO getExperienceRecord(Long id) { 30 public MemberExperienceRecordDO getExperienceRecord(Long id) {
32 return experienceLogMapper.selectById(id); 31 return experienceLogMapper.selectById(id);
@@ -45,12 +44,11 @@ public class MemberExperienceRecordServiceImpl implements MemberExperienceRecord @@ -45,12 +44,11 @@ public class MemberExperienceRecordServiceImpl implements MemberExperienceRecord
45 @Override 44 @Override
46 public void createExperienceRecord(Long userId, Integer experience, Integer totalExperience, 45 public void createExperienceRecord(Long userId, Integer experience, Integer totalExperience,
47 MemberExperienceBizTypeEnum bizType, String bizId) { 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,9 +4,6 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult;
4 import cn.iocoder.yudao.module.member.controller.admin.level.vo.log.MemberLevelRecordPageReqVO; 4 import cn.iocoder.yudao.module.member.controller.admin.level.vo.log.MemberLevelRecordPageReqVO;
5 import cn.iocoder.yudao.module.member.dal.dataobject.level.MemberLevelRecordDO; 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 * 会员等级记录 Service 接口 8 * 会员等级记录 Service 接口
12 * 9 *
@@ -23,14 +20,6 @@ public interface MemberLevelRecordService { @@ -23,14 +20,6 @@ public interface MemberLevelRecordService {
23 MemberLevelRecordDO getLevelRecord(Long id); 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 * @param pageReqVO 分页查询 25 * @param pageReqVO 分页查询
@@ -44,4 +33,5 @@ public interface MemberLevelRecordService { @@ -44,4 +33,5 @@ public interface MemberLevelRecordService {
44 * @param levelRecord 会员等级记录 33 * @param levelRecord 会员等级记录
45 */ 34 */
46 void createLevelRecord(MemberLevelRecordDO levelRecord); 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,11 +8,6 @@ import org.springframework.stereotype.Service;
8 import org.springframework.validation.annotation.Validated; 8 import org.springframework.validation.annotation.Validated;
9 9
10 import javax.annotation.Resource; 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 * 会员等级记录 Service 实现类 13 * 会员等级记录 Service 实现类
@@ -26,23 +21,12 @@ public class MemberLevelRecordServiceImpl implements MemberLevelRecordService { @@ -26,23 +21,12 @@ public class MemberLevelRecordServiceImpl implements MemberLevelRecordService {
26 @Resource 21 @Resource
27 private MemberLevelRecordMapper levelLogMapper; 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 @Override 24 @Override
36 public MemberLevelRecordDO getLevelRecord(Long id) { 25 public MemberLevelRecordDO getLevelRecord(Long id) {
37 return levelLogMapper.selectById(id); 26 return levelLogMapper.selectById(id);
38 } 27 }
39 28
40 @Override 29 @Override
41 - public List<MemberLevelRecordDO> getLevelRecordList(Collection<Long> ids) {  
42 - return levelLogMapper.selectBatchIds(ids);  
43 - }  
44 -  
45 - @Override  
46 public PageResult<MemberLevelRecordDO> getLevelRecordPage(MemberLevelRecordPageReqVO pageReqVO) { 30 public PageResult<MemberLevelRecordDO> getLevelRecordPage(MemberLevelRecordPageReqVO pageReqVO) {
47 return levelLogMapper.selectPage(pageReqVO); 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,7 +65,6 @@ public interface MemberLevelService {
65 */ 65 */
66 List<MemberLevelDO> getLevelList(MemberLevelListReqVO listReqVO); 66 List<MemberLevelDO> getLevelList(MemberLevelListReqVO listReqVO);
67 67
68 -  
69 /** 68 /**
70 * 获得指定状态的会员等级列表 69 * 获得指定状态的会员等级列表
71 * 70 *
@@ -74,7 +73,6 @@ public interface MemberLevelService { @@ -74,7 +73,6 @@ public interface MemberLevelService {
74 */ 73 */
75 List<MemberLevelDO> getLevelListByStatus(Integer status); 74 List<MemberLevelDO> getLevelListByStatus(Integer status);
76 75
77 -  
78 /** 76 /**
79 * 获得开启状态的会员等级列表 77 * 获得开启状态的会员等级列表
80 * 78 *
@@ -100,4 +98,5 @@ public interface MemberLevelService { @@ -100,4 +98,5 @@ public interface MemberLevelService {
100 * @param bizId 业务编号 98 * @param bizId 业务编号
101 */ 99 */
102 void addExperience(Long userId, Integer experience, MemberExperienceBizTypeEnum bizType, String bizId); 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,6 +25,7 @@ import org.springframework.validation.annotation.Validated;
25 25
26 import javax.annotation.Resource; 26 import javax.annotation.Resource;
27 import java.util.Collection; 27 import java.util.Collection;
  28 +import java.util.Collections;
28 import java.util.Comparator; 29 import java.util.Comparator;
29 import java.util.List; 30 import java.util.List;
30 31
@@ -153,11 +154,12 @@ public class MemberLevelServiceImpl implements MemberLevelService { @@ -153,11 +154,12 @@ public class MemberLevelServiceImpl implements MemberLevelService {
153 validateExperienceOutRange(list, id, level, experience); 154 validateExperienceOutRange(list, id, level, experience);
154 } 155 }
155 156
  157 + // TODO 有 Service 提供接口哈,不直接调用对方的 memberUserMapper
156 @VisibleForTesting 158 @VisibleForTesting
157 void validateLevelHasUser(Long id) { 159 void validateLevelHasUser(Long id) {
158 Long count = memberUserMapper.selectCountByLevelId(id); 160 Long count = memberUserMapper.selectCountByLevelId(id);
159 if (count > 0) { 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,6 +170,9 @@ public class MemberLevelServiceImpl implements MemberLevelService {
168 170
169 @Override 171 @Override
170 public List<MemberLevelDO> getLevelList(Collection<Long> ids) { 172 public List<MemberLevelDO> getLevelList(Collection<Long> ids) {
  173 + if (CollUtil.isEmpty(ids)) {
  174 + return Collections.emptyList();
  175 + }
171 return levelMapper.selectBatchIds(ids); 176 return levelMapper.selectBatchIds(ids);
172 } 177 }
173 178
@@ -184,7 +189,7 @@ public class MemberLevelServiceImpl implements MemberLevelService { @@ -184,7 +189,7 @@ public class MemberLevelServiceImpl implements MemberLevelService {
184 @Override 189 @Override
185 @Transactional(rollbackFor = Exception.class) 190 @Transactional(rollbackFor = Exception.class)
186 public void updateUserLevel(MemberUserUpdateLevelReqVO updateReqVO) { 191 public void updateUserLevel(MemberUserUpdateLevelReqVO updateReqVO) {
187 - MemberUserDO user = memberUserMapper.selectById(updateReqVO.getId()); 192 + MemberUserDO user = memberUserService.getUser(updateReqVO.getId());
188 if (user == null) { 193 if (user == null) {
189 throw exception(USER_NOT_EXISTS); 194 throw exception(USER_NOT_EXISTS);
190 } 195 }
@@ -193,6 +198,7 @@ public class MemberLevelServiceImpl implements MemberLevelService { @@ -193,6 +198,7 @@ public class MemberLevelServiceImpl implements MemberLevelService {
193 return; 198 return;
194 } 199 }
195 200
  201 + // 记录等级变动
196 MemberLevelRecordDO levelRecord = new MemberLevelRecordDO() 202 MemberLevelRecordDO levelRecord = new MemberLevelRecordDO()
197 .setUserId(user.getId()) 203 .setUserId(user.getId())
198 .setRemark(updateReqVO.getReason()); 204 .setRemark(updateReqVO.getReason());
@@ -211,17 +217,16 @@ public class MemberLevelServiceImpl implements MemberLevelService { @@ -211,17 +217,16 @@ public class MemberLevelServiceImpl implements MemberLevelService {
211 levelRecord.setUserExperience(memberLevel.getExperience()); 217 levelRecord.setUserExperience(memberLevel.getExperience());
212 levelRecord.setDescription("管理员调整为:" + memberLevel.getName()); 218 levelRecord.setDescription("管理员调整为:" + memberLevel.getName());
213 } 219 }
214 -  
215 - // 记录等级变动  
216 memberLevelRecordService.createLevelRecord(levelRecord); 220 memberLevelRecordService.createLevelRecord(levelRecord);
217 221
218 // 记录会员经验变动 222 // 记录会员经验变动
219 memberExperienceRecordService.createExperienceRecord(user.getId(), 223 memberExperienceRecordService.createExperienceRecord(user.getId(),
220 levelRecord.getExperience(), levelRecord.getUserExperience(), 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 notifyMemberLevelChange(user.getId(), memberLevel); 232 notifyMemberLevelChange(user.getId(), memberLevel);
@@ -259,7 +264,7 @@ public class MemberLevelServiceImpl implements MemberLevelService { @@ -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,5 +133,6 @@ public interface MemberUserService {
133 * @param levelId 用户等级 133 * @param levelId 用户等级
134 * @param experience 用户经验 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 package cn.iocoder.yudao.module.member.service.user; 1 package cn.iocoder.yudao.module.member.service.user;
2 2
3 import cn.hutool.core.util.IdUtil; 3 import cn.hutool.core.util.IdUtil;
  4 +import cn.hutool.core.util.ObjectUtil;
4 import cn.hutool.core.util.StrUtil; 5 import cn.hutool.core.util.StrUtil;
5 import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; 6 import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
6 import cn.iocoder.yudao.framework.common.pojo.PageResult; 7 import cn.iocoder.yudao.framework.common.pojo.PageResult;
@@ -229,11 +230,9 @@ public class MemberUserServiceImpl implements MemberUserService { @@ -229,11 +230,9 @@ public class MemberUserServiceImpl implements MemberUserService {
229 } 230 }
230 231
231 @Override 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 memberUserMapper.updateById(new MemberUserDO() 236 memberUserMapper.updateById(new MemberUserDO()
238 .setId(id) 237 .setId(id)
239 .setLevelId(levelId).setExperience(experience) 238 .setLevelId(levelId).setExperience(experience)