2026-08-20 19:55:21 +08:00
SET NAMES utf8mb4 ;
2026-08-19 16:24:02 +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 '事件全局唯一标识' ,
customer_id VARCHAR ( 128 ) NOT NULL COMMENT '租户/客户账号标识' ,
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 ),
UNIQUE KEY uk_ll_loading_inbox_tenant_key ( customer_id , event_type , event_id )
) ENGINE = InnoDB COMMENT = '头程装柜完成事件接收幂等箱' ;
2026-08-25 10:31:04 +08:00
CREATE TABLE IF NOT EXISTS ll_container_shipping_gate (
2026-09-09 21:30:39 +08:00
container_booking_id VARCHAR ( 128 ) NOT NULL COMMENT '来源头程柜预订ID' ,
2026-09-10 14:10:02 +08:00
ocean_booking_id VARCHAR ( 128 ) NULL COMMENT '来源海运订舱ID;货柜未关联订舱时为空' , container_no VARCHAR ( 64 ) NOT NULL COMMENT '实际集装箱号' ,
2026-08-25 10:31:04 +08:00
status VARCHAR ( 32 ) NOT NULL DEFAULT 'AWAITING_PICKUP_READY' COMMENT '海外收货门禁状态:AWAITING_PICKUP_READY、RECEIVING_AVAILABLE' ,
standard_node VARCHAR ( 64 ) NULL COMMENT '最新有效标准船节点' , node_sequence INT NOT NULL DEFAULT 0 COMMENT '最新有效节点单调序号' ,
observed_at DATETIME ( 3 ) NULL COMMENT '供应商节点观测时间' , actual_at DATETIME ( 3 ) NULL COMMENT '节点实际发生时间' ,
location_code VARCHAR ( 128 ) NULL COMMENT '节点地点编码' , location_name VARCHAR ( 255 ) NULL COMMENT '节点地点名称' ,
provider_code VARCHAR ( 64 ) NULL COMMENT '船节点供应商编码' , provider_event_id VARCHAR ( 128 ) NULL COMMENT '供应商事件ID' ,
provider_node_code VARCHAR ( 128 ) NULL COMMENT '供应商原始节点编码' , source_reference VARCHAR ( 255 ) NULL COMMENT '供应商来源引用' ,
raw_payload_hash VARCHAR ( 64 ) NULL COMMENT '供应商原始负载SHA-256' , aggregate_version BIGINT NOT NULL DEFAULT 0 COMMENT '来源查询聚合版本' ,
handover_version BIGINT NOT NULL DEFAULT 1 COMMENT '跨区交接版本' , last_event_id VARCHAR ( 128 ) NULL COMMENT '最近采纳的跨区事件ID' ,
payload_hash VARCHAR ( 71 ) 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 '更新时间' ,
2026-09-09 21:30:39 +08:00
PRIMARY KEY ( container_booking_id ), KEY idx_ll_shipping_gate_candidate ( container_no , status ),
2026-08-25 10:31:04 +08:00
KEY idx_ll_shipping_gate_version ( container_booking_id , aggregate_version , node_sequence )
) ENGINE = InnoDB COMMENT = '海外PDA柜号船节点收货资格快照' ;
2026-08-27 15:56:14 +08:00
CREATE TABLE IF NOT EXISTS ll_order_no_daily_sequence (
business_date DATE NOT NULL COMMENT '业务日期(Asia/Shanghai) ' ,
last_sequence INT NOT NULL COMMENT '当日已分配尾程单流水号' ,
PRIMARY KEY ( business_date )
) ENGINE = InnoDB COMMENT = '尾程单号按日原子流水' ;
2026-08-19 16:24:02 +08:00
CREATE TABLE IF NOT EXISTS ll_order (
id BIGINT NOT NULL COMMENT '雪花 ID' ,
order_no VARCHAR ( 32 ) NOT NULL COMMENT '尾程单号' ,
customer_id VARCHAR ( 128 ) NOT NULL COMMENT '租户/客户账号标识' ,
2026-08-21 10:43:25 +08:00
order_type VARCHAR ( 32 ) NOT NULL DEFAULT 'FIRST_LEG' COMMENT '订单类型:FIRST_LEG头程订单、RELABEL_APPLICATION换标下单、WAREHOUSE_TRANSFER仓储转运、LOCAL_LOOSEBOARD本土散板、RETURN_RELABEL退货换标、ONE_CLICK_DROPSHIP一件代发' ,
2026-09-06 16:02:11 +08:00
lx_code VARCHAR ( 128 ) NULL COMMENT '一件代发领星入库单代码' ,
2026-08-24 17:15:48 +08:00
destination_type VARCHAR ( 32 ) NULL COMMENT '目的类型:FBA按箱数接收、OVERSEAS逐箱扫码' ,
2026-09-07 12:30:17 +08:00
inbound_code VARCHAR ( 128 ) NULL COMMENT '真实来源入仓码;无入仓关系的海外本土业务为空' ,
2026-08-19 16:24:02 +08:00
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 '货主名称' ,
2026-08-24 21:46:19 +08:00
source_warehouse_id VARCHAR ( 128 ) COMMENT '来源国内装柜仓 ID 快照' ,
source_warehouse_name VARCHAR ( 255 ) COMMENT '来源国内装柜仓名称快照' ,
2026-09-10 10:34:24 +08:00
overseas_warehouse_id VARCHAR ( 128 ) NULL COMMENT '海外接柜仓ID;新建尾程订单由业务服务预分配' ,
overseas_warehouse_code VARCHAR ( 128 ) NULL COMMENT '海外接柜仓业务编码快照' ,
overseas_warehouse_name VARCHAR ( 255 ) NULL COMMENT '海外接柜仓名称快照' ,
2026-09-07 15:07:34 +08:00
receiving_warehouse_version INT NOT NULL DEFAULT 0 COMMENT '柜级接柜仓分配乐观锁版本' ,
2026-08-19 16:24:02 +08:00
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 '集装箱号' ,
abnormal TINYINT NOT NULL DEFAULT 0 COMMENT '是否异常:0否1是' ,
detained TINYINT NOT NULL DEFAULT 0 COMMENT '是否暂扣:0否1是' ,
2026-09-07 23:58:18 +08:00
hold_chargeable TINYINT NOT NULL DEFAULT 0 COMMENT '当前暂扣是否计费:0否1是' ,
hold_reason VARCHAR ( 500 ) NULL COMMENT '当前暂扣原因;解除后为空' ,
manual_node_override TINYINT NOT NULL DEFAULT 0 COMMENT '是否启用单票人工计划节点覆盖:0否1是,启用后不再继承柜级节点' ,
version INT NOT NULL DEFAULT 0 COMMENT '尾程订单命令乐观锁版本' ,
2026-08-19 16:24:02 +08:00
pallet_count INT NOT NULL DEFAULT 0 COMMENT '托数' ,
package_count INT NOT NULL DEFAULT 0 COMMENT '箱数' ,
2026-09-17 17:37:29 +08:00
received_package_count INT NULL COMMENT 'PDA实际入库箱数' ,
2026-08-19 16:24:02 +08:00
picked_package_count INT NOT NULL DEFAULT 0 COMMENT '累计已拣箱数' ,
shipped_package_count INT NOT NULL DEFAULT 0 COMMENT '累计已出库箱数' ,
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 '预计到仓时间' ,
2026-09-15 16:10:55 +08:00
arrival_time_version INT NOT NULL DEFAULT 0 COMMENT '柜级预计到仓时间乐观锁版本' ,
2026-08-19 16:24:02 +08:00
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 '合托标记' ,
2026-08-31 14:39:40 +08:00
pallet_merge_batch_id VARCHAR ( 64 ) NULL COMMENT '平台预标记合托分组号' ,
2026-08-21 10:43:25 +08:00
current_status VARCHAR ( 32 ) NOT NULL DEFAULT 'PENDING_ASSIGNMENT' COMMENT '当前业务状态:PENDING_ASSIGNMENT待分配、PENDING_INBOUND待入库、INBOUND_COMPLETED入库完成、PENDING_DELIVERY待派送、DELIVERING派送中、DELIVERED派送完成' ,
2026-08-19 16:24:02 +08:00
sub_order_status VARCHAR ( 255 ) NULL 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' ,
2026-08-20 15:20:05 +08:00
source_container_booking_id VARCHAR ( 128 ) NULL COMMENT '来源头程货柜预订ID' ,
2026-08-19 16:24:02 +08:00
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 ),
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 ),
2026-08-27 17:16:33 +08:00
KEY idx_ll_order_list ( customer_id , current_status , created_at ),
2026-08-28 13:54:32 +08:00
KEY idx_ll_order_container_progress ( source_container_booking_id , estimated_warehouse_at , created_at , id )
2026-08-19 16:24:02 +08:00
) ENGINE = InnoDB COMMENT = '尾程订单主表' ;
2026-09-09 17:27:00 +08:00
CREATE TABLE IF NOT EXISTS ll_order_source_pallet (
id BIGINT NOT NULL COMMENT '来源托盘快照ID' ,
customer_id VARCHAR ( 128 ) NOT NULL COMMENT '客户隔离键' ,
order_id BIGINT NOT NULL COMMENT '尾程订单ID' ,
source_pallet_no VARCHAR ( 128 ) NOT NULL COMMENT '头程冻结托盘码' ,
sequence_no INT NOT NULL COMMENT '订单内稳定顺序' ,
source_event_id VARCHAR ( 128 ) NOT NULL COMMENT '来源装柜完成事件ID' ,
created_at DATETIME ( 3 ) NOT NULL DEFAULT CURRENT_TIMESTAMP ( 3 ) COMMENT '创建时间' ,
PRIMARY KEY ( id ),
UNIQUE KEY uk_ll_source_pallet_no ( source_pallet_no ),
UNIQUE KEY uk_ll_source_pallet_sequence ( customer_id , order_id , sequence_no ),
KEY idx_ll_source_pallet_order ( customer_id , order_id ),
CONSTRAINT fk_ll_source_pallet_order FOREIGN KEY ( order_id ) REFERENCES ll_order ( id )
) ENGINE = InnoDB COMMENT = '头程交接的不可变托盘码快照' ;
2026-08-31 14:39:40 +08:00
SET @ ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_order' AND column_name = 'pallet_merge_batch_id' ), 'SELECT 1' , 'ALTER TABLE ll_order ADD COLUMN pallet_merge_batch_id VARCHAR(64) NULL COMMENT ''平台预标记合托分组号'' AFTER pallet_merge_flag' ));
PREPARE ll_order_merge_batch_ddl FROM @ ddl ; EXECUTE ll_order_merge_batch_ddl ; DEALLOCATE PREPARE ll_order_merge_batch_ddl ;
2026-09-07 23:58:18 +08:00
SET @ ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_order' AND column_name = 'hold_chargeable' ), 'SELECT 1' , 'ALTER TABLE ll_order ADD COLUMN hold_chargeable TINYINT NOT NULL DEFAULT 0 COMMENT ''当前暂扣是否计费:0否1是'' AFTER detained' ));
PREPARE ll_order_command_ddl FROM @ ddl ; EXECUTE ll_order_command_ddl ; DEALLOCATE PREPARE ll_order_command_ddl ;
SET @ ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_order' AND column_name = 'hold_reason' ), 'SELECT 1' , 'ALTER TABLE ll_order ADD COLUMN hold_reason VARCHAR(500) NULL COMMENT ''当前暂扣原因;解除后为空'' AFTER hold_chargeable' ));
PREPARE ll_order_command_ddl FROM @ ddl ; EXECUTE ll_order_command_ddl ; DEALLOCATE PREPARE ll_order_command_ddl ;
SET @ ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_order' AND column_name = 'manual_node_override' ), 'SELECT 1' , 'ALTER TABLE ll_order ADD COLUMN manual_node_override TINYINT NOT NULL DEFAULT 0 COMMENT ''是否启用单票人工计划节点覆盖:0否1是'' AFTER hold_reason' ));
PREPARE ll_order_command_ddl FROM @ ddl ; EXECUTE ll_order_command_ddl ; DEALLOCATE PREPARE ll_order_command_ddl ;
SET @ ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_order' AND column_name = 'version' ), 'SELECT 1' , 'ALTER TABLE ll_order ADD COLUMN version INT NOT NULL DEFAULT 0 COMMENT ''尾程订单命令乐观锁版本'' AFTER manual_node_override' ));
PREPARE ll_order_command_ddl FROM @ ddl ; EXECUTE ll_order_command_ddl ; DEALLOCATE PREPARE ll_order_command_ddl ;
2026-08-31 14:39:40 +08:00
2026-08-19 16:24:02 +08:00
CREATE TABLE IF NOT EXISTS ll_order_detail (
id BIGINT NOT NULL AUTO_INCREMENT COMMENT '订单明细主键' ,
2026-08-24 11:55:50 +08:00
customer_id VARCHAR ( 128 ) NOT NULL COMMENT '客户数据隔离键' ,
2026-08-19 16:24:02 +08:00
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 ),
2026-08-24 11:55:50 +08:00
KEY idx_ll_detail_order ( order_id ),
KEY idx_ll_detail_customer_order ( customer_id , order_id , id )
2026-08-19 16:24:02 +08:00
) ENGINE = InnoDB COMMENT = '尾程订单实装商品冻结明细' ;
CREATE TABLE IF NOT EXISTS ll_loading_order_status_history (
id BIGINT NOT NULL AUTO_INCREMENT COMMENT '状态历史主键' ,
2026-08-24 10:33:05 +08:00
customer_id VARCHAR ( 128 ) NOT NULL COMMENT '客户数据隔离键' ,
2026-08-19 16:24:02 +08:00
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 ),
2026-08-24 10:33:05 +08:00
KEY idx_ll_loading_history_customer_order ( customer_id , order_id , created_at )
2026-08-19 16:24:02 +08:00
) ENGINE = InnoDB COMMENT = '尾程订单状态变更历史' ;
2026-08-26 11:05:26 +08:00
CREATE TABLE IF NOT EXISTS ll_order_operation_log (
id BIGINT NOT NULL COMMENT '操作记录主键' ,
customer_id VARCHAR ( 128 ) NOT NULL COMMENT '客户数据隔离键' ,
order_id BIGINT NOT NULL COMMENT '尾程订单ID' ,
operation_node VARCHAR ( 64 ) NOT NULL COMMENT '操作节点' ,
operator_name VARCHAR ( 128 ) NOT NULL COMMENT '操作人名称' ,
result VARCHAR ( 500 ) NOT NULL COMMENT '处理结果' ,
created_at DATETIME ( 3 ) NOT NULL DEFAULT CURRENT_TIMESTAMP ( 3 ) COMMENT '操作时间' ,
PRIMARY KEY ( id ),
KEY idx_ll_order_operation_customer_order ( customer_id , order_id , created_at )
) ENGINE = InnoDB COMMENT = '尾程订单操作记录' ;
2026-09-07 23:58:18 +08:00
CREATE TABLE IF NOT EXISTS ll_order_command_record (
id BIGINT NOT NULL COMMENT '尾程订单命令幂等记录ID' , customer_id VARCHAR ( 128 ) NOT NULL COMMENT '客户数据隔离键' ,
order_id BIGINT NOT NULL COMMENT '尾程订单ID' , action VARCHAR ( 32 ) NOT NULL COMMENT '命令动作:MANUAL_PLAN、HOLD、MANUAL_NODES' ,
operator_id VARCHAR ( 128 ) NOT NULL COMMENT '平台操作人ID' , idempotency_key VARCHAR ( 128 ) NOT NULL COMMENT '客户端幂等键' ,
request_hash VARCHAR ( 64 ) NOT NULL COMMENT '规范化请求SHA-256摘要' , result_ref VARCHAR ( 128 ) NULL COMMENT '结果业务引用' ,
result_json LONGTEXT NOT NULL COMMENT '首次成功响应JSON快照' , result_version INT NOT NULL COMMENT '命令成功后的订单版本' ,
created_at DATETIME ( 3 ) NOT NULL DEFAULT CURRENT_TIMESTAMP ( 3 ) COMMENT '首次成功时间' , PRIMARY KEY ( id ),
UNIQUE KEY uk_ll_order_command_key ( customer_id , order_id , action , operator_id , idempotency_key ),
KEY idx_ll_order_command_history ( customer_id , order_id , created_at )
) ENGINE = InnoDB COMMENT = '尾程订单写命令幂等与结果审计记录' ;
CREATE TABLE IF NOT EXISTS ll_order_hold_history (
id BIGINT NOT NULL COMMENT '尾程订单暂扣历史ID' , customer_id VARCHAR ( 128 ) NOT NULL COMMENT '客户数据隔离键' ,
order_id BIGINT NOT NULL COMMENT '尾程订单ID' , held TINYINT NOT NULL COMMENT '操作后是否暂扣:0否1是' ,
chargeable TINYINT NOT NULL COMMENT '本次暂扣是否计费:0否1是' , reason VARCHAR ( 500 ) NOT NULL COMMENT '暂扣或解除原因' ,
order_version INT NOT NULL COMMENT '操作成功后的订单版本' , operator_id VARCHAR ( 128 ) NOT NULL COMMENT '操作人ID' ,
operator_name VARCHAR ( 128 ) NOT NULL COMMENT '操作人名称' , idempotency_key VARCHAR ( 128 ) NOT NULL COMMENT '客户端幂等键' ,
created_at DATETIME ( 3 ) NOT NULL COMMENT '操作时间' , PRIMARY KEY ( id ),
UNIQUE KEY uk_ll_order_hold_key ( customer_id , order_id , operator_id , idempotency_key ),
KEY idx_ll_order_hold_history ( customer_id , order_id , created_at )
) ENGINE = InnoDB COMMENT = '尾程订单暂扣与解除不可变历史' ;
CREATE TABLE IF NOT EXISTS ll_order_manual_node (
id BIGINT NOT NULL COMMENT '尾程订单人工节点ID' , customer_id VARCHAR ( 128 ) NOT NULL COMMENT '客户数据隔离键' ,
order_id BIGINT NOT NULL COMMENT '尾程订单ID' , node_code VARCHAR ( 32 ) NOT NULL COMMENT '八行人工展示节点稳定代码,与Carrier标准节点隔离' ,
node_at DATETIME ( 3 ) NULL COMMENT '人工填写节点时间,允许为空' , source VARCHAR ( 16 ) NOT NULL DEFAULT 'MANUAL' COMMENT '节点来源,固定MANUAL' ,
order_version INT NOT NULL COMMENT '最近编辑后的订单版本' , updated_by VARCHAR ( 128 ) NOT NULL COMMENT '最近操作人ID' ,
updated_at DATETIME ( 3 ) NOT NULL COMMENT '最近编辑时间' , PRIMARY KEY ( id ),
UNIQUE KEY uk_ll_order_manual_node ( customer_id , order_id , node_code ), KEY idx_ll_order_manual_node_order ( customer_id , order_id , node_at )
) ENGINE = InnoDB COMMENT = '尾程订单当前人工节点覆盖事实' ;
CREATE TABLE IF NOT EXISTS ll_order_manual_node_history (
id BIGINT NOT NULL COMMENT '尾程订单人工节点历史ID' , customer_id VARCHAR ( 128 ) NOT NULL COMMENT '客户数据隔离键' ,
order_id BIGINT NOT NULL COMMENT '尾程订单ID' , nodes_json LONGTEXT NOT NULL COMMENT '本次全量人工节点JSON快照' ,
order_version INT NOT NULL COMMENT '操作成功后的订单版本' , operator_id VARCHAR ( 128 ) NOT NULL COMMENT '操作人ID' ,
operator_name VARCHAR ( 128 ) NOT NULL COMMENT '操作人名称' , idempotency_key VARCHAR ( 128 ) NOT NULL COMMENT '客户端幂等键' ,
created_at DATETIME ( 3 ) NOT NULL COMMENT '操作时间' , PRIMARY KEY ( id ),
UNIQUE KEY uk_ll_order_manual_node_history_key ( customer_id , order_id , operator_id , idempotency_key ),
KEY idx_ll_order_manual_node_history ( customer_id , order_id , created_at )
) ENGINE = InnoDB COMMENT = '尾程订单人工节点覆盖不可变历史' ;
2026-09-07 15:07:34 +08:00
CREATE TABLE IF NOT EXISTS ll_receiving_warehouse_operation (
id BIGINT NOT NULL COMMENT '柜级接柜仓修改操作ID' ,
source_container_booking_id VARCHAR ( 128 ) NOT NULL COMMENT '稳定来源柜预订ID' ,
idempotency_key VARCHAR ( 255 ) NOT NULL COMMENT '平台请求幂等键' ,
request_hash VARCHAR ( 64 ) NOT NULL COMMENT '规范化修改请求SHA-256摘要' ,
result_version INT NOT NULL COMMENT '修改成功后的柜级分配版本' ,
operator_name VARCHAR ( 128 ) NOT NULL COMMENT '平台操作人名称' ,
remark VARCHAR ( 500 ) NULL COMMENT '接柜仓修改备注' ,
created_at DATETIME ( 3 ) NOT NULL DEFAULT CURRENT_TIMESTAMP ( 3 ) COMMENT '操作时间' ,
PRIMARY KEY ( id ),
UNIQUE KEY uk_ll_receiving_warehouse_idempotency ( idempotency_key ),
KEY idx_ll_receiving_warehouse_container ( source_container_booking_id , created_at )
) ENGINE = InnoDB COMMENT = '柜级海外接柜仓修改幂等审计记录' ;
2026-09-15 16:10:55 +08:00
CREATE TABLE IF NOT EXISTS ll_container_arrival_time_operation (
id BIGINT NOT NULL COMMENT '柜级预计到仓时间修改操作ID' ,
source_container_booking_id VARCHAR ( 128 ) NOT NULL COMMENT '稳定来源柜预订ID' ,
idempotency_key VARCHAR ( 255 ) NOT NULL COMMENT '平台请求幂等键' ,
request_hash VARCHAR ( 64 ) NOT NULL COMMENT '规范化修改请求SHA-256摘要' ,
result_version INT NOT NULL COMMENT '修改成功后的柜级时间版本' ,
operator_name VARCHAR ( 128 ) NOT NULL COMMENT '平台操作人名称' ,
remark VARCHAR ( 500 ) NULL COMMENT '预计到仓时间修改备注' ,
created_at DATETIME ( 3 ) NOT NULL DEFAULT CURRENT_TIMESTAMP ( 3 ) COMMENT '操作时间' ,
PRIMARY KEY ( id ),
UNIQUE KEY uk_ll_container_arrival_time_idempotency ( idempotency_key ),
KEY idx_ll_container_arrival_time_container ( source_container_booking_id , created_at )
) ENGINE = InnoDB COMMENT = '柜级预计到仓时间修改幂等审计记录' ;
2026-08-26 13:51:19 +08:00
-- 派送单列表与详情快照、转派送费用及操作记录。
2026-09-01 16:18:38 +08:00
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 '关联出库单号' ,
2026-09-17 17:37:29 +08:00
dispatch_order_id BIGINT NULL COMMENT '关联派车单ID,仓储转运直接出库时为空' ,
dispatch_no VARCHAR ( 64 ) NULL COMMENT '关联派车单号,仓储转运直接出库时为空' ,
2026-09-01 16:18:38 +08:00
overseas_warehouse_id VARCHAR ( 128 ) NULL COMMENT '海外仓ID' ,
overseas_warehouse_name VARCHAR ( 255 ) NULL COMMENT '海外仓名称快照' ,
customer_name VARCHAR ( 255 ) NULL COMMENT '客户名称快照' ,
2026-09-15 11:54:14 +08:00
destination_warehouse_id VARCHAR ( 128 ) NULL COMMENT '本派送单目的FBA仓ID快照' ,
2026-09-17 17:37:29 +08:00
destination_warehouse_code VARCHAR ( 128 ) NULL COMMENT '本派送单目的FBA仓编码快照,私人仓为空' ,
2026-09-15 11:54:14 +08:00
destination_warehouse_name VARCHAR ( 255 ) NULL COMMENT '本派送单目的FBA仓名称快照' ,
2026-09-17 17:37:29 +08:00
destination_type VARCHAR ( 16 ) NULL COMMENT '目的地类型:FBA或PRIVATE' ,
delivery_address VARCHAR ( 1000 ) NULL COMMENT '私人仓派送地址' ,
postal_code VARCHAR ( 32 ) NULL COMMENT '私人仓邮编' ,
contact_name VARCHAR ( 128 ) NULL COMMENT '私人仓联系人' ,
contact_phone VARCHAR ( 64 ) NULL COMMENT '私人仓联系电话' ,
2026-09-15 11:54:14 +08:00
delivery_group_key VARCHAR ( 255 ) NOT NULL COMMENT '同一出库单内按目的FBA仓拆单的稳定分组键' ,
2026-09-01 16:18:38 +08:00
status VARCHAR ( 32 ) NOT NULL DEFAULT 'WAIT_DELIVERY' COMMENT '派送状态:WAIT_DELIVERY待派送及后续正式状态' ,
waybill_no VARCHAR ( 128 ) NULL COMMENT '承运运单号' ,
2026-09-09 11:22:47 +08:00
bol_no VARCHAR ( 128 ) NULL COMMENT '派送资料BOL号,不作为文件归属标识' ,
documents_json JSON NULL COMMENT '派送三类资料当前绑定及权威文件元数据快照' ,
2026-09-01 16:18:38 +08:00
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 '派送托盘数' ,
2026-10-03 04:18:52 +08:00
total_weight_kg DECIMAL ( 18 , 4 ) NULL COMMENT '总重量(千克),任一来源未确认时为空' ,
2026-10-15 21:40:37 +08:00
total_volume_cbm DECIMAL ( 18 , 4 ) NULL COMMENT '体积(立方米),来源未确认时为空' ,
2026-09-01 16:18:38 +08:00
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' ,
2026-09-08 18:49:52 +08:00
version BIGINT NOT NULL DEFAULT 0 COMMENT '派送单乐观锁版本' ,
2026-09-01 16:18:38 +08:00
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 '更新时间' ,
2026-10-03 13:32:55 +08:00
signed_packages INT NULL COMMENT '保存签收资料时冻结的实际签收箱数,不含此前已退回量' ,
CONSTRAINT chk_delivery_signed_packages CHECK ( signed_packages IS NULL OR ( signed_packages >= 0 AND signed_packages <= package_count )),
2026-09-01 16:18:38 +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 ),
2026-09-15 11:54:14 +08:00
UNIQUE KEY uk_ll_delivery_outbound_destination ( customer_id , outbound_order_id , delivery_group_key ),
2026-09-01 16:18:38 +08:00
KEY idx_ll_delivery_list ( customer_id , status , created_at )
) ENGINE = InnoDB COMMENT = '尾程派送单' ;
2026-08-26 13:51:19 +08:00
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' ));
PREPARE delivery_detail_stmt FROM @ ddl ; EXECUTE delivery_detail_stmt ; DEALLOCATE PREPARE delivery_detail_stmt ;
2026-09-15 11:54:14 +08:00
SET @ ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_delivery_order' AND column_name = 'destination_warehouse_code' ), 'SELECT 1' , 'ALTER TABLE ll_delivery_order ADD COLUMN destination_warehouse_id VARCHAR(128) NULL COMMENT ''本派送单目的FBA仓ID快照'' AFTER customer_name, ADD COLUMN destination_warehouse_code VARCHAR(128) NULL COMMENT ''本派送单目的FBA仓编码快照'' AFTER destination_warehouse_id, ADD COLUMN destination_warehouse_name VARCHAR(255) NULL COMMENT ''本派送单目的FBA仓名称快照'' AFTER destination_warehouse_code, ADD COLUMN delivery_group_key VARCHAR(255) NULL COMMENT ''同一出库单内按目的FBA仓拆单的稳定分组键'' AFTER destination_warehouse_name' ));
PREPARE delivery_destination_stmt FROM @ ddl ; EXECUTE delivery_destination_stmt ; DEALLOCATE PREPARE delivery_destination_stmt ;
2026-09-17 17:37:29 +08:00
SET @ ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_delivery_order' AND column_name = 'destination_type' ), 'SELECT 1' , 'ALTER TABLE ll_delivery_order ADD COLUMN destination_type VARCHAR(16) NULL COMMENT ''目的地类型:FBA或PRIVATE'' AFTER destination_warehouse_name, ADD COLUMN delivery_address VARCHAR(1000) NULL COMMENT ''私人仓派送地址'' AFTER destination_type, ADD COLUMN contact_name VARCHAR(128) NULL COMMENT ''私人仓联系人'' AFTER delivery_address, ADD COLUMN contact_phone VARCHAR(64) NULL COMMENT ''私人仓联系电话'' AFTER contact_name' ));
PREPARE delivery_private_destination_stmt FROM @ ddl ; EXECUTE delivery_private_destination_stmt ; DEALLOCATE PREPARE delivery_private_destination_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 = 'postal_code' ), 'SELECT 1' , 'ALTER TABLE ll_delivery_order ADD COLUMN postal_code VARCHAR(32) NULL COMMENT ''私人仓邮编'' AFTER delivery_address' ));
PREPARE delivery_postal_stmt FROM @ ddl ; EXECUTE delivery_postal_stmt ; DEALLOCATE PREPARE delivery_postal_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 = 'dispatch_order_id' AND is_nullable = 'YES' ), 'SELECT 1' , 'ALTER TABLE ll_delivery_order MODIFY COLUMN dispatch_order_id BIGINT NULL COMMENT ''关联派车单ID,仓储转运直接出库时为空'', MODIFY COLUMN dispatch_no VARCHAR(64) NULL COMMENT ''关联派车单号,仓储转运直接出库时为空'', MODIFY COLUMN destination_warehouse_code VARCHAR(128) NULL COMMENT ''本派送单目的FBA仓编码快照,私人仓为空''' ));
PREPARE delivery_transfer_nullable_stmt FROM @ ddl ; EXECUTE delivery_transfer_nullable_stmt ; DEALLOCATE PREPARE delivery_transfer_nullable_stmt ;
2026-09-15 11:54:14 +08:00
SET @ old_delivery_outbound_index = ( SELECT COUNT ( * ) FROM information_schema . statistics WHERE table_schema = DATABASE () AND table_name = 'll_delivery_order' AND index_name = 'uk_ll_delivery_outbound' );
SET @ new_delivery_destination_index = ( SELECT COUNT ( * ) FROM information_schema . statistics WHERE table_schema = DATABASE () AND table_name = 'll_delivery_order' AND index_name = 'uk_ll_delivery_outbound_destination' );
SET @ ddl = IF ( @ new_delivery_destination_index > 0 , 'SELECT 1' , IF ( @ old_delivery_outbound_index > 0 , 'ALTER TABLE ll_delivery_order DROP INDEX uk_ll_delivery_outbound, ADD UNIQUE KEY uk_ll_delivery_outbound_destination (customer_id,outbound_order_id,delivery_group_key)' , 'ALTER TABLE ll_delivery_order ADD UNIQUE KEY uk_ll_delivery_outbound_destination (customer_id,outbound_order_id,delivery_group_key)' ));
PREPARE delivery_destination_index_stmt FROM @ ddl ; EXECUTE delivery_destination_index_stmt ; DEALLOCATE PREPARE delivery_destination_index_stmt ;
2026-08-26 13:51:19 +08:00
SET @ ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_delivery_order' AND column_name = 'waybill_no' ), 'SELECT 1' , 'ALTER TABLE ll_delivery_order ADD COLUMN waybill_no VARCHAR(128) NULL COMMENT ''承运运单号'', ADD COLUMN delivery_method VARCHAR(32) NULL COMMENT ''派送方式'', ADD COLUMN carrier_name VARCHAR(255) NULL COMMENT ''派送承运商'', ADD COLUMN pickup_method VARCHAR(64) NULL COMMENT ''提货方式'', ADD COLUMN loading_type VARCHAR(64) NULL COMMENT ''装车类型'', ADD COLUMN vehicle_type VARCHAR(64) NULL COMMENT ''车辆类型'', ADD COLUMN vehicle_size VARCHAR(64) NULL COMMENT ''车辆大小'', ADD COLUMN vehicle_plate VARCHAR(64) NULL COMMENT ''车牌号'', ADD COLUMN driver_name VARCHAR(128) NULL COMMENT ''司机或车队名称'', ADD COLUMN driver_phone VARCHAR(64) NULL COMMENT ''车队联系电话'', ADD COLUMN appointment_account VARCHAR(128) NULL COMMENT ''预约账号'', ADD COLUMN seller_name VARCHAR(128) NULL COMMENT ''卖家姓名'' AFTER status' ));
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 = 'total_weight_kg' ), 'SELECT 1' , 'ALTER TABLE ll_delivery_order ADD COLUMN total_weight_kg DECIMAL(18,4) NOT NULL DEFAULT 0 COMMENT ''总重量(千克)'', ADD COLUMN total_volume_cbm DECIMAL(18,4) NOT NULL DEFAULT 0 COMMENT ''总体积(立方米)'', ADD COLUMN planned_delivery_at DATETIME(3) NULL COMMENT ''预计派送时间'', ADD COLUMN dispatched_at DATETIME(3) NULL COMMENT ''实际派送时间'', ADD COLUMN expected_arrival_at DATETIME(3) NULL COMMENT ''预计到达时间'', ADD COLUMN signed_at DATETIME(3) NULL COMMENT ''签收时间'', ADD COLUMN remark VARCHAR(1000) NULL COMMENT ''派送备注'' AFTER pallet_count' ));
PREPARE delivery_detail_stmt FROM @ ddl ; EXECUTE delivery_detail_stmt ; DEALLOCATE PREPARE delivery_detail_stmt ;
2026-09-09 11:22:47 +08:00
CREATE TABLE IF NOT EXISTS ll_delivery_document_revision (
id BIGINT NOT NULL COMMENT '派送资料历史ID' ,
customer_id VARCHAR ( 128 ) NOT NULL COMMENT '派送所属客户隔离键' ,
delivery_order_id BIGINT NOT NULL COMMENT '派送单ID' ,
version BIGINT NOT NULL COMMENT '保存成功时派送单版本' ,
idempotency_key VARCHAR ( 128 ) NOT NULL COMMENT '资料保存幂等键' ,
request_hash VARCHAR ( 64 ) NOT NULL COMMENT '完整保存请求哈希' ,
snapshot_json JSON NOT NULL COMMENT '不可变三类资料及BOL号结果快照' ,
operator_id VARCHAR ( 128 ) NOT NULL COMMENT '保存操作人ID' ,
created_at DATETIME ( 3 ) NOT NULL COMMENT '资料保存时间' ,
PRIMARY KEY ( id ),
UNIQUE KEY uk_delivery_document_command ( customer_id , delivery_order_id , idempotency_key ),
UNIQUE KEY uk_delivery_document_version ( customer_id , delivery_order_id , version )
) ENGINE = InnoDB COMMENT = '派送资料版本历史与幂等保存记录' ;
2026-08-26 13:51:19 +08:00
CREATE TABLE IF NOT EXISTS ll_delivery_operation (
id BIGINT NOT NULL COMMENT '派送操作主键' , customer_id VARCHAR ( 128 ) NOT NULL COMMENT '客户数据隔离键' , delivery_order_id BIGINT NOT NULL COMMENT '派送单ID' ,
operation_node VARCHAR ( 64 ) NOT NULL COMMENT '操作节点' , operator_id VARCHAR ( 128 ) NULL COMMENT '操作人ID' , operator_name VARCHAR ( 128 ) NULL COMMENT '操作人名称' ,
result VARCHAR ( 500 ) NOT NULL COMMENT '处理结果' , created_at DATETIME ( 3 ) NOT NULL DEFAULT CURRENT_TIMESTAMP ( 3 ) COMMENT '操作时间' ,
PRIMARY KEY ( id ), KEY idx_ll_delivery_operation_order ( customer_id , delivery_order_id , created_at , id )
) ENGINE = InnoDB COMMENT = '派送单操作记录' ;
2026-08-19 16:24:02 +08:00
CREATE TABLE IF NOT EXISTS ll_event_conflict (
id BIGINT NOT NULL COMMENT '冲突记录主键' , event_id VARCHAR ( 128 ) NOT NULL COMMENT '冲突事件 ID' ,
customer_id BIGINT NOT NULL COMMENT '租户 ID' , conflict_type VARCHAR ( 64 ) NOT NULL COMMENT '冲突类型' ,
conflict_message VARCHAR ( 512 ) NOT NULL COMMENT '冲突说明' , created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间' ,
PRIMARY KEY ( id ), KEY idx_ll_conflict_event ( event_id , customer_id )
) ENGINE = InnoDB COMMENT = '事件冲突记录' ;
CREATE TABLE IF NOT EXISTS ll_event_inbox (
id BIGINT NOT NULL COMMENT '事件接收记录主键' , event_id VARCHAR ( 128 ) NOT NULL COMMENT '事件全局唯一 ID' ,
customer_id BIGINT NOT NULL COMMENT '租户 ID' , event_type VARCHAR ( 128 ) NOT NULL COMMENT '事件类型' ,
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 '更新时间' ,
PRIMARY KEY ( id ), UNIQUE KEY uk_ll_inbox_event ( event_id ), KEY idx_ll_inbox_source ( customer_id , aggregate_id )
) ENGINE = InnoDB COMMENT = '通用事件接收幂等箱' ;
CREATE TABLE IF NOT EXISTS ll_inbound_order (
2026-08-24 17:37:15 +08:00
id BIGINT NOT NULL COMMENT '入仓单主键' , customer_id BIGINT NOT NULL COMMENT '客户账号标识' , source_region VARCHAR ( 32 ) NOT NULL COMMENT '来源区域' ,
2026-08-19 16:24:02 +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' ,
2026-09-06 16:02:11 +08:00
inbound_code VARCHAR ( 128 ) NULL COMMENT '入仓码' , lx_code VARCHAR ( 128 ) NULL COMMENT '一件代发领星入库单代码' , destination_warehouse_id VARCHAR ( 128 ) NULL COMMENT '目的仓 ID' ,
2026-08-19 16:24:02 +08:00
destination_warehouse_code VARCHAR ( 128 ) NULL COMMENT '目的仓编码' , destination_warehouse_name VARCHAR ( 255 ) NULL COMMENT '目的仓名称' ,
2026-08-24 17:15:48 +08:00
destination_type VARCHAR ( 32 ) NULL COMMENT '目的类型:FBA按箱数接收、OVERSEAS逐箱扫码' ,
2026-08-19 16:24:02 +08:00
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 '更新时间' ,
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 )
) ENGINE = InnoDB COMMENT = '尾程入仓单快照' ;
CREATE TABLE IF NOT EXISTS ll_inbound_order_item (
id BIGINT NOT NULL COMMENT '入仓明细主键' , customer_id BIGINT NOT NULL COMMENT '租户 ID' , order_id BIGINT NOT NULL COMMENT '入仓单 ID' ,
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 '英文品名' ,
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间' , PRIMARY KEY ( id ), KEY idx_ll_item_order ( customer_id , order_id )
) ENGINE = InnoDB COMMENT = '尾程入仓商品明细快照' ;
CREATE TABLE IF NOT EXISTS ll_order_status_history (
id BIGINT NOT NULL COMMENT '订单状态历史主键' , customer_id BIGINT NOT NULL COMMENT '租户 ID' , order_id BIGINT NOT NULL COMMENT '订单 ID' ,
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 = '尾程订单主表' ;
2026-08-20 15:20:05 +08:00
SET @ ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_order' AND column_name = 'source_container_booking_id' ), 'SELECT 1' , 'ALTER TABLE ll_order ADD COLUMN source_container_booking_id VARCHAR(128) NULL COMMENT ''来源头程货柜预订ID'' AFTER source_loading_plan_id' ));
PREPARE lastleg_order_container_booking_stmt FROM @ ddl ; EXECUTE lastleg_order_container_booking_stmt ; DEALLOCATE PREPARE lastleg_order_container_booking_stmt ;
2026-09-15 16:10:55 +08:00
SET @ ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_order' AND column_name = 'arrival_time_version' ), 'SELECT 1' , 'ALTER TABLE ll_order ADD COLUMN arrival_time_version INT NOT NULL DEFAULT 0 COMMENT ''柜级预计到仓时间乐观锁版本'' AFTER estimated_warehouse_at' ));
PREPARE lastleg_order_arrival_time_version_stmt FROM @ ddl ; EXECUTE lastleg_order_arrival_time_version_stmt ; DEALLOCATE PREPARE lastleg_order_arrival_time_version_stmt ;
2026-08-28 13:54:32 +08:00
SET @ ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . statistics WHERE table_schema = DATABASE () AND table_name = 'll_order' AND index_name = 'idx_ll_order_pending_container' ), 'ALTER TABLE ll_order DROP INDEX idx_ll_order_pending_container' , 'SELECT 1' ));
2026-08-27 17:16:33 +08:00
PREPARE lastleg_order_pending_container_idx_stmt FROM @ ddl ; EXECUTE lastleg_order_pending_container_idx_stmt ; DEALLOCATE PREPARE lastleg_order_pending_container_idx_stmt ;
2026-08-28 13:54:32 +08:00
SET @ ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . statistics WHERE table_schema = DATABASE () AND table_name = 'll_order' AND index_name = 'idx_ll_order_container_progress' ), 'SELECT 1' , 'ALTER TABLE ll_order ADD INDEX idx_ll_order_container_progress(source_container_booking_id,estimated_warehouse_at,created_at,id)' ));
PREPARE lastleg_order_container_progress_idx_stmt FROM @ ddl ; EXECUTE lastleg_order_container_progress_idx_stmt ; DEALLOCATE PREPARE lastleg_order_container_progress_idx_stmt ;
2026-08-24 17:15:48 +08:00
SET @ ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_order' AND column_name = 'destination_type' ), 'SELECT 1' , 'ALTER TABLE ll_order ADD COLUMN destination_type VARCHAR(32) NULL COMMENT ''目的类型:FBA按箱数接收、OVERSEAS逐箱扫码'' AFTER order_type' ));
PREPARE lastleg_order_destination_type_stmt FROM @ ddl ; EXECUTE lastleg_order_destination_type_stmt ; DEALLOCATE PREPARE lastleg_order_destination_type_stmt ;
2026-08-26 19:46:14 +08:00
SET @ ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_order' AND column_name = 'source_warehouse_id' ), 'SELECT 1' , 'ALTER TABLE ll_order ADD COLUMN source_warehouse_id VARCHAR(128) NULL COMMENT ''来源国内装柜仓 ID 快照'' AFTER customer_name' ));
PREPARE lastleg_order_source_warehouse_stmt FROM @ ddl ; EXECUTE lastleg_order_source_warehouse_stmt ; DEALLOCATE PREPARE lastleg_order_source_warehouse_stmt ;
SET @ ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_order' AND column_name = 'source_warehouse_name' ), 'SELECT 1' , 'ALTER TABLE ll_order ADD COLUMN source_warehouse_name VARCHAR(255) NULL COMMENT ''来源国内装柜仓名称快照'' AFTER source_warehouse_id' ));
PREPARE lastleg_order_source_warehouse_stmt FROM @ ddl ; EXECUTE lastleg_order_source_warehouse_stmt ; DEALLOCATE PREPARE lastleg_order_source_warehouse_stmt ;
2026-08-24 17:15:48 +08:00
SET @ ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_inbound_order' AND column_name = 'destination_type' ), 'SELECT 1' , 'ALTER TABLE ll_inbound_order ADD COLUMN destination_type VARCHAR(32) NULL COMMENT ''目的类型:FBA按箱数接收、OVERSEAS逐箱扫码'' AFTER destination_warehouse_name' ));
PREPARE lastleg_inbound_destination_type_stmt FROM @ ddl ; EXECUTE lastleg_inbound_destination_type_stmt ; DEALLOCATE PREPARE lastleg_inbound_destination_type_stmt ;
2026-08-19 16:24:02 +08:00
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' ,
MODIFY COLUMN customer_id BIGINT NOT NULL COMMENT '租户 ID' , MODIFY COLUMN conflict_type VARCHAR ( 64 ) NOT NULL COMMENT '冲突类型' ,
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
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' ,
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
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 '更新时间' ;
ALTER TABLE ll_inbound_order_item
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 '创建时间' ;
ALTER TABLE ll_order_status_history
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 '记录时间' ;
ALTER TABLE ll_loading_event_inbox
MODIFY COLUMN event_id VARCHAR ( 128 ) NOT NULL COMMENT '事件全局唯一标识' ,
MODIFY COLUMN customer_id VARCHAR ( 128 ) NOT NULL COMMENT '租户/客户账号标识' ,
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 '尾程单号' ,
MODIFY COLUMN customer_id VARCHAR ( 128 ) NOT NULL COMMENT '租户/客户账号标识' ,
MODIFY COLUMN order_type VARCHAR ( 32 ) NOT NULL DEFAULT 'FIRST_LEG' COMMENT '订单类型' ,
2026-09-07 12:30:17 +08:00
MODIFY COLUMN inbound_code VARCHAR ( 128 ) NULL COMMENT '真实来源入仓码;无入仓关系的海外本土业务为空' ,
2026-08-19 16:24:02 +08:00
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 '货主名称' ,
2026-09-10 10:34:24 +08:00
MODIFY COLUMN overseas_warehouse_id VARCHAR ( 128 ) NULL COMMENT '海外接柜仓ID;新建尾程订单由业务服务预分配' ,
MODIFY COLUMN overseas_warehouse_code VARCHAR ( 128 ) NULL COMMENT '海外接柜仓业务编码快照' ,
MODIFY COLUMN overseas_warehouse_name VARCHAR ( 255 ) NULL COMMENT '海外接柜仓名称快照' ,
2026-09-07 15:07:34 +08:00
MODIFY COLUMN receiving_warehouse_version INT NOT NULL DEFAULT 0 COMMENT '柜级接柜仓分配乐观锁版本' ,
2026-08-19 16:24:02 +08:00
MODIFY COLUMN fba_warehouse_code VARCHAR ( 128 ) NULL COMMENT 'FBA 仓库编码' ,
MODIFY COLUMN container_no VARCHAR ( 64 ) NULL 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' ,
2026-08-20 15:20:05 +08:00
MODIFY COLUMN source_container_booking_id VARCHAR ( 128 ) NULL COMMENT '来源头程货柜预订ID' ,
2026-08-19 16:24:02 +08:00
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 ,
'CREATE INDEX idx_ll_order_group ON ll_order(customer_id,order_no)' ,
'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 '入库单号' ,
customer_id VARCHAR ( 128 ) NOT NULL COMMENT '租户/客户账号标识' ,
2026-08-20 13:34:34 +08:00
source_order_id BIGINT NOT NULL COMMENT '来源尾程订单ID,一张入仓单对应一张入库计划' ,
2026-08-19 16:24:02 +08:00
container_no VARCHAR ( 64 ) NOT NULL COMMENT '集装箱号' ,
2026-09-07 15:07:34 +08:00
overseas_warehouse_id BIGINT NOT NULL DEFAULT 193000000000200003 COMMENT '平台预分配的海外实际收货共享物理仓ID' ,
2026-09-07 23:58:18 +08:00
planned_arrival_date DATE NULL COMMENT '人工计划预计到仓日期' ,
pallet_type VARCHAR ( 32 ) NULL COMMENT '人工计划托盘类型' ,
assigned_flag TINYINT NOT NULL DEFAULT 0 COMMENT '人工计划是否已分配:0否1是' ,
merge_required TINYINT NOT NULL DEFAULT 0 COMMENT '人工计划是否要求合托:0否1是' ,
urgent_flag TINYINT NOT NULL DEFAULT 0 COMMENT '人工计划是否加急:0否1是' ,
2026-09-17 17:37:29 +08:00
creation_mode VARCHAR ( 32 ) NOT NULL DEFAULT 'AUTO' COMMENT '计划生成方式:AUTO柜级自动、MANUAL单票人工、WAREHOUSE_TRANSFER仓储转运' ,
2026-09-07 23:58:18 +08:00
plan_remark VARCHAR ( 1000 ) NULL COMMENT '入仓计划备注' ,
2026-08-19 16:24:02 +08:00
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 '更新时间' ,
2026-08-31 14:39:40 +08:00
version INT NOT NULL DEFAULT 0 COMMENT '入库计划乐观锁版本' ,
2026-08-19 16:24:02 +08:00
PRIMARY KEY ( id ),
UNIQUE KEY uk_ll_inbound_plan_no ( plan_no ),
2026-08-20 13:34:34 +08:00
UNIQUE KEY uk_ll_inbound_plan_source_order ( customer_id , source_order_id ),
KEY idx_ll_inbound_plan_container ( customer_id , container_no )
) ENGINE = InnoDB COMMENT = '尾程入库计划表:每张来源入仓单生成一张入库计划,同柜计划共享集装箱号' ;
2026-08-19 16:24:02 +08:00
2026-09-09 00:15:23 +08:00
CREATE TABLE IF NOT EXISTS ll_container_plan_conversion_command (
id BIGINT NOT NULL COMMENT '柜级转换命令ID' ,
source_container_booking_id VARCHAR ( 128 ) NOT NULL COMMENT '稳定来源柜预订ID' ,
idempotency_key VARCHAR ( 128 ) NOT NULL COMMENT '调用方幂等键' ,
request_hash CHAR ( 64 ) NOT NULL COMMENT '确认请求SHA-256摘要' ,
snapshot_version BIGINT NOT NULL COMMENT '确认的柜级快照版本' ,
snapshot_hash CHAR ( 64 ) NOT NULL COMMENT '确认的柜级快照SHA-256' ,
warehouse_id BIGINT NOT NULL COMMENT '海外接柜仓ID' ,
batch_key VARCHAR ( 160 ) NOT NULL COMMENT '海外仓托盘批次幂等键' ,
2026-09-09 00:31:50 +08:00
status VARCHAR ( 32 ) NOT NULL COMMENT '命令状态:PREPARED/APPLYING/FAILED/LOCAL_COMMITTED/COMPLETED' ,
lease_token VARCHAR ( 64 ) NULL COMMENT '当前执行租约令牌,用于陈旧执行者隔离' ,
2026-09-09 00:15:23 +08:00
preparation_json JSON NOT NULL COMMENT '稳定计划号与托盘业务键快照' ,
result_json JSON NULL COMMENT '本地计划提交结果' ,
last_error VARCHAR ( 1000 ) NULL COMMENT '最近一次跨服务错误' ,
2026-09-09 00:31:50 +08:00
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 '命令状态或租约更新时间' ,
2026-09-09 00:15:23 +08:00
PRIMARY KEY ( id ),
UNIQUE KEY uk_ll_container_conversion_command ( source_container_booking_id ),
UNIQUE KEY uk_ll_container_conversion_batch ( warehouse_id , batch_key ),
KEY idx_ll_container_conversion_status ( status , updated_at )
) ENGINE = InnoDB COMMENT = '柜级入库计划转换Saga与幂等命令' ;
2026-09-09 00:31:50 +08:00
SET @ ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_container_plan_conversion_command' AND column_name = 'lease_token' ), 'SELECT 1' , 'ALTER TABLE ll_container_plan_conversion_command ADD COLUMN lease_token VARCHAR(64) NULL COMMENT ''当前执行租约令牌,用于陈旧执行者隔离'' AFTER status' ));
PREPARE container_conversion_lease_stmt FROM @ ddl ; EXECUTE container_conversion_lease_stmt ; DEALLOCATE PREPARE container_conversion_lease_stmt ;
2026-09-09 00:15:23 +08:00
2026-08-19 16:24:02 +08:00
CREATE TABLE IF NOT EXISTS ll_inbound_plan_line (
id BIGINT NOT NULL COMMENT '入库计划明细ID(雪花ID) ' ,
2026-08-24 17:15:48 +08:00
customer_id VARCHAR ( 128 ) NOT NULL COMMENT '客户账号标识' ,
2026-08-19 16:24:02 +08:00
plan_id BIGINT NOT NULL COMMENT '入库计划ID' ,
order_id BIGINT NOT NULL COMMENT '尾程订单ID' ,
inbound_code VARCHAR ( 128 ) NOT NULL COMMENT '头程入仓码快照' ,
2026-08-24 17:15:48 +08:00
destination_type VARCHAR ( 32 ) NOT NULL DEFAULT 'OVERSEAS' COMMENT '目的类型:FBA按箱数接收、OVERSEAS逐箱扫码' ,
2026-08-19 16:24:02 +08:00
destination_warehouse_id VARCHAR ( 128 ) NULL COMMENT '目的仓ID快照' ,
destination_warehouse_code VARCHAR ( 128 ) NULL COMMENT '目的仓编码快照' ,
destination_warehouse_name VARCHAR ( 255 ) NULL COMMENT '目的仓名称快照' ,
2026-09-17 17:37:29 +08:00
delivery_address VARCHAR ( 1000 ) NULL COMMENT '私人仓目的地址快照' ,
postal_code VARCHAR ( 32 ) NULL COMMENT '私人仓邮编快照' ,
contact_name VARCHAR ( 128 ) NULL COMMENT '私人仓联系人快照' ,
contact_phone VARCHAR ( 64 ) NULL COMMENT '私人仓联系电话快照' ,
2026-08-19 16:24:02 +08:00
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 ),
2026-08-24 17:37:15 +08:00
KEY idx_ll_inbound_line_plan ( plan_id ),
KEY idx_ll_inbound_line_customer_plan ( customer_id , plan_id )
2026-08-19 16:24:02 +08:00
) ENGINE = InnoDB COMMENT = '尾程入库计划明细表:按入仓码和尾程订单维度记录' ;
2026-08-20 13:34:34 +08:00
CREATE TABLE IF NOT EXISTS ll_inbound_plan_carton (
id BIGINT NOT NULL COMMENT '箱唛作业主键' , customer_id VARCHAR ( 128 ) NOT NULL COMMENT '客户租户ID' ,
2026-08-22 10:16:45 +08:00
order_id BIGINT NULL COMMENT '生成尾程订单时绑定的尾程订单ID' , source_inbound_detail_id VARCHAR ( 128 ) NOT NULL COMMENT '来源入库明细ID' ,
2026-08-20 13:34:34 +08:00
sku_code VARCHAR ( 128 ) NULL COMMENT 'SKU编码快照' , carton_mark 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 '目的仓名称快照' , plan_id BIGINT NULL COMMENT '海外入库计划ID' ,
line_id BIGINT NULL COMMENT '入库计划明细ID' , plan_pallet_id BIGINT NULL COMMENT '海外计划托盘ID' , warehouse_pallet_id BIGINT NULL COMMENT '海外实物托盘ID' ,
warehouse_location_id BIGINT NULL COMMENT '海外库位ID' , pda_task_id BIGINT NULL COMMENT '首次扫码PDA任务ID' ,
2026-10-14 18:01:25 +08:00
status VARCHAR ( 32 ) NOT NULL COMMENT '箱唛状态:未绑定UNASSIGNED、已绑托ON_PALLET、整票收货BULK_RECEIVED、可用AVAILABLE、待废弃DISCARD_PENDING、已废弃DISCARDED' , version INT NOT NULL DEFAULT 0 COMMENT '乐观锁版本' ,
2026-08-20 13:34:34 +08:00
bound_at DATETIME ( 3 ) NULL COMMENT '绑定托盘时间' , received_at DATETIME ( 3 ) NULL 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_carton_mark ( customer_id , carton_mark ),
KEY idx_ll_inbound_carton_plan ( plan_id , status ), KEY idx_ll_inbound_carton_pallet ( plan_pallet_id , status ),
KEY idx_ll_inbound_carton_order ( order_id , status )
) ENGINE = InnoDB COMMENT = '柜次冻结箱唛及海外入库箱级作业账' ;
2026-08-19 16:24:02 +08:00
CREATE TABLE IF NOT EXISTS ll_inbound_plan_pallet (
id BIGINT NOT NULL COMMENT '计划托盘ID(雪花ID) ' ,
2026-08-24 17:37:15 +08:00
customer_id VARCHAR ( 128 ) NOT NULL COMMENT '客户账号标识' ,
2026-08-19 16:24:02 +08:00
plan_id BIGINT NOT NULL COMMENT '入库计划ID' ,
2026-09-09 00:15:23 +08:00
pallet_no VARCHAR ( 128 ) NOT NULL COMMENT '海外仓资源服务返回的真实托盘码' ,
2026-09-07 21:10:43 +08:00
source_pallet_no VARCHAR ( 128 ) NULL COMMENT '一件代发不可变来源托盘号快照' ,
2026-09-07 23:58:18 +08:00
pallet_type VARCHAR ( 32 ) NULL COMMENT '人工计划托盘类型' ,
2026-08-19 16:24:02 +08:00
destination_warehouse_id VARCHAR ( 128 ) NULL COMMENT '目的仓ID快照' ,
destination_warehouse_code VARCHAR ( 128 ) NULL COMMENT '目的仓编码快照' ,
destination_warehouse_name VARCHAR ( 255 ) NULL COMMENT '目的仓名称快照' ,
2026-09-17 17:37:29 +08:00
destination_type VARCHAR ( 32 ) NULL COMMENT '目的类型:FBA或PRIVATE' ,
delivery_address VARCHAR ( 1000 ) NULL COMMENT '私人仓目的地址快照' ,
postal_code VARCHAR ( 32 ) NULL COMMENT '私人仓邮编快照' ,
contact_name VARCHAR ( 128 ) NULL COMMENT '私人仓联系人快照' ,
contact_phone VARCHAR ( 64 ) NULL COMMENT '私人仓联系电话快照' ,
2026-08-19 16:24:02 +08:00
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 '计划内托盘序号' ,
2026-09-10 22:43:11 +08:00
version INT NOT NULL DEFAULT 0 COMMENT '收货累计值乐观锁版本' ,
2026-08-19 16:24:02 +08:00
PRIMARY KEY ( id ),
2026-09-10 22:43:11 +08:00
KEY idx_ll_inbound_pallet_no ( pallet_no ),
2026-08-19 16:24:02 +08:00
UNIQUE KEY uk_ll_inbound_pallet_sequence ( plan_id , sequence_no ),
2026-08-24 17:37:15 +08:00
KEY idx_ll_inbound_pallet_plan ( plan_id ),
KEY idx_ll_inbound_pallet_customer_plan ( customer_id , plan_id )
2026-08-19 16:24:02 +08:00
) ENGINE = InnoDB COMMENT = '尾程入库计划托盘表:按目的仓隔离合托' ;
CREATE TABLE IF NOT EXISTS ll_inbound_plan_pallet_allocation (
id BIGINT NOT NULL COMMENT '托盘分配记录ID(雪花ID) ' ,
2026-08-24 17:37:15 +08:00
customer_id VARCHAR ( 128 ) NOT NULL COMMENT '客户账号标识' ,
2026-08-19 16:24:02 +08:00
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 ),
2026-08-24 17:37:15 +08:00
KEY idx_ll_inbound_allocation_customer_plan ( customer_id , plan_id ),
2026-08-19 16:24:02 +08:00
KEY idx_ll_inbound_allocation_pallet ( pallet_id )
) ENGINE = InnoDB COMMENT = '尾程入库计划托盘分配表:记录入仓码明细与计划托盘的分配关系' ;
2026-08-20 13:34:34 +08:00
-- 修复既有入库计划表的注释;历史“每柜一张计划”记录不在这里猜测拆分。
ALTER TABLE ll_inbound_plan COMMENT = '尾程入库计划表:每张来源入仓单生成一张入库计划,同柜计划共享集装箱号' ;
2026-08-20 15:20:05 +08:00
SET @ ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_inbound_plan' AND column_name = 'source_order_id' ), 'SELECT 1' , 'ALTER TABLE ll_inbound_plan ADD COLUMN source_order_id BIGINT NOT NULL DEFAULT 0 COMMENT ''来源尾程订单ID,一张入仓单对应一张入库计划'' AFTER customer_id' ));
PREPARE inbound_plan_source_order_stmt FROM @ ddl ; EXECUTE inbound_plan_source_order_stmt ; DEALLOCATE PREPARE inbound_plan_source_order_stmt ;
2026-09-07 23:58:18 +08:00
SET @ ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_inbound_plan' AND column_name = 'planned_arrival_date' ), 'SELECT 1' , 'ALTER TABLE ll_inbound_plan ADD COLUMN planned_arrival_date DATE NULL COMMENT ''人工计划预计到仓日期'' AFTER overseas_warehouse_id' ));
PREPARE inbound_plan_manual_stmt FROM @ ddl ; EXECUTE inbound_plan_manual_stmt ; DEALLOCATE PREPARE inbound_plan_manual_stmt ;
SET @ ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_inbound_plan' AND column_name = 'pallet_type' ), 'SELECT 1' , 'ALTER TABLE ll_inbound_plan ADD COLUMN pallet_type VARCHAR(32) NULL COMMENT ''人工计划托盘类型'' AFTER planned_arrival_date' ));
PREPARE inbound_plan_manual_stmt FROM @ ddl ; EXECUTE inbound_plan_manual_stmt ; DEALLOCATE PREPARE inbound_plan_manual_stmt ;
SET @ ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_inbound_plan' AND column_name = 'assigned_flag' ), 'SELECT 1' , 'ALTER TABLE ll_inbound_plan ADD COLUMN assigned_flag TINYINT NOT NULL DEFAULT 0 COMMENT ''人工计划是否已分配:0否1是'' AFTER pallet_type' ));
PREPARE inbound_plan_manual_stmt FROM @ ddl ; EXECUTE inbound_plan_manual_stmt ; DEALLOCATE PREPARE inbound_plan_manual_stmt ;
SET @ ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_inbound_plan' AND column_name = 'merge_required' ), 'SELECT 1' , 'ALTER TABLE ll_inbound_plan ADD COLUMN merge_required TINYINT NOT NULL DEFAULT 0 COMMENT ''人工计划是否要求合托:0否1是'' AFTER assigned_flag' ));
PREPARE inbound_plan_manual_stmt FROM @ ddl ; EXECUTE inbound_plan_manual_stmt ; DEALLOCATE PREPARE inbound_plan_manual_stmt ;
SET @ ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_inbound_plan' AND column_name = 'urgent_flag' ), 'SELECT 1' , 'ALTER TABLE ll_inbound_plan ADD COLUMN urgent_flag TINYINT NOT NULL DEFAULT 0 COMMENT ''人工计划是否加急:0否1是'' AFTER merge_required' ));
PREPARE inbound_plan_manual_stmt FROM @ ddl ; EXECUTE inbound_plan_manual_stmt ; DEALLOCATE PREPARE inbound_plan_manual_stmt ;
2026-09-17 17:37:29 +08:00
SET @ ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_inbound_plan' AND column_name = 'creation_mode' ), 'SELECT 1' , 'ALTER TABLE ll_inbound_plan ADD COLUMN creation_mode VARCHAR(32) NOT NULL DEFAULT ''AUTO'' COMMENT ''计划生成方式:AUTO柜级自动、MANUAL单票人工、WAREHOUSE_TRANSFER仓储转运'' AFTER urgent_flag' ));
2026-09-07 23:58:18 +08:00
PREPARE inbound_plan_manual_stmt FROM @ ddl ; EXECUTE inbound_plan_manual_stmt ; DEALLOCATE PREPARE inbound_plan_manual_stmt ;
2026-09-17 17:37:29 +08:00
ALTER TABLE ll_inbound_plan MODIFY COLUMN creation_mode VARCHAR ( 32 ) NOT NULL DEFAULT 'AUTO' COMMENT '计划生成方式:AUTO柜级自动、MANUAL单票人工、WAREHOUSE_TRANSFER仓储转运' ;
UPDATE ll_inbound_plan_pallet_allocation a
JOIN ll_inbound_plan p ON p . id = a . plan_id
SET a . picked_package_count = COALESCE ( a . counted_package_count , a . planned_package_count , 0 )
WHERE p . creation_mode = 'WAREHOUSE_TRANSFER' AND p . status = 'COMPLETED'
AND COALESCE ( a . picked_package_count , 0 ) = 0
AND COALESCE ( a . counted_package_count , a . planned_package_count , 0 ) > 0 ;
2026-09-07 23:58:18 +08:00
SET @ ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_inbound_plan' AND column_name = 'plan_remark' ), 'SELECT 1' , 'ALTER TABLE ll_inbound_plan ADD COLUMN plan_remark VARCHAR(1000) NULL COMMENT ''入仓计划备注'' AFTER creation_mode' ));
PREPARE inbound_plan_manual_stmt FROM @ ddl ; EXECUTE inbound_plan_manual_stmt ; DEALLOCATE PREPARE inbound_plan_manual_stmt ;
2026-08-19 16:24:02 +08:00
ALTER TABLE ll_inbound_plan
MODIFY COLUMN id BIGINT NOT NULL COMMENT '入库计划ID(雪花ID) ' ,
MODIFY COLUMN plan_no VARCHAR ( 32 ) NOT NULL COMMENT '入库单号' ,
MODIFY COLUMN customer_id VARCHAR ( 128 ) NOT NULL COMMENT '租户/客户账号标识' ,
2026-08-20 13:34:34 +08:00
MODIFY COLUMN source_order_id BIGINT NOT NULL COMMENT '来源尾程订单ID,一张入仓单对应一张入库计划' ,
2026-08-19 16:24:02 +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) ' ,
2026-08-24 17:37:15 +08:00
MODIFY COLUMN customer_id VARCHAR ( 128 ) NOT NULL COMMENT '客户账号标识' ,
2026-08-19 16:24:02 +08:00
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' ,
2026-09-09 00:15:23 +08:00
MODIFY COLUMN pallet_no VARCHAR ( 128 ) NOT NULL COMMENT '海外仓资源服务返回的真实托盘码' ,
2026-08-19 16:24:02 +08:00
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.
2026-09-01 16:30:41 +08:00
ALTER TABLE ll_inbound_plan MODIFY COLUMN status VARCHAR ( 32 ) NOT NULL DEFAULT 'PENDING_ASSIGNMENT' COMMENT '入库计划状态: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 COMMENT ''计划明细应收箱数''' ));
2026-08-19 16:24:02 +08:00
PREPARE inbound_schema_stmt FROM @ ddl ; EXECUTE inbound_schema_stmt ; DEALLOCATE PREPARE inbound_schema_stmt ;
2026-09-01 16:30:41 +08:00
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 COMMENT ''海外仓实物托盘ID''' ));
2026-08-19 16:24:02 +08:00
PREPARE inbound_schema_stmt FROM @ ddl ; EXECUTE inbound_schema_stmt ; DEALLOCATE PREPARE inbound_schema_stmt ;
2026-09-07 23:58:18 +08:00
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 = 'pallet_type' ), 'SELECT 1' , 'ALTER TABLE ll_inbound_plan_pallet ADD COLUMN pallet_type VARCHAR(32) NULL COMMENT ''人工计划托盘类型'' AFTER pallet_no' ));
PREPARE inbound_schema_stmt FROM @ ddl ; EXECUTE inbound_schema_stmt ; DEALLOCATE PREPARE inbound_schema_stmt ;
2026-09-01 16:30:41 +08:00
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 COMMENT ''海外仓库位ID''' ));
2026-08-19 16:24:02 +08:00
PREPARE inbound_schema_stmt FROM @ ddl ; EXECUTE inbound_schema_stmt ; DEALLOCATE PREPARE inbound_schema_stmt ;
2026-09-01 16:30:41 +08:00
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 COMMENT ''海外仓资源锁ID''' ));
2026-08-19 16:24:02 +08:00
PREPARE inbound_schema_stmt FROM @ ddl ; EXECUTE inbound_schema_stmt ; DEALLOCATE PREPARE inbound_schema_stmt ;
2026-09-01 16:30:41 +08:00
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'' COMMENT ''托盘分配状态:UNASSIGNED未分配及后续正式状态''' ));
2026-08-19 16:24:02 +08:00
PREPARE inbound_schema_stmt FROM @ ddl ; EXECUTE inbound_schema_stmt ; DEALLOCATE PREPARE inbound_schema_stmt ;
2026-09-01 16:30:41 +08:00
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 COMMENT ''资源锁定时间''' ));
2026-08-19 16:24:02 +08:00
PREPARE inbound_schema_stmt FROM @ ddl ; EXECUTE inbound_schema_stmt ; DEALLOCATE PREPARE inbound_schema_stmt ;
2026-09-01 16:30:41 +08:00
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 COMMENT ''实收体积(立方米)''' ));
2026-08-19 16:24:02 +08:00
PREPARE inbound_schema_stmt FROM @ ddl ; EXECUTE inbound_schema_stmt ; DEALLOCATE PREPARE inbound_schema_stmt ;
2026-09-01 16:30:41 +08:00
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 COMMENT ''实收箱数''' ));
2026-08-19 16:24:02 +08:00
PREPARE inbound_schema_stmt FROM @ ddl ; EXECUTE inbound_schema_stmt ; DEALLOCATE PREPARE inbound_schema_stmt ;
2026-09-11 00:06:57 +08:00
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 = 'version' ), 'SELECT 1' , 'ALTER TABLE ll_inbound_plan_pallet ADD COLUMN version INT NOT NULL DEFAULT 0 COMMENT ''收货累计值乐观锁版本''' ));
PREPARE inbound_schema_stmt FROM @ ddl ; EXECUTE inbound_schema_stmt ; DEALLOCATE PREPARE inbound_schema_stmt ;
2026-09-01 16:30:41 +08:00
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 COMMENT ''计划分配箱数''' ));
2026-08-19 16:24:02 +08:00
PREPARE inbound_schema_stmt FROM @ ddl ; EXECUTE inbound_schema_stmt ; DEALLOCATE PREPARE inbound_schema_stmt ;
2026-09-01 16:30:41 +08:00
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 COMMENT ''清点箱数''' ));
2026-08-19 16:24:02 +08:00
PREPARE inbound_schema_stmt FROM @ ddl ; EXECUTE inbound_schema_stmt ; DEALLOCATE PREPARE inbound_schema_stmt ;
2026-09-01 16:30:41 +08:00
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 COMMENT ''已拣箱数''' ));
2026-08-19 16:24:02 +08:00
PREPARE inbound_schema_stmt FROM @ ddl ; EXECUTE inbound_schema_stmt ; DEALLOCATE PREPARE inbound_schema_stmt ;
2026-09-01 16:30:41 +08:00
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 COMMENT ''实收体积(立方米)''' ));
2026-08-19 16:24:02 +08:00
PREPARE inbound_schema_stmt FROM @ ddl ; EXECUTE inbound_schema_stmt ; DEALLOCATE PREPARE inbound_schema_stmt ;
2026-09-01 16:30:41 +08:00
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'' COMMENT ''分配作业状态:PENDING_COUNT待清点及后续正式状态''' ));
2026-08-19 16:24:02 +08:00
PREPARE inbound_schema_stmt FROM @ ddl ; EXECUTE inbound_schema_stmt ; DEALLOCATE PREPARE inbound_schema_stmt ;
2026-09-01 16:30:41 +08:00
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 COMMENT ''托盘分配乐观锁版本''' ));
2026-08-19 16:24:02 +08:00
PREPARE inbound_schema_stmt FROM @ ddl ; EXECUTE inbound_schema_stmt ; DEALLOCATE PREPARE inbound_schema_stmt ;
CREATE TABLE IF NOT EXISTS ll_inbound_pda_task (
id BIGINT NOT NULL COMMENT '主键ID' , customer_id VARCHAR ( 128 ) NOT NULL COMMENT '客户租户ID' , plan_id BIGINT NOT NULL COMMENT '入仓计划ID' ,
task_no VARCHAR ( 64 ) NOT NULL COMMENT 'PDA任务号' , status VARCHAR ( 32 ) NOT NULL DEFAULT 'PENDING' COMMENT '业务状态' ,
operator_id VARCHAR ( 128 ) NULL COMMENT '操作人ID' , operator_name VARCHAR ( 255 ) NULL COMMENT '操作人姓名' ,
pushed_at DATETIME ( 3 ) NULL COMMENT '任务下发时间' , started_at DATETIME ( 3 ) NULL COMMENT '开始时间' , completed_at DATETIME ( 3 ) NULL COMMENT '完成时间' ,
2026-08-20 15:20:05 +08:00
unload_photo_file_ids JSON NULL COMMENT '卸柜照片文件ID列表' , unload_photo_uploaded_at DATETIME ( 3 ) NULL COMMENT '卸柜照片上传成功时间' ,
estimated_empty_return_at DATETIME ( 3 ) NULL COMMENT '预计报空时间(卸柜照片上传成功后两天)' ,
2026-08-19 16:24:02 +08:00
version INT 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_pda_task_plan ( customer_id , plan_id ),
UNIQUE KEY uk_ll_inbound_pda_task_no ( task_no )
) ENGINE = InnoDB COMMENT = '入仓PDA作业任务' ;
2026-08-20 15:20:05 +08:00
SET @ ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_inbound_pda_task' AND column_name = 'unload_photo_file_ids' ), 'SELECT 1' , 'ALTER TABLE ll_inbound_pda_task ADD COLUMN unload_photo_file_ids JSON NULL COMMENT ''卸柜照片文件ID列表'' AFTER completed_at' ));
PREPARE inbound_pda_photo_stmt FROM @ ddl ; EXECUTE inbound_pda_photo_stmt ; DEALLOCATE PREPARE inbound_pda_photo_stmt ;
SET @ ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_inbound_pda_task' AND column_name = 'unload_photo_uploaded_at' ), 'SELECT 1' , 'ALTER TABLE ll_inbound_pda_task ADD COLUMN unload_photo_uploaded_at DATETIME(3) NULL COMMENT ''卸柜照片上传成功时间'' AFTER unload_photo_file_ids' ));
PREPARE inbound_pda_photo_stmt FROM @ ddl ; EXECUTE inbound_pda_photo_stmt ; DEALLOCATE PREPARE inbound_pda_photo_stmt ;
SET @ ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_inbound_pda_task' AND column_name = 'estimated_empty_return_at' ), 'SELECT 1' , 'ALTER TABLE ll_inbound_pda_task ADD COLUMN estimated_empty_return_at DATETIME(3) NULL COMMENT ''预计报空时间(卸柜照片上传成功后两天)'' AFTER unload_photo_uploaded_at' ));
PREPARE inbound_pda_photo_stmt FROM @ ddl ; EXECUTE inbound_pda_photo_stmt ; DEALLOCATE PREPARE inbound_pda_photo_stmt ;
CREATE TABLE IF NOT EXISTS ll_event_outbox (
id BIGINT NOT NULL COMMENT '事件主键ID' , customer_id VARCHAR ( 128 ) NOT NULL COMMENT '客户租户ID' ,
aggregate_type VARCHAR ( 64 ) NOT NULL COMMENT '聚合类型' , aggregate_id VARCHAR ( 128 ) NOT NULL COMMENT '聚合标识' ,
event_type VARCHAR ( 64 ) NOT NULL COMMENT '事件类型' , event_version INT NOT NULL COMMENT '事件版本' ,
event_key VARCHAR ( 255 ) NOT NULL COMMENT '业务幂等键' , payload_json LONGTEXT NOT NULL COMMENT '事件载荷JSON' ,
status VARCHAR ( 32 ) NOT NULL DEFAULT 'PENDING' COMMENT '发布状态' , retry_count INT NOT NULL DEFAULT 0 COMMENT '重试次数' ,
next_retry_at DATETIME ( 3 ) NULL COMMENT '下次重试时间' , published_at DATETIME ( 3 ) NULL COMMENT '发布时间' ,
2026-08-20 18:02:38 +08:00
locked_at DATETIME ( 3 ) NULL COMMENT '投递租约获取时间' , locked_by VARCHAR ( 128 ) NULL COMMENT '投递租约持有者' ,
2026-08-20 15:20:05 +08:00
last_error VARCHAR ( 1000 ) NULL COMMENT '最后一次发布错误' , created_at DATETIME ( 3 ) NOT NULL DEFAULT CURRENT_TIMESTAMP ( 3 ) COMMENT '创建时间' ,
PRIMARY KEY ( id ), UNIQUE KEY uk_ll_event_outbox_key ( event_key ),
KEY idx_ll_event_outbox_publish ( status , next_retry_at , created_at )
) ENGINE = InnoDB COMMENT = '尾程跨区业务事件发件箱' ;
2026-09-02 16:17:41 +08:00
CREATE TABLE IF NOT EXISTS ll_finance_fee_source (
id BIGINT NOT NULL COMMENT '费用版本记录ID' , source_fee_id BIGINT NOT NULL COMMENT '跨版本稳定费用来源ID' ,
source_version INT NOT NULL COMMENT '费用来源版本,从1递增' , customer_id VARCHAR ( 128 ) NOT NULL COMMENT '客户ID和隔离键' ,
customer_name VARCHAR ( 200 ) NULL COMMENT '客户名称快照' , source_type VARCHAR ( 64 ) NOT NULL COMMENT '海外费用来源类型' ,
source_no VARCHAR ( 128 ) NOT NULL COMMENT '来源业务编号或入仓码快照' , business_type VARCHAR ( 32 ) NOT NULL COMMENT '来源业务类型' ,
business_id BIGINT NULL COMMENT '来源业务记录ID' , business_no VARCHAR ( 128 ) NOT NULL COMMENT '来源业务编号' ,
order_id BIGINT NULL COMMENT '关联订单ID' , inbound_id BIGINT NULL COMMENT '关联海外入仓计划或入仓记录ID' ,
inbound_code VARCHAR ( 64 ) NULL COMMENT '关联入仓码;并非所有费用必填' , container_id BIGINT NULL COMMENT '关联柜次ID' ,
container_booking_id BIGINT NULL COMMENT '来源订舱柜ID' , container_no VARCHAR ( 64 ) NULL COMMENT '真实集装箱号快照' ,
warehouse_id BIGINT NULL COMMENT '关联海外仓ID' , fee_item_code VARCHAR ( 64 ) NOT NULL COMMENT '费用项目编码快照' ,
fee_item_name VARCHAR ( 200 ) NOT NULL COMMENT '费用项目名称快照' , direction VARCHAR ( 16 ) NOT NULL COMMENT 'RECEIVABLE应收或PAYABLE应付' ,
supplier_id BIGINT NULL COMMENT '应付供应商ID' , supplier_name VARCHAR ( 200 ) NULL COMMENT '应付供应商名称快照' ,
supplier_category VARCHAR ( 32 ) NULL COMMENT '应付供应商类别约束' , settlement_mode VARCHAR ( 16 ) NULL COMMENT 'ON_ACCOUNT账期应付或DIRECT_PAID业务已付' ,
paid_at DATETIME ( 3 ) NULL COMMENT '直接已付时间' , payment_method VARCHAR ( 32 ) NULL COMMENT '直接已付方式' ,
payment_reference_no VARCHAR ( 128 ) NULL COMMENT '直接已付流水号' , payment_voucher_file_ids JSON NULL COMMENT '直接已付凭证文件ID快照' ,
2026-10-10 02:19:38 +08:00
wallet_settlement JSON NULL COMMENT '已实扣应收的Finance资金命令、冻结和消费流水引用' ,
2026-09-09 15:27:10 +08:00
business_date DATE NOT NULL COMMENT '费用业务日期' , currency CHAR ( 3 ) NOT NULL DEFAULT 'CNY' COMMENT '财务结算币种,固定CNY' ,
amount DECIMAL ( 20 , 6 ) NOT NULL COMMENT '人民币结算金额' , original_currency CHAR ( 3 ) NOT NULL COMMENT '业务原币种,支持CNY或USD' ,
original_amount DECIMAL ( 20 , 6 ) NOT NULL COMMENT '业务原币金额' , exchange_rate DECIMAL ( 20 , 6 ) NOT NULL COMMENT '原币折算人民币汇率,人民币固定为1' ,
exchange_rate_month CHAR ( 7 ) NOT NULL COMMENT '汇率月份yyyy-MM' , chargeable_quantity DECIMAL ( 20 , 6 ) NULL COMMENT '计费数量,如箱数、托数、体积或天数' ,
quantity_unit VARCHAR ( 32 ) NULL COMMENT '计费数量单位' , unit_price DECIMAL ( 20 , 6 ) NULL COMMENT '原币计费单价' ,
period_start DATE NULL COMMENT '仓租等期间费用开始日期' , period_end DATE NULL COMMENT '仓租等期间费用结束日期' ,
review_status VARCHAR ( 16 ) NOT NULL COMMENT 'DRAFT、PENDING、APPROVED或REJECTED' ,
2026-09-02 16:17:41 +08:00
publication_status VARCHAR ( 16 ) NOT NULL COMMENT 'UNPUBLISHED或PUBLISHED' , source_status VARCHAR ( 16 ) NOT NULL COMMENT 'ACTIVE、SUPERSEDED或VOIDED' ,
review_reason VARCHAR ( 500 ) NULL COMMENT '审核或作废原因' , reviewer_id VARCHAR ( 128 ) NULL COMMENT '审核人ID' , reviewed_at DATETIME ( 3 ) NULL COMMENT '审核时间' ,
created_by VARCHAR ( 128 ) NOT NULL COMMENT '创建人ID' , updated_by VARCHAR ( 128 ) NOT NULL COMMENT '最后更新人ID' ,
created_at DATETIME ( 3 ) NOT NULL COMMENT '创建时间' , updated_at DATETIME ( 3 ) NOT NULL COMMENT '最后更新时间' ,
PRIMARY KEY ( id ), UNIQUE KEY uk_ll_finance_fee_version ( source_fee_id , source_version ),
KEY idx_ll_finance_fee_customer ( customer_id , source_status , created_at ), KEY idx_ll_finance_fee_business ( business_type , business_no , created_at ),
2026-09-08 21:45:57 +08:00
KEY idx_ll_finance_fee_container_customer ( container_booking_id , customer_id , source_status , created_at ),
2026-09-02 16:17:41 +08:00
CONSTRAINT chk_ll_finance_fee_amount CHECK ( amount > 0 ), CONSTRAINT chk_ll_finance_fee_currency CHECK ( currency = 'CNY' ),
2026-09-09 15:27:10 +08:00
CONSTRAINT chk_ll_finance_fee_original_currency CHECK ( original_currency IN ( 'CNY' , 'USD' )),
CONSTRAINT chk_ll_finance_fee_period CHECK (( period_start IS NULL AND period_end IS NULL ) OR ( period_start IS NOT NULL AND period_end IS NOT NULL AND period_start <= period_end )),
2026-09-02 16:17:41 +08:00
CONSTRAINT chk_ll_finance_fee_direction CHECK ( direction IN ( 'RECEIVABLE' , 'PAYABLE' )),
CONSTRAINT chk_ll_finance_fee_review CHECK ( review_status IN ( 'DRAFT' , 'PENDING' , 'APPROVED' , 'REJECTED' )),
CONSTRAINT chk_ll_finance_fee_publication CHECK ( publication_status IN ( 'UNPUBLISHED' , 'PUBLISHED' )),
CONSTRAINT chk_ll_finance_fee_status CHECK ( source_status IN ( 'ACTIVE' , 'SUPERSEDED' , 'VOIDED' ))
) ENGINE = InnoDB COMMENT = '海外业务不可变费用来源版本;发布后经跨区事件进入Finance' ;
2026-09-08 21:45:57 +08:00
SET @ ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . statistics WHERE table_schema = DATABASE () AND table_name = 'll_finance_fee_source' AND index_name = 'idx_ll_finance_fee_container_customer' ), 'SELECT 1' , 'ALTER TABLE ll_finance_fee_source ADD KEY idx_ll_finance_fee_container_customer(container_booking_id,customer_id,source_status,created_at)' ));
PREPARE ll_finance_fee_ddl FROM @ ddl ; EXECUTE ll_finance_fee_ddl ; DEALLOCATE PREPARE ll_finance_fee_ddl ;
2026-09-02 16:17:41 +08:00
CREATE TABLE IF NOT EXISTS ll_finance_fee_command (
id BIGINT NOT NULL COMMENT '幂等命令ID' , operator_id VARCHAR ( 128 ) NOT NULL COMMENT '操作人ID' ,
action VARCHAR ( 16 ) NOT NULL COMMENT 'CREATE、SUBMIT、REVIEW、ADJUST或VOID' , idempotency_key VARCHAR ( 128 ) NOT NULL COMMENT '操作幂等键' ,
request_hash CHAR ( 64 ) NOT NULL COMMENT '请求内容SHA-256' , source_fee_id BIGINT NOT NULL COMMENT '稳定费用来源ID' ,
source_version INT NOT NULL COMMENT '命令结果版本' , created_at DATETIME ( 3 ) NOT NULL COMMENT '命令创建时间' ,
PRIMARY KEY ( id ), UNIQUE KEY uk_ll_finance_fee_command ( operator_id , action , idempotency_key ),
KEY idx_ll_finance_fee_command_source ( source_fee_id , source_version )
) ENGINE = InnoDB COMMENT = '海外费用来源写操作幂等审计' ;
2026-08-20 18:02:38 +08:00
CREATE TABLE IF NOT EXISTS ll_overseas_quote (
id BIGINT NOT NULL COMMENT '报价ID' , name VARCHAR ( 128 ) NOT NULL COMMENT '报价名称' ,
warehouse_id BIGINT NOT NULL COMMENT '国内平台海外合作仓ID' , warehouse_code VARCHAR ( 64 ) NOT NULL COMMENT '合作仓编码快照' ,
warehouse_name VARCHAR ( 128 ) NOT NULL COMMENT '合作仓名称快照' , country_code VARCHAR ( 2 ) NOT NULL COMMENT '国家二字码快照' ,
provider_name VARCHAR ( 128 ) NOT NULL COMMENT '报价方' , currency CHAR ( 3 ) NOT NULL COMMENT '币种' ,
effective_start DATE NOT NULL COMMENT '生效开始日期' , effective_end DATE NOT NULL COMMENT '生效结束日期' ,
version_code VARCHAR ( 64 ) NOT NULL COMMENT '业务版本号' , status VARCHAR ( 16 ) NOT NULL DEFAULT 'INACTIVE' COMMENT '状态:ACTIVE/INACTIVE' ,
remark VARCHAR ( 1000 ) NULL COMMENT '备注' , record_version BIGINT NOT NULL DEFAULT 0 COMMENT '乐观锁版本' ,
created_by VARCHAR ( 128 ) NOT NULL COMMENT '创建人' , updated_by VARCHAR ( 128 ) NOT NULL COMMENT '更新人' ,
created_at DATETIME ( 3 ) NOT NULL COMMENT '创建时间' , updated_at DATETIME ( 3 ) NOT NULL COMMENT '更新时间' ,
PRIMARY KEY ( id ), UNIQUE KEY uk_ll_quote_warehouse_provider_version ( warehouse_id , provider_name , version_code ),
KEY idx_ll_quote_page ( status , updated_at , id ), KEY idx_ll_quote_effective ( warehouse_id , provider_name , currency , effective_start , effective_end )
) ENGINE = InnoDB COMMENT = '海外仓报价主表' ;
CREATE TABLE IF NOT EXISTS ll_overseas_quote_fee (
id BIGINT NOT NULL COMMENT '费用明细ID' , quote_id BIGINT NOT NULL COMMENT '报价ID' , sequence_no INT NOT NULL COMMENT '显示顺序' ,
item VARCHAR ( 128 ) NOT NULL COMMENT '费用项目' , billing_unit VARCHAR ( 64 ) NOT NULL COMMENT '计费单位' ,
unit_price DECIMAL ( 18 , 4 ) NOT NULL COMMENT '单价' , minimum_charge DECIMAL ( 18 , 4 ) NOT NULL DEFAULT 0 COMMENT '最低收费' ,
remark VARCHAR ( 500 ) NULL COMMENT '备注' , PRIMARY KEY ( id ), UNIQUE KEY uk_ll_quote_fee_sequence ( quote_id , sequence_no ),
KEY idx_ll_quote_fee_quote ( quote_id )
) ENGINE = InnoDB COMMENT = '海外仓报价仓库费用' ;
CREATE TABLE IF NOT EXISTS ll_overseas_quote_transit_price (
id BIGINT NOT NULL COMMENT '中转价格ID' , quote_id BIGINT NOT NULL COMMENT '报价ID' , sequence_no INT NOT NULL COMMENT '显示顺序' ,
fba_warehouse_code VARCHAR ( 64 ) NOT NULL COMMENT 'FBA仓编码' , delivery_method VARCHAR ( 64 ) NOT NULL COMMENT '报价运输方式' ,
estimated_miles DECIMAL ( 18 , 4 ) NOT NULL DEFAULT 0 COMMENT '预估英里数' , price DECIMAL ( 18 , 4 ) NOT NULL COMMENT '报价金额' ,
minimum_charge DECIMAL ( 18 , 4 ) NOT NULL DEFAULT 0 COMMENT '最低收费' , remark VARCHAR ( 500 ) NULL COMMENT '备注' ,
PRIMARY KEY ( id ), UNIQUE KEY uk_ll_quote_transit_sequence ( quote_id , sequence_no ),
KEY idx_ll_quote_transit_quote ( quote_id )
) ENGINE = InnoDB COMMENT = '海外仓报价中转价格明细' ;
CREATE TABLE IF NOT EXISTS ll_monthly_exchange_rate (
id BIGINT NOT NULL COMMENT '月度汇率ID' , rate_month CHAR ( 7 ) NOT NULL COMMENT '汇率月份,格式yyyy-MM' ,
base_currency CHAR ( 3 ) NOT NULL DEFAULT 'USD' COMMENT '基准币种' , quote_currency CHAR ( 3 ) NOT NULL DEFAULT 'CNY' COMMENT '报价币种' ,
usd_to_cny_average DECIMAL ( 18 , 8 ) NOT NULL COMMENT '美元兑人民币月平均汇率' , status VARCHAR ( 16 ) NOT NULL DEFAULT 'ACTIVE' COMMENT '状态:ACTIVE/INACTIVE' ,
remark VARCHAR ( 1000 ) NULL COMMENT '备注' , record_version BIGINT NOT NULL DEFAULT 0 COMMENT '乐观锁版本' ,
created_by VARCHAR ( 128 ) NOT NULL COMMENT '创建人' , updated_by VARCHAR ( 128 ) NOT NULL COMMENT '更新人' ,
created_at DATETIME ( 3 ) NOT NULL COMMENT '创建时间' , updated_at DATETIME ( 3 ) NOT NULL COMMENT '更新时间' ,
PRIMARY KEY ( id ), UNIQUE KEY uk_ll_exchange_rate_month ( rate_month ),
KEY idx_ll_exchange_rate_page ( status , rate_month )
) ENGINE = InnoDB COMMENT = '美元兑人民币月度平均汇率' ;
CREATE TABLE IF NOT EXISTS ll_monthly_exchange_rate_history (
id BIGINT NOT NULL COMMENT '汇率变更历史ID' , exchange_rate_id BIGINT NOT NULL COMMENT '月度汇率ID' ,
before_rate DECIMAL ( 18 , 8 ) NULL COMMENT '变更前汇率' , after_rate DECIMAL ( 18 , 8 ) NOT NULL COMMENT '变更后汇率' ,
before_status VARCHAR ( 16 ) NULL COMMENT '变更前状态' , after_status VARCHAR ( 16 ) NOT NULL COMMENT '变更后状态' ,
operator_id VARCHAR ( 128 ) NOT NULL COMMENT '操作人' , remark VARCHAR ( 1000 ) NULL COMMENT '变更说明' ,
created_at DATETIME ( 3 ) NOT NULL COMMENT '创建时间' , PRIMARY KEY ( id ),
KEY idx_ll_exchange_rate_history ( exchange_rate_id , created_at )
) ENGINE = InnoDB COMMENT = '月度汇率变更历史' ;
2026-10-03 04:18:52 +08:00
CREATE TABLE ll_fleet_driver (
id BIGINT NOT NULL COMMENT '内部主键' ,
driver_no VARCHAR ( 32 ) NOT NULL COMMENT '司机业务编号' ,
warehouse_id BIGINT NULL COMMENT '所属公共仓库引用' ,
warehouse_code VARCHAR ( 64 ) NULL COMMENT '所属仓库编码快照' ,
warehouse_name VARCHAR ( 256 ) NULL COMMENT '所属仓库名称快照' ,
vehicle_models VARCHAR ( 128 ) NULL COMMENT '可驾驶车型描述' ,
languages_and_area VARCHAR ( 256 ) NULL COMMENT '语言及服务区域' ,
medical_expires_on DATE NULL COMMENT '体检到期日,当前不作为必需资质' ,
training_expires_on DATE NULL COMMENT '培训安全到期日,当前不作为必需资质' ,
insurance_expires_on DATE NULL COMMENT '保险到期日,当前不作为必需资质' ,
name VARCHAR ( 128 ) NOT NULL COMMENT '姓名' ,
phone VARCHAR ( 64 ) NOT NULL COMMENT '联系电话' ,
ownership VARCHAR ( 16 ) NOT NULL COMMENT '归属 OWNED自有 DISPATCHED外派' ,
region VARCHAR ( 16 ) NOT NULL COMMENT '区域 DOMESTIC国内 OVERSEAS海外' ,
active TINYINT ( 1 ) NOT NULL DEFAULT 1 COMMENT '是否启用' ,
review_status VARCHAR ( 16 ) NOT NULL DEFAULT 'PENDING' COMMENT '证照审核 PENDING待审 APPROVED通过 REJECTED打回' ,
license_number VARCHAR ( 128 ) NULL COMMENT '驾驶证编号' ,
license_type VARCHAR ( 64 ) NULL COMMENT '驾驶证类型' ,
license_issued_on DATE NULL COMMENT '驾驶证签发日期' ,
license_expires_on DATE NULL COMMENT '驾驶证有效截止日' ,
license_zone VARCHAR ( 64 ) NOT NULL COMMENT '证照有效日期的IANA时区' ,
license_file_id BIGINT NULL COMMENT '平台驾驶证文件引用' ,
remark VARCHAR ( 1000 ) NULL COMMENT '备注' ,
record_version BIGINT NOT NULL DEFAULT 0 COMMENT '并发版本' ,
created_by VARCHAR ( 64 ) NOT NULL COMMENT '创建人' ,
created_at DATETIME ( 3 ) NOT NULL COMMENT '创建时间UTC' ,
updated_by VARCHAR ( 64 ) NOT NULL COMMENT '修改人' ,
updated_at DATETIME ( 3 ) NOT NULL COMMENT '修改时间UTC' ,
PRIMARY KEY ( id ),
UNIQUE KEY uk_fleet_driver_no ( driver_no ),
KEY idx_fleet_driver_page ( active , review_status , updated_at , id ),
KEY idx_fleet_driver_expiry ( license_expires_on ),
CONSTRAINT chk_fleet_driver_ownership CHECK ( ownership IN ( 'OWNED' , 'DISPATCHED' )),
CONSTRAINT chk_fleet_driver_region CHECK ( region IN ( 'DOMESTIC' , 'OVERSEAS' )),
CONSTRAINT chk_fleet_driver_review CHECK ( review_status IN ( 'PENDING' , 'APPROVED' , 'REJECTED' )),
CONSTRAINT chk_fleet_driver_dates CHECK ( license_issued_on IS NULL OR license_expires_on IS NULL OR license_issued_on <= license_expires_on )
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT = '平台司机档案' ;
CREATE TABLE ll_fleet_driver_history (
id BIGINT NOT NULL COMMENT '内部主键' ,
driver_id BIGINT NOT NULL COMMENT '司机内部引用' ,
record_version BIGINT NOT NULL COMMENT '操作后的档案版本' ,
action VARCHAR ( 32 ) NOT NULL COMMENT '创建编辑启停证照上传及审核动作' ,
reason VARCHAR ( 1000 ) NULL COMMENT '操作原因或审核意见' ,
license_file_id BIGINT NULL COMMENT '当时驾驶证文件引用' ,
snapshot_json JSON NOT NULL COMMENT '操作后不可变档案快照' ,
operator_id VARCHAR ( 64 ) NOT NULL COMMENT '操作人' ,
occurred_at DATETIME ( 3 ) NOT NULL COMMENT '操作时间UTC' ,
PRIMARY KEY ( id ),
UNIQUE KEY uk_fleet_driver_history_version ( driver_id , record_version ),
KEY idx_fleet_driver_history_file ( driver_id , license_file_id ),
CONSTRAINT fk_fleet_driver_history_driver FOREIGN KEY ( driver_id ) REFERENCES ll_fleet_driver ( id )
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT = '司机档案及审核历史' ;
2026-08-20 18:02:38 +08:00
CREATE TABLE IF NOT EXISTS ll_vehicle (
2026-10-03 04:18:52 +08:00
max_pallet_spaces INT NULL COMMENT '最大标准托位,未知时为空' ,
max_load_kg DECIMAL ( 12 , 3 ) NULL COMMENT '最大载重,千克' ,
max_volume_cbm DECIMAL ( 12 , 3 ) NULL COMMENT '可用容积,立方米' ,
2026-08-20 18:02:38 +08:00
id BIGINT NOT NULL COMMENT '车辆档案ID' , plate_number VARCHAR ( 64 ) NOT NULL COMMENT '车牌号' ,
model VARCHAR ( 128 ) NOT NULL COMMENT '车型' , fuel_consumption_per100_km DECIMAL ( 10 , 2 ) NOT NULL COMMENT '百公里油耗,单位升' ,
mileage_km BIGINT NOT NULL COMMENT '当前公里码,单位公里' , driver_or_dispatch_company VARCHAR ( 128 ) NULL COMMENT '司机姓名或外派单位' ,
phone VARCHAR ( 64 ) NULL COMMENT '司机或外派单位联系电话' , region VARCHAR ( 16 ) NOT NULL COMMENT '区域:DOMESTIC/OVERSEAS' ,
ownership VARCHAR ( 16 ) NOT NULL COMMENT '车辆归属:OWNED/DISPATCHED' ,
status VARCHAR ( 32 ) NOT NULL COMMENT '状态:IN_SERVICE/DISPATCHED/MAINTENANCE/INACTIVE/RETURNED' ,
remark VARCHAR ( 1000 ) NULL COMMENT '备注' , record_version BIGINT NOT NULL DEFAULT 0 COMMENT '乐观锁版本' ,
created_by VARCHAR ( 128 ) NOT NULL COMMENT '创建人' , updated_by VARCHAR ( 128 ) NOT NULL COMMENT '更新人' ,
created_at DATETIME ( 3 ) NOT NULL COMMENT '创建时间' , updated_at DATETIME ( 3 ) NOT NULL COMMENT '更新时间' ,
PRIMARY KEY ( id ), UNIQUE KEY uk_ll_vehicle_plate ( plate_number ),
2026-10-03 04:18:52 +08:00
KEY idx_ll_vehicle_page ( ownership , region , status , updated_at , id ),
CONSTRAINT chk_ll_vehicle_capacity CHECK (( max_pallet_spaces IS NULL AND max_load_kg IS NULL AND max_volume_cbm IS NULL )
OR ( max_pallet_spaces IS NOT NULL AND max_load_kg IS NOT NULL AND max_volume_cbm IS NOT NULL
AND max_pallet_spaces BETWEEN 1 AND 10000 AND max_load_kg > 0 AND max_volume_cbm > 0 ))
2026-08-20 18:02:38 +08:00
) ENGINE = InnoDB COMMENT = '平台车辆主数据' ;
2026-10-03 04:18:52 +08:00
CREATE TABLE ll_fleet_vehicle_record (
id BIGINT NOT NULL COMMENT '记录内部主键' ,
record_no VARCHAR ( 32 ) NOT NULL COMMENT '车辆运维业务编号' ,
vehicle_id BIGINT NOT NULL COMMENT '所属车辆主键' ,
vehicle_plate VARCHAR ( 64 ) NOT NULL COMMENT '建档时车牌快照' ,
record_type VARCHAR ( 32 ) NOT NULL COMMENT '运维类型:保养、加油、维修、故障、救援、异常' ,
occurred_at DATETIME ( 3 ) NOT NULL COMMENT '记录发生时间(UTC) ' ,
details_json JSON NOT NULL COMMENT '带明确单位的业务字段快照' ,
files_json JSON NOT NULL COMMENT '所属记录照片与上传幂等摘要' ,
idempotency_key VARCHAR ( 128 ) NOT NULL COMMENT '创建请求幂等键' ,
request_hash CHAR ( 64 ) NOT NULL COMMENT '原创建业务内容摘要' ,
record_version BIGINT NOT NULL DEFAULT 0 COMMENT '乐观锁版本' ,
created_by VARCHAR ( 64 ) NOT NULL COMMENT '创建操作人' ,
updated_by VARCHAR ( 64 ) NOT NULL COMMENT '最后操作人' ,
created_at DATETIME ( 3 ) NOT NULL COMMENT '创建时间(UTC) ' ,
updated_at DATETIME ( 3 ) NOT NULL COMMENT '更新时间(UTC) ' ,
PRIMARY KEY ( id ),
UNIQUE KEY uk_vehicle_record_no ( record_no ),
UNIQUE KEY uk_vehicle_record_creation ( vehicle_id , created_by , idempotency_key ),
KEY idx_vehicle_record_page ( vehicle_id , record_type , occurred_at , id ),
CONSTRAINT fk_vehicle_record_vehicle FOREIGN KEY ( vehicle_id ) REFERENCES ll_vehicle ( id ),
CONSTRAINT ck_vehicle_record_type CHECK ( record_type IN ( 'MAINTENANCE' , 'FUEL' , 'REPAIR' , 'BREAKDOWN' , 'RESCUE' , 'EXCEPTION' ))
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT = '车辆运维记录' ;
CREATE TABLE ll_fleet_vehicle_record_history (
id BIGINT NOT NULL COMMENT '历史内部主键' ,
record_id BIGINT NOT NULL COMMENT '运维记录主键' ,
record_version BIGINT NOT NULL COMMENT '对应业务版本' ,
action VARCHAR ( 32 ) NOT NULL COMMENT '操作类型' ,
reason VARCHAR ( 1000 ) DEFAULT NULL COMMENT '更正原因或附件名称' ,
operator_id VARCHAR ( 64 ) NOT NULL COMMENT '操作人' ,
occurred_at DATETIME ( 3 ) NOT NULL COMMENT '操作时间(UTC) ' ,
snapshot_json JSON NOT NULL COMMENT '当时完整业务快照' ,
PRIMARY KEY ( id ),
UNIQUE KEY uk_vehicle_record_revision ( record_id , record_version ),
CONSTRAINT fk_vehicle_record_history FOREIGN KEY ( record_id ) REFERENCES ll_fleet_vehicle_record ( id )
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT = '车辆运维记录不可变历史' ;
CREATE TABLE ll_fleet_trip (
id BIGINT NOT NULL COMMENT '内部主键' ,
trip_no VARCHAR ( 32 ) NOT NULL COMMENT '车次业务编号' ,
idempotency_key VARCHAR ( 128 ) NOT NULL COMMENT '创建请求幂等键' ,
request_hash VARCHAR ( 64 ) NOT NULL COMMENT '创建请求SHA256' ,
status VARCHAR ( 16 ) NOT NULL COMMENT '车次状态' ,
warehouse_id BIGINT NOT NULL COMMENT '起运公共仓库引用' ,
warehouse_code VARCHAR ( 64 ) NOT NULL COMMENT '起运仓编码快照' ,
warehouse_name VARCHAR ( 256 ) NOT NULL COMMENT '起运仓名称快照' ,
vehicle_id BIGINT NULL COMMENT '车辆档案引用' ,
vehicle_plate VARCHAR ( 64 ) NULL COMMENT '分配时车牌快照' ,
driver_id BIGINT NULL COMMENT '司机档案引用' ,
driver_name VARCHAR ( 128 ) NULL COMMENT '分配时司机姓名' ,
driver_phone VARCHAR ( 64 ) NULL COMMENT '分配时司机电话' ,
max_pallet_spaces INT NULL COMMENT '分配时托位容量快照' ,
max_load_kg DECIMAL ( 12 , 3 ) NULL COMMENT '分配时载重千克' ,
max_volume_cbm DECIMAL ( 12 , 3 ) NULL COMMENT '分配时可用容积立方米' ,
planned_departure_at DATETIME ( 3 ) NOT NULL COMMENT '计划发车UTC' ,
expected_driver_end_at DATETIME ( 3 ) NOT NULL COMMENT '司机预计任务结束UTC,含承担的返程转场' ,
departed_at DATETIME ( 3 ) NULL COMMENT '实际发车UTC' ,
completed_at DATETIME ( 3 ) NULL COMMENT '实际运输完成UTC' ,
stops_json JSON NOT NULL COMMENT '按顺序保存的路线站点' ,
planned_load_json JSON NULL COMMENT '拣货前自有货计划载荷与逐段剩余容量' ,
load_json JSON NULL COMMENT '已确认实物装载及客户货物来源快照' ,
loading_review_json LONGTEXT NULL COMMENT '整车理货审核快照,空值为待审核' ,
departure_key VARCHAR ( 128 ) NULL COMMENT '整车发车幂等标识' ,
departure_hash CHAR ( 64 ) NULL COMMENT '整车发车请求摘要' ,
departure_result_json JSON NULL COMMENT '整车发车结果及各客户出库结果' ,
completion_json JSON NULL COMMENT '货物结案来源及幂等结果快照' ,
vehicle_release_json JSON NULL COMMENT '车辆任务结束地点状态与幂等记录' ,
driver_release_json JSON NULL COMMENT '司机任务结束地点与幂等记录' ,
remark VARCHAR ( 1000 ) NULL COMMENT '备注' ,
record_version BIGINT NOT NULL DEFAULT 0 COMMENT '并发版本' ,
created_by VARCHAR ( 64 ) NOT NULL COMMENT '创建人' ,
created_at DATETIME ( 3 ) NOT NULL COMMENT '创建UTC时间' ,
updated_by VARCHAR ( 64 ) NOT NULL COMMENT '更新人' ,
updated_at DATETIME ( 3 ) NOT NULL COMMENT '更新UTC时间' ,
PRIMARY KEY ( id ),
UNIQUE KEY uk_fleet_trip_no ( trip_no ),
UNIQUE KEY uk_fleet_trip_create ( created_by , idempotency_key ),
KEY idx_fleet_trip_page ( warehouse_id , status , updated_at , id ),
CONSTRAINT fk_fleet_trip_vehicle FOREIGN KEY ( vehicle_id ) REFERENCES ll_vehicle ( id ),
CONSTRAINT fk_fleet_trip_driver FOREIGN KEY ( driver_id ) REFERENCES ll_fleet_driver ( id ),
CONSTRAINT chk_fleet_trip_status CHECK ( status IN ( 'PLANNED' , 'DEPARTING' , 'IN_TRANSIT' , 'COMPLETED' , 'CANCELLED' )),
CONSTRAINT chk_fleet_trip_time CHECK ( expected_driver_end_at > planned_departure_at )
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT = '平台运输车次' ;
2026-10-07 16:46:56 +08:00
CREATE TABLE ll_fleet_capacity_offer (
id BIGINT NOT NULL COMMENT '内部主键' ,
offer_no VARCHAR ( 64 ) NOT NULL COMMENT '拼车运力发布业务编号' ,
trip_id BIGINT NOT NULL COMMENT '唯一所属车次' ,
trip_no VARCHAR ( 64 ) NOT NULL COMMENT '车次业务编号' ,
status VARCHAR ( 16 ) NOT NULL COMMENT '发布状态:草稿、开放、暂停、关闭' ,
cutoff_at DATETIME ( 3 ) NOT NULL COMMENT '最晚交货及新询价截止UTC时间' ,
contact_name VARCHAR ( 128 ) NULL COMMENT '对内部销售公开的调度联系人' ,
contact_phone VARCHAR ( 128 ) NULL COMMENT '对内部销售公开的调度联系电话' ,
remark VARCHAR ( 1000 ) NULL COMMENT '公开承运说明' ,
published_fingerprint CHAR ( 64 ) NULL COMMENT '已核对路线车辆及容量计划事实摘要' ,
record_version BIGINT NOT NULL DEFAULT 0 COMMENT '乐观锁版本' ,
created_by VARCHAR ( 64 ) NOT NULL COMMENT '创建人' ,
created_at DATETIME ( 3 ) NOT NULL COMMENT '创建UTC时间' ,
updated_by VARCHAR ( 64 ) NOT NULL COMMENT '修改人' ,
updated_at DATETIME ( 3 ) NOT NULL COMMENT '修改UTC时间' ,
PRIMARY KEY ( id ),
UNIQUE KEY uk_fleet_capacity_offer_no ( offer_no ),
UNIQUE KEY uk_fleet_capacity_offer_trip ( trip_id ),
KEY idx_fleet_capacity_offer_status ( status , cutoff_at , id ),
CONSTRAINT fk_fleet_capacity_offer_trip FOREIGN KEY ( trip_id ) REFERENCES ll_fleet_trip ( id ),
CONSTRAINT chk_fleet_capacity_offer_status CHECK ( status IN ( 'DRAFT' , 'OPEN' , 'PAUSED' , 'CLOSED' ))
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT = '内部拼车车次余位发布;容量实时计算不在此另存' ;
CREATE TABLE ll_fleet_capacity_offer_command (
id BIGINT NOT NULL COMMENT '内部主键' ,
trip_id BIGINT NOT NULL COMMENT '所属车次锁作用域' ,
operator_id VARCHAR ( 64 ) NOT NULL COMMENT '原请求操作者' ,
action VARCHAR ( 32 ) NOT NULL COMMENT '业务命令类型' ,
scope_no VARCHAR ( 64 ) NOT NULL COMMENT '发布或预订业务编号作用域' ,
idempotency_key VARCHAR ( 128 ) NOT NULL COMMENT '原请求幂等键' ,
request_hash CHAR ( 64 ) NOT NULL COMMENT '原请求业务内容摘要' ,
result_json JSON NOT NULL COMMENT '成功命令原始结果用于精确重放' ,
created_at DATETIME ( 3 ) NOT NULL COMMENT '命令完成UTC时间' ,
PRIMARY KEY ( id ),
UNIQUE KEY uk_fleet_capacity_offer_command ( trip_id , operator_id , action , scope_no , idempotency_key ),
CONSTRAINT fk_fleet_capacity_command_trip FOREIGN KEY ( trip_id ) REFERENCES ll_fleet_trip ( id )
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT = '拼车发布及销售意向持久幂等结果' ;
2026-10-03 04:18:52 +08:00
CREATE TABLE ll_fleet_external_booking (
id BIGINT NOT NULL COMMENT '内部主键' ,
booking_no VARCHAR ( 32 ) NOT NULL COMMENT '外接预订业务编号' ,
trip_id BIGINT NOT NULL COMMENT '所属车次' ,
trip_no VARCHAR ( 32 ) NOT NULL COMMENT '车次业务编号' ,
2026-10-07 17:16:50 +08:00
customer_id VARCHAR ( 128 ) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '委托客户及付款归属' ,
2026-10-03 04:18:52 +08:00
customer_code VARCHAR ( 64 ) NOT NULL COMMENT '客户编号快照' ,
customer_name VARCHAR ( 255 ) NOT NULL COMMENT '客户名称快照' ,
status VARCHAR ( 16 ) NOT NULL COMMENT 'DRAFT询价/CONFIRMED占位/RECEIVED确认实收/BOUND关联发运/CANCELLED取消' ,
cargo_json JSON NOT NULL COMMENT '货物、计划载荷、联系人及约定报价快照' ,
2026-10-03 13:32:55 +08:00
quote_source_json JSON NULL COMMENT '选用销售报价的可信版本快照,与实际成交金额分开保存' ,
2026-10-03 04:18:52 +08:00
destination_key VARCHAR ( 160 ) NOT NULL COMMENT '已有路线卸货站匹配键' ,
destination_label VARCHAR ( 255 ) NOT NULL COMMENT '约定卸货站名称' ,
agreed_amount DECIMAL ( 16 , 2 ) NULL COMMENT '约定金额,非已入账应收或实收' ,
idempotency_key VARCHAR ( 128 ) NOT NULL COMMENT '登记请求键' ,
request_hash CHAR ( 64 ) NOT NULL COMMENT '登记内容摘要' ,
confirm_key VARCHAR ( 128 ) NULL COMMENT '承运确认请求键' ,
confirm_hash CHAR ( 64 ) NULL COMMENT '承运确认摘要' ,
cancel_key VARCHAR ( 128 ) NULL COMMENT '取消请求键' ,
cancel_hash CHAR ( 64 ) NULL COMMENT '取消摘要' ,
incoming_no VARCHAR ( 64 ) NULL COMMENT '正式来货单业务编号' ,
dispatch_no VARCHAR ( 64 ) NULL COMMENT '已关联客户排车业务编号' ,
receipt_json JSON NULL COMMENT '实测来源及运营确认的托位和运费依据' ,
incoming_key VARCHAR ( 128 ) NULL COMMENT '来货登记请求键' ,
incoming_hash CHAR ( 64 ) NULL COMMENT '来货登记摘要' ,
receipt_key VARCHAR ( 128 ) NULL COMMENT '实收确认请求键' ,
receipt_hash CHAR ( 64 ) NULL COMMENT '实收确认摘要' ,
binding_key VARCHAR ( 128 ) NULL COMMENT '关联发运请求键' ,
binding_hash CHAR ( 64 ) NULL COMMENT '关联发运摘要' ,
2026-10-07 16:46:56 +08:00
offer_id BIGINT NULL COMMENT '来源运力发布,普通车次预订为空' ,
sales_owner_user_id VARCHAR ( 64 ) NULL COMMENT '登录身份冻结的销售负责人' ,
business_type VARCHAR ( 32 ) NULL COMMENT '本土商业类型LOCAL_LOOSEBOARD或US_TRUCK' ,
delivery_mode VARCHAR ( 32 ) NULL COMMENT '客户送仓或人工安排提货回仓' ,
estimated_arrival_at DATETIME ( 3 ) NULL COMMENT '预计实际到我仓UTC时间' ,
expected_pallet_count INT NULL COMMENT '预计实托数,与托位分开且未知为空' ,
2026-10-03 04:18:52 +08:00
record_version BIGINT NOT NULL DEFAULT 0 COMMENT '记录版本' ,
created_by VARCHAR ( 64 ) NOT NULL COMMENT '登记人' ,
created_at DATETIME ( 3 ) NOT NULL COMMENT '登记UTC时间' ,
updated_by VARCHAR ( 64 ) NOT NULL COMMENT '修改人' ,
updated_at DATETIME ( 3 ) NOT NULL COMMENT '修改UTC时间' ,
2026-10-07 16:46:56 +08:00
KEY idx_fleet_booking_offer ( offer_id , status , id ),
KEY idx_fleet_booking_sales ( sales_owner_user_id , offer_id , id ),
CONSTRAINT fk_fleet_booking_offer FOREIGN KEY ( offer_id ) REFERENCES ll_fleet_capacity_offer ( id ),
CONSTRAINT chk_fleet_booking_expected_pallet CHECK ( expected_pallet_count IS NULL OR expected_pallet_count > 0 ),
2026-10-03 04:18:52 +08:00
PRIMARY KEY ( id ),
UNIQUE KEY uk_fleet_booking_no ( booking_no ),
UNIQUE KEY uk_fleet_booking_create ( trip_id , created_by , idempotency_key ),
KEY idx_fleet_booking_trip ( trip_id , status , id ),
UNIQUE KEY uk_fleet_booking_incoming ( incoming_no ),
KEY idx_fleet_booking_dispatch ( dispatch_no ),
CONSTRAINT fk_fleet_booking_trip FOREIGN KEY ( trip_id ) REFERENCES ll_fleet_trip ( id ),
CONSTRAINT chk_fleet_booking_status CHECK ( status IN ( 'DRAFT' , 'CONFIRMED' , 'RECEIVED' , 'BOUND' , 'CANCELLED' ))
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT = '外接询价及确认承运占位;货物收发和费用入账分别引用正式事实' ;
2026-10-07 16:46:56 +08:00
CREATE TABLE ll_fleet_pool_order_link (
id BIGINT NOT NULL COMMENT '内部主键' ,
booking_id BIGINT NOT NULL COMMENT '唯一外接预订' ,
booking_no VARCHAR ( 64 ) NOT NULL COMMENT '预订业务编号' ,
2026-10-07 17:16:50 +08:00
customer_id VARCHAR ( 128 ) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '商业客户隔离范围' ,
2026-10-07 16:46:56 +08:00
business_type VARCHAR ( 32 ) NOT NULL COMMENT '本土散板或本土卡车商业类型' ,
business_order_id BIGINT NOT NULL COMMENT '对应商业订单内部关联' ,
business_order_no VARCHAR ( 64 ) NOT NULL COMMENT '本土商业订单业务编号' ,
warehouse_id VARCHAR ( 128 ) NOT NULL COMMENT '真实我仓上车仓库' ,
destination_key VARCHAR ( 160 ) NOT NULL COMMENT '冻结卸货站匹配键' ,
delivery_mode VARCHAR ( 32 ) NOT NULL COMMENT '客户送仓或人工提货回仓' ,
delivery_instructions VARCHAR ( 1000 ) NULL COMMENT '实际到仓交货说明' ,
incoming_no VARCHAR ( 64 ) NULL COMMENT '真实来货业务编号,未登记为空' ,
lastleg_order_id BIGINT NULL COMMENT '唯一真实尾程来源,未发生为空' ,
dispatch_no VARCHAR ( 64 ) NULL COMMENT '已关联客户排车编号' ,
fulfillment_stage VARCHAR ( 32 ) NOT NULL COMMENT '实际履约阶段,不能手工冒充完成' ,
stage_occurred_at DATETIME ( 3 ) NOT NULL COMMENT '实际阶段发生UTC时间' ,
actual_pallet_count INT NULL COMMENT '实际去重托盘数,未知为空' ,
actual_package_count INT NULL COMMENT '实际箱数,未知为空' ,
actual_pallet_spaces INT NULL COMMENT '实际核准占用托位,未知为空' ,
record_version BIGINT NOT NULL DEFAULT 0 COMMENT '桥记录版本' ,
creation_request_hash CHAR ( 64 ) NOT NULL COMMENT '商业单创建身份和预报事实摘要' ,
created_by VARCHAR ( 64 ) NOT NULL COMMENT '确认承运操作者' ,
created_at DATETIME ( 3 ) NOT NULL COMMENT '创建UTC时间' ,
updated_at DATETIME ( 3 ) NOT NULL COMMENT '修改UTC时间' ,
PRIMARY KEY ( id ),
UNIQUE KEY uk_fleet_pool_order_booking ( booking_id ),
UNIQUE KEY uk_fleet_pool_order_booking_no ( booking_no ),
UNIQUE KEY uk_fleet_pool_order_business ( business_type , business_order_id ),
UNIQUE KEY uk_fleet_pool_order_incoming ( incoming_no ),
UNIQUE KEY uk_fleet_pool_order_lastleg ( lastleg_order_id ),
KEY idx_fleet_pool_order_customer ( customer_id , business_type , business_order_no ),
KEY idx_fleet_pool_order_dispatch ( customer_id , dispatch_no ),
CONSTRAINT fk_fleet_pool_order_booking FOREIGN KEY ( booking_id ) REFERENCES ll_fleet_external_booking ( id ),
CONSTRAINT chk_fleet_pool_order_type CHECK ( business_type IN ( 'LOCAL_LOOSEBOARD' , 'US_TRUCK' )),
CONSTRAINT chk_fleet_pool_order_actual CHECK (( actual_pallet_count IS NULL OR actual_pallet_count >= 0 ) AND ( actual_package_count IS NULL OR actual_package_count >= 0 ) AND ( actual_pallet_spaces IS NULL OR actual_pallet_spaces >= 0 ))
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT = '拼车预订与本土商业单唯一真实履约关联,不重复记运费' ;
2026-10-03 04:18:52 +08:00
CREATE TABLE ll_fleet_resource_assignment (
resource_kind VARCHAR ( 16 ) NOT NULL COMMENT '资源种类 VEHICLE或DRIVER' ,
resource_id BIGINT NOT NULL COMMENT '对应车辆或司机档案引用' ,
trip_id BIGINT NOT NULL COMMENT '占用车次' ,
trip_no VARCHAR ( 32 ) NOT NULL COMMENT '占用车次业务编号' ,
PRIMARY KEY ( resource_kind , resource_id ),
KEY idx_fleet_resource_trip ( trip_id ),
CONSTRAINT fk_fleet_resource_trip FOREIGN KEY ( trip_id ) REFERENCES ll_fleet_trip ( id ),
CONSTRAINT chk_fleet_resource_kind CHECK ( resource_kind IN ( 'VEHICLE' , 'DRIVER' ))
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT = '车辆及司机当前车次占用,释放后删除锁行,历史保留在车次' ;
CREATE TABLE ll_fleet_trip_dispatch (
dispatch_id BIGINT NOT NULL COMMENT '客户排车单内部引用,唯一有效车次关联' ,
dispatch_no VARCHAR ( 64 ) NOT NULL COMMENT '客户排车业务单号' ,
customer_id VARCHAR ( 128 ) NOT NULL COMMENT '排车单自身客户归属' ,
trip_id BIGINT NOT NULL COMMENT '共享运输车次内部引用' ,
trip_no VARCHAR ( 32 ) NOT NULL COMMENT '共享运输车次业务编号' ,
package_count INT NOT NULL COMMENT '关联时待发运箱数快照' ,
bound_by VARCHAR ( 64 ) NOT NULL COMMENT '关联操作人' ,
bound_at DATETIME ( 3 ) NOT NULL COMMENT '关联UTC时间' ,
review_json LONGTEXT NULL COMMENT '客户排车调度审核快照,空值为待审核' ,
PRIMARY KEY ( dispatch_id ),
UNIQUE KEY uk_fleet_trip_dispatch_no ( dispatch_no ),
KEY idx_fleet_trip_dispatch_trip ( trip_id , dispatch_id ),
CONSTRAINT fk_fleet_trip_dispatch_trip FOREIGN KEY ( trip_id ) REFERENCES ll_fleet_trip ( id )
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT = '车次与各客户排车单的有效关联,解除前快照保留在车次历史' ;
CREATE TABLE ll_fleet_trip_history (
id BIGINT NOT NULL COMMENT '内部主键' ,
trip_id BIGINT NOT NULL COMMENT '车次内部引用' ,
record_version BIGINT NOT NULL COMMENT '操作后版本' ,
action VARCHAR ( 32 ) NOT NULL COMMENT '车次操作' ,
reason VARCHAR ( 1000 ) NULL COMMENT '操作原因' ,
operator_id VARCHAR ( 64 ) NOT NULL COMMENT '操作人' ,
occurred_at DATETIME ( 3 ) NOT NULL COMMENT '操作UTC时间' ,
snapshot_json JSON NOT NULL COMMENT '操作后不可变车次快照' ,
PRIMARY KEY ( id ),
UNIQUE KEY uk_fleet_trip_history_version ( trip_id , record_version ),
CONSTRAINT fk_fleet_trip_history FOREIGN KEY ( trip_id ) REFERENCES ll_fleet_trip ( id )
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT = '运输车次操作历史' ;
2026-10-03 12:38:04 +08:00
CREATE TABLE ll_fleet_trip_operations_record (
id BIGINT NOT NULL COMMENT '出车实测历史主键' ,
trip_no VARCHAR ( 64 ) NOT NULL COMMENT '车次业务编号' ,
record_version BIGINT NOT NULL COMMENT '实测记录版本从一递增' ,
details_json JSON NOT NULL COMMENT '实际里程英里油耗升与备注快照' ,
reason VARCHAR ( 1000 ) NOT NULL COMMENT '实测更正说明' ,
operator_id VARCHAR ( 64 ) NOT NULL COMMENT '实测操作人标识' ,
request_key VARCHAR ( 128 ) NOT NULL COMMENT '实测保存幂等键' ,
request_hash CHAR ( 64 ) NOT NULL COMMENT '实测请求内容摘要' ,
occurred_at DATETIME ( 3 ) NOT NULL COMMENT '实测保存时间UTC' ,
PRIMARY KEY ( id ),
UNIQUE KEY uk_fleet_operations_version ( trip_no , record_version ),
UNIQUE KEY uk_fleet_operations_request ( trip_no , operator_id , request_key )
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT = '车次里程油耗不可变更正记录' ;
CREATE TABLE ll_fleet_trip_handover (
id BIGINT NOT NULL COMMENT '内部主键' ,
trip_id BIGINT NOT NULL COMMENT '所属车次' ,
trip_version BIGINT NOT NULL COMMENT '交接对应车次历史版本' ,
trip_no VARCHAR ( 32 ) NOT NULL COMMENT '车次业务编号' ,
handover_no VARCHAR ( 32 ) NOT NULL COMMENT '交接业务编号' ,
request_key VARCHAR ( 128 ) NOT NULL COMMENT '交接请求幂等键' ,
request_hash CHAR ( 64 ) NOT NULL COMMENT '交接请求摘要' ,
record_version BIGINT NOT NULL DEFAULT 0 COMMENT '资源结束并发版本' ,
handed_over_at DATETIME ( 3 ) NOT NULL COMMENT '实际交接UTC时间' ,
snapshot_json JSON NOT NULL COMMENT '不可变资源及剩余货物交接快照' ,
vehicle_release_json JSON NULL COMMENT '原车辆任务结束及幂等结果' ,
driver_release_json JSON NULL COMMENT '原司机任务结束及幂等结果' ,
created_by VARCHAR ( 64 ) NOT NULL COMMENT '记录操作人' ,
created_at DATETIME ( 3 ) NOT NULL COMMENT '记录UTC时间' ,
PRIMARY KEY ( id ),
UNIQUE KEY uk_fleet_handover_no ( handover_no ),
UNIQUE KEY uk_fleet_handover_request ( trip_id , request_key ),
UNIQUE KEY uk_fleet_handover_version ( trip_id , trip_version ),
KEY idx_fleet_handover_page ( trip_id , id ),
CONSTRAINT fk_fleet_handover_trip FOREIGN KEY ( trip_id ) REFERENCES ll_fleet_trip ( id )
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT = '在途车辆司机交接' ;
CREATE TABLE ll_fleet_finance_source (
id BIGINT UNSIGNED NOT NULL COMMENT '来源提交主键' ,
record_id BIGINT UNSIGNED NOT NULL COMMENT '车辆运维记录主键' ,
source_version BIGINT UNSIGNED NOT NULL COMMENT '独立财务来源版本,从1递增' ,
record_version BIGINT UNSIGNED NOT NULL COMMENT '提交时运维记录版本' ,
operator_id VARCHAR ( 64 ) NOT NULL COMMENT '提交操作人标识' ,
request_key VARCHAR ( 128 ) NOT NULL COMMENT '原请求幂等键' ,
request_hash VARCHAR ( 71 ) NOT NULL COMMENT '规范请求摘要,含sha256前缀' ,
event_id VARCHAR ( 128 ) NOT NULL COMMENT '关联公共Outbox事件ID' ,
payload_json JSON NOT NULL COMMENT '不可变公司成本来源快照' ,
created_at DATETIME ( 3 ) NOT NULL DEFAULT CURRENT_TIMESTAMP ( 3 ) COMMENT '提交时间UTC' ,
PRIMARY KEY ( id ),
UNIQUE KEY uk_fleet_finance_source_version ( record_id , source_version ),
UNIQUE KEY uk_fleet_finance_source_request ( record_id , operator_id , request_key ),
UNIQUE KEY uk_fleet_finance_source_event ( event_id ),
CONSTRAINT chk_fleet_finance_source_version CHECK ( source_version > 0 )
) ENGINE = InnoDB COMMENT = '维修救援公司成本提交来源,不保存付款推定' ;
CREATE TABLE ll_fleet_quote (
id BIGINT PRIMARY KEY COMMENT '报价记录主键' ,
quote_no VARCHAR ( 64 ) NOT NULL COMMENT '报价业务编号' ,
kind VARCHAR ( 16 ) NOT NULL COMMENT '报价用途采购或销售' ,
party_id BIGINT NOT NULL COMMENT '供应商或客户主档标识' ,
party_name VARCHAR ( 160 ) NOT NULL COMMENT '往来单位名称快照' ,
origin_city VARCHAR ( 128 ) NOT NULL COMMENT '发货城市' ,
destination_code VARCHAR ( 64 ) NOT NULL COMMENT '目的仓业务编码' ,
valid_from DATE NOT NULL COMMENT '报价生效日期' ,
valid_to DATE NOT NULL COMMENT '报价失效日期含当天' ,
status VARCHAR ( 16 ) NOT NULL COMMENT '报价启停或删除状态' ,
natural_key CHAR ( 64 ) NOT NULL COMMENT '报价组合去重摘要' ,
details_json JSON NOT NULL COMMENT '完整报价明细快照' ,
record_version BIGINT NOT NULL COMMENT '报价记录版本' ,
create_key VARCHAR ( 128 ) NOT NULL COMMENT '创建幂等键' ,
create_hash CHAR ( 64 ) NOT NULL COMMENT '创建请求含导入批次内容摘要' ,
created_by VARCHAR ( 64 ) NOT NULL COMMENT '创建操作人标识' ,
created_at DATETIME ( 3 ) NOT NULL COMMENT '创建时间UTC' ,
updated_at DATETIME ( 3 ) NOT NULL COMMENT '更新时间UTC' ,
UNIQUE KEY uk_fleet_quote_no ( quote_no ),
UNIQUE KEY uk_fleet_quote_natural ( natural_key ),
UNIQUE KEY uk_fleet_quote_create ( created_by , create_key ),
KEY idx_fleet_quote_search ( kind , status , valid_from , valid_to )
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '车辆采购与外接销售报价' ;
CREATE TABLE ll_fleet_quote_history (
id BIGINT PRIMARY KEY COMMENT '报价历史主键' ,
quote_id BIGINT NOT NULL COMMENT '报价记录标识' ,
record_version BIGINT NOT NULL COMMENT '报价记录版本' ,
action VARCHAR ( 24 ) NOT NULL COMMENT '报价操作类型' ,
operator_id VARCHAR ( 64 ) NOT NULL COMMENT '操作人标识' ,
occurred_at DATETIME ( 3 ) NOT NULL COMMENT '操作时间UTC' ,
snapshot_json JSON NOT NULL COMMENT '报价完整版本快照' ,
UNIQUE KEY uk_fleet_quote_history_version ( quote_id , record_version )
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '车辆报价不可变版本历史' ;
CREATE TABLE ll_fleet_trip_cost (
id BIGINT NOT NULL COMMENT '内部主键' ,
trip_id BIGINT NOT NULL COMMENT '车次内部引用' ,
cost_no VARCHAR ( 32 ) NOT NULL COMMENT '车次成本业务编号' ,
category VARCHAR ( 16 ) NOT NULL COMMENT '直接成本类别FUEL/DRIVER/TOLL/PARKING/OTHER' ,
currency VARCHAR ( 3 ) NOT NULL COMMENT '原始成本币种CNY/USD,不混币汇总' ,
amount DECIMAL ( 14 , 2 ) NOT NULL COMMENT '运营登记金额,不代表付款' ,
incurred_at DATETIME ( 3 ) NOT NULL COMMENT '实际费用发生UTC时间' ,
remark VARCHAR ( 1000 ) NULL COMMENT '费用备注' ,
record_version BIGINT NOT NULL COMMENT '成本记录版本' ,
request_key VARCHAR ( 128 ) NOT NULL COMMENT '创建幂等键' ,
request_hash CHAR ( 64 ) NOT NULL COMMENT '创建请求摘要' ,
created_by VARCHAR ( 64 ) NOT NULL COMMENT '登记人' ,
updated_by VARCHAR ( 64 ) NOT NULL COMMENT '最近更正人' ,
created_at DATETIME ( 3 ) NOT NULL COMMENT '登记UTC时间' ,
updated_at DATETIME ( 3 ) NOT NULL COMMENT '更正UTC时间' ,
PRIMARY KEY ( id ),
UNIQUE KEY uk_fleet_trip_cost_no ( cost_no ),
UNIQUE KEY uk_fleet_trip_cost_request ( trip_id , created_by , request_key ),
KEY idx_fleet_trip_cost_page ( trip_id , incurred_at , id ),
CONSTRAINT fk_fleet_trip_cost_trip FOREIGN KEY ( trip_id ) REFERENCES ll_fleet_trip ( id ),
CONSTRAINT ck_fleet_trip_cost_amount CHECK ( amount >= 0 ),
CONSTRAINT ck_fleet_trip_cost_currency CHECK ( currency IN ( 'CNY' , 'USD' )),
CONSTRAINT ck_fleet_trip_cost_category CHECK ( category IN ( 'FUEL' , 'DRIVER' , 'TOLL' , 'PARKING' , 'OTHER' ))
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT = '车次直接运营成本,不生成客户账单或付款' ;
CREATE TABLE ll_fleet_trip_cost_history (
id BIGINT NOT NULL COMMENT '内部主键' ,
cost_id BIGINT NOT NULL COMMENT '成本记录内部引用' ,
record_version BIGINT NOT NULL COMMENT '成本更正后版本' ,
action VARCHAR ( 16 ) NOT NULL COMMENT '成本操作CREATE/UPDATE' ,
reason VARCHAR ( 1000 ) NULL COMMENT '登记或更正说明' ,
operator_id VARCHAR ( 64 ) NOT NULL COMMENT '操作人' ,
occurred_at DATETIME ( 3 ) NOT NULL COMMENT '操作UTC时间' ,
snapshot_json JSON NOT NULL COMMENT '成本与当时整趟汇总及分摊快照' ,
PRIMARY KEY ( id ),
UNIQUE KEY uk_fleet_trip_cost_history ( cost_id , record_version ),
CONSTRAINT fk_fleet_trip_cost_history FOREIGN KEY ( cost_id ) REFERENCES ll_fleet_trip_cost ( id )
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT = '车次成本不可变更正历史' ;
2026-08-20 18:02:38 +08:00
SET @ ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_event_outbox' AND column_name = 'locked_at' ), 'SELECT 1' , 'ALTER TABLE ll_event_outbox ADD COLUMN locked_at DATETIME(3) NULL COMMENT ''投递租约获取时间'' AFTER published_at' ));
PREPARE ll_outbox_lease_stmt FROM @ ddl ; EXECUTE ll_outbox_lease_stmt ; DEALLOCATE PREPARE ll_outbox_lease_stmt ;
SET @ ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_event_outbox' AND column_name = 'locked_by' ), 'SELECT 1' , 'ALTER TABLE ll_event_outbox ADD COLUMN locked_by VARCHAR(128) NULL COMMENT ''投递租约持有者'' AFTER locked_at' ));
PREPARE ll_outbox_lease_stmt FROM @ ddl ; EXECUTE ll_outbox_lease_stmt ; DEALLOCATE PREPARE ll_outbox_lease_stmt ;
2026-08-19 16:24:02 +08:00
CREATE TABLE IF NOT EXISTS ll_inbound_pda_operation (
id BIGINT NOT NULL COMMENT '主键ID' , customer_id VARCHAR ( 128 ) NOT NULL COMMENT '客户租户ID' , task_id BIGINT NOT NULL COMMENT 'PDA任务ID' ,
allocation_id BIGINT NULL COMMENT '分配记录ID' , action VARCHAR ( 32 ) NOT NULL COMMENT '操作动作' , idempotency_key VARCHAR ( 255 ) NOT NULL COMMENT '业务幂等键' ,
request_hash VARCHAR ( 128 ) NOT NULL COMMENT '请求内容哈希' , request_json LONGTEXT NOT NULL COMMENT '请求内容JSON' , result_json LONGTEXT NOT NULL COMMENT '处理结果JSON' ,
created_at DATETIME ( 3 ) NOT NULL DEFAULT CURRENT_TIMESTAMP ( 3 ) COMMENT '创建时间' ,
PRIMARY KEY ( id ), UNIQUE KEY uk_ll_inbound_pda_operation_key ( customer_id , idempotency_key ),
KEY idx_ll_inbound_pda_operation_task ( task_id ), KEY idx_ll_inbound_pda_operation_allocation ( allocation_id )
) ENGINE = InnoDB COMMENT = '入仓PDA操作幂等记录' ;
CREATE TABLE IF NOT EXISTS ll_inbound_pallet_merge (
id BIGINT NOT NULL COMMENT '主键ID' , customer_id VARCHAR ( 128 ) NOT NULL COMMENT '客户租户ID' , task_id BIGINT NOT NULL COMMENT 'PDA任务ID' ,
merge_group_no VARCHAR ( 64 ) NOT NULL COMMENT '合托分组号' , source_pallet_id BIGINT NOT NULL COMMENT '来源托盘ID' , target_pallet_id BIGINT NOT NULL COMMENT '目标托盘ID' ,
source_allocation_id BIGINT NOT NULL COMMENT '来源分配记录ID' , target_allocation_id BIGINT NOT NULL COMMENT '目标分配记录ID' ,
source_line_id BIGINT NOT NULL COMMENT '来源计划明细ID' , target_line_id BIGINT NOT NULL COMMENT '目标计划明细ID' ,
source_order_id BIGINT NOT NULL COMMENT '来源订单ID' , target_order_id BIGINT NOT NULL COMMENT '目标订单ID' ,
moved_package_count INT NOT NULL COMMENT '移动箱数' , moved_volume_cbm DECIMAL ( 18 , 4 ) NOT NULL DEFAULT 0 COMMENT '移动体积(立方米)' ,
source_pallet_scrapped TINYINT NOT NULL DEFAULT 0 COMMENT '来源托盘是否已报废' , status VARCHAR ( 32 ) NOT NULL COMMENT '业务状态' ,
created_at DATETIME ( 3 ) NOT NULL DEFAULT CURRENT_TIMESTAMP ( 3 ) COMMENT '创建时间' , PRIMARY KEY ( id ),
KEY idx_ll_inbound_merge_task ( customer_id , task_id ), KEY idx_ll_inbound_merge_group ( merge_group_no )
) ENGINE = InnoDB COMMENT = '入仓托盘合托记录' ;
2026-09-10 10:25:16 +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 COMMENT ''FBA仓库编码'' AFTER inbound_code' ));
2026-08-19 16:24:02 +08:00
PREPARE inbound_schema_stmt FROM @ ddl ; EXECUTE inbound_schema_stmt ; DEALLOCATE PREPARE inbound_schema_stmt ;
2026-08-24 17:37:15 +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 = 'customer_id' ), 'SELECT 1' , 'ALTER TABLE ll_inbound_plan_line ADD COLUMN customer_id VARCHAR(128) NOT NULL DEFAULT '''' COMMENT ''客户账号标识'' AFTER id' ));
2026-08-24 17:15:48 +08:00
PREPARE receiving_container_line_stmt FROM @ ddl ; EXECUTE receiving_container_line_stmt ; DEALLOCATE PREPARE receiving_container_line_stmt ;
2026-08-24 17:48:08 +08:00
UPDATE ll_inbound_plan_line l JOIN ll_inbound_plan p ON p . id = l . plan_id SET l . customer_id = p . customer_id WHERE l . customer_id IS NULL OR l . customer_id = '' ;
2026-08-24 17:15:48 +08:00
ALTER TABLE ll_inbound_plan_line MODIFY COLUMN customer_id VARCHAR ( 128 ) NOT NULL COMMENT '客户账号标识' ;
2026-08-24 17:37:15 +08:00
SET @ ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . statistics WHERE table_schema = DATABASE () AND table_name = 'll_inbound_plan_line' AND index_name = 'idx_ll_inbound_line_customer_plan' ), 'SELECT 1' , 'ALTER TABLE ll_inbound_plan_line ADD KEY idx_ll_inbound_line_customer_plan(customer_id,plan_id)' ));
PREPARE inbound_customer_scope_stmt FROM @ ddl ; EXECUTE inbound_customer_scope_stmt ; DEALLOCATE PREPARE inbound_customer_scope_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 = 'customer_id' ), 'SELECT 1' , 'ALTER TABLE ll_inbound_plan_pallet ADD COLUMN customer_id VARCHAR(128) NOT NULL DEFAULT '''' COMMENT ''客户账号标识'' AFTER id' ));
PREPARE inbound_customer_scope_stmt FROM @ ddl ; EXECUTE inbound_customer_scope_stmt ; DEALLOCATE PREPARE inbound_customer_scope_stmt ;
2026-08-24 17:48:08 +08:00
UPDATE ll_inbound_plan_pallet v JOIN ll_inbound_plan p ON p . id = v . plan_id SET v . customer_id = p . customer_id WHERE v . customer_id IS NULL OR v . customer_id = '' ;
2026-08-24 17:37:15 +08:00
ALTER TABLE ll_inbound_plan_pallet MODIFY COLUMN customer_id VARCHAR ( 128 ) NOT NULL COMMENT '客户账号标识' ;
SET @ ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . statistics WHERE table_schema = DATABASE () AND table_name = 'll_inbound_plan_pallet' AND index_name = 'idx_ll_inbound_pallet_customer_plan' ), 'SELECT 1' , 'ALTER TABLE ll_inbound_plan_pallet ADD KEY idx_ll_inbound_pallet_customer_plan(customer_id,plan_id)' ));
PREPARE inbound_customer_scope_stmt FROM @ ddl ; EXECUTE inbound_customer_scope_stmt ; DEALLOCATE PREPARE inbound_customer_scope_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 = 'customer_id' ), 'SELECT 1' , 'ALTER TABLE ll_inbound_plan_pallet_allocation ADD COLUMN customer_id VARCHAR(128) NOT NULL DEFAULT '''' COMMENT ''客户账号标识'' AFTER id' ));
PREPARE inbound_customer_scope_stmt FROM @ ddl ; EXECUTE inbound_customer_scope_stmt ; DEALLOCATE PREPARE inbound_customer_scope_stmt ;
2026-08-24 17:48:08 +08:00
UPDATE ll_inbound_plan_pallet_allocation a JOIN ll_inbound_plan p ON p . id = a . plan_id SET a . customer_id = p . customer_id WHERE a . customer_id IS NULL OR a . customer_id = '' ;
2026-08-24 17:37:15 +08:00
ALTER TABLE ll_inbound_plan_pallet_allocation MODIFY COLUMN customer_id VARCHAR ( 128 ) NOT NULL COMMENT '客户账号标识' ;
SET @ ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . statistics WHERE table_schema = DATABASE () AND table_name = 'll_inbound_plan_pallet_allocation' AND index_name = 'idx_ll_inbound_allocation_customer_plan' ), 'SELECT 1' , 'ALTER TABLE ll_inbound_plan_pallet_allocation ADD KEY idx_ll_inbound_allocation_customer_plan(customer_id,plan_id)' ));
PREPARE inbound_customer_scope_stmt FROM @ ddl ; EXECUTE inbound_customer_scope_stmt ; DEALLOCATE PREPARE inbound_customer_scope_stmt ;
2026-08-26 19:46:14 +08:00
DROP TEMPORARY TABLE IF EXISTS inbound_plan_customer_scope_assertion ;
CREATE TEMPORARY TABLE inbound_plan_customer_scope_assertion (
is_valid TINYINT NOT NULL ,
CONSTRAINT chk_inbound_plan_customer_scope_ready CHECK ( is_valid = 1 )
);
INSERT INTO inbound_plan_customer_scope_assertion ( is_valid )
SELECT 0
WHERE EXISTS ( SELECT 1 FROM ll_inbound_plan_line l LEFT JOIN ll_inbound_plan p ON p . id = l . plan_id WHERE l . customer_id IS NULL OR l . customer_id = '' OR p . id IS NULL OR l . customer_id <> p . customer_id )
OR EXISTS ( SELECT 1 FROM ll_inbound_plan_pallet v LEFT JOIN ll_inbound_plan p ON p . id = v . plan_id WHERE v . customer_id IS NULL OR v . customer_id = '' OR p . id IS NULL OR v . customer_id <> p . customer_id )
OR EXISTS ( SELECT 1 FROM ll_inbound_plan_pallet_allocation a LEFT JOIN ll_inbound_plan p ON p . id = a . plan_id WHERE a . customer_id IS NULL OR a . customer_id = '' OR p . id IS NULL OR a . customer_id <> p . customer_id );
DROP TEMPORARY TABLE inbound_plan_customer_scope_assertion ;
2026-08-24 17:15: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 = 'destination_type' ), 'ALTER TABLE ll_inbound_plan_line MODIFY COLUMN destination_type VARCHAR(32) NOT NULL DEFAULT ''OVERSEAS'' COMMENT ''目的类型:FBA按箱数接收、OVERSEAS逐箱扫码''' , 'ALTER TABLE ll_inbound_plan_line ADD COLUMN destination_type VARCHAR(32) NOT NULL DEFAULT ''OVERSEAS'' COMMENT ''目的类型:FBA按箱数接收、OVERSEAS逐箱扫码'' AFTER inbound_code' ));
PREPARE receiving_container_line_stmt FROM @ ddl ; EXECUTE receiving_container_line_stmt ; DEALLOCATE PREPARE receiving_container_line_stmt ;
2026-08-19 16:24:02 +08:00
UPDATE ll_inbound_plan_line l JOIN ll_order o ON o . id = l . order_id
2026-08-24 17:15:48 +08:00
SET l . fba_warehouse_code = o . fba_warehouse_code ,
l . destination_type = COALESCE ( NULLIF ( o . destination_type , '' ), CASE WHEN NULLIF ( o . fba_warehouse_code , '' ) IS NULL THEN 'OVERSEAS' ELSE 'FBA' END )
WHERE ( l . fba_warehouse_code IS NULL AND o . fba_warehouse_code IS NOT NULL )
OR l . destination_type IS NULL OR l . destination_type = '' OR l . destination_type = 'OVERSEAS' ;
CREATE TABLE IF NOT EXISTS ll_receiving_container_session (
2026-09-09 21:30:39 +08:00
id BIGINT NOT NULL COMMENT '柜号签收会话ID' ,
2026-08-28 13:54:32 +08:00
source_container_booking_id VARCHAR ( 128 ) NOT NULL COMMENT '稳定来源柜预订ID' , container_fact_hash VARCHAR ( 64 ) NOT NULL COMMENT '领取时整柜订单与计划事实摘要' ,
2026-09-07 15:07:34 +08:00
container_no VARCHAR ( 64 ) NOT NULL COMMENT '集装箱号' , overseas_warehouse_id BIGINT NOT NULL COMMENT '平台预分配并由操作员Token匹配的海外接柜仓ID' , overseas_warehouse_code VARCHAR ( 128 ) NOT NULL COMMENT '海外接柜仓业务编码快照' , overseas_warehouse_name VARCHAR ( 255 ) NOT NULL COMMENT '仓库服务校验后的海外接柜仓名称快照' , operator_key VARCHAR ( 128 ) NOT NULL COMMENT '操作账号唯一标识' ,
2026-08-24 21:00:22 +08:00
operator_name VARCHAR ( 255 ) NULL COMMENT '操作账号名称' , active_operator_key VARCHAR ( 255 ) NULL COMMENT '未完成会话平台操作账号全局唯一锁键' ,
2026-09-10 22:43:11 +08:00
active_container_key VARCHAR ( 255 ) NULL COMMENT '未完成会话柜号全局唯一锁键' , status VARCHAR ( 32 ) NOT NULL DEFAULT 'WAIT_SIGN' COMMENT '会话状态:WAIT_SIGN、SIGNED、RECEIVING、COMPLETED、COMPLETED_WITH_DIFFERENCE' ,
2026-08-24 19:28:32 +08:00
sign_photos JSON NULL COMMENT '签收卸柜照片角色与文件ID列表' , prepared_at DATETIME ( 3 ) NULL COMMENT '选择柜号时间' ,
2026-08-24 17:15:48 +08:00
signed_at DATETIME ( 3 ) NULL COMMENT '签收时间' , receiving_at DATETIME ( 3 ) NULL COMMENT '首次收货时间' ,
completed_at DATETIME ( 3 ) 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 '更新时间' , version INT NOT NULL DEFAULT 0 COMMENT '乐观锁版本' ,
PRIMARY KEY ( id ), UNIQUE KEY uk_ll_receiving_active_operator ( active_operator_key ), UNIQUE KEY uk_ll_receiving_active_container ( active_container_key ),
2026-09-09 21:30:39 +08:00
KEY idx_ll_receiving_container ( container_no , status ), KEY idx_ll_receiving_operator ( operator_key , created_at )
2026-08-24 17:15:48 +08:00
) ENGINE = InnoDB COMMENT = '海外PDA柜号签收收货会话' ;
2026-08-24 19:28:32 +08:00
CREATE TABLE IF NOT EXISTS ll_receiving_sku_receipt (
id BIGINT NOT NULL COMMENT 'FBA SKU实收进度ID' , customer_id VARCHAR ( 128 ) NOT NULL COMMENT '客户账号标识' ,
session_id BIGINT NOT NULL COMMENT '柜号签收会话ID' , plan_id BIGINT NOT NULL COMMENT '入仓计划ID' ,
line_id BIGINT NOT NULL COMMENT '入仓计划明细ID' , pallet_id BIGINT NOT NULL COMMENT '计划托盘ID' ,
order_id BIGINT NOT NULL COMMENT '尾程订单ID' , inbound_code VARCHAR ( 128 ) NOT NULL COMMENT '入仓码快照' ,
sku_code VARCHAR ( 128 ) NOT NULL COMMENT 'SKU编码快照' , product_name VARCHAR ( 255 ) NULL COMMENT '产品名称快照' ,
received_packages INT NOT NULL COMMENT 'SKU实收箱数' , 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 '更新时间' ,
version INT NOT NULL DEFAULT 0 COMMENT '乐观锁版本' , PRIMARY KEY ( id ),
UNIQUE KEY uk_ll_receiving_sku_pallet ( customer_id , line_id , pallet_id , sku_code ),
KEY idx_ll_receiving_sku_session ( customer_id , session_id , line_id ),
KEY idx_ll_receiving_sku_plan ( customer_id , plan_id , line_id )
) ENGINE = InnoDB COMMENT = '海外PDA柜号FBA SKU实收进度' ;
2026-09-10 22:43:11 +08:00
CREATE TABLE IF NOT EXISTS ll_receiving_fba_pallet_count (
id BIGINT NOT NULL COMMENT 'FBA托盘现场累计箱数ID' , session_id BIGINT NOT NULL COMMENT '柜号签收会话ID' ,
group_key VARCHAR ( 255 ) NOT NULL COMMENT '柜号与FBA仓组成的收货组键' , pallet_code VARCHAR ( 128 ) NOT NULL COMMENT '现有FBA托盘码' ,
actual_packages INT 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 ), UNIQUE KEY uk_ll_receiving_fba_count ( session_id , group_key , pallet_code ),
KEY idx_ll_receiving_fba_group ( session_id , group_key )
) ENGINE = InnoDB COMMENT = '海外PDA普通FBA托盘现场累计与超收标记' ;
2026-08-24 17:15:48 +08:00
CREATE TABLE IF NOT EXISTS ll_receiving_container_operation (
2026-09-09 21:30:39 +08:00
id BIGINT NOT NULL COMMENT '柜号收货操作ID' , session_id BIGINT NOT NULL COMMENT '柜号签收会话ID' ,
2026-08-24 17:15:48 +08:00
operator_key VARCHAR ( 128 ) NOT NULL COMMENT '操作账号唯一标识' , action VARCHAR ( 32 ) NOT NULL COMMENT '操作动作' , idempotency_key VARCHAR ( 255 ) NOT NULL COMMENT '客户端幂等键' ,
request_hash VARCHAR ( 128 ) NOT NULL COMMENT '请求内容哈希' , request_json LONGTEXT NOT NULL COMMENT '请求内容快照' , result_json LONGTEXT NOT NULL COMMENT '响应内容快照' ,
created_at DATETIME ( 3 ) NOT NULL DEFAULT CURRENT_TIMESTAMP ( 3 ) COMMENT '创建时间' , PRIMARY KEY ( id ),
2026-08-24 21:00:22 +08:00
UNIQUE KEY uk_ll_receiving_operation ( operator_key , idempotency_key ), KEY idx_ll_receiving_operation_session ( session_id , created_at )
2026-08-24 17:15:48 +08:00
) ENGINE = InnoDB COMMENT = '海外PDA柜号收货幂等审计记录' ;
2026-08-19 16:24:02 +08:00
2026-08-25 10:31:04 +08:00
CREATE TABLE IF NOT EXISTS ll_pda_operation_history (
id BIGINT NOT NULL COMMENT 'PDA作业历史ID' , overseas_warehouse_id BIGINT NOT NULL COMMENT 'Token冻结的海外实际仓ID' ,
customer_id VARCHAR ( 128 ) NULL COMMENT '作业涉及的客户标识' , operator_key VARCHAR ( 128 ) NOT NULL COMMENT 'PDA操作账号标识' ,
operation_type VARCHAR ( 64 ) NOT NULL COMMENT '作业类型' , business_key VARCHAR ( 255 ) NOT NULL COMMENT '作业业务键' ,
status VARCHAR ( 32 ) NOT NULL COMMENT '作业结果状态' , idempotency_key VARCHAR ( 255 ) NULL COMMENT '写操作幂等键' ,
request_hash VARCHAR ( 128 ) NULL COMMENT '写请求内容哈希' , summary VARCHAR ( 1000 ) NULL COMMENT '作业结果摘要' ,
occurred_at DATETIME ( 3 ) NOT NULL COMMENT '作业发生时间' , created_at DATETIME ( 3 ) NOT NULL DEFAULT CURRENT_TIMESTAMP ( 3 ) COMMENT '创建时间' ,
PRIMARY KEY ( id ), UNIQUE KEY uk_ll_pda_history_idempotency ( operator_key , idempotency_key ),
KEY idx_ll_pda_history_operator ( overseas_warehouse_id , operator_key , occurred_at ),
KEY idx_ll_pda_history_business ( overseas_warehouse_id , operation_type , business_key )
) ENGINE = InnoDB COMMENT = '海外PDA真实作业历史' ;
2026-08-25 11:20:36 +08:00
CREATE TABLE IF NOT EXISTS ll_pda_pallet_operation (
id BIGINT NOT NULL COMMENT 'PDA托盘作业ID' , overseas_warehouse_id BIGINT NOT NULL COMMENT 'Token冻结的海外实际仓ID' ,
operator_key VARCHAR ( 128 ) NOT NULL COMMENT 'PDA操作账号标识' , idempotency_key VARCHAR ( 128 ) NOT NULL COMMENT '设备幂等键' ,
operation_type VARCHAR ( 64 ) NOT NULL COMMENT '托盘作业类型' , request_hash VARCHAR ( 128 ) NOT NULL COMMENT '请求内容摘要' ,
status VARCHAR ( 32 ) NOT NULL COMMENT '处理状态:PROCESSING、COMPLETED、FAILED_COMPENSATED、COMPENSATION_REQUIRED' ,
result_json LONGTEXT NULL COMMENT '成功响应快照' , remote_transitions_json LONGTEXT NULL COMMENT '实物托盘状态变更回执' ,
last_error VARCHAR ( 2000 ) 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 ), UNIQUE KEY uk_ll_pda_pallet_idempotency ( operator_key , idempotency_key ),
KEY idx_ll_pda_pallet_warehouse ( overseas_warehouse_id , status , updated_at )
) ENGINE = InnoDB COMMENT = '海外PDA托盘作业幂等、补偿与结果记录' ;
CREATE TABLE IF NOT EXISTS ll_pda_stocktake_task (
id BIGINT NOT NULL COMMENT '盘点任务ID' , task_no VARCHAR ( 64 ) NOT NULL COMMENT '盘点任务号' ,
overseas_warehouse_id BIGINT NOT NULL COMMENT 'Token冻结的海外实际仓ID' , scope_type VARCHAR ( 16 ) NOT NULL COMMENT '盘点范围类型LOCATION或PALLET' ,
scope_resource_id BIGINT NOT NULL COMMENT '盘点库位或托盘资源ID' , scope_code VARCHAR ( 128 ) NOT NULL COMMENT '盘点库位码或托盘码快照' ,
status VARCHAR ( 32 ) NOT NULL COMMENT '盘点任务状态' , position_count INT NOT NULL COMMENT '库存位置总数' ,
counted_count INT NOT NULL DEFAULT 0 COMMENT '已盘库存位置数' , difference_count INT NOT NULL DEFAULT 0 COMMENT '存在差异的库存位置数' ,
created_by VARCHAR ( 128 ) NOT NULL COMMENT '创建操作账号标识' , submitted_by VARCHAR ( 128 ) NULL COMMENT '提交操作账号标识' ,
submit_reason VARCHAR ( 500 ) NULL COMMENT '盘点差异提交原因' , idempotency_key VARCHAR ( 128 ) NOT NULL COMMENT '创建幂等键' ,
request_hash VARCHAR ( 128 ) NOT NULL COMMENT '创建请求哈希' , version BIGINT NOT NULL DEFAULT 0 COMMENT '乐观锁版本' ,
created_at DATETIME ( 3 ) NOT NULL COMMENT '创建时间' , updated_at DATETIME ( 3 ) NOT NULL COMMENT '更新时间' ,
submitted_at DATETIME ( 3 ) NULL COMMENT '提交完成时间' , PRIMARY KEY ( id ), UNIQUE KEY uk_ll_pda_stocktake_no ( task_no ),
UNIQUE KEY uk_ll_pda_stocktake_create ( overseas_warehouse_id , created_by , idempotency_key ),
KEY idx_ll_pda_stocktake_list ( overseas_warehouse_id , status , created_at )
) ENGINE = InnoDB COMMENT = '海外PDA库存盘点任务' ;
CREATE TABLE IF NOT EXISTS ll_pda_stocktake_item (
id BIGINT NOT NULL COMMENT '盘点明细ID' , task_id BIGINT NOT NULL COMMENT '盘点任务ID' , customer_id VARCHAR ( 128 ) NOT NULL COMMENT '库存所属客户标识' ,
balance_id BIGINT NOT NULL COMMENT '库存余额ID' , position_id BIGINT NOT NULL COMMENT '库存位置ID' , sku_code VARCHAR ( 128 ) NULL COMMENT 'SKU快照' ,
product_name VARCHAR ( 255 ) NULL COMMENT '品名快照' , inbound_code VARCHAR ( 128 ) NULL COMMENT '入仓码快照' , pallet_id BIGINT NOT NULL COMMENT '实物托盘ID' ,
pallet_code VARCHAR ( 128 ) NOT NULL COMMENT '实物托盘码快照' , location_id BIGINT NOT NULL COMMENT '库位ID快照' , location_code VARCHAR ( 128 ) NOT NULL COMMENT '库位码快照' ,
book_packages BIGINT NOT NULL COMMENT '任务创建时账面总箱数' , actual_packages BIGINT NULL COMMENT '现场实盘总箱数' ,
difference_packages BIGINT NULL COMMENT '实盘与账面箱数差异' , status VARCHAR ( 32 ) NOT NULL COMMENT '盘点明细状态' ,
position_version BIGINT NOT NULL COMMENT '任务创建时库存位置版本' , counted_by VARCHAR ( 128 ) NULL COMMENT '盘点操作账号标识' ,
version BIGINT NOT NULL DEFAULT 0 COMMENT '明细乐观锁版本' , counted_at DATETIME ( 3 ) NULL COMMENT '盘点时间' ,
created_at DATETIME ( 3 ) NOT NULL COMMENT '创建时间' , updated_at DATETIME ( 3 ) NOT NULL COMMENT '更新时间' ,
PRIMARY KEY ( id ), UNIQUE KEY uk_ll_pda_stocktake_item ( task_id , position_id ), KEY idx_ll_pda_stocktake_item_task ( task_id , status , id )
) ENGINE = InnoDB COMMENT = '海外PDA库存盘点位置明细' ;
CREATE TABLE IF NOT EXISTS ll_pda_stocktake_action (
id BIGINT NOT NULL COMMENT '盘点动作ID' , overseas_warehouse_id BIGINT NOT NULL COMMENT 'Token冻结的海外实际仓ID' ,
operator_key VARCHAR ( 128 ) NOT NULL COMMENT 'PDA操作账号标识' , idempotency_key VARCHAR ( 128 ) NOT NULL COMMENT '动作幂等键' ,
action_type VARCHAR ( 32 ) NOT NULL COMMENT '盘点动作类型' , task_id BIGINT NULL COMMENT '盘点任务ID' , request_hash VARCHAR ( 128 ) NOT NULL COMMENT '动作请求哈希' ,
status VARCHAR ( 32 ) NOT NULL COMMENT '动作处理状态' , result_json LONGTEXT NULL COMMENT '成功响应JSON' ,
created_at DATETIME ( 3 ) NOT NULL COMMENT '创建时间' , updated_at DATETIME ( 3 ) NOT NULL COMMENT '更新时间' , PRIMARY KEY ( id ),
UNIQUE KEY uk_ll_pda_stocktake_action ( overseas_warehouse_id , operator_key , idempotency_key ), KEY idx_ll_pda_stocktake_action_task ( task_id , created_at )
) ENGINE = InnoDB COMMENT = '海外PDA盘点动作幂等记录' ;
CREATE TABLE IF NOT EXISTS ll_pda_inventory_move (
id BIGINT NOT NULL COMMENT '移库操作ID' , move_no VARCHAR ( 64 ) NOT NULL COMMENT '移库操作单号' ,
overseas_warehouse_id BIGINT NOT NULL COMMENT 'Token冻结的海外实际仓ID' , pallet_id BIGINT NOT NULL COMMENT '整托移库的实物托盘ID' ,
pallet_code VARCHAR ( 128 ) NOT NULL COMMENT '实物托盘码快照' , source_location_id BIGINT NOT NULL COMMENT '来源库位ID' ,
source_location_code VARCHAR ( 128 ) NOT NULL COMMENT '来源库位码快照' , target_location_id BIGINT NOT NULL COMMENT '目标库位ID' ,
target_location_code VARCHAR ( 128 ) NOT NULL COMMENT '目标库位码快照' , customer_count INT NOT NULL COMMENT '托盘涉及客户数' ,
position_count INT NOT NULL COMMENT '迁移库存位置数' , package_count BIGINT NOT NULL COMMENT '迁移总箱数' ,
pallet_version_before INT NOT NULL COMMENT '迁移前托盘版本' , pallet_version_after INT NULL COMMENT '迁移后托盘版本' ,
operator_key VARCHAR ( 128 ) NOT NULL COMMENT 'PDA操作账号标识' , reason VARCHAR ( 500 ) NOT NULL COMMENT '移库原因' ,
idempotency_key VARCHAR ( 128 ) NOT NULL COMMENT '移库幂等键' , request_hash VARCHAR ( 128 ) NOT NULL COMMENT '移库请求哈希' ,
status VARCHAR ( 32 ) NOT NULL COMMENT '移库处理状态' , result_json LONGTEXT NULL COMMENT '成功响应JSON' ,
created_at DATETIME ( 3 ) NOT NULL COMMENT '创建时间' , completed_at DATETIME ( 3 ) NULL COMMENT '完成时间' , PRIMARY KEY ( id ),
UNIQUE KEY uk_ll_pda_inventory_move_no ( move_no ),
UNIQUE KEY uk_ll_pda_inventory_move_key ( overseas_warehouse_id , operator_key , idempotency_key ),
KEY idx_ll_pda_inventory_move_pallet ( overseas_warehouse_id , pallet_id , created_at )
) ENGINE = InnoDB COMMENT = '海外PDA同仓整托移库记录' ;
2026-10-09 22:04:49 +08:00
CREATE TABLE IF NOT EXISTS ll_appointment_followup (
id BIGINT NOT NULL COMMENT '预约筹划跟进记录ID' ,
2026-10-10 08:42:01 +08:00
source_key VARCHAR ( 160 ) NOT NULL COMMENT '稳定ORDER、BOOKING或CONTAINER及接仓点来源键' ,
customer_id VARCHAR ( 128 ) NOT NULL COMMENT '货源客户;整柜共享记录由服务端固定为平台作用域0' ,
2026-10-09 22:04:49 +08:00
source_order_id BIGINT NULL COMMENT '已形成的真实尾程货源ID,尚未生成时为空' ,
stage VARCHAR ( 32 ) NOT NULL COMMENT '跟进对象:DRAYAGE_CONTACT/TERMINAL_APPOINTMENT/WAREHOUSE_RECEIVING/FBA_RECEIVING' ,
version INT NOT NULL COMMENT '同一货源及跟进对象的记录版本' ,
contacted_party VARCHAR ( 200 ) NULL COMMENT '本次联系对象,不替代承运主档' ,
result VARCHAR ( 1000 ) NOT NULL COMMENT '本次反馈事实,不自动确认预约或推进实物作业' ,
next_action VARCHAR ( 500 ) NULL COMMENT '下一步安排' ,
followup_date DATE NULL COMMENT '按业务地点当地日期记录的下次跟进日' ,
operator_id VARCHAR ( 128 ) NOT NULL COMMENT '登录平台操作者ID' ,
operator_name VARCHAR ( 200 ) NULL COMMENT '操作人姓名快照' ,
command_key VARCHAR ( 64 ) NOT NULL COMMENT '持久幂等键' ,
request_hash CHAR ( 64 ) NOT NULL COMMENT '含操作者身份的请求SHA256摘要' ,
created_at DATETIME ( 3 ) NOT NULL COMMENT 'UTC记录时间' ,
PRIMARY KEY ( id ),
UNIQUE KEY uk_appointment_followup_version ( source_key , stage , version ),
UNIQUE KEY uk_appointment_followup_command ( source_key , stage , command_key ),
KEY idx_appointment_followup_date ( followup_date , source_order_id ),
CONSTRAINT fk_appointment_followup_order FOREIGN KEY ( source_order_id ) REFERENCES ll_order ( id ),
CONSTRAINT chk_appointment_followup_stage CHECK ( stage IN ( 'DRAYAGE_CONTACT' , 'TERMINAL_APPOINTMENT' , 'WAREHOUSE_RECEIVING' , 'FBA_RECEIVING' ))
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT = '真实在途货源的预约筹划联系记录,追加留痕' ;
2026-10-16 15:43:04 +08:00
-- V13 receiving coverage and pending changes; baseline only, no test data migration.
CREATE TABLE IF NOT EXISTS ll_fba_receiving_agreement (
agreement_key VARCHAR ( 64 ) NOT NULL COMMENT '收货预约独立业务键' ,
version INT NOT NULL COMMENT '预约覆盖范围与确认资料版本' ,
status VARCHAR ( 24 ) NOT NULL COMMENT '有效、取消或已替代状态' ,
destination_key VARCHAR ( 128 ) NOT NULL COMMENT '权威目的仓关联键' ,
confirmation_no VARCHAR ( 128 ) NULL COMMENT '当前有效外部约号,失效后清空以释放覆盖' ,
snapshot_json LONGTEXT NOT NULL COMMENT '客户逐来源覆盖、确认时区及仓库依据快照' ,
PRIMARY KEY ( agreement_key ),
UNIQUE KEY uk_fba_receiving_confirmation ( destination_key , confirmation_no )
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '独立于送货批次的收货预约' ;
CREATE TABLE IF NOT EXISTS ll_fba_receiving_member (
agreement_key VARCHAR ( 64 ) NOT NULL COMMENT '所属收货预约业务键' ,
batch_key VARCHAR ( 128 ) NOT NULL COMMENT '稳定送货批次键' ,
customer_id VARCHAR ( 128 ) NOT NULL COMMENT '货物所属客户标识' ,
active_ref VARCHAR ( 260 ) NULL COMMENT '有效批次与客户唯一引用,退出后清空且历史保留' ,
PRIMARY KEY ( agreement_key , batch_key , customer_id ),
UNIQUE KEY uk_fba_receiving_active_member ( active_ref ),
KEY idx_fba_receiving_batch ( batch_key , customer_id )
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '收货预约当前覆盖关联及退出历史' ;
CREATE TABLE IF NOT EXISTS ll_fba_receiving_change (
change_key VARCHAR ( 64 ) NOT NULL COMMENT '客户预约变化业务键' ,
version INT NOT NULL COMMENT '变化续办版本' ,
status VARCHAR ( 24 ) NOT NULL COMMENT '待仓库确认、已应用或已撤回状态' ,
batch_key VARCHAR ( 128 ) NOT NULL COMMENT '受影响原送货批次键' ,
customer_id VARCHAR ( 128 ) NOT NULL COMMENT '本次变化所属客户' ,
snapshot_json LONGTEXT NOT NULL COMMENT '原覆盖快照、逐来源拟保留量、负责人及跟进资料' ,
result_json LONGTEXT NULL COMMENT '确认后的实际批次去向及逐步骤结果' ,
active_ref VARCHAR ( 260 ) NULL COMMENT '同批同客户唯一未解决变化引用' ,
PRIMARY KEY ( change_key ),
UNIQUE KEY uk_fba_receiving_pending ( active_ref ),
KEY idx_fba_receiving_pending_batch ( batch_key , status )
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '保留原安排且阻止误发车的客户变化' ;
CREATE TABLE IF NOT EXISTS ll_fba_receiving_revision (
agreement_key VARCHAR ( 64 ) NOT NULL COMMENT '收货预约业务键' ,
version INT NOT NULL COMMENT '不可变覆盖与确认版本' ,
snapshot_json LONGTEXT NOT NULL COMMENT '该版本完整客户覆盖、确认时段及回复依据' ,
PRIMARY KEY ( agreement_key , version )
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '收货预约覆盖与确认不可变历史' ;
CREATE TABLE IF NOT EXISTS ll_fba_receiving_plan (
batch_key VARCHAR ( 128 ) NOT NULL COMMENT '稳定送货批次键' ,
customer_id VARCHAR ( 128 ) NOT NULL COMMENT '计划所属客户标识' ,
snapshot_json LONGTEXT NOT NULL COMMENT '本客户未确认计划、目标窗口及业务时区,不含有效预约确认' ,
PRIMARY KEY ( batch_key , customer_id )
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '按批次及客户保存的未确认收货计划' ;
2026-08-19 16:24:02 +08:00
CREATE TABLE IF NOT EXISTS ll_inbound_fba_appointment (
id BIGINT NOT NULL COMMENT '主键ID' ,
2026-10-10 10:38:06 +08:00
appointment_no VARCHAR ( 64 ) NOT NULL COMMENT '系统预约业务单号,不是外部约号' ,
confirmation_no VARCHAR ( 128 ) NULL COMMENT '收货方正式外部确认号' ,
planned_date DATE NULL COMMENT '计划当地日期,可只有日期而无时段' ,
planned_at DATETIME ( 3 ) NULL COMMENT '计划开始当地时间,待定可空' ,
planned_end_at DATETIME ( 3 ) NULL COMMENT '计划结束当地时间' ,
appointment_at DATETIME ( 3 ) NULL COMMENT '对方确认开始当地时间' ,
appointment_end_at DATETIME ( 3 ) NULL COMMENT '对方确认结束当地时间' ,
appointment_start_utc DATETIME ( 3 ) NULL COMMENT '确认开始UTC时间点' ,
appointment_end_utc DATETIME ( 3 ) NULL COMMENT '确认结束UTC时间点' ,
timezone VARCHAR ( 64 ) NULL COMMENT '目的仓权威IANA时区,未维护不得确认' ,
origin_warehouse_id VARCHAR ( 64 ) NOT NULL COMMENT '实际起运仓' ,
2026-10-09 11:01:39 +08:00
version INT NOT NULL DEFAULT 0 COMMENT '并发版本' ,
2026-10-10 10:38:06 +08:00
appointment_status VARCHAR ( 32 ) NOT NULL DEFAULT 'PENDING' COMMENT 'PENDING安排/SUCCESS对方确认/FAILED/CANCELLED' ,
appointment_remark VARCHAR ( 1000 ) NULL COMMENT '备注或取消原因' ,
fba_warehouse_code VARCHAR ( 128 ) NOT NULL COMMENT 'FBA目的仓编码' ,
selected_count INT NOT NULL DEFAULT 0 COMMENT '真实货源票数' ,
2026-10-15 16:55:57 +08:00
replacement_nos_json LONGTEXT NULL COMMENT '分批或合并后的新预约业务号列表,非空时原批次只读' ,
replacement_keys_json LONGTEXT NULL COMMENT '替代批次不可变键列表,只用于内部业务关联' ,
repartition_reason VARCHAR ( 1000 ) NULL COMMENT '分批或合并原因,原安排及来源明细保留' ,
2026-10-10 10:38:06 +08:00
created_by VARCHAR ( 128 ) NOT NULL COMMENT '登录操作人' ,
created_at DATETIME ( 3 ) NOT NULL DEFAULT CURRENT_TIMESTAMP ( 3 ) COMMENT '创建UTC时间' ,
updated_at DATETIME ( 3 ) NOT NULL DEFAULT CURRENT_TIMESTAMP ( 3 ) COMMENT '更新UTC时间' ,
2026-08-19 16:24:02 +08:00
PRIMARY KEY ( id ),
2026-10-09 11:01:39 +08:00
UNIQUE KEY uk_ll_fba_appointment_no ( appointment_no ),
2026-10-10 10:38:06 +08:00
KEY idx_ll_fba_appointment_list ( appointment_at , appointment_status , fba_warehouse_code ),
KEY idx_ll_fba_appointment_planned ( planned_at , appointment_status )
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = 'FBA预约安排与正式确认唯一主记录' ;
2026-08-19 16:24:02 +08:00
CREATE TABLE IF NOT EXISTS ll_inbound_fba_appointment_item (
2026-10-10 10:38:06 +08:00
id BIGINT NOT NULL COMMENT '记录主键' ,
appointment_id BIGINT NOT NULL COMMENT '预约主记录标识' ,
source_key VARCHAR ( 160 ) NOT NULL COMMENT '稳定ORDER或BOOKING货源键' ,
source_version VARCHAR ( 160 ) NULL COMMENT '保存时核实的来源版本' ,
customer_id VARCHAR ( 128 ) NOT NULL COMMENT '本票所属客户' ,
order_id BIGINT NULL COMMENT '尚未形成尾程订单时为空' ,
inbound_code VARCHAR ( 128 ) NULL COMMENT '真实入仓码,不伪造' ,
fba_warehouse_code VARCHAR ( 128 ) NOT NULL COMMENT '目的FBA仓编码' ,
2026-10-15 16:55:57 +08:00
package_count INT NULL COMMENT '本批分配箱数,未知保持空;同一原来源总量守恒' ,
cargo_verification_version INT NULL COMMENT '采用的预约货物核实版本,未核实时为空' ,
shipment_references_json LONGTEXT NULL COMMENT '本次采用的货件或追踪号核实快照' ,
2026-10-16 15:43:04 +08:00
active TINYINT ( 1 ) NOT NULL DEFAULT 1 COMMENT '当前批次数量分配有效;取消、未约成和完成均保留,仅替代时释放' ,
2026-10-10 10:38:06 +08:00
created_at DATETIME ( 3 ) NOT NULL DEFAULT CURRENT_TIMESTAMP ( 3 ) COMMENT '创建UTC时间' ,
2026-08-19 16:24:02 +08:00
PRIMARY KEY ( id ),
2026-10-10 10:38:06 +08:00
UNIQUE KEY uk_ll_fba_item_source ( appointment_id , source_key ),
2026-10-15 16:55:57 +08:00
KEY idx_ll_fba_active_source ( customer_id , source_key , active ),
KEY idx_ll_fba_active_order ( customer_id , order_id , active ),
2026-10-10 10:38:06 +08:00
KEY idx_ll_fba_item_source_lookup ( source_key , customer_id ),
KEY idx_ll_fba_item_customer_order ( customer_id , order_id )
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '入仓前后共用的预约真实货源' ;
2026-10-15 16:55:57 +08:00
CREATE TABLE IF NOT EXISTS ll_appointment_cargo_verification (
id BIGINT NOT NULL COMMENT '核实记录主键' ,
customer_id VARCHAR ( 128 ) NOT NULL COMMENT '原货源所属客户' ,
source_key VARCHAR ( 160 ) NOT NULL COMMENT '稳定ORDER或BOOKING原来源键' ,
destination_key VARCHAR ( 160 ) NOT NULL COMMENT '核实时的原目的地' ,
source_version VARCHAR ( 160 ) NULL COMMENT '核实时的原来源版本' ,
source_packages INT NULL COMMENT '核实时的原来源箱数,未知为空' ,
version INT NOT NULL COMMENT '同一来源的核实版本,从一递增' ,
package_count INT NULL COMMENT '独立核实箱数,不回写原订单' ,
shipment_references_json LONGTEXT NOT NULL COMMENT '本票货件号或追踪号列表,不回写原订单' ,
remark VARCHAR ( 1000 ) NULL COMMENT '核实说明' ,
operator_id VARCHAR ( 128 ) NOT NULL COMMENT '登录操作人' ,
operator_name VARCHAR ( 200 ) NULL COMMENT '操作人名称快照' ,
command_key VARCHAR ( 64 ) NOT NULL COMMENT '来源内幂等命令键' ,
request_hash CHAR ( 64 ) NOT NULL COMMENT '来源、操作人及请求摘要' ,
created_at DATETIME ( 3 ) NOT NULL COMMENT '核实UTC时间' ,
PRIMARY KEY ( id ),
UNIQUE KEY uk_ll_cargo_verification_version ( customer_id , source_key , version ),
UNIQUE KEY uk_ll_cargo_verification_command ( customer_id , source_key , command_key ),
CONSTRAINT chk_ll_cargo_verification_quantity CHECK ( package_count IS NULL OR package_count > 0 ),
CONSTRAINT chk_ll_cargo_verification_version CHECK ( version > 0 )
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '预约货物核实资料及不可覆盖的版本历史' ;
2026-10-10 10:38:06 +08:00
CREATE TABLE IF NOT EXISTS ll_fba_appointment_command (
command_key VARCHAR ( 128 ) NOT NULL COMMENT '持久化幂等键' ,
request_hash CHAR ( 64 ) NOT NULL COMMENT '操作、操作者和请求摘要' ,
operation VARCHAR ( 96 ) NOT NULL COMMENT '操作类型及目标业务号' ,
operator_id VARCHAR ( 128 ) NOT NULL COMMENT '登录操作人' ,
appointment_no VARCHAR ( 64 ) NULL COMMENT '系统预约业务单号' ,
response_json LONGTEXT NULL COMMENT '原命令返回快照,与业务写入同事务' ,
created_at DATETIME ( 3 ) NOT NULL DEFAULT CURRENT_TIMESTAMP ( 3 ) COMMENT '创建UTC时间' ,
PRIMARY KEY ( command_key ),
KEY idx_ll_fba_command_appointment ( appointment_no , created_at )
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '预约命令与变更历史' ;
2026-08-19 16:24:02 +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 '记录时间' ;
CREATE TABLE IF NOT EXISTS ll_inventory_balance (
id BIGINT NOT NULL COMMENT '主键ID' ,
2026-08-28 10:03:32 +08:00
customer_id VARCHAR ( 128 ) NOT NULL COMMENT '客户租户ID' , customer_name VARCHAR ( 255 ) NOT NULL COMMENT '客户名称不可变快照' ,
2026-08-19 16:24:02 +08:00
overseas_warehouse_id VARCHAR ( 128 ) NOT NULL COMMENT '海外仓ID' ,
overseas_warehouse_code VARCHAR ( 128 ) NULL COMMENT '海外仓编码快照' ,
overseas_warehouse_name VARCHAR ( 255 ) NULL COMMENT '海外仓名称快照' ,
destination_warehouse_id VARCHAR ( 128 ) NULL COMMENT '目的仓ID' ,
destination_warehouse_code VARCHAR ( 128 ) NOT NULL DEFAULT '' COMMENT '目的仓编码快照' ,
destination_warehouse_name VARCHAR ( 255 ) NULL COMMENT '目的仓名称快照' ,
inbound_order_id BIGINT NOT NULL COMMENT '入仓单ID' ,
inbound_order_no VARCHAR ( 128 ) NULL COMMENT '入仓单号快照' ,
inbound_code VARCHAR ( 128 ) NOT NULL COMMENT '入仓单号快照' ,
2026-08-22 10:16:45 +08:00
sku_code VARCHAR ( 128 ) NOT NULL COMMENT 'SKU快照;多SKU汇总时为MIXED,不参与当前库存唯一维度' ,
2026-08-20 18:02:38 +08:00
product_name_zh VARCHAR ( 255 ) NULL COMMENT '中文品名快照' ,
product_name_en VARCHAR ( 255 ) NULL COMMENT '英文品名快照' ,
2026-08-19 16:24:02 +08:00
available_packages BIGINT NOT NULL DEFAULT 0 COMMENT '可用箱数' , hold_packages BIGINT NOT NULL DEFAULT 0 COMMENT '冻结箱数' ,
allocated_packages BIGINT NOT NULL DEFAULT 0 COMMENT '已分配箱数' , picked_packages BIGINT NOT NULL DEFAULT 0 COMMENT '已拣箱数' ,
in_transit_packages BIGINT NOT NULL DEFAULT 0 COMMENT '在途箱数' , receiving_packages BIGINT NOT NULL DEFAULT 0 COMMENT '收货处理中箱数' ,
procurement_packages BIGINT NOT NULL DEFAULT 0 COMMENT '采购业务占用箱数' ,
version BIGINT 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 ),
2026-08-22 10:16:45 +08:00
UNIQUE KEY uk_ll_inventory_dimension ( customer_id , overseas_warehouse_id , destination_warehouse_code , inbound_order_id , inbound_code ),
2026-08-19 16:24:02 +08:00
KEY idx_ll_inventory_list ( customer_id , overseas_warehouse_id , updated_at ),
2026-08-20 18:02:38 +08:00
KEY idx_ll_inventory_inbound ( customer_id , inbound_code ),
KEY idx_ll_inventory_sku ( customer_id , sku_code , updated_at )
2026-08-22 10:16:45 +08:00
) ENGINE = InnoDB COMMENT = '客户入仓单与海外目的仓维度实时库存余额' ;
2026-08-19 16:24:02 +08:00
CREATE TABLE IF NOT EXISTS ll_inventory_position (
id BIGINT NOT NULL COMMENT '主键ID' , customer_id VARCHAR ( 128 ) NOT NULL COMMENT '客户租户ID' , balance_id BIGINT NOT NULL COMMENT '库存余额记录ID' ,
overseas_warehouse_id VARCHAR ( 128 ) NOT NULL COMMENT '海外仓ID' , destination_warehouse_code VARCHAR ( 128 ) NOT NULL DEFAULT '' COMMENT '目的仓编码快照' ,
pallet_id BIGINT NOT NULL COMMENT '托盘ID' , pallet_no VARCHAR ( 64 ) NOT NULL COMMENT '托盘号' ,
batch_no VARCHAR ( 128 ) NOT NULL DEFAULT '' COMMENT '库存批次号' , warehouse_location_id BIGINT NULL COMMENT '仓库库位ID' ,
warehouse_location_code VARCHAR ( 128 ) NOT NULL COMMENT '仓库库位编码' ,
available_packages BIGINT NOT NULL DEFAULT 0 COMMENT '可用箱数' , hold_packages BIGINT NOT NULL DEFAULT 0 COMMENT '冻结箱数' ,
allocated_packages BIGINT NOT NULL DEFAULT 0 COMMENT '已分配箱数' , picked_packages BIGINT NOT NULL DEFAULT 0 COMMENT '已拣箱数' ,
receiving_packages BIGINT NOT NULL DEFAULT 0 COMMENT '收货处理中箱数' ,
status VARCHAR ( 32 ) NOT NULL DEFAULT 'ACTIVE' COMMENT '业务状态' , version BIGINT 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_inventory_position ( balance_id , pallet_id , batch_no ),
KEY idx_ll_inventory_position_pallet ( customer_id , pallet_id ),
KEY idx_ll_inventory_position_location ( customer_id , overseas_warehouse_id , warehouse_location_code )
) ENGINE = InnoDB COMMENT = '托盘库位批次库存明细' ;
CREATE TABLE IF NOT EXISTS ll_inventory_ledger (
2026-08-28 10:03:32 +08:00
id BIGINT NOT NULL COMMENT '主键ID' , customer_id VARCHAR ( 128 ) NOT NULL COMMENT '客户租户ID' , customer_name VARCHAR ( 255 ) NOT NULL COMMENT '客户名称不可变快照' ,
2026-08-19 16:24:02 +08:00
balance_id BIGINT NOT NULL COMMENT '库存余额记录ID' , position_id BIGINT NULL COMMENT '库存仓位记录ID' , overseas_warehouse_id VARCHAR ( 128 ) NOT NULL COMMENT '海外仓ID' ,
destination_warehouse_code VARCHAR ( 128 ) NOT NULL DEFAULT '' COMMENT '目的仓编码快照' , inbound_order_id BIGINT NOT NULL COMMENT '入仓单ID' ,
pallet_id BIGINT NULL COMMENT '托盘ID' , pallet_no VARCHAR ( 64 ) NULL COMMENT '托盘号' , batch_no VARCHAR ( 128 ) NULL COMMENT '库存批次号' ,
warehouse_location_code VARCHAR ( 128 ) NULL COMMENT '仓库库位编码' , sku_code VARCHAR ( 128 ) NULL COMMENT 'SKU编码' , carton_mark VARCHAR ( 128 ) NULL COMMENT '箱唛' , carton_packages BIGINT NULL COMMENT '箱内箱数' ,
business_type VARCHAR ( 32 ) NOT NULL COMMENT '业务类型' ,
business_order_id BIGINT NULL COMMENT '业务单据ID' , business_order_no VARCHAR ( 128 ) NULL COMMENT '业务单号' , inbound_code VARCHAR ( 128 ) NULL COMMENT '入仓单号快照' ,
inbound_order_no VARCHAR ( 128 ) NULL COMMENT '入仓单号快照' , outbound_order_no VARCHAR ( 128 ) NULL COMMENT '出库单号' ,
source_event_id VARCHAR ( 128 ) NULL COMMENT '来源事件ID' , idempotency_key VARCHAR ( 255 ) NOT NULL COMMENT '业务幂等键' ,
status_from VARCHAR ( 32 ) NULL COMMENT '操作前状态' , status_to VARCHAR ( 32 ) NULL COMMENT '操作后状态' ,
before_packages BIGINT NOT NULL COMMENT '变动前箱数' , delta_packages BIGINT NOT NULL COMMENT '箱数变动量' , after_packages BIGINT NOT NULL COMMENT '变动后箱数' ,
operator_id VARCHAR ( 128 ) NULL COMMENT '操作人ID' , remark VARCHAR ( 1000 ) NULL COMMENT '备注' ,
occurred_at DATETIME ( 3 ) NOT NULL COMMENT '业务发生时间' , created_at DATETIME ( 3 ) NOT NULL DEFAULT CURRENT_TIMESTAMP ( 3 ) COMMENT '创建时间' ,
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 )
) ENGINE = InnoDB COMMENT = '不可变库存变动流水' ;
CREATE TABLE IF NOT EXISTS ll_inventory_operation (
id BIGINT NOT NULL COMMENT '主键ID' , customer_id VARCHAR ( 128 ) NOT NULL COMMENT '客户租户ID' ,
idempotency_key VARCHAR ( 255 ) NOT NULL COMMENT '业务幂等键' , operation_type VARCHAR ( 32 ) NOT NULL COMMENT '操作类型' ,
request_hash VARCHAR ( 128 ) NOT NULL COMMENT '请求内容哈希' , status VARCHAR ( 32 ) NOT NULL DEFAULT 'PROCESSING' COMMENT '库存命令处理状态' ,
result_json LONGTEXT NULL COMMENT '处理结果JSON' , last_error VARCHAR ( 2000 ) 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 ), UNIQUE KEY uk_ll_inventory_operation_key ( customer_id , idempotency_key ),
KEY idx_ll_inventory_operation_status ( customer_id , status , updated_at )
) ENGINE = InnoDB COMMENT = '库存命令幂等记录' ;
CREATE TABLE IF NOT EXISTS ll_inbound_stock_receipt (
id BIGINT NOT NULL COMMENT '主键ID' , customer_id VARCHAR ( 128 ) NOT NULL COMMENT '客户租户ID' ,
plan_id BIGINT NOT NULL COMMENT '入仓计划ID' , task_id BIGINT NOT NULL COMMENT 'PDA任务ID' , allocation_id BIGINT NOT NULL COMMENT '分配记录ID' ,
line_id BIGINT NOT NULL COMMENT '入仓计划明细ID' , order_id BIGINT NOT NULL COMMENT '订单ID' , inbound_code VARCHAR ( 128 ) NOT NULL COMMENT '入仓单号快照' ,
2026-08-20 18:02:38 +08:00
sku_code VARCHAR ( 128 ) NOT NULL COMMENT 'SKU编码快照' , product_name_zh VARCHAR ( 255 ) NULL COMMENT '中文品名快照' ,
product_name_en VARCHAR ( 255 ) NULL COMMENT '英文品名快照' ,
2026-09-07 21:10:43 +08:00
warehouse_pallet_id BIGINT NOT NULL COMMENT '仓库实物托盘ID' , pallet_no VARCHAR ( 64 ) NOT NULL COMMENT '海外仓实物托盘码' ,
source_pallet_no VARCHAR ( 128 ) NULL COMMENT '一件代发不可变来源托盘号快照' ,
2026-08-19 16:24:02 +08:00
warehouse_location_id BIGINT NULL COMMENT '仓库库位ID' , warehouse_location_code VARCHAR ( 128 ) NULL COMMENT '仓库库位编码' ,
batch_no VARCHAR ( 128 ) NOT NULL COMMENT '库存批次号' , received_packages BIGINT NOT NULL COMMENT '实收箱数' ,
inventory_balance_id BIGINT NOT NULL COMMENT '库存余额记录ID' , inventory_position_id BIGINT NOT NULL COMMENT '库存仓位记录ID' ,
inventory_operation_key VARCHAR ( 255 ) NOT NULL COMMENT '库存操作幂等键' , received_at DATETIME ( 3 ) NOT NULL COMMENT '实收时间' ,
created_at DATETIME ( 3 ) NOT NULL DEFAULT CURRENT_TIMESTAMP ( 3 ) COMMENT '创建时间' ,
2026-08-20 18:02:38 +08:00
PRIMARY KEY ( id ), UNIQUE KEY uk_ll_stock_receipt_task_allocation_sku ( customer_id , task_id , allocation_id , sku_code ),
2026-08-19 16:24:02 +08:00
KEY idx_ll_stock_receipt_plan ( customer_id , plan_id , line_id ), KEY idx_ll_stock_receipt_inventory ( inventory_balance_id , inventory_position_id )
) ENGINE = InnoDB COMMENT = '入仓PDA库存实收快照' ;
CREATE TABLE IF NOT EXISTS ll_dispatch_order (
id BIGINT NOT NULL COMMENT '主键ID' ,
customer_id VARCHAR ( 128 ) 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 '海外仓名称快照' ,
vehicle_plate VARCHAR ( 64 ) NULL COMMENT '车牌号' ,
driver_name VARCHAR ( 128 ) NULL COMMENT '司机姓名' ,
driver_phone VARCHAR ( 64 ) NULL COMMENT '司机电话' ,
carrier_name VARCHAR ( 255 ) NULL COMMENT '承运商名称' ,
route VARCHAR ( 255 ) NULL COMMENT '运输路线' ,
depart_at DATETIME ( 3 ) NULL COMMENT '发车时间' ,
fba_appointment_no VARCHAR ( 64 ) NULL COMMENT 'FBA预约号' ,
fba_appointment_status VARCHAR ( 32 ) NOT NULL DEFAULT 'PENDING' COMMENT 'FBA预约状态' ,
vehicle_appointment_status VARCHAR ( 32 ) NOT NULL DEFAULT 'PENDING' COMMENT '车辆预约状态' ,
estimated_arrival_at DATETIME ( 3 ) NULL COMMENT '预计到达时间' ,
status VARCHAR ( 32 ) NOT NULL DEFAULT 'PENDING_DEPARTURE' COMMENT '业务状态' ,
item_count INT NOT NULL DEFAULT 0 COMMENT '明细数量' ,
pallet_count INT NOT NULL DEFAULT 0 COMMENT '托盘数' ,
package_count INT NOT NULL DEFAULT 0 COMMENT '箱数' ,
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 '部分完成原因' ,
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 ),
2026-09-01 14:24:59 +08:00
UNIQUE KEY uk_ll_dispatch_order_no ( dispatch_no ),
2026-08-19 16:24:02 +08:00
KEY idx_ll_dispatch_order_list ( customer_id , status , depart_at ),
KEY idx_ll_dispatch_order_vehicle ( customer_id , vehicle_plate )
) ENGINE = InnoDB COMMENT = '尾程派车单' ;
CREATE TABLE IF NOT EXISTS ll_dispatch_item (
id BIGINT NOT NULL COMMENT '主键ID' ,
dispatch_order_id BIGINT NOT NULL COMMENT '派车单ID' ,
customer_id VARCHAR ( 128 ) NOT NULL COMMENT '客户租户ID' ,
plan_id BIGINT NULL COMMENT '入仓计划ID' ,
plan_pallet_id BIGINT NULL COMMENT '计划托盘ID' ,
warehouse_pallet_id BIGINT NULL COMMENT '仓库实物托盘ID' ,
order_id BIGINT NULL COMMENT '订单ID' ,
order_no VARCHAR ( 64 ) NULL COMMENT '订单号' ,
order_refs VARCHAR ( 2000 ) NULL COMMENT '关联订单信息' ,
inbound_code VARCHAR ( 128 ) NULL COMMENT '入仓单号快照' ,
pallet_no VARCHAR ( 128 ) NOT NULL COMMENT '托盘号' ,
overseas_warehouse_id VARCHAR ( 128 ) NULL COMMENT '海外仓ID' ,
overseas_warehouse_name VARCHAR ( 255 ) 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_warehouse_code VARCHAR ( 128 ) NULL COMMENT 'FBA仓库编码' ,
2026-09-17 17:37:29 +08:00
destination_type VARCHAR ( 32 ) NULL COMMENT '目的类型:FBA或PRIVATE' ,
delivery_address VARCHAR ( 1000 ) NULL COMMENT '私人仓目的地址快照' ,
postal_code VARCHAR ( 32 ) NULL COMMENT '私人仓邮编快照' ,
contact_name VARCHAR ( 128 ) NULL COMMENT '私人仓联系人快照' ,
contact_phone VARCHAR ( 64 ) NULL COMMENT '私人仓联系电话快照' ,
2026-08-19 16:24:02 +08:00
package_count INT NOT NULL DEFAULT 0 COMMENT '箱数' ,
2026-10-03 04:18:52 +08:00
gross_weight_kg DECIMAL ( 18 , 3 ) NULL COMMENT '毛重(千克),未知为NULL,不以材积重代替' ,
2026-09-18 14:58:40 +08:00
volume_weight_kg DECIMAL ( 18 , 3 ) NOT NULL DEFAULT 0 COMMENT '材积重(千克)' ,
2026-08-19 16:24:02 +08:00
volume_cbm DECIMAL ( 18 , 4 ) NOT NULL DEFAULT 0 COMMENT '体积(立方米)' ,
source_stage VARCHAR ( 32 ) NOT NULL COMMENT '数据来源阶段' ,
2026-09-10 17:11:33 +08:00
carton_marks VARCHAR ( 4000 ) NULL COMMENT '换标箱唛映射快照' ,
source_business_type VARCHAR ( 32 ) NULL COMMENT '来源业务类型' ,
source_business_no VARCHAR ( 128 ) NULL COMMENT '来源业务单号' ,
2026-08-19 16:24:02 +08:00
created_at DATETIME ( 3 ) NOT NULL DEFAULT CURRENT_TIMESTAMP ( 3 ) COMMENT '创建时间' ,
2026-10-03 16:06:54 +08:00
return_receipt_id BIGINT NULL COMMENT '明确选用的真实退回入仓来源' ,
2026-08-19 16:24:02 +08:00
PRIMARY KEY ( id ),
UNIQUE KEY uk_ll_dispatch_item_source ( dispatch_order_id , plan_pallet_id , warehouse_pallet_id ),
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 )
) ENGINE = InnoDB COMMENT = '派车货物冻结明细' ;
2026-09-10 17:11:33 +08:00
SET @ ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_dispatch_item' AND column_name = 'carton_marks' ), 'SELECT 1' , 'ALTER TABLE ll_dispatch_item ADD COLUMN carton_marks VARCHAR(4000) NULL COMMENT ''换标箱唛映射快照'' AFTER source_stage' )); PREPARE stmt FROM @ ddl ; EXECUTE stmt ; DEALLOCATE PREPARE stmt ;
SET @ ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_dispatch_item' AND column_name = 'source_business_type' ), 'SELECT 1' , 'ALTER TABLE ll_dispatch_item ADD COLUMN source_business_type VARCHAR(32) NULL COMMENT ''来源业务类型'' AFTER carton_marks' )); PREPARE stmt FROM @ ddl ; EXECUTE stmt ; DEALLOCATE PREPARE stmt ;
SET @ ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_dispatch_item' AND column_name = 'source_business_no' ), 'SELECT 1' , 'ALTER TABLE ll_dispatch_item ADD COLUMN source_business_no VARCHAR(128) NULL COMMENT ''来源业务单号'' AFTER source_business_type' )); PREPARE stmt FROM @ ddl ; EXECUTE stmt ; DEALLOCATE PREPARE stmt ;
2026-09-18 14:58:40 +08:00
SET @ ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_dispatch_item' AND column_name = 'gross_weight_kg' ), 'SELECT 1' , 'ALTER TABLE ll_dispatch_item ADD COLUMN gross_weight_kg DECIMAL(18,3) NOT NULL DEFAULT 0 COMMENT ''毛重(千克)'' AFTER package_count, ADD COLUMN volume_weight_kg DECIMAL(18,3) NOT NULL DEFAULT 0 COMMENT ''材积重(千克)'' AFTER gross_weight_kg' )); PREPARE stmt FROM @ ddl ; EXECUTE stmt ; DEALLOCATE PREPARE stmt ;
2026-09-17 17:37:29 +08:00
SET @ ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_dispatch_item' AND column_name = 'destination_type' ), 'SELECT 1' , 'ALTER TABLE ll_dispatch_item ADD COLUMN destination_type VARCHAR(32) NULL COMMENT ''目的类型:FBA或PRIVATE'' AFTER fba_warehouse_code, ADD COLUMN delivery_address VARCHAR(1000) NULL COMMENT ''私人仓目的地址快照'' AFTER destination_type, ADD COLUMN postal_code VARCHAR(32) NULL COMMENT ''私人仓邮编快照'' AFTER delivery_address, ADD COLUMN contact_name VARCHAR(128) NULL COMMENT ''私人仓联系人快照'' AFTER postal_code, ADD COLUMN contact_phone VARCHAR(64) NULL COMMENT ''私人仓联系电话快照'' AFTER contact_name' )); PREPARE stmt FROM @ ddl ; EXECUTE stmt ; DEALLOCATE PREPARE stmt ;
2026-09-10 17:11:33 +08:00
2026-08-21 17:38:14 +08:00
CREATE TABLE IF NOT EXISTS ll_dispatch_pallet_lock (
2026-08-19 16:24:02 +08:00
id BIGINT NOT NULL COMMENT '主键ID' ,
customer_id VARCHAR ( 128 ) NOT NULL COMMENT '客户租户ID' ,
source_pallet_key VARCHAR ( 160 ) NOT NULL COMMENT '来源托盘业务键' ,
active_key VARCHAR ( 160 ) NULL COMMENT '生效中的资源排他键' ,
plan_id BIGINT NULL COMMENT '入仓计划ID' ,
plan_pallet_id BIGINT NULL COMMENT '计划托盘ID' ,
warehouse_pallet_id BIGINT NULL COMMENT '仓库实物托盘ID' ,
2026-08-21 17:38:14 +08:00
dispatch_order_id BIGINT NULL COMMENT '正式派车单ID,草稿锁阶段为空' ,
draft_container_id BIGINT NULL COMMENT '智能排车草稿装车托盘ID' ,
2026-08-21 17:21:26 +08:00
draft_token VARCHAR ( 64 ) NULL COMMENT '智能排车草稿随机标识' ,
operator_id VARCHAR ( 128 ) NULL COMMENT '草稿锁操作人ID' ,
2026-08-19 16:24:02 +08:00
status VARCHAR ( 32 ) NOT NULL DEFAULT 'ACTIVE' COMMENT '业务状态' ,
locked_at DATETIME ( 3 ) NOT NULL COMMENT '锁定时间' ,
2026-08-21 17:21:26 +08:00
expires_at DATETIME ( 3 ) NULL COMMENT '草稿锁失效时间,正式派车锁为空' ,
2026-08-19 16:24:02 +08:00
released_at DATETIME ( 3 ) 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 '更新时间' ,
2026-10-03 16:06:54 +08:00
return_receipt_id BIGINT NULL COMMENT '明确选用的真实退回入仓来源' ,
2026-08-19 16:24:02 +08:00
PRIMARY KEY ( id ),
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-21 17:38:14 +08:00
) ENGINE = InnoDB COMMENT = '派车托盘排他锁' ;
CREATE TABLE IF NOT EXISTS ll_dispatch_draft (
2026-08-22 10:20:38 +08:00
id BIGINT NOT NULL COMMENT '主键ID' , draft_token VARCHAR ( 64 ) NOT NULL COMMENT '智能排车草稿随机标识' ,
customer_id VARCHAR ( 128 ) NULL COMMENT '客户租户ID' , operator_id VARCHAR ( 128 ) NULL COMMENT '草稿操作人ID' ,
plan_ids_json VARCHAR ( 4000 ) NULL COMMENT '所选入仓计划ID列表JSON' , containers_json LONGTEXT NULL COMMENT '草稿装车布局JSON快照' ,
status VARCHAR ( 32 ) NOT NULL DEFAULT 'ACTIVE' COMMENT '草稿状态' , expires_at DATETIME ( 3 ) NULL COMMENT '草稿失效时间' ,
released_at DATETIME ( 3 ) 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 '更新时间' ,
2026-08-21 17:38:14 +08:00
PRIMARY KEY ( id ), UNIQUE KEY uk_ll_dispatch_draft_token ( draft_token ), KEY idx_ll_dispatch_draft_operator ( operator_id , status )
) ENGINE = InnoDB COMMENT = '智能排车草稿' ;
CREATE TABLE IF NOT EXISTS ll_dispatch_draft_container (
2026-08-22 10:20:38 +08:00
id BIGINT NOT NULL COMMENT '主键ID' , draft_id BIGINT NOT NULL COMMENT '智能排车草稿ID' ,
draft_token VARCHAR ( 64 ) NOT NULL COMMENT '智能排车草稿随机标识' , sequence_no INT NOT NULL COMMENT '草稿车厢顺序号' ,
capacity INT 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-21 17:38:14 +08:00
KEY idx_ll_dispatch_draft_container_token ( draft_token )
) ENGINE = InnoDB COMMENT = '智能排车草稿装车托盘' ;
SET @ ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_dispatch_pallet_lock' AND column_name = 'draft_container_id' ), 'SELECT 1' , 'ALTER TABLE ll_dispatch_pallet_lock ADD COLUMN draft_container_id BIGINT NULL COMMENT ''智能排车草稿装车托盘ID'' AFTER dispatch_order_id' ));
PREPARE dispatch_draft_container_column_stmt FROM @ ddl ; EXECUTE dispatch_draft_container_column_stmt ; DEALLOCATE PREPARE dispatch_draft_container_column_stmt ;
2026-08-19 16:24:02 +08:00
2026-08-21 17:21:26 +08:00
SET @ ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_dispatch_pallet_lock' AND column_name = 'draft_token' ), 'SELECT 1' , 'ALTER TABLE ll_dispatch_pallet_lock ADD COLUMN draft_token VARCHAR(64) NULL COMMENT ''智能排车草稿随机标识'' AFTER dispatch_order_id' ));
PREPARE dispatch_schema_stmt FROM @ ddl ; EXECUTE dispatch_schema_stmt ; DEALLOCATE PREPARE dispatch_schema_stmt ;
SET @ ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_dispatch_pallet_lock' AND column_name = 'operator_id' ), 'SELECT 1' , 'ALTER TABLE ll_dispatch_pallet_lock ADD COLUMN operator_id VARCHAR(128) NULL COMMENT ''草稿锁操作人ID'' AFTER draft_token' ));
PREPARE dispatch_schema_stmt FROM @ ddl ; EXECUTE dispatch_schema_stmt ; DEALLOCATE PREPARE dispatch_schema_stmt ;
SET @ ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_dispatch_pallet_lock' AND column_name = 'expires_at' ), 'SELECT 1' , 'ALTER TABLE ll_dispatch_pallet_lock ADD COLUMN expires_at DATETIME(3) NULL COMMENT ''草稿锁失效时间,正式派车锁为空'' AFTER locked_at' ));
PREPARE dispatch_schema_stmt FROM @ ddl ; EXECUTE dispatch_schema_stmt ; DEALLOCATE PREPARE dispatch_schema_stmt ;
SET @ ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_dispatch_pallet_lock' AND column_name = 'dispatch_order_id' AND is_nullable = 'YES' ), 'SELECT 1' , 'ALTER TABLE ll_dispatch_pallet_lock MODIFY COLUMN dispatch_order_id BIGINT NULL COMMENT ''正式派车单ID,草稿锁阶段为空''' ));
PREPARE dispatch_schema_stmt FROM @ ddl ; EXECUTE dispatch_schema_stmt ; DEALLOCATE PREPARE dispatch_schema_stmt ;
2026-09-10 10:25:16 +08:00
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 COMMENT ''关联订单信息'' AFTER order_no' ));
2026-08-19 16:24:02 +08:00
PREPARE dispatch_schema_stmt FROM @ ddl ; EXECUTE dispatch_schema_stmt ; DEALLOCATE PREPARE dispatch_schema_stmt ;
CREATE TABLE IF NOT EXISTS ll_dispatch_pda_task (
id BIGINT NOT NULL COMMENT '主键ID' , customer_id VARCHAR ( 128 ) NOT NULL COMMENT '客户租户ID' , dispatch_order_id BIGINT NOT NULL COMMENT '派车单ID' ,
task_no VARCHAR ( 64 ) NOT NULL COMMENT 'PDA任务号' , status VARCHAR ( 32 ) NOT NULL COMMENT '业务状态' , operator_id VARCHAR ( 128 ) NULL COMMENT '操作人ID' ,
2026-09-01 14:24:59 +08:00
warehouse_id VARCHAR ( 128 ) NOT NULL COMMENT 'Token绑定的海外仓库ID' ,
2026-08-19 16:24:02 +08:00
operator_name VARCHAR ( 128 ) NULL COMMENT '操作人姓名' , pushed_at DATETIME ( 3 ) NOT NULL COMMENT '任务下发时间' , completed_at DATETIME ( 3 ) 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 ), UNIQUE KEY uk_ll_dispatch_pda_task_dispatch ( customer_id , dispatch_order_id ),
2026-09-01 14:24:59 +08:00
UNIQUE KEY uk_ll_dispatch_pda_task_no ( task_no )
2026-08-19 16:24:02 +08:00
) ENGINE = InnoDB COMMENT = '派车PDA拣货任务' ;
CREATE TABLE IF NOT EXISTS ll_dispatch_pda_pick (
id BIGINT NOT NULL COMMENT '主键ID' , customer_id VARCHAR ( 128 ) NOT NULL COMMENT '客户租户ID' , task_id BIGINT NOT NULL COMMENT 'PDA任务ID' ,
2026-10-08 15:55:47 +08:00
dispatch_item_id BIGINT NOT NULL COMMENT '派车明细ID' , inventory_position_id BIGINT NULL COMMENT '普通库存仓位记录ID' ,
return_carton_id BIGINT NULL COMMENT '独立退货库存箱ID,与普通仓位互斥' ,
2026-08-19 16:24:02 +08:00
packages BIGINT NOT NULL COMMENT '本次操作箱数' , product_quantity BIGINT NOT NULL DEFAULT 0 COMMENT '产品数量' , idempotency_key VARCHAR ( 255 ) NOT NULL COMMENT '业务幂等键' ,
picked_at DATETIME ( 3 ) NOT NULL COMMENT '拣货时间' , created_at DATETIME ( 3 ) NOT NULL DEFAULT CURRENT_TIMESTAMP ( 3 ) COMMENT '创建时间' ,
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 )
) ENGINE = InnoDB COMMENT = '派车PDA拣货记录' ;
CREATE TABLE IF NOT EXISTS ll_dispatch_pda_operation (
id BIGINT NOT NULL COMMENT '主键ID' , customer_id VARCHAR ( 128 ) NOT NULL COMMENT '客户租户ID' , task_id BIGINT NULL COMMENT 'PDA任务ID' ,
operation_type VARCHAR ( 32 ) NOT NULL COMMENT 'PDA操作类型' , idempotency_key VARCHAR ( 255 ) NOT NULL COMMENT '业务幂等键' , request_hash CHAR ( 64 ) NOT NULL COMMENT '请求内容哈希' ,
result_json LONGTEXT NULL COMMENT '处理结果JSON' , status VARCHAR ( 32 ) NOT NULL COMMENT 'PDA操作处理状态' ,
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_dispatch_pda_operation_key ( customer_id , idempotency_key )
) ENGINE = InnoDB COMMENT = '派车PDA操作幂等记录' ;
2026-10-03 16:06:54 +08:00
CREATE TABLE ll_return_stock_receipt (
id BIGINT NOT NULL COMMENT '退回入仓实收凭据ID' ,
customer_id VARCHAR ( 128 ) NOT NULL COMMENT '客户数据归属' ,
receipt_no VARCHAR ( 64 ) NOT NULL COMMENT '退回实收业务编号' ,
inventory_ledger_id BIGINT NOT NULL COMMENT '唯一实际退回入账流水' ,
exception_order_id BIGINT NOT NULL COMMENT '退回异常订单' ,
order_id BIGINT NOT NULL COMMENT '原尾程订单' ,
inbound_order_id BIGINT NOT NULL COMMENT '原入仓单' ,
source_outbound_no VARCHAR ( 64 ) NOT NULL COMMENT '原发运出库业务编号' ,
source_outbound_pallet_item_id BIGINT NOT NULL COMMENT '原出库托盘明细' ,
source_inventory_position_id BIGINT NOT NULL COMMENT '原拣货库存位置' ,
inventory_balance_id BIGINT NOT NULL COMMENT '实际退回库存余额' ,
inventory_position_id BIGINT NOT NULL COMMENT '实际退回库存位置' ,
received_packages BIGINT NOT NULL COMMENT '实际退回箱数,不增加原订单箱数' ,
received_at DATETIME ( 3 ) NOT NULL COMMENT '实际退回入账时间' ,
created_at DATETIME ( 3 ) NOT NULL COMMENT '凭据记录时间' ,
PRIMARY KEY ( id ),
UNIQUE KEY uk_return_stock_receipt_no ( customer_id , receipt_no ),
UNIQUE KEY uk_return_stock_receipt_ledger ( customer_id , inventory_ledger_id ),
KEY idx_return_stock_receipt_order ( customer_id , order_id ),
KEY idx_return_stock_receipt_position ( customer_id , inventory_balance_id , inventory_position_id ),
CONSTRAINT chk_return_stock_receipt_packages CHECK ( received_packages > 0 )
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '真实退回入仓及再次发运来源凭据' ;
2026-08-19 16:24:02 +08:00
CREATE TABLE IF NOT EXISTS ll_dispatch_pda_pick_order (
id BIGINT NOT NULL COMMENT '主键ID' , customer_id VARCHAR ( 128 ) NOT NULL COMMENT '客户租户ID' , pick_id BIGINT NOT NULL COMMENT 'PDA拣货记录ID' ,
2026-10-03 16:06:54 +08:00
receipt_id BIGINT NULL COMMENT '入仓实收记录ID' , order_id BIGINT NOT NULL COMMENT '订单ID' , packages BIGINT NOT NULL COMMENT '本次操作箱数' ,
2026-08-19 16:24:02 +08:00
product_quantity BIGINT NOT NULL DEFAULT 0 COMMENT '产品数量' , created_at DATETIME ( 3 ) NOT NULL DEFAULT CURRENT_TIMESTAMP ( 3 ) COMMENT '创建时间' ,
2026-10-03 16:06:54 +08:00
return_receipt_id BIGINT NULL COMMENT '明确选用的真实退回入仓来源' ,
2026-10-08 15:55:47 +08:00
return_carton_id BIGINT NULL COMMENT '原生退货箱来源ID,与实收来源互斥' ,
2026-10-03 16:06:54 +08:00
KEY idx_dispatch_pick_return_receipt ( customer_id , return_receipt_id ),
2026-10-08 15:55:47 +08:00
CONSTRAINT chk_dispatch_pick_receipt_source CHECK (( receipt_id IS NOT NULL ) + ( return_receipt_id IS NOT NULL ) + ( return_carton_id IS NOT NULL ) = 1 ),
2026-10-03 16:06:54 +08:00
2026-08-19 16:24:02 +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 )
) ENGINE = InnoDB COMMENT = 'PDA拣货订单归属记录' ;
-- Transfer a dispatch to delivery: one outbound header, many pallet rows, one delivery header.
CREATE TABLE IF NOT EXISTS ll_outbound_order (
id BIGINT NOT NULL COMMENT '主键ID' , customer_id VARCHAR ( 128 ) NOT NULL COMMENT '客户租户ID' ,
2026-08-25 19:58:08 +08:00
outbound_no VARCHAR ( 64 ) NOT NULL COMMENT '出库单号' , dispatch_order_id BIGINT NULL COMMENT '派车单ID,一件代发为空' , dispatch_no VARCHAR ( 64 ) NULL COMMENT '派车单号,一件代发为空' ,
2026-08-19 16:24:02 +08:00
overseas_warehouse_id VARCHAR ( 128 ) NULL COMMENT '海外仓ID' , status VARCHAR ( 32 ) NOT NULL DEFAULT 'WAIT_OUTBOUND' COMMENT '业务状态' ,
package_count INT NOT NULL DEFAULT 0 COMMENT '箱数' , pallet_count INT NOT NULL DEFAULT 0 COMMENT '托盘数' ,
2026-10-03 04:18:52 +08:00
gross_weight_kg DECIMAL ( 18 , 3 ) NULL COMMENT '毛重(千克),来源未确认时为空' , volume_weight_kg DECIMAL ( 18 , 3 ) NOT NULL DEFAULT 0 COMMENT '材积重(千克)' ,
2026-10-15 21:40:37 +08:00
volume_cbm DECIMAL ( 18 , 4 ) NULL COMMENT '体积(立方米),来源未确认时为空' ,
2026-08-19 16:24:02 +08:00
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 '更新时间' ,
2026-09-06 16:02:11 +08:00
outbound_type VARCHAR ( 32 ) NOT NULL DEFAULT 'DISPATCH_DELIVERY' COMMENT '出库类型:派送转出库、一件代发' , lx_codes VARCHAR ( 1000 ) NULL COMMENT '关联一件代发领星入库单代码汇总' ,
2026-08-25 19:58:08 +08:00
recipient_info VARCHAR ( 1000 ) NULL COMMENT '一件代发收件信息' ,
2026-10-03 04:18:52 +08:00
request_hash CHAR ( 64 ) NULL COMMENT '创建或转派送业务请求摘要,用于幂等内容校验' ,
fee_coverage_json JSON NULL COMMENT '本次发运引用的原费用版本、实际货物及明确服务覆盖确认快照' ,
2026-09-01 14:24:59 +08:00
PRIMARY KEY ( id ), UNIQUE KEY uk_ll_outbound_no ( outbound_no ),
2026-08-19 16:24:02 +08:00
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 )
) ENGINE = InnoDB COMMENT = '尾程出库单' ;
CREATE TABLE IF NOT EXISTS ll_outbound_pallet_item (
id BIGINT NOT NULL COMMENT '主键ID' , customer_id VARCHAR ( 128 ) NOT NULL COMMENT '客户租户ID' , outbound_order_id BIGINT NOT NULL COMMENT '出库单ID' ,
warehouse_pallet_id BIGINT NULL COMMENT '仓库实物托盘ID' , pallet_no 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 '目的仓名称快照' ,
2026-10-15 21:40:37 +08:00
package_count INT NOT NULL DEFAULT 0 COMMENT '箱数' , gross_weight_kg DECIMAL ( 18 , 3 ) NULL COMMENT '毛重(千克),来源未确认时为空' , volume_weight_kg DECIMAL ( 18 , 3 ) NOT NULL DEFAULT 0 COMMENT '材积重(千克)' , volume_cbm DECIMAL ( 18 , 4 ) NULL COMMENT '体积(立方米),来源未确认时为空' , picked_package_count INT NOT NULL DEFAULT 0 COMMENT '已拣箱数' , status VARCHAR ( 32 ) NOT NULL DEFAULT 'WAIT_PICK' COMMENT '拣货状态' , sku_code VARCHAR ( 128 ) NULL COMMENT '一件代发SKU' , return_sku_quantity BIGINT NULL COMMENT '退货单SKU本来源计划出库件数快照,NULL为历史整箱出库' , order_refs VARCHAR ( 2000 ) NULL COMMENT '关联订单信息' , inbound_code VARCHAR ( 128 ) NULL COMMENT '入仓单号快照' ,
2026-08-19 16:24:02 +08:00
created_at DATETIME ( 3 ) NOT NULL DEFAULT CURRENT_TIMESTAMP ( 3 ) COMMENT '创建时间' , PRIMARY KEY ( id ),
2026-09-14 20:55:09 +08:00
UNIQUE KEY uk_ll_outbound_pallet ( customer_id , outbound_order_id , warehouse_pallet_id , inbound_code , sku_code ),
2026-08-19 16:24:02 +08:00
KEY idx_ll_outbound_pallet_list ( customer_id , outbound_order_id ), KEY idx_ll_outbound_pallet_destination ( customer_id , destination_warehouse_code )
) ENGINE = InnoDB COMMENT = '出库托盘明细' ;
2026-08-25 19:58:08 +08:00
CREATE TABLE IF NOT EXISTS ll_outbound_pda_task (
id BIGINT NOT NULL COMMENT '主键ID' , customer_id VARCHAR ( 128 ) NOT NULL COMMENT '客户租户ID' , outbound_order_id BIGINT NOT NULL COMMENT '出库单ID' ,
task_no VARCHAR ( 64 ) NOT NULL COMMENT 'PDA任务号' , status VARCHAR ( 32 ) NOT NULL DEFAULT 'PENDING' COMMENT '任务状态:待拣货、拣货中、已完成' ,
2026-09-01 14:24:59 +08:00
completion_idempotency_key VARCHAR ( 255 ) NULL COMMENT '完成命令幂等键' ,
2026-08-25 19:58:08 +08:00
pushed_at DATETIME ( 3 ) NOT NULL DEFAULT CURRENT_TIMESTAMP ( 3 ) COMMENT '推送时间' , completed_at DATETIME ( 3 ) NULL COMMENT '完成时间' ,
2026-09-01 11:09:14 +08:00
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 '更新时间' ,
2026-09-01 14:24:59 +08:00
PRIMARY KEY ( id ), UNIQUE KEY uk_ll_outbound_pda_task_order ( customer_id , outbound_order_id ), UNIQUE KEY uk_ll_outbound_pda_task_no ( task_no ),
UNIQUE KEY uk_ll_outbound_pda_complete_key ( customer_id , completion_idempotency_key )
2026-08-25 19:58:08 +08:00
) ENGINE = InnoDB COMMENT = '一件代发出库PDA拣货任务' ;
2026-09-10 17:11:33 +08:00
SET @ ddl = ( SELECT IF ( EXISTS (
SELECT 1 FROM information_schema . columns
WHERE table_schema = DATABASE () AND table_name = 'll_outbound_pda_task' AND column_name = 'completion_idempotency_key'
), 'SELECT 1' ,
'ALTER TABLE ll_outbound_pda_task ADD COLUMN completion_idempotency_key VARCHAR(255) NULL COMMENT ''完成命令幂等键'' AFTER status' ));
PREPARE outbound_pda_completion_column_stmt FROM @ ddl ; EXECUTE outbound_pda_completion_column_stmt ; DEALLOCATE PREPARE outbound_pda_completion_column_stmt ;
SET @ index_ready = ( SELECT COUNT ( * ) = 2 AND MIN ( non_unique ) = 0
AND SUM ( seq_in_index = 1 AND column_name = 'customer_id' ) = 1
AND SUM ( seq_in_index = 2 AND column_name = 'completion_idempotency_key' ) = 1
FROM information_schema . statistics WHERE table_schema = DATABASE ()
AND table_name = 'll_outbound_pda_task' AND index_name = 'uk_ll_outbound_pda_complete_key' );
SET @ index_exists = ( SELECT COUNT ( * ) > 0 FROM information_schema . statistics WHERE table_schema = DATABASE ()
AND table_name = 'll_outbound_pda_task' AND index_name = 'uk_ll_outbound_pda_complete_key' );
SET @ ddl = IF ( @ index_ready , 'SELECT 1' , IF ( @ index_exists ,
'ALTER TABLE ll_outbound_pda_task DROP INDEX uk_ll_outbound_pda_complete_key, ADD UNIQUE KEY uk_ll_outbound_pda_complete_key(customer_id,completion_idempotency_key)' ,
'ALTER TABLE ll_outbound_pda_task ADD UNIQUE KEY uk_ll_outbound_pda_complete_key(customer_id,completion_idempotency_key)' ));
PREPARE outbound_pda_completion_index_stmt FROM @ ddl ; EXECUTE outbound_pda_completion_index_stmt ; DEALLOCATE PREPARE outbound_pda_completion_index_stmt ;
2026-08-25 19:58:08 +08:00
CREATE TABLE IF NOT EXISTS ll_outbound_pda_pick (
2026-09-01 11:09:14 +08:00
id BIGINT NOT NULL COMMENT '主键ID' , customer_id VARCHAR ( 128 ) NOT NULL COMMENT '客户数据隔离键' , task_id BIGINT NOT NULL COMMENT 'PDA任务ID' , outbound_pallet_item_id BIGINT NOT NULL COMMENT '出库托盘明细ID' ,
2026-09-20 19:57:47 +08:00
inventory_position_id BIGINT NULL COMMENT '库存仓位ID;退货箱直接出库时为空' , packages BIGINT NOT NULL COMMENT '拣货箱数' , idempotency_key VARCHAR ( 255 ) NOT NULL COMMENT '拣货幂等键' ,
2026-09-01 11:09:14 +08:00
picked_at DATETIME ( 3 ) NOT NULL DEFAULT CURRENT_TIMESTAMP ( 3 ) COMMENT '拣货时间' , PRIMARY KEY ( id ), UNIQUE KEY uk_ll_outbound_pda_pick_key ( customer_id , idempotency_key )
2026-08-25 19:58:08 +08:00
) ENGINE = InnoDB COMMENT = '一件代发出库PDA托盘拣货记录' ;
SET @ ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_outbound_order' AND column_name = 'outbound_type' ), 'SELECT 1' , 'ALTER TABLE ll_outbound_order ADD COLUMN outbound_type VARCHAR(32) NOT NULL DEFAULT ''DISPATCH_DELIVERY'' COMMENT ''出库类型'' AFTER status' ));
PREPARE outbound_upgrade_stmt FROM @ ddl ; EXECUTE outbound_upgrade_stmt ; DEALLOCATE PREPARE outbound_upgrade_stmt ;
2026-09-18 14:58:40 +08:00
SET @ ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_outbound_order' AND column_name = 'gross_weight_kg' ), 'SELECT 1' , 'ALTER TABLE ll_outbound_order ADD COLUMN gross_weight_kg DECIMAL(18,3) NOT NULL DEFAULT 0 COMMENT ''毛重(千克)'' AFTER pallet_count, ADD COLUMN volume_weight_kg DECIMAL(18,3) NOT NULL DEFAULT 0 COMMENT ''材积重(千克)'' AFTER gross_weight_kg, ADD COLUMN volume_cbm DECIMAL(18,4) NOT NULL DEFAULT 0 COMMENT ''体积(立方米)'' AFTER volume_weight_kg' )); PREPARE outbound_upgrade_stmt FROM @ ddl ; EXECUTE outbound_upgrade_stmt ; DEALLOCATE PREPARE outbound_upgrade_stmt ;
SET @ ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_outbound_pallet_item' AND column_name = 'gross_weight_kg' ), 'SELECT 1' , 'ALTER TABLE ll_outbound_pallet_item ADD COLUMN gross_weight_kg DECIMAL(18,3) NOT NULL DEFAULT 0 COMMENT ''毛重(千克)'' AFTER package_count, ADD COLUMN volume_weight_kg DECIMAL(18,3) NOT NULL DEFAULT 0 COMMENT ''材积重(千克)'' AFTER gross_weight_kg, ADD COLUMN volume_cbm DECIMAL(18,4) NOT NULL DEFAULT 0 COMMENT ''体积(立方米)'' AFTER volume_weight_kg' )); PREPARE outbound_upgrade_stmt FROM @ ddl ; EXECUTE outbound_upgrade_stmt ; DEALLOCATE PREPARE outbound_upgrade_stmt ;
2026-09-07 11:48:49 +08:00
SET @ ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_outbound_order' AND column_name = 'lx_codes' ), 'SELECT 1' , 'ALTER TABLE ll_outbound_order ADD COLUMN lx_codes VARCHAR(1000) NULL COMMENT ''关联一件代发领星入库单代码汇总'' AFTER outbound_type' ));
PREPARE outbound_upgrade_stmt FROM @ ddl ; EXECUTE outbound_upgrade_stmt ; DEALLOCATE PREPARE outbound_upgrade_stmt ;
2026-08-26 19:46:14 +08:00
SET @ ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_outbound_pallet_item' AND column_name = 'sku_code' ), 'SELECT 1' , 'ALTER TABLE ll_outbound_pallet_item ADD COLUMN sku_code VARCHAR(128) NULL COMMENT ''一件代发SKU''' ));
2026-08-25 19:58:08 +08:00
PREPARE outbound_upgrade_stmt FROM @ ddl ; EXECUTE outbound_upgrade_stmt ; DEALLOCATE PREPARE outbound_upgrade_stmt ;
2026-09-07 11:48:49 +08:00
SET @ ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_outbound_order' AND column_name = 'recipient_info' ), 'SELECT 1' , 'ALTER TABLE ll_outbound_order ADD COLUMN recipient_info VARCHAR(1000) NULL COMMENT ''一件代发收件信息'' AFTER lx_codes' ));
2026-08-25 19:58:08 +08:00
PREPARE outbound_upgrade_stmt FROM @ ddl ; EXECUTE outbound_upgrade_stmt ; DEALLOCATE PREPARE outbound_upgrade_stmt ;
SET @ ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_outbound_pallet_item' AND column_name = 'picked_package_count' ), 'SELECT 1' , 'ALTER TABLE ll_outbound_pallet_item ADD COLUMN picked_package_count INT NOT NULL DEFAULT 0 COMMENT ''已拣箱数'' AFTER package_count' ));
PREPARE outbound_upgrade_stmt FROM @ ddl ; EXECUTE outbound_upgrade_stmt ; DEALLOCATE PREPARE outbound_upgrade_stmt ;
SET @ ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_outbound_pallet_item' AND column_name = 'status' ), 'SELECT 1' , 'ALTER TABLE ll_outbound_pallet_item ADD COLUMN status VARCHAR(32) NOT NULL DEFAULT ''WAIT_PICK'' COMMENT ''拣货状态'' AFTER picked_package_count' ));
PREPARE outbound_upgrade_stmt FROM @ ddl ; EXECUTE outbound_upgrade_stmt ; DEALLOCATE PREPARE outbound_upgrade_stmt ;
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 ;
2026-08-19 16:24:02 +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 '主键ID' , customer_id VARCHAR ( 128 ) NOT NULL COMMENT '客户租户ID' ,
transfer_no VARCHAR ( 64 ) NOT NULL COMMENT '转仓单号' , inbound_order_id BIGINT NOT NULL COMMENT '入仓单ID' , inbound_code VARCHAR ( 128 ) NOT NULL COMMENT '入仓单号快照' ,
lastleg_order_id BIGINT NOT NULL COMMENT '尾程订单ID' , lastleg_order_no VARCHAR ( 32 ) NOT NULL COMMENT '尾程订单号' ,
2026-09-10 17:11:33 +08:00
operating_warehouse_id VARCHAR ( 128 ) NOT NULL COMMENT '入库中转仓ID' , fba_warehouse_code VARCHAR ( 128 ) NULL COMMENT '可选FBA目的仓编码' ,
2026-09-17 17:37:29 +08:00
destination_type VARCHAR ( 16 ) NULL COMMENT '目的类型:FBA或PRIVATE' , destination_warehouse_id VARCHAR ( 128 ) NULL COMMENT '目的仓ID快照' ,
destination_warehouse_code VARCHAR ( 128 ) NULL COMMENT '目的仓编码快照' , destination_warehouse_name VARCHAR ( 255 ) NULL COMMENT '目的仓名称快照' ,
private_destination_address VARCHAR ( 1000 ) NULL COMMENT '私人仓完整地址' , private_destination_postal_code VARCHAR ( 32 ) NULL COMMENT '私人仓邮编' , private_destination_contact_name VARCHAR ( 128 ) NULL COMMENT '私人仓联系人' ,
private_destination_contact_phone VARCHAR ( 64 ) NULL COMMENT '私人仓联系电话' ,
delivery_address VARCHAR ( 1000 ) NOT NULL COMMENT '提货地址或中转仓收货地址' , pickup_contact_name VARCHAR ( 128 ) NULL COMMENT '提货联系人' , pickup_contact_phone VARCHAR ( 64 ) NULL COMMENT '提货联系电话' , package_count INT NOT NULL COMMENT '箱数' , delivery_method VARCHAR ( 64 ) NOT NULL COMMENT '入仓方式' ,
2026-10-16 11:41:24 +08:00
estimated_arrival_at DATETIME ( 3 ) NULL COMMENT '预计入仓时间,库存转运不填写' , fba_shipment_no VARCHAR ( 128 ) NULL COMMENT '可选FBA货件编号' ,
2026-08-19 16:24:02 +08:00
tracking_no VARCHAR ( 255 ) NULL COMMENT '物流跟踪号' , fba_box_nos VARCHAR ( 2000 ) NULL COMMENT 'FBA箱号集合' , remark VARCHAR ( 1000 ) NULL COMMENT '备注' ,
need_relabel TINYINT NOT NULL DEFAULT 0 COMMENT '是否需要换标' , relabel_application_id BIGINT NULL COMMENT '换标申请单ID' , relabel_no VARCHAR ( 64 ) NULL COMMENT '换标申请单号' ,
2026-09-15 15:15:46 +08:00
status VARCHAR ( 32 ) NOT NULL DEFAULT 'PENDING_REVIEW' COMMENT '业务状态' ,
review_decision VARCHAR ( 32 ) NULL COMMENT '审核决定' , review_remark VARCHAR ( 1000 ) NULL COMMENT '审核备注或驳回原因' ,
reviewed_by VARCHAR ( 128 ) NULL COMMENT '审核人ID' , reviewed_at DATETIME ( 3 ) NULL COMMENT '审核时间' ,
idempotency_key VARCHAR ( 255 ) NOT NULL COMMENT '业务幂等键' ,
2026-08-19 16:24:02 +08:00
allocation_idempotency_key VARCHAR ( 255 ) NULL COMMENT '库存分配幂等键' ,
allocation_request_hash CHAR ( 64 ) NULL COMMENT '库存分配请求哈希' ,
outbound_idempotency_key VARCHAR ( 255 ) NULL COMMENT '出库幂等键' ,
outbound_request_hash CHAR ( 64 ) NULL COMMENT '出库请求哈希' ,
outbound_at DATETIME ( 3 ) NULL COMMENT '出库时间' ,
request_hash CHAR ( 64 ) 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_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 = '客户转仓单' ;
2026-10-16 11:41:24 +08:00
SET @ ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_warehouse_transfer_order' AND column_name = 'fba_warehouse_code' AND is_nullable = 'NO' ), 'ALTER TABLE ll_warehouse_transfer_order MODIFY COLUMN fba_warehouse_code VARCHAR(128) NULL COMMENT ''可选FBA目的仓编码'', MODIFY COLUMN fba_shipment_no VARCHAR(128) NULL COMMENT ''可选FBA货件编号'', MODIFY COLUMN delivery_address VARCHAR(1000) NOT NULL COMMENT ''提货地址或中转仓收货地址'', MODIFY COLUMN delivery_method VARCHAR(64) NOT NULL COMMENT ''入仓方式'', MODIFY COLUMN estimated_arrival_at DATETIME(3) NULL COMMENT ''预计入仓时间,库存转运不填写''' , 'SELECT 1' ));
2026-09-10 17:11:33 +08:00
PREPARE transfer_optional_fba_stmt FROM @ ddl ; EXECUTE transfer_optional_fba_stmt ; DEALLOCATE PREPARE transfer_optional_fba_stmt ;
2026-08-21 18:12:07 +08:00
-- 兼容已存在的旧版转仓单表:CREATE TABLE IF NOT EXISTS 不会补充新增字段。
SET @ ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_warehouse_transfer_order' AND column_name = 'allocation_idempotency_key' ), 'SELECT 1' , 'ALTER TABLE ll_warehouse_transfer_order ADD COLUMN allocation_idempotency_key VARCHAR(255) NULL COMMENT ''库存分配幂等键'' AFTER status' ));
PREPARE transfer_allocation_key_stmt FROM @ ddl ; EXECUTE transfer_allocation_key_stmt ; DEALLOCATE PREPARE transfer_allocation_key_stmt ;
SET @ ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_warehouse_transfer_order' AND column_name = 'allocation_request_hash' ), 'SELECT 1' , 'ALTER TABLE ll_warehouse_transfer_order ADD COLUMN allocation_request_hash CHAR(64) NULL COMMENT ''库存分配请求哈希'' AFTER allocation_idempotency_key' ));
PREPARE transfer_allocation_hash_stmt FROM @ ddl ; EXECUTE transfer_allocation_hash_stmt ; DEALLOCATE PREPARE transfer_allocation_hash_stmt ;
SET @ ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_warehouse_transfer_order' AND column_name = 'outbound_idempotency_key' ), 'SELECT 1' , 'ALTER TABLE ll_warehouse_transfer_order ADD COLUMN outbound_idempotency_key VARCHAR(255) NULL COMMENT ''出库幂等键'' AFTER allocation_request_hash' ));
PREPARE transfer_outbound_key_stmt FROM @ ddl ; EXECUTE transfer_outbound_key_stmt ; DEALLOCATE PREPARE transfer_outbound_key_stmt ;
SET @ ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_warehouse_transfer_order' AND column_name = 'outbound_request_hash' ), 'SELECT 1' , 'ALTER TABLE ll_warehouse_transfer_order ADD COLUMN outbound_request_hash CHAR(64) NULL COMMENT ''出库请求哈希'' AFTER outbound_idempotency_key' ));
PREPARE transfer_outbound_hash_stmt FROM @ ddl ; EXECUTE transfer_outbound_hash_stmt ; DEALLOCATE PREPARE transfer_outbound_hash_stmt ;
SET @ ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_warehouse_transfer_order' AND column_name = 'outbound_at' ), 'SELECT 1' , 'ALTER TABLE ll_warehouse_transfer_order ADD COLUMN outbound_at DATETIME(3) NULL COMMENT ''出库时间'' AFTER outbound_request_hash' ));
PREPARE transfer_outbound_at_stmt FROM @ ddl ; EXECUTE transfer_outbound_at_stmt ; DEALLOCATE PREPARE transfer_outbound_at_stmt ;
2026-09-14 09:58:30 +08:00
SET @ ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_warehouse_transfer_order' AND column_name = 'estimated_ship_at' ), 'SELECT 1' , 'ALTER TABLE ll_warehouse_transfer_order ADD COLUMN estimated_ship_at DATETIME(3) NULL COMMENT ''预计发货时间'' AFTER estimated_arrival_at' ));
PREPARE transfer_estimated_ship_stmt FROM @ ddl ; EXECUTE transfer_estimated_ship_stmt ; DEALLOCATE PREPARE transfer_estimated_ship_stmt ;
2026-09-17 17:37:29 +08:00
SET @ ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_warehouse_transfer_order' AND column_name = 'pickup_contact_name' ), 'SELECT 1' , 'ALTER TABLE ll_warehouse_transfer_order ADD COLUMN pickup_contact_name VARCHAR(128) NULL COMMENT ''提货联系人'' AFTER delivery_address' ));
PREPARE transfer_pickup_contact_name_stmt FROM @ ddl ; EXECUTE transfer_pickup_contact_name_stmt ; DEALLOCATE PREPARE transfer_pickup_contact_name_stmt ;
SET @ ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_warehouse_transfer_order' AND column_name = 'pickup_contact_phone' ), 'SELECT 1' , 'ALTER TABLE ll_warehouse_transfer_order ADD COLUMN pickup_contact_phone VARCHAR(64) NULL COMMENT ''提货联系电话'' AFTER pickup_contact_name' ));
PREPARE transfer_pickup_contact_phone_stmt FROM @ ddl ; EXECUTE transfer_pickup_contact_phone_stmt ; DEALLOCATE PREPARE transfer_pickup_contact_phone_stmt ;
2026-09-14 09:58:30 +08:00
SET @ ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_warehouse_transfer_order' AND column_name = 'label_deadline' ), 'SELECT 1' , 'ALTER TABLE ll_warehouse_transfer_order ADD COLUMN label_deadline DATETIME(3) NULL COMMENT ''换标截止时间'', ADD COLUMN relabel_contact_name VARCHAR(128) NULL COMMENT ''换标联系人'', ADD COLUMN relabel_contact_phone VARCHAR(64) NULL COMMENT ''换标联系电话'', ADD COLUMN relabel_charge_amount DECIMAL(20,2) NULL COMMENT ''换标费用CNY'', ADD COLUMN relabel_delivery_method VARCHAR(32) NULL COMMENT ''换标后派送方式''' ));
PREPARE transfer_relabel_config_stmt FROM @ ddl ; EXECUTE transfer_relabel_config_stmt ; DEALLOCATE PREPARE transfer_relabel_config_stmt ;
2026-09-14 15:03:04 +08:00
SET @ ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_warehouse_transfer_order' AND column_name = 'relabel_completed_at' ), 'SELECT 1' , 'ALTER TABLE ll_warehouse_transfer_order ADD COLUMN relabel_completed_at DATETIME(3) NULL COMMENT ''关联贴标完成时间'' AFTER relabel_no' ));
PREPARE transfer_relabel_completed_stmt FROM @ ddl ; EXECUTE transfer_relabel_completed_stmt ; DEALLOCATE PREPARE transfer_relabel_completed_stmt ;
2026-09-14 09:58:30 +08:00
SET @ ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_warehouse_transfer_order' AND column_name = 'palletize_idempotency_key' ), 'SELECT 1' , 'ALTER TABLE ll_warehouse_transfer_order ADD COLUMN palletize_idempotency_key VARCHAR(255) NULL COMMENT ''PDA打托幂等键'', ADD COLUMN palletize_request_hash CHAR(64) NULL COMMENT ''PDA打托请求哈希'', ADD COLUMN confirmation_idempotency_key VARCHAR(255) NULL COMMENT ''客户测量确认幂等键'', ADD COLUMN confirmation_request_hash CHAR(64) NULL COMMENT ''客户测量确认请求哈希'', ADD COLUMN customer_confirmed_at DATETIME(3) NULL COMMENT ''客户确认测量时间''' ));
PREPARE transfer_fulfillment_stmt FROM @ ddl ; EXECUTE transfer_fulfillment_stmt ; DEALLOCATE PREPARE transfer_fulfillment_stmt ;
2026-09-15 15:15:46 +08:00
SET @ ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_warehouse_transfer_order' AND column_name = 'review_decision' ), 'SELECT 1' , 'ALTER TABLE ll_warehouse_transfer_order ADD COLUMN review_decision VARCHAR(32) NULL COMMENT ''审核决定'' AFTER status, ADD COLUMN review_remark VARCHAR(1000) NULL COMMENT ''审核备注或驳回原因'' AFTER review_decision, ADD COLUMN reviewed_by VARCHAR(128) NULL COMMENT ''审核人ID'' AFTER review_remark, ADD COLUMN reviewed_at DATETIME(3) NULL COMMENT ''审核时间'' AFTER reviewed_by' ));
PREPARE transfer_review_fact_stmt FROM @ ddl ; EXECUTE transfer_review_fact_stmt ; DEALLOCATE PREPARE transfer_review_fact_stmt ;
2026-09-17 17:37:29 +08:00
SET @ ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_warehouse_transfer_order' AND column_name = 'destination_type' ), 'SELECT 1' , 'ALTER TABLE ll_warehouse_transfer_order ADD COLUMN destination_type VARCHAR(16) NULL COMMENT ''目的类型:FBA或PRIVATE'' AFTER fba_warehouse_code, ADD COLUMN destination_warehouse_id VARCHAR(128) NULL COMMENT ''目的仓ID快照'' AFTER destination_type, ADD COLUMN destination_warehouse_code VARCHAR(128) NULL COMMENT ''目的仓编码快照'' AFTER destination_warehouse_id, ADD COLUMN destination_warehouse_name VARCHAR(255) NULL COMMENT ''目的仓名称快照'' AFTER destination_warehouse_code, ADD COLUMN private_destination_address VARCHAR(1000) NULL COMMENT ''私人仓完整地址'' AFTER destination_warehouse_name, ADD COLUMN private_destination_postal_code VARCHAR(32) NULL COMMENT ''私人仓邮编'' AFTER private_destination_address, ADD COLUMN private_destination_contact_name VARCHAR(128) NULL COMMENT ''私人仓联系人'' AFTER private_destination_postal_code, ADD COLUMN private_destination_contact_phone VARCHAR(64) NULL COMMENT ''私人仓联系电话'' AFTER private_destination_contact_name, ADD COLUMN destination_binding_idempotency_key VARCHAR(255) NULL COMMENT ''目的地绑定幂等键'', ADD COLUMN destination_binding_request_hash CHAR(64) NULL COMMENT ''目的地绑定请求哈希''' ));
PREPARE transfer_destination_stmt FROM @ ddl ; EXECUTE transfer_destination_stmt ; DEALLOCATE PREPARE transfer_destination_stmt ;
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 = 'delivery_address' ), 'SELECT 1' , 'ALTER TABLE ll_inbound_plan_line ADD COLUMN delivery_address VARCHAR(1000) NULL COMMENT ''私人仓目的地址快照'', ADD COLUMN postal_code VARCHAR(32) NULL COMMENT ''私人仓邮编快照'', ADD COLUMN contact_name VARCHAR(128) NULL COMMENT ''私人仓联系人快照'', ADD COLUMN contact_phone VARCHAR(64) NULL COMMENT ''私人仓联系电话快照''' ));
PREPARE transfer_line_destination_stmt FROM @ ddl ; EXECUTE transfer_line_destination_stmt ; DEALLOCATE PREPARE transfer_line_destination_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 = 'destination_type' ), 'SELECT 1' , 'ALTER TABLE ll_inbound_plan_pallet ADD COLUMN destination_type VARCHAR(32) NULL COMMENT ''目的类型:FBA或PRIVATE'', ADD COLUMN delivery_address VARCHAR(1000) NULL COMMENT ''私人仓目的地址快照'', ADD COLUMN postal_code VARCHAR(32) NULL COMMENT ''私人仓邮编快照'', ADD COLUMN contact_name VARCHAR(128) NULL COMMENT ''私人仓联系人快照'', ADD COLUMN contact_phone VARCHAR(64) NULL COMMENT ''私人仓联系电话快照''' ));
PREPARE transfer_pallet_destination_stmt FROM @ ddl ; EXECUTE transfer_pallet_destination_stmt ; DEALLOCATE PREPARE transfer_pallet_destination_stmt ;
SET @ ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_warehouse_transfer_order' AND column_name = 'private_destination_postal_code' ), 'SELECT 1' , 'ALTER TABLE ll_warehouse_transfer_order ADD COLUMN private_destination_postal_code VARCHAR(32) NULL COMMENT ''私人仓邮编'' AFTER private_destination_address' ));
PREPARE transfer_postal_stmt FROM @ ddl ; EXECUTE transfer_postal_stmt ; DEALLOCATE PREPARE transfer_postal_stmt ;
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 = 'postal_code' ), 'SELECT 1' , 'ALTER TABLE ll_inbound_plan_line ADD COLUMN postal_code VARCHAR(32) NULL COMMENT ''私人仓邮编快照'' AFTER delivery_address' ));
PREPARE transfer_line_postal_stmt FROM @ ddl ; EXECUTE transfer_line_postal_stmt ; DEALLOCATE PREPARE transfer_line_postal_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 = 'postal_code' ), 'SELECT 1' , 'ALTER TABLE ll_inbound_plan_pallet ADD COLUMN postal_code VARCHAR(32) NULL COMMENT ''私人仓邮编快照'' AFTER delivery_address' ));
PREPARE transfer_pallet_postal_stmt FROM @ ddl ; EXECUTE transfer_pallet_postal_stmt ; DEALLOCATE PREPARE transfer_pallet_postal_stmt ;
SET @ ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_dispatch_item' AND column_name = 'postal_code' ), 'SELECT 1' , 'ALTER TABLE ll_dispatch_item ADD COLUMN postal_code VARCHAR(32) NULL COMMENT ''私人仓邮编快照'' AFTER delivery_address' ));
PREPARE dispatch_item_postal_stmt FROM @ ddl ; EXECUTE dispatch_item_postal_stmt ; DEALLOCATE PREPARE dispatch_item_postal_stmt ;
2026-08-21 18:12:07 +08:00
2026-08-19 16:24:02 +08:00
CREATE TABLE IF NOT EXISTS ll_warehouse_transfer_source_order (
id BIGINT NOT NULL COMMENT '主键ID' , transfer_order_id BIGINT NOT NULL COMMENT '转仓单ID' , customer_id VARCHAR ( 128 ) NOT NULL COMMENT '客户租户ID' ,
source_lastleg_order_id BIGINT NOT NULL COMMENT '来源尾程订单ID' , source_lastleg_order_no VARCHAR ( 32 ) NOT NULL COMMENT '来源尾程订单号' ,
inbound_order_id BIGINT NOT NULL COMMENT '入仓单ID' , inbound_code VARCHAR ( 128 ) NOT NULL COMMENT '入仓单号快照' ,
created_at DATETIME ( 3 ) NOT NULL DEFAULT CURRENT_TIMESTAMP ( 3 ) COMMENT '创建时间' , 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 = '转仓来源历史订单绑定' ;
CREATE TABLE IF NOT EXISTS ll_warehouse_transfer_item (
2026-10-15 21:05:34 +08:00
declared_quantity BIGINT NULL COMMENT 'SKU申报件数,非预计或实收箱数' ,
2026-08-19 16:24:02 +08:00
id BIGINT NOT NULL COMMENT '主键ID' , transfer_order_id BIGINT NOT NULL COMMENT '转仓单ID' , customer_id VARCHAR ( 128 ) NOT NULL COMMENT '客户租户ID' ,
sku_code VARCHAR ( 128 ) NOT NULL COMMENT 'SKU编码' , product_name_zh VARCHAR ( 255 ) NOT NULL COMMENT '产品中文名称' ,
package_count INT NOT NULL COMMENT '箱数' , shipping_mark VARCHAR ( 255 ) NULL COMMENT '运输唛头' ,
created_at DATETIME ( 3 ) NOT NULL DEFAULT CURRENT_TIMESTAMP ( 3 ) COMMENT '创建时间' , 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 = '转仓货物冻结明细' ;
2026-09-10 17:11:33 +08:00
CREATE TABLE IF NOT EXISTS ll_warehouse_transfer_carton (
2026-10-15 21:05:34 +08:00
length_cm DECIMAL ( 12 , 2 ) NULL COMMENT '箱子实测长度厘米' ,
width_cm DECIMAL ( 12 , 2 ) NULL COMMENT '箱子实测宽度厘米' ,
height_cm DECIMAL ( 12 , 2 ) NULL COMMENT '箱子实测高度厘米' ,
gross_weight_kg DECIMAL ( 12 , 2 ) NULL COMMENT '箱子实测重量千克' ,
counted_quantity BIGINT NULL COMMENT '箱内SKU实点件数' ,
count_idempotency_key VARCHAR ( 255 ) NULL COMMENT '箱内清点幂等键' ,
count_request_hash VARCHAR ( 64 ) NULL COMMENT '箱内清点请求摘要' ,
counted_by VARCHAR ( 128 ) NULL COMMENT '箱内清点操作人' ,
counted_at DATETIME ( 3 ) NULL COMMENT '箱内清点完成时间' ,
discrepancy_reason VARCHAR ( 1000 ) NULL COMMENT '实收与预报箱数差异原因' ,
transfer_pallet_id BIGINT NULL COMMENT '签收箱所属转运托盘事实ID' ,
sku_items_json JSON NULL COMMENT '实收箱内SKU及逐项件数明细' ,
2026-09-10 17:11:33 +08:00
id BIGINT NOT NULL COMMENT '预报箱主键' , transfer_order_id BIGINT NOT NULL COMMENT '转运单ID' ,
2026-10-16 16:53:32 +08:00
transfer_item_id BIGINT NULL COMMENT '实际箱内首项SKU明细ID,预报补箱可为空' , customer_id VARCHAR ( 128 ) NOT NULL COMMENT '客户租户ID' ,
2026-10-15 21:05:34 +08:00
customer_carton_mark VARCHAR ( 255 ) NULL COMMENT '客户原箱唛,用于换标现场绑定' ,
2026-09-10 17:11:33 +08:00
carton_mark VARCHAR ( 255 ) NOT NULL COMMENT '系统生成的一箱一码箱唛' , carton_index INT NOT NULL COMMENT '全单箱序号' ,
total_cartons INT NOT NULL COMMENT '首次生成时全单总箱数' , status VARCHAR ( 32 ) NOT NULL DEFAULT 'EXPECTED' COMMENT '箱状态:EXPECTED待实收' ,
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_wh_transfer_carton_mark ( customer_id , carton_mark ),
UNIQUE KEY uk_ll_wh_transfer_carton_index ( transfer_order_id , carton_index ),
KEY idx_ll_wh_transfer_carton_list ( customer_id , transfer_order_id , status )
) ENGINE = InnoDB COMMENT = '仓储转运系统箱唛预报' ;
2026-09-14 09:58:30 +08:00
SET @ ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_warehouse_transfer_carton' AND column_name = 'customer_carton_mark' ), 'SELECT 1' , 'ALTER TABLE ll_warehouse_transfer_carton ADD COLUMN customer_carton_mark VARCHAR(255) NULL COMMENT ''客户原箱唛,用于换标现场绑定'' AFTER carton_mark' ));
PREPARE transfer_customer_carton_stmt FROM @ ddl ; EXECUTE transfer_customer_carton_stmt ; DEALLOCATE PREPARE transfer_customer_carton_stmt ;
CREATE TABLE IF NOT EXISTS ll_warehouse_transfer_pallet (
id BIGINT NOT NULL COMMENT '打托事实ID' , transfer_order_id BIGINT NOT NULL COMMENT '转运单ID' ,
customer_id VARCHAR ( 128 ) NOT NULL COMMENT '客户租户ID' , sequence_no INT NOT NULL COMMENT '托序号' ,
2026-09-17 17:37:29 +08:00
warehouse_pallet_id BIGINT NULL COMMENT '生成后的海外仓真实托盘ID' , pallet_no VARCHAR ( 128 ) NULL COMMENT '生成后的真实托盘码' ,
warehouse_location_id BIGINT NULL COMMENT '生成后的真实库位ID' , warehouse_location_code VARCHAR ( 128 ) NULL COMMENT '真实库位码' ,
warehouse_resource_lock_id BIGINT NULL COMMENT '生成后的仓储资源锁ID' , carton_count INT NOT NULL COMMENT '本托实收箱数' ,
2026-09-14 09:58:30 +08:00
length_cm DECIMAL ( 12 , 2 ) NOT NULL COMMENT '实测长cm' , width_cm DECIMAL ( 12 , 2 ) NOT NULL COMMENT '实测宽cm' ,
height_cm DECIMAL ( 12 , 2 ) NOT NULL COMMENT '实测高cm' , gross_weight_kg DECIMAL ( 12 , 3 ) NOT NULL COMMENT '实测毛重kg' ,
2026-09-17 17:37:29 +08:00
volume_cbm DECIMAL ( 18 , 6 ) NOT NULL COMMENT '实测体积CBM' , status VARCHAR ( 32 ) NOT NULL COMMENT '逐托状态DRAFT/GENERATED/BOUND/COMPLETED' ,
draft_idempotency_key VARCHAR ( 255 ) NULL COMMENT '草稿保存幂等键' , draft_request_hash CHAR ( 64 ) NULL COMMENT '草稿请求摘要' ,
generate_idempotency_key VARCHAR ( 255 ) NULL COMMENT '新托盘生成幂等键' , bind_idempotency_key VARCHAR ( 255 ) NULL COMMENT '扫码绑定幂等键' ,
bound_at DATETIME ( 3 ) NULL COMMENT '扫码确认绑定时间' , completed_at DATETIME ( 3 ) NULL COMMENT '整单打托完成时间' , created_at DATETIME ( 3 ) NOT NULL DEFAULT CURRENT_TIMESTAMP ( 3 ) COMMENT '创建时间' ,
2026-09-14 09:58:30 +08:00
updated_at DATETIME ( 3 ) NOT NULL DEFAULT CURRENT_TIMESTAMP ( 3 ) ON UPDATE CURRENT_TIMESTAMP ( 3 ) COMMENT '更新时间' ,
PRIMARY KEY ( id ), UNIQUE KEY uk_ll_transfer_pallet_seq ( transfer_order_id , sequence_no ),
UNIQUE KEY uk_ll_transfer_pallet_physical ( customer_id , warehouse_pallet_id ),
KEY idx_ll_transfer_pallet_order ( customer_id , transfer_order_id , status )
) ENGINE = InnoDB COMMENT = '仓储转运PDA实测打托事实' ;
2026-09-17 17:37:29 +08:00
SET @ ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_warehouse_transfer_pallet' AND column_name = 'draft_idempotency_key' ), 'SELECT 1' , 'ALTER TABLE ll_warehouse_transfer_pallet MODIFY COLUMN warehouse_pallet_id BIGINT NULL COMMENT ''生成后的海外仓真实托盘ID'', MODIFY COLUMN pallet_no VARCHAR(128) NULL COMMENT ''生成后的真实托盘码'', MODIFY COLUMN warehouse_location_id BIGINT NULL COMMENT ''生成后的真实库位ID'', MODIFY COLUMN warehouse_resource_lock_id BIGINT NULL COMMENT ''生成后的仓储资源锁ID'', MODIFY COLUMN completed_at DATETIME(3) NULL COMMENT ''整单打托完成时间'', ADD COLUMN draft_idempotency_key VARCHAR(255) NULL COMMENT ''草稿保存幂等键'' AFTER status, ADD COLUMN draft_request_hash CHAR(64) NULL COMMENT ''草稿请求摘要'' AFTER draft_idempotency_key, ADD COLUMN generate_idempotency_key VARCHAR(255) NULL COMMENT ''新托盘生成幂等键'' AFTER draft_request_hash, ADD COLUMN bind_idempotency_key VARCHAR(255) NULL COMMENT ''扫码绑定幂等键'' AFTER generate_idempotency_key, ADD COLUMN bound_at DATETIME(3) NULL COMMENT ''扫码确认绑定时间'' AFTER bind_idempotency_key' ));
PREPARE transfer_pallet_lifecycle_stmt FROM @ ddl ; EXECUTE transfer_pallet_lifecycle_stmt ; DEALLOCATE PREPARE transfer_pallet_lifecycle_stmt ;
2026-09-14 09:58:30 +08:00
CREATE TABLE IF NOT EXISTS ll_warehouse_transfer_pallet_item (
id BIGINT NOT NULL COMMENT '主键ID' , transfer_order_id BIGINT NOT NULL COMMENT '转运单ID' ,
transfer_pallet_id BIGINT NOT NULL COMMENT '转运托盘事实ID' , transfer_item_id BIGINT NOT NULL COMMENT '转运申报明细ID' ,
customer_id VARCHAR ( 128 ) NOT NULL COMMENT '客户租户ID' , package_count INT NOT NULL COMMENT '本托该SKU实收箱数' ,
created_at DATETIME ( 3 ) NOT NULL DEFAULT CURRENT_TIMESTAMP ( 3 ) COMMENT '创建时间' , PRIMARY KEY ( id ),
UNIQUE KEY uk_ll_transfer_pallet_item ( transfer_pallet_id , transfer_item_id ),
KEY idx_ll_transfer_pallet_item_order ( customer_id , transfer_order_id )
) ENGINE = InnoDB COMMENT = '仓储转运每托SKU箱数回填' ;
2026-09-17 17:37:29 +08:00
CREATE TABLE IF NOT EXISTS ll_warehouse_transfer_measurement_photo (
id BIGINT NOT NULL COMMENT '测量照片引用ID' , transfer_order_id BIGINT NOT NULL COMMENT '仓储转运单ID' ,
customer_id VARCHAR ( 128 ) NOT NULL COMMENT '客户租户ID' , file_id BIGINT NOT NULL COMMENT '文件服务文件ID' ,
file_name VARCHAR ( 255 ) NULL COMMENT '文件名快照' , content_type VARCHAR ( 128 ) NULL COMMENT '文件媒体类型快照' ,
size_bytes BIGINT NOT NULL DEFAULT 0 COMMENT '文件字节数快照' , uploaded_by VARCHAR ( 128 ) NULL COMMENT 'PDA上传操作人' ,
uploaded_at DATETIME ( 3 ) NOT NULL COMMENT '上传时间' , submitted_at DATETIME ( 3 ) NULL COMMENT '随测量打托提交时间' , PRIMARY KEY ( id ),
UNIQUE KEY uk_ll_transfer_measurement_photo_file ( customer_id , transfer_order_id , file_id ),
KEY idx_ll_transfer_measurement_photo_order ( customer_id , transfer_order_id , uploaded_at )
) ENGINE = InnoDB COMMENT = '仓储转运PDA测量现场照片引用' ;
SET @ ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_warehouse_transfer_measurement_photo' AND column_name = 'submitted_at' ), 'SELECT 1' , 'ALTER TABLE ll_warehouse_transfer_measurement_photo ADD COLUMN submitted_at DATETIME(3) NULL COMMENT ''随测量打托提交时间'' AFTER uploaded_at' ));
PREPARE transfer_measurement_photo_submitted_stmt FROM @ ddl ; EXECUTE transfer_measurement_photo_submitted_stmt ; DEALLOCATE PREPARE transfer_measurement_photo_submitted_stmt ;
2026-09-14 09:58:30 +08:00
CREATE TABLE IF NOT EXISTS ll_warehouse_transfer_relabel_binding (
id BIGINT NOT NULL COMMENT '主键ID' , transfer_order_id BIGINT NOT NULL COMMENT '转运单ID' ,
customer_id VARCHAR ( 128 ) NOT NULL COMMENT '客户租户ID' , operation_type VARCHAR ( 32 ) NOT NULL COMMENT '换标类型' ,
customer_carton_mark VARCHAR ( 255 ) NOT NULL COMMENT '客户原箱唛' , original_sku VARCHAR ( 128 ) NOT NULL COMMENT '旧SKU' ,
new_sku VARCHAR ( 128 ) NULL COMMENT '新SKU' , quantity INT NOT NULL COMMENT '换标件数' ,
fba_carton_mark VARCHAR ( 255 ) NULL COMMENT '新FBA箱唛' , destination_warehouse_code VARCHAR ( 128 ) NULL COMMENT 'FBA目的仓' ,
2026-10-04 20:21:16 +08:00
remark VARCHAR ( 1000 ) NULL COMMENT '备注' ,
source_allocation_id BIGINT NULL COMMENT '已有库存转运的原始来源分配ID' ,
relabel_item_id BIGINT NULL COMMENT '本票关联换标明细ID' ,
created_at DATETIME ( 3 ) NOT NULL DEFAULT CURRENT_TIMESTAMP ( 3 ) COMMENT '创建时间' ,
2026-09-14 09:58:30 +08:00
PRIMARY KEY ( id ), UNIQUE KEY uk_ll_transfer_relabel_mark ( transfer_order_id , customer_carton_mark ),
KEY idx_ll_transfer_relabel_order ( customer_id , transfer_order_id )
) ENGINE = InnoDB COMMENT = '仓储转运换标预绑定明细' ;
2026-08-19 16:24:02 +08:00
CREATE TABLE IF NOT EXISTS ll_warehouse_transfer_inventory_allocation (
id BIGINT NOT NULL COMMENT '雪花主键' ,
transfer_order_id BIGINT NOT NULL COMMENT '转仓单ID' ,
customer_id VARCHAR ( 128 ) NOT NULL COMMENT '客户租户ID' ,
inventory_position_id BIGINT NOT NULL COMMENT '来源库存仓位记录ID' ,
inventory_balance_id BIGINT NOT NULL COMMENT '来源库存余额记录ID' ,
inbound_order_id BIGINT NOT NULL COMMENT '来源入仓单ID' ,
inbound_code VARCHAR ( 128 ) NOT NULL COMMENT '来源入仓单号快照' ,
pallet_id BIGINT NOT NULL COMMENT '来源托盘ID' ,
pallet_no VARCHAR ( 128 ) NOT NULL COMMENT '来源托盘号快照' ,
package_count INT NOT NULL COMMENT '分配箱数' ,
2026-10-04 20:21:16 +08:00
sku_code VARCHAR ( 128 ) NULL COMMENT '本次来源分配的实际SKU快照' ,
2026-08-19 16:24:02 +08:00
status VARCHAR ( 32 ) NOT NULL DEFAULT 'RESERVED' COMMENT '分配状态' ,
active_position_key VARCHAR ( 255 ) NULL COMMENT '生效中的仓位排他键' ,
allocated_at DATETIME ( 3 ) NOT NULL COMMENT '分配时间' ,
shipped_at DATETIME ( 3 ) NULL COMMENT '出库时间' ,
received_at DATETIME ( 3 ) 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-10-04 20:21:16 +08:00
KEY idx_ll_wh_transfer_allocation_position ( transfer_order_id , inventory_position_id ),
2026-08-19 16:24:02 +08:00
UNIQUE KEY uk_ll_wh_transfer_active_position ( customer_id , active_position_key ),
KEY idx_ll_wh_transfer_allocation_list ( customer_id , transfer_order_id , status )
) ENGINE = InnoDB COMMENT = '转仓单来源库存分配记录' ;
CREATE TABLE IF NOT EXISTS ll_warehouse_transfer_receipt (
id BIGINT NOT NULL COMMENT '雪花主键' ,
transfer_order_id BIGINT NOT NULL COMMENT '转仓单ID' ,
allocation_id BIGINT NOT NULL COMMENT '库存分配记录ID' ,
customer_id VARCHAR ( 128 ) NOT NULL COMMENT '客户租户ID' ,
source_inventory_position_id BIGINT NOT NULL COMMENT '来源库存仓位记录ID' ,
destination_inventory_balance_id BIGINT NOT NULL COMMENT '目标库存余额记录ID' ,
destination_inventory_position_id BIGINT NOT NULL COMMENT '目标库存仓位记录ID' ,
package_count INT NOT NULL COMMENT '收货箱数' ,
idempotency_key VARCHAR ( 255 ) NOT NULL COMMENT '收货幂等键' ,
request_hash CHAR ( 64 ) NOT NULL COMMENT '收货请求哈希' ,
inventory_operation_key VARCHAR ( 255 ) NOT NULL COMMENT '库存操作幂等键' ,
created_by VARCHAR ( 128 ) NULL COMMENT '创建人ID' ,
received_at DATETIME ( 3 ) NOT NULL COMMENT '收货时间' ,
created_at DATETIME ( 3 ) NOT NULL DEFAULT CURRENT_TIMESTAMP ( 3 ) COMMENT '创建时间' ,
PRIMARY KEY ( id ),
UNIQUE KEY uk_ll_wh_transfer_receipt_source ( transfer_order_id , source_inventory_position_id ),
UNIQUE KEY uk_ll_wh_transfer_receipt_key ( customer_id , idempotency_key ),
UNIQUE KEY uk_ll_wh_transfer_receipt_operation ( customer_id , inventory_operation_key ),
KEY idx_ll_wh_transfer_receipt_list ( customer_id , transfer_order_id , received_at )
) ENGINE = InnoDB COMMENT = '转仓来源仓位的目标库存收货记录' ;
2026-10-05 03:13:31 +08:00
CREATE TABLE IF NOT EXISTS ll_warehouse_transfer_receipt_command (
id BIGINT NOT NULL COMMENT '收货命令主键' ,
customer_id VARCHAR ( 128 ) NOT NULL COMMENT '客户标识' ,
transfer_order_id BIGINT NOT NULL COMMENT '转运单标识' ,
source_inventory_position_id BIGINT NOT NULL COMMENT '本次收货来源库存位置' ,
idempotency_key VARCHAR ( 255 ) NOT NULL COMMENT '原始收货幂等键' ,
request_hash CHAR ( 64 ) NOT NULL COMMENT '完整原始收货请求摘要' ,
request_json JSON NOT NULL COMMENT '完整原始收货请求快照' ,
target_warehouse_id BIGINT NOT NULL COMMENT '实际目标海外收货仓' ,
target_pallet_id BIGINT NOT NULL COMMENT '目标实物托盘' ,
target_location_id BIGINT NOT NULL COMMENT '目标实际库位' ,
target_hash CHAR ( 64 ) NOT NULL COMMENT '共享目标资源绑定摘要' ,
target_json JSON NOT NULL COMMENT '权威目标仓托盘库位及目的仓快照' ,
reservation_key VARCHAR ( 128 ) NOT NULL COMMENT '同转运同目标托盘共享资源占用键' ,
resource_lock_id BIGINT NULL COMMENT '已确认有效的海外资源锁标识' ,
status VARCHAR ( 32 ) NOT NULL COMMENT '命令状态PREPARED准备完成RESERVED资源占用COMPLETED收货完成' ,
created_at DATETIME ( 3 ) NOT NULL COMMENT '命令创建时间' ,
updated_at DATETIME ( 3 ) NOT NULL COMMENT '命令最后更新时间' ,
PRIMARY KEY ( id ),
UNIQUE KEY uk_ll_wh_receipt_cmd_source ( transfer_order_id , source_inventory_position_id ),
UNIQUE KEY uk_ll_wh_receipt_cmd_key ( customer_id , idempotency_key ),
KEY idx_ll_wh_receipt_cmd_target ( customer_id , transfer_order_id , target_pallet_id ),
CONSTRAINT ck_ll_wh_receipt_cmd_status CHECK ( status IN ( 'PREPARED' , 'RESERVED' , 'COMPLETED' ))
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '转运逐来源收货原请求与共享目标资源占用命令' ;
2026-08-19 16:24:02 +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 '主键ID' ,
customer_id VARCHAR ( 128 ) NOT NULL COMMENT '客户租户ID' ,
relabel_no VARCHAR ( 64 ) NOT NULL COMMENT '换标申请单号' ,
lastleg_order_id BIGINT NOT NULL COMMENT '尾程订单ID' ,
customer_order_no VARCHAR ( 128 ) NOT NULL COMMENT '客户订单号' ,
overseas_warehouse_id VARCHAR ( 128 ) NOT NULL COMMENT '海外仓ID' ,
label_deadline DATETIME ( 3 ) NOT NULL COMMENT '换标截止时间' ,
contact_name VARCHAR ( 128 ) NOT NULL COMMENT '联系人姓名' ,
contact_phone VARCHAR ( 64 ) NOT NULL COMMENT '联系人电话' ,
2026-10-15 21:05:34 +08:00
delivery_method VARCHAR ( 32 ) NULL COMMENT '派送方式:TRUCK平台卡车、EXPRESS快递、PICKUP自提、AMAZON_PICKUP亚马逊自提、CUSTOMER_PICKUP客户自提;仅平台卡车进入预排车' ,
2026-09-10 17:11:33 +08:00
print_shipping_label TINYINT ( 1 ) NOT NULL DEFAULT 0 COMMENT '是否需要打印面单' ,
shipping_label_file_id VARCHAR ( 128 ) NULL COMMENT '客户上传面单文件ID' ,
shipping_label_file_name VARCHAR ( 255 ) NULL COMMENT '客户上传面单文件名' ,
shipping_label_file_url VARCHAR ( 1000 ) NULL COMMENT '客户上传面单下载地址' ,
fulfillment_status VARCHAR ( 32 ) NOT NULL DEFAULT 'WAIT_RELABEL' COMMENT '换标后履约状态' ,
outbound_order_no VARCHAR ( 64 ) NULL COMMENT '自提或快递生成的换标出库单号' ,
customer_confirmation_key VARCHAR ( 255 ) NULL COMMENT '客户确认完成幂等键' ,
customer_confirmed_at DATETIME ( 3 ) NULL COMMENT '客户确认换标完成时间' ,
2026-08-19 16:24:02 +08:00
remark VARCHAR ( 1000 ) NULL COMMENT '备注' ,
status VARCHAR ( 32 ) NOT NULL DEFAULT 'PENDING_PROCESSING' COMMENT '业务状态' ,
item_count INT NOT NULL DEFAULT 0 COMMENT '明细数量' ,
total_package_count INT NOT NULL DEFAULT 0 COMMENT '总箱数' ,
notified_package_count INT NOT NULL DEFAULT 0 COMMENT '已通知箱数' ,
2026-09-05 22:26:25 +08:00
charge_amount DECIMAL ( 20 , 2 ) NOT NULL DEFAULT 0 COMMENT '换标费用CNY' ,
charge_currency CHAR ( 3 ) NOT NULL DEFAULT 'CNY' COMMENT '费用币种' ,
wallet_status VARCHAR ( 32 ) NOT NULL DEFAULT 'FREEZE_PENDING' COMMENT '资金状态' ,
wallet_error_code VARCHAR ( 64 ) NULL COMMENT '资金错误码' ,
wallet_error_message VARCHAR ( 500 ) NULL COMMENT '资金错误说明' ,
wallet_command_event_id VARCHAR ( 64 ) NULL COMMENT '当前资金指令事件ID' ,
2026-08-19 16:24:02 +08:00
idempotency_key VARCHAR ( 255 ) NOT NULL COMMENT '业务幂等键' ,
request_hash CHAR ( 64 ) 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_relabel_application_no ( customer_id , relabel_no ),
UNIQUE KEY uk_ll_relabel_application_idempotency ( customer_id , idempotency_key ),
2026-09-22 08:49:21 +08:00
KEY idx_ll_relabel_application_order ( lastleg_order_id ),
2026-08-19 16:24:02 +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 )
) ENGINE = InnoDB COMMENT = '客户换标申请单' ;
2026-09-09 12:02:12 +08:00
SET @ ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_relabel_application' AND column_name = 'total_file_id' ), 'SELECT 1' , 'ALTER TABLE ll_relabel_application ADD COLUMN total_file_id VARCHAR(128) NULL COMMENT ''总换标PDF文件ID'' AFTER remark' )); PREPARE stmt FROM @ ddl ; EXECUTE stmt ; DEALLOCATE PREPARE stmt ;
SET @ ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_relabel_application' AND column_name = 'total_file_name' ), 'SELECT 1' , 'ALTER TABLE ll_relabel_application ADD COLUMN total_file_name VARCHAR(255) NULL COMMENT ''总换标PDF文件名'' AFTER total_file_id' )); PREPARE stmt FROM @ ddl ; EXECUTE stmt ; DEALLOCATE PREPARE stmt ;
SET @ ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_relabel_application' AND column_name = 'total_file_url' ), 'SELECT 1' , 'ALTER TABLE ll_relabel_application ADD COLUMN total_file_url VARCHAR(1000) NULL COMMENT ''总换标PDF预览地址'' AFTER total_file_name' )); PREPARE stmt FROM @ ddl ; EXECUTE stmt ; DEALLOCATE PREPARE stmt ;
2026-10-15 21:05:34 +08:00
SET @ ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_relabel_application' AND column_name = 'delivery_method' ), 'SELECT 1' , 'ALTER TABLE ll_relabel_application ADD COLUMN delivery_method VARCHAR(32) NULL COMMENT ''派送方式:TRUCK平台卡车、EXPRESS快递、PICKUP自提、AMAZON_PICKUP亚马逊自提、CUSTOMER_PICKUP客户自提;仅平台卡车进入预排车'' AFTER contact_phone' )); PREPARE stmt FROM @ ddl ; EXECUTE stmt ; DEALLOCATE PREPARE stmt ;
2026-09-10 17:11:33 +08:00
SET @ ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_relabel_application' AND column_name = 'print_shipping_label' ), 'SELECT 1' , 'ALTER TABLE ll_relabel_application ADD COLUMN print_shipping_label TINYINT(1) NOT NULL DEFAULT 0 COMMENT ''是否需要打印面单'' AFTER delivery_method' )); PREPARE stmt FROM @ ddl ; EXECUTE stmt ; DEALLOCATE PREPARE stmt ;
SET @ ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_relabel_application' AND column_name = 'shipping_label_file_id' ), 'SELECT 1' , 'ALTER TABLE ll_relabel_application ADD COLUMN shipping_label_file_id VARCHAR(128) NULL COMMENT ''客户上传面单文件ID'' AFTER print_shipping_label' )); PREPARE stmt FROM @ ddl ; EXECUTE stmt ; DEALLOCATE PREPARE stmt ;
SET @ ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_relabel_application' AND column_name = 'shipping_label_file_name' ), 'SELECT 1' , 'ALTER TABLE ll_relabel_application ADD COLUMN shipping_label_file_name VARCHAR(255) NULL COMMENT ''客户上传面单文件名'' AFTER shipping_label_file_id' )); PREPARE stmt FROM @ ddl ; EXECUTE stmt ; DEALLOCATE PREPARE stmt ;
SET @ ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_relabel_application' AND column_name = 'shipping_label_file_url' ), 'SELECT 1' , 'ALTER TABLE ll_relabel_application ADD COLUMN shipping_label_file_url VARCHAR(1000) NULL COMMENT ''客户上传面单下载地址'' AFTER shipping_label_file_name' )); PREPARE stmt FROM @ ddl ; EXECUTE stmt ; DEALLOCATE PREPARE stmt ;
SET @ ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_relabel_application' AND column_name = 'fulfillment_status' ), 'SELECT 1' , 'ALTER TABLE ll_relabel_application ADD COLUMN fulfillment_status VARCHAR(32) NOT NULL DEFAULT ''WAIT_RELABEL'' COMMENT ''换标后履约状态'' AFTER shipping_label_file_url' )); PREPARE stmt FROM @ ddl ; EXECUTE stmt ; DEALLOCATE PREPARE stmt ;
SET @ ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_relabel_application' AND column_name = 'outbound_order_no' ), 'SELECT 1' , 'ALTER TABLE ll_relabel_application ADD COLUMN outbound_order_no VARCHAR(64) NULL COMMENT ''自提或快递生成的换标出库单号'' AFTER fulfillment_status' )); PREPARE stmt FROM @ ddl ; EXECUTE stmt ; DEALLOCATE PREPARE stmt ;
SET @ ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_relabel_application' AND column_name = 'customer_confirmation_key' ), 'SELECT 1' , 'ALTER TABLE ll_relabel_application ADD COLUMN customer_confirmation_key VARCHAR(255) NULL COMMENT ''客户确认完成幂等键'' AFTER fulfillment_status' )); PREPARE stmt FROM @ ddl ; EXECUTE stmt ; DEALLOCATE PREPARE stmt ;
SET @ ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_relabel_application' AND column_name = 'customer_confirmed_at' ), 'SELECT 1' , 'ALTER TABLE ll_relabel_application ADD COLUMN customer_confirmed_at DATETIME(3) NULL COMMENT ''客户确认换标完成时间'' AFTER customer_confirmation_key' )); PREPARE stmt FROM @ ddl ; EXECUTE stmt ; DEALLOCATE PREPARE stmt ;
2026-09-09 12:02:12 +08:00
2026-08-19 16:24:02 +08:00
CREATE TABLE IF NOT EXISTS ll_relabel_item (
2026-09-14 12:40:40 +08:00
return_carton_id BIGINT NULL COMMENT '退货换箱唛来源退货库存箱ID' ,
source_carton_mark VARCHAR ( 255 ) NULL COMMENT '退货换箱唛原箱唛快照' ,
new_carton_mark VARCHAR ( 255 ) NULL COMMENT '退货换箱唛新箱唛' ,
2026-08-19 16:24:02 +08:00
id BIGINT NOT NULL COMMENT '主键ID' ,
application_id BIGINT NOT NULL COMMENT '申请单ID' ,
customer_id VARCHAR ( 128 ) NOT NULL COMMENT '客户租户ID' ,
2026-09-06 16:02:11 +08:00
sku_code VARCHAR ( 128 ) NULL COMMENT 'SKU编码(选填)' ,
2026-08-19 16:24:02 +08:00
product_image_file_id VARCHAR ( 128 ) NULL COMMENT '产品图片文件ID' ,
product_image_file_name VARCHAR ( 255 ) NULL COMMENT '产品图片文件名' ,
product_image_url VARCHAR ( 1000 ) NULL COMMENT '产品图片地址' ,
product_name_zh VARCHAR ( 255 ) NOT NULL COMMENT '产品中文名称' ,
total_package_count INT NOT NULL COMMENT '总箱数' ,
notified_package_count INT NOT NULL COMMENT '已通知箱数' ,
2026-09-10 17:11:33 +08:00
shipment_no VARCHAR ( 128 ) NULL COMMENT '货件编号(无FBA去向时为空)' ,
2026-08-19 16:24:02 +08:00
tracking_code VARCHAR ( 255 ) NULL COMMENT '物流跟踪编码' ,
2026-09-20 19:57:47 +08:00
new_sku_code VARCHAR ( 128 ) NULL COMMENT '换标后SKU编码;批量SKU换标使用子明细JSON时为空' ,
2026-08-19 16:24:02 +08:00
label_requirement VARCHAR ( 1000 ) NULL COMMENT '换标要求' ,
2026-09-06 15:02:33 +08:00
remark VARCHAR ( 1000 ) NULL COMMENT '货物明细备注' ,
2026-08-19 16:24:02 +08:00
relabel_file_id VARCHAR ( 128 ) NULL COMMENT '换标文件ID' ,
relabel_file_name VARCHAR ( 255 ) NULL COMMENT '换标文件名' ,
relabel_file_url VARCHAR ( 1000 ) NULL COMMENT '换标文件地址' ,
2026-09-06 15:02:33 +08:00
carton_mark VARCHAR ( 255 ) NULL COMMENT '客户自有箱唛' ,
fba_carton_mark VARCHAR ( 255 ) NULL COMMENT '关联FBA箱唛' ,
2026-09-07 12:30:17 +08:00
destination_warehouse_id VARCHAR ( 128 ) NULL COMMENT '该箱目的海外仓ID' ,
2026-09-10 17:11:33 +08:00
destination_fba_warehouse_code VARCHAR ( 128 ) NULL COMMENT '可选FBA目的仓编码(与海外操作仓分离)' ,
2026-09-09 00:53:40 +08:00
operation_type VARCHAR ( 32 ) NOT NULL DEFAULT 'CARTON_LABEL' COMMENT '换标模式:箱唛、SKU或组合换标' ,
sku_relabel_items_json JSON NULL COMMENT '同箱SKU换标子明细快照(数量按件)' ,
2026-09-10 17:11:33 +08:00
source_inventory_balance_id BIGINT NULL COMMENT '原库存余额ID(预入仓换标任务可为空)' ,
source_inventory_position_id BIGINT NULL COMMENT '原库存库位ID(预入仓换标任务可为空)' ,
source_inbound_order_id BIGINT NULL COMMENT '原入仓单ID(预入仓换标任务可为空)' ,
2026-09-09 00:53:40 +08:00
source_inbound_order_no VARCHAR ( 128 ) NULL COMMENT '原入仓单号快照' ,
source_inbound_code VARCHAR ( 128 ) NULL COMMENT '原进仓编码快照' ,
2026-09-20 19:57:47 +08:00
source_warehouse_id VARCHAR ( 128 ) NULL COMMENT '原海外中转仓ID;预入仓批量SKU换标时为空' ,
2026-09-09 00:53:40 +08:00
source_warehouse_code VARCHAR ( 128 ) NULL COMMENT '原海外中转仓编码快照' ,
source_warehouse_name VARCHAR ( 255 ) NULL COMMENT '原海外中转仓名称快照' ,
2026-08-19 16:24:02 +08:00
created_at DATETIME ( 3 ) NOT NULL DEFAULT CURRENT_TIMESTAMP ( 3 ) COMMENT '创建时间' ,
PRIMARY KEY ( id ),
KEY idx_ll_relabel_item_application ( customer_id , application_id ),
2026-09-07 12:30:17 +08:00
KEY idx_ll_relabel_item_sku ( customer_id , sku_code ),
KEY idx_ll_relabel_item_destination ( customer_id , destination_warehouse_id , application_id )
2026-08-19 16:24:02 +08:00
) ENGINE = InnoDB COMMENT = '换标货物冻结明细' ;
2026-09-10 23:12:37 +08:00
SET @ ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_relabel_item' AND column_name = 'destination_fba_warehouse_code' ), 'SELECT 1' , 'ALTER TABLE ll_relabel_item ADD COLUMN destination_fba_warehouse_code VARCHAR(128) NULL COMMENT ''可选FBA目的仓编码(与海外操作仓分离)''' )); PREPARE stmt FROM @ ddl ; EXECUTE stmt ; DEALLOCATE PREPARE stmt ;
SET @ ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_relabel_item' AND column_name = 'source_inventory_balance_id' ), 'SELECT 1' , 'ALTER TABLE ll_relabel_item ADD COLUMN source_inventory_balance_id BIGINT NULL COMMENT ''原库存余额ID(预入仓换标任务可为空)''' )); PREPARE stmt FROM @ ddl ; EXECUTE stmt ; DEALLOCATE PREPARE stmt ;
SET @ ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_relabel_item' AND column_name = 'source_inventory_position_id' ), 'SELECT 1' , 'ALTER TABLE ll_relabel_item ADD COLUMN source_inventory_position_id BIGINT NULL COMMENT ''原库存库位ID(预入仓换标任务可为空)''' )); PREPARE stmt FROM @ ddl ; EXECUTE stmt ; DEALLOCATE PREPARE stmt ;
SET @ ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_relabel_item' AND column_name = 'source_inbound_order_id' ), 'SELECT 1' , 'ALTER TABLE ll_relabel_item ADD COLUMN source_inbound_order_id BIGINT NULL COMMENT ''原入仓单ID(预入仓换标任务可为空)''' )); PREPARE stmt FROM @ ddl ; EXECUTE stmt ; DEALLOCATE PREPARE stmt ;
2026-09-10 17:11:33 +08:00
SET @ ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_relabel_item' AND column_name IN ( 'shipment_no' , 'destination_fba_warehouse_code' , 'source_inventory_balance_id' , 'source_inventory_position_id' , 'source_inbound_order_id' ) AND is_nullable = 'NO' ), 'ALTER TABLE ll_relabel_item MODIFY COLUMN shipment_no VARCHAR(128) NULL COMMENT ''货件编号(无FBA去向时为空)'', MODIFY COLUMN destination_fba_warehouse_code VARCHAR(128) NULL COMMENT ''可选FBA目的仓编码(与海外操作仓分离)'', MODIFY COLUMN source_inventory_balance_id BIGINT NULL COMMENT ''原库存余额ID(预入仓换标任务可为空)'', MODIFY COLUMN source_inventory_position_id BIGINT NULL COMMENT ''原库存库位ID(预入仓换标任务可为空)'', MODIFY COLUMN source_inbound_order_id BIGINT NULL COMMENT ''原入仓单ID(预入仓换标任务可为空)''' , 'SELECT 1' ));
PREPARE relabel_pre_inbound_stmt FROM @ ddl ; EXECUTE relabel_pre_inbound_stmt ; DEALLOCATE PREPARE relabel_pre_inbound_stmt ;
2026-09-07 12:30:17 +08:00
SET @ ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_relabel_item' AND column_name = 'remark' ), 'SELECT 1' , 'ALTER TABLE ll_relabel_item ADD COLUMN remark VARCHAR(1000) NULL COMMENT ''货物明细备注'' AFTER label_requirement' )); PREPARE stmt FROM @ ddl ; EXECUTE stmt ; DEALLOCATE PREPARE stmt ;
SET @ ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_relabel_item' AND column_name = 'carton_mark' ), 'SELECT 1' , 'ALTER TABLE ll_relabel_item ADD COLUMN carton_mark VARCHAR(255) NULL COMMENT ''客户自有箱唛'' AFTER relabel_file_url' )); PREPARE stmt FROM @ ddl ; EXECUTE stmt ; DEALLOCATE PREPARE stmt ;
SET @ ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_relabel_item' AND column_name = 'fba_carton_mark' ), 'SELECT 1' , 'ALTER TABLE ll_relabel_item ADD COLUMN fba_carton_mark VARCHAR(255) NULL COMMENT ''关联FBA箱唛'' AFTER carton_mark' )); PREPARE stmt FROM @ ddl ; EXECUTE stmt ; DEALLOCATE PREPARE stmt ;
SET @ ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_relabel_item' AND column_name = 'destination_warehouse_id' ), 'SELECT 1' , 'ALTER TABLE ll_relabel_item ADD COLUMN destination_warehouse_id VARCHAR(128) NULL COMMENT ''该箱目的海外仓ID'' AFTER fba_carton_mark' )); PREPARE stmt FROM @ ddl ; EXECUTE stmt ; DEALLOCATE PREPARE stmt ;
SET @ ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . statistics WHERE table_schema = DATABASE () AND table_name = 'll_relabel_item' AND index_name = 'idx_ll_relabel_item_destination' ), 'SELECT 1' , 'ALTER TABLE ll_relabel_item ADD KEY idx_ll_relabel_item_destination (customer_id,destination_warehouse_id,application_id)' )); PREPARE stmt FROM @ ddl ; EXECUTE stmt ; DEALLOCATE PREPARE stmt ;
2026-08-19 16:24:02 +08:00
CREATE TABLE IF NOT EXISTS ll_relabel_status_history (
id BIGINT NOT NULL COMMENT '主键ID' ,
customer_id VARCHAR ( 128 ) NOT NULL COMMENT '客户租户ID' ,
application_id BIGINT NOT NULL COMMENT '申请单ID' ,
from_status VARCHAR ( 32 ) NULL COMMENT '变更前状态' ,
to_status VARCHAR ( 32 ) NOT NULL COMMENT '变更后状态' ,
operator_id VARCHAR ( 128 ) NULL COMMENT '操作人ID' ,
remark VARCHAR ( 1000 ) NULL COMMENT '备注' ,
created_at DATETIME ( 3 ) NOT NULL DEFAULT CURRENT_TIMESTAMP ( 3 ) COMMENT '创建时间' ,
PRIMARY KEY ( id ),
KEY idx_ll_relabel_status_history_application ( customer_id , application_id , created_at )
) ENGINE = InnoDB COMMENT = '换标状态变更历史' ;
2026-08-25 11:20:36 +08:00
CREATE TABLE IF NOT EXISTS ll_relabel_pda_task (
id BIGINT NOT NULL COMMENT '换标PDA任务ID' ,
application_id BIGINT NOT NULL COMMENT '换标申请单ID' ,
customer_id VARCHAR ( 128 ) NOT NULL COMMENT '客户数据隔离键' ,
relabel_no VARCHAR ( 64 ) NOT NULL COMMENT '换标申请单号快照' ,
overseas_warehouse_id BIGINT NOT NULL COMMENT 'PDA令牌冻结的海外实际作业仓ID' ,
status VARCHAR ( 32 ) NOT NULL COMMENT '任务状态:PROCESSING、WAIT_REVIEW或COMPLETED' ,
operator_key VARCHAR ( 128 ) NOT NULL COMMENT '认领操作账号标识' ,
operator_name VARCHAR ( 255 ) NOT NULL COMMENT '认领操作员名称快照' ,
reviewer_key VARCHAR ( 128 ) NULL COMMENT '复核账号标识' ,
reviewer_name VARCHAR ( 255 ) NULL COMMENT '复核员名称快照' ,
expected_packages INT NOT NULL COMMENT '申请单通知的应换标箱数' ,
relabelled_packages INT NOT NULL DEFAULT 0 COMMENT '已正常换标箱数' ,
skipped_packages INT NOT NULL DEFAULT 0 COMMENT '已说明原因跳过箱数' ,
exception_packages INT NOT NULL DEFAULT 0 COMMENT '已登记异常箱数' ,
completion_photo_file_ids JSON NULL COMMENT '换标完成现场照片文件ID列表' ,
completion_remark VARCHAR ( 1000 ) NULL COMMENT '完成提交备注' ,
review_decision VARCHAR ( 16 ) NULL COMMENT '最近复核结论:APPROVE或REWORK' ,
review_remark VARCHAR ( 1000 ) NULL COMMENT '最近复核备注' ,
claimed_at DATETIME ( 3 ) NOT NULL COMMENT '任务认领时间' ,
submitted_at DATETIME ( 3 ) NULL COMMENT '提交复核时间' ,
reviewed_at DATETIME ( 3 ) NULL COMMENT '最近复核时间' ,
version INT 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_relabel_pda_task_application ( customer_id , application_id ),
UNIQUE KEY uk_ll_relabel_pda_task_no ( relabel_no ),
KEY idx_ll_relabel_pda_task_warehouse ( overseas_warehouse_id , status , updated_at ),
KEY idx_ll_relabel_pda_task_operator ( operator_key , status , updated_at )
) ENGINE = InnoDB COMMENT = '海外PDA换标现场作业任务' ;
CREATE TABLE IF NOT EXISTS ll_relabel_pda_unit_fact (
id BIGINT NOT NULL COMMENT '逐件换标事实ID' ,
task_id BIGINT NOT NULL COMMENT '换标PDA任务ID' ,
application_id BIGINT NOT NULL COMMENT '换标申请单ID' ,
item_id BIGINT NOT NULL COMMENT '换标申请明细ID' ,
customer_id VARCHAR ( 128 ) NOT NULL COMMENT '客户数据隔离键' ,
old_label VARCHAR ( 255 ) NULL COMMENT '扫描的实物旧标签或箱标' ,
new_label VARCHAR ( 255 ) NULL COMMENT '扫描的换标后新标签' ,
result VARCHAR ( 32 ) NOT NULL COMMENT '逐件结果:RELABELLED、SKIPPED或EXCEPTION' ,
exception_code VARCHAR ( 32 ) NULL COMMENT '异常编码' ,
reason VARCHAR ( 1000 ) NULL COMMENT '跳过或异常原因' ,
2026-09-20 15:06:17 +08:00
quantity INT NOT NULL DEFAULT 1 COMMENT '本次事实处理件数,箱级作业固定为1' ,
2026-08-25 11:20:36 +08:00
operator_key VARCHAR ( 128 ) NOT NULL COMMENT '操作账号标识' ,
operator_name VARCHAR ( 255 ) NOT NULL COMMENT '操作员名称快照' ,
occurred_at DATETIME ( 3 ) NOT NULL COMMENT '逐件事实发生时间' ,
PRIMARY KEY ( id ),
UNIQUE KEY uk_ll_relabel_pda_old_label ( old_label ),
KEY idx_ll_relabel_pda_unit_task ( customer_id , task_id , occurred_at , id ),
KEY idx_ll_relabel_pda_unit_item ( customer_id , application_id , item_id )
) ENGINE = InnoDB COMMENT = '海外PDA逐件换标扫码与异常事实' ;
2026-09-20 15:06:17 +08:00
SET @ ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_relabel_pda_unit_fact' AND column_name = 'quantity' ), 'SELECT 1' , 'ALTER TABLE ll_relabel_pda_unit_fact ADD COLUMN quantity INT NOT NULL DEFAULT 1 COMMENT ''本次事实处理件数,箱级作业固定为1'' AFTER reason' ));
PREPARE ll_relabel_fact_quantity_stmt FROM @ ddl ; EXECUTE ll_relabel_fact_quantity_stmt ; DEALLOCATE PREPARE ll_relabel_fact_quantity_stmt ;
2026-08-25 11:20:36 +08:00
CREATE TABLE IF NOT EXISTS ll_relabel_pda_operation (
id BIGINT NOT NULL COMMENT '换标PDA幂等操作ID' ,
task_id BIGINT NOT NULL COMMENT '换标PDA任务ID' ,
customer_id VARCHAR ( 128 ) NOT NULL COMMENT '客户数据隔离键' ,
operator_key VARCHAR ( 128 ) NOT NULL COMMENT '请求操作账号标识' ,
action VARCHAR ( 32 ) NOT NULL COMMENT '幂等操作动作' ,
idempotency_key VARCHAR ( 255 ) NOT NULL COMMENT '设备生成的幂等键' ,
request_hash CHAR ( 64 ) NOT NULL COMMENT '请求内容哈希' ,
result_json LONGTEXT NOT NULL COMMENT '成功响应快照JSON' ,
created_at DATETIME ( 3 ) NOT NULL DEFAULT CURRENT_TIMESTAMP ( 3 ) COMMENT '创建时间' ,
PRIMARY KEY ( id ),
UNIQUE KEY uk_ll_relabel_pda_operation_key ( operator_key , idempotency_key ),
KEY idx_ll_relabel_pda_operation_task ( customer_id , task_id , created_at )
) ENGINE = InnoDB COMMENT = '海外PDA换标写操作幂等记录' ;
CREATE TABLE IF NOT EXISTS ll_relabel_pda_history (
id BIGINT NOT NULL COMMENT '换标PDA任务历史ID' ,
task_id BIGINT NOT NULL COMMENT '换标PDA任务ID' ,
application_id BIGINT NOT NULL COMMENT '换标申请单ID' ,
customer_id VARCHAR ( 128 ) NOT NULL COMMENT '客户数据隔离键' ,
action VARCHAR ( 32 ) NOT NULL COMMENT '现场动作类型' ,
from_status VARCHAR ( 32 ) NULL COMMENT '动作前任务状态' ,
to_status VARCHAR ( 32 ) NOT NULL COMMENT '动作后任务状态' ,
operator_key VARCHAR ( 128 ) NOT NULL COMMENT '操作账号标识' ,
operator_name VARCHAR ( 255 ) NOT NULL COMMENT '操作员名称快照' ,
detail_json LONGTEXT NULL COMMENT '动作详情JSON' ,
created_at DATETIME ( 3 ) NOT NULL DEFAULT CURRENT_TIMESTAMP ( 3 ) COMMENT '创建时间' ,
PRIMARY KEY ( id ),
KEY idx_ll_relabel_pda_history_task ( customer_id , task_id , created_at , id ),
KEY idx_ll_relabel_pda_history_application ( customer_id , application_id , created_at )
) ENGINE = InnoDB COMMENT = '海外PDA换标任务不可变操作历史' ;
2026-08-19 16:24:02 +08:00
CREATE TABLE IF NOT EXISTS ll_dropship_order_profile (
id BIGINT NOT NULL COMMENT '主键ID' , customer_id VARCHAR ( 128 ) NOT NULL COMMENT '客户租户ID' , order_id BIGINT NOT NULL COMMENT '订单ID' ,
warehouse_pallet_id BIGINT NULL COMMENT '仓库实物托盘ID' , pallet_no VARCHAR ( 128 ) NULL COMMENT '托盘号' ,
source_pallet_no VARCHAR ( 128 ) NOT NULL COMMENT '来源托盘号快照' ,
2026-09-10 22:43:11 +08:00
manifest_version INT NOT NULL COMMENT '整托清单版本' , manifest_package_count INT NOT NULL COMMENT '整托总箱数' ,
manifest_fragment_count INT NOT NULL COMMENT '整托客户分片总数' , manifest_hash CHAR ( 64 ) NOT NULL COMMENT '整托完整清单摘要' ,
2026-08-19 16:24:02 +08:00
inventory_position_id BIGINT NULL COMMENT '库存仓位记录ID' , status VARCHAR ( 32 ) NOT NULL DEFAULT 'PENDING_INBOUND' COMMENT '业务状态' ,
idempotency_key VARCHAR ( 255 ) NOT NULL COMMENT '业务幂等键' , version BIGINT 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_dropship_profile_order_pallet ( customer_id , order_id , source_pallet_no ),
2026-09-10 22:43:11 +08:00
UNIQUE KEY uk_ll_dropship_profile_key ( customer_id , idempotency_key ), KEY idx_ll_dropship_profile_order ( customer_id , order_id ),
KEY idx_ll_dropship_profile_manifest ( source_pallet_no , manifest_hash )
2026-08-19 16:24:02 +08:00
) ENGINE = InnoDB COMMENT = '一件代发托盘档案' ;
CREATE TABLE IF NOT EXISTS ll_dropship_carton (
id BIGINT NOT NULL COMMENT '主键ID' , customer_id VARCHAR ( 128 ) NOT NULL COMMENT '客户租户ID' , order_id BIGINT NOT NULL COMMENT '订单ID' , profile_id BIGINT NOT NULL COMMENT '托盘档案ID' ,
warehouse_pallet_id BIGINT NULL COMMENT '仓库实物托盘ID' , pallet_no VARCHAR ( 128 ) NULL COMMENT '托盘号' , sku_code VARCHAR ( 128 ) NOT NULL COMMENT 'SKU编码' , carton_mark VARCHAR ( 128 ) NOT NULL COMMENT '箱唛' ,
2026-09-14 20:55:09 +08:00
product_quantity BIGINT NOT NULL COMMENT '该箱实收商品件数' ,
2026-08-19 16:24:02 +08:00
carton_sequence INT NOT NULL COMMENT '箱唛序号' , status VARCHAR ( 32 ) NOT NULL DEFAULT 'PENDING_INBOUND' COMMENT '业务状态' , outbound_order_no VARCHAR ( 128 ) NULL COMMENT '出库单号' ,
version BIGINT 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_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 = '一件代发箱唛明细' ;
2026-09-16 20:49:35 +08:00
CREATE TABLE IF NOT EXISTS ll_dropship_carton_sku (
id BIGINT NOT NULL COMMENT '主键ID' , customer_id VARCHAR ( 128 ) NOT NULL COMMENT '客户数据隔离键' , order_id BIGINT NOT NULL COMMENT '尾程订单ID' ,
profile_id BIGINT NOT NULL COMMENT '一件代发托盘档案ID' , carton_id BIGINT NOT NULL COMMENT '一件代发物理箱ID' ,
sku_code VARCHAR ( 128 ) NOT NULL COMMENT '箱内SKU编码' , product_name VARCHAR ( 255 ) NULL COMMENT '产品名称快照' ,
product_quantity BIGINT NOT NULL COMMENT '该物理箱内此SKU实收件数' ,
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_dropship_carton_sku ( carton_id , sku_code ),
KEY idx_ll_dropship_carton_sku_order ( customer_id , order_id , sku_code ),
KEY idx_ll_dropship_carton_sku_profile ( customer_id , profile_id , sku_code )
) ENGINE = InnoDB COMMENT = '一件代发物理箱内SKU明细' ;
2026-08-19 16:24:02 +08:00
CREATE TABLE IF NOT EXISTS ll_dropship_sku_inventory (
id BIGINT NOT NULL COMMENT '主键ID' , customer_id VARCHAR ( 128 ) NOT NULL COMMENT '客户租户ID' , order_id BIGINT NOT NULL COMMENT '订单ID' , profile_id BIGINT NOT NULL COMMENT '托盘档案ID' ,
sku_code VARCHAR ( 128 ) NOT NULL COMMENT 'SKU编码' , product_name VARCHAR ( 255 ) NULL COMMENT '产品名称' , package_count BIGINT NOT NULL COMMENT '箱数' , product_quantity BIGINT 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 ), 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 = '一件代发SKU库存汇总' ;
CREATE TABLE IF NOT EXISTS ll_dropship_carton_ledger (
id BIGINT NOT NULL COMMENT '主键ID' , customer_id VARCHAR ( 128 ) NOT NULL COMMENT '客户租户ID' , order_id BIGINT NOT NULL COMMENT '订单ID' , carton_id BIGINT NOT NULL COMMENT '箱唛记录ID' ,
carton_mark VARCHAR ( 128 ) NOT NULL COMMENT '箱唛' , sku_code VARCHAR ( 128 ) NOT NULL COMMENT 'SKU编码' , operation_type VARCHAR ( 32 ) NOT NULL COMMENT '操作类型' ,
before_packages BIGINT NOT NULL COMMENT '变动前箱数' , delta_packages BIGINT NOT NULL COMMENT '箱数变动量' , after_packages BIGINT NOT NULL COMMENT '变动后箱数' ,
business_order_no VARCHAR ( 128 ) NULL COMMENT '业务单号' , idempotency_key VARCHAR ( 255 ) NOT NULL COMMENT '业务幂等键' , remark VARCHAR ( 1000 ) NULL COMMENT '备注' ,
occurred_at DATETIME ( 3 ) NOT NULL COMMENT '业务发生时间' , created_at DATETIME ( 3 ) NOT NULL DEFAULT CURRENT_TIMESTAMP ( 3 ) COMMENT '创建时间' , 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 = '一件代发箱唛库存流水' ;
CREATE TABLE IF NOT EXISTS ll_cargo_discard_application (
id BIGINT NOT NULL COMMENT '主键ID' , customer_id VARCHAR ( 128 ) NOT NULL COMMENT '客户租户ID' ,
2026-10-08 15:55:47 +08:00
customer_confirmed_at DATETIME ( 3 ) NULL COMMENT '客户确认完成时间' ,
2026-08-19 16:24:02 +08:00
discard_no VARCHAR ( 64 ) NOT NULL COMMENT '废弃申请单号' , overseas_warehouse_id VARCHAR ( 128 ) NOT NULL COMMENT '海外仓ID' ,
overseas_warehouse_name VARCHAR ( 255 ) NULL COMMENT '海外仓名称快照' , inbound_codes VARCHAR ( 2000 ) NOT NULL COMMENT '入仓单号集合' ,
total_packages INT NOT NULL COMMENT '总箱数' , fee_per_package DECIMAL ( 18 , 2 ) NOT NULL COMMENT '每箱处理费用' ,
total_fee DECIMAL ( 18 , 2 ) NOT NULL COMMENT '费用合计' , currency CHAR ( 3 ) NOT NULL DEFAULT 'USD' COMMENT '币种' ,
status VARCHAR ( 32 ) NOT NULL DEFAULT 'PENDING_REVIEW' COMMENT '业务状态' , remark VARCHAR ( 1000 ) NULL COMMENT '备注' ,
idempotency_key VARCHAR ( 255 ) NOT NULL COMMENT '业务幂等键' , request_hash CHAR ( 64 ) NOT NULL COMMENT '请求内容哈希' ,
created_by VARCHAR ( 128 ) NULL COMMENT '创建人ID' , reviewed_by VARCHAR ( 128 ) NULL COMMENT '审核人ID' , review_remark VARCHAR ( 1000 ) NULL COMMENT '审核备注' ,
2026-08-25 10:31:04 +08:00
review_idempotency_key VARCHAR ( 255 ) NULL COMMENT '审核幂等键' , review_request_hash CHAR ( 64 ) NULL COMMENT '审核请求内容哈希' ,
2026-08-19 16:24:02 +08:00
reviewed_at DATETIME ( 3 ) 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 ), 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 = '货物废弃申请单' ;
CREATE TABLE IF NOT EXISTS ll_cargo_discard_item (
id BIGINT NOT NULL COMMENT '主键ID' , application_id BIGINT NOT NULL COMMENT '申请单ID' , customer_id VARCHAR ( 128 ) NOT NULL COMMENT '客户租户ID' ,
2026-10-14 18:01:25 +08:00
order_id BIGINT NULL COMMENT '一件代发订单ID' , source_type VARCHAR ( 32 ) NOT NULL DEFAULT 'DROPSHIP' COMMENT '库存来源:一件代发DROPSHIP、退货箱RETURN_CARTON、通用库存INVENTORY' ,
2026-09-28 11:59:08 +08:00
return_carton_id BIGINT NULL COMMENT '退货库存箱ID' , inbound_code VARCHAR ( 128 ) NOT NULL COMMENT '入仓单号快照' , profile_id BIGINT NULL COMMENT '托盘档案ID' ,
sku_inventory_id BIGINT NULL COMMENT 'SKU库存记录ID' , sku_code VARCHAR ( 128 ) NOT NULL COMMENT 'SKU编码' , product_name VARCHAR ( 255 ) NULL COMMENT '产品名称' ,
2026-09-14 16:49:00 +08:00
available_packages_snapshot INT NOT NULL COMMENT '可用箱数快照' , discard_packages INT NOT NULL COMMENT '申请废弃箱数' ,
2026-10-14 18:01:25 +08:00
inventory_position_id BIGINT NULL COMMENT '废弃来源库存仓位ID' ,
carton_marks_json TEXT NULL COMMENT '本次废弃所选真实箱唛快照JSON数组' ,
carton_scan_required TINYINT ( 1 ) NOT NULL DEFAULT 0 COMMENT '是否需要逐箱核对本次所选箱子' ,
2026-10-08 15:55:47 +08:00
completion_photo_file_ids TEXT NULL COMMENT 'PDA完工照片文件ID JSON数组' ,
2026-09-15 11:45:40 +08:00
actual_discard_packages INT NULL COMMENT 'PDA确认实际废弃箱数' , pda_status VARCHAR ( 32 ) NOT NULL DEFAULT 'PENDING' COMMENT 'PDA处理状态:待处理PENDING、已完成COMPLETED' ,
2026-09-14 16:49:00 +08:00
pda_operator_id VARCHAR ( 128 ) NULL COMMENT 'PDA操作人' , pda_completed_at DATETIME ( 3 ) NULL COMMENT 'PDA完成时间' ,
2026-08-19 16:24:02 +08:00
created_at DATETIME ( 3 ) NOT NULL DEFAULT CURRENT_TIMESTAMP ( 3 ) COMMENT '创建时间' , PRIMARY KEY ( id ),
UNIQUE KEY uk_ll_cargo_discard_item ( application_id , profile_id , sku_code ),
2026-10-14 18:01:25 +08:00
UNIQUE KEY uk_ll_discard_position_sku ( application_id , inventory_position_id , sku_code ),
2026-08-19 16:24:02 +08:00
KEY idx_ll_cargo_discard_item_list ( customer_id , application_id ),
KEY idx_ll_cargo_discard_item_inbound ( customer_id , inbound_code , sku_code )
2026-10-15 21:05:34 +08:00
,
KEY idx_ll_cargo_discard_return_carton ( customer_id , return_carton_id )
2026-08-19 16:24:02 +08:00
) ENGINE = InnoDB COMMENT = '货物废弃SKU明细' ;
CREATE TABLE IF NOT EXISTS ll_cargo_discard_carton (
id BIGINT NOT NULL COMMENT '主键ID' , application_id BIGINT NOT NULL COMMENT '申请单ID' , item_id BIGINT NOT NULL COMMENT '明细ID' ,
customer_id VARCHAR ( 128 ) NOT NULL COMMENT '客户租户ID' , carton_id BIGINT NOT NULL COMMENT '箱唛记录ID' , carton_mark VARCHAR ( 128 ) NOT NULL COMMENT '箱唛' ,
2026-10-14 18:01:25 +08:00
source_type VARCHAR ( 32 ) NOT NULL DEFAULT 'DROPSHIP' COMMENT '箱子来源:一件代发DROPSHIP、入仓箱INBOUND、转运箱TRANSFER' ,
2026-08-19 16:24:02 +08:00
created_at DATETIME ( 3 ) NOT NULL DEFAULT CURRENT_TIMESTAMP ( 3 ) COMMENT '创建时间' , 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 = '货物废弃锁定箱明细' ;
CREATE TABLE IF NOT EXISTS ll_cargo_discard_status_history (
id BIGINT NOT NULL COMMENT '主键ID' , application_id BIGINT NOT NULL COMMENT '申请单ID' , customer_id VARCHAR ( 128 ) NOT NULL COMMENT '客户租户ID' ,
from_status VARCHAR ( 32 ) NULL COMMENT '变更前状态' , to_status VARCHAR ( 32 ) NOT NULL COMMENT '变更后状态' , operator_id VARCHAR ( 128 ) NULL COMMENT '操作人ID' ,
remark VARCHAR ( 1000 ) NULL COMMENT '备注' , created_at DATETIME ( 3 ) NOT NULL DEFAULT CURRENT_TIMESTAMP ( 3 ) COMMENT '创建时间' , PRIMARY KEY ( id ),
KEY idx_ll_cargo_discard_history ( customer_id , application_id , created_at )
) ENGINE = InnoDB COMMENT = '货物废弃审批历史' ;
CREATE TABLE IF NOT EXISTS ll_overseas_procurement_order (
id BIGINT NOT NULL COMMENT '主键ID' , customer_id VARCHAR ( 128 ) NOT NULL COMMENT '客户租户ID' ,
customer_name VARCHAR ( 255 ) NULL COMMENT '客户名称快照' , order_no VARCHAR ( 64 ) NOT NULL COMMENT '订单号' ,
purchase_category VARCHAR ( 128 ) NOT NULL COMMENT '采购品类' , product_name VARCHAR ( 255 ) NOT NULL COMMENT '产品名称' ,
product_specification VARCHAR ( 500 ) NULL COMMENT '产品规格' , product_url VARCHAR ( 2000 ) NULL COMMENT '产品链接' ,
purchase_quantity BIGINT NOT NULL COMMENT '采购数量' , budget_unit_price DECIMAL ( 18 , 2 ) NULL COMMENT '预算单价' ,
currency CHAR ( 3 ) NOT NULL DEFAULT 'USD' COMMENT '币种' , receiving_address VARCHAR ( 1000 ) NULL COMMENT '收货地址' ,
contact_name VARCHAR ( 128 ) NOT NULL COMMENT '联系人姓名' , contact_phone VARCHAR ( 64 ) NOT NULL COMMENT '联系人电话' ,
2026-10-10 02:19:38 +08:00
purchase_warehouse_id VARCHAR ( 128 ) NULL COMMENT '采购入仓仓库ID' , purchase_warehouse_name VARCHAR ( 255 ) NULL COMMENT '采购入仓仓库名称' ,
2026-08-20 18:02:38 +08:00
inbound_quantity BIGINT NOT NULL DEFAULT 0 COMMENT '采购单据累计入库数量' ,
2026-08-19 16:24:02 +08:00
estimated_arrival_at DATETIME ( 3 ) NULL COMMENT '预计到达时间' , status VARCHAR ( 32 ) NOT NULL DEFAULT 'PENDING_REVIEW' COMMENT '业务状态' ,
remark VARCHAR ( 1000 ) NULL COMMENT '备注' , idempotency_key VARCHAR ( 255 ) NOT NULL COMMENT '业务幂等键' , request_hash CHAR ( 64 ) NOT NULL COMMENT '请求内容哈希' ,
created_by VARCHAR ( 128 ) NULL COMMENT '创建人ID' , reviewed_by VARCHAR ( 128 ) NULL COMMENT '审核人ID' , review_remark VARCHAR ( 1000 ) NULL COMMENT '审核备注' ,
2026-08-25 10:31:04 +08:00
review_idempotency_key VARCHAR ( 255 ) NULL COMMENT '审核幂等键' , review_request_hash CHAR ( 64 ) NULL COMMENT '审核请求内容哈希' ,
2026-08-19 16:24:02 +08:00
reviewed_at DATETIME ( 3 ) NULL COMMENT '审核时间' , version BIGINT 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_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 = '海外采购订单' ;
CREATE TABLE IF NOT EXISTS ll_overseas_procurement_status_history (
id BIGINT NOT NULL COMMENT '主键ID' , order_id BIGINT NOT NULL COMMENT '订单ID' , customer_id VARCHAR ( 128 ) NOT NULL COMMENT '客户租户ID' ,
2026-08-20 18:02:38 +08:00
operation_type VARCHAR ( 32 ) NOT NULL COMMENT '操作类型:CREATE、REVIEW或UPDATE' ,
2026-08-19 16:24:02 +08:00
from_status VARCHAR ( 32 ) NULL COMMENT '变更前状态' , to_status VARCHAR ( 32 ) NOT NULL COMMENT '变更后状态' , operator_id VARCHAR ( 128 ) NULL COMMENT '操作人ID' ,
2026-08-25 10:31:04 +08:00
idempotency_key VARCHAR ( 255 ) NULL COMMENT '操作幂等键' , change_detail JSON NULL COMMENT '字段变更前后值JSON' , remark VARCHAR ( 1000 ) NULL COMMENT '备注' ,
2026-08-20 18:02:38 +08:00
created_at DATETIME ( 3 ) NOT NULL DEFAULT CURRENT_TIMESTAMP ( 3 ) COMMENT '创建时间' ,
2026-08-19 16:24:02 +08:00
PRIMARY KEY ( id ), KEY idx_ll_overseas_procurement_history ( customer_id , order_id , created_at )
2026-08-20 18:02:38 +08:00
) ENGINE = InnoDB COMMENT = '海外采购操作流水' ;
2026-08-19 16:24:02 +08:00
CREATE TABLE IF NOT EXISTS ll_us_truck_order (
id BIGINT NOT NULL COMMENT '主键ID' ,
customer_id VARCHAR ( 128 ) NOT NULL COMMENT '客户租户ID' ,
order_no VARCHAR ( 64 ) NOT NULL COMMENT '订单号' ,
transport_type VARCHAR ( 32 ) NOT NULL COMMENT '运输类型' ,
origin VARCHAR ( 255 ) NOT NULL COMMENT '起运地' ,
origin_address VARCHAR ( 500 ) NULL COMMENT '起运地址' ,
destination VARCHAR ( 255 ) NOT NULL COMMENT '目的地' ,
destination_address VARCHAR ( 500 ) NULL COMMENT '目的地址' ,
2026-10-07 19:38:56 +08:00
container_type VARCHAR ( 32 ) NULL DEFAULT NULL COMMENT '柜型;拼车来源未提供时为空,不推断为整柜' ,
2026-08-19 16:24:02 +08:00
pallet_count INT NOT NULL DEFAULT 1 COMMENT '客户申报托盘数' ,
package_count INT NULL COMMENT '可选箱数,零或空值均有效' ,
received_pallet_count INT NOT NULL DEFAULT 0 COMMENT 'PDA实收托盘数' ,
allocated_pallet_count INT NOT NULL DEFAULT 0 COMMENT '已分配到合车行程的托盘数' ,
total_weight_kg DECIMAL ( 18 , 3 ) NOT NULL DEFAULT 0 COMMENT '总重量(千克)' ,
total_volume_cbm DECIMAL ( 18 , 6 ) NOT NULL DEFAULT 0 COMMENT '总体积(立方米)' ,
budget_amount DECIMAL ( 18 , 2 ) NULL COMMENT '预算金额' ,
currency VARCHAR ( 3 ) NOT NULL DEFAULT 'USD' COMMENT '币种' ,
contact_name VARCHAR ( 128 ) NOT NULL COMMENT '联系人姓名' ,
contact_info VARCHAR ( 128 ) NOT NULL COMMENT '联系人联系方式' ,
requested_date DATE NOT NULL COMMENT '要求服务日期' ,
status VARCHAR ( 32 ) NOT NULL COMMENT '美国卡车订单状态' ,
remark VARCHAR ( 1000 ) NULL COMMENT '备注' ,
idempotency_key VARCHAR ( 255 ) NOT NULL COMMENT '业务幂等键' ,
request_hash CHAR ( 64 ) NOT NULL COMMENT '请求内容哈希' ,
created_by VARCHAR ( 128 ) NULL COMMENT '创建人ID' ,
version BIGINT 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 ) COMMENT '更新时间' ,
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 = '美国卡车运输订单' ;
CREATE TABLE IF NOT EXISTS ll_us_truck_order_pallet (
id BIGINT NOT NULL COMMENT '托盘记录ID' ,
order_id BIGINT NOT NULL COMMENT '美国卡车订单ID' ,
customer_id VARCHAR ( 128 ) NOT NULL COMMENT '客户租户ID' ,
pallet_no VARCHAR ( 128 ) NOT NULL COMMENT '业务托盘号' ,
sequence_no INT NOT NULL COMMENT '订单内托盘序号' ,
source VARCHAR ( 32 ) NOT NULL COMMENT '托盘来源:订单计划或PDA超收' ,
status VARCHAR ( 32 ) NOT NULL COMMENT '托盘状态:待收、已收或超收待审核' ,
warehouse_pallet_id BIGINT NULL COMMENT '仓库实物托盘资源ID' ,
package_count INT NULL COMMENT '托盘箱数' ,
received_at DATETIME ( 3 ) 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 ),
UNIQUE KEY uk_ll_us_truck_order_pallet_no ( customer_id , order_id , pallet_no ),
UNIQUE KEY uk_ll_us_truck_order_pallet_seq ( customer_id , order_id , sequence_no ),
KEY idx_ll_us_truck_order_pallet_list ( customer_id , order_id , status )
) ENGINE = InnoDB COMMENT = '美国卡车订单托盘实收记录' ;
2026-08-25 10:31:04 +08:00
CREATE TABLE IF NOT EXISTS ll_us_truck_order_operation (
id BIGINT NOT NULL COMMENT '操作记录ID' , order_id BIGINT NOT NULL COMMENT '美国卡车订单ID' ,
customer_id VARCHAR ( 128 ) NOT NULL COMMENT '客户租户ID' , operation_type VARCHAR ( 64 ) NOT NULL COMMENT '具名操作类型' ,
idempotency_key VARCHAR ( 255 ) NOT NULL COMMENT '操作幂等键' , request_hash CHAR ( 64 ) NOT NULL COMMENT '操作请求内容哈希' ,
result_version BIGINT NOT NULL COMMENT '操作完成后的订单版本' , created_by VARCHAR ( 128 ) NULL COMMENT '操作人ID' ,
created_at DATETIME ( 3 ) NOT NULL DEFAULT CURRENT_TIMESTAMP ( 3 ) COMMENT '创建时间' , PRIMARY KEY ( id ),
UNIQUE KEY uk_ll_us_truck_operation_key ( customer_id , order_id , idempotency_key ),
KEY idx_ll_us_truck_operation_order ( customer_id , order_id , created_at )
) ENGINE = InnoDB COMMENT = '美国卡车订单幂等操作账' ;
2026-08-19 16:24:02 +08:00
CREATE TABLE IF NOT EXISTS ll_us_truck_order_status_history (
id BIGINT NOT NULL COMMENT '主键ID' ,
order_id BIGINT NOT NULL COMMENT '订单ID' ,
customer_id VARCHAR ( 128 ) NOT NULL COMMENT '客户租户ID' ,
2026-08-25 10:31:04 +08:00
operation_type VARCHAR ( 64 ) NOT NULL COMMENT '具名操作类型' ,
2026-08-19 16:24:02 +08:00
from_status VARCHAR ( 32 ) NULL COMMENT '变更前状态' ,
to_status VARCHAR ( 32 ) NOT NULL COMMENT '变更后状态' ,
operator_id VARCHAR ( 128 ) NULL COMMENT '操作人ID' ,
2026-08-25 10:31:04 +08:00
idempotency_key VARCHAR ( 255 ) NULL COMMENT '操作幂等键' ,
2026-08-19 16:24:02 +08:00
remark VARCHAR ( 1000 ) NULL COMMENT '备注' ,
created_at DATETIME ( 3 ) NOT NULL DEFAULT CURRENT_TIMESTAMP ( 3 ) COMMENT '创建时间' ,
PRIMARY KEY ( id ),
KEY idx_ll_us_truck_history ( customer_id , order_id , created_at )
) ENGINE = InnoDB COMMENT = '美国卡车订单状态历史' ;
2026-08-20 18:02:38 +08:00
CREATE TABLE IF NOT EXISTS ll_local_looseboard_order (
id BIGINT NOT NULL COMMENT '主键ID' , customer_id VARCHAR ( 128 ) NOT NULL COMMENT '客户租户ID' ,
2026-08-22 12:35:32 +08:00
lastleg_order_id BIGINT NULL COMMENT '关联尾程主订单ID' ,
2026-08-20 18:02:38 +08:00
order_no VARCHAR ( 64 ) NOT NULL COMMENT '本土散板订单号' , transport_mode VARCHAR ( 32 ) NOT NULL COMMENT '运输方式:拼车或优先拼载' ,
2026-10-07 19:38:56 +08:00
pallet_required VARCHAR ( 8 ) NULL DEFAULT NULL COMMENT '是否需要打盘:YES或NO;拼车来源未提供时为空' , transport_type VARCHAR ( 32 ) NOT NULL COMMENT '运输类型' ,
2026-08-20 18:02:38 +08:00
origin VARCHAR ( 255 ) NOT NULL COMMENT '起运地' , origin_address VARCHAR ( 500 ) NULL COMMENT '起运详细地址' ,
destination VARCHAR ( 255 ) NOT NULL COMMENT '目的地' , destination_address VARCHAR ( 500 ) NULL COMMENT '目的详细地址、码头或仓号' ,
2026-10-07 19:38:56 +08:00
container_type VARCHAR ( 32 ) NULL DEFAULT NULL COMMENT '柜型;拼车来源未提供时为空,不推断为整柜' , package_count INT NOT NULL DEFAULT 0 COMMENT '货物件数' ,
2026-08-20 18:02:38 +08:00
total_weight_kg DECIMAL ( 18 , 3 ) NOT NULL DEFAULT 0 COMMENT '总重量(千克)' ,
total_volume_cbm DECIMAL ( 18 , 6 ) NOT NULL DEFAULT 0 COMMENT '总体积(立方米)' ,
budget_amount DECIMAL ( 18 , 2 ) NULL COMMENT '预算总价' , currency CHAR ( 3 ) NOT NULL DEFAULT 'USD' COMMENT '预算币种' ,
contact_name VARCHAR ( 128 ) NULL COMMENT '联系人姓名' , contact_info VARCHAR ( 128 ) NULL COMMENT '联系人联系方式' ,
requested_date DATE NULL COMMENT '要求服务日期' , status VARCHAR ( 32 ) NOT NULL DEFAULT 'PENDING_ACCEPTANCE' COMMENT '本土散板订单状态' ,
remark VARCHAR ( 1000 ) NULL COMMENT '备注' , idempotency_key VARCHAR ( 255 ) NOT NULL COMMENT '创建幂等键' ,
request_hash CHAR ( 64 ) NOT NULL COMMENT '创建请求内容哈希' , created_by VARCHAR ( 128 ) NULL COMMENT '创建人ID' ,
version BIGINT 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_local_looseboard_no ( customer_id , order_no ),
2026-08-22 12:35:32 +08:00
UNIQUE KEY uk_ll_local_looseboard_lastleg ( lastleg_order_id ),
2026-08-20 18:02:38 +08:00
UNIQUE KEY uk_ll_local_looseboard_key ( customer_id , idempotency_key ),
KEY idx_ll_local_looseboard_list ( customer_id , status , created_at ),
KEY idx_ll_local_looseboard_date ( customer_id , requested_date , created_at )
) ENGINE = InnoDB COMMENT = '本土散板订单' ;
CREATE TABLE IF NOT EXISTS ll_local_looseboard_history (
id BIGINT NOT NULL COMMENT '主键ID' , order_id BIGINT NOT NULL COMMENT '本土散板订单ID' , customer_id VARCHAR ( 128 ) NOT NULL COMMENT '客户租户ID' ,
operation_type VARCHAR ( 32 ) NOT NULL COMMENT '操作类型:CREATE、UPDATE或STATUS' , from_status VARCHAR ( 32 ) NULL COMMENT '变更前状态' ,
to_status VARCHAR ( 32 ) NOT NULL COMMENT '变更后状态' , operator_id VARCHAR ( 128 ) NULL COMMENT '操作人ID' ,
2026-08-25 10:31:04 +08:00
idempotency_key VARCHAR ( 255 ) NULL COMMENT '操作幂等键' , change_detail JSON NULL COMMENT '字段变更前后值JSON' , remark VARCHAR ( 1000 ) NULL COMMENT '操作备注' ,
2026-08-20 18:02:38 +08:00
created_at DATETIME ( 3 ) NOT NULL DEFAULT CURRENT_TIMESTAMP ( 3 ) COMMENT '创建时间' , PRIMARY KEY ( id ),
KEY idx_ll_local_looseboard_history ( customer_id , order_id , created_at )
) ENGINE = InnoDB COMMENT = '本土散板操作流水' ;
2026-08-25 10:31:04 +08:00
CREATE TABLE IF NOT EXISTS ll_local_looseboard_operation (
id BIGINT NOT NULL COMMENT '操作记录ID' , order_id BIGINT NOT NULL COMMENT '本土散板订单ID' ,
customer_id VARCHAR ( 128 ) NOT NULL COMMENT '客户租户ID' , operation_type VARCHAR ( 32 ) NOT NULL COMMENT '操作类型' ,
idempotency_key VARCHAR ( 255 ) NOT NULL COMMENT '操作幂等键' , request_hash CHAR ( 64 ) NOT NULL COMMENT '操作请求内容哈希' ,
result_version BIGINT NOT NULL COMMENT '操作完成后的订单版本' , created_by VARCHAR ( 128 ) NULL COMMENT '操作人ID' ,
created_at DATETIME ( 3 ) NOT NULL DEFAULT CURRENT_TIMESTAMP ( 3 ) COMMENT '创建时间' , PRIMARY KEY ( id ),
UNIQUE KEY uk_ll_local_looseboard_operation_key ( customer_id , order_id , idempotency_key ),
KEY idx_ll_local_looseboard_operation_order ( customer_id , order_id , created_at )
) ENGINE = InnoDB COMMENT = '本土散板订单幂等操作账' ;
2026-08-25 16:40:48 +08:00
2026-08-26 14:36:04 +08:00
CREATE TABLE IF NOT EXISTS ll_exception_order (
2026-09-01 11:09:14 +08:00
id BIGINT NOT NULL COMMENT '异常订单ID' , customer_id VARCHAR ( 128 ) NOT NULL COMMENT '客户数据隔离键' , exception_no VARCHAR ( 64 ) NOT NULL COMMENT '异常订单号' ,
exception_type VARCHAR ( 32 ) NOT NULL COMMENT '异常类型' , status VARCHAR ( 32 ) NOT NULL DEFAULT 'PENDING' COMMENT '异常处理状态' , reason VARCHAR ( 1000 ) NOT NULL COMMENT '异常原因' ,
last_mile_order_id BIGINT NULL COMMENT '关联尾程订单ID' , last_mile_order_no VARCHAR ( 64 ) NULL COMMENT '关联尾程订单号' , inbound_order_id BIGINT NULL COMMENT '关联入仓单ID' , inbound_code VARCHAR ( 128 ) NULL COMMENT '关联入仓码' ,
delivery_order_id BIGINT NULL COMMENT '关联派送单ID' , delivery_no VARCHAR ( 64 ) NULL COMMENT '关联派送单号' , outbound_no VARCHAR ( 64 ) NULL COMMENT '关联出库单号' ,
customer_name VARCHAR ( 255 ) NULL COMMENT '客户名称快照' , overseas_warehouse_id VARCHAR ( 128 ) NULL COMMENT '海外仓ID快照' , overseas_warehouse_name VARCHAR ( 255 ) NULL COMMENT '海外仓名称快照' ,
sku_code VARCHAR ( 128 ) NULL COMMENT '异常货物SKU' , package_count INT NULL COMMENT '异常箱数' , return_direction VARCHAR ( 32 ) NULL COMMENT '退回方向' , return_logistics_no VARCHAR ( 128 ) NULL COMMENT '退回物流单号' ,
2026-09-08 18:49:52 +08:00
handling_action VARCHAR ( 500 ) NULL COMMENT '异常处理措施' , handling_result VARCHAR ( 2000 ) NULL COMMENT '异常处理结果' ,
evidence_file_ids_json JSON NULL COMMENT '异常处理证据文件ID列表' , inventory_adjustment_id BIGINT NULL COMMENT '退回库存恢复操作ID' ,
handler_id VARCHAR ( 128 ) NULL COMMENT '处理人ID' , handler_name VARCHAR ( 128 ) NULL COMMENT '处理人名称' ,
2026-09-01 11:09:14 +08:00
source_type VARCHAR ( 32 ) NOT NULL DEFAULT 'MANUAL' COMMENT '异常来源类型' , created_by VARCHAR ( 128 ) NULL COMMENT '创建人ID' ,
2026-09-08 18:49:52 +08:00
exception_at DATETIME ( 3 ) NOT NULL COMMENT '异常发生时间' , completed_at DATETIME ( 3 ) NULL COMMENT '异常处理完成时间' ,
version BIGINT NOT NULL DEFAULT 0 COMMENT '异常订单乐观锁版本' , created_at DATETIME ( 3 ) NOT NULL DEFAULT CURRENT_TIMESTAMP ( 3 ) COMMENT '创建时间' ,
2026-09-01 11:09:14 +08:00
updated_at DATETIME ( 3 ) NOT NULL DEFAULT CURRENT_TIMESTAMP ( 3 ) ON UPDATE CURRENT_TIMESTAMP ( 3 ) COMMENT '更新时间' ,
2026-10-03 13:32:55 +08:00
return_context_json JSON NULL COMMENT '退回异常创建前的派送及尾程状态快照' ,
2026-08-26 14:36:04 +08:00
PRIMARY KEY ( id ), UNIQUE KEY uk_ll_exception_no ( customer_id , exception_no ),
2026-10-03 13:32:55 +08:00
KEY idx_ll_exception_delivery_return ( customer_id , delivery_order_id , exception_type ),
2026-08-26 14:36:04 +08:00
KEY idx_ll_exception_list ( customer_id , status , exception_at ), KEY idx_ll_exception_tail ( customer_id , last_mile_order_no ),
KEY idx_ll_exception_inbound ( customer_id , inbound_code )
) ENGINE = InnoDB COMMENT = '海外仓异常订单' ;
2026-08-26 15:02:14 +08:00
2026-09-08 18:49:52 +08:00
CREATE TABLE IF NOT EXISTS ll_exception_return_item (
id BIGINT NOT NULL COMMENT '异常退回明细ID' , customer_id VARCHAR ( 128 ) NOT NULL COMMENT '客户数据隔离键' ,
exception_order_id BIGINT NOT NULL COMMENT '异常订单ID' , outbound_pallet_item_id BIGINT NOT NULL COMMENT '原出库托盘明细ID' ,
2026-10-18 16:34:14 +08:00
inventory_position_id BIGINT NULL COMMENT '普通原出库库存位置;与退货原箱互斥' ,
return_carton_id BIGINT NULL COMMENT '原生退货箱标识;与普通库存位置互斥' ,
return_carton_mark VARCHAR ( 128 ) NULL COMMENT '原生退货箱业务箱码快照' ,
pallet_no VARCHAR ( 128 ) NULL COMMENT '原出库托盘码快照' ,
2026-09-08 18:49:52 +08:00
sku_code VARCHAR ( 128 ) NULL COMMENT '原出库SKU快照' , max_return_packages BIGINT NOT NULL COMMENT '原出库可退箱数上限' ,
approved_return_packages BIGINT NOT NULL COMMENT '批准退回箱数' , created_at DATETIME ( 3 ) NOT NULL COMMENT '创建时间' ,
2026-10-03 13:32:55 +08:00
received_packages BIGINT NOT NULL DEFAULT 0 COMMENT '已实际退回入仓的累计箱数' ,
CONSTRAINT chk_exception_return_received CHECK ( received_packages >= 0 AND received_packages <= approved_return_packages ),
2026-10-18 16:34:14 +08:00
CONSTRAINT chk_exception_return_source CHECK (( inventory_position_id IS NOT NULL AND return_carton_id IS NULL ) OR ( inventory_position_id IS NULL AND return_carton_id IS NOT NULL )),
2026-10-03 13:32:55 +08:00
2026-09-08 18:49:52 +08:00
PRIMARY KEY ( id ), UNIQUE KEY uk_ll_exception_return_source ( customer_id , exception_order_id , outbound_pallet_item_id , inventory_position_id ),
2026-10-18 16:34:14 +08:00
UNIQUE KEY uk_ll_exception_return_carton ( customer_id , exception_order_id , outbound_pallet_item_id , return_carton_id ),
2026-09-08 18:49:52 +08:00
KEY idx_ll_exception_return_order ( customer_id , exception_order_id )
) ENGINE = InnoDB COMMENT = '异常退回原出库库存冻结明细' ;
2026-10-18 16:34:14 +08:00
CREATE TABLE IF NOT EXISTS ll_return_carton_stock_receipt (
id BIGINT NOT NULL COMMENT '原箱回仓凭据明细标识' ,
customer_id VARCHAR ( 128 ) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '客户数据隔离键' ,
receipt_no VARCHAR ( 128 ) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '原箱回仓实收业务号' ,
exception_order_id BIGINT NOT NULL COMMENT '本次异常退回订单' ,
exception_return_item_id BIGINT NOT NULL COMMENT '本次冻结的原箱来源明细' ,
delivery_order_id BIGINT NOT NULL COMMENT '原运输派送单' ,
source_pick_id BIGINT NOT NULL COMMENT '原箱实际出库拣货凭据' ,
source_outbound_no VARCHAR ( 128 ) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '原出库单业务号' ,
source_dispatch_item_id BIGINT NOT NULL COMMENT '原排车货物明细' ,
source_outbound_pallet_item_id BIGINT NOT NULL COMMENT '原出库托盘明细' ,
return_carton_id BIGINT NOT NULL COMMENT '真实退货原箱标识' ,
carton_mark VARCHAR ( 128 ) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '原箱业务箱码快照' ,
overseas_warehouse_id VARCHAR ( 128 ) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '实际回仓海外仓标识' ,
target_pallet_id BIGINT NOT NULL COMMENT '实际回仓目标实物托盘' ,
target_pallet_no VARCHAR ( 128 ) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '实际目标托盘业务码' ,
target_location_id BIGINT NOT NULL COMMENT '实际回仓目标库位' ,
target_location_code VARCHAR ( 128 ) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '实际目标库位业务码' ,
sku_code VARCHAR ( 128 ) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '原出库快照中的商品编码' ,
product_name_zh VARCHAR ( 255 ) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL COMMENT '原出库快照中的中文品名' ,
quantity BIGINT NOT NULL COMMENT '本次原SKU实际恢复件数' ,
packages BIGINT NOT NULL COMMENT '本箱仅首条SKU记录计一箱其余为零' ,
evidence_file_ids_json JSON NOT NULL COMMENT '本次实收证据文件引用' ,
received_by VARCHAR ( 128 ) NOT NULL COMMENT '本次原箱实收确认操作人' ,
received_at DATETIME ( 3 ) NOT NULL COMMENT '实际原箱回仓入账时间' ,
PRIMARY KEY ( id ),
UNIQUE KEY uk_return_carton_receipt_source ( customer_id , source_pick_id , sku_code ),
KEY idx_return_carton_receipt_exception ( customer_id , exception_order_id , received_at ),
KEY idx_return_carton_receipt_delivery ( customer_id , delivery_order_id ),
CONSTRAINT chk_return_carton_receipt_quantity CHECK ( quantity > 0 AND packages IN ( 0 , 1 ))
) ENGINE = InnoDB COMMENT = '原生退货箱按原出库SKU实际回仓的不可变凭据' ;
2026-09-08 18:49:52 +08:00
CREATE TABLE IF NOT EXISTS ll_exception_order_command (
id BIGINT NOT NULL COMMENT '异常处理命令ID' , customer_id VARCHAR ( 128 ) NOT NULL COMMENT '客户数据隔离键' ,
exception_order_id BIGINT NOT NULL COMMENT '异常订单ID' , action VARCHAR ( 32 ) NOT NULL COMMENT '异常处理动作' ,
idempotency_key VARCHAR ( 255 ) NOT NULL COMMENT '幂等键' , request_hash VARCHAR ( 64 ) NOT NULL COMMENT '请求内容SHA256哈希' ,
result_json JSON NOT NULL COMMENT '命令结果快照' , created_at DATETIME ( 3 ) NOT NULL COMMENT '创建时间' ,
PRIMARY KEY ( id ), UNIQUE KEY uk_ll_exception_command_key ( customer_id , action , idempotency_key ),
KEY idx_ll_exception_command_order ( customer_id , exception_order_id , created_at )
) ENGINE = InnoDB COMMENT = '异常处理命令幂等审计' ;
2026-08-26 15:02:14 +08:00
CREATE TABLE IF NOT EXISTS ll_customer_visit (
id BIGINT NOT NULL COMMENT '客户回访记录ID' ,
customer_id VARCHAR ( 128 ) NOT NULL COMMENT '客户数据隔离键' ,
delivery_order_id BIGINT NOT NULL COMMENT '关联派送单ID' ,
delivery_no VARCHAR ( 64 ) NOT NULL COMMENT '关联派送单号' ,
customer_name VARCHAR ( 255 ) NULL COMMENT '客户名称快照' ,
contact_name VARCHAR ( 128 ) NULL COMMENT '客户联系人姓名快照' ,
contact_phone VARCHAR ( 64 ) NULL COMMENT '客户联系人电话快照' ,
destination VARCHAR ( 500 ) NULL COMMENT '派送目的仓编码汇总快照' ,
delivery_completed_at DATETIME ( 3 ) NOT NULL COMMENT '派送完成时间' ,
status VARCHAR ( 32 ) NOT NULL DEFAULT 'PENDING' COMMENT '回访状态:PENDING待回访或COMPLETED已回访' ,
selected_last_mile_order_id BIGINT NULL COMMENT '本次回访选择的尾程订单ID' ,
selected_last_mile_order_no VARCHAR ( 64 ) NULL COMMENT '本次回访选择的尾程订单号' ,
selected_inbound_order_id BIGINT NULL COMMENT '本次回访选择的入仓单ID' ,
selected_inbound_code VARCHAR ( 128 ) NULL COMMENT '本次回访选择的入仓码' ,
visit_result VARCHAR ( 32 ) NULL COMMENT '最近一次回访结果' ,
customer_feedback VARCHAR ( 2000 ) NULL COMMENT '最近一次客户反馈' ,
remark VARCHAR ( 1000 ) NULL COMMENT '最近一次回访备注' ,
attachment_json JSON NULL COMMENT '当前回访资料文件元数据列表' ,
visited_by VARCHAR ( 128 ) NULL COMMENT '最近一次回访操作人ID' ,
visited_at DATETIME ( 3 ) NULL COMMENT '最近一次回访时间' ,
visit_count INT 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_customer_visit_delivery ( customer_id , delivery_order_id ),
KEY idx_ll_customer_visit_list ( customer_id , status , delivery_completed_at ),
KEY idx_ll_customer_visit_delivery_no ( customer_id , delivery_no )
) ENGINE = InnoDB COMMENT = '派送单维度客户回访记录' ;
2026-09-05 22:26:25 +08:00
CREATE TABLE IF NOT EXISTS ll_wallet_event_inbox (
event_id VARCHAR ( 64 ) NOT NULL COMMENT '国内Finance资金结果事件ID' ,
command_event_id VARCHAR ( 64 ) NOT NULL COMMENT '原海外资金指令事件ID' ,
2026-09-05 23:32:31 +08:00
payload_hash VARCHAR ( 71 ) NOT NULL COMMENT '规范化载荷SHA-256,包含sha256:前缀' ,
2026-09-05 22:26:25 +08:00
payload_json JSON NOT NULL COMMENT '冻结事件信封' ,
status VARCHAR ( 16 ) NOT NULL COMMENT 'RECEIVED或PROCESSED' ,
received_at DATETIME ( 3 ) NOT NULL COMMENT '接收时间' ,
processed_at DATETIME ( 3 ) NULL COMMENT '处理完成时间' ,
PRIMARY KEY ( event_id ),
UNIQUE KEY uk_ll_wallet_command_result ( command_event_id ),
KEY idx_ll_wallet_event_status ( status , received_at )
) ENGINE = InnoDB COMMENT = '跨区客户资金结果幂等收件箱' ;
CREATE TABLE IF NOT EXISTS ll_procurement_daily_sequence (
customer_id VARCHAR ( 128 ) NOT NULL COMMENT '客户ID' ,
business_date DATE NOT NULL COMMENT '北京时间业务日期' ,
sequence_value INT NOT NULL COMMENT '客户当日已分配最大序号' ,
PRIMARY KEY ( customer_id , business_date ),
CONSTRAINT chk_ll_procurement_sequence CHECK ( sequence_value BETWEEN 1 AND 9999 )
) ENGINE = InnoDB COMMENT = '海外采购客户日序列' ;
CREATE TABLE IF NOT EXISTS ll_overseas_procurement_file (
id BIGINT NOT NULL COMMENT '主键ID' , order_id BIGINT NOT NULL COMMENT '采购订单ID' , customer_id VARCHAR ( 128 ) NOT NULL COMMENT '客户ID' ,
2026-10-10 02:19:38 +08:00
category VARCHAR ( 16 ) NOT NULL COMMENT 'RECEIPT实收、VOUCHER费用、LABEL面单、PURCHASE采购、BUDGET预算、EXCEPTION异常凭证' , file_id BIGINT NOT NULL COMMENT 'File服务文件ID' ,
2026-09-05 22:26:25 +08:00
file_name VARCHAR ( 255 ) NOT NULL COMMENT '文件名快照' , content_type VARCHAR ( 128 ) NULL COMMENT '媒体类型' , size_bytes BIGINT NOT NULL DEFAULT 0 COMMENT '文件大小' ,
created_by VARCHAR ( 128 ) NULL COMMENT '上传人' , created_at DATETIME ( 3 ) NOT NULL DEFAULT CURRENT_TIMESTAMP ( 3 ) COMMENT '上传时间' ,
PRIMARY KEY ( id ), UNIQUE KEY uk_ll_procurement_file ( order_id , file_id ), KEY idx_ll_procurement_file_order ( customer_id , order_id , category , created_at ),
2026-10-10 02:19:38 +08:00
CONSTRAINT chk_ll_procurement_file_category CHECK ( category IN ( 'RECEIPT' , 'VOUCHER' , 'LABEL' , 'PURCHASE' , 'BUDGET' , 'EXCEPTION' ))
2026-09-05 22:26:25 +08:00
) ENGINE = InnoDB COMMENT = '海外采购签收文件及费用凭证' ;
CREATE TABLE IF NOT EXISTS ll_overseas_procurement_fee (
2026-10-10 02:19:38 +08:00
purpose VARCHAR ( 32 ) NULL COMMENT '费用业务用途;由履约节点确定' ,
confirmation_origin VARCHAR ( 16 ) NOT NULL DEFAULT 'BUSINESS' COMMENT '核定入口:BUSINESS业务节点、FINANCIAL财务操作' ,
fee_version INT NULL COMMENT '同用途费用确认版本' ,
active TINYINT ( 1 ) NOT NULL DEFAULT 1 COMMENT '是否当前有效版本' ,
determination VARCHAR ( 24 ) NULL COMMENT 'POSITIVE正额、ZERO零元、NOT_APPLICABLE不适用' ,
original_currency CHAR ( 3 ) NULL COMMENT '核定原币CNY或USD' ,
original_amount DECIMAL ( 20 , 2 ) NULL COMMENT '核定原币金额' ,
exchange_rate DECIMAL ( 20 , 6 ) NULL COMMENT '已确认汇率快照' ,
exchange_rate_month CHAR ( 7 ) NULL COMMENT '已确认汇率所属月份' ,
business_date DATE NULL COMMENT '实际费用业务日期' ,
wallet_business_id BIGINT NULL COMMENT '资金冻结对应采购费用记录' ,
wallet_business_no VARCHAR ( 128 ) NULL COMMENT '资金冻结业务号;实际国际运费引用原预估' ,
wallet_hold_id VARCHAR ( 64 ) NULL COMMENT 'Finance冻结引用' ,
wallet_ledger_id VARCHAR ( 64 ) NULL COMMENT 'Finance实际处理流水引用' ,
settled_command_event_id VARCHAR ( 64 ) NULL COMMENT '成功实扣或退款的资金命令事件' ,
source_fee_id BIGINT NULL COMMENT '已实扣费用来源ID' ,
parent_fee_id BIGINT NULL COMMENT '原费用或预估引用' ,
request_hash CHAR ( 64 ) NULL COMMENT '确认请求摘要' ,
2026-09-05 22:26:25 +08:00
id BIGINT NOT NULL COMMENT '主键ID' , order_id BIGINT NOT NULL COMMENT '采购订单ID' , customer_id VARCHAR ( 128 ) NOT NULL COMMENT '客户ID' ,
fee_no VARCHAR ( 64 ) NOT NULL COMMENT '费用业务号' , fee_item_code VARCHAR ( 32 ) NOT NULL COMMENT '费用项编码' , fee_item_name VARCHAR ( 128 ) NOT NULL COMMENT '费用项名称' ,
2026-10-10 02:19:38 +08:00
amount DECIMAL ( 20 , 2 ) NOT NULL COMMENT 'CNY金额' , currency CHAR ( 3 ) NOT NULL DEFAULT 'CNY' COMMENT '费用币种' , voucher_file_id BIGINT NULL COMMENT '凭证文件ID' ,
voucher_file_name VARCHAR ( 255 ) NULL COMMENT '凭证文件名' , remark VARCHAR ( 500 ) NULL COMMENT '说明' ,
2026-09-05 22:26:25 +08:00
wallet_status VARCHAR ( 32 ) NOT NULL COMMENT '资金状态' , wallet_error_code VARCHAR ( 64 ) NULL COMMENT '资金错误码' , wallet_error_message VARCHAR ( 500 ) NULL COMMENT '资金错误说明' ,
wallet_command_event_id VARCHAR ( 64 ) NULL COMMENT '当前资金指令事件ID' , created_by VARCHAR ( 128 ) 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 '更新时间' ,
2026-10-10 02:19:38 +08:00
CONSTRAINT chk_procurement_confirmation_origin CHECK ( confirmation_origin IN ( 'BUSINESS' , 'FINANCIAL' )),
UNIQUE KEY uk_ll_procurement_fee_version ( order_id , purpose , fee_item_code , fee_version ),
2026-09-05 22:26:25 +08:00
PRIMARY KEY ( id ), UNIQUE KEY uk_ll_procurement_fee_no ( fee_no ), KEY idx_ll_procurement_fee_order ( customer_id , order_id , created_at ),
2026-10-10 02:19:38 +08:00
CONSTRAINT chk_ll_procurement_fee_amount CHECK ( amount >= 0 ), CONSTRAINT chk_ll_procurement_fee_currency CHECK ( currency = 'CNY' )
2026-09-05 22:26:25 +08:00
) ENGINE = InnoDB COMMENT = '海外采购费用明细及资金生命周期' ;
CREATE TABLE IF NOT EXISTS ll_destuff_pallet_cost (
id BIGINT NOT NULL COMMENT '主键ID' , source_container_booking_id VARCHAR ( 128 ) NOT NULL COMMENT '来源柜次业务ID' , container_no VARCHAR ( 64 ) NOT NULL COMMENT '集装箱号' , warehouse_id BIGINT NULL COMMENT '海外仓ID' ,
pallet_count INT NOT NULL COMMENT '实际打托数' , total_actual_volume_cbm DECIMAL ( 20 , 6 ) NOT NULL COMMENT '客户实收总体积' , total_cost DECIMAL ( 20 , 2 ) NOT NULL COMMENT '打托总成本' , currency CHAR ( 3 ) NOT NULL DEFAULT 'CNY' COMMENT '成本币种' ,
status VARCHAR ( 16 ) NOT NULL COMMENT '生成状态' , created_at DATETIME ( 3 ) NOT NULL DEFAULT CURRENT_TIMESTAMP ( 3 ) COMMENT '创建时间' , PRIMARY KEY ( id ),
UNIQUE KEY uk_ll_destuff_cost_booking ( source_container_booking_id ), CONSTRAINT chk_ll_destuff_cost CHECK ( pallet_count > 0 AND total_actual_volume_cbm > 0 AND total_cost > 0 AND currency = 'CNY' )
) ENGINE = InnoDB COMMENT = '拆柜打托实际成本汇总' ;
CREATE TABLE IF NOT EXISTS ll_destuff_pallet_cost_allocation (
id BIGINT NOT NULL COMMENT '主键ID' , cost_id BIGINT NOT NULL COMMENT '打托成本汇总ID' , customer_id VARCHAR ( 128 ) NOT NULL COMMENT '客户ID' , actual_volume_cbm DECIMAL ( 20 , 6 ) NOT NULL COMMENT '客户实收体积' ,
allocated_amount DECIMAL ( 20 , 2 ) NOT NULL COMMENT '客户分摊金额' , fee_source_id BIGINT NOT NULL COMMENT '海外费用来源ID' , created_at DATETIME ( 3 ) NOT NULL DEFAULT CURRENT_TIMESTAMP ( 3 ) COMMENT '创建时间' ,
PRIMARY KEY ( id ), UNIQUE KEY uk_ll_destuff_customer ( cost_id , customer_id ), UNIQUE KEY uk_ll_destuff_fee_source ( fee_source_id ),
CONSTRAINT chk_ll_destuff_allocation CHECK ( actual_volume_cbm > 0 AND allocated_amount >= 0 )
) ENGINE = InnoDB COMMENT = '拆柜打托成本按客户实收体积分摊' ;
2026-09-09 12:02:12 +08:00
-- 客户退货预报、PDA 签收与仓储费起算批次
CREATE TABLE IF NOT EXISTS ll_return_order (
-- need_relabel is added below for existing deployments
2026-10-13 11:00:31 +08:00
id BIGINT NOT NULL COMMENT '退货订单ID' , customer_id VARCHAR ( 128 ) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '客户ID和隔离键' , return_no VARCHAR ( 128 ) NOT NULL COMMENT '退货订单号' , overseas_warehouse_id VARCHAR ( 128 ) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '操作海外仓ID' , warehouse_contact_name VARCHAR ( 128 ) NULL COMMENT '中转仓联系人快照' , warehouse_contact_phone VARCHAR ( 64 ) NULL COMMENT '中转仓联系电话快照' , customer_reference_no VARCHAR ( 128 ) NULL COMMENT '客户参考号' , lastleg_order_id BIGINT NULL COMMENT '尾程订单ID' , lastleg_order_no VARCHAR ( 32 ) NULL COMMENT '尾程订单号' , status VARCHAR ( 32 ) NOT NULL COMMENT 'PENDING_RECEIPT、PARTIALLY_RECEIVED或COMPLETED' , expected_sku_types INT NOT NULL COMMENT '预报SKU种类数' , expected_quantity BIGINT NOT NULL COMMENT '预报总数量' , received_quantity BIGINT NOT NULL DEFAULT 0 COMMENT '累计实收总数量' , remark VARCHAR ( 1000 ) NULL COMMENT '客户备注' , idempotency_key VARCHAR ( 255 ) NOT NULL COMMENT '创建幂等键' , request_hash CHAR ( 64 ) NOT NULL COMMENT '创建请求SHA-256' , created_by VARCHAR ( 128 ) NULL COMMENT '创建操作人ID' , created_at DATETIME ( 3 ) NOT NULL COMMENT '创建时间' , updated_at DATETIME ( 3 ) NOT NULL COMMENT '最后更新时间' ,
2026-09-09 12:02:12 +08:00
PRIMARY KEY ( id ), UNIQUE KEY uk_ll_return_order_customer_no ( customer_id , return_no ), UNIQUE KEY uk_ll_return_order_customer_key ( customer_id , idempotency_key ), KEY idx_ll_return_order_warehouse_status ( overseas_warehouse_id , status , created_at ), CONSTRAINT chk_ll_return_order_quantity CHECK ( expected_sku_types > 0 AND expected_quantity > 0 AND received_quantity >= 0 AND received_quantity <= expected_quantity )
2026-10-13 11:00:31 +08:00
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '客户退货订单及SKU实收汇总' ;
2026-09-09 12:02:12 +08:00
SET @ ll_return_order_need_relabel = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_return_order' AND column_name = 'need_relabel' ), 'SELECT 1' , 'ALTER TABLE ll_return_order ADD COLUMN need_relabel TINYINT(1) NOT NULL DEFAULT 0 COMMENT ''是否需要换标'' AFTER customer_reference_no' )); PREPARE stmt FROM @ ll_return_order_need_relabel ; EXECUTE stmt ; DEALLOCATE PREPARE stmt ;
2026-09-11 15:10:01 +08:00
SET @ ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_return_order' AND column_name = 'lastleg_order_id' ), 'SELECT 1' , 'ALTER TABLE ll_return_order ADD COLUMN lastleg_order_id BIGINT NULL COMMENT ''尾程订单ID'' AFTER customer_reference_no' )); PREPARE stmt FROM @ ddl ; EXECUTE stmt ; DEALLOCATE PREPARE stmt ;
SET @ ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_return_order' AND column_name = 'lastleg_order_no' ), 'SELECT 1' , 'ALTER TABLE ll_return_order ADD COLUMN lastleg_order_no VARCHAR(32) NULL COMMENT ''尾程订单号'' AFTER lastleg_order_id' )); PREPARE stmt FROM @ ddl ; EXECUTE stmt ; DEALLOCATE PREPARE stmt ;
2026-09-10 17:11:33 +08:00
SET @ ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_return_order' AND column_name = 'warehouse_contact_name' ), 'SELECT 1' , 'ALTER TABLE ll_return_order ADD COLUMN warehouse_contact_name VARCHAR(128) NULL COMMENT ''中转仓联系人快照'' AFTER overseas_warehouse_id' )); PREPARE stmt FROM @ ddl ; EXECUTE stmt ; DEALLOCATE PREPARE stmt ;
SET @ ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_return_order' AND column_name = 'warehouse_contact_phone' ), 'SELECT 1' , 'ALTER TABLE ll_return_order ADD COLUMN warehouse_contact_phone VARCHAR(64) NULL COMMENT ''中转仓联系电话快照'' AFTER warehouse_contact_name' )); PREPARE stmt FROM @ ddl ; EXECUTE stmt ; DEALLOCATE PREPARE stmt ;
2026-09-09 12:02:12 +08:00
SET @ ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_return_order' AND column_name = 'relabel_application_id' ), 'SELECT 1' , 'ALTER TABLE ll_return_order ADD COLUMN relabel_application_id BIGINT NULL COMMENT ''绑定换标申请单ID'' AFTER need_relabel' )); PREPARE stmt FROM @ ddl ; EXECUTE stmt ; DEALLOCATE PREPARE stmt ;
SET @ ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_return_order' AND column_name = 'relabel_no' ), 'SELECT 1' , 'ALTER TABLE ll_return_order ADD COLUMN relabel_no VARCHAR(64) NULL COMMENT ''绑定换标单号'' AFTER relabel_application_id' )); PREPARE stmt FROM @ ddl ; EXECUTE stmt ; DEALLOCATE PREPARE stmt ;
SET @ ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_return_order' AND column_name = 'relabel_status' ), 'SELECT 1' , 'ALTER TABLE ll_return_order ADD COLUMN relabel_status VARCHAR(32) NULL COMMENT ''换标状态'' AFTER relabel_no' )); PREPARE stmt FROM @ ddl ; EXECUTE stmt ; DEALLOCATE PREPARE stmt ;
CREATE TABLE IF NOT EXISTS ll_return_order_item (
2026-10-13 11:00:31 +08:00
id BIGINT NOT NULL COMMENT '退货预报明细ID' , return_order_id BIGINT NOT NULL COMMENT '退货订单ID' , customer_id VARCHAR ( 128 ) NOT NULL COMMENT '客户ID和隔离键' , sku_code VARCHAR ( 128 ) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'SKU编码' , product_name_zh VARCHAR ( 255 ) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL COMMENT '中文品名' , expected_quantity BIGINT NOT NULL COMMENT 'SKU预报数量' , received_quantity BIGINT NOT NULL DEFAULT 0 COMMENT 'SKU累计实收数量' , created_at DATETIME ( 3 ) NOT NULL COMMENT '创建时间' , updated_at DATETIME ( 3 ) NOT NULL COMMENT '最后更新时间' ,
2026-09-09 12:02:12 +08:00
PRIMARY KEY ( id ), UNIQUE KEY uk_ll_return_item_order_sku ( return_order_id , sku_code ), KEY idx_ll_return_item_sku ( sku_code , received_quantity ), CONSTRAINT chk_ll_return_item_quantity CHECK ( expected_quantity > 0 AND received_quantity >= 0 AND received_quantity <= expected_quantity )
2026-10-13 11:00:31 +08:00
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '客户退货订单的SKU预报与实收明细' ;
2026-09-09 12:02:12 +08:00
CREATE TABLE IF NOT EXISTS ll_return_receipt (
2026-10-12 18:11:23 +08:00
original_packaging TINYINT ( 1 ) NULL COMMENT '是否使用原箱原包装' , measurement_source VARCHAR ( 32 ) NULL COMMENT '尺寸重量来源' ,
2026-10-13 11:00:31 +08:00
id BIGINT NOT NULL COMMENT 'PDA退货签收单ID' , return_order_id BIGINT NOT NULL COMMENT '退货订单ID' , customer_id VARCHAR ( 128 ) NOT NULL COMMENT '客户ID和隔离键' , receipt_no VARCHAR ( 128 ) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '签收单号' , receipt_batch_no VARCHAR ( 128 ) NOT NULL COMMENT '签收批次号' , tracking_no VARCHAR ( 128 ) NULL COMMENT '本次签收包裹的可选快递单号' , bound_by VARCHAR ( 16 ) NOT NULL COMMENT '开始签收方式,RETURN_NO退货单号或SKU候选' , status VARCHAR ( 32 ) NOT NULL COMMENT '签收状态,当前SIGNED' , received_quantity BIGINT NOT NULL COMMENT '本次实收数量' , operator_id VARCHAR ( 128 ) NOT NULL COMMENT 'PDA操作人ID' , operator_name VARCHAR ( 128 ) NULL COMMENT 'PDA操作人名称' , idempotency_key VARCHAR ( 255 ) NOT NULL COMMENT 'PDA确认幂等键' , request_hash CHAR ( 64 ) NOT NULL COMMENT 'PDA确认请求SHA-256' , signed_at DATETIME ( 3 ) NOT NULL COMMENT '签收时间' , created_at DATETIME ( 3 ) NOT NULL COMMENT '创建时间' ,
2026-09-09 12:02:12 +08:00
PRIMARY KEY ( id ), UNIQUE KEY uk_ll_return_receipt_no ( receipt_no ), UNIQUE KEY uk_ll_return_receipt_batch ( receipt_batch_no ), UNIQUE KEY uk_ll_return_receipt_operator_key ( operator_id , idempotency_key ), KEY idx_ll_return_receipt_order ( return_order_id , signed_at ), CONSTRAINT chk_ll_return_receipt_quantity CHECK ( received_quantity > 0 ), CONSTRAINT chk_ll_return_receipt_bound CHECK ( bound_by IN ( 'RETURN_NO' , 'SKU' ))
2026-10-13 11:00:31 +08:00
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = 'PDA退货实收签收事实' ;
2026-09-09 12:02:12 +08:00
-- 已创建开发库升级为“客户只预报 SKU,快递单号仅属于签收批次”的最终模型。
SET @ ll_return_item_drop_tracking_order_sku = ( SELECT IF ( COUNT ( * ) > 0 , 'ALTER TABLE ll_return_order_item DROP INDEX uk_ll_return_item_order_tracking_sku' , 'SELECT 1' ) FROM information_schema . statistics WHERE table_schema = DATABASE () AND table_name = 'll_return_order_item' AND index_name = 'uk_ll_return_item_order_tracking_sku' );
PREPARE ll_return_item_drop_tracking_order_sku_stmt FROM @ ll_return_item_drop_tracking_order_sku ;
EXECUTE ll_return_item_drop_tracking_order_sku_stmt ;
DEALLOCATE PREPARE ll_return_item_drop_tracking_order_sku_stmt ;
SET @ ll_return_item_drop_tracking = ( SELECT IF ( COUNT ( * ) > 0 , 'ALTER TABLE ll_return_order_item DROP INDEX idx_ll_return_item_tracking' , 'SELECT 1' ) FROM information_schema . statistics WHERE table_schema = DATABASE () AND table_name = 'll_return_order_item' AND index_name = 'idx_ll_return_item_tracking' );
PREPARE ll_return_item_drop_tracking_stmt FROM @ ll_return_item_drop_tracking ;
EXECUTE ll_return_item_drop_tracking_stmt ;
DEALLOCATE PREPARE ll_return_item_drop_tracking_stmt ;
SET @ ll_return_item_drop_order = ( SELECT IF ( COUNT ( * ) > 0 , 'ALTER TABLE ll_return_order_item DROP INDEX idx_ll_return_item_order' , 'SELECT 1' ) FROM information_schema . statistics WHERE table_schema = DATABASE () AND table_name = 'll_return_order_item' AND index_name = 'idx_ll_return_item_order' );
PREPARE ll_return_item_drop_order_stmt FROM @ ll_return_item_drop_order ;
EXECUTE ll_return_item_drop_order_stmt ;
DEALLOCATE PREPARE ll_return_item_drop_order_stmt ;
SET @ ll_return_item_drop_tracking_no = ( SELECT IF ( COUNT ( * ) > 0 , 'ALTER TABLE ll_return_order_item DROP COLUMN tracking_no' , 'SELECT 1' ) FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_return_order_item' AND column_name = 'tracking_no' );
PREPARE ll_return_item_drop_tracking_no_stmt FROM @ ll_return_item_drop_tracking_no ;
EXECUTE ll_return_item_drop_tracking_no_stmt ;
DEALLOCATE PREPARE ll_return_item_drop_tracking_no_stmt ;
SET @ ll_return_item_add_order_sku = ( SELECT IF ( COUNT ( * ) = 0 , 'ALTER TABLE ll_return_order_item ADD UNIQUE KEY uk_ll_return_item_order_sku(return_order_id,sku_code)' , 'SELECT 1' ) FROM information_schema . statistics WHERE table_schema = DATABASE () AND table_name = 'll_return_order_item' AND index_name = 'uk_ll_return_item_order_sku' );
PREPARE ll_return_item_add_order_sku_stmt FROM @ ll_return_item_add_order_sku ;
EXECUTE ll_return_item_add_order_sku_stmt ;
DEALLOCATE PREPARE ll_return_item_add_order_sku_stmt ;
SET @ ll_return_item_add_sku_idx = ( SELECT IF ( COUNT ( * ) = 0 , 'ALTER TABLE ll_return_order_item ADD KEY idx_ll_return_item_sku(sku_code,received_quantity)' , 'SELECT 1' ) FROM information_schema . statistics WHERE table_schema = DATABASE () AND table_name = 'll_return_order_item' AND index_name = 'idx_ll_return_item_sku' );
PREPARE ll_return_item_add_sku_idx_stmt FROM @ ll_return_item_add_sku_idx ;
EXECUTE ll_return_item_add_sku_idx_stmt ;
DEALLOCATE PREPARE ll_return_item_add_sku_idx_stmt ;
UPDATE ll_return_receipt SET bound_by = 'RETURN_NO' WHERE bound_by = 'TRACKING' ;
SET @ ll_return_receipt_drop_bound_check = ( SELECT IF ( COUNT ( * ) > 0 , 'ALTER TABLE ll_return_receipt DROP CHECK chk_ll_return_receipt_bound' , 'SELECT 1' ) FROM information_schema . table_constraints WHERE constraint_schema = DATABASE () AND table_name = 'll_return_receipt' AND constraint_name = 'chk_ll_return_receipt_bound' );
PREPARE ll_return_receipt_drop_bound_check_stmt FROM @ ll_return_receipt_drop_bound_check ;
EXECUTE ll_return_receipt_drop_bound_check_stmt ;
DEALLOCATE PREPARE ll_return_receipt_drop_bound_check_stmt ;
SET @ ll_return_receipt_alter = 'ALTER TABLE ll_return_receipt MODIFY COLUMN tracking_no VARCHAR(128) NULL COMMENT ''本次签收包裹的可选快递单号'', MODIFY COLUMN bound_by VARCHAR(16) NOT NULL COMMENT ''开始签收方式,RETURN_NO退货单号或SKU候选'', ADD CONSTRAINT chk_ll_return_receipt_bound CHECK(bound_by IN(''RETURN_NO'',''SKU''))' ;
PREPARE ll_return_receipt_alter_stmt FROM @ ll_return_receipt_alter ;
EXECUTE ll_return_receipt_alter_stmt ;
DEALLOCATE PREPARE ll_return_receipt_alter_stmt ;
2026-09-20 15:06:17 +08:00
SET @ ll_return_receipt_add_pallet = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_return_receipt' AND column_name = 'pallet_code' ), 'SELECT 1' , 'ALTER TABLE ll_return_receipt ADD COLUMN pallet_code VARCHAR(128) NULL COMMENT ''本次签收绑定的托盘码'' AFTER receipt_batch_no' ));
PREPARE ll_return_receipt_add_pallet_stmt FROM @ ll_return_receipt_add_pallet ; EXECUTE ll_return_receipt_add_pallet_stmt ; DEALLOCATE PREPARE ll_return_receipt_add_pallet_stmt ;
2026-10-12 18:11:23 +08:00
SET @ ll_return_receipt_add_measurement_facts = ( SELECT IF ( COUNT ( * ) = 0 , 'ALTER TABLE ll_return_receipt ADD COLUMN original_packaging TINYINT(1) NULL COMMENT ''是否使用原箱原包装'' AFTER weight' , 'SELECT 1' ) FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_return_receipt' AND column_name = 'original_packaging' );
PREPARE ll_return_receipt_add_measurement_facts_stmt FROM @ ll_return_receipt_add_measurement_facts ; EXECUTE ll_return_receipt_add_measurement_facts_stmt ; DEALLOCATE PREPARE ll_return_receipt_add_measurement_facts_stmt ;
SET @ ll_return_receipt_add_measurement_facts = ( SELECT IF ( COUNT ( * ) = 0 , 'ALTER TABLE ll_return_receipt ADD COLUMN measurement_source VARCHAR(32) NULL COMMENT ''尺寸重量来源'' AFTER original_packaging' , 'SELECT 1' ) FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_return_receipt' AND column_name = 'measurement_source' );
2026-10-12 18:01:16 +08:00
PREPARE ll_return_receipt_add_measurement_facts_stmt FROM @ ll_return_receipt_add_measurement_facts ; EXECUTE ll_return_receipt_add_measurement_facts_stmt ; DEALLOCATE PREPARE ll_return_receipt_add_measurement_facts_stmt ;
2026-09-09 12:02:12 +08:00
CREATE TABLE IF NOT EXISTS ll_return_receipt_item (
2026-10-13 11:00:31 +08:00
id BIGINT NOT NULL COMMENT '签收SKU明细ID' , receipt_id BIGINT NOT NULL COMMENT 'PDA退货签收单ID' , return_order_item_id BIGINT NOT NULL COMMENT '退货预报明细ID' , customer_id VARCHAR ( 128 ) NOT NULL COMMENT '客户ID和隔离键' , sku_code VARCHAR ( 128 ) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'SKU编码' , received_quantity BIGINT NOT NULL COMMENT '本次SKU实收数量' ,
2026-09-09 12:02:12 +08:00
PRIMARY KEY ( id ), KEY idx_ll_return_receipt_item_receipt ( receipt_id ), KEY idx_ll_return_receipt_item_order_item ( return_order_item_id ), CONSTRAINT chk_ll_return_receipt_item_quantity CHECK ( received_quantity > 0 )
2026-10-13 11:00:31 +08:00
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = 'PDA退货签收SKU实际数量明细' ;
2026-09-09 12:02:12 +08:00
CREATE TABLE IF NOT EXISTS ll_return_receipt_batch (
id BIGINT NOT NULL COMMENT '退货仓储计费批次ID' , return_order_id BIGINT NOT NULL COMMENT '退货订单ID' , receipt_id BIGINT NOT NULL COMMENT 'PDA退货签收单ID' , customer_id VARCHAR ( 128 ) NOT NULL COMMENT '客户ID和隔离键' , batch_no VARCHAR ( 128 ) NOT NULL COMMENT '签收批次号' , overseas_warehouse_id VARCHAR ( 128 ) NOT NULL COMMENT '操作海外仓ID' , storage_billing_status VARCHAR ( 32 ) NOT NULL COMMENT '仓储计费状态,初始PENDING_PRICING' , storage_started_at DATETIME ( 3 ) NOT NULL COMMENT '仓储计费起算时间' , created_at DATETIME ( 3 ) NOT NULL COMMENT '创建时间' ,
PRIMARY KEY ( id ), UNIQUE KEY uk_ll_return_batch_no ( batch_no ), UNIQUE KEY uk_ll_return_batch_receipt ( receipt_id ), KEY idx_ll_return_batch_billing ( customer_id , overseas_warehouse_id , storage_billing_status , storage_started_at )
) ENGINE = InnoDB COMMENT = '每次退货签收生成的仓储费起算批次' ;
-- 退货库存:签收即生成箱号,库存按客户、海外仓和SKU汇总;箱内明细保留给合箱与箱唛。
SET @ ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_return_receipt' AND column_name = 'carton_mark' ), 'SELECT 1' , 'ALTER TABLE ll_return_receipt ADD COLUMN carton_mark VARCHAR(128) NULL COMMENT ''签收生成或绑定的退货箱号'' AFTER receipt_batch_no' ));
PREPARE return_receipt_carton_mark_stmt FROM @ ddl ; EXECUTE return_receipt_carton_mark_stmt ; DEALLOCATE PREPARE return_receipt_carton_mark_stmt ;
CREATE TABLE IF NOT EXISTS ll_return_inventory_carton (
2026-10-12 18:11:23 +08:00
original_packaging TINYINT ( 1 ) NULL COMMENT '是否使用原箱原包装' ,
2026-09-14 12:40:40 +08:00
new_carton_mark VARCHAR ( 255 ) NULL COMMENT '换标后新箱唛' ,
2026-10-13 11:00:31 +08:00
id BIGINT NOT NULL COMMENT '退货库存箱ID' , customer_id VARCHAR ( 128 ) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '客户ID和隔离键' , overseas_warehouse_id VARCHAR ( 128 ) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '海外仓ID' , source_receipt_id BIGINT NULL COMMENT '来源PDA签收单ID' , source_batch_no VARCHAR ( 128 ) NULL COMMENT '来源签收批次号' , carton_mark VARCHAR ( 128 ) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '退货箱号和箱唛编码' , status VARCHAR ( 32 ) NOT NULL COMMENT 'AVAILABLE可用或MERGED已合箱' , sku_types INT NOT NULL COMMENT '箱内SKU种类数' , total_quantity BIGINT NOT NULL COMMENT '箱内总件数' , length DECIMAL ( 12 , 3 ) NULL COMMENT '箱长CM' , width DECIMAL ( 12 , 3 ) NULL COMMENT '箱宽CM' , height DECIMAL ( 12 , 3 ) NULL COMMENT '箱高CM' , weight DECIMAL ( 12 , 3 ) NULL COMMENT '箱重KG' , created_at DATETIME ( 3 ) NOT NULL COMMENT '创建时间' , updated_at DATETIME ( 3 ) NOT NULL COMMENT '最后更新时间' , merged_at DATETIME ( 3 ) NULL COMMENT '合箱完成时间' ,
2026-09-28 11:59:08 +08:00
PRIMARY KEY ( id ), UNIQUE KEY uk_ll_return_inventory_carton_mark ( carton_mark ), UNIQUE KEY uk_ll_return_inventory_carton_receipt ( source_receipt_id ), KEY idx_ll_return_inventory_carton_customer ( customer_id , overseas_warehouse_id , status , created_at ), CONSTRAINT chk_ll_return_inventory_carton_quantity CHECK (( status IN ( 'AVAILABLE' , 'RELABEL_PENDING' , 'OUTBOUNDED' , 'DISCARD_PENDING' ) AND sku_types > 0 AND total_quantity > 0 ) OR ( status IN ( 'MERGED' , 'DISCARDED' ) AND sku_types = 0 AND total_quantity = 0 )), CONSTRAINT chk_ll_return_inventory_carton_status CHECK ( status IN ( 'AVAILABLE' , 'RELABEL_PENDING' , 'MERGED' , 'OUTBOUNDED' , 'DISCARD_PENDING' , 'DISCARDED' ))
2026-10-13 11:00:31 +08:00
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '退货实物库存箱及箱唛' ;
2026-10-08 15:55:47 +08:00
SET @ ll_return_carton_add_pallet = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_return_inventory_carton' AND column_name = 'pallet_code' ), 'SELECT 1' , 'ALTER TABLE ll_return_inventory_carton ADD COLUMN pallet_code VARCHAR(128) NULL COMMENT ''签收时绑定的托盘码'' AFTER source_batch_no' ));
2026-09-20 15:06:17 +08:00
PREPARE ll_return_carton_add_pallet_stmt FROM @ ll_return_carton_add_pallet ; EXECUTE ll_return_carton_add_pallet_stmt ; DEALLOCATE PREPARE ll_return_carton_add_pallet_stmt ;
2026-10-12 18:01:16 +08:00
SET @ ll_return_carton_add_original_packaging = ( SELECT IF ( COUNT ( * ) = 0 , 'ALTER TABLE ll_return_inventory_carton ADD COLUMN original_packaging TINYINT(1) NULL COMMENT ''是否使用原箱原包装'' AFTER weight' , 'SELECT 1' ) FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_return_inventory_carton' AND column_name = 'original_packaging' );
PREPARE ll_return_carton_add_original_packaging_stmt FROM @ ll_return_carton_add_original_packaging ; EXECUTE ll_return_carton_add_original_packaging_stmt ; DEALLOCATE PREPARE ll_return_carton_add_original_packaging_stmt ;
2026-09-09 12:02:12 +08:00
-- 已合箱的来源箱保留审计记录,但其箱内库存必须归零;动态 SQL 兼容 Spring 的数据库初始化器。
SET @ ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . table_constraints WHERE constraint_schema = DATABASE () AND table_name = 'll_return_inventory_carton' AND constraint_name = 'chk_ll_return_inventory_carton_quantity' ), 'ALTER TABLE ll_return_inventory_carton DROP CHECK chk_ll_return_inventory_carton_quantity' , 'SELECT 1' ));
PREPARE return_inventory_carton_check_drop_stmt FROM @ ddl ; EXECUTE return_inventory_carton_check_drop_stmt ; DEALLOCATE PREPARE return_inventory_carton_check_drop_stmt ;
2026-09-28 11:59:08 +08:00
ALTER TABLE ll_return_inventory_carton ADD CONSTRAINT chk_ll_return_inventory_carton_quantity CHECK (( status IN ( 'AVAILABLE' , 'RELABEL_PENDING' , 'OUTBOUNDED' , 'DISCARD_PENDING' ) AND sku_types > 0 AND total_quantity > 0 ) OR ( status IN ( 'MERGED' , 'DISCARDED' ) AND sku_types = 0 AND total_quantity = 0 ));
2026-09-09 13:41:24 +08:00
SET @ ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . table_constraints WHERE constraint_schema = DATABASE () AND table_name = 'll_return_inventory_carton' AND constraint_name = 'chk_ll_return_inventory_carton_status' ), 'ALTER TABLE ll_return_inventory_carton DROP CHECK chk_ll_return_inventory_carton_status' , 'SELECT 1' ));
PREPARE return_inventory_carton_status_drop_stmt FROM @ ddl ; EXECUTE return_inventory_carton_status_drop_stmt ; DEALLOCATE PREPARE return_inventory_carton_status_drop_stmt ;
2026-09-28 11:59:08 +08:00
ALTER TABLE ll_return_inventory_carton ADD CONSTRAINT chk_ll_return_inventory_carton_status CHECK ( status IN ( 'AVAILABLE' , 'RELABEL_PENDING' , 'MERGED' , 'OUTBOUNDED' , 'DISCARD_PENDING' , 'DISCARDED' ));
2026-09-09 12:02:12 +08:00
SET @ ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_return_inventory_carton' AND column_name = 'source_return_no' ), 'SELECT 1' , 'ALTER TABLE ll_return_inventory_carton ADD COLUMN source_return_no VARCHAR(2000) NULL COMMENT ''来源退货单号'' AFTER source_batch_no' ));
PREPARE return_inventory_carton_return_no_stmt FROM @ ddl ; EXECUTE return_inventory_carton_return_no_stmt ; DEALLOCATE PREPARE return_inventory_carton_return_no_stmt ;
2026-09-12 16:16:38 +08:00
ALTER TABLE ll_return_inventory_carton MODIFY COLUMN source_batch_no TEXT NULL COMMENT '实际消耗来源签收批次号,多个批次逗号分隔' , MODIFY COLUMN source_return_no TEXT NULL COMMENT '实际消耗来源退货单号,多个单号逗号分隔' ;
2026-09-09 12:02:12 +08:00
SET @ ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_return_inventory_carton' AND column_name = 'fba_carton_mark' ), 'SELECT 1' , 'ALTER TABLE ll_return_inventory_carton ADD COLUMN fba_carton_mark VARCHAR(255) NULL COMMENT ''FBA箱唛'' AFTER carton_mark' )); PREPARE stmt FROM @ ddl ; EXECUTE stmt ; DEALLOCATE PREPARE stmt ;
SET @ ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_return_inventory_carton' AND column_name = 'destination_warehouse_code' ), 'SELECT 1' , 'ALTER TABLE ll_return_inventory_carton ADD COLUMN destination_warehouse_code VARCHAR(128) NULL COMMENT ''目的仓编码'' AFTER fba_carton_mark' )); PREPARE stmt FROM @ ddl ; EXECUTE stmt ; DEALLOCATE PREPARE stmt ;
SET @ ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_return_inventory_carton' AND column_name = 'destination_warehouse_name' ), 'SELECT 1' , 'ALTER TABLE ll_return_inventory_carton ADD COLUMN destination_warehouse_name VARCHAR(255) NULL COMMENT ''目的仓名称'' AFTER destination_warehouse_code' )); PREPARE stmt FROM @ ddl ; EXECUTE stmt ; DEALLOCATE PREPARE stmt ;
SET @ ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_return_inventory_carton' AND column_name = 'relabel_application_id' ), 'SELECT 1' , 'ALTER TABLE ll_return_inventory_carton ADD COLUMN relabel_application_id BIGINT NULL COMMENT ''绑定换标申请单ID'' AFTER destination_warehouse_name' )); PREPARE stmt FROM @ ddl ; EXECUTE stmt ; DEALLOCATE PREPARE stmt ;
SET @ ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_return_inventory_carton' AND column_name = 'relabel_no' ), 'SELECT 1' , 'ALTER TABLE ll_return_inventory_carton ADD COLUMN relabel_no VARCHAR(64) NULL COMMENT ''绑定换标单号'' AFTER relabel_application_id' )); PREPARE stmt FROM @ ddl ; EXECUTE stmt ; DEALLOCATE PREPARE stmt ;
SET @ ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_return_inventory_carton' AND column_name = 'relabel_status' ), 'SELECT 1' , 'ALTER TABLE ll_return_inventory_carton ADD COLUMN relabel_status VARCHAR(32) NULL COMMENT ''换标状态'' AFTER relabel_no' )); PREPARE stmt FROM @ ddl ; EXECUTE stmt ; DEALLOCATE PREPARE stmt ;
SET @ ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_return_inventory_carton' AND column_name = 'relabel_completed_at' ), 'SELECT 1' , 'ALTER TABLE ll_return_inventory_carton ADD COLUMN relabel_completed_at DATETIME(3) NULL COMMENT ''换标完成时间'' AFTER relabel_status' )); PREPARE stmt FROM @ ddl ; EXECUTE stmt ; DEALLOCATE PREPARE stmt ;
CREATE TABLE IF NOT EXISTS ll_return_inventory_carton_item (
2026-10-13 11:00:31 +08:00
id BIGINT NOT NULL COMMENT '退货库存箱SKU明细ID' , carton_id BIGINT NOT NULL COMMENT '退货库存箱ID' , customer_id VARCHAR ( 128 ) NOT NULL COMMENT '客户ID和隔离键' , sku_code VARCHAR ( 128 ) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'SKU编码' , product_name_zh VARCHAR ( 255 ) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL COMMENT '中文品名' , quantity BIGINT NOT NULL COMMENT '该SKU箱内数量' ,
2026-10-15 15:42:10 +08:00
PRIMARY KEY ( id ), UNIQUE KEY uk_ll_return_inventory_carton_item ( carton_id , sku_code ), KEY idx_ll_return_inventory_carton_item_customer ( customer_id , sku_code ), CONSTRAINT chk_ll_return_inventory_carton_item_quantity CHECK ( quantity >= 0 )
2026-10-13 11:00:31 +08:00
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '退货库存箱内SKU和数量' ;
2026-10-02 17:47:11 +08:00
-- 退货出库按SKU固化扣减前后快照,与PDA拣货同事务提交;不修改历史箱内容。
CREATE TABLE IF NOT EXISTS ll_return_inventory_outbound_movement (
id BIGINT NOT NULL COMMENT '退货出库SKU流水ID' ,
outbound_pick_id BIGINT NOT NULL COMMENT '同事务PDA出库拣货记录ID' ,
2026-10-13 11:00:31 +08:00
customer_id VARCHAR ( 128 ) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '库存所属客户ID和隔离键' ,
overseas_warehouse_id VARCHAR ( 128 ) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '实际出库海外仓ID' ,
2026-10-02 17:47:11 +08:00
carton_id BIGINT NOT NULL COMMENT '真实退货库存箱ID' ,
carton_mark VARCHAR ( 128 ) NOT NULL COMMENT '冻结的真实退货箱业务码' ,
2026-10-13 11:00:31 +08:00
outbound_no VARCHAR ( 64 ) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '本次退货出库业务单号' ,
sku_code VARCHAR ( 128 ) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '本次出库SKU编码快照' ,
product_name_zh VARCHAR ( 255 ) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL COMMENT '中文品名快照' ,
2026-10-02 17:47:11 +08:00
quantity BIGINT NOT NULL COMMENT '本箱该SKU实际出库件数,始终为正' ,
total_before BIGINT NOT NULL COMMENT '客户仓SKU出库前实物总数量' ,
total_after BIGINT NOT NULL COMMENT '客户仓SKU出库后实物总数量' ,
available_before BIGINT NOT NULL COMMENT '客户仓SKU出库前可用数量' ,
available_after BIGINT NOT NULL COMMENT '客户仓SKU出库后可用数量' ,
cartons_before BIGINT NOT NULL COMMENT '客户仓包含该SKU的出库前可用箱数' ,
cartons_after BIGINT NOT NULL COMMENT '客户仓包含该SKU的出库后可用箱数' ,
occurred_at DATETIME ( 3 ) NOT NULL COMMENT '出库记账时间' ,
PRIMARY KEY ( id ),
UNIQUE KEY uk_ll_return_outbound_pick_sku ( outbound_pick_id , sku_code ),
2026-10-10 13:48:25 +08:00
KEY idx_ll_return_outbound_carton_sku ( customer_id , carton_id , sku_code ),
2026-10-02 17:47:11 +08:00
KEY idx_ll_return_outbound_movement_query ( customer_id , overseas_warehouse_id , sku_code , occurred_at ),
CONSTRAINT chk_ll_return_outbound_movement_delta CHECK ( quantity > 0 AND total_after >= 0 AND available_after >= 0
AND total_before - total_after = quantity AND available_before - available_after = quantity
2026-10-10 13:48:25 +08:00
AND cartons_after >= 0 AND cartons_before - cartons_after IN ( 0 , 1 ) AND total_after >= available_after )
2026-10-13 11:00:31 +08:00
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '不可变退货出库SKU库存流水' ;
2026-10-02 17:47:11 +08:00
2026-09-09 12:02:12 +08:00
CREATE TABLE IF NOT EXISTS ll_return_inventory_balance (
id BIGINT NOT NULL COMMENT '退货库存余额ID' , customer_id VARCHAR ( 128 ) NOT NULL COMMENT '客户ID和隔离键' , overseas_warehouse_id VARCHAR ( 128 ) NOT NULL COMMENT '海外仓ID' , sku_code VARCHAR ( 128 ) NOT NULL COMMENT 'SKU编码' , product_name_zh VARCHAR ( 255 ) NULL COMMENT '中文品名' , total_quantity BIGINT NOT NULL DEFAULT 0 COMMENT '实物总库存,仅实际出库扣减' , available_quantity BIGINT NOT NULL COMMENT '未合箱可用上架数量' , carton_quantity BIGINT NOT NULL COMMENT '包含该SKU的可用箱数' , created_at DATETIME ( 3 ) NOT NULL COMMENT '创建时间' , updated_at DATETIME ( 3 ) NOT NULL COMMENT '最后更新时间' ,
PRIMARY KEY ( id ), UNIQUE KEY uk_ll_return_inventory_balance ( customer_id , overseas_warehouse_id , sku_code ), CONSTRAINT chk_ll_return_inventory_balance_quantity CHECK ( total_quantity >= available_quantity AND available_quantity >= 0 AND carton_quantity >= 0 )
) ENGINE = InnoDB COMMENT = '退货库存按客户海外仓SKU汇总余额' ;
SET @ ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_return_inventory_balance' AND column_name = 'total_quantity' ), 'SELECT 1' , 'ALTER TABLE ll_return_inventory_balance ADD COLUMN total_quantity BIGINT NULL COMMENT ''实物总库存,仅实际出库扣减'' AFTER product_name_zh' ));
PREPARE return_inventory_balance_total_stmt FROM @ ddl ; EXECUTE return_inventory_balance_total_stmt ; DEALLOCATE PREPARE return_inventory_balance_total_stmt ;
-- 旧数据的可用量原先包含已合箱库存;升级时一次性拆分为总库存和未合箱可用库存。
UPDATE ll_return_inventory_balance b LEFT JOIN ( SELECT c . customer_id , c . overseas_warehouse_id , i . sku_code , SUM ( i . quantity ) merged_quantity FROM ll_return_inventory_carton c JOIN ll_return_inventory_carton_item i ON i . carton_id = c . id WHERE c . source_batch_no = 'MERGED' GROUP BY c . customer_id , c . overseas_warehouse_id , i . sku_code ) m ON m . customer_id = b . customer_id AND m . overseas_warehouse_id = b . overseas_warehouse_id AND m . sku_code = b . sku_code SET b . total_quantity = b . available_quantity , b . available_quantity = GREATEST ( 0 , b . available_quantity - COALESCE ( m . merged_quantity , 0 )) WHERE b . total_quantity IS NULL ;
ALTER TABLE ll_return_inventory_balance MODIFY COLUMN total_quantity BIGINT NOT NULL DEFAULT 0 COMMENT '实物总库存,仅实际出库扣减' ;
CREATE TABLE IF NOT EXISTS ll_return_inventory_operation (
id BIGINT NOT NULL COMMENT '退货库存PDA操作ID' , operator_id VARCHAR ( 128 ) NOT NULL COMMENT 'PDA操作人ID' , idempotency_key VARCHAR ( 255 ) NOT NULL COMMENT '操作幂等键' , request_hash CHAR ( 64 ) NOT NULL COMMENT '请求内容SHA-256' , operation_type VARCHAR ( 32 ) NOT NULL COMMENT '操作类型,当前MERGE' , result_carton_id BIGINT NULL COMMENT '合箱结果退货库存箱ID' , created_at DATETIME ( 3 ) NOT NULL COMMENT '创建时间' , updated_at DATETIME ( 3 ) NOT NULL COMMENT '最后更新时间' ,
PRIMARY KEY ( id ), UNIQUE KEY uk_ll_return_inventory_operation_operator_key ( operator_id , idempotency_key ), KEY idx_ll_return_inventory_operation_result ( result_carton_id )
) ENGINE = InnoDB COMMENT = '退货库存PDA合箱幂等操作审计' ;
2026-09-15 13:36:58 +08:00
CREATE TABLE IF NOT EXISTS ll_container_loading_evidence (
id BIGINT NOT NULL COMMENT '海外整柜装柜照片投影ID' ,
source_container_booking_id VARCHAR ( 128 ) NOT NULL COMMENT '国内稳定来源柜预订ID' ,
evidence_type VARCHAR ( 32 ) NOT NULL COMMENT 'PHOTO_STEP_1至PHOTO_STEP_4或SEAL' ,
source_file_id BIGINT NOT NULL COMMENT '国内File服务文件ID' ,
file_name VARCHAR ( 255 ) NOT NULL COMMENT '国内文件名快照' ,
created_at DATETIME ( 3 ) NOT NULL COMMENT '投影创建时间' ,
PRIMARY KEY ( id ),
UNIQUE KEY uk_ll_container_loading_evidence_type ( source_container_booking_id , evidence_type ),
UNIQUE KEY uk_ll_container_loading_evidence_file ( source_container_booking_id , source_file_id )
) ENGINE = InnoDB COMMENT = '海外拆柜只读国内装柜照片引用' ;
2026-09-20 15:06:17 +08:00
SET @ ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_return_order' AND column_name = 'discrepancy_reason' ), 'SELECT 1' , 'ALTER TABLE ll_return_order ADD COLUMN discrepancy_reason VARCHAR(500) NULL COMMENT ''手动完结差异原因'' AFTER remark' ));
PREPARE ll_return_order_discrepancy_stmt FROM @ ddl ; EXECUTE ll_return_order_discrepancy_stmt ; DEALLOCATE PREPARE ll_return_order_discrepancy_stmt ;
SET @ ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_return_order' AND column_name = 'manually_completed_at' ), 'SELECT 1' , 'ALTER TABLE ll_return_order ADD COLUMN manually_completed_at DATETIME(3) NULL COMMENT ''手动差异完结时间'' AFTER discrepancy_reason' ));
PREPARE ll_return_order_manual_completed_stmt FROM @ ddl ; EXECUTE ll_return_order_manual_completed_stmt ; DEALLOCATE PREPARE ll_return_order_manual_completed_stmt ;
2026-09-29 18:47:37 +08:00
CREATE TABLE IF NOT EXISTS event_delivery_retry_audit (
request_id VARCHAR ( 36 ) NOT NULL COMMENT '人工重试请求UUID和幂等键' ,
producer_table VARCHAR ( 64 ) NOT NULL COMMENT '本服务发件箱表名' ,
entry_id VARCHAR ( 64 ) NOT NULL COMMENT '发件箱记录主键' ,
event_id VARCHAR ( 128 ) NOT NULL COMMENT '原事件全局标识' ,
event_type VARCHAR ( 64 ) NOT NULL COMMENT '原事件类型' ,
payload_hash VARCHAR ( 71 ) NOT NULL COMMENT '原事件不可变负载摘要' ,
operator_name VARCHAR ( 128 ) NOT NULL COMMENT '持有运维凭据的操作人标识' ,
reason VARCHAR ( 500 ) NOT NULL COMMENT '人工重试原因' ,
previous_failures INT NOT NULL COMMENT '重试前累计失败次数' ,
previous_error VARCHAR ( 1000 ) NULL COMMENT '重试前最后一次脱敏错误' ,
requested_at DATETIME ( 3 ) NOT NULL COMMENT '重试申请提交时间' ,
PRIMARY KEY ( request_id ),
KEY idx_event_retry_entry ( producer_table , entry_id , requested_at ),
KEY idx_event_retry_event ( event_id , requested_at )
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT = '业务事件人工重试审计,与恢复待发送状态同事务提交' ;
CREATE TABLE IF NOT EXISTS event_delivery_attempt (
attempt_id VARCHAR ( 36 ) NOT NULL COMMENT '本次投递租约UUID和审计主键' ,
service_name VARCHAR ( 32 ) NOT NULL COMMENT '本库所属生产服务' ,
event_type VARCHAR ( 96 ) NOT NULL COMMENT '白名单业务事件类型' ,
entry_id VARCHAR ( 128 ) NOT NULL COMMENT '生产者发件箱主键' ,
event_id VARCHAR ( 128 ) NULL COMMENT '合法原事件UUID或ULID;格式错误时为空' ,
target_name VARCHAR ( 64 ) NOT NULL COMMENT '固定目标业务服务' ,
started_at DATETIME ( 3 ) NOT NULL COMMENT '领取及审计事务提交前的开始时间' ,
finished_at DATETIME ( 3 ) NULL COMMENT '尝试完成或租约过期恢复时间' ,
duration_ms BIGINT NULL COMMENT '尝试耗时毫秒' ,
outcome VARCHAR ( 24 ) NOT NULL COMMENT 'STARTED/APPLIED/DUPLICATE/STALE/RETRY/DEAD/LEASE_EXPIRED' ,
error_code VARCHAR ( 64 ) NULL COMMENT '有限错误类别或HTTP状态;不含载荷与令牌' ,
next_retry_at DATETIME ( 3 ) NULL COMMENT '本次失败后下次计划投递时间' ,
PRIMARY KEY ( attempt_id ),
KEY idx_delivery_attempt_entry ( service_name , entry_id , started_at ),
KEY idx_delivery_attempt_outcome ( outcome , started_at )
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT = '本服务业务事件逐次投递审计' ;
2026-10-08 15:55:47 +08:00
-- 2026-10-08 退货合箱精确预占、来源追溯与箱级上架;MySQL 8,可重复执行。
SET @ return_packing_ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . statistics WHERE table_schema = DATABASE () AND table_name = 'll_return_inventory_carton' AND index_name = 'uk_ll_return_inventory_carton_receipt' ), 'ALTER TABLE ll_return_inventory_carton DROP INDEX uk_ll_return_inventory_carton_receipt' , 'SELECT 1' ));
PREPARE return_packing_stmt FROM @ return_packing_ddl ; EXECUTE return_packing_stmt ; DEALLOCATE PREPARE return_packing_stmt ;
SET @ return_packing_ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_return_receipt' AND column_name = 'unit_type' ), 'SELECT 1' , 'ALTER TABLE ll_return_receipt ADD COLUMN unit_type VARCHAR(16) NULL COMMENT ''签收类型 PALLET/BOX/PARCEL''' ));
PREPARE return_packing_stmt FROM @ return_packing_ddl ; EXECUTE return_packing_stmt ; DEALLOCATE PREPARE return_packing_stmt ;
SET @ return_packing_ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_return_receipt' AND column_name = 'unit_code' ), 'SELECT 1' , 'ALTER TABLE ll_return_receipt ADD COLUMN unit_code VARCHAR(128) NULL COMMENT ''签收单元业务码''' ));
PREPARE return_packing_stmt FROM @ return_packing_ddl ; EXECUTE return_packing_stmt ; DEALLOCATE PREPARE return_packing_stmt ;
SET @ return_packing_ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_return_receipt' AND column_name = 'total_box_count' ), 'SELECT 1' , 'ALTER TABLE ll_return_receipt ADD COLUMN total_box_count BIGINT NULL COMMENT ''签收SKU箱数汇总''' ));
PREPARE return_packing_stmt FROM @ return_packing_ddl ; EXECUTE return_packing_stmt ; DEALLOCATE PREPARE return_packing_stmt ;
SET @ return_packing_ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_return_receipt' AND column_name = 'length' ), 'SELECT 1' , 'ALTER TABLE ll_return_receipt ADD COLUMN length DECIMAL(12,3) NULL COMMENT ''实测尺寸cm''' ));
PREPARE return_packing_stmt FROM @ return_packing_ddl ; EXECUTE return_packing_stmt ; DEALLOCATE PREPARE return_packing_stmt ;
SET @ return_packing_ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_return_receipt' AND column_name = 'width' ), 'SELECT 1' , 'ALTER TABLE ll_return_receipt ADD COLUMN width DECIMAL(12,3) NULL COMMENT ''实测尺寸cm''' ));
PREPARE return_packing_stmt FROM @ return_packing_ddl ; EXECUTE return_packing_stmt ; DEALLOCATE PREPARE return_packing_stmt ;
SET @ return_packing_ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_return_receipt' AND column_name = 'height' ), 'SELECT 1' , 'ALTER TABLE ll_return_receipt ADD COLUMN height DECIMAL(12,3) NULL COMMENT ''实测尺寸cm''' ));
PREPARE return_packing_stmt FROM @ return_packing_ddl ; EXECUTE return_packing_stmt ; DEALLOCATE PREPARE return_packing_stmt ;
SET @ return_packing_ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_return_receipt' AND column_name = 'weight' ), 'SELECT 1' , 'ALTER TABLE ll_return_receipt ADD COLUMN weight DECIMAL(12,3) NULL COMMENT ''实测重量kg''' ));
PREPARE return_packing_stmt FROM @ return_packing_ddl ; EXECUTE return_packing_stmt ; DEALLOCATE PREPARE return_packing_stmt ;
SET @ return_packing_ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_return_receipt_item' AND column_name = 'box_count' ), 'SELECT 1' , 'ALTER TABLE ll_return_receipt_item ADD COLUMN box_count BIGINT NULL COMMENT ''SKU签收箱数''' ));
PREPARE return_packing_stmt FROM @ return_packing_ddl ; EXECUTE return_packing_stmt ; DEALLOCATE PREPARE return_packing_stmt ;
SET @ return_packing_ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_return_inventory_carton' AND column_name = 'source_unit_code' ), 'SELECT 1' , 'ALTER TABLE ll_return_inventory_carton ADD COLUMN source_unit_code VARCHAR(128) NULL COMMENT ''来源单元业务码''' ));
PREPARE return_packing_stmt FROM @ return_packing_ddl ; EXECUTE return_packing_stmt ; DEALLOCATE PREPARE return_packing_stmt ;
CREATE TABLE IF NOT EXISTS ll_return_packing_plan (
id BIGINT NOT NULL COMMENT '合箱计划ID' , plan_no VARCHAR ( 128 ) NOT NULL COMMENT '计划业务号' ,
customer_id VARCHAR ( 128 ) NOT NULL COMMENT '客户隔离键' , overseas_warehouse_id VARCHAR ( 128 ) NOT NULL COMMENT '海外仓ID' ,
return_nos_json JSON NOT NULL COMMENT '来源退货单范围' , boxes_json JSON NOT NULL COMMENT '目标箱明细' ,
mode VARCHAR ( 32 ) NOT NULL COMMENT 'SKU散件或BOX箱合并' , status VARCHAR ( 32 ) NOT NULL COMMENT 'PENDING_REVIEW待审 READY已推送 COMPLETED完成 CANCELLED取消' ,
remark VARCHAR ( 1000 ) NULL COMMENT '合箱备注' , idempotency_key VARCHAR ( 255 ) NOT NULL COMMENT '创建幂等键' ,
created_at DATETIME ( 3 ) NOT NULL COMMENT '创建时间' , updated_at DATETIME ( 3 ) NOT NULL COMMENT '更新时间' ,
pushed_at DATETIME ( 3 ) NULL COMMENT '审核推送时间' , completed_at DATETIME ( 3 ) NULL COMMENT '作业完成时间' ,
PRIMARY KEY ( id ), UNIQUE KEY uk_ll_return_packing_plan_no ( plan_no ),
UNIQUE KEY uk_ll_return_packing_plan_key ( customer_id , idempotency_key ),
KEY idx_ll_return_packing_plan_warehouse ( overseas_warehouse_id , status , pushed_at )
) ENGINE = InnoDB COMMENT = '退货合箱计划' ;
SET @ return_packing_ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_return_inventory_carton_item' AND column_name = 'packing_reserved_quantity' ), 'SELECT 1' , 'ALTER TABLE ll_return_inventory_carton_item ADD COLUMN packing_reserved_quantity BIGINT NOT NULL DEFAULT 0 COMMENT ''合箱计划预占件数''' ));
PREPARE return_packing_stmt FROM @ return_packing_ddl ; EXECUTE return_packing_stmt ; DEALLOCATE PREPARE return_packing_stmt ;
SET @ return_packing_ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_return_packing_plan' AND column_name = 'source_items_json' ), 'SELECT 1' , 'ALTER TABLE ll_return_packing_plan ADD COLUMN source_items_json JSON NULL COMMENT ''精确来源箱和SKU锁定数量''' ));
PREPARE return_packing_stmt FROM @ return_packing_ddl ; EXECUTE return_packing_stmt ; DEALLOCATE PREPARE return_packing_stmt ;
SET @ return_packing_ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_return_packing_plan' AND column_name = 'result_marks_json' ), 'SELECT 1' , 'ALTER TABLE ll_return_packing_plan ADD COLUMN result_marks_json JSON NULL COMMENT ''完成生成或并入的目标箱唛''' ));
PREPARE return_packing_stmt FROM @ return_packing_ddl ; EXECUTE return_packing_stmt ; DEALLOCATE PREPARE return_packing_stmt ;
SET @ return_packing_ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_return_packing_plan' AND column_name = 'request_hash' ), 'SELECT 1' , 'ALTER TABLE ll_return_packing_plan ADD COLUMN request_hash VARCHAR(64) NULL COMMENT ''创建载荷摘要''' ));
PREPARE return_packing_stmt FROM @ return_packing_ddl ; EXECUTE return_packing_stmt ; DEALLOCATE PREPARE return_packing_stmt ;
SET @ return_packing_ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_return_packing_plan' AND column_name = 'completion_hash' ), 'SELECT 1' , 'ALTER TABLE ll_return_packing_plan ADD COLUMN completion_hash VARCHAR(64) NULL COMMENT ''完成载荷摘要''' ));
PREPARE return_packing_stmt FROM @ return_packing_ddl ; EXECUTE return_packing_stmt ; DEALLOCATE PREPARE return_packing_stmt ;
SET @ return_packing_ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_return_inventory_carton' AND column_name = 'location_code' ), 'SELECT 1' , 'ALTER TABLE ll_return_inventory_carton ADD COLUMN location_code VARCHAR(128) NULL COMMENT ''退货箱当前库位''' ));
PREPARE return_packing_stmt FROM @ return_packing_ddl ; EXECUTE return_packing_stmt ; DEALLOCATE PREPARE return_packing_stmt ;
SET @ return_packing_ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_return_inventory_carton' AND column_name = 'putaway_at' ), 'SELECT 1' , 'ALTER TABLE ll_return_inventory_carton ADD COLUMN putaway_at DATETIME(3) NULL COMMENT ''退货箱上架时间''' ));
PREPARE return_packing_stmt FROM @ return_packing_ddl ; EXECUTE return_packing_stmt ; DEALLOCATE PREPARE return_packing_stmt ;
SET @ return_packing_ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_return_inventory_carton' AND column_name = 'source_unit_type' ), 'SELECT 1' , 'ALTER TABLE ll_return_inventory_carton ADD COLUMN source_unit_type VARCHAR(32) NULL COMMENT ''PALLET或BOX实物箱 PARCEL散SKU''' ));
PREPARE return_packing_stmt FROM @ return_packing_ddl ; EXECUTE return_packing_stmt ; DEALLOCATE PREPARE return_packing_stmt ;
SET @ return_packing_ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . table_constraints WHERE constraint_schema = DATABASE () AND table_name = 'll_return_inventory_carton' AND constraint_name = 'chk_ll_return_inventory_carton_quantity' ), 'ALTER TABLE ll_return_inventory_carton DROP CHECK chk_ll_return_inventory_carton_quantity' , 'SELECT 1' ));
PREPARE return_packing_stmt FROM @ return_packing_ddl ; EXECUTE return_packing_stmt ; DEALLOCATE PREPARE return_packing_stmt ;
SET @ return_packing_ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . table_constraints WHERE constraint_schema = DATABASE () AND table_name = 'll_return_inventory_carton' AND constraint_name = 'chk_ll_return_inventory_carton_status' ), 'ALTER TABLE ll_return_inventory_carton DROP CHECK chk_ll_return_inventory_carton_status' , 'SELECT 1' ));
PREPARE return_packing_stmt FROM @ return_packing_ddl ; EXECUTE return_packing_stmt ; DEALLOCATE PREPARE return_packing_stmt ;
ALTER TABLE ll_return_inventory_carton ADD CONSTRAINT chk_ll_return_inventory_carton_quantity CHECK (( status IN ( 'AVAILABLE' , 'PACKING_RESERVED' , 'RELABEL_PENDING' , 'OUTBOUND_PENDING' , 'OUTBOUNDED' , 'DISCARD_PENDING' ) AND sku_types > 0 AND total_quantity > 0 ) OR ( status IN ( 'MERGED' , 'DISCARDED' ) AND sku_types = 0 AND total_quantity = 0 ));
ALTER TABLE ll_return_inventory_carton ADD CONSTRAINT chk_ll_return_inventory_carton_status CHECK ( status IN ( 'AVAILABLE' , 'PACKING_RESERVED' , 'RELABEL_PENDING' , 'OUTBOUND_PENDING' , 'MERGED' , 'OUTBOUNDED' , 'DISCARD_PENDING' , 'DISCARDED' ));
CREATE TABLE IF NOT EXISTS ll_return_packing_trace (
id BIGINT NOT NULL COMMENT '合箱追溯ID' , customer_id VARCHAR ( 128 ) NOT NULL COMMENT '原客户隔离键' ,
operation_id BIGINT NOT NULL COMMENT '合箱操作ID' , source_carton_mark VARCHAR ( 128 ) NOT NULL COMMENT '来源箱唛 空值表示目标箱原有库存快照' ,
target_carton_mark VARCHAR ( 128 ) NOT NULL COMMENT '目标箱唛' , return_no VARCHAR ( 128 ) NOT NULL COMMENT '原始退货单号' ,
sku_code VARCHAR ( 128 ) NOT NULL COMMENT '商品SKU编码' , quantity BIGINT NOT NULL COMMENT '本次移动件数' ,
created_at DATETIME ( 3 ) NOT NULL COMMENT '发生时间' , PRIMARY KEY ( id ),
KEY idx_return_packing_trace_order ( customer_id , return_no , created_at ),
KEY idx_return_packing_trace_target ( customer_id , target_carton_mark , sku_code ),
KEY idx_return_packing_trace_source ( customer_id , source_carton_mark , sku_code ),
CONSTRAINT chk_return_packing_trace_quantity CHECK ( quantity > 0 )
) ENGINE = InnoDB COMMENT = '退货合箱逐SKU原始退货单不可变追溯' ;
ALTER TABLE ll_return_packing_trace MODIFY COLUMN sku_code VARCHAR ( 128 ) NOT NULL COMMENT '商品SKU编码' ;
SET @ return_packing_ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_return_inventory_operation' AND column_name = 'result_json' ), 'SELECT 1' , 'ALTER TABLE ll_return_inventory_operation ADD COLUMN result_json JSON NULL COMMENT ''幂等操作不可变返回快照''' ));
PREPARE return_packing_stmt FROM @ return_packing_ddl ; EXECUTE return_packing_stmt ; DEALLOCATE PREPARE return_packing_stmt ;
SET @ return_packing_ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_return_packing_plan' AND column_name = 'result_labels_json' ), 'SELECT 1' , 'ALTER TABLE ll_return_packing_plan ADD COLUMN result_labels_json JSON NULL COMMENT ''计划完工标签快照''' ));
PREPARE return_packing_stmt FROM @ return_packing_ddl ; EXECUTE return_packing_stmt ; DEALLOCATE PREPARE return_packing_stmt ;
-- Existing outbound tables need this field even when created before the fee snapshot baseline.
USE baiyue_lastleg ;
SET @ return_outbound_ddl = IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_outbound_order' AND column_name = 'fee_coverage_json' ), 'SELECT 1' , 'ALTER TABLE ll_outbound_order ADD COLUMN fee_coverage_json JSON NULL COMMENT ''发运原费用及服务覆盖确认快照''' );
PREPARE return_outbound_stmt FROM @ return_outbound_ddl ;
EXECUTE return_outbound_stmt ;
DEALLOCATE PREPARE return_outbound_stmt ;
2026-10-09 15:20:15 +08:00
-- 退货托盘签收箱内清点;MySQL 8;仅在目标尾程库执行,可重复运行。
USE baiyue_lastleg ;
SET @ rc_count_ddl = IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_return_inventory_carton' AND column_name = 'count_status' ), 'SELECT 1' , 'ALTER TABLE ll_return_inventory_carton ADD COLUMN count_status VARCHAR(16) NOT NULL DEFAULT ''CONFIRMED'' COMMENT ''箱内清点状态 PENDING待清点 CONFIRMED已确认''' );
PREPARE rc_count_stmt FROM @ rc_count_ddl ; EXECUTE rc_count_stmt ; DEALLOCATE PREPARE rc_count_stmt ;
SET @ rc_count_ddl = IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_return_inventory_carton' AND column_name = 'counted_at' ), 'SELECT 1' , 'ALTER TABLE ll_return_inventory_carton ADD COLUMN counted_at DATETIME(3) NULL COMMENT ''箱内清点确认时间''' );
PREPARE rc_count_stmt FROM @ rc_count_ddl ; EXECUTE rc_count_stmt ; DEALLOCATE PREPARE rc_count_stmt ;
SET @ rc_count_ddl = IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_return_inventory_carton' AND column_name = 'counted_by' ), 'SELECT 1' , 'ALTER TABLE ll_return_inventory_carton ADD COLUMN counted_by VARCHAR(128) NULL COMMENT ''箱内清点确认操作人''' );
PREPARE rc_count_stmt FROM @ rc_count_ddl ; EXECUTE rc_count_stmt ; DEALLOCATE PREPARE rc_count_stmt ;
SET @ rc_count_ddl = IF ( EXISTS ( SELECT 1 FROM information_schema . statistics WHERE table_schema = DATABASE () AND table_name = 'll_return_inventory_carton' AND index_name = 'idx_ll_return_count' ), 'SELECT 1' , 'CREATE INDEX idx_ll_return_count ON ll_return_inventory_carton(overseas_warehouse_id,count_status,status,source_receipt_id)' );
PREPARE rc_count_stmt FROM @ rc_count_ddl ; EXECUTE rc_count_stmt ; DEALLOCATE PREPARE rc_count_stmt ;
-- 历史箱:只迁移整批仍可用、没有换标/合箱占用、未确认清点的托盘签收箱。
-- 已进入履约或合箱的批次不回退;后续需要逐批人工核实。
UPDATE ll_return_inventory_carton c
JOIN ( SELECT source_receipt_id FROM ( SELECT a . source_receipt_id
FROM ll_return_inventory_carton a WHERE a . source_receipt_id IS NOT NULL AND a . source_unit_type = 'PALLET'
GROUP BY a . source_receipt_id
HAVING SUM ( a . status <> 'AVAILABLE' OR a . relabel_application_id IS NOT NULL OR a . relabel_no IS NOT NULL OR a . counted_at IS NOT NULL ) = 0
AND SUM ( EXISTS ( SELECT 1 FROM ll_return_inventory_carton_item i WHERE i . carton_id = a . id AND COALESCE ( i . packing_reserved_quantity , 0 ) > 0 )) = 0
AND SUM ( EXISTS ( SELECT 1 FROM ll_return_packing_trace t WHERE t . source_carton_mark = a . carton_mark OR t . target_carton_mark = a . carton_mark )) = 0
) pending ) p ON p . source_receipt_id = c . source_receipt_id
SET c . count_status = 'PENDING' WHERE c . source_unit_type = 'PALLET' AND c . counted_at IS NULL ;
-- 退货箱内清点作业会话:每位操作员只能认领一个批次,每个批次只能被一人认领。
CREATE TABLE IF NOT EXISTS ll_return_carton_count_session (
operator_id VARCHAR ( 128 ) NOT NULL COMMENT '平台PDA操作员标识' ,
warehouse_id VARCHAR ( 128 ) NOT NULL COMMENT '认领时绑定海外仓标识' ,
receipt_id BIGINT NULL COMMENT '正在清点的签收批次,完成后释放为NULL' ,
started_at DATETIME ( 3 ) NULL COMMENT '本次开始清点时间' ,
created_at DATETIME ( 3 ) NOT NULL COMMENT '会话创建时间' ,
updated_at DATETIME ( 3 ) NOT NULL COMMENT '会话更新时间' ,
PRIMARY KEY ( operator_id ),
UNIQUE KEY uk_ll_return_count_session_receipt ( receipt_id )
) ENGINE = InnoDB COMMENT = '退货箱内清点单人单任务持久会话' ;
2026-10-10 02:19:38 +08:00
2026-10-10 13:48:25 +08:00
-- 退货单 SKU 按件数出库快照。目标库:baiyue_lastleg。可重复执行。
SET @ return_sku_quantity_ddl = IF (
EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE ()
AND table_name = 'll_outbound_pallet_item' AND column_name = 'return_sku_quantity' ),
'SELECT 1' ,
'ALTER TABLE ll_outbound_pallet_item ADD COLUMN return_sku_quantity BIGINT NULL COMMENT ''退货单SKU本来源计划出库件数快照,NULL为历史整箱出库'' AFTER sku_code'
);
PREPARE return_sku_quantity_stmt FROM @ return_sku_quantity_ddl ;
EXECUTE return_sku_quantity_stmt ;
DEALLOCATE PREPARE return_sku_quantity_stmt ;
-- 部分出库仅扣件数;整箱扣一箱,保留守恒和非负约束。
SET @ return_sku_check_ddl = IF ( EXISTS ( SELECT 1 FROM information_schema . table_constraints WHERE constraint_schema = DATABASE () AND table_name = 'll_return_inventory_outbound_movement' AND constraint_name = 'chk_ll_return_outbound_movement_delta' ), 'ALTER TABLE ll_return_inventory_outbound_movement DROP CHECK chk_ll_return_outbound_movement_delta, ADD CONSTRAINT chk_ll_return_outbound_movement_delta CHECK(quantity>0 AND total_after>=0 AND available_after>=0 AND total_before-total_after=quantity AND available_before-available_after=quantity AND cartons_after>=0 AND cartons_before-cartons_after IN (0,1) AND total_after>=available_after)' , 'ALTER TABLE ll_return_inventory_outbound_movement ADD CONSTRAINT chk_ll_return_outbound_movement_delta CHECK(quantity>0 AND total_after>=0 AND available_after>=0 AND total_before-total_after=quantity AND available_before-available_after=quantity AND cartons_after>=0 AND cartons_before-cartons_after IN (0,1) AND total_after>=available_after)' );
PREPARE return_sku_check_stmt FROM @ return_sku_check_ddl ;
EXECUTE return_sku_check_stmt ;
DEALLOCATE PREPARE return_sku_check_stmt ;
-- 同箱余数允许再次出库,防重仍由拣货ID+SKU唯一索引保证。
SET @ return_sku_index_ddl = IF ( EXISTS ( SELECT 1 FROM information_schema . statistics WHERE table_schema = DATABASE () AND table_name = 'll_return_inventory_outbound_movement' AND index_name = 'uk_ll_return_outbound_carton_sku' ), 'ALTER TABLE ll_return_inventory_outbound_movement DROP INDEX uk_ll_return_outbound_carton_sku, ADD INDEX idx_ll_return_outbound_carton_sku(customer_id,carton_id,sku_code)' , 'SELECT 1' );
PREPARE return_sku_index_stmt FROM @ return_sku_index_ddl ;
EXECUTE return_sku_index_stmt ;
DEALLOCATE PREPARE return_sku_index_stmt ;
2026-10-10 02:19:38 +08:00
CREATE TABLE IF NOT EXISTS ll_procurement_wallet_attempt (
id BIGINT NOT NULL COMMENT '请求尝试ID' ,
order_id BIGINT NOT NULL COMMENT '采购订单ID' ,
customer_id VARCHAR ( 128 ) NOT NULL COMMENT '客户隔离键' ,
fee_id BIGINT NOT NULL COMMENT '不可变费用版本ID' ,
attempt_no BIGINT NOT NULL COMMENT '费用版本内请求序号' ,
operation VARCHAR ( 32 ) NOT NULL COMMENT '资金操作:FREEZE冻结、SETTLE结算、SETTLE_ACTUAL实际结算、RELEASE释放、REFUND退款' ,
business_no VARCHAR ( 128 ) NOT NULL COMMENT 'Finance资金业务号' ,
amount DECIMAL ( 20 , 2 ) NULL COMMENT '请求金额;全额结算或释放可空' ,
command_event_id VARCHAR ( 64 ) NOT NULL COMMENT '资金指令事件唯一引用' ,
status VARCHAR ( 16 ) NOT NULL COMMENT '资金请求结果:PENDING未决、SUCCEEDED成功、FAILED明确失败' ,
result_hash CHAR ( 64 ) NULL COMMENT '原业务回执摘要' ,
wallet_hold_id VARCHAR ( 64 ) NULL COMMENT 'Finance冻结引用' ,
wallet_ledger_id VARCHAR ( 64 ) NULL COMMENT 'Finance处理流水引用' ,
error_code VARCHAR ( 64 ) NULL COMMENT '业务失败码' ,
error_message VARCHAR ( 500 ) NULL COMMENT '内部失败诊断,不直接对客展示' ,
created_at DATETIME ( 3 ) NOT NULL DEFAULT CURRENT_TIMESTAMP ( 3 ) COMMENT '请求时间' ,
completed_at DATETIME ( 3 ) NULL COMMENT '最终结果时间' ,
PRIMARY KEY ( id ), UNIQUE KEY uk_procurement_attempt_event ( command_event_id ),
UNIQUE KEY uk_procurement_attempt_number ( fee_id , attempt_no ),
KEY idx_procurement_attempt_order ( customer_id , order_id , status ),
CONSTRAINT chk_procurement_attempt_status CHECK ( status IN ( 'PENDING' , 'SUCCEEDED' , 'FAILED' ))
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '采购费用资金命令尝试与不可变结果' ;
-- 采购节点事实与操作幂等;不补写历史订单的购买、授权或收货事实。
CREATE TABLE IF NOT EXISTS ll_procurement_flow (
order_id BIGINT NOT NULL COMMENT '采购订单ID,一单一个履约批次' ,
customer_id VARCHAR ( 128 ) NOT NULL COMMENT '客户隔离键' ,
purchased_at DATETIME ( 3 ) NULL COMMENT '真实购买时间' ,
purchased_product_name VARCHAR ( 255 ) NULL COMMENT '实际购买商品' ,
purchased_specification VARCHAR ( 500 ) NULL COMMENT '实际购买规格' ,
purchased_quantity BIGINT NULL COMMENT '实际购买件数' ,
purchase_amount DECIMAL ( 20 , 2 ) NULL COMMENT '供应商实付原币金额' ,
purchase_currency CHAR ( 3 ) NULL COMMENT '供应商实付原币CNY或USD' ,
purchase_voucher_id BIGINT NULL COMMENT '购买凭证引用' ,
purchase_issue VARCHAR ( 500 ) NULL COMMENT '购买未核定或异常说明' ,
purchase_confirmed_at DATETIME ( 3 ) NULL COMMENT '货款核定时间,不代表扣费成功' ,
actual_warehouse_id BIGINT NULL COMMENT '首次实际收货冻结的仓库ID' ,
actual_warehouse_code VARCHAR ( 128 ) NULL COMMENT '实际收货仓编码快照' ,
actual_warehouse_name VARCHAR ( 255 ) NULL COMMENT '实际收货仓名称快照' ,
overseas_received_at DATETIME ( 3 ) NULL COMMENT '海外整批收货完成时间' ,
packing_version INT NULL COMMENT '当前确认装箱清单版本' ,
overseas_shipped_at DATETIME ( 3 ) NULL COMMENT '国际段整批实际交寄时间' ,
domestic_received_at DATETIME ( 3 ) NULL COMMENT '国内整批收货完成时间' ,
charges_confirmed_at DATETIME ( 3 ) NULL COMMENT '国内整单费用核定时间' ,
customer_shipped_at DATETIME ( 3 ) NULL COMMENT '国内寄客户实际交寄时间' ,
domestic_receiver_name VARCHAR ( 128 ) NULL COMMENT '国际段国内收件人' ,
domestic_receiver_phone VARCHAR ( 64 ) NULL COMMENT '国际段国内收件电话' ,
domestic_receiver_address VARCHAR ( 1000 ) NULL COMMENT '国际段国内接收地址' ,
cancelled_at DATETIME ( 3 ) NULL COMMENT '购买前取消时间' ,
closed_at DATETIME ( 3 ) NULL COMMENT '异常关闭时间' ,
control_reason VARCHAR ( 1000 ) 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 ( order_id ), KEY idx_procurement_flow_customer ( customer_id , order_id ),
CONSTRAINT chk_procurement_purchase_quantity CHECK ( purchased_quantity IS NULL OR purchased_quantity > 0 ),
CONSTRAINT chk_procurement_purchase_amount CHECK ( purchase_amount IS NULL OR purchase_amount >= 0 )
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '采购单一批次履约事实' ;
CREATE TABLE IF NOT EXISTS ll_procurement_command (
id BIGINT NOT NULL COMMENT '操作记录ID' , order_id BIGINT NOT NULL COMMENT '采购订单ID' ,
customer_id VARCHAR ( 128 ) NOT NULL COMMENT '客户隔离键' , action VARCHAR ( 48 ) NOT NULL COMMENT '采购节点动作' ,
idempotency_key VARCHAR ( 128 ) NOT NULL COMMENT '操作幂等键' , request_hash CHAR ( 64 ) NOT NULL COMMENT '请求摘要' ,
operator_id VARCHAR ( 128 ) NOT NULL COMMENT '执行人' , reason VARCHAR ( 1000 ) NOT NULL COMMENT '操作依据' ,
detail_json JSON NOT NULL COMMENT '内部操作及更正依据快照,不直接对客展示' ,
created_at DATETIME ( 3 ) NOT NULL DEFAULT CURRENT_TIMESTAMP ( 3 ) COMMENT '执行时间' ,
PRIMARY KEY ( id ), UNIQUE KEY uk_procurement_command ( order_id , action , idempotency_key ),
KEY idx_procurement_command_customer ( customer_id , order_id , created_at )
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '采购节点幂等与不可变审计' ;
CREATE TABLE IF NOT EXISTS ll_procurement_budget_authorization (
id BIGINT NOT NULL COMMENT '预算授权ID' , order_id BIGINT NOT NULL COMMENT '采购订单ID' ,
customer_id VARCHAR ( 128 ) NOT NULL COMMENT '客户隔离键' ,
previous_amount DECIMAL ( 20 , 2 ) NULL COMMENT '原货款预算总上限;未授权保持空' , previous_currency CHAR ( 3 ) NOT NULL COMMENT '原预算币种' ,
authorized_amount DECIMAL ( 20 , 2 ) NOT NULL COMMENT '客户授权的新货款总上限' , currency CHAR ( 3 ) NOT NULL COMMENT '客户授权币种' ,
voucher_file_id BIGINT NOT NULL COMMENT '客户确认书面或聊天凭证' , reason VARCHAR ( 1000 ) NOT NULL COMMENT '授权依据' ,
reviewed_by VARCHAR ( 128 ) NOT NULL COMMENT '核验人员' , reviewed_at DATETIME ( 3 ) NOT NULL DEFAULT CURRENT_TIMESTAMP ( 3 ) COMMENT '核验时间' ,
PRIMARY KEY ( id ), KEY idx_procurement_budget_order ( customer_id , order_id , id ),
CONSTRAINT chk_procurement_budget_amount CHECK ( authorized_amount >= 0 AND previous_amount >= 0 ),
CONSTRAINT chk_procurement_budget_currency CHECK ( currency IN ( 'CNY' , 'USD' ) AND previous_currency IN ( 'CNY' , 'USD' ))
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '采购货款预算授权核验历史' ;
-- 采购实收、差异、装箱和两段整批发运事实。不产生WMS库存流水,不回填历史采购数量。
CREATE TABLE IF NOT EXISTS ll_procurement_receipt (
id BIGINT NOT NULL COMMENT '实收明细ID' , order_id BIGINT NOT NULL COMMENT '采购订单ID' , customer_id VARCHAR ( 128 ) NOT NULL COMMENT '客户隔离键' ,
receipt_no VARCHAR ( 64 ) NOT NULL COMMENT '采购收货业务编号' , leg VARCHAR ( 16 ) NOT NULL COMMENT 'OVERSEAS海外或DOMESTIC国内' ,
source_carton_id BIGINT NULL COMMENT '国内实收关联原国际交寄箱,海外为空' , warehouse_id BIGINT NULL COMMENT '海外实际收货仓' ,
good_quantity BIGINT NOT NULL COMMENT '可发合格件数' , damaged_quantity BIGINT NOT NULL COMMENT '破损待处置件数' , extra_quantity BIGINT NOT NULL COMMENT '多到件数,不增加可发数量' ,
received_at DATETIME ( 3 ) NOT NULL COMMENT '实际收货时间' , active TINYINT ( 1 ) NOT NULL DEFAULT 1 COMMENT '当前有效实收事实' ,
supersedes_id BIGINT NULL COMMENT '受控更正所替代的原实收记录' , created_by VARCHAR ( 128 ) NOT NULL COMMENT '登记人员' ,
created_at DATETIME ( 3 ) NOT NULL DEFAULT CURRENT_TIMESTAMP ( 3 ) COMMENT '登记时间' ,
PRIMARY KEY ( id ), UNIQUE KEY uk_procurement_receipt_no ( receipt_no ), KEY idx_procurement_receipt_source ( order_id , leg , source_carton_id , active ),
CONSTRAINT chk_procurement_receipt_quantity CHECK ( good_quantity >= 0 AND damaged_quantity >= 0 AND extra_quantity >= 0 AND good_quantity + damaged_quantity + extra_quantity > 0 ),
CONSTRAINT chk_procurement_receipt_leg CHECK (( leg = 'OVERSEAS' AND source_carton_id IS NULL ) OR ( leg = 'DOMESTIC' AND source_carton_id IS NOT NULL ))
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '采购分次实收与受控更正事实' ;
CREATE TABLE IF NOT EXISTS ll_procurement_disposition (
id BIGINT NOT NULL COMMENT '差异处理ID' , order_id BIGINT NOT NULL COMMENT '采购订单ID' , customer_id VARCHAR ( 128 ) NOT NULL COMMENT '客户隔离键' ,
leg VARCHAR ( 16 ) NOT NULL COMMENT 'OVERSEAS海外或DOMESTIC国内' , source_carton_id BIGINT NULL COMMENT '国内原交寄箱来源' ,
receipt_id BIGINT NULL COMMENT '破损或多货对应实收记录,短少为空' , kind VARCHAR ( 24 ) NOT NULL COMMENT 'SHORTAGE短少、DAMAGED破损、EXTRA多货' ,
quantity BIGINT NOT NULL COMMENT '已批准处置件数' , decision VARCHAR ( 32 ) NOT NULL COMMENT 'ACCEPT_SHORTAGE确认短少、DISPOSE_DAMAGED拒收或处置、RETURN_EXTRA退回多货' ,
active TINYINT ( 1 ) NOT NULL DEFAULT 1 COMMENT '当前有效处置;撤销只改变有效性并保留原事实' ,
voucher_file_id BIGINT NOT NULL COMMENT '本单客户确认或实际处置凭证' , reason VARCHAR ( 1000 ) NOT NULL COMMENT '处置依据' ,
created_by VARCHAR ( 128 ) NOT NULL COMMENT '采购管理人员' , created_at DATETIME ( 3 ) NOT NULL DEFAULT CURRENT_TIMESTAMP ( 3 ) COMMENT '确认时间' ,
PRIMARY KEY ( id ), KEY idx_procurement_disposition_source ( order_id , leg , source_carton_id , receipt_id , kind ),
CONSTRAINT chk_procurement_disposition_quantity CHECK ( quantity > 0 )
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '采购单内差异处置,不自动退款' ;
CREATE TABLE IF NOT EXISTS ll_procurement_manifest (
id BIGINT NOT NULL COMMENT '装箱清单ID' , order_id BIGINT NOT NULL COMMENT '采购订单ID' , customer_id VARCHAR ( 128 ) NOT NULL COMMENT '客户隔离键' ,
version INT NOT NULL COMMENT '订单内装箱版本' , status VARCHAR ( 16 ) NOT NULL COMMENT 'DRAFT草稿、CONFIRMED已确认、SUPERSEDED已替代' ,
confirmed_at DATETIME ( 3 ) NULL COMMENT '确认时间' , created_by VARCHAR ( 128 ) NOT NULL COMMENT '制单人' ,
created_at DATETIME ( 3 ) NOT NULL DEFAULT CURRENT_TIMESTAMP ( 3 ) COMMENT '版本保存时间' ,
PRIMARY KEY ( id ), UNIQUE KEY uk_procurement_manifest_version ( order_id , version ),
CONSTRAINT chk_procurement_manifest_status CHECK ( status IN ( 'DRAFT' , 'CONFIRMED' , 'SUPERSEDED' ))
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '采购装箱清单不可变版本' ;
CREATE TABLE IF NOT EXISTS ll_procurement_carton (
id BIGINT NOT NULL COMMENT '版本内箱记录ID' , order_id BIGINT NOT NULL COMMENT '采购订单ID' , manifest_id BIGINT NOT NULL COMMENT '装箱清单版本' ,
carton_no VARCHAR ( 64 ) NOT NULL COMMENT '采购订单内业务箱号' , length_cm DECIMAL ( 12 , 2 ) NOT NULL COMMENT '外箱长厘米' ,
width_cm DECIMAL ( 12 , 2 ) NOT NULL COMMENT '外箱宽厘米' , height_cm DECIMAL ( 12 , 2 ) NOT NULL COMMENT '外箱高厘米' ,
gross_weight_kg DECIMAL ( 12 , 3 ) NOT NULL COMMENT '封箱毛重千克' , quantity BIGINT NOT NULL COMMENT '本箱合格商品总件数' ,
PRIMARY KEY ( id ), UNIQUE KEY uk_procurement_carton_version ( manifest_id , carton_no ), KEY idx_procurement_carton_order ( order_id , manifest_id ),
CONSTRAINT chk_procurement_carton_measurement CHECK ( length_cm > 0 AND width_cm > 0 AND height_cm > 0 AND gross_weight_kg > 0 AND quantity > 0 )
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '采购版本化逐箱实测与件数' ;
CREATE TABLE IF NOT EXISTS ll_procurement_carton_source (
carton_id BIGINT NOT NULL COMMENT '版本内箱ID' , receipt_id BIGINT NOT NULL COMMENT '海外实收明细来源' , quantity BIGINT NOT NULL COMMENT '从该实收装入本箱的件数' ,
PRIMARY KEY ( carton_id , receipt_id ), KEY idx_procurement_carton_receipt ( receipt_id ), CONSTRAINT chk_procurement_carton_source_quantity CHECK ( quantity > 0 )
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '采购箱内货物的实收来源与数量' ;
CREATE TABLE IF NOT EXISTS ll_procurement_shipment (
id BIGINT NOT NULL COMMENT '采购交寄ID' , order_id BIGINT NOT NULL COMMENT '采购订单ID' , customer_id VARCHAR ( 128 ) NOT NULL COMMENT '客户隔离键' ,
shipment_no VARCHAR ( 64 ) NOT NULL COMMENT '交寄业务编号' , leg VARCHAR ( 16 ) NOT NULL COMMENT 'OVERSEAS国际交寄或DOMESTIC寄客户' ,
manifest_id BIGINT NOT NULL COMMENT '原海外装箱清单版本' , shipped_at DATETIME ( 3 ) NOT NULL COMMENT '整批真实交承运方时间' ,
address_snapshot JSON NOT NULL COMMENT '本段交寄时的收寄姓名电话地址快照' , created_by VARCHAR ( 128 ) NOT NULL COMMENT '交寄确认人' ,
created_at DATETIME ( 3 ) NOT NULL DEFAULT CURRENT_TIMESTAMP ( 3 ) COMMENT '确认时间' ,
PRIMARY KEY ( id ), UNIQUE KEY uk_procurement_shipment_leg ( order_id , leg ), UNIQUE KEY uk_procurement_shipment_no ( shipment_no ),
CONSTRAINT chk_procurement_shipment_leg CHECK ( leg IN ( 'OVERSEAS' , 'DOMESTIC' ))
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '采购两段各一次整批真实交寄' ;
CREATE TABLE IF NOT EXISTS ll_procurement_shipment_item (
shipment_id BIGINT NOT NULL COMMENT '采购交寄ID' , carton_id BIGINT NOT NULL COMMENT '原海外装箱版本内箱ID' , quantity BIGINT NOT NULL COMMENT '本次实际交寄件数' ,
carrier VARCHAR ( 128 ) NOT NULL COMMENT '承运商快照' , tracking_no VARCHAR ( 128 ) NOT NULL COMMENT '运单号快照' ,
label_snapshot JSON NOT NULL COMMENT '当次箱规、面单及货物来源快照' ,
PRIMARY KEY ( shipment_id , carton_id ), CONSTRAINT chk_procurement_shipment_item_quantity CHECK ( quantity > 0 )
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '采购整批交寄逐箱事实' ;
-- 采购面单、逐箱贴单、预估核对与国内一对一换包装;不重建历史发运事实。
CREATE TABLE IF NOT EXISTS ll_procurement_label_set (
id BIGINT NOT NULL COMMENT '面单批版本ID' , order_id BIGINT NOT NULL COMMENT '采购订单ID' , customer_id VARCHAR ( 128 ) NOT NULL COMMENT '客户隔离键' ,
leg VARCHAR ( 16 ) NOT NULL COMMENT 'OVERSEAS国际段或DOMESTIC寄客户段' , version INT NOT NULL COMMENT '订单段内面单版本' ,
manifest_id BIGINT NOT NULL COMMENT '原海外确认装箱版本' , cargo_hash CHAR ( 64 ) NOT NULL COMMENT '箱规及有效货物来源摘要' ,
sender_snapshot JSON NOT NULL COMMENT '寄件人姓名电话地址快照' , receiver_snapshot JSON NOT NULL COMMENT '收件人姓名电话地址快照' ,
created_by VARCHAR ( 128 ) NOT NULL COMMENT '制单操作人' , created_at DATETIME ( 3 ) NOT NULL DEFAULT CURRENT_TIMESTAMP ( 3 ) COMMENT '上传确认时间' ,
PRIMARY KEY ( id ), UNIQUE KEY uk_procurement_label_version ( order_id , leg , version ),
CONSTRAINT chk_procurement_label_leg CHECK ( leg IN ( 'OVERSEAS' , 'DOMESTIC' ))
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '采购两段面单不可变版本和地址快照' ;
CREATE TABLE IF NOT EXISTS ll_procurement_label_item (
label_set_id BIGINT NOT NULL COMMENT '面单批版本ID' , carton_id BIGINT NOT NULL COMMENT '原海外清单箱ID' ,
file_id BIGINT NOT NULL COMMENT '本采购订单面单文件' , page_no INT NOT NULL COMMENT '该箱对应文件页码,从1开始' ,
carrier VARCHAR ( 128 ) NOT NULL COMMENT '承运商' , tracking_no VARCHAR ( 128 ) NOT NULL COMMENT '箱主或子运单号' ,
applied_at DATETIME ( 3 ) NULL COMMENT '真实贴单时间' , applied_by VARCHAR ( 128 ) NULL COMMENT '贴单确认人' ,
PRIMARY KEY ( label_set_id , carton_id ), CONSTRAINT chk_procurement_label_page CHECK ( page_no > 0 )
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '采购逐箱文件页关联及贴单事实' ;
CREATE TABLE IF NOT EXISTS ll_procurement_estimate_review (
id BIGINT NOT NULL COMMENT '预估核对ID' , order_id BIGINT NOT NULL COMMENT '采购订单ID' , label_set_id BIGINT NOT NULL COMMENT '已核对国际面单版本' ,
fee_id BIGINT NOT NULL COMMENT '唯一有效预估费用版本' , reviewed_by VARCHAR ( 128 ) NOT NULL COMMENT '核价人员' ,
reviewed_at DATETIME ( 3 ) NOT NULL DEFAULT CURRENT_TIMESTAMP ( 3 ) COMMENT '核对时间' ,
PRIMARY KEY ( id ), UNIQUE KEY uk_procurement_estimate_review ( label_set_id , fee_id )
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '面单清单与预估冻结的显式核对关联' ;
CREATE TABLE IF NOT EXISTS ll_procurement_repack (
id BIGINT NOT NULL COMMENT '换包装版本ID' , order_id BIGINT NOT NULL COMMENT '采购订单ID' , carton_id BIGINT NOT NULL COMMENT '原国际交寄箱ID,保持一对一来源' ,
length_cm DECIMAL ( 12 , 2 ) NOT NULL COMMENT '新外箱长厘米' , width_cm DECIMAL ( 12 , 2 ) NOT NULL COMMENT '新外箱宽厘米' ,
height_cm DECIMAL ( 12 , 2 ) NOT NULL COMMENT '新外箱高厘米' , gross_weight_kg DECIMAL ( 12 , 3 ) NOT NULL COMMENT '新封箱毛重千克' ,
voucher_file_id BIGINT NOT NULL COMMENT '本单换包装证据' , reason VARCHAR ( 1000 ) NOT NULL COMMENT '换包装依据' ,
created_by VARCHAR ( 128 ) NOT NULL COMMENT '国内作业人员' , created_at DATETIME ( 3 ) NOT NULL DEFAULT CURRENT_TIMESTAMP ( 3 ) COMMENT '登记时间' ,
PRIMARY KEY ( id ), KEY idx_procurement_repack_carton ( order_id , carton_id , id ),
CONSTRAINT chk_procurement_repack_measurement CHECK ( length_cm > 0 AND width_cm > 0 AND height_cm > 0 AND gross_weight_kg > 0 )
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '采购国内原箱一对一换包装不可变历史' ;
-- 费用链目标更正快照与关联;资金流水仍唯一归Finance,不回填旧费用。
CREATE TABLE IF NOT EXISTS ll_procurement_fee_correction (
id BIGINT NOT NULL COMMENT '费用链更正ID' , order_id BIGINT NOT NULL COMMENT '采购订单ID' , customer_id VARCHAR ( 128 ) NOT NULL COMMENT '客户隔离键' ,
correction_no VARCHAR ( 64 ) NOT NULL COMMENT '财务更正业务号' , root_fee_id BIGINT NOT NULL COMMENT '原实际费用链根' ,
idempotency_key VARCHAR ( 128 ) NOT NULL COMMENT '本单更正请求幂等键' , request_hash CHAR ( 64 ) NOT NULL COMMENT '更正目标及凭证请求摘要' ,
target_original_amount DECIMAL ( 20 , 2 ) NOT NULL COMMENT '本次正确原币总额' , original_currency CHAR ( 3 ) NOT NULL COMMENT '沿用原费用币种' ,
exchange_rate DECIMAL ( 20 , 6 ) NOT NULL COMMENT '沿用原费用汇率快照' , exchange_rate_month CHAR ( 7 ) NOT NULL COMMENT '原汇率月份,不取本次操作月份' ,
target_amount DECIMAL ( 20 , 2 ) NOT NULL COMMENT '正确总额折算CNY' , previous_net_amount DECIMAL ( 20 , 2 ) NOT NULL COMMENT '确认前整链净实扣CNY' ,
difference_amount DECIMAL ( 20 , 2 ) NOT NULL COMMENT 'CNY正差额追加、负差额退款、零差额仅留核对记录' ,
voucher_file_id BIGINT NOT NULL COMMENT '本订单财务更正凭证' , reason VARCHAR ( 500 ) NOT NULL COMMENT '更正依据' ,
created_by VARCHAR ( 128 ) NOT NULL COMMENT '授权财务操作人' , created_at DATETIME ( 3 ) NOT NULL DEFAULT CURRENT_TIMESTAMP ( 3 ) COMMENT '确认时间' ,
PRIMARY KEY ( id ), UNIQUE KEY uk_procurement_correction_no ( correction_no ), UNIQUE KEY uk_procurement_correction_request ( order_id , idempotency_key ),
KEY idx_procurement_correction_root ( order_id , root_fee_id , id ),
CONSTRAINT chk_procurement_correction_amount CHECK ( target_original_amount >= 0 AND target_amount >= 0 AND previous_net_amount >= 0 AND exchange_rate > 0 )
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '采购费用链更正目标与原汇率快照' ;
CREATE TABLE IF NOT EXISTS ll_procurement_fee_correction_item (
correction_id BIGINT NOT NULL COMMENT '本次费用链更正ID' , fee_id BIGINT NOT NULL COMMENT '本次产生的独立正差额或退款费用ID' ,
PRIMARY KEY ( correction_id , fee_id ), UNIQUE KEY uk_procurement_correction_fee ( fee_id )
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '采购费用目标更正与逐笔资金事实关联' ;
-- 单采购订单内的更正说明、阻断异常与关闭证据。不生成WMS库存或退货运输任务。
CREATE TABLE IF NOT EXISTS ll_procurement_control_note (
id BIGINT NOT NULL COMMENT '采购更正说明ID' , order_id BIGINT NOT NULL COMMENT '采购订单ID' , customer_id VARCHAR ( 128 ) NOT NULL COMMENT '客户隔离键' ,
note_no VARCHAR ( 64 ) NOT NULL COMMENT '更正说明业务号' , target_type VARCHAR ( 24 ) NOT NULL COMMENT '购买、仓库、实收或交寄事实类型' ,
target_id BIGINT NULL COMMENT '本单事实对象引用,购买为空' , blocking TINYINT ( 1 ) NOT NULL COMMENT '是否阻断后续计划履约' ,
voucher_file_id BIGINT NOT NULL COMMENT '本单内部事实更正凭证' , reason VARCHAR ( 1000 ) NOT NULL COMMENT '内部更正说明' ,
client_summary VARCHAR ( 500 ) NULL COMMENT '人工确认的对客摘要,不复制内部原始内容' ,
original_value_json JSON NULL COMMENT '服务端记录的原事实快照' , corrected_value_json JSON NULL COMMENT '服务端记录的更正事实快照' ,
created_by VARCHAR ( 128 ) NOT NULL COMMENT '采购管理操作人' , created_at DATETIME ( 3 ) NOT NULL DEFAULT CURRENT_TIMESTAMP ( 3 ) COMMENT '登记时间' ,
resolved_by VARCHAR ( 128 ) NULL COMMENT '处理确认人' , resolved_at DATETIME ( 3 ) NULL COMMENT '阻断解除时间' ,
resolution_reason VARCHAR ( 1000 ) NULL COMMENT '内部处理结果' , resolution_voucher_id BIGINT NULL COMMENT '本单处理凭证' ,
PRIMARY KEY ( id ), UNIQUE KEY uk_procurement_note_no ( note_no ), KEY idx_procurement_note_block ( order_id , blocking , resolved_at )
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '采购不可覆盖事实的更正说明及阻断异常' ;
CREATE TABLE IF NOT EXISTS ll_procurement_closure (
id BIGINT NOT NULL COMMENT '采购异常关闭ID' , order_id BIGINT NOT NULL COMMENT '采购订单ID' , customer_id VARCHAR ( 128 ) NOT NULL COMMENT '客户隔离键' ,
closure_no VARCHAR ( 64 ) NOT NULL COMMENT '异常关闭业务号' , customer_voucher_file_id BIGINT NOT NULL COMMENT '客户同意停止履约凭证' ,
financial_conclusion VARCHAR ( 1000 ) NOT NULL COMMENT '已知费用及后续无需收费的处理结论,不改变资金事实' ,
reason VARCHAR ( 1000 ) NOT NULL COMMENT '内部关闭原因' , client_summary VARCHAR ( 500 ) NOT NULL COMMENT '人工确认的对客关闭摘要' ,
created_by VARCHAR ( 128 ) NOT NULL COMMENT '采购管理确认人' , created_at DATETIME ( 3 ) NOT NULL DEFAULT CURRENT_TIMESTAMP ( 3 ) COMMENT '关闭确认时间' ,
PRIMARY KEY ( id ), UNIQUE KEY uk_procurement_closure_order ( order_id ), UNIQUE KEY uk_procurement_closure_no ( closure_no )
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '采购实物资金收口后的异常关闭事实' ;
CREATE TABLE IF NOT EXISTS ll_procurement_closure_item (
id BIGINT NOT NULL COMMENT '关闭货物处置ID' , closure_id BIGINT NOT NULL COMMENT '采购关闭ID' ,
source_kind VARCHAR ( 32 ) NOT NULL COMMENT '购买未达、在途未达、合格、破损或多货来源' , source_id BIGINT NULL COMMENT '原实收或国际交寄箱,购买未达为空' ,
quantity BIGINT NOT NULL COMMENT '本来源最终明确去向件数' , decision VARCHAR ( 40 ) NOT NULL COMMENT '供应商保管、退还、报失、客户授权保管或处置' ,
destination VARCHAR ( 500 ) NOT NULL COMMENT '实际去向及接收方说明' , voucher_file_id BIGINT NOT NULL COMMENT '本单实物处置证明' ,
PRIMARY KEY ( id ), KEY idx_procurement_closure_source ( closure_id , source_kind , source_id ),
CONSTRAINT chk_procurement_closure_quantity CHECK ( quantity > 0 )
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '异常关闭逐来源剩余货物最终去向,不产生新发运' ;
2026-10-10 15:33:13 +08:00
CREATE TABLE IF NOT EXISTS ll_appointment_impact (
container_booking_id VARCHAR ( 64 ) NOT NULL COMMENT '稳定柜次关联键,不作业务编号展示' ,
impact_no VARCHAR ( 40 ) NOT NULL COMMENT '船期核对事项业务号' ,
baseline_json LONGTEXT NOT NULL COMMENT '已核对基准或首次变化前观察,原来源时间口径' ,
latest_json LONGTEXT NOT NULL COMMENT '最新已读取观察,未知可为JSON null' ,
forecast_token CHAR ( 64 ) NOT NULL COMMENT '最新观察摘要,处理时防止旧预测结案' ,
status VARCHAR ( 20 ) NOT NULL COMMENT '事项状态:MONITORING监测/OPEN待处理/RESOLVED已完成' ,
reason VARCHAR ( 64 ) NULL COMMENT '预测变化或资料待核实原因' ,
owner_id VARCHAR ( 128 ) NULL COMMENT '认领平台人员ID' ,
owner_name VARCHAR ( 200 ) NULL COMMENT '负责人姓名快照' ,
version INT NOT NULL COMMENT '观察及人工处理共同版本' ,
updated_at DATETIME ( 3 ) NOT NULL COMMENT 'UTC更新时间' ,
PRIMARY KEY ( container_booking_id ),
UNIQUE KEY uk_appointment_impact_no ( impact_no ),
KEY idx_appointment_impact_work ( status , updated_at ),
CONSTRAINT chk_appointment_impact_status CHECK ( status IN ( 'MONITORING' , 'OPEN' , 'RESOLVED' ))
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT = '一柜一个稳定船期变化核对事项,不改写预约或运输' ;
CREATE TABLE IF NOT EXISTS ll_appointment_impact_history (
id BIGINT NOT NULL COMMENT '历史记录标识' ,
container_booking_id VARCHAR ( 64 ) NOT NULL COMMENT '关联柜次标识' ,
version INT NOT NULL COMMENT '记录版本' ,
action VARCHAR ( 20 ) NOT NULL COMMENT '操作类型:OBSERVED观察/CLAIM认领/RECORD记录/RESOLVE完成' ,
operator_id VARCHAR ( 128 ) NOT NULL COMMENT '操作人标识' ,
operator_name VARCHAR ( 200 ) NULL COMMENT '操作人姓名' ,
result VARCHAR ( 1000 ) NULL COMMENT '人工处理结果;观察记录为空' ,
next_action VARCHAR ( 500 ) NULL COMMENT '下一步处理事项' ,
followup_date DATE NULL COMMENT '业务跟进日期' ,
command_key VARCHAR ( 64 ) NULL COMMENT '人工命令幂等键;观察记录为空' ,
request_hash CHAR ( 64 ) NULL COMMENT '请求内容摘要' ,
response_json LONGTEXT NOT NULL COMMENT '该版本完整响应快照,支持精确重放' ,
created_at DATETIME ( 3 ) NOT NULL COMMENT 'UTC记录时间' ,
PRIMARY KEY ( id ),
UNIQUE KEY uk_appointment_impact_version ( container_booking_id , version ),
UNIQUE KEY uk_appointment_impact_command ( container_booking_id , operator_id , command_key ),
CONSTRAINT fk_appointment_impact_history FOREIGN KEY ( container_booking_id ) REFERENCES ll_appointment_impact ( container_booking_id ),
CONSTRAINT chk_appointment_impact_action CHECK ( action IN ( 'OBSERVED' , 'CLAIM' , 'RECORD' , 'RESOLVE' ))
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT = '船期观察及人工处理追加历史' ;
2026-10-12 11:18:58 +08:00
-- 退货以包裹/箱为最小出库实物单位;部分数量必须先合箱生成新标签箱。
-- 可重复执行,目标库 baiyue_lastleg。
USE baiyue_lastleg ;
-- 合箱后的新箱与原包裹共用同一箱唛、标签和来源追溯模型。
-- 流水约束允许部分合箱/拆分只扣件数,不虚减箱数。
SET @ ddl = IF ( EXISTS ( SELECT 1 FROM information_schema . table_constraints
WHERE constraint_schema = DATABASE () AND table_name = 'll_return_inventory_outbound_movement'
AND constraint_name = 'chk_ll_return_outbound_movement_delta' ),
'ALTER TABLE ll_return_inventory_outbound_movement DROP CHECK chk_ll_return_outbound_movement_delta, ADD CONSTRAINT chk_ll_return_outbound_movement_delta CHECK(quantity>0 AND total_after>=0 AND available_after>=0 AND total_before-total_after=quantity AND available_before-available_after=quantity AND cartons_after>=0 AND cartons_before-cartons_after IN (0,1) AND total_after>=available_after)' ,
'ALTER TABLE ll_return_inventory_outbound_movement ADD CONSTRAINT chk_ll_return_outbound_movement_delta CHECK(quantity>0 AND total_after>=0 AND available_after>=0 AND total_before-total_after=quantity AND available_before-available_after=quantity AND cartons_after>=0 AND cartons_before-cartons_after IN (0,1) AND total_after>=available_after)' );
PREPARE stmt FROM @ ddl ; EXECUTE stmt ; DEALLOCATE PREPARE stmt ;
-- 同一包裹可分批合箱/出库,重复提交仍由 outbound_pick_id + SKU 幂等约束保护。
SET @ ddl = IF ( EXISTS ( SELECT 1 FROM information_schema . statistics
WHERE table_schema = DATABASE () AND table_name = 'll_return_inventory_outbound_movement'
AND index_name = 'uk_ll_return_outbound_carton_sku' ),
'ALTER TABLE ll_return_inventory_outbound_movement DROP INDEX uk_ll_return_outbound_carton_sku, ADD INDEX idx_ll_return_outbound_carton_sku(customer_id,carton_id,sku_code)' ,
'SELECT 1' );
PREPARE stmt FROM @ ddl ; EXECUTE stmt ; DEALLOCATE PREPARE stmt ;
-- 新签收及新合箱必须打印并扫码确认标签;既有实物按原状态继续作业。
SET @ ddl = IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_return_inventory_carton' AND column_name = 'label_status' ), 'SELECT 1' , 'ALTER TABLE ll_return_inventory_carton ADD COLUMN label_status VARCHAR(32) NULL COMMENT ''WAIT_LABEL待贴标 CONFIRMED已扫码确认标签''' );
PREPARE stmt FROM @ ddl ; EXECUTE stmt ; DEALLOCATE PREPARE stmt ;
2026-10-12 20:27:35 +08:00
2026-10-12 21:18:29 +08:00
-- SKU 换标实物转换:先执行本增量,再部署服务。不会自动改写存量业务事实。
SET @ return_sku_ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_return_inventory_carton_item' AND column_name = 'relabelled_quantity' ), 'SELECT 1' , 'ALTER TABLE ll_return_inventory_carton_item ADD COLUMN relabelled_quantity BIGINT NOT NULL DEFAULT 0 COMMENT ''当前SKU已经换标的实物件数,不可二次换标''' ));
PREPARE return_sku_stmt FROM @ return_sku_ddl ; EXECUTE return_sku_stmt ; DEALLOCATE PREPARE return_sku_stmt ;
CREATE TABLE IF NOT EXISTS ll_return_sku_conversion (
id BIGINT NOT NULL COMMENT 'SKU库存转换记录ID' ,
2026-10-13 11:00:31 +08:00
customer_id VARCHAR ( 128 ) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '客户隔离键' ,
overseas_warehouse_id VARCHAR ( 128 ) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '操作海外仓ID' ,
2026-10-12 21:18:29 +08:00
application_id BIGINT NOT NULL COMMENT '换标申请ID' ,
2026-10-13 11:00:31 +08:00
relabel_no VARCHAR ( 64 ) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '换标单号' ,
2026-10-12 21:18:29 +08:00
item_id BIGINT NOT NULL COMMENT '换标箱级明细ID' ,
round_key VARCHAR ( 64 ) NOT NULL COMMENT '作业轮次,退回重做使用新轮次' ,
carton_id BIGINT NOT NULL COMMENT '实物来源包裹或箱ID' ,
carton_mark VARCHAR ( 128 ) NOT NULL COMMENT '完工时仓库识别码' ,
2026-10-13 11:00:31 +08:00
old_sku_code VARCHAR ( 128 ) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '换标前SKU' ,
new_sku_code VARCHAR ( 128 ) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '换标后SKU' ,
product_name_zh VARCHAR ( 255 ) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL COMMENT '中文品名快照' ,
2026-10-12 21:18:29 +08:00
quantity BIGINT NOT NULL COMMENT '实际完成转换件数' ,
status VARCHAR ( 32 ) NOT NULL COMMENT 'APPLIED待客户确认/CONFIRMED已确认/REVERSED退回冲回' ,
ownership_json LONGTEXT NOT NULL COMMENT '本次转换件数的来源退货单快照,供精确冲回' ,
completed_at DATETIME ( 3 ) NOT NULL COMMENT '实物SKU转换时间' ,
confirmed_at DATETIME ( 3 ) NULL COMMENT '客户确认时间' ,
reversed_at DATETIME ( 3 ) NULL COMMENT '退回冲回时间' ,
PRIMARY KEY ( id ),
UNIQUE KEY uk_return_sku_conversion_round ( item_id , round_key , old_sku_code , new_sku_code ),
KEY idx_return_sku_conversion_app ( customer_id , application_id , status ),
KEY idx_return_sku_conversion_carton ( customer_id , carton_id ),
CONSTRAINT chk_return_sku_conversion_quantity CHECK ( quantity > 0 )
2026-10-13 11:00:31 +08:00
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '退货实物SKU换标库存转换和冲回记录' ;
2026-10-12 21:18:29 +08:00
2026-10-12 20:27:35 +08:00
-- 平台自营领星统计:独立事实与不可变发布版本;仅空库初始化,不自动执行。
CREATE TABLE ll_selfop_outbound_discovery_scope (
id BIGINT NOT NULL COMMENT '应用生成的记录标识' ,
created_at DATETIME ( 3 ) NOT NULL COMMENT 'UTC创建时间' ,
updated_at DATETIME ( 3 ) NOT NULL COMMENT 'UTC更新时间' ,
source_account VARCHAR ( 64 ) NOT NULL COMMENT '受控来源账号别名,不保存密钥' ,
catalog_from_utc DATETIME ( 3 ) NULL COMMENT '账号完整目录连续覆盖UTC下界,不等同销量覆盖' ,
catalog_until_utc DATETIME ( 3 ) NULL COMMENT '账号完整目录连续覆盖UTC上界,不等同销量覆盖' ,
next_sequence BIGINT NOT NULL DEFAULT 1 COMMENT '新发现任务的单调调度序号;重试沿用,只安排任务,不判断对象内容的新旧' ,
next_observation_sequence BIGINT NOT NULL DEFAULT 1 COMMENT '每次实际出库详情请求前分配的单调采集代次;与 task 调度序号独立,重试请求也分配新代次' ,
active_task_id BIGINT NULL COMMENT '当前共享发现/详情补齐任务' ,
lease_owner VARCHAR ( 128 ) NULL COMMENT '账号发现执行者' ,
lease_until_utc DATETIME ( 3 ) NULL COMMENT '账号发现租约到期时刻' ,
fence_token BIGINT NOT NULL DEFAULT 0 COMMENT '防止过期发现进程继续写共享暂存或派发任务' ,
request_budget INT NOT NULL COMMENT '一次调度允许的目录、详情请求总预算,必须为正' ,
time_budget_seconds INT NOT NULL COMMENT '一次调度允许占用的执行时长,必须为正' ,
min_request_interval_ms INT NOT NULL COMMENT '同账号请求最小间隔,按已核准配额配置' ,
api_budget_json JSON NULL COMMENT '账号所有采集族共用的预算、统计日、保守预留及确认消耗、尝试许可和独占交接依据' ,
api_cooldown_until_utc DATETIME ( 3 ) NULL COMMENT '账号全部真实请求共用冷却UTC截止,重启与跨日不清除' ,
api_pause_reason VARCHAR ( 64 ) NULL COMMENT '账号停止或等待的固定原因码,不保存供应商原始错误或凭据' ,
PRIMARY KEY ( id ),
UNIQUE KEY uk_selfop_discovery_account ( source_account ),
CONSTRAINT chk_selfop_outbound_discovery_scope CHECK ( request_budget > 0 AND time_budget_seconds > 0 AND min_request_interval_ms > 0 AND fence_token >= 0 AND next_sequence > 0 AND next_observation_sequence > 0 )
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '账号共享出库目录与详情发现协调作用域' ;
CREATE TABLE ll_selfop_sync_scope (
id BIGINT NOT NULL COMMENT '应用生成的记录标识' ,
created_at DATETIME ( 3 ) NOT NULL COMMENT 'UTC创建时间' ,
updated_at DATETIME ( 3 ) NOT NULL COMMENT 'UTC更新时间' ,
source_account VARCHAR ( 64 ) NOT NULL COMMENT '受控来源账号别名,不保存密钥' ,
warehouse_code VARCHAR ( 64 ) NOT NULL COMMENT '来源仓库原始编码,按仓独立统计' ,
data_family VARCHAR ( 16 ) NOT NULL COMMENT 'OUTBOUND 或 INVENTORY;按账号+仓库+任务族互斥' ,
scope_json JSON NOT NULL COMMENT '本仓范围规则,customerMode=ALL_AUTHORIZED,库存为全部品质;当前账号全部授权货主均自营,不将当天出现的货主列表当白名单' ,
scope_hash CHAR ( 64 ) NOT NULL COMMENT '仓库、货主范围规则、品质、时区及单位口径的规范化摘要;不包含当天观测到的客户/SKU 集合' ,
business_timezone VARCHAR ( 64 ) NOT NULL COMMENT '本仓报表及调度时区,初始建议值为 Asia/Shanghai,各仓独立核准' ,
source_timezone VARCHAR ( 64 ) NULL COMMENT '本仓已核准的出库源时间时区' ,
schedule_cron VARCHAR ( 128 ) NOT NULL COMMENT '本仓、本任务族的调度表达式,按 business_timezone 执行' ,
stale_after_seconds INT NOT NULL COMMENT '本仓、本任务族数据过期阈值,必须为正;库存初始可采用 26 小时,后续按仓调整' ,
warehouse_policy_ref VARCHAR ( 128 ) NULL COMMENT '未来按仓告警/补货策略的稳定引用;一期为空,不建告警规则表' ,
initial_from_utc DATETIME ( 3 ) NULL COMMENT '首采固定UTC下界,按本仓业务时区减一个月' ,
initial_until_utc DATETIME ( 3 ) NULL COMMENT '首采固定UTC截止,重试不重新取当前时间' ,
discovery_from_utc DATETIME ( 3 ) NULL COMMENT '本仓已发布的连续销量覆盖UTC下界' ,
discovery_until_utc DATETIME ( 3 ) NULL COMMENT '本仓已发布的连续销量覆盖UTC上界,不含端点' ,
fact_revision BIGINT NOT NULL DEFAULT 0 COMMENT '出库事实归并修订号;内容实际变化才增加' ,
published_fact_revision BIGINT NOT NULL DEFAULT 0 COMMENT '本仓最后已发布销量版所使用的事实修订号' ,
rebuild_required TINYINT NOT NULL DEFAULT 0 COMMENT '事实变化待重建标记;跨仓修订同时置旧、新仓为 1' ,
invalidated_at_utc DATETIME ( 3 ) NULL COMMENT '最近一次因事实修订使当前版待重建的时刻' ,
published_run_id BIGINT NULL COMMENT '唯一对外可见版本,指向本任务族已发布执行批次' ,
lease_owner VARCHAR ( 128 ) NULL COMMENT '当前执行者令牌,不使用仅进程内锁' ,
lease_until_utc DATETIME ( 3 ) NULL COMMENT '租约到期时刻' ,
fence_token BIGINT NOT NULL DEFAULT 0 COMMENT '每次取得租约递增,事实提交和发布均校验' ,
known_order_cursor_id BIGINT NULL COMMENT '本仓已可靠处理的稳定订单内部标识游标' ,
known_order_round_max_id BIGINT NULL COMMENT '本轮已知单复查固定最大内部标识' ,
known_order_round_started_at_utc DATETIME ( 3 ) NULL COMMENT '本仓已知单复查轮次开始UTC时间' ,
known_order_round_finished_at_utc DATETIME ( 3 ) NULL COMMENT '本仓已知单完整轮转完成UTC时间' ,
history_round_from_utc DATETIME ( 3 ) NULL COMMENT '本仓历史核对固定UTC下界' ,
history_round_until_utc DATETIME ( 3 ) NULL COMMENT '本仓历史核对固定UTC上界' ,
history_slice_cursor_utc DATETIME ( 3 ) NULL COMMENT '本仓下一待核对历史切片UTC位置' ,
history_round_finished_at_utc DATETIME ( 3 ) NULL COMMENT '上一轮历史时间片全部完成时刻' ,
review_request_budget INT NOT NULL COMMENT '本仓单次复查最大请求数,必须为正' ,
review_time_budget_seconds INT NOT NULL COMMENT '本仓单次复查最大执行秒数,必须为正' ,
review_target_days INT NOT NULL DEFAULT 7 COMMENT '建议每 7 天轮转一遍,属于待配额验证的目标,不保证首次大量详情在单次调度内完成' ,
PRIMARY KEY ( id ),
UNIQUE KEY uk_selfop_scope ( source_account , warehouse_code , data_family ),
KEY idx_selfop_scope_lease ( lease_until_utc ),
CONSTRAINT chk_selfop_sync_scope CHECK ( data_family IN ( 'OUTBOUND' , 'INVENTORY' ) AND stale_after_seconds > 0 AND review_request_budget > 0 AND review_time_budget_seconds > 0 AND review_target_days > 0 AND fact_revision >= 0 AND published_fact_revision >= 0 AND fence_token >= 0 )
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '分仓任务族租约及发布指针' ;
CREATE TABLE ll_selfop_sync_task (
id BIGINT NOT NULL COMMENT '应用生成的记录标识' ,
created_at DATETIME ( 3 ) NOT NULL COMMENT 'UTC创建时间' ,
updated_at DATETIME ( 3 ) NOT NULL COMMENT 'UTC更新时间' ,
task_no VARCHAR ( 64 ) NOT NULL COMMENT '稳定采集业务任务号,重试沿用,不展示内部数据库标识' ,
execution_purpose VARCHAR ( 16 ) NOT NULL COMMENT 'BUSINESS或VALIDATION;由服务端冻结用途,子任务继承' ,
validation_root_task_id BIGINT NULL COMMENT '验证会话唯一预算根任务,根引用自身,正式任务为空' ,
validation_budget_json JSON NULL COMMENT '验证根冻结硬预算、累计消耗、库存分仓页数、截止时刻及停止原因' ,
2026-10-13 03:08:36 +08:00
business_root_task_id BIGINT NULL COMMENT '测试人工正式采集共享预算根任务;生产任务为空' ,
business_budget_json JSON NULL COMMENT '仅测试正式采集根保存冻结请求上限、截止时间、消耗及停止原因' ,
2026-10-12 20:27:35 +08:00
source_account VARCHAR ( 64 ) NOT NULL COMMENT '受控来源账号别名,不保存密钥' ,
task_role VARCHAR ( 24 ) NOT NULL COMMENT 'ACCOUNT_DISCOVERY 或 WAREHOUSE_SYNC' ,
scope_id BIGINT NULL COMMENT '分仓任务必须引用分仓作用域;仅账号共享发现为空' ,
warehouse_code VARCHAR ( 64 ) NULL COMMENT '来源仓库原始编码,按仓独立统计' ,
discovery_scope_id BIGINT NULL COMMENT '共享发现必填,引用账号发现协调器' ,
upstream_task_id BIGINT NULL COMMENT '出库分仓任务引用已持久化目录的共享发现切片;库存无此上游' ,
discovery_sequence BIGINT NULL COMMENT '共享任务及分仓子任务继承的调度顺序;重试保持不变,不用于事实覆盖判定' ,
observation_baseline BIGINT NULL COMMENT '共享任务建立时已分配的最大详情采集代次,分仓子任务继承;用于识别旧任务恢复期间出现的其他任务新观测' ,
request_key VARCHAR ( 128 ) NOT NULL COMMENT '共享发现包含切片/计划槽位;分仓任务包含仓库、任务族及切片或计划槽位;人工附请求幂等键' ,
request_hash CHAR ( 64 ) NOT NULL COMMENT '请求类型、查询范围、范围摘要的指纹;同键不同请求拒绝' ,
2026-10-15 13:30:37 +08:00
task_type VARCHAR ( 24 ) NOT NULL COMMENT '计划、补采、复核、重建与验证;INVENTORY_FLOW_HISTORY为流水片,INVENTORY_HISTORY_BUILD为本地历史还原' ,
2026-10-12 20:27:35 +08:00
planned_at_utc DATETIME ( 3 ) NULL COMMENT '计划时点;人工请求可空' ,
query_from_utc DATETIME ( 3 ) NULL COMMENT '出库查询区间UTC下界,库存不填' ,
query_until_utc DATETIME ( 3 ) NULL COMMENT '出库查询区间UTC上界,不含端点,库存不填' ,
query_scope_json JSON NOT NULL COMMENT '不变的账号、货主、仓库、品质和查询条件快照;按单补查在此记录单号' ,
routing_manifest_json JSON NULL COMMENT '共享切片目录完整标记、每仓对象键集合/数量和详情就绪状态;各对象记录 effectiveStageId,需新代次复查时记录 refreshTaskId,完成后指向新有效暂存;不改写旧载荷' ,
scope_hash CHAR ( 64 ) NOT NULL COMMENT '建任务时的业务范围摘要' ,
status VARCHAR ( 20 ) NOT NULL COMMENT 'WAITING_SOURCE、READY、RUNNING、RETRY_WAIT、SUCCEEDED、DEAD、SAMPLE_DONE;样本结束不等于正式成功' ,
apply_state VARCHAR ( 20 ) NOT NULL COMMENT '正式出库归并NOT_STARTED、APPLYING、BLOCKED、APPLIED;共享发现、库存、重建及验证为NOT_APPLICABLE' ,
affected_warehouse_codes_json JSON NULL COMMENT '本次归并可能改变的仓集合,包含原仓与新仓;首段事实写入前登记,扩大集合须先取得新增仓租约并锁 scope,不能写完再补' ,
apply_started_at_utc DATETIME ( 3 ) NULL COMMENT '首段事实提交UTC时间' ,
apply_completed_at_utc DATETIME ( 3 ) NULL COMMENT '全部必需事实归并完成UTC时间,失败不填' ,
attempt_count INT NOT NULL DEFAULT 0 COMMENT '已创建的执行尝试数' ,
next_retry_at_utc DATETIME ( 3 ) NULL COMMENT '有限退避后下一次可执行时刻' ,
requested_by VARCHAR ( 128 ) NULL COMMENT '人工请求的平台操作人,仅内部审计' ,
result_published_run_id BIGINT NULL COMMENT '正式成功任务实际发布或复用的版本;验证和共享发现为空' ,
progress_json JSON NULL COMMENT '与可靠检查点一起提交的有界阶段、单位、尝试和质量进度,不保存单据集合' ,
progress_updated_at_utc DATETIME ( 3 ) NULL COMMENT '最后可靠业务检查点UTC时间,与执行心跳分开' ,
PRIMARY KEY ( id ),
UNIQUE KEY uk_selfop_task_no ( task_no ),
UNIQUE KEY uk_selfop_task_request ( source_account , request_key ),
KEY idx_selfop_task_poll ( status , next_retry_at_utc , id ),
KEY idx_selfop_task_upstream ( upstream_task_id , warehouse_code ),
KEY idx_selfop_task_apply ( apply_state , id ),
KEY idx_selfop_task_scope_list ( scope_id , created_at , id ),
KEY idx_selfop_task_account_list ( source_account , task_role , created_at , id ),
2026-10-13 03:08:36 +08:00
KEY idx_selfop_task_business_root ( business_root_task_id , status , id ),
CONSTRAINT chk_selfop_business_budget CHECK (( business_root_task_id IS NULL AND business_budget_json IS NULL ) OR ( execution_purpose = 'BUSINESS' AND business_root_task_id IS NOT NULL AND (( business_root_task_id = id AND business_budget_json IS NOT NULL ) OR ( business_root_task_id <> id AND business_budget_json IS NULL )))),
2026-10-12 20:27:35 +08:00
CONSTRAINT chk_selfop_sync_task CHECK ( attempt_count >= 0 AND execution_purpose IN ( 'BUSINESS' , 'VALIDATION' ) AND (( execution_purpose = 'BUSINESS' AND validation_root_task_id IS NULL AND validation_budget_json IS NULL ) OR ( execution_purpose = 'VALIDATION' AND validation_root_task_id IS NOT NULL AND apply_state = 'NOT_APPLICABLE' AND result_published_run_id IS NULL AND status <> 'SUCCEEDED' )) AND (( task_role = 'ACCOUNT_DISCOVERY' AND scope_id IS NULL AND warehouse_code IS NULL AND discovery_scope_id IS NOT NULL ) OR ( task_role = 'WAREHOUSE_SYNC' AND scope_id IS NOT NULL AND warehouse_code IS NOT NULL )))
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '一次计划或人工请求' ;
CREATE TABLE ll_selfop_sync_run (
id BIGINT NOT NULL COMMENT '应用生成的记录标识' ,
created_at DATETIME ( 3 ) NOT NULL COMMENT 'UTC创建时间' ,
updated_at DATETIME ( 3 ) NOT NULL COMMENT 'UTC更新时间' ,
task_id BIGINT NOT NULL COMMENT '本次执行请求' ,
execution_purpose VARCHAR ( 16 ) NOT NULL COMMENT '从逻辑任务冻结继承,验证尝试不能作为正式统计版本' ,
scope_id BIGINT NULL COMMENT '仅账号共享发现为空;分仓执行必须有作用域' ,
source_account VARCHAR ( 64 ) NOT NULL COMMENT '受控来源账号别名,不保存密钥' ,
warehouse_code VARCHAR ( 64 ) NULL COMMENT '来源仓库原始编码,按仓独立统计' ,
run_role VARCHAR ( 24 ) NOT NULL COMMENT 'ACCOUNT_DISCOVERY 或 WAREHOUSE_SYNC' ,
upstream_task_id BIGINT NULL COMMENT '分仓出库计算引用的共享切片及其稳定暂存集合' ,
attempt_no INT NOT NULL COMMENT '同一请求从 1 起递增' ,
scope_hash CHAR ( 64 ) NOT NULL COMMENT '本版本的业务范围摘要' ,
scope_snapshot_json JSON NOT NULL COMMENT '分仓版只含本仓货主/品质、固定首采 [B,E0)、时区、调度与过期阈值;账号发现保存待路由仓集合,不冒充业务版' ,
observed_dimensions_json JSON NULL COMMENT '本次实际出现的仓库/货主集合及数量摘要,仅作采集证据;例如已观测 70 货主不等于固定授权范围' ,
fence_token BIGINT NOT NULL COMMENT '本尝试持有的栅栏版本' ,
base_published_run_id BIGINT NULL COMMENT '执行开始时的上一可见版本' ,
reference_sales_run_id BIGINT NULL COMMENT '库存构建开始时固定的本仓已发布销量版,用其不可变 SKU 维度生成出库已知商品占位;没有已发布销量版时为空,不读取半归并订单事实' ,
inventory_daily_sample_date DATE NULL COMMENT '北京时间当日首个合格计划库存发布代表日期,非代表为空' ,
inventory_sample_rule_version VARCHAR ( 32 ) NULL COMMENT '日库存代表选择规则 DAILY_SCHEDULED_FIRST_V1,与日标记原子保存' ,
status VARCHAR ( 24 ) NOT NULL COMMENT 'FETCHING、VALIDATED、ROUTED、FACTS_APPLIED、BUILDING、READY、PUBLISHED、REUSED、YIELDED、FAILED、ABORTED、SAMPLE_DONE;复用和验证不是版本头' ,
last_phase VARCHAR ( 24 ) NOT NULL COMMENT '失败/中止前所在阶段,支持判断是否已经归并事实' ,
fetch_started_at_utc DATETIME ( 3 ) NULL COMMENT '实际采集开始UTC时间' ,
fetch_finished_at_utc DATETIME ( 3 ) NULL COMMENT '实际采集完成UTC时间,未完成为空' ,
build_started_at_utc DATETIME ( 3 ) NULL COMMENT '实际开始有界候选构建UTC时间,用于构建耗时及首采合并间隔' ,
2026-10-13 09:40:55 +08:00
warehouse_daily_ready TINYINT NOT NULL DEFAULT 0 COMMENT '仓库日汇总已完整构建并校验,含完整空版本' ,
2026-10-12 20:27:35 +08:00
finished_at_utc DATETIME ( 3 ) NULL COMMENT '本次尝试终止UTC时间' ,
published_at_utc DATETIME ( 3 ) NULL COMMENT '实际原子切换发布指针UTC时间' ,
superseded_at_utc DATETIME ( 3 ) NULL COMMENT '被新发布版替代的首次UTC时间,同事务填写且重试不重置' ,
page_count INT NOT NULL DEFAULT 0 COMMENT '已完整获取页数' ,
source_total_count BIGINT NULL COMMENT '上游可靠返回的总数;未返回则为空' ,
unique_object_count BIGINT NOT NULL DEFAULT 0 COMMENT '规范化去重后对象数' ,
progress_snapshot_json JSON NULL COMMENT '尝试终止时冻结的有界可靠进度摘要,历史尝试不随逻辑任务改写' ,
heartbeat_at_utc DATETIME ( 3 ) NULL COMMENT '有效执行者最新UTC心跳,不代表业务检查点推进' ,
coverage_status VARCHAR ( 16 ) NOT NULL COMMENT 'UNKNOWN、PARTIAL、COMPLETE;分页完整与数值有效性分别判断' ,
covered_from_utc DATETIME ( 3 ) NULL COMMENT '本仓销量版本实际连续覆盖UTC下界' ,
covered_until_utc DATETIME ( 3 ) NULL COMMENT '本仓销量版本实际连续覆盖UTC上界,不含端点' ,
complete_day_from DATE NULL COMMENT '本仓完整自然日区间首日,包含' ,
complete_day_until DATE NULL COMMENT '本仓完整自然日区间末日,不含' ,
applied_fact_revision BIGINT NULL COMMENT '本次尝试归并后的事实修订号,库存为空' ,
calculated_fact_revision BIGINT NULL COMMENT '候选销量版本计算所依据的固定事实修订号' ,
error_code VARCHAR ( 64 ) NULL COMMENT '内部可诊断错误分类,不保存认证信息' ,
error_message VARCHAR ( 500 ) NULL COMMENT '脱敏后的固定错误摘要' ,
PRIMARY KEY ( id ),
UNIQUE KEY uk_selfop_run_attempt ( task_id , attempt_no ),
UNIQUE KEY uk_selfop_inventory_daily ( source_account , warehouse_code , inventory_daily_sample_date ),
KEY idx_selfop_run_scope ( scope_id , id ),
KEY idx_selfop_run_status ( status , updated_at ),
CONSTRAINT chk_selfop_inventory_daily CHECK (( inventory_daily_sample_date IS NULL AND inventory_sample_rule_version IS NULL ) OR ( inventory_daily_sample_date IS NOT NULL AND inventory_sample_rule_version IS NOT NULL AND inventory_sample_rule_version = 'DAILY_SCHEDULED_FIRST_V1' AND execution_purpose = 'BUSINESS' AND run_role = 'WAREHOUSE_SYNC' AND status = 'PUBLISHED' AND coverage_status = 'COMPLETE' )),
CONSTRAINT chk_selfop_sync_run CHECK ( attempt_no > 0 AND page_count >= 0 AND unique_object_count >= 0 AND execution_purpose IN ( 'BUSINESS' , 'VALIDATION' ) AND ( execution_purpose <> 'VALIDATION' OR status NOT IN ( 'PUBLISHED' , 'REUSED' )) AND ( source_total_count IS NULL OR source_total_count >= 0 ) AND (( run_role = 'ACCOUNT_DISCOVERY' AND scope_id IS NULL AND warehouse_code IS NULL ) OR ( run_role = 'WAREHOUSE_SYNC' AND scope_id IS NOT NULL AND warehouse_code IS NOT NULL )))
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '执行尝试、覆盖证明和版本头' ;
CREATE TABLE ll_selfop_sync_stage (
id BIGINT NOT NULL COMMENT '应用生成的记录标识' ,
created_at DATETIME ( 3 ) NOT NULL COMMENT 'UTC创建时间' ,
updated_at DATETIME ( 3 ) NOT NULL COMMENT 'UTC更新时间' ,
run_id BIGINT NOT NULL COMMENT '首次写入该暂存对象的执行尝试' ,
stage_batch_id BIGINT NOT NULL COMMENT '出库取共享发现 task.id,便于断点续取;库存取本次 run.id,严禁跨尝试混页' ,
last_fetch_run_id BIGINT NOT NULL COMMENT '最后一次补齐该对象的执行尝试,保留重试来源' ,
observation_sequence BIGINT NULL COMMENT '该完整出库详情实际请求的采集代次;有效出库对象必填,目录待补对象和库存为空;不能填 task 调度序号' ,
warehouse_code VARCHAR ( 64 ) NOT NULL COMMENT '来源仓库原始编码,按仓独立统计' ,
previous_warehouse_code VARCHAR ( 64 ) NULL COMMENT '路由时从已有单据识别的原仓库;归并前再校验,跨仓时通知两仓' ,
object_type VARCHAR ( 16 ) NOT NULL COMMENT 'OUTBOUND_ORDER 或 PRODUCT_STOCK' ,
object_key_hash CHAR ( 64 ) NOT NULL COMMENT '规范化业务键摘要;原业务键保留在载荷中并核对' ,
first_page_no INT NOT NULL COMMENT '首次发现页码' ,
observed_at_utc DATETIME ( 3 ) NOT NULL COMMENT '实际接收该对象的时刻' ,
content_hash CHAR ( 64 ) NOT NULL COMMENT '完整规范化对象摘要' ,
payload_json JSON NOT NULL COMMENT '目录阶段可先存订单头,详情齐后补完整 SKU;VALID 后不再修改;库存保存产品库存字段' ,
before_payload_json JSON NULL COMMENT '订单归并事务内记录归并前的完整规范化事实;新增单为空' ,
validation_status VARCHAR ( 16 ) NOT NULL COMMENT '暂存校验状态:PENDING待核验、VALID有效、INVALID异常' ,
validation_code VARCHAR ( 64 ) NULL COMMENT '字段缺失、冲突、未知时区等原因' ,
PRIMARY KEY ( id ),
UNIQUE KEY uk_selfop_stage_object ( stage_batch_id , object_type , object_key_hash ),
KEY idx_selfop_stage_history ( object_type , object_key_hash , stage_batch_id ),
KEY idx_selfop_stage_observation ( object_type , object_key_hash , validation_status , observation_sequence ),
2026-10-13 01:47:17 +08:00
KEY idx_selfop_stage_fact_observation ( observation_sequence , warehouse_code , object_type , validation_status , run_id , observed_at_utc ),
2026-10-12 20:27:35 +08:00
KEY idx_selfop_stage_route ( stage_batch_id , warehouse_code , validation_status ),
CONSTRAINT chk_selfop_sync_stage CHECK ( first_page_no > 0 AND ( object_type <> 'OUTBOUND_ORDER' OR validation_status <> 'VALID' OR observation_sequence IS NOT NULL ))
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '待验证事实与修订证据' ;
CREATE TABLE ll_selfop_outbound_order (
id BIGINT NOT NULL COMMENT '应用生成的记录标识' ,
created_at DATETIME ( 3 ) NOT NULL COMMENT 'UTC创建时间' ,
updated_at DATETIME ( 3 ) NOT NULL COMMENT 'UTC更新时间' ,
source_account VARCHAR ( 64 ) NOT NULL COMMENT '受控来源账号别名,不保存密钥' ,
customer_code VARCHAR ( 64 ) NOT NULL COMMENT '领星货主原始编码,不等同平台客户标识' ,
warehouse_code VARCHAR ( 64 ) NOT NULL COMMENT '来源仓库原始编码,按仓独立统计' ,
delivery_no VARCHAR ( 128 ) NOT NULL COMMENT 'OMP 发货单号,采用列表及详情同一身份' ,
source_no VARCHAR ( 128 ) NULL COMMENT 'WMS 来源出库单号,缺失不以内部 ID 回退展示' ,
source_status INT NOT NULL COMMENT '原始状态,100 已出库、99 已取消;不改造成内部状态码' ,
source_created_time VARCHAR ( 64 ) NULL COMMENT '来源创建时间原始字符串,不使用采集时间替代' ,
source_outbound_time VARCHAR ( 64 ) NULL COMMENT '来源实际出库时间原始字符串,不使用采集时间替代' ,
source_timezone VARCHAR ( 64 ) NULL COMMENT '解析采用的源时区' ,
outbound_at_utc DATETIME ( 3 ) NULL COMMENT '已核准的实际出库时间点;非出库状态可空' ,
business_date DATE NULL COMMENT '已核准业务时区下的出库日' ,
business_timezone VARCHAR ( 64 ) NOT NULL COMMENT '该事实当前归属仓所用业务时区,迁仓后重新确定业务日' ,
sales_eligible TINYINT NOT NULL DEFAULT 0 COMMENT '仅已出库、时间与全部数量有效时为 1' ,
revision_no BIGINT NOT NULL DEFAULT 1 COMMENT '该单内容变更次数,不等于拉取次数' ,
content_hash CHAR ( 64 ) NOT NULL COMMENT '订单头及完整 SKU 明细规范化摘要' ,
last_run_id BIGINT NOT NULL COMMENT '最后一次确认或修订的执行尝试' ,
last_observation_sequence BIGINT NOT NULL COMMENT '最后接受的完整详情采集代次;仅防旧观测重放,不按 task 调度序号拒绝较晚实际读取的事实,不冒充领星源版本号' ,
PRIMARY KEY ( id ),
UNIQUE KEY uk_selfop_order ( source_account , customer_code , delivery_no ),
KEY idx_selfop_order_daily ( source_account , warehouse_code , sales_eligible , business_date , id ),
KEY idx_selfop_order_run ( last_run_id ),
CONSTRAINT chk_selfop_outbound_order CHECK ( revision_no > 0 AND last_observation_sequence > 0 AND sales_eligible IN ( 0 , 1 ) AND ( sales_eligible = 0 OR ( source_status = 100 AND source_timezone IS NOT NULL AND outbound_at_utc IS NOT NULL AND business_date IS NOT NULL )))
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '最后确认的单据事实' ;
CREATE TABLE ll_selfop_outbound_item (
id BIGINT NOT NULL COMMENT '应用生成的记录标识' ,
created_at DATETIME ( 3 ) NOT NULL COMMENT 'UTC创建时间' ,
updated_at DATETIME ( 3 ) NOT NULL COMMENT 'UTC更新时间' ,
order_id BIGINT NOT NULL COMMENT '对应外部出库事实' ,
sku_code VARCHAR ( 128 ) NOT NULL COMMENT '原始 productSku' ,
product_name VARCHAR ( 255 ) NULL COMMENT '来源商品名称,仅作展示' ,
actual_quantity DECIMAL ( 20 , 6 ) NOT NULL COMMENT '详情 actualDeliveryQty,必须为非负有效数值' ,
quantity_unit VARCHAR ( 32 ) NOT NULL COMMENT '已核准业务单位;未确认单位不发布正式数量统计' ,
PRIMARY KEY ( id ),
UNIQUE KEY uk_selfop_order_sku ( order_id , sku_code ),
KEY idx_selfop_item_sku ( sku_code , order_id ),
CONSTRAINT chk_selfop_outbound_item CHECK ( actual_quantity >= 0 )
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '整单替换的实际出库明细' ;
CREATE TABLE ll_selfop_inventory_snapshot (
id BIGINT NOT NULL COMMENT '应用生成的记录标识' ,
created_at DATETIME ( 3 ) NOT NULL COMMENT 'UTC创建时间' ,
updated_at DATETIME ( 3 ) NOT NULL COMMENT 'UTC更新时间' ,
snapshot_run_id BIGINT NOT NULL COMMENT 'INVENTORY 执行尝试;发布后该批明细不可修改' ,
source_account VARCHAR ( 64 ) NOT NULL COMMENT '受控来源账号别名,不保存密钥' ,
customer_code VARCHAR ( 64 ) NOT NULL COMMENT '领星货主原始编码,不等同平台客户标识' ,
warehouse_code VARCHAR ( 64 ) NOT NULL COMMENT '来源仓库原始编码,按仓独立统计' ,
sku_code VARCHAR ( 128 ) NOT NULL COMMENT '原始产品 SKU' ,
product_quality SMALLINT NOT NULL COMMENT '来源品质,当前 0 正品、1 次品;全量均保存,不套用整箱库存' ,
product_name VARCHAR ( 255 ) NULL COMMENT '来源名称' ,
physical_quantity DECIMAL ( 20 , 6 ) NULL COMMENT '来源stkQty实物库存,未知为空' ,
available_quantity DECIMAL ( 20 , 6 ) NULL COMMENT '来源useStkQty可用库存,未知为空,不再次扣冻结' ,
frozen_quantity DECIMAL ( 20 , 6 ) NULL COMMENT '来源freezeQty冻结库存,未知为空' ,
transit_quantity DECIMAL ( 20 , 6 ) NULL COMMENT '来源transitQty在途数量,未知为空,不计可售库存' ,
source_unique_key VARCHAR ( 512 ) NULL COMMENT '原 uniqueKey4tenant,只作来源证据' ,
observed_at_utc DATETIME ( 3 ) NOT NULL COMMENT '所在页实际采集时间;缺行占位取本批采集完成时间' ,
quality_status VARCHAR ( 16 ) NOT NULL COMMENT 'VALID、UNKNOWN、INVALID; STALE 按批次年龄实时派生' ,
quality_reason VARCHAR ( 64 ) NULL COMMENT 'SOURCE_ROW_MISSING、FIELD_MISSING、NEGATIVE_QUANTITY 等' ,
PRIMARY KEY ( id ),
UNIQUE KEY uk_selfop_stock_snapshot ( snapshot_run_id , source_account , customer_code , warehouse_code , sku_code , product_quality ),
KEY idx_selfop_stock_lookup ( source_account , customer_code , warehouse_code , sku_code , product_quality , snapshot_run_id )
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '产品库存全量批次明细' ;
CREATE TABLE ll_selfop_sku_daily_sales (
id BIGINT NOT NULL COMMENT '应用生成的记录标识' ,
created_at DATETIME ( 3 ) NOT NULL COMMENT 'UTC创建时间' ,
updated_at DATETIME ( 3 ) NOT NULL COMMENT 'UTC更新时间' ,
sales_run_id BIGINT NOT NULL COMMENT 'OUTBOUND 执行尝试,同时是计算版本' ,
source_account VARCHAR ( 64 ) NOT NULL COMMENT '受控来源账号别名,不保存密钥' ,
customer_code VARCHAR ( 64 ) NOT NULL COMMENT '领星货主原始编码,不等同平台客户标识' ,
warehouse_code VARCHAR ( 64 ) NOT NULL COMMENT '来源仓库原始编码,按仓独立统计' ,
sku_code VARCHAR ( 128 ) NOT NULL COMMENT '原始产品 SKU' ,
business_date DATE NOT NULL COMMENT '已核准业务日' ,
outbound_quantity DECIMAL ( 20 , 6 ) NOT NULL COMMENT '有效出库实际件数之和,非负' ,
outbound_order_count BIGINT NOT NULL COMMENT '该维度去重发货单数,非负' ,
quantity_unit VARCHAR ( 32 ) NOT NULL COMMENT '同一统计维度内一致的业务单位' ,
PRIMARY KEY ( id ),
UNIQUE KEY uk_selfop_daily_version ( sales_run_id , source_account , customer_code , warehouse_code , sku_code , business_date ),
2026-10-13 01:05:52 +08:00
KEY idx_selfop_daily_window_cover ( sales_run_id , source_account , warehouse_code , business_date , customer_code , sku_code , outbound_quantity , outbound_order_count , quantity_unit ),
KEY idx_selfop_daily_sku_cover ( sales_run_id , source_account , warehouse_code , customer_code , sku_code , business_date , outbound_quantity , outbound_order_count , quantity_unit ),
2026-10-12 20:27:35 +08:00
CONSTRAINT chk_selfop_sku_daily_sales CHECK ( outbound_quantity >= 0 AND outbound_order_count >= 0 )
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '完整销量版本的稀疏日事实' ;
2026-10-13 09:40:55 +08:00
CREATE TABLE ll_selfop_warehouse_daily_sales (
sales_run_id BIGINT NOT NULL COMMENT '完整销量计算版本标识' ,
source_account VARCHAR ( 64 ) NOT NULL COMMENT '受控来源账号别名,不保存密钥' ,
warehouse_code VARCHAR ( 64 ) NOT NULL COMMENT '来源仓库原始编码' ,
business_date DATE NOT NULL COMMENT '已核准业务日' ,
observed_quantity DECIMAL ( 38 , 6 ) NULL COMMENT '该日PCS非负有效出库量之和,无有效行时为空' ,
invalid_row_count BIGINT NOT NULL COMMENT '该日数量为空或负数或单位非PCS的日事实行数' ,
source_row_count BIGINT NOT NULL COMMENT '该日参与仓库汇总的SKU日事实总行数' ,
created_at DATETIME ( 3 ) NOT NULL COMMENT 'UTC创建时间' ,
updated_at DATETIME ( 3 ) NOT NULL COMMENT 'UTC更新时间' ,
PRIMARY KEY ( sales_run_id , source_account , warehouse_code , business_date ),
CONSTRAINT chk_selfop_warehouse_daily_sales CHECK ( source_row_count > 0 AND invalid_row_count >= 0 AND invalid_row_count <= source_row_count AND ( observed_quantity IS NULL OR observed_quantity >= 0 ))
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '完整销量版本按仓按日汇总,随SKU日事实批次原子构建' ;
2026-10-12 20:27:35 +08:00
CREATE TABLE ll_selfop_sku_profile (
id BIGINT NOT NULL COMMENT '应用生成的记录标识' ,
created_at DATETIME ( 3 ) NOT NULL COMMENT 'UTC创建时间' ,
updated_at DATETIME ( 3 ) NOT NULL COMMENT 'UTC更新时间' ,
profile_run_id BIGINT NOT NULL COMMENT '本仓销量或库存候选版本;与对应 daily/snapshot 使用同一 run,发布后该版本全部维度行不可修改' ,
source_account VARCHAR ( 64 ) NOT NULL COMMENT '受控来源账号别名,不保存密钥' ,
customer_code VARCHAR ( 64 ) NOT NULL COMMENT '领星货主原始编码,不等同平台客户标识' ,
warehouse_code VARCHAR ( 64 ) NOT NULL COMMENT '来源仓库原始编码,按仓独立统计' ,
sku_code VARCHAR ( 128 ) NOT NULL COMMENT '原始产品 SKU' ,
product_name VARCHAR ( 255 ) NULL COMMENT '本版本确认的名称,不实时连接其他版本名称' ,
quantity_unit VARCHAR ( 32 ) NULL COMMENT '本版本已核准单位;未知或两版本单位冲突时不计算混合指标' ,
first_seen_at_utc DATETIME ( 3 ) NULL COMMENT '本证据族真实观测到本仓商品的最早接收时刻;缺行占位不能生成观察证据' ,
earliest_evidence_at_utc DATETIME ( 3 ) NULL COMMENT '库存版取真实库存首次观察时刻;销量版从该版有效事实重新求最早已核准出库时间,可随改期、取消或迁仓撤回/后移' ,
evidence_type VARCHAR ( 24 ) NOT NULL COMMENT 'INVENTORY_OBSERVATION、VALID_OUTBOUND、NONE;不得将销量证据复制成库存真实观察证据' ,
evidence_run_id BIGINT NULL COMMENT '本证据族真实依据的采集批次,无证据占位为空' ,
last_seen_run_id BIGINT NULL COMMENT '本证据族最近真实观测批次,无证据占位为空' ,
PRIMARY KEY ( id ),
UNIQUE KEY uk_selfop_profile_version ( profile_run_id , source_account , customer_code , warehouse_code , sku_code ),
KEY idx_selfop_profile_evidence ( profile_run_id , earliest_evidence_at_utc , customer_code , sku_code )
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '随发布版本固定的 SKU 维度与观察依据' ;
2026-10-14 11:36:35 +08:00
-- PDA cargo discard photo evidence
CREATE TABLE IF NOT EXISTS ll_cargo_discard_photo (
2026-10-15 21:05:34 +08:00
id BIGINT NOT NULL COMMENT '照片记录标识' ,
customer_id VARCHAR ( 64 ) NOT NULL COMMENT '所属客户标识' ,
application_id BIGINT NOT NULL COMMENT '废弃申请标识' ,
pallet_no VARCHAR ( 128 ) NOT NULL COMMENT '托盘业务码' ,
file_id BIGINT NOT NULL COMMENT '照片文件标识' ,
file_name VARCHAR ( 255 ) NOT NULL COMMENT '原始文件名' ,
content_type VARCHAR ( 128 ) NOT NULL COMMENT '文件媒体类型' ,
size_bytes BIGINT NOT NULL COMMENT '文件字节数' ,
operator_id VARCHAR ( 64 ) NOT NULL COMMENT '上传操作人标识' ,
created_at DATETIME ( 6 ) NOT NULL COMMENT '照片创建时间' ,
submitted_at DATETIME ( 6 ) NULL COMMENT '照片提交时间' ,
2026-10-14 11:36:35 +08:00
PRIMARY KEY ( id ),
UNIQUE KEY uk_cargo_discard_photo_file ( file_id ),
KEY idx_cargo_discard_photo_application ( customer_id , application_id , pallet_no )
2026-10-15 21:05:34 +08:00
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '海外PDA货物废弃照片凭证' ;
2026-10-14 16:15:39 +08:00
CREATE TABLE ll_selfop_owner (
id BIGINT NOT NULL COMMENT '主键' ,
run_id BIGINT NOT NULL COMMENT '完整资料采集版本' ,
source_account VARCHAR ( 64 ) COLLATE utf8mb4_bin NOT NULL COMMENT '来源账号' ,
customer_code VARCHAR ( 64 ) COLLATE utf8mb4_bin NOT NULL COMMENT '领星货主编码' ,
customer_name VARCHAR ( 255 ) NULL COMMENT '领星货主名称' ,
source_status VARCHAR ( 32 ) NULL COMMENT '来源启停状态' ,
observed_at_utc DATETIME ( 6 ) NOT NULL COMMENT '资料观测时间' ,
PRIMARY KEY ( id ),
UNIQUE KEY uk_selfop_owner_version ( run_id , source_account , customer_code ),
KEY idx_selfop_owner_lookup ( source_account , customer_code , run_id )
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT = '自营领星货主资料版本' ;
CREATE TABLE ll_selfop_product (
id BIGINT NOT NULL COMMENT '主键' ,
run_id BIGINT NOT NULL COMMENT '完整资料采集版本' ,
source_account VARCHAR ( 64 ) COLLATE utf8mb4_bin NOT NULL COMMENT '来源账号' ,
customer_code VARCHAR ( 64 ) COLLATE utf8mb4_bin NOT NULL COMMENT '领星货主编码' ,
sku_code VARCHAR ( 128 ) COLLATE utf8mb4_bin NOT NULL COMMENT '货主商品编码' ,
product_name VARCHAR ( 255 ) NULL COMMENT '商品名称' ,
declared_length DECIMAL ( 24 , 6 ) NULL COMMENT '商品资料长度' ,
declared_width DECIMAL ( 24 , 6 ) NULL COMMENT '商品资料宽度' ,
declared_height DECIMAL ( 24 , 6 ) NULL COMMENT '商品资料高度' ,
declared_size_unit VARCHAR ( 32 ) NULL COMMENT '商品资料尺寸单位' ,
measured_length DECIMAL ( 24 , 6 ) NULL COMMENT '仓库实测长度' ,
measured_width DECIMAL ( 24 , 6 ) NULL COMMENT '仓库实测宽度' ,
measured_height DECIMAL ( 24 , 6 ) NULL COMMENT '仓库实测高度' ,
measured_size_unit VARCHAR ( 32 ) NULL COMMENT '仓库实测尺寸单位' ,
observed_at_utc DATETIME ( 6 ) NOT NULL COMMENT '资料观测时间' ,
PRIMARY KEY ( id ),
UNIQUE KEY uk_selfop_product_version ( run_id , source_account , customer_code , sku_code ),
KEY idx_selfop_product_lookup ( source_account , customer_code , sku_code , run_id )
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT = '自营领星商品资料版本' ;
2026-10-15 13:30:37 +08:00
2026-10-15 15:42:10 +08:00
-- 仓储转运逐箱测量与清点;仅增加字段,不修改业务数据。
USE baiyue_lastleg ;
SET @ ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_warehouse_transfer_carton' AND column_name = 'length_cm' ), 'SELECT 1' , 'ALTER TABLE ll_warehouse_transfer_carton ADD COLUMN length_cm DECIMAL(12,2) NULL COMMENT ''箱子实测长度厘米''' ));
PREPARE transfer_count_stmt FROM @ ddl ; EXECUTE transfer_count_stmt ; DEALLOCATE PREPARE transfer_count_stmt ;
SET @ ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_warehouse_transfer_carton' AND column_name = 'width_cm' ), 'SELECT 1' , 'ALTER TABLE ll_warehouse_transfer_carton ADD COLUMN width_cm DECIMAL(12,2) NULL COMMENT ''箱子实测宽度厘米''' ));
PREPARE transfer_count_stmt FROM @ ddl ; EXECUTE transfer_count_stmt ; DEALLOCATE PREPARE transfer_count_stmt ;
SET @ ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_warehouse_transfer_carton' AND column_name = 'height_cm' ), 'SELECT 1' , 'ALTER TABLE ll_warehouse_transfer_carton ADD COLUMN height_cm DECIMAL(12,2) NULL COMMENT ''箱子实测高度厘米''' ));
PREPARE transfer_count_stmt FROM @ ddl ; EXECUTE transfer_count_stmt ; DEALLOCATE PREPARE transfer_count_stmt ;
SET @ ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_warehouse_transfer_carton' AND column_name = 'gross_weight_kg' ), 'SELECT 1' , 'ALTER TABLE ll_warehouse_transfer_carton ADD COLUMN gross_weight_kg DECIMAL(12,2) NULL COMMENT ''箱子实测重量千克''' ));
PREPARE transfer_count_stmt FROM @ ddl ; EXECUTE transfer_count_stmt ; DEALLOCATE PREPARE transfer_count_stmt ;
SET @ ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_warehouse_transfer_carton' AND column_name = 'counted_quantity' ), 'SELECT 1' , 'ALTER TABLE ll_warehouse_transfer_carton ADD COLUMN counted_quantity BIGINT NULL COMMENT ''箱内SKU实点件数''' ));
PREPARE transfer_count_stmt FROM @ ddl ; EXECUTE transfer_count_stmt ; DEALLOCATE PREPARE transfer_count_stmt ;
SET @ ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_warehouse_transfer_carton' AND column_name = 'count_idempotency_key' ), 'SELECT 1' , 'ALTER TABLE ll_warehouse_transfer_carton ADD COLUMN count_idempotency_key VARCHAR(255) NULL COMMENT ''箱内清点幂等键''' ));
PREPARE transfer_count_stmt FROM @ ddl ; EXECUTE transfer_count_stmt ; DEALLOCATE PREPARE transfer_count_stmt ;
SET @ ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_warehouse_transfer_carton' AND column_name = 'count_request_hash' ), 'SELECT 1' , 'ALTER TABLE ll_warehouse_transfer_carton ADD COLUMN count_request_hash VARCHAR(64) NULL COMMENT ''箱内清点请求摘要''' ));
PREPARE transfer_count_stmt FROM @ ddl ; EXECUTE transfer_count_stmt ; DEALLOCATE PREPARE transfer_count_stmt ;
SET @ ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_warehouse_transfer_carton' AND column_name = 'counted_by' ), 'SELECT 1' , 'ALTER TABLE ll_warehouse_transfer_carton ADD COLUMN counted_by VARCHAR(128) NULL COMMENT ''箱内清点操作人''' ));
PREPARE transfer_count_stmt FROM @ ddl ; EXECUTE transfer_count_stmt ; DEALLOCATE PREPARE transfer_count_stmt ;
SET @ ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_warehouse_transfer_carton' AND column_name = 'counted_at' ), 'SELECT 1' , 'ALTER TABLE ll_warehouse_transfer_carton ADD COLUMN counted_at DATETIME(3) NULL COMMENT ''箱内清点完成时间''' ));
PREPARE transfer_count_stmt FROM @ ddl ; EXECUTE transfer_count_stmt ; DEALLOCATE PREPARE transfer_count_stmt ;
SET @ ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_warehouse_transfer_carton' AND column_name = 'discrepancy_reason' ), 'SELECT 1' , 'ALTER TABLE ll_warehouse_transfer_carton ADD COLUMN discrepancy_reason VARCHAR(1000) NULL COMMENT ''实收与预报箱数差异原因''' ));
PREPARE transfer_count_stmt FROM @ ddl ; EXECUTE transfer_count_stmt ; DEALLOCATE PREPARE transfer_count_stmt ;
SET @ ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_warehouse_transfer_carton' AND column_name = 'transfer_pallet_id' ), 'SELECT 1' , 'ALTER TABLE ll_warehouse_transfer_carton ADD COLUMN transfer_pallet_id BIGINT NULL COMMENT ''签收箱所属转运托盘事实ID''' ));
PREPARE transfer_count_stmt FROM @ ddl ; EXECUTE transfer_count_stmt ; DEALLOCATE PREPARE transfer_count_stmt ;
-- SKU 申报件数独立于预计箱数;历史未申报件数保持 NULL,实收以 PDA 清点为准。
SET @ ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_warehouse_transfer_item' AND column_name = 'declared_quantity' ), 'SELECT 1' , 'ALTER TABLE ll_warehouse_transfer_item ADD COLUMN declared_quantity BIGINT NULL COMMENT ''SKU申报件数,非预计或实收箱数''' ));
PREPARE transfer_quantity_stmt FROM @ ddl ; EXECUTE transfer_quantity_stmt ; DEALLOCATE PREPARE transfer_quantity_stmt ;
2026-10-15 13:30:37 +08:00
-- 历史库存基线;执行前必须取得指定环境的建表授权。
CREATE TABLE IF NOT EXISTS ll_selfop_inventory_flow (
id BIGINT NOT NULL COMMENT '应用生成的流水记录标识' ,
source_account VARCHAR ( 64 ) NOT NULL COMMENT '受控来源账号' ,
warehouse_code VARCHAR ( 64 ) NOT NULL COMMENT '来源仓库编码' ,
customer_code VARCHAR ( 64 ) NOT NULL COMMENT '来源货主编码' ,
sku_code VARCHAR ( 128 ) NOT NULL COMMENT '来源商品编码' ,
source_flow_id VARCHAR ( 64 ) NOT NULL COMMENT '来源流水字符串标识' ,
product_quality INT NOT NULL COMMENT '来源品质,零正品一次品,其他未知' ,
cell_no VARCHAR ( 128 ) NULL COMMENT '来源库位编码' ,
inner_batch_no VARCHAR ( 128 ) NULL COMMENT '来源内部批次号' ,
bill_no VARCHAR ( 128 ) NULL COMMENT '来源业务单号' ,
source_no VARCHAR ( 128 ) NULL COMMENT '来源关联单号' ,
bill_type VARCHAR ( 32 ) NULL COMMENT '来源业务类型,未验证类型不得参与正式还原' ,
book_qty DECIMAL ( 20 , 6 ) NULL COMMENT '来源记账增减量,未知为空' ,
book_change_qty_raw VARCHAR ( 64 ) NULL COMMENT '来源带符号变动量原文' ,
delta_quantity DECIMAL ( 20 , 6 ) NULL COMMENT '解析后的有符号实物变动量' ,
close_quantity DECIMAL ( 20 , 6 ) NULL COMMENT '对应库位批次品质链的结存' ,
source_create_time VARCHAR ( 64 ) NULL COMMENT '来源北京时间原文' ,
event_at_utc DATETIME ( 3 ) NULL COMMENT '流水发生UTC时刻,无法解析时为空' ,
business_date DATE NULL COMMENT '北京时间业务日期' ,
quantity_unit VARCHAR ( 16 ) NULL COMMENT '已确认数量单位,未知为空' ,
content_hash CHAR ( 64 ) NOT NULL COMMENT '当前事实内容摘要' ,
revision_no BIGINT NOT NULL COMMENT '同来源流水单调增加的修订号' ,
stage_id BIGINT NOT NULL COMMENT '当前事实对应不可变暂存证据' ,
first_run_id BIGINT NOT NULL COMMENT '首次观察执行尝试' ,
last_run_id BIGINT NOT NULL COMMENT '最近确认执行尝试' ,
last_observed_at DATETIME ( 3 ) NOT NULL COMMENT '最近观察UTC时刻' ,
validation_status VARCHAR ( 16 ) NOT NULL COMMENT '字段资格,有效或未知' ,
validation_reason VARCHAR ( 64 ) NULL COMMENT '数量或身份待核验原因' ,
PRIMARY KEY ( id ),
UNIQUE KEY uk_selfop_flow_source ( source_account , warehouse_code , source_flow_id ),
KEY idx_selfop_flow_sku ( source_account , warehouse_code , customer_code , sku_code , event_at_utc ),
KEY idx_selfop_flow_day ( source_account , warehouse_code , business_date ),
CONSTRAINT chk_selfop_flow_revision CHECK ( revision_no > 0 )
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '自营历史库存流水最新事实,旧版本保留于暂存证据' ;
CREATE TABLE IF NOT EXISTS ll_selfop_inventory_day_version (
id BIGINT NOT NULL COMMENT '不可变历史日版本标识' ,
source_account VARCHAR ( 64 ) NOT NULL COMMENT '受控来源账号' ,
warehouse_code VARCHAR ( 64 ) NOT NULL COMMENT '来源仓库编码' ,
business_date DATE NOT NULL COMMENT '北京时间日末所属日期' ,
scope_hash CHAR ( 64 ) NOT NULL COMMENT '业务范围摘要' ,
rule_version VARCHAR ( 32 ) NOT NULL COMMENT '日末库存还原规则版本' ,
build_run_id BIGINT NOT NULL COMMENT '历史重建执行尝试' ,
publication_group_id BIGINT NOT NULL COMMENT '必须一起切换的发布组标识' ,
sales_run_id BIGINT NULL COMMENT '构建时固定的销量证据版本' ,
anchor_run_id BIGINT NOT NULL COMMENT '固定的独立库存锚点版本' ,
input_hash CHAR ( 64 ) NOT NULL COMMENT '冻结流水修订与覆盖及锚点输入摘要' ,
evidence_json JSON NOT NULL COMMENT '固定输入清单及不可变证据引用' ,
status VARCHAR ( 16 ) NOT NULL COMMENT '构建中、就绪、已发布、已替代或失败' ,
head_slot TINYINT NULL COMMENT '当前日头为一,非当前版本为空' ,
valid_sku_count BIGINT NOT NULL DEFAULT 0 COMMENT '合格商品数' ,
unknown_sku_count BIGINT NOT NULL DEFAULT 0 COMMENT '待核验商品数' ,
created_at DATETIME ( 3 ) NOT NULL COMMENT '版本创建UTC时刻' ,
published_at DATETIME ( 3 ) NULL COMMENT '发布组提交UTC时刻' ,
superseded_at DATETIME ( 3 ) NULL COMMENT '被新组替代的UTC时刻' ,
invalidated_at DATETIME ( 3 ) NULL COMMENT '已确认输入失效的UTC时刻' ,
invalidation_reason VARCHAR ( 64 ) NULL COMMENT '旧版本失效原因' ,
rebuild_run_id BIGINT NULL COMMENT '处理失效版本的重建尝试' ,
PRIMARY KEY ( id ),
UNIQUE KEY uk_selfop_history_head ( source_account , warehouse_code , business_date , head_slot ),
UNIQUE KEY uk_selfop_history_build_day ( build_run_id , business_date ),
KEY idx_selfop_history_group ( publication_group_id , status ),
CONSTRAINT chk_selfop_history_head CHECK ( head_slot IS NULL OR ( head_slot = 1 AND status = 'PUBLISHED' ))
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '历史日库存不可变版本及原子发布日头' ;
CREATE TABLE IF NOT EXISTS ll_selfop_inventory_daily (
day_version_id BIGINT NOT NULL COMMENT '所属历史日版本' ,
customer_code VARCHAR ( 64 ) NOT NULL COMMENT '来源货主编码' ,
sku_code VARCHAR ( 128 ) NOT NULL COMMENT '来源商品编码' ,
product_quality INT NOT NULL COMMENT '来源库存品质' ,
physical_quantity DECIMAL ( 20 , 6 ) NULL COMMENT '日末实物库存,未知为空,已确认零为零' ,
quality_status VARCHAR ( 16 ) NOT NULL COMMENT '日末资格,有效或未知' ,
quality_reason VARCHAR ( 64 ) NULL COMMENT '缺覆盖或锚点等未知原因' ,
anchor_reference BIGINT NULL COMMENT '独立库存锚点版本' ,
evidence_hash CHAR ( 64 ) NOT NULL COMMENT '该日计算证据摘要' ,
source VARCHAR ( 32 ) NOT NULL COMMENT '库存来源标记,流水还原' ,
PRIMARY KEY ( day_version_id , customer_code , sku_code , product_quality ),
KEY idx_selfop_daily_identity ( customer_code , sku_code , day_version_id ),
CONSTRAINT chk_selfop_daily_quantity CHECK (( quality_status = 'VALID' AND physical_quantity IS NOT NULL AND physical_quantity >= 0 ) OR ( quality_status = 'UNKNOWN' AND physical_quantity IS NULL ))
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '历史日末分货主商品品质实物库存' ;
2026-10-15 16:55:57 +08:00
2026-10-15 18:25:53 +08:00
-- 仓储转运一箱多SKU清点;仅增加结构,不回填历史业务数据。
USE baiyue_lastleg ;
SET @ ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_warehouse_transfer_carton' AND column_name = 'sku_items_json' ), 'SELECT 1' , 'ALTER TABLE ll_warehouse_transfer_carton ADD COLUMN sku_items_json JSON NULL COMMENT ''实收箱内SKU及逐项件数明细''' ));
PREPARE transfer_sku_stmt FROM @ ddl ; EXECUTE transfer_sku_stmt ; DEALLOCATE PREPARE transfer_sku_stmt ;
2026-10-15 16:55:57 +08:00
-- Appointment work scope, audit and physical batch allocation.
USE baiyue_lastleg ;
CREATE TABLE IF NOT EXISTS ll_dispatch_appointment_allocation (
2026-10-15 21:05:34 +08:00
dispatch_id BIGINT NOT NULL COMMENT '排车单标识' ,
dispatch_item_id BIGINT NOT NULL COMMENT '排车明细标识' ,
plan_pallet_id BIGINT NOT NULL COMMENT '入仓计划托盘标识' ,
batch_key VARCHAR ( 96 ) NOT NULL COMMENT '预约稳定批次键' ,
customer_id VARCHAR ( 64 ) NOT NULL COMMENT '所属客户标识' ,
source_key VARCHAR ( 160 ) NOT NULL COMMENT '货物来源稳定键' ,
destination_key VARCHAR ( 160 ) NOT NULL COMMENT '目的地稳定键' ,
package_count INT NOT NULL COMMENT '本票分配实物箱数' ,
2026-10-15 16:55:57 +08:00
PRIMARY KEY ( dispatch_item_id , batch_key , source_key , destination_key ),
KEY idx_dispatch_appointment_batch ( batch_key , customer_id ),
KEY idx_dispatch_appointment_dispatch ( dispatch_id )
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '排车实物与预约批次逐票分配,原执行域事实' ;
CREATE TABLE IF NOT EXISTS ll_appointment_work_commitment (
2026-10-15 21:05:34 +08:00
entity_key VARCHAR ( 160 ) NOT NULL COMMENT '原业务实体稳定键' ,
2026-10-15 16:55:57 +08:00
state_json LONGTEXT NOT NULL COMMENT '原业务命令产生的只读语义影响基线,不是第二份可编辑计划' ,
2026-10-15 21:05:34 +08:00
impact_version BIGINT NOT NULL DEFAULT 0 COMMENT '承诺影响单调递增版本' ,
2026-10-15 16:55:57 +08:00
PRIMARY KEY ( entity_key )
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '工作事项承诺影响审计基线' ;
CREATE TABLE IF NOT EXISTS ll_appointment_work_guard (
id INT NOT NULL COMMENT '工作事项协调锁,固定1' ,
scan_cursor VARCHAR ( 128 ) NULL COMMENT '已开船来源同步游标' ,
initialized BOOLEAN NOT NULL DEFAULT FALSE COMMENT '是否完成首次完整来源扫描' ,
scope_version VARCHAR ( 128 ) NULL COMMENT '完整同步已确认的权威来源集合版本' ,
scan_scope_version VARCHAR ( 128 ) NULL COMMENT '当前扫描来源集合版本,防跨页漂移' ,
completed_at DATETIME ( 3 ) NULL COMMENT '最近完整同步UTC时间' ,
requirement_version BIGINT NOT NULL DEFAULT 0 COMMENT '原域命令在同一事务推进的需求版本' ,
synchronized_requirement_version BIGINT NOT NULL DEFAULT 0 COMMENT '完整扫描已消费需求版本' ,
scan_requirement_version BIGINT NOT NULL DEFAULT 0 COMMENT '当前扫描需求版本,防跨页漂移' ,
PRIMARY KEY ( id )
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '预约工作事项同步与命令串行守卫' ;
INSERT INTO ll_appointment_work_guard ( id , initialized ) SELECT 1 , FALSE WHERE NOT EXISTS ( SELECT 1 FROM ll_appointment_work_guard WHERE id = 1 );
CREATE TABLE IF NOT EXISTS ll_appointment_work (
work_item_key VARCHAR ( 96 ) NOT NULL COMMENT '不可变事项键,业务身份确定性生成' ,
container_booking_id VARCHAR ( 64 ) NOT NULL COMMENT '来源柜次内部关联标识,不作展示编号' ,
version INT NOT NULL DEFAULT 0 COMMENT '工作命令乐观锁版本' ,
retired BOOLEAN NOT NULL DEFAULT FALSE COMMENT '已替代或已完成路线需求,不计活动工作' ,
state_json LONGTEXT NOT NULL COMMENT '工作关系责任跟进及影响基线,不保存可编辑业务执行事实' ,
PRIMARY KEY ( work_item_key ),
KEY idx_appointment_work_container ( container_booking_id , retired )
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '预约工作事项需求与关系' ;
CREATE TABLE IF NOT EXISTS ll_appointment_work_history (
id VARCHAR ( 36 ) NOT NULL COMMENT '历史记录标识' ,
work_item_key VARCHAR ( 96 ) NOT NULL COMMENT '事项稳定键' ,
operator_id VARCHAR ( 64 ) NOT NULL COMMENT '真实操作人员标识' ,
operator_name VARCHAR ( 128 ) NULL COMMENT '操作人显示名称' ,
action VARCHAR ( 48 ) NOT NULL COMMENT '工作命令或观察动作' ,
summary VARCHAR ( 2000 ) NOT NULL COMMENT '处理或责任变更依据' ,
command_key VARCHAR ( 64 ) NULL COMMENT '请求幂等键,观察记录为空' ,
request_hash VARCHAR ( 64 ) NULL COMMENT '包含操作者的规范请求摘要' ,
response_json LONGTEXT NULL COMMENT '原命令响应快照,重放不随当前状态改变' ,
occurred_at DATETIME ( 3 ) NOT NULL COMMENT '历史发生UTC时间' ,
PRIMARY KEY ( id ),
UNIQUE KEY uk_appointment_work_command ( work_item_key , command_key ),
KEY idx_appointment_work_history ( work_item_key , occurred_at )
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '预约工作事项历史与幂等命令' ;
2026-10-16 11:41:24 +08:00
-- 新单据短号:相同业务及客户名称缩写共享逻辑秒,避免同秒或多实例重号。
CREATE TABLE IF NOT EXISTS ll_compact_number_clock (
number_key VARCHAR ( 16 ) NOT NULL COMMENT '业务前缀和客户名称缩写' ,
last_second BIGINT NOT NULL COMMENT '最后分配的Unix逻辑秒' ,
PRIMARY KEY ( number_key )
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '海外业务短单号分配时钟' ;
-- 库存转运无需再次预约入仓;目标库:lastleg-service 所属数据库。可重复执行。
SET @ ddl = ( SELECT IF ( EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_warehouse_transfer_order' AND column_name = 'estimated_arrival_at' AND is_nullable = 'NO' ), 'ALTER TABLE ll_warehouse_transfer_order MODIFY COLUMN estimated_arrival_at DATETIME(3) NULL COMMENT ''预计入仓时间,库存转运不填写''' , 'SELECT 1' ));
PREPARE stmt FROM @ ddl ; EXECUTE stmt ; DEALLOCATE PREPARE stmt ;