Commit bdb38c41572091f38469f26695cada8e7341e9cc

Authored by owen
1 parent 5a2d9d14

会员: 修改会员等级,使用单独的表单、接口

sql/mysql/member_level.sql
... ... @@ -92,3 +92,7 @@ INSERT INTO system_menu(name, permission, type, sort, parent_id, path, icon, com
92 92 VALUES ('会员等级更新', 'member:level:update', 3, 3, @parentId, '', '', '', 0);
93 93 INSERT INTO system_menu(name, permission, type, sort, parent_id, path, icon, component, status)
94 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);
95 99 \ No newline at end of file
... ...
yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/enums/ErrorCodeConstants.java
... ... @@ -50,7 +50,6 @@ 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, "用户等级调整原因不能为空");
54 53  
55 54 //========== 用户分组 1004012000 ==========
56 55 ErrorCode GROUP_NOT_EXISTS = new ErrorCode(1004012000, "用户分组不存在");
... ...
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/dal/mysql/user/MemberUserMapper.java
... ... @@ -50,14 +50,13 @@ public interface MemberUserMapper extends BaseMapperX&lt;MemberUserDO&gt; {
50 50 .orderByDesc(MemberUserDO::getId));
51 51 }
52 52  
53   - // TODO @疯狂:命名可以改成 updateUserLevelToNull;db 侧的操作,尽量无业务含义,更多是 select、update、insert 操作
54 53 /**
55 54 * 取消会员的等级
56 55 *
57 56 * @param userId 会员编号
58 57 * @return 受影响的行数
59 58 */
60   - default int cancelUserLevel(Long userId) {
  59 + default int updateUserLevelToNull(Long userId) {
61 60 return update(null, new LambdaUpdateWrapper<MemberUserDO>()
62 61 .eq(MemberUserDO::getId, userId)
63 62 .set(MemberUserDO::getExperience, 0)
... ...
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/level/MemberLevelService.java
... ... @@ -5,11 +5,10 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult;
5 5 import cn.iocoder.yudao.module.member.controller.admin.level.vo.level.MemberLevelCreateReqVO;
6 6 import cn.iocoder.yudao.module.member.controller.admin.level.vo.level.MemberLevelPageReqVO;
7 7 import cn.iocoder.yudao.module.member.controller.admin.level.vo.level.MemberLevelUpdateReqVO;
  8 +import cn.iocoder.yudao.module.member.controller.admin.user.vo.MemberUserUpdateLevelReqVO;
8 9 import cn.iocoder.yudao.module.member.dal.dataobject.level.MemberLevelDO;
9   -import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO;
10 10 import cn.iocoder.yudao.module.member.enums.MemberExperienceBizTypeEnum;
11 11  
12   -import javax.annotation.Nullable;
13 12 import javax.validation.Valid;
14 13 import java.util.Collection;
15 14 import java.util.List;
... ... @@ -89,11 +88,9 @@ public interface MemberLevelService {
89 88 /**
90 89 * 修改会员的等级
91 90 *
92   - * @param user 会员
93   - * @param levelId 要修改的等级编号,编号为空时,代表取消会员的等级
94   - * @param levelReason 修改原因
  91 + * @param updateReqVO 修改参数
95 92 */
96   - void updateUserLevel(MemberUserDO user, @Nullable Long levelId, String levelReason);
  93 + void updateUserLevel(MemberUserUpdateLevelReqVO updateReqVO);
97 94  
98 95 /**
99 96 * 增加会员经验
... ...
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/level/MemberLevelServiceImpl.java
... ... @@ -4,11 +4,11 @@ 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 7 import cn.iocoder.yudao.framework.common.pojo.PageResult;
9 8 import cn.iocoder.yudao.module.member.controller.admin.level.vo.level.MemberLevelCreateReqVO;
10 9 import cn.iocoder.yudao.module.member.controller.admin.level.vo.level.MemberLevelPageReqVO;
11 10 import cn.iocoder.yudao.module.member.controller.admin.level.vo.level.MemberLevelUpdateReqVO;
  11 +import cn.iocoder.yudao.module.member.controller.admin.user.vo.MemberUserUpdateLevelReqVO;
12 12 import cn.iocoder.yudao.module.member.convert.level.MemberLevelConvert;
13 13 import cn.iocoder.yudao.module.member.dal.dataobject.level.MemberLevelDO;
14 14 import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO;
... ... @@ -180,41 +180,42 @@ public class MemberLevelServiceImpl implements MemberLevelService {
180 180  
181 181 @Transactional(rollbackFor = Exception.class)
182 182 @Override
183   - public void updateUserLevel(MemberUserDO user, Long levelId, String reason) {
  183 + public void updateUserLevel(MemberUserUpdateLevelReqVO updateReqVO) {
  184 + MemberUserDO user = memberUserMapper.selectById(updateReqVO.getId());
  185 + if (user == null) {
  186 + throw exception(USER_NOT_EXISTS);
  187 + }
  188 +
184 189 // 未调整的情况1
185   - if (user.getLevelId() == null && levelId == null) {
  190 + if (user.getLevelId() == null && updateReqVO.getLevelId() == null) {
186 191 return;
187 192 }
188 193 // 未调整的情况2
189   - if (ObjUtil.equal(user.getLevelId(), levelId)) {
  194 + if (ObjUtil.equal(user.getLevelId(), updateReqVO.getLevelId())) {
190 195 return;
191 196 }
192 197  
193   - // 需要后台用户填写为什么调整会员的等级
194   - if (StrUtil.isBlank(reason)) {
195   - throw exception(LEVEL_REASON_NOT_EXISTS);
196   - }
197   -
198 198 int experience;
199 199 int totalExperience = 0;
200 200 // 记录等级变动
201   - if (levelId == null) {
  201 + if (updateReqVO.getLevelId() == null) {
  202 + // 取消用户等级时,为扣减经验
202 203 experience = -user.getExperience();
203 204  
204 205 // 取消了会员的等级
205   - memberLevelLogService.createCancelLog(user.getId(), reason);
206   - memberUserMapper.cancelUserLevel(user.getId());
  206 + memberLevelLogService.createCancelLog(user.getId(), updateReqVO.getReason());
  207 + memberUserMapper.updateUserLevelToNull(user.getId());
207 208 } else {
208   - MemberLevelDO level = validateLevelExists(levelId);
  209 + MemberLevelDO level = validateLevelExists(updateReqVO.getLevelId());
209 210 // 变动经验值 = 等级的升级经验 - 会员当前的经验;正数为增加经验,负数为扣减经验
210 211 experience = level.getExperience() - user.getExperience();
211 212 // 会员当前的经验 = 等级的升级经验
212 213 totalExperience = level.getExperience();
213 214  
214   - memberLevelLogService.createAdjustLog(user, level, experience, reason);
  215 + memberLevelLogService.createAdjustLog(user, level, experience, updateReqVO.getReason());
215 216  
216 217 // 更新会员表上的等级编号、经验值
217   - updateUserLevelIdAndExperience(user.getId(), levelId, totalExperience);
  218 + updateUserLevelIdAndExperience(user.getId(), updateReqVO.getLevelId(), totalExperience);
218 219 }
219 220  
220 221  
... ...
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
... ...