2026-08-17 09:18:03 +08:00
CREATE DATABASE IF NOT EXISTS baiyue_lastleg DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ;
USE baiyue_lastleg ;
CREATE TABLE IF NOT EXISTS ll_loading_event_inbox (
event_id VARCHAR ( 128 ) NOT NULL COMMENT '事件全局唯一标识' ,
2026-08-18 11:39:40 +08:00
customer_id VARCHAR ( 128 ) NOT NULL COMMENT '租户/客户账号标识' ,
2026-08-17 09:18:03 +08:00
event_type VARCHAR ( 64 ) NOT NULL COMMENT '事件类型' ,
event_version INT NOT NULL COMMENT '事件契约版本' ,
payload_hash VARCHAR ( 71 ) NOT NULL COMMENT '规范化事件负载 SHA-256 摘要' ,
payload_json JSON NOT NULL COMMENT '事件冻结负载 JSON' ,
status VARCHAR ( 32 ) NOT NULL DEFAULT 'RECEIVED' COMMENT '消费状态:RECEIVED/PROCESSED' ,
received_at DATETIME ( 3 ) NOT NULL DEFAULT CURRENT_TIMESTAMP ( 3 ) COMMENT '接收时间' ,
processed_at DATETIME ( 3 ) NULL COMMENT '处理完成时间' ,
last_error VARCHAR ( 1000 ) NULL COMMENT '最近一次处理错误' ,
PRIMARY KEY ( event_id ),
2026-08-18 11:39:40 +08:00
UNIQUE KEY uk_ll_loading_inbox_tenant_key ( customer_id , event_type , event_id )
2026-08-17 09:18:03 +08:00
) ENGINE = InnoDB COMMENT = '头程装柜完成事件接收幂等箱' ;
CREATE TABLE IF NOT EXISTS ll_order (
id BIGINT NOT NULL COMMENT '雪花 ID' ,
order_no VARCHAR ( 32 ) NOT NULL COMMENT '尾程单号' ,
2026-08-18 11:39:40 +08:00
customer_id VARCHAR ( 128 ) NOT NULL COMMENT '租户/客户账号标识' ,
2026-08-17 09:18:03 +08:00
order_type VARCHAR ( 32 ) NOT NULL DEFAULT 'FIRST_LEG' COMMENT '订单类型' ,
inbound_code VARCHAR ( 128 ) NOT NULL COMMENT '入仓码' ,
source_region VARCHAR ( 32 ) NOT NULL COMMENT '来源区域/系统' ,
source_inbound_id VARCHAR ( 128 ) NOT NULL COMMENT '最终实装 LOADED 分片 ID,建单幂等键' ,
root_inbound_id VARCHAR ( 128 ) COMMENT '根入仓单 ID' ,
source_order_id VARCHAR ( 128 ) COMMENT '来源订单 ID' ,
source_order_no VARCHAR ( 128 ) COMMENT '来源订单号' ,
root_order_id VARCHAR ( 128 ) COMMENT '根订单 ID' ,
customer_name VARCHAR ( 255 ) COMMENT '货主名称' ,
overseas_warehouse_id VARCHAR ( 128 ) COMMENT '海外仓 ID' ,
overseas_warehouse_name VARCHAR ( 255 ) COMMENT '海外仓名称' ,
transfer_warehouse_id VARCHAR ( 128 ) COMMENT '转入目的仓 ID' ,
transfer_warehouse_code VARCHAR ( 128 ) COMMENT '转入目的仓编码' ,
transfer_warehouse_name VARCHAR ( 255 ) COMMENT '转入目的仓名称' ,
fba_warehouse_code VARCHAR ( 128 ) COMMENT 'FBA 仓库编码' ,
container_no VARCHAR ( 64 ) COMMENT '集装箱号' ,
container_status VARCHAR ( 32 ) DEFAULT '待转柜' COMMENT '货柜状态' ,
abnormal TINYINT NOT NULL DEFAULT 0 COMMENT '是否异常:0否1是' ,
detained TINYINT NOT NULL DEFAULT 0 COMMENT '是否暂扣:0否1是' ,
pallet_count INT NOT NULL DEFAULT 0 COMMENT '托数' ,
package_count INT NOT NULL DEFAULT 0 COMMENT '箱数' ,
2026-08-17 19:04:58 +08:00
picked_package_count INT NOT NULL DEFAULT 0 COMMENT '累计已拣箱数' ,
shipped_package_count INT NOT NULL DEFAULT 0 COMMENT '累计已出库箱数' ,
2026-08-17 09:18:03 +08:00
volume_cbm DECIMAL ( 18 , 4 ) COMMENT '体积(立方米)' ,
product_quantity INT COMMENT '货物数量' ,
volume_weight_kg DECIMAL ( 18 , 4 ) COMMENT '体积重量(千克)' ,
estimated_arrival_at DATETIME ( 3 ) COMMENT '预计到港时间' ,
actual_arrival_at DATETIME ( 3 ) COMMENT '实际到港时间' ,
estimated_warehouse_at DATETIME ( 3 ) COMMENT '预计到仓时间' ,
inbound_order_no VARCHAR ( 128 ) COMMENT '入库单号' ,
outbound_order_no VARCHAR ( 128 ) COMMENT '出库单号' ,
delivery_order_no VARCHAR ( 128 ) COMMENT '派送单号' ,
relabel_order_no VARCHAR ( 128 ) COMMENT '换标单号' ,
relabel_status VARCHAR ( 32 ) COMMENT '换标状态' ,
pallet_merge_flag VARCHAR ( 32 ) COMMENT '合托标记' ,
current_status VARCHAR ( 32 ) NOT NULL DEFAULT 'PENDING_ASSIGNMENT' COMMENT '当前业务状态' ,
private_remark VARCHAR ( 1000 ) COMMENT '备注(仅自己)' ,
customer_remark VARCHAR ( 1000 ) COMMENT '备注(客户)' ,
warehouse_remark VARCHAR ( 1000 ) COMMENT '备注(仓库)' ,
source_event_id VARCHAR ( 128 ) NOT NULL COMMENT '来源事件 ID' ,
source_loading_plan_id VARCHAR ( 128 ) NOT NULL COMMENT '来源装柜计划 ID' ,
source_loading_plan_version BIGINT COMMENT '来源装柜计划版本' ,
source_handover_version BIGINT COMMENT '交接版本' ,
source_payload_hash VARCHAR ( 71 ) NOT NULL COMMENT '来源事件负载摘要' ,
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 ),
2026-08-18 11:39:40 +08:00
UNIQUE KEY uk_ll_order_source ( customer_id , source_region , source_inbound_id ),
KEY idx_ll_order_group ( customer_id , order_no ),
KEY idx_ll_order_container ( customer_id , container_no ),
KEY idx_ll_order_list ( customer_id , current_status , created_at )
2026-08-17 09:18:03 +08:00
) ENGINE = InnoDB COMMENT = '尾程订单主表' ;
CREATE TABLE IF NOT EXISTS ll_order_detail (
id BIGINT NOT NULL AUTO_INCREMENT COMMENT '订单明细主键' ,
order_id BIGINT NOT NULL COMMENT '尾程订单 ID' ,
source_inbound_detail_id VARCHAR ( 128 ) NOT NULL COMMENT '来源入仓明细 ID' ,
sku_code VARCHAR ( 128 ) COMMENT 'SKU 编码' ,
product_name_zh VARCHAR ( 255 ) COMMENT '中文品名' ,
product_name_en VARCHAR ( 255 ) COMMENT '英文品名' ,
package_count INT NOT NULL DEFAULT 0 COMMENT '箱数' ,
product_quantity INT COMMENT '数量' ,
pallet_count INT COMMENT '托数' ,
gross_weight_kg DECIMAL ( 18 , 4 ) COMMENT '毛重(千克)' ,
net_weight_kg DECIMAL ( 18 , 4 ) COMMENT '净重(千克)' ,
dimensional_weight_kg DECIMAL ( 18 , 4 ) COMMENT '体积重量(千克)' ,
volume_cbm DECIMAL ( 18 , 4 ) COMMENT '体积(立方米)' ,
destination_warehouse_id VARCHAR ( 128 ) COMMENT '目的仓 ID' ,
destination_warehouse_code VARCHAR ( 128 ) COMMENT '目的仓编码' ,
destination_warehouse_name VARCHAR ( 255 ) COMMENT '目的仓名称' ,
fba_tracking_no VARCHAR ( 255 ) COMMENT 'FBA跟踪号' ,
shipment_no VARCHAR ( 255 ) COMMENT '货件编号' ,
shipping_mark VARCHAR ( 255 ) COMMENT '唛头' ,
PRIMARY KEY ( id ),
UNIQUE KEY uk_ll_detail_source ( order_id , source_inbound_detail_id ),
KEY idx_ll_detail_order ( order_id )
) ENGINE = InnoDB COMMENT = '尾程订单实装商品冻结明细' ;
CREATE TABLE IF NOT EXISTS ll_loading_order_status_history (
id BIGINT NOT NULL AUTO_INCREMENT COMMENT '状态历史主键' ,
order_id BIGINT NOT NULL COMMENT '尾程订单 ID' ,
from_status VARCHAR ( 32 ) COMMENT '变更前状态' ,
to_status VARCHAR ( 32 ) NOT NULL COMMENT '变更后状态' ,
event_id VARCHAR ( 128 ) COMMENT '触发事件 ID' ,
remark VARCHAR ( 500 ) COMMENT '状态变更备注' ,
created_at DATETIME ( 3 ) NOT NULL DEFAULT CURRENT_TIMESTAMP ( 3 ) COMMENT '记录时间' ,
PRIMARY KEY ( id ),
KEY idx_ll_loading_history_order ( order_id , created_at )
) ENGINE = InnoDB COMMENT = '尾程订单状态变更历史' ;
CREATE TABLE IF NOT EXISTS ll_event_conflict (
id BIGINT NOT NULL COMMENT '冲突记录主键' , event_id VARCHAR ( 128 ) NOT NULL COMMENT '冲突事件 ID' ,
2026-08-18 11:39:40 +08:00
customer_id BIGINT NOT NULL COMMENT '租户 ID' , conflict_type VARCHAR ( 64 ) NOT NULL COMMENT '冲突类型' ,
2026-08-17 09:18:03 +08:00
conflict_message VARCHAR ( 512 ) NOT NULL COMMENT '冲突说明' , created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间' ,
2026-08-18 11:39:40 +08:00
PRIMARY KEY ( id ), KEY idx_ll_conflict_event ( event_id , customer_id )
2026-08-17 09:18:03 +08:00
) ENGINE = InnoDB COMMENT = '事件冲突记录' ;
CREATE TABLE IF NOT EXISTS ll_event_inbox (
id BIGINT NOT NULL COMMENT '事件接收记录主键' , event_id VARCHAR ( 128 ) NOT NULL COMMENT '事件全局唯一 ID' ,
2026-08-18 11:39:40 +08:00
customer_id BIGINT NOT NULL COMMENT '租户 ID' , event_type VARCHAR ( 128 ) NOT NULL COMMENT '事件类型' ,
2026-08-17 09:18:03 +08:00
aggregate_type VARCHAR ( 64 ) NOT NULL COMMENT '聚合类型' , aggregate_id VARCHAR ( 128 ) NOT NULL COMMENT '聚合 ID' ,
aggregate_version BIGINT NOT NULL COMMENT '聚合版本' , payload_hash VARCHAR ( 71 ) NOT NULL COMMENT '负载摘要' ,
status VARCHAR ( 32 ) NOT NULL COMMENT '消费状态' , error_message VARCHAR ( 512 ) NULL COMMENT '错误信息' ,
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间' ,
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间' ,
2026-08-18 11:39:40 +08:00
PRIMARY KEY ( id ), UNIQUE KEY uk_ll_inbox_event ( event_id ), KEY idx_ll_inbox_source ( customer_id , aggregate_id )
2026-08-17 09:18:03 +08:00
) ENGINE = InnoDB COMMENT = '通用事件接收幂等箱' ;
CREATE TABLE IF NOT EXISTS ll_inbound_order (
2026-08-18 11:39:40 +08:00
id BIGINT NOT NULL COMMENT '入仓单主键' , customer_id BIGINT NOT NULL COMMENT '租户 ID' , source_region VARCHAR ( 32 ) NOT NULL COMMENT '来源区域' ,
2026-08-17 09:18:03 +08:00
source_inbound_id VARCHAR ( 128 ) NOT NULL COMMENT '来源入仓分片 ID' , root_inbound_id VARCHAR ( 128 ) NULL COMMENT '根入仓单 ID' ,
source_order_id VARCHAR ( 128 ) NULL COMMENT '来源订单 ID' , source_order_no VARCHAR ( 128 ) NULL COMMENT '来源订单号' , root_order_id VARCHAR ( 128 ) NULL COMMENT '根订单 ID' ,
inbound_code VARCHAR ( 128 ) NULL COMMENT '入仓码' , destination_warehouse_id VARCHAR ( 128 ) NULL COMMENT '目的仓 ID' ,
destination_warehouse_code VARCHAR ( 128 ) NULL COMMENT '目的仓编码' , destination_warehouse_name VARCHAR ( 255 ) NULL COMMENT '目的仓名称' ,
package_count INT NOT NULL DEFAULT 0 COMMENT '箱数' , product_quantity INT NULL COMMENT '数量' , pallet_count INT NULL COMMENT '托数' ,
gross_weight_kg DECIMAL ( 18 , 3 ) NULL COMMENT '毛重(千克)' , net_weight_kg DECIMAL ( 18 , 3 ) NULL COMMENT '净重(千克)' , volume_cbm DECIMAL ( 18 , 6 ) NULL COMMENT '体积(立方米)' ,
source_event_id VARCHAR ( 128 ) NOT NULL COMMENT '来源事件 ID' , source_loading_plan_id VARCHAR ( 128 ) NOT NULL COMMENT '装柜计划 ID' ,
source_loading_plan_version BIGINT NOT NULL COMMENT '装柜计划版本' , handover_version BIGINT NOT NULL COMMENT '交接版本' , payload_hash VARCHAR ( 71 ) NOT NULL COMMENT '负载摘要' ,
status VARCHAR ( 32 ) NOT NULL COMMENT '入仓单状态' , exception_flag VARCHAR ( 32 ) NOT NULL DEFAULT 'NONE' COMMENT '异常标记' ,
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间' , updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间' ,
2026-08-18 11:39:40 +08:00
PRIMARY KEY ( id ), UNIQUE KEY uk_ll_order_source ( customer_id , source_region , source_inbound_id ), UNIQUE KEY uk_ll_order_event ( source_event_id , source_inbound_id )
2026-08-17 09:18:03 +08:00
) ENGINE = InnoDB COMMENT = '尾程入仓单快照' ;
CREATE TABLE IF NOT EXISTS ll_inbound_order_item (
2026-08-18 11:39:40 +08:00
id BIGINT NOT NULL COMMENT '入仓明细主键' , customer_id BIGINT NOT NULL COMMENT '租户 ID' , order_id BIGINT NOT NULL COMMENT '入仓单 ID' ,
2026-08-17 09:18:03 +08:00
source_inbound_detail_id VARCHAR ( 128 ) NOT NULL COMMENT '来源入仓明细 ID' , package_count INT NOT NULL COMMENT '箱数' , product_quantity INT NULL COMMENT '数量' , pallet_count INT NULL COMMENT '托数' ,
gross_weight_kg DECIMAL ( 18 , 3 ) NULL COMMENT '毛重(千克)' , net_weight_kg DECIMAL ( 18 , 3 ) NULL COMMENT '净重(千克)' , dimensional_weight_kg DECIMAL ( 18 , 3 ) NULL COMMENT '体积重量(千克)' , volume_cbm DECIMAL ( 18 , 6 ) NULL COMMENT '体积(立方米)' ,
destination_warehouse_id VARCHAR ( 128 ) NULL COMMENT '目的仓 ID' , destination_warehouse_code VARCHAR ( 128 ) NULL COMMENT '目的仓编码' , destination_warehouse_name VARCHAR ( 255 ) NULL COMMENT '目的仓名称' ,
fba_tracking_no VARCHAR ( 128 ) NULL COMMENT 'FBA跟踪号' , shipment_no VARCHAR ( 128 ) NULL COMMENT '货件编号' , shipping_mark VARCHAR ( 255 ) NULL COMMENT '唛头' ,
sku_code VARCHAR ( 128 ) NULL COMMENT 'SKU 编码' , product_name_zh VARCHAR ( 255 ) NULL COMMENT '中文品名' , product_name_en VARCHAR ( 255 ) NULL COMMENT '英文品名' ,
2026-08-18 11:39:40 +08:00
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间' , PRIMARY KEY ( id ), KEY idx_ll_item_order ( customer_id , order_id )
2026-08-17 09:18:03 +08:00
) ENGINE = InnoDB COMMENT = '尾程入仓商品明细快照' ;
CREATE TABLE IF NOT EXISTS ll_order_status_history (
2026-08-18 11:39:40 +08:00
id BIGINT NOT NULL COMMENT '订单状态历史主键' , customer_id BIGINT NOT NULL COMMENT '租户 ID' , order_id BIGINT NOT NULL COMMENT '订单 ID' ,
2026-08-17 09:18:03 +08:00
from_status VARCHAR ( 32 ) NULL COMMENT '变更前状态' , to_status VARCHAR ( 32 ) NOT NULL COMMENT '变更后状态' , reason VARCHAR ( 255 ) NULL COMMENT '变更原因' ,
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '记录时间' , PRIMARY KEY ( id )
) ENGINE = InnoDB COMMENT = '尾程订单状态历史' ;
-- 幂等注释迁移:CREATE TABLE IF NOT EXISTS 对已有表不会更新表/字段注释。
ALTER TABLE ll_loading_event_inbox COMMENT = '头程装柜完成事件接收幂等箱' ;
ALTER TABLE ll_order COMMENT = '尾程订单主表' ;
ALTER TABLE ll_order_detail COMMENT = '尾程订单实装商品冻结明细' ;
ALTER TABLE ll_loading_order_status_history COMMENT = '尾程订单状态变更历史' ;
ALTER TABLE ll_event_conflict COMMENT = '事件冲突记录' ;
ALTER TABLE ll_event_inbox COMMENT = '通用事件接收幂等箱' ;
ALTER TABLE ll_inbound_order COMMENT = '尾程入仓单快照' ;
ALTER TABLE ll_inbound_order_item COMMENT = '尾程入仓商品明细快照' ;
ALTER TABLE ll_order_status_history COMMENT = '尾程订单状态历史' ;
ALTER TABLE ll_event_conflict
MODIFY COLUMN id BIGINT NOT NULL COMMENT '冲突记录主键' , MODIFY COLUMN event_id VARCHAR ( 128 ) NOT NULL COMMENT '冲突事件 ID' ,
2026-08-18 11:39:40 +08:00
MODIFY COLUMN customer_id BIGINT NOT NULL COMMENT '租户 ID' , MODIFY COLUMN conflict_type VARCHAR ( 64 ) NOT NULL COMMENT '冲突类型' ,
2026-08-17 09:18:03 +08:00
MODIFY COLUMN conflict_message VARCHAR ( 512 ) NOT NULL COMMENT '冲突说明' , MODIFY COLUMN created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间' ;
ALTER TABLE ll_event_inbox
2026-08-18 11:39:40 +08:00
MODIFY COLUMN id BIGINT NOT NULL COMMENT '事件接收记录主键' , MODIFY COLUMN event_id VARCHAR ( 128 ) NOT NULL COMMENT '事件全局唯一 ID' , MODIFY COLUMN customer_id BIGINT NOT NULL COMMENT '租户 ID' ,
2026-08-17 09:18:03 +08:00
MODIFY COLUMN event_type VARCHAR ( 128 ) NOT NULL COMMENT '事件类型' , MODIFY COLUMN aggregate_type VARCHAR ( 64 ) NOT NULL COMMENT '聚合类型' , MODIFY COLUMN aggregate_id VARCHAR ( 128 ) NOT NULL COMMENT '聚合 ID' , MODIFY COLUMN aggregate_version BIGINT NOT NULL COMMENT '聚合版本' , MODIFY COLUMN payload_hash VARCHAR ( 71 ) NOT NULL COMMENT '负载摘要' , MODIFY COLUMN status VARCHAR ( 32 ) NOT NULL COMMENT '消费状态' , MODIFY COLUMN error_message VARCHAR ( 512 ) NULL COMMENT '错误信息' , MODIFY COLUMN created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间' , MODIFY COLUMN updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间' ;
ALTER TABLE ll_inbound_order
2026-08-18 11:39:40 +08:00
MODIFY COLUMN id BIGINT NOT NULL COMMENT '入仓单主键' , MODIFY COLUMN customer_id BIGINT NOT NULL COMMENT '租户 ID' , MODIFY COLUMN source_region VARCHAR ( 32 ) NOT NULL COMMENT '来源区域' , MODIFY COLUMN source_inbound_id VARCHAR ( 128 ) NOT NULL COMMENT '来源入仓分片 ID' , MODIFY COLUMN root_inbound_id VARCHAR ( 128 ) NULL COMMENT '根入仓单 ID' , MODIFY COLUMN source_order_id VARCHAR ( 128 ) NULL COMMENT '来源订单 ID' , MODIFY COLUMN source_order_no VARCHAR ( 128 ) NULL COMMENT '来源订单号' , MODIFY COLUMN root_order_id VARCHAR ( 128 ) NULL COMMENT '根订单 ID' , MODIFY COLUMN inbound_code VARCHAR ( 128 ) NULL COMMENT '入仓码' , MODIFY COLUMN destination_warehouse_id VARCHAR ( 128 ) NULL COMMENT '目的仓 ID' , MODIFY COLUMN destination_warehouse_code VARCHAR ( 128 ) NULL COMMENT '目的仓编码' , MODIFY COLUMN destination_warehouse_name VARCHAR ( 255 ) NULL COMMENT '目的仓名称' , MODIFY COLUMN package_count INT NOT NULL DEFAULT 0 COMMENT '箱数' , MODIFY COLUMN product_quantity INT NULL COMMENT '数量' , MODIFY COLUMN pallet_count INT NULL COMMENT '托数' , MODIFY COLUMN gross_weight_kg DECIMAL ( 18 , 3 ) NULL COMMENT '毛重(千克)' , MODIFY COLUMN net_weight_kg DECIMAL ( 18 , 3 ) NULL COMMENT '净重(千克)' , MODIFY COLUMN volume_cbm DECIMAL ( 18 , 6 ) NULL COMMENT '体积(立方米)' , MODIFY COLUMN source_event_id VARCHAR ( 128 ) NOT NULL COMMENT '来源事件 ID' , MODIFY COLUMN source_loading_plan_id VARCHAR ( 128 ) NOT NULL COMMENT '装柜计划 ID' , MODIFY COLUMN source_loading_plan_version BIGINT NOT NULL COMMENT '装柜计划版本' , MODIFY COLUMN handover_version BIGINT NOT NULL COMMENT '交接版本' , MODIFY COLUMN payload_hash VARCHAR ( 71 ) NOT NULL COMMENT '负载摘要' , MODIFY COLUMN status VARCHAR ( 32 ) NOT NULL COMMENT '入仓单状态' , MODIFY COLUMN exception_flag VARCHAR ( 32 ) NOT NULL DEFAULT 'NONE' COMMENT '异常标记' , MODIFY COLUMN created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间' , MODIFY COLUMN updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间' ;
2026-08-17 09:18:03 +08:00
ALTER TABLE ll_inbound_order_item
2026-08-18 11:39:40 +08:00
MODIFY COLUMN id BIGINT NOT NULL COMMENT '入仓明细主键' , MODIFY COLUMN customer_id BIGINT NOT NULL COMMENT '租户ID' , MODIFY COLUMN order_id BIGINT NOT NULL COMMENT '入仓单ID' , MODIFY COLUMN source_inbound_detail_id VARCHAR ( 128 ) NOT NULL COMMENT '来源入仓明细ID' , MODIFY COLUMN package_count INT NOT NULL COMMENT '箱数' , MODIFY COLUMN product_quantity INT NULL COMMENT '数量' , MODIFY COLUMN pallet_count INT NULL COMMENT '托数' , MODIFY COLUMN gross_weight_kg DECIMAL ( 18 , 3 ) NULL COMMENT '毛重(千克)' , MODIFY COLUMN net_weight_kg DECIMAL ( 18 , 3 ) NULL COMMENT '净重(千克)' , MODIFY COLUMN dimensional_weight_kg DECIMAL ( 18 , 3 ) NULL COMMENT '体积重量(千克)' , MODIFY COLUMN volume_cbm DECIMAL ( 18 , 6 ) NULL COMMENT '体积(立方米)' , MODIFY COLUMN destination_warehouse_id VARCHAR ( 128 ) NULL COMMENT '目的仓ID' , MODIFY COLUMN destination_warehouse_code VARCHAR ( 128 ) NULL COMMENT '目的仓编码' , MODIFY COLUMN destination_warehouse_name VARCHAR ( 255 ) NULL COMMENT '目的仓名称' , MODIFY COLUMN fba_tracking_no VARCHAR ( 128 ) NULL COMMENT 'FBA跟踪号' , MODIFY COLUMN shipment_no VARCHAR ( 128 ) NULL COMMENT '货件编号' , MODIFY COLUMN shipping_mark VARCHAR ( 255 ) NULL COMMENT '唛头' , MODIFY COLUMN sku_code VARCHAR ( 128 ) NULL COMMENT 'SKU编码' , MODIFY COLUMN product_name_zh VARCHAR ( 255 ) NULL COMMENT '中文品名' , MODIFY COLUMN product_name_en VARCHAR ( 255 ) NULL COMMENT '英文品名' , MODIFY COLUMN created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间' ;
2026-08-17 09:18:03 +08:00
ALTER TABLE ll_order_status_history
2026-08-18 11:39:40 +08:00
MODIFY COLUMN id BIGINT NOT NULL COMMENT '订单状态历史主键' , MODIFY COLUMN customer_id BIGINT NOT NULL COMMENT '租户 ID' , MODIFY COLUMN order_id BIGINT NOT NULL COMMENT '订单 ID' , MODIFY COLUMN from_status VARCHAR ( 32 ) NULL COMMENT '变更前状态' , MODIFY COLUMN to_status VARCHAR ( 32 ) NOT NULL COMMENT '变更后状态' , MODIFY COLUMN reason VARCHAR ( 255 ) NULL COMMENT '变更原因' , MODIFY COLUMN created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '记录时间' ;
2026-08-17 09:18:03 +08:00
ALTER TABLE ll_loading_event_inbox
MODIFY COLUMN event_id VARCHAR ( 128 ) NOT NULL COMMENT '事件全局唯一标识' ,
2026-08-18 11:39:40 +08:00
MODIFY COLUMN customer_id VARCHAR ( 128 ) NOT NULL COMMENT '租户/客户账号标识' ,
2026-08-17 09:18:03 +08:00
MODIFY COLUMN event_type VARCHAR ( 64 ) NOT NULL COMMENT '事件类型' ,
MODIFY COLUMN event_version INT NOT NULL COMMENT '事件契约版本' ,
MODIFY COLUMN payload_hash VARCHAR ( 71 ) NOT NULL COMMENT '规范化事件负载 SHA-256 摘要' ,
MODIFY COLUMN payload_json JSON NOT NULL COMMENT '事件冻结负载 JSON' ,
MODIFY COLUMN status VARCHAR ( 32 ) NOT NULL DEFAULT 'RECEIVED' COMMENT '消费状态:RECEIVED/PROCESSED' ,
MODIFY COLUMN received_at DATETIME ( 3 ) NOT NULL DEFAULT CURRENT_TIMESTAMP ( 3 ) COMMENT '接收时间' ,
MODIFY COLUMN processed_at DATETIME ( 3 ) NULL COMMENT '处理完成时间' ,
MODIFY COLUMN last_error VARCHAR ( 1000 ) NULL COMMENT '最近一次处理错误' ;
ALTER TABLE ll_order
MODIFY COLUMN id BIGINT NOT NULL COMMENT '雪花 ID' ,
MODIFY COLUMN order_no VARCHAR ( 32 ) NOT NULL COMMENT '尾程单号' ,
2026-08-18 11:39:40 +08:00
MODIFY COLUMN customer_id VARCHAR ( 128 ) NOT NULL COMMENT '租户/客户账号标识' ,
2026-08-17 09:18:03 +08:00
MODIFY COLUMN order_type VARCHAR ( 32 ) NOT NULL DEFAULT 'FIRST_LEG' COMMENT '订单类型' ,
MODIFY COLUMN inbound_code VARCHAR ( 128 ) NOT NULL COMMENT '入仓码' ,
MODIFY COLUMN source_region VARCHAR ( 32 ) NOT NULL COMMENT '来源区域/系统' ,
MODIFY COLUMN source_inbound_id VARCHAR ( 128 ) NOT NULL COMMENT '最终实装 LOADED 分片 ID,建单幂等键' ,
MODIFY COLUMN root_inbound_id VARCHAR ( 128 ) NULL COMMENT '根入仓单 ID' ,
MODIFY COLUMN source_order_id VARCHAR ( 128 ) NULL COMMENT '来源订单 ID' ,
MODIFY COLUMN source_order_no VARCHAR ( 128 ) NULL COMMENT '来源订单号' ,
MODIFY COLUMN root_order_id VARCHAR ( 128 ) NULL COMMENT '根订单 ID' ,
MODIFY COLUMN customer_name VARCHAR ( 255 ) NULL COMMENT '货主名称' ,
MODIFY COLUMN overseas_warehouse_id VARCHAR ( 128 ) NULL COMMENT '海外仓 ID' ,
MODIFY COLUMN overseas_warehouse_name VARCHAR ( 255 ) NULL COMMENT '海外仓名称' ,
MODIFY COLUMN fba_warehouse_code VARCHAR ( 128 ) NULL COMMENT 'FBA 仓库编码' ,
MODIFY COLUMN container_no VARCHAR ( 64 ) NULL COMMENT '集装箱号' ,
MODIFY COLUMN container_status VARCHAR ( 32 ) NULL DEFAULT '待转柜' COMMENT '货柜状态' ,
MODIFY COLUMN abnormal TINYINT NOT NULL DEFAULT 0 COMMENT '是否异常:0否1是' ,
MODIFY COLUMN detained TINYINT NOT NULL DEFAULT 0 COMMENT '是否暂扣:0否1是' ,
MODIFY COLUMN pallet_count INT NOT NULL DEFAULT 0 COMMENT '托数' ,
MODIFY COLUMN package_count INT NOT NULL DEFAULT 0 COMMENT '箱数' ,
MODIFY COLUMN volume_cbm DECIMAL ( 18 , 4 ) NULL COMMENT '体积(立方米)' ,
MODIFY COLUMN product_quantity INT NULL COMMENT '货物数量' ,
MODIFY COLUMN volume_weight_kg DECIMAL ( 18 , 4 ) NULL COMMENT '体积重量(千克)' ,
MODIFY COLUMN estimated_arrival_at DATETIME ( 3 ) NULL COMMENT '预计到港时间' ,
MODIFY COLUMN actual_arrival_at DATETIME ( 3 ) NULL COMMENT '实际到港时间' ,
MODIFY COLUMN estimated_warehouse_at DATETIME ( 3 ) NULL COMMENT '预计到仓时间' ,
MODIFY COLUMN inbound_order_no VARCHAR ( 128 ) NULL COMMENT '入库单号' ,
MODIFY COLUMN outbound_order_no VARCHAR ( 128 ) NULL COMMENT '出库单号' ,
MODIFY COLUMN delivery_order_no VARCHAR ( 128 ) NULL COMMENT '派送单号' ,
MODIFY COLUMN relabel_order_no VARCHAR ( 128 ) NULL COMMENT '换标单号' ,
MODIFY COLUMN relabel_status VARCHAR ( 32 ) NULL COMMENT '换标状态' ,
MODIFY COLUMN pallet_merge_flag VARCHAR ( 32 ) NULL COMMENT '合托标记' ,
MODIFY COLUMN current_status VARCHAR ( 32 ) NOT NULL DEFAULT 'PENDING_ASSIGNMENT' COMMENT '当前业务状态' ,
MODIFY COLUMN private_remark VARCHAR ( 1000 ) NULL COMMENT '备注(仅自己)' ,
MODIFY COLUMN customer_remark VARCHAR ( 1000 ) NULL COMMENT '备注(客户)' ,
MODIFY COLUMN warehouse_remark VARCHAR ( 1000 ) NULL COMMENT '备注(仓库)' ,
MODIFY COLUMN source_event_id VARCHAR ( 128 ) NOT NULL COMMENT '来源事件 ID' ,
MODIFY COLUMN source_loading_plan_id VARCHAR ( 128 ) NOT NULL COMMENT '来源装柜计划 ID' ,
MODIFY COLUMN source_loading_plan_version BIGINT NULL COMMENT '来源装柜计划版本' ,
MODIFY COLUMN source_handover_version BIGINT NULL COMMENT '交接版本' ,
MODIFY COLUMN source_payload_hash VARCHAR ( 71 ) NOT NULL COMMENT '来源事件负载摘要' ,
MODIFY COLUMN created_at DATETIME ( 3 ) NOT NULL DEFAULT CURRENT_TIMESTAMP ( 3 ) COMMENT '创建时间' ,
MODIFY COLUMN updated_at DATETIME ( 3 ) NOT NULL DEFAULT CURRENT_TIMESTAMP ( 3 ) ON UPDATE CURRENT_TIMESTAMP ( 3 ) COMMENT '更新时间' ;
-- Existing installations: convert the row identity to an assigned Snowflake ID and
-- make order_no a container/loading-plan grouping number rather than a row-unique key.
SET @ ll_add_transfer_warehouse_id = (
SELECT IF ( COUNT ( * ) = 0 ,
'ALTER TABLE ll_order ADD COLUMN transfer_warehouse_id VARCHAR(128) NULL COMMENT ''转入目的仓ID'' AFTER overseas_warehouse_name' ,
'SELECT 1' )
FROM information_schema . columns
WHERE table_schema = DATABASE () AND table_name = 'll_order'
AND column_name = 'transfer_warehouse_id'
);
PREPARE ll_add_transfer_warehouse_id_stmt FROM @ ll_add_transfer_warehouse_id ;
EXECUTE ll_add_transfer_warehouse_id_stmt ;
DEALLOCATE PREPARE ll_add_transfer_warehouse_id_stmt ;
SET @ ll_add_transfer_warehouse_code = (
SELECT IF ( COUNT ( * ) = 0 ,
'ALTER TABLE ll_order ADD COLUMN transfer_warehouse_code VARCHAR(128) NULL COMMENT ''转入目的仓编码'' AFTER transfer_warehouse_id' ,
'SELECT 1' )
FROM information_schema . columns
WHERE table_schema = DATABASE () AND table_name = 'll_order'
AND column_name = 'transfer_warehouse_code'
);
PREPARE ll_add_transfer_warehouse_code_stmt FROM @ ll_add_transfer_warehouse_code ;
EXECUTE ll_add_transfer_warehouse_code_stmt ;
DEALLOCATE PREPARE ll_add_transfer_warehouse_code_stmt ;
SET @ ll_add_transfer_warehouse_name = (
SELECT IF ( COUNT ( * ) = 0 ,
'ALTER TABLE ll_order ADD COLUMN transfer_warehouse_name VARCHAR(255) NULL COMMENT ''转入目的仓名称'' AFTER transfer_warehouse_code' ,
'SELECT 1' )
FROM information_schema . columns
WHERE table_schema = DATABASE () AND table_name = 'll_order'
AND column_name = 'transfer_warehouse_name'
);
PREPARE ll_add_transfer_warehouse_name_stmt FROM @ ll_add_transfer_warehouse_name ;
EXECUTE ll_add_transfer_warehouse_name_stmt ;
DEALLOCATE PREPARE ll_add_transfer_warehouse_name_stmt ;
ALTER TABLE ll_order
MODIFY COLUMN transfer_warehouse_id VARCHAR ( 128 ) NULL COMMENT '转入目的仓ID' ,
MODIFY COLUMN transfer_warehouse_code VARCHAR ( 128 ) NULL COMMENT '转入目的仓编码' ,
MODIFY COLUMN transfer_warehouse_name VARCHAR ( 255 ) NULL COMMENT '转入目的仓名称' ;
SET @ ll_drop_order_no_unique = (
SELECT IF ( COUNT ( * ) > 0 ,
'ALTER TABLE ll_order DROP INDEX uk_ll_order_no' ,
'SELECT 1' )
FROM information_schema . statistics
WHERE table_schema = DATABASE () AND table_name = 'll_order'
AND index_name = 'uk_ll_order_no' AND non_unique = 0
);
PREPARE ll_drop_order_no_unique_stmt FROM @ ll_drop_order_no_unique ;
EXECUTE ll_drop_order_no_unique_stmt ;
DEALLOCATE PREPARE ll_drop_order_no_unique_stmt ;
SET @ ll_add_order_group_index = (
SELECT IF ( COUNT ( * ) = 0 ,
2026-08-18 11:39:40 +08:00
'CREATE INDEX idx_ll_order_group ON ll_order(customer_id,order_no)' ,
2026-08-17 09:18:03 +08:00
'SELECT 1' )
FROM information_schema . statistics
WHERE table_schema = DATABASE () AND table_name = 'll_order'
AND index_name = 'idx_ll_order_group'
);
PREPARE ll_add_order_group_index_stmt FROM @ ll_add_order_group_index ;
EXECUTE ll_add_order_group_index_stmt ;
DEALLOCATE PREPARE ll_add_order_group_index_stmt ;
ALTER TABLE ll_order_detail
MODIFY COLUMN id BIGINT NOT NULL AUTO_INCREMENT COMMENT '订单明细主键' ,
MODIFY COLUMN order_id BIGINT NOT NULL COMMENT '尾程订单 ID' ,
MODIFY COLUMN source_inbound_detail_id VARCHAR ( 128 ) NOT NULL COMMENT '来源入仓明细 ID' ,
MODIFY COLUMN sku_code VARCHAR ( 128 ) NULL COMMENT 'SKU 编码' ,
MODIFY COLUMN product_name_zh VARCHAR ( 255 ) NULL COMMENT '中文品名' ,
MODIFY COLUMN product_name_en VARCHAR ( 255 ) NULL COMMENT '英文品名' ,
MODIFY COLUMN package_count INT NOT NULL DEFAULT 0 COMMENT '箱数' ,
MODIFY COLUMN product_quantity INT NULL COMMENT '数量' ,
MODIFY COLUMN pallet_count INT NULL COMMENT '托数' ,
MODIFY COLUMN gross_weight_kg DECIMAL ( 18 , 4 ) NULL COMMENT '毛重(千克)' ,
MODIFY COLUMN net_weight_kg DECIMAL ( 18 , 4 ) NULL COMMENT '净重(千克)' ,
MODIFY COLUMN dimensional_weight_kg DECIMAL ( 18 , 4 ) NULL COMMENT '体积重量(千克)' ,
MODIFY COLUMN volume_cbm DECIMAL ( 18 , 4 ) NULL COMMENT '体积(立方米)' ,
MODIFY COLUMN destination_warehouse_id VARCHAR ( 128 ) NULL COMMENT '目的仓 ID' ,
MODIFY COLUMN destination_warehouse_code VARCHAR ( 128 ) NULL COMMENT '目的仓编码' ,
MODIFY COLUMN destination_warehouse_name VARCHAR ( 255 ) NULL COMMENT '目的仓名称' ,
MODIFY COLUMN fba_tracking_no VARCHAR ( 255 ) NULL COMMENT 'FBA跟踪号' ,
MODIFY COLUMN shipment_no VARCHAR ( 255 ) NULL COMMENT '货件编号' ,
MODIFY COLUMN shipping_mark VARCHAR ( 255 ) NULL COMMENT '唛头' ;
CREATE TABLE IF NOT EXISTS ll_inbound_plan (
id BIGINT NOT NULL COMMENT '入库计划ID(雪花ID) ' ,
plan_no VARCHAR ( 32 ) NOT NULL COMMENT '入库单号' ,
2026-08-18 11:39:40 +08:00
customer_id VARCHAR ( 128 ) NOT NULL COMMENT '租户/客户账号标识' ,
2026-08-17 09:18:03 +08:00
container_no VARCHAR ( 64 ) NOT NULL COMMENT '集装箱号' ,
status VARCHAR ( 32 ) NOT NULL DEFAULT 'PLANNED' COMMENT '入库计划状态' ,
line_count INT NOT NULL DEFAULT 0 COMMENT '入仓码明细数量' ,
pallet_count INT NOT NULL DEFAULT 0 COMMENT '系统自动分配托盘数量' ,
total_volume_cbm DECIMAL ( 18 , 4 ) NOT NULL DEFAULT 0 COMMENT '集装箱总体积(立方米)' ,
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_inbound_plan_no ( plan_no ),
2026-08-18 11:39:40 +08:00
UNIQUE KEY uk_ll_inbound_plan_container ( customer_id , container_no )
2026-08-17 09:18:03 +08:00
) ENGINE = InnoDB COMMENT = '尾程入库计划表:每个租户的每个集装箱生成一张入库单' ;
CREATE TABLE IF NOT EXISTS ll_inbound_plan_line (
id BIGINT NOT NULL COMMENT '入库计划明细ID(雪花ID) ' ,
plan_id BIGINT NOT NULL COMMENT '入库计划ID' ,
order_id BIGINT NOT NULL COMMENT '尾程订单ID' ,
inbound_code VARCHAR ( 128 ) NOT NULL COMMENT '头程入仓码快照' ,
destination_warehouse_id VARCHAR ( 128 ) NULL COMMENT '目的仓ID快照' ,
destination_warehouse_code VARCHAR ( 128 ) NULL COMMENT '目的仓编码快照' ,
destination_warehouse_name VARCHAR ( 255 ) NULL COMMENT '目的仓名称快照' ,
volume_cbm DECIMAL ( 18 , 4 ) NOT NULL DEFAULT 0 COMMENT '入仓码体积(立方米)' ,
planned_pallet_count INT NOT NULL DEFAULT 0 COMMENT '该明细分配的托盘数量' ,
PRIMARY KEY ( id ),
UNIQUE KEY uk_ll_inbound_line_order ( plan_id , order_id ),
KEY idx_ll_inbound_line_plan ( plan_id )
) ENGINE = InnoDB COMMENT = '尾程入库计划明细表:按入仓码和尾程订单维度记录' ;
CREATE TABLE IF NOT EXISTS ll_inbound_plan_pallet (
id BIGINT NOT NULL COMMENT '计划托盘ID(雪花ID) ' ,
plan_id BIGINT NOT NULL COMMENT '入库计划ID' ,
pallet_no VARCHAR ( 64 ) NOT NULL COMMENT '计划托盘编号' ,
destination_warehouse_id VARCHAR ( 128 ) NULL COMMENT '目的仓ID快照' ,
destination_warehouse_code VARCHAR ( 128 ) NULL COMMENT '目的仓编码快照' ,
destination_warehouse_name VARCHAR ( 255 ) NULL COMMENT '目的仓名称快照' ,
capacity_cbm DECIMAL ( 18 , 4 ) NOT NULL DEFAULT 2 . 0000 COMMENT '托盘容量,固定为2立方米' ,
allocated_volume_cbm DECIMAL ( 18 , 4 ) NOT NULL DEFAULT 0 COMMENT '已分配体积(立方米)' ,
sequence_no INT NOT NULL COMMENT '计划内托盘序号' ,
PRIMARY KEY ( id ),
UNIQUE KEY uk_ll_inbound_pallet_no ( pallet_no ),
UNIQUE KEY uk_ll_inbound_pallet_sequence ( plan_id , sequence_no ),
KEY idx_ll_inbound_pallet_plan ( plan_id )
) ENGINE = InnoDB COMMENT = '尾程入库计划托盘表:按目的仓隔离合托' ;
CREATE TABLE IF NOT EXISTS ll_inbound_plan_pallet_allocation (
id BIGINT NOT NULL COMMENT '托盘分配记录ID(雪花ID) ' ,
plan_id BIGINT NOT NULL COMMENT '入库计划ID' ,
line_id BIGINT NOT NULL COMMENT '入库计划明细ID' ,
pallet_id BIGINT NOT NULL COMMENT '计划托盘ID' ,
allocated_volume_cbm DECIMAL ( 18 , 4 ) NOT NULL COMMENT '该明细分配到托盘的体积(立方米)' ,
PRIMARY KEY ( id ),
UNIQUE KEY uk_ll_inbound_allocation ( line_id , pallet_id ),
KEY idx_ll_inbound_allocation_plan ( plan_id ),
KEY idx_ll_inbound_allocation_pallet ( pallet_id )
) ENGINE = InnoDB COMMENT = '尾程入库计划托盘分配表:记录入仓码明细与计划托盘的分配关系' ;
-- 修复既有入库计划表中的英文注释。
ALTER TABLE ll_inbound_plan COMMENT = '尾程入库计划表:每个租户的每个集装箱生成一张入库单' ;
ALTER TABLE ll_inbound_plan
MODIFY COLUMN id BIGINT NOT NULL COMMENT '入库计划ID(雪花ID) ' ,
MODIFY COLUMN plan_no VARCHAR ( 32 ) NOT NULL COMMENT '入库单号' ,
2026-08-18 11:39:40 +08:00
MODIFY COLUMN customer_id VARCHAR ( 128 ) NOT NULL COMMENT '租户/客户账号标识' ,
2026-08-17 09:18:03 +08:00
MODIFY COLUMN container_no VARCHAR ( 64 ) NOT NULL COMMENT '集装箱号' ,
MODIFY COLUMN status VARCHAR ( 32 ) NOT NULL DEFAULT 'PLANNED' COMMENT '入库计划状态' ,
MODIFY COLUMN line_count INT NOT NULL DEFAULT 0 COMMENT '入仓码明细数量' ,
MODIFY COLUMN pallet_count INT NOT NULL DEFAULT 0 COMMENT '系统自动分配托盘数量' ,
MODIFY COLUMN total_volume_cbm DECIMAL ( 18 , 4 ) NOT NULL DEFAULT 0 COMMENT '集装箱总体积(立方米)' ,
MODIFY COLUMN created_at DATETIME ( 3 ) NOT NULL DEFAULT CURRENT_TIMESTAMP ( 3 ) COMMENT '创建时间' ,
MODIFY COLUMN updated_at DATETIME ( 3 ) NOT NULL DEFAULT CURRENT_TIMESTAMP ( 3 ) ON UPDATE CURRENT_TIMESTAMP ( 3 ) COMMENT '更新时间' ;
ALTER TABLE ll_inbound_plan_line COMMENT = '尾程入库计划明细表:按入仓码和尾程订单维度记录' ;
ALTER TABLE ll_inbound_plan_line
MODIFY COLUMN id BIGINT NOT NULL COMMENT '入库计划明细ID(雪花ID) ' ,
MODIFY COLUMN plan_id BIGINT NOT NULL COMMENT '入库计划ID' ,
MODIFY COLUMN order_id BIGINT NOT NULL COMMENT '尾程订单ID' ,
MODIFY COLUMN inbound_code VARCHAR ( 128 ) NOT NULL COMMENT '头程入仓码快照' ,
MODIFY COLUMN destination_warehouse_id VARCHAR ( 128 ) NULL COMMENT '目的仓ID快照' ,
MODIFY COLUMN destination_warehouse_code VARCHAR ( 128 ) NULL COMMENT '目的仓编码快照' ,
MODIFY COLUMN destination_warehouse_name VARCHAR ( 255 ) NULL COMMENT '目的仓名称快照' ,
MODIFY COLUMN volume_cbm DECIMAL ( 18 , 4 ) NOT NULL DEFAULT 0 COMMENT '入仓码体积(立方米)' ,
MODIFY COLUMN planned_pallet_count INT NOT NULL DEFAULT 0 COMMENT '该明细分配的托盘数量' ;
ALTER TABLE ll_inbound_plan_pallet COMMENT = '尾程入库计划托盘表:按目的仓隔离合托' ;
ALTER TABLE ll_inbound_plan_pallet
MODIFY COLUMN id BIGINT NOT NULL COMMENT '计划托盘ID(雪花ID) ' ,
MODIFY COLUMN plan_id BIGINT NOT NULL COMMENT '入库计划ID' ,
MODIFY COLUMN pallet_no VARCHAR ( 64 ) NOT NULL COMMENT '计划托盘编号' ,
MODIFY COLUMN destination_warehouse_id VARCHAR ( 128 ) NULL COMMENT '目的仓ID快照' ,
MODIFY COLUMN destination_warehouse_code VARCHAR ( 128 ) NULL COMMENT '目的仓编码快照' ,
MODIFY COLUMN destination_warehouse_name VARCHAR ( 255 ) NULL COMMENT '目的仓名称快照' ,
MODIFY COLUMN capacity_cbm DECIMAL ( 18 , 4 ) NOT NULL DEFAULT 2 . 0000 COMMENT '托盘容量,固定为2立方米' ,
MODIFY COLUMN allocated_volume_cbm DECIMAL ( 18 , 4 ) NOT NULL DEFAULT 0 COMMENT '已分配体积(立方米)' ,
MODIFY COLUMN sequence_no INT NOT NULL COMMENT '计划内托盘序号' ;
ALTER TABLE ll_inbound_plan_pallet_allocation COMMENT = '尾程入库计划托盘分配表:记录入仓码明细与计划托盘的分配关系' ;
ALTER TABLE ll_inbound_plan_pallet_allocation
MODIFY COLUMN id BIGINT NOT NULL COMMENT '托盘分配记录ID(雪花ID) ' ,
MODIFY COLUMN plan_id BIGINT NOT NULL COMMENT '入库计划ID' ,
MODIFY COLUMN line_id BIGINT NOT NULL COMMENT '入库计划明细ID' ,
MODIFY COLUMN pallet_id BIGINT NOT NULL COMMENT '计划托盘ID' ,
MODIFY COLUMN allocated_volume_cbm DECIMAL ( 18 , 4 ) NOT NULL COMMENT '该明细分配到托盘的体积(立方米)' ;
-- Additive inbound picking schema. Guarded statements preserve existing rows on restart.
ALTER TABLE ll_inbound_plan MODIFY COLUMN status VARCHAR ( 32 ) NOT NULL DEFAULT 'PENDING_ASSIGNMENT' ;
SET @ ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_inbound_plan_line' AND column_name = 'required_package_count' ), 'SELECT 1' , 'ALTER TABLE ll_inbound_plan_line ADD COLUMN required_package_count INT NOT NULL DEFAULT 0' ));
PREPARE inbound_schema_stmt FROM @ ddl ; EXECUTE inbound_schema_stmt ; DEALLOCATE PREPARE inbound_schema_stmt ;
SET @ ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_inbound_plan_pallet' AND column_name = 'warehouse_pallet_id' ), 'SELECT 1' , 'ALTER TABLE ll_inbound_plan_pallet ADD COLUMN warehouse_pallet_id BIGINT NULL' ));
PREPARE inbound_schema_stmt FROM @ ddl ; EXECUTE inbound_schema_stmt ; DEALLOCATE PREPARE inbound_schema_stmt ;
SET @ ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_inbound_plan_pallet' AND column_name = 'warehouse_location_id' ), 'SELECT 1' , 'ALTER TABLE ll_inbound_plan_pallet ADD COLUMN warehouse_location_id BIGINT NULL' ));
PREPARE inbound_schema_stmt FROM @ ddl ; EXECUTE inbound_schema_stmt ; DEALLOCATE PREPARE inbound_schema_stmt ;
SET @ ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_inbound_plan_pallet' AND column_name = 'warehouse_resource_lock_id' ), 'SELECT 1' , 'ALTER TABLE ll_inbound_plan_pallet ADD COLUMN warehouse_resource_lock_id BIGINT NULL' ));
PREPARE inbound_schema_stmt FROM @ ddl ; EXECUTE inbound_schema_stmt ; DEALLOCATE PREPARE inbound_schema_stmt ;
SET @ ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_inbound_plan_pallet' AND column_name = 'assignment_status' ), 'SELECT 1' , 'ALTER TABLE ll_inbound_plan_pallet ADD COLUMN assignment_status VARCHAR(32) NOT NULL DEFAULT ''UNASSIGNED''' ));
PREPARE inbound_schema_stmt FROM @ ddl ; EXECUTE inbound_schema_stmt ; DEALLOCATE PREPARE inbound_schema_stmt ;
SET @ ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_inbound_plan_pallet' AND column_name = 'locked_at' ), 'SELECT 1' , 'ALTER TABLE ll_inbound_plan_pallet ADD COLUMN locked_at DATETIME(3) NULL' ));
PREPARE inbound_schema_stmt FROM @ ddl ; EXECUTE inbound_schema_stmt ; DEALLOCATE PREPARE inbound_schema_stmt ;
SET @ ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_inbound_plan_pallet' AND column_name = 'actual_volume_cbm' ), 'SELECT 1' , 'ALTER TABLE ll_inbound_plan_pallet ADD COLUMN actual_volume_cbm DECIMAL(18,4) NOT NULL DEFAULT 0' ));
PREPARE inbound_schema_stmt FROM @ ddl ; EXECUTE inbound_schema_stmt ; DEALLOCATE PREPARE inbound_schema_stmt ;
SET @ ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_inbound_plan_pallet' AND column_name = 'actual_package_count' ), 'SELECT 1' , 'ALTER TABLE ll_inbound_plan_pallet ADD COLUMN actual_package_count INT NOT NULL DEFAULT 0' ));
PREPARE inbound_schema_stmt FROM @ ddl ; EXECUTE inbound_schema_stmt ; DEALLOCATE PREPARE inbound_schema_stmt ;
SET @ ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_inbound_plan_pallet_allocation' AND column_name = 'planned_package_count' ), 'SELECT 1' , 'ALTER TABLE ll_inbound_plan_pallet_allocation ADD COLUMN planned_package_count INT NOT NULL DEFAULT 0' ));
PREPARE inbound_schema_stmt FROM @ ddl ; EXECUTE inbound_schema_stmt ; DEALLOCATE PREPARE inbound_schema_stmt ;
SET @ ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_inbound_plan_pallet_allocation' AND column_name = 'counted_package_count' ), 'SELECT 1' , 'ALTER TABLE ll_inbound_plan_pallet_allocation ADD COLUMN counted_package_count INT NOT NULL DEFAULT 0' ));
PREPARE inbound_schema_stmt FROM @ ddl ; EXECUTE inbound_schema_stmt ; DEALLOCATE PREPARE inbound_schema_stmt ;
SET @ ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_inbound_plan_pallet_allocation' AND column_name = 'picked_package_count' ), 'SELECT 1' , 'ALTER TABLE ll_inbound_plan_pallet_allocation ADD COLUMN picked_package_count INT NOT NULL DEFAULT 0' ));
PREPARE inbound_schema_stmt FROM @ ddl ; EXECUTE inbound_schema_stmt ; DEALLOCATE PREPARE inbound_schema_stmt ;
SET @ ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_inbound_plan_pallet_allocation' AND column_name = 'actual_volume_cbm' ), 'SELECT 1' , 'ALTER TABLE ll_inbound_plan_pallet_allocation ADD COLUMN actual_volume_cbm DECIMAL(18,4) NOT NULL DEFAULT 0' ));
PREPARE inbound_schema_stmt FROM @ ddl ; EXECUTE inbound_schema_stmt ; DEALLOCATE PREPARE inbound_schema_stmt ;
SET @ ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_inbound_plan_pallet_allocation' AND column_name = 'status' ), 'SELECT 1' , 'ALTER TABLE ll_inbound_plan_pallet_allocation ADD COLUMN status VARCHAR(32) NOT NULL DEFAULT ''PENDING_COUNT''' ));
PREPARE inbound_schema_stmt FROM @ ddl ; EXECUTE inbound_schema_stmt ; DEALLOCATE PREPARE inbound_schema_stmt ;
SET @ ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_inbound_plan_pallet_allocation' AND column_name = 'version' ), 'SELECT 1' , 'ALTER TABLE ll_inbound_plan_pallet_allocation ADD COLUMN version INT NOT NULL DEFAULT 0' ));
PREPARE inbound_schema_stmt FROM @ ddl ; EXECUTE inbound_schema_stmt ; DEALLOCATE PREPARE inbound_schema_stmt ;
CREATE TABLE IF NOT EXISTS ll_inbound_pda_task (
2026-08-18 11:39:40 +08:00
id BIGINT NOT NULL , customer_id VARCHAR ( 128 ) NOT NULL , plan_id BIGINT NOT NULL ,
2026-08-17 09:18:03 +08:00
task_no VARCHAR ( 64 ) NOT NULL , status VARCHAR ( 32 ) NOT NULL DEFAULT 'PENDING' ,
operator_id VARCHAR ( 128 ) NULL , operator_name VARCHAR ( 255 ) NULL ,
pushed_at DATETIME ( 3 ) NULL , started_at DATETIME ( 3 ) NULL , completed_at DATETIME ( 3 ) NULL ,
version INT NOT NULL DEFAULT 0 , created_at DATETIME ( 3 ) NOT NULL DEFAULT CURRENT_TIMESTAMP ( 3 ),
updated_at DATETIME ( 3 ) NOT NULL DEFAULT CURRENT_TIMESTAMP ( 3 ) ON UPDATE CURRENT_TIMESTAMP ( 3 ),
2026-08-18 11:39:40 +08:00
PRIMARY KEY ( id ), UNIQUE KEY uk_ll_inbound_pda_task_plan ( customer_id , plan_id ),
2026-08-17 09:18:03 +08:00
UNIQUE KEY uk_ll_inbound_pda_task_no ( task_no )
) ENGINE = InnoDB ;
CREATE TABLE IF NOT EXISTS ll_inbound_pda_operation (
2026-08-18 11:39:40 +08:00
id BIGINT NOT NULL , customer_id VARCHAR ( 128 ) NOT NULL , task_id BIGINT NOT NULL ,
2026-08-17 09:18:03 +08:00
allocation_id BIGINT NULL , action VARCHAR ( 32 ) NOT NULL , idempotency_key VARCHAR ( 255 ) NOT NULL ,
request_hash VARCHAR ( 128 ) NOT NULL , request_json LONGTEXT NOT NULL , result_json LONGTEXT NOT NULL ,
created_at DATETIME ( 3 ) NOT NULL DEFAULT CURRENT_TIMESTAMP ( 3 ),
2026-08-18 11:39:40 +08:00
PRIMARY KEY ( id ), UNIQUE KEY uk_ll_inbound_pda_operation_key ( customer_id , idempotency_key ),
2026-08-17 09:18:03 +08:00
KEY idx_ll_inbound_pda_operation_task ( task_id ), KEY idx_ll_inbound_pda_operation_allocation ( allocation_id )
) ENGINE = InnoDB ;
CREATE TABLE IF NOT EXISTS ll_inbound_pallet_merge (
2026-08-18 11:39:40 +08:00
id BIGINT NOT NULL , customer_id VARCHAR ( 128 ) NOT NULL , task_id BIGINT NOT NULL ,
2026-08-17 09:18:03 +08:00
merge_group_no VARCHAR ( 64 ) NOT NULL , source_pallet_id BIGINT NOT NULL , target_pallet_id BIGINT NOT NULL ,
source_allocation_id BIGINT NOT NULL , target_allocation_id BIGINT NOT NULL ,
source_line_id BIGINT NOT NULL , target_line_id BIGINT NOT NULL ,
source_order_id BIGINT NOT NULL , target_order_id BIGINT NOT NULL ,
moved_package_count INT NOT NULL , moved_volume_cbm DECIMAL ( 18 , 4 ) NOT NULL DEFAULT 0 ,
source_pallet_scrapped TINYINT NOT NULL DEFAULT 0 , status VARCHAR ( 32 ) NOT NULL ,
created_at DATETIME ( 3 ) NOT NULL DEFAULT CURRENT_TIMESTAMP ( 3 ), PRIMARY KEY ( id ),
2026-08-18 11:39:40 +08:00
KEY idx_ll_inbound_merge_task ( customer_id , task_id ), KEY idx_ll_inbound_merge_group ( merge_group_no )
2026-08-17 09:18:03 +08:00
) ENGINE = InnoDB ;
2026-08-17 13:38:48 +08:00
SET @ ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_inbound_plan_line' AND column_name = 'fba_warehouse_code' ), 'SELECT 1' , 'ALTER TABLE ll_inbound_plan_line ADD COLUMN fba_warehouse_code VARCHAR(128) NULL AFTER inbound_code' ));
PREPARE inbound_schema_stmt FROM @ ddl ; EXECUTE inbound_schema_stmt ; DEALLOCATE PREPARE inbound_schema_stmt ;
UPDATE ll_inbound_plan_line l JOIN ll_order o ON o . id = l . order_id
SET l . fba_warehouse_code = o . fba_warehouse_code
WHERE l . fba_warehouse_code IS NULL AND o . fba_warehouse_code IS NOT NULL ;
CREATE TABLE IF NOT EXISTS ll_inbound_fba_appointment (
id BIGINT NOT NULL COMMENT 'Snowflake ID' ,
2026-08-18 11:39:40 +08:00
customer_id VARCHAR ( 128 ) NOT NULL ,
2026-08-17 13:38:48 +08:00
appointment_no VARCHAR ( 64 ) NOT NULL ,
appointment_at DATETIME ( 3 ) NOT NULL ,
appointment_status VARCHAR ( 32 ) NOT NULL DEFAULT 'PENDING' ,
appointment_remark VARCHAR ( 1000 ) NULL ,
fba_warehouse_code VARCHAR ( 128 ) NOT NULL ,
selected_count INT NOT NULL DEFAULT 0 ,
created_by VARCHAR ( 128 ) NULL ,
created_at DATETIME ( 3 ) NOT NULL DEFAULT CURRENT_TIMESTAMP ( 3 ),
updated_at DATETIME ( 3 ) NOT NULL DEFAULT CURRENT_TIMESTAMP ( 3 ) ON UPDATE CURRENT_TIMESTAMP ( 3 ),
PRIMARY KEY ( id ),
2026-08-18 11:39:40 +08:00
UNIQUE KEY uk_ll_fba_appointment_no ( customer_id , appointment_no ),
KEY idx_ll_fba_appointment_list ( customer_id , appointment_status , fba_warehouse_code , created_at )
2026-08-17 13:38:48 +08:00
) ENGINE = InnoDB COMMENT = 'Batch FBA appointment' ;
CREATE TABLE IF NOT EXISTS ll_inbound_fba_appointment_item (
id BIGINT NOT NULL COMMENT 'Snowflake ID' ,
appointment_id BIGINT NOT NULL ,
plan_id BIGINT NOT NULL ,
line_id BIGINT NOT NULL ,
order_id BIGINT NOT NULL ,
inbound_code VARCHAR ( 128 ) NOT NULL ,
fba_warehouse_code VARCHAR ( 128 ) NOT NULL ,
created_at DATETIME ( 3 ) NOT NULL DEFAULT CURRENT_TIMESTAMP ( 3 ),
PRIMARY KEY ( id ),
UNIQUE KEY uk_ll_fba_appointment_item_line ( appointment_id , line_id ),
KEY idx_ll_fba_appointment_item_plan ( plan_id ),
KEY idx_ll_fba_appointment_item_order ( order_id )
) ENGINE = InnoDB COMMENT = 'FBA appointment line snapshot' ;
2026-08-17 09:18:03 +08:00
ALTER TABLE ll_loading_order_status_history
MODIFY COLUMN id BIGINT NOT NULL AUTO_INCREMENT COMMENT '状态历史主键' ,
MODIFY COLUMN order_id BIGINT NOT NULL COMMENT '尾程订单 ID' ,
MODIFY COLUMN from_status VARCHAR ( 32 ) NULL COMMENT '变更前状态' ,
MODIFY COLUMN to_status VARCHAR ( 32 ) NOT NULL COMMENT '变更后状态' ,
MODIFY COLUMN event_id VARCHAR ( 128 ) NULL COMMENT '触发事件 ID' ,
MODIFY COLUMN remark VARCHAR ( 500 ) NULL COMMENT '状态变更备注' ,
MODIFY COLUMN created_at DATETIME ( 3 ) NOT NULL DEFAULT CURRENT_TIMESTAMP ( 3 ) COMMENT '记录时间' ;
2026-08-17 13:38:48 +08:00
CREATE TABLE IF NOT EXISTS ll_inventory_balance (
id BIGINT NOT NULL COMMENT 'Snowflake ID' ,
2026-08-18 11:39:40 +08:00
customer_id VARCHAR ( 128 ) NOT NULL COMMENT 'Customer tenant' , customer_name VARCHAR ( 255 ) NULL COMMENT 'Customer name snapshot' ,
2026-08-17 13:38:48 +08:00
overseas_warehouse_id VARCHAR ( 128 ) NOT NULL COMMENT 'Actual overseas warehouse ID' ,
overseas_warehouse_code VARCHAR ( 128 ) NULL COMMENT 'Actual overseas warehouse code snapshot' ,
overseas_warehouse_name VARCHAR ( 255 ) NULL COMMENT 'Actual overseas warehouse name snapshot' ,
destination_warehouse_id VARCHAR ( 128 ) NULL COMMENT 'Customer destination warehouse ID snapshot' ,
destination_warehouse_code VARCHAR ( 128 ) NOT NULL DEFAULT '' COMMENT 'Customer destination warehouse code snapshot' ,
destination_warehouse_name VARCHAR ( 255 ) NULL COMMENT 'Customer destination warehouse name snapshot' ,
2026-08-17 19:04:58 +08:00
inbound_order_id BIGINT NOT NULL COMMENT 'Inbound order ID' ,
inbound_order_no VARCHAR ( 128 ) NULL COMMENT 'Inbound order number snapshot' ,
inbound_code VARCHAR ( 128 ) NOT NULL COMMENT 'Inbound code snapshot' ,
2026-08-17 13:38:48 +08:00
available_packages BIGINT NOT NULL DEFAULT 0 , hold_packages BIGINT NOT NULL DEFAULT 0 ,
allocated_packages BIGINT NOT NULL DEFAULT 0 , picked_packages BIGINT NOT NULL DEFAULT 0 ,
in_transit_packages BIGINT NOT NULL DEFAULT 0 , receiving_packages BIGINT NOT NULL DEFAULT 0 ,
procurement_packages BIGINT NOT NULL DEFAULT 0 ,
version BIGINT NOT NULL DEFAULT 0 COMMENT 'Optimistic lock version' ,
created_at DATETIME ( 3 ) NOT NULL DEFAULT CURRENT_TIMESTAMP ( 3 ),
updated_at DATETIME ( 3 ) NOT NULL DEFAULT CURRENT_TIMESTAMP ( 3 ) ON UPDATE CURRENT_TIMESTAMP ( 3 ),
PRIMARY KEY ( id ),
2026-08-18 11:39:40 +08:00
UNIQUE KEY uk_ll_inventory_dimension ( customer_id , overseas_warehouse_id , destination_warehouse_code , inbound_order_id , inbound_code ),
KEY idx_ll_inventory_list ( customer_id , overseas_warehouse_id , updated_at ),
KEY idx_ll_inventory_inbound ( customer_id , inbound_code )
2026-08-17 19:04:58 +08:00
) ENGINE = InnoDB COMMENT = 'Real-time inbound-order package inventory balance' ;
2026-08-17 13:38:48 +08:00
CREATE TABLE IF NOT EXISTS ll_inventory_position (
2026-08-18 11:39:40 +08:00
id BIGINT NOT NULL COMMENT 'Snowflake ID' , customer_id VARCHAR ( 128 ) NOT NULL , balance_id BIGINT NOT NULL ,
2026-08-17 13:38:48 +08:00
overseas_warehouse_id VARCHAR ( 128 ) NOT NULL , destination_warehouse_code VARCHAR ( 128 ) NOT NULL DEFAULT '' ,
2026-08-17 19:04:58 +08:00
pallet_id BIGINT NOT NULL , pallet_no VARCHAR ( 64 ) NOT NULL ,
2026-08-17 13:38:48 +08:00
batch_no VARCHAR ( 128 ) NOT NULL DEFAULT '' , warehouse_location_id BIGINT NULL ,
warehouse_location_code VARCHAR ( 128 ) NOT NULL COMMENT 'Informational default location code' ,
available_packages BIGINT NOT NULL DEFAULT 0 , hold_packages BIGINT NOT NULL DEFAULT 0 ,
allocated_packages BIGINT NOT NULL DEFAULT 0 , picked_packages BIGINT NOT NULL DEFAULT 0 ,
2026-08-17 19:04:58 +08:00
receiving_packages BIGINT NOT NULL DEFAULT 0 ,
2026-08-17 13:38:48 +08:00
status VARCHAR ( 32 ) NOT NULL DEFAULT 'ACTIVE' , version BIGINT NOT NULL DEFAULT 0 ,
created_at DATETIME ( 3 ) NOT NULL DEFAULT CURRENT_TIMESTAMP ( 3 ),
updated_at DATETIME ( 3 ) NOT NULL DEFAULT CURRENT_TIMESTAMP ( 3 ) ON UPDATE CURRENT_TIMESTAMP ( 3 ),
PRIMARY KEY ( id ), UNIQUE KEY uk_ll_inventory_position ( balance_id , pallet_id , batch_no ),
2026-08-18 11:39:40 +08:00
KEY idx_ll_inventory_position_pallet ( customer_id , pallet_id ),
KEY idx_ll_inventory_position_location ( customer_id , overseas_warehouse_id , warehouse_location_code )
2026-08-17 19:04:58 +08:00
) ENGINE = InnoDB COMMENT = 'Inbound-order package stock by pallet, default location and batch' ;
2026-08-17 13:38:48 +08:00
CREATE TABLE IF NOT EXISTS ll_inventory_ledger (
2026-08-18 11:39:40 +08:00
id BIGINT NOT NULL COMMENT 'Snowflake ID' , customer_id VARCHAR ( 128 ) NOT NULL ,
2026-08-17 13:38:48 +08:00
balance_id BIGINT NOT NULL , position_id BIGINT NULL , overseas_warehouse_id VARCHAR ( 128 ) NOT NULL ,
2026-08-17 19:04:58 +08:00
destination_warehouse_code VARCHAR ( 128 ) NOT NULL DEFAULT '' , inbound_order_id BIGINT NOT NULL ,
2026-08-17 13:38:48 +08:00
pallet_id BIGINT NULL , pallet_no VARCHAR ( 64 ) NULL , batch_no VARCHAR ( 128 ) NULL ,
2026-08-18 11:39:40 +08:00
warehouse_location_code VARCHAR ( 128 ) NULL , sku_code VARCHAR ( 128 ) NULL , carton_mark VARCHAR ( 128 ) NULL , carton_packages BIGINT NULL ,
business_type VARCHAR ( 32 ) NOT NULL ,
2026-08-17 13:38:48 +08:00
business_order_id BIGINT NULL , business_order_no VARCHAR ( 128 ) NULL , inbound_code VARCHAR ( 128 ) NULL ,
inbound_order_no VARCHAR ( 128 ) NULL , outbound_order_no VARCHAR ( 128 ) NULL ,
source_event_id VARCHAR ( 128 ) NULL , idempotency_key VARCHAR ( 255 ) NOT NULL ,
status_from VARCHAR ( 32 ) NULL , status_to VARCHAR ( 32 ) NULL ,
before_packages BIGINT NOT NULL , delta_packages BIGINT NOT NULL , after_packages BIGINT NOT NULL ,
operator_id VARCHAR ( 128 ) NULL , remark VARCHAR ( 1000 ) NULL ,
occurred_at DATETIME ( 3 ) NOT NULL , created_at DATETIME ( 3 ) NOT NULL DEFAULT CURRENT_TIMESTAMP ( 3 ),
2026-08-18 11:39:40 +08:00
PRIMARY KEY ( id ), UNIQUE KEY uk_ll_inventory_ledger_idempotency ( customer_id , idempotency_key ),
KEY idx_ll_inventory_ledger_query ( customer_id , overseas_warehouse_id , occurred_at ),
KEY idx_ll_inventory_ledger_inbound ( customer_id , inbound_code , occurred_at ),
KEY idx_ll_inventory_ledger_business ( customer_id , business_type , business_order_no )
2026-08-17 19:04:58 +08:00
) ENGINE = InnoDB COMMENT = 'Immutable inbound-order package inventory ledger' ;
2026-08-17 13:38:48 +08:00
CREATE TABLE IF NOT EXISTS ll_inventory_operation (
2026-08-18 11:39:40 +08:00
id BIGINT NOT NULL COMMENT 'Snowflake ID' , customer_id VARCHAR ( 128 ) NOT NULL ,
2026-08-17 13:38:48 +08:00
idempotency_key VARCHAR ( 255 ) NOT NULL , operation_type VARCHAR ( 32 ) NOT NULL ,
request_hash VARCHAR ( 128 ) NOT NULL , status VARCHAR ( 32 ) NOT NULL DEFAULT 'PROCESSING' ,
result_json LONGTEXT NULL , last_error VARCHAR ( 2000 ) NULL ,
created_at DATETIME ( 3 ) NOT NULL DEFAULT CURRENT_TIMESTAMP ( 3 ),
updated_at DATETIME ( 3 ) NOT NULL DEFAULT CURRENT_TIMESTAMP ( 3 ) ON UPDATE CURRENT_TIMESTAMP ( 3 ),
2026-08-18 11:39:40 +08:00
PRIMARY KEY ( id ), UNIQUE KEY uk_ll_inventory_operation_key ( customer_id , idempotency_key ),
KEY idx_ll_inventory_operation_status ( customer_id , status , updated_at )
2026-08-17 13:38:48 +08:00
) ENGINE = InnoDB COMMENT = 'Inventory command idempotency record' ;
CREATE TABLE IF NOT EXISTS ll_inbound_stock_receipt (
2026-08-18 11:39:40 +08:00
id BIGINT NOT NULL COMMENT 'Snowflake ID' , customer_id VARCHAR ( 128 ) NOT NULL ,
2026-08-17 13:38:48 +08:00
plan_id BIGINT NOT NULL , task_id BIGINT NOT NULL , allocation_id BIGINT NOT NULL ,
line_id BIGINT NOT NULL , order_id BIGINT NOT NULL , inbound_code VARCHAR ( 128 ) NOT NULL ,
warehouse_pallet_id BIGINT NOT NULL , pallet_no VARCHAR ( 64 ) NOT NULL ,
warehouse_location_id BIGINT NULL , warehouse_location_code VARCHAR ( 128 ) NULL ,
2026-08-17 19:04:58 +08:00
batch_no VARCHAR ( 128 ) NOT NULL , received_packages BIGINT NOT NULL ,
2026-08-17 13:38:48 +08:00
inventory_balance_id BIGINT NOT NULL , inventory_position_id BIGINT NOT NULL ,
inventory_operation_key VARCHAR ( 255 ) NOT NULL , received_at DATETIME ( 3 ) NOT NULL ,
created_at DATETIME ( 3 ) NOT NULL DEFAULT CURRENT_TIMESTAMP ( 3 ),
2026-08-18 11:39:40 +08:00
PRIMARY KEY ( id ), UNIQUE KEY uk_ll_stock_receipt_task_allocation ( customer_id , task_id , allocation_id ),
KEY idx_ll_stock_receipt_plan ( customer_id , plan_id , line_id ), KEY idx_ll_stock_receipt_inventory ( inventory_balance_id , inventory_position_id )
2026-08-17 19:04:58 +08:00
) ENGINE = InnoDB COMMENT = 'Immutable inbound-order pallet package receipt snapshot' ;
2026-08-17 13:38:48 +08:00
CREATE TABLE IF NOT EXISTS ll_dispatch_order (
id BIGINT NOT NULL COMMENT 'Snowflake ID' ,
2026-08-18 11:39:40 +08:00
customer_id VARCHAR ( 128 ) NOT NULL ,
2026-08-17 13:38:48 +08:00
dispatch_no VARCHAR ( 64 ) NOT NULL COMMENT 'Dispatch order number' ,
2026-08-17 19:04:58 +08:00
overseas_warehouse_id VARCHAR ( 128 ) NULL COMMENT 'Overseas warehouse scope for PDA operations' ,
overseas_warehouse_name VARCHAR ( 255 ) NULL ,
2026-08-17 13:38:48 +08:00
vehicle_plate VARCHAR ( 64 ) NULL COMMENT 'Editable vehicle plate; required before PDA picking' ,
driver_name VARCHAR ( 128 ) NULL ,
driver_phone VARCHAR ( 64 ) NULL ,
carrier_name VARCHAR ( 255 ) NULL ,
route VARCHAR ( 255 ) NULL ,
depart_at DATETIME ( 3 ) NULL ,
fba_appointment_no VARCHAR ( 64 ) NULL ,
fba_appointment_status VARCHAR ( 32 ) NOT NULL DEFAULT 'PENDING' ,
vehicle_appointment_status VARCHAR ( 32 ) NOT NULL DEFAULT 'PENDING' ,
estimated_arrival_at DATETIME ( 3 ) NULL ,
status VARCHAR ( 32 ) NOT NULL DEFAULT 'PENDING_DEPARTURE' ,
item_count INT NOT NULL DEFAULT 0 ,
pallet_count INT NOT NULL DEFAULT 0 ,
package_count INT NOT NULL DEFAULT 0 ,
2026-08-17 19:04:58 +08:00
picked_package_count INT NOT NULL DEFAULT 0 COMMENT 'PDA累计已拣箱数' ,
shipped_package_count INT NOT NULL DEFAULT 0 COMMENT '累计已出库箱数' ,
partial_completion_reason VARCHAR ( 1000 ) NULL COMMENT '部分完成原因' ,
2026-08-17 13:38:48 +08:00
created_by VARCHAR ( 128 ) NULL ,
created_at DATETIME ( 3 ) NOT NULL DEFAULT CURRENT_TIMESTAMP ( 3 ),
updated_at DATETIME ( 3 ) NOT NULL DEFAULT CURRENT_TIMESTAMP ( 3 ) ON UPDATE CURRENT_TIMESTAMP ( 3 ),
PRIMARY KEY ( id ),
2026-08-18 11:39:40 +08:00
UNIQUE KEY uk_ll_dispatch_order_no ( customer_id , dispatch_no ),
KEY idx_ll_dispatch_order_list ( customer_id , status , depart_at ),
KEY idx_ll_dispatch_order_vehicle ( customer_id , vehicle_plate )
2026-08-17 13:38:48 +08:00
) ENGINE = InnoDB COMMENT = 'Last-leg pre-dispatch order' ;
CREATE TABLE IF NOT EXISTS ll_dispatch_item (
id BIGINT NOT NULL COMMENT 'Snowflake ID' ,
dispatch_order_id BIGINT NOT NULL ,
2026-08-18 11:39:40 +08:00
customer_id VARCHAR ( 128 ) NOT NULL ,
2026-08-17 13:38:48 +08:00
plan_id BIGINT NULL ,
plan_pallet_id BIGINT NULL ,
warehouse_pallet_id BIGINT NULL ,
order_id BIGINT NULL ,
order_no VARCHAR ( 64 ) NULL ,
order_refs VARCHAR ( 2000 ) NULL ,
inbound_code VARCHAR ( 128 ) NULL ,
pallet_no VARCHAR ( 128 ) NOT NULL ,
2026-08-17 19:04:58 +08:00
overseas_warehouse_id VARCHAR ( 128 ) NULL ,
overseas_warehouse_name VARCHAR ( 255 ) NULL ,
2026-08-17 13:38:48 +08:00
destination_warehouse_id VARCHAR ( 128 ) NULL ,
destination_warehouse_code VARCHAR ( 128 ) NULL ,
destination_warehouse_name VARCHAR ( 255 ) NULL ,
fba_warehouse_code VARCHAR ( 128 ) NULL ,
package_count INT NOT NULL DEFAULT 0 ,
volume_cbm DECIMAL ( 18 , 4 ) NOT NULL DEFAULT 0 ,
source_stage VARCHAR ( 32 ) NOT NULL COMMENT 'PLAN or RECEIVED' ,
created_at DATETIME ( 3 ) NOT NULL DEFAULT CURRENT_TIMESTAMP ( 3 ),
PRIMARY KEY ( id ),
UNIQUE KEY uk_ll_dispatch_item_source ( dispatch_order_id , plan_pallet_id , warehouse_pallet_id ),
2026-08-18 11:39:40 +08:00
KEY idx_ll_dispatch_item_order ( customer_id , order_id ),
KEY idx_ll_dispatch_item_inbound ( customer_id , inbound_code ),
KEY idx_ll_dispatch_item_pallet ( customer_id , plan_pallet_id , warehouse_pallet_id )
2026-08-17 13:38:48 +08:00
) ENGINE = InnoDB COMMENT = 'Frozen pallet and cargo snapshot for a dispatch order' ;
CREATE TABLE IF NOT EXISTS ll_dispatch_pallet_lock (
id BIGINT NOT NULL COMMENT 'Snowflake ID' ,
2026-08-18 11:39:40 +08:00
customer_id VARCHAR ( 128 ) NOT NULL ,
2026-08-17 13:38:48 +08:00
source_pallet_key VARCHAR ( 160 ) NOT NULL COMMENT 'PLAN:{planPalletId} or RECEIVED:{warehousePalletId}' ,
active_key VARCHAR ( 160 ) NULL COMMENT 'Equals source key only while lock is active' ,
plan_id BIGINT NULL ,
plan_pallet_id BIGINT NULL ,
warehouse_pallet_id BIGINT NULL ,
dispatch_order_id BIGINT NOT NULL ,
status VARCHAR ( 32 ) NOT NULL DEFAULT 'ACTIVE' ,
locked_at DATETIME ( 3 ) NOT NULL ,
released_at DATETIME ( 3 ) NULL ,
created_at DATETIME ( 3 ) NOT NULL DEFAULT CURRENT_TIMESTAMP ( 3 ),
updated_at DATETIME ( 3 ) NOT NULL DEFAULT CURRENT_TIMESTAMP ( 3 ) ON UPDATE CURRENT_TIMESTAMP ( 3 ),
PRIMARY KEY ( id ),
2026-08-18 11:39:40 +08:00
UNIQUE KEY uk_ll_dispatch_active_pallet ( customer_id , active_key ),
KEY idx_ll_dispatch_pallet_lock_order ( customer_id , dispatch_order_id , status ),
KEY idx_ll_dispatch_pallet_lock_source ( customer_id , source_pallet_key , status )
2026-08-17 13:38:48 +08:00
) ENGINE = InnoDB COMMENT = 'Active dispatch pallet exclusion lock' ;
SET @ ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_dispatch_item' AND column_name = 'order_refs' ), 'SELECT 1' , 'ALTER TABLE ll_dispatch_item ADD COLUMN order_refs VARCHAR(2000) NULL AFTER order_no' ));
PREPARE dispatch_schema_stmt FROM @ ddl ; EXECUTE dispatch_schema_stmt ; DEALLOCATE PREPARE dispatch_schema_stmt ;
CREATE TABLE IF NOT EXISTS ll_dispatch_pda_task (
2026-08-18 11:39:40 +08:00
id BIGINT NOT NULL , customer_id VARCHAR ( 128 ) NOT NULL , dispatch_order_id BIGINT NOT NULL ,
2026-08-17 13:38:48 +08:00
task_no VARCHAR ( 64 ) NOT NULL , status VARCHAR ( 32 ) NOT NULL , operator_id VARCHAR ( 128 ) NULL ,
2026-08-17 19:04:58 +08:00
warehouse_id VARCHAR ( 128 ) NULL COMMENT 'Selected overseas warehouse for PDA operation' ,
2026-08-17 13:38:48 +08:00
operator_name VARCHAR ( 128 ) NULL , pushed_at DATETIME ( 3 ) NOT NULL , completed_at DATETIME ( 3 ) NULL ,
created_at DATETIME ( 3 ) NOT NULL DEFAULT CURRENT_TIMESTAMP ( 3 ),
updated_at DATETIME ( 3 ) NOT NULL DEFAULT CURRENT_TIMESTAMP ( 3 ) ON UPDATE CURRENT_TIMESTAMP ( 3 ),
2026-08-18 11:39:40 +08:00
PRIMARY KEY ( id ), UNIQUE KEY uk_ll_dispatch_pda_task_dispatch ( customer_id , dispatch_order_id ),
UNIQUE KEY uk_ll_dispatch_pda_task_no ( customer_id , task_no )
2026-08-17 13:38:48 +08:00
) ENGINE = InnoDB COMMENT = 'PDA task for a pre-arranged dispatch' ;
CREATE TABLE IF NOT EXISTS ll_dispatch_pda_pick (
2026-08-18 11:39:40 +08:00
id BIGINT NOT NULL , customer_id VARCHAR ( 128 ) NOT NULL , task_id BIGINT NOT NULL ,
2026-08-17 13:38:48 +08:00
dispatch_item_id BIGINT NOT NULL , inventory_position_id BIGINT NOT NULL ,
packages BIGINT NOT NULL , product_quantity BIGINT NOT NULL DEFAULT 0 , idempotency_key VARCHAR ( 255 ) NOT NULL ,
picked_at DATETIME ( 3 ) NOT NULL , created_at DATETIME ( 3 ) NOT NULL DEFAULT CURRENT_TIMESTAMP ( 3 ),
2026-08-18 11:39:40 +08:00
PRIMARY KEY ( id ), UNIQUE KEY uk_ll_dispatch_pda_pick_key ( customer_id , idempotency_key ),
KEY idx_ll_dispatch_pda_pick_item ( customer_id , task_id , dispatch_item_id )
2026-08-17 13:38:48 +08:00
) ENGINE = InnoDB COMMENT = 'Immutable dispatch PDA pallet package picks' ;
CREATE TABLE IF NOT EXISTS ll_dispatch_pda_operation (
2026-08-18 11:39:40 +08:00
id BIGINT NOT NULL , customer_id VARCHAR ( 128 ) NOT NULL , task_id BIGINT NULL ,
2026-08-17 13:38:48 +08:00
operation_type VARCHAR ( 32 ) NOT NULL , idempotency_key VARCHAR ( 255 ) NOT NULL , request_hash CHAR ( 64 ) NOT NULL ,
result_json LONGTEXT NULL , status VARCHAR ( 32 ) NOT NULL ,
created_at DATETIME ( 3 ) NOT NULL DEFAULT CURRENT_TIMESTAMP ( 3 ),
updated_at DATETIME ( 3 ) NOT NULL DEFAULT CURRENT_TIMESTAMP ( 3 ) ON UPDATE CURRENT_TIMESTAMP ( 3 ),
2026-08-18 11:39:40 +08:00
PRIMARY KEY ( id ), UNIQUE KEY uk_ll_dispatch_pda_operation_key ( customer_id , idempotency_key )
2026-08-17 13:38:48 +08:00
) ENGINE = InnoDB COMMENT = 'Idempotent dispatch PDA operations' ;
2026-08-17 19:04:58 +08:00
CREATE TABLE IF NOT EXISTS ll_dispatch_pda_pick_order (
2026-08-18 11:39:40 +08:00
id BIGINT NOT NULL , customer_id VARCHAR ( 128 ) NOT NULL , pick_id BIGINT NOT NULL ,
2026-08-17 19:04:58 +08:00
receipt_id BIGINT NOT NULL , order_id BIGINT NOT NULL , packages BIGINT NOT NULL ,
product_quantity BIGINT NOT NULL DEFAULT 0 , created_at DATETIME ( 3 ) NOT NULL DEFAULT CURRENT_TIMESTAMP ( 3 ),
2026-08-18 11:39:40 +08:00
PRIMARY KEY ( id ), KEY idx_ll_dispatch_pick_order_pick ( customer_id , pick_id ),
KEY idx_ll_dispatch_pick_order_receipt ( customer_id , receipt_id )
2026-08-17 19:04:58 +08:00
) ENGINE = InnoDB COMMENT = 'PDA pick attribution to frozen inbound receipt and tail order' ;
-- Transfer a dispatch to delivery: one outbound header, many pallet rows, one delivery header.
CREATE TABLE IF NOT EXISTS ll_outbound_order (
2026-08-18 11:39:40 +08:00
id BIGINT NOT NULL COMMENT 'Snowflake ID' , customer_id VARCHAR ( 128 ) NOT NULL ,
2026-08-17 19:04:58 +08:00
outbound_no VARCHAR ( 64 ) NOT NULL , dispatch_order_id BIGINT NOT NULL , dispatch_no VARCHAR ( 64 ) NOT NULL ,
overseas_warehouse_id VARCHAR ( 128 ) NULL , status VARCHAR ( 32 ) NOT NULL DEFAULT 'WAIT_OUTBOUND' ,
package_count INT NOT NULL DEFAULT 0 , pallet_count INT NOT NULL DEFAULT 0 ,
idempotency_key VARCHAR ( 255 ) NOT NULL , created_by VARCHAR ( 128 ) NULL ,
created_at DATETIME ( 3 ) NOT NULL DEFAULT CURRENT_TIMESTAMP ( 3 ), updated_at DATETIME ( 3 ) NOT NULL DEFAULT CURRENT_TIMESTAMP ( 3 ) ON UPDATE CURRENT_TIMESTAMP ( 3 ),
2026-08-18 11:39:40 +08:00
PRIMARY KEY ( id ), UNIQUE KEY uk_ll_outbound_no ( customer_id , outbound_no ),
UNIQUE KEY uk_ll_outbound_idempotency ( customer_id , idempotency_key ), UNIQUE KEY uk_ll_outbound_dispatch ( customer_id , dispatch_order_id ),
KEY idx_ll_outbound_list ( customer_id , status , created_at )
2026-08-17 19:04:58 +08:00
) ENGINE = InnoDB COMMENT = 'Outbound document generated from a dispatch' ;
CREATE TABLE IF NOT EXISTS ll_outbound_pallet_item (
2026-08-18 11:39:40 +08:00
id BIGINT NOT NULL COMMENT 'Snowflake ID' , customer_id VARCHAR ( 128 ) NOT NULL , outbound_order_id BIGINT NOT NULL ,
2026-08-17 19:04:58 +08:00
warehouse_pallet_id BIGINT NOT NULL , pallet_no VARCHAR ( 128 ) NOT NULL ,
destination_warehouse_id VARCHAR ( 128 ) NULL , destination_warehouse_code VARCHAR ( 128 ) NULL , destination_warehouse_name VARCHAR ( 255 ) NULL ,
package_count INT NOT NULL DEFAULT 0 , order_refs VARCHAR ( 2000 ) NULL , inbound_code VARCHAR ( 128 ) NULL ,
created_at DATETIME ( 3 ) NOT NULL DEFAULT CURRENT_TIMESTAMP ( 3 ), PRIMARY KEY ( id ),
2026-08-18 11:39:40 +08:00
UNIQUE KEY uk_ll_outbound_pallet ( customer_id , outbound_order_id , warehouse_pallet_id ),
KEY idx_ll_outbound_pallet_list ( customer_id , outbound_order_id ), KEY idx_ll_outbound_pallet_destination ( customer_id , destination_warehouse_code )
2026-08-17 19:04:58 +08:00
) ENGINE = InnoDB COMMENT = 'Pallet detail snapshot for an outbound document' ;
CREATE TABLE IF NOT EXISTS ll_delivery_order (
2026-08-18 11:39:40 +08:00
id BIGINT NOT NULL COMMENT 'Snowflake ID' , customer_id VARCHAR ( 128 ) NOT NULL ,
2026-08-17 19:04:58 +08:00
delivery_no VARCHAR ( 64 ) NOT NULL , outbound_order_id BIGINT NOT NULL , outbound_no VARCHAR ( 64 ) NOT NULL ,
dispatch_order_id BIGINT NOT NULL , dispatch_no VARCHAR ( 64 ) NOT NULL , overseas_warehouse_id VARCHAR ( 128 ) NULL ,
status VARCHAR ( 32 ) NOT NULL DEFAULT 'WAIT_DELIVERY' , package_count INT NOT NULL DEFAULT 0 , pallet_count INT NOT NULL DEFAULT 0 ,
idempotency_key VARCHAR ( 255 ) NOT NULL , created_by VARCHAR ( 128 ) NULL ,
created_at DATETIME ( 3 ) NOT NULL DEFAULT CURRENT_TIMESTAMP ( 3 ), updated_at DATETIME ( 3 ) NOT NULL DEFAULT CURRENT_TIMESTAMP ( 3 ) ON UPDATE CURRENT_TIMESTAMP ( 3 ),
2026-08-18 11:39:40 +08:00
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 )
2026-08-17 19:04:58 +08:00
) ENGINE = InnoDB COMMENT = 'Delivery document linked to an outbound document' ;
2026-08-18 11:39:40 +08:00
-- 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 'Snowflake ID' , customer_id VARCHAR ( 128 ) NOT NULL ,
transfer_no VARCHAR ( 64 ) NOT NULL , inbound_order_id BIGINT NOT NULL , inbound_code VARCHAR ( 128 ) NOT NULL ,
lastleg_order_id BIGINT NOT NULL , lastleg_order_no VARCHAR ( 32 ) NOT NULL ,
operating_warehouse_id VARCHAR ( 128 ) NOT NULL , fba_warehouse_code VARCHAR ( 128 ) NOT NULL ,
delivery_address VARCHAR ( 1000 ) NOT NULL , package_count INT NOT NULL , delivery_method VARCHAR ( 64 ) NOT NULL ,
estimated_arrival_at DATETIME ( 3 ) NOT NULL , fba_shipment_no VARCHAR ( 128 ) NOT NULL ,
tracking_no VARCHAR ( 255 ) NULL , fba_box_nos VARCHAR ( 2000 ) NULL , remark VARCHAR ( 1000 ) NULL ,
need_relabel TINYINT NOT NULL DEFAULT 0 , relabel_application_id BIGINT NULL , relabel_no VARCHAR ( 64 ) NULL ,
status VARCHAR ( 32 ) NOT NULL DEFAULT 'PENDING_REVIEW' , idempotency_key VARCHAR ( 255 ) NOT NULL ,
request_hash CHAR ( 64 ) NOT NULL , created_by VARCHAR ( 128 ) NULL ,
created_at DATETIME ( 3 ) NOT NULL DEFAULT CURRENT_TIMESTAMP ( 3 ),
updated_at DATETIME ( 3 ) NOT NULL DEFAULT CURRENT_TIMESTAMP ( 3 ) ON UPDATE CURRENT_TIMESTAMP ( 3 ),
PRIMARY KEY ( id ), UNIQUE KEY uk_ll_wh_transfer_no ( customer_id , transfer_no ),
UNIQUE KEY uk_ll_wh_transfer_key ( customer_id , idempotency_key ),
UNIQUE KEY uk_ll_wh_transfer_tail_order ( lastleg_order_id ),
KEY idx_ll_wh_transfer_list ( customer_id , status , created_at ), KEY idx_ll_wh_transfer_inbound ( customer_id , inbound_code )
) ENGINE = InnoDB COMMENT = 'Customer warehouse transfer order' ;
CREATE TABLE IF NOT EXISTS ll_warehouse_transfer_source_order (
id BIGINT NOT NULL COMMENT 'Snowflake ID' , transfer_order_id BIGINT NOT NULL , customer_id VARCHAR ( 128 ) NOT NULL ,
source_lastleg_order_id BIGINT NOT NULL , source_lastleg_order_no VARCHAR ( 32 ) NOT NULL ,
inbound_order_id BIGINT NOT NULL , inbound_code VARCHAR ( 128 ) NOT NULL ,
created_at DATETIME ( 3 ) NOT NULL DEFAULT CURRENT_TIMESTAMP ( 3 ), PRIMARY KEY ( id ),
UNIQUE KEY uk_ll_wh_transfer_source ( transfer_order_id , source_lastleg_order_id ),
KEY idx_ll_wh_transfer_source_list ( customer_id , transfer_order_id )
) ENGINE = InnoDB COMMENT = 'Selected historical customer orders and inbound bindings' ;
CREATE TABLE IF NOT EXISTS ll_warehouse_transfer_item (
id BIGINT NOT NULL COMMENT 'Snowflake ID' , transfer_order_id BIGINT NOT NULL , customer_id VARCHAR ( 128 ) NOT NULL ,
sku_code VARCHAR ( 128 ) NOT NULL , product_name_zh VARCHAR ( 255 ) NOT NULL ,
package_count INT NOT NULL , shipping_mark VARCHAR ( 255 ) NULL ,
created_at DATETIME ( 3 ) NOT NULL DEFAULT CURRENT_TIMESTAMP ( 3 ), PRIMARY KEY ( id ),
KEY idx_ll_wh_transfer_item_list ( customer_id , transfer_order_id ), KEY idx_ll_wh_transfer_item_sku ( customer_id , sku_code )
) ENGINE = InnoDB COMMENT = 'Frozen warehouse transfer cargo items' ;
2026-08-17 19:04:58 +08:00
-- Customer relabel application: header, item snapshots, and immutable process history.
CREATE TABLE IF NOT EXISTS ll_relabel_application (
id BIGINT NOT NULL COMMENT 'Snowflake ID' ,
2026-08-18 11:39:40 +08:00
customer_id VARCHAR ( 128 ) NOT NULL ,
2026-08-17 19:04:58 +08:00
relabel_no VARCHAR ( 64 ) NOT NULL ,
lastleg_order_id BIGINT NOT NULL ,
customer_order_no VARCHAR ( 128 ) NOT NULL ,
overseas_warehouse_id VARCHAR ( 128 ) NOT NULL ,
label_deadline DATETIME ( 3 ) NOT NULL ,
contact_name VARCHAR ( 128 ) NOT NULL ,
contact_phone VARCHAR ( 64 ) NOT NULL ,
remark VARCHAR ( 1000 ) NULL ,
status VARCHAR ( 32 ) NOT NULL DEFAULT 'PENDING_PROCESSING' ,
item_count INT NOT NULL DEFAULT 0 ,
total_package_count INT NOT NULL DEFAULT 0 ,
notified_package_count INT NOT NULL DEFAULT 0 ,
idempotency_key VARCHAR ( 255 ) NOT NULL ,
request_hash CHAR ( 64 ) NOT NULL ,
created_by VARCHAR ( 128 ) NULL ,
created_at DATETIME ( 3 ) NOT NULL DEFAULT CURRENT_TIMESTAMP ( 3 ),
updated_at DATETIME ( 3 ) NOT NULL DEFAULT CURRENT_TIMESTAMP ( 3 ) ON UPDATE CURRENT_TIMESTAMP ( 3 ),
PRIMARY KEY ( id ),
2026-08-18 11:39:40 +08:00
UNIQUE KEY uk_ll_relabel_application_no ( customer_id , relabel_no ),
UNIQUE KEY uk_ll_relabel_application_idempotency ( customer_id , idempotency_key ),
2026-08-17 19:04:58 +08:00
UNIQUE KEY uk_ll_relabel_application_order ( lastleg_order_id ),
2026-08-18 11:39:40 +08:00
KEY idx_ll_relabel_application_list ( customer_id , status , created_at ),
KEY idx_ll_relabel_application_customer ( customer_id , customer_order_no ),
KEY idx_ll_relabel_application_warehouse ( customer_id , overseas_warehouse_id )
2026-08-17 19:04:58 +08:00
) ENGINE = InnoDB COMMENT = 'Customer relabel application header' ;
CREATE TABLE IF NOT EXISTS ll_relabel_item (
id BIGINT NOT NULL COMMENT 'Snowflake ID' ,
application_id BIGINT NOT NULL ,
2026-08-18 11:39:40 +08:00
customer_id VARCHAR ( 128 ) NOT NULL ,
2026-08-17 19:04:58 +08:00
sku_code VARCHAR ( 128 ) NOT NULL ,
product_image_file_id VARCHAR ( 128 ) NULL ,
product_image_file_name VARCHAR ( 255 ) NULL ,
product_image_url VARCHAR ( 1000 ) NULL ,
product_name_zh VARCHAR ( 255 ) NOT NULL ,
total_package_count INT NOT NULL ,
notified_package_count INT NOT NULL ,
shipment_no VARCHAR ( 128 ) NOT NULL ,
tracking_code VARCHAR ( 255 ) NULL ,
new_sku_code VARCHAR ( 128 ) NOT NULL ,
label_requirement VARCHAR ( 1000 ) NULL ,
relabel_file_id VARCHAR ( 128 ) NULL ,
relabel_file_name VARCHAR ( 255 ) NULL ,
relabel_file_url VARCHAR ( 1000 ) NULL ,
created_at DATETIME ( 3 ) NOT NULL DEFAULT CURRENT_TIMESTAMP ( 3 ),
PRIMARY KEY ( id ),
2026-08-18 11:39:40 +08:00
KEY idx_ll_relabel_item_application ( customer_id , application_id ),
KEY idx_ll_relabel_item_sku ( customer_id , sku_code )
2026-08-17 19:04:58 +08:00
) ENGINE = InnoDB COMMENT = 'Frozen customer relabel cargo items' ;
CREATE TABLE IF NOT EXISTS ll_relabel_status_history (
id BIGINT NOT NULL COMMENT 'Snowflake ID' ,
2026-08-18 11:39:40 +08:00
customer_id VARCHAR ( 128 ) NOT NULL ,
2026-08-17 19:04:58 +08:00
application_id BIGINT NOT NULL ,
from_status VARCHAR ( 32 ) NULL ,
to_status VARCHAR ( 32 ) NOT NULL ,
operator_id VARCHAR ( 128 ) NULL ,
remark VARCHAR ( 1000 ) NULL ,
created_at DATETIME ( 3 ) NOT NULL DEFAULT CURRENT_TIMESTAMP ( 3 ),
PRIMARY KEY ( id ),
2026-08-18 11:39:40 +08:00
KEY idx_ll_relabel_status_history_application ( customer_id , application_id , created_at )
2026-08-17 19:04:58 +08:00
) ENGINE = InnoDB COMMENT = 'Immutable customer relabel process history' ;
2026-08-18 11:39:40 +08:00
CREATE TABLE IF NOT EXISTS ll_dropship_order_profile (
id BIGINT NOT NULL , customer_id VARCHAR ( 128 ) NOT NULL , order_id BIGINT NOT NULL ,
warehouse_pallet_id BIGINT NOT NULL , pallet_no VARCHAR ( 128 ) NOT NULL ,
source_pallet_no VARCHAR ( 128 ) NOT NULL COMMENT 'Pallet number snapshot supplied by first-leg handover' ,
inventory_position_id BIGINT NULL , status VARCHAR ( 32 ) NOT NULL DEFAULT 'RECEIVED' ,
idempotency_key VARCHAR ( 255 ) NOT NULL , version BIGINT NOT NULL DEFAULT 0 ,
created_at DATETIME ( 3 ) NOT NULL DEFAULT CURRENT_TIMESTAMP ( 3 ), updated_at DATETIME ( 3 ) NOT NULL DEFAULT CURRENT_TIMESTAMP ( 3 ) ON UPDATE CURRENT_TIMESTAMP ( 3 ),
PRIMARY KEY ( id ), UNIQUE KEY uk_ll_dropship_profile_order_pallet ( customer_id , order_id , source_pallet_no ),
UNIQUE KEY uk_ll_dropship_profile_key ( customer_id , idempotency_key ), KEY idx_ll_dropship_profile_order ( customer_id , order_id )
) ENGINE = InnoDB COMMENT = 'One-click dropship pallet profile; one order may own multiple pallets' ;
CREATE TABLE IF NOT EXISTS ll_dropship_carton (
id BIGINT NOT NULL , customer_id VARCHAR ( 128 ) NOT NULL , order_id BIGINT NOT NULL , profile_id BIGINT NOT NULL ,
warehouse_pallet_id BIGINT NOT NULL , pallet_no VARCHAR ( 128 ) NOT NULL , sku_code VARCHAR ( 128 ) NOT NULL , carton_mark VARCHAR ( 128 ) NOT NULL ,
carton_sequence INT NOT NULL , status VARCHAR ( 32 ) NOT NULL DEFAULT 'AVAILABLE' , outbound_order_no VARCHAR ( 128 ) NULL ,
version BIGINT NOT NULL DEFAULT 0 , created_at DATETIME ( 3 ) NOT NULL DEFAULT CURRENT_TIMESTAMP ( 3 ), updated_at DATETIME ( 3 ) NOT NULL DEFAULT CURRENT_TIMESTAMP ( 3 ) ON UPDATE CURRENT_TIMESTAMP ( 3 ),
PRIMARY KEY ( id ), UNIQUE KEY uk_ll_dropship_carton ( customer_id , order_id , carton_mark ),
KEY idx_ll_dropship_carton_status ( customer_id , status ), KEY idx_ll_dropship_carton_sku ( customer_id , sku_code , status )
) ENGINE = InnoDB COMMENT = 'One-click dropship carton-mark identity for one SKU box' ;
CREATE TABLE IF NOT EXISTS ll_dropship_sku_inventory (
id BIGINT NOT NULL , customer_id VARCHAR ( 128 ) NOT NULL , order_id BIGINT NOT NULL , profile_id BIGINT NOT NULL ,
sku_code VARCHAR ( 128 ) NOT NULL , product_name VARCHAR ( 255 ) NULL , package_count BIGINT NOT NULL , product_quantity BIGINT NOT NULL ,
created_at DATETIME ( 3 ) NOT NULL DEFAULT CURRENT_TIMESTAMP ( 3 ), updated_at DATETIME ( 3 ) NOT NULL DEFAULT CURRENT_TIMESTAMP ( 3 ) ON UPDATE CURRENT_TIMESTAMP ( 3 ),
PRIMARY KEY ( id ), UNIQUE KEY uk_ll_dropship_sku_inventory ( profile_id , sku_code ),
KEY idx_ll_dropship_sku_order ( customer_id , order_id , sku_code )
) ENGINE = InnoDB COMMENT = 'One-click dropship pallet-level SKU package-count and product-quantity inventory summary' ;
CREATE TABLE IF NOT EXISTS ll_dropship_carton_ledger (
id BIGINT NOT NULL , customer_id VARCHAR ( 128 ) NOT NULL , order_id BIGINT NOT NULL , carton_id BIGINT NOT NULL ,
carton_mark VARCHAR ( 128 ) NOT NULL , sku_code VARCHAR ( 128 ) NOT NULL , operation_type VARCHAR ( 32 ) NOT NULL ,
before_packages BIGINT NOT NULL , delta_packages BIGINT NOT NULL , after_packages BIGINT NOT NULL ,
business_order_no VARCHAR ( 128 ) NULL , idempotency_key VARCHAR ( 255 ) NOT NULL , remark VARCHAR ( 1000 ) NULL ,
occurred_at DATETIME ( 3 ) NOT NULL , created_at DATETIME ( 3 ) NOT NULL DEFAULT CURRENT_TIMESTAMP ( 3 ), PRIMARY KEY ( id ),
UNIQUE KEY uk_ll_dropship_ledger_key ( customer_id , idempotency_key ), KEY idx_ll_dropship_ledger_sku ( customer_id , sku_code , carton_mark )
) ENGINE = InnoDB COMMENT = 'Immutable dropship SKU/carton-mark package ledger' ;
2026-08-18 16:31:55 +08:00
CREATE TABLE IF NOT EXISTS ll_cargo_discard_application (
id BIGINT NOT NULL COMMENT 'Snowflake ID' , customer_id VARCHAR ( 128 ) NOT NULL ,
discard_no VARCHAR ( 64 ) NOT NULL , overseas_warehouse_id VARCHAR ( 128 ) NOT NULL ,
overseas_warehouse_name VARCHAR ( 255 ) NULL , inbound_codes VARCHAR ( 2000 ) NOT NULL ,
total_packages INT NOT NULL , fee_per_package DECIMAL ( 18 , 2 ) NOT NULL ,
total_fee DECIMAL ( 18 , 2 ) NOT NULL , currency CHAR ( 3 ) NOT NULL DEFAULT 'USD' ,
status VARCHAR ( 32 ) NOT NULL DEFAULT 'PENDING_REVIEW' , remark VARCHAR ( 1000 ) NULL ,
idempotency_key VARCHAR ( 255 ) NOT NULL , request_hash CHAR ( 64 ) NOT NULL ,
created_by VARCHAR ( 128 ) NULL , reviewed_by VARCHAR ( 128 ) NULL , review_remark VARCHAR ( 1000 ) NULL ,
reviewed_at DATETIME ( 3 ) NULL , created_at DATETIME ( 3 ) NOT NULL DEFAULT CURRENT_TIMESTAMP ( 3 ),
updated_at DATETIME ( 3 ) NOT NULL DEFAULT CURRENT_TIMESTAMP ( 3 ) ON UPDATE CURRENT_TIMESTAMP ( 3 ),
PRIMARY KEY ( id ), UNIQUE KEY uk_ll_cargo_discard_no ( customer_id , discard_no ),
UNIQUE KEY uk_ll_cargo_discard_key ( customer_id , idempotency_key ),
KEY idx_ll_cargo_discard_list ( customer_id , status , created_at ),
KEY idx_ll_cargo_discard_warehouse ( customer_id , overseas_warehouse_id , created_at )
) ENGINE = InnoDB COMMENT = 'Cargo discard application requiring warehouse approval' ;
CREATE TABLE IF NOT EXISTS ll_cargo_discard_item (
id BIGINT NOT NULL , application_id BIGINT NOT NULL , customer_id VARCHAR ( 128 ) NOT NULL ,
order_id BIGINT NOT NULL , inbound_code VARCHAR ( 128 ) NOT NULL , profile_id BIGINT NOT NULL ,
sku_inventory_id BIGINT NOT NULL , sku_code VARCHAR ( 128 ) NOT NULL , product_name VARCHAR ( 255 ) NULL ,
available_packages_snapshot INT NOT NULL , discard_packages INT NOT NULL ,
created_at DATETIME ( 3 ) NOT NULL DEFAULT CURRENT_TIMESTAMP ( 3 ), PRIMARY KEY ( id ),
UNIQUE KEY uk_ll_cargo_discard_item ( application_id , profile_id , sku_code ),
KEY idx_ll_cargo_discard_item_list ( customer_id , application_id ),
KEY idx_ll_cargo_discard_item_inbound ( customer_id , inbound_code , sku_code )
) ENGINE = InnoDB COMMENT = 'Frozen SKU quantities in a cargo discard application' ;
CREATE TABLE IF NOT EXISTS ll_cargo_discard_carton (
id BIGINT NOT NULL , application_id BIGINT NOT NULL , item_id BIGINT NOT NULL ,
customer_id VARCHAR ( 128 ) NOT NULL , carton_id BIGINT NOT NULL , carton_mark VARCHAR ( 128 ) NOT NULL ,
created_at DATETIME ( 3 ) NOT NULL DEFAULT CURRENT_TIMESTAMP ( 3 ), PRIMARY KEY ( id ),
UNIQUE KEY uk_ll_cargo_discard_carton ( application_id , carton_id ),
KEY idx_ll_cargo_discard_carton_application ( customer_id , application_id , item_id ),
KEY idx_ll_cargo_discard_carton_identity ( customer_id , carton_id )
) ENGINE = InnoDB COMMENT = 'Cartons reserved while a cargo discard application awaits review' ;
CREATE TABLE IF NOT EXISTS ll_cargo_discard_status_history (
id BIGINT NOT NULL , application_id BIGINT NOT NULL , customer_id VARCHAR ( 128 ) NOT NULL ,
from_status VARCHAR ( 32 ) NULL , to_status VARCHAR ( 32 ) NOT NULL , operator_id VARCHAR ( 128 ) NULL ,
remark VARCHAR ( 1000 ) NULL , created_at DATETIME ( 3 ) NOT NULL DEFAULT CURRENT_TIMESTAMP ( 3 ), PRIMARY KEY ( id ),
KEY idx_ll_cargo_discard_history ( customer_id , application_id , created_at )
) ENGINE = InnoDB COMMENT = 'Immutable cargo discard approval history' ;
CREATE TABLE IF NOT EXISTS ll_overseas_procurement_order (
id BIGINT NOT NULL COMMENT 'Snowflake ID' , customer_id VARCHAR ( 128 ) NOT NULL ,
customer_name VARCHAR ( 255 ) NULL , order_no VARCHAR ( 64 ) NOT NULL ,
purchase_category VARCHAR ( 128 ) NOT NULL , product_name VARCHAR ( 255 ) NOT NULL ,
product_specification VARCHAR ( 500 ) NULL , product_url VARCHAR ( 2000 ) NULL ,
purchase_quantity BIGINT NOT NULL , budget_unit_price DECIMAL ( 18 , 2 ) NULL ,
currency CHAR ( 3 ) NOT NULL DEFAULT 'USD' , receiving_address VARCHAR ( 1000 ) NULL ,
contact_name VARCHAR ( 128 ) NOT NULL , contact_phone VARCHAR ( 64 ) NOT NULL ,
purchase_warehouse_id VARCHAR ( 128 ) NULL , purchase_warehouse_name VARCHAR ( 255 ) NULL ,
inbound_quantity BIGINT NOT NULL DEFAULT 0 , outbound_quantity BIGINT NOT NULL DEFAULT 0 ,
domestic_carrier VARCHAR ( 128 ) NULL , domestic_tracking_no VARCHAR ( 128 ) NULL ,
overseas_carrier VARCHAR ( 128 ) NULL , overseas_tracking_no VARCHAR ( 128 ) NULL ,
estimated_arrival_at DATETIME ( 3 ) NULL , status VARCHAR ( 32 ) NOT NULL DEFAULT 'PENDING_REVIEW' ,
remark VARCHAR ( 1000 ) NULL , idempotency_key VARCHAR ( 255 ) NOT NULL , request_hash CHAR ( 64 ) NOT NULL ,
created_by VARCHAR ( 128 ) NULL , reviewed_by VARCHAR ( 128 ) NULL , review_remark VARCHAR ( 1000 ) NULL ,
reviewed_at DATETIME ( 3 ) NULL , version BIGINT NOT NULL DEFAULT 0 ,
created_at DATETIME ( 3 ) NOT NULL DEFAULT CURRENT_TIMESTAMP ( 3 ),
updated_at DATETIME ( 3 ) NOT NULL DEFAULT CURRENT_TIMESTAMP ( 3 ) ON UPDATE CURRENT_TIMESTAMP ( 3 ),
PRIMARY KEY ( id ), UNIQUE KEY uk_ll_overseas_procurement_order_no ( customer_id , order_no ),
UNIQUE KEY uk_ll_overseas_procurement_order_key ( customer_id , idempotency_key ),
KEY idx_ll_overseas_procurement_list ( customer_id , status , created_at ),
KEY idx_ll_overseas_procurement_warehouse ( customer_id , purchase_warehouse_id , created_at )
) ENGINE = InnoDB COMMENT = 'Overseas procurement order awaiting business approval' ;
CREATE TABLE IF NOT EXISTS ll_overseas_procurement_outbound (
id BIGINT NOT NULL , order_id BIGINT NOT NULL , customer_id VARCHAR ( 128 ) NOT NULL ,
quantity BIGINT NOT NULL , outbound_no VARCHAR ( 128 ) NOT NULL , carrier VARCHAR ( 128 ) NULL ,
tracking_no VARCHAR ( 128 ) NULL , outbound_at DATETIME ( 3 ) NOT NULL ,
remark VARCHAR ( 1000 ) NULL , created_by VARCHAR ( 128 ) NULL ,
created_at DATETIME ( 3 ) NOT NULL DEFAULT CURRENT_TIMESTAMP ( 3 ), PRIMARY KEY ( id ),
UNIQUE KEY uk_ll_overseas_procurement_outbound_no ( customer_id , order_id , outbound_no ),
KEY idx_ll_overseas_procurement_outbound_order ( customer_id , order_id , outbound_at )
) ENGINE = InnoDB COMMENT = 'Manual outbound records for overseas procurement inventory' ;
CREATE TABLE IF NOT EXISTS ll_overseas_procurement_status_history (
id BIGINT NOT NULL , order_id BIGINT NOT NULL , customer_id VARCHAR ( 128 ) NOT NULL ,
from_status VARCHAR ( 32 ) NULL , to_status VARCHAR ( 32 ) NOT NULL , operator_id VARCHAR ( 128 ) NULL ,
remark VARCHAR ( 1000 ) NULL , created_at DATETIME ( 3 ) NOT NULL DEFAULT CURRENT_TIMESTAMP ( 3 ),
PRIMARY KEY ( id ), KEY idx_ll_overseas_procurement_history ( customer_id , order_id , created_at )
) ENGINE = InnoDB COMMENT = 'Immutable overseas procurement review history' ;
CREATE TABLE IF NOT EXISTS ll_us_truck_order (
id BIGINT NOT NULL COMMENT 'Snowflake primary key' ,
customer_id VARCHAR ( 128 ) NOT NULL COMMENT 'Trusted tenant identifier' ,
order_no VARCHAR ( 64 ) NOT NULL COMMENT 'US trucking order number' ,
transport_type VARCHAR ( 32 ) NOT NULL COMMENT 'PORT_PICKUP/WAREHOUSE_TO_WAREHOUSE/WAREHOUSE_TO_DOOR' ,
origin VARCHAR ( 255 ) NOT NULL COMMENT 'Origin city, port or state' ,
origin_address VARCHAR ( 500 ) NULL COMMENT 'Origin street address' ,
destination VARCHAR ( 255 ) NOT NULL COMMENT 'Destination city, warehouse or state' ,
destination_address VARCHAR ( 500 ) NULL COMMENT 'Destination street, terminal or warehouse address' ,
container_type VARCHAR ( 32 ) NOT NULL COMMENT 'Container or truck equipment type' ,
package_count INT NOT NULL DEFAULT 0 COMMENT 'Package count' ,
total_weight_kg DECIMAL ( 18 , 3 ) NOT NULL DEFAULT 0 COMMENT 'Total weight in kilograms' ,
total_volume_cbm DECIMAL ( 18 , 6 ) NOT NULL DEFAULT 0 COMMENT 'Total volume in cubic meters' ,
budget_amount DECIMAL ( 18 , 2 ) NULL COMMENT 'Customer budget total' ,
currency VARCHAR ( 3 ) NOT NULL DEFAULT 'USD' COMMENT 'ISO currency code' ,
contact_name VARCHAR ( 128 ) NOT NULL COMMENT 'Shipment contact name' ,
contact_info VARCHAR ( 128 ) NOT NULL COMMENT 'Phone, email or messaging account' ,
requested_date DATE NOT NULL COMMENT 'Requested pickup or service date' ,
status VARCHAR ( 32 ) NOT NULL COMMENT 'Current business status' ,
remark VARCHAR ( 1000 ) NULL COMMENT 'Order remark' ,
idempotency_key VARCHAR ( 255 ) NOT NULL COMMENT 'Customer request idempotency key' ,
request_hash CHAR ( 64 ) NOT NULL COMMENT 'SHA-256 request hash' ,
created_by VARCHAR ( 128 ) NULL COMMENT 'Creating user identifier' ,
version BIGINT NOT NULL DEFAULT 0 COMMENT 'Optimistic concurrency version' ,
created_at DATETIME ( 3 ) NOT NULL DEFAULT CURRENT_TIMESTAMP ( 3 ),
updated_at DATETIME ( 3 ) NOT NULL DEFAULT CURRENT_TIMESTAMP ( 3 ),
PRIMARY KEY ( id ),
UNIQUE KEY uk_ll_us_truck_order_no ( customer_id , order_no ),
UNIQUE KEY uk_ll_us_truck_order_key ( customer_id , idempotency_key ),
KEY idx_ll_us_truck_order_list ( customer_id , status , created_at ),
KEY idx_ll_us_truck_order_date ( customer_id , requested_date , created_at )
) ENGINE = InnoDB COMMENT = 'US domestic trucking customer order' ;
CREATE TABLE IF NOT EXISTS ll_us_truck_order_status_history (
id BIGINT NOT NULL COMMENT 'Snowflake primary key' ,
order_id BIGINT NOT NULL COMMENT 'US trucking order ID' ,
customer_id VARCHAR ( 128 ) NOT NULL COMMENT 'Trusted tenant identifier' ,
from_status VARCHAR ( 32 ) NULL COMMENT 'Previous status' ,
to_status VARCHAR ( 32 ) NOT NULL COMMENT 'New status' ,
operator_id VARCHAR ( 128 ) NULL COMMENT 'Operator identifier' ,
remark VARCHAR ( 1000 ) NULL COMMENT 'Status change note' ,
created_at DATETIME ( 3 ) NOT NULL DEFAULT CURRENT_TIMESTAMP ( 3 ),
PRIMARY KEY ( id ),
KEY idx_ll_us_truck_history ( customer_id , order_id , created_at )
) ENGINE = InnoDB COMMENT = 'Immutable US trucking order status history' ;