diff --git a/rc-service/rc-inner-api/other-inner/other-inner-model/src/main/java/com/red/circle/other/inner/asserts/user/UserSpecialErrorCode.java b/rc-service/rc-inner-api/other-inner/other-inner-model/src/main/java/com/red/circle/other/inner/asserts/user/UserSpecialErrorCode.java new file mode 100644 index 00000000..99e9e832 --- /dev/null +++ b/rc-service/rc-inner-api/other-inner/other-inner-model/src/main/java/com/red/circle/other/inner/asserts/user/UserSpecialErrorCode.java @@ -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(); + } +} diff --git a/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/command/user/UserBeautifulNumberApplyCmdExe.java b/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/command/user/UserBeautifulNumberApplyCmdExe.java index 30602267..db2712b9 100644 --- a/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/command/user/UserBeautifulNumberApplyCmdExe.java +++ b/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/command/user/UserBeautifulNumberApplyCmdExe.java @@ -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(); - } - } diff --git a/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/database/rds/entity/user/user/UserBeautifulNumberApply.java b/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/database/rds/entity/user/user/UserBeautifulNumberApply.java index 0ddc7f71..a89cd4a3 100644 --- a/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/database/rds/entity/user/user/UserBeautifulNumberApply.java +++ b/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/database/rds/entity/user/user/UserBeautifulNumberApply.java @@ -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; + } diff --git a/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/database/rds/service/user/user/UserBeautifulNumberApplyService.java b/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/database/rds/service/user/user/UserBeautifulNumberApplyService.java index 4b5b1851..66a61cb4 100644 --- a/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/database/rds/service/user/user/UserBeautifulNumberApplyService.java +++ b/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/database/rds/service/user/user/UserBeautifulNumberApplyService.java @@ -21,4 +21,8 @@ public interface UserBeautifulNumberApplyService extends BaseService page(UserBeautifulNumberApplyQryCmd query); void handleApply(Long id, Integer state); + + Boolean hasAppliedAtLevelWithFailure(Long userId, Integer wealthLevel); + + Boolean hasPendingApplyAtLevel(Long userId, Integer wealthLevel); } diff --git a/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/database/rds/service/user/user/impl/UserBeautifulNumberApplyServiceImpl.java b/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/database/rds/service/user/user/impl/UserBeautifulNumberApplyServiceImpl.java index 68ac3165..1a595057 100644 --- a/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/database/rds/service/user/user/impl/UserBeautifulNumberApplyServiceImpl.java +++ b/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/database/rds/service/user/user/impl/UserBeautifulNumberApplyServiceImpl.java @@ -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); + } }