diff --git a/deploy/sql/README.md b/deploy/sql/README.md index e06944ed6..0946cd9df 100644 --- a/deploy/sql/README.md +++ b/deploy/sql/README.md @@ -3,7 +3,7 @@ ## 唯一数据库初始化与发布入口 - 国内区域固定入口:`头程数据库统一增量-MySQL8.sql`。文件名保留历史兼容,内容维护为当前完整数据库基线和存量环境兼容升级,不再按日期拆分发布脚本。 -- 海外区域固定增量入口:`海外区域统一增量-MySQL8.sql`;空库先执行 `lastleg-service/src/main/resources/db/lastleg.sql` 基线,再执行该入口。当前包含海外仓报价结构,后续海外主数据继续追加到同一入口,不按日期拆分。 +- 海外区域固定增量入口:`海外区域统一增量-MySQL8.sql`;空库先分别执行 `lastleg-service/src/main/resources/db/lastleg.sql` 与 `warehouse-overseas-service/src/main/resources/db/warehouse.sql` 基线,再执行该入口。固定入口同时升级 `baiyue_lastleg` 与 `baiyue_lastlag_warehouse`,当前包含海外主数据、业务、入仓库存与海外仓托盘兼容结构,后续继续追加到同一入口,不按日期拆分。 - 国内、海外 Compose 部署默认设置 `SPRING_SQL_INIT_MODE=never`,执行任一 SQL 均需用户单独授权。 - 该脚本汇总一期、二期及已实现三期出仓能力的数据库基线、存量升级、IAM 权限资源和最终结构校验,适用于 MySQL 8.0。 - 正式上线前的数据库变更直接维护该文件中的当前基线、存量兼容处理和最终校验,不再创建按日期拆分的发布 SQL;正式上线后的迁移策略在生产发布规范中另行冻结。 diff --git a/deploy/sql/海外区域统一增量-MySQL8.sql b/deploy/sql/海外区域统一增量-MySQL8.sql index ac65f97a9..508e02ba8 100644 --- a/deploy/sql/海外区域统一增量-MySQL8.sql +++ b/deploy/sql/海外区域统一增量-MySQL8.sql @@ -404,4 +404,31 @@ SET @ddl = (SELECT IF(EXISTS (SELECT 1 FROM information_schema.statistics WHERE 'SELECT 1', 'ALTER TABLE ll_inbound_stock_receipt ADD UNIQUE KEY uk_ll_stock_receipt_task_allocation_sku (customer_id,task_id,allocation_id,sku_code)')); PREPARE phase4_inventory_stmt FROM @ddl; EXECUTE phase4_inventory_stmt; DEALLOCATE PREPARE phase4_inventory_stmt; -SELECT 'PASS' AS migration_status, '海外仓报价、月度汇率、车辆主数据、海外业务与入仓单目的仓库存结构已就绪' AS message; +-- Warehouse Overseas 与 Lastleg 使用同一海外区域发布入口但保持独立数据库。 +-- 公共托盘详情实体读取 fba_warehouse_code;旧库缺列时创建可成功但详情会 S0500。 +USE baiyue_lastlag_warehouse; +SET @ddl = (SELECT IF(EXISTS (SELECT 1 FROM information_schema.columns + WHERE table_schema=DATABASE() AND table_name='wh_pallet' AND column_name='fba_warehouse_code'), + 'SELECT 1', + 'ALTER TABLE wh_pallet ADD COLUMN fba_warehouse_code VARCHAR(128) NULL COMMENT ''所属FBA仓编码'' AFTER remark')); +PREPARE phase4_warehouse_pallet_stmt FROM @ddl; +EXECUTE phase4_warehouse_pallet_stmt; +DEALLOCATE PREPARE phase4_warehouse_pallet_stmt; + +SET @warehouse_pallet_fba_ready = (SELECT COUNT(*) FROM information_schema.columns + WHERE table_schema='baiyue_lastlag_warehouse' AND table_name='wh_pallet' + AND column_name='fba_warehouse_code' AND column_type='varchar(128)'); +DROP PROCEDURE IF EXISTS assert_phase4_warehouse_pallet_ready; +DELIMITER $$ +CREATE PROCEDURE assert_phase4_warehouse_pallet_ready() +BEGIN + IF @warehouse_pallet_fba_ready <> 1 THEN + SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT='wh_pallet.fba_warehouse_code migration is incomplete'; + END IF; +END$$ +DELIMITER ; +CALL assert_phase4_warehouse_pallet_ready(); +DROP PROCEDURE assert_phase4_warehouse_pallet_ready; + +USE baiyue_lastleg; +SELECT 'PASS' AS migration_status, '海外仓报价、月度汇率、车辆、海外业务、入仓库存与海外仓托盘结构已就绪' AS message; diff --git a/warehouse-overseas-service/src/test/java/com/baiyue/warehouse/schema/WarehouseUnifiedIncrementalContractTest.java b/warehouse-overseas-service/src/test/java/com/baiyue/warehouse/schema/WarehouseUnifiedIncrementalContractTest.java new file mode 100644 index 000000000..0492c6281 --- /dev/null +++ b/warehouse-overseas-service/src/test/java/com/baiyue/warehouse/schema/WarehouseUnifiedIncrementalContractTest.java @@ -0,0 +1,24 @@ +package com.baiyue.warehouse.schema; + +import org.junit.jupiter.api.Test; + +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; + +import static org.junit.jupiter.api.Assertions.assertTrue; + +class WarehouseUnifiedIncrementalContractTest { + + @Test + void overseasUnifiedEntryUpgradesAndValidatesPalletFbaWarehouseCode() throws Exception { + String sql = Files.readString( + Path.of("..", "deploy", "sql", "海外区域统一增量-MySQL8.sql"), StandardCharsets.UTF_8); + + assertTrue(sql.contains("USE baiyue_lastlag_warehouse")); + assertTrue(sql.contains("ALTER TABLE wh_pallet ADD COLUMN fba_warehouse_code VARCHAR(128) NULL")); + assertTrue(sql.contains("@warehouse_pallet_fba_ready")); + assertTrue(sql.contains("wh_pallet.fba_warehouse_code migration is incomplete")); + assertTrue(sql.contains("USE baiyue_lastleg")); + } +}