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