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

This commit is contained in:
owen 2023-08-22 11:23:09 +08:00
parent 5a2d9d14df
commit bdb38c4157
9 changed files with 64 additions and 35 deletions

View File

@ -92,3 +92,7 @@ INSERT INTO system_menu(name, permission, type, sort, parent_id, path, icon, com
VALUES ('会员等级更新', 'member:level:update', 3, 3, @parentId, '', '', '', 0); VALUES ('会员等级更新', 'member:level:update', 3, 3, @parentId, '', '', '', 0);
INSERT INTO system_menu(name, permission, type, sort, parent_id, path, icon, component, status) INSERT INTO system_menu(name, permission, type, sort, parent_id, path, icon, component, status)
VALUES ('会员等级删除', 'member:level:delete', 3, 4, @parentId, '', '', '', 0); VALUES ('会员等级删除', 'member:level:delete', 3, 4, @parentId, '', '', '', 0);
-- 会员用户管理 增加按钮权限
INSERT INTO system_menu(name, permission, type, sort, parent_id, path, icon, component, status)
VALUES ('用户等级修改', 'member:user:update-level', 3, 5, 2309, '', '', '', 0);

View File

@ -50,7 +50,6 @@ public interface ErrorCodeConstants {
ErrorCode LEVEL_LOG_NOT_EXISTS = new ErrorCode(1004011100, "用户等级记录不存在"); ErrorCode LEVEL_LOG_NOT_EXISTS = new ErrorCode(1004011100, "用户等级记录不存在");
ErrorCode EXPERIENCE_LOG_NOT_EXISTS = new ErrorCode(1004011200, "用户经验记录不存在"); ErrorCode EXPERIENCE_LOG_NOT_EXISTS = new ErrorCode(1004011200, "用户经验记录不存在");
ErrorCode LEVEL_REASON_NOT_EXISTS = new ErrorCode(1004011300, "用户等级调整原因不能为空");
//========== 用户分组 1004012000 ========== //========== 用户分组 1004012000 ==========
ErrorCode GROUP_NOT_EXISTS = new ErrorCode(1004012000, "用户分组不存在"); ErrorCode GROUP_NOT_EXISTS = new ErrorCode(1004012000, "用户分组不存在");

View File

@ -5,6 +5,7 @@ import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.member.controller.admin.user.vo.MemberUserPageReqVO; import cn.iocoder.yudao.module.member.controller.admin.user.vo.MemberUserPageReqVO;
import cn.iocoder.yudao.module.member.controller.admin.user.vo.MemberUserRespVO; import cn.iocoder.yudao.module.member.controller.admin.user.vo.MemberUserRespVO;
import cn.iocoder.yudao.module.member.controller.admin.user.vo.MemberUserUpdateLevelReqVO;
import cn.iocoder.yudao.module.member.controller.admin.user.vo.MemberUserUpdateReqVO; import cn.iocoder.yudao.module.member.controller.admin.user.vo.MemberUserUpdateReqVO;
import cn.iocoder.yudao.module.member.convert.user.MemberUserConvert; import cn.iocoder.yudao.module.member.convert.user.MemberUserConvert;
import cn.iocoder.yudao.module.member.dal.dataobject.group.MemberGroupDO; import cn.iocoder.yudao.module.member.dal.dataobject.group.MemberGroupDO;
@ -52,6 +53,14 @@ public class MemberUserController {
return success(true); return success(true);
} }
@PutMapping("/update-level")
@Operation(summary = "更新会员用户等级")
@PreAuthorize("@ss.hasPermission('member:user:update-level')")
public CommonResult<Boolean> updateUserLevel(@Valid @RequestBody MemberUserUpdateLevelReqVO updateReqVO) {
memberLevelService.updateUserLevel(updateReqVO);
return success(true);
}
@GetMapping("/get") @GetMapping("/get")
@Operation(summary = "获得会员用户") @Operation(summary = "获得会员用户")
@Parameter(name = "id", description = "编号", required = true, example = "1024") @Parameter(name = "id", description = "编号", required = true, example = "1024")

View File

@ -0,0 +1,31 @@
package cn.iocoder.yudao.module.member.controller.admin.user.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
@Schema(description = "管理后台 - 会员用户 修改等级 Request VO")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class MemberUserUpdateLevelReqVO extends MemberUserBaseVO {
@Schema(description = "用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "23788")
@NotNull(message = "用户编号不能为空")
private Long id;
/**
* 取消用户等级时值为空
*/
@Schema(description = "用户等级编号", example = "1")
private Long levelId;
@Schema(description = "修改原因", requiredMode = Schema.RequiredMode.REQUIRED, example = "推广需要")
@NotBlank(message = "修改原因不能为空")
private String reason;
}

View File

@ -17,7 +17,4 @@ public class MemberUserUpdateReqVO extends MemberUserBaseVO {
@NotNull(message = "编号不能为空") @NotNull(message = "编号不能为空")
private Long id; private Long id;
@Schema(description = "会员级别修改原因", requiredMode = Schema.RequiredMode.REQUIRED, example = "推广需要")
private String levelReason;
} }

View File

@ -50,14 +50,13 @@ public interface MemberUserMapper extends BaseMapperX<MemberUserDO> {
.orderByDesc(MemberUserDO::getId)); .orderByDesc(MemberUserDO::getId));
} }
// TODO @疯狂命名可以改成 updateUserLevelToNulldb 侧的操作尽量无业务含义更多是 selectupdateinsert 操作
/** /**
* 取消会员的等级 * 取消会员的等级
* *
* @param userId 会员编号 * @param userId 会员编号
* @return 受影响的行数 * @return 受影响的行数
*/ */
default int cancelUserLevel(Long userId) { default int updateUserLevelToNull(Long userId) {
return update(null, new LambdaUpdateWrapper<MemberUserDO>() return update(null, new LambdaUpdateWrapper<MemberUserDO>()
.eq(MemberUserDO::getId, userId) .eq(MemberUserDO::getId, userId)
.set(MemberUserDO::getExperience, 0) .set(MemberUserDO::getExperience, 0)

View File

@ -5,11 +5,10 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.member.controller.admin.level.vo.level.MemberLevelCreateReqVO; import cn.iocoder.yudao.module.member.controller.admin.level.vo.level.MemberLevelCreateReqVO;
import cn.iocoder.yudao.module.member.controller.admin.level.vo.level.MemberLevelPageReqVO; import cn.iocoder.yudao.module.member.controller.admin.level.vo.level.MemberLevelPageReqVO;
import cn.iocoder.yudao.module.member.controller.admin.level.vo.level.MemberLevelUpdateReqVO; import cn.iocoder.yudao.module.member.controller.admin.level.vo.level.MemberLevelUpdateReqVO;
import cn.iocoder.yudao.module.member.controller.admin.user.vo.MemberUserUpdateLevelReqVO;
import cn.iocoder.yudao.module.member.dal.dataobject.level.MemberLevelDO; import cn.iocoder.yudao.module.member.dal.dataobject.level.MemberLevelDO;
import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO;
import cn.iocoder.yudao.module.member.enums.MemberExperienceBizTypeEnum; import cn.iocoder.yudao.module.member.enums.MemberExperienceBizTypeEnum;
import javax.annotation.Nullable;
import javax.validation.Valid; import javax.validation.Valid;
import java.util.Collection; import java.util.Collection;
import java.util.List; import java.util.List;
@ -89,11 +88,9 @@ public interface MemberLevelService {
/** /**
* 修改会员的等级 * 修改会员的等级
* *
* @param user 会员 * @param updateReqVO 修改参数
* @param levelId 要修改的等级编号编号为空时代表取消会员的等级
* @param levelReason 修改原因
*/ */
void updateUserLevel(MemberUserDO user, @Nullable Long levelId, String levelReason); void updateUserLevel(MemberUserUpdateLevelReqVO updateReqVO);
/** /**
* 增加会员经验 * 增加会员经验

View File

@ -4,11 +4,11 @@ import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.NumberUtil; import cn.hutool.core.util.NumberUtil;
import cn.hutool.core.util.ObjUtil; import cn.hutool.core.util.ObjUtil;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.member.controller.admin.level.vo.level.MemberLevelCreateReqVO; import cn.iocoder.yudao.module.member.controller.admin.level.vo.level.MemberLevelCreateReqVO;
import cn.iocoder.yudao.module.member.controller.admin.level.vo.level.MemberLevelPageReqVO; import cn.iocoder.yudao.module.member.controller.admin.level.vo.level.MemberLevelPageReqVO;
import cn.iocoder.yudao.module.member.controller.admin.level.vo.level.MemberLevelUpdateReqVO; import cn.iocoder.yudao.module.member.controller.admin.level.vo.level.MemberLevelUpdateReqVO;
import cn.iocoder.yudao.module.member.controller.admin.user.vo.MemberUserUpdateLevelReqVO;
import cn.iocoder.yudao.module.member.convert.level.MemberLevelConvert; import cn.iocoder.yudao.module.member.convert.level.MemberLevelConvert;
import cn.iocoder.yudao.module.member.dal.dataobject.level.MemberLevelDO; import cn.iocoder.yudao.module.member.dal.dataobject.level.MemberLevelDO;
import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO; import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO;
@ -180,41 +180,42 @@ public class MemberLevelServiceImpl implements MemberLevelService {
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
@Override @Override
public void updateUserLevel(MemberUserDO user, Long levelId, String reason) { public void updateUserLevel(MemberUserUpdateLevelReqVO updateReqVO) {
MemberUserDO user = memberUserMapper.selectById(updateReqVO.getId());
if (user == null) {
throw exception(USER_NOT_EXISTS);
}
// 未调整的情况1 // 未调整的情况1
if (user.getLevelId() == null && levelId == null) { if (user.getLevelId() == null && updateReqVO.getLevelId() == null) {
return; return;
} }
// 未调整的情况2 // 未调整的情况2
if (ObjUtil.equal(user.getLevelId(), levelId)) { if (ObjUtil.equal(user.getLevelId(), updateReqVO.getLevelId())) {
return; return;
} }
// 需要后台用户填写为什么调整会员的等级
if (StrUtil.isBlank(reason)) {
throw exception(LEVEL_REASON_NOT_EXISTS);
}
int experience; int experience;
int totalExperience = 0; int totalExperience = 0;
// 记录等级变动 // 记录等级变动
if (levelId == null) { if (updateReqVO.getLevelId() == null) {
// 取消用户等级时为扣减经验
experience = -user.getExperience(); experience = -user.getExperience();
// 取消了会员的等级 // 取消了会员的等级
memberLevelLogService.createCancelLog(user.getId(), reason); memberLevelLogService.createCancelLog(user.getId(), updateReqVO.getReason());
memberUserMapper.cancelUserLevel(user.getId()); memberUserMapper.updateUserLevelToNull(user.getId());
} else { } else {
MemberLevelDO level = validateLevelExists(levelId); MemberLevelDO level = validateLevelExists(updateReqVO.getLevelId());
// 变动经验值 = 等级的升级经验 - 会员当前的经验正数为增加经验负数为扣减经验 // 变动经验值 = 等级的升级经验 - 会员当前的经验正数为增加经验负数为扣减经验
experience = level.getExperience() - user.getExperience(); experience = level.getExperience() - user.getExperience();
// 会员当前的经验 = 等级的升级经验 // 会员当前的经验 = 等级的升级经验
totalExperience = level.getExperience(); totalExperience = level.getExperience();
memberLevelLogService.createAdjustLog(user, level, experience, reason); memberLevelLogService.createAdjustLog(user, level, experience, updateReqVO.getReason());
// 更新会员表上的等级编号经验值 // 更新会员表上的等级编号经验值
updateUserLevelIdAndExperience(user.getId(), levelId, totalExperience); updateUserLevelIdAndExperience(user.getId(), updateReqVO.getLevelId(), totalExperience);
} }

View File

@ -15,7 +15,6 @@ import cn.iocoder.yudao.module.member.convert.auth.AuthConvert;
import cn.iocoder.yudao.module.member.convert.user.MemberUserConvert; import cn.iocoder.yudao.module.member.convert.user.MemberUserConvert;
import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO; import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO;
import cn.iocoder.yudao.module.member.dal.mysql.user.MemberUserMapper; import cn.iocoder.yudao.module.member.dal.mysql.user.MemberUserMapper;
import cn.iocoder.yudao.module.member.service.level.MemberLevelService;
import cn.iocoder.yudao.module.system.api.sms.SmsCodeApi; import cn.iocoder.yudao.module.system.api.sms.SmsCodeApi;
import cn.iocoder.yudao.module.system.api.sms.dto.code.SmsCodeUseReqDTO; import cn.iocoder.yudao.module.system.api.sms.dto.code.SmsCodeUseReqDTO;
import cn.iocoder.yudao.module.system.enums.sms.SmsSceneEnum; import cn.iocoder.yudao.module.system.enums.sms.SmsSceneEnum;
@ -56,9 +55,6 @@ public class MemberUserServiceImpl implements MemberUserService {
@Resource @Resource
private PasswordEncoder passwordEncoder; private PasswordEncoder passwordEncoder;
@Resource
private MemberLevelService memberLevelService;
@Override @Override
public MemberUserDO getUserByMobile(String mobile) { public MemberUserDO getUserByMobile(String mobile) {
return memberUserMapper.selectByMobile(mobile); return memberUserMapper.selectByMobile(mobile);
@ -195,10 +191,6 @@ public class MemberUserServiceImpl implements MemberUserService {
// 更新 // 更新
MemberUserDO updateObj = MemberUserConvert.INSTANCE.convert(updateReqVO); MemberUserDO updateObj = MemberUserConvert.INSTANCE.convert(updateReqVO);
memberUserMapper.updateById(updateObj); memberUserMapper.updateById(updateObj);
// 会员级别修改
// TODO @疯狂修改用户等级要不要单独一个前端操作 + 接口因为它是个相对严肃独立的动作
memberLevelService.updateUserLevel(user, updateReqVO.getLevelId(), updateReqVO.getLevelReason());
} }
@VisibleForTesting @VisibleForTesting