From c3199867389ab86d3eb05cca6791c5102e66303e Mon Sep 17 00:00:00 2001 From: ouyangxq <775153912@qq.com> Date: Tue, 1 Sep 2026 16:18:38 +0800 Subject: [PATCH] fix: order lastleg delivery baseline for clean database --- .../src/main/resources/db/lastleg.sql | 56 +++++++++++++++---- .../delivery/DeliverySchemaContractTest.java | 37 ++++++++++++ 2 files changed, 81 insertions(+), 12 deletions(-) diff --git a/lastleg-service/src/main/resources/db/lastleg.sql b/lastleg-service/src/main/resources/db/lastleg.sql index a772330e4..71d0a3cdf 100644 --- a/lastleg-service/src/main/resources/db/lastleg.sql +++ b/lastleg-service/src/main/resources/db/lastleg.sql @@ -177,6 +177,50 @@ CREATE TABLE IF NOT EXISTS ll_order_operation_log ( ) ENGINE=InnoDB COMMENT='尾程订单操作记录'; -- 派送单列表与详情快照、转派送费用及操作记录。 +CREATE TABLE IF NOT EXISTS ll_delivery_order ( + id BIGINT NOT NULL COMMENT '派送单主键ID', + customer_id VARCHAR(128) NOT NULL COMMENT '客户数据隔离键', + delivery_no VARCHAR(64) NOT NULL COMMENT '派送单号', + outbound_order_id BIGINT NOT NULL COMMENT '关联出库单ID', + outbound_no VARCHAR(64) NOT NULL COMMENT '关联出库单号', + dispatch_order_id BIGINT NOT NULL COMMENT '关联派车单ID', + dispatch_no VARCHAR(64) NOT NULL COMMENT '关联派车单号', + overseas_warehouse_id VARCHAR(128) NULL COMMENT '海外仓ID', + overseas_warehouse_name VARCHAR(255) NULL COMMENT '海外仓名称快照', + customer_name VARCHAR(255) NULL COMMENT '客户名称快照', + status VARCHAR(32) NOT NULL DEFAULT 'WAIT_DELIVERY' COMMENT '派送状态:WAIT_DELIVERY待派送及后续正式状态', + waybill_no VARCHAR(128) NULL COMMENT '承运运单号', + delivery_method VARCHAR(32) NULL COMMENT '派送方式', + carrier_name VARCHAR(255) NULL COMMENT '派送承运商', + pickup_method VARCHAR(64) NULL COMMENT '提货方式', + loading_type VARCHAR(64) NULL COMMENT '装车类型', + vehicle_type VARCHAR(64) NULL COMMENT '车辆类型', + vehicle_size VARCHAR(64) NULL COMMENT '车辆大小', + vehicle_plate VARCHAR(64) NULL COMMENT '车牌号', + driver_name VARCHAR(128) NULL COMMENT '司机或车队名称', + driver_phone VARCHAR(64) NULL COMMENT '车队联系电话', + appointment_account VARCHAR(128) NULL COMMENT '预约账号', + seller_name VARCHAR(128) NULL COMMENT '卖家姓名', + package_count INT NOT NULL DEFAULT 0 COMMENT '派送箱数', + pallet_count INT NOT NULL DEFAULT 0 COMMENT '派送托盘数', + total_weight_kg DECIMAL(18,4) NOT NULL DEFAULT 0 COMMENT '总重量(千克)', + total_volume_cbm DECIMAL(18,4) NOT NULL DEFAULT 0 COMMENT '总体积(立方米)', + planned_delivery_at DATETIME(3) NULL COMMENT '预计派送时间', + dispatched_at DATETIME(3) NULL COMMENT '实际派送时间', + expected_arrival_at DATETIME(3) NULL COMMENT '预计到达时间', + signed_at DATETIME(3) NULL COMMENT '签收时间', + remark VARCHAR(1000) NULL COMMENT '派送备注', + idempotency_key VARCHAR(255) NOT NULL COMMENT '业务幂等键', + created_by VARCHAR(128) NULL COMMENT '创建人ID', + created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '创建时间', + updated_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3) COMMENT '更新时间', + PRIMARY KEY (id), + UNIQUE KEY uk_ll_delivery_no (customer_id,delivery_no), + UNIQUE KEY uk_ll_delivery_idempotency (customer_id,idempotency_key), + UNIQUE KEY uk_ll_delivery_outbound (customer_id,outbound_order_id), + KEY idx_ll_delivery_list (customer_id,status,created_at) +) ENGINE=InnoDB COMMENT='尾程派送单'; + SET @ddl = (SELECT IF(EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema=DATABASE() AND table_name='ll_delivery_order' AND column_name='overseas_warehouse_name'), 'SELECT 1', 'ALTER TABLE ll_delivery_order ADD COLUMN overseas_warehouse_name VARCHAR(255) NULL COMMENT ''海外仓名称快照'' AFTER overseas_warehouse_id')); PREPARE delivery_detail_stmt FROM @ddl; EXECUTE delivery_detail_stmt; DEALLOCATE PREPARE delivery_detail_stmt; SET @ddl = (SELECT IF(EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema=DATABASE() AND table_name='ll_delivery_order' AND column_name='customer_name'), 'SELECT 1', 'ALTER TABLE ll_delivery_order ADD COLUMN customer_name VARCHAR(255) NULL COMMENT ''客户名称快照'' AFTER overseas_warehouse_name')); @@ -1222,18 +1266,6 @@ PREPARE outbound_upgrade_stmt FROM @ddl; EXECUTE outbound_upgrade_stmt; DEALLOCA SET @ddl = (SELECT IF(EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema=DATABASE() AND table_name='ll_outbound_order' AND column_name='dispatch_order_id' AND is_nullable='YES'), 'SELECT 1', 'ALTER TABLE ll_outbound_order MODIFY COLUMN dispatch_order_id BIGINT NULL COMMENT ''派车单ID,一件代发为空'', MODIFY COLUMN dispatch_no VARCHAR(64) NULL COMMENT ''派车单号,一件代发为空''')); PREPARE outbound_upgrade_stmt FROM @ddl; EXECUTE outbound_upgrade_stmt; DEALLOCATE PREPARE outbound_upgrade_stmt; -CREATE TABLE IF NOT EXISTS ll_delivery_order ( - id BIGINT NOT NULL COMMENT '主键ID', customer_id VARCHAR(128) NOT NULL COMMENT '客户租户ID', - delivery_no VARCHAR(64) NOT NULL COMMENT '派送单号', outbound_order_id BIGINT NOT NULL COMMENT '出库单ID', outbound_no VARCHAR(64) NOT NULL COMMENT '出库单号', - dispatch_order_id BIGINT NOT NULL COMMENT '派车单ID', dispatch_no VARCHAR(64) NOT NULL COMMENT '派车单号', overseas_warehouse_id VARCHAR(128) NULL COMMENT '海外仓ID', - status VARCHAR(32) NOT NULL DEFAULT 'WAIT_DELIVERY' COMMENT '业务状态', package_count INT NOT NULL DEFAULT 0 COMMENT '箱数', pallet_count INT NOT NULL DEFAULT 0 COMMENT '托盘数', - idempotency_key VARCHAR(255) NOT NULL COMMENT '业务幂等键', created_by VARCHAR(128) NULL COMMENT '创建人ID', - created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '创建时间', updated_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3) COMMENT '更新时间', - PRIMARY KEY (id), UNIQUE KEY uk_ll_delivery_no (customer_id,delivery_no), - UNIQUE KEY uk_ll_delivery_idempotency (customer_id,idempotency_key), UNIQUE KEY uk_ll_delivery_outbound (customer_id,outbound_order_id), - KEY idx_ll_delivery_list (customer_id,status,created_at) -) ENGINE=InnoDB COMMENT='尾程派送单'; - -- Customer warehouse transfer: generated tail order plus selected historical order/inbound bindings. CREATE TABLE IF NOT EXISTS ll_warehouse_transfer_order ( id BIGINT NOT NULL COMMENT '主键ID', customer_id VARCHAR(128) NOT NULL COMMENT '客户租户ID', diff --git a/lastleg-service/src/test/java/com/baiyue/lastleg/delivery/DeliverySchemaContractTest.java b/lastleg-service/src/test/java/com/baiyue/lastleg/delivery/DeliverySchemaContractTest.java index 4dee1fd33..c1277fe0b 100644 --- a/lastleg-service/src/test/java/com/baiyue/lastleg/delivery/DeliverySchemaContractTest.java +++ b/lastleg-service/src/test/java/com/baiyue/lastleg/delivery/DeliverySchemaContractTest.java @@ -12,6 +12,7 @@ import java.nio.file.Files; import java.nio.file.Path; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertTrue; @@ -36,6 +37,38 @@ class DeliverySchemaContractTest { assertTrue(schema.contains("unique key uk_ll_delivery_outbound (customer_id,outbound_order_id)")); } + @Test + void cleanDatabaseCreatesTheCompleteDeliveryTableBeforeEveryDependency() throws Exception { + String schema = Files.readString(Path.of("src/main/resources/db/lastleg.sql"), StandardCharsets.UTF_8) + .toLowerCase(); + String createToken = "create table if not exists ll_delivery_order"; + int create = schema.indexOf(createToken); + int firstReference = schema.indexOf("ll_delivery_order"); + int createEnd = schema.indexOf(';', create); + + assertTrue(create >= 0); + assertEquals(create + "create table if not exists ".length(), firstReference); + assertEquals(1, count(schema, createToken)); + assertTrue(createEnd > create); + String definition = schema.substring(create, createEnd); + for (String column : new String[] { + "overseas_warehouse_name", "customer_name", "waybill_no", "delivery_method", + "carrier_name", "pickup_method", "loading_type", "vehicle_type", "vehicle_size", + "vehicle_plate", "driver_name", "driver_phone", "appointment_account", "seller_name", + "total_weight_kg", "total_volume_cbm", "planned_delivery_at", "dispatched_at", + "expected_arrival_at", "signed_at", "remark" + }) { + assertTrue(definition.contains(column), column); + } + assertTrue(schema.indexOf("alter table ll_delivery_order", createEnd) > createEnd); + + String overseas = Files.readString(Path.of("..", "deploy", "sql", "海外区域统一增量-MySQL8.sql"), + StandardCharsets.UTF_8).toLowerCase(); + assertTrue(overseas.contains("空库先执行 lastleg-service/src/main/resources/db/lastleg.sql 基线")); + assertFalse(overseas.contains(createToken)); + assertFalse(overseas.contains("alter table ll_delivery_order")); + } + @Test void deliveryPersistenceEntitiesUseSnowflakeIds() throws Exception { for (Class type : new Class[] { OutboundOrder.class, OutboundPalletItem.class, DeliveryOrder.class }) { @@ -55,4 +88,8 @@ class DeliverySchemaContractTest { assertTrue(migration.contains("create table if not exists ll_outbound_pallet_item")); assertTrue(migration.contains("create table if not exists ll_delivery_order")); } + + private static int count(String source, String token) { + return source.split(java.util.regex.Pattern.quote(token), -1).length - 1; + } }