From 55060c7cbe2d78275299a5361ed22e787ea46bfc Mon Sep 17 00:00:00 2001 From: ouyangxq <775153912@qq.com> Date: Mon, 10 Aug 2026 13:54:28 +0800 Subject: [PATCH] fix(sql): use mysql8 compatible PDA migrations --- deploy/sql/头程数据库统一增量-MySQL8.sql | 62 ++++++++++++++++--- .../Phase3FinalUnifiedSqlContractTest.java | 11 ++++ 2 files changed, 63 insertions(+), 10 deletions(-) diff --git a/deploy/sql/头程数据库统一增量-MySQL8.sql b/deploy/sql/头程数据库统一增量-MySQL8.sql index e12f34fa8..85e98a88e 100644 --- a/deploy/sql/头程数据库统一增量-MySQL8.sql +++ b/deploy/sql/头程数据库统一增量-MySQL8.sql @@ -8856,9 +8856,38 @@ DROP PROCEDURE IF EXISTS assert_phase3_final_schema; -- PDA 部分拣货释放策略:NULL/AUTO 按比例释放,MANUAL + [] 表示人工明确不释放。 USE baiyue_firstleg; -ALTER TABLE fl_loading_pick_item - ADD COLUMN IF NOT EXISTS release_mode VARCHAR(10) NULL COMMENT 'AUTO按比例释放,MANUAL按人工选择释放' AFTER item_status, - ADD COLUMN IF NOT EXISTS release_location_ids JSON NULL COMMENT '人工选择释放库位ID;空数组表示明确释放0个' AFTER release_mode; +DROP PROCEDURE IF EXISTS phase3_pda_add_column; +DELIMITER $$ +CREATE PROCEDURE phase3_pda_add_column( + IN p_table_name VARCHAR(64), IN p_column_name VARCHAR(64), IN p_definition TEXT +) +BEGIN + IF NOT EXISTS ( + SELECT 1 FROM information_schema.columns + WHERE table_schema = DATABASE() AND table_name = p_table_name AND column_name = p_column_name + ) THEN + SET @phase3_pda_column_ddl = CONCAT( + 'ALTER TABLE `', p_table_name, '` ADD COLUMN `', p_column_name, '` ', p_definition + ); + PREPARE phase3_pda_column_stmt FROM @phase3_pda_column_ddl; + EXECUTE phase3_pda_column_stmt; + DEALLOCATE PREPARE phase3_pda_column_stmt; + END IF; +END$$ +DELIMITER ; +CALL phase3_pda_add_column( + 'fl_loading_pick_item', 'release_mode', + "VARCHAR(10) NULL COMMENT 'AUTO按比例释放,MANUAL按人工选择释放' AFTER item_status" +); +CALL phase3_pda_add_column( + 'fl_loading_pick_item', 'release_location_ids', + "JSON NULL COMMENT '人工选择释放库位ID;空数组表示明确释放0个' AFTER release_mode" +); +CALL phase3_pda_add_column( + 'fl_inbound_pallet_allocation', 'reservation_id', + "BIGINT UNSIGNED NULL COMMENT '仓库预占资源唯一ID,A0共享场景用于区分托盘' AFTER location_code" +); +DROP PROCEDURE IF EXISTS phase3_pda_add_column; -- PDA 多人协作:领取粒度由整柜任务下沉为单条拣货明细。 CREATE TABLE IF NOT EXISTS fl_loading_pick_item_assignment ( pick_item_id BIGINT UNSIGNED NOT NULL, @@ -8876,10 +8905,26 @@ CREATE TABLE IF NOT EXISTS fl_loading_pick_item_assignment ( CONSTRAINT chk_loading_pick_item_assignment_type CHECK (assignment_type IN ('CLAIMED', 'ASSIGNED')) ) ENGINE=InnoDB COMMENT='PDA拣货明细领取与作业员分配'; -ALTER TABLE fl_loading_pick_operation - DROP CHECK IF EXISTS chk_loading_pick_operation_action, - ADD CONSTRAINT chk_loading_pick_operation_action - CHECK (action_type IN ('CLAIM', 'ASSIGN', 'ITEM_CLAIM', 'ITEM_ASSIGN', 'REVIEW')); +DROP PROCEDURE IF EXISTS phase3_pda_replace_operation_check; +DELIMITER $$ +CREATE PROCEDURE phase3_pda_replace_operation_check() +BEGIN + IF EXISTS ( + SELECT 1 FROM information_schema.table_constraints + WHERE constraint_schema = DATABASE() + AND table_name = 'fl_loading_pick_operation' + AND constraint_name = 'chk_loading_pick_operation_action' + AND constraint_type = 'CHECK' + ) THEN + ALTER TABLE fl_loading_pick_operation DROP CHECK chk_loading_pick_operation_action; + END IF; + ALTER TABLE fl_loading_pick_operation + ADD CONSTRAINT chk_loading_pick_operation_action + CHECK (action_type IN ('CLAIM', 'ASSIGN', 'ITEM_CLAIM', 'ITEM_ASSIGN', 'REVIEW')); +END$$ +DELIMITER ; +CALL phase3_pda_replace_operation_check(); +DROP PROCEDURE IF EXISTS phase3_pda_replace_operation_check; DROP PROCEDURE IF EXISTS assert_phase3_pda_item_assignment_schema; DELIMITER $$ @@ -8900,9 +8945,6 @@ DELIMITER ; CALL assert_phase3_pda_item_assignment_schema(); DROP PROCEDURE IF EXISTS assert_phase3_pda_item_assignment_schema; -ALTER TABLE fl_inbound_pallet_allocation - ADD COLUMN IF NOT EXISTS reservation_id BIGINT UNSIGNED NULL COMMENT '仓库预占资源唯一ID,A0共享场景用于区分托盘' AFTER location_code; - -- 来源:firstleg/src/main/resources/db/phase3-carrier-schedule-query-schema.sql SET NAMES utf8mb4; USE baiyue_firstleg; diff --git a/firstleg/src/test/java/com/baiyue/firstleg/repository/Phase3FinalUnifiedSqlContractTest.java b/firstleg/src/test/java/com/baiyue/firstleg/repository/Phase3FinalUnifiedSqlContractTest.java index a8615d21d..776f638b6 100644 --- a/firstleg/src/test/java/com/baiyue/firstleg/repository/Phase3FinalUnifiedSqlContractTest.java +++ b/firstleg/src/test/java/com/baiyue/firstleg/repository/Phase3FinalUnifiedSqlContractTest.java @@ -80,6 +80,17 @@ class Phase3FinalUnifiedSqlContractTest { .isGreaterThan(sql.lastIndexOf("CALL ")); } + @Test + void unifiedEntryUsesMysql8CompatibleConditionalDdl() throws Exception { + String sql = normalise(Files.readString(resolveUnified())); + + assertThat(sql) + .doesNotContain("\n ADD COLUMN IF NOT EXISTS") + .doesNotContain("\n DROP CHECK IF EXISTS") + .contains("CREATE PROCEDURE phase3_pda_add_column") + .contains("CREATE PROCEDURE phase3_pda_replace_operation_check"); + } + @Test void legacySplitIndexesAreOnlyDroppedAndNeverRecreated() throws Exception { String sql = normalise(Files.readString(resolveUnified()));