diff --git a/win-framework/win-spring-boot-starter-mybatis/pom.xml b/win-framework/win-spring-boot-starter-mybatis/pom.xml index 13307214..0089292d 100644 --- a/win-framework/win-spring-boot-starter-mybatis/pom.xml +++ b/win-framework/win-spring-boot-starter-mybatis/pom.xml @@ -65,11 +65,14 @@ org.apache.shardingsphere shardingsphere-jdbc-core-spring-boot-starter - com.github.yulichang mybatis-plus-join-boot-starter + + org.apache.shardingsphere + shardingsphere-jdbc-core-spring-boot-starter + diff --git a/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/datasource/enums/ShardingTableCacheEnum.java b/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/datasource/enums/ShardingTableCacheEnum.java new file mode 100644 index 00000000..2e5aae13 --- /dev/null +++ b/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/datasource/enums/ShardingTableCacheEnum.java @@ -0,0 +1,62 @@ +package com.win.framework.datasource.enums; + +import java.util.*; + +/** + *

@Title ShardingTableCacheEnum + *

@Description 分片表缓存枚举 + * + * @author liuchen + * @date 2022/12/23 20:17 + */ +public enum ShardingTableCacheEnum { + + /** + * 动态记录表 + */ + TRENDS("infra_trends", new HashSet<>()); + + /** + * 逻辑表名 + */ + private final String logicTableName; + /** + * 实际表名 + */ + private final Set resultTableNamesCache; + + private static Map valueMap = new HashMap<>(); + + static { + Arrays.stream(ShardingTableCacheEnum.values()).forEach(o -> valueMap.put(o.logicTableName, o)); + } + + ShardingTableCacheEnum(String logicTableName, Set resultTableNamesCache) { + this.logicTableName = logicTableName; + this.resultTableNamesCache = resultTableNamesCache; + } + + public static ShardingTableCacheEnum of(String value) { + return valueMap.get(value); + } + + public String logicTableName() { + return logicTableName; + } + + public Set resultTableNamesCache() { + return resultTableNamesCache; + } + + public static Set logicTableNames() { + return valueMap.keySet(); + } + + @Override + public String toString() { + return "ShardingTableCacheEnum{" + + "logicTableName='" + logicTableName + '\'' + + ", resultTableNamesCache=" + resultTableNamesCache + + '}'; + } +} \ No newline at end of file diff --git a/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/datasource/sharding/TimeShardingAlgorithm.java b/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/datasource/sharding/TimeShardingAlgorithm.java new file mode 100644 index 00000000..7699de92 --- /dev/null +++ b/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/datasource/sharding/TimeShardingAlgorithm.java @@ -0,0 +1,144 @@ +package com.win.framework.datasource.sharding; + + +import com.google.common.collect.Range; +import com.win.framework.datasource.enums.ShardingTableCacheEnum; +import com.win.framework.datasource.utils.ShardingAlgorithmTool; +import lombok.extern.slf4j.Slf4j; +import org.apache.shardingsphere.sharding.api.sharding.standard.PreciseShardingValue; +import org.apache.shardingsphere.sharding.api.sharding.standard.RangeShardingValue; +import org.apache.shardingsphere.sharding.api.sharding.standard.StandardShardingAlgorithm; + +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.*; +import java.util.function.Function; + +/** + * 分片算法,按月分片 + */ +@Slf4j +public class TimeShardingAlgorithm implements StandardShardingAlgorithm { + + /** + * 分片时间格式 + */ + private static final DateTimeFormatter TABLE_SHARD_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyyMM"); + + /** + * 完整时间格式 + */ + private static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyyMMdd HH:mm:ss"); + + /** + * 表分片符号,例:t_contract_202201 中,分片符号为 "_" + */ + private final String TABLE_SPLIT_SYMBOL = "_"; + + /** + * 精准分片 + * @param tableNames 对应分片库中所有分片表的集合 + * @param preciseShardingValue 分片键值,其中 logicTableName 为逻辑表,columnName 分片键,value 为从 SQL 中解析出来的分片键的值 + * @return 表名 + */ + @Override + public String doSharding(Collection tableNames, PreciseShardingValue preciseShardingValue) { + String logicTableName = preciseShardingValue.getLogicTableName(); + ShardingTableCacheEnum logicTable = ShardingTableCacheEnum.of(logicTableName); + if (logicTable == null) { + log.error(">>>>>>>>>> 【ERROR】数据表类型错误,请稍后重试,logicTableNames:{},logicTableName:{}", ShardingTableCacheEnum.logicTableNames(), logicTableName); + throw new IllegalArgumentException("数据表类型错误,请稍后重试"); + } + /// 打印分片信息 + log.info(">>>>>>>>>> 【INFO】精确分片,节点配置表名:{},数据库缓存表名:{}", tableNames, logicTable.resultTableNamesCache()); + LocalDateTime dateTime = preciseShardingValue.getValue(); + String resultTableName = logicTableName + "_" + dateTime.format(TABLE_SHARD_TIME_FORMATTER); + // 检查分表获取的表名是否存在,不存在则自动建表 + if (!tableNames.contains(resultTableName)){ + tableNames.add(resultTableName); + } + return ShardingAlgorithmTool.getShardingTableAndCreate(logicTable, resultTableName); + } + + /** + * 范围分片 + * @param tableNames 对应分片库中所有分片表的集合 + * @param rangeShardingValue 分片范围 + * @return 表名集合 + */ + @Override + public Collection doSharding(Collection tableNames, RangeShardingValue rangeShardingValue) { + String logicTableName = rangeShardingValue.getLogicTableName(); + ShardingTableCacheEnum logicTable = ShardingTableCacheEnum.of(logicTableName); + if (logicTable == null) { + log.error(">>>>>>>>>> 【ERROR】逻辑表范围异常,请稍后重试,logicTableNames:{},logicTableName:{}", ShardingTableCacheEnum.logicTableNames(), logicTableName); + throw new IllegalArgumentException("逻辑表范围异常,请稍后重试"); + } + /// 打印分片信息 + log.info(">>>>>>>>>> 【INFO】范围分片,节点配置表名:{},数据库缓存表名:{}", tableNames, logicTable.resultTableNamesCache()); + // between and 的起始值 + Range valueRange = rangeShardingValue.getValueRange(); + boolean hasLowerBound = valueRange.hasLowerBound(); + boolean hasUpperBound = valueRange.hasUpperBound(); + // 获取最大值和最小值 + Set tableNameCache = logicTable.resultTableNamesCache(); + LocalDateTime min = hasLowerBound ? valueRange.lowerEndpoint() :getLowerEndpoint(tableNameCache); + LocalDateTime max = hasUpperBound ? valueRange.upperEndpoint() :getUpperEndpoint(tableNameCache); + // 循环计算分表范围 + Set resultTableNames = new LinkedHashSet<>(); + while (min.isBefore(max) || min.equals(max)) { + String tableName = logicTableName + TABLE_SPLIT_SYMBOL + min.format(TABLE_SHARD_TIME_FORMATTER); + resultTableNames.add(tableName); + min = min.plusMinutes(1); + } + return ShardingAlgorithmTool.getShardingTablesAndCreate(logicTable, resultTableNames); + } + + @Override + public void init() { + + } + + @Override + public String getType() { + return null; + } + + // -------------------------------------------------------------------------------------------------------------- + // 私有方法 + // -------------------------------------------------------------------------------------------------------------- + + /** + * 获取 最小分片值 + * @param tableNames 表名集合 + * @return 最小分片值 + */ + private LocalDateTime getLowerEndpoint(Collection tableNames) { + Optional optional = tableNames.stream() + .map(o -> LocalDateTime.parse(o.replace(TABLE_SPLIT_SYMBOL, "") + "01 00:00:00", DATE_TIME_FORMATTER)) + .min(Comparator.comparing(Function.identity())); + if (optional.isPresent()) { + return optional.get(); + } else { + log.error(">>>>>>>>>> 【ERROR】获取数据最小分表失败,请稍后重试,tableName:{}", tableNames); + throw new IllegalArgumentException("获取数据最小分表失败,请稍后重试"); + } + } + + /** + * 获取 最大分片值 + * @param tableNames 表名集合 + * @return 最大分片值 + */ + private LocalDateTime getUpperEndpoint(Collection tableNames) { + Optional optional = tableNames.stream() + .map(o -> LocalDateTime.parse(o.replace(TABLE_SPLIT_SYMBOL, "") + "01 00:00:00", DATE_TIME_FORMATTER)) + .max(Comparator.comparing(Function.identity())); + if (optional.isPresent()) { + return optional.get(); + } else { + log.error(">>>>>>>>>> 【ERROR】获取数据最大分表失败,请稍后重试,tableName:{}", tableNames); + throw new IllegalArgumentException("获取数据最大分表失败,请稍后重试"); + } + } +} \ No newline at end of file diff --git a/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/datasource/utils/ShardingAlgorithmTool.java b/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/datasource/utils/ShardingAlgorithmTool.java new file mode 100644 index 00000000..5f1ad6de --- /dev/null +++ b/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/datasource/utils/ShardingAlgorithmTool.java @@ -0,0 +1,247 @@ +package com.win.framework.datasource.utils; + +import cn.hutool.extra.spring.SpringUtil; +import com.win.framework.datasource.enums.ShardingTableCacheEnum; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.apache.shardingsphere.driver.jdbc.core.datasource.ShardingSphereDataSource; +import org.apache.shardingsphere.infra.config.RuleConfiguration; +import org.apache.shardingsphere.mode.manager.ContextManager; +import org.apache.shardingsphere.sharding.algorithm.config.AlgorithmProvidedShardingRuleConfiguration; +import org.apache.shardingsphere.sharding.api.config.rule.ShardingTableRuleConfiguration; +import org.springframework.core.env.Environment; + +import java.sql.*; +import java.time.YearMonth; +import java.time.format.DateTimeFormatter; +import java.util.*; +import java.util.stream.Collectors; + +/** + *

@Title ShardingAlgorithmTool + *

@Description 按月分片算法工具 + * + * @author liuchen + * @date 2022/12/20 14:03 + */ +@Slf4j +public class ShardingAlgorithmTool { + + /** 表分片符号,例:t_user_202201 中,分片符号为 "_" */ + private static final String TABLE_SPLIT_SYMBOL = "_"; + + /** 数据库配置 */ + private static final Environment ENV = SpringUtil.getApplicationContext().getEnvironment(); + private static final String DATASOURCE_URL = ENV.getProperty("spring.shardingsphere.datasource.master.url"); + private static final String DATASOURCE_USERNAME = ENV.getProperty("spring.shardingsphere.datasource.master.username"); + private static final String DATASOURCE_PASSWORD = ENV.getProperty("spring.shardingsphere.datasource.master.password"); + + + /** + * 检查分表获取的表名是否存在,不存在则自动建表 + * @param logicTable 逻辑表 + * @param resultTableNames 真实表名,例:t_user_202201 + * @return 存在于数据库中的真实表名集合 + */ + public static Set getShardingTablesAndCreate(ShardingTableCacheEnum logicTable, Collection resultTableNames) { + return resultTableNames.stream().map(o -> getShardingTableAndCreate(logicTable, o)).collect(Collectors.toSet()); + } + + /** + * 检查分表获取的表名是否存在,不存在则自动建表 + * @param logicTable 逻辑表 + * @param resultTableName 真实表名,例:t_user_202201 + * @return 确认存在于数据库中的真实表名 + */ + public static String getShardingTableAndCreate(ShardingTableCacheEnum logicTable, String resultTableName) { + // 缓存中有此表则返回,没有则判断创建 + if (logicTable.resultTableNamesCache().contains(resultTableName)) { + return resultTableName; + } else { + // 未创建的表返回逻辑空表 + boolean isSuccess = createShardingTable(logicTable, resultTableName); + return isSuccess ? resultTableName : logicTable.logicTableName(); + } + } + + /** + * 重载全部缓存 + */ + public static void tableNameCacheReloadAll() { + Arrays.stream(ShardingTableCacheEnum.values()).forEach(ShardingAlgorithmTool::tableNameCacheReload); + } + + /** + * 重载指定分表缓存 + * @param logicTable 逻辑表,例:t_user + */ + public static void tableNameCacheReload(ShardingTableCacheEnum logicTable) { + // 读取数据库中|所有表名 + List tableNameList = getAllTableNameBySchema(logicTable); + // 动态更新配置 actualDataNodes(先更新后删除缓存,防止数据不一致) + actualDataNodesRefresh(logicTable.logicTableName(), new HashSet<>(tableNameList)); + // 删除旧的缓存(如果存在) + logicTable.resultTableNamesCache().clear(); + // 写入新的缓存 + logicTable.resultTableNamesCache().addAll(tableNameList); + } + + /** + * 获取所有表名 + * @return 表名集合 + * @param logicTable 逻辑表 + */ + public static List getAllTableNameBySchema(ShardingTableCacheEnum logicTable) { + List tableNames = new ArrayList<>(); + if (StringUtils.isEmpty(DATASOURCE_URL) || StringUtils.isEmpty(DATASOURCE_USERNAME) || StringUtils.isEmpty(DATASOURCE_PASSWORD)) { + log.error(">>>>>>>>>> 【ERROR】数据库连接配置有误,请稍后重试,URL:{}, username:{}, password:{}", DATASOURCE_URL, DATASOURCE_USERNAME, DATASOURCE_PASSWORD); + throw new IllegalArgumentException("数据库连接配置有误,请稍后重试"); + } + try (Connection conn = DriverManager.getConnection(DATASOURCE_URL, DATASOURCE_USERNAME, DATASOURCE_PASSWORD); + Statement st = conn.createStatement()) { + String logicTableName = logicTable.logicTableName(); + try (ResultSet rs = st.executeQuery("show TABLES like '" + logicTableName + TABLE_SPLIT_SYMBOL + "%'")) { + while (rs.next()) { + String tableName = rs.getString(1); + // 匹配分表格式 例:^(t\_contract_\d{6})$ + if (tableName != null && tableName.matches(String.format("^(%s\\d{6})$", logicTableName + TABLE_SPLIT_SYMBOL))) { + tableNames.add(rs.getString(1)); + } + } + } + } catch (SQLException e) { + log.error(">>>>>>>>>> 【ERROR】数据库连接失败,请稍后重试,原因:{}", e.getMessage(), e); + throw new IllegalArgumentException("数据库连接失败,请稍后重试"); + } + return tableNames; + } + + /** + * 动态更新配置 actualDataNodes + * + * @param logicTableName 逻辑表名 + * @param tableNamesCache 真实表名集合 + */ + public static void actualDataNodesRefresh(String logicTableName, Set tableNamesCache) { + try { + // 获取数据分片节点 + String dbName = "master"; + log.info(">>>>>>>>>> 【INFO】更新分表配置,logicTableName:{},tableNamesCache:{}", logicTableName, tableNamesCache); + + // generate actualDataNodes + String newActualDataNodes = tableNamesCache.stream().map(o -> String.format("%s.%s", dbName, o)).collect(Collectors.joining(",")); + ShardingSphereDataSource shardingSphereDataSource = SpringUtil.getBean(ShardingSphereDataSource.class); + updateShardRuleActualDataNodes(shardingSphereDataSource, logicTableName, newActualDataNodes); + }catch (Exception e){ + log.error("初始化 动态表单失败,原因:{}", e.getMessage(), e); + } + } + + + // -------------------------------------------------------------------------------------------------------------- + // 私有方法 + // -------------------------------------------------------------------------------------------------------------- + + + /** + * 刷新ActualDataNodes + */ + private static void updateShardRuleActualDataNodes(ShardingSphereDataSource dataSource, String logicTableName, String newActualDataNodes) { + // Context manager. + ContextManager contextManager = dataSource.getContextManager(); + // Rule configuration. + String schemaName = "logic_db"; + Collection newRuleConfigList = new LinkedList<>(); + Collection oldRuleConfigList = dataSource.getContextManager() + .getMetaDataContexts() + .getMetaData(schemaName) + .getRuleMetaData() + .getConfigurations(); + for (RuleConfiguration oldRuleConfig : oldRuleConfigList) { + if (oldRuleConfig instanceof AlgorithmProvidedShardingRuleConfiguration) { + // Algorithm provided sharding rule configuration + AlgorithmProvidedShardingRuleConfiguration oldAlgorithmConfig = (AlgorithmProvidedShardingRuleConfiguration) oldRuleConfig; + AlgorithmProvidedShardingRuleConfiguration newAlgorithmConfig = new AlgorithmProvidedShardingRuleConfiguration(); + // Sharding table rule configuration Collection + Collection newTableRuleConfigList = new LinkedList<>(); + Collection oldTableRuleConfigList = oldAlgorithmConfig.getTables(); + oldTableRuleConfigList.forEach(oldTableRuleConfig -> { + if (logicTableName.equals(oldTableRuleConfig.getLogicTable())) { + ShardingTableRuleConfiguration newTableRuleConfig = new ShardingTableRuleConfiguration(oldTableRuleConfig.getLogicTable(), newActualDataNodes); + newTableRuleConfig.setTableShardingStrategy(oldTableRuleConfig.getTableShardingStrategy()); + newTableRuleConfig.setDatabaseShardingStrategy(oldTableRuleConfig.getDatabaseShardingStrategy()); + newTableRuleConfig.setKeyGenerateStrategy(oldTableRuleConfig.getKeyGenerateStrategy()); + newTableRuleConfigList.add(newTableRuleConfig); + } else { + newTableRuleConfigList.add(oldTableRuleConfig); + } + }); + newAlgorithmConfig.setTables(newTableRuleConfigList); + newAlgorithmConfig.setAutoTables(oldAlgorithmConfig.getAutoTables()); + newAlgorithmConfig.setBindingTableGroups(oldAlgorithmConfig.getBindingTableGroups()); + newAlgorithmConfig.setBroadcastTables(oldAlgorithmConfig.getBroadcastTables()); + newAlgorithmConfig.setDefaultDatabaseShardingStrategy(oldAlgorithmConfig.getDefaultDatabaseShardingStrategy()); + newAlgorithmConfig.setDefaultTableShardingStrategy(oldAlgorithmConfig.getDefaultTableShardingStrategy()); + newAlgorithmConfig.setDefaultKeyGenerateStrategy(oldAlgorithmConfig.getDefaultKeyGenerateStrategy()); + newAlgorithmConfig.setDefaultShardingColumn(oldAlgorithmConfig.getDefaultShardingColumn()); + newAlgorithmConfig.setShardingAlgorithms(oldAlgorithmConfig.getShardingAlgorithms()); + newAlgorithmConfig.setKeyGenerators(oldAlgorithmConfig.getKeyGenerators()); + newRuleConfigList.add(newAlgorithmConfig); + } + } + // update context + contextManager.alterRuleConfiguration(schemaName, newRuleConfigList); + } + + /** + * 创建分表 + * @param logicTable 逻辑表 + * @param resultTableName 真实表名,例:t_user_202201 + * @return 创建结果(true创建成功,false未创建) + */ + private static boolean createShardingTable(ShardingTableCacheEnum logicTable, String resultTableName) { + // 根据日期判断,当前月份之后分表不提前创建 + String month = resultTableName.replace(logicTable.logicTableName() + TABLE_SPLIT_SYMBOL,""); + YearMonth shardingMonth = YearMonth.parse(month, DateTimeFormatter.ofPattern("yyyyMM")); + if (shardingMonth.isAfter(YearMonth.now())) { + return false; + } + synchronized (logicTable.logicTableName().intern()) { + // 缓存中有此表 返回 + if (logicTable.resultTableNamesCache().contains(resultTableName)) { + return false; + } + // 缓存中无此表,则建表并添加缓存 + executeSql(Collections.singletonList("CREATE TABLE IF NOT EXISTS `" + resultTableName + "` LIKE `" + logicTable.logicTableName() + "`;")); + // 缓存重载 + tableNameCacheReload(logicTable); + } + return true; + } + + /** + * 执行SQL + * @param sqlList SQL集合 + */ + private static void executeSql(List sqlList) { + if (StringUtils.isEmpty(DATASOURCE_URL) || StringUtils.isEmpty(DATASOURCE_USERNAME) || StringUtils.isEmpty(DATASOURCE_PASSWORD)) { + log.error(">>>>>>>>>> 【ERROR】数据库连接配置有误,请稍后重试,URL:{}, username:{}, password:{}", DATASOURCE_URL, DATASOURCE_USERNAME, DATASOURCE_PASSWORD); + throw new IllegalArgumentException("数据库连接配置有误,请稍后重试"); + } + try (Connection conn = DriverManager.getConnection(DATASOURCE_URL, DATASOURCE_USERNAME, DATASOURCE_PASSWORD)) { + try (Statement st = conn.createStatement()) { + conn.setAutoCommit(false); + for (String sql : sqlList) { + st.execute(sql); + } + } catch (Exception e) { + conn.rollback(); + log.error(">>>>>>>>>> 【ERROR】数据表创建执行失败,请稍后重试,原因:{}", e.getMessage(), e); + throw new IllegalArgumentException("数据表创建执行失败,请稍后重试"); + } + } catch (SQLException e) { + log.error(">>>>>>>>>> 【ERROR】数据库连接失败,请稍后重试,原因:{}", e.getMessage(), e); + throw new IllegalArgumentException("数据库连接失败,请稍后重试"); + } + } +} diff --git a/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/datasource/utils/ShardingTablesLoadRunner.java b/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/datasource/utils/ShardingTablesLoadRunner.java new file mode 100644 index 00000000..2b277c6c --- /dev/null +++ b/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/datasource/utils/ShardingTablesLoadRunner.java @@ -0,0 +1,24 @@ +package com.win.framework.datasource.utils; + +import org.springframework.boot.CommandLineRunner; +import org.springframework.core.annotation.Order; +import org.springframework.stereotype.Component; + +/** + *

@Title ShardingTablesLoadRunner + *

@Description 项目启动后,读取已有分表,进行缓存 + * + * @author liuchen + * @date 2022/12/20 15:41 + */ +@Order(value = 1) // 数字越小,越先执行 +@Component +public class ShardingTablesLoadRunner implements CommandLineRunner { + + @Override + public void run(String... args) { + // 读取已有分表,进行缓存 + ShardingAlgorithmTool.tableNameCacheReloadAll(); + } + +} \ No newline at end of file diff --git a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/package-info.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/package-info.java deleted file mode 100644 index 70386fcc..00000000 --- a/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/package-info.java +++ /dev/null @@ -1,9 +0,0 @@ -/** - * infra 模块,主要提供两块能力: - * 1. 我们放基础设施的运维与管理,支撑上层的通用与核心业务。 例如说:定时任务的管理、服务器的信息等等 - * 2. 研发工具,提升研发效率与质量。 例如说:代码生成器、接口文档等等 - * - * 1. Controller URL:以 /infra/ 开头,避免和其它 Module 冲突 - * 2. DataObject 表名:以 infra_ 开头,方便在数据库中区分 - */ -package com.win.module.infra; diff --git a/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/service/supplier/SupplierServiceImpl.java b/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/service/supplier/SupplierServiceImpl.java index 4b43c67c..e9c1bcd9 100644 --- a/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/service/supplier/SupplierServiceImpl.java +++ b/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/service/supplier/SupplierServiceImpl.java @@ -7,9 +7,11 @@ import com.google.common.annotations.VisibleForTesting; import com.win.framework.common.exception.ServiceException; import com.win.framework.common.pojo.PageResult; import com.win.framework.datapermission.core.util.DataPermissionUtils; +import com.win.framework.security.core.util.SecurityFrameworkUtils; +import com.win.module.infra.api.trends.TrendsApi; +import com.win.module.infra.api.trends.dto.TrendsCreateReqDTO; import com.win.module.wms.controller.supplier.vo.*; import com.win.module.wms.convert.supplier.SupplierConvert; -import com.win.module.wms.dal.dataobject.itembasic.ItembasicDO; import com.win.module.wms.dal.dataobject.supplier.SupplierDO; import com.win.module.wms.dal.mysql.supplier.SupplierMapper; import org.springframework.stereotype.Service; @@ -36,6 +38,9 @@ public class SupplierServiceImpl implements SupplierService { @Resource private SupplierMapper supplierMapper; + @Resource + private TrendsApi trendsApi; + @Override public Long createSupplier(SupplierCreateReqVO createReqVO) { validateSupplierForCreateOrUpdate(createReqVO.getId(),createReqVO.getCode(),createReqVO.getShortName(),createReqVO.getAvailable()); @@ -52,6 +57,13 @@ public class SupplierServiceImpl implements SupplierService { validateSupplierForCreateOrUpdate(updateReqVO.getId(),updateReqVO.getCode(),updateReqVO.getShortName(),updateReqVO.getAvailable()); // 更新 SupplierDO updateObj = SupplierConvert.INSTANCE.convert(updateReqVO); + TrendsCreateReqDTO dto = new TrendsCreateReqDTO(); + dto.setTableName("basicItembasic"); + dto.setTableId(updateObj.getId()); + dto.setType(2); + dto.setContent("更新basic_itembasic表数据"); + dto.setCreator(String.valueOf(SecurityFrameworkUtils.getLoginUserId())); + trendsApi.createTrends(dto); supplierMapper.updateById(updateObj); } diff --git a/win-server/src/main/resources/application-dev.yaml b/win-server/src/main/resources/application-dev.yaml index 98d56264..00fa12a1 100644 --- a/win-server/src/main/resources/application-dev.yaml +++ b/win-server/src/main/resources/application-dev.yaml @@ -52,6 +52,31 @@ spring: load-balancers: alg_round: type: ROUND_ROBIN + sharding: + # 表策略配置 + tables: + # t_user 是逻辑表 + infra_trends: + # 配置数据节点,这里是按月分表 + actualDataNodes: master.infra_trends_$->{2023..2030}${(1..12).collect{t->t.toString().padLeft(2,'0')}} + tableStrategy: + # 使用标准分片策略 + standard: + # 配置分片字段 + shardingColumn: create_time + # 分片算法名称,不支持大写字母和下划线,否则启动就会报错 + shardingAlgorithmName: time-sharding-altorithm + # 分片算法配置 + shardingAlgorithms: + # 分片算法名称,不支持大写字母和下划线,否则启动就会报错 + time-sharding-altorithm: + # 类型:自定义策略 + type: CLASS_BASED + props: + # 分片策略 + strategy: standard + # 分片算法类 + algorithmClassName: com.win.framework.datasource.sharding.TimeShardingAlgorithm # 不创建此数据源,用于生成代码 datasource: dynamic: