3104 lines
309 KiB
SQL
3104 lines
309 KiB
SQL
SET NAMES utf8mb4;
|
||
|
||
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='头程装柜完成事件接收幂等箱';
|
||
|
||
CREATE TABLE IF NOT EXISTS ll_container_shipping_gate (
|
||
container_booking_id VARCHAR(128) NOT NULL COMMENT '来源头程柜预订ID',
|
||
ocean_booking_id VARCHAR(128) NULL COMMENT '来源海运订舱ID;货柜未关联订舱时为空', container_no VARCHAR(64) NOT NULL COMMENT '实际集装箱号',
|
||
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 '更新时间',
|
||
PRIMARY KEY(container_booking_id), KEY idx_ll_shipping_gate_candidate(container_no,status),
|
||
KEY idx_ll_shipping_gate_version(container_booking_id,aggregate_version,node_sequence)
|
||
) ENGINE=InnoDB COMMENT='海外PDA柜号船节点收货资格快照';
|
||
|
||
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='尾程单号按日原子流水';
|
||
|
||
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 '租户/客户账号标识',
|
||
order_type VARCHAR(32) NOT NULL DEFAULT 'FIRST_LEG' COMMENT '订单类型:FIRST_LEG头程订单、RELABEL_APPLICATION换标下单、WAREHOUSE_TRANSFER仓储转运、LOCAL_LOOSEBOARD本土散板、RETURN_RELABEL退货换标、ONE_CLICK_DROPSHIP一件代发',
|
||
lx_code VARCHAR(128) NULL COMMENT '一件代发领星入库单代码',
|
||
destination_type VARCHAR(32) NULL COMMENT '目的类型:FBA按箱数接收、OVERSEAS逐箱扫码',
|
||
inbound_code VARCHAR(128) NULL COMMENT '真实来源入仓码;无入仓关系的海外本土业务为空',
|
||
source_region VARCHAR(32) NOT NULL COMMENT '来源区域/系统',
|
||
source_inbound_id VARCHAR(128) NOT NULL COMMENT '最终实装 LOADED 分片 ID,建单幂等键',
|
||
root_inbound_id VARCHAR(128) COMMENT '根入仓单 ID',
|
||
source_order_id VARCHAR(128) COMMENT '来源订单 ID',
|
||
source_order_no VARCHAR(128) COMMENT '来源订单号',
|
||
root_order_id VARCHAR(128) COMMENT '根订单 ID',
|
||
customer_name VARCHAR(255) COMMENT '货主名称',
|
||
source_warehouse_id VARCHAR(128) COMMENT '来源国内装柜仓 ID 快照',
|
||
source_warehouse_name VARCHAR(255) COMMENT '来源国内装柜仓名称快照',
|
||
overseas_warehouse_id VARCHAR(128) NULL COMMENT '海外接柜仓ID;新建尾程订单由业务服务预分配',
|
||
overseas_warehouse_code VARCHAR(128) NULL COMMENT '海外接柜仓业务编码快照',
|
||
overseas_warehouse_name VARCHAR(255) NULL COMMENT '海外接柜仓名称快照',
|
||
receiving_warehouse_version INT NOT NULL DEFAULT 0 COMMENT '柜级接柜仓分配乐观锁版本',
|
||
transfer_warehouse_id VARCHAR(128) COMMENT '转入目的仓 ID',
|
||
transfer_warehouse_code VARCHAR(128) COMMENT '转入目的仓编码',
|
||
transfer_warehouse_name VARCHAR(255) COMMENT '转入目的仓名称',
|
||
fba_warehouse_code VARCHAR(128) COMMENT 'FBA 仓库编码',
|
||
container_no VARCHAR(64) COMMENT '集装箱号',
|
||
abnormal TINYINT NOT NULL DEFAULT 0 COMMENT '是否异常:0否1是',
|
||
detained TINYINT NOT NULL DEFAULT 0 COMMENT '是否暂扣:0否1是',
|
||
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 '尾程订单命令乐观锁版本',
|
||
pallet_count INT NOT NULL DEFAULT 0 COMMENT '托数',
|
||
package_count INT NOT NULL DEFAULT 0 COMMENT '箱数',
|
||
received_package_count INT NULL COMMENT 'PDA实际入库箱数',
|
||
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 '预计到仓时间',
|
||
arrival_time_version INT NOT NULL DEFAULT 0 COMMENT '柜级预计到仓时间乐观锁版本',
|
||
inbound_order_no VARCHAR(128) COMMENT '入库单号',
|
||
outbound_order_no VARCHAR(128) COMMENT '出库单号',
|
||
delivery_order_no VARCHAR(128) COMMENT '派送单号',
|
||
relabel_order_no VARCHAR(128) COMMENT '换标单号',
|
||
relabel_status VARCHAR(32) COMMENT '换标状态',
|
||
pallet_merge_flag VARCHAR(32) COMMENT '合托标记',
|
||
pallet_merge_batch_id VARCHAR(64) NULL COMMENT '平台预标记合托分组号',
|
||
current_status VARCHAR(32) NOT NULL DEFAULT 'PENDING_ASSIGNMENT' COMMENT '当前业务状态:PENDING_ASSIGNMENT待分配、PENDING_INBOUND待入库、INBOUND_COMPLETED入库完成、PENDING_DELIVERY待派送、DELIVERING派送中、DELIVERED派送完成',
|
||
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',
|
||
source_container_booking_id VARCHAR(128) NULL COMMENT '来源头程货柜预订ID',
|
||
source_loading_plan_version BIGINT COMMENT '来源装柜计划版本',
|
||
source_handover_version BIGINT COMMENT '交接版本',
|
||
source_payload_hash VARCHAR(71) NOT NULL COMMENT '来源事件负载摘要',
|
||
created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '创建时间',
|
||
updated_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3) COMMENT '更新时间',
|
||
PRIMARY KEY(id),
|
||
UNIQUE KEY uk_ll_order_source (customer_id,source_region,source_inbound_id),
|
||
KEY idx_ll_order_group(customer_id,order_no),
|
||
KEY idx_ll_order_container(customer_id,container_no),
|
||
KEY idx_ll_order_list(customer_id,current_status,created_at),
|
||
KEY idx_ll_order_container_progress(source_container_booking_id,estimated_warehouse_at,created_at,id)
|
||
) ENGINE=InnoDB COMMENT='尾程订单主表';
|
||
|
||
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='头程交接的不可变托盘码快照';
|
||
|
||
|
||
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;
|
||
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;
|
||
|
||
CREATE TABLE IF NOT EXISTS ll_order_detail (
|
||
id BIGINT NOT NULL AUTO_INCREMENT COMMENT '订单明细主键',
|
||
customer_id VARCHAR(128) NOT NULL COMMENT '客户数据隔离键',
|
||
order_id BIGINT NOT NULL COMMENT '尾程订单 ID',
|
||
source_inbound_detail_id VARCHAR(128) NOT NULL COMMENT '来源入仓明细 ID',
|
||
sku_code VARCHAR(128) COMMENT 'SKU 编码',
|
||
product_name_zh VARCHAR(255) COMMENT '中文品名',
|
||
product_name_en VARCHAR(255) COMMENT '英文品名',
|
||
package_count INT NOT NULL DEFAULT 0 COMMENT '箱数',
|
||
product_quantity INT COMMENT '数量',
|
||
pallet_count INT COMMENT '托数',
|
||
gross_weight_kg DECIMAL(18,4) COMMENT '毛重(千克)',
|
||
net_weight_kg DECIMAL(18,4) COMMENT '净重(千克)',
|
||
dimensional_weight_kg DECIMAL(18,4) COMMENT '体积重量(千克)',
|
||
volume_cbm DECIMAL(18,4) COMMENT '体积(立方米)',
|
||
destination_warehouse_id VARCHAR(128) COMMENT '目的仓 ID',
|
||
destination_warehouse_code VARCHAR(128) COMMENT '目的仓编码',
|
||
destination_warehouse_name VARCHAR(255) COMMENT '目的仓名称',
|
||
fba_tracking_no VARCHAR(255) COMMENT 'FBA跟踪号',
|
||
shipment_no VARCHAR(255) COMMENT '货件编号',
|
||
shipping_mark VARCHAR(255) COMMENT '唛头',
|
||
PRIMARY KEY(id),
|
||
UNIQUE KEY uk_ll_detail_source(order_id,source_inbound_detail_id),
|
||
KEY idx_ll_detail_order(order_id),
|
||
KEY idx_ll_detail_customer_order(customer_id,order_id,id)
|
||
) ENGINE=InnoDB COMMENT='尾程订单实装商品冻结明细';
|
||
|
||
CREATE TABLE IF NOT EXISTS ll_loading_order_status_history (
|
||
id BIGINT NOT NULL AUTO_INCREMENT COMMENT '状态历史主键',
|
||
customer_id VARCHAR(128) NOT NULL COMMENT '客户数据隔离键',
|
||
order_id BIGINT NOT NULL COMMENT '尾程订单 ID',
|
||
from_status VARCHAR(32) COMMENT '变更前状态',
|
||
to_status VARCHAR(32) NOT NULL COMMENT '变更后状态',
|
||
event_id VARCHAR(128) COMMENT '触发事件 ID',
|
||
remark VARCHAR(500) COMMENT '状态变更备注',
|
||
created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '记录时间',
|
||
PRIMARY KEY(id),
|
||
KEY idx_ll_loading_history_customer_order(customer_id,order_id,created_at)
|
||
) ENGINE=InnoDB COMMENT='尾程订单状态变更历史';
|
||
|
||
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='尾程订单操作记录';
|
||
|
||
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='尾程订单人工节点覆盖不可变历史';
|
||
|
||
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='柜级海外接柜仓修改幂等审计记录';
|
||
|
||
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='柜级预计到仓时间修改幂等审计记录';
|
||
|
||
-- 派送单列表与详情快照、转派送费用及操作记录。
|
||
CREATE TABLE IF NOT EXISTS ll_delivery_order (
|
||
id BIGINT NOT NULL COMMENT '派送单主键ID',
|
||
customer_id VARCHAR(128) NOT NULL COMMENT '客户数据隔离键',
|
||
delivery_no VARCHAR(64) NOT NULL COMMENT '派送单号',
|
||
outbound_order_id BIGINT NOT NULL COMMENT '关联出库单ID',
|
||
outbound_no VARCHAR(64) NOT NULL COMMENT '关联出库单号',
|
||
dispatch_order_id BIGINT NULL COMMENT '关联派车单ID,仓储转运直接出库时为空',
|
||
dispatch_no VARCHAR(64) NULL COMMENT '关联派车单号,仓储转运直接出库时为空',
|
||
overseas_warehouse_id VARCHAR(128) NULL COMMENT '海外仓ID',
|
||
overseas_warehouse_name VARCHAR(255) NULL COMMENT '海外仓名称快照',
|
||
customer_name VARCHAR(255) NULL COMMENT '客户名称快照',
|
||
destination_warehouse_id VARCHAR(128) NULL COMMENT '本派送单目的FBA仓ID快照',
|
||
destination_warehouse_code VARCHAR(128) NULL COMMENT '本派送单目的FBA仓编码快照,私人仓为空',
|
||
destination_warehouse_name VARCHAR(255) NULL COMMENT '本派送单目的FBA仓名称快照',
|
||
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 '私人仓联系电话',
|
||
delivery_group_key VARCHAR(255) NOT NULL COMMENT '同一出库单内按目的FBA仓拆单的稳定分组键',
|
||
status VARCHAR(32) NOT NULL DEFAULT 'WAIT_DELIVERY' COMMENT '派送状态:WAIT_DELIVERY待派送及后续正式状态',
|
||
waybill_no VARCHAR(128) NULL COMMENT '承运运单号',
|
||
bol_no VARCHAR(128) NULL COMMENT '派送资料BOL号,不作为文件归属标识',
|
||
documents_json JSON NULL COMMENT '派送三类资料当前绑定及权威文件元数据快照',
|
||
delivery_method VARCHAR(32) NULL COMMENT '派送方式',
|
||
carrier_name VARCHAR(255) NULL COMMENT '派送承运商',
|
||
pickup_method VARCHAR(64) NULL COMMENT '提货方式',
|
||
loading_type VARCHAR(64) NULL COMMENT '装车类型',
|
||
vehicle_type VARCHAR(64) NULL COMMENT '车辆类型',
|
||
vehicle_size VARCHAR(64) NULL COMMENT '车辆大小',
|
||
vehicle_plate VARCHAR(64) NULL COMMENT '车牌号',
|
||
driver_name VARCHAR(128) NULL COMMENT '司机或车队名称',
|
||
driver_phone VARCHAR(64) NULL COMMENT '车队联系电话',
|
||
appointment_account VARCHAR(128) NULL COMMENT '预约账号',
|
||
seller_name VARCHAR(128) NULL COMMENT '卖家姓名',
|
||
package_count INT NOT NULL DEFAULT 0 COMMENT '派送箱数',
|
||
pallet_count INT NOT NULL DEFAULT 0 COMMENT '派送托盘数',
|
||
total_weight_kg DECIMAL(18,4) NULL COMMENT '总重量(千克),任一来源未确认时为空',
|
||
total_volume_cbm DECIMAL(18,4) NOT NULL DEFAULT 0 COMMENT '总体积(立方米)',
|
||
planned_delivery_at DATETIME(3) NULL COMMENT '预计派送时间',
|
||
dispatched_at DATETIME(3) NULL COMMENT '实际派送时间',
|
||
expected_arrival_at DATETIME(3) NULL COMMENT '预计到达时间',
|
||
signed_at DATETIME(3) NULL COMMENT '签收时间',
|
||
remark VARCHAR(1000) NULL COMMENT '派送备注',
|
||
idempotency_key VARCHAR(255) NOT NULL COMMENT '业务幂等键',
|
||
created_by VARCHAR(128) NULL COMMENT '创建人ID',
|
||
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 '更新时间',
|
||
signed_packages INT NULL COMMENT '保存签收资料时冻结的实际签收箱数,不含此前已退回量',
|
||
CONSTRAINT chk_delivery_signed_packages CHECK(signed_packages IS NULL OR (signed_packages>=0 AND signed_packages<=package_count)),
|
||
|
||
PRIMARY KEY (id),
|
||
UNIQUE KEY uk_ll_delivery_no (customer_id,delivery_no),
|
||
UNIQUE KEY uk_ll_delivery_idempotency (customer_id,idempotency_key),
|
||
UNIQUE KEY uk_ll_delivery_outbound_destination (customer_id,outbound_order_id,delivery_group_key),
|
||
KEY idx_ll_delivery_list (customer_id,status,created_at)
|
||
) ENGINE=InnoDB COMMENT='尾程派送单';
|
||
|
||
SET @ddl = (SELECT IF(EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema=DATABASE() AND table_name='ll_delivery_order' AND column_name='overseas_warehouse_name'), 'SELECT 1', 'ALTER TABLE ll_delivery_order ADD COLUMN overseas_warehouse_name VARCHAR(255) NULL COMMENT ''海外仓名称快照'' AFTER overseas_warehouse_id'));
|
||
PREPARE delivery_detail_stmt FROM @ddl; EXECUTE delivery_detail_stmt; DEALLOCATE PREPARE delivery_detail_stmt;
|
||
SET @ddl = (SELECT IF(EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema=DATABASE() AND table_name='ll_delivery_order' AND column_name='customer_name'), 'SELECT 1', 'ALTER TABLE ll_delivery_order ADD COLUMN customer_name VARCHAR(255) NULL COMMENT ''客户名称快照'' AFTER overseas_warehouse_name'));
|
||
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='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;
|
||
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;
|
||
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;
|
||
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;
|
||
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='派送资料版本历史与幂等保存记录';
|
||
|
||
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='派送单操作记录';
|
||
|
||
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 (
|
||
id BIGINT NOT NULL COMMENT '入仓单主键', customer_id BIGINT NOT NULL COMMENT '客户账号标识', source_region VARCHAR(32) NOT NULL COMMENT '来源区域',
|
||
source_inbound_id VARCHAR(128) NOT NULL COMMENT '来源入仓分片 ID', root_inbound_id VARCHAR(128) NULL COMMENT '根入仓单 ID',
|
||
source_order_id VARCHAR(128) NULL COMMENT '来源订单 ID', source_order_no VARCHAR(128) NULL COMMENT '来源订单号', root_order_id VARCHAR(128) NULL COMMENT '根订单 ID',
|
||
inbound_code VARCHAR(128) NULL COMMENT '入仓码', lx_code VARCHAR(128) NULL COMMENT '一件代发领星入库单代码', destination_warehouse_id VARCHAR(128) NULL COMMENT '目的仓 ID',
|
||
destination_warehouse_code VARCHAR(128) NULL COMMENT '目的仓编码', destination_warehouse_name VARCHAR(255) NULL COMMENT '目的仓名称',
|
||
destination_type VARCHAR(32) NULL COMMENT '目的类型:FBA按箱数接收、OVERSEAS逐箱扫码',
|
||
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='尾程订单主表';
|
||
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;
|
||
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;
|
||
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'));
|
||
PREPARE lastleg_order_pending_container_idx_stmt FROM @ddl; EXECUTE lastleg_order_pending_container_idx_stmt; DEALLOCATE PREPARE lastleg_order_pending_container_idx_stmt;
|
||
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;
|
||
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;
|
||
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;
|
||
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;
|
||
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 '订单类型',
|
||
MODIFY COLUMN inbound_code VARCHAR(128) NULL COMMENT '真实来源入仓码;无入仓关系的海外本土业务为空',
|
||
MODIFY COLUMN source_region VARCHAR(32) NOT NULL COMMENT '来源区域/系统',
|
||
MODIFY COLUMN source_inbound_id VARCHAR(128) NOT NULL COMMENT '最终实装 LOADED 分片 ID,建单幂等键',
|
||
MODIFY COLUMN root_inbound_id VARCHAR(128) NULL COMMENT '根入仓单 ID',
|
||
MODIFY COLUMN source_order_id VARCHAR(128) NULL COMMENT '来源订单 ID',
|
||
MODIFY COLUMN source_order_no VARCHAR(128) NULL COMMENT '来源订单号',
|
||
MODIFY COLUMN root_order_id VARCHAR(128) NULL COMMENT '根订单 ID',
|
||
MODIFY COLUMN customer_name VARCHAR(255) NULL COMMENT '货主名称',
|
||
MODIFY COLUMN overseas_warehouse_id VARCHAR(128) NULL COMMENT '海外接柜仓ID;新建尾程订单由业务服务预分配',
|
||
MODIFY COLUMN overseas_warehouse_code VARCHAR(128) NULL COMMENT '海外接柜仓业务编码快照',
|
||
MODIFY COLUMN overseas_warehouse_name VARCHAR(255) NULL COMMENT '海外接柜仓名称快照',
|
||
MODIFY COLUMN receiving_warehouse_version INT NOT NULL DEFAULT 0 COMMENT '柜级接柜仓分配乐观锁版本',
|
||
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',
|
||
MODIFY COLUMN source_container_booking_id VARCHAR(128) NULL COMMENT '来源头程货柜预订ID',
|
||
MODIFY COLUMN source_loading_plan_version BIGINT NULL COMMENT '来源装柜计划版本',
|
||
MODIFY COLUMN source_handover_version BIGINT NULL COMMENT '交接版本',
|
||
MODIFY COLUMN source_payload_hash VARCHAR(71) NOT NULL COMMENT '来源事件负载摘要',
|
||
MODIFY COLUMN created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '创建时间',
|
||
MODIFY COLUMN updated_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3) COMMENT '更新时间';
|
||
|
||
-- Existing installations: convert the row identity to an assigned Snowflake ID and
|
||
-- make order_no a container/loading-plan grouping number rather than a row-unique key.
|
||
SET @ll_add_transfer_warehouse_id = (
|
||
SELECT IF(COUNT(*) = 0,
|
||
'ALTER TABLE ll_order ADD COLUMN transfer_warehouse_id VARCHAR(128) NULL COMMENT ''转入目的仓ID'' AFTER overseas_warehouse_name',
|
||
'SELECT 1')
|
||
FROM information_schema.columns
|
||
WHERE table_schema = DATABASE() AND table_name = 'll_order'
|
||
AND column_name = 'transfer_warehouse_id'
|
||
);
|
||
PREPARE ll_add_transfer_warehouse_id_stmt FROM @ll_add_transfer_warehouse_id;
|
||
EXECUTE ll_add_transfer_warehouse_id_stmt;
|
||
DEALLOCATE PREPARE ll_add_transfer_warehouse_id_stmt;
|
||
|
||
SET @ll_add_transfer_warehouse_code = (
|
||
SELECT IF(COUNT(*) = 0,
|
||
'ALTER TABLE ll_order ADD COLUMN transfer_warehouse_code VARCHAR(128) NULL COMMENT ''转入目的仓编码'' AFTER transfer_warehouse_id',
|
||
'SELECT 1')
|
||
FROM information_schema.columns
|
||
WHERE table_schema = DATABASE() AND table_name = 'll_order'
|
||
AND column_name = 'transfer_warehouse_code'
|
||
);
|
||
PREPARE ll_add_transfer_warehouse_code_stmt FROM @ll_add_transfer_warehouse_code;
|
||
EXECUTE ll_add_transfer_warehouse_code_stmt;
|
||
DEALLOCATE PREPARE ll_add_transfer_warehouse_code_stmt;
|
||
|
||
SET @ll_add_transfer_warehouse_name = (
|
||
SELECT IF(COUNT(*) = 0,
|
||
'ALTER TABLE ll_order ADD COLUMN transfer_warehouse_name VARCHAR(255) NULL COMMENT ''转入目的仓名称'' AFTER transfer_warehouse_code',
|
||
'SELECT 1')
|
||
FROM information_schema.columns
|
||
WHERE table_schema = DATABASE() AND table_name = 'll_order'
|
||
AND column_name = 'transfer_warehouse_name'
|
||
);
|
||
PREPARE ll_add_transfer_warehouse_name_stmt FROM @ll_add_transfer_warehouse_name;
|
||
EXECUTE ll_add_transfer_warehouse_name_stmt;
|
||
DEALLOCATE PREPARE ll_add_transfer_warehouse_name_stmt;
|
||
|
||
ALTER TABLE ll_order
|
||
MODIFY COLUMN transfer_warehouse_id VARCHAR(128) NULL COMMENT '转入目的仓ID',
|
||
MODIFY COLUMN transfer_warehouse_code VARCHAR(128) NULL COMMENT '转入目的仓编码',
|
||
MODIFY COLUMN transfer_warehouse_name VARCHAR(255) NULL COMMENT '转入目的仓名称';
|
||
|
||
SET @ll_drop_order_no_unique = (
|
||
SELECT IF(COUNT(*) > 0,
|
||
'ALTER TABLE ll_order DROP INDEX uk_ll_order_no',
|
||
'SELECT 1')
|
||
FROM information_schema.statistics
|
||
WHERE table_schema = DATABASE() AND table_name = 'll_order'
|
||
AND index_name = 'uk_ll_order_no' AND non_unique = 0
|
||
);
|
||
PREPARE ll_drop_order_no_unique_stmt FROM @ll_drop_order_no_unique;
|
||
EXECUTE ll_drop_order_no_unique_stmt;
|
||
DEALLOCATE PREPARE ll_drop_order_no_unique_stmt;
|
||
|
||
SET @ll_add_order_group_index = (
|
||
SELECT IF(COUNT(*) = 0,
|
||
'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 '租户/客户账号标识',
|
||
source_order_id BIGINT NOT NULL COMMENT '来源尾程订单ID,一张入仓单对应一张入库计划',
|
||
container_no VARCHAR(64) NOT NULL COMMENT '集装箱号',
|
||
overseas_warehouse_id BIGINT NOT NULL DEFAULT 193000000000200003 COMMENT '平台预分配的海外实际收货共享物理仓ID',
|
||
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是',
|
||
creation_mode VARCHAR(32) NOT NULL DEFAULT 'AUTO' COMMENT '计划生成方式:AUTO柜级自动、MANUAL单票人工、WAREHOUSE_TRANSFER仓储转运',
|
||
plan_remark VARCHAR(1000) NULL COMMENT '入仓计划备注',
|
||
status VARCHAR(32) NOT NULL DEFAULT 'PLANNED' COMMENT '入库计划状态',
|
||
line_count INT NOT NULL DEFAULT 0 COMMENT '入仓码明细数量',
|
||
pallet_count INT NOT NULL DEFAULT 0 COMMENT '系统自动分配托盘数量',
|
||
total_volume_cbm DECIMAL(18,4) NOT NULL DEFAULT 0 COMMENT '集装箱总体积(立方米)',
|
||
created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '创建时间',
|
||
updated_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3) COMMENT '更新时间',
|
||
version INT NOT NULL DEFAULT 0 COMMENT '入库计划乐观锁版本',
|
||
PRIMARY KEY (id),
|
||
UNIQUE KEY uk_ll_inbound_plan_no (plan_no),
|
||
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='尾程入库计划表:每张来源入仓单生成一张入库计划,同柜计划共享集装箱号';
|
||
|
||
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 '海外仓托盘批次幂等键',
|
||
status VARCHAR(32) NOT NULL COMMENT '命令状态:PREPARED/APPLYING/FAILED/LOCAL_COMMITTED/COMPLETED',
|
||
lease_token VARCHAR(64) NULL COMMENT '当前执行租约令牌,用于陈旧执行者隔离',
|
||
preparation_json JSON NOT NULL COMMENT '稳定计划号与托盘业务键快照',
|
||
result_json JSON NULL COMMENT '本地计划提交结果',
|
||
last_error 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(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与幂等命令';
|
||
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;
|
||
|
||
CREATE TABLE IF NOT EXISTS ll_inbound_plan_line (
|
||
id BIGINT NOT NULL COMMENT '入库计划明细ID(雪花ID)',
|
||
customer_id VARCHAR(128) NOT NULL COMMENT '客户账号标识',
|
||
plan_id BIGINT NOT NULL COMMENT '入库计划ID',
|
||
order_id BIGINT NOT NULL COMMENT '尾程订单ID',
|
||
inbound_code VARCHAR(128) NOT NULL COMMENT '头程入仓码快照',
|
||
destination_type VARCHAR(32) NOT NULL DEFAULT 'OVERSEAS' COMMENT '目的类型:FBA按箱数接收、OVERSEAS逐箱扫码',
|
||
destination_warehouse_id VARCHAR(128) NULL COMMENT '目的仓ID快照',
|
||
destination_warehouse_code VARCHAR(128) NULL COMMENT '目的仓编码快照',
|
||
destination_warehouse_name VARCHAR(255) NULL COMMENT '目的仓名称快照',
|
||
delivery_address VARCHAR(1000) NULL COMMENT '私人仓目的地址快照',
|
||
postal_code VARCHAR(32) NULL COMMENT '私人仓邮编快照',
|
||
contact_name VARCHAR(128) NULL COMMENT '私人仓联系人快照',
|
||
contact_phone VARCHAR(64) NULL COMMENT '私人仓联系电话快照',
|
||
volume_cbm DECIMAL(18,4) NOT NULL DEFAULT 0 COMMENT '入仓码体积(立方米)',
|
||
planned_pallet_count INT NOT NULL DEFAULT 0 COMMENT '该明细分配的托盘数量',
|
||
PRIMARY KEY (id),
|
||
UNIQUE KEY uk_ll_inbound_line_order (plan_id, order_id),
|
||
KEY idx_ll_inbound_line_plan (plan_id),
|
||
KEY idx_ll_inbound_line_customer_plan (customer_id, plan_id)
|
||
) ENGINE=InnoDB COMMENT='尾程入库计划明细表:按入仓码和尾程订单维度记录';
|
||
|
||
CREATE TABLE IF NOT EXISTS ll_inbound_plan_carton (
|
||
id BIGINT NOT NULL COMMENT '箱唛作业主键', customer_id VARCHAR(128) NOT NULL COMMENT '客户租户ID',
|
||
order_id BIGINT NULL COMMENT '生成尾程订单时绑定的尾程订单ID', source_inbound_detail_id VARCHAR(128) NOT NULL COMMENT '来源入库明细ID',
|
||
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',
|
||
status VARCHAR(32) NOT NULL COMMENT '箱唛状态:UNASSIGNED、ON_PALLET、BULK_RECEIVED、AVAILABLE', version INT NOT NULL DEFAULT 0 COMMENT '乐观锁版本',
|
||
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='柜次冻结箱唛及海外入库箱级作业账';
|
||
|
||
CREATE TABLE IF NOT EXISTS ll_inbound_plan_pallet (
|
||
id BIGINT NOT NULL COMMENT '计划托盘ID(雪花ID)',
|
||
customer_id VARCHAR(128) NOT NULL COMMENT '客户账号标识',
|
||
plan_id BIGINT NOT NULL COMMENT '入库计划ID',
|
||
pallet_no VARCHAR(128) NOT NULL COMMENT '海外仓资源服务返回的真实托盘码',
|
||
source_pallet_no VARCHAR(128) NULL COMMENT '一件代发不可变来源托盘号快照',
|
||
pallet_type VARCHAR(32) NULL COMMENT '人工计划托盘类型',
|
||
destination_warehouse_id VARCHAR(128) NULL COMMENT '目的仓ID快照',
|
||
destination_warehouse_code VARCHAR(128) NULL COMMENT '目的仓编码快照',
|
||
destination_warehouse_name VARCHAR(255) NULL COMMENT '目的仓名称快照',
|
||
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 '私人仓联系电话快照',
|
||
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 '计划内托盘序号',
|
||
version INT NOT NULL DEFAULT 0 COMMENT '收货累计值乐观锁版本',
|
||
PRIMARY KEY (id),
|
||
KEY idx_ll_inbound_pallet_no (pallet_no),
|
||
UNIQUE KEY uk_ll_inbound_pallet_sequence (plan_id, sequence_no),
|
||
KEY idx_ll_inbound_pallet_plan (plan_id),
|
||
KEY idx_ll_inbound_pallet_customer_plan (customer_id, plan_id)
|
||
) ENGINE=InnoDB COMMENT='尾程入库计划托盘表:按目的仓隔离合托';
|
||
|
||
CREATE TABLE IF NOT EXISTS ll_inbound_plan_pallet_allocation (
|
||
id BIGINT NOT NULL COMMENT '托盘分配记录ID(雪花ID)',
|
||
customer_id VARCHAR(128) NOT NULL COMMENT '客户账号标识',
|
||
plan_id BIGINT NOT NULL COMMENT '入库计划ID',
|
||
line_id BIGINT NOT NULL COMMENT '入库计划明细ID',
|
||
pallet_id BIGINT NOT NULL COMMENT '计划托盘ID',
|
||
allocated_volume_cbm DECIMAL(18,4) NOT NULL COMMENT '该明细分配到托盘的体积(立方米)',
|
||
PRIMARY KEY (id),
|
||
UNIQUE KEY uk_ll_inbound_allocation (line_id, pallet_id),
|
||
KEY idx_ll_inbound_allocation_plan (plan_id),
|
||
KEY idx_ll_inbound_allocation_customer_plan (customer_id, plan_id),
|
||
KEY idx_ll_inbound_allocation_pallet (pallet_id)
|
||
) ENGINE=InnoDB COMMENT='尾程入库计划托盘分配表:记录入仓码明细与计划托盘的分配关系';
|
||
|
||
-- 修复既有入库计划表的注释;历史“每柜一张计划”记录不在这里猜测拆分。
|
||
ALTER TABLE ll_inbound_plan COMMENT='尾程入库计划表:每张来源入仓单生成一张入库计划,同柜计划共享集装箱号';
|
||
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;
|
||
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;
|
||
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'));
|
||
PREPARE inbound_plan_manual_stmt FROM @ddl; EXECUTE inbound_plan_manual_stmt; DEALLOCATE PREPARE inbound_plan_manual_stmt;
|
||
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;
|
||
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;
|
||
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 '租户/客户账号标识',
|
||
MODIFY COLUMN source_order_id BIGINT NOT NULL COMMENT '来源尾程订单ID,一张入仓单对应一张入库计划',
|
||
MODIFY COLUMN container_no VARCHAR(64) NOT NULL COMMENT '集装箱号',
|
||
MODIFY COLUMN status VARCHAR(32) NOT NULL DEFAULT 'PLANNED' COMMENT '入库计划状态',
|
||
MODIFY COLUMN line_count INT NOT NULL DEFAULT 0 COMMENT '入仓码明细数量',
|
||
MODIFY COLUMN pallet_count INT NOT NULL DEFAULT 0 COMMENT '系统自动分配托盘数量',
|
||
MODIFY COLUMN total_volume_cbm DECIMAL(18,4) NOT NULL DEFAULT 0 COMMENT '集装箱总体积(立方米)',
|
||
MODIFY COLUMN created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '创建时间',
|
||
MODIFY COLUMN updated_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3) COMMENT '更新时间';
|
||
|
||
ALTER TABLE ll_inbound_plan_line COMMENT='尾程入库计划明细表:按入仓码和尾程订单维度记录';
|
||
ALTER TABLE ll_inbound_plan_line
|
||
MODIFY COLUMN id BIGINT NOT NULL COMMENT '入库计划明细ID(雪花ID)',
|
||
MODIFY COLUMN customer_id VARCHAR(128) NOT NULL COMMENT '客户账号标识',
|
||
MODIFY COLUMN plan_id BIGINT NOT NULL COMMENT '入库计划ID',
|
||
MODIFY COLUMN order_id BIGINT NOT NULL COMMENT '尾程订单ID',
|
||
MODIFY COLUMN inbound_code VARCHAR(128) NOT NULL COMMENT '头程入仓码快照',
|
||
MODIFY COLUMN destination_warehouse_id VARCHAR(128) NULL COMMENT '目的仓ID快照',
|
||
MODIFY COLUMN destination_warehouse_code VARCHAR(128) NULL COMMENT '目的仓编码快照',
|
||
MODIFY COLUMN destination_warehouse_name VARCHAR(255) NULL COMMENT '目的仓名称快照',
|
||
MODIFY COLUMN volume_cbm DECIMAL(18,4) NOT NULL DEFAULT 0 COMMENT '入仓码体积(立方米)',
|
||
MODIFY COLUMN planned_pallet_count INT NOT NULL DEFAULT 0 COMMENT '该明细分配的托盘数量';
|
||
|
||
ALTER TABLE ll_inbound_plan_pallet COMMENT='尾程入库计划托盘表:按目的仓隔离合托';
|
||
ALTER TABLE ll_inbound_plan_pallet
|
||
MODIFY COLUMN id BIGINT NOT NULL COMMENT '计划托盘ID(雪花ID)',
|
||
MODIFY COLUMN plan_id BIGINT NOT NULL COMMENT '入库计划ID',
|
||
MODIFY COLUMN pallet_no VARCHAR(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 capacity_cbm DECIMAL(18,4) NOT NULL DEFAULT 2.0000 COMMENT '托盘容量,固定为2立方米',
|
||
MODIFY COLUMN allocated_volume_cbm DECIMAL(18,4) NOT NULL DEFAULT 0 COMMENT '已分配体积(立方米)',
|
||
MODIFY COLUMN sequence_no INT NOT NULL COMMENT '计划内托盘序号';
|
||
|
||
ALTER TABLE ll_inbound_plan_pallet_allocation COMMENT='尾程入库计划托盘分配表:记录入仓码明细与计划托盘的分配关系';
|
||
ALTER TABLE ll_inbound_plan_pallet_allocation
|
||
MODIFY COLUMN id BIGINT NOT NULL COMMENT '托盘分配记录ID(雪花ID)',
|
||
MODIFY COLUMN plan_id BIGINT NOT NULL COMMENT '入库计划ID',
|
||
MODIFY COLUMN line_id BIGINT NOT NULL COMMENT '入库计划明细ID',
|
||
MODIFY COLUMN pallet_id BIGINT NOT NULL COMMENT '计划托盘ID',
|
||
MODIFY COLUMN allocated_volume_cbm DECIMAL(18,4) NOT NULL COMMENT '该明细分配到托盘的体积(立方米)';
|
||
|
||
-- Additive inbound picking schema. Guarded statements preserve existing rows on restart.
|
||
ALTER TABLE ll_inbound_plan MODIFY COLUMN status VARCHAR(32) NOT NULL DEFAULT 'PENDING_ASSIGNMENT' 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 ''计划明细应收箱数'''));
|
||
PREPARE inbound_schema_stmt FROM @ddl; EXECUTE inbound_schema_stmt; DEALLOCATE PREPARE inbound_schema_stmt;
|
||
SET @ddl = (SELECT IF(EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema=DATABASE() AND table_name='ll_inbound_plan_pallet' AND column_name='warehouse_pallet_id'), 'SELECT 1', 'ALTER TABLE ll_inbound_plan_pallet ADD COLUMN warehouse_pallet_id BIGINT NULL COMMENT ''海外仓实物托盘ID'''));
|
||
PREPARE inbound_schema_stmt FROM @ddl; EXECUTE inbound_schema_stmt; DEALLOCATE PREPARE inbound_schema_stmt;
|
||
SET @ddl = (SELECT IF(EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema=DATABASE() AND table_name='ll_inbound_plan_pallet' AND column_name='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;
|
||
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'''));
|
||
PREPARE inbound_schema_stmt FROM @ddl; EXECUTE inbound_schema_stmt; DEALLOCATE PREPARE inbound_schema_stmt;
|
||
SET @ddl = (SELECT IF(EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema=DATABASE() AND table_name='ll_inbound_plan_pallet' AND column_name='warehouse_resource_lock_id'), 'SELECT 1', 'ALTER TABLE ll_inbound_plan_pallet ADD COLUMN warehouse_resource_lock_id BIGINT NULL COMMENT ''海外仓资源锁ID'''));
|
||
PREPARE inbound_schema_stmt FROM @ddl; EXECUTE inbound_schema_stmt; DEALLOCATE PREPARE inbound_schema_stmt;
|
||
SET @ddl = (SELECT IF(EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema=DATABASE() AND table_name='ll_inbound_plan_pallet' AND column_name='assignment_status'), 'SELECT 1', 'ALTER TABLE ll_inbound_plan_pallet ADD COLUMN assignment_status VARCHAR(32) NOT NULL DEFAULT ''UNASSIGNED'' COMMENT ''托盘分配状态:UNASSIGNED未分配及后续正式状态'''));
|
||
PREPARE inbound_schema_stmt FROM @ddl; EXECUTE inbound_schema_stmt; DEALLOCATE PREPARE inbound_schema_stmt;
|
||
SET @ddl = (SELECT IF(EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema=DATABASE() AND table_name='ll_inbound_plan_pallet' AND column_name='locked_at'), 'SELECT 1', 'ALTER TABLE ll_inbound_plan_pallet ADD COLUMN locked_at DATETIME(3) NULL COMMENT ''资源锁定时间'''));
|
||
PREPARE inbound_schema_stmt FROM @ddl; EXECUTE inbound_schema_stmt; DEALLOCATE PREPARE inbound_schema_stmt;
|
||
SET @ddl = (SELECT IF(EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema=DATABASE() AND table_name='ll_inbound_plan_pallet' AND column_name='actual_volume_cbm'), 'SELECT 1', 'ALTER TABLE ll_inbound_plan_pallet ADD COLUMN actual_volume_cbm DECIMAL(18,4) NOT NULL DEFAULT 0 COMMENT ''实收体积(立方米)'''));
|
||
PREPARE inbound_schema_stmt FROM @ddl; EXECUTE inbound_schema_stmt; DEALLOCATE PREPARE inbound_schema_stmt;
|
||
SET @ddl = (SELECT IF(EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema=DATABASE() AND table_name='ll_inbound_plan_pallet' AND column_name='actual_package_count'), 'SELECT 1', 'ALTER TABLE ll_inbound_plan_pallet ADD COLUMN actual_package_count INT NOT NULL DEFAULT 0 COMMENT ''实收箱数'''));
|
||
PREPARE inbound_schema_stmt FROM @ddl; EXECUTE inbound_schema_stmt; DEALLOCATE PREPARE inbound_schema_stmt;
|
||
SET @ddl = (SELECT IF(EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema=DATABASE() AND table_name='ll_inbound_plan_pallet' AND column_name='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;
|
||
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 ''计划分配箱数'''));
|
||
PREPARE inbound_schema_stmt FROM @ddl; EXECUTE inbound_schema_stmt; DEALLOCATE PREPARE inbound_schema_stmt;
|
||
SET @ddl = (SELECT IF(EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema=DATABASE() AND table_name='ll_inbound_plan_pallet_allocation' AND column_name='counted_package_count'), 'SELECT 1', 'ALTER TABLE ll_inbound_plan_pallet_allocation ADD COLUMN counted_package_count INT NOT NULL DEFAULT 0 COMMENT ''清点箱数'''));
|
||
PREPARE inbound_schema_stmt FROM @ddl; EXECUTE inbound_schema_stmt; DEALLOCATE PREPARE inbound_schema_stmt;
|
||
SET @ddl = (SELECT IF(EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema=DATABASE() AND table_name='ll_inbound_plan_pallet_allocation' AND column_name='picked_package_count'), 'SELECT 1', 'ALTER TABLE ll_inbound_plan_pallet_allocation ADD COLUMN picked_package_count INT NOT NULL DEFAULT 0 COMMENT ''已拣箱数'''));
|
||
PREPARE inbound_schema_stmt FROM @ddl; EXECUTE inbound_schema_stmt; DEALLOCATE PREPARE inbound_schema_stmt;
|
||
SET @ddl = (SELECT IF(EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema=DATABASE() AND table_name='ll_inbound_plan_pallet_allocation' AND column_name='actual_volume_cbm'), 'SELECT 1', 'ALTER TABLE ll_inbound_plan_pallet_allocation ADD COLUMN actual_volume_cbm DECIMAL(18,4) NOT NULL DEFAULT 0 COMMENT ''实收体积(立方米)'''));
|
||
PREPARE inbound_schema_stmt FROM @ddl; EXECUTE inbound_schema_stmt; DEALLOCATE PREPARE inbound_schema_stmt;
|
||
SET @ddl = (SELECT IF(EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema=DATABASE() AND table_name='ll_inbound_plan_pallet_allocation' AND column_name='status'), 'SELECT 1', 'ALTER TABLE ll_inbound_plan_pallet_allocation ADD COLUMN status VARCHAR(32) NOT NULL DEFAULT ''PENDING_COUNT'' COMMENT ''分配作业状态:PENDING_COUNT待清点及后续正式状态'''));
|
||
PREPARE inbound_schema_stmt FROM @ddl; EXECUTE inbound_schema_stmt; DEALLOCATE PREPARE inbound_schema_stmt;
|
||
SET @ddl = (SELECT IF(EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema=DATABASE() AND table_name='ll_inbound_plan_pallet_allocation' AND column_name='version'), 'SELECT 1', 'ALTER TABLE ll_inbound_plan_pallet_allocation ADD COLUMN version INT NOT NULL DEFAULT 0 COMMENT ''托盘分配乐观锁版本'''));
|
||
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 '完成时间',
|
||
unload_photo_file_ids JSON NULL COMMENT '卸柜照片文件ID列表', unload_photo_uploaded_at DATETIME(3) NULL COMMENT '卸柜照片上传成功时间',
|
||
estimated_empty_return_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_inbound_pda_task_plan (customer_id, plan_id),
|
||
UNIQUE KEY uk_ll_inbound_pda_task_no (task_no)
|
||
) ENGINE=InnoDB COMMENT='入仓PDA作业任务';
|
||
|
||
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 '发布时间',
|
||
locked_at DATETIME(3) NULL COMMENT '投递租约获取时间', locked_by VARCHAR(128) NULL COMMENT '投递租约持有者',
|
||
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='尾程跨区业务事件发件箱';
|
||
|
||
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快照',
|
||
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',
|
||
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),
|
||
KEY idx_ll_finance_fee_container_customer(container_booking_id,customer_id,source_status,created_at),
|
||
CONSTRAINT chk_ll_finance_fee_amount CHECK(amount>0), CONSTRAINT chk_ll_finance_fee_currency CHECK(currency='CNY'),
|
||
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)),
|
||
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';
|
||
|
||
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;
|
||
|
||
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='海外费用来源写操作幂等审计';
|
||
|
||
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='月度汇率变更历史';
|
||
|
||
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='司机档案及审核历史';
|
||
|
||
CREATE TABLE IF NOT EXISTS ll_vehicle (
|
||
max_pallet_spaces INT NULL COMMENT '最大标准托位,未知时为空',
|
||
max_load_kg DECIMAL(12,3) NULL COMMENT '最大载重,千克',
|
||
max_volume_cbm DECIMAL(12,3) NULL COMMENT '可用容积,立方米',
|
||
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),
|
||
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))
|
||
) ENGINE=InnoDB COMMENT='平台车辆主数据';
|
||
|
||
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='平台运输车次';
|
||
|
||
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='拼车发布及销售意向持久幂等结果';
|
||
|
||
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 '车次业务编号',
|
||
customer_id VARCHAR(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '委托客户及付款归属',
|
||
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 '货物、计划载荷、联系人及约定报价快照',
|
||
quote_source_json JSON NULL COMMENT '选用销售报价的可信版本快照,与实际成交金额分开保存',
|
||
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 '关联发运摘要',
|
||
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 '预计实托数,与托位分开且未知为空',
|
||
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时间',
|
||
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),
|
||
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='外接询价及确认承运占位;货物收发和费用入账分别引用正式事实';
|
||
|
||
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 '预订业务编号',
|
||
customer_id VARCHAR(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '商业客户隔离范围',
|
||
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='拼车预订与本土商业单唯一真实履约关联,不重复记运费';
|
||
|
||
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='运输车次操作历史';
|
||
|
||
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='车次成本不可变更正历史';
|
||
|
||
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;
|
||
|
||
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='入仓托盘合托记录';
|
||
|
||
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'));
|
||
PREPARE inbound_schema_stmt FROM @ddl; EXECUTE inbound_schema_stmt; DEALLOCATE PREPARE inbound_schema_stmt;
|
||
SET @ddl = (SELECT IF(EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema=DATABASE() AND table_name='ll_inbound_plan_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'));
|
||
PREPARE receiving_container_line_stmt FROM @ddl; EXECUTE receiving_container_line_stmt; DEALLOCATE PREPARE receiving_container_line_stmt;
|
||
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='';
|
||
ALTER TABLE ll_inbound_plan_line 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_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;
|
||
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='';
|
||
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;
|
||
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='';
|
||
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;
|
||
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;
|
||
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;
|
||
UPDATE ll_inbound_plan_line l JOIN ll_order o ON o.id=l.order_id
|
||
SET l.fba_warehouse_code=o.fba_warehouse_code,
|
||
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 (
|
||
id BIGINT NOT NULL COMMENT '柜号签收会话ID',
|
||
source_container_booking_id VARCHAR(128) NOT NULL COMMENT '稳定来源柜预订ID', container_fact_hash VARCHAR(64) NOT NULL COMMENT '领取时整柜订单与计划事实摘要',
|
||
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 '操作账号唯一标识',
|
||
operator_name VARCHAR(255) NULL COMMENT '操作账号名称', active_operator_key VARCHAR(255) NULL COMMENT '未完成会话平台操作账号全局唯一锁键',
|
||
active_container_key VARCHAR(255) NULL COMMENT '未完成会话柜号全局唯一锁键', status VARCHAR(32) NOT NULL DEFAULT 'WAIT_SIGN' COMMENT '会话状态:WAIT_SIGN、SIGNED、RECEIVING、COMPLETED、COMPLETED_WITH_DIFFERENCE',
|
||
sign_photos JSON NULL COMMENT '签收卸柜照片角色与文件ID列表', prepared_at DATETIME(3) NULL COMMENT '选择柜号时间',
|
||
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),
|
||
KEY idx_ll_receiving_container(container_no,status), KEY idx_ll_receiving_operator(operator_key,created_at)
|
||
) ENGINE=InnoDB COMMENT='海外PDA柜号签收收货会话';
|
||
|
||
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实收进度';
|
||
|
||
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托盘现场累计与超收标记';
|
||
|
||
|
||
CREATE TABLE IF NOT EXISTS ll_receiving_container_operation (
|
||
id BIGINT NOT NULL COMMENT '柜号收货操作ID', session_id BIGINT NOT NULL COMMENT '柜号签收会话ID',
|
||
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),
|
||
UNIQUE KEY uk_ll_receiving_operation(operator_key,idempotency_key), KEY idx_ll_receiving_operation_session(session_id,created_at)
|
||
) ENGINE=InnoDB COMMENT='海外PDA柜号收货幂等审计记录';
|
||
|
||
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真实作业历史';
|
||
|
||
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同仓整托移库记录';
|
||
|
||
CREATE TABLE IF NOT EXISTS ll_inbound_fba_appointment (
|
||
id BIGINT NOT NULL COMMENT '主键ID',
|
||
customer_id VARCHAR(128) NOT NULL COMMENT '客户租户ID',
|
||
appointment_no VARCHAR(64) NOT NULL COMMENT '预约单号',
|
||
appointment_at DATETIME(3) NOT NULL COMMENT '预约时间',
|
||
expected_loading_at DATETIME(3) NOT NULL COMMENT '预计装车时间',
|
||
appointment_status VARCHAR(32) NOT NULL DEFAULT 'PENDING' COMMENT '预约状态',
|
||
appointment_remark VARCHAR(1000) NULL COMMENT '预约备注',
|
||
fba_warehouse_code VARCHAR(128) NOT NULL COMMENT 'FBA仓库编码',
|
||
selected_count INT NOT NULL DEFAULT 0 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_fba_appointment_no (customer_id, appointment_no),
|
||
KEY idx_ll_fba_appointment_list (customer_id, appointment_status, fba_warehouse_code, created_at)
|
||
) ENGINE=InnoDB COMMENT='FBA入仓预约单';
|
||
|
||
CREATE TABLE IF NOT EXISTS ll_inbound_fba_appointment_item (
|
||
id BIGINT NOT NULL COMMENT '主键ID',
|
||
appointment_id BIGINT NOT NULL COMMENT '预约单ID',
|
||
plan_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 '入仓单号快照',
|
||
fba_warehouse_code VARCHAR(128) NOT NULL COMMENT 'FBA仓库编码',
|
||
created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '创建时间',
|
||
PRIMARY KEY (id),
|
||
UNIQUE KEY uk_ll_fba_appointment_item_line (appointment_id, line_id),
|
||
KEY idx_ll_fba_appointment_item_plan (plan_id),
|
||
KEY idx_ll_fba_appointment_item_order (order_id)
|
||
) ENGINE=InnoDB COMMENT='FBA入仓预约明细';
|
||
|
||
-- Upgrade the pre-customer-scope appointment table created by older deployments.
|
||
SET @ddl = (SELECT IF(
|
||
NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema=DATABASE()
|
||
AND table_name='ll_inbound_fba_appointment' AND column_name='customer_id')
|
||
AND EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema=DATABASE()
|
||
AND table_name='ll_inbound_fba_appointment' AND column_name='tenant_id'),
|
||
'ALTER TABLE ll_inbound_fba_appointment CHANGE COLUMN tenant_id customer_id VARCHAR(128) NOT NULL COMMENT ''客户租户ID''',
|
||
'SELECT 1'));
|
||
PREPARE fba_appointment_customer_scope FROM @ddl; EXECUTE fba_appointment_customer_scope; DEALLOCATE PREPARE fba_appointment_customer_scope;
|
||
|
||
SET @ddl = (SELECT IF(EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema=DATABASE()
|
||
AND table_name='ll_inbound_fba_appointment' AND column_name='expected_loading_at'),
|
||
'SELECT 1',
|
||
'ALTER TABLE ll_inbound_fba_appointment ADD COLUMN expected_loading_at DATETIME(3) NULL COMMENT ''预计装车时间'' AFTER appointment_at'));
|
||
PREPARE fba_appointment_expected_loading FROM @ddl; EXECUTE fba_appointment_expected_loading; DEALLOCATE PREPARE fba_appointment_expected_loading;
|
||
|
||
UPDATE ll_inbound_fba_appointment
|
||
SET expected_loading_at=appointment_at
|
||
WHERE expected_loading_at IS NULL;
|
||
|
||
SET @ddl = (SELECT IF(EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema=DATABASE()
|
||
AND table_name='ll_inbound_fba_appointment' AND column_name='expected_loading_at' AND is_nullable='YES'),
|
||
'ALTER TABLE ll_inbound_fba_appointment MODIFY COLUMN expected_loading_at DATETIME(3) NOT NULL COMMENT ''预计装车时间''',
|
||
'SELECT 1'));
|
||
PREPARE fba_appointment_expected_loading_required FROM @ddl; EXECUTE fba_appointment_expected_loading_required; DEALLOCATE PREPARE fba_appointment_expected_loading_required;
|
||
|
||
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',
|
||
customer_id VARCHAR(128) NOT NULL COMMENT '客户租户ID', customer_name VARCHAR(255) NOT NULL COMMENT '客户名称不可变快照',
|
||
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 '入仓单号快照',
|
||
sku_code VARCHAR(128) NOT NULL COMMENT 'SKU快照;多SKU汇总时为MIXED,不参与当前库存唯一维度',
|
||
product_name_zh VARCHAR(255) NULL COMMENT '中文品名快照',
|
||
product_name_en VARCHAR(255) 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 '已拣箱数',
|
||
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),
|
||
UNIQUE KEY uk_ll_inventory_dimension (customer_id,overseas_warehouse_id,destination_warehouse_code,inbound_order_id,inbound_code),
|
||
KEY idx_ll_inventory_list (customer_id,overseas_warehouse_id,updated_at),
|
||
KEY idx_ll_inventory_inbound (customer_id,inbound_code),
|
||
KEY idx_ll_inventory_sku (customer_id,sku_code,updated_at)
|
||
) ENGINE=InnoDB COMMENT='客户入仓单与海外目的仓维度实时库存余额';
|
||
|
||
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 (
|
||
id BIGINT NOT NULL COMMENT '主键ID', customer_id VARCHAR(128) NOT NULL COMMENT '客户租户ID', customer_name VARCHAR(255) NOT NULL COMMENT '客户名称不可变快照',
|
||
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 '入仓单号快照',
|
||
sku_code VARCHAR(128) NOT NULL COMMENT 'SKU编码快照', product_name_zh VARCHAR(255) NULL COMMENT '中文品名快照',
|
||
product_name_en VARCHAR(255) NULL COMMENT '英文品名快照',
|
||
warehouse_pallet_id BIGINT NOT NULL COMMENT '仓库实物托盘ID', pallet_no VARCHAR(64) NOT NULL COMMENT '海外仓实物托盘码',
|
||
source_pallet_no VARCHAR(128) NULL COMMENT '一件代发不可变来源托盘号快照',
|
||
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 '创建时间',
|
||
PRIMARY KEY (id), UNIQUE KEY uk_ll_stock_receipt_task_allocation_sku (customer_id,task_id,allocation_id,sku_code),
|
||
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),
|
||
UNIQUE KEY uk_ll_dispatch_order_no (dispatch_no),
|
||
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仓库编码',
|
||
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 '私人仓联系电话快照',
|
||
package_count INT NOT NULL DEFAULT 0 COMMENT '箱数',
|
||
gross_weight_kg DECIMAL(18,3) NULL COMMENT '毛重(千克),未知为NULL,不以材积重代替',
|
||
volume_weight_kg DECIMAL(18,3) NOT NULL DEFAULT 0 COMMENT '材积重(千克)',
|
||
volume_cbm DECIMAL(18,4) NOT NULL DEFAULT 0 COMMENT '体积(立方米)',
|
||
source_stage VARCHAR(32) NOT NULL COMMENT '数据来源阶段',
|
||
carton_marks VARCHAR(4000) NULL COMMENT '换标箱唛映射快照',
|
||
source_business_type VARCHAR(32) NULL COMMENT '来源业务类型',
|
||
source_business_no VARCHAR(128) NULL COMMENT '来源业务单号',
|
||
created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '创建时间',
|
||
return_receipt_id BIGINT NULL COMMENT '明确选用的真实退回入仓来源',
|
||
|
||
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='派车货物冻结明细';
|
||
|
||
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;
|
||
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;
|
||
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;
|
||
|
||
CREATE TABLE IF NOT EXISTS ll_dispatch_pallet_lock (
|
||
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',
|
||
dispatch_order_id BIGINT NULL COMMENT '正式派车单ID,草稿锁阶段为空',
|
||
draft_container_id BIGINT NULL COMMENT '智能排车草稿装车托盘ID',
|
||
draft_token VARCHAR(64) NULL COMMENT '智能排车草稿随机标识',
|
||
operator_id VARCHAR(128) NULL COMMENT '草稿锁操作人ID',
|
||
status VARCHAR(32) NOT NULL DEFAULT 'ACTIVE' COMMENT '业务状态',
|
||
locked_at DATETIME(3) NOT NULL 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 '更新时间',
|
||
return_receipt_id BIGINT NULL COMMENT '明确选用的真实退回入仓来源',
|
||
|
||
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)
|
||
) ENGINE=InnoDB COMMENT='派车托盘排他锁';
|
||
|
||
CREATE TABLE IF NOT EXISTS ll_dispatch_draft (
|
||
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 '更新时间',
|
||
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 (
|
||
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),
|
||
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;
|
||
|
||
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;
|
||
|
||
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'));
|
||
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',
|
||
warehouse_id VARCHAR(128) NOT NULL COMMENT 'Token绑定的海外仓库ID',
|
||
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),
|
||
UNIQUE KEY uk_ll_dispatch_pda_task_no (task_no)
|
||
) 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',
|
||
dispatch_item_id BIGINT NOT NULL COMMENT '派车明细ID', inventory_position_id BIGINT NOT NULL COMMENT '库存仓位记录ID',
|
||
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操作幂等记录';
|
||
|
||
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='真实退回入仓及再次发运来源凭据';
|
||
|
||
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',
|
||
receipt_id BIGINT NULL COMMENT '入仓实收记录ID', order_id BIGINT NOT NULL COMMENT '订单ID', packages BIGINT NOT NULL COMMENT '本次操作箱数',
|
||
product_quantity BIGINT NOT NULL DEFAULT 0 COMMENT '产品数量', created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '创建时间',
|
||
return_receipt_id BIGINT NULL COMMENT '明确选用的真实退回入仓来源',
|
||
KEY idx_dispatch_pick_return_receipt(customer_id,return_receipt_id),
|
||
CONSTRAINT chk_dispatch_pick_receipt_source CHECK((receipt_id IS NOT NULL AND return_receipt_id IS NULL) OR (receipt_id IS NULL AND return_receipt_id IS NOT NULL)),
|
||
|
||
|
||
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',
|
||
outbound_no VARCHAR(64) NOT NULL COMMENT '出库单号', dispatch_order_id BIGINT NULL COMMENT '派车单ID,一件代发为空', dispatch_no VARCHAR(64) NULL COMMENT '派车单号,一件代发为空',
|
||
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 '托盘数',
|
||
gross_weight_kg DECIMAL(18,3) NULL COMMENT '毛重(千克),来源未确认时为空', volume_weight_kg DECIMAL(18,3) NOT NULL DEFAULT 0 COMMENT '材积重(千克)',
|
||
volume_cbm DECIMAL(18,4) NOT NULL DEFAULT 0 COMMENT '体积(立方米)',
|
||
idempotency_key VARCHAR(255) NOT NULL COMMENT '业务幂等键', created_by VARCHAR(128) NULL COMMENT '创建人ID',
|
||
created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '创建时间', updated_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3) COMMENT '更新时间',
|
||
outbound_type VARCHAR(32) NOT NULL DEFAULT 'DISPATCH_DELIVERY' COMMENT '出库类型:派送转出库、一件代发', lx_codes VARCHAR(1000) NULL COMMENT '关联一件代发领星入库单代码汇总',
|
||
recipient_info VARCHAR(1000) NULL COMMENT '一件代发收件信息',
|
||
request_hash CHAR(64) NULL COMMENT '创建或转派送业务请求摘要,用于幂等内容校验',
|
||
fee_coverage_json JSON NULL COMMENT '本次发运引用的原费用版本、实际货物及明确服务覆盖确认快照',
|
||
PRIMARY KEY (id), UNIQUE KEY uk_ll_outbound_no (outbound_no),
|
||
UNIQUE KEY uk_ll_outbound_idempotency (customer_id,idempotency_key), UNIQUE KEY uk_ll_outbound_dispatch (customer_id,dispatch_order_id),
|
||
KEY idx_ll_outbound_list (customer_id,status,created_at)
|
||
) 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 '目的仓名称快照',
|
||
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) NOT NULL DEFAULT 0 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', order_refs VARCHAR(2000) NULL COMMENT '关联订单信息', inbound_code VARCHAR(128) NULL COMMENT '入仓单号快照',
|
||
created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '创建时间', PRIMARY KEY (id),
|
||
UNIQUE KEY uk_ll_outbound_pallet (customer_id,outbound_order_id,warehouse_pallet_id,inbound_code,sku_code),
|
||
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='出库托盘明细';
|
||
|
||
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 '任务状态:待拣货、拣货中、已完成',
|
||
completion_idempotency_key VARCHAR(255) NULL COMMENT '完成命令幂等键',
|
||
pushed_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) 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_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)
|
||
) ENGINE=InnoDB COMMENT='一件代发出库PDA拣货任务';
|
||
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;
|
||
|
||
CREATE TABLE IF NOT EXISTS ll_outbound_pda_pick (
|
||
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',
|
||
inventory_position_id BIGINT NULL COMMENT '库存仓位ID;退货箱直接出库时为空', packages BIGINT NOT NULL COMMENT '拣货箱数', idempotency_key VARCHAR(255) NOT NULL COMMENT '拣货幂等键',
|
||
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)
|
||
) 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;
|
||
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;
|
||
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;
|
||
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'''));
|
||
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='recipient_info'), 'SELECT 1', 'ALTER TABLE ll_outbound_order ADD COLUMN recipient_info VARCHAR(1000) NULL COMMENT ''一件代发收件信息'' AFTER lx_codes'));
|
||
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;
|
||
|
||
-- 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 '尾程订单号',
|
||
operating_warehouse_id VARCHAR(128) NOT NULL COMMENT '入库中转仓ID', fba_warehouse_code VARCHAR(128) NULL COMMENT '可选FBA目的仓编码',
|
||
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 '入仓方式',
|
||
estimated_arrival_at DATETIME(3) NOT NULL COMMENT '预计入仓时间', fba_shipment_no VARCHAR(128) NULL COMMENT '可选FBA货件编号',
|
||
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 '换标申请单号',
|
||
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 '业务幂等键',
|
||
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='客户转仓单';
|
||
|
||
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) NOT NULL COMMENT ''预计入仓时间''', 'SELECT 1'));
|
||
PREPARE transfer_optional_fba_stmt FROM @ddl; EXECUTE transfer_optional_fba_stmt; DEALLOCATE PREPARE transfer_optional_fba_stmt;
|
||
|
||
-- 兼容已存在的旧版转仓单表: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;
|
||
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;
|
||
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;
|
||
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;
|
||
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;
|
||
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;
|
||
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;
|
||
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;
|
||
|
||
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 (
|
||
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='转仓货物冻结明细';
|
||
|
||
CREATE TABLE IF NOT EXISTS ll_warehouse_transfer_carton (
|
||
id BIGINT NOT NULL COMMENT '预报箱主键', transfer_order_id BIGINT NOT NULL COMMENT '转运单ID',
|
||
transfer_item_id BIGINT NOT NULL COMMENT '转运申报明细ID', customer_id VARCHAR(128) NOT NULL COMMENT '客户租户ID',
|
||
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='仓储转运系统箱唛预报';
|
||
|
||
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 '托序号',
|
||
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 '本托实收箱数',
|
||
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',
|
||
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 '创建时间',
|
||
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实测打托事实';
|
||
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;
|
||
|
||
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箱数回填';
|
||
|
||
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;
|
||
|
||
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目的仓',
|
||
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 '创建时间',
|
||
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='仓储转运换标预绑定明细';
|
||
|
||
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 '分配箱数',
|
||
sku_code VARCHAR(128) NULL COMMENT '本次来源分配的实际SKU快照',
|
||
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),
|
||
KEY idx_ll_wh_transfer_allocation_position(transfer_order_id,inventory_position_id),
|
||
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='转仓来源仓位的目标库存收货记录';
|
||
|
||
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='转运逐来源收货原请求与共享目标资源占用命令';
|
||
|
||
-- 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 '联系人电话',
|
||
delivery_method VARCHAR(32) NULL COMMENT '派送方式:TRUCK卡车、PICKUP自提、EXPRESS快递;仅涉及箱唛换标时必填',
|
||
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 '客户确认换标完成时间',
|
||
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 '已通知箱数',
|
||
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',
|
||
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),
|
||
KEY idx_ll_relabel_application_order (lastleg_order_id),
|
||
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='客户换标申请单';
|
||
|
||
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;
|
||
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卡车、PICKUP自提、EXPRESS快递;仅涉及箱唛换标时必填'' AFTER contact_phone')); 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='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;
|
||
|
||
CREATE TABLE IF NOT EXISTS ll_relabel_item (
|
||
return_carton_id BIGINT NULL COMMENT '退货换箱唛来源退货库存箱ID',
|
||
source_carton_mark VARCHAR(255) NULL COMMENT '退货换箱唛原箱唛快照',
|
||
new_carton_mark VARCHAR(255) NULL COMMENT '退货换箱唛新箱唛',
|
||
id BIGINT NOT NULL COMMENT '主键ID',
|
||
application_id BIGINT NOT NULL COMMENT '申请单ID',
|
||
customer_id VARCHAR(128) NOT NULL COMMENT '客户租户ID',
|
||
sku_code VARCHAR(128) NULL COMMENT 'SKU编码(选填)',
|
||
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 '已通知箱数',
|
||
shipment_no VARCHAR(128) NULL COMMENT '货件编号(无FBA去向时为空)',
|
||
tracking_code VARCHAR(255) NULL COMMENT '物流跟踪编码',
|
||
new_sku_code VARCHAR(128) NULL COMMENT '换标后SKU编码;批量SKU换标使用子明细JSON时为空',
|
||
label_requirement VARCHAR(1000) NULL COMMENT '换标要求',
|
||
remark VARCHAR(1000) NULL COMMENT '货物明细备注',
|
||
relabel_file_id VARCHAR(128) NULL COMMENT '换标文件ID',
|
||
relabel_file_name VARCHAR(255) NULL COMMENT '换标文件名',
|
||
relabel_file_url VARCHAR(1000) NULL COMMENT '换标文件地址',
|
||
carton_mark VARCHAR(255) NULL COMMENT '客户自有箱唛',
|
||
fba_carton_mark VARCHAR(255) NULL COMMENT '关联FBA箱唛',
|
||
destination_warehouse_id VARCHAR(128) NULL COMMENT '该箱目的海外仓ID',
|
||
destination_fba_warehouse_code VARCHAR(128) NULL COMMENT '可选FBA目的仓编码(与海外操作仓分离)',
|
||
operation_type VARCHAR(32) NOT NULL DEFAULT 'CARTON_LABEL' COMMENT '换标模式:箱唛、SKU或组合换标',
|
||
sku_relabel_items_json JSON NULL COMMENT '同箱SKU换标子明细快照(数量按件)',
|
||
source_inventory_balance_id BIGINT NULL COMMENT '原库存余额ID(预入仓换标任务可为空)',
|
||
source_inventory_position_id BIGINT NULL COMMENT '原库存库位ID(预入仓换标任务可为空)',
|
||
source_inbound_order_id BIGINT NULL COMMENT '原入仓单ID(预入仓换标任务可为空)',
|
||
source_inbound_order_no VARCHAR(128) NULL COMMENT '原入仓单号快照',
|
||
source_inbound_code VARCHAR(128) NULL COMMENT '原进仓编码快照',
|
||
source_warehouse_id VARCHAR(128) NULL COMMENT '原海外中转仓ID;预入仓批量SKU换标时为空',
|
||
source_warehouse_code VARCHAR(128) NULL COMMENT '原海外中转仓编码快照',
|
||
source_warehouse_name VARCHAR(255) NULL COMMENT '原海外中转仓名称快照',
|
||
created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '创建时间',
|
||
PRIMARY KEY (id),
|
||
KEY idx_ll_relabel_item_application (customer_id,application_id),
|
||
KEY idx_ll_relabel_item_sku (customer_id,sku_code),
|
||
KEY idx_ll_relabel_item_destination (customer_id,destination_warehouse_id,application_id)
|
||
) ENGINE=InnoDB COMMENT='换标货物冻结明细';
|
||
|
||
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;
|
||
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;
|
||
|
||
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;
|
||
|
||
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='换标状态变更历史';
|
||
|
||
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 '跳过或异常原因',
|
||
quantity INT NOT NULL DEFAULT 1 COMMENT '本次事实处理件数,箱级作业固定为1',
|
||
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逐件换标扫码与异常事实';
|
||
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;
|
||
|
||
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换标任务不可变操作历史';
|
||
|
||
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 '来源托盘号快照',
|
||
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 '整托完整清单摘要',
|
||
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),
|
||
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)
|
||
) 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 '箱唛',
|
||
product_quantity BIGINT NOT NULL COMMENT '该箱实收商品件数',
|
||
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='一件代发箱唛明细';
|
||
|
||
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明细';
|
||
|
||
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',
|
||
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 '审核备注',
|
||
review_idempotency_key VARCHAR(255) NULL COMMENT '审核幂等键', review_request_hash CHAR(64) NULL COMMENT '审核请求内容哈希',
|
||
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',
|
||
order_id BIGINT NULL COMMENT '一件代发订单ID', source_type VARCHAR(32) NOT NULL DEFAULT 'DROPSHIP' COMMENT '库存来源:一件代发DROPSHIP、退货箱RETURN_CARTON',
|
||
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 '产品名称',
|
||
available_packages_snapshot INT NOT NULL COMMENT '可用箱数快照', discard_packages INT NOT NULL COMMENT '申请废弃箱数',
|
||
actual_discard_packages INT NULL COMMENT 'PDA确认实际废弃箱数', pda_status VARCHAR(32) NOT NULL DEFAULT 'PENDING' COMMENT 'PDA处理状态:待处理PENDING、已完成COMPLETED',
|
||
pda_operator_id VARCHAR(128) NULL COMMENT 'PDA操作人', pda_completed_at DATETIME(3) NULL COMMENT 'PDA完成时间',
|
||
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),
|
||
KEY idx_ll_cargo_discard_item_list(customer_id,application_id),
|
||
KEY idx_ll_cargo_discard_item_inbound(customer_id,inbound_code,sku_code)
|
||
) ENGINE=InnoDB COMMENT='货物废弃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 '箱唛',
|
||
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 '联系人电话',
|
||
purchase_warehouse_id VARCHAR(128) NULL COMMENT '采购入仓仓库ID', purchase_warehouse_name VARCHAR(255) NULL COMMENT '采购入仓仓库名称', outbound_details JSON NULL COMMENT '出库明细',
|
||
inbound_quantity BIGINT NOT NULL DEFAULT 0 COMMENT '采购单据累计入库数量',
|
||
domestic_carrier VARCHAR(128) NULL COMMENT '境内承运商', domestic_tracking_no VARCHAR(128) NULL COMMENT '境内物流单号',
|
||
overseas_carrier VARCHAR(128) NULL COMMENT '海外承运商', overseas_tracking_no VARCHAR(128) NULL COMMENT '海外物流单号',
|
||
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 '审核备注',
|
||
review_idempotency_key VARCHAR(255) NULL COMMENT '审核幂等键', review_request_hash CHAR(64) NULL COMMENT '审核请求内容哈希',
|
||
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',
|
||
operation_type VARCHAR(32) NOT NULL COMMENT '操作类型:CREATE、REVIEW或UPDATE',
|
||
from_status VARCHAR(32) NULL COMMENT '变更前状态', to_status VARCHAR(32) NOT NULL COMMENT '变更后状态', operator_id VARCHAR(128) NULL COMMENT '操作人ID',
|
||
idempotency_key VARCHAR(255) NULL COMMENT '操作幂等键', change_detail JSON NULL COMMENT '字段变更前后值JSON', remark VARCHAR(1000) NULL COMMENT '备注',
|
||
created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '创建时间',
|
||
PRIMARY KEY(id), KEY idx_ll_overseas_procurement_history(customer_id,order_id,created_at)
|
||
) ENGINE=InnoDB COMMENT='海外采购操作流水';
|
||
|
||
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 '目的地址',
|
||
container_type VARCHAR(32) NULL DEFAULT NULL COMMENT '柜型;拼车来源未提供时为空,不推断为整柜',
|
||
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='美国卡车订单托盘实收记录';
|
||
|
||
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='美国卡车订单幂等操作账';
|
||
|
||
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',
|
||
operation_type VARCHAR(64) NOT NULL COMMENT '具名操作类型',
|
||
from_status VARCHAR(32) NULL COMMENT '变更前状态',
|
||
to_status VARCHAR(32) NOT NULL COMMENT '变更后状态',
|
||
operator_id VARCHAR(128) NULL COMMENT '操作人ID',
|
||
idempotency_key VARCHAR(255) NULL COMMENT '操作幂等键',
|
||
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='美国卡车订单状态历史';
|
||
|
||
CREATE TABLE IF NOT EXISTS ll_local_looseboard_order (
|
||
id BIGINT NOT NULL COMMENT '主键ID', customer_id VARCHAR(128) NOT NULL COMMENT '客户租户ID',
|
||
lastleg_order_id BIGINT NULL COMMENT '关联尾程主订单ID',
|
||
order_no VARCHAR(64) NOT NULL COMMENT '本土散板订单号', transport_mode VARCHAR(32) NOT NULL COMMENT '运输方式:拼车或优先拼载',
|
||
pallet_required VARCHAR(8) NULL DEFAULT NULL COMMENT '是否需要打盘:YES或NO;拼车来源未提供时为空', 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 '目的详细地址、码头或仓号',
|
||
container_type VARCHAR(32) NULL DEFAULT NULL COMMENT '柜型;拼车来源未提供时为空,不推断为整柜', package_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 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),
|
||
UNIQUE KEY uk_ll_local_looseboard_lastleg(lastleg_order_id),
|
||
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',
|
||
idempotency_key VARCHAR(255) NULL COMMENT '操作幂等键', change_detail JSON NULL COMMENT '字段变更前后值JSON', remark VARCHAR(1000) NULL COMMENT '操作备注',
|
||
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='本土散板操作流水';
|
||
|
||
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='本土散板订单幂等操作账';
|
||
|
||
CREATE TABLE IF NOT EXISTS ll_exception_order (
|
||
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 '退回物流单号',
|
||
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 '处理人名称',
|
||
source_type VARCHAR(32) NOT NULL DEFAULT 'MANUAL' COMMENT '异常来源类型', created_by VARCHAR(128) NULL COMMENT '创建人ID',
|
||
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 '创建时间',
|
||
updated_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3) COMMENT '更新时间',
|
||
return_context_json JSON NULL COMMENT '退回异常创建前的派送及尾程状态快照',
|
||
|
||
PRIMARY KEY(id), UNIQUE KEY uk_ll_exception_no(customer_id,exception_no),
|
||
KEY idx_ll_exception_delivery_return(customer_id,delivery_order_id,exception_type),
|
||
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='海外仓异常订单';
|
||
|
||
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',
|
||
inventory_position_id BIGINT NOT NULL COMMENT '原出库库存位置ID', pallet_no VARCHAR(128) NULL COMMENT '原出库托盘码快照',
|
||
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 '创建时间',
|
||
received_packages BIGINT NOT NULL DEFAULT 0 COMMENT '已实际退回入仓的累计箱数',
|
||
CONSTRAINT chk_exception_return_received CHECK(received_packages>=0 AND received_packages<=approved_return_packages),
|
||
|
||
PRIMARY KEY(id), UNIQUE KEY uk_ll_exception_return_source(customer_id,exception_order_id,outbound_pallet_item_id,inventory_position_id),
|
||
KEY idx_ll_exception_return_order(customer_id,exception_order_id)
|
||
) ENGINE=InnoDB COMMENT='异常退回原出库库存冻结明细';
|
||
|
||
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='异常处理命令幂等审计';
|
||
|
||
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='派送单维度客户回访记录';
|
||
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',
|
||
payload_hash VARCHAR(71) NOT NULL COMMENT '规范化载荷SHA-256,包含sha256:前缀',
|
||
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',
|
||
category VARCHAR(16) NOT NULL COMMENT 'RECEIPT签收文件或VOUCHER费用凭证', file_id BIGINT NOT NULL COMMENT 'File服务文件ID',
|
||
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),
|
||
CONSTRAINT chk_ll_procurement_file_category CHECK(category IN ('RECEIPT','VOUCHER'))
|
||
) ENGINE=InnoDB COMMENT='海外采购签收文件及费用凭证';
|
||
|
||
CREATE TABLE IF NOT EXISTS ll_overseas_procurement_fee (
|
||
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 '费用项名称',
|
||
amount DECIMAL(20,2) NOT NULL COMMENT 'CNY金额', currency CHAR(3) NOT NULL DEFAULT 'CNY' COMMENT '费用币种', voucher_file_id BIGINT NOT NULL COMMENT '凭证文件ID',
|
||
voucher_file_name VARCHAR(255) NOT NULL COMMENT '凭证文件名', remark VARCHAR(500) NULL COMMENT '说明',
|
||
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 '更新时间',
|
||
PRIMARY KEY(id), UNIQUE KEY uk_ll_procurement_fee_no(fee_no), KEY idx_ll_procurement_fee_order(customer_id,order_id,created_at),
|
||
CONSTRAINT chk_ll_procurement_fee_amount CHECK(amount>0), CONSTRAINT chk_ll_procurement_fee_currency CHECK(currency='CNY')
|
||
) 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='拆柜打托成本按客户实收体积分摊';
|
||
|
||
-- 客户退货预报、PDA 签收与仓储费起算批次
|
||
CREATE TABLE IF NOT EXISTS ll_return_order (
|
||
-- need_relabel is added below for existing deployments
|
||
id BIGINT NOT NULL COMMENT '退货订单ID', customer_id VARCHAR(128) NOT NULL COMMENT '客户ID和隔离键', return_no VARCHAR(128) NOT NULL COMMENT '退货订单号', overseas_warehouse_id VARCHAR(128) 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 '最后更新时间',
|
||
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)
|
||
) ENGINE=InnoDB COMMENT='客户退货订单及SKU实收汇总';
|
||
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;
|
||
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;
|
||
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;
|
||
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 (
|
||
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) NOT NULL COMMENT 'SKU编码', product_name_zh VARCHAR(255) 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 '最后更新时间',
|
||
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)
|
||
) ENGINE=InnoDB COMMENT='客户退货订单的SKU预报与实收明细';
|
||
CREATE TABLE IF NOT EXISTS ll_return_receipt (
|
||
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) 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 '创建时间',
|
||
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'))
|
||
) ENGINE=InnoDB COMMENT='PDA退货实收签收事实';
|
||
|
||
-- 已创建开发库升级为“客户只预报 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;
|
||
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;
|
||
CREATE TABLE IF NOT EXISTS ll_return_receipt_item (
|
||
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) NOT NULL COMMENT 'SKU编码', received_quantity BIGINT NOT NULL COMMENT '本次SKU实收数量',
|
||
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)
|
||
) ENGINE=InnoDB COMMENT='PDA退货签收SKU实际数量明细';
|
||
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 (
|
||
new_carton_mark VARCHAR(255) NULL COMMENT '换标后新箱唛',
|
||
id BIGINT NOT NULL COMMENT '退货库存箱ID', customer_id VARCHAR(128) NOT NULL COMMENT '客户ID和隔离键', overseas_warehouse_id VARCHAR(128) NOT NULL COMMENT '海外仓ID', source_receipt_id BIGINT NULL COMMENT '来源PDA签收单ID', source_batch_no VARCHAR(128) NULL COMMENT '来源签收批次号', carton_mark VARCHAR(128) 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 '合箱完成时间',
|
||
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'))
|
||
) ENGINE=InnoDB COMMENT='退货实物库存箱及箱唛';
|
||
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_return_no'));
|
||
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;
|
||
-- 已合箱的来源箱保留审计记录,但其箱内库存必须归零;动态 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;
|
||
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));
|
||
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;
|
||
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'));
|
||
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;
|
||
ALTER TABLE ll_return_inventory_carton MODIFY COLUMN source_batch_no TEXT NULL COMMENT '实际消耗来源签收批次号,多个批次逗号分隔', MODIFY COLUMN source_return_no TEXT NULL COMMENT '实际消耗来源退货单号,多个单号逗号分隔';
|
||
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 (
|
||
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) NOT NULL COMMENT 'SKU编码', product_name_zh VARCHAR(255) NULL COMMENT '中文品名', quantity BIGINT NOT NULL COMMENT '该SKU箱内数量',
|
||
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)
|
||
) ENGINE=InnoDB COMMENT='退货库存箱内SKU和数量';
|
||
-- 退货出库按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',
|
||
customer_id VARCHAR(128) NOT NULL COMMENT '库存所属客户ID和隔离键',
|
||
overseas_warehouse_id VARCHAR(128) NOT NULL COMMENT '实际出库海外仓ID',
|
||
carton_id BIGINT NOT NULL COMMENT '真实退货库存箱ID',
|
||
carton_mark VARCHAR(128) NOT NULL COMMENT '冻结的真实退货箱业务码',
|
||
outbound_no VARCHAR(64) NOT NULL COMMENT '本次退货出库业务单号',
|
||
sku_code VARCHAR(128) NOT NULL COMMENT '本次出库SKU编码快照',
|
||
product_name_zh VARCHAR(255) NULL COMMENT '中文品名快照',
|
||
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),
|
||
UNIQUE KEY uk_ll_return_outbound_carton_sku(customer_id,carton_id,sku_code),
|
||
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
|
||
AND cartons_after>=0 AND cartons_before-cartons_after=1 AND total_after>=available_after)
|
||
) ENGINE=InnoDB COMMENT='不可变退货出库SKU库存流水';
|
||
|
||
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合箱幂等操作审计';
|
||
|
||
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='海外拆柜只读国内装柜照片引用';
|
||
|
||
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;
|
||
|
||
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='本服务业务事件逐次投递审计';
|