Compare commits

...

2 Commits

Author SHA1 Message Date
7c72e60a32 Merge remote-tracking branch 'origin/main' 2025-12-29 18:43:45 +08:00
0cab423604 fix(user-invite-codes): 修复字段名拼写错误并新增代理邀请码生成
修正 owenrSystemUserId → ownerSystemUserId 拼写错误;
新增 UserInviteCodeApi 及实现,为代理租户自动生成 6 位唯一邀请码。
2025-12-29 18:43:36 +08:00
8 changed files with 88 additions and 6 deletions

View File

@@ -0,0 +1,55 @@
package com.yolo.keyboard.api.invitecode;
import cn.hutool.core.util.RandomUtil;
import com.yolo.keyboard.dal.dataobject.userinvitecodes.KeyboardUserInviteCodesDO;
import com.yolo.keyboard.dal.mysql.userinvitecodes.KeyboardUserInviteCodesMapper;
import com.yolo.keyboard.module.system.api.invitecode.UserInviteCodeApi;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Service;
import java.time.LocalDateTime;
/**
* 用户邀请码 API 实现类
*
* @author ziin
*/
@Service
public class UserInviteCodeApiImpl implements UserInviteCodeApi {
@Resource
private KeyboardUserInviteCodesMapper userInviteCodesMapper;
@Override
public String createInviteCodeForAgent(Long userId, Long tenantId) {
String inviteCode = generateUniqueInviteCode();
KeyboardUserInviteCodesDO inviteCodeDO = KeyboardUserInviteCodesDO.builder()
.code(inviteCode)
.ownerSystemUserId(userId)
.ownerTenantId(tenantId)
.status((short) 1)
.createdAt(LocalDateTime.now())
.usedCount(0)
.inviteType("AGENT")
.build();
userInviteCodesMapper.insert(inviteCodeDO);
return inviteCode;
}
/**
* 生成唯一的6位邀请码字母和数字混合
*/
private String generateUniqueInviteCode() {
String code;
int maxAttempts = 100;
int attempt = 0;
do {
code = RandomUtil.randomString("ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789", 6);
attempt++;
if (attempt >= maxAttempts) {
throw new RuntimeException("无法生成唯一的邀请码,请稍后重试");
}
} while (userInviteCodesMapper.selectOne(KeyboardUserInviteCodesDO::getCode, code) != null);
return code;
}
}

View File

