From 5ec7aadef9d8b7e0423bd692bd9439b4649b151c Mon Sep 17 00:00:00 2001 From: ZhangAo Date: Tue, 28 Jul 2026 17:30:27 +0800 Subject: [PATCH] 20260728173026 --- .../migrations/006_add_i18n_module_id.sql | 70 ++++++++ .../java/cn/g3soft/fmsapi/utils/DbUtils.java | 21 ++- .../fmsapi/utils/DbUtils$ColumnMetadata.class | Bin 2268 -> 2268 bytes .../fmsapi/utils/DbUtils$PageResult.class | Bin 2267 -> 2267 bytes .../fmsapi/utils/DbUtils$TableMetadata.class | Bin 2434 -> 2434 bytes .../cn/g3soft/fmsapi/utils/DbUtils.class | Bin 28048 -> 28492 bytes code/fms/fms-vue/src/components/FmsTree.vue | 59 ++++++- .../fms-module-list/FmsModuleTable.vue | 47 +---- .../fms-module-list/FmsQueryControl.vue | 23 +-- .../fms-module-list/FmsQueryToolbar.vue | 56 +----- .../fms-module-list/moduleListUtils.js | 105 +++++++++++ .../fms-module-list/useModuleList.js | 106 ++--------- .../src/components/fms-table/FmsTable.vue | 2 +- .../src/layouts/components/AppSidebar.vue | 9 +- code/fms/fms-vue/src/router/index.js | 7 +- code/fms/fms-vue/src/router/routes.js | 6 +- code/fms/fms-vue/src/stores/permissions.js | 19 +- code/fms/fms-vue/src/utils/i18n.js | 67 +++++++ code/fms/fms-vue/src/utils/tree.js | 56 ++++++ .../components/FieldGroupManager.vue | 36 +--- .../components/I18nQuickSetModal.vue | 6 +- .../components/ModuleI18nPanel.vue | 96 +++++++--- .../components/ModuleQueryConfigPanel.vue | 1 + .../src/views/module-management/index.vue | 167 +++++------------- code/fms/开发规范.md | 130 +++++++++----- 25 files changed, 627 insertions(+), 462 deletions(-) create mode 100644 code/fms/fms-api/config/migrations/006_add_i18n_module_id.sql create mode 100644 code/fms/fms-vue/src/components/fms-module-list/moduleListUtils.js create mode 100644 code/fms/fms-vue/src/utils/tree.js 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 3c88b1da5cd865c8c361726afb81255aa54aa533..677260a3e97468b257935dfa1d98384472722ae1 100644 GIT binary patch delta 87 zcmca3ct>!~=c$`%MD7qW{^wqaL?vMQl08z}!XT*iO{ LqDFXfHb)@Wax delta 87 zcmca3ct>!~=c$`%MD7qW{^wqaL?vMQl08z}!XT*iO{ LqDFXfHb)@wa+f#i8MJ1{9aS(#l6$ns+k1dwa+f#i8MJ1{9aS(#l6$ns+k1djzA!JkVACxOb&H0%LYsePZs1X1OPX! B6N>-< delta 57 zcmZn?ZW7+0!Ol2mvL<^cklf5}2P8kS+XG1>jzA!JkVACxOb&H0%LYsePZs1X1OO;1 B69xbP 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 96dcb87107d845382011c7650891d523aa207a1f..528f08de4d6b99163ecd43b67bdc9e8cc42b8e63 100644 GIT binary patch delta 7737 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 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 @@