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 | \ 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) |