Browse Source

🔧 简化 tenant 模块的 VO

YunaiV 1 year ago
parent
commit
d4cf945af7
22 changed files with 161 additions and 357 deletions
  1. 18 13
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/tenant/TenantController.java
  2. 7 8
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/tenant/TenantPackageController.java
  3. 0 14
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/tenant/vo/packages/TenantPackageCreateReqVO.java
  4. 14 5
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/tenant/vo/packages/TenantPackageRespVO.java
  5. 10 6
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/tenant/vo/packages/TenantPackageSaveReqVO.java
  6. 0 17
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/tenant/vo/packages/TenantPackageUpdateReqVO.java
  7. 0 29
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/tenant/vo/tenant/TenantCreateReqVO.java
  8. 0 39
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/tenant/vo/tenant/TenantExcelVO.java
  9. 0 31
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/tenant/vo/tenant/TenantExportReqVO.java
  10. 39 4
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/tenant/vo/tenant/TenantRespVO.java
  11. 31 7
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/tenant/vo/tenant/TenantSaveReqVO.java
  12. 1 5
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/tenant/vo/tenant/TenantSimpleRespVO.java
  13. 0 17
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/tenant/vo/tenant/TenantUpdateReqVO.java
  14. 2 20
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/convert/tenant/TenantConvert.java
  15. 0 37
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/convert/tenant/TenantPackageConvert.java
  16. 0 11
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/tenant/TenantMapper.java
  17. 3 4
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/tenant/TenantPackageService.java
  18. 6 7
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/tenant/TenantPackageServiceImpl.java
  19. 3 13
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/tenant/TenantService.java
  20. 9 15
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/tenant/TenantServiceImpl.java
  21. 11 10
      yudao-module-system/yudao-module-system-biz/src/test/java/cn/iocoder/yudao/module/system/service/tenant/TenantPackageServiceImplTest.java
  22. 7 45
      yudao-module-system/yudao-module-system-biz/src/test/java/cn/iocoder/yudao/module/system/service/tenant/TenantServiceImplTest.java

+ 18 - 13
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/tenant/TenantController.java

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

+ 7 - 8
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/tenant/TenantPackageController.java

@@ -3,8 +3,8 @@ package cn.iocoder.yudao.module.system.controller.admin.tenant;
 import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
 import cn.iocoder.yudao.module.system.controller.admin.tenant.vo.packages.*;
-import cn.iocoder.yudao.module.system.convert.tenant.TenantPackageConvert;
 import cn.iocoder.yudao.module.system.dal.dataobject.tenant.TenantPackageDO;
 import cn.iocoder.yudao.module.system.service.tenant.TenantPackageService;
 import io.swagger.v3.oas.annotations.tags.Tag;
@@ -32,14 +32,14 @@ public class TenantPackageController {
     @PostMapping("/create")
     @Operation(summary = "创建租户套餐")
     @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));
     }
 
     @PutMapping("/update")
     @Operation(summary = "更新租户套餐")
     @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);
         return success(true);
     }
