Commit bdb38c41572091f38469f26695cada8e7341e9cc
1 parent
5a2d9d14
会员: 修改会员等级,使用单独的表单、接口
Showing
9 changed files
with
64 additions
and
35 deletions
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<MemberUserDO> { |
| 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 | ... | ... |