🔧 简化 tenant 模块的 VO

This commit is contained in:
YunaiV 2023-12-02 23:43:04 +08:00
parent 066ba7ece8
commit 5cce6a510e
24 changed files with 164 additions and 359 deletions

View File

@ -1,11 +1,15 @@
package cn.iocoder.yudao.module.system.controller.admin.tenant; package cn.iocoder.yudao.module.system.controller.admin.tenant;
import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog; import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog;
import cn.iocoder.yudao.module.system.controller.admin.tenant.vo.tenant.*; import cn.iocoder.yudao.module.system.controller.admin.tenant.vo.tenant.TenantPageReqVO;
import cn.iocoder.yudao.module.system.convert.tenant.TenantConvert; import cn.iocoder.yudao.module.system.controller.admin.tenant.vo.tenant.TenantRespVO;
import cn.iocoder.yudao.module.system.controller.admin.tenant.vo.tenant.TenantSaveReqVO;
import cn.iocoder.yudao.module.system.controller.admin.tenant.vo.tenant.TenantSimpleRespVO;
import cn.iocoder.yudao.module.system.dal.dataobject.tenant.TenantDO; import cn.iocoder.yudao.module.system.dal.dataobject.tenant.TenantDO;
import cn.iocoder.yudao.module.system.service.tenant.TenantService; import cn.iocoder.yudao.module.system.service.tenant.TenantService;
import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Operation;
@ -47,20 +51,20 @@ public class TenantController {
@Parameter(name = "website", description = "域名", required = true, example = "www.iocoder.cn") @Parameter(name = "website", description = "域名", required = true, example = "www.iocoder.cn")
public CommonResult<TenantSimpleRespVO> getTenantByWebsite(@RequestParam("website") String website) { public CommonResult<TenantSimpleRespVO> getTenantByWebsite(@RequestParam("website") String website) {
TenantDO tenant = tenantService.getTenantByWebsite(website); TenantDO tenant = tenantService.getTenantByWebsite(website);
return success(TenantConvert.INSTANCE.convert03(tenant)); return success(BeanUtils.toBean(tenant, TenantSimpleRespVO.class));
} }
@PostMapping("/create") @PostMapping("/create")
@Operation(summary = "创建租户") @Operation(summary = "创建租户")
@PreAuthorize("@ss.hasPermission('system:tenant:create')") @PreAuthorize("@ss.hasPermission('system:tenant:create')")
public CommonResult<Long> createTenant(@Valid @RequestBody TenantCreateReqVO createReqVO) { public CommonResult<Long> createTenant(@Valid @RequestBody TenantSaveReqVO createReqVO) {
return success(tenantService.createTenant(createReqVO)); return success(tenantService.createTenant(createReqVO));
} }
@PutMapping("/update") @PutMapping("/update")
@Operation(summary = "更新租户") @Operation(summary = "更新租户")
@PreAuthorize("@ss.hasPermission('system:tenant:update')") @PreAuthorize("@ss.hasPermission('system:tenant:update')")
public CommonResult<Boolean> updateTenant(@Valid @RequestBody TenantUpdateReqVO updateReqVO) { public CommonResult<Boolean> updateTenant(@Valid @RequestBody TenantSaveReqVO updateReqVO) {
tenantService.updateTenant(updateReqVO); tenantService.updateTenant(updateReqVO);
return success(true); return success(true);
} }
@ -80,7 +84,7 @@ public class TenantController {
@PreAuthorize("@ss.hasPermission('system:tenant:query')") @PreAuthorize("@ss.hasPermission('system:tenant:query')")
public CommonResult<TenantRespVO> getTenant(@RequestParam("id") Long id) { public CommonResult<TenantRespVO> getTenant(@RequestParam("id") Long id) {
TenantDO tenant = tenantService.getTenant(id); TenantDO tenant = tenantService.getTenant(id);
return success(TenantConvert.INSTANCE.convert(tenant)); return success(BeanUtils.toBean(tenant, TenantRespVO.class));
} }
@GetMapping("/page") @GetMapping("/page")
@ -88,19 +92,20 @@ public class TenantController {
@PreAuthorize("@ss.hasPermission('system:tenant:query')") @PreAuthorize("@ss.hasPermission('system:tenant:query')")
public CommonResult<PageResult<TenantRespVO>> getTenantPage(@Valid TenantPageReqVO pageVO) { public CommonResult<PageResult<TenantRespVO>> getTenantPage(@Valid TenantPageReqVO pageVO) {
PageResult<TenantDO> pageResult = tenantService.getTenantPage(pageVO); PageResult<TenantDO> pageResult = tenantService.getTenantPage(pageVO);
return success(TenantConvert.INSTANCE.convertPage(pageResult)); return success(BeanUtils.toBean(pageResult, TenantRespVO.class));
} }
@GetMapping("/export-excel") @GetMapping("/export-excel")
@Operation(summary = "导出租户 Excel") @Operation(summary = "导出租户 Excel")
@PreAuthorize("@ss.hasPermission('system:tenant:export')") @PreAuthorize("@ss.hasPermission('system:tenant:export')")
@OperateLog(type = EXPORT) @OperateLog(type = EXPORT)
public void exportTenantExcel(@Valid TenantExportReqVO exportReqVO, public void exportTenantExcel(@Valid TenantPageReqVO exportReqVO,
HttpServletResponse response) throws IOException { HttpServletResponse response) throws IOException {
List<TenantDO> list = tenantService.getTenantList(exportReqVO); exportReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
List<TenantDO> list = tenantService.getTenantPage(exportReqVO).getList();
// 导出 Excel // 导出 Excel
List<TenantExcelVO> datas = TenantConvert.INSTANCE.convertList02(list); ExcelUtils.write(response, "租户.xls", "数据", TenantRespVO.class,
ExcelUtils.write(response, "租户.xls", "数据", TenantExcelVO.class, datas); BeanUtils.toBean(list, TenantRespVO.class));
} }
} }

View File

@ -3,13 +3,16 @@ package cn.iocoder.yudao.module.system.controller.admin.tenant;
import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
import cn.iocoder.yudao.framework.common.pojo.CommonResult; 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.system.controller.admin.tenant.vo.packages.*; import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.module.system.convert.tenant.TenantPackageConvert; import cn.iocoder.yudao.module.system.controller.admin.tenant.vo.packages.TenantPackagePageReqVO;
import cn.iocoder.yudao.module.system.controller.admin.tenant.vo.packages.TenantPackageRespVO;
import cn.iocoder.yudao.module.system.controller.admin.tenant.vo.packages.TenantPackageSaveReqVO;
import cn.iocoder.yudao.module.system.controller.admin.tenant.vo.packages.TenantPackageSimpleRespVO;
import cn.iocoder.yudao.module.system.dal.dataobject.tenant.TenantPackageDO; import cn.iocoder.yudao.module.system.dal.dataobject.tenant.TenantPackageDO;
import cn.iocoder.yudao.module.system.service.tenant.TenantPackageService; import cn.iocoder.yudao.module.system.service.tenant.TenantPackageService;
import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
@ -32,14 +35,14 @@ public class TenantPackageController {
@PostMapping("/create") @PostMapping("/create")
@Operation(summary = "创建租户套餐") @Operation(summary = "创建租户套餐")
@PreAuthorize("@ss.hasPermission('system:tenant-package:create')") @PreAuthorize("@ss.hasPermission('system:tenant-package:create')")
public CommonResult<Long> createTenantPackage(@Valid @RequestBody TenantPackageCreateReqVO createReqVO) { public CommonResult<Long> createTenantPackage(@Valid @RequestBody TenantPackageSaveReqVO createReqVO) {
return success(tenantPackageService.createTenantPackage(createReqVO)); return success(tenantPackageService.createTenantPackage(createReqVO));
} }
@PutMapping("/update") @PutMapping("/update")
@Operation(summary = "更新租户套餐") @Operation(summary = "更新租户套餐")
@PreAuthorize("@ss.hasPermission('system:tenant-package:update')") @PreAuthorize("@ss.hasPermission('system:tenant-package:update')")
public CommonResult<Boolean> updateTenantPackage(@Valid @RequestBody TenantPackageUpdateReqVO updateReqVO) { public CommonResult<Boolean> updateTenantPackage(@Valid @RequestBody TenantPackageSaveReqVO updateReqVO) {
tenantPackageService.updateTenantPackage(updateReqVO); tenantPackageService.updateTenantPackage(updateReqVO);
return success(true); return success(true);
} }
@ -59,7 +62,7 @@ public class TenantPackageController {
@PreAuthorize("@ss.hasPermission('system:tenant-package:query')") @PreAuthorize("@ss.hasPermission('system:tenant-package:query')")
public CommonResult<TenantPackageRespVO> getTenantPackage(@RequestParam("id") Long id) { public CommonResult<TenantPackageRespVO> getTenantPackage(@RequestParam("id") Long id) {
TenantPackageDO tenantPackage = tenantPackageService.getTenantPackage(id); TenantPackageDO tenantPackage = tenantPackageService.getTenantPackage(id);
return success(TenantPackageConvert.INSTANCE.convert(tenantPackage)); return success(BeanUtils.toBean(tenantPackage, TenantPackageRespVO.class));
} }
@GetMapping("/page") @GetMapping("/page")
@ -67,15 +70,14 @@ public class TenantPackageController {
@PreAuthorize("@ss.hasPermission('system:tenant-package:query')") @PreAuthorize("@ss.hasPermission('system:tenant-package:query')")
public CommonResult<PageResult<TenantPackageRespVO>> getTenantPackagePage(@Valid TenantPackagePageReqVO pageVO) { public CommonResult<PageResult<TenantPackageRespVO>> getTenantPackagePage(@Valid TenantPackagePageReqVO pageVO) {
PageResult<TenantPackageDO> pageResult = tenantPackageService.getTenantPackagePage(pageVO); PageResult<TenantPackageDO> pageResult = tenantPackageService.getTenantPackagePage(pageVO);
return success(TenantPackageConvert.INSTANCE.convertPage(pageResult)); return success(BeanUtils.toBean(pageResult, TenantPackageRespVO.class));
} }
@GetMapping("/get-simple-list") @GetMapping({"/get-simple-list", "simple-list"})
@Operation(summary = "获取租户套餐精简信息列表", description = "只包含被开启的租户套餐,主要用于前端的下拉选项") @Operation(summary = "获取租户套餐精简信息列表", description = "只包含被开启的租户套餐,主要用于前端的下拉选项")
public CommonResult<List<TenantPackageSimpleRespVO>> getTenantPackageList() { public CommonResult<List<TenantPackageSimpleRespVO>> getTenantPackageList() {
// 获得角色列表只要开启状态的
List<TenantPackageDO> list = tenantPackageService.getTenantPackageListByStatus(CommonStatusEnum.ENABLE.getStatus()); List<TenantPackageDO> list = tenantPackageService.getTenantPackageListByStatus(CommonStatusEnum.ENABLE.getStatus());
return success(TenantPackageConvert.INSTANCE.convertList02(list)); return success(BeanUtils.toBean(list, TenantPackageSimpleRespVO.class));
} }
} }

View File

@ -1,14 +0,0 @@
package cn.iocoder.yudao.module.system.controller.admin.tenant.vo.packages;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
@Schema(description = "管理后台 - 租户套餐创建 Request VO")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class TenantPackageCreateReqVO extends TenantPackageBaseVO {
}

View File

@ -29,5 +29,4 @@ public class TenantPackagePageReqVO extends PageParam {
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
@Schema(description = "创建时间") @Schema(description = "创建时间")
private LocalDateTime[] createTime; private LocalDateTime[] createTime;
}
}

View File

@ -2,20 +2,29 @@ package cn.iocoder.yudao.module.system.controller.admin.tenant.vo.packages;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.Set;
@Schema(description = "管理后台 - 租户套餐 Response VO") @Schema(description = "管理后台 - 租户套餐 Response VO")
@Data @Data
@EqualsAndHashCode(callSuper = true) public class TenantPackageRespVO {
@ToString(callSuper = true)
public class TenantPackageRespVO extends TenantPackageBaseVO {
@Schema(description = "套餐编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") @Schema(description = "套餐编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
private Long id; private Long id;
@Schema(description = "套餐名", requiredMode = Schema.RequiredMode.REQUIRED, example = "VIP")
private String name;
@Schema(description = "状态,参见 CommonStatusEnum 枚举", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
private Integer status;
@Schema(description = "备注", example = "")
private String remark;
@Schema(description = "关联的菜单编号", requiredMode = Schema.RequiredMode.REQUIRED)
private Set<Long> menuIds;
@Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
private LocalDateTime createTime; private LocalDateTime createTime;

View File

@ -1,24 +1,28 @@
package cn.iocoder.yudao.module.system.controller.admin.tenant.vo.packages; package cn.iocoder.yudao.module.system.controller.admin.tenant.vo.packages;
import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
import cn.iocoder.yudao.framework.common.validation.InEnum;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data; import lombok.Data;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull; import javax.validation.constraints.NotNull;
import java.util.Set; import java.util.Set;
/** @Schema(description = "管理后台 - 租户套餐创建/修改 Request VO")
* 租户套餐 Base VO提供给添加修改详细的子 VO 使用
* 如果子 VO 存在差异的字段请不要添加到这里影响 Swagger 文档生成
*/
@Data @Data
public class TenantPackageBaseVO { public class TenantPackageSaveReqVO {
@Schema(description = "套餐编号", example = "1024")
private Long id;
@Schema(description = "套餐名", requiredMode = Schema.RequiredMode.REQUIRED, example = "VIP") @Schema(description = "套餐名", requiredMode = Schema.RequiredMode.REQUIRED, example = "VIP")
@NotNull(message = "套餐名不能为空") @NotEmpty(message = "套餐名不能为空")
private String name; private String name;
@Schema(description = "状态,参见 CommonStatusEnum 枚举", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") @Schema(description = "状态,参见 CommonStatusEnum 枚举", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
@NotNull(message = "状态不能为空") @NotNull(message = "状态不能为空")
@InEnum(value = CommonStatusEnum.class, message = "状态必须是 {value}")
private Integer status; private Integer status;
@Schema(description = "备注", example = "") @Schema(description = "备注", example = "")

View File

@ -1,17 +0,0 @@
package cn.iocoder.yudao.module.system.controller.admin.tenant.vo.packages;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import javax.validation.constraints.*;
@Schema(description = "管理后台 - 租户套餐更新 Request VO")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class TenantPackageUpdateReqVO extends TenantPackageBaseVO {
@Schema(description = "套餐编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
@NotNull(message = "套餐编号不能为空")
private Long id;
}

View File

@ -1,29 +0,0 @@
package cn.iocoder.yudao.module.system.controller.admin.tenant.vo.tenant;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import org.hibernate.validator.constraints.Length;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.Pattern;
import javax.validation.constraints.Size;
@Schema(description = "管理后台 - 租户创建 Request VO")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class TenantCreateReqVO extends TenantBaseVO {
@Schema(description = "用户账号", requiredMode = Schema.RequiredMode.REQUIRED, example = "yudao")
@NotBlank(message = "用户账号不能为空")
@Pattern(regexp = "^[a-zA-Z0-9]{4,30}$", message = "用户账号由 数字、字母 组成")
@Size(min = 4, max = 30, message = "用户账号长度为 4-30 个字符")
private String username;
@Schema(description = "密码", requiredMode = Schema.RequiredMode.REQUIRED, example = "123456")
@NotEmpty(message = "密码不能为空")
@Length(min = 4, max = 16, message = "密码长度为 4-16 位")
private String password;
}

View File

@ -1,39 +0,0 @@
package cn.iocoder.yudao.module.system.controller.admin.tenant.vo.tenant;
import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat;
import cn.iocoder.yudao.framework.excel.core.convert.DictConvert;
import cn.iocoder.yudao.module.system.enums.DictTypeConstants;
import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;
import java.time.LocalDateTime;
/**
* 租户 Excel VO
*
* @author 芋道源码
*/
@Data
public class TenantExcelVO {
@ExcelProperty("租户编号")
private Long id;
@ExcelProperty("租户名")
private String name;
@ExcelProperty("联系人")
private String contactName;
@ExcelProperty("联系手机")
private String contactMobile;
@ExcelProperty(value = "状态", converter = DictConvert.class)
@DictFormat(DictTypeConstants.COMMON_STATUS)
private Integer status;
@ExcelProperty("创建时间")
private LocalDateTime createTime;
}

View File

@ -1,31 +0,0 @@
package cn.iocoder.yudao.module.system.controller.admin.tenant.vo.tenant;
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.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
@Schema(description = "管理后台 - 租户 Excel 导出 Request VO参数和 TenantPageReqVO 是一致的")
@Data
public class TenantExportReqVO {
@Schema(description = "租户名", example = "芋道")
private String name;
@Schema(description = "联系人", example = "芋艿")
private String contactName;
@Schema(description = "联系手机", example = "15601691300")
private String contactMobile;
@Schema(description = "租户状态0正常 1停用", example = "1")
private Integer status;
@Schema(description = "创建时间")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime[] createTime;
}

View File

@ -33,4 +33,4 @@ public class TenantPageReqVO extends PageParam {
@Schema(description = "创建时间") @Schema(description = "创建时间")
private LocalDateTime[] createTime; private LocalDateTime[] createTime;
} }

View File

@ -1,22 +1,55 @@
package cn.iocoder.yudao.module.system.controller.admin.tenant.vo.tenant; package cn.iocoder.yudao.module.system.controller.admin.tenant.vo.tenant;
import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat;
import cn.iocoder.yudao.framework.excel.core.convert.DictConvert;
import cn.iocoder.yudao.module.system.enums.DictTypeConstants;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import java.time.LocalDateTime; import java.time.LocalDateTime;
@Schema(description = "管理后台 - 租户 Response VO") @Schema(description = "管理后台 - 租户 Response VO")
@Data @Data
@EqualsAndHashCode(callSuper = true) @ExcelIgnoreUnannotated
@ToString(callSuper = true) public class TenantRespVO {
public class TenantRespVO extends TenantBaseVO {
@Schema(description = "租户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") @Schema(description = "租户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
@ExcelProperty("租户编号")
private Long id; private Long id;
@Schema(description = "租户名", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋道")
@ExcelProperty("租户名")
private String name;
@Schema(description = "联系人", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋艿")
@ExcelProperty("联系人")
private String contactName;
@Schema(description = "联系手机", example = "15601691300")
@ExcelProperty("联系手机")
private String contactMobile;
@Schema(description = "租户状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
@ExcelProperty(value = "状态", converter = DictConvert.class)
@DictFormat(DictTypeConstants.COMMON_STATUS)
private Integer status;
@Schema(description = "绑定域名", example = "https://www.iocoder.cn")
private String website;
@Schema(description = "租户套餐编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
private Long packageId;
@Schema(description = "过期时间", requiredMode = Schema.RequiredMode.REQUIRED)
private LocalDateTime expireTime;
@Schema(description = "账号数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
private Integer accountCount;
@Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("创建时间")
private LocalDateTime createTime; private LocalDateTime createTime;
} }

View File

@ -1,17 +1,23 @@
package cn.iocoder.yudao.module.system.controller.admin.tenant.vo.tenant; package cn.iocoder.yudao.module.system.controller.admin.tenant.vo.tenant;
import cn.hutool.core.util.ObjectUtil;
import com.fasterxml.jackson.annotation.JsonIgnore;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data; import lombok.Data;
import org.hibernate.validator.constraints.Length;
import javax.validation.constraints.AssertTrue;
import javax.validation.constraints.NotNull; import javax.validation.constraints.NotNull;
import javax.validation.constraints.Pattern;
import javax.validation.constraints.Size;
import java.time.LocalDateTime; import java.time.LocalDateTime;
/** @Schema(description = "管理后台 - 租户创建/修改 Request VO")
* 租户 Base VO提供给添加修改详细的子 VO 使用
* 如果子 VO 存在差异的字段请不要添加到这里影响 Swagger 文档生成
*/
@Data @Data
public class TenantBaseVO { public class TenantSaveReqVO {
@Schema(description = "租户编号", example = "1024")
private Long id;
@Schema(description = "租户名", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋道") @Schema(description = "租户名", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋道")
@NotNull(message = "租户名不能为空") @NotNull(message = "租户名不能为空")
@ -43,4 +49,22 @@ public class TenantBaseVO {
@NotNull(message = "账号数量不能为空") @NotNull(message = "账号数量不能为空")
private Integer accountCount; private Integer accountCount;
// ========== 创建需要传递的字段 ==========
@Schema(description = "用户账号", requiredMode = Schema.RequiredMode.REQUIRED, example = "yudao")
@Pattern(regexp = "^[a-zA-Z0-9]{4,30}$", message = "用户账号由 数字、字母 组成")
@Size(min = 4, max = 30, message = "用户账号长度为 4-30 个字符")
private String username;
@Schema(description = "密码", requiredMode = Schema.RequiredMode.REQUIRED, example = "123456")
@Length(min = 4, max = 16, message = "密码长度为 4-16 位")
private String password;
@AssertTrue(message = "用户账号、密码不能为空")
@JsonIgnore
public boolean isUsernameValid() {
return id != null // 修改时不需要传递
|| (ObjectUtil.isAllNotEmpty(username, password)); // 新增时必须都传递 usernamepassword
}
} }

View File

@ -2,14 +2,10 @@ package cn.iocoder.yudao.module.system.controller.admin.tenant.vo.tenant;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
@Schema(description = "管理后台 - 租户精简 Response VO") @Schema(description = "管理后台 - 租户精简 Response VO")
@Data @Data
@EqualsAndHashCode(callSuper = true) public class TenantSimpleRespVO {
@ToString(callSuper = true)
public class TenantSimpleRespVO extends TenantBaseVO {
@Schema(description = "租户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") @Schema(description = "租户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
private Long id; private Long id;

View File

@ -1,17 +0,0 @@
package cn.iocoder.yudao.module.system.controller.admin.tenant.vo.tenant;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import javax.validation.constraints.*;
@Schema(description = "管理后台 - 租户更新 Request VO")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class TenantUpdateReqVO extends TenantBaseVO {
@Schema(description = "租户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
@NotNull(message = "租户编号不能为空")
private Long id;
}

View File

@ -1,14 +1,10 @@
package cn.iocoder.yudao.module.system.convert.tenant; package cn.iocoder.yudao.module.system.convert.tenant;
import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.module.system.controller.admin.tenant.vo.tenant.TenantSaveReqVO;
import cn.iocoder.yudao.module.system.controller.admin.tenant.vo.tenant.*;
import cn.iocoder.yudao.module.system.controller.admin.user.vo.user.UserCreateReqVO; import cn.iocoder.yudao.module.system.controller.admin.user.vo.user.UserCreateReqVO;
import cn.iocoder.yudao.module.system.dal.dataobject.tenant.TenantDO;
import org.mapstruct.Mapper; import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers; import org.mapstruct.factory.Mappers;
import java.util.List;
/** /**
* 租户 Convert * 租户 Convert
* *
@ -19,21 +15,7 @@ public interface TenantConvert {
TenantConvert INSTANCE = Mappers.getMapper(TenantConvert.class); TenantConvert INSTANCE = Mappers.getMapper(TenantConvert.class);
TenantDO convert(TenantCreateReqVO bean); default UserCreateReqVO convert02(TenantSaveReqVO bean) {
TenantDO convert(TenantUpdateReqVO bean);
TenantRespVO convert(TenantDO bean);
TenantSimpleRespVO convert03(TenantDO bean);
List<TenantRespVO> convertList(List<TenantDO> list);
PageResult<TenantRespVO> convertPage(PageResult<TenantDO> page);
List<TenantExcelVO> convertList02(List<TenantDO> list);
default UserCreateReqVO convert02(TenantCreateReqVO bean) {
UserCreateReqVO reqVO = new UserCreateReqVO(); UserCreateReqVO reqVO = new UserCreateReqVO();
reqVO.setUsername(bean.getUsername()); reqVO.setUsername(bean.getUsername());
reqVO.setPassword(bean.getPassword()); reqVO.setPassword(bean.getPassword());

View File

@ -1,37 +0,0 @@
package cn.iocoder.yudao.module.system.convert.tenant;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.system.controller.admin.permission.vo.role.RoleSimpleRespVO;
import cn.iocoder.yudao.module.system.controller.admin.tenant.vo.packages.TenantPackageCreateReqVO;
import cn.iocoder.yudao.module.system.controller.admin.tenant.vo.packages.TenantPackageRespVO;
import cn.iocoder.yudao.module.system.controller.admin.tenant.vo.packages.TenantPackageSimpleRespVO;
import cn.iocoder.yudao.module.system.controller.admin.tenant.vo.packages.TenantPackageUpdateReqVO;
import cn.iocoder.yudao.module.system.dal.dataobject.tenant.TenantPackageDO;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;
import java.util.List;
/**
* 租户套餐 Convert
*
* @author 芋道源码
*/
@Mapper
public interface TenantPackageConvert {
TenantPackageConvert INSTANCE = Mappers.getMapper(TenantPackageConvert.class);
TenantPackageDO convert(TenantPackageCreateReqVO bean);
TenantPackageDO convert(TenantPackageUpdateReqVO bean);
TenantPackageRespVO convert(TenantPackageDO bean);
List<TenantPackageRespVO> convertList(List<TenantPackageDO> list);
PageResult<TenantPackageRespVO> convertPage(PageResult<TenantPackageDO> page);
List<TenantPackageSimpleRespVO> convertList02(List<TenantPackageDO> list);
}

View File

@ -3,7 +3,6 @@ package cn.iocoder.yudao.module.system.dal.mysql.tenant;
import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.module.system.controller.admin.tenant.vo.tenant.TenantExportReqVO;
import cn.iocoder.yudao.module.system.controller.admin.tenant.vo.tenant.TenantPageReqVO; import cn.iocoder.yudao.module.system.controller.admin.tenant.vo.tenant.TenantPageReqVO;
import cn.iocoder.yudao.module.system.dal.dataobject.tenant.TenantDO; import cn.iocoder.yudao.module.system.dal.dataobject.tenant.TenantDO;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
@ -28,16 +27,6 @@ public interface TenantMapper extends BaseMapperX<TenantDO> {
.orderByDesc(TenantDO::getId)); .orderByDesc(TenantDO::getId));
} }
default List<TenantDO> selectList(TenantExportReqVO reqVO) {
return selectList(new LambdaQueryWrapperX<TenantDO>()
.likeIfPresent(TenantDO::getName, reqVO.getName())
.likeIfPresent(TenantDO::getContactName, reqVO.getContactName())
.likeIfPresent(TenantDO::getContactMobile, reqVO.getContactMobile())
.eqIfPresent(TenantDO::getStatus, reqVO.getStatus())
.betweenIfPresent(TenantDO::getCreateTime, reqVO.getCreateTime())
.orderByDesc(TenantDO::getId));
}
default TenantDO selectByName(String name) { default TenantDO selectByName(String name) {
return selectOne(TenantDO::getName, name); return selectOne(TenantDO::getName, name);
} }

View File

@ -1,9 +1,8 @@
package cn.iocoder.yudao.module.system.service.tenant; package cn.iocoder.yudao.module.system.service.tenant;
import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.system.controller.admin.tenant.vo.packages.TenantPackageCreateReqVO;
import cn.iocoder.yudao.module.system.controller.admin.tenant.vo.packages.TenantPackagePageReqVO; import cn.iocoder.yudao.module.system.controller.admin.tenant.vo.packages.TenantPackagePageReqVO;
import cn.iocoder.yudao.module.system.controller.admin.tenant.vo.packages.TenantPackageUpdateReqVO; import cn.iocoder.yudao.module.system.controller.admin.tenant.vo.packages.TenantPackageSaveReqVO;
import cn.iocoder.yudao.module.system.dal.dataobject.tenant.TenantPackageDO; import cn.iocoder.yudao.module.system.dal.dataobject.tenant.TenantPackageDO;
import javax.validation.Valid; import javax.validation.Valid;
@ -22,14 +21,14 @@ public interface TenantPackageService {
* @param createReqVO 创建信息 * @param createReqVO 创建信息
* @return 编号 * @return 编号
*/ */
Long createTenantPackage(@Valid TenantPackageCreateReqVO createReqVO); Long createTenantPackage(@Valid TenantPackageSaveReqVO createReqVO);
/** /**
* 更新租户套餐 * 更新租户套餐
* *
* @param updateReqVO 更新信息 * @param updateReqVO 更新信息
*/ */
void updateTenantPackage(@Valid TenantPackageUpdateReqVO updateReqVO); void updateTenantPackage(@Valid TenantPackageSaveReqVO updateReqVO);
/** /**
* 删除租户套餐 * 删除租户套餐

View File

@ -3,10 +3,9 @@ package cn.iocoder.yudao.module.system.service.tenant;
import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollUtil;
import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.system.controller.admin.tenant.vo.packages.TenantPackageCreateReqVO; import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.module.system.controller.admin.tenant.vo.packages.TenantPackagePageReqVO; import cn.iocoder.yudao.module.system.controller.admin.tenant.vo.packages.TenantPackagePageReqVO;
import cn.iocoder.yudao.module.system.controller.admin.tenant.vo.packages.TenantPackageUpdateReqVO; import cn.iocoder.yudao.module.system.controller.admin.tenant.vo.packages.TenantPackageSaveReqVO;
import cn.iocoder.yudao.module.system.convert.tenant.TenantPackageConvert;
import cn.iocoder.yudao.module.system.dal.dataobject.tenant.TenantDO; import cn.iocoder.yudao.module.system.dal.dataobject.tenant.TenantDO;
import cn.iocoder.yudao.module.system.dal.dataobject.tenant.TenantPackageDO; import cn.iocoder.yudao.module.system.dal.dataobject.tenant.TenantPackageDO;
import cn.iocoder.yudao.module.system.dal.mysql.tenant.TenantPackageMapper; import cn.iocoder.yudao.module.system.dal.mysql.tenant.TenantPackageMapper;
@ -38,9 +37,9 @@ public class TenantPackageServiceImpl implements TenantPackageService {
private TenantService tenantService; private TenantService tenantService;
@Override @Override
public Long createTenantPackage(TenantPackageCreateReqVO createReqVO) { public Long createTenantPackage(TenantPackageSaveReqVO createReqVO) {
// 插入 // 插入
TenantPackageDO tenantPackage = TenantPackageConvert.INSTANCE.convert(createReqVO); TenantPackageDO tenantPackage = BeanUtils.toBean(createReqVO, TenantPackageDO.class);
tenantPackageMapper.insert(tenantPackage); tenantPackageMapper.insert(tenantPackage);
// 返回 // 返回
return tenantPackage.getId(); return tenantPackage.getId();
@ -48,11 +47,11 @@ public class TenantPackageServiceImpl implements TenantPackageService {
@Override @Override
@DSTransactional // 多数据源使用 @DSTransactional 保证本地事务以及数据源的切换 @DSTransactional // 多数据源使用 @DSTransactional 保证本地事务以及数据源的切换
public void updateTenantPackage(TenantPackageUpdateReqVO updateReqVO) { public void updateTenantPackage(TenantPackageSaveReqVO updateReqVO) {
// 校验存在 // 校验存在
TenantPackageDO tenantPackage = validateTenantPackageExists(updateReqVO.getId()); TenantPackageDO tenantPackage = validateTenantPackageExists(updateReqVO.getId());
// 更新 // 更新
TenantPackageDO updateObj = TenantPackageConvert.INSTANCE.convert(updateReqVO); TenantPackageDO updateObj = BeanUtils.toBean(updateReqVO, TenantPackageDO.class);
tenantPackageMapper.updateById(updateObj); tenantPackageMapper.updateById(updateObj);
// 如果菜单发生变化则修改每个租户的菜单 // 如果菜单发生变化则修改每个租户的菜单
if (!CollUtil.isEqualList(tenantPackage.getMenuIds(), updateReqVO.getMenuIds())) { if (!CollUtil.isEqualList(tenantPackage.getMenuIds(), updateReqVO.getMenuIds())) {

View File

@ -2,10 +2,8 @@ package cn.iocoder.yudao.module.system.service.tenant;
import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.tenant.core.context.TenantContextHolder; import cn.iocoder.yudao.framework.tenant.core.context.TenantContextHolder;
import cn.iocoder.yudao.module.system.controller.admin.tenant.vo.tenant.TenantCreateReqVO;
import cn.iocoder.yudao.module.system.controller.admin.tenant.vo.tenant.TenantExportReqVO;
import cn.iocoder.yudao.module.system.controller.admin.tenant.vo.tenant.TenantPageReqVO; import cn.iocoder.yudao.module.system.controller.admin.tenant.vo.tenant.TenantPageReqVO;
import cn.iocoder.yudao.module.system.controller.admin.tenant.vo.tenant.TenantUpdateReqVO; import cn.iocoder.yudao.module.system.controller.admin.tenant.vo.tenant.TenantSaveReqVO;
import cn.iocoder.yudao.module.system.dal.dataobject.tenant.TenantDO; import cn.iocoder.yudao.module.system.dal.dataobject.tenant.TenantDO;
import cn.iocoder.yudao.module.system.service.tenant.handler.TenantInfoHandler; import cn.iocoder.yudao.module.system.service.tenant.handler.TenantInfoHandler;
import cn.iocoder.yudao.module.system.service.tenant.handler.TenantMenuHandler; import cn.iocoder.yudao.module.system.service.tenant.handler.TenantMenuHandler;
@ -27,14 +25,14 @@ public interface TenantService {
* @param createReqVO 创建信息 * @param createReqVO 创建信息
* @return 编号 * @return 编号
*/ */
Long createTenant(@Valid TenantCreateReqVO createReqVO); Long createTenant(@Valid TenantSaveReqVO createReqVO);
/** /**
* 更新租户 * 更新租户
* *
* @param updateReqVO 更新信息 * @param updateReqVO 更新信息
*/ */
void updateTenant(@Valid TenantUpdateReqVO updateReqVO); void updateTenant(@Valid TenantSaveReqVO updateReqVO);
/** /**
* 更新租户的角色菜单 * 更新租户的角色菜单
@ -67,14 +65,6 @@ public interface TenantService {
*/ */
PageResult<TenantDO> getTenantPage(TenantPageReqVO pageReqVO); PageResult<TenantDO> getTenantPage(TenantPageReqVO pageReqVO);
/**
* 获得租户列表, 用于 Excel 导出
*
* @param exportReqVO 查询条件
* @return 租户列表
*/
List<TenantDO> getTenantList(TenantExportReqVO exportReqVO);
/** /**
* 获得名字对应的租户 * 获得名字对应的租户
* *

View File

@ -8,14 +8,13 @@ import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
import cn.iocoder.yudao.framework.common.util.date.DateUtils; import cn.iocoder.yudao.framework.common.util.date.DateUtils;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.framework.tenant.config.TenantProperties; import cn.iocoder.yudao.framework.tenant.config.TenantProperties;
import cn.iocoder.yudao.framework.tenant.core.context.TenantContextHolder; import cn.iocoder.yudao.framework.tenant.core.context.TenantContextHolder;
import cn.iocoder.yudao.framework.tenant.core.util.TenantUtils; import cn.iocoder.yudao.framework.tenant.core.util.TenantUtils;
import cn.iocoder.yudao.module.system.controller.admin.permission.vo.role.RoleSaveReqVO; import cn.iocoder.yudao.module.system.controller.admin.permission.vo.role.RoleSaveReqVO;
import cn.iocoder.yudao.module.system.controller.admin.tenant.vo.tenant.TenantCreateReqVO;
import cn.iocoder.yudao.module.system.controller.admin.tenant.vo.tenant.TenantExportReqVO;
import cn.iocoder.yudao.module.system.controller.admin.tenant.vo.tenant.TenantPageReqVO; import cn.iocoder.yudao.module.system.controller.admin.tenant.vo.tenant.TenantPageReqVO;
import cn.iocoder.yudao.module.system.controller.admin.tenant.vo.tenant.TenantUpdateReqVO; import cn.iocoder.yudao.module.system.controller.admin.tenant.vo.tenant.TenantSaveReqVO;
import cn.iocoder.yudao.module.system.convert.tenant.TenantConvert; import cn.iocoder.yudao.module.system.convert.tenant.TenantConvert;
import cn.iocoder.yudao.module.system.dal.dataobject.permission.MenuDO; import cn.iocoder.yudao.module.system.dal.dataobject.permission.MenuDO;
import cn.iocoder.yudao.module.system.dal.dataobject.permission.RoleDO; import cn.iocoder.yudao.module.system.dal.dataobject.permission.RoleDO;
@ -97,7 +96,7 @@ public class TenantServiceImpl implements TenantService {
@Override @Override
@DSTransactional // 多数据源使用 @DSTransactional 保证本地事务以及数据源的切换 @DSTransactional // 多数据源使用 @DSTransactional 保证本地事务以及数据源的切换
public Long createTenant(TenantCreateReqVO createReqVO) { public Long createTenant(TenantSaveReqVO createReqVO) {
// 校验租户名称是否重复 // 校验租户名称是否重复
validTenantNameDuplicate(createReqVO.getName(), null); validTenantNameDuplicate(createReqVO.getName(), null);
// 校验租户域名是否重复 // 校验租户域名是否重复
@ -106,9 +105,9 @@ public class TenantServiceImpl implements TenantService {
TenantPackageDO tenantPackage = tenantPackageService.validTenantPackage(createReqVO.getPackageId()); TenantPackageDO tenantPackage = tenantPackageService.validTenantPackage(createReqVO.getPackageId());
// 创建租户 // 创建租户
TenantDO tenant = TenantConvert.INSTANCE.convert(createReqVO); TenantDO tenant = BeanUtils.toBean(createReqVO, TenantDO.class);
tenantMapper.insert(tenant); tenantMapper.insert(tenant);
// 创建租户的管理员
TenantUtils.execute(tenant.getId(), () -> { TenantUtils.execute(tenant.getId(), () -> {
// 创建角色 // 创建角色
Long roleId = createRole(tenantPackage); Long roleId = createRole(tenantPackage);
@ -120,7 +119,7 @@ public class TenantServiceImpl implements TenantService {
return tenant.getId(); return tenant.getId();
} }
private Long createUser(Long roleId, TenantCreateReqVO createReqVO) { private Long createUser(Long roleId, TenantSaveReqVO createReqVO) {
// 创建用户 // 创建用户
Long userId = userService.createUser(TenantConvert.INSTANCE.convert02(createReqVO)); Long userId = userService.createUser(TenantConvert.INSTANCE.convert02(createReqVO));
// 分配角色 // 分配角色
@ -140,8 +139,8 @@ public class TenantServiceImpl implements TenantService {
} }
@Override @Override
@DSTransactional @DSTransactional // 多数据源使用 @DSTransactional 保证本地事务以及数据源的切换
public void updateTenant(TenantUpdateReqVO updateReqVO) { public void updateTenant(TenantSaveReqVO updateReqVO) {
// 校验存在 // 校验存在
TenantDO tenant = validateUpdateTenant(updateReqVO.getId()); TenantDO tenant = validateUpdateTenant(updateReqVO.getId());
// 校验租户名称是否重复 // 校验租户名称是否重复
@ -152,7 +151,7 @@ public class TenantServiceImpl implements TenantService {
TenantPackageDO tenantPackage = tenantPackageService.validTenantPackage(updateReqVO.getPackageId()); TenantPackageDO tenantPackage = tenantPackageService.validTenantPackage(updateReqVO.getPackageId());
// 更新租户 // 更新租户
TenantDO updateObj = TenantConvert.INSTANCE.convert(updateReqVO); TenantDO updateObj = BeanUtils.toBean(updateReqVO, TenantDO.class);
tenantMapper.updateById(updateObj); tenantMapper.updateById(updateObj);
// 如果套餐发生变化则修改其角色的权限 // 如果套餐发生变化则修改其角色的权限
if (ObjectUtil.notEqual(tenant.getPackageId(), updateReqVO.getPackageId())) { if (ObjectUtil.notEqual(tenant.getPackageId(), updateReqVO.getPackageId())) {
@ -246,11 +245,6 @@ public class TenantServiceImpl implements TenantService {
return tenantMapper.selectPage(pageReqVO); return tenantMapper.selectPage(pageReqVO);
} }
@Override
public List<TenantDO> getTenantList(TenantExportReqVO exportReqVO) {
return tenantMapper.selectList(exportReqVO);
}
@Override @Override
public TenantDO getTenantByName(String name) { public TenantDO getTenantByName(String name) {
return tenantMapper.selectByName(name); return tenantMapper.selectByName(name);

View File

@ -3,9 +3,8 @@ package cn.iocoder.yudao.module.system.service.tenant;
import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest; import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest;
import cn.iocoder.yudao.module.system.controller.admin.tenant.vo.packages.TenantPackageCreateReqVO;
import cn.iocoder.yudao.module.system.controller.admin.tenant.vo.packages.TenantPackagePageReqVO; import cn.iocoder.yudao.module.system.controller.admin.tenant.vo.packages.TenantPackagePageReqVO;
import cn.iocoder.yudao.module.system.controller.admin.tenant.vo.packages.TenantPackageUpdateReqVO; import cn.iocoder.yudao.module.system.controller.admin.tenant.vo.packages.TenantPackageSaveReqVO;
import cn.iocoder.yudao.module.system.dal.dataobject.tenant.TenantDO; import cn.iocoder.yudao.module.system.dal.dataobject.tenant.TenantDO;
import cn.iocoder.yudao.module.system.dal.dataobject.tenant.TenantPackageDO; import cn.iocoder.yudao.module.system.dal.dataobject.tenant.TenantPackageDO;
import cn.iocoder.yudao.module.system.dal.mysql.tenant.TenantPackageMapper; import cn.iocoder.yudao.module.system.dal.mysql.tenant.TenantPackageMapper;
@ -21,8 +20,7 @@ import static cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils.bui
import static cn.iocoder.yudao.framework.common.util.object.ObjectUtils.cloneIgnoreId; import static cn.iocoder.yudao.framework.common.util.object.ObjectUtils.cloneIgnoreId;
import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals; import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals;
import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException; import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException;
import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomLongId; import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.*;
import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo;
import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.*; import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.*;
import static java.util.Arrays.asList; import static java.util.Arrays.asList;
import static org.junit.jupiter.api.Assertions.*; import static org.junit.jupiter.api.Assertions.*;
@ -50,7 +48,9 @@ public class TenantPackageServiceImplTest extends BaseDbUnitTest {
@Test @Test
public void testCreateTenantPackage_success() { public void testCreateTenantPackage_success() {
// 准备参数 // 准备参数
TenantPackageCreateReqVO reqVO = randomPojo(TenantPackageCreateReqVO.class); TenantPackageSaveReqVO reqVO = randomPojo(TenantPackageSaveReqVO.class,
o -> o.setStatus(randomCommonStatus()))
.setId(null); // 防止 id 被赋值
// 调用 // 调用
Long tenantPackageId = tenantPackageService.createTenantPackage(reqVO); Long tenantPackageId = tenantPackageService.createTenantPackage(reqVO);
@ -58,17 +58,19 @@ public class TenantPackageServiceImplTest extends BaseDbUnitTest {
assertNotNull(tenantPackageId); assertNotNull(tenantPackageId);
// 校验记录的属性是否正确 // 校验记录的属性是否正确
TenantPackageDO tenantPackage = tenantPackageMapper.selectById(tenantPackageId); TenantPackageDO tenantPackage = tenantPackageMapper.selectById(tenantPackageId);
assertPojoEquals(reqVO, tenantPackage); assertPojoEquals(reqVO, tenantPackage, "id");
} }
@Test @Test
public void testUpdateTenantPackage_success() { public void testUpdateTenantPackage_success() {
// mock 数据 // mock 数据
TenantPackageDO dbTenantPackage = randomPojo(TenantPackageDO.class); TenantPackageDO dbTenantPackage = randomPojo(TenantPackageDO.class,
o -> o.setStatus(randomCommonStatus()));
tenantPackageMapper.insert(dbTenantPackage);// @Sql: 先插入出一条存在的数据 tenantPackageMapper.insert(dbTenantPackage);// @Sql: 先插入出一条存在的数据
// 准备参数 // 准备参数
TenantPackageUpdateReqVO reqVO = randomPojo(TenantPackageUpdateReqVO.class, o -> { TenantPackageSaveReqVO reqVO = randomPojo(TenantPackageSaveReqVO.class, o -> {
o.setId(dbTenantPackage.getId()); // 设置更新的 ID o.setId(dbTenantPackage.getId()); // 设置更新的 ID
o.setStatus(randomCommonStatus());
}); });
// mock 方法 // mock 方法
Long tenantId01 = randomLongId(); Long tenantId01 = randomLongId();
@ -90,7 +92,7 @@ public class TenantPackageServiceImplTest extends BaseDbUnitTest {
@Test @Test
public void testUpdateTenantPackage_notExists() { public void testUpdateTenantPackage_notExists() {
// 准备参数 // 准备参数
TenantPackageUpdateReqVO reqVO = randomPojo(TenantPackageUpdateReqVO.class); TenantPackageSaveReqVO reqVO = randomPojo(TenantPackageSaveReqVO.class);
// 调用, 并断言异常 // 调用, 并断言异常
assertServiceException(() -> tenantPackageService.updateTenantPackage(reqVO), TENANT_PACKAGE_NOT_EXISTS); assertServiceException(() -> tenantPackageService.updateTenantPackage(reqVO), TENANT_PACKAGE_NOT_EXISTS);

View File

@ -5,10 +5,8 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.tenant.config.TenantProperties; import cn.iocoder.yudao.framework.tenant.config.TenantProperties;
import cn.iocoder.yudao.framework.tenant.core.context.TenantContextHolder; import cn.iocoder.yudao.framework.tenant.core.context.TenantContextHolder;
import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest; import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest;
import cn.iocoder.yudao.module.system.controller.admin.tenant.vo.tenant.TenantCreateReqVO;
import cn.iocoder.yudao.module.system.controller.admin.tenant.vo.tenant.TenantExportReqVO;
import cn.iocoder.yudao.module.system.controller.admin.tenant.vo.tenant.TenantPageReqVO; import cn.iocoder.yudao.module.system.controller.admin.tenant.vo.tenant.TenantPageReqVO;
import cn.iocoder.yudao.module.system.controller.admin.tenant.vo.tenant.TenantUpdateReqVO; import cn.iocoder.yudao.module.system.controller.admin.tenant.vo.tenant.TenantSaveReqVO;
import cn.iocoder.yudao.module.system.dal.dataobject.permission.MenuDO; import cn.iocoder.yudao.module.system.dal.dataobject.permission.MenuDO;
import cn.iocoder.yudao.module.system.dal.dataobject.permission.RoleDO; import cn.iocoder.yudao.module.system.dal.dataobject.permission.RoleDO;
import cn.iocoder.yudao.module.system.dal.dataobject.tenant.TenantDO; import cn.iocoder.yudao.module.system.dal.dataobject.tenant.TenantDO;
@ -152,7 +150,7 @@ public class TenantServiceImplTest extends BaseDbUnitTest {
}))).thenReturn(300L); }))).thenReturn(300L);
// 准备参数 // 准备参数
TenantCreateReqVO reqVO = randomPojo(TenantCreateReqVO.class, o -> { TenantSaveReqVO reqVO = randomPojo(TenantSaveReqVO.class, o -> {
o.setContactName("芋道"); o.setContactName("芋道");
o.setContactMobile("15601691300"); o.setContactMobile("15601691300");
o.setPackageId(100L); o.setPackageId(100L);
@ -160,7 +158,7 @@ public class TenantServiceImplTest extends BaseDbUnitTest {
o.setWebsite("https://www.iocoder.cn"); o.setWebsite("https://www.iocoder.cn");
o.setUsername("yunai"); o.setUsername("yunai");
o.setPassword("yuanma"); o.setPassword("yuanma");
}); }).setId(null); // 设置为 null方便后面校验
// 调用 // 调用
Long tenantId = tenantService.createTenant(reqVO); Long tenantId = tenantService.createTenant(reqVO);
@ -168,7 +166,7 @@ public class TenantServiceImplTest extends BaseDbUnitTest {
assertNotNull(tenantId); assertNotNull(tenantId);
// 校验记录的属性是否正确 // 校验记录的属性是否正确
TenantDO tenant = tenantMapper.selectById(tenantId); TenantDO tenant = tenantMapper.selectById(tenantId);
assertPojoEquals(reqVO, tenant); assertPojoEquals(reqVO, tenant, "id");
assertEquals(300L, tenant.getContactUserId()); assertEquals(300L, tenant.getContactUserId());
// verify 分配权限 // verify 分配权限
verify(permissionService).assignRoleMenu(eq(200L), same(tenantPackage.getMenuIds())); verify(permissionService).assignRoleMenu(eq(200L), same(tenantPackage.getMenuIds()));
@ -182,7 +180,7 @@ public class TenantServiceImplTest extends BaseDbUnitTest {
TenantDO dbTenant = randomPojo(TenantDO.class, o -> o.setStatus(randomCommonStatus())); TenantDO dbTenant = randomPojo(TenantDO.class, o -> o.setStatus(randomCommonStatus()));
tenantMapper.insert(dbTenant);// @Sql: 先插入出一条存在的数据 tenantMapper.insert(dbTenant);// @Sql: 先插入出一条存在的数据
// 准备参数 // 准备参数
TenantUpdateReqVO reqVO = randomPojo(TenantUpdateReqVO.class, o -> { TenantSaveReqVO reqVO = randomPojo(TenantSaveReqVO.class, o -> {
o.setId(dbTenant.getId()); // 设置更新的 ID o.setId(dbTenant.getId()); // 设置更新的 ID
o.setStatus(randomCommonStatus()); o.setStatus(randomCommonStatus());
o.setWebsite(randomString()); o.setWebsite(randomString());
@ -214,7 +212,7 @@ public class TenantServiceImplTest extends BaseDbUnitTest {
@Test @Test
public void testUpdateTenant_notExists() { public void testUpdateTenant_notExists() {
// 准备参数 // 准备参数
TenantUpdateReqVO reqVO = randomPojo(TenantUpdateReqVO.class); TenantSaveReqVO reqVO = randomPojo(TenantSaveReqVO.class);
// 调用, 并断言异常 // 调用, 并断言异常
assertServiceException(() -> tenantService.updateTenant(reqVO), TENANT_NOT_EXISTS); assertServiceException(() -> tenantService.updateTenant(reqVO), TENANT_NOT_EXISTS);
@ -226,7 +224,7 @@ public class TenantServiceImplTest extends BaseDbUnitTest {
TenantDO dbTenant = randomPojo(TenantDO.class, o -> o.setPackageId(PACKAGE_ID_SYSTEM)); TenantDO dbTenant = randomPojo(TenantDO.class, o -> o.setPackageId(PACKAGE_ID_SYSTEM));
tenantMapper.insert(dbTenant);// @Sql: 先插入出一条存在的数据 tenantMapper.insert(dbTenant);// @Sql: 先插入出一条存在的数据
// 准备参数 // 准备参数
TenantUpdateReqVO reqVO = randomPojo(TenantUpdateReqVO.class, o -> { TenantSaveReqVO reqVO = randomPojo(TenantSaveReqVO.class, o -> {
o.setId(dbTenant.getId()); // 设置更新的 ID o.setId(dbTenant.getId()); // 设置更新的 ID
}); });
@ -321,42 +319,6 @@ public class TenantServiceImplTest extends BaseDbUnitTest {
assertPojoEquals(dbTenant, pageResult.getList().get(0)); assertPojoEquals(dbTenant, pageResult.getList().get(0));
} }
@Test
public void testGetTenantList() {
// mock 数据
TenantDO dbTenant = randomPojo(TenantDO.class, o -> { // 等会查询到
o.setName("芋道源码");
o.setContactName("芋艿");
o.setContactMobile("15601691300");
o.setStatus(CommonStatusEnum.ENABLE.getStatus());
o.setCreateTime(buildTime(2020, 12, 12));
});
tenantMapper.insert(dbTenant);
// 测试 name 不匹配
tenantMapper.insert(cloneIgnoreId(dbTenant, o -> o.setName(randomString())));
// 测试 contactName 不匹配
tenantMapper.insert(cloneIgnoreId(dbTenant, o -> o.setContactName(randomString())));
// 测试 contactMobile 不匹配
tenantMapper.insert(cloneIgnoreId(dbTenant, o -> o.setContactMobile(randomString())));
// 测试 status 不匹配
tenantMapper.insert(cloneIgnoreId(dbTenant, o -> o.setStatus(CommonStatusEnum.DISABLE.getStatus())));
// 测试 createTime 不匹配
tenantMapper.insert(cloneIgnoreId(dbTenant, o -> o.setCreateTime(buildTime(2021, 12, 12))));
// 准备参数
TenantExportReqVO reqVO = new TenantExportReqVO();
reqVO.setName("芋道");
reqVO.setContactName("");
reqVO.setContactMobile("1560");
reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus());
reqVO.setCreateTime(buildBetweenTime(2020, 12, 1, 2020, 12, 24));
// 调用
List<TenantDO> list = tenantService.getTenantList(reqVO);
// 断言
assertEquals(1, list.size());
assertPojoEquals(dbTenant, list.get(0));
}
@Test @Test
public void testGetTenantByName() { public void testGetTenantByName() {
// mock 数据 // mock 数据