瀏覽代碼

邀请码管理(单条、批量)10位英文数字随机

liyanbo 3 月之前
父節點
當前提交
8872255f41

+ 101 - 0
byzs-module-system/src/main/java/cn/iocoder/byzs/module/system/controller/admin/invitecode/InviteCodeController.java

@@ -0,0 +1,101 @@
+package cn.iocoder.byzs.module.system.controller.admin.invitecode;
+
+import cn.iocoder.byzs.framework.apilog.core.annotation.ApiAccessLog;
+import cn.iocoder.byzs.framework.common.pojo.CommonResult;
+import cn.iocoder.byzs.framework.common.pojo.PageParam;
+import cn.iocoder.byzs.framework.common.pojo.PageResult;
+import cn.iocoder.byzs.framework.common.util.object.BeanUtils;
+import cn.iocoder.byzs.framework.excel.core.util.ExcelUtils;
+import cn.iocoder.byzs.module.system.controller.admin.invitecode.vo.InviteCodePageReqVO;
+import cn.iocoder.byzs.module.system.controller.admin.invitecode.vo.InviteCodeRespVO;
+import cn.iocoder.byzs.module.system.controller.admin.invitecode.vo.InviteCodeSaveReqVO;
+import cn.iocoder.byzs.module.system.dal.dataobject.invitecode.InviteCodeDO;
+import cn.iocoder.byzs.module.system.service.invitecode.InviteCodeService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import jakarta.annotation.Resource;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.Valid;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.io.IOException;
+import java.util.List;
+
+import static cn.iocoder.byzs.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
+import static cn.iocoder.byzs.framework.common.pojo.CommonResult.success;
+
+@Tag(name = "管理后台 - 邀请码")
+@RestController
+@RequestMapping("/system/invite-code")
+@Validated
+public class InviteCodeController {
+
+    @Resource
+    private InviteCodeService inviteCodeService;
+
+    @PostMapping("/create")
+    @Operation(summary = "创建邀请码")
+    @PreAuthorize("@ss.hasPermission('system:invite-code:create')")
+    public CommonResult<Long> createInviteCode(@Valid @RequestBody InviteCodeSaveReqVO createReqVO) {
+        return success(inviteCodeService.createInviteCode(createReqVO));
+    }
+
+    @PutMapping("/update")
+    @Operation(summary = "更新邀请码")
+    @PreAuthorize("@ss.hasPermission('system:invite-code:update')")
+    public CommonResult<Boolean> updateInviteCode(@Valid @RequestBody InviteCodeSaveReqVO updateReqVO) {
+        inviteCodeService.updateInviteCode(updateReqVO);
+        return success(true);
+    }
+
+    @DeleteMapping("/delete")
+    @Operation(summary = "删除邀请码")
+    @Parameter(name = "id", description = "编号", required = true)
+    @PreAuthorize("@ss.hasPermission('system:invite-code:delete')")
+    public CommonResult<Boolean> deleteInviteCode(@RequestParam("id") Long id) {
+        inviteCodeService.deleteInviteCode(id);
+        return success(true);
+    }
+
+    @DeleteMapping("/delete-list")
+    @Parameter(name = "ids", description = "编号", required = true)
+    @Operation(summary = "批量删除邀请码")
+                @PreAuthorize("@ss.hasPermission('system:invite-code:delete')")
+    public CommonResult<Boolean> deleteInviteCodeList(@RequestParam("ids") List<Long> ids) {
+        inviteCodeService.deleteInviteCodeListByIds(ids);
+        return success(true);
+    }
+
+    @GetMapping("/get")
+    @Operation(summary = "获得邀请码")
+    @Parameter(name = "id", description = "编号", required = true, example = "1024")
+    @PreAuthorize("@ss.hasPermission('system:invite-code:query')")
+    public CommonResult<InviteCodeRespVO> getInviteCode(@RequestParam("id") Long id) {
+        InviteCodeDO inviteCode = inviteCodeService.getInviteCode(id);
+        return success(BeanUtils.toBean(inviteCode, InviteCodeRespVO.class));
+    }
+
+    @GetMapping("/page")
+    @Operation(summary = "获得邀请码分页")
+    @PreAuthorize("@ss.hasPermission('system:invite-code:query')")
+    public CommonResult<PageResult<InviteCodeRespVO>> getInviteCodePage(@Valid InviteCodePageReqVO pageReqVO) {
+        PageResult<InviteCodeRespVO> pageResult = inviteCodeService.getInviteCodePage(pageReqVO);
+        return success(pageResult);
+    }
+
+    @GetMapping("/export-excel")
+    @Operation(summary = "导出邀请码 Excel")
+    @PreAuthorize("@ss.hasPermission('system:invite-code:export')")
+    @ApiAccessLog(operateType = EXPORT)
+    public void exportInviteCodeExcel(@Valid InviteCodePageReqVO pageReqVO,
+              HttpServletResponse response) throws IOException {
+        pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+        List<InviteCodeRespVO> list = inviteCodeService.getInviteCodePage(pageReqVO).getList();
+        // 导出 Excel
+        ExcelUtils.write(response, "邀请码.xls", "数据", InviteCodeRespVO.class, list);
+    }
+
+}

