靓号校验处理

This commit is contained in:
tianfeng 2025-12-11 14:53:17 +08:00
parent efedad7ebc
commit fc60be306b
5 changed files with 132 additions and 29 deletions

View File

@ -0,0 +1,59 @@
package com.red.circle.other.inner.asserts.user;
import com.red.circle.framework.dto.IResponseErrorCode;
import com.red.circle.framework.dto.ResErrorCode;
/**
* 用户靓号相关错误码 范围 4200 4300.
*/
@ResErrorCode(describe = "用户靓号相关", minCode = 4200, maxCode = 4300)
public enum UserSpecialErrorCode implements IResponseErrorCode {
/**
* 财富等级不足10级.
*/
WEALTH_LEVEL_NOT_ENOUGH(4200, "You must reach wealth level 10 to apply for an exclusive ID."),
/**
* ID格式不正确.
*/
ID_FORMAT_INVALID(4201, "Please enter an ID in the correct format."),
/**
* 申请已提交待审核.
*/
APPLICATION_PENDING(4202, "Your application has been successfully submitted, please wait for review!"),
/**
* 当前财富等级已申请过ID.
*/
ALREADY_APPLIED_AT_LEVEL(4203, "You've already applied for an exclusive ID at the current wealth level."),
/**
* ID已被使用.
*/
ID_ALREADY_USED(4204, "ID has already been used by another user.");
private final Integer code;
private final String message;
UserSpecialErrorCode(Integer code, String message) {
this.code = code;
this.message = message;
}
@Override
public Integer getCode() {
return this.code;
}
@Override
public String getMessage() {
return message;
}
@Override
public String getErrorCodeName() {
return this.name();
}
}

View File

