diff --git a/code/fms/fms-api/config/migrations/006_add_i18n_module_id.sql b/code/fms/fms-api/config/migrations/006_add_i18n_module_id.sql new file mode 100644 index 00000000..c6c9e889 --- /dev/null +++ b/code/fms/fms-api/config/migrations/006_add_i18n_module_id.sql @@ -0,0 +1,70 @@ +/* + 为 dbo.b_i18n 增加 b_module_id 列,使多语言数据可按模块级联删除, + 解决「删除模块后 b_i18n 残留孤儿数据」的问题。 + + 本脚本可重复执行: + - 列不存在时才添加,并建索引; + - 对存量数据做一次基于键命名约定的回填(module./menu./field./power. 前缀, + 取第二段作为模块编码关联 s_module.b_code),已回填或无法匹配的行不受影响。 +*/ +SET NOCOUNT ON; + +-- 第 1 批:DDL(列与索引) +BEGIN TRANSACTION; + + IF NOT EXISTS ( + SELECT 1 FROM sys.columns + WHERE object_id = OBJECT_ID(N'dbo.b_i18n') AND name = N'b_module_id' + ) + BEGIN + ALTER TABLE dbo.b_i18n + ADD b_module_id bigint NULL; + + CREATE INDEX IX_b_i18n_module_id ON dbo.b_i18n (b_module_id) + INCLUDE (b_key, b_locale, b_value); + END + +COMMIT TRANSACTION; +GO + +-- 第 2 批:存量回填(依赖第 1 批列已存在,因此必须 GO 分隔) +SET NOCOUNT ON; + +BEGIN TRANSACTION; + + -- 键形如 module. / menu. / field.. / power.., + -- 模块编码恒为第二个以 "." 分隔的片段。 + UPDATE i + SET b_module_id = m.b_id + FROM dbo.b_i18n i + CROSS APPLY ( + SELECT + CASE + WHEN CHARINDEX(N'.', i.b_key) > 0 THEN + SUBSTRING( + i.b_key, + CHARINDEX(N'.', i.b_key) + 1, + CASE + WHEN CHARINDEX(N'.', i.b_key, CHARINDEX(N'.', i.b_key) + 1) > 0 + THEN CHARINDEX(N'.', i.b_key, CHARINDEX(N'.', i.b_key) + 1) + - CHARINDEX(N'.', i.b_key) - 1 + ELSE LEN(i.b_key) - CHARINDEX(N'.', i.b_key) + END + ) + ELSE NULL + END AS code + ) c + CROSS APPLY ( + SELECT TOP (1) sm.b_id + FROM dbo.s_module sm + WHERE sm.b_code = c.code + ) m + WHERE i.b_module_id IS NULL + AND ( + i.b_key LIKE N'module.%' + OR i.b_key LIKE N'menu.%' + OR i.b_key LIKE N'field.%' + OR i.b_key LIKE N'power.%' + ); + +COMMIT TRANSACTION; diff --git a/code/fms/fms-api/src/main/java/cn/g3soft/fmsapi/utils/DbUtils.java b/code/fms/fms-api/src/main/java/cn/g3soft/fmsapi/utils/DbUtils.java index 9e1595f0..c208a58e 100644 --- a/code/fms/fms-api/src/main/java/cn/g3soft/fmsapi/utils/DbUtils.java +++ b/code/fms/fms-api/src/main/java/cn/g3soft/fmsapi/utils/DbUtils.java @@ -532,7 +532,26 @@ public class DbUtils { } private String buildOrderBy(String orderBy) { - String[] parts = orderBy.trim().split("\\s+"); + String trimmed = orderBy.trim(); + String lower = trimmed.toLowerCase(); + + // CASE 表达式:从末尾剥离可选 ASC/DESC,其余直接返回 + if (lower.startsWith("case")) { + String direction = ""; + if (lower.endsWith(" asc")) { + direction = " ASC"; + trimmed = trimmed.substring(0, trimmed.length() - 4); + } else if (lower.endsWith(" desc")) { + direction = " DESC"; + trimmed = trimmed.substring(0, trimmed.length() - 5); + } + if (!trimmed.trim().toLowerCase().endsWith("end")) { + throw new BusinessException("CASE 表达式必须以 END 结尾"); + } + return trimmed + direction; + } + + String[] parts = trimmed.split("\\s+"); if (parts.length > 2) { throw new BusinessException("排序字段格式不正确"); } diff --git a/code/fms/fms-api/target/classes/cn/g3soft/fmsapi/utils/DbUtils$ColumnMetadata.class b/code/fms/fms-api/target/classes/cn/g3soft/fmsapi/utils/DbUtils$ColumnMetadata.class index 3c88b1da..677260a3 100644 Binary files a/code/fms/fms-api/target/classes/cn/g3soft/fmsapi/utils/DbUtils$ColumnMetadata.class and b/code/fms/fms-api/target/classes/cn/g3soft/fmsapi/utils/DbUtils$ColumnMetadata.class differ diff --git a/code/fms/fms-api/target/classes/cn/g3soft/fmsapi/utils/DbUtils$PageResult.class b/code/fms/fms-api/target/classes/cn/g3soft/fmsapi/utils/DbUtils$PageResult.class index b646a163..64badc2a 100644 Binary files a/code/fms/fms-api/target/classes/cn/g3soft/fmsapi/utils/DbUtils$PageResult.class and b/code/fms/fms-api/target/classes/cn/g3soft/fmsapi/utils/DbUtils$PageResult.class differ diff --git a/code/fms/fms-api/target/classes/cn/g3soft/fmsapi/utils/DbUtils$TableMetadata.class b/code/fms/fms-api/target/classes/cn/g3soft/fmsapi/utils/DbUtils$TableMetadata.class index e6b9e9c5..d7ef3fe1 100644 Binary files a/code/fms/fms-api/target/classes/cn/g3soft/fmsapi/utils/DbUtils$TableMetadata.class and b/code/fms/fms-api/target/classes/cn/g3soft/fmsapi/utils/DbUtils$TableMetadata.class differ diff --git a/code/fms/fms-api/target/classes/cn/g3soft/fmsapi/utils/DbUtils.class b/code/fms/fms-api/target/classes/cn/g3soft/fmsapi/utils/DbUtils.class index 96dcb871..528f08de 100644 Binary files a/code/fms/fms-api/target/classes/cn/g3soft/fmsapi/utils/DbUtils.class and b/code/fms/fms-api/target/classes/cn/g3soft/fmsapi/utils/DbUtils.class differ diff --git a/code/fms/fms-vue/src/components/FmsTree.vue b/code/fms/fms-vue/src/components/FmsTree.vue index 1d011a61..ea3ebac4 100644 --- a/code/fms/fms-vue/src/components/FmsTree.vue +++ b/code/fms/fms-vue/src/components/FmsTree.vue @@ -1,16 +1,71 @@ + + diff --git a/code/fms/fms-vue/src/components/fms-module-list/FmsModuleTable.vue b/code/fms/fms-vue/src/components/fms-module-list/FmsModuleTable.vue index df80dff4..32cb9267 100644 --- a/code/fms/fms-vue/src/components/fms-module-list/FmsModuleTable.vue +++ b/code/fms/fms-vue/src/components/fms-module-list/FmsModuleTable.vue @@ -1,6 +1,7 @@