+ 49 - 0
byzs-module-system/src/main/java/cn/iocoder/byzs/module/system/controller/admin/invitecode/vo/InviteCodePageReqVO.java

@@ -0,0 +1,49 @@
+package cn.iocoder.byzs.module.system.controller.admin.invitecode.vo;
+
+import cn.iocoder.byzs.framework.common.pojo.PageParam;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.time.LocalDateTime;
+
+import static cn.iocoder.byzs.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
+
+@Schema(description = "管理后台 - 邀请码分页 Request VO")
+@Data
+public class InviteCodePageReqVO extends PageParam {
+
+    @Schema(description = "邀请码")
+    private String code;
+
+    @Schema(description = "绑定角色")
+    private String roleIds;
+
+    @Schema(description = "有效期(天)")
+    private Integer validTime;
+
+    @Schema(description = "使用时间")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDateTime[] useTime;
+
+    @Schema(description = "过期时间")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDateTime[] expireTime;
+
+    @Schema(description = "使用用户id")
+    private Long useUserId;
+
+    @Schema(description = "使用用户租户id")
+    private Long useUserTenantId;
+
+    @Schema(description = "状态")
+    private String status;
+
+    @Schema(description = "创建时间")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDateTime[] createTime;
+
+    @Schema(description = "租户编号", example = "24563")
+    private Long tenantId;
+
+}

+ 75 - 0
byzs-module-system/src/main/java/cn/iocoder/byzs/module/system/controller/admin/invitecode/vo/InviteCodeRespVO.java

@@ -0,0 +1,75 @@
+package cn.iocoder.byzs.module.system.controller.admin.invitecode.vo;
+
+import cn.iocoder.byzs.framework.excel.core.annotations.DictFormat;
+import cn.iocoder.byzs.framework.excel.core.convert.DictConvert;
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+import java.util.Set;
+
+@Schema(description = "管理后台 - 邀请码 Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class InviteCodeRespVO {
+
+    @Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("主键")
+    private Long id;
+
+    @Schema(description = "邀请码")
+    @ExcelProperty("邀请码")
+    private String code;
+
+    @Schema(description = "绑定角色")
+    @ExcelProperty("绑定角色")
+    private String roleIds;
+
+    @Schema(description = "绑定角色名称")
+    @ExcelProperty("绑定角色名称")
+    private Set<String> roleNames;
+
+    @Schema(description = "有效期(天)")
+    @ExcelProperty("有效期(天)")
+    private Integer validTime;
+
+    @Schema(description = "使用时间")
+    @ExcelProperty("使用时间")
+    private LocalDateTime useTime;
+
+    @Schema(description = "过期时间")
+    @ExcelProperty("过期时间")
+    private LocalDateTime expireTime;
+
+    @Schema(description = "使用用户id")
+    @ExcelProperty("使用用户id")
+    private Long useUserId;
+
+    @Schema(description = "使用用户名")
+    @ExcelProperty("使用用户名")
+    private String useUserName;
+
+    @Schema(description = "使用用户租户id")
+    @ExcelProperty(value = "使用用户租户id", converter = DictConvert.class)
+    @DictFormat("common_status") // TODO 代码优化:建议设置到对应的 DictTypeConstants 枚举类中
+    private Long useUserTenantId;
+
+    @Schema(description = "使用用户租户名称")
+    @ExcelProperty("使用用户租户名称")
+    private String useUserTenantName;
+
+    @Schema(description = "状态")
+    @ExcelProperty("状态")
+    private String status;
+
+    @Schema(description = "创建时间")
+    @ExcelProperty("创建时间")
+    private LocalDateTime createTime;
+
+    @Schema(description = "租户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "24563")
+    @ExcelProperty("租户编号")
+    private Long tenantId;
+
+}

+ 44 - 0
byzs-module-system/src/main/java/cn/iocoder/byzs/module/system/controller/admin/invitecode/vo/InviteCodeSaveReqVO.java

@@ -0,0 +1,44 @@
+package cn.iocoder.byzs.module.system.controller.admin.invitecode.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+@Schema(description = "管理后台 - 邀请码新增/修改 Request VO")
+@Data
+public class InviteCodeSaveReqVO {
+
+    @Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED)
+    private Long id;
+
+    //类型
+    private String type;
+    //批量数量
+    private Integer batchCount;
+
+    @Schema(description = "邀请码")
+    private String code;
+
+    @Schema(description = "绑定角色")
+    private String roleIds;
+
+    @Schema(description = "有效期(天)")
+    private Integer validTime;
+
+    @Schema(description = "使用时间")
+    private LocalDateTime useTime;
+
+    @Schema(description = "过期时间")
+    private LocalDateTime expireTime;
+
+    @Schema(description = "使用用户id")
+    private Long useUserId;
+
+    @Schema(description = "使用用户租户id")
+    private Long useUserTenantId;
+
+    @Schema(description = "状态")
+    private String status;
+
+}

