Commit 9b6f5bd5030d3c06b5e41dff9af46403576a776c
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) | ... | ... |