Переглянути джерело

Merge remote-tracking branch 'origin/dev-V0.4.5' into dev-V0.4.5

jay 2 роки тому
батько
коміт
eda4285368
21 змінених файлів з 301 додано та 116 видалено
  1. 35 11
      .flattened-pom.xml
  2. 4 0
      iot-common/iot-common-core/.flattened-pom.xml
  3. 5 1
      iot-common/iot-common-dao/iot-data-service/src/main/java/cc/iotkit/data/system/ISysRoleDeptData.java
  4. 7 0
      iot-common/iot-common-dao/iot-data-service/src/main/java/cc/iotkit/data/system/ISysRoleMenuData.java
  5. 2 2
      iot-common/iot-common-dao/iot-data-service/src/main/java/cc/iotkit/data/system/ISysTenantData.java
  6. 6 0
      iot-common/iot-common-dao/iot-data-service/src/main/java/cc/iotkit/data/system/ISysUserRoleData.java
  7. 5 0
      iot-common/iot-common-dao/iot-data-serviceImpl-rdb/src/main/java/cc/iotkit/data/service/SysRoleDataImpl.java
  8. 10 2
      iot-common/iot-common-dao/iot-data-serviceImpl-rdb/src/main/java/cc/iotkit/data/service/SysRoleDeptDataImpl.java
  9. 16 1
      iot-common/iot-common-dao/iot-data-serviceImpl-rdb/src/main/java/cc/iotkit/data/service/SysRoleMenuDataImpl.java
  10. 53 3
      iot-common/iot-common-dao/iot-data-serviceImpl-rdb/src/main/java/cc/iotkit/data/service/SysTenantDataImpl.java
  11. 27 1
      iot-common/iot-common-dao/iot-data-serviceImpl-rdb/src/main/java/cc/iotkit/data/service/SysUserRoleDataImpl.java
  12. 1 1
      iot-common/iot-common-doc/.flattened-pom.xml
  13. 1 1
      iot-common/iot-common-log/.flattened-pom.xml
  14. 3 4
      iot-module/iot-system/src/main/java/cc/iotkit/system/controller/SysConfigController.java
  15. 10 11
      iot-module/iot-system/src/main/java/cc/iotkit/system/controller/SysTenantController.java
  16. 0 24
      iot-module/iot-system/src/main/java/cc/iotkit/system/dto/SysRoleDept.java
  17. 0 24
      iot-module/iot-system/src/main/java/cc/iotkit/system/dto/SysUserRole.java
  18. 3 3
      iot-module/iot-system/src/main/java/cc/iotkit/system/service/ISysRoleService.java
  19. 1 4
      iot-module/iot-system/src/main/java/cc/iotkit/system/service/impl/SysMenuServiceImpl.java
  20. 109 21
      iot-module/iot-system/src/main/java/cc/iotkit/system/service/impl/SysRoleServiceImpl.java
  21. 3 2
      iot-module/iot-system/src/main/java/cc/iotkit/system/service/impl/SysTenantServiceImpl.java

+ 35 - 11
.flattened-pom.xml

@@ -17,26 +17,30 @@
     <module>iot-test-tool</module>
   </modules>
   <properties>
-    <codec.version>1.14</codec.version>
-    <java.version>11</java.version>
     <easyexcel.version>3.2.1</easyexcel.version>
-    <io.version>2.11.0</io.version>
     <graalvm.version>21.1.0</graalvm.version>
     <vertx.version>4.2.2</vertx.version>
     <hutool.version>5.8.18</hutool.version>
     <jackson.version>2.13.1</jackson.version>
     <spring-boot.version>2.7.11</spring-boot.version>
-    <revision>0.4.5-SNAPSHOT</revision>
-    <mapstruct-plus.version>1.2.1</mapstruct-plus.version>
     <poi.version>5.2.3</poi.version>
-    <ip2region.version>2.7.0</ip2region.version>
-    <satoken.version>1.34.0</satoken.version>
+    <mapstruct-plus.version>1.2.1</mapstruct-plus.version>
     <lang3.version>3.7</lang3.version>
     <aws-java-sdk-s3.version>1.12.400</aws-java-sdk-s3.version>
-    <redisson.version>3.20.1</redisson.version>
     <alibaba-ttl.version>2.14.2</alibaba-ttl.version>
-    <beanutils.version>1.9.3</beanutils.version>
     <lock4j.version>2.2.4</lock4j.version>
+    <codec.version>1.14</codec.version>
+    <java.version>11</java.version>
+    <jap-comment.version>1.0.0</jap-comment.version>
+    <validateion.version>1.1.0.Final</validateion.version>
+    <io.version>2.11.0</io.version>
+    <knife4j.version>2.0.5</knife4j.version>
+    <revision>0.4.5-SNAPSHOT</revision>
+    <ip2region.version>2.7.0</ip2region.version>
+    <satoken.version>1.34.0</satoken.version>
+    <redisson.version>3.20.1</redisson.version>
+    <beanutils.version>1.9.3</beanutils.version>
+    <velocity.version>2.3</velocity.version>
   </properties>
   <dependencyManagement>
     <dependencies>