+ 69 - 0
byzs-module-system/src/main/java/cn/iocoder/byzs/module/system/dal/dataobject/invitecode/InviteCodeDO.java

@@ -0,0 +1,69 @@
+package cn.iocoder.byzs.module.system.dal.dataobject.invitecode;
+
+import cn.iocoder.byzs.framework.mybatis.core.dataobject.BaseDO;
+import com.baomidou.mybatisplus.annotation.KeySequence;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.*;
+
+import java.time.LocalDateTime;
+
+/**
+ * 邀请码 DO
+ *
+ * @author lyb
+ */
+@TableName("system_invite_code")
+@KeySequence("system_invite_code_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class InviteCodeDO extends BaseDO {
+
+    /**
+     * 主键
+     */
+    @TableId
+    private Long id;
+    /**
+     * 邀请码
+     */
+    private String code;
+    /**
+     * 绑定角色
+     */
+    private String roleIds;
+    /**
+     * 有效期(天)
+     */
+    private Integer validTime;
+    /**
+     * 使用时间
+     */
+    private LocalDateTime useTime;
+    /**
+     * 过期时间
+     */
+    private LocalDateTime expireTime;
+    /**
+     * 使用用户id
+     */
+    private Long useUserId;
+    /**
+     * 使用用户租户id
+     *
+     * 枚举 {@link TODO common_status 对应的类}
+     */
+    private Long useUserTenantId;
+    /**
+     * 状态
+     */
+    private String status;
+
+    private Long tenantId;
+
+
+}

+ 32 - 0
byzs-module-system/src/main/java/cn/iocoder/byzs/module/system/dal/mysql/invitecode/InviteCodeMapper.java

@@ -0,0 +1,32 @@
+package cn.iocoder.byzs.module.system.dal.mysql.invitecode;
+
+import cn.iocoder.byzs.framework.common.pojo.PageResult;
+import cn.iocoder.byzs.framework.mybatis.core.mapper.BaseMapperX;
+import cn.iocoder.byzs.framework.mybatis.core.query.LambdaQueryWrapperX;
+import cn.iocoder.byzs.module.system.controller.admin.invitecode.vo.InviteCodePageReqVO;
+import cn.iocoder.byzs.module.system.dal.dataobject.invitecode.InviteCodeDO;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 邀请码 Mapper
+ *
+ * @author lyb
+ */
+@Mapper
+public interface InviteCodeMapper extends BaseMapperX<InviteCodeDO> {
+
+    default PageResult<InviteCodeDO> selectPage(InviteCodePageReqVO reqVO) {
+        return selectPage(reqVO, new LambdaQueryWrapperX<InviteCodeDO>()
+                .eqIfPresent(InviteCodeDO::getCode, reqVO.getCode())
+                .eqIfPresent(InviteCodeDO::getRoleIds, reqVO.getRoleIds())
+                .eqIfPresent(InviteCodeDO::getValidTime, reqVO.getValidTime())
+                .betweenIfPresent(InviteCodeDO::getExpireTime, reqVO.getExpireTime())
+                .eqIfPresent(InviteCodeDO::getUseUserId, reqVO.getUseUserId())
+                .eqIfPresent(InviteCodeDO::getUseUserTenantId, reqVO.getUseUserTenantId())
+                .eqIfPresent(InviteCodeDO::getStatus, reqVO.getStatus())
+                .betweenIfPresent(InviteCodeDO::getCreateTime, reqVO.getCreateTime())
+                .eqIfPresent(InviteCodeDO::getTenantId, reqVO.getTenantId())
+                .orderByDesc(InviteCodeDO::getId));
+    }
+
+}

