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,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<MemberUserDO> { | @@ -50,14 +50,13 @@ public interface MemberUserMapper extends BaseMapperX<MemberUserDO> { | ||
| 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 |