@@ -120,8 +124,8 @@
         <version>${satoken.version}</version>
         <exclusions>
           <exclusion>
-            <artifactId>hutool-all</artifactId>
             <groupId>cn.hutool</groupId>
+            <artifactId>hutool-all</artifactId>
           </exclusion>
         </exclusions>
       </dependency>
@@ -262,8 +266,8 @@
         <version>${easyexcel.version}</version>
         <exclusions>
           <exclusion>
-            <artifactId>poi-ooxml-schemas</artifactId>
             <groupId>org.apache.poi</groupId>
+            <artifactId>poi-ooxml-schemas</artifactId>
           </exclusion>
         </exclusions>
       </dependency>
@@ -422,6 +426,26 @@
         <artifactId>iot-virtual-device</artifactId>
         <version>${project.version}</version>
       </dependency>
+      <dependency>
+        <groupId>org.apache.velocity</groupId>
+        <artifactId>velocity-engine-core</artifactId>
+        <version>${velocity.version}</version>
+      </dependency>
+      <dependency>
+        <groupId>com.github.biyanwen</groupId>
+        <artifactId>jpa-comment-spring-boot-starter</artifactId>
+        <version>${jap-comment.version}</version>
+      </dependency>
+      <dependency>
+        <groupId>com.github.xiaoymin</groupId>
+        <artifactId>knife4j-spring-boot-starter</artifactId>
+        <version>${knife4j.version}</version>
+      </dependency>
+      <dependency>
+        <groupId>javax.validation</groupId>
+        <artifactId>validation-api</artifactId>
+        <version>${validateion.version}</version>
+      </dependency>
     </dependencies>
   </dependencyManagement>
   <build>

+ 4 - 0
iot-common/iot-common-core/.flattened-pom.xml

@@ -69,6 +69,10 @@
       <groupId>jakarta.validation</groupId>
       <artifactId>jakarta.validation-api</artifactId>
     </dependency>
+    <dependency>
+      <groupId>javax.validation</groupId>
+      <artifactId>validation-api</artifactId>
+    </dependency>
     <dependency>
       <groupId>org.slf4j</groupId>
       <artifactId>slf4j-api</artifactId>

+ 5 - 1
iot-common/iot-common-dao/iot-data-service/src/main/java/cc/iotkit/data/system/ISysRoleDeptData.java

@@ -3,6 +3,8 @@ package cc.iotkit.data.system;
 import cc.iotkit.data.ICommonData;
 import cc.iotkit.model.system.SysRoleDept;
 
+import java.util.List;
+
 /**
  * 操作日志数据接口
  *
@@ -10,6 +12,8 @@ import cc.iotkit.model.system.SysRoleDept;
  */
 public interface ISysRoleDeptData extends ICommonData<SysRoleDept, Long> {
 
-    void delete(Long roleId);
+    void deleteByRoleId(List<Long> roleIds);
+
+    long insertBatch(List<SysRoleDept> list);
 
 }

+ 7 - 0
iot-common/iot-common-dao/iot-data-service/src/main/java/cc/iotkit/data/system/ISysRoleMenuData.java

@@ -3,6 +3,8 @@ package cc.iotkit.data.system;
 import cc.iotkit.data.ICommonData;
 import cc.iotkit.model.system.SysRoleMenu;
 
+import java.util.List;
+
 /**
  * 操作日志数据接口
  *
@@ -10,4 +12,9 @@ import cc.iotkit.model.system.SysRoleMenu;
  */
 public interface ISysRoleMenuData extends ICommonData<SysRoleMenu, Long> {
     boolean checkMenuExistRole(Long menuId);
+
+    long insertBatch(List<SysRoleMenu> list);
+
+    long deleteByRoleId(List<Long> ids);
+
 }

+ 2 - 2
iot-common/iot-common-dao/iot-data-service/src/main/java/cc/iotkit/data/system/ISysTenantData.java

@@ -1,13 +1,13 @@
 package cc.iotkit.data.system;
 
 import cc.iotkit.data.ICommonData;
-import cc.iotkit.model.system.SysUser;
+import cc.iotkit.model.system.SysTenant;
 
 /**
  * 租户数据接口
  *
  * @author tfd
  */
-public interface ISysTenantData  extends ICommonData<SysUser, Long> {
+public interface ISysTenantData  extends ICommonData<SysTenant, Long> {
 
 }

+ 6 - 0
iot-common/iot-common-dao/iot-data-service/src/main/java/cc/iotkit/data/system/ISysUserRoleData.java

@@ -3,6 +3,8 @@ package cc.iotkit.data.system;
 import cc.iotkit.data.ICommonData;
 import cc.iotkit.model.system.SysUserRole;
 
+import java.util.List;
+
 /**
  * 用户角色数据接口
  *
@@ -24,4 +26,8 @@ public interface ISysUserRoleData extends ICommonData<SysUserRole, Long> {
      * @return 结果
      */
     long countUserRoleByRoleId(Long roleId);
+
+    long delete(Long roleId, List<Long> userIds);
+
+    long insertBatch(List<SysUserRole> list);
 }