+ 3 - 0
byzs-module-system/src/main/java/cn/iocoder/byzs/module/system/enums/ErrorCodeConstants.java

@@ -36,6 +36,9 @@ public interface ErrorCodeConstants {
     ErrorCode ROLE_IS_DISABLE = new ErrorCode(1_002_002_004, "名字为【{}】的角色已被禁用");
     ErrorCode ROLE_ADMIN_CODE_ERROR = new ErrorCode(1_002_002_005, "标识【{}】不能使用");
 
+    // ========== 邀请码 1-002-003-000==========
+    ErrorCode INVITE_CODE_NOT_EXISTS = new ErrorCode(1_002_003_004, "邀请码不存在");
+
     // ========== 用户模块 1-002-003-000 ==========
     ErrorCode USER_USERNAME_EXISTS = new ErrorCode(1_002_003_000, "用户账号已经存在");
     ErrorCode USER_MOBILE_EXISTS = new ErrorCode(1_002_003_001, "手机号已经存在");

+ 64 - 0
byzs-module-system/src/main/java/cn/iocoder/byzs/module/system/service/invitecode/InviteCodeService.java

@@ -0,0 +1,64 @@
+package cn.iocoder.byzs.module.system.service.invitecode;
+
+import cn.iocoder.byzs.framework.common.pojo.PageResult;
+import cn.iocoder.byzs.module.system.controller.admin.invitecode.vo.InviteCodePageReqVO;
+import cn.iocoder.byzs.module.system.controller.admin.invitecode.vo.InviteCodeRespVO;
+import cn.iocoder.byzs.module.system.controller.admin.invitecode.vo.InviteCodeSaveReqVO;
+import cn.iocoder.byzs.module.system.dal.dataobject.invitecode.InviteCodeDO;
+import jakarta.validation.Valid;
+
+import java.util.List;
+
+/**
+ * 邀请码 Service 接口
+ *
+ * @author lyb
+ */
+public interface InviteCodeService {
+
+    /**
+     * 创建邀请码
+     *
+     * @param createReqVO 创建信息
+     * @return 编号
+     */
+    Long createInviteCode(@Valid InviteCodeSaveReqVO createReqVO);
+
+    /**
+     * 更新邀请码
+     *
+     * @param updateReqVO 更新信息
+     */
+    void updateInviteCode(@Valid InviteCodeSaveReqVO updateReqVO);
+
+    /**
+     * 删除邀请码
+     *
+     * @param id 编号
+     */
+    void deleteInviteCode(Long id);
+
+    /**
+    * 批量删除邀请码
+    *
+    * @param ids 编号
+    */
+    void deleteInviteCodeListByIds(List<Long> ids);
+
+    /**
+     * 获得邀请码
+     *
+     * @param id 编号
+     * @return 邀请码
+     */
+    InviteCodeDO getInviteCode(Long id);
+
+    /**
+     * 获得邀请码分页
+     *
+     * @param pageReqVO 分页查询
+     * @return 邀请码分页
+     */
+    PageResult<InviteCodeRespVO> getInviteCodePage(InviteCodePageReqVO pageReqVO);
+
+}

+ 199 - 0
byzs-module-system/src/main/java/cn/iocoder/byzs/module/system/service/invitecode/InviteCodeServiceImpl.java

@@ -0,0 +1,199 @@
+package cn.iocoder.byzs.module.system.service.invitecode;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.iocoder.byzs.framework.common.pojo.PageResult;
+import cn.iocoder.byzs.framework.common.util.object.BeanUtils;
+import cn.iocoder.byzs.framework.common.util.string.StrUtils;
+import cn.iocoder.byzs.module.system.controller.admin.invitecode.vo.InviteCodePageReqVO;
+import cn.iocoder.byzs.module.system.controller.admin.invitecode.vo.InviteCodeRespVO;
+import cn.iocoder.byzs.module.system.controller.admin.invitecode.vo.InviteCodeSaveReqVO;
+import cn.iocoder.byzs.module.system.dal.dataobject.invitecode.InviteCodeDO;
+import cn.iocoder.byzs.module.system.dal.dataobject.permission.RoleDO;
+import cn.iocoder.byzs.module.system.dal.dataobject.tenant.TenantDO;
+import cn.iocoder.byzs.module.system.dal.dataobject.user.AdminUserDO;
+import cn.iocoder.byzs.module.system.dal.mysql.invitecode.InviteCodeMapper;
+import cn.iocoder.byzs.module.system.dal.mysql.permission.RoleMapper;
+import cn.iocoder.byzs.module.system.dal.mysql.tenant.TenantMapper;
+import cn.iocoder.byzs.module.system.dal.mysql.user.AdminUserMapper;
+import jakarta.annotation.Resource;
+import org.springframework.stereotype.Service;
+import org.springframework.validation.annotation.Validated;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+import static cn.iocoder.byzs.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static cn.iocoder.byzs.module.system.enums.ErrorCodeConstants.INVITE_CODE_NOT_EXISTS;
+
+/**
+ * 邀请码 Service 实现类
+ *
+ * @author lyb
+ */
+@Service
+@Validated
+public class InviteCodeServiceImpl implements InviteCodeService {
+
+    @Resource
+    private InviteCodeMapper inviteCodeMapper;
+
+    @Resource
+    private RoleMapper roleMapper;
+
+    @Resource
+    private TenantMapper tenantMapper;
+
+    @Resource
+    private AdminUserMapper userMapper;
+
+    @Override
+    public Long createInviteCode(InviteCodeSaveReqVO createReqVO) {
+        // 批量生成邀请码
+        if ("batch".equals(createReqVO.getType())) {
+            Integer batchCount = createReqVO.getBatchCount();
+
+            // 生成批量邀请码
+            List<InviteCodeDO> inviteCodeList = new ArrayList<>(batchCount);
+            for (int i = 0; i < batchCount; i++) {
+                InviteCodeDO inviteCode = BeanUtils.toBean(createReqVO, InviteCodeDO.class);
+                // 生成随机邀请码
+                String randomCode = generateRandomCode(10);
+                // 如果有前缀,则拼接前缀
+                if (createReqVO.getCode() != null && !createReqVO.getCode().isEmpty()) {
+                    inviteCode.setCode(createReqVO.getCode() + randomCode);
+                } else {
+                    inviteCode.setCode(randomCode);
+                }
+                inviteCodeList.add(inviteCode);
+            }
+
+            // 批量插入
+            inviteCodeMapper.insertBatch(inviteCodeList);
+
+            // 返回第一个生成的邀请码ID
+            return inviteCodeList.get(0).getId();
+        }
+        // 单条插入
+        else {
+            InviteCodeDO inviteCode = BeanUtils.toBean(createReqVO, InviteCodeDO.class);
+            // 如果没有提供邀请码,则生成一个
+            if (inviteCode.getCode() == null || inviteCode.getCode().isEmpty()) {
+                inviteCode.setCode(generateRandomCode(10));
+            }
+            inviteCodeMapper.insert(inviteCode);
+            return inviteCode.getId();
+        }
+    }
+
+    /**
+     * 生成指定长度的随机邀请码
+     * @param length 邀请码长度
+     * @return 随机邀请码
+     */
+    private String generateRandomCode(int length) {
+        // 定义字符集:大小写字母 + 数字
+        String chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
+        StringBuilder sb = new StringBuilder(length);
+        Random random = new Random();
+
+        for (int i = 0; i < length; i++) {
+            int index = random.nextInt(chars.length());
+            sb.append(chars.charAt(index));
+        }
+
+        return sb.toString();
+    }
+
+    @Override
+    public void updateInviteCode(InviteCodeSaveReqVO updateReqVO) {
+        // 校验存在
+        validateInviteCodeExists(updateReqVO.getId());
+        // 更新
+        InviteCodeDO updateObj = BeanUtils.toBean(updateReqVO, InviteCodeDO.class);
+        inviteCodeMapper.updateById(updateObj);
+    }
+
+    @Override
+    public void deleteInviteCode(Long id) {
+        // 校验存在
+        validateInviteCodeExists(id);
+        // 删除
+        inviteCodeMapper.deleteById(id);
+    }
+
+    @Override
+        public void deleteInviteCodeListByIds(List<Long> ids) {
+        // 校验存在
+        validateInviteCodeExists(ids);
+        // 删除
+        inviteCodeMapper.deleteByIds(ids);
+        }
+
+    private void validateInviteCodeExists(List<Long> ids) {
+        List<InviteCodeDO> list = inviteCodeMapper.selectByIds(ids);
+        if (CollUtil.isEmpty(list) || list.size() != ids.size()) {
+            throw exception(INVITE_CODE_NOT_EXISTS);
+        }
+    }
+
+    private void validateInviteCodeExists(Long id) {
+        if (inviteCodeMapper.selectById(id) == null) {
+            throw exception(INVITE_CODE_NOT_EXISTS);
+        }
+    }
+
+    @Override
+    public InviteCodeDO getInviteCode(Long id) {
+        return inviteCodeMapper.selectById(id);
+    }
+
+    @Override
+    public PageResult<InviteCodeRespVO> getInviteCodePage(InviteCodePageReqVO pageReqVO) {
+        PageResult<InviteCodeDO> inviteCodeDOPageResult = inviteCodeMapper.selectPage(pageReqVO);
+        List<InviteCodeDO> list = inviteCodeDOPageResult.getList();
+
+        //取list的roleIds集合,按逗号分割并转换为Long类型
+        Set<Long> roleIdSet = list.stream().map(InviteCodeDO::getRoleIds).filter(Objects::nonNull).flatMap(roleIds -> StrUtils.splitToLongSet(roleIds).stream()).collect(Collectors.toSet());
+        List<RoleDO> roleList = roleIdSet.isEmpty() ? Collections.emptyList() : roleMapper.selectBatchIds(roleIdSet);
+        Map<Long, String> roleMap = roleList.stream().collect(Collectors.toMap(RoleDO::getId, RoleDO::getName));
+
+        //取list的userId集合
+        Set<Long> userIdSet = list.stream().map(InviteCodeDO::getUseUserId).collect(Collectors.toSet());
+        List<AdminUserDO> userList = userIdSet.isEmpty() ? Collections.emptyList() : userMapper.selectBatchIds(userIdSet);
+        Map<Long, String> userMap = userList.stream().collect(Collectors.toMap(AdminUserDO::getId, AdminUserDO::getNickname));
+
+        //取list的tenantIds集合
+        Set<Long> userTenantIdSet = list.stream().map(InviteCodeDO::getUseUserTenantId).collect(Collectors.toSet());
+        List<TenantDO> tenantList = userTenantIdSet.isEmpty() ? Collections.emptyList() : tenantMapper.selectBatchIds(userTenantIdSet);
+        Map<Long, String> tenantMap = tenantList.stream().collect(Collectors.toMap(TenantDO::getId, TenantDO::getName));
+
+        List<InviteCodeRespVO> respVOList = list.stream().map(inviteCode -> {
+            InviteCodeRespVO respVO = BeanUtils.toBean(inviteCode, InviteCodeRespVO.class);
+
+            // 填充角色名称
+            if (inviteCode.getRoleIds() != null) {
+                Set<String> roleNames = StrUtils.splitToLongSet(inviteCode.getRoleIds()).stream()
+                        .map(roleMap::get)
+                        .filter(Objects::nonNull)
+                        .collect(Collectors.toSet());
+                respVO.setRoleNames(roleNames);
+                respVO.setRoleIds(inviteCode.getRoleIds());
+            }
+
+            // 填充用户名
+            if (inviteCode.getUseUserId() != null) {
+                respVO.setUseUserName(userMap.get(inviteCode.getUseUserId()));
+            }
+
+            // 填充租户名称
+            if (inviteCode.getUseUserTenantId() != null) {
+                respVO.setUseUserTenantName(tenantMap.get(inviteCode.getUseUserTenantId()));
+            }
+
+            return respVO;
+        }).collect(Collectors.toList());
+
+        return new PageResult<InviteCodeRespVO>().setList(respVOList).setTotal(inviteCodeDOPageResult.getTotal());
+    }
+
+}

+ 7 - 0
byzs-module-system/src/main/resources/mapper/invitecode/InviteCodeMapper.xml

@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="cn.iocoder.byzs.module.system.dal.mysql.invitecode.InviteCodeMapper">
+
+
+
+</mapper>