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 insert system_dict_type(name, type) values ('会员经验业务类型', 'member_experience_biz_type'); 70 insert system_dict_type(name, type) values ('会员经验业务类型', 'member_experience_biz_type');
3 insert system_dict_data(dict_type, label, value, sort) values ('member_experience_biz_type', '管理员调整', '0', 0); 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,3 +74,25 @@ insert system_dict_data(dict_type, label, value, sort) values ('member_experienc
6 insert system_dict_data(dict_type, label, value, sort) values ('member_experience_biz_type', '退单扣除', '3', 3); 74 insert system_dict_data(dict_type, label, value, sort) values ('member_experience_biz_type', '退单扣除', '3', 3);
7 insert system_dict_data(dict_type, label, value, sort) values ('member_experience_biz_type', '签到奖励', '4', 4); 75 insert system_dict_data(dict_type, label, value, sort) values ('member_experience_biz_type', '签到奖励', '4', 4);
8 insert system_dict_data(dict_type, label, value, sort) values ('member_experience_biz_type', '抽奖奖励', '5', 5); 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 \ No newline at end of file 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,8 +14,8 @@ public interface MemberLevelApi {
14 * 14 *
15 * @param userId 会员ID 15 * @param userId 会员ID
16 * @param experience 经验 16 * @param experience 经验
17 - * @param bizType 业务类型 17 + * @param bizType 业务类型 {@link MemberExperienceBizTypeEnum}
18 * @param bizId 业务编号 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,7 +50,7 @@ public interface ErrorCodeConstants {
50 50
51 ErrorCode LEVEL_LOG_NOT_EXISTS = new ErrorCode(1004011100, "用户等级记录不存在"); 51 ErrorCode LEVEL_LOG_NOT_EXISTS = new ErrorCode(1004011100, "用户等级记录不存在");
52 ErrorCode EXPERIENCE_LOG_NOT_EXISTS = new ErrorCode(1004011200, "用户经验记录不存在"); 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 //========== 用户分组 1004012000 ========== 55 //========== 用户分组 1004012000 ==========
56 ErrorCode GROUP_NOT_EXISTS = new ErrorCode(1004012000, "用户分组不存在"); 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 package cn.iocoder.yudao.module.member.api.level; 1 package cn.iocoder.yudao.module.member.api.level;
2 2
  3 +import cn.hutool.core.util.EnumUtil;
3 import cn.iocoder.yudao.module.member.enums.MemberExperienceBizTypeEnum; 4 import cn.iocoder.yudao.module.member.enums.MemberExperienceBizTypeEnum;
4 import cn.iocoder.yudao.module.member.service.level.MemberLevelService; 5 import cn.iocoder.yudao.module.member.service.level.MemberLevelService;
5 import org.springframework.stereotype.Service; 6 import org.springframework.stereotype.Service;
6 import org.springframework.validation.annotation.Validated; 7 import org.springframework.validation.annotation.Validated;
7 8
8 import javax.annotation.Resource; 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 * 会员等级 API 实现类 16 * 会员等级 API 实现类
@@ -19,7 +24,12 @@ public class MemberLevelApiImpl implements MemberLevelApi { @@ -19,7 +24,12 @@ public class MemberLevelApiImpl implements MemberLevelApi {
19 @Resource 24 @Resource
20 private MemberLevelService memberLevelService; 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,11 +2,11 @@ package cn.iocoder.yudao.module.member.controller.admin.level;
2 2
3 import cn.iocoder.yudao.framework.common.pojo.CommonResult; 3 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
4 import cn.iocoder.yudao.framework.common.pojo.PageResult; 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 import io.swagger.v3.oas.annotations.Operation; 10 import io.swagger.v3.oas.annotations.Operation;
11 import io.swagger.v3.oas.annotations.Parameter; 11 import io.swagger.v3.oas.annotations.Parameter;
12 import io.swagger.v3.oas.annotations.tags.Tag; 12 import io.swagger.v3.oas.annotations.tags.Tag;
@@ -22,31 +22,30 @@ import javax.validation.Valid; @@ -22,31 +22,30 @@ import javax.validation.Valid;
22 22
23 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; 23 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
24 24
25 -// TODO @疯狂:要不 Log 改成 Record,和 PointRecord 保持一致  
26 @Tag(name = "管理后台 - 会员经验记录") 25 @Tag(name = "管理后台 - 会员经验记录")
27 @RestController 26 @RestController
28 -@RequestMapping("/member/experience-log") 27 +@RequestMapping("/member/experience-record")
29 @Validated 28 @Validated
30 -public class MemberExperienceLogController { 29 +public class MemberExperienceRecordController {
31 30
32 @Resource 31 @Resource
33 - private MemberExperienceLogService experienceLogService; 32 + private MemberExperienceRecordService experienceLogService;
34 33
35 @GetMapping("/get") 34 @GetMapping("/get")
36 @Operation(summary = "获得会员经验记录") 35 @Operation(summary = "获得会员经验记录")
37 @Parameter(name = "id", description = "编号", required = true, example = "1024") 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 @GetMapping("/page") 43 @GetMapping("/page")
45 @Operation(summary = "获得会员经验记录分页") 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 package cn.iocoder.yudao.module.member.controller.admin.level; 1 package cn.iocoder.yudao.module.member.controller.admin.level;
2 2
3 import cn.iocoder.yudao.framework.common.pojo.CommonResult; 3 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
4 -import cn.iocoder.yudao.framework.common.pojo.PageResult;  
5 import cn.iocoder.yudao.module.member.controller.admin.level.vo.level.*; 4 import cn.iocoder.yudao.module.member.controller.admin.level.vo.level.*;
6 import cn.iocoder.yudao.module.member.convert.level.MemberLevelConvert; 5 import cn.iocoder.yudao.module.member.convert.level.MemberLevelConvert;
7 import cn.iocoder.yudao.module.member.dal.dataobject.level.MemberLevelDO; 6 import cn.iocoder.yudao.module.member.dal.dataobject.level.MemberLevelDO;
@@ -70,13 +69,12 @@ public class MemberLevelController { @@ -70,13 +69,12 @@ public class MemberLevelController {
70 return success(MemberLevelConvert.INSTANCE.convertSimpleList(list)); 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 @PreAuthorize("@ss.hasPermission('member:level:query')") 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,11 +2,11 @@ package cn.iocoder.yudao.module.member.controller.admin.level;
2 2
3 import cn.iocoder.yudao.framework.common.pojo.CommonResult; 3 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
4 import cn.iocoder.yudao.framework.common.pojo.PageResult; 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 import io.swagger.v3.oas.annotations.Operation; 10 import io.swagger.v3.oas.annotations.Operation;
11 import io.swagger.v3.oas.annotations.Parameter; 11 import io.swagger.v3.oas.annotations.Parameter;
12 import io.swagger.v3.oas.annotations.tags.Tag; 12 import io.swagger.v3.oas.annotations.tags.Tag;
@@ -22,30 +22,29 @@ import javax.validation.Valid; @@ -22,30 +22,29 @@ import javax.validation.Valid;
22 22
23 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; 23 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
24 24
25 -// TODO @疯狂:是不是不用这个 controller;因为日志只是为了记录,db 可以查询、和审计即可,目前暂时不需要开放出来;  
26 @Tag(name = "管理后台 - 会员等级记录") 25 @Tag(name = "管理后台 - 会员等级记录")
27 @RestController 26 @RestController
28 -@RequestMapping("/member/level-log") 27 +@RequestMapping("/member/level-record")
29 @Validated 28 @Validated
30 -public class MemberLevelLogController { 29 +public class MemberLevelRecordController {
31 30
32 @Resource 31 @Resource
33 - private MemberLevelLogService levelLogService; 32 + private MemberLevelRecordService levelLogService;
34 33
35 @GetMapping("/get") 34 @GetMapping("/get")
36 @Operation(summary = "获得会员等级记录") 35 @Operation(summary = "获得会员等级记录")
37 @Parameter(name = "id", description = "编号", required = true, example = "1024") 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 @GetMapping("/page") 43 @GetMapping("/page")
45 @Operation(summary = "获得会员等级记录分页") 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,7 +10,7 @@ import javax.validation.constraints.NotNull;
10 * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 10 * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成
11 */ 11 */
12 @Data 12 @Data
13 -public class MemberExperienceLogBaseVO { 13 +public class MemberExperienceRecordBaseVO {
14 14
15 @Schema(description = "用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "3638") 15 @Schema(description = "用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "3638")
16 @NotNull(message = "用户编号不能为空") 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,7 +15,7 @@ import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_
15 @Data 15 @Data
16 @EqualsAndHashCode(callSuper = true) 16 @EqualsAndHashCode(callSuper = true)
17 @ToString(callSuper = true) 17 @ToString(callSuper = true)
18 -public class MemberExperienceLogPageReqVO extends PageParam { 18 +public class MemberExperienceRecordPageReqVO extends PageParam {
19 19
20 @Schema(description = "用户编号", example = "3638") 20 @Schema(description = "用户编号", example = "3638")
21 private Long userId; 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,7 +11,7 @@ import java.time.LocalDateTime;
11 @Data 11 @Data
12 @EqualsAndHashCode(callSuper = true) 12 @EqualsAndHashCode(callSuper = true)
13 @ToString(callSuper = true) 13 @ToString(callSuper = true)
14 -public class MemberExperienceLogRespVO extends MemberExperienceLogBaseVO { 14 +public class MemberExperienceRecordRespVO extends MemberExperienceRecordBaseVO {
15 15
16 @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "19610") 16 @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "19610")
17 private Long id; 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 package cn.iocoder.yudao.module.member.controller.admin.level.vo.level; 1 package cn.iocoder.yudao.module.member.controller.admin.level.vo.level;
2 2
3 -import cn.iocoder.yudao.framework.common.pojo.PageParam;  
4 import io.swagger.v3.oas.annotations.media.Schema; 3 import io.swagger.v3.oas.annotations.media.Schema;
5 import lombok.Data; 4 import lombok.Data;
6 -import lombok.EqualsAndHashCode;  
7 import lombok.ToString; 5 import lombok.ToString;
8 6
9 @Schema(description = "管理后台 - 会员等级分页 Request VO") 7 @Schema(description = "管理后台 - 会员等级分页 Request VO")
10 @Data 8 @Data
11 -@EqualsAndHashCode(callSuper = true)  
12 @ToString(callSuper = true) 9 @ToString(callSuper = true)
13 -public class MemberLevelPageReqVO extends PageParam { 10 +public class MemberLevelListReqVO {
14 11
15 @Schema(description = "等级名称", example = "芋艿") 12 @Schema(description = "等级名称", example = "芋艿")
16 private String name; 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,7 +10,7 @@ import javax.validation.constraints.NotNull;
10 * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 10 * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成
11 */ 11 */
12 @Data 12 @Data
13 -public class MemberLevelLogBaseVO { 13 +public class MemberLevelRecordBaseVO {
14 14
15 @Schema(description = "用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "25923") 15 @Schema(description = "用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "25923")
16 @NotNull(message = "用户编号不能为空") 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,7 +15,7 @@ import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_
15 @Data 15 @Data
16 @EqualsAndHashCode(callSuper = true) 16 @EqualsAndHashCode(callSuper = true)
17 @ToString(callSuper = true) 17 @ToString(callSuper = true)
18 -public class MemberLevelLogPageReqVO extends PageParam { 18 +public class MemberLevelRecordPageReqVO extends PageParam {
19 19
20 @Schema(description = "用户编号", example = "25923") 20 @Schema(description = "用户编号", example = "25923")
21 private Long userId; 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,7 +11,7 @@ import java.time.LocalDateTime;
11 @Data 11 @Data
12 @EqualsAndHashCode(callSuper = true) 12 @EqualsAndHashCode(callSuper = true)
13 @ToString(callSuper = true) 13 @ToString(callSuper = true)
14 -public class MemberLevelLogRespVO extends MemberLevelLogBaseVO { 14 +public class MemberLevelRecordRespVO extends MemberLevelRecordBaseVO {
15 15
16 @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "8741") 16 @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "8741")
17 private Long id; 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,6 +5,7 @@ import cn.iocoder.yudao.framework.common.pojo.CommonResult;
5 import cn.iocoder.yudao.framework.common.pojo.PageResult; 5 import cn.iocoder.yudao.framework.common.pojo.PageResult;
6 import cn.iocoder.yudao.module.member.controller.admin.user.vo.MemberUserPageReqVO; 6 import cn.iocoder.yudao.module.member.controller.admin.user.vo.MemberUserPageReqVO;
7 import cn.iocoder.yudao.module.member.controller.admin.user.vo.MemberUserRespVO; 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 import cn.iocoder.yudao.module.member.controller.admin.user.vo.MemberUserUpdateReqVO; 9 import cn.iocoder.yudao.module.member.controller.admin.user.vo.MemberUserUpdateReqVO;
9 import cn.iocoder.yudao.module.member.convert.user.MemberUserConvert; 10 import cn.iocoder.yudao.module.member.convert.user.MemberUserConvert;
10 import cn.iocoder.yudao.module.member.dal.dataobject.group.MemberGroupDO; 11 import cn.iocoder.yudao.module.member.dal.dataobject.group.MemberGroupDO;
@@ -52,6 +53,14 @@ public class MemberUserController { @@ -52,6 +53,14 @@ public class MemberUserController {
52 return success(true); 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 @GetMapping("/get") 64 @GetMapping("/get")
56 @Operation(summary = "获得会员用户") 65 @Operation(summary = "获得会员用户")
57 @Parameter(name = "id", description = "编号", required = true, example = "1024") 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,7 +17,4 @@ public class MemberUserUpdateReqVO extends MemberUserBaseVO {
17 @NotNull(message = "编号不能为空") 17 @NotNull(message = "编号不能为空")
18 private Long id; 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 package cn.iocoder.yudao.module.member.convert.level; 1 package cn.iocoder.yudao.module.member.convert.level;
2 2
3 import cn.iocoder.yudao.framework.common.pojo.PageResult; 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 import org.mapstruct.Mapper; 6 import org.mapstruct.Mapper;
7 import org.mapstruct.factory.Mappers; 7 import org.mapstruct.factory.Mappers;
8 8
@@ -14,14 +14,17 @@ import java.util.List; @@ -14,14 +14,17 @@ import java.util.List;
14 * @author owen 14 * @author owen
15 */ 15 */
16 @Mapper 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 package cn.iocoder.yudao.module.member.convert.level; 1 package cn.iocoder.yudao.module.member.convert.level;
2 2
3 -import cn.iocoder.yudao.framework.common.pojo.PageResult;  
4 import cn.iocoder.yudao.module.member.controller.admin.level.vo.level.MemberLevelCreateReqVO; 3 import cn.iocoder.yudao.module.member.controller.admin.level.vo.level.MemberLevelCreateReqVO;
5 import cn.iocoder.yudao.module.member.controller.admin.level.vo.level.MemberLevelRespVO; 4 import cn.iocoder.yudao.module.member.controller.admin.level.vo.level.MemberLevelRespVO;
6 import cn.iocoder.yudao.module.member.controller.admin.level.vo.level.MemberLevelSimpleRespVO; 5 import cn.iocoder.yudao.module.member.controller.admin.level.vo.level.MemberLevelSimpleRespVO;
@@ -29,7 +28,5 @@ public interface MemberLevelConvert { @@ -29,7 +28,5 @@ public interface MemberLevelConvert {
29 28
30 List<MemberLevelRespVO> convertList(List<MemberLevelDO> list); 29 List<MemberLevelRespVO> convertList(List<MemberLevelDO> list);
31 30
32 - PageResult<MemberLevelRespVO> convertPage(PageResult<MemberLevelDO> page);  
33 -  
34 List<MemberLevelSimpleRespVO> convertSimpleList(List<MemberLevelDO> list); 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,15 +13,15 @@ import lombok.*;
13 * 13 *
14 * @author owen 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 @Data 18 @Data
19 @EqualsAndHashCode(callSuper = true) 19 @EqualsAndHashCode(callSuper = true)
20 @ToString(callSuper = true) 20 @ToString(callSuper = true)
21 @Builder 21 @Builder
22 @NoArgsConstructor 22 @NoArgsConstructor
23 @AllArgsConstructor 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,15 +14,15 @@ import lombok.*;
14 * 14 *
15 * @author owen 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 @Data 19 @Data
20 @EqualsAndHashCode(callSuper = true) 20 @EqualsAndHashCode(callSuper = true)
21 @ToString(callSuper = true) 21 @ToString(callSuper = true)
22 @Builder 22 @Builder
23 @NoArgsConstructor 23 @NoArgsConstructor
24 @AllArgsConstructor 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,7 +59,6 @@ public class MemberLevelLogDO extends BaseDO {
59 * 会员此时的经验 59 * 会员此时的经验
60 */ 60 */
61 private Integer userExperience; 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 package cn.iocoder.yudao.module.member.dal.mysql.level; 1 package cn.iocoder.yudao.module.member.dal.mysql.level;
2 2
3 -import cn.iocoder.yudao.framework.common.pojo.PageResult;  
4 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; 3 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
5 import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; 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 import cn.iocoder.yudao.module.member.dal.dataobject.level.MemberLevelDO; 6 import cn.iocoder.yudao.module.member.dal.dataobject.level.MemberLevelDO;
8 import org.apache.ibatis.annotations.Mapper; 7 import org.apache.ibatis.annotations.Mapper;
9 8
@@ -17,8 +16,8 @@ import java.util.List; @@ -17,8 +16,8 @@ import java.util.List;
17 @Mapper 16 @Mapper
18 public interface MemberLevelMapper extends BaseMapperX<MemberLevelDO> { 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 .likeIfPresent(MemberLevelDO::getName, reqVO.getName()) 21 .likeIfPresent(MemberLevelDO::getName, reqVO.getName())
23 .eqIfPresent(MemberLevelDO::getStatus, reqVO.getStatus()) 22 .eqIfPresent(MemberLevelDO::getStatus, reqVO.getStatus())
24 .orderByAsc(MemberLevelDO::getLevel)); 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,8 +3,8 @@ package cn.iocoder.yudao.module.member.dal.mysql.level;
3 import cn.iocoder.yudao.framework.common.pojo.PageResult; 3 import cn.iocoder.yudao.framework.common.pojo.PageResult;
4 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; 4 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
5 import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; 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 import org.apache.ibatis.annotations.Mapper; 8 import org.apache.ibatis.annotations.Mapper;
9 9
10 /** 10 /**
@@ -13,14 +13,14 @@ import org.apache.ibatis.annotations.Mapper; @@ -13,14 +13,14 @@ import org.apache.ibatis.annotations.Mapper;
13 * @author owen 13 * @author owen
14 */ 14 */
15 @Mapper 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 +7,6 @@ import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
7 import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; 7 import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
8 import cn.iocoder.yudao.module.member.controller.admin.user.vo.MemberUserPageReqVO; 8 import cn.iocoder.yudao.module.member.controller.admin.user.vo.MemberUserPageReqVO;
9 import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO; 9 import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO;
10 -import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;  
11 import org.apache.ibatis.annotations.Mapper; 10 import org.apache.ibatis.annotations.Mapper;
12 11
13 import java.util.List; 12 import java.util.List;
@@ -50,20 +49,6 @@ public interface MemberUserMapper extends BaseMapperX&lt;MemberUserDO&gt; { @@ -50,20 +49,6 @@ public interface MemberUserMapper extends BaseMapperX&lt;MemberUserDO&gt; {
50 .orderByDesc(MemberUserDO::getId)); 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 default Long selectCountByGroupId(Long groupId) { 52 default Long selectCountByGroupId(Long groupId) {
68 return selectCount(MemberUserDO::getGroupId, groupId); 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 package cn.iocoder.yudao.module.member.service.level; 1 package cn.iocoder.yudao.module.member.service.level;
2 2
3 import cn.iocoder.yudao.framework.common.pojo.PageResult; 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 import cn.iocoder.yudao.module.member.enums.MemberExperienceBizTypeEnum; 6 import cn.iocoder.yudao.module.member.enums.MemberExperienceBizTypeEnum;
7 7
8 import java.util.Collection; 8 import java.util.Collection;
@@ -13,7 +13,7 @@ import java.util.List; @@ -13,7 +13,7 @@ import java.util.List;
13 * 13 *
14 * @author owen 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,7 +21,7 @@ public interface MemberExperienceLogService {
21 * @param id 编号 21 * @param id 编号
22 * @return 会员经验记录 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,7 +29,7 @@ public interface MemberExperienceLogService {
29 * @param ids 编号 29 * @param ids 编号
30 * @return 会员经验记录列表 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,18 +37,7 @@ public interface MemberExperienceLogService {
37 * @param pageReqVO 分页查询 37 * @param pageReqVO 分页查询
38 * @return 会员经验记录分页 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,5 +48,6 @@ public interface MemberExperienceLogService {
59 * @param bizType 业务类型 48 * @param bizType 业务类型
60 * @param bizId 业务ID 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,9 +2,10 @@ package cn.iocoder.yudao.module.member.service.level;
2 2
3 import cn.hutool.core.util.StrUtil; 3 import cn.hutool.core.util.StrUtil;
4 import cn.iocoder.yudao.framework.common.pojo.PageResult; 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 import cn.iocoder.yudao.module.member.enums.MemberExperienceBizTypeEnum; 9 import cn.iocoder.yudao.module.member.enums.MemberExperienceBizTypeEnum;
9 import org.springframework.stereotype.Service; 10 import org.springframework.stereotype.Service;
10 import org.springframework.validation.annotation.Validated; 11 import org.springframework.validation.annotation.Validated;
@@ -20,45 +21,36 @@ import java.util.List; @@ -20,45 +21,36 @@ import java.util.List;
20 */ 21 */
21 @Service 22 @Service
22 @Validated 23 @Validated
23 -public class MemberExperienceLogServiceImpl implements MemberExperienceLogService { 24 +public class MemberExperienceRecordServiceImpl implements MemberExperienceRecordService {
24 25
25 @Resource 26 @Resource
26 - private MemberExperienceLogMapper experienceLogMapper; 27 + private MemberExperienceRecordMapper experienceLogMapper;
27 28
28 29
29 @Override 30 @Override
30 - public MemberExperienceLogDO getExperienceLog(Long id) { 31 + public MemberExperienceRecordDO getExperienceRecord(Long id) {
31 return experienceLogMapper.selectById(id); 32 return experienceLogMapper.selectById(id);
32 } 33 }
33 34
34 @Override 35 @Override
35 - public List<MemberExperienceLogDO> getExperienceLogList(Collection<Long> ids) { 36 + public List<MemberExperienceRecordDO> getExperienceRecordList(Collection<Long> ids) {
36 return experienceLogMapper.selectBatchIds(ids); 37 return experienceLogMapper.selectBatchIds(ids);
37 } 38 }
38 39
39 @Override 40 @Override
40 - public PageResult<MemberExperienceLogDO> getExperienceLogPage(MemberExperienceLogPageReqVO pageReqVO) { 41 + public PageResult<MemberExperienceRecordDO> getExperienceRecordPage(MemberExperienceRecordPageReqVO pageReqVO) {
41 return experienceLogMapper.selectPage(pageReqVO); 42 return experienceLogMapper.selectPage(pageReqVO);
42 } 43 }
43 44
44 @Override 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 package cn.iocoder.yudao.module.member.service.level; 1 package cn.iocoder.yudao.module.member.service.level;
2 2
3 import cn.iocoder.yudao.framework.common.pojo.PageResult; 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 import java.util.Collection; 7 import java.util.Collection;
10 import java.util.List; 8 import java.util.List;
@@ -14,14 +12,7 @@ import java.util.List; @@ -14,14 +12,7 @@ import java.util.List;
14 * 12 *
15 * @author owen 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,7 +20,7 @@ public interface MemberLevelLogService {
29 * @param id 编号 20 * @param id 编号
30 * @return 会员等级记录 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,7 +28,7 @@ public interface MemberLevelLogService {
37 * @param ids 编号 28 * @param ids 编号
38 * @return 会员等级记录列表 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,33 +36,12 @@ public interface MemberLevelLogService {
45 * @param pageReqVO 分页查询 36 * @param pageReqVO 分页查询
46 * @return 会员等级记录分页 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 package cn.iocoder.yudao.module.member.service.level; 1 package cn.iocoder.yudao.module.member.service.level;
2 2
3 import cn.iocoder.yudao.framework.common.pojo.PageResult; 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 import org.springframework.stereotype.Service; 7 import org.springframework.stereotype.Service;
10 import org.springframework.validation.annotation.Validated; 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,18 +21,10 @@ import static cn.iocoder.yudao.module.member.enums.ErrorCodeConstants.LEVEL_LOG_
23 */ 21 */
24 @Service 22 @Service
25 @Validated 23 @Validated
26 -public class MemberLevelLogServiceImpl implements MemberLevelLogService { 24 +public class MemberLevelRecordServiceImpl implements MemberLevelRecordService {
27 25
28 @Resource 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 private void validateLevelLogExists(Long id) { 29 private void validateLevelLogExists(Long id) {
40 if (levelLogMapper.selectById(id) == null) { 30 if (levelLogMapper.selectById(id) == null) {
@@ -43,67 +33,23 @@ public class MemberLevelLogServiceImpl implements MemberLevelLogService { @@ -43,67 +33,23 @@ public class MemberLevelLogServiceImpl implements MemberLevelLogService {
43 } 33 }
44 34
45 @Override 35 @Override
46 - public MemberLevelLogDO getLevelLog(Long id) { 36 + public MemberLevelRecordDO getLevelRecord(Long id) {
47 return levelLogMapper.selectById(id); 37 return levelLogMapper.selectById(id);
48 } 38 }
49 39
50 @Override 40 @Override
51 - public List<MemberLevelLogDO> getLevelLogList(Collection<Long> ids) { 41 + public List<MemberLevelRecordDO> getLevelRecordList(Collection<Long> ids) {
52 return levelLogMapper.selectBatchIds(ids); 42 return levelLogMapper.selectBatchIds(ids);
53 } 43 }
54 44
55 @Override 45 @Override
56 - public PageResult<MemberLevelLogDO> getLevelLogPage(MemberLevelLogPageReqVO pageReqVO) { 46 + public PageResult<MemberLevelRecordDO> getLevelRecordPage(MemberLevelRecordPageReqVO pageReqVO) {
57 return levelLogMapper.selectPage(pageReqVO); 47 return levelLogMapper.selectPage(pageReqVO);
58 } 48 }
59 49
60 @Override 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 package cn.iocoder.yudao.module.member.service.level; 1 package cn.iocoder.yudao.module.member.service.level;
2 2
3 import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; 3 import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
4 -import cn.iocoder.yudao.framework.common.pojo.PageResult;  
5 import cn.iocoder.yudao.module.member.controller.admin.level.vo.level.MemberLevelCreateReqVO; 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 import cn.iocoder.yudao.module.member.controller.admin.level.vo.level.MemberLevelUpdateReqVO; 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 import cn.iocoder.yudao.module.member.dal.dataobject.level.MemberLevelDO; 8 import cn.iocoder.yudao.module.member.dal.dataobject.level.MemberLevelDO;
9 -import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO;  
10 import cn.iocoder.yudao.module.member.enums.MemberExperienceBizTypeEnum; 9 import cn.iocoder.yudao.module.member.enums.MemberExperienceBizTypeEnum;
11 10
12 -import javax.annotation.Nullable;  
13 import javax.validation.Valid; 11 import javax.validation.Valid;
14 import java.util.Collection; 12 import java.util.Collection;
15 import java.util.List; 13 import java.util.List;
@@ -60,12 +58,12 @@ public interface MemberLevelService { @@ -60,12 +58,12 @@ public interface MemberLevelService {
60 List<MemberLevelDO> getLevelList(Collection<Long> ids); 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,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,5 +99,5 @@ public interface MemberLevelService {
103 * @param bizType 业务类型 99 * @param bizType 业务类型
104 * @param bizId 业务编号 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,17 +4,19 @@ import cn.hutool.core.collection.CollUtil;
4 import cn.hutool.core.util.NumberUtil; 4 import cn.hutool.core.util.NumberUtil;
5 import cn.hutool.core.util.ObjUtil; 5 import cn.hutool.core.util.ObjUtil;
6 import cn.hutool.core.util.ObjectUtil; 6 import cn.hutool.core.util.ObjectUtil;
7 -import cn.hutool.core.util.StrUtil;  
8 -import cn.iocoder.yudao.framework.common.pojo.PageResult;  
9 import cn.iocoder.yudao.module.member.controller.admin.level.vo.level.MemberLevelCreateReqVO; 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 import cn.iocoder.yudao.module.member.controller.admin.level.vo.level.MemberLevelUpdateReqVO; 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 import cn.iocoder.yudao.module.member.convert.level.MemberLevelConvert; 11 import cn.iocoder.yudao.module.member.convert.level.MemberLevelConvert;
  12 +import cn.iocoder.yudao.module.member.convert.level.MemberLevelRecordConvert;
13 import cn.iocoder.yudao.module.member.dal.dataobject.level.MemberLevelDO; 13 import cn.iocoder.yudao.module.member.dal.dataobject.level.MemberLevelDO;
  14 +import cn.iocoder.yudao.module.member.dal.dataobject.level.MemberLevelRecordDO;
14 import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO; 15 import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO;
15 import cn.iocoder.yudao.module.member.dal.mysql.level.MemberLevelMapper; 16 import cn.iocoder.yudao.module.member.dal.mysql.level.MemberLevelMapper;
16 import cn.iocoder.yudao.module.member.dal.mysql.user.MemberUserMapper; 17 import cn.iocoder.yudao.module.member.dal.mysql.user.MemberUserMapper;
17 import cn.iocoder.yudao.module.member.enums.MemberExperienceBizTypeEnum; 18 import cn.iocoder.yudao.module.member.enums.MemberExperienceBizTypeEnum;
  19 +import cn.iocoder.yudao.module.member.service.user.MemberUserService;
18 import com.google.common.annotations.VisibleForTesting; 20 import com.google.common.annotations.VisibleForTesting;
19 import lombok.extern.slf4j.Slf4j; 21 import lombok.extern.slf4j.Slf4j;
20 import org.springframework.stereotype.Service; 22 import org.springframework.stereotype.Service;
@@ -42,11 +44,13 @@ public class MemberLevelServiceImpl implements MemberLevelService { @@ -42,11 +44,13 @@ public class MemberLevelServiceImpl implements MemberLevelService {
42 @Resource 44 @Resource
43 private MemberLevelMapper levelMapper; 45 private MemberLevelMapper levelMapper;
44 @Resource 46 @Resource
45 - private MemberLevelLogService memberLevelLogService; 47 + private MemberLevelRecordService memberLevelRecordService;
46 @Resource 48 @Resource
47 - private MemberExperienceLogService memberExperienceLogService; 49 + private MemberExperienceRecordService memberExperienceRecordService;
48 @Resource 50 @Resource
49 private MemberUserMapper memberUserMapper; 51 private MemberUserMapper memberUserMapper;
  52 + @Resource
  53 + private MemberUserService memberUserService;
50 54
51 @Override 55 @Override
52 public Long createLevel(MemberLevelCreateReqVO createReqVO) { 56 public Long createLevel(MemberLevelCreateReqVO createReqVO) {
@@ -168,8 +172,8 @@ public class MemberLevelServiceImpl implements MemberLevelService { @@ -168,8 +172,8 @@ public class MemberLevelServiceImpl implements MemberLevelService {
168 } 172 }
169 173
170 @Override 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 @Override 179 @Override
@@ -179,83 +183,83 @@ public class MemberLevelServiceImpl implements MemberLevelService { @@ -179,83 +183,83 @@ public class MemberLevelServiceImpl implements MemberLevelService {
179 183
180 @Override 184 @Override
181 @Transactional(rollbackFor = Exception.class) 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 return; 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 } else { 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 @Override 230 @Override
229 @Transactional(rollbackFor = Exception.class) 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 if (experience == 0) { 233 if (experience == 0) {
232 return; 234 return;
233 } 235 }
234 236
235 MemberUserDO user = memberUserMapper.selectById(userId); 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 int userExperience = NumberUtil.max(user.getExperience() + experience, 0); 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,11 +267,9 @@ public class MemberLevelServiceImpl implements MemberLevelService {
263 * 267 *
264 * @param user 会员 268 * @param user 会员
265 * @param userExperience 会员当前的经验值 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 List<MemberLevelDO> list = getEnableLevelList(); 273 List<MemberLevelDO> list = getEnableLevelList();
272 if (CollUtil.isEmpty(list)) { 274 if (CollUtil.isEmpty(list)) {
273 log.warn("计算会员等级失败:会员等级配置不存在"); 275 log.warn("计算会员等级失败:会员等级配置不存在");
@@ -288,9 +290,10 @@ public class MemberLevelServiceImpl implements MemberLevelService { @@ -288,9 +290,10 @@ public class MemberLevelServiceImpl implements MemberLevelService {
288 return null; 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,4 +126,12 @@ public interface MemberUserService {
126 */ 126 */
127 PageResult<MemberUserDO> getUserPage(MemberUserPageReqVO pageReqVO); 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,7 +15,6 @@ import cn.iocoder.yudao.module.member.convert.auth.AuthConvert;
15 import cn.iocoder.yudao.module.member.convert.user.MemberUserConvert; 15 import cn.iocoder.yudao.module.member.convert.user.MemberUserConvert;
16 import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO; 16 import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO;
17 import cn.iocoder.yudao.module.member.dal.mysql.user.MemberUserMapper; 17 import cn.iocoder.yudao.module.member.dal.mysql.user.MemberUserMapper;
18 -import cn.iocoder.yudao.module.member.service.level.MemberLevelService;  
19 import cn.iocoder.yudao.module.system.api.sms.SmsCodeApi; 18 import cn.iocoder.yudao.module.system.api.sms.SmsCodeApi;
20 import cn.iocoder.yudao.module.system.api.sms.dto.code.SmsCodeUseReqDTO; 19 import cn.iocoder.yudao.module.system.api.sms.dto.code.SmsCodeUseReqDTO;
21 import cn.iocoder.yudao.module.system.enums.sms.SmsSceneEnum; 20 import cn.iocoder.yudao.module.system.enums.sms.SmsSceneEnum;
@@ -56,9 +55,6 @@ public class MemberUserServiceImpl implements MemberUserService { @@ -56,9 +55,6 @@ public class MemberUserServiceImpl implements MemberUserService {
56 @Resource 55 @Resource
57 private PasswordEncoder passwordEncoder; 56 private PasswordEncoder passwordEncoder;
58 57
59 - @Resource  
60 - private MemberLevelService memberLevelService;  
61 -  
62 @Override 58 @Override
63 public MemberUserDO getUserByMobile(String mobile) { 59 public MemberUserDO getUserByMobile(String mobile) {
64 return memberUserMapper.selectByMobile(mobile); 60 return memberUserMapper.selectByMobile(mobile);
@@ -195,10 +191,6 @@ public class MemberUserServiceImpl implements MemberUserService { @@ -195,10 +191,6 @@ public class MemberUserServiceImpl implements MemberUserService {
195 // 更新 191 // 更新
196 MemberUserDO updateObj = MemberUserConvert.INSTANCE.convert(updateReqVO); 192 MemberUserDO updateObj = MemberUserConvert.INSTANCE.convert(updateReqVO);
197 memberUserMapper.updateById(updateObj); 193 memberUserMapper.updateById(updateObj);
198 -  
199 - // 会员级别修改  
200 - // TODO @疯狂:修改用户等级,要不要单独一个前端操作 + 接口;因为它是个相对严肃独立的动作  
201 - memberLevelService.updateUserLevel(user, updateReqVO.getLevelId(), updateReqVO.getLevelReason());  
202 } 194 }
203 195
204 @VisibleForTesting 196 @VisibleForTesting
@@ -236,4 +228,16 @@ public class MemberUserServiceImpl implements MemberUserService { @@ -236,4 +228,16 @@ public class MemberUserServiceImpl implements MemberUserService {
236 return memberUserMapper.selectPage(pageReqVO); 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,7 +5,7 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult;
5 import cn.iocoder.yudao.framework.common.util.collection.ArrayUtils; 5 import cn.iocoder.yudao.framework.common.util.collection.ArrayUtils;
6 import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest; 6 import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest;
7 import cn.iocoder.yudao.module.member.controller.admin.level.vo.level.MemberLevelCreateReqVO; 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 import cn.iocoder.yudao.module.member.controller.admin.level.vo.level.MemberLevelUpdateReqVO; 9 import cn.iocoder.yudao.module.member.controller.admin.level.vo.level.MemberLevelUpdateReqVO;
10 import cn.iocoder.yudao.module.member.dal.dataobject.level.MemberLevelDO; 10 import cn.iocoder.yudao.module.member.dal.dataobject.level.MemberLevelDO;
11 import cn.iocoder.yudao.module.member.dal.mysql.level.MemberLevelMapper; 11 import cn.iocoder.yudao.module.member.dal.mysql.level.MemberLevelMapper;
@@ -41,9 +41,9 @@ public class MemberLevelServiceImplTest extends BaseDbUnitTest { @@ -41,9 +41,9 @@ public class MemberLevelServiceImplTest extends BaseDbUnitTest {
41 private MemberLevelMapper levelMapper; 41 private MemberLevelMapper levelMapper;
42 42
43 @MockBean 43 @MockBean
44 - private MemberLevelLogService memberLevelLogService; 44 + private MemberLevelRecordService memberLevelRecordService;
45 @MockBean 45 @MockBean
46 - private MemberExperienceLogService memberExperienceLogService; 46 + private MemberExperienceRecordService memberExperienceRecordService;
47 47
48 @Test 48 @Test
49 public void testCreateLevel_success() { 49 public void testCreateLevel_success() {
@@ -121,7 +121,7 @@ public class MemberLevelServiceImplTest extends BaseDbUnitTest { @@ -121,7 +121,7 @@ public class MemberLevelServiceImplTest extends BaseDbUnitTest {
121 } 121 }
122 122
123 @Test 123 @Test
124 - public void testGetLevelPage() { 124 + public void testGetLevelList() {
125 // mock 数据 125 // mock 数据
126 MemberLevelDO dbLevel = randomPojo(MemberLevelDO.class, o -> { // 等会查询到 126 MemberLevelDO dbLevel = randomPojo(MemberLevelDO.class, o -> { // 等会查询到
127 o.setName("黄金会员"); 127 o.setName("黄金会员");
@@ -133,16 +133,15 @@ public class MemberLevelServiceImplTest extends BaseDbUnitTest { @@ -133,16 +133,15 @@ public class MemberLevelServiceImplTest extends BaseDbUnitTest {
133 // 测试 status 不匹配 133 // 测试 status 不匹配
134 levelMapper.insert(cloneIgnoreId(dbLevel, o -> o.setStatus(0))); 134 levelMapper.insert(cloneIgnoreId(dbLevel, o -> o.setStatus(0)));
135 // 准备参数 135 // 准备参数
136 - MemberLevelPageReqVO reqVO = new MemberLevelPageReqVO(); 136 + MemberLevelListReqVO reqVO = new MemberLevelListReqVO();
137 reqVO.setName("黄金会员"); 137 reqVO.setName("黄金会员");
138 reqVO.setStatus(1); 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 @Test 147 @Test