+ 5 - 0
iot-common/iot-common-dao/iot-data-serviceImpl-rdb/src/main/java/cc/iotkit/data/service/SysRoleDataImpl.java

@@ -140,4 +140,9 @@ public class SysRoleDataImpl implements ISysRoleData {
                 .build();
 
     }
+
+    @Override
+    public void deleteById(Long id) {
+        jpaQueryFactory.delete(tbSysRole).where(tbSysRole.id.eq(id)).execute();
+    }
 }

+ 10 - 2
iot-common/iot-common-dao/iot-data-serviceImpl-rdb/src/main/java/cc/iotkit/data/service/SysRoleDeptDataImpl.java

@@ -2,11 +2,14 @@ package cc.iotkit.data.service;
 
 import cc.iotkit.data.system.ISysRoleDeptData;
 import cc.iotkit.data.util.PredicateBuilder;
+import cc.iotkit.model.system.SysRoleDept;
 import com.querydsl.jpa.impl.JPAQueryFactory;
 import lombok.RequiredArgsConstructor;
 import org.springframework.context.annotation.Primary;
 import org.springframework.stereotype.Service;
 
+import java.util.List;
+
 import static cc.iotkit.data.model.QTbSysRoleDept.tbSysRoleDept;
 
 /**
@@ -22,7 +25,12 @@ public class SysRoleDeptDataImpl implements ISysRoleDeptData {
     private final JPAQueryFactory jpaQueryFactory;
 
     @Override
-    public void delete(Long roleId) {
-        jpaQueryFactory.delete(tbSysRoleDept).where(PredicateBuilder.instance().and(tbSysRoleDept.roleId.eq(roleId)).build());
+    public void deleteByRoleId(List<Long> roleIds) {
+        jpaQueryFactory.delete(tbSysRoleDept).where(PredicateBuilder.instance().and(tbSysRoleDept.roleId.in(roleIds)).build());
+    }
+
+    @Override
+    public long insertBatch(List<SysRoleDept> list) {
+        return 0;
     }
 }

+ 16 - 1
iot-common/iot-common-dao/iot-data-serviceImpl-rdb/src/main/java/cc/iotkit/data/service/SysRoleMenuDataImpl.java

@@ -1,15 +1,20 @@
 package cc.iotkit.data.service;
 
+import cc.iotkit.common.utils.MapstructUtils;
 import cc.iotkit.data.model.QTbSysRoleMenu;
 import cc.iotkit.data.model.TbSysRoleMenu;
+import cc.iotkit.data.model.TbSysUserRole;
 import cc.iotkit.data.system.ISysRoleMenuData;
 import cc.iotkit.data.util.PredicateBuilder;
+import cc.iotkit.model.system.SysRoleMenu;
 import com.querydsl.jpa.impl.JPAQueryFactory;
 import lombok.RequiredArgsConstructor;
 import org.springframework.context.annotation.Primary;
 import org.springframework.stereotype.Service;
 
-import java.util.Objects;
+import java.util.*;
+
+import static cc.iotkit.data.model.QTbSysRoleMenu.tbSysRoleMenu;
 
 /**
  * author: 石恒
@@ -33,4 +38,14 @@ public class SysRoleMenuDataImpl implements ISysRoleMenuData {
                         .build()).fetchOne();
         return Objects.nonNull(tbSysRoleMenu);
     }
+
+    @Override
+    public long insertBatch(List<SysRoleMenu> list) {
+        return jpaQueryFactory.insert(tbSysRoleMenu).values(List.of(Objects.requireNonNull(MapstructUtils.convert(list, TbSysRoleMenu.class)))).execute();
+    }
+
+    @Override
+    public long deleteByRoleId(List<Long> ids) {
+        return jpaQueryFactory.delete(tbSysRoleMenu).where(tbSysRoleMenu.roleId.in(ids)).execute();
+    }
 }

+ 53 - 3
iot-common/iot-common-dao/iot-data-serviceImpl-rdb/src/main/java/cc/iotkit/data/service/SysTenantDataImpl.java

@@ -1,13 +1,22 @@
 package cc.iotkit.data.service;
 
 import cc.iotkit.common.utils.MapstructUtils;
+import cc.iotkit.common.utils.StringUtils;
 import cc.iotkit.data.dao.SysTenantRepository;
+import cc.iotkit.data.model.TbSysTenant;
 import cc.iotkit.data.system.ISysTenantData;
-import cc.iotkit.model.system.SysUser;
+import cc.iotkit.data.util.PredicateBuilder;
+import cc.iotkit.model.system.SysTenant;
+import com.querydsl.jpa.impl.JPAQueryFactory;
 import lombok.RequiredArgsConstructor;
 import org.springframework.context.annotation.Primary;
 import org.springframework.stereotype.Service;
 
+import java.util.Collection;
+import java.util.List;
+
+import static cc.iotkit.data.model.QTbSysTenant.tbSysTenant;
+
 /**
  * @Author:tfd
  * @Date:2023/5/31 9:45
@@ -19,8 +28,49 @@ public class SysTenantDataImpl implements ISysTenantData {
 
     private SysTenantRepository sysTenantRepository;
 
+    private final JPAQueryFactory jpaQueryFactory;
+
+    @Override
+    public SysTenant findById(Long aLong) {
+        return MapstructUtils.convert(sysTenantRepository.findById(aLong),SysTenant.class);
+    }
+
+    @Override
+    public SysTenant save(SysTenant data) {
+        return null;
+    }
+
+    @Override
+    public void batchSave(List<SysTenant> data) {
+
+    }
+
+    @Override
+    public void deleteById(Long aLong) {
+
+    }
+
+    @Override
+    public void deleteByIds(Collection<Long> longs) {
+
+    }
+
     @Override
-    public SysUser findById(Long aLong) {
-        return MapstructUtils.convert(sysTenantRepository.findById(aLong),SysUser.class);
+    public List<SysTenant> findAllByCondition(SysTenant data) {
+        List<TbSysTenant> ret=jpaQueryFactory.selectFrom(tbSysTenant).where(PredicateBuilder.instance()
+                .and(StringUtils.isNotBlank(data.getTenantId()),()->tbSysTenant.tenantId.eq(data.getTenantId()))
+                .and(StringUtils.isNotBlank(data.getContactUserName()),()->tbSysTenant.contactUserName.like(data.getContactUserName()))
+                .and(StringUtils.isNotBlank(data.getContactPhone()),()->tbSysTenant.contactPhone.eq(data.getContactPhone()))
+                .and(StringUtils.isNotBlank(data.getCompanyName()),()->tbSysTenant.companyName.like(data.getCompanyName()))
+                .and(StringUtils.isNotBlank(data.getLicenseNumber()),()->tbSysTenant.licenseNumber.eq(data.getLicenseNumber()))
+                .and(StringUtils.isNotBlank(data.getAddress()),()->tbSysTenant.address.eq(data.getAddress()))
+                .and(StringUtils.isNotBlank(data.getIntro()),()->tbSysTenant.intro.eq(data.getIntro()))
+                .and(StringUtils.isNotBlank(data.getDomain()),()->tbSysTenant.domain.like(data.getDomain()))
+                .and(data.getPackageId() != null,()->tbSysTenant.packageId.eq(data.getPackageId()))
+                .and(data.getExpireTime() != null,()->tbSysTenant.expireTime.eq(data.getExpireTime()))
+                .and(data.getAccountCount() != null,()->tbSysTenant.accountCount.eq(data.getAccountCount()))
+                .and(StringUtils.isNotBlank(data.getStatus()),()->tbSysTenant.status.eq(data.getStatus()))
+                .build()).fetch();
+        return MapstructUtils.convert(ret, SysTenant.class);
     }
 }

+ 27 - 1
iot-common/iot-common-dao/iot-data-serviceImpl-rdb/src/main/java/cc/iotkit/data/service/SysUserRoleDataImpl.java

@@ -1,18 +1,31 @@
 package cc.iotkit.data.service;
 
+import cc.iotkit.common.utils.MapstructUtils;
 import cc.iotkit.data.dao.SysUserRoleRepository;
+import cc.iotkit.data.model.TbSysUserRole;
 import cc.iotkit.data.system.ISysUserRoleData;
+import cc.iotkit.data.util.PredicateBuilder;
+import cc.iotkit.model.system.SysUserRole;
+import com.querydsl.jpa.impl.JPAQueryFactory;
+import lombok.RequiredArgsConstructor;
 import org.springframework.beans.factory.annotation.Autowired;
 
+import java.util.List;
+import java.util.Objects;
+
+import static cc.iotkit.data.model.QTbSysRole.tbSysRole;
+import static cc.iotkit.data.model.QTbSysRoleMenu.tbSysRoleMenu;
 import static cc.iotkit.data.model.QTbSysUserRole.tbSysUserRole;
 
 /**
  * @Author:tfd
  * @Date:2023/5/30 16:36
  */
