From 2632a57d735fe8d79416c33a0aeb893744822da4 Mon Sep 17 00:00:00 2001 From: zgw <13623675548@163.com> Date: Tue, 15 Sep 2026 17:38:35 +0800 Subject: [PATCH] fix: make ERP exception menu SQL Server 2016 safe --- .../shadow/ShadowV3OperationsPackageTest.java | 17 ++++++++++++ sql/upgrade-erp-push-exception-menu.sql | 27 +++++++++++-------- 2 files changed, 33 insertions(+), 11 deletions(-) diff --git a/ruoyi-admin/src/test/java/com/ruoyi/algorithm/shadow/ShadowV3OperationsPackageTest.java b/ruoyi-admin/src/test/java/com/ruoyi/algorithm/shadow/ShadowV3OperationsPackageTest.java index f647de1..f75760d 100644 --- a/ruoyi-admin/src/test/java/com/ruoyi/algorithm/shadow/ShadowV3OperationsPackageTest.java +++ b/ruoyi-admin/src/test/java/com/ruoyi/algorithm/shadow/ShadowV3OperationsPackageTest.java @@ -31,6 +31,23 @@ class ShadowV3OperationsPackageTest { .isRegularFile(); } + @Test + void erpPushExceptionMenuUsesIdentityGeneratedKeys() throws IOException { + String script = text("sql/upgrade-erp-push-exception-menu.sql"); + + assertThat(script).contains("SCOPE_IDENTITY()"); + assertThat(script).doesNotContain("MAX(menu_id)", "(menu_id, menu_name"); + } + + @Test + void erpPushExceptionMenuIsAsciiSafeForSqlcmd13() throws IOException { + byte[] script = Files.readAllBytes(root.resolve("sql/upgrade-erp-push-exception-menu.sql")); + + for (byte value : script) { + assertThat(value & 0x80).as("SQL script byte must be ASCII").isZero(); + } + } + @Test void preflightIsReadOnlyAndChecksExactSourceAndSingleProcess() throws IOException { String script = text("scripts/shadow-v3-preflight.cmd"); diff --git a/sql/upgrade-erp-push-exception-menu.sql b/sql/upgrade-erp-push-exception-menu.sql index 0506ef2..49e4516 100644 --- a/sql/upgrade-erp-push-exception-menu.sql +++ b/sql/upgrade-erp-push-exception-menu.sql @@ -7,6 +7,11 @@ DECLARE @menu_id bigint; DECLARE @retry_id bigint; DECLARE @source_menu_id bigint; DECLARE @lock_result int; +DECLARE @lock_error nvarchar(2048) = CONVERT(nvarchar(2048), 0xE065D56CB783D65320004500520050002000A8630190025F385EDC8355534753A77E0195); +DECLARE @menu_name nvarchar(255) = CONVERT(nvarchar(255), 0x450052005000A8630190025F385E); +DECLARE @menu_remark nvarchar(500) = CONVERT(nvarchar(500), 0x450052005000DE56204F3159258D17526888); +DECLARE @retry_name nvarchar(255) = CONVERT(nvarchar(255), 0x450052005000025F385ECD91A863); +DECLARE @retry_remark nvarchar(500) = CONVERT(nvarchar(500), 0x3159258D55536E63CD91B065A0526551450052005000DE56204F1F961752); EXEC @lock_result = sys.sp_getapplock @Resource = N'FT546WMS:upgrade-erp-push-exception-menu', @@ -17,7 +22,7 @@ EXEC @lock_result = sys.sp_getapplock IF @lock_result < 0 BEGIN ROLLBACK TRANSACTION; - THROW 51000, N'无法获取 ERP 推送异常菜单升级锁', 1; + THROW 51000, @lock_error, 1; END; SELECT TOP (1) @menu_id = menu_id @@ -27,16 +32,16 @@ ORDER BY menu_id; IF @menu_id IS NULL BEGIN - SELECT @menu_id = ISNULL(MAX(menu_id), 0) + 1 FROM dbo.sys_menu WITH (UPDLOCK, HOLDLOCK); - INSERT INTO dbo.sys_menu - (menu_id, menu_name, parent_id, order_num, path, component, query, route_name, + (menu_name, parent_id, order_num, path, component, query, route_name, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark) VALUES - (@menu_id, N'ERP推送异常', 2, 2, N'pushException', N'erp/pushException/index', NULL, N'', + (@menu_name, 2, 2, N'pushException', N'erp/pushException/index', NULL, N'', N'1', N'0', N'C', N'0', N'0', N'erp:pushException:list', N'warning', - N'admin', SYSDATETIME(), N'', NULL, N'ERP回传失败列表'); + N'admin', SYSDATETIME(), N'', NULL, @menu_remark); + + SET @menu_id = CONVERT(bigint, SCOPE_IDENTITY()); END; SELECT TOP (1) @retry_id = menu_id @@ -46,16 +51,16 @@ ORDER BY menu_id; IF @retry_id IS NULL BEGIN - SELECT @retry_id = ISNULL(MAX(menu_id), 0) + 1 FROM dbo.sys_menu WITH (UPDLOCK, HOLDLOCK); - INSERT INTO dbo.sys_menu - (menu_id, menu_name, parent_id, order_num, path, component, query, route_name, + (menu_name, parent_id, order_num, path, component, query, route_name, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark) VALUES - (@retry_id, N'ERP异常重推', @menu_id, 1, N'#', N'', NULL, N'', + (@retry_name, @menu_id, 1, N'#', N'', NULL, N'', N'1', N'0', N'F', N'0', N'0', N'erp:pushException:retry', N'#', - N'admin', SYSDATETIME(), N'', NULL, N'失败单据重新加入ERP回传队列'); + N'admin', SYSDATETIME(), N'', NULL, @retry_remark); + + SET @retry_id = CONVERT(bigint, SCOPE_IDENTITY()); END; SELECT TOP (1) @source_menu_id = menu_id