@@ -41,7 +41,7 @@ public class KeyboardUserInviteCodesPageReqVO extends PageParam {
private Long ownerTenantId; private Long ownerTenantId;
@Schema(description = "邀请码所属系统用户", example = "772") @Schema(description = "邀请码所属系统用户", example = "772")
private Long owenrSystemUserId; private Long ownerSystemUserId;
@Schema(description = "邀请码类型", example = "1") @Schema(description = "邀请码类型", example = "1")
private String inviteType; private String inviteType;

View File

@@ -54,7 +54,7 @@ public class KeyboardUserInviteCodesRespVO {
@Schema(description = "邀请码所属系统用户", example = "772") @Schema(description = "邀请码所属系统用户", example = "772")
@ExcelProperty("邀请码所属系统用户") @ExcelProperty("邀请码所属系统用户")
private Long owenrSystemUserId; private Long ownerSystemUserId;
@Schema(description = "邀请码类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") @Schema(description = "邀请码类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
@ExcelProperty("邀请码类型") @ExcelProperty("邀请码类型")

View File

@@ -47,7 +47,7 @@ public class KeyboardUserInviteCodesSaveReqVO {
private Long ownerTenantId; private Long ownerTenantId;
@Schema(description = "邀请码所属系统用户", example = "772") @Schema(description = "邀请码所属系统用户", example = "772")
private Long owenrSystemUserId; private Long ownerSystemUserId;
@Schema(description = "邀请码类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") @Schema(description = "邀请码类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
@NotEmpty(message = "邀请码类型不能为空") @NotEmpty(message = "邀请码类型不能为空")

View File

@@ -14,7 +14,7 @@ import com.yolo.keyboard.framework.mybatis.core.dataobject.BaseDO;
* @author ziin * @author ziin
*/ */
@TableName("keyboard_user_invite_codes") @TableName("keyboard_user_invite_codes")
@KeySequence("keyboard_user_invite_codes_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 @KeySequence("invite_codes_id_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
@Data @Data
@ToString(callSuper = true) @ToString(callSuper = true)
@Builder @Builder
@@ -67,7 +67,7 @@ public class KeyboardUserInviteCodesDO {
/** /**
* 邀请码所属系统用户 * 邀请码所属系统用户
*/ */
private Long owenrSystemUserId; private Long ownerSystemUserId;
/** /**
* 邀请码类型 * 邀请码类型
*/ */

View File

@@ -28,7 +28,7 @@ public interface KeyboardUserInviteCodesMapper extends BaseMapperX<KeyboardUserI
.eqIfPresent(KeyboardUserInviteCodesDO::getUsedCount, reqVO.getUsedCount()) .eqIfPresent(KeyboardUserInviteCodesDO::getUsedCount, reqVO.getUsedCount())
.eqIfPresent(KeyboardUserInviteCodesDO::getSystemUserId, reqVO.getSystemUserId()) .eqIfPresent(KeyboardUserInviteCodesDO::getSystemUserId, reqVO.getSystemUserId())
.eqIfPresent(KeyboardUserInviteCodesDO::getOwnerTenantId, reqVO.getOwnerTenantId()) .eqIfPresent(KeyboardUserInviteCodesDO::getOwnerTenantId, reqVO.getOwnerTenantId())
.eqIfPresent(KeyboardUserInviteCodesDO::getOwenrSystemUserId, reqVO.getOwenrSystemUserId()) .eqIfPresent(KeyboardUserInviteCodesDO::getOwnerSystemUserId, reqVO.getOwnerSystemUserId())
.eqIfPresent(KeyboardUserInviteCodesDO::getInviteType, reqVO.getInviteType()) .eqIfPresent(KeyboardUserInviteCodesDO::getInviteType, reqVO.getInviteType())
.orderByDesc(KeyboardUserInviteCodesDO::getId)); .orderByDesc(KeyboardUserInviteCodesDO::getId));
} }

View File

@@ -0,0 +1,19 @@
package com.yolo.keyboard.module.system.api.invitecode;
/**
* 用户邀请码 API 接口
*
* @author ziin
*/
public interface UserInviteCodeApi {
/**
* 为代理租户创建邀请码
*
* @param userId 系统用户ID
* @param tenantId 租户ID
* @return 生成的邀请码
*/
String createInviteCodeForAgent(Long userId, Long tenantId);
}

View File

@@ -21,6 +21,7 @@ import com.yolo.keyboard.module.system.dal.dataobject.permission.RoleDO;
import com.yolo.keyboard.module.system.dal.dataobject.tenant.TenantDO; import com.yolo.keyboard.module.system.dal.dataobject.tenant.TenantDO;
import com.yolo.keyboard.module.system.dal.dataobject.tenant.TenantPackageDO; import com.yolo.keyboard.module.system.dal.dataobject.tenant.TenantPackageDO;
import com.yolo.keyboard.module.system.dal.mysql.tenant.TenantMapper; import com.yolo.keyboard.module.system.dal.mysql.tenant.TenantMapper;
import com.yolo.keyboard.module.system.api.invitecode.UserInviteCodeApi;
import com.yolo.keyboard.module.system.enums.permission.RoleCodeEnum; import com.yolo.keyboard.module.system.enums.permission.RoleCodeEnum;
import com.yolo.keyboard.module.system.enums.permission.RoleTypeEnum; import com.yolo.keyboard.module.system.enums.permission.RoleTypeEnum;
import com.yolo.keyboard.module.system.service.permission.MenuService; import com.yolo.keyboard.module.system.service.permission.MenuService;
@@ -75,6 +76,9 @@ public class TenantServiceImpl implements TenantService {
@Resource @Resource
private PermissionService permissionService; private PermissionService permissionService;
@Autowired(required = false)
private UserInviteCodeApi userInviteCodeApi;
@Override @Override
public List<Long> getTenantIdList() { public List<Long> getTenantIdList() {
List<TenantDO> tenants = tenantMapper.selectList(); List<TenantDO> tenants = tenantMapper.selectList();
@@ -135,6 +139,10 @@ public class TenantServiceImpl implements TenantService {
Long userId = createUser(roleId, createReqVO); Long userId = createUser(roleId, createReqVO);
// 修改租户的管理员 // 修改租户的管理员
tenantMapper.updateById(new TenantDO().setId(tenant.getId()).setContactUserId(userId)); tenantMapper.updateById(new TenantDO().setId(tenant.getId()).setContactUserId(userId));
// 为代理租户创建邀请码
if ("代理".equals(createReqVO.getTenantType()) && userInviteCodeApi != null) {
userInviteCodeApi.createInviteCodeForAgent(userId, tenant.getId());
}
}); });
return tenant.getId(); return tenant.getId();
} }