fix: order lastleg delivery baseline for clean database
This commit is contained in:
@@ -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',
|
||||
|
||||
+37
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user