Sfoglia il codice sorgente

feat(编码策略):
新增编码策略模块

fix(分页):
修复分页查看当前用户后,线程缓存未清除造成分页一直保留的情况
在filter处新增 每次新的请求获取后先清除线程缓存

18339543638 2 anni fa
parent
commit
df7e8aef16
40 ha cambiato i file con 1153 aggiunte e 21 eliminazioni
  1. 8 0
      tr-dependencies/pom.xml
  2. 4 0
      tr-framework/src/main/java/cn/tr/core/strategy/PageStrategy.java
  3. 7 2
      tr-modules/tr-module-gen/src/main/java/cn/tr/module/gen/modular/basic/service/impl/GenBasicServiceImpl.java
  4. 1 1
      tr-modules/tr-module-gen/src/main/resources/backend/Controller.java.btl
  5. 5 5
      tr-modules/tr-module-gen/src/main/resources/frontend/Api.ts.btl
  6. 5 0
      tr-modules/tr-module-system/pom.xml
  7. 2 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/config/SysConfigController.java
  8. 15 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/monitor/service/impl/DevMonitorServiceImpl.java
  9. 35 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/numStrategy/config/StrategyConfig.java
  10. 87 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/numStrategy/controller/SysNumberingStrategyController.java
  11. 61 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/numStrategy/dto/SysNumberingStrategyDTO.java
  12. 26 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/numStrategy/dto/SysNumberingStrategyQueryDTO.java
  13. 41 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/numStrategy/mapper/SysNumberingStrategyMapper.java
  14. 57 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/numStrategy/po/SysNumberingStrategyPO.java
  15. 18 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/numStrategy/repository/SysNumberingStrategyRepository.java
  16. 74 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/numStrategy/service/ISysNumberingStrategyService.java
  17. 162 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/numStrategy/service/impl/SysNumberingStrategyServiceImpl.java
  18. 1 1
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/sms/service/impl/SysSmsChannelServiceImpl.java
  19. 3 1
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/po/SysRolePO.java
  20. 1 0
      tr-plugins/pom.xml
  21. 1 1
      tr-plugins/tr-spring-boot-starter-plugin-biz-constant/src/main/java/cn/tr/plugin/constant/config/ConstantInterceptor.java
  22. 0 5
      tr-plugins/tr-spring-boot-starter-plugin-mybatis/src/main/java/cn/tr/plugin/mybatis/TrMybatisAutoConfiguration.java
  23. 37 0
      tr-plugins/tr-spring-boot-starter-plugin-numbering-strategy/pom.xml
  24. 26 0
      tr-plugins/tr-spring-boot-starter-plugin-numbering-strategy/src/main/java/cn/tr/plugin/numbering/strategy/NumberingStrategy.java
  25. 25 0
      tr-plugins/tr-spring-boot-starter-plugin-numbering-strategy/src/main/java/cn/tr/plugin/numbering/strategy/TrNumberingStrategyAutoConfiguration.java
  26. 105 0
      tr-plugins/tr-spring-boot-starter-plugin-numbering-strategy/src/main/java/cn/tr/plugin/numbering/strategy/core/DefaultNumberingStrategyClient.java
  27. 39 0
      tr-plugins/tr-spring-boot-starter-plugin-numbering-strategy/src/main/java/cn/tr/plugin/numbering/strategy/core/DefaultNumberingStrategyClientFactory.java
  28. 32 0
      tr-plugins/tr-spring-boot-starter-plugin-numbering-strategy/src/main/java/cn/tr/plugin/numbering/strategy/core/NumberingStrategyClient.java
  29. 26 0
      tr-plugins/tr-spring-boot-starter-plugin-numbering-strategy/src/main/java/cn/tr/plugin/numbering/strategy/core/NumberingStrategyClientFactory.java
  30. 26 0
      tr-plugins/tr-spring-boot-starter-plugin-numbering-strategy/src/main/java/cn/tr/plugin/numbering/strategy/core/annotation/Numbering.java
  31. 38 0
      tr-plugins/tr-spring-boot-starter-plugin-numbering-strategy/src/main/java/cn/tr/plugin/numbering/strategy/core/enums/NumberingStrategyEnum.java
  32. 59 0
      tr-plugins/tr-spring-boot-starter-plugin-numbering-strategy/src/main/java/cn/tr/plugin/numbering/strategy/core/properties/NumberingStrategyProperties.java
  33. 33 0
      tr-plugins/tr-spring-boot-starter-plugin-numbering-strategy/src/main/java/cn/tr/plugin/numbering/strategy/mybatis/NumberingStrategyInterceptor.java
  34. 1 0
      tr-plugins/tr-spring-boot-starter-plugin-numbering-strategy/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
  35. 17 0
      tr-plugins/tr-spring-boot-starter-plugin-numbering-strategy/src/main/resources/application-unit-test.yml
  36. 69 0
      tr-plugins/tr-spring-boot-starter-plugin-numbering-strategy/src/test/java/cn/tr/plugin/numbering/strategy/StrategyTest.java
  37. 2 0
      tr-plugins/tr-spring-boot-starter-plugin-web/src/main/java/cn/tr/plugin/web/config/handler/TrResponseBodyAdviceHandler.java
  38. 2 0
      tr-plugins/tr-spring-boot-starter-plugin-web/src/main/java/cn/tr/plugin/web/filter/ExceptionFilter.java
  39. 0 5
      tr-test/pom.xml
  40. 2 0
      tr-test/src/main/resources/application.yml

+ 8 - 0
tr-dependencies/pom.xml

@@ -354,6 +354,14 @@
                 <version>${revision}</version>
             </dependency>
 
+            <!--编号生成插件-->
+            <dependency>
+                <groupId>cn.tr</groupId>
+                <artifactId>tr-spring-boot-starter-plugin-numbering-strategy</artifactId>
+                <version>${revision}</version>
+            </dependency>
+
+
             <!--对象转换插件-->
             <dependency>
                 <groupId>cn.tr</groupId>

+ 4 - 0
tr-framework/src/main/java/cn/tr/core/strategy/PageStrategy.java

@@ -2,6 +2,7 @@ package cn.tr.core.strategy;
 
 import cn.tr.core.pojo.PageDomain;
 import com.github.pagehelper.Page;
+import com.github.pagehelper.PageHelper;
 
 import java.util.function.Consumer;
 import java.util.function.Supplier;
@@ -37,4 +38,7 @@ public class PageStrategy {
      */
     public Supplier<Page<?>> getPage=()-> new Page<>();
 
+    public void clear(){
+        PageHelper.clearPage();
+    }
 }

+ 7 - 2
tr-modules/tr-module-gen/src/main/java/cn/tr/module/gen/modular/basic/service/impl/GenBasicServiceImpl.java

@@ -546,8 +546,13 @@ public class GenBasicServiceImpl extends ServiceImpl<GenBasicMapper, GenBasic> i
         bindingJsonObject.set("authorName", genBasic.getAuthorName());
         // 生成时间
         bindingJsonObject.set("genTime", DateUtil.format(DateTime.now(), " yyyy/MM/dd HH:mm"));
