diff --git a/order/src/test/java/com/baiyue/order/repository/OrderParentChildSqlContractTest.java b/order/src/test/java/com/baiyue/order/repository/OrderParentChildSqlContractTest.java index e922fb3b2..73b22f290 100644 --- a/order/src/test/java/com/baiyue/order/repository/OrderParentChildSqlContractTest.java +++ b/order/src/test/java/com/baiyue/order/repository/OrderParentChildSqlContractTest.java @@ -17,16 +17,35 @@ class OrderParentChildSqlContractTest { assertThat(sql) .contains("source_order_id BIGINT UNSIGNED NOT NULL") .contains("KEY idx_order_split_source (tenant_id,source_order_id,split_role)") + .contains("DROP INDEX uk_order_split_child") + .contains("uk_order_split_child_role") + .contains("UNIQUE KEY `uk_order_split_child_role` (`tenant_id`,`child_order_id`,`split_role`)") + .contains("NEW.split_role='LOADED' AND NEW.child_order_id<>NEW.source_order_id") + .contains("实装台账必须由来源订单自身承接") + .contains("订单履约分片来源、子片与角色不可修改") .contains("MODIFY source_order_id BIGINT UNSIGNED NOT NULL") .contains("MODIFY request_hash CHAR(64) NOT NULL") .contains("UPDATE ord_order_fulfillment_split") .contains("SHA2(CONCAT('LEGACY:', tenant_id, ':', id), 256)"); + assertThat(sql).doesNotContain("UNIQUE KEY uk_order_split_child (tenant_id,child_order_id)"); assertThat(sql.lastIndexOf("DROP PROCEDURE IF EXISTS phase3_order_add_column")) .isGreaterThan(sql.lastIndexOf("CALL phase3_order_add_column")); assertThat(sql.lastIndexOf("DROP PROCEDURE IF EXISTS phase3_order_add_index")) .isGreaterThan(sql.lastIndexOf("CALL phase3_order_add_index")); } + @Test + void baselineAllowsOneChildAcrossDifferentRolesButRejectsDuplicateRole() throws Exception { + String baseline = read(resolve("order/src/main/resources/db/order.sql")); + + assertThat(baseline) + .contains("UNIQUE KEY uk_order_split_child_role (tenant_id, child_order_id, split_role)") + .contains("CREATE TRIGGER trg_order_fulfillment_split_insert") + .contains("NEW.split_role='LOADED' AND NEW.child_order_id<>NEW.source_order_id") + .contains("NEW.split_role='REMAINDER'") + .doesNotContain("UNIQUE KEY uk_order_split_child (tenant_id, child_order_id)"); + } + @Test void unifiedEntryContainsTheExactOrderBlockBeforeFirstleg() throws Exception { String unified = read(resolve("deploy/sql/头程数据库统一增量-MySQL8.sql")); diff --git a/order/src/test/java/com/baiyue/order/service/OrderFulfillmentSplitContractTest.java b/order/src/test/java/com/baiyue/order/service/OrderFulfillmentSplitContractTest.java index 7506f05cc..f79484bf2 100644 --- a/order/src/test/java/com/baiyue/order/service/OrderFulfillmentSplitContractTest.java +++ b/order/src/test/java/com/baiyue/order/service/OrderFulfillmentSplitContractTest.java @@ -36,10 +36,14 @@ class OrderFulfillmentSplitContractTest { .contains("source_order_id BIGINT UNSIGNED NOT NULL") .contains("MODIFY source_order_id BIGINT UNSIGNED NOT NULL") .contains("MODIFY request_hash CHAR(64) NOT NULL") - .contains("idx_order_split_source"); + .contains("idx_order_split_source") + .contains("uk_order_split_child_role") + .contains("NEW.split_role='LOADED' AND NEW.child_order_id<>NEW.source_order_id"); assertThat(baseline) .contains("source_order_id BIGINT UNSIGNED NOT NULL") - .contains("KEY idx_order_split_source (tenant_id, source_order_id, split_role)"); + .contains("KEY idx_order_split_source (tenant_id, source_order_id, split_role)") + .contains("UNIQUE KEY uk_order_split_child_role (tenant_id, child_order_id, split_role)") + .doesNotContain("UNIQUE KEY uk_order_split_child (tenant_id, child_order_id)"); } @Test