@ -1,17 +1,15 @@
package com.red.circle.other.app.command.user;
import com.red.circle.common.business.dto.cmd.AppExtCommand;
import com.red.circle.common.business.core.enums.SysOriginPlatformEnum;
import com.red.circle.framework.core.asserts.ResponseAssert;
import com.red.circle.framework.core.response.CommonErrorCode;
import com.red.circle.other.app.dto.cmd.user.user.UserSpecialIdApplyCmd;
import com.red.circle.other.infra.database.mongo.entity.user.profile.UserSpecialId;
import com.red.circle.other.domain.model.user.UserConsumptionLevel;
import com.red.circle.other.infra.database.mongo.service.user.profile.UserSpecialIdService;
import com.red.circle.other.infra.enums.user.user.SpecialIdPatternEnum;
import com.red.circle.tool.core.sequence.IdWorkerUtils;
import com.red.circle.other.domain.gateway.user.UserProfileGateway;
import com.red.circle.other.infra.database.rds.entity.user.user.UserBeautifulNumberApply;
import com.red.circle.other.infra.database.rds.service.user.user.UserBeautifulNumberApplyService;
import com.red.circle.other.inner.asserts.user.UserErrorCode;
import com.red.circle.other.inner.asserts.user.UserSpecialErrorCode;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component;
@ -29,42 +27,54 @@ public class UserBeautifulNumberApplyCmdExe {
private final UserSpecialIdService userSpecialIdService;
public void execute(UserSpecialIdApplyCmd cmd) {
String account = cmd.getAccount();
Long userId = cmd.getUserId();
// 验证账号是否符合当前等级的靓号规则
boolean isValidForLevel = SpecialIdPatternEnum.isValidForLevel(
cmd.getAccount(),
cmd.getWealthLevel()
UserConsumptionLevel consumptionLevel = userProfileGateway.getUserConsumptionLevel(SysOriginPlatformEnum.LIKEI, userId);
Integer wealthLevel = consumptionLevel.getWealthLevel();
// (1) 财富等级>=10级校验
ResponseAssert.isTrue(
UserSpecialErrorCode.WEALTH_LEVEL_NOT_ENOUGH,
wealthLevel != null && wealthLevel >= 10
);
ResponseAssert.isTrue(CommonErrorCode.SAVE_FAILURE,"The account does not meet the current wealth level rules", isValidForLevel);
// 检查靓号是否已存在
boolean exists = userSpecialIdService.exists(cmd.getReqSysOrigin().getOrigin(), cmd.getAccount());
ResponseAssert.isFalse(CommonErrorCode.SAVE_FAILURE, "The beautiful number already exists",exists);
// (2) ID格式校验8位数字或2位数字
ResponseAssert.isTrue(
UserSpecialErrorCode.ID_FORMAT_INVALID,
account != null && (account.matches("^\\d{8}$") || account.matches("^\\d{2}$"))
);
ResponseAssert.isFalse(CommonErrorCode.REPEATED_SUBMISSION, isExistPending(cmd));
// (3) 用户在当前财富等级已申请过ID待审核
Boolean hasPendingApply = userBeautifulNumberApplyService.hasPendingApplyAtLevel(userId, wealthLevel);
ResponseAssert.isFalse(
UserSpecialErrorCode.APPLICATION_PENDING,
Boolean.TRUE.equals(hasPendingApply)
);
// 检查用户是否已有靓号如果有则删除
UserSpecialId oldSpecialId = userSpecialIdService.getByUserId(cmd.getUserId());
if (oldSpecialId != null) {
userSpecialIdService.remove(oldSpecialId.getId());
}
// (4) 用户在当前财富等级已经申请过ID申请失败- 通过数据库判断
Boolean hasAppliedFailed = userBeautifulNumberApplyService.hasAppliedAtLevelWithFailure(userId, wealthLevel);
ResponseAssert.isFalse(
UserSpecialErrorCode.ALREADY_APPLIED_AT_LEVEL,
Boolean.TRUE.equals(hasAppliedFailed)
);
// (5) 检查靓号是否已被使用
boolean exists = userSpecialIdService.exists(cmd.getReqSysOrigin().getOrigin(), account);
ResponseAssert.isFalse(
UserSpecialErrorCode.ID_ALREADY_USED,
exists
);
// 保存申请记录
userBeautifulNumberApplyService.save(new UserBeautifulNumberApply()
.setId(IdWorkerUtils.getId())
.setApplyUser(cmd.requiredReqUserId())
.setApplyAccount(account)
.setWealthLevel(wealthLevel)
.setState(0)
.setSysOrigin(cmd.requireReqSysOrigin())
);
}
private Boolean isExistPending(AppExtCommand cmd) {
return userBeautifulNumberApplyService.isExistPending(cmd.requiredReqUserId());
}
private Integer getUserLevelExperience(AppExtCommand cmd) {
return userProfileGateway.getUserConsumptionLevel(cmd.requireReqSysOriginEnum(),
cmd.requiredReqUserId())
.getWealthLevel();
}
}

View File

@ -51,4 +51,16 @@ public class UserBeautifulNumberApply extends TimestampBaseEntity {
@TableField("state")
private Integer state;
/**
* 申请的账号.
*/
@TableField("apply_account")
private String applyAccount;
/**
* 申请时的财富等级.
*/
@TableField("wealth_level")
private Integer wealthLevel;
}

View File

@ -21,4 +21,8 @@ public interface UserBeautifulNumberApplyService extends BaseService<UserBeautif
PageResult<UserBeautifulNumberApply> page(UserBeautifulNumberApplyQryCmd query);
void handleApply(Long id, Integer state);
Boolean hasAppliedAtLevelWithFailure(Long userId, Integer wealthLevel);
Boolean hasPendingApplyAtLevel(Long userId, Integer wealthLevel);
}

View File

@ -66,4 +66,22 @@ public class UserBeautifulNumberApplyServiceImpl extends
private boolean checkState(Integer state) {
return Objects.equals(state, 1) || Objects.equals(state, 2);
}
@Override
public Boolean hasAppliedAtLevelWithFailure(Long userId, Integer wealthLevel) {
return Optional.ofNullable(query()
.eq(UserBeautifulNumberApply::getApplyUser, userId)
.eq(UserBeautifulNumberApply::getWealthLevel, wealthLevel)
.eq(UserBeautifulNumberApply::getState, 2)
.list()).map(CollectionUtil::isNotEmpty).orElse(Boolean.FALSE);
}
@Override
public Boolean hasPendingApplyAtLevel(Long userId, Integer wealthLevel) {
return Optional.ofNullable(query()
.eq(UserBeautifulNumberApply::getApplyUser, userId)
.eq(UserBeautifulNumberApply::getWealthLevel, wealthLevel)
.eq(UserBeautifulNumberApply::getState, 0)
.list()).map(CollectionUtil::isNotEmpty).orElse(Boolean.FALSE);
}
}