18339543638 2 лет назад
Родитель
Сommit
c638c31abe
60 измененных файлов с 682 добавлено и 123 удалено
  1. 4 4
      tr-framework/src/main/java/cn/tr/core/utils/JsonUtils.java
  2. 32 0
      tr-framework/src/main/java/cn/tr/core/utils/TreeUtil.java
  3. 2 2
      tr-modules-api/tr-module-export-api/pom.xml
  4. 2 2
      tr-modules-api/tr-module-system-api/pom.xml
  5. 2 1
      tr-modules/tr-module-export/src/main/java/cn/tr/module/excel/core/converter/DictCodeConverter.java
  6. 4 0
      tr-modules/tr-module-system/pom.xml
  7. 1 1
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/dict/controller/SysDictItemController.java
  8. 2 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/dict/dto/SysDictDTO.java
  9. 5 3
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/dict/dto/SysDictItemDTO.java
  10. 2 1
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/numStrategy/dto/SysNumberingStrategyDTO.java
  11. 32 6
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/numStrategy/service/impl/SysNumberingStrategyServiceImpl.java
  12. 42 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/oauth2/config/StdStpInterface.java
  13. 1 1
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/oauth2/dto/OAuth2UpdatePswDTO.java
  14. 11 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/oauth2/service/CurrentUserService.java
  15. 1 1
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/sms/controller/SysSmsTempController.java
  16. 1 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/sms/dto/SysSmsTempDTO.java
  17. 0 18
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/storage/controller/SysStorageRecordController.java
  18. 0 23
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/storage/dto/FileUploadDTO.java
  19. 4 1
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/tenant/dto/SysTenantAddDTO.java
  20. 4 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/tenant/dto/SysTenantCommonDTO.java
  21. 2 2
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/tenant/dto/SysTenantPackageDTO.java
  22. 2 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/tenant/dto/SysTenantQueryDTO.java
  23. 39 3
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/tenant/service/impl/SysTenantPackageMenuServiceImpl.java
  24. 7 3
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/tenant/service/impl/SysTenantServiceImpl.java
  25. 11 2
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/controller/SysMenuController.java
  26. 2 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/controller/SysPortalController.java
  27. 8 8
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/controller/SysPositionController.java
  28. 5 1
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/dto/SysMenuQueryDTO.java
  29. 4 1
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/dto/SysOrgDTO.java
  30. 5 4
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/dto/SysPortalDTO.java
  31. 8 5
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/dto/SysPositionDTO.java
  32. 2 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/dto/SysRoleDTO.java
  33. 3 1
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/dto/SysUserDTO.java
  34. 31 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/dto/SysUserPositionDTO.java
  35. 13 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/excel/converter/SysOrgConverter.java
  36. 27 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/excel/converter/SysUserConverter.java
  37. 47 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/excel/dto/SysOrgExcelDTO.java
  38. 2 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/mapper/SysOrgMapper.java
  39. 28 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/mapper/SysUserPositionMapper.java
  40. 0 3
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/po/SysPortalPO.java
  41. 35 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/po/SysUserPositionPO.java
  42. 7 1
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/repository/SysOrgRepository.java
  43. 16 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/repository/SysUserPositionRepository.java
  44. 33 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/service/ISysUserPositionService.java
  45. 7 1
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/service/impl/SysMenuServiceImpl.java
  46. 7 7
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/service/impl/SysOrgServiceImpl.java
  47. 14 1
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/service/impl/SysPositionServiceImpl.java
  48. 56 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/service/impl/SysUserPositionServiceImpl.java
  49. 11 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/service/impl/SysUserServiceImpl.java
  50. 64 0
      tr-modules/tr-module-system/src/main/resources/mapper/user/SysOrgMapper.xml
  51. 8 1
      tr-plugins/tr-spring-boot-starter-plugin-biz-tenant/src/main/java/cn/tr/plugin/biz/tenant/config/web/TenantContextWebFilter.java
  52. 2 2
      tr-plugins/tr-spring-boot-starter-plugin-file/src/main/java/cn/tr/plugin/file/config/local/LocalFileClientConfig.java
  53. 12 6
      tr-plugins/tr-spring-boot-starter-plugin-numbering-strategy/src/main/java/cn/tr/plugin/numbering/strategy/core/DefaultNumberingStrategyClient.java
  54. 5 0
      tr-plugins/tr-spring-boot-starter-plugin-numbering-strategy/src/main/java/cn/tr/plugin/numbering/strategy/core/DefaultNumberingStrategyClientFactory.java
  55. 2 0
      tr-plugins/tr-spring-boot-starter-plugin-numbering-strategy/src/main/java/cn/tr/plugin/numbering/strategy/core/NumberingStrategyClientFactory.java
  56. 1 1
      tr-plugins/tr-spring-boot-starter-plugin-numbering-strategy/src/main/java/cn/tr/plugin/numbering/strategy/core/enums/NumberingStrategyEnum.java
  57. 1 1
      tr-plugins/tr-spring-boot-starter-plugin-numbering-strategy/src/main/java/cn/tr/plugin/numbering/strategy/core/properties/NumberingStrategyProperties.java
  58. 2 2
      tr-plugins/tr-spring-boot-starter-plugin-numbering-strategy/src/test/java/cn/tr/plugin/numbering/strategy/StrategyTest.java
  59. 0 3
      tr-test/src/main/java/cn/tr/test/WebApplication.java
  60. 1 0
      tr-test/src/main/resources/application.yml

+ 4 - 4
tr-framework/src/main/java/cn/tr/core/utils/JsonUtils.java

@@ -10,10 +10,7 @@ import com.fasterxml.jackson.databind.ObjectMapper;
 import lombok.experimental.UtilityClass;
 import lombok.experimental.UtilityClass;
 
 
 import java.io.IOException;
 import java.io.IOException;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 
 
 /**
 /**
  * JSON 工具类
  * JSON 工具类
@@ -38,6 +35,9 @@ public class JsonUtils {
 
 
     public static String toJsonString(Object object) {
     public static String toJsonString(Object object) {
         try {
         try {
+            if(Objects.isNull(object)){
+                return null;
+            }
             return objectMapper.writeValueAsString(object);
             return objectMapper.writeValueAsString(object);
         }catch (Exception e){
         }catch (Exception e){
             e.printStackTrace();
             e.printStackTrace();

+ 32 - 0
tr-framework/src/main/java/cn/tr/core/utils/TreeUtil.java

@@ -102,6 +102,30 @@ public class TreeUtil {
         CollectionUtil.sort(children,Comparator.comparing(TreeNode::getSort));
         CollectionUtil.sort(children,Comparator.comparing(TreeNode::getSort));
     }
     }
 
 
+    /**
+     * 校验节点配置是否合理
+     */
+    public static <T extends TreeNode>  void validateNode(T node,Collection<T> tree){
+        if(ObjectUtil.equals(node.getId(),node.getParentId())){
+            throw new UnsupportedOperationException("不能将自身作为上级节点");
+        }
+        Object parentId = node.getParentId();
+        List<T> flatTree = flatTree(tree);
+        for (T treeNode : flatTree) {
+            if(ObjectUtil.equals(treeNode.getId(),node.getId())){
+                node=treeNode;
+                break;
+            }
+        }
+
+        List<T> children = flatTree(Collections.singleton(node));
+        for (T child : children) {
+            if(ObjectUtil.equals(child.getId(),parentId)){
+                throw new UnsupportedOperationException("不能将子节点作为上级节点");
+            }
+        }
+    }
+
     public static <T extends TreeNode> List<T> flatTree(Collection<T> sources) {
     public static <T extends TreeNode> List<T> flatTree(Collection<T> sources) {
         List<T> result = new ArrayList<>();
         List<T> result = new ArrayList<>();
         for (T source : sources) {
         for (T source : sources) {
@@ -110,6 +134,12 @@ public class TreeUtil {
         return result;
         return result;
     }
     }
 
 
+    /**
+     * 将树结构展开
+     * @param source 树节点
+     * @param result 展开结果
+     * @param <T>
+     */
     private static  <T extends TreeNode>  void flatTree(T source,Collection<T> result){
     private static  <T extends TreeNode>  void flatTree(T source,Collection<T> result){
         if(source==null){
         if(source==null){
             return;
             return;
@@ -121,4 +151,6 @@ public class TreeUtil {
             }
             }
         }
         }
     }
     }
+
+
 }
 }

+ 2 - 2
tr-modules-api/tr-module-export-api/pom.xml

@@ -5,12 +5,12 @@
     <parent>
     <parent>
         <artifactId>tr-modules-api</artifactId>
         <artifactId>tr-modules-api</artifactId>
         <groupId>cn.tr</groupId>
         <groupId>cn.tr</groupId>
-        <version>0.0.9</version>
+        <version>${revision}</version>
     </parent>
     </parent>
     <modelVersion>4.0.0</modelVersion>
     <modelVersion>4.0.0</modelVersion>
 
 
     <artifactId>tr-module-export-api</artifactId>
     <artifactId>tr-module-export-api</artifactId>
-
+    <version>${revision}</version>
 
 
     <dependencies>
     <dependencies>
         <dependency>
         <dependency>

+ 2 - 2
tr-modules-api/tr-module-system-api/pom.xml

@@ -5,12 +5,12 @@
     <parent>
     <parent>
         <artifactId>tr-modules-api</artifactId>
         <artifactId>tr-modules-api</artifactId>
         <groupId>cn.tr</groupId>
         <groupId>cn.tr</groupId>
-        <version>0.0.9</version>
+        <version>${revision}</version>
     </parent>
     </parent>
     <modelVersion>4.0.0</modelVersion>
     <modelVersion>4.0.0</modelVersion>
 
 
     <artifactId>tr-module-system-api</artifactId>
     <artifactId>tr-module-system-api</artifactId>
-
+    <version>${revision}</version>
     <dependencies>
     <dependencies>
         <dependency>
         <dependency>
             <groupId>cn.tr</groupId>
             <groupId>cn.tr</groupId>

+ 2 - 1
tr-modules/tr-module-export/src/main/java/cn/tr/module/excel/core/converter/DictCodeConverter.java

@@ -43,7 +43,8 @@ public class DictCodeConverter implements Converter<String> {
     private String buildString(List<Pair<String, String>> items){
     private String buildString(List<Pair<String, String>> items){
         StringBuilder result = new StringBuilder();
         StringBuilder result = new StringBuilder();
         for (Pair<String, String> item : items) {
         for (Pair<String, String> item : items) {
-            result.append(item.getKey()).append("(").append(item.getValue()).append(");").append("\n");
+//            result.append(item.getKey()).append("(").append(item.getValue()).append(");").append("\n");
+            result.append(item.getValue()).append(";").append("\n");
         }
         }
         return result.toString();
         return result.toString();
     }
     }

+ 4 - 0
tr-modules/tr-module-system/pom.xml

@@ -104,5 +104,9 @@
             <artifactId>tr-spring-boot-starter-plugin-cache</artifactId>
             <artifactId>tr-spring-boot-starter-plugin-cache</artifactId>
         </dependency>
         </dependency>
 
 
+        <dependency>
+            <groupId>cn.tr</groupId>
+            <artifactId>tr-module-export-api</artifactId>
+        </dependency>
     </dependencies>
     </dependencies>
 </project>
 </project>

+ 1 - 1
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/dict/controller/SysDictItemController.java

@@ -73,7 +73,7 @@ public class SysDictItemController extends BaseController {
     @PostMapping("/deleteByIds")
     @PostMapping("/deleteByIds")
     @ApiOperationSupport(author = "lf")
     @ApiOperationSupport(author = "lf")
     @ApiOperation(value = "删除字典项",notes = "权限: sys:dictItem:del")
     @ApiOperation(value = "删除字典项",notes = "权限: sys:dictItem:del")
-    @SaCheckPermission("sys:dictItem:del")
+    @SaCheckPermission("sys:dictItem:remove")
     @OperateLog
     @OperateLog
     public CommonResult<Integer> deleteByIds(@RequestBody Collection<String> ids){
     public CommonResult<Integer> deleteByIds(@RequestBody Collection<String> ids){
         return CommonResult.success(dictItemService.deleteDictItemByIds(ids));
         return CommonResult.success(dictItemService.deleteDictItemByIds(ids));

+ 2 - 0
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/dict/dto/SysDictDTO.java

@@ -9,6 +9,7 @@ import lombok.EqualsAndHashCode;
 import lombok.ToString;
 import lombok.ToString;
 
 
 import javax.validation.constraints.NotNull;
 import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Pattern;
 
 
 /**
 /**
  * 字典对象 sys_dict
  * 字典对象 sys_dict
@@ -29,6 +30,7 @@ public class SysDictDTO extends BaseDTO {
 
 
     @ApiModelProperty(value = "字典编码",required = true)
     @ApiModelProperty(value = "字典编码",required = true)
     @NotNull(message = "字典编码不能为空",groups = {Insert.class, Update.class})
     @NotNull(message = "字典编码不能为空",groups = {Insert.class, Update.class})
+    @Pattern(regexp = "^[A-Za-z0-9]+$", message = "字典编码为数字以及字母",groups = {Insert.class,Update.class})
     private String dictCode;
     private String dictCode;
 
 
     @NotNull(message = "字典名称不能为空",groups = {Insert.class, Update.class})
     @NotNull(message = "字典名称不能为空",groups = {Insert.class, Update.class})

+ 5 - 3
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/dict/dto/SysDictItemDTO.java

@@ -11,6 +11,7 @@ import lombok.ToString;
 import org.hibernate.validator.constraints.Length;
 import org.hibernate.validator.constraints.Length;
 
 
 import javax.validation.constraints.NotNull;
 import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Pattern;
 
 
 /**
 /**
  * 字典项对象 sys_dict_item
  * 字典项对象 sys_dict_item
@@ -34,9 +35,10 @@ public class SysDictItemDTO extends BaseDTO {
     @Length(min=1,max = 255,groups = {Insert.class, Update.class},message = "字典ID 字段长度需在 1至255 之间")
     @Length(min=1,max = 255,groups = {Insert.class, Update.class},message = "字典ID 字段长度需在 1至255 之间")
     private String dictId;
     private String dictId;
 
 
-    @ApiModelProperty(value = "字典项值" ,required = true )
-    @NotNull(message = "字典项值不能为空",groups = {Insert.class, Update.class})
-    @Length(min=1,max = 128,groups = {Insert.class, Update.class},message = "字典项值 字段长度需在 1至128 之间")
+    @ApiModelProperty(value = "字典项编码" ,required = true )
+    @NotNull(message = "字典项编码不能为空",groups = {Insert.class, Update.class})
+    @Length(min=1,max = 128,groups = {Insert.class, Update.class},message = "字典项编码 字段长度需在 1至128 之间")
+    @Pattern(regexp = "^[A-Za-z0-9]+$", message = "字典项编码为数字以及字母",groups = {Insert.class,Update.class})
     private String value;
     private String value;
 
 
     @ApiModelProperty(value = "字典项标签" ,required = true )
     @ApiModelProperty(value = "字典项标签" ,required = true )

+ 2 - 1
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/numStrategy/dto/SysNumberingStrategyDTO.java

@@ -28,6 +28,7 @@ public class SysNumberingStrategyDTO extends BaseDTO  {
 
 
     @ApiModelProperty(value = "策略编码", position = 2,required = true)
     @ApiModelProperty(value = "策略编码", position = 2,required = true)
     @NotBlank  (message = "策略编码不能为空",groups = {Update.class,Insert.class})
     @NotBlank  (message = "策略编码不能为空",groups = {Update.class,Insert.class})
+    @Pattern(regexp = "^[A-Za-z0-9]+$", message = "策略编码为数字以及字母",groups = {Insert.class,Update.class})
     private String code;
     private String code;
 
 
     @ApiModelProperty(value = "策略名称", position = 3,required = true)
     @ApiModelProperty(value = "策略名称", position = 3,required = true)
@@ -38,7 +39,7 @@ public class SysNumberingStrategyDTO extends BaseDTO  {
     private String prefix;
     private String prefix;
 
 
     @ApiModelProperty(value = "生成模式", position = 5,required = true)
     @ApiModelProperty(value = "生成模式", position = 5,required = true)
-    @NotBlank  (message = "生成模式不能为空",groups = {Update.class,Insert.class})
+    @NotNull  (message = "生成模式不能为空",groups = {Update.class,Insert.class})
     private String type;
     private String type;
 
 
     @ApiModelProperty(value = "下一个流水号", position = 6,required = true)
     @ApiModelProperty(value = "下一个流水号", position = 6,required = true)

+ 32 - 6
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/numStrategy/service/impl/SysNumberingStrategyServiceImpl.java

@@ -4,6 +4,8 @@ import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.core.util.StrUtil;
 import cn.tr.core.exception.ServiceException;
 import cn.tr.core.exception.ServiceException;
 import cn.tr.core.exception.TRExcCode;
 import cn.tr.core.exception.TRExcCode;
+import cn.tr.plugin.eventbus.annotation.Subscribe;
+import cn.tr.plugin.eventbus.config.EventBus;
 import cn.tr.plugin.numbering.strategy.core.NumberingStrategyClientFactory;
 import cn.tr.plugin.numbering.strategy.core.NumberingStrategyClientFactory;
 import cn.tr.plugin.numbering.strategy.core.NumberingStrategyClient;
 import cn.tr.plugin.numbering.strategy.core.NumberingStrategyClient;
 import cn.tr.plugin.numbering.strategy.core.properties.NumberingStrategyProperties;
 import cn.tr.plugin.numbering.strategy.core.properties.NumberingStrategyProperties;
@@ -31,14 +33,20 @@ import javax.annotation.PostConstruct;
 @Service
 @Service
 @Slf4j
 @Slf4j
 public class SysNumberingStrategyServiceImpl implements ISysNumberingStrategyService {
 public class SysNumberingStrategyServiceImpl implements ISysNumberingStrategyService {
+    private final String STRATEGY_REFRESH_TOPIC="/numbering/strategy/refresh";
+    private final String STRATEGY_REMOVE_TOPIC="/numbering/strategy/remove";
     @Autowired
     @Autowired
     private SysNumberingStrategyRepository baseRepository;
     private SysNumberingStrategyRepository baseRepository;
 
 
     @Autowired
     @Autowired
     private NumberingStrategyClientFactory strategyClientFactory;
     private NumberingStrategyClientFactory strategyClientFactory;
 
 
+    @Autowired
+    private EventBus eventBus;
+
     @Override
     @Override
     @PostConstruct
     @PostConstruct
+    @Subscribe(STRATEGY_REFRESH_TOPIC)
     public void initLocalCache() {
     public void initLocalCache() {
         List<SysNumberingStrategyPO> strategies = baseRepository.selectList(new LambdaQueryWrapper<>());
         List<SysNumberingStrategyPO> strategies = baseRepository.selectList(new LambdaQueryWrapper<>());
         log.info("[initLocalCache][缓存编码策略,数量为:{}]", strategies.size());
         log.info("[initLocalCache][缓存编码策略,数量为:{}]", strategies.size());
@@ -113,8 +121,13 @@ public class SysNumberingStrategyServiceImpl implements ISysNumberingStrategySer
     @Override
     @Override
     public boolean updateSysNumberingStrategyById(SysNumberingStrategyDTO source){
     public boolean updateSysNumberingStrategyById(SysNumberingStrategyDTO source){
         SysNumberingStrategyPO strategyPO = SysNumberingStrategyMapper.INSTANCE.convertPO(source);
         SysNumberingStrategyPO strategyPO = SysNumberingStrategyMapper.INSTANCE.convertPO(source);
-        validateRoleSource(strategyPO);
-        return baseRepository.updateById(strategyPO)!=0;
+        validateNumberingStrategySource(strategyPO);
+        if(baseRepository.updateById(strategyPO)!=0){
+            strategyClientFactory.createOrUpdateSmsClient(SysNumberingStrategyMapper.INSTANCE.convertProperty(source));
+            eventBus.publishShare(STRATEGY_REFRESH_TOPIC,null);
+            return true;
+        }
+        return false;
     };
     };
 
 
     /**
     /**
@@ -127,8 +140,12 @@ public class SysNumberingStrategyServiceImpl implements ISysNumberingStrategySer
     @Transactional(rollbackFor = Exception.class)
     @Transactional(rollbackFor = Exception.class)
     public boolean insertSysNumberingStrategy(SysNumberingStrategyDTO source){
     public boolean insertSysNumberingStrategy(SysNumberingStrategyDTO source){
         SysNumberingStrategyPO strategyPO = SysNumberingStrategyMapper.INSTANCE.convertPO(source);
         SysNumberingStrategyPO strategyPO = SysNumberingStrategyMapper.INSTANCE.convertPO(source);
-        validateRoleSource(strategyPO);
-        return baseRepository.insert(strategyPO)!=0;
+        validateNumberingStrategySource(strategyPO);
+        if(baseRepository.insert(strategyPO)!=0){
+            eventBus.publishShare(STRATEGY_REFRESH_TOPIC,null);
+            return true;
+        }
+        return false;
     };
     };
 
 
     /**
     /**
@@ -140,10 +157,14 @@ public class SysNumberingStrategyServiceImpl implements ISysNumberingStrategySer
     @Override
     @Override
     @Transactional(rollbackFor = Exception.class)
     @Transactional(rollbackFor = Exception.class)
     public int removeSysNumberingStrategyByIds(Collection<String> ids){
     public int removeSysNumberingStrategyByIds(Collection<String> ids){
-        return baseRepository.deleteBatchIds(ids);
+        int result = baseRepository.deleteBatchIds(ids);
+        for (String id : ids) {
+            eventBus.publishShare(STRATEGY_REMOVE_TOPIC,id);
+        }
+        return result;
     };
     };
 
 
-    private void validateRoleSource(SysNumberingStrategyPO source){
+    private void validateNumberingStrategySource(SysNumberingStrategyPO source){
         SysNumberingStrategyPO role = baseRepository.selectOne(new LambdaQueryWrapper<SysNumberingStrategyPO>()
         SysNumberingStrategyPO role = baseRepository.selectOne(new LambdaQueryWrapper<SysNumberingStrategyPO>()
                 .eq(SysNumberingStrategyPO::getCode, source.getCode())
                 .eq(SysNumberingStrategyPO::getCode, source.getCode())
                 .last("limit 1"));
                 .last("limit 1"));
@@ -159,4 +180,9 @@ public class SysNumberingStrategyServiceImpl implements ISysNumberingStrategySer
         }
         }
         return result;
         return result;
     }
     }
+
+    @Subscribe(STRATEGY_REMOVE_TOPIC)
+    public void removeClient(String clientId){
+        strategyClientFactory.removeClient(clientId);
+    }
 }
 }

+ 42 - 0
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/oauth2/config/StdStpInterface.java

@@ -0,0 +1,42 @@
+package cn.tr.module.sys.oauth2.config;
+
+import cn.dev33.satoken.SaManager;
+import cn.dev33.satoken.stp.StpInterface;
+import cn.tr.module.sys.oauth2.service.CurrentUserService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Lazy;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.PostConstruct;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @ClassName : StdStpInterface
+ * @Description :
+ * @Author : LF
+ * @Date: 2023年05月30日
+ */
+@Component
+public class StdStpInterface implements StpInterface {
+    @Autowired
+    private CurrentUserService currentUserService;
+    @Autowired
+    @Lazy
+    private StdStpInterface self;
+
+    @PostConstruct
+    public void init(){
+        SaManager.setStpInterface(self);
+    }
+
+    @Override
+    public List<String> getPermissionList(Object loginId, String loginType) {
+        return new ArrayList<>(currentUserService.currentUserPermission());
+    }
+
+    @Override
+    public List<String> getRoleList(Object loginId, String loginType) {
+        return new ArrayList<>(currentUserService.currentUserRoleCode());
+    }
+}

+ 1 - 1
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/oauth2/dto/OAuth2UpdatePswDTO.java

@@ -19,7 +19,7 @@ public class OAuth2UpdatePswDTO implements Serializable {
 
 
     @ApiModelProperty(value = "旧密码",required = true)
     @ApiModelProperty(value = "旧密码",required = true)
     @NotEmpty(message = "旧密码不能为空")
     @NotEmpty(message = "旧密码不能为空")
-    @Length(min = 6, max = 16, message = "旧密码长度为 4-16 位")
+    @Length(min = 6, max = 16, message = "旧密码长度为 6-16 位")
     private String oldPsw;
     private String oldPsw;
 
 
     @ApiModelProperty(value = "旧密码",required = true)
     @ApiModelProperty(value = "旧密码",required = true)

+ 11 - 0
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/oauth2/service/CurrentUserService.java

@@ -7,11 +7,13 @@ import cn.tr.core.exception.ServiceException;
 import cn.tr.core.exception.TRExcCode;
 import cn.tr.core.exception.TRExcCode;
 import cn.tr.module.sys.tenant.service.ISysTenantService;
 import cn.tr.module.sys.tenant.service.ISysTenantService;
 import cn.tr.module.sys.user.dto.SysMenuDTO;
 import cn.tr.module.sys.user.dto.SysMenuDTO;
+import cn.tr.module.sys.user.dto.SysRoleDTO;
 import cn.tr.module.sys.user.dto.SysUserPortalListDTO;
 import cn.tr.module.sys.user.dto.SysUserPortalListDTO;
 import cn.tr.module.sys.user.enums.MenuEnum;
 import cn.tr.module.sys.user.enums.MenuEnum;
 import cn.tr.module.sys.user.service.ISysMenuService;
 import cn.tr.module.sys.user.service.ISysMenuService;
 import cn.tr.module.sys.user.service.ISysPortalMenuService;
 import cn.tr.module.sys.user.service.ISysPortalMenuService;
 import cn.tr.module.sys.user.service.ISysUserPortalService;
 import cn.tr.module.sys.user.service.ISysUserPortalService;
+import cn.tr.module.sys.user.service.ISysUserRoleService;
 import cn.tr.module.sys.user.vo.RouteItemVO;
 import cn.tr.module.sys.user.vo.RouteItemVO;
 import cn.tr.plugin.security.utils.SaTokenUtils;
 import cn.tr.plugin.security.utils.SaTokenUtils;
 import lombok.AllArgsConstructor;
 import lombok.AllArgsConstructor;
@@ -33,6 +35,7 @@ public class CurrentUserService {
     private final ISysMenuService menuService;
     private final ISysMenuService menuService;
     private final ISysPortalMenuService portalMenuService;
     private final ISysPortalMenuService portalMenuService;
     private final ISysUserPortalService userPortalService;
     private final ISysUserPortalService userPortalService;
+    private final ISysUserRoleService userRoleService;
     /**
     /**
      * 获取当前用户权限
      * 获取当前用户权限
      * @return
      * @return
@@ -47,6 +50,14 @@ public class CurrentUserService {
         return CollectionUtil.intersection(tenantPermissions,rolePermissions);
         return CollectionUtil.intersection(tenantPermissions,rolePermissions);
     };
     };
 
 
+    public Collection<String> currentUserRoleCode(){
+        String currentUserId = String.valueOf(SaTokenUtils.getStpUtil().getLoginId());
+        List<SysRoleDTO> roles = userRoleService.findAllRolesByUserId(currentUserId);
+        return roles.stream().
+                map(SysRoleDTO::getCode)
+                .collect(Collectors.toList());
+    }
+
     /**
     /**
      * 获取当前用户菜单
      * 获取当前用户菜单
      * @return
      * @return

+ 1 - 1
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/sms/controller/SysSmsTempController.java

@@ -85,7 +85,7 @@ public class SysSmsTempController extends BaseController{
     @PostMapping("/send/msg")
     @PostMapping("/send/msg")
     @ApiOperation(value="发送短信",notes = "权限: sms:temp:send")
     @ApiOperation(value="发送短信",notes = "权限: sms:temp:send")
     @OperateLog
     @OperateLog
-    @SaCheckPermission(" sms:temp:send")
+    @SaCheckPermission("sms:temp:send")
     public CommonResult<String> sendSms(@Valid @RequestBody SmsTemplateSendDTO source) {
     public CommonResult<String> sendSms(@Valid @RequestBody SmsTemplateSendDTO source) {
         return CommonResult.success(smsSendService.sendSingleSmsToAdmin(source.getMobile(), null,
         return CommonResult.success(smsSendService.sendSingleSmsToAdmin(source.getMobile(), null,
                 source.getTemplateCode(), source.getTemplateParams()));
                 source.getTemplateCode(), source.getTemplateParams()));

+ 1 - 0
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/sms/dto/SysSmsTempDTO.java

@@ -51,6 +51,7 @@ public class SysSmsTempDTO extends BaseDTO  {
 
 
     @ApiModelProperty(value = "模板编码", position = 6,required = true)
     @ApiModelProperty(value = "模板编码", position = 6,required = true)
     @NotBlank(message = "模板编码不能为空",groups = {Update.class,Insert.class})
     @NotBlank(message = "模板编码不能为空",groups = {Update.class,Insert.class})
+    @javax.validation.constraints.Pattern(regexp = "^[A-Za-z0-9]+$", message = "模板编码为数字以及字母",groups = {Insert.class,Update.class})
     private String code;
     private String code;
 
 
     @ApiModelProperty(value = "模板名称", position = 7,required = true)
     @ApiModelProperty(value = "模板名称", position = 7,required = true)

+ 0 - 18
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/storage/controller/SysStorageRecordController.java

@@ -51,24 +51,6 @@ public class SysStorageRecordController extends BaseController{
         return CommonResult.success(sysStorageRecordService.selectSysStorageRecordById(id));
         return CommonResult.success(sysStorageRecordService.selectSysStorageRecordById(id));
     }
     }
 
 
-    @ApiOperationSupport(author = "lf",order = 3)
-    @ApiOperation(value="添加存储记录",notes = "权限: storage:record:add")
-    @PostMapping("/add")
-    @OperateLog
-    @SaCheckPermission("storage:record:add")
-    public CommonResult<Boolean> add(@RequestBody@Validated(Insert.class) SysStorageRecordDTO source) {
-        return CommonResult.success(sysStorageRecordService.insertSysStorageRecord(source));
-    }
-
-    @ApiOperationSupport(author = "lf",order = 4)
-    @ApiOperation(value="通过主键id编辑存储记录",notes = "权限: storage:record:edit")
-    @PostMapping("/edit")
-    @OperateLog
-    @SaCheckPermission("storage:record:edit")
-    public CommonResult<Boolean> edit(@RequestBody@Validated(Update.class) SysStorageRecordDTO source) {
-        return CommonResult.success(sysStorageRecordService.updateSysStorageRecordById(source));
-    }
-
     @ApiOperationSupport(author = "lf",order = 5)
     @ApiOperationSupport(author = "lf",order = 5)
     @ApiOperation(value="删除存储记录",notes = "权限: storage:record:remove")
     @ApiOperation(value="删除存储记录",notes = "权限: storage:record:remove")
     @PostMapping("/removeByIds")
     @PostMapping("/removeByIds")

+ 0 - 23
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/storage/dto/FileUploadDTO.java

@@ -1,23 +0,0 @@
-package cn.tr.module.sys.storage.dto;
-
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
-import lombok.Data;
-import org.springframework.web.multipart.MultipartFile;
-
-/**
- * @ClassName : FileUploadDTO
- * @Description :
- * @Author : LF
- * @Date: 2023年05月11日
- */
-@Data
-@ApiModel("文件上传")
-public class FileUploadDTO {
-    @ApiModelProperty("文件上传")
-    private MultipartFile file;
-    @ApiModelProperty("文件所属目录id")
-    private String cateId;
-    @ApiModelProperty("文件存储配置id")
-    private String configId;
-}

+ 4 - 1
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/tenant/dto/SysTenantAddDTO.java

@@ -1,6 +1,7 @@
 package cn.tr.module.sys.tenant.dto;
 package cn.tr.module.sys.tenant.dto;
 
 
 
 
+import cn.tr.core.validation.Insert;
 import cn.tr.core.validation.Update;
 import cn.tr.core.validation.Update;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import io.swagger.annotations.ApiModelProperty;
@@ -9,6 +10,7 @@ import org.hibernate.validator.constraints.Length;
 
 
 import javax.validation.constraints.NotEmpty;
 import javax.validation.constraints.NotEmpty;
 import javax.validation.constraints.NotNull;
 import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Pattern;
 import java.io.Serializable;
 import java.io.Serializable;
 
 
 /**
 /**
@@ -38,7 +40,8 @@ public class SysTenantAddDTO implements Serializable {
 
 
     @ApiModelProperty(value = "管理账号",required = true)
     @ApiModelProperty(value = "管理账号",required = true)
     @NotEmpty(message = "管理账号不能为空",groups = {Integer.class, Update.class})
     @NotEmpty(message = "管理账号不能为空",groups = {Integer.class, Update.class})
-    @Length(min = 4,max = 16,message = "管理账号长度在4~16之间")
+    @Length(min = 4,max = 16,message = "管理账号长度在4~16之间",groups = {Integer.class, Update.class})
+    @Pattern(regexp = "^[A-Za-z0-9]+$", message = "管理账号格式为数字以及字母",groups = {Insert.class,Update.class})
     private String username;
     private String username;
 
 
     @ApiModelProperty("联系人电话")
     @ApiModelProperty("联系人电话")

+ 4 - 0
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/tenant/dto/SysTenantCommonDTO.java

@@ -8,9 +8,11 @@ import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.EqualsAndHashCode;
+import org.hibernate.validator.constraints.Length;
 
 
 import javax.validation.constraints.NotEmpty;
 import javax.validation.constraints.NotEmpty;
 import javax.validation.constraints.NotNull;
 import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Pattern;
 
 
 /**
 /**
  * @ClassName : SysTenantQueryDTO
  * @ClassName : SysTenantQueryDTO
@@ -39,6 +41,8 @@ public class SysTenantCommonDTO extends BaseDTO {
     private String packageName;
     private String packageName;
 
 
     @ApiModelProperty(value = "租户管理用户名",readOnly = true)
     @ApiModelProperty(value = "租户管理用户名",readOnly = true)
+    @Length(min = 4, max = 16, message = "账号长度为 4-16 位")
+    @Pattern(regexp = "^[A-Za-z0-9]+$", message = "账号格式为数字以及字母")
     private String username;
     private String username;
 
 
     @ApiModelProperty(value = "租户类型")
     @ApiModelProperty(value = "租户类型")

+ 2 - 2
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/tenant/dto/SysTenantPackageDTO.java

@@ -9,8 +9,7 @@ import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.EqualsAndHashCode;
 
 
 import javax.validation.constraints.NotEmpty;
 import javax.validation.constraints.NotEmpty;
-import javax.validation.constraints.NotNull;
-import java.io.Serializable;
+import javax.validation.constraints.Pattern;
 
 
 /**
 /**
  * @ClassName : SysTenantPackageDTO
  * @ClassName : SysTenantPackageDTO
@@ -28,6 +27,7 @@ public class SysTenantPackageDTO extends BaseDTO {
 
 
     @ApiModelProperty(value = "套餐编码",required = true)
     @ApiModelProperty(value = "套餐编码",required = true)
     @NotEmpty(message = "套餐编码不能为空",groups = {Insert.class, Update.class})
     @NotEmpty(message = "套餐编码不能为空",groups = {Insert.class, Update.class})
+    @Pattern(regexp = "^[A-Za-z0-9]+$", message = "套餐编码为数字以及字母",groups = {Insert.class,Update.class})
     private String packageCode;
     private String packageCode;
 
 
     @ApiModelProperty(value = "套餐类型 sys、系统套餐 custom、自定义套餐",required = true)
     @ApiModelProperty(value = "套餐类型 sys、系统套餐 custom、自定义套餐",required = true)

+ 2 - 0
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/tenant/dto/SysTenantQueryDTO.java

@@ -21,4 +21,6 @@ public class SysTenantQueryDTO {
     private String contactMobile;
     private String contactMobile;
     @ApiModelProperty("租户状态")
     @ApiModelProperty("租户状态")
     private Boolean disable;
     private Boolean disable;
+    @ApiModelProperty(value = "套餐id",hidden = true)
+    private String packageId;
 }
 }

+ 39 - 3
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/tenant/service/impl/SysTenantPackageMenuServiceImpl.java

@@ -4,17 +4,24 @@ import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.core.util.StrUtil;
 import cn.tr.core.exception.ServiceException;
 import cn.tr.core.exception.ServiceException;
 import cn.tr.core.exception.TRExcCode;
 import cn.tr.core.exception.TRExcCode;
+import cn.tr.module.sys.tenant.dto.SysTenantCommonDTO;
 import cn.tr.module.sys.tenant.dto.SysTenantPackageDTO;
 import cn.tr.module.sys.tenant.dto.SysTenantPackageDTO;
+import cn.tr.module.sys.tenant.dto.SysTenantQueryDTO;
 import cn.tr.module.sys.tenant.enums.PackageEnum;
 import cn.tr.module.sys.tenant.enums.PackageEnum;
 import cn.tr.module.sys.tenant.po.SysTenantPackageMenuPO;
 import cn.tr.module.sys.tenant.po.SysTenantPackageMenuPO;
 import cn.tr.module.sys.tenant.repository.SysTenantPackageMenuRepository;
 import cn.tr.module.sys.tenant.repository.SysTenantPackageMenuRepository;
 import cn.tr.module.sys.tenant.service.ISysTenantPackageMenuService;
 import cn.tr.module.sys.tenant.service.ISysTenantPackageMenuService;
 import cn.tr.module.sys.tenant.service.ISysTenantPackageService;
 import cn.tr.module.sys.tenant.service.ISysTenantPackageService;
+import cn.tr.module.sys.tenant.service.ISysTenantService;
 import cn.tr.module.sys.user.dto.SysMenuDTO;
 import cn.tr.module.sys.user.dto.SysMenuDTO;
+import cn.tr.module.sys.user.dto.SysPortalDTO;
 import cn.tr.module.sys.user.dto.SysRoleDTO;
 import cn.tr.module.sys.user.dto.SysRoleDTO;
 import cn.tr.core.enums.CreateEnum;
 import cn.tr.core.enums.CreateEnum;
 import cn.tr.module.sys.user.service.ISysMenuService;
 import cn.tr.module.sys.user.service.ISysMenuService;
+import cn.tr.module.sys.user.service.ISysPortalMenuService;
+import cn.tr.module.sys.user.service.ISysPortalService;
 import cn.tr.module.sys.user.service.ISysRoleService;
 import cn.tr.module.sys.user.service.ISysRoleService;
+import cn.tr.plugin.biz.tenant.utils.TenantUtils;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -47,6 +54,18 @@ public class SysTenantPackageMenuServiceImpl  extends ServiceImpl<SysTenantPacka
     @Lazy
     @Lazy
     private ISysMenuService menuService;
     private ISysMenuService menuService;
 
 
+    @Autowired
+    @Lazy
+    private ISysPortalMenuService portalMenuService;
+
+    @Autowired
+    @Lazy
+    private ISysPortalService portalService;
+
+    @Autowired
+    @Lazy
+    private ISysTenantService tenantService;
+
     @Override
     @Override
     @Transactional(rollbackFor = Exception.class)
     @Transactional(rollbackFor = Exception.class)
     public void assignPackageMenu(String packageId,List<String> menuIds) {
     public void assignPackageMenu(String packageId,List<String> menuIds) {
@@ -54,14 +73,14 @@ public class SysTenantPackageMenuServiceImpl  extends ServiceImpl<SysTenantPacka
         if(StrUtil.equals(tenantPackage.getType(), CreateEnum.sys.name())){
         if(StrUtil.equals(tenantPackage.getType(), CreateEnum.sys.name())){
             throw new ServiceException(TRExcCode.SYSTEM_ERROR_B0001,"无法对系统套餐进行操作");
             throw new ServiceException(TRExcCode.SYSTEM_ERROR_B0001,"无法对系统套餐进行操作");
         }
         }
-        Collection<SysRoleDTO> sysRoles = roleService.findAllSysRoles();
+
         baseMapper.delete(
         baseMapper.delete(
                 new LambdaQueryWrapper<SysTenantPackageMenuPO>().eq(SysTenantPackageMenuPO::getPackageId,packageId)
                 new LambdaQueryWrapper<SysTenantPackageMenuPO>().eq(SysTenantPackageMenuPO::getPackageId,packageId)
         );
         );
-        self.delCacheMenuIdByPackageId(packageId);
         if(CollectionUtil.isNotEmpty(menuIds)){
         if(CollectionUtil.isNotEmpty(menuIds)){
             List<SysTenantPackageMenuPO> packageMenus = menuIds
             List<SysTenantPackageMenuPO> packageMenus = menuIds
                     .stream()
                     .stream()
+                    .distinct()
                     .map(menuId -> {
                     .map(menuId -> {
                         SysTenantPackageMenuPO result = new SysTenantPackageMenuPO();
                         SysTenantPackageMenuPO result = new SysTenantPackageMenuPO();
                         result.setMenuId(menuId);
                         result.setMenuId(menuId);
@@ -71,7 +90,24 @@ public class SysTenantPackageMenuServiceImpl  extends ServiceImpl<SysTenantPacka
                     .collect(Collectors.toList());
                     .collect(Collectors.toList());
             this.saveBatch(packageMenus);
             this.saveBatch(packageMenus);
         }
         }
-        sysRoles.forEach(role->menuService.delRoleMenusCache(role.getId()));
+        self.delCacheMenuIdByPackageId(packageId);
+
+
+        //对套餐绑定的租户进行操作
+        SysTenantQueryDTO query = new SysTenantQueryDTO();
+        query.setPackageId(packageId);
+        List<SysTenantCommonDTO> tenants = tenantService.selectSysTenantList(query);
+        if (CollectionUtil.isNotEmpty(tenants)) {
+            for (SysTenantCommonDTO tenant : tenants) {
+                TenantUtils.execute(tenant.getId(),()->{
+                    Collection<SysRoleDTO> sysRoles = roleService.findAllSysRoles();
+                    Collection<SysPortalDTO> sysPortals = portalService.findAllSysPortals();
+
+                    sysRoles.forEach(role->menuService.delRoleMenusCache(role.getId()));
+                    sysPortals.forEach(portal->portalMenuService.delCacheMenusByPortalId(portal.getId()));
+                });
+            }
+        }
     }
     }
 
 
     @Override
     @Override

+ 7 - 3
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/tenant/service/impl/SysTenantServiceImpl.java

@@ -18,6 +18,7 @@ import cn.tr.module.sys.tenant.po.SysTenantPO;
 import cn.tr.module.sys.tenant.repository.SysTenantRepository;
 import cn.tr.module.sys.tenant.repository.SysTenantRepository;
 import cn.tr.module.sys.user.service.*;
 import cn.tr.module.sys.user.service.*;
 import cn.tr.module.sys.tenant.service.ISysTenantService;
 import cn.tr.module.sys.tenant.service.ISysTenantService;
+import cn.tr.plugin.biz.tenant.context.TenantContextHolder;
 import cn.tr.plugin.biz.tenant.utils.TenantUtils;
 import cn.tr.plugin.biz.tenant.utils.TenantUtils;
 import com.baomidou.mybatisplus.core.toolkit.IdWorker;
 import com.baomidou.mybatisplus.core.toolkit.IdWorker;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -125,11 +126,15 @@ public class SysTenantServiceImpl implements ISysTenantService {
 
 
     @Override
     @Override
     public int removeSysTenantByIds(Collection<String> ids) {
     public int removeSysTenantByIds(Collection<String> ids) {
+        String tenantId = TenantContextHolder.getTenantId();
         List<SysTenantPO> tenants = tenantRepository.selectBatchIds(ids);
         List<SysTenantPO> tenants = tenantRepository.selectBatchIds(ids);
-        for (SysTenantPO role : tenants) {
-            if (StrUtil.equals(role.getType(), CreateEnum.sys.name())) {
+        for (SysTenantPO tenant : tenants) {
+            if (StrUtil.equals(tenant.getType(), CreateEnum.sys.name())) {
                 throw new ServiceException(TRExcCode.SYSTEM_ERROR_B0001,"无法对系统租户进行操作");
                 throw new ServiceException(TRExcCode.SYSTEM_ERROR_B0001,"无法对系统租户进行操作");
             }
             }
+            if(StrUtil.equals(tenantId,tenant.getId())){
+                throw new ServiceException(TRExcCode.SYSTEM_ERROR_B0001,"无法删除自身的租户信息");
+            }
         }
         }
         return tenantRepository.deleteBatchIds(ids);
         return tenantRepository.deleteBatchIds(ids);
     }
     }
@@ -146,7 +151,6 @@ public class SysTenantServiceImpl implements ISysTenantService {
         org.setCode("admin");
         org.setCode("admin");
         org.setName("系统管理员工作台");
         org.setName("系统管理员工作台");
         org.setType(CreateEnum.sys.name());
         org.setType(CreateEnum.sys.name());
-        org.setSort(1);
         return org;
         return org;
     }
     }
 
 

+ 11 - 2
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/controller/SysMenuController.java

@@ -3,7 +3,6 @@ package cn.tr.module.sys.user.controller;
 import cn.dev33.satoken.annotation.SaCheckPermission;
 import cn.dev33.satoken.annotation.SaCheckPermission;
 import cn.tr.core.pojo.CommonResult;
 import cn.tr.core.pojo.CommonResult;
 import cn.tr.core.pojo.TableDataInfo;
 import cn.tr.core.pojo.TableDataInfo;
-import cn.tr.core.utils.TreeUtil;
 import cn.tr.core.validation.Insert;
 import cn.tr.core.validation.Insert;
 import cn.tr.core.validation.Update;
 import cn.tr.core.validation.Update;
 import cn.tr.module.sys.tenant.service.ISysTenantService;
 import cn.tr.module.sys.tenant.service.ISysTenantService;
@@ -20,6 +19,8 @@ import org.springframework.web.bind.annotation.*;
 
 
 import java.util.Collection;
 import java.util.Collection;
 import java.util.*;
 import java.util.*;
+import java.util.stream.Collectors;
+
 /**
 /**
  * @ClassName : SysMenuController
  * @ClassName : SysMenuController
  * @Description :
  * @Description :
@@ -32,11 +33,15 @@ import java.util.*;
 @AllArgsConstructor
 @AllArgsConstructor
 public class SysMenuController extends BaseController {
 public class SysMenuController extends BaseController {
     private final ISysMenuService menuService;
     private final ISysMenuService menuService;
-
+    private final ISysTenantService tenantService;
     @PostMapping("/query/tree")
     @PostMapping("/query/tree")
     @ApiOperationSupport(author = "lf")
     @ApiOperationSupport(author = "lf")
     @ApiOperation(value = "菜单树",notes = "权限: 无")
     @ApiOperation(value = "菜单树",notes = "权限: 无")
     public CommonResult<List<SysMenuDTO>> selectTree(@RequestBody SysMenuQueryDTO query){
     public CommonResult<List<SysMenuDTO>> selectTree(@RequestBody SysMenuQueryDTO query){
+        query.setTenantMenuIds(tenantService.currentTenantMenus()
+                .stream()
+                .map(SysMenuDTO::getId)
+                .collect(Collectors.toSet()));
         return CommonResult.success(menuService.selectSysMenuTree(query));
         return CommonResult.success(menuService.selectSysMenuTree(query));
     }
     }
 
 
@@ -44,6 +49,10 @@ public class SysMenuController extends BaseController {
     @ApiOperationSupport(author = "lf")
     @ApiOperationSupport(author = "lf")
     @ApiOperation(value = "根据条件查询菜单",notes = "权限: 无")
     @ApiOperation(value = "根据条件查询菜单",notes = "权限: 无")
     public TableDataInfo<SysMenuDTO> selectList(@RequestBody SysMenuQueryDTO query){
     public TableDataInfo<SysMenuDTO> selectList(@RequestBody SysMenuQueryDTO query){
+        query.setTenantMenuIds(tenantService.currentTenantMenus()
+                .stream()
+                .map(SysMenuDTO::getId)
+                .collect(Collectors.toSet()));
         startPage();
         startPage();
         return getDataTable(menuService.selectSysMenuList(query));
         return getDataTable(menuService.selectSysMenuList(query));
     }
     }

+ 2 - 0
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/controller/SysPortalController.java

@@ -1,6 +1,7 @@
 package cn.tr.module.sys.user.controller;
 package cn.tr.module.sys.user.controller;
 
 
 import cn.dev33.satoken.annotation.SaCheckPermission;
 import cn.dev33.satoken.annotation.SaCheckPermission;
+import cn.tr.core.enums.CreateEnum;
 import cn.tr.core.pojo.CommonResult;
 import cn.tr.core.pojo.CommonResult;
 import cn.tr.core.pojo.TableDataInfo;
 import cn.tr.core.pojo.TableDataInfo;
 import cn.tr.core.validation.Insert;
 import cn.tr.core.validation.Insert;
@@ -80,6 +81,7 @@ public class SysPortalController extends BaseController {
     @ApiOperation(value = "新增门户",notes = "权限: sys:portal:add")
     @ApiOperation(value = "新增门户",notes = "权限: sys:portal:add")
     @OperateLog
     @OperateLog
     public CommonResult<Boolean> add(@RequestBody@Validated(Insert.class) SysPortalDTO source){
     public CommonResult<Boolean> add(@RequestBody@Validated(Insert.class) SysPortalDTO source){
+        source.setType(CreateEnum.custom.name());
         return CommonResult.success(portalService.insertSysPortal(source));
         return CommonResult.success(portalService.insertSysPortal(source));
     }
     }
 
 

+ 8 - 8
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/controller/SysPositionController.java

@@ -30,14 +30,14 @@ import java.util.Collection;
 @Api(tags = "岗位")
 @Api(tags = "岗位")
 @AllArgsConstructor
 @AllArgsConstructor
 public class SysPositionController extends BaseController {
 public class SysPositionController extends BaseController {
-    private final ISysPositionService PositionService;
+    private final ISysPositionService positionService;
 
 
     @PostMapping("/query/page")
     @PostMapping("/query/page")
     @ApiOperationSupport(author = "lf",order = 1)
     @ApiOperationSupport(author = "lf",order = 1)
     @ApiOperation(value = "根据条件查询岗位",notes = "权限:无")
     @ApiOperation(value = "根据条件查询岗位",notes = "权限:无")
     public TableDataInfo<SysPositionDTO> selectList(@RequestBody SysPositionQueryDTO query){
     public TableDataInfo<SysPositionDTO> selectList(@RequestBody SysPositionQueryDTO query){
         startPage();
         startPage();
-        return getDataTable(PositionService.selectSysPositionList(query));
+        return getDataTable(positionService.selectSysPositionList(query));
     }
     }
 
 
     @GetMapping("/detail/{id}")
     @GetMapping("/detail/{id}")
@@ -45,7 +45,7 @@ public class SysPositionController extends BaseController {
     @ApiOperation(value = "根据id查询岗位",notes = "权限: sys:pos:query")
     @ApiOperation(value = "根据id查询岗位",notes = "权限: sys:pos:query")
     @SaCheckPermission("sys:pos:query")
     @SaCheckPermission("sys:pos:query")
     public CommonResult<SysPositionDTO> findById(@PathVariable("id") String id){
     public CommonResult<SysPositionDTO> findById(@PathVariable("id") String id){
-        return CommonResult.success(PositionService.selectSysPositionById(id));
+        return CommonResult.success(positionService.selectSysPositionById(id));
     }
     }
 
 
     @PostMapping("/edit")
     @PostMapping("/edit")
@@ -54,7 +54,7 @@ public class SysPositionController extends BaseController {
     @ApiOperation(value = "根据id更新岗位",notes = "权限: sys:pos:edit")
     @ApiOperation(value = "根据id更新岗位",notes = "权限: sys:pos:edit")
     @OperateLog
     @OperateLog
     public CommonResult<Boolean> edit(@RequestBody@Validated(Update.class) SysPositionDTO source){
     public CommonResult<Boolean> edit(@RequestBody@Validated(Update.class) SysPositionDTO source){
-        return CommonResult.success(PositionService.updateSysPositionById(source));
+        return CommonResult.success(positionService.updateSysPositionById(source));
     }
     }
 
 
     @PostMapping("/add")
     @PostMapping("/add")
@@ -63,16 +63,16 @@ public class SysPositionController extends BaseController {
     @ApiOperation(value = "新增岗位",notes = "权限: sys:pos:add")
     @ApiOperation(value = "新增岗位",notes = "权限: sys:pos:add")
     @OperateLog
     @OperateLog
     public CommonResult<Boolean> add(@RequestBody@Validated(Insert.class) SysPositionDTO source){
     public CommonResult<Boolean> add(@RequestBody@Validated(Insert.class) SysPositionDTO source){
-        return CommonResult.success(PositionService.insertSysPosition(source));
+        return CommonResult.success(positionService.insertSysPosition(source));
     }
     }
 
 
-    @PostMapping("/deleteByIds")
+    @PostMapping("/removeByIds")
     @ApiOperationSupport(author = "lf",order = 5)
     @ApiOperationSupport(author = "lf",order = 5)
     @ApiOperation(value = "删除岗位",notes = "权限: sys:pos:remove")
     @ApiOperation(value = "删除岗位",notes = "权限: sys:pos:remove")
     @SaCheckPermission("sys:pos:remove")
     @SaCheckPermission("sys:pos:remove")
     @OperateLog
     @OperateLog
-    public CommonResult<Integer> deleteByIds(@RequestBody Collection<String> ids){
-        return CommonResult.success(PositionService.deleteSysPositionByIds(ids));
+    public CommonResult<Integer> removeByIds(@RequestBody Collection<String> ids){
+        return CommonResult.success(positionService.deleteSysPositionByIds(ids));
     }
     }
 
 
 
 

+ 5 - 1
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/dto/SysMenuQueryDTO.java

@@ -5,6 +5,7 @@ import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.Data;
 
 
 import java.io.Serializable;
 import java.io.Serializable;
+import java.util.Set;
 
 
 /**
 /**
  * @ClassName : SysMenuQueryDTO
  * @ClassName : SysMenuQueryDTO
@@ -23,8 +24,11 @@ public class SysMenuQueryDTO implements Serializable {
     private String name;
     private String name;
 
 
     @ApiModelProperty("菜单类型")
     @ApiModelProperty("菜单类型")
-    private String menuType;
+    private Set<String> menuType;
 
 
     @ApiModelProperty("菜单状态")
     @ApiModelProperty("菜单状态")
     private Boolean disable;
     private Boolean disable;
+
+    @ApiModelProperty(value = "租户菜单id",hidden = true)
+    private Set<String> tenantMenuIds;
 }
 }

+ 4 - 1
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/dto/SysOrgDTO.java

@@ -36,7 +36,10 @@ public class SysOrgDTO extends TreeNode<String> {
 
 
     @ApiModelProperty(value = "部门领导人")
     @ApiModelProperty(value = "部门领导人")
     private String leaderUserId;
     private String leaderUserId;
-    
+
+    @ApiModelProperty(value = "领导人昵称",readOnly = true)
+    private String leaderName;
+
     @ApiModelProperty(value = "部门邮箱")
     @ApiModelProperty(value = "部门邮箱")
     private String email;
     private String email;
 
 

+ 5 - 4
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/dto/SysPortalDTO.java

@@ -1,12 +1,14 @@
 package cn.tr.module.sys.user.dto;
 package cn.tr.module.sys.user.dto;
 
 
 import cn.tr.core.enums.CreateEnum;
 import cn.tr.core.enums.CreateEnum;
+import cn.tr.core.validation.Insert;
 import cn.tr.core.validation.Update;
 import cn.tr.core.validation.Update;
 import cn.tr.plugin.mybatis.pojo.BaseDTO;
 import cn.tr.plugin.mybatis.pojo.BaseDTO;
 import io.swagger.annotations.ApiModelProperty;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.Data;
 
 
 import javax.validation.constraints.NotNull;
 import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Pattern;
 
 
 /**
 /**
  * @ClassName : SysRolePO
  * @ClassName : SysRolePO
@@ -21,9 +23,12 @@ public class SysPortalDTO  extends BaseDTO {
     private String id;
     private String id;
 
 
     @ApiModelProperty(value = "门户编码",required = true)
     @ApiModelProperty(value = "门户编码",required = true)
+    @NotNull(message = "门户编码不能为空",groups = {Insert.class,Update.class})
+    @Pattern(regexp = "^[A-Za-z0-9]+$", message = "字典编码为数字以及字母",groups = {Insert.class,Update.class})
     private String code;
     private String code;
 
 
     @ApiModelProperty(value = "门户名称",required = true)
     @ApiModelProperty(value = "门户名称",required = true)
+    @NotNull(message = "门户名称不能为空",groups = {Insert.class,Update.class})
     private String name;
     private String name;
 
 
     /**
     /**
@@ -34,8 +39,4 @@ public class SysPortalDTO  extends BaseDTO {
 
 
     @ApiModelProperty("备注")
     @ApiModelProperty("备注")
     private String remark;
     private String remark;
-
-    @ApiModelProperty(value = "排序",required = true)
-    private Integer sort;
-
 }
 }

+ 8 - 5
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/dto/SysPositionDTO.java

@@ -8,6 +8,8 @@ import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.EqualsAndHashCode;
 
 
 import javax.validation.constraints.NotEmpty;
 import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Pattern;
 import java.io.Serializable;
 import java.io.Serializable;
 
 
 /**
 /**
@@ -20,22 +22,23 @@ public class SysPositionDTO extends BaseDTO {
     private static final long serialVersionUID = -7314723402227370899L;
     private static final long serialVersionUID = -7314723402227370899L;
     /** id */
     /** id */
     @ApiModelProperty(value = "id")
     @ApiModelProperty(value = "id")
-    @NotEmpty(message = "岗位id不能为空",groups = {Update.class})
+    @NotNull(message = "岗位id不能为空",groups = {Update.class})
     private String id;
     private String id;
 
 
     /** 名称 */
     /** 名称 */
     @ApiModelProperty(value = "岗位名称",required = true)
     @ApiModelProperty(value = "岗位名称",required = true)
-    @NotEmpty(message = "岗位名称不能为空",groups = {Insert.class,Update.class})
+    @NotNull(message = "岗位名称不能为空",groups = {Insert.class,Update.class})
     private String posName;
     private String posName;
 
 
     /** 编码 */
     /** 编码 */
     @ApiModelProperty(value = "岗位编码",required = true)
     @ApiModelProperty(value = "岗位编码",required = true)
-    @NotEmpty(message = "岗位编码不能为空",groups = {Insert.class,Update.class})
+    @NotNull(message = "岗位编码不能为空",groups = {Insert.class,Update.class})
+    @Pattern(regexp = "^[A-Za-z0-9]+$", message = "岗位编码为数字以及字母",groups = {Insert.class,Update.class})
     private String posCode;
     private String posCode;
 
 
     /** 排序码 */
     /** 排序码 */
     @ApiModelProperty(value = "排序码",required = true)
     @ApiModelProperty(value = "排序码",required = true)
-    @NotEmpty(message = "岗位排序码不能为空",groups = {Insert.class,Update.class})
+    @NotNull(message = "岗位排序码不能为空",groups = {Insert.class,Update.class})
     private Integer sort;
     private Integer sort;
 
 
     @ApiModelProperty(value = "备注")
     @ApiModelProperty(value = "备注")
@@ -43,6 +46,6 @@ public class SysPositionDTO extends BaseDTO {
 
 
 
 
     @ApiModelProperty(value = "状态 0正常;1停用",required = true)
     @ApiModelProperty(value = "状态 0正常;1停用",required = true)
-    @NotEmpty(message = "岗位状态不能为空",groups = {Insert.class,Update.class})
+    @NotNull(message = "岗位状态不能为空",groups = {Insert.class,Update.class})
     private Boolean disable;
     private Boolean disable;
 }
 }

+ 2 - 0
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/dto/SysRoleDTO.java

@@ -9,6 +9,7 @@ import lombok.EqualsAndHashCode;
 import java.util.*;
 import java.util.*;
 import javax.validation.constraints.NotEmpty;
 import javax.validation.constraints.NotEmpty;
 import javax.validation.constraints.NotNull;
 import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Pattern;
 
 
 /**
 /**
  * @ClassName : SysRolePO
  * @ClassName : SysRolePO
@@ -26,6 +27,7 @@ public class SysRoleDTO extends BaseDTO {
 
 
     @ApiModelProperty(value = "角色编码",required = true)
     @ApiModelProperty(value = "角色编码",required = true)
     @NotEmpty(message = "角色编码不能为空",groups = {Insert.class, Update.class})
     @NotEmpty(message = "角色编码不能为空",groups = {Insert.class, Update.class})
+    @Pattern(regexp = "^[A-Za-z0-9]+$", message = "角色编码为数字以及字母",groups = {Insert.class,Update.class})
     private String code;
     private String code;
 
 
     @ApiModelProperty(value = "角色名称",required = true)
     @ApiModelProperty(value = "角色名称",required = true)

+ 3 - 1
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/dto/SysUserDTO.java

@@ -48,6 +48,8 @@ public class SysUserDTO extends BaseDTO {
      * 密码
      * 密码
      */
      */
     @JsonIgnoreProperties(allowSetters = true)
     @JsonIgnoreProperties(allowSetters = true)
+    @NotNull(message = "密码不能为空",groups = {Insert.class})
+    @Length(min = 6,max = 16,message = "密码长度在6~16之间",groups = {Insert.class})
     private String password;
     private String password;
 
 
     @ApiModelProperty("角色id")
     @ApiModelProperty("角色id")
@@ -90,7 +92,7 @@ public class SysUserDTO extends BaseDTO {
     /**
     /**
      * 岗位id
      * 岗位id
      */
      */
-    private List<String> postIds;
+    private Set<String> postIds;
 
 
     /**
     /**
      * 用户头像
      * 用户头像

+ 31 - 0
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/dto/SysUserPositionDTO.java

@@ -0,0 +1,31 @@
+package cn.tr.module.sys.user.dto;
+
+import lombok.ToString;
+import cn.tr.core.validation.Update;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import javax.validation.constraints.*;
+import java.io.Serializable;
+/**
+ * 用户-岗位表传输对象
+ *
+ * @author lf
+ * @date  2023/05/31 14:32
+ **/
+@Data
+@ApiModel("用户-岗位表传输对象")
+@ToString
+public class SysUserPositionDTO implements Serializable {
+    private static final long serialVersionUID = 1L;
+    @ApiModelProperty(value = "id", position = 1)
+     @NotBlank  (message = "主键不能为空",groups = {Update.class})
+    private String id;
+
+    @ApiModelProperty(value = "user_id", position = 2)
+    private String userId;
+
+    @ApiModelProperty(value = "position_id", position = 3)
+    private String positionId;
+
+}

+ 13 - 0
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/excel/converter/SysOrgConverter.java

@@ -0,0 +1,13 @@
+package cn.tr.module.sys.user.excel.converter;
+
+import com.alibaba.excel.converters.Converter;
+
+/**
+ * @ClassName : SysOrgConverter
+ * @Description : 组织转换器
+ * @Author : LF
+ * @Date: 2023年05月30日
+ */
+
+public class SysOrgConverter implements Converter<String> {
+}

+ 27 - 0
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/excel/converter/SysUserConverter.java

@@ -0,0 +1,27 @@
+package cn.tr.module.sys.user.excel.converter;
+
+import com.alibaba.excel.converters.Converter;
+import com.alibaba.excel.metadata.GlobalConfiguration;
+import com.alibaba.excel.metadata.data.ReadCellData;
+import com.alibaba.excel.metadata.data.WriteCellData;
+import com.alibaba.excel.metadata.property.ExcelContentProperty;
+
+/**
+ * @ClassName : SysUserConverter
+ * @Description : 系统用户转换器
+ * @Author : LF
+ * @Date: 2023年05月30日
+ */
+
+public class SysUserConverter implements Converter<String> {
+
+    @Override
+    public String convertToJavaData(ReadCellData<?> cellData, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) throws Exception {
+        return null;
+    }
+
+    @Override
+    public WriteCellData<?> convertToExcelData(String value, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) throws Exception {
+        return null;
+    }
+}

+ 47 - 0
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/excel/dto/SysOrgExcelDTO.java

@@ -0,0 +1,47 @@
+package cn.tr.module.sys.user.excel.dto;
+
+import cn.tr.module.sys.user.excel.converter.SysOrgConverter;
+import cn.tr.module.sys.user.excel.converter.SysUserConverter;
+import com.alibaba.excel.annotation.ExcelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+import java.io.Serializable;
+
+/**
+ * @ClassName : SysOrgExcelDTO
+ * @Description : 组织导入导出所用的实体类
+ * @Author : LF
+ * @Date: 2023年05月30日
+ */
+@Data
+public class SysOrgExcelDTO implements Serializable {
+
+    @NotNull(message = "部门名称不能为空")
+    @ExcelProperty("部门名称")
+    private String name;
+
+    /**
+     * 上级部门
+     */
+    @ExcelProperty(value = "上级部门",converter = SysOrgConverter.class )
+    private String parentId;
+
+    /**
+     * 负责人
+     */
+    @ExcelProperty(value = "负责人",converter = SysUserConverter.class)
+    private String leaderUserId;
+
+    /**
+     * 电话
+     */
+    @ExcelProperty("电话号码")
+    private String phone;
+
+    /**
+     * 邮箱
+     */
+    @ExcelProperty("邮箱地址")
+    private String email;
+}

+ 2 - 0
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/mapper/SysOrgMapper.java

@@ -28,4 +28,6 @@ public interface SysOrgMapper {
     SysOrgPO toSysOrgPO(SysOrgDTO source);
     SysOrgPO toSysOrgPO(SysOrgDTO source);
     
     
     List<SysOrgTreeDTO> toSysOrgTree(List<SysOrgDTO> source);
     List<SysOrgTreeDTO> toSysOrgTree(List<SysOrgDTO> source);
+
+    SysOrgTreeDTO convertSysOrgTreeNode(SysOrgDTO source);
 }
 }

+ 28 - 0
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/mapper/SysUserPositionMapper.java

@@ -0,0 +1,28 @@
+package cn.tr.module.sys.user.mapper;
+
+import cn.tr.module.sys.user.po.SysUserPositionPO;
+import cn.tr.module.sys.user.dto.SysUserPositionDTO;
+import org.mapstruct.Mapper;
+import org.mapstruct.factory.Mappers;
+
+import java.util.List;
+
+/**
+* 用户-岗位表映射工具
+*
+* @author lf
+* @date  2023/05/31 14:32
+**/
+@Mapper
+public interface SysUserPositionMapper {
+    SysUserPositionMapper INSTANCE = Mappers.getMapper(SysUserPositionMapper.class);
+
+    SysUserPositionPO convertPO(SysUserPositionDTO source);
+
+    SysUserPositionDTO convertDto(SysUserPositionPO source);
+
+    List<SysUserPositionDTO> convertDtoList(List<SysUserPositionPO> source);
+
+    List<SysUserPositionPO> convertPOList(List<SysUserPositionDTO> source);
+
+}

+ 0 - 3
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/po/SysPortalPO.java

@@ -37,7 +37,4 @@ public class SysPortalPO extends TenantPO {
     @Comment("备注")
     @Comment("备注")
     private String remark;
     private String remark;
 
 
-    @Comment("排序")
-    private Integer sort;
-
 }
 }

+ 35 - 0
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/po/SysUserPositionPO.java

@@ -0,0 +1,35 @@
+package cn.tr.module.sys.user.po;
+
+
+import cn.tr.plugin.mybatis.pojo.BasePO;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+import java.util.*;
+/**
+ * 用户-岗位表实体
+ *
+ * @author lf
+ * @date  2023/05/31 14:32
+ **/
+@Data
+@TableName(value="sys_user_position",autoResultMap = true)
+@ToString
+public class SysUserPositionPO  {
+
+    /** id */
+    @TableId
+    @ApiModelProperty(value = "id", position = 1)
+    private String id;
+
+    /** user_id */
+    @ApiModelProperty(value = "user_id", position = 2)
+    private String userId;
+
+    /** position_id */
+    @ApiModelProperty(value = "position_id", position = 3)
+    private String positionId;
+}

+ 7 - 1
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/repository/SysOrgRepository.java

@@ -1,10 +1,13 @@
 package cn.tr.module.sys.user.repository;
 package cn.tr.module.sys.user.repository;
 
 
+import cn.tr.module.sys.user.dto.SysOrgDTO;
+import cn.tr.module.sys.user.dto.SysOrgQueryDTO;
 import cn.tr.module.sys.user.po.SysOrgPO;
 import cn.tr.module.sys.user.po.SysOrgPO;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
 import org.springframework.stereotype.Repository;
 import org.springframework.stereotype.Repository;
-
+import java.util.*;
 /**
 /**
  * @ClassName : SysRoleMenuRepository
  * @ClassName : SysRoleMenuRepository
  * @Description :
  * @Description :
@@ -15,4 +18,7 @@ import org.springframework.stereotype.Repository;
 @Repository
 @Repository
 public interface SysOrgRepository extends BaseMapper<SysOrgPO> {
 public interface SysOrgRepository extends BaseMapper<SysOrgPO> {
 
 
+    List<SysOrgDTO> stdSelectList(@Param("query") SysOrgQueryDTO query);
+
+    SysOrgDTO stdSelectById(String id);
 }
 }

+ 16 - 0
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/repository/SysUserPositionRepository.java

@@ -0,0 +1,16 @@
+package cn.tr.module.sys.user.repository;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+import org.springframework.stereotype.Repository;
+import cn.tr.module.sys.user.po.SysUserPositionPO;
+/**
+ * 用户-岗位表Mapper接口
+ *
+ * @author lf
+ * @date  2023/05/31 14:32
+ **/
+@Repository
+@Mapper
+public interface SysUserPositionRepository extends BaseMapper<SysUserPositionPO> {
+}

+ 33 - 0
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/service/ISysUserPositionService.java

@@ -0,0 +1,33 @@
+package cn.tr.module.sys.user.service;
+
+import java.util.Collection;
+import java.util.Set;
+
+/**
+ * 用户-岗位表Service接口
+ *
+ * @author lf
+ * @date  2023/05/31 14:32
+ **/
+public interface ISysUserPositionService{
+    /**
+     * 查询所给岗位的使用人数
+     * @param posIds
+     * @return
+     */
+    long selectCountByPositionIds(Collection<String> posIds);
+
+    /**
+     * 为用户分配岗位
+     * @param userId
+     * @param positionIds
+     */
+    void assignUserPosition(String userId, Set<String> positionIds);
+
+    /**
+     * 根据用户id查询相应的岗位id
+     * @param id
+     * @return
+     */
+    Set<String> findPositionIdsByUserId(String id);
+}

+ 7 - 1
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/service/impl/SysMenuServiceImpl.java

@@ -7,6 +7,7 @@ import cn.hutool.core.util.StrUtil;
 import cn.tr.core.exception.ServiceException;
 import cn.tr.core.exception.ServiceException;
 import cn.tr.core.exception.TRExcCode;
 import cn.tr.core.exception.TRExcCode;
 import cn.tr.core.tree.TreeNode;
 import cn.tr.core.tree.TreeNode;
+import cn.tr.core.utils.TreeUtil;
 import cn.tr.module.sys.user.mapper.SysMenuMapper;
 import cn.tr.module.sys.user.mapper.SysMenuMapper;
 import cn.tr.module.sys.tenant.service.ISysTenantPackageMenuService;
 import cn.tr.module.sys.tenant.service.ISysTenantPackageMenuService;
 import cn.tr.module.sys.tenant.service.ISysTenantService;
 import cn.tr.module.sys.tenant.service.ISysTenantService;
@@ -17,6 +18,7 @@ import cn.tr.core.enums.CreateEnum;
 import cn.tr.module.sys.user.po.SysMenuPO;
 import cn.tr.module.sys.user.po.SysMenuPO;
 import cn.tr.module.sys.user.repository.SysMenuRepository;
 import cn.tr.module.sys.user.repository.SysMenuRepository;
 import cn.tr.module.sys.user.service.*;
 import cn.tr.module.sys.user.service.*;
+import cn.tr.plugin.biz.tenant.utils.TenantUtils;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -24,6 +26,7 @@ import org.springframework.context.annotation.Lazy;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.transaction.annotation.Transactional;
 
 
+import javax.validation.constraints.NotEmpty;
 import java.util.*;
 import java.util.*;
 import java.util.stream.Collectors;
 import java.util.stream.Collectors;
 
 
@@ -64,10 +67,12 @@ public class SysMenuServiceImpl extends ServiceImpl<SysMenuRepository,SysMenuPO>
     public List<SysMenuDTO> selectSysMenuList(SysMenuQueryDTO query) {
     public List<SysMenuDTO> selectSysMenuList(SysMenuQueryDTO query) {
         List<SysMenuDTO> selectResult =
         List<SysMenuDTO> selectResult =
         SysMenuMapper.INSTANCE.toSysMenuDTOList( menuRepository.selectList(new LambdaQueryWrapper<SysMenuPO>()
         SysMenuMapper.INSTANCE.toSysMenuDTOList( menuRepository.selectList(new LambdaQueryWrapper<SysMenuPO>()
+                .in(CollectionUtil.isNotEmpty(query.getTenantMenuIds()),SysMenuPO::getId,query.getTenantMenuIds())
                 .like(StrUtil.isNotEmpty(query.getName()), SysMenuPO::getName, query.getName())
                 .like(StrUtil.isNotEmpty(query.getName()), SysMenuPO::getName, query.getName())
                 .eq(ObjectUtil.isNotNull(query.getDisable()), SysMenuPO::getDisable, query.getDisable())
                 .eq(ObjectUtil.isNotNull(query.getDisable()), SysMenuPO::getDisable, query.getDisable())
-                .eq(ObjectUtil.isNotNull(query.getMenuType()), SysMenuPO::getMenuType, query.getMenuType())
+                .in(CollectionUtil.isNotEmpty(query.getMenuType()), SysMenuPO::getMenuType, query.getMenuType())
                 .eq(ObjectUtil.isNotNull(query.getParentId()), SysMenuPO::getParentId, query.getParentId())));
                 .eq(ObjectUtil.isNotNull(query.getParentId()), SysMenuPO::getParentId, query.getParentId())));
+        //得到的结果与当期租户取交集
         return selectResult;
         return selectResult;
     }
     }
 
 
@@ -79,6 +84,7 @@ public class SysMenuServiceImpl extends ServiceImpl<SysMenuRepository,SysMenuPO>
     @Override
     @Override
     @Transactional(rollbackFor = Exception.class)
     @Transactional(rollbackFor = Exception.class)
     public boolean updateSysMenuById(SysMenuDTO source) {
     public boolean updateSysMenuById(SysMenuDTO source) {
+        TreeUtil.validateNode(source,TreeUtil.buildTree(self.findAllMenu()));
         boolean result = menuRepository.updateById(SysMenuMapper.INSTANCE.toSysMenuPO(source))!=0;
         boolean result = menuRepository.updateById(SysMenuMapper.INSTANCE.toSysMenuPO(source))!=0;
         if (result) {
         if (result) {
             refreshCache(Collections.singleton(source.getId()));
             refreshCache(Collections.singleton(source.getId()));

+ 7 - 7
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/service/impl/SysOrgServiceImpl.java

@@ -6,6 +6,8 @@ import cn.hutool.core.util.StrUtil;
 import cn.tr.core.exception.ServiceException;
 import cn.tr.core.exception.ServiceException;
 import cn.tr.core.exception.TRExcCode;
 import cn.tr.core.exception.TRExcCode;
 import cn.tr.core.utils.JsonUtils;
 import cn.tr.core.utils.JsonUtils;
+import cn.tr.core.utils.TreeUtil;
+import cn.tr.module.sys.user.dto.SysOrgTreeDTO;
 import cn.tr.module.sys.user.mapper.SysOrgMapper;
 import cn.tr.module.sys.user.mapper.SysOrgMapper;
 import cn.tr.module.sys.user.dto.SysOrgDTO;
 import cn.tr.module.sys.user.dto.SysOrgDTO;
 import cn.tr.module.sys.user.dto.SysOrgQueryDTO;
 import cn.tr.module.sys.user.dto.SysOrgQueryDTO;
@@ -40,22 +42,20 @@ public class SysOrgServiceImpl implements ISysOrgService {
 
 
     @Override
     @Override
     public List<SysOrgDTO> selectSysOrgList(SysOrgQueryDTO query) {
     public List<SysOrgDTO> selectSysOrgList(SysOrgQueryDTO query) {
-        return SysOrgMapper.INSTANCE.toSysOrgDTOList(orgRepository.selectList(new LambdaQueryWrapper<SysOrgPO>()
-                .like(StrUtil.isNotEmpty(query.getName()), SysOrgPO::getName,query.getName())
-                .eq(StrUtil.isNotEmpty(query.getParentId()), SysOrgPO::getParentId,query.getParentId())
-                .eq(ObjectUtil.isNotNull(query.getDisable()), SysOrgPO::getDisable,query.getDisable()))
-        );
+        return orgRepository.stdSelectList(query);
     }
     }
 
 
     @Override
     @Override
     public SysOrgDTO selectSysOrgById(String id) {
     public SysOrgDTO selectSysOrgById(String id) {
-        return SysOrgMapper.INSTANCE.toSysOrgDTO(orgRepository.selectById(id));
+        return orgRepository.stdSelectById(id);
     }
     }
 
 
     @Override
     @Override
     public boolean updateSysOrgById(SysOrgDTO source) {
     public boolean updateSysOrgById(SysOrgDTO source) {
+        //判断上级节点到根节点的路径上是否包含当前节点
+        TreeUtil.validateNode(SysOrgMapper.INSTANCE.convertSysOrgTreeNode(source),self.selectSysOrgTree());
         boolean result = orgRepository.updateById(SysOrgMapper.INSTANCE.toSysOrgPO(source)) != 0;
         boolean result = orgRepository.updateById(SysOrgMapper.INSTANCE.toSysOrgPO(source)) != 0;
-        if( result){
+        if(result){
             self.delSysOrgTreeCache();
             self.delSysOrgTreeCache();
         }
         }
         return result;
         return result;

+ 14 - 1
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/service/impl/SysPositionServiceImpl.java

@@ -3,6 +3,8 @@ package cn.tr.module.sys.user.service.impl;
 import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.core.util.StrUtil;
+import cn.tr.core.exception.ServiceException;
+import cn.tr.core.exception.TRExcCode;
 import cn.tr.module.sys.user.mapper.SysPositionMapper;
 import cn.tr.module.sys.user.mapper.SysPositionMapper;
 import cn.tr.module.sys.user.dto.SysPositionDTO;
 import cn.tr.module.sys.user.dto.SysPositionDTO;
 import cn.tr.module.sys.user.dto.SysPositionQueryDTO;
 import cn.tr.module.sys.user.dto.SysPositionQueryDTO;
@@ -10,9 +12,12 @@ import cn.tr.module.sys.user.po.SysPositionPO;
 import cn.tr.module.sys.user.repository.SysPositionRepository;
 import cn.tr.module.sys.user.repository.SysPositionRepository;
 import cn.tr.module.sys.user.repository.SysUserRepository;
 import cn.tr.module.sys.user.repository.SysUserRepository;
 import cn.tr.module.sys.user.service.ISysPositionService;
 import cn.tr.module.sys.user.service.ISysPositionService;
+import cn.tr.module.sys.user.service.ISysUserPositionService;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Lazy;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
 
 import java.util.*;
 import java.util.*;
 
 
@@ -29,6 +34,10 @@ public class SysPositionServiceImpl implements ISysPositionService {
     @Autowired
     @Autowired
     private SysUserRepository userRepository;
     private SysUserRepository userRepository;
 
 
+    @Autowired
+    @Lazy
+    private ISysUserPositionService userPositionService;
+
     @Override
     @Override
     public List<SysPositionDTO> selectSysPositionList(SysPositionQueryDTO query) {
     public List<SysPositionDTO> selectSysPositionList(SysPositionQueryDTO query) {
         return SysPositionMapper.INSTANCE.toSysPositionDTOList(positionRepository.selectList(new LambdaQueryWrapper<SysPositionPO>()
         return SysPositionMapper.INSTANCE.toSysPositionDTOList(positionRepository.selectList(new LambdaQueryWrapper<SysPositionPO>()
@@ -61,8 +70,12 @@ public class SysPositionServiceImpl implements ISysPositionService {
     }
     }
 
 
     @Override
     @Override
+    @Transactional(rollbackFor = Exception.class)
     public int deleteSysPositionByIds(Collection<String> ids) {
     public int deleteSysPositionByIds(Collection<String> ids) {
-        //todo 检测岗位是否被使用
+        long count = userPositionService.selectCountByPositionIds(ids);
+        if(count!=0){
+            throw new ServiceException(TRExcCode.SYSTEM_ERROR_B0001,"所选岗位中存在已被使用的岗位,无法删除");
+        }
         return positionRepository.deleteBatchIds(ids);
         return positionRepository.deleteBatchIds(ids);
     }
     }
 }
 }

+ 56 - 0
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/service/impl/SysUserPositionServiceImpl.java

@@ -0,0 +1,56 @@
+package cn.tr.module.sys.user.service.impl;
+
+import cn.hutool.core.collection.CollectionUtil;
+import cn.tr.module.sys.user.po.SysUserPositionPO;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+import cn.tr.module.sys.user.repository.SysUserPositionRepository;
+import cn.tr.module.sys.user.service.ISysUserPositionService;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+/**
+ * 用户-岗位表Service接口实现类
+ *
+ * @author lf
+ * @date  2023/05/31 14:32
+ **/
+@Service
+public class SysUserPositionServiceImpl extends ServiceImpl<SysUserPositionRepository,SysUserPositionPO> implements ISysUserPositionService {
+
+    @Override
+    public long selectCountByPositionIds(Collection<String> posIds) {
+        return baseMapper.selectCount(new LambdaQueryWrapper<SysUserPositionPO>().in(SysUserPositionPO::getPositionId,posIds));
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void assignUserPosition(String userId, Set<String> positionIds) {
+        baseMapper.delete(new LambdaQueryWrapper<SysUserPositionPO>().eq(SysUserPositionPO::getUserId,userId));
+        if(CollectionUtil.isNotEmpty(positionIds)){
+            List<SysUserPositionPO> positions = positionIds.stream()
+                    .distinct()
+                    .map(posId -> {
+                        SysUserPositionPO result = new SysUserPositionPO();
+                        result.setPositionId(posId);
+                        result.setUserId(userId);
+                        return result;
+                    })
+                    .collect(Collectors.toList());
+            this.saveBatch(positions);
+        }
+    }
+
+    @Override
+    public Set<String> findPositionIdsByUserId(String id) {
+        return baseMapper.selectList(new LambdaQueryWrapper<SysUserPositionPO>().eq(SysUserPositionPO::getUserId,id))
+                .stream()
+                .map(SysUserPositionPO::getPositionId)
+                .collect(Collectors.toSet());
+    }
+}

+ 11 - 0
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/service/impl/SysUserServiceImpl.java

@@ -14,6 +14,7 @@ import cn.tr.module.sys.user.dto.SysUserEditDTO;
 import cn.tr.module.sys.user.dto.SysUserQueryDTO;
 import cn.tr.module.sys.user.dto.SysUserQueryDTO;
 import cn.tr.module.sys.user.repository.SysUserRepository;
 import cn.tr.module.sys.user.repository.SysUserRepository;
 import cn.tr.module.sys.user.service.ISysUserPortalService;
 import cn.tr.module.sys.user.service.ISysUserPortalService;
+import cn.tr.module.sys.user.service.ISysUserPositionService;
 import cn.tr.module.sys.user.service.ISysUserRoleService;
 import cn.tr.module.sys.user.service.ISysUserRoleService;
 import cn.tr.module.sys.user.service.ISysUserService;
 import cn.tr.module.sys.user.service.ISysUserService;
 import cn.tr.module.sys.user.po.SysUserPO;
 import cn.tr.module.sys.user.po.SysUserPO;
@@ -48,6 +49,9 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserRepository,SysUserPO>
     private ISysUserPortalService userPortalService;
     private ISysUserPortalService userPortalService;
     @Autowired
     @Autowired
     @Lazy
     @Lazy
+    private ISysUserPositionService userPositionService;
+    @Autowired
+    @Lazy
     private SysConfigManager configManager;
     private SysConfigManager configManager;
     @Override
     @Override
     public List<SysUserDTO> selectSysUserList(SysUserQueryDTO query) {
     public List<SysUserDTO> selectSysUserList(SysUserQueryDTO query) {
@@ -69,6 +73,7 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserRepository,SysUserPO>
         result.setRoleIds(userRoleService.findRoleIdsByUserId(id));
         result.setRoleIds(userRoleService.findRoleIdsByUserId(id));
         result.setPortalIds(userPortalService.findPortalsByUserId(id).stream()
         result.setPortalIds(userPortalService.findPortalsByUserId(id).stream()
                 .map(SysUserPortalListDTO::getId).collect(Collectors.toSet()));
                 .map(SysUserPortalListDTO::getId).collect(Collectors.toSet()));
+        result.setPostIds(userPositionService.findPositionIdsByUserId(id));
         return result;
         return result;
     }
     }
 
 
@@ -80,6 +85,7 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserRepository,SysUserPO>
         if(result){
         if(result){
             assignUserRole(source.getId(),source.getRoleIds());
             assignUserRole(source.getId(),source.getRoleIds());
             assignUserPortal(source.getId(),source.getPortalIds());
             assignUserPortal(source.getId(),source.getPortalIds());
+            assignUserPosition(source.getId(),source.getPostIds());
         }
         }
         return result;
         return result;
     }
     }
@@ -134,6 +140,7 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserRepository,SysUserPO>
         if(result){
         if(result){
             assignUserRole(source.getId(),source.getRoleIds());
             assignUserRole(source.getId(),source.getRoleIds());
             assignUserPortal(source.getId(),source.getPortalIds());
             assignUserPortal(source.getId(),source.getPortalIds());
+            assignUserPosition(source.getId(),source.getPostIds());
         }
         }
         return result;
         return result;
     }
     }
@@ -189,4 +196,8 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserRepository,SysUserPO>
     private void assignUserPortal(String userId, Set<String> portalIds){
     private void assignUserPortal(String userId, Set<String> portalIds){
         userPortalService.assignUserPortal(userId,portalIds);
         userPortalService.assignUserPortal(userId,portalIds);
     }
     }
+
+    private void assignUserPosition(String userId, Set<String> positionIds){
+        userPositionService.assignUserPosition(userId,positionIds);
+    }
 }
 }

+ 64 - 0
tr-modules/tr-module-system/src/main/resources/mapper/user/SysOrgMapper.xml

@@ -0,0 +1,64 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="cn.tr.module.sys.user.repository.SysOrgRepository">
+
+    <resultMap id="stdResult" type="cn.tr.module.sys.user.dto.SysOrgDTO">
+        <result property="id" column="id"/>
+        <result property="name" column="name"/>
+        <result property="phone" column="phone"/>
+        <result property="leaderUserId" column="leader_user_id"/>
+        <result property="leaderName" column="leader_name"/>
+        <result property="email" column="email"/>
+        <result property="disable" column="disable"/>
+        <result property="sort" column="sort"/>
+        <result property="createTime" column="create_time"/>
+        <result property="updateTime" column="update_time"/>
+    </resultMap>
+
+
+    <select id="stdSelectList" resultMap="stdResult">
+        select
+        so.id as id,
+        so.`name` as `name`,
+        so.phone as phone,
+        so.leader_user_id as leader_user_id,
+        so.email as email,
+        so.`disable` as `disable`,
+        so.create_time as create_time,
+        so.update_time as update_time,
+        so.sort as sort,
+        su.nickname as leader_name
+        from sys_org as so
+        LEFT JOIN sys_user as su on so.leader_user_id= su.id
+        <where>
+            <if test="query.parentId != null">
+                and so.parent_id = #{query.parentId}
+            </if>
+            <if test="query.name != null">
+                and so.name like concat('%',#{query.name},'%')
+            </if>
+            <if test="query.disable != null">
+                and so.disable = #{query.disable}
+            </if>
+        </where>
+    </select>
+
+    <select id="stdSelectById" resultMap="stdResult">
+        select
+        so.id as id,
+        so.`name` as `name`,
+        so.phone as phone,
+        so.leader_user_id as leader_user_id,
+        so.email as email,
+        so.sort as sort,
+        so.`disable` as `disable`,
+        so.create_time as create_time,
+        so.update_time as update_time,
+        su.nickname as leader_name
+        from sys_org as so
+        LEFT JOIN sys_user as su on so.leader_user_id= su.id
+        where so.id = #{id}
+    </select>
+</mapper>

+ 8 - 1
tr-plugins/tr-spring-boot-starter-plugin-biz-tenant/src/main/java/cn/tr/plugin/biz/tenant/config/web/TenantContextWebFilter.java

@@ -28,13 +28,20 @@ public class TenantContextWebFilter extends OncePerRequestFilter {
     @Override
     @Override
     protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
     protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
             throws ServletException, IOException {
             throws ServletException, IOException {
+        String tenantId ="";
+        try {
+            tenantId = LoginUserStrategy.tr.getTenantId();
+        }catch (Exception ex){
+
+        }
+
         if (isIgnoreUrl(request)) {
         if (isIgnoreUrl(request)) {
+            TenantContextHolder.setTenantId(tenantId);
             TenantContextHolder.setIgnore(true);
             TenantContextHolder.setIgnore(true);
             chain.doFilter(request, response);
             chain.doFilter(request, response);
         } else {
         } else {
             // 设置
             // 设置
             try {
             try {
-                String tenantId = LoginUserStrategy.tr.getTenantId();
                 TenantContextHolder.setTenantId(tenantId);
                 TenantContextHolder.setTenantId(tenantId);
                 TenantContextHolder.setIgnore(false);
                 TenantContextHolder.setIgnore(false);
             }catch (Exception ex){
             }catch (Exception ex){

+ 2 - 2
tr-plugins/tr-spring-boot-starter-plugin-file/src/main/java/cn/tr/plugin/file/config/local/LocalFileClientConfig.java

@@ -23,8 +23,8 @@ public class LocalFileClientConfig implements FileClientConfig {
     /**
     /**
      * 自定义域名
      * 自定义域名
      */
      */
-    @NotEmpty(message = "localDomain 不能为空")
-    @URL(message = "localDomain 必须是 URL 格式")
+    @NotEmpty(message = "自定义域名 不能为空")
+    @URL(message = "自定义域名 必须是 URL 格式")
     private String localDomain;
     private String localDomain;
 
 
 }
 }

+ 12 - 6
tr-plugins/tr-spring-boot-starter-plugin-numbering-strategy/src/main/java/cn/tr/plugin/numbering/strategy/core/DefaultNumberingStrategyClient.java

@@ -65,11 +65,17 @@ public class DefaultNumberingStrategyClient implements NumberingStrategyClient {
     private String formatSerialNo(Integer num){
     private String formatSerialNo(Integer num){
         String prefix = this.properties.getPrefix();
         String prefix = this.properties.getPrefix();
         String pattern = strategyEnum.getPattern();
         String pattern = strategyEnum.getPattern();
-        String fillNum = fillNum(properties.getLimitNum(), num);
-        if (StrUtil.isEmpty(properties.getPrefix())) {
-            return DateUtil.format(new Date(),pattern)+"-"+fillNum;
+        String fillNum = fillNum(properties.getLimitLen(), num);
+        //拼接流水号
+        String result=fillNum;
+
+        if (StrUtil.isNotEmpty(strategyEnum.getPattern())) {
+            result=DateUtil.format(new Date(),pattern)+"-"+fillNum;
+        }
+        if(StrUtil.isNotEmpty(prefix)){
+            result=prefix+"-"+ DateUtil.format(new Date(),pattern)+"-"+fillNum;
         }
         }
-        return prefix+"-"+ DateUtil.format(new Date(),pattern)+"-"+fillNum;
+        return result;
     }
     }
 
 
     private String fillNum(Integer length,Integer num){
     private String fillNum(Integer length,Integer num){
@@ -87,9 +93,9 @@ public class DefaultNumberingStrategyClient implements NumberingStrategyClient {
     }
     }
 
 
     private void doInit(NumberingStrategyProperties properties){
     private void doInit(NumberingStrategyProperties properties){
-        Assert.notNull(NumberingStrategyEnum.valueOf(properties.getType()),String.format("不支持此生成模式:%s",properties.getType()));
+        Assert.notNull(NumberingStrategyEnum.ofValue(properties.getType()),String.format("不支持此生成模式:%s",properties.getType()));
         this.properties = properties;
         this.properties = properties;
-        this.strategyEnum= NumberingStrategyEnum.valueOf(properties.getType());
+        this.strategyEnum= NumberingStrategyEnum.ofValue(properties.getType());
         Integer nextNum = properties.getNextNum();
         Integer nextNum = properties.getNextNum();
         if (Objects.isNull(nextNum)) {
         if (Objects.isNull(nextNum)) {
             //更新值为null,缓存值不为null,则不进行更新操作
             //更新值为null,缓存值不为null,则不进行更新操作

+ 5 - 0
tr-plugins/tr-spring-boot-starter-plugin-numbering-strategy/src/main/java/cn/tr/plugin/numbering/strategy/core/DefaultNumberingStrategyClientFactory.java

@@ -36,4 +36,9 @@ public class DefaultNumberingStrategyClientFactory implements NumberingStrategyC
         }
         }
         return client;
         return client;
     }
     }
+
+    @Override
+    public void removeClient(String id) {
+        clients.remove(id);
+    }
 }
 }

+ 2 - 0
tr-plugins/tr-spring-boot-starter-plugin-numbering-strategy/src/main/java/cn/tr/plugin/numbering/strategy/core/NumberingStrategyClientFactory.java

@@ -23,4 +23,6 @@ public interface NumberingStrategyClientFactory {
      * @return
      * @return
      */
      */
     NumberingStrategyClient createOrUpdateSmsClient(NumberingStrategyProperties config);
     NumberingStrategyClient createOrUpdateSmsClient(NumberingStrategyProperties config);
+
+    void removeClient(String id);
 }
 }

+ 1 - 1
tr-plugins/tr-spring-boot-starter-plugin-numbering-strategy/src/main/java/cn/tr/plugin/numbering/strategy/core/enums/NumberingStrategyEnum.java

@@ -14,7 +14,7 @@ import lombok.Getter;
 @Getter
 @Getter
 @AllArgsConstructor
 @AllArgsConstructor
 public enum NumberingStrategyEnum implements IEnum<String> {
 public enum NumberingStrategyEnum implements IEnum<String> {
-    nodata("none","编号前缀+流水号",""),
+    none("none","编号前缀+流水号",""),
     yyyyMMdd("yyyyMMdd","编号前缀+年月日+流水号","yyyyMMdd"),
     yyyyMMdd("yyyyMMdd","编号前缀+年月日+流水号","yyyyMMdd"),
     yyyyMM("yyyyMM","编号前缀+年月+流水号","yyyyMM"),
     yyyyMM("yyyyMM","编号前缀+年月+流水号","yyyyMM"),
     yyyy("yyyy","编号前缀+年+流水号","yyyy"),
     yyyy("yyyy","编号前缀+年+流水号","yyyy"),

+ 1 - 1
tr-plugins/tr-spring-boot-starter-plugin-numbering-strategy/src/main/java/cn/tr/plugin/numbering/strategy/core/properties/NumberingStrategyProperties.java

@@ -55,5 +55,5 @@ public class NumberingStrategyProperties implements Serializable {
      * 则最终生成的编号为 00123
      * 则最终生成的编号为 00123
      *
      *
      */
      */
-    private Integer limitNum;
+    private Integer limitLen;
 }
 }

+ 2 - 2
tr-plugins/tr-spring-boot-starter-plugin-numbering-strategy/src/test/java/cn/tr/plugin/numbering/strategy/StrategyTest.java

@@ -32,7 +32,7 @@ public class StrategyTest extends BaseRedisUnitTest {
                 .type(NumberingStrategyEnum.yyyyMM.getValue())
                 .type(NumberingStrategyEnum.yyyyMM.getValue())
                 .prefix("test")
                 .prefix("test")
                 .fillChar('0')
                 .fillChar('0')
-                .limitNum(5)
+                .limitLen(5)
                 .build();
                 .build();
         NumberingStrategyClient client = clientFactory.createOrUpdateSmsClient(strategyProperties);
         NumberingStrategyClient client = clientFactory.createOrUpdateSmsClient(strategyProperties);
         for (int i = 1; i < 10; i++) {
         for (int i = 1; i < 10; i++) {
@@ -54,7 +54,7 @@ public class StrategyTest extends BaseRedisUnitTest {
                 .type(NumberingStrategyEnum.yyyyMM.getValue())
                 .type(NumberingStrategyEnum.yyyyMM.getValue())
                 .prefix("")
                 .prefix("")
                 .fillChar('0')
                 .fillChar('0')
-                .limitNum(5)
+                .limitLen(5)
                 .build();
                 .build();
         NumberingStrategyClient client = clientFactory.createOrUpdateSmsClient(strategyProperties);
         NumberingStrategyClient client = clientFactory.createOrUpdateSmsClient(strategyProperties);
         for (int i = 1; i < 10; i++) {
         for (int i = 1; i < 10; i++) {

+ 0 - 3
tr-test/src/main/java/cn/tr/test/WebApplication.java

@@ -1,10 +1,8 @@
 package cn.tr.test;
 package cn.tr.test;
 
 
-import cn.dev33.satoken.strategy.SaStrategy;
 import org.mybatis.spring.annotation.MapperScan;
 import org.mybatis.spring.annotation.MapperScan;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
-import org.springframework.cache.annotation.EnableCaching;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Bean;
 import org.springframework.scheduling.annotation.EnableAsync;
 import org.springframework.scheduling.annotation.EnableAsync;
 
 
@@ -19,7 +17,6 @@ import org.springframework.scheduling.annotation.EnableAsync;
 @EnableAsync
 @EnableAsync
 public class WebApplication {
 public class WebApplication {
     public static void main(String[] args) {
     public static void main(String[] args) {
-        SaStrategy.me.checkElementAnnotation=c->{};
         SpringApplication.run(WebApplication.class);
         SpringApplication.run(WebApplication.class);
     }
     }
 
 

+ 1 - 0
tr-test/src/main/resources/application.yml

@@ -57,6 +57,7 @@ tr:
       - sys_role_menu
       - sys_role_menu
       - sys_dict
       - sys_dict
       - sys_dict_item
       - sys_dict_item
+      - sys_user_position
 #      租户模块
 #      租户模块
       - sys_tenant
       - sys_tenant
       - sys_tenant_package
       - sys_tenant_package