Commit 0619989586203a9153bd1806ea55ee369b835350

Authored by 芋道源码
Committed by Gitee
2 parents b119aadb da8b2eab

!585 会员: 会员等级功能优化,修改Review的代码

Merge pull request !585 from 疯狂的世界/member_dev
Showing 37 changed files with 433 additions and 402 deletions
sql/mysql/member_level.sql
  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 +
1 69 -- 增加字典
2 70 insert system_dict_type(name, type) values ('会员经验业务类型', 'member_experience_biz_type');
3 71 insert system_dict_data(dict_type, label, value, sort) values ('member_experience_biz_type', '管理员调整', '0', 0);
... ... @@ -6,3 +74,25 @@ insert system_dict_data(dict_type, label, value, sort) values ('member_experienc
6 74 insert system_dict_data(dict_type, label, value, sort) values ('member_experience_biz_type', '退单扣除', '3', 3);
7 75 insert system_dict_data(dict_type, label, value, sort) values ('member_experience_biz_type', '签到奖励', '4', 4);
8 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);
9 99 \ 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
... ... @@ -14,8 +14,8 @@ public interface MemberLevelApi {
14 14 *
15 15 * @param userId 会员ID
16 16 * @param experience 经验
17   - * @param bizType 业务类型
  17 + * @param bizType 业务类型 {@link MemberExperienceBizTypeEnum}
18 18 * @param bizId 业务编号
19 19 */
20   - void plusExperience(Long userId, Integer experience, MemberExperienceBizTypeEnum bizType, String bizId);
  20 + void plusExperience(Long userId, Integer experience, Integer bizType, String bizId);
21 21 }
... ...
yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/enums/ErrorCodeConstants.java
... ... @@ -50,7 +50,7 @@ public interface ErrorCodeConstants {
50 50  
51 51 ErrorCode LEVEL_LOG_NOT_EXISTS = new ErrorCode(1004011100, "用户等级记录不存在");
52 52 ErrorCode EXPERIENCE_LOG_NOT_EXISTS = new ErrorCode(1004011200, "用户经验记录不存在");
53   - ErrorCode LEVEL_REASON_NOT_EXISTS = new ErrorCode(1004011300, "用户等级调整原因不能为空");
  53 + ErrorCode EXPERIENCE_BIZ_NOT_SUPPORT = new ErrorCode(1004011201, "用户经验业务类型不支持");
54 54  
55 55 //========== 用户分组 1004012000 ==========
56 56 ErrorCode GROUP_NOT_EXISTS = new ErrorCode(1004012000, "用户分组不存在");
... ...
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/api/level/MemberLevelApiImpl.java
1 1 package cn.iocoder.yudao.module.member.api.level;
2 2  
  3 +import cn.hutool.core.util.EnumUtil;
3 4 import cn.iocoder.yudao.module.member.enums.MemberExperienceBizTypeEnum;
4 5 import cn.iocoder.yudao.module.member.service.level.MemberLevelService;
5 6 import org.springframework.stereotype.Service;
6 7 import org.springframework.validation.annotation.Validated;
7 8  
8 9 import javax.annotation.Resource;
  10 +import java.util.Objects;
  11 +
  12 +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
  13 +import static cn.iocoder.yudao.module.member.enums.ErrorCodeConstants.EXPERIENCE_BIZ_NOT_SUPPORT;
9 14  
10 15 /**
11 16 * 会员等级 API 实现类
... ... @@ -19,7 +24,12 @@ public class MemberLevelApiImpl implements MemberLevelApi {
19 24 @Resource
20 25 private MemberLevelService memberLevelService;
21 26  
22   - public void plusExperience(Long userId, Integer experience, MemberExperienceBizTypeEnum bizType, String bizId) {
23   - memberLevelService.plusExperience(userId, experience, bizType, bizId);
  27 + public void plusExperience(Long userId, Integer experience, Integer bizType, String bizId) {
  28 + MemberExperienceBizTypeEnum bizTypeEnum = EnumUtil.getBy(MemberExperienceBizTypeEnum.class, e -> Objects.equals(bizType, e.getValue()));
  29 + if (bizTypeEnum == null) {
  30 + throw exception(EXPERIENCE_BIZ_NOT_SUPPORT);
  31 + }
  32 +
  33 + memberLevelService.addExperience(userId, experience, bizTypeEnum, bizId);
24 34 }
25 35 }
... ...
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/level/MemberExperienceLogController.java renamed to yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/level/MemberExperienceRecordController.java
... ... @@ -2,11 +2,11 @@ package cn.iocoder.yudao.module.member.controller.admin.level;
2 2  
3 3 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
4 4 import cn.iocoder.yudao.framework.common.pojo.PageResult;
5   -import cn.iocoder.yudao.module.member.controller.admin.level.vo.experience.MemberExperienceLogPageReqVO;
6   -import cn.iocoder.yudao.module.member.controller.admin.level.vo.experience.MemberExperienceLogRespVO;
7   -import cn.iocoder.yudao.module.member.convert.level.MemberExperienceLogConvert;
8   -import cn.iocoder.yudao.module.member.dal.dataobject.level.MemberExperienceLogDO;
9   -import cn.iocoder.yudao.module.member.service.level.MemberExperienceLogService;
  5 +import cn.iocoder.yudao.module.member.controller.admin.level.vo.experience.MemberExperienceRecordPageReqVO;
  6 +import cn.iocoder.yudao.module.member.controller.admin.level.vo.experience.MemberExperienceRecordRespVO;
  7 +import cn.iocoder.yudao.module.member.convert.level.MemberExperienceRecordConvert;
  8 +import cn.iocoder.yudao.module.member.dal.dataobject.level.MemberExperienceRecordDO;
  9 +import cn.iocoder.yudao.module.member.service.level.MemberExperienceRecordService;
10 10 import io.swagger.v3.oas.annotations.Operation;
11 11 import io.swagger.v3.oas.annotations.Parameter;
12 12 import io.swagger.v3.oas.annotations.tags.Tag;
... ... @@ -22,31 +22,30 @@ import javax.validation.Valid;
22 22  
23 23 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
24 24  
25   -// TODO @疯狂:要不 Log 改成 Record,和 PointRecord 保持一致
26 25 @Tag(name = "管理后台 - 会员经验记录")
27 26 @RestController
28   -@RequestMapping("/member/experience-log")
  27 +@RequestMapping("/member/experience-record")
29 28 @Validated
30   -public class MemberExperienceLogController {
  29 +public class MemberExperienceRecordController {
31 30  
32 31 @Resource
33   - private MemberExperienceLogService experienceLogService;
  32 + private MemberExperienceRecordService experienceLogService;
34 33  
35 34 @GetMapping("/get")
36 35 @Operation(summary = "获得会员经验记录")
37 36 @Parameter(name = "id", description = "编号", required = true, example = "1024")
38   - @PreAuthorize("@ss.hasPermission('member:experience-log:query')")
39   - public CommonResult<MemberExperienceLogRespVO> getExperienceLog(@RequestParam("id") Long id) {
40   - MemberExperienceLogDO experienceLog = experienceLogService.getExperienceLog(id);
41   - return success(MemberExperienceLogConvert.INSTANCE.convert(experienceLog));
  37 + @PreAuthorize("@ss.hasPermission('member:experience-record:query')")
  38 + public CommonResult<MemberExperienceRecordRespVO> getExperienceLog(@RequestParam("id") Long id) {
  39 + MemberExperienceRecordDO experienceLog = experienceLogService.getExperienceRecord(id);
  40 + return success(MemberExperienceRecordConvert.INSTANCE.convert(experienceLog));
42 41 }
43 42  
44 43 @GetMapping("/page")
45 44 @Operation(summary = "获得会员经验记录分页")
46   - @PreAuthorize("@ss.hasPermission('member:experience-log:query')")
47   - public CommonResult<PageResult<MemberExperienceLogRespVO>> getExperienceLogPage(@Valid MemberExperienceLogPageReqVO pageVO) {
48   - PageResult<MemberExperienceLogDO> pageResult = experienceLogService.getExperienceLogPage(pageVO);
49   - return success(MemberExperienceLogConvert.INSTANCE.convertPage(pageResult));
  45 + @PreAuthorize("@ss.hasPermission('member:experience-record:query')")
  46 + public CommonResult<PageResult<MemberExperienceRecordRespVO>> getExperienceLogPage(@Valid MemberExperienceRecordPageReqVO pageVO) {
  47 + PageResult<MemberExperienceRecordDO> pageResult = experienceLogService.getExperienceRecordPage(pageVO);
  48 + return success(MemberExperienceRecordConvert.INSTANCE.convertPage(pageResult));
50 49 }
51 50  
52 51 }
... ...
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/level/MemberLevelController.java
1 1 package cn.iocoder.yudao.module.member.controller.admin.level;
2 2  
3 3 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
4   -import cn.iocoder.yudao.framework.common.pojo.PageResult;
5 4 import cn.iocoder.yudao.module.member.controller.admin.level.vo.level.*;
6 5 import cn.iocoder.yudao.module.member.convert.level.MemberLevelConvert;
7 6 import cn.iocoder.yudao.module.member.dal.dataobject.level.MemberLevelDO;
... ... @@ -70,13 +69,12 @@ public class MemberLevelController {
70 69 return success(MemberLevelConvert.INSTANCE.convertSimpleList(list));
71 70 }
72 71  
73   - // TODO @疯狂:是不是不做分页,直接 list 就好啦;返回的时候,按照经验排序下哈;
74   - @GetMapping("/page")
75   - @Operation(summary = "获得会员等级分页")
  72 + @GetMapping("/list")
  73 + @Operation(summary = "获得会员等级列表")
76 74 @PreAuthorize("@ss.hasPermission('member:level:query')")
77   - public CommonResult<PageResult<MemberLevelRespVO>> getLevelPage(@Valid MemberLevelPageReqVO pageVO) {
78   - PageResult<MemberLevelDO> pageResult = levelService.getLevelPage(pageVO);
79   - return success(MemberLevelConvert.INSTANCE.convertPage(pageResult));
  75 + public CommonResult<List<MemberLevelRespVO>> getLevelList(@Valid MemberLevelListReqVO pageVO) {
  76 + List<MemberLevelDO> result = levelService.getLevelList(pageVO);
  77 + return success(MemberLevelConvert.INSTANCE.convertList(result));
80 78 }
81 79  
82 80 }
... ...
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/level/MemberLevelLogController.java renamed to yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/level/MemberLevelRecordController.java
... ... @@ -2,11 +2,11 @@ package cn.iocoder.yudao.module.member.controller.admin.level;
2 2  
3 3 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
4 4 import cn.iocoder.yudao.framework.common.pojo.PageResult;
5   -import cn.iocoder.yudao.module.member.controller.admin.level.vo.log.MemberLevelLogPageReqVO;
6   -import cn.iocoder.yudao.module.member.controller.admin.level.vo.log.MemberLevelLogRespVO;
7   -import cn.iocoder.yudao.module.member.convert.level.MemberLevelLogConvert;
8   -import cn.iocoder.yudao.module.member.dal.dataobject.level.MemberLevelLogDO;
9   -import cn.iocoder.yudao.module.member.service.level.MemberLevelLogService;
  5 +import cn.iocoder.yudao.module.member.controller.admin.level.vo.log.MemberLevelRecordPageReqVO;
  6 +import cn.iocoder.yudao.module.member.controller.admin.level.vo.log.MemberLevelRecordRespVO;
  7 +import cn.iocoder.yudao.module.member.convert.level.MemberLevelRecordConvert;
  8 +import cn.iocoder.yudao.module.member.dal.dataobject.level.MemberLevelRecordDO;
  9 +import cn.iocoder.yudao.module.member.service.level.MemberLevelRecordService;
10 10 import io.swagger.v3.oas.annotations.Operation;
11 11 import io.swagger.v3.oas.annotations.Parameter;
12 12 import io.swagger.v3.oas.annotations.tags.Tag;
... ... @@ -22,30 +22,29 @@ import javax.validation.Valid;
22 22  
23 23 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
24 24  
25   -// TODO @疯狂:是不是不用这个 controller;因为日志只是为了记录,db 可以查询、和审计即可,目前暂时不需要开放出来;
26 25 @Tag(name = "管理后台 - 会员等级记录")
27 26 @RestController
28   -@RequestMapping("/member/level-log")
  27 +@RequestMapping("/member/level-record")
29 28 @Validated
30   -public class MemberLevelLogController {
  29 +public class MemberLevelRecordController {
31 30  
32 31 @Resource
33   - private MemberLevelLogService levelLogService;
  32 + private MemberLevelRecordService levelLogService;
34 33  
35 34 @GetMapping("/get")
36 35 @Operation(summary = "获得会员等级记录")
37 36 @Parameter(name = "id", description = "编号", required = true, example = "1024")
38   - @PreAuthorize("@ss.hasPermission('member:level-log:query')")
39   - public CommonResult<MemberLevelLogRespVO> getLevelLog(@RequestParam("id") Long id) {
40   - MemberLevelLogDO levelLog = levelLogService.getLevelLog(id);
41   - return success(MemberLevelLogConvert.INSTANCE.convert(levelLog));
  37 + @PreAuthorize("@ss.hasPermission('member:level-record:query')")
  38 + public CommonResult<MemberLevelRecordRespVO> getLevelLog(@RequestParam("id") Long id) {
  39 + MemberLevelRecordDO levelLog = levelLogService.getLevelRecord(id);
  40 + return success(MemberLevelRecordConvert.INSTANCE.convert(levelLog));
42 41 }
43 42  
44 43 @GetMapping("/page")
45 44 @Operation(summary = "获得会员等级记录分页")
46   - @PreAuthorize("@ss.hasPermission('member:level-log:query')")
47   - public CommonResult<PageResult<MemberLevelLogRespVO>> getLevelLogPage(@Valid MemberLevelLogPageReqVO pageVO) {
48   - PageResult<MemberLevelLogDO> pageResult = levelLogService.getLevelLogPage(pageVO);
49   - return success(MemberLevelLogConvert.INSTANCE.convertPage(pageResult));
  45 + @PreAuthorize("@ss.hasPermission('member:level-record:query')")
  46 + public CommonResult<PageResult<MemberLevelRecordRespVO>> getLevelLogPage(@Valid MemberLevelRecordPageReqVO pageVO) {
  47 + PageResult<MemberLevelRecordDO> pageResult = levelLogService.getLevelRecordPage(pageVO);
  48 + return success(MemberLevelRecordConvert.INSTANCE.convertPage(pageResult));
50 49 }
51 50 }
... ...
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/level/vo/experience/MemberExperienceLogBaseVO.java renamed to yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/level/vo/experience/MemberExperienceRecordBaseVO.java
... ... @@ -10,7 +10,7 @@ import javax.validation.constraints.NotNull;
10 10 * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成
11 11 */
12 12 @Data
13   -public class MemberExperienceLogBaseVO {
  13 +public class MemberExperienceRecordBaseVO {
14 14  
15 15 @Schema(description = "用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "3638")
16 16 @NotNull(message = "用户编号不能为空")
... ...
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/level/vo/experience/MemberExperienceLogPageReqVO.java renamed to yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/level/vo/experience/MemberExperienceRecordPageReqVO.java
... ... @@ -15,7 +15,7 @@ import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_
15 15 @Data
16 16 @EqualsAndHashCode(callSuper = true)
17 17 @ToString(callSuper = true)
18   -public class MemberExperienceLogPageReqVO extends PageParam {
  18 +public class MemberExperienceRecordPageReqVO extends PageParam {
19 19  
20 20 @Schema(description = "用户编号", example = "3638")
21 21 private Long userId;
... ...
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/level/vo/experience/MemberExperienceLogRespVO.java renamed to yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/level/vo/experience/MemberExperienceRecordRespVO.java
... ... @@ -11,7 +11,7 @@ import java.time.LocalDateTime;
11 11 @Data
12 12 @EqualsAndHashCode(callSuper = true)
13 13 @ToString(callSuper = true)
14   -public class MemberExperienceLogRespVO extends MemberExperienceLogBaseVO {
  14 +public class MemberExperienceRecordRespVO extends MemberExperienceRecordBaseVO {
15 15  
16 16 @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "19610")
17 17 private Long id;
... ...
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/level/vo/level/MemberLevelPageReqVO.java renamed to yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/level/vo/level/MemberLevelListReqVO.java
1 1 package cn.iocoder.yudao.module.member.controller.admin.level.vo.level;
2 2  
3   -import cn.iocoder.yudao.framework.common.pojo.PageParam;
4 3 import io.swagger.v3.oas.annotations.media.Schema;
5 4 import lombok.Data;
6   -import lombok.EqualsAndHashCode;
7 5 import lombok.ToString;
8 6  
9 7 @Schema(description = "管理后台 - 会员等级分页 Request VO")
10 8 @Data
11   -@EqualsAndHashCode(callSuper = true)
12 9 @ToString(callSuper = true)
13   -public class MemberLevelPageReqVO extends PageParam {
  10 +public class MemberLevelListReqVO {
14 11  
15 12 @Schema(description = "等级名称", example = "芋艿")
16 13 private String name;
... ...
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/level/vo/log/MemberLevelLogBaseVO.java renamed to yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/level/vo/log/MemberLevelRecordBaseVO.java
... ... @@ -10,7 +10,7 @@ import javax.validation.constraints.NotNull;
10 10 * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成
11 11 */
12 12 @Data
13   -public class MemberLevelLogBaseVO {
  13 +public class MemberLevelRecordBaseVO {
14 14  
15 15 @Schema(description = "用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "25923")
16 16 @NotNull(message = "用户编号不能为空")
... ...
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/level/vo/log/MemberLevelLogPageReqVO.java renamed to yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/level/vo/log/MemberLevelRecordPageReqVO.java
... ... @@ -15,7 +15,7 @@ import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_
15 15 @Data
16 16 @EqualsAndHashCode(callSuper = true)
17 17 @ToString(callSuper = true)
18   -public class MemberLevelLogPageReqVO extends PageParam {
  18 +public class MemberLevelRecordPageReqVO extends PageParam {
19 19  
20 20 @Schema(description = "用户编号", example = "25923")
21 21 private Long userId;
... ...
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/level/vo/log/MemberLevelLogRespVO.java renamed to yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/level/vo/log/MemberLevelRecordRespVO.java
... ... @@ -11,7 +11,7 @@ import java.time.LocalDateTime;
11 11 @Data
12 12 @EqualsAndHashCode(callSuper = true)
13 13 @ToString(callSuper = true)
14   -public class MemberLevelLogRespVO extends MemberLevelLogBaseVO {
  14 +public class MemberLevelRecordRespVO extends MemberLevelRecordBaseVO {
15 15  
16 16 @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "8741")
17 17 private Long id;
... ...
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/user/MemberUserController.java
... ... @@ -5,6 +5,7 @@ import cn.iocoder.yudao.framework.common.pojo.CommonResult;
5 5 import cn.iocoder.yudao.framework.common.pojo.PageResult;
6 6 import cn.iocoder.yudao.module.member.controller.admin.user.vo.MemberUserPageReqVO;
7 7 import cn.iocoder.yudao.module.member.controller.admin.user.vo.MemberUserRespVO;
  8 +import cn.iocoder.yudao.module.member.controller.admin.user.vo.MemberUserUpdateLevelReqVO;
8 9 import cn.iocoder.yudao.module.member.controller.admin.user.vo.MemberUserUpdateReqVO;
9 10 import cn.iocoder.yudao.module.member.convert.user.MemberUserConvert;
10 11 import cn.iocoder.yudao.module.member.dal.dataobject.group.MemberGroupDO;
... ... @@ -52,6 +53,14 @@ public class MemberUserController {
52 53 return success(true);
53 54 }
54 55  
  56 + @PutMapping("/update-level")
  57 + @Operation(summary = "更新会员用户等级")
  58 + @PreAuthorize("@ss.hasPermission('member:user:update-level')")
  59 + public CommonResult<Boolean> updateUserLevel(@Valid @RequestBody MemberUserUpdateLevelReqVO updateReqVO) {
  60 + memberLevelService.updateUserLevel(updateReqVO);
  61 + return success(true);
  62 + }
  63 +
55 64 @GetMapping("/get")
56 65 @Operation(summary = "获得会员用户")
57 66 @Parameter(name = "id", description = "编号", required = true, example = "1024")
... ...
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/user/vo/MemberUserUpdateLevelReqVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.member.controller.admin.user.vo;
  2 +
  3 +import io.swagger.v3.oas.annotations.media.Schema;
  4 +import lombok.Data;
  5 +import lombok.EqualsAndHashCode;
  6 +import lombok.ToString;
  7 +
  8 +import javax.validation.constraints.NotBlank;
  9 +import javax.validation.constraints.NotNull;
  10 +
  11 +@Schema(description = "管理后台 - 会员用户 修改等级 Request VO")
  12 +@Data
  13 +@EqualsAndHashCode(callSuper = true)
  14 +@ToString(callSuper = true)
  15 +public class MemberUserUpdateLevelReqVO extends MemberUserBaseVO {
  16 +
  17 + @Schema(description = "用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "23788")
  18 + @NotNull(message = "用户编号不能为空")
  19 + private Long id;
  20 +
  21 + /**
  22 + * 取消用户等级时,值为空
  23 + */
  24 + @Schema(description = "用户等级编号", example = "1")
  25 + private Long levelId;
  26 +
  27 + @Schema(description = "修改原因", requiredMode = Schema.RequiredMode.REQUIRED, example = "推广需要")
  28 + @NotBlank(message = "修改原因不能为空")
  29 + private String reason;
  30 +
  31 +}
... ...
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/user/vo/MemberUserUpdateReqVO.java
... ... @@ -17,7 +17,4 @@ public class MemberUserUpdateReqVO extends MemberUserBaseVO {
17 17 @NotNull(message = "编号不能为空")
18 18 private Long id;
19 19  
20   - @Schema(description = "会员级别修改原因", requiredMode = Schema.RequiredMode.REQUIRED, example = "推广需要")
21   - private String levelReason;
22   -
23 20 }
... ...
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/convert/level/MemberExperienceLogConvert.java renamed to yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/convert/level/MemberExperienceRecordConvert.java
1 1 package cn.iocoder.yudao.module.member.convert.level;
2 2  
3 3 import cn.iocoder.yudao.framework.common.pojo.PageResult;
4   -import cn.iocoder.yudao.module.member.controller.admin.level.vo.experience.MemberExperienceLogRespVO;
5   -import cn.iocoder.yudao.module.member.dal.dataobject.level.MemberExperienceLogDO;
  4 +import cn.iocoder.yudao.module.member.controller.admin.level.vo.experience.MemberExperienceRecordRespVO;
  5 +import cn.iocoder.yudao.module.member.dal.dataobject.level.MemberExperienceRecordDO;
6 6 import org.mapstruct.Mapper;
7 7 import org.mapstruct.factory.Mappers;
8 8  
... ... @@ -14,14 +14,17 @@ import java.util.List;
14 14 * @author owen
15 15 */
16 16 @Mapper
17   -public interface MemberExperienceLogConvert {
  17 +public interface MemberExperienceRecordConvert {
18 18  
19   - MemberExperienceLogConvert INSTANCE = Mappers.getMapper(MemberExperienceLogConvert.class);
  19 + MemberExperienceRecordConvert INSTANCE = Mappers.getMapper(MemberExperienceRecordConvert.class);
20 20  
21   - MemberExperienceLogRespVO convert(MemberExperienceLogDO bean);
  21 + MemberExperienceRecordRespVO convert(MemberExperienceRecordDO bean);
22 22  
23   - List<MemberExperienceLogRespVO> convertList(List<MemberExperienceLogDO> list);
  23 + List<MemberExperienceRecordRespVO> convertList(List<MemberExperienceRecordDO> list);
24 24  
25   - PageResult<MemberExperienceLogRespVO> convertPage(PageResult<MemberExperienceLogDO> page);
  25 + PageResult<MemberExperienceRecordRespVO> convertPage(PageResult<MemberExperienceRecordDO> page);
26 26  
  27 + MemberExperienceRecordDO convert(Long userId, Integer experience, Integer totalExperience,
  28 + String bizId, Integer bizType,
  29 + String title, String description);
27 30 }
... ...
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/convert/level/MemberLevelConvert.java
1 1 package cn.iocoder.yudao.module.member.convert.level;
2 2  
3   -import cn.iocoder.yudao.framework.common.pojo.PageResult;
4 3 import cn.iocoder.yudao.module.member.controller.admin.level.vo.level.MemberLevelCreateReqVO;
5 4 import cn.iocoder.yudao.module.member.controller.admin.level.vo.level.MemberLevelRespVO;
6 5 import cn.iocoder.yudao.module.member.controller.admin.level.vo.level.MemberLevelSimpleRespVO;
... ... @@ -29,7 +28,5 @@ public interface MemberLevelConvert {
29 28  
30 29 List<MemberLevelRespVO> convertList(List<MemberLevelDO> list);
31 30  
32   - PageResult<MemberLevelRespVO> convertPage(PageResult<MemberLevelDO> page);
33   -
34 31 List<MemberLevelSimpleRespVO> convertSimpleList(List<MemberLevelDO> list);
35 32 }
... ...
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/convert/level/MemberLevelLogConvert.java deleted
1   -package cn.iocoder.yudao.module.member.convert.level;
2   -
3   -import cn.iocoder.yudao.framework.common.pojo.PageResult;
4   -import cn.iocoder.yudao.module.member.controller.admin.level.vo.log.MemberLevelLogRespVO;
5   -import cn.iocoder.yudao.module.member.dal.dataobject.level.MemberLevelLogDO;
6   -import org.mapstruct.Mapper;
7   -import org.mapstruct.factory.Mappers;
8   -
9   -import java.util.List;
10   -
11   -/**
12   - * 会员等级记录 Convert
13   - *
14   - * @author owen
15   - */
16   -@Mapper
17   -public interface MemberLevelLogConvert {
18   -
19   - MemberLevelLogConvert INSTANCE = Mappers.getMapper(MemberLevelLogConvert.class);
20   -
21   - MemberLevelLogRespVO convert(MemberLevelLogDO bean);
22   -
23   - List<MemberLevelLogRespVO> convertList(List<MemberLevelLogDO> list);
24   -
25   - PageResult<MemberLevelLogRespVO> convertPage(PageResult<MemberLevelLogDO> page);
26   -
27   -}
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/convert/level/MemberLevelRecordConvert.java 0 → 100644
  1 +package cn.iocoder.yudao.module.member.convert.level;
  2 +
  3 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  4 +import cn.iocoder.yudao.module.member.controller.admin.level.vo.log.MemberLevelRecordRespVO;
  5 +import cn.iocoder.yudao.module.member.dal.dataobject.level.MemberLevelDO;
  6 +import cn.iocoder.yudao.module.member.dal.dataobject.level.MemberLevelRecordDO;
  7 +import org.mapstruct.Mapper;
  8 +import org.mapstruct.factory.Mappers;
  9 +
  10 +import java.util.List;
  11 +
  12 +/**
  13 + * 会员等级记录 Convert
  14 + *
  15 + * @author owen
  16 + */
  17 +@Mapper
  18 +public interface MemberLevelRecordConvert {
  19 +
  20 + MemberLevelRecordConvert INSTANCE = Mappers.getMapper(MemberLevelRecordConvert.class);
  21 +
  22 + MemberLevelRecordRespVO convert(MemberLevelRecordDO bean);
  23 +
  24 + List<MemberLevelRecordRespVO> convertList(List<MemberLevelRecordDO> list);
  25 +
  26 + PageResult<MemberLevelRecordRespVO> convertPage(PageResult<MemberLevelRecordDO> page);
  27 +
  28 + default MemberLevelRecordDO copyTo(MemberLevelDO from, MemberLevelRecordDO to) {
  29 + if (from != null) {
  30 + to.setLevelId(from.getId());
  31 + to.setLevel(from.getLevel());
  32 + to.setDiscountPercent(from.getDiscountPercent());
  33 + to.setExperience(from.getExperience());
  34 + }
  35 + return to;
  36 + }
  37 +}
... ...
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/dataobject/level/MemberExperienceLogDO.java renamed to yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/dataobject/level/MemberExperienceRecordDO.java
... ... @@ -13,15 +13,15 @@ import lombok.*;
13 13 *
14 14 * @author owen
15 15 */
16   -@TableName("member_experience_log")
17   -@KeySequence("member_experience_log_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
  16 +@TableName("member_experience_record")
  17 +@KeySequence("member_experience_record_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
18 18 @Data
19 19 @EqualsAndHashCode(callSuper = true)
20 20 @ToString(callSuper = true)
21 21 @Builder
22 22 @NoArgsConstructor
23 23 @AllArgsConstructor
24   -public class MemberExperienceLogDO extends BaseDO {
  24 +public class MemberExperienceRecordDO extends BaseDO {
25 25  
26 26 /**
27 27 * 编号
... ...
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/dataobject/level/MemberLevelLogDO.java renamed to yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/dataobject/level/MemberLevelRecordDO.java
... ... @@ -14,15 +14,15 @@ import lombok.*;
14 14 *
15 15 * @author owen
16 16 */
17   -@TableName("member_level_log")
18   -@KeySequence("member_level_log_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
  17 +@TableName("member_level_record")
  18 +@KeySequence("member_level_record_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
19 19 @Data
20 20 @EqualsAndHashCode(callSuper = true)
21 21 @ToString(callSuper = true)
22 22 @Builder
23 23 @NoArgsConstructor
24 24 @AllArgsConstructor
25   -public class MemberLevelLogDO extends BaseDO {
  25 +public class MemberLevelRecordDO extends BaseDO {
26 26  
27 27 /**
28 28 * 编号
... ... @@ -59,7 +59,6 @@ public class MemberLevelLogDO extends BaseDO {
59 59 * 会员此时的经验
60 60 */
61 61 private Integer userExperience;
62   - // TODO @疯狂:是不是 remark 和 description 可以合并成 description 就够了
63 62 /**
64 63 * 备注
65 64 */
... ...
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/level/MemberExperienceLogMapper.java deleted
1   -package cn.iocoder.yudao.module.member.dal.mysql.level;
2   -
3   -import cn.iocoder.yudao.framework.common.pojo.PageResult;
4   -import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
5   -import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
6   -import cn.iocoder.yudao.module.member.controller.admin.level.vo.experience.MemberExperienceLogPageReqVO;
7   -import cn.iocoder.yudao.module.member.dal.dataobject.level.MemberExperienceLogDO;
8   -import org.apache.ibatis.annotations.Mapper;
9   -
10   -/**
11   - * 会员经验记录 Mapper
12   - *
13   - * @author owen
14   - */
15   -@Mapper
16   -public interface MemberExperienceLogMapper extends BaseMapperX<MemberExperienceLogDO> {
17   -
18   - default PageResult<MemberExperienceLogDO> selectPage(MemberExperienceLogPageReqVO reqVO) {
19   - return selectPage(reqVO, new LambdaQueryWrapperX<MemberExperienceLogDO>()
20   - .eqIfPresent(MemberExperienceLogDO::getUserId, reqVO.getUserId())
21   - .eqIfPresent(MemberExperienceLogDO::getBizId, reqVO.getBizId())
22   - .eqIfPresent(MemberExperienceLogDO::getBizType, reqVO.getBizType())
23   - .eqIfPresent(MemberExperienceLogDO::getTitle, reqVO.getTitle())
24   - .betweenIfPresent(MemberExperienceLogDO::getCreateTime, reqVO.getCreateTime())
25   - .orderByDesc(MemberExperienceLogDO::getId));
26   - }
27   -
28   -}
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/level/MemberExperienceRecordMapper.java 0 → 100644
  1 +package cn.iocoder.yudao.module.member.dal.mysql.level;
  2 +
  3 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  4 +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
  5 +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
  6 +import cn.iocoder.yudao.module.member.controller.admin.level.vo.experience.MemberExperienceRecordPageReqVO;
  7 +import cn.iocoder.yudao.module.member.dal.dataobject.level.MemberExperienceRecordDO;
  8 +import org.apache.ibatis.annotations.Mapper;
  9 +
  10 +/**
  11 + * 会员经验记录 Mapper
  12 + *
  13 + * @author owen
  14 + */
  15 +@Mapper
  16 +public interface MemberExperienceRecordMapper extends BaseMapperX<MemberExperienceRecordDO> {
  17 +
  18 + default PageResult<MemberExperienceRecordDO> selectPage(MemberExperienceRecordPageReqVO reqVO) {
  19 + return selectPage(reqVO, new LambdaQueryWrapperX<MemberExperienceRecordDO>()
  20 + .eqIfPresent(MemberExperienceRecordDO::getUserId, reqVO.getUserId())
  21 + .eqIfPresent(MemberExperienceRecordDO::getBizId, reqVO.getBizId())
  22 + .eqIfPresent(MemberExperienceRecordDO::getBizType, reqVO.getBizType())
  23 + .eqIfPresent(MemberExperienceRecordDO::getTitle, reqVO.getTitle())
  24 + .betweenIfPresent(MemberExperienceRecordDO::getCreateTime, reqVO.getCreateTime())
  25 + .orderByDesc(MemberExperienceRecordDO::getId));
  26 + }
  27 +
  28 +}
... ...
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/level/MemberLevelMapper.java
1 1 package cn.iocoder.yudao.module.member.dal.mysql.level;
2 2  
3   -import cn.iocoder.yudao.framework.common.pojo.PageResult;
4 3 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
5 4 import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
6   -import cn.iocoder.yudao.module.member.controller.admin.level.vo.level.MemberLevelPageReqVO;
  5 +import cn.iocoder.yudao.module.member.controller.admin.level.vo.level.MemberLevelListReqVO;
7 6 import cn.iocoder.yudao.module.member.dal.dataobject.level.MemberLevelDO;
8 7 import org.apache.ibatis.annotations.Mapper;
9 8  
... ... @@ -17,8 +16,8 @@ import java.util.List;
17 16 @Mapper
18 17 public interface MemberLevelMapper extends BaseMapperX<MemberLevelDO> {
19 18  
20   - default PageResult<MemberLevelDO> selectPage(MemberLevelPageReqVO reqVO) {
21   - return selectPage(reqVO, new LambdaQueryWrapperX<MemberLevelDO>()
  19 + default List<MemberLevelDO> selectList(MemberLevelListReqVO reqVO) {
  20 + return selectList(new LambdaQueryWrapperX<MemberLevelDO>()
22 21 .likeIfPresent(MemberLevelDO::getName, reqVO.getName())
23 22 .eqIfPresent(MemberLevelDO::getStatus, reqVO.getStatus())
24 23 .orderByAsc(MemberLevelDO::getLevel));
... ...
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/level/MemberLevelLogMapper.java renamed to yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/level/MemberLevelRecordMapper.java
... ... @@ -3,8 +3,8 @@ package cn.iocoder.yudao.module.member.dal.mysql.level;
3 3 import cn.iocoder.yudao.framework.common.pojo.PageResult;
4 4 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
5 5 import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
6   -import cn.iocoder.yudao.module.member.controller.admin.level.vo.log.MemberLevelLogPageReqVO;
7   -import cn.iocoder.yudao.module.member.dal.dataobject.level.MemberLevelLogDO;
  6 +import cn.iocoder.yudao.module.member.controller.admin.level.vo.log.MemberLevelRecordPageReqVO;
  7 +import cn.iocoder.yudao.module.member.dal.dataobject.level.MemberLevelRecordDO;
8 8 import org.apache.ibatis.annotations.Mapper;
9 9  
10 10 /**
... ... @@ -13,14 +13,14 @@ import org.apache.ibatis.annotations.Mapper;
13 13 * @author owen
14 14 */
15 15 @Mapper
16   -public interface MemberLevelLogMapper extends BaseMapperX<MemberLevelLogDO> {
  16 +public interface MemberLevelRecordMapper extends BaseMapperX<MemberLevelRecordDO> {
17 17  
18   - default PageResult<MemberLevelLogDO> selectPage(MemberLevelLogPageReqVO reqVO) {
19   - return selectPage(reqVO, new LambdaQueryWrapperX<MemberLevelLogDO>()
20   - .eqIfPresent(MemberLevelLogDO::getUserId, reqVO.getUserId())
21   - .eqIfPresent(MemberLevelLogDO::getLevelId, reqVO.getLevelId())
22   - .betweenIfPresent(MemberLevelLogDO::getCreateTime, reqVO.getCreateTime())
23   - .orderByDesc(MemberLevelLogDO::getId));
  18 + default PageResult<MemberLevelRecordDO> selectPage(MemberLevelRecordPageReqVO reqVO) {
  19 + return selectPage(reqVO, new LambdaQueryWrapperX<MemberLevelRecordDO>()
  20 + .eqIfPresent(MemberLevelRecordDO::getUserId, reqVO.getUserId())
  21 + .eqIfPresent(MemberLevelRecordDO::getLevelId, reqVO.getLevelId())
  22 + .betweenIfPresent(MemberLevelRecordDO::getCreateTime, reqVO.getCreateTime())
  23 + .orderByDesc(MemberLevelRecordDO::getId));
24 24 }
25 25  
26 26 }
... ...
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/user/MemberUserMapper.java
... ... @@ -7,7 +7,6 @@ import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
7 7 import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
8 8 import cn.iocoder.yudao.module.member.controller.admin.user.vo.MemberUserPageReqVO;
9 9 import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO;
10   -import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
11 10 import org.apache.ibatis.annotations.Mapper;
12 11  
13 12 import java.util.List;
... ... @@ -50,20 +49,6 @@ public interface MemberUserMapper extends BaseMapperX&lt;MemberUserDO&gt; {
50 49 .orderByDesc(MemberUserDO::getId));
51 50 }
52 51  
53   - // TODO @疯狂:命名可以改成 updateUserLevelToNull;db 侧的操作,尽量无业务含义,更多是 select、update、insert 操作
54   - /**
55   - * 取消会员的等级
56   - *
57   - * @param userId 会员编号
58   - * @return 受影响的行数
59   - */
60   - default int cancelUserLevel(Long userId) {
61   - return update(null, new LambdaUpdateWrapper<MemberUserDO>()
62   - .eq(MemberUserDO::getId, userId)
63   - .set(MemberUserDO::getExperience, 0)
64   - .set(MemberUserDO::getLevelId, null));
65   - }
66   -
67 52 default Long selectCountByGroupId(Long groupId) {
68 53 return selectCount(MemberUserDO::getGroupId, groupId);
69 54 }
... ...
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/level/MemberExperienceLogService.java renamed to yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/level/MemberExperienceRecordService.java
1 1 package cn.iocoder.yudao.module.member.service.level;
2 2  
3 3 import cn.iocoder.yudao.framework.common.pojo.PageResult;
4   -import cn.iocoder.yudao.module.member.controller.admin.level.vo.experience.MemberExperienceLogPageReqVO;
5   -import cn.iocoder.yudao.module.member.dal.dataobject.level.MemberExperienceLogDO;
  4 +import cn.iocoder.yudao.module.member.controller.admin.level.vo.experience.MemberExperienceRecordPageReqVO;
  5 +import cn.iocoder.yudao.module.member.dal.dataobject.level.MemberExperienceRecordDO;
6 6 import cn.iocoder.yudao.module.member.enums.MemberExperienceBizTypeEnum;
7 7  
8 8 import java.util.Collection;
... ... @@ -13,7 +13,7 @@ import java.util.List;
13 13 *
14 14 * @author owen
15 15 */
16   -public interface MemberExperienceLogService {
  16 +public interface MemberExperienceRecordService {
17 17  
18 18 /**
19 19 * 获得会员经验记录
... ... @@ -21,7 +21,7 @@ public interface MemberExperienceLogService {
21 21 * @param id 编号
22 22 * @return 会员经验记录
23 23 */
24   - MemberExperienceLogDO getExperienceLog(Long id);
  24 + MemberExperienceRecordDO getExperienceRecord(Long id);
25 25  
26 26 /**
27 27 * 获得会员经验记录列表
... ... @@ -29,7 +29,7 @@ public interface MemberExperienceLogService {
29 29 * @param ids 编号
30 30 * @return 会员经验记录列表
31 31 */
32   - List<MemberExperienceLogDO> getExperienceLogList(Collection<Long> ids);
  32 + List<MemberExperienceRecordDO> getExperienceRecordList(Collection<Long> ids);
33 33  
34 34 /**
35 35 * 获得会员经验记录分页
... ... @@ -37,18 +37,7 @@ public interface MemberExperienceLogService {
37 37 * @param pageReqVO 分页查询
38 38 * @return 会员经验记录分页
39 39 */
40   - PageResult<MemberExperienceLogDO> getExperienceLogPage(MemberExperienceLogPageReqVO pageReqVO);
41   -
42   - // TODO @疯狂:类似 MemberLevelLogService 的方法,这里也需要提供一个通用的方法,用于创建经验变动记录
43   -
44   - /**
45   - * 创建 手动调整 经验变动记录
46   - *
47   - * @param userId 会员编号
48   - * @param experience 变动经验值
49   - * @param totalExperience 会员当前的经验
50   - */
51   - void createAdjustLog(Long userId, int experience, int totalExperience);
  40 + PageResult<MemberExperienceRecordDO> getExperienceRecordPage(MemberExperienceRecordPageReqVO pageReqVO);
52 41  
53 42 /**
54 43 * 根据业务类型, 创建 经验变动记录
... ... @@ -59,5 +48,6 @@ public interface MemberExperienceLogService {
59 48 * @param bizType 业务类型
60 49 * @param bizId 业务ID
61 50 */
62   - void createBizLog(Long userId, int experience, int totalExperience, MemberExperienceBizTypeEnum bizType, String bizId);
  51 + void createExperienceRecord(Long userId, Integer experience, Integer totalExperience,
  52 + MemberExperienceBizTypeEnum bizType, String bizId);
63 53 }
... ...
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/level/MemberExperienceLogServiceImpl.java renamed to yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/level/MemberExperienceRecordServiceImpl.java
... ... @@ -2,9 +2,10 @@ package cn.iocoder.yudao.module.member.service.level;
2 2  
3 3 import cn.hutool.core.util.StrUtil;
4 4 import cn.iocoder.yudao.framework.common.pojo.PageResult;
5   -import cn.iocoder.yudao.module.member.controller.admin.level.vo.experience.MemberExperienceLogPageReqVO;
6   -import cn.iocoder.yudao.module.member.dal.dataobject.level.MemberExperienceLogDO;
7   -import cn.iocoder.yudao.module.member.dal.mysql.level.MemberExperienceLogMapper;
  5 +import cn.iocoder.yudao.module.member.controller.admin.level.vo.experience.MemberExperienceRecordPageReqVO;
  6 +import cn.iocoder.yudao.module.member.convert.level.MemberExperienceRecordConvert;
  7 +import cn.iocoder.yudao.module.member.dal.dataobject.level.MemberExperienceRecordDO;
  8 +import cn.iocoder.yudao.module.member.dal.mysql.level.MemberExperienceRecordMapper;
8 9 import cn.iocoder.yudao.module.member.enums.MemberExperienceBizTypeEnum;
9 10 import org.springframework.stereotype.Service;
10 11 import org.springframework.validation.annotation.Validated;
... ... @@ -20,45 +21,36 @@ import java.util.List;
20 21 */
21 22 @Service
22 23 @Validated
23   -public class MemberExperienceLogServiceImpl implements MemberExperienceLogService {
  24 +public class MemberExperienceRecordServiceImpl implements MemberExperienceRecordService {
24 25  
25 26 @Resource
26   - private MemberExperienceLogMapper experienceLogMapper;
  27 + private MemberExperienceRecordMapper experienceLogMapper;
27 28  
28 29  
29 30 @Override
30   - public MemberExperienceLogDO getExperienceLog(Long id) {
  31 + public MemberExperienceRecordDO getExperienceRecord(Long id) {
31 32 return experienceLogMapper.selectById(id);
32 33 }
33 34  
34 35 @Override
35   - public List<MemberExperienceLogDO> getExperienceLogList(Collection<Long> ids) {
  36 + public List<MemberExperienceRecordDO> getExperienceRecordList(Collection<Long> ids) {
36 37 return experienceLogMapper.selectBatchIds(ids);
37 38 }
38 39  
39 40 @Override
40   - public PageResult<MemberExperienceLogDO> getExperienceLogPage(MemberExperienceLogPageReqVO pageReqVO) {
  41 + public PageResult<MemberExperienceRecordDO> getExperienceRecordPage(MemberExperienceRecordPageReqVO pageReqVO) {
41 42 return experienceLogMapper.selectPage(pageReqVO);
42 43 }
43 44  
44 45 @Override
45   - public void createAdjustLog(Long userId, int experience, int totalExperience) {
46   - // 管理员调整时, 没有业务编号, 记录对应的枚举值
47   - String bizId = MemberExperienceBizTypeEnum.ADMIN.getValue() + "";
48   - this.createBizLog(userId, experience, totalExperience, MemberExperienceBizTypeEnum.ADMIN, bizId);
49   - }
50   -
51   - @Override
52   - public void createBizLog(Long userId, int experience, int totalExperience, MemberExperienceBizTypeEnum bizType, String bizId) {
53   - MemberExperienceLogDO experienceLogDO = new MemberExperienceLogDO();
54   - experienceLogDO.setUserId(userId);
55   - experienceLogDO.setExperience(experience);
56   - experienceLogDO.setTotalExperience(totalExperience);
57   - experienceLogDO.setBizId(bizId);
58   - experienceLogDO.setBizType(bizType.getValue());
59   - experienceLogDO.setTitle(bizType.getTitle());
60   - experienceLogDO.setDescription(StrUtil.format(bizType.getDesc(), experience));
61   - experienceLogMapper.insert(experienceLogDO);
  46 + public void createExperienceRecord(Long userId, Integer experience, Integer totalExperience,
  47 + MemberExperienceBizTypeEnum bizType, String bizId) {
  48 + String description = StrUtil.format(bizType.getDesc(), experience);
  49 + MemberExperienceRecordDO recordDO = MemberExperienceRecordConvert.INSTANCE.convert(userId,
  50 + experience, totalExperience,
  51 + bizId, bizType.getValue(), bizType.getTitle(),
  52 + description);
  53 + experienceLogMapper.insert(recordDO);
62 54 }
63 55  
64 56 }
... ...
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/level/MemberLevelLogService.java renamed to yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/level/MemberLevelRecordService.java
1 1 package cn.iocoder.yudao.module.member.service.level;
2 2  
3 3 import cn.iocoder.yudao.framework.common.pojo.PageResult;
4   -import cn.iocoder.yudao.module.member.controller.admin.level.vo.log.MemberLevelLogPageReqVO;
5   -import cn.iocoder.yudao.module.member.dal.dataobject.level.MemberLevelDO;
6   -import cn.iocoder.yudao.module.member.dal.dataobject.level.MemberLevelLogDO;
7   -import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO;
  4 +import cn.iocoder.yudao.module.member.controller.admin.level.vo.log.MemberLevelRecordPageReqVO;
  5 +import cn.iocoder.yudao.module.member.dal.dataobject.level.MemberLevelRecordDO;
8 6  
9 7 import java.util.Collection;
10 8 import java.util.List;
... ... @@ -14,14 +12,7 @@ import java.util.List;
14 12 *
15 13 * @author owen
16 14 */
17   -public interface MemberLevelLogService {
18   -
19   - /**
20   - * 删除会员等级记录
21   - *
22   - * @param id 编号
23   - */
24   - void deleteLevelLog(Long id);
  15 +public interface MemberLevelRecordService {
25 16  
26 17 /**
27 18 * 获得会员等级记录
... ... @@ -29,7 +20,7 @@ public interface MemberLevelLogService {
29 20 * @param id 编号
30 21 * @return 会员等级记录
31 22 */
32   - MemberLevelLogDO getLevelLog(Long id);
  23 + MemberLevelRecordDO getLevelRecord(Long id);
33 24  
34 25 /**
35 26 * 获得会员等级记录列表
... ... @@ -37,7 +28,7 @@ public interface MemberLevelLogService {
37 28 * @param ids 编号
38 29 * @return 会员等级记录列表
39 30 */
40   - List<MemberLevelLogDO> getLevelLogList(Collection<Long> ids);
  31 + List<MemberLevelRecordDO> getLevelRecordList(Collection<Long> ids);
41 32  
42 33 /**
43 34 * 获得会员等级记录分页
... ... @@ -45,33 +36,12 @@ public interface MemberLevelLogService {
45 36 * @param pageReqVO 分页查询
46 37 * @return 会员等级记录分页
47 38 */
48   - PageResult<MemberLevelLogDO> getLevelLogPage(MemberLevelLogPageReqVO pageReqVO);
49   -
50   - // TODO @疯狂:把 createCancelLog、createAdjustLog、createAutoUpgradeLog 几个日志合并成一个通用的日志方法;整体的内容,交给 MemberLevelService 去做;以及对应的 level 变化的通知;
51   -
52   - /**
53   - * 创建记录: 取消等级
54   - *
55   - * @param userId 会员编号
56   - * @param reason 调整原因
57   - */
58   - void createCancelLog(Long userId, String reason);
59   -
60   - /**
61   - * 创建记录: 手动调整
62   - *
63   - * @param user 会员
64   - * @param level 等级
65   - * @param experience 变动经验值
66   - * @param reason 调整原因
67   - */
68   - void createAdjustLog(MemberUserDO user, MemberLevelDO level, int experience, String reason);
  39 + PageResult<MemberLevelRecordDO> getLevelRecordPage(MemberLevelRecordPageReqVO pageReqVO);
69 40  
70 41 /**
71   - * 创建记录: 自动升级
  42 + * 创建会员等级记录
72 43 *
73   - * @param user 会员
74   - * @param level 等级
  44 + * @param levelRecord 会员等级记录
75 45 */
76   - void createAutoUpgradeLog(MemberUserDO user, MemberLevelDO level);
  46 + void createLevelRecord(MemberLevelRecordDO levelRecord);
77 47 }
... ...
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/level/MemberLevelLogServiceImpl.java renamed to yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/level/MemberLevelRecordServiceImpl.java
1 1 package cn.iocoder.yudao.module.member.service.level;
2 2  
3 3 import cn.iocoder.yudao.framework.common.pojo.PageResult;
4   -import cn.iocoder.yudao.module.member.controller.admin.level.vo.log.MemberLevelLogPageReqVO;
5   -import cn.iocoder.yudao.module.member.dal.dataobject.level.MemberLevelDO;
6   -import cn.iocoder.yudao.module.member.dal.dataobject.level.MemberLevelLogDO;
7   -import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO;
8   -import cn.iocoder.yudao.module.member.dal.mysql.level.MemberLevelLogMapper;
  4 +import cn.iocoder.yudao.module.member.controller.admin.level.vo.log.MemberLevelRecordPageReqVO;
  5 +import cn.iocoder.yudao.module.member.dal.dataobject.level.MemberLevelRecordDO;
  6 +import cn.iocoder.yudao.module.member.dal.mysql.level.MemberLevelRecordMapper;
9 7 import org.springframework.stereotype.Service;
10 8 import org.springframework.validation.annotation.Validated;
11 9  
... ... @@ -23,18 +21,10 @@ import static cn.iocoder.yudao.module.member.enums.ErrorCodeConstants.LEVEL_LOG_
23 21 */
24 22 @Service
25 23 @Validated
26   -public class MemberLevelLogServiceImpl implements MemberLevelLogService {
  24 +public class MemberLevelRecordServiceImpl implements MemberLevelRecordService {
27 25  
28 26 @Resource
29   - private MemberLevelLogMapper levelLogMapper;
30   -
31   - @Override
32   - public void deleteLevelLog(Long id) {
33   - // 校验存在
34   - validateLevelLogExists(id);
35   - // 删除
36   - levelLogMapper.deleteById(id);
37   - }
  27 + private MemberLevelRecordMapper levelLogMapper;
38 28  
39 29 private void validateLevelLogExists(Long id) {
40 30 if (levelLogMapper.selectById(id) == null) {
... ... @@ -43,67 +33,23 @@ public class MemberLevelLogServiceImpl implements MemberLevelLogService {
43 33 }
44 34  
45 35 @Override
46   - public MemberLevelLogDO getLevelLog(Long id) {
  36 + public MemberLevelRecordDO getLevelRecord(Long id) {
47 37 return levelLogMapper.selectById(id);
48 38 }
49 39  
50 40 @Override
51   - public List<MemberLevelLogDO> getLevelLogList(Collection<Long> ids) {
  41 + public List<MemberLevelRecordDO> getLevelRecordList(Collection<Long> ids) {
52 42 return levelLogMapper.selectBatchIds(ids);
53 43 }
54 44  
55 45 @Override
56   - public PageResult<MemberLevelLogDO> getLevelLogPage(MemberLevelLogPageReqVO pageReqVO) {
  46 + public PageResult<MemberLevelRecordDO> getLevelRecordPage(MemberLevelRecordPageReqVO pageReqVO) {
57 47 return levelLogMapper.selectPage(pageReqVO);
58 48 }
59 49  
60 50 @Override
61   - public void createCancelLog(Long userId, String reason) {
62   - MemberLevelLogDO levelLogDO = new MemberLevelLogDO();
63   - levelLogDO.setUserId(userId);
64   - levelLogDO.setRemark(reason);
65   - levelLogDO.setDescription("管理员取消");
66   - levelLogMapper.insert(levelLogDO);
67   -
68   - // 给会员发送等级变动消息
69   - notifyMember(userId, levelLogDO);
70   - }
71   -
72   - @Override
73   - public void createAdjustLog(MemberUserDO user, MemberLevelDO level, int experience, String reason) {
74   - MemberLevelLogDO levelLogDO = new MemberLevelLogDO();
75   - levelLogDO.setUserId(user.getId());
76   - levelLogDO.setLevelId(level.getId());
77   - levelLogDO.setLevel(level.getLevel());
78   - levelLogDO.setDiscountPercent(level.getDiscountPercent());
79   - levelLogDO.setUserExperience(level.getExperience());
80   - levelLogDO.setExperience(experience);
81   - levelLogDO.setRemark(reason);
82   - levelLogDO.setDescription("管理员调整为:" + level.getName());
83   - levelLogMapper.insert(levelLogDO);
84   -
85   - // 给会员发送等级变动消息
86   - notifyMember(user.getId(), levelLogDO);
87   - }
88   -
89   - @Override
90   - public void createAutoUpgradeLog(MemberUserDO user, MemberLevelDO level) {
91   - MemberLevelLogDO levelLogDO = new MemberLevelLogDO();
92   - levelLogDO.setUserId(user.getId());
93   - levelLogDO.setLevelId(level.getId());
94   - levelLogDO.setLevel(level.getLevel());
95   - levelLogDO.setDiscountPercent(level.getDiscountPercent());
96   - levelLogDO.setExperience(level.getExperience());
97   - levelLogDO.setUserExperience(user.getExperience());
98   - levelLogDO.setDescription("成为:" + level.getName());
99   - levelLogMapper.insert(levelLogDO);
100   -
101   - // 给会员发送等级变动消息
102   - notifyMember(user.getId(), levelLogDO);
103   - }
104   -
105   - private void notifyMember(Long userId, MemberLevelLogDO level) {
106   - //todo: 给会员发消息
  51 + public void createLevelRecord(MemberLevelRecordDO levelRecord) {
  52 + levelLogMapper.insert(levelRecord);
107 53 }
108 54  
109 55 }
... ...
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/level/MemberLevelService.java
1 1 package cn.iocoder.yudao.module.member.service.level;
2 2  
3 3 import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
4   -import cn.iocoder.yudao.framework.common.pojo.PageResult;
5 4 import cn.iocoder.yudao.module.member.controller.admin.level.vo.level.MemberLevelCreateReqVO;
6   -import cn.iocoder.yudao.module.member.controller.admin.level.vo.level.MemberLevelPageReqVO;
  5 +import cn.iocoder.yudao.module.member.controller.admin.level.vo.level.MemberLevelListReqVO;
7 6 import cn.iocoder.yudao.module.member.controller.admin.level.vo.level.MemberLevelUpdateReqVO;
  7 +import cn.iocoder.yudao.module.member.controller.admin.user.vo.MemberUserUpdateLevelReqVO;
8 8 import cn.iocoder.yudao.module.member.dal.dataobject.level.MemberLevelDO;
9   -import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO;
10 9 import cn.iocoder.yudao.module.member.enums.MemberExperienceBizTypeEnum;
11 10  
12   -import javax.annotation.Nullable;
13 11 import javax.validation.Valid;
14 12 import java.util.Collection;
15 13 import java.util.List;
... ... @@ -60,12 +58,12 @@ public interface MemberLevelService {
60 58 List<MemberLevelDO> getLevelList(Collection<Long> ids);
61 59  
62 60 /**
63   - * 获得会员等级分页
  61 + * 获得会员等级列表
64 62 *
65   - * @param pageReqVO 分页查询
66   - * @return 会员等级分页
  63 + * @param listReqVO 查询参数
  64 + * @return 会员等级列表
67 65 */
68   - PageResult<MemberLevelDO> getLevelPage(MemberLevelPageReqVO pageReqVO);
  66 + List<MemberLevelDO> getLevelList(MemberLevelListReqVO listReqVO);
69 67  
70 68  
71 69 /**
... ... @@ -89,11 +87,9 @@ public interface MemberLevelService {
89 87 /**
90 88 * 修改会员的等级
91 89 *
92   - * @param user 会员
93   - * @param levelId 要修改的等级编号,编号为空时,代表取消会员的等级
94   - * @param levelReason 修改原因
  90 + * @param updateReqVO 修改参数
95 91 */
96   - void updateUserLevel(MemberUserDO user, @Nullable Long levelId, String levelReason);
  92 + void updateUserLevel(MemberUserUpdateLevelReqVO updateReqVO);
97 93  
98 94 /**
99 95 * 增加会员经验
... ... @@ -103,5 +99,5 @@ public interface MemberLevelService {
103 99 * @param bizType 业务类型
104 100 * @param bizId 业务编号
105 101 */
106   - void plusExperience(Long userId, Integer experience, MemberExperienceBizTypeEnum bizType, String bizId);
  102 + void addExperience(Long userId, Integer experience, MemberExperienceBizTypeEnum bizType, String bizId);
107 103 }
... ...
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/level/MemberLevelServiceImpl.java
... ... @@ -4,17 +4,19 @@ import cn.hutool.core.collection.CollUtil;
4 4 import cn.hutool.core.util.NumberUtil;
5 5 import cn.hutool.core.util.ObjUtil;
6 6 import cn.hutool.core.util.ObjectUtil;
7   -import cn.hutool.core.util.StrUtil;
8   -import cn.iocoder.yudao.framework.common.pojo.PageResult;
9 7 import cn.iocoder.yudao.module.member.controller.admin.level.vo.level.MemberLevelCreateReqVO;
10   -import cn.iocoder.yudao.module.member.controller.admin.level.vo.level.MemberLevelPageReqVO;
  8 +import cn.iocoder.yudao.module.member.controller.admin.level.vo.level.MemberLevelListReqVO;
11 9 import cn.iocoder.yudao.module.member.controller.admin.level.vo.level.MemberLevelUpdateReqVO;
  10 +import cn.iocoder.yudao.module.member.controller.admin.user.vo.MemberUserUpdateLevelReqVO;
12 11 import cn.iocoder.yudao.module.member.convert.level.MemberLevelConvert;
  12 +import cn.iocoder.yudao.module.member.convert.level.MemberLevelRecordConvert;
13 13 import cn.iocoder.yudao.module.member.dal.dataobject.level.MemberLevelDO;
  14 +import cn.iocoder.yudao.module.member.dal.dataobject.level.MemberLevelRecordDO;
14 15 import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO;
15 16 import cn.iocoder.yudao.module.member.dal.mysql.level.MemberLevelMapper;
16 17 import cn.iocoder.yudao.module.member.dal.mysql.user.MemberUserMapper;
17 18 import cn.iocoder.yudao.module.member.enums.MemberExperienceBizTypeEnum;
  19 +import cn.iocoder.yudao.module.member.service.user.MemberUserService;
18 20 import com.google.common.annotations.VisibleForTesting;
19 21 import lombok.extern.slf4j.Slf4j;
20 22 import org.springframework.stereotype.Service;
... ... @@ -42,11 +44,13 @@ public class MemberLevelServiceImpl implements MemberLevelService {
42 44 @Resource
43 45 private MemberLevelMapper levelMapper;
44 46 @Resource
45   - private MemberLevelLogService memberLevelLogService;
  47 + private MemberLevelRecordService memberLevelRecordService;
46 48 @Resource
47   - private MemberExperienceLogService memberExperienceLogService;
  49 + private MemberExperienceRecordService memberExperienceRecordService;
48 50 @Resource
49 51 private MemberUserMapper memberUserMapper;
  52 + @Resource
  53 + private MemberUserService memberUserService;
50 54  
51 55 @Override
52 56 public Long createLevel(MemberLevelCreateReqVO createReqVO) {
... ... @@ -168,8 +172,8 @@ public class MemberLevelServiceImpl implements MemberLevelService {
168 172 }
169 173  
170 174 @Override
171   - public PageResult<MemberLevelDO> getLevelPage(MemberLevelPageReqVO pageReqVO) {
172   - return levelMapper.selectPage(pageReqVO);
  175 + public List<MemberLevelDO> getLevelList(MemberLevelListReqVO listReqVO) {
  176 + return levelMapper.selectList(listReqVO);
173 177 }
174 178  
175 179 @Override
... ... @@ -179,83 +183,83 @@ public class MemberLevelServiceImpl implements MemberLevelService {
179 183  
180 184 @Override
181 185 @Transactional(rollbackFor = Exception.class)
182   - public void updateUserLevel(MemberUserDO user, Long levelId, String reason) {
183   - // TODO @疯狂:可以直接 ObjUtil.equal(user.getLevelId(), levelId),解决这 2 个场景
184   - // 未调整的情况1
185   - if (user.getLevelId() == null && levelId == null) {
186   - return;
  186 + public void updateUserLevel(MemberUserUpdateLevelReqVO updateReqVO) {
  187 + MemberUserDO user = memberUserMapper.selectById(updateReqVO.getId());
  188 + if (user == null) {
  189 + throw exception(USER_NOT_EXISTS);
187 190 }
188   - // 未调整的情况2
189   - if (ObjUtil.equal(user.getLevelId(), levelId)) {
  191 + // 等级未发生变化
  192 + if (ObjUtil.equal(user.getLevelId(), updateReqVO.getLevelId())) {
190 193 return;
191 194 }
192 195  
193   - // 需要后台用户填写为什么调整会员的等级
194   - // TODO @疯狂:这个 reason 是不是可以放到 validator 里做哈;
195   - if (StrUtil.isBlank(reason)) {
196   - throw exception(LEVEL_REASON_NOT_EXISTS);
197   - }
198   -
199   - int experience;
200   - int totalExperience = 0;
201   - // 记录等级变动
202   - if (levelId == null) {
203   - experience = -user.getExperience();
204   -
205   - // TODO @疯狂:这里的逻辑,应该和下面的 207 到 210 行的逻辑一致,都是先记录日志,再更新会员表;所以,是不是都可以类似 214 的写法哈。
206   - // 取消了会员的等级
207   - memberLevelLogService.createCancelLog(user.getId(), reason);
208   - memberUserMapper.cancelUserLevel(user.getId());
  196 + MemberLevelRecordDO levelRecord = new MemberLevelRecordDO()
  197 + .setUserId(user.getId())
  198 + .setRemark(updateReqVO.getReason());
  199 + MemberLevelDO memberLevel = null;
  200 + if (updateReqVO.getLevelId() == null) {
  201 + // 取消用户等级时,为扣减经验
  202 + levelRecord.setExperience(-user.getExperience());
  203 + levelRecord.setDescription("管理员取消了等级");
209 204 } else {
210   - MemberLevelDO level = validateLevelExists(levelId);
  205 + memberLevel = validateLevelExists(updateReqVO.getLevelId());
  206 + // 复制等级配置
  207 + MemberLevelRecordConvert.INSTANCE.copyTo(memberLevel, levelRecord);
211 208 // 变动经验值 = 等级的升级经验 - 会员当前的经验;正数为增加经验,负数为扣减经验
212   - experience = level.getExperience() - user.getExperience();
  209 + levelRecord.setExperience(memberLevel.getExperience() - user.getExperience());
213 210 // 会员当前的经验 = 等级的升级经验
214   - totalExperience = level.getExperience();
215   -
216   - memberLevelLogService.createAdjustLog(user, level, experience, reason);
217   -
218   - // 更新会员表上的等级编号、经验值
219   - updateUserLevelIdAndExperience(user.getId(), levelId, totalExperience);
  211 + levelRecord.setUserExperience(memberLevel.getExperience());
  212 + levelRecord.setDescription("管理员调整为:" + memberLevel.getName());
220 213 }
221 214  
  215 + // 记录等级变动
  216 + memberLevelRecordService.createLevelRecord(levelRecord);
  217 +
222 218 // 记录会员经验变动
223   - memberExperienceLogService.createAdjustLog(user.getId(), experience, totalExperience);
  219 + memberExperienceRecordService.createExperienceRecord(user.getId(),
  220 + levelRecord.getExperience(), levelRecord.getUserExperience(),
  221 + MemberExperienceBizTypeEnum.ADMIN, MemberExperienceBizTypeEnum.ADMIN.getValue() + "");
  222 +
  223 + // 更新会员表上的等级编号、经验值
  224 + memberUserService.updateLevelIdAndExperience(user.getId(), updateReqVO.getLevelId(), levelRecord.getUserExperience());
  225 +
  226 + // 给会员发送等级变动消息
  227 + notifyMemberLevelChange(user.getId(), memberLevel);
224 228 }
225 229  
226   - // TODO @疯狂:方法名,建议改成 increase 或者 add 经验,和项目更统一一些
227   - // TODO @疯狂:bizType 改成具体数值,主要是枚举在 api 不好传递,rpc 情况下
228 230 @Override
229 231 @Transactional(rollbackFor = Exception.class)
230   - public void plusExperience(Long userId, Integer experience, MemberExperienceBizTypeEnum bizType, String bizId) {
  232 + public void addExperience(Long userId, Integer experience, MemberExperienceBizTypeEnum bizType, String bizId) {
231 233 if (experience == 0) {
232 234 return;
233 235 }
234 236  
235 237 MemberUserDO user = memberUserMapper.selectById(userId);
236   - // TODO @疯狂:默认给 Experience 搞个 0 哈。这里就不做兜底逻辑啦
237   - if (user.getExperience() == null) {
238   - user.setExperience(0);
239   - }
240 238  
241   - // 防止扣出负数
242   - // TODO @疯狂:如果经验出现负数,是不是抛出异常会更合理;按道理不应该出现的;
243 239 int userExperience = NumberUtil.max(user.getExperience() + experience, 0);
  240 + MemberLevelRecordDO levelRecord = new MemberLevelRecordDO()
  241 + .setUserId(user.getId())
  242 + .setExperience(experience)
  243 + // 防止扣出负数
  244 + .setUserExperience(userExperience);
  245 +
244 246 // 创建经验记录
245   - memberExperienceLogService.createBizLog(userId, experience, userExperience, bizType, bizId);
  247 + memberExperienceRecordService.createExperienceRecord(userId, experience, userExperience,
  248 + bizType, bizId);
246 249  
247 250 // 计算会员等级
248   - Long levelId = calcLevel(user, userExperience);
249   - // 更新会员表上的等级编号、经验值
250   - updateUserLevelIdAndExperience(user.getId(), levelId, userExperience);
251   - }
  251 + MemberLevelDO newLevel = calculateNewLevel(user, userExperience);
  252 + if (newLevel != null) {
  253 + // 复制等级配置
  254 + MemberLevelRecordConvert.INSTANCE.copyTo(newLevel, levelRecord);
  255 + // 保存等级变更记录
  256 + memberLevelRecordService.createLevelRecord(levelRecord);
  257 + // 给会员发送等级变动消息
  258 + notifyMemberLevelChange(userId, newLevel);
  259 + }
252 260  
253   - // TODO @疯狂:让 memberUserService 那开个方法;每个模块,不直接操作对方的 mapper;
254   - private void updateUserLevelIdAndExperience(Long userId, Long levelId, Integer experience) {
255   - memberUserMapper.updateById(new MemberUserDO()
256   - .setId(userId)
257   - .setLevelId(levelId).setExperience(experience)
258   - );
  261 + // 更新会员表上的等级编号、经验值
  262 + memberUserService.updateLevelIdAndExperience(user.getId(), levelRecord.getLevelId(), userExperience);
259 263 }
260 264  
261 265 /**
... ... @@ -263,11 +267,9 @@ public class MemberLevelServiceImpl implements MemberLevelService {
263 267 *
264 268 * @param user 会员
265 269 * @param userExperience 会员当前的经验值
266   - * @return 会员等级编号,null表示无变化
  270 + * @return 会员新的等级,null表示无变化
267 271 */
268   - // calc
269   - // TODO @疯狂:calc 改成完整的拼写哈。是不是改成 calculateNewLevel
270   - private Long calcLevel(MemberUserDO user, int userExperience) {
  272 + private MemberLevelDO calculateNewLevel(MemberUserDO user, int userExperience) {
271 273 List<MemberLevelDO> list = getEnableLevelList();
272 274 if (CollUtil.isEmpty(list)) {
273 275 log.warn("计算会员等级失败:会员等级配置不存在");
... ... @@ -288,9 +290,10 @@ public class MemberLevelServiceImpl implements MemberLevelService {
288 290 return null;
289 291 }
290 292  
291   - // TODO @疯狂:这个方法,应该只做 level 的计算,不做登记的变更。
292   - // 保存等级变更记录
293   - memberLevelLogService.createAutoUpgradeLog(user, matchLevel);
294   - return matchLevel.getId();
  293 + return matchLevel;
  294 + }
  295 +
  296 + private void notifyMemberLevelChange(Long userId, MemberLevelDO level) {
  297 + //todo: 给会员发消息
295 298 }
296 299 }
... ...
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/user/MemberUserService.java
... ... @@ -126,4 +126,12 @@ public interface MemberUserService {
126 126 */
127 127 PageResult<MemberUserDO> getUserPage(MemberUserPageReqVO pageReqVO);
128 128  
  129 + /**
  130 + * 更新用户的等级和经验
  131 + *
  132 + * @param id 用户编号
  133 + * @param levelId 用户等级
  134 + * @param experience 用户经验
  135 + */
  136 + void updateLevelIdAndExperience(Long id, Long levelId, Integer experience);
129 137 }
... ...
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/user/MemberUserServiceImpl.java
... ... @@ -15,7 +15,6 @@ import cn.iocoder.yudao.module.member.convert.auth.AuthConvert;
15 15 import cn.iocoder.yudao.module.member.convert.user.MemberUserConvert;
16 16 import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO;
17 17 import cn.iocoder.yudao.module.member.dal.mysql.user.MemberUserMapper;
18   -import cn.iocoder.yudao.module.member.service.level.MemberLevelService;
19 18 import cn.iocoder.yudao.module.system.api.sms.SmsCodeApi;
20 19 import cn.iocoder.yudao.module.system.api.sms.dto.code.SmsCodeUseReqDTO;
21 20 import cn.iocoder.yudao.module.system.enums.sms.SmsSceneEnum;
... ... @@ -56,9 +55,6 @@ public class MemberUserServiceImpl implements MemberUserService {
56 55 @Resource
57 56 private PasswordEncoder passwordEncoder;
58 57  
59   - @Resource
60   - private MemberLevelService memberLevelService;
61   -
62 58 @Override
63 59 public MemberUserDO getUserByMobile(String mobile) {
64 60 return memberUserMapper.selectByMobile(mobile);
... ... @@ -195,10 +191,6 @@ public class MemberUserServiceImpl implements MemberUserService {
195 191 // 更新
196 192 MemberUserDO updateObj = MemberUserConvert.INSTANCE.convert(updateReqVO);
197 193 memberUserMapper.updateById(updateObj);
198   -
199   - // 会员级别修改
200   - // TODO @疯狂:修改用户等级,要不要单独一个前端操作 + 接口;因为它是个相对严肃独立的动作
201   - memberLevelService.updateUserLevel(user, updateReqVO.getLevelId(), updateReqVO.getLevelReason());
202 194 }
203 195  
204 196 @VisibleForTesting
... ... @@ -236,4 +228,16 @@ public class MemberUserServiceImpl implements MemberUserService {
236 228 return memberUserMapper.selectPage(pageReqVO);
237 229 }
238 230  
  231 + @Override
  232 + public void updateLevelIdAndExperience(Long id, Long levelId, Integer experience) {
  233 + if (levelId == null) {
  234 + // 0 代表无等级:防止UpdateById时,会被过滤掉的问题
  235 + levelId = 0L;
  236 + }
  237 + memberUserMapper.updateById(new MemberUserDO()
  238 + .setId(id)
  239 + .setLevelId(levelId).setExperience(experience)
  240 + );
  241 + }
  242 +
239 243 }
... ...
yudao-module-member/yudao-module-member-biz/src/test/java/cn/iocoder/yudao/module/member/service/level/MemberLevelServiceImplTest.java
... ... @@ -5,7 +5,7 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult;
5 5 import cn.iocoder.yudao.framework.common.util.collection.ArrayUtils;
6 6 import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest;
7 7 import cn.iocoder.yudao.module.member.controller.admin.level.vo.level.MemberLevelCreateReqVO;
8   -import cn.iocoder.yudao.module.member.controller.admin.level.vo.level.MemberLevelPageReqVO;
  8 +import cn.iocoder.yudao.module.member.controller.admin.level.vo.level.MemberLevelListReqVO;
9 9 import cn.iocoder.yudao.module.member.controller.admin.level.vo.level.MemberLevelUpdateReqVO;
10 10 import cn.iocoder.yudao.module.member.dal.dataobject.level.MemberLevelDO;
11 11 import cn.iocoder.yudao.module.member.dal.mysql.level.MemberLevelMapper;
... ... @@ -41,9 +41,9 @@ public class MemberLevelServiceImplTest extends BaseDbUnitTest {
41 41 private MemberLevelMapper levelMapper;
42 42  
43 43 @MockBean
44   - private MemberLevelLogService memberLevelLogService;
  44 + private MemberLevelRecordService memberLevelRecordService;
45 45 @MockBean
46   - private MemberExperienceLogService memberExperienceLogService;
  46 + private MemberExperienceRecordService memberExperienceRecordService;
47 47  
48 48 @Test
49 49 public void testCreateLevel_success() {
... ... @@ -121,7 +121,7 @@ public class MemberLevelServiceImplTest extends BaseDbUnitTest {
121 121 }
122 122  
123 123 @Test
124   - public void testGetLevelPage() {
  124 + public void testGetLevelList() {
125 125 // mock 数据
126 126 MemberLevelDO dbLevel = randomPojo(MemberLevelDO.class, o -> { // 等会查询到
127 127 o.setName("黄金会员");
... ... @@ -133,16 +133,15 @@ public class MemberLevelServiceImplTest extends BaseDbUnitTest {
133 133 // 测试 status 不匹配
134 134 levelMapper.insert(cloneIgnoreId(dbLevel, o -> o.setStatus(0)));
135 135 // 准备参数
136   - MemberLevelPageReqVO reqVO = new MemberLevelPageReqVO();
  136 + MemberLevelListReqVO reqVO = new MemberLevelListReqVO();
137 137 reqVO.setName("黄金会员");
138 138 reqVO.setStatus(1);
139 139  
140 140 // 调用
141   - PageResult<MemberLevelDO> pageResult = levelService.getLevelPage(reqVO);
  141 + List<MemberLevelDO> list = levelService.getLevelList(reqVO);
142 142 // 断言
143   - assertEquals(1, pageResult.getTotal());
144   - assertEquals(1, pageResult.getList().size());
145   - assertPojoEquals(dbLevel, pageResult.getList().get(0));
  143 + assertEquals(1, list.size());
  144 + assertPojoEquals(dbLevel, list.get(0));
146 145 }
147 146  
148 147 @Test
... ...