@@ -59,7 +59,7 @@ public class TenantPackageController {
     @PreAuthorize("@ss.hasPermission('system:tenant-package:query')")
     public CommonResult<TenantPackageRespVO> getTenantPackage(@RequestParam("id") Long id) {
         TenantPackageDO tenantPackage = tenantPackageService.getTenantPackage(id);
-        return success(TenantPackageConvert.INSTANCE.convert(tenantPackage));
+        return success(BeanUtils.toBean(tenantPackage, TenantPackageRespVO.class));
     }
 
     @GetMapping("/page")
@@ -67,15 +67,14 @@ public class TenantPackageController {
     @PreAuthorize("@ss.hasPermission('system:tenant-package:query')")
     public CommonResult<PageResult<TenantPackageRespVO>> getTenantPackagePage(@Valid TenantPackagePageReqVO 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 = "只包含被开启的租户套餐,主要用于前端的下拉选项")
     public CommonResult<List<TenantPackageSimpleRespVO>> getTenantPackageList() {
-        // 获得角色列表,只要开启状态的
         List<TenantPackageDO> list = tenantPackageService.getTenantPackageListByStatus(CommonStatusEnum.ENABLE.getStatus());
-        return success(TenantPackageConvert.INSTANCE.convertList02(list));
+        return success(BeanUtils.toBean(list, TenantPackageSimpleRespVO.class));
     }
 
 }

+ 0 - 14
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/tenant/vo/packages/TenantPackageCreateReqVO.java

@@ -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 {
-
-}

+ 14 - 5
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/tenant/vo/packages/TenantPackageRespVO.java

@@ -2,20 +2,29 @@ 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;
 
 import java.time.LocalDateTime;
+import java.util.Set;
 
 @Schema(description = "管理后台 - 租户套餐 Response VO")
 @Data
-@EqualsAndHashCode(callSuper = true)
-@ToString(callSuper = true)
-public class TenantPackageRespVO extends TenantPackageBaseVO {
+public class TenantPackageRespVO {
 
     @Schema(description = "套餐编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
     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)
     private LocalDateTime createTime;
 

+ 10 - 6
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/tenant/vo/packages/TenantPackageBaseVO.java → yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/tenant/vo/packages/TenantPackageSaveReqVO.java

@@ -1,24 +1,28 @@
 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 lombok.Data;
 
+import javax.validation.constraints.NotEmpty;
 import javax.validation.constraints.NotNull;
 import java.util.Set;
 
-/**
- * 租户套餐 Base VO,提供给添加、修改、详细的子 VO 使用
- * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成
- */
+@Schema(description = "管理后台 - 租户套餐创建/修改 Request VO")
 @Data
-public class TenantPackageBaseVO {
+public class TenantPackageSaveReqVO {
+
+    @Schema(description = "套餐编号", example = "1024")
+    private Long id;
 
     @Schema(description = "套餐名", requiredMode = Schema.RequiredMode.REQUIRED, example = "VIP")
-    @NotNull(message = "套餐名不能为空")
+    @NotEmpty(message = "套餐名不能为空")
     private String name;
 
     @Schema(description = "状态,参见 CommonStatusEnum 枚举", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
     @NotNull(message = "状态不能为空")
+    @InEnum(value = CommonStatusEnum.class, message = "状态必须是 {value}")
     private Integer status;
 
     @Schema(description = "备注", example = "好")

+ 0 - 17
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/tenant/vo/packages/TenantPackageUpdateReqVO.java

@@ -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;
-
-}

+ 0 - 29
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/tenant/vo/tenant/TenantCreateReqVO.java

@@ -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;
-
-}

+ 0 - 39
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/tenant/vo/tenant/TenantExcelVO.java

@@ -1,39 +0,0 @@
-package cn.iocoder.yudao.module.system.controller.admin.tenant.vo.tenant;
-
-import cn.iocoder.yudao.module.system.enums.DictTypeConstants;
-import lombok.*;
-import java.time.LocalDateTime;
-
-import com.alibaba.excel.annotation.ExcelProperty;
-import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat;
-import cn.iocoder.yudao.framework.excel.core.convert.DictConvert;
-
-
-/**
- * 租户 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;
-
-}

+ 0 - 31
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/tenant/vo/tenant/TenantExportReqVO.java

@@ -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;
-
-}

+ 39 - 4
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/tenant/vo/tenant/TenantRespVO.java

@@ -1,20 +1,55 @@
 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 lombok.*;
+import lombok.Data;
 
 import java.time.LocalDateTime;
 
 @Schema(description = "管理后台 - 租户 Response VO")
 @Data
-@EqualsAndHashCode(callSuper = true)
-@ToString(callSuper = true)
-public class TenantRespVO extends TenantBaseVO {
+@ExcelIgnoreUnannotated
+public class TenantRespVO {
 
     @Schema(description = "租户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
+    @ExcelProperty("租户编号")
     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)
+    @ExcelProperty("创建时间")
     private LocalDateTime createTime;
 
 }

+ 31 - 7
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/tenant/vo/tenant/TenantBaseVO.java → yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/tenant/vo/tenant/TenantSaveReqVO.java

@@ -1,17 +1,23 @@
 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 lombok.*;
+import lombok.Data;
+import org.hibernate.validator.constraints.Length;
 
-import javax.validation.constraints.*;
+import javax.validation.constraints.AssertTrue;
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Pattern;
+import javax.validation.constraints.Size;
 import java.time.LocalDateTime;
 
-/**
- * 租户 Base VO,提供给添加、修改、详细的子 VO 使用
- * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成
- */
+@Schema(description = "管理后台 - 租户创建/修改 Request VO")
 @Data
-public class TenantBaseVO {
+public class TenantSaveReqVO {
+
+    @Schema(description = "租户编号", example = "1024")
+    private Long id;
 
     @Schema(description = "租户名", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋道")
     @NotNull(message = "租户名不能为空")
@@ -43,4 +49,22 @@ public class TenantBaseVO {
     @NotNull(message = "账号数量不能为空")
     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)); // 新增时,必须都传递 username、password
+    }
+
 }

+ 1 - 5
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/tenant/vo/tenant/TenantSimpleRespVO.java

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

+ 0 - 17
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/tenant/vo/tenant/TenantUpdateReqVO.java

@@ -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;
-
-}

+ 2 - 20
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/convert/tenant/TenantConvert.java

@@ -1,14 +1,10 @@
 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.*;
+import cn.iocoder.yudao.module.system.controller.admin.tenant.vo.tenant.TenantSaveReqVO;
 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.factory.Mappers;
 
-import java.util.List;
-
 /**
  * 租户 Convert
  *
@@ -19,21 +15,7 @@ public interface TenantConvert {
 
     TenantConvert INSTANCE = Mappers.getMapper(TenantConvert.class);
 
-    TenantDO convert(TenantCreateReqVO 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) {
+    default UserCreateReqVO convert02(TenantSaveReqVO bean) {
         UserCreateReqVO reqVO = new UserCreateReqVO();
         reqVO.setUsername(bean.getUsername());
         reqVO.setPassword(bean.getPassword());

+ 0 - 37
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/convert/tenant/TenantPackageConvert.java

@@ -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);
-
-}

+ 0 - 11
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/tenant/TenantMapper.java

@@ -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.mybatis.core.mapper.BaseMapperX;
 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.dal.dataobject.tenant.TenantDO;
 import org.apache.ibatis.annotations.Mapper;
@@ -28,16 +27,6 @@ public interface TenantMapper extends BaseMapperX<TenantDO> {
                 .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) {
         return selectOne(TenantDO::getName, name);
     }

+ 3 - 4
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/tenant/TenantPackageService.java

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

+ 6 - 7
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/tenant/TenantPackageServiceImpl.java

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

+ 3 - 13
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/tenant/TenantService.java

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

+ 9 - 15
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/tenant/TenantServiceImpl.java

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

+ 11 - 10
yudao-module-system/yudao-module-system-biz/src/test/java/cn/iocoder/yudao/module/system/service/tenant/TenantPackageServiceImplTest.java

@@ -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.pojo.PageResult;
 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.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.TenantPackageDO;
 import cn.iocoder.yudao.module.system.dal.mysql.tenant.TenantPackageMapper;
@@ -14,7 +13,6 @@ import org.springframework.boot.test.mock.mockito.MockBean;
 import org.springframework.context.annotation.Import;
 
 import javax.annotation.Resource;
-
 import java.util.List;
 
 import static cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils.buildBetweenTime;
@@ -22,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.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.RandomUtils.randomLongId;
-import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo;
+import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.*;
 import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.*;
 import static java.util.Arrays.asList;
 import static org.junit.jupiter.api.Assertions.*;
@@ -51,7 +48,9 @@ public class TenantPackageServiceImplTest extends BaseDbUnitTest {
     @Test
     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);
@@ -59,17 +58,19 @@ public class TenantPackageServiceImplTest extends BaseDbUnitTest {
         assertNotNull(tenantPackageId);
         // 校验记录的属性是否正确
         TenantPackageDO tenantPackage = tenantPackageMapper.selectById(tenantPackageId);
-        assertPojoEquals(reqVO, tenantPackage);
+        assertPojoEquals(reqVO, tenantPackage, "id");
     }
 
     @Test
     public void testUpdateTenantPackage_success() {
         // mock 数据
-        TenantPackageDO dbTenantPackage = randomPojo(TenantPackageDO.class);
+        TenantPackageDO dbTenantPackage = randomPojo(TenantPackageDO.class,
+                o -> o.setStatus(randomCommonStatus()));
         tenantPackageMapper.insert(dbTenantPackage);// @Sql: 先插入出一条存在的数据
         // 准备参数
-        TenantPackageUpdateReqVO reqVO = randomPojo(TenantPackageUpdateReqVO.class, o -> {
+        TenantPackageSaveReqVO reqVO = randomPojo(TenantPackageSaveReqVO.class, o -> {
             o.setId(dbTenantPackage.getId()); // 设置更新的 ID
+            o.setStatus(randomCommonStatus());
         });
         // mock 方法
         Long tenantId01 = randomLongId();
@@ -91,7 +92,7 @@ public class TenantPackageServiceImplTest extends BaseDbUnitTest {
     @Test
     public void testUpdateTenantPackage_notExists() {
         // 准备参数
-        TenantPackageUpdateReqVO reqVO = randomPojo(TenantPackageUpdateReqVO.class);
+        TenantPackageSaveReqVO reqVO = randomPojo(TenantPackageSaveReqVO.class);
 
         // 调用, 并断言异常
         assertServiceException(() -> tenantPackageService.updateTenantPackage(reqVO), TENANT_PACKAGE_NOT_EXISTS);

+ 7 - 45
yudao-module-system/yudao-module-system-biz/src/test/java/cn/iocoder/yudao/module/system/service/tenant/TenantServiceImplTest.java

@@ -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.core.context.TenantContextHolder;
 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.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.RoleDO;
 import cn.iocoder.yudao.module.system.dal.dataobject.tenant.TenantDO;
@@ -152,7 +150,7 @@ public class TenantServiceImplTest extends BaseDbUnitTest {
         }))).thenReturn(300L);
 
         // 准备参数
-        TenantCreateReqVO reqVO = randomPojo(TenantCreateReqVO.class, o -> {
+        TenantSaveReqVO reqVO = randomPojo(TenantSaveReqVO.class, o -> {
             o.setContactName("芋道");
             o.setContactMobile("15601691300");
             o.setPackageId(100L);
@@ -160,7 +158,7 @@ public class TenantServiceImplTest extends BaseDbUnitTest {
             o.setWebsite("https://www.iocoder.cn");
             o.setUsername("yunai");
             o.setPassword("yuanma");
-        });
+        }).setId(null); // 设置为 null,方便后面校验
 
         // 调用
         Long tenantId = tenantService.createTenant(reqVO);
@@ -168,7 +166,7 @@ public class TenantServiceImplTest extends BaseDbUnitTest {
         assertNotNull(tenantId);
         // 校验记录的属性是否正确
         TenantDO tenant = tenantMapper.selectById(tenantId);
-        assertPojoEquals(reqVO, tenant);
+        assertPojoEquals(reqVO, tenant, "id");
         assertEquals(300L, tenant.getContactUserId());
         // verify 分配权限
         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()));
         tenantMapper.insert(dbTenant);// @Sql: 先插入出一条存在的数据
         // 准备参数
-        TenantUpdateReqVO reqVO = randomPojo(TenantUpdateReqVO.class, o -> {
+        TenantSaveReqVO reqVO = randomPojo(TenantSaveReqVO.class, o -> {
             o.setId(dbTenant.getId()); // 设置更新的 ID
             o.setStatus(randomCommonStatus());
             o.setWebsite(randomString());
@@ -214,7 +212,7 @@ public class TenantServiceImplTest extends BaseDbUnitTest {
     @Test
     public void testUpdateTenant_notExists() {
         // 准备参数
-        TenantUpdateReqVO reqVO = randomPojo(TenantUpdateReqVO.class);
+        TenantSaveReqVO reqVO = randomPojo(TenantSaveReqVO.class);
 
         // 调用, 并断言异常
         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));
         tenantMapper.insert(dbTenant);// @Sql: 先插入出一条存在的数据
         // 准备参数
-        TenantUpdateReqVO reqVO = randomPojo(TenantUpdateReqVO.class, o -> {
+        TenantSaveReqVO reqVO = randomPojo(TenantSaveReqVO.class, o -> {
             o.setId(dbTenant.getId()); // 设置更新的 ID
         });
 
@@ -321,42 +319,6 @@ public class TenantServiceImplTest extends BaseDbUnitTest {
         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
     public void testGetTenantByName() {
         // mock 数据