+@RequiredArgsConstructor
 public class SysUserRoleDataImpl implements ISysUserRoleData {
     @Autowired
-    private SysUserRoleRepository sysUserRoleRepository;
+    private final SysUserRoleRepository sysUserRoleRepository;
+    private final JPAQueryFactory jpaQueryFactory;
 
     @Override
     public int deleteByUserId(Long userId) {
@@ -23,4 +36,17 @@ public class SysUserRoleDataImpl implements ISysUserRoleData {
     public long countUserRoleByRoleId(Long roleId) {
         return sysUserRoleRepository.count(tbSysUserRole.roleId.eq(roleId));
     }
+
+    @Override
+    public long insertBatch(List<SysUserRole> list) {
+        return jpaQueryFactory.insert(tbSysRole).values(List.of(Objects.requireNonNull(MapstructUtils.convert(list, TbSysUserRole.class)))).execute();
+    }
+
+    @Override
+    public long delete(Long roleId, List<Long> userIds) {
+        return jpaQueryFactory.delete(tbSysUserRole).where(PredicateBuilder.instance()
+                .and(tbSysUserRole.roleId.eq(roleId))
+                .and(tbSysUserRole.userId.in(userIds))
+                .build()).execute();
+    }
 }

+ 1 - 1
iot-common/iot-common-doc/.flattened-pom.xml

@@ -26,8 +26,8 @@
       <version>3.0.0</version>
       <exclusions>
         <exclusion>
-          <artifactId>swagger-models</artifactId>
           <groupId>io.swagger</groupId>
+          <artifactId>swagger-models</artifactId>
         </exclusion>
       </exclusions>
     </dependency>

+ 1 - 1
iot-common/iot-common-log/.flattened-pom.xml

@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
+<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
   <modelVersion>4.0.0</modelVersion>
   <parent>

+ 3 - 4
iot-module/iot-system/src/main/java/cc/iotkit/system/controller/SysConfigController.java

@@ -40,8 +40,7 @@ public class SysConfigController extends BaseController {
   @ApiOperation("获取参数配置列表")
   @SaCheckPermission("system:config:list")
   @PostMapping("/list")
-  public Paging<SysConfigVo> list(
-      @RequestBody @Validated(QueryGroup.class) PageRequest<SysConfigBo> query) {
+  public Paging<SysConfigVo> list(@RequestBody @Validated(QueryGroup.class) PageRequest<SysConfigBo> query) {
     return configService.selectPageConfigList(query);
   }
 
@@ -49,9 +48,9 @@ public class SysConfigController extends BaseController {
   @Log(title = "参数管理", businessType = BusinessType.EXPORT)
   @SaCheckPermission("system:config:export")
   @PostMapping("/export")
-  public void export(@RequestBody @Validated(QueryGroup.class) SysConfigBo config,
+  public void export(@RequestBody @Validated(QueryGroup.class) Request<SysConfigBo> request,
       HttpServletResponse response) {
-    List<SysConfigVo> list = configService.selectConfigList(config);
+    List<SysConfigVo> list = configService.selectConfigList(request.getData());
     ExcelUtil.exportExcel(list, "参数数据", SysConfigVo.class, response);
   }
 

+ 10 - 11
iot-module/iot-system/src/main/java/cc/iotkit/system/controller/SysTenantController.java

@@ -1,8 +1,8 @@
 package cc.iotkit.system.controller;
 
 import cc.iotkit.common.api.PageRequest;
-import cc.iotkit.common.constant.TenantConstants;
 import cc.iotkit.common.api.Paging;
+import cc.iotkit.common.constant.TenantConstants;
 import cc.iotkit.common.excel.utils.ExcelUtil;
 import cc.iotkit.common.log.annotation.Log;
 import cc.iotkit.common.log.enums.BusinessType;
@@ -12,23 +12,18 @@ import cc.iotkit.common.validate.EditGroup;
 import cc.iotkit.common.web.core.BaseController;
 import cc.iotkit.system.dto.bo.SysTenantBo;
 import cc.iotkit.system.dto.vo.SysTenantVo;
+import cc.iotkit.system.service.ISysTenantService;
 import cn.dev33.satoken.annotation.SaCheckPermission;
 import cn.dev33.satoken.annotation.SaCheckRole;
 import com.baomidou.lock.annotation.Lock4j;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
 import jakarta.validation.constraints.NotBlank;
 import jakarta.validation.constraints.NotEmpty;
 import jakarta.validation.constraints.NotNull;
 import lombok.RequiredArgsConstructor;
-import cc.iotkit.system.service.ISysTenantService;
 import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.DeleteMapping;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.PutMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletResponse;
 import java.util.List;
@@ -42,6 +37,7 @@ import java.util.List;
 @RequiredArgsConstructor
 @RestController
 @RequestMapping("/system/tenant")
+@Api(tags = "租户管理")
 public class SysTenantController extends BaseController {
 
     private final ISysTenantService tenantService;
@@ -49,9 +45,10 @@ public class SysTenantController extends BaseController {
     /**
      * 查询租户列表
      */
+    @ApiOperation("查询租户列表")
     @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY)
     @SaCheckPermission("system:tenant:list")
-    @GetMapping("/list")
+    @PostMapping("/list")
     public Paging<SysTenantVo> list(SysTenantBo bo, PageRequest<?> query) {
         return tenantService.queryPageList(bo, query);
     }
@@ -59,6 +56,7 @@ public class SysTenantController extends BaseController {
     /**
      * 导出租户列表
      */
+    @ApiOperation("导出租户列表")
     @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY)
     @SaCheckPermission("system:tenant:export")
     @Log(title = "租户", businessType = BusinessType.EXPORT)
@@ -73,6 +71,7 @@ public class SysTenantController extends BaseController {
      *
      * @param id 主键
      */
+    @ApiOperation("获取租户详细信息")
     @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY)
     @SaCheckPermission("system:tenant:query")
     @GetMapping("/{id}")

+ 0 - 24
iot-module/iot-system/src/main/java/cc/iotkit/system/dto/SysRoleDept.java

@@ -1,24 +0,0 @@
-package cc.iotkit.system.dto;
-
-import lombok.Data;
-
-/**
- * 角色和部门关联
- *
- * @author Lion Li
- */
-
-@Data
-public class SysRoleDept {
-
-    /**
-     * 角色ID
-     */
-    private Long roleId;
-
-    /**
-     * 部门ID
-     */
-    private Long deptId;
-
-}

+ 0 - 24
iot-module/iot-system/src/main/java/cc/iotkit/system/dto/SysUserRole.java

@@ -1,24 +0,0 @@
-package cc.iotkit.system.dto;
-
-import lombok.Data;
-
-/**
- * 用户和角色关联
- *
- * @author Lion Li
- */
-
-@Data
-public class SysUserRole {
-
-    /**
-     * 用户ID
-     */
-    private Long userId;
-
-    /**
-     * 角色ID
-     */
-    private Long roleId;
-
-}

+ 3 - 3
iot-module/iot-system/src/main/java/cc/iotkit/system/service/ISysRoleService.java

@@ -2,7 +2,7 @@ package cc.iotkit.system.service;
 
 import cc.iotkit.common.api.PageRequest;
 import cc.iotkit.common.api.Paging;
-import cc.iotkit.system.dto.SysUserRole;
+import cc.iotkit.model.system.SysUserRole;
 import cc.iotkit.system.dto.bo.SysRoleBo;
 import cc.iotkit.system.dto.vo.SysRoleVo;
 
@@ -110,7 +110,7 @@ public interface ISysRoleService {
      * @param bo 角色信息
      * @return 结果
      */
-    void insertRole(SysRoleBo bo);
+    int insertRole(SysRoleBo bo);
 
     /**
      * 修改保存角色信息
@@ -135,7 +135,7 @@ public interface ISysRoleService {
      * @param bo 角色信息
      * @return 结果
      */
-    void authDataScope(SysRoleBo bo);
+    int authDataScope(SysRoleBo bo);
 
     /**
      * 通过角色ID删除角色

+ 1 - 4
iot-module/iot-system/src/main/java/cc/iotkit/system/service/impl/SysMenuServiceImpl.java

@@ -322,7 +322,6 @@ public class SysMenuServiceImpl implements ISysMenuService {
      * 新增保存菜单信息
      *
      * @param bo 菜单信息
-     * @return 结果
      */
     @Override
     public void insertMenu(SysMenuBo bo) {
@@ -333,7 +332,6 @@ public class SysMenuServiceImpl implements ISysMenuService {
      * 修改保存菜单信息
      *
      * @param bo 菜单信息
-     * @return 结果
      */
     @Override
     public void updateMenu(SysMenuBo bo) {
@@ -344,7 +342,6 @@ public class SysMenuServiceImpl implements ISysMenuService {
      * 删除菜单管理信息
      *
      * @param menuId 菜单ID
-     * @return 结果
      */
     @Override
     public void deleteMenuById(Long menuId) {
@@ -354,7 +351,7 @@ public class SysMenuServiceImpl implements ISysMenuService {
     /**
      * 校验菜单名称是否唯一
      *
-     * @param menu 菜单信息
+     * @param bo 菜单信息
      * @return 结果
      */
     @Override

+ 109 - 21
iot-module/iot-system/src/main/java/cc/iotkit/system/service/impl/SysRoleServiceImpl.java

@@ -4,34 +4,39 @@ import cc.iotkit.common.api.PageRequest;
 import cc.iotkit.common.api.Paging;
 import cc.iotkit.common.exception.BizException;
 import cc.iotkit.common.satoken.utils.LoginHelper;
+import cc.iotkit.common.undefined.LoginUser;
 import cc.iotkit.common.utils.MapstructUtils;
+import cc.iotkit.common.utils.StreamUtils;
 import cc.iotkit.common.utils.StringUtils;
 import cc.iotkit.data.system.ISysRoleData;
 import cc.iotkit.data.system.ISysRoleDeptData;
 import cc.iotkit.data.system.ISysRoleMenuData;
 import cc.iotkit.data.system.ISysUserRoleData;
 import cc.iotkit.model.system.SysRole;
-import cc.iotkit.system.dto.SysUserRole;
+import cc.iotkit.model.system.SysRoleDept;
+import cc.iotkit.model.system.SysRoleMenu;
+import cc.iotkit.model.system.SysUserRole;
 import cc.iotkit.system.dto.bo.SysRoleBo;
 import cc.iotkit.system.dto.vo.SysRoleVo;
 import cc.iotkit.system.service.ISysRoleService;
+import cn.dev33.satoken.exception.NotLoginException;
+import cn.dev33.satoken.stp.StpUtil;
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.util.ObjectUtil;
 import lombok.RequiredArgsConstructor;
+import org.hibernate.service.spi.ServiceException;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
+import java.util.*;
 
 /**
  * 角色 业务层处理
  *
  * @author Lion Li
  */
-@RequiredArgsConstructor
 @Service
+@RequiredArgsConstructor
 public class SysRoleServiceImpl implements ISysRoleService {
 
     private final ISysRoleData iSysRoleData;
@@ -194,7 +199,7 @@ public class SysRoleServiceImpl implements ISysRoleService {
      */
     @Override
     public long countUserRoleByRoleId(Long roleId) {
-        return 0;
+        return iSysUserRoleData.countUserRoleByRoleId(roleId);
     }
 
     /**
@@ -205,10 +210,10 @@ public class SysRoleServiceImpl implements ISysRoleService {
      */
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public void insertRole(SysRoleBo bo) {
+    public int insertRole(SysRoleBo bo) {
         SysRole role = iSysRoleData.save(bo.to(SysRole.class));
         bo.setRoleId(role.getId());
-        insertRoleMenu(bo);
+        return insertRoleMenu(bo);
     }
 
     /**
@@ -220,11 +225,11 @@ public class SysRoleServiceImpl implements ISysRoleService {
     @Override
     @Transactional(rollbackFor = Exception.class)
     public int updateRole(SysRoleBo bo) {
-        SysRole role = iSysRoleData.save(bo.to(SysRole.class));
-        if (ObjectUtil.isNull(role)) {
-            return 0;
-        }
-        return 1;
+        // 修改角色信息
+        iSysRoleData.updateById(bo.to(SysRole.class));
+        // 删除角色与菜单关联
+        iSysRoleMenuData.deleteByRoleId(List.of(bo.getRoleId()));
+        return insertRoleMenu(bo);
     }
 
     /**
@@ -232,7 +237,6 @@ public class SysRoleServiceImpl implements ISysRoleService {
      *
      * @param roleId 角色ID
      * @param status 角色状态
-     * @return 结果
      */
     @Override
     public void updateRoleStatus(Long roleId, String status) {
@@ -251,13 +255,13 @@ public class SysRoleServiceImpl implements ISysRoleService {
      */
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public void authDataScope(SysRoleBo bo) {
+    public int authDataScope(SysRoleBo bo) {
         // 修改角色信息
         iSysRoleData.updateById(MapstructUtils.convert(bo, SysRole.class));
         // 删除角色与部门关联
-        iSysRoleDeptData.delete(bo.getRoleId());
+        iSysRoleDeptData.deleteByRoleId(List.of(bo.getRoleId()));
         // 新增角色和部门信息(数据权限)
-        insertRoleDept(bo);
+        return insertRoleDept(bo);
 
     }
 
@@ -266,7 +270,20 @@ public class SysRoleServiceImpl implements ISysRoleService {
      *
      * @param role 角色对象
      */
-    private void insertRoleMenu(SysRoleBo role) {
+    private int insertRoleMenu(SysRoleBo role) {
+        long rows = 1;
+        // 新增用户与角色管理
+        List<SysRoleMenu> list = new ArrayList<>();
+        for (Long menuId : role.getMenuIds()) {
+            SysRoleMenu rm = new SysRoleMenu();
+            rm.setRoleId(role.getRoleId());
+            rm.setMenuId(menuId);
+            list.add(rm);
+        }
+        if (list.size() > 0) {
+            rows = iSysRoleMenuData.insertBatch(list);
+        }
+        return Integer.parseInt(rows + "");
     }
 
     /**
@@ -274,19 +291,35 @@ public class SysRoleServiceImpl implements ISysRoleService {
      *
      * @param role 角色对象
      */
-    private void insertRoleDept(SysRoleBo role) {
-
+    private int insertRoleDept(SysRoleBo role) {
+        long rows = 1;
+        // 新增角色与部门(数据权限)管理
+        List<SysRoleDept> list = new ArrayList<>();
+        for (Long deptId : role.getDeptIds()) {
+            SysRoleDept rd = new SysRoleDept();
+            rd.setRoleId(role.getRoleId());
+            rd.setDeptId(deptId);
+            list.add(rd);
+        }
+        if (list.size() > 0) {
+            rows = iSysRoleDeptData.insertBatch(list);
+        }
+        return Integer.parseInt(rows + "");
     }
 
     /**
      * 通过角色ID删除角色
      *
      * @param roleId 角色ID
-     * @return 结果
      */
     @Override
     @Transactional(rollbackFor = Exception.class)
     public void deleteRoleById(Long roleId) {
+        // 删除角色与菜单关联
+        iSysRoleMenuData.deleteByRoleId(List.of(roleId));
+        // 删除角色与部门关联
+        iSysRoleDeptData.deleteByRoleId(List.of(roleId));
+        iSysRoleData.deleteById(roleId);
     }
 
     /**
@@ -298,6 +331,20 @@ public class SysRoleServiceImpl implements ISysRoleService {
     @Override
     @Transactional(rollbackFor = Exception.class)
     public void deleteRoleByIds(Long[] roleIds) {
+        for (Long roleId : roleIds) {
+            checkRoleAllowed(roleId);
+            checkRoleDataScope(roleId);
+            SysRole role = iSysRoleData.findById(roleId);
+            if (countUserRoleByRoleId(roleId) > 0) {
+                throw new ServiceException(String.format("%1$s已分配,不能删除", role.getRoleName()));
+            }
+        }
+        List<Long> ids = Arrays.asList(roleIds);
+        // 删除角色与菜单关联
+        iSysRoleMenuData.deleteByRoleId(ids);
+        // 删除角色与部门关联
+        iSysRoleDeptData.deleteByRoleId(ids);
+        iSysRoleData.deleteByIds(ids);
     }
 
     /**
@@ -308,6 +355,10 @@ public class SysRoleServiceImpl implements ISysRoleService {
      */
     @Override
     public void deleteAuthUser(SysUserRole userRole) {
+        long rows = iSysUserRoleData.delete(userRole.getRoleId(), List.of(userRole.getUserId()));
+        if (rows > 0) {
+            cleanOnlineUserByRole(userRole.getRoleId());
+        }
     }
 
     /**
@@ -319,6 +370,10 @@ public class SysRoleServiceImpl implements ISysRoleService {
      */
     @Override
     public void deleteAuthUsers(Long roleId, Long[] userIds) {
+        long rows = iSysUserRoleData.delete(roleId, Arrays.asList(userIds));
+        if (rows > 0) {
+            cleanOnlineUserByRole(roleId);
+        }
     }
 
     /**
@@ -330,9 +385,42 @@ public class SysRoleServiceImpl implements ISysRoleService {
      */
     @Override
     public void insertAuthUsers(Long roleId, Long[] userIds) {
+        // 新增用户与角色管理
+        long rows = 1;
+        List<SysUserRole> list = StreamUtils.toList(List.of(userIds), userId -> {
+            SysUserRole ur = new SysUserRole();
+            ur.setUserId(userId);
+            ur.setRoleId(roleId);
+            return ur;
+        });
+        if (CollUtil.isNotEmpty(list)) {
+            rows = iSysUserRoleData.insertBatch(list);
+        }
+        if (rows > 0) {
+            cleanOnlineUserByRole(roleId);
+        }
     }
 
     @Override
     public void cleanOnlineUserByRole(Long roleId) {
+        List<String> keys = StpUtil.searchTokenValue("", 0, -1, false);
+        if (CollUtil.isEmpty(keys)) {
+            return;
+        }
+        // 角色关联的在线用户量过大会导致redis阻塞卡顿 谨慎操作
+        keys.parallelStream().forEach(key -> {
+            String token = StringUtils.substringAfterLast(key, ":");
+            // 如果已经过期则跳过
+            if (StpUtil.stpLogic.getTokenActivityTimeoutByToken(token) < -1) {
+                return;
+            }
+            LoginUser loginUser = LoginHelper.getLoginUser(token);
+            if (loginUser.getRoles().stream().anyMatch(r -> r.getRoleId().equals(roleId))) {
+                try {
+                    StpUtil.logoutByTokenValue(token);
+                } catch (NotLoginException ignored) {
+                }
+            }
+        });
     }
 }

+ 3 - 2
iot-module/iot-system/src/main/java/cc/iotkit/system/service/impl/SysTenantServiceImpl.java

@@ -7,6 +7,7 @@ import cc.iotkit.common.utils.MapstructUtils;
 import cc.iotkit.common.utils.SpringUtils;
 import cc.iotkit.data.system.ISysTenantData;
 import cc.iotkit.data.system.ISysUserData;
+import cc.iotkit.model.system.SysTenant;
 import cc.iotkit.system.dto.bo.SysTenantBo;
 import cc.iotkit.system.dto.vo.SysTenantVo;
 import cc.iotkit.system.service.ISysTenantService;
@@ -32,7 +33,7 @@ public class SysTenantServiceImpl implements ISysTenantService {
 
     @Override
     public SysTenantVo queryById(Long id) {
-        return null;
+        return sysTenantData.findById(id).to(SysTenantVo.class);
     }
 
     /**
@@ -51,7 +52,7 @@ public class SysTenantServiceImpl implements ISysTenantService {
 
     @Override
     public List<SysTenantVo> queryList(SysTenantBo bo) {
-        return null;
+        return MapstructUtils.convert(sysTenantData.findAllByCondition(bo.to(SysTenant.class)),SysTenantVo.class);
     }
 
     @Override