-        //生成路径前缀
-        bindingJsonObject.set("apiPrefix", StrUtil.contains(genBasic.getPackageName(),"sys")?"sys":"");
+        String pathPrefix="";
+        if(StrUtil.contains(genBasic.getPackageName(),"sys")&&!StrUtil.equals(genBasic.getBackendModuleName(),"sys")){
+            pathPrefix="/"+genBasic.getPackageName();
+        }
+        pathPrefix=pathPrefix+"/"+genBasic.getBackendModuleName()+"/"+genBasic.getBusName();
+        //路径前缀
+        bindingJsonObject.set("pathPrefix",pathPrefix);
         // 定义配置详情列表
         List<JSONObject> configList = CollectionUtil.newArrayList();
         // 定义是否有排序字段

+ 1 - 1
tr-modules/tr-module-gen/src/main/resources/backend/Controller.java.btl

@@ -29,7 +29,7 @@ import cn.tr.core.pojo.TableDataInfo;
  */
 @Api(tags = "${functionName}")
 @RestController
-@RequestMapping("/${apiPrefix}/${backendModuleName}/${busName}")
+@RequestMapping("${pathPrefix}")
 @AllArgsConstructor
 public class ${className}Controller extends BaseController{
 

+ 5 - 5
tr-modules/tr-module-gen/src/main/resources/frontend/Api.ts.btl

@@ -2,11 +2,11 @@ import { defHttp } from '/@/utils/http/axios';
 import { setParams } from '/@/utils/index';
 
 enum Api {
-${frontModuleName}${busNameFirstUpper}QueryPage = '/${apiPrefix}/${backendModuleName}/${busName}/query/page',
-${frontModuleName}${busNameFirstUpper}Detail = '/${apiPrefix}/${backendModuleName}/${busName}/detail',
-${frontModuleName}${busNameFirstUpper}Add = '/${apiPrefix}/${backendModuleName}/${busName}/add',
-${frontModuleName}${busNameFirstUpper}Edit = '/${apiPrefix}/${backendModuleName}/${busName}/edit',
-${frontModuleName}${busNameFirstUpper}Remove = '/${apiPrefix}/${backendModuleName}/${busName}/removeByIds',
+${frontModuleName}${busNameFirstUpper}QueryPage = '${pathPrefix}/query/page',
+${frontModuleName}${busNameFirstUpper}Detail = '${pathPrefix}/detail',
+${frontModuleName}${busNameFirstUpper}Add = '${pathPrefix}/add',
+${frontModuleName}${busNameFirstUpper}Edit = '${pathPrefix}/edit',
+${frontModuleName}${busNameFirstUpper}Remove = '${pathPrefix}/removeByIds',
 }
 
 /**

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

@@ -18,6 +18,11 @@
             <artifactId>tr-spring-boot-starter-plugin-dict</artifactId>
         </dependency>
 
+        <dependency>
+            <groupId>cn.tr</groupId>
+            <artifactId>tr-spring-boot-starter-plugin-numbering-strategy</artifactId>
+        </dependency>
+
         <dependency>
             <groupId>cn.tr</groupId>
             <artifactId>tr-spring-boot-starter-plugin-file</artifactId>

+ 2 - 0
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/config/SysConfigController.java

@@ -1,6 +1,7 @@
 package cn.tr.module.sys.config;
 
 import cn.dev33.satoken.annotation.SaCheckPermission;
+import cn.dev33.satoken.annotation.SaIgnore;
 import cn.tr.core.pojo.CommonResult;
 import cn.tr.plugin.mybatis.base.BaseController;
 import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
@@ -25,6 +26,7 @@ public class SysConfigController extends BaseController{
     @ApiOperationSupport(author = "lf",order = 1)
     @ApiOperation(value = "查看系统当前配置信息",notes = "权限: 无")
     @GetMapping("/get/current")
+    @SaIgnore
     public CommonResult<SysConfigProperties> getCurrent(){
         return CommonResult.success(configManager.getCurrent());
     }

+ 15 - 0
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/monitor/service/impl/DevMonitorServiceImpl.java

@@ -33,10 +33,13 @@ import oshi.hardware.GlobalMemory;
 import oshi.hardware.HardwareAbstractionLayer;
 import oshi.software.os.FileSystem;
 import oshi.software.os.OperatingSystem;
+import reactor.core.publisher.Flux;
 
+import javax.annotation.PostConstruct;
 import java.lang.management.ManagementFactory;
 import java.lang.management.RuntimeMXBean;
 import java.math.BigDecimal;
+import java.time.Duration;
 import java.util.Map;
 import java.util.concurrent.atomic.AtomicLong;
 
@@ -48,9 +51,21 @@ import java.util.concurrent.atomic.AtomicLong;
  */
 @Service
 public class DevMonitorServiceImpl implements DevMonitorService {
+    private DevMonitorServerResult monitorServerResult=new DevMonitorServerResult();
+
+    @PostConstruct
+    public void init(){
+        Flux.interval(Duration.ofSeconds(10))
+                .doOnNext(t->monitorServerResult=refreshInfo())
+                .subscribe();
+    }
 
     @Override
     public DevMonitorServerResult serverInfo() {
+        return monitorServerResult;
+    }
+
+    private DevMonitorServerResult refreshInfo() {
         DevMonitorServerResult devMonitorServerResult = new DevMonitorServerResult();
         SystemInfo si = new SystemInfo();
         HardwareAbstractionLayer hal = si.getHardware();

+ 35 - 0
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/numStrategy/config/StrategyConfig.java

@@ -0,0 +1,35 @@
+package cn.tr.module.sys.numStrategy.config;
+
+import cn.tr.core.exception.ServiceException;
+import cn.tr.core.exception.TRExcCode;
+import cn.tr.module.sys.numStrategy.dto.SysNumberingStrategyDTO;
+import cn.tr.module.sys.numStrategy.mapper.SysNumberingStrategyMapper;
+import cn.tr.module.sys.numStrategy.service.ISysNumberingStrategyService;
+import cn.tr.plugin.numbering.strategy.NumberingStrategy;
+import cn.tr.plugin.numbering.strategy.core.NumberingStrategyClientFactory;
+import cn.tr.plugin.numbering.strategy.core.NumberingStrategyClient;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * @ClassName : StrategyConfig
+ * @Description :
+ * @Author : LF
+ * @Date: 2023年04月24日
+ */
+@Configuration
+public class StrategyConfig {
+
+    public StrategyConfig(NumberingStrategyClientFactory strategyClientFactory,ISysNumberingStrategyService numberingStrategyService) {
+        NumberingStrategy.tr.numberGenerator=strategyCode->{
+            SysNumberingStrategyDTO strategy = numberingStrategyService.selectSysNumberingStrategyByCode(strategyCode);
+            if(strategy==null){
+                throw new ServiceException(TRExcCode.SYSTEM_ERROR_B0001,String.format("编号策略{%s}不存在",strategyCode));
+            }
+            NumberingStrategyClient strategyClient = strategyClientFactory.getSerialStrategyClient(strategy.getId());
+            if(strategyClient==null){
+                strategyClient=strategyClientFactory.createOrUpdateSmsClient(SysNumberingStrategyMapper.INSTANCE.convertProperty(strategy));
+            }
+            return strategyClient.getAndIncrementSerialNum();
+        };
+    }
+}

+ 87 - 0
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/numStrategy/controller/SysNumberingStrategyController.java

@@ -0,0 +1,87 @@
+package cn.tr.module.sys.numStrategy.controller;
+
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import cn.tr.core.validation.Insert;
+import cn.tr.core.validation.Update;
+import cn.tr.core.pojo.CommonResult;
+import lombok.AllArgsConstructor;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RestController;
+import cn.tr.module.sys.numStrategy.dto.SysNumberingStrategyDTO;
+import cn.tr.module.sys.numStrategy.service.ISysNumberingStrategyService;
+import cn.tr.module.sys.numStrategy.dto.SysNumberingStrategyQueryDTO;
+import java.util.*;
+import cn.tr.plugin.mybatis.base.BaseController;
+import org.springframework.web.bind.annotation.*;
+import cn.tr.plugin.operatelog.annotation.OperateLog;
+import cn.tr.core.pojo.TableDataInfo;
+/**
+ * 编号策略控制器
+ *
+ * @author lf
+ * @date  2023/04/24 17:22
+ */
+@Api(tags = "编号策略")
+@RestController
+@RequestMapping("/sys/numStrategy")
+@AllArgsConstructor
+public class SysNumberingStrategyController extends BaseController{
+
+    private final ISysNumberingStrategyService sysNumberingStrategyService;
+
+    @ApiOperationSupport(author = "lf",order = 1)
+    @ApiOperation(value="获取所给策略的下一个编号",notes = "权限: 无")
+    @GetMapping("/query/nextNum/{id}")
+    public CommonResult<String> lookNextNumber(@PathVariable("id") String strategyId) {
+        return CommonResult.success(sysNumberingStrategyService.lookNextNumber(strategyId));
+    }
+
+    @ApiOperationSupport(author = "lf",order = 2)
+    @ApiOperation(value="根据条件查询编号策略",notes = "权限: 无")
+    @PostMapping("/query/page")
+    public TableDataInfo<SysNumberingStrategyDTO> selectList(@RequestBody SysNumberingStrategyQueryDTO query) {
+        startPage();
+        return getDataTable(sysNumberingStrategyService.selectSysNumberingStrategyList(query));
+    }
+
+    @ApiOperationSupport(author = "lf",order = 3)
+    @ApiOperation(value = "根据id查询编号策略",notes = "权限: sys:numStrategy:query")
+    @GetMapping("/detail/{id}")
+    @SaCheckPermission("sys:numStrategy:query")
+    public CommonResult<SysNumberingStrategyDTO> findById(@PathVariable("id") String id){
+        return CommonResult.success(sysNumberingStrategyService.selectSysNumberingStrategyById(id));
+    }
+
+    @ApiOperationSupport(author = "lf",order = 4)
+    @ApiOperation(value="添加编号策略",notes = "权限: sys:numStrategy:add")
+    @PostMapping("/add")
+    @OperateLog
+    @SaCheckPermission("sys:numStrategy:add")
+    public CommonResult<Boolean> add(@RequestBody@Validated(Insert.class) SysNumberingStrategyDTO source) {
+        return CommonResult.success(sysNumberingStrategyService.insertSysNumberingStrategy(source));
+    }
+
+    @ApiOperationSupport(author = "lf",order = 5)
+    @ApiOperation(value="通过主键id编辑编号策略",notes = "权限: sys:numStrategy:edit")
+    @PostMapping("/edit")
+    @OperateLog
+    @SaCheckPermission("sys:numStrategy:edit")
+    public CommonResult<Boolean> edit(@RequestBody@Validated(Update.class) SysNumberingStrategyDTO source) {
+        return CommonResult.success(sysNumberingStrategyService.updateSysNumberingStrategyById(source));
+    }
+
+    @ApiOperationSupport(author = "lf",order = 6)
+    @ApiOperation(value="删除编号策略",notes = "权限: sys:numStrategy:remove")
+    @PostMapping("/removeByIds")
+    @OperateLog
+    @SaCheckPermission("sys:numStrategy:remove")
+    public CommonResult<Integer> delete(@RequestBody Collection<String> ids) {
+        return CommonResult.success(sysNumberingStrategyService.removeSysNumberingStrategyByIds(ids));
+    }
+}

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

@@ -0,0 +1,61 @@
+package cn.tr.module.sys.numStrategy.dto;
+
+import cn.tr.plugin.mybatis.pojo.BaseDTO;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+import cn.tr.core.validation.Insert;
+import cn.tr.core.validation.Update;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import javax.validation.constraints.*;
+
+/**
+ * 编号策略传输对象
+ *
+ * @author lf
+ * @date  2023/04/24 17:22
+ **/
+@Data
+@ApiModel("编号策略传输对象")
+@EqualsAndHashCode(callSuper = true)
+@ToString
+public class SysNumberingStrategyDTO extends BaseDTO  {
+    private static final long serialVersionUID = 1L;
+    @ApiModelProperty(value = "主键", position = 1)
+    @NotBlank  (message = "主键不能为空",groups = {Update.class})
+    private String id;
+
+    @ApiModelProperty(value = "策略编码", position = 2,required = true)
+    @NotBlank  (message = "策略编码不能为空",groups = {Update.class,Insert.class})
+    private String code;
+
+    @ApiModelProperty(value = "策略名称", position = 3,required = true)
+    @NotBlank  (message = "策略名称不能为空",groups = {Update.class,Insert.class})
+    private String name;
+
+    @ApiModelProperty(value = "编号前缀", position = 4,required = true)
+    private String prefix;
+
+    @ApiModelProperty(value = "生成模式", position = 5,required = true)
+    @NotBlank  (message = "生成模式不能为空",groups = {Update.class,Insert.class})
+    private String type;
+
+    @ApiModelProperty(value = "下一个流水号", position = 6,required = true)
+    @NotNull  (message = "下一个编号不能为空",groups = {Update.class,Insert.class})
+    @Min(value = 0,message = "流水号不能小于0")
+    private Integer nextNum;
+
+    @ApiModelProperty(value = "下一个编码(此编码为格式化后的流水号)",readOnly = true)
+    private String nextFormatNum;
+
+    @ApiModelProperty(value = "流水号长度", position = 7)
+    private Integer limitLen;
+
+    @ApiModelProperty(value = "填充字符", position = 8)
+    private Character fillChar;
+
+    @ApiModelProperty(value = "备注", position = 9)
+    private String remark;
+
+}

+ 26 - 0
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/numStrategy/dto/SysNumberingStrategyQueryDTO.java

@@ -0,0 +1,26 @@
+package cn.tr.module.sys.numStrategy.dto;
+
+import lombok.ToString;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import cn.tr.plugin.mybatis.pojo.BetweenQuery;
+import java.util.*;
+/**
+ * 编号策略查询参数
+ *
+ * @author lf
+ * @date  2023/04/24 17:22
+ **/
+@Data
+@ApiModel("编号策略查询参数")
+@ToString
+public class SysNumberingStrategyQueryDTO  {
+    private static final long serialVersionUID = 1L;
+    @ApiModelProperty(value = "策略编码", position = 2)
+    private String code;
+
+    @ApiModelProperty(value = "策略名称", position = 3)
+    private String name;
+
+}

+ 41 - 0
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/numStrategy/mapper/SysNumberingStrategyMapper.java

@@ -0,0 +1,41 @@
+package cn.tr.module.sys.numStrategy.mapper;
+
+import cn.tr.module.sys.numStrategy.po.SysNumberingStrategyPO;
+import cn.tr.module.sys.numStrategy.dto.SysNumberingStrategyDTO;
+import cn.tr.plugin.numbering.strategy.core.properties.NumberingStrategyProperties;
+import org.mapstruct.Mapper;
+import org.mapstruct.Mapping;
+import org.mapstruct.Mappings;
+import org.mapstruct.factory.Mappers;
+
+import java.util.List;
+
+/**
+* 编号策略映射工具
+*
+* @author lf
+* @date  2023/04/24 17:22
+**/
+@Mapper
+public interface SysNumberingStrategyMapper {
+    SysNumberingStrategyMapper INSTANCE = Mappers.getMapper(SysNumberingStrategyMapper.class);
+
+    SysNumberingStrategyPO convertPO(SysNumberingStrategyDTO source);
+
+    @Mappings(
+            @Mapping(target = "clientId",source = "id")
+    )
+    NumberingStrategyProperties convertProperty(SysNumberingStrategyDTO source);
+
+    @Mappings(
+            @Mapping(target = "clientId",source = "id")
+    )
+    List<NumberingStrategyProperties> convertProperties(List<SysNumberingStrategyPO> source);
+
+    SysNumberingStrategyDTO convertDto(SysNumberingStrategyPO source);
+
+    List<SysNumberingStrategyDTO> convertDtoList(List<SysNumberingStrategyPO> source);
+
+    List<SysNumberingStrategyPO> convertPOList(List<SysNumberingStrategyDTO> source);
+
+}

+ 57 - 0
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/numStrategy/po/SysNumberingStrategyPO.java

@@ -0,0 +1,57 @@
+package cn.tr.module.sys.numStrategy.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;
+
+/**
+ * 编号策略实体
+ *
+ * @author lf
+ * @date  2023/04/24 17:22
+ **/
+@Data
+@TableName("sys_numbering_strategy")
+@EqualsAndHashCode(callSuper = true)
+@ToString
+public class SysNumberingStrategyPO extends BasePO {
+
+    /** 主键 */
+    @TableId
+    @ApiModelProperty(value = "主键", position = 1)
+    private String id;
+
+    /** 策略编码 */
+    @ApiModelProperty(value = "策略编码", position = 2)
+    private String code;
+
+    /** 策略名称 */
+    @ApiModelProperty(value = "策略名称", position = 3)
+    private String name;
+
+    /** 编号前缀 */
+    @ApiModelProperty(value = "编号前缀", position = 4)
+    private String prefix;
+
+    /** 生成模式 */
+    @ApiModelProperty(value = "生成模式", position = 5)
+    private String type;
+
+    /** 流水号长度 */
+    @ApiModelProperty(value = "流水号长度", position = 7)
+    private Integer limitLen;
+
+    /** 填充字符 */
+    @ApiModelProperty(value = "填充字符", position = 8)
+    private Character fillChar;
+
+    /** 备注 */
+    @ApiModelProperty(value = "备注", position = 9)
+    private String remark;
+
+}

+ 18 - 0
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/numStrategy/repository/SysNumberingStrategyRepository.java

@@ -0,0 +1,18 @@
+package cn.tr.module.sys.numStrategy.repository;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+import org.springframework.stereotype.Repository;
+import java.util.*;
+import cn.tr.module.sys.numStrategy.po.SysNumberingStrategyPO;
+/**
+ * 编号策略Mapper接口
+ *
+ * @author lf
+ * @date  2023/04/24 17:22
+ **/
+@Repository
+@Mapper
+public interface SysNumberingStrategyRepository extends BaseMapper<SysNumberingStrategyPO> {
+}

+ 74 - 0
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/numStrategy/service/ISysNumberingStrategyService.java

@@ -0,0 +1,74 @@
+package cn.tr.module.sys.numStrategy.service;
+
+import cn.tr.module.sys.numStrategy.dto.SysNumberingStrategyDTO;
+import cn.tr.module.sys.numStrategy.dto.SysNumberingStrategyQueryDTO;
+import java.util.*;
+
+/**
+ * 编号策略Service接口
+ *
+ * @author lf
+ * @date  2023/04/24 17:22
+ **/
+public interface ISysNumberingStrategyService{
+
+    /**
+     * 初始化操作
+     */
+    void initLocalCache();
+
+    /**
+     * 查询所给策略id的下一个策略编码
+     * @param strategyId 策略id
+     * @return 下一个策略编码
+     */
+    String lookNextNumber(String strategyId);
+
+    /**
+     * 根据条件查询编号策略
+     * @param    query 查询参数
+     * @author   lf
+     * @date      2023/04/24 17:22
+     */
+    List<SysNumberingStrategyDTO> selectSysNumberingStrategyList(SysNumberingStrategyQueryDTO query);
+
+    /**
+     * 根据id查询编号策略
+     * @param    id 主键id
+     * @author   lf
+     * @date      2023/04/24 17:22
+     */
+    SysNumberingStrategyDTO selectSysNumberingStrategyById(String id);
+
+    /**
+     * 根据唯一编码查询编号策略
+     * @param    id 主键id
+     * @author   lf
+     * @date      2023/04/24 17:22
+     */
+    SysNumberingStrategyDTO selectSysNumberingStrategyByCode(String id);
+
+    /**
+     * 编辑编号策略
+     * @param   source 编辑实体类
+     * @author  lf
+     * @date     2023/04/24 17:22
+     */
+    boolean updateSysNumberingStrategyById(SysNumberingStrategyDTO source);
+
+    /**
+     * 新增编号策略
+     * @param   source 新增实体类
+     * @author lf
+     * @date  2023/04/24 17:22
+     */
+    boolean insertSysNumberingStrategy(SysNumberingStrategyDTO source);
+
+    /**
+     * 删除编号策略详情
+     * @param  ids 删除主键集合
+     * @author lf
+     * @date    2023/04/24 17:22
+     */
+    int removeSysNumberingStrategyByIds(Collection<String> ids);
+}

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

@@ -0,0 +1,162 @@
+package cn.tr.module.sys.numStrategy.service.impl;
+
+import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.core.util.StrUtil;
+import cn.tr.core.exception.ServiceException;
+import cn.tr.core.exception.TRExcCode;
+import cn.tr.plugin.numbering.strategy.core.NumberingStrategyClientFactory;
+import cn.tr.plugin.numbering.strategy.core.NumberingStrategyClient;
+import cn.tr.plugin.numbering.strategy.core.properties.NumberingStrategyProperties;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import cn.tr.module.sys.numStrategy.repository.SysNumberingStrategyRepository;
+import cn.tr.module.sys.numStrategy.po.SysNumberingStrategyPO;
+import cn.tr.module.sys.numStrategy.dto.SysNumberingStrategyDTO;
+import cn.tr.module.sys.numStrategy.dto.SysNumberingStrategyQueryDTO;
+import java.util.*;
+import cn.tr.module.sys.numStrategy.service.ISysNumberingStrategyService;
+import cn.tr.module.sys.numStrategy.mapper.SysNumberingStrategyMapper;
+
+import javax.annotation.PostConstruct;
+
+/**
+ * 编号策略Service接口实现类
+ *
+ * @author lf
+ * @date  2023/04/24 17:22
+ **/
+@Service
+@Slf4j
+public class SysNumberingStrategyServiceImpl implements ISysNumberingStrategyService {
+    @Autowired
+    private SysNumberingStrategyRepository baseRepository;
+
+    @Autowired
+    private NumberingStrategyClientFactory strategyClientFactory;
+
+    @Override
+    @PostConstruct
+    public void initLocalCache() {
+        List<SysNumberingStrategyPO> strategies = baseRepository.selectList(new LambdaQueryWrapper<>());
+        log.info("[initLocalCache][缓存编码策略,数量为:{}]", strategies.size());
+
+        List<NumberingStrategyProperties> properties = SysNumberingStrategyMapper.INSTANCE.convertProperties(strategies);
+        if(CollectionUtil.isNotEmpty(properties)){
+            properties.forEach(strategyClientFactory::createOrUpdateSmsClient);
+        }
+    }
+
+    @Override
+    public String lookNextNumber(String strategyId) {
+        NumberingStrategyClient client = strategyClientFactory.getSerialStrategyClient(strategyId);
+        if(client==null){
+            SysNumberingStrategyDTO strategy = this.selectSysNumberingStrategyById(strategyId);
+            if(strategy==null){
+                return null;
+            }
+            client=strategyClientFactory.createOrUpdateSmsClient(SysNumberingStrategyMapper.INSTANCE.convertProperty(strategy));
+        }
+        return client.getNextFormatNum();
+    }
+
+    /**
+     * 根据条件查询编号策略
+     * @param    query 查询参数
+     * @author   lf
+     * @date      2023/04/24 17:22
+     */
+    @Override
+    public List<SysNumberingStrategyDTO> selectSysNumberingStrategyList(SysNumberingStrategyQueryDTO query){
+        return SysNumberingStrategyMapper.INSTANCE.convertDtoList(
+                baseRepository.selectList(new LambdaQueryWrapper<SysNumberingStrategyPO>()
+                        .like(Objects.nonNull(query.getCode()),SysNumberingStrategyPO::getCode,
+                                query.getCode())
+                        .like(Objects.nonNull(query.getName()),SysNumberingStrategyPO::getName,
+                                query.getName())
+                )
+        );
+    };
+
+    /**
+     * 根据id查询编号策略
+     * @param    id 主键id
+     * @author   lf
+     * @date      2023/04/24 17:22
+     */
+    @Override
+    public SysNumberingStrategyDTO selectSysNumberingStrategyById(String id){
+        SysNumberingStrategyDTO result = SysNumberingStrategyMapper.INSTANCE.convertDto(baseRepository.selectById(id));
+        NumberingStrategyClient client = getClient(result);
+        result.setNextNum(client.getNextNum());
+        result.setNextFormatNum(client.getNextFormatNum());
+        return result;
+    }
+
+    @Override
+    public SysNumberingStrategyDTO selectSysNumberingStrategyByCode(String code) {
+        return SysNumberingStrategyMapper.INSTANCE.convertDto(baseRepository.selectOne(new LambdaQueryWrapper<SysNumberingStrategyPO>()
+                .eq(SysNumberingStrategyPO::getCode,code)));
+    }
+
+    ;
+
+    /**
+     * 编辑编号策略
+     * @param   source 编辑实体类
+     * @author  lf
+     * @date     2023/04/24 17:22
+     */
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public boolean updateSysNumberingStrategyById(SysNumberingStrategyDTO source){
+        SysNumberingStrategyPO strategyPO = SysNumberingStrategyMapper.INSTANCE.convertPO(source);
+        validateRoleSource(strategyPO);
+        return baseRepository.updateById(strategyPO)!=0;
+    };
+
+    /**
+     * 新增编号策略
+     * @param   source 新增实体类
+     * @author lf
+     * @date  2023/04/24 17:22
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public boolean insertSysNumberingStrategy(SysNumberingStrategyDTO source){
+        SysNumberingStrategyPO strategyPO = SysNumberingStrategyMapper.INSTANCE.convertPO(source);
+        validateRoleSource(strategyPO);
+        return baseRepository.insert(strategyPO)!=0;
+    };
+
+    /**
+     * 删除编号策略详情
+     * @param  ids 删除主键集合
+     * @author lf
+     * @date    2023/04/24 17:22
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public int removeSysNumberingStrategyByIds(Collection<String> ids){
+        return baseRepository.deleteBatchIds(ids);
+    };
+
+    private void validateRoleSource(SysNumberingStrategyPO source){
+        SysNumberingStrategyPO role = baseRepository.selectOne(new LambdaQueryWrapper<SysNumberingStrategyPO>()
+                .eq(SysNumberingStrategyPO::getCode, source.getCode())
+                .last("limit 1"));
+        if(role!=null&& !StrUtil.equals(role.getId(),source.getId())){
+            throw new ServiceException(TRExcCode.SYSTEM_ERROR_B0001,String.format("策略编码{%s}不能重复",source.getCode()));
+        }
+    }
+
+    private NumberingStrategyClient getClient(SysNumberingStrategyDTO source){
+        NumberingStrategyClient result = strategyClientFactory.getSerialStrategyClient(source.getId());
+        if(result==null){
+            result=strategyClientFactory.createOrUpdateSmsClient(SysNumberingStrategyMapper.INSTANCE.convertProperty(source));
+        }
+        return result;
+    }
+}

+ 1 - 1
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/sms/service/impl/SysSmsChannelServiceImpl.java

@@ -116,7 +116,7 @@ public class SysSmsChannelServiceImpl implements ISysSmsChannelService {
     };
 
 
-    private void testConfig(SysSmsChannelDTO smsChannel){
+    private void refreshLocalCache(SysSmsChannelDTO smsChannel){
         //校验配置
 
     }

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

@@ -3,6 +3,7 @@ package cn.tr.module.sys.user.po;
 import cn.tr.core.annotation.Comment;
 import cn.tr.plugin.mybatis.config.handler.StringListTypeHandler;
 import cn.tr.plugin.mybatis.pojo.TenantPO;
+import cn.tr.plugin.numbering.strategy.core.annotation.Numbering;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
@@ -24,6 +25,7 @@ public class SysRolePO extends TenantPO {
     private String id;
 
     @Comment("角色编码")
+    @Numbering(code = "13")
     private String code;
 
     @Comment("角色名称")
@@ -37,7 +39,7 @@ public class SysRolePO extends TenantPO {
     private List<String> orgIds;
 
     /**
-     * {@link cn.tr.module.sys.user.enums.RoleEnum}
+     * {@link cn.tr.module.sys.user.enums.CreateEnum}
      */
     @Comment("角色类型 sys、系统角色 custom、自定义角色")
     private String type;

+ 1 - 0
tr-plugins/pom.xml

@@ -36,6 +36,7 @@
         <module>tr-spring-boot-starter-plugin-mp-enhance-actable</module>
         <module>tr-spring-boot-starter-plugin-biz-bean-mapper</module>
         <module>tr-spring-boot-starter-plugin-biz-constant</module>
+        <module>tr-spring-boot-starter-plugin-numbering-strategy</module>
     </modules>
 
 </project>

+ 1 - 1
tr-plugins/tr-spring-boot-starter-plugin-biz-constant/src/main/java/cn/tr/plugin/constant/config/ConstantInterceptor.java

@@ -52,7 +52,7 @@ public class ConstantInterceptor implements InnerInterceptor {
 
     @Override
     public void beforeUpdate(Executor executor, MappedStatement ms, Object parameter) throws SQLException {
-        System.out.println("13");
+
     }
 
 

+ 0 - 5
tr-plugins/tr-spring-boot-starter-plugin-mybatis/src/main/java/cn/tr/plugin/mybatis/TrMybatisAutoConfiguration.java

@@ -5,7 +5,6 @@ import cn.tr.plugin.mybatis.config.handler.CreateAndUpdateMetaObjectHandler;
 import cn.tr.plugin.mybatis.config.logic.PteromysSqlInjector;
 import cn.tr.plugin.mybatis.config.page.PageConfig;
 import com.alibaba.druid.spring.boot.autoconfigure.properties.DruidStatProperties;
-import com.baomidou.mybatisplus.autoconfigure.MybatisPlusProperties;
 import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
 import com.baomidou.mybatisplus.core.injector.ISqlInjector;
 import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
@@ -15,10 +14,6 @@ import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInt
 import java.util.*;
 
 import com.baomidou.mybatisplus.extension.plugins.inner.TenantLineInnerInterceptor;
-import com.github.pagehelper.PageInterceptor;
-import org.apache.ibatis.plugin.Interceptor;
-import org.springframework.beans.BeansException;
-import org.springframework.beans.factory.config.BeanPostProcessor;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
 import org.springframework.boot.web.servlet.FilterRegistrationBean;
 import org.springframework.context.annotation.Bean;

+ 37 - 0
tr-plugins/tr-spring-boot-starter-plugin-numbering-strategy/pom.xml

@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>tr-plugins</artifactId>
+        <groupId>cn.tr</groupId>
+        <version>${revision}</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+    <version>${revision}</version>
+    <artifactId>tr-spring-boot-starter-plugin-numbering-strategy</artifactId>
+
+    <description>编号策略插件</description>
+
+    <dependencies>
+        <dependency>
+            <groupId>cn.tr</groupId>
+            <artifactId>tr-framework</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.redisson</groupId>
+            <artifactId>redisson-spring-boot-starter</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>cn.tr</groupId>
+            <artifactId>tr-spring-boot-starter-plugin-test</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>cn.tr</groupId>
+            <artifactId>tr-spring-boot-starter-plugin-mybatis</artifactId>
+        </dependency>
+    </dependencies>
+</project>

+ 26 - 0
tr-plugins/tr-spring-boot-starter-plugin-numbering-strategy/src/main/java/cn/tr/plugin/numbering/strategy/NumberingStrategy.java

@@ -0,0 +1,26 @@
+package cn.tr.plugin.numbering.strategy;
+
+import java.util.function.Function;
+
+/**
+ * @ClassName : NumberingStrategy
+ * @Description :
+ * @Author : LF
+ * @Date: 2023年04月24日
+ */
+
+public class NumberingStrategy {
+
+    private NumberingStrategy() {
+    }
+
+    public Function<String,String> numberGenerator=strategyCode->"";
+
+    public static NumberingStrategy tr=new NumberingStrategy();
+
+
+
+    public String getNextNumber(String strategyCode){
+        return numberGenerator.apply(strategyCode);
+    }
+}

+ 25 - 0
tr-plugins/tr-spring-boot-starter-plugin-numbering-strategy/src/main/java/cn/tr/plugin/numbering/strategy/TrNumberingStrategyAutoConfiguration.java

@@ -0,0 +1,25 @@
+package cn.tr.plugin.numbering.strategy;
+
+import cn.tr.plugin.numbering.strategy.core.DefaultNumberingStrategyClientFactory;
+import cn.tr.plugin.numbering.strategy.core.NumberingStrategyClientFactory;
+import cn.tr.plugin.numbering.strategy.mybatis.NumberingStrategyInterceptor;
+import org.redisson.api.RedissonClient;
+import org.springframework.context.annotation.Bean;
+
+/**
+ * @ClassName : TrNumberingStrategyAutoConfiguration
+ * @Description :
+ * @Author : LF
+ * @Date: 2023年04月24日
+ */
+public class TrNumberingStrategyAutoConfiguration {
+    @Bean
+    public NumberingStrategyClientFactory serialStrategyClientFactory(RedissonClient redissonClient){
+        return new DefaultNumberingStrategyClientFactory(redissonClient);
+    }
+
+    @Bean
+    public NumberingStrategyInterceptor serialStrategyInterceptor(){
+        return new NumberingStrategyInterceptor();
+    }
+}

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

@@ -0,0 +1,105 @@
+package cn.tr.plugin.numbering.strategy.core;
+
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.StrUtil;
+import cn.tr.plugin.numbering.strategy.core.enums.NumberingStrategyEnum;
+import cn.tr.plugin.numbering.strategy.core.properties.NumberingStrategyProperties;
+import lombok.Data;
+import org.redisson.api.RMap;
+import org.redisson.api.RedissonClient;
+import org.redisson.client.codec.IntegerCodec;
+import org.springframework.util.Assert;
+
+import java.util.Date;
+import java.util.Objects;
+
+/**
+ * @ClassName : DefaultSerialStrategyClient
+ * @Description :
+ * @Author : LF
+ * @Date: 2023年04月24日
+ */
+@Data
+public class DefaultNumberingStrategyClient implements NumberingStrategyClient {
+    /**
+     * 当前编码
+     */
+    private static final String CURRENT_NUM="currentNum";
+    private NumberingStrategyProperties properties;
+    private RMap<String, Integer> operation;
+    private NumberingStrategyEnum strategyEnum;
+
+    DefaultNumberingStrategyClient(NumberingStrategyProperties properties, RedissonClient redissonClient) {
+        operation = redissonClient.getMap("global:serialStrategy:"+properties.getClientId(),new IntegerCodec());
+        doInit(properties);
+    }
+
+    @Override
+    public String getAndIncrementSerialNum() {
+        Integer nextNum = this.operation.addAndGet(CURRENT_NUM, 1);
+        return formatSerialNo(nextNum);
+    }
+
+    @Override
+    public String getNextFormatNum() {
+        Integer currentNum = this.operation.get(CURRENT_NUM);
+        Integer nextNum=currentNum+1;
+        return formatSerialNo(nextNum);
+    }
+
+    @Override
+    public Integer getNextNum() {
+        Integer currentNum = this.operation.get(CURRENT_NUM);
+        return currentNum+1;
+    }
+
+    @Override
+    public void refreshProperties(NumberingStrategyProperties properties) {
+        doInit(properties);
+    }
+
+    /**
+     * 格式化流水号
+     * @return 格式化完成的流水号
+     */
+    private String formatSerialNo(Integer num){
+        String prefix = this.properties.getPrefix();
+        String pattern = strategyEnum.getPattern();
+        String fillNum = fillNum(properties.getLimitNum(), num);
+        if (StrUtil.isEmpty(properties.getPrefix())) {
+            return DateUtil.format(new Date(),pattern)+"-"+fillNum;
+        }
+        return prefix+"-"+ DateUtil.format(new Date(),pattern)+"-"+fillNum;
+    }
+
+    private String fillNum(Integer length,Integer num){
+        String str = String.valueOf(num);
+        if(length==null||StrUtil.length(str)==length){
+            return str;
+        }
+        if(StrUtil.length(str)<length){
+            //字符串长度比限定长度小,进行左填充0
+            str= StrUtil.fillBefore(str,properties.getFillChar(),length);
+        } else {
+            str=StrUtil.subSufByLength(str,length);
+        }
+        return str;
+    }
+
+    private void doInit(NumberingStrategyProperties properties){
+        Assert.notNull(NumberingStrategyEnum.valueOf(properties.getType()),String.format("不支持此生成模式:%s",properties.getType()));
+        this.properties = properties;
+        this.strategyEnum= NumberingStrategyEnum.valueOf(properties.getType());
+        Integer nextNum = properties.getNextNum();
+        if (Objects.isNull(nextNum)) {
+            //更新值为null,缓存值不为null,则不进行更新操作
+            nextNum = this.operation.get(CURRENT_NUM);
+            if(nextNum!=null){
+                return;
+            }
+        }
+        //当nextNum为空或者小于0时,将currentNum设置为0
+        Integer currentNum=( Objects.isNull(nextNum)||nextNum<=0)?0:nextNum-1;
+        this.operation.put(CURRENT_NUM,currentNum);
+    }
+}

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

@@ -0,0 +1,39 @@
+package cn.tr.plugin.numbering.strategy.core;
+
+import cn.tr.plugin.numbering.strategy.core.properties.NumberingStrategyProperties;
+import org.redisson.api.RedissonClient;
+
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+
+/**
+ * @ClassName : DefaultSerialStrategyClientFactory
+ * @Description :
+ * @Author : LF
+ * @Date: 2023年04月24日
+ */
+public class DefaultNumberingStrategyClientFactory implements NumberingStrategyClientFactory {
+    private final ConcurrentMap<String, NumberingStrategyClient> clients = new ConcurrentHashMap<>();
+    private RedissonClient redissonClient;
+
+    public DefaultNumberingStrategyClientFactory(RedissonClient redissonClient) {
+        this.redissonClient = redissonClient;
+    }
+
+    @Override
+    public NumberingStrategyClient getSerialStrategyClient(String id) {
+        return clients.get(id);
+    }
+
+    @Override
+    public NumberingStrategyClient createOrUpdateSmsClient(NumberingStrategyProperties config) {
+        NumberingStrategyClient client = getSerialStrategyClient(config.getClientId());
+        if(client==null){
+            client=new DefaultNumberingStrategyClient(config,redissonClient);
+            clients.put(config.getClientId(),client);
+        }else {
+            client.refreshProperties(config);
+        }
+        return client;
+    }
+}

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

@@ -0,0 +1,32 @@
+package cn.tr.plugin.numbering.strategy.core;
+
+import cn.tr.plugin.numbering.strategy.core.properties.NumberingStrategyProperties;
+
+/**
+ * @ClassName : SerialStrategyClient
+ * @Description :
+ * @Author : LF
+ * @Date: 2023年04月24日
+ */
+
+public interface NumberingStrategyClient {
+    /**
+     * 递增并获取下一个流水编号
+     * @return
+     */
+    String getAndIncrementSerialNum();
+
+    /**
+     * 获取下一个格式化后的编号(仅获取,不递增)
+     * @return
+     */
+    String getNextFormatNum();
+
+    /**
+     * 获取下一个的流水号(仅获取,不递增)
+     * @return
+     */
+    Integer getNextNum();
+
+    void refreshProperties(NumberingStrategyProperties properties);
+}

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

@@ -0,0 +1,26 @@
+package cn.tr.plugin.numbering.strategy.core;
+
+
+import cn.tr.plugin.numbering.strategy.core.properties.NumberingStrategyProperties;
+
+/**
+ * @Interface : NumberingStrategyClientFactory
+ * @Description : 编号策略客户端工厂
+ * @Author : LF
+ * @Date: 2023年03月15日
+ */
+
+public interface NumberingStrategyClientFactory {
+    /**
+     *
+     * @param id 客户端id
+     * @return 编号策略客户端
+     */
+    NumberingStrategyClient getSerialStrategyClient(String id);
+
+    /**
+     * @param config 编号策略配置
+     * @return
+     */
+    NumberingStrategyClient createOrUpdateSmsClient(NumberingStrategyProperties config);
+}

+ 26 - 0
tr-plugins/tr-spring-boot-starter-plugin-numbering-strategy/src/main/java/cn/tr/plugin/numbering/strategy/core/annotation/Numbering.java

@@ -0,0 +1,26 @@
+package cn.tr.plugin.numbering.strategy.core.annotation;
+
+import org.springframework.core.annotation.AliasFor;
+
+import java.lang.annotation.*;
+
+/**
+ * @ClassName : Numbering
+ * @Description :
+ * @Author : LF
+ * @Date: 2023年04月24日
+ */
+@Target({ElementType.FIELD})
+@Retention(RetentionPolicy.RUNTIME)
+@Documented
+public @interface Numbering {
+
+    @AliasFor("code")
+    String value() default "";
+
+    /**
+     * 编号策略编码
+     */
+    @AliasFor("value")
+    String code();
+}

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

@@ -0,0 +1,38 @@
+package cn.tr.plugin.numbering.strategy.core.enums;
+
+import cn.hutool.core.util.StrUtil;
+import cn.tr.core.enums.IEnum;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * @ClassName : SerialStrategyEnum
+ * @Description : 编号生成模式
+ * @Author : LF
+ * @Date: 2023年04月24日
+ */
+@Getter
+@AllArgsConstructor
+public enum NumberingStrategyEnum implements IEnum<String> {
+    nodata("none","编号前缀+流水号",""),
+    yyyyMMdd("yyyyMMdd","编号前缀+年月日+流水号","yyyyMMdd"),
+    yyyyMM("yyyyMM","编号前缀+年月+流水号","yyyyMM"),
+    yyyy("yyyy","编号前缀+年+流水号","yyyy"),
+    ;
+
+    private String value;
+    private String label;
+    private String pattern;
+
+
+    public static NumberingStrategyEnum ofValue(String value){
+        NumberingStrategyEnum[] values = NumberingStrategyEnum.values();
+        for (NumberingStrategyEnum numberingStrategyEnum : values) {
+            if(StrUtil.equals(value, numberingStrategyEnum.getValue())){
+                return numberingStrategyEnum;
+            }
+        }
+        return null;
+    }
+
+}

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

@@ -0,0 +1,59 @@
+package cn.tr.plugin.numbering.strategy.core.properties;
+
+import cn.tr.plugin.numbering.strategy.core.enums.NumberingStrategyEnum;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+
+/**
+ * @ClassName : NumberingStrategyProperties
+ * @Description : 策略属性
+ *  编号生成 = prefix(前缀) + 生成模式(type) + fill(nextNum) (根据limitNum对 nextNum进行填充)
+ * @Author : LF
+ * @Date: 2023年04月24日
+ */
+@Data
+@NoArgsConstructor
+@Builder
+@AllArgsConstructor
+public class NumberingStrategyProperties implements Serializable {
+    private static final long serialVersionUID = 5132787265557630563L;
+    /**
+     * 客户端id
+     */
+    private String clientId;
+
+    /**
+     * 生成模式
+     * {@link NumberingStrategyEnum}
+     * 策略所产生的编号 = 生成模式返回的字符串+ 流水号
+     */
+    private String type;
+
+    /**
+     * 编号前缀
+     */
+    private String prefix;
+
+
+    /**
+     * 下一个编码
+     */
+    private Integer nextNum;
+
+    /**
+     * 填充字符
+     */
+    private Character fillChar;
+
+    /**
+     * 流水号长度 当  前缀+流水号长度 < limitNum时,实行左补零
+     * 例: 当limitNum=5, 流水号=123
+     * 则最终生成的编号为 00123
+     *
+     */
+    private Integer limitNum;
+}

+ 33 - 0
tr-plugins/tr-spring-boot-starter-plugin-numbering-strategy/src/main/java/cn/tr/plugin/numbering/strategy/mybatis/NumberingStrategyInterceptor.java

@@ -0,0 +1,33 @@
+package cn.tr.plugin.numbering.strategy.mybatis;
+
+import cn.tr.plugin.numbering.strategy.NumberingStrategy;
+import cn.tr.plugin.numbering.strategy.core.annotation.Numbering;
+import com.baomidou.mybatisplus.extension.plugins.inner.InnerInterceptor;
+import org.apache.ibatis.executor.Executor;
+import org.apache.ibatis.mapping.MappedStatement;
+import org.springframework.aop.support.AopUtils;
+import org.springframework.util.ReflectionUtils;
+
+import java.sql.SQLException;
+
+/**
+ * @ClassName : SerialStrategyInterceptor
+ * @Description : 自动添加流水号
+ * @Author : LF
+ * @Date: 2023年04月24日
+ */
+public class NumberingStrategyInterceptor implements InnerInterceptor {
+    @Override
+    public void beforeUpdate(Executor executor, MappedStatement ms, Object parameter) throws SQLException {
+        //找到是否存在常量注解,存在的话,执行相应操作
+        Class<?> targetClass = AopUtils.getTargetClass(parameter);
+        ReflectionUtils.doWithFields(targetClass, field->{
+            Numbering numbering = field.getAnnotation(Numbering.class);
+            if(numbering!=null){
+                String nextNumber = NumberingStrategy.tr.getNextNumber(numbering.code());
+                field.setAccessible(true);
+                field.set(parameter,nextNumber);
+            }
+        });
+    }
+}

+ 1 - 0
tr-plugins/tr-spring-boot-starter-plugin-numbering-strategy/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports

@@ -0,0 +1 @@
+cn.tr.plugin.numbering.strategy.TrNumberingStrategyAutoConfiguration

+ 17 - 0
tr-plugins/tr-spring-boot-starter-plugin-numbering-strategy/src/main/resources/application-unit-test.yml

@@ -0,0 +1,17 @@
+spring:
+  redis:
+    host: 192.168.100.32
+    password: 6E6985E1F7CB40F24A\.
+    port: 9736
+    database: 7
+    timeout: 30s
+    lettuce:
+      pool:
+        # 连接池中的最小空闲连接
+        min-idle: 16
+        # 连接池中的最大空闲连接
+        max-idle: 16
+        # 连接池的最大数据库连接数
+        max-active: 16
+        # #连接池最大阻塞等待时间(使用负值表示没有限制)
+        max-wait: -1ms

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

@@ -0,0 +1,69 @@
+package cn.tr.plugin.numbering.strategy;
+
+import cn.tr.plugin.numbering.strategy.core.NumberingStrategyClient;
+import cn.tr.plugin.numbering.strategy.core.NumberingStrategyClientFactory;
+import cn.tr.plugin.numbering.strategy.core.enums.NumberingStrategyEnum;
+import cn.tr.plugin.numbering.strategy.core.properties.NumberingStrategyProperties;
+import cn.tr.plugin.test.ut.BaseRedisUnitTest;
+import lombok.extern.slf4j.Slf4j;
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Import;
+
+/**
+ * @ClassName : StrategyTest
+ * @Description :
+ * @Author : LF
+ * @Date: 2023年04月24日
+ */
+@Import(TrNumberingStrategyAutoConfiguration.class)
+@Slf4j
+public class StrategyTest extends BaseRedisUnitTest {
+    @Autowired
+    private NumberingStrategyClientFactory clientFactory;
+
+
+
+    @Test
+    public void prefixTest(){
+        NumberingStrategyProperties strategyProperties= NumberingStrategyProperties
+                .builder()
+                .clientId("1234")
+                .type(NumberingStrategyEnum.yyyyMM.getValue())
+                .prefix("test")
+                .fillChar('0')
+                .limitNum(5)
+                .build();
+        NumberingStrategyClient client = clientFactory.createOrUpdateSmsClient(strategyProperties);
+        for (int i = 1; i < 10; i++) {
+            String nextSerialNum = client.getNextFormatNum();
+            System.out.println(i+"OnlyGet: " + nextSerialNum);
+            String andIncrementSerialNum = client.getAndIncrementSerialNum();
+            System.out.println(i+"andIncrementSerialNum: " + andIncrementSerialNum);
+            nextSerialNum = client.getNextFormatNum();
+            System.out.println(i+"OnlyGet: " + nextSerialNum);
+        }
+    }
+
+
+    @Test
+    public void nonePrefixTest(){
+        NumberingStrategyProperties strategyProperties= NumberingStrategyProperties
+                .builder()
+                .clientId("123")
+                .type(NumberingStrategyEnum.yyyyMM.getValue())
+                .prefix("")
+                .fillChar('0')
+                .limitNum(5)
+                .build();
+        NumberingStrategyClient client = clientFactory.createOrUpdateSmsClient(strategyProperties);
+        for (int i = 1; i < 10; i++) {
+            String nextSerialNum = client.getNextFormatNum();
+            System.out.println(i+"OnlyGet: " + nextSerialNum);
+            String andIncrementSerialNum = client.getAndIncrementSerialNum();
+            System.out.println(i+"andIncrementSerialNum: " + andIncrementSerialNum);
+            nextSerialNum = client.getNextFormatNum();
+            System.out.println(i+"OnlyGet: " + nextSerialNum);
+        }
+    }
+}

+ 2 - 0
tr-plugins/tr-spring-boot-starter-plugin-web/src/main/java/cn/tr/plugin/web/config/handler/TrResponseBodyAdviceHandler.java

@@ -1,6 +1,7 @@
 package cn.tr.plugin.web.config.handler;
 
 import cn.tr.core.context.SecurityContextHolder;
+import cn.tr.core.strategy.PageStrategy;
 import org.springframework.core.MethodParameter;
 import org.springframework.http.MediaType;
 import org.springframework.http.converter.HttpMessageConverter;
@@ -40,6 +41,7 @@ public class TrResponseBodyAdviceHandler implements ResponseBodyAdvice<Object> {
     @Override
     public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class<? extends HttpMessageConverter<?>> selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {
         SecurityContextHolder.remove();
+        PageStrategy.tr.clear();
         return body;
     }
 }

+ 2 - 0
tr-plugins/tr-spring-boot-starter-plugin-web/src/main/java/cn/tr/plugin/web/filter/ExceptionFilter.java

@@ -1,5 +1,6 @@
 package cn.tr.plugin.web.filter;
 
+import cn.tr.core.context.SecurityContextHolder;
 import cn.tr.core.pojo.CommonResult;
 import cn.tr.core.strategy.ExceptionStrategy;
 import cn.tr.core.utils.ServletUtils;
@@ -16,6 +17,7 @@ public class ExceptionFilter implements Filter {
         @Override
         public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,
                              FilterChain chain) throws IOException {
+            SecurityContextHolder.remove();
             try {
                 chain.doFilter(servletRequest,servletResponse);
             }catch (Exception e){

+ 0 - 5
tr-test/pom.xml

@@ -78,11 +78,6 @@
             </exclusions>
         </dependency>
 
-        <!--<dependency>-->
-            <!--<groupId>cn.tr</groupId>-->
-            <!--<artifactId>tr-module-auth</artifactId>-->
-            <!--<version>0.0.9</version>-->
-        <!--</dependency>-->
 
         <dependency>
             <groupId>cn.tr</groupId>

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

@@ -65,6 +65,8 @@ tr:
       - sys_sms_temp
       - sys_sms_channel
       - sys_sms_log
+#      编号策略
+      - sys_numbering_strategy
 
 sa-token:
   is-read-header: true