贴标申请,仓储转运
This commit is contained in:
@@ -4304,3 +4304,730 @@ SET @ddl = (SELECT IF(EXISTS (SELECT 1 FROM information_schema.columns WHERE tab
|
||||
PREPARE dispatch_postal_stmt FROM @ddl; EXECUTE dispatch_postal_stmt; DEALLOCATE PREPARE dispatch_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='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;
|
||||
|
||||
-- 2026-09-29: 箱维度退货出库明细不绑定托盘,托盘号必须允许为空。
|
||||
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='pallet_no' AND is_nullable='NO'), 'ALTER TABLE ll_outbound_pallet_item MODIFY COLUMN pallet_no VARCHAR(128) NULL COMMENT ''托盘号,箱维度出库为空''', 'SELECT 1'));
|
||||
PREPARE outbound_box_nullable_stmt FROM @ddl; EXECUTE outbound_box_nullable_stmt; DEALLOCATE PREPARE outbound_box_nullable_stmt;
|
||||
|
||||
-- 2026-09-29: 换标箱唛总文件字段,兼容旧库增量升级。
|
||||
SET @ddl = (SELECT IF(EXISTS (SELECT 1 FROM information_schema.tables WHERE table_schema=DATABASE() AND table_name='ll_relabel_application') AND NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema=DATABASE() AND table_name='ll_relabel_application' AND column_name='carton_total_file_id'), 'ALTER TABLE ll_relabel_application ADD COLUMN carton_total_file_id VARCHAR(128) NULL COMMENT ''箱唛总文件ID'' AFTER total_file_url, ADD COLUMN carton_total_file_name VARCHAR(255) NULL COMMENT ''箱唛总文件名'' AFTER carton_total_file_id', 'SELECT 1'));
|
||||
PREPARE relabel_carton_total_stmt FROM @ddl; EXECUTE relabel_carton_total_stmt; DEALLOCATE PREPARE relabel_carton_total_stmt;
|
||||
|
||||
-- 2026-09-29 退货三类签收、合箱计划及出库预留,目标库 baiyue_lastleg。
|
||||
USE baiyue_lastleg;
|
||||
SET @ddl = IF(NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema=DATABASE() AND table_name='ll_return_receipt' AND column_name='unit_type'), 'ALTER TABLE ll_return_receipt ADD COLUMN unit_type VARCHAR(16) NULL COMMENT ''签收实物类型 PALLET/BOX/PARCEL'' AFTER receipt_batch_no, ADD COLUMN unit_code VARCHAR(128) NULL COMMENT ''签收实物编码'' AFTER unit_type', 'SELECT 1');
|
||||
PREPARE stmt FROM @ddl; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
SET @ddl = IF(NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema=DATABASE() AND table_name='ll_return_receipt' AND column_name='total_box_count'), 'ALTER TABLE ll_return_receipt ADD COLUMN total_box_count BIGINT NULL COMMENT ''本次实物总箱数,托盘独立于SKU箱数'' AFTER unit_code', 'SELECT 1');
|
||||
PREPARE stmt FROM @ddl; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
SET @ddl = IF(NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema=DATABASE() AND table_name='ll_return_receipt' AND column_name='length'), 'ALTER TABLE ll_return_receipt ADD COLUMN length DECIMAL(12,3) NULL COMMENT ''托盘长度CM'', ADD COLUMN width DECIMAL(12,3) NULL COMMENT ''托盘宽度CM'', ADD COLUMN height DECIMAL(12,3) NULL COMMENT ''托盘高度CM'', ADD COLUMN weight DECIMAL(12,3) NULL COMMENT ''托盘重量KG''', 'SELECT 1');
|
||||
PREPARE stmt FROM @ddl; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
SET @ddl = IF(NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema=DATABASE() AND table_name='ll_return_receipt_item' AND column_name='box_count'), 'ALTER TABLE ll_return_receipt_item ADD COLUMN box_count BIGINT NULL COMMENT ''本次SKU对应箱数'' AFTER received_quantity', 'SELECT 1');
|
||||
PREPARE stmt FROM @ddl; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
SET @ddl = IF(NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema=DATABASE() AND table_name='ll_return_inventory_carton' AND column_name='source_unit_type'), 'ALTER TABLE ll_return_inventory_carton ADD COLUMN source_unit_type VARCHAR(16) NULL COMMENT ''来源实物类型'' AFTER source_return_no, ADD COLUMN source_unit_code VARCHAR(128) NULL COMMENT ''来源实物编码'' AFTER source_unit_type', 'SELECT 1');
|
||||
PREPARE stmt FROM @ddl; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
SET @ddl = 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 stmt FROM @ddl; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
SET @ddl = 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 stmt FROM @ddl; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
ALTER TABLE ll_return_inventory_carton ADD CONSTRAINT chk_ll_return_inventory_carton_quantity CHECK((status IN('AVAILABLE','RELABEL_PENDING','OUTBOUND_PENDING','OUTBOUNDED','DISCARD_PENDING') AND sku_types>0 AND total_quantity>0) OR (status IN('MERGED','DISCARDED') AND sku_types=0 AND total_quantity=0));
|
||||
ALTER TABLE ll_return_inventory_carton ADD CONSTRAINT chk_ll_return_inventory_carton_status CHECK(status IN('AVAILABLE','RELABEL_PENDING','OUTBOUND_PENDING','MERGED','OUTBOUNDED','DISCARD_PENDING','DISCARDED'));
|
||||
CREATE TABLE IF NOT EXISTS ll_return_packing_plan (
|
||||
id BIGINT NOT NULL COMMENT '退货合箱计划ID', plan_no VARCHAR(128) NOT NULL COMMENT '合箱计划号', customer_id VARCHAR(128) NOT NULL COMMENT '客户ID和隔离键', overseas_warehouse_id VARCHAR(128) NOT NULL COMMENT '海外仓ID', return_nos_json JSON NOT NULL COMMENT '参与退货单号', boxes_json JSON NOT NULL COMMENT '客户下发箱明细', mode VARCHAR(32) NOT NULL COMMENT '指令模式', status VARCHAR(32) NOT NULL COMMENT '计划状态', remark VARCHAR(1000) NULL COMMENT '备注', idempotency_key VARCHAR(255) NOT NULL COMMENT '创建幂等键', created_at DATETIME(3) NOT NULL COMMENT '创建时间', updated_at DATETIME(3) NOT NULL COMMENT '更新时间', pushed_at DATETIME(3) NULL COMMENT '推送PDA时间', completed_at DATETIME(3) NULL COMMENT '完成时间',
|
||||
PRIMARY KEY(id), UNIQUE KEY uk_ll_return_packing_plan_no(plan_no), UNIQUE KEY uk_ll_return_packing_plan_key(customer_id,idempotency_key), KEY idx_ll_return_packing_plan_warehouse(overseas_warehouse_id,status,pushed_at)
|
||||
) ENGINE=InnoDB COMMENT='客户退货合箱计划及PDA作业';
|
||||
|
||||
-- 2026-09-29: 托盘是载体,同一签收批次允许生成多个独立退货箱。
|
||||
SET @ddl = (SELECT IF(EXISTS (SELECT 1 FROM information_schema.statistics WHERE table_schema=DATABASE() AND table_name='ll_return_inventory_carton' AND index_name='uk_ll_return_inventory_carton_receipt'), 'ALTER TABLE ll_return_inventory_carton DROP INDEX uk_ll_return_inventory_carton_receipt, ADD INDEX idx_ll_return_inventory_carton_receipt(source_receipt_id)', 'SELECT 1'));
|
||||
PREPARE return_carton_receipt_index_stmt FROM @ddl; EXECUTE return_carton_receipt_index_stmt; DEALLOCATE PREPARE return_carton_receipt_index_stmt;
|
||||
|
||||
-- 2026-10-08 退货合箱精确预占、来源追溯与箱级上架;MySQL 8,可重复执行。
|
||||
SET @return_packing_ddl = (SELECT IF(EXISTS(SELECT 1 FROM information_schema.statistics WHERE table_schema=DATABASE() AND table_name='ll_return_inventory_carton' AND index_name='uk_ll_return_inventory_carton_receipt'), 'ALTER TABLE ll_return_inventory_carton DROP INDEX uk_ll_return_inventory_carton_receipt', 'SELECT 1'));
|
||||
PREPARE return_packing_stmt FROM @return_packing_ddl; EXECUTE return_packing_stmt; DEALLOCATE PREPARE return_packing_stmt;
|
||||
USE baiyue_lastleg;
|
||||
SET @return_packing_ddl = (SELECT IF(EXISTS(SELECT 1 FROM information_schema.columns WHERE table_schema=DATABASE() AND table_name='ll_return_receipt' AND column_name='unit_type'), 'SELECT 1', 'ALTER TABLE ll_return_receipt ADD COLUMN unit_type VARCHAR(16) NULL COMMENT ''签收类型 PALLET/BOX/PARCEL'''));
|
||||
PREPARE return_packing_stmt FROM @return_packing_ddl; EXECUTE return_packing_stmt; DEALLOCATE PREPARE return_packing_stmt;
|
||||
SET @return_packing_ddl = (SELECT IF(EXISTS(SELECT 1 FROM information_schema.columns WHERE table_schema=DATABASE() AND table_name='ll_return_receipt' AND column_name='unit_code'), 'SELECT 1', 'ALTER TABLE ll_return_receipt ADD COLUMN unit_code VARCHAR(128) NULL COMMENT ''签收单元业务码'''));
|
||||
PREPARE return_packing_stmt FROM @return_packing_ddl; EXECUTE return_packing_stmt; DEALLOCATE PREPARE return_packing_stmt;
|
||||
SET @return_packing_ddl = (SELECT IF(EXISTS(SELECT 1 FROM information_schema.columns WHERE table_schema=DATABASE() AND table_name='ll_return_receipt' AND column_name='total_box_count'), 'SELECT 1', 'ALTER TABLE ll_return_receipt ADD COLUMN total_box_count BIGINT NULL COMMENT ''签收SKU箱数汇总'''));
|
||||
PREPARE return_packing_stmt FROM @return_packing_ddl; EXECUTE return_packing_stmt; DEALLOCATE PREPARE return_packing_stmt;
|
||||
SET @return_packing_ddl = (SELECT IF(EXISTS(SELECT 1 FROM information_schema.columns WHERE table_schema=DATABASE() AND table_name='ll_return_receipt' AND column_name='length'), 'SELECT 1', 'ALTER TABLE ll_return_receipt ADD COLUMN length DECIMAL(12,3) NULL COMMENT ''实测尺寸cm'''));
|
||||
PREPARE return_packing_stmt FROM @return_packing_ddl; EXECUTE return_packing_stmt; DEALLOCATE PREPARE return_packing_stmt;
|
||||
SET @return_packing_ddl = (SELECT IF(EXISTS(SELECT 1 FROM information_schema.columns WHERE table_schema=DATABASE() AND table_name='ll_return_receipt' AND column_name='width'), 'SELECT 1', 'ALTER TABLE ll_return_receipt ADD COLUMN width DECIMAL(12,3) NULL COMMENT ''实测尺寸cm'''));
|
||||
PREPARE return_packing_stmt FROM @return_packing_ddl; EXECUTE return_packing_stmt; DEALLOCATE PREPARE return_packing_stmt;
|
||||
SET @return_packing_ddl = (SELECT IF(EXISTS(SELECT 1 FROM information_schema.columns WHERE table_schema=DATABASE() AND table_name='ll_return_receipt' AND column_name='height'), 'SELECT 1', 'ALTER TABLE ll_return_receipt ADD COLUMN height DECIMAL(12,3) NULL COMMENT ''实测尺寸cm'''));
|
||||
PREPARE return_packing_stmt FROM @return_packing_ddl; EXECUTE return_packing_stmt; DEALLOCATE PREPARE return_packing_stmt;
|
||||
SET @return_packing_ddl = (SELECT IF(EXISTS(SELECT 1 FROM information_schema.columns WHERE table_schema=DATABASE() AND table_name='ll_return_receipt' AND column_name='weight'), 'SELECT 1', 'ALTER TABLE ll_return_receipt ADD COLUMN weight DECIMAL(12,3) NULL COMMENT ''实测重量kg'''));
|
||||
PREPARE return_packing_stmt FROM @return_packing_ddl; EXECUTE return_packing_stmt; DEALLOCATE PREPARE return_packing_stmt;
|
||||
SET @return_packing_ddl = (SELECT IF(EXISTS(SELECT 1 FROM information_schema.columns WHERE table_schema=DATABASE() AND table_name='ll_return_receipt_item' AND column_name='box_count'), 'SELECT 1', 'ALTER TABLE ll_return_receipt_item ADD COLUMN box_count BIGINT NULL COMMENT ''SKU签收箱数'''));
|
||||
PREPARE return_packing_stmt FROM @return_packing_ddl; EXECUTE return_packing_stmt; DEALLOCATE PREPARE return_packing_stmt;
|
||||
SET @return_packing_ddl = (SELECT IF(EXISTS(SELECT 1 FROM information_schema.columns WHERE table_schema=DATABASE() AND table_name='ll_return_inventory_carton' AND column_name='source_unit_code'), 'SELECT 1', 'ALTER TABLE ll_return_inventory_carton ADD COLUMN source_unit_code VARCHAR(128) NULL COMMENT ''来源单元业务码'''));
|
||||
PREPARE return_packing_stmt FROM @return_packing_ddl; EXECUTE return_packing_stmt; DEALLOCATE PREPARE return_packing_stmt;
|
||||
CREATE TABLE IF NOT EXISTS ll_return_packing_plan (
|
||||
id BIGINT NOT NULL COMMENT '合箱计划ID', plan_no VARCHAR(128) NOT NULL COMMENT '计划业务号',
|
||||
customer_id VARCHAR(128) NOT NULL COMMENT '客户隔离键', overseas_warehouse_id VARCHAR(128) NOT NULL COMMENT '海外仓ID',
|
||||
return_nos_json JSON NOT NULL COMMENT '来源退货单范围', boxes_json JSON NOT NULL COMMENT '目标箱明细',
|
||||
mode VARCHAR(32) NOT NULL COMMENT 'SKU散件或BOX箱合并', status VARCHAR(32) NOT NULL COMMENT 'PENDING_REVIEW待审 READY已推送 COMPLETED完成 CANCELLED取消',
|
||||
remark VARCHAR(1000) NULL COMMENT '合箱备注', idempotency_key VARCHAR(255) NOT NULL COMMENT '创建幂等键',
|
||||
created_at DATETIME(3) NOT NULL COMMENT '创建时间', updated_at DATETIME(3) NOT NULL COMMENT '更新时间',
|
||||
pushed_at DATETIME(3) NULL COMMENT '审核推送时间', completed_at DATETIME(3) NULL COMMENT '作业完成时间',
|
||||
PRIMARY KEY(id), UNIQUE KEY uk_ll_return_packing_plan_no(plan_no),
|
||||
UNIQUE KEY uk_ll_return_packing_plan_key(customer_id,idempotency_key),
|
||||
KEY idx_ll_return_packing_plan_warehouse(overseas_warehouse_id,status,pushed_at)
|
||||
) ENGINE=InnoDB COMMENT='退货合箱计划';
|
||||
SET @return_packing_ddl = (SELECT IF(EXISTS(SELECT 1 FROM information_schema.columns WHERE table_schema=DATABASE() AND table_name='ll_return_inventory_carton_item' AND column_name='packing_reserved_quantity'), 'SELECT 1', 'ALTER TABLE ll_return_inventory_carton_item ADD COLUMN packing_reserved_quantity BIGINT NOT NULL DEFAULT 0 COMMENT ''合箱计划预占件数'''));
|
||||
PREPARE return_packing_stmt FROM @return_packing_ddl; EXECUTE return_packing_stmt; DEALLOCATE PREPARE return_packing_stmt;
|
||||
SET @return_packing_ddl = (SELECT IF(EXISTS(SELECT 1 FROM information_schema.columns WHERE table_schema=DATABASE() AND table_name='ll_return_packing_plan' AND column_name='source_items_json'), 'SELECT 1', 'ALTER TABLE ll_return_packing_plan ADD COLUMN source_items_json JSON NULL COMMENT ''精确来源箱和SKU锁定数量'''));
|
||||
PREPARE return_packing_stmt FROM @return_packing_ddl; EXECUTE return_packing_stmt; DEALLOCATE PREPARE return_packing_stmt;
|
||||
SET @return_packing_ddl = (SELECT IF(EXISTS(SELECT 1 FROM information_schema.columns WHERE table_schema=DATABASE() AND table_name='ll_return_packing_plan' AND column_name='result_marks_json'), 'SELECT 1', 'ALTER TABLE ll_return_packing_plan ADD COLUMN result_marks_json JSON NULL COMMENT ''完成生成或并入的目标箱唛'''));
|
||||
PREPARE return_packing_stmt FROM @return_packing_ddl; EXECUTE return_packing_stmt; DEALLOCATE PREPARE return_packing_stmt;
|
||||
SET @return_packing_ddl = (SELECT IF(EXISTS(SELECT 1 FROM information_schema.columns WHERE table_schema=DATABASE() AND table_name='ll_return_packing_plan' AND column_name='request_hash'), 'SELECT 1', 'ALTER TABLE ll_return_packing_plan ADD COLUMN request_hash VARCHAR(64) NULL COMMENT ''创建载荷摘要'''));
|
||||
PREPARE return_packing_stmt FROM @return_packing_ddl; EXECUTE return_packing_stmt; DEALLOCATE PREPARE return_packing_stmt;
|
||||
SET @return_packing_ddl = (SELECT IF(EXISTS(SELECT 1 FROM information_schema.columns WHERE table_schema=DATABASE() AND table_name='ll_return_packing_plan' AND column_name='completion_hash'), 'SELECT 1', 'ALTER TABLE ll_return_packing_plan ADD COLUMN completion_hash VARCHAR(64) NULL COMMENT ''完成载荷摘要'''));
|
||||
PREPARE return_packing_stmt FROM @return_packing_ddl; EXECUTE return_packing_stmt; DEALLOCATE PREPARE return_packing_stmt;
|
||||
SET @return_packing_ddl = (SELECT IF(EXISTS(SELECT 1 FROM information_schema.columns WHERE table_schema=DATABASE() AND table_name='ll_return_inventory_carton' AND column_name='location_code'), 'SELECT 1', 'ALTER TABLE ll_return_inventory_carton ADD COLUMN location_code VARCHAR(128) NULL COMMENT ''退货箱当前库位'''));
|
||||
PREPARE return_packing_stmt FROM @return_packing_ddl; EXECUTE return_packing_stmt; DEALLOCATE PREPARE return_packing_stmt;
|
||||
SET @return_packing_ddl = (SELECT IF(EXISTS(SELECT 1 FROM information_schema.columns WHERE table_schema=DATABASE() AND table_name='ll_return_inventory_carton' AND column_name='putaway_at'), 'SELECT 1', 'ALTER TABLE ll_return_inventory_carton ADD COLUMN putaway_at DATETIME(3) NULL COMMENT ''退货箱上架时间'''));
|
||||
PREPARE return_packing_stmt FROM @return_packing_ddl; EXECUTE return_packing_stmt; DEALLOCATE PREPARE return_packing_stmt;
|
||||
SET @return_packing_ddl = (SELECT IF(EXISTS(SELECT 1 FROM information_schema.columns WHERE table_schema=DATABASE() AND table_name='ll_return_inventory_carton' AND column_name='source_unit_type'), 'SELECT 1', 'ALTER TABLE ll_return_inventory_carton ADD COLUMN source_unit_type VARCHAR(32) NULL COMMENT ''PALLET或BOX实物箱 PARCEL散SKU'''));
|
||||
PREPARE return_packing_stmt FROM @return_packing_ddl; EXECUTE return_packing_stmt; DEALLOCATE PREPARE return_packing_stmt;
|
||||
SET @return_packing_ddl = (SELECT IF(EXISTS(SELECT 1 FROM information_schema.table_constraints WHERE constraint_schema=DATABASE() AND table_name='ll_return_inventory_carton' AND constraint_name='chk_ll_return_inventory_carton_quantity'), 'ALTER TABLE ll_return_inventory_carton DROP CHECK chk_ll_return_inventory_carton_quantity', 'SELECT 1'));
|
||||
PREPARE return_packing_stmt FROM @return_packing_ddl; EXECUTE return_packing_stmt; DEALLOCATE PREPARE return_packing_stmt;
|
||||
SET @return_packing_ddl = (SELECT IF(EXISTS(SELECT 1 FROM information_schema.table_constraints WHERE constraint_schema=DATABASE() AND table_name='ll_return_inventory_carton' AND constraint_name='chk_ll_return_inventory_carton_status'), 'ALTER TABLE ll_return_inventory_carton DROP CHECK chk_ll_return_inventory_carton_status', 'SELECT 1'));
|
||||
PREPARE return_packing_stmt FROM @return_packing_ddl; EXECUTE return_packing_stmt; DEALLOCATE PREPARE return_packing_stmt;
|
||||
ALTER TABLE ll_return_inventory_carton ADD CONSTRAINT chk_ll_return_inventory_carton_quantity CHECK((status IN('AVAILABLE','PACKING_RESERVED','RELABEL_PENDING','OUTBOUND_PENDING','OUTBOUNDED','DISCARD_PENDING') AND sku_types>0 AND total_quantity>0) OR (status IN('MERGED','DISCARDED') AND sku_types=0 AND total_quantity=0));
|
||||
ALTER TABLE ll_return_inventory_carton ADD CONSTRAINT chk_ll_return_inventory_carton_status CHECK(status IN('AVAILABLE','PACKING_RESERVED','RELABEL_PENDING','OUTBOUND_PENDING','MERGED','OUTBOUNDED','DISCARD_PENDING','DISCARDED'));
|
||||
CREATE TABLE IF NOT EXISTS ll_return_packing_trace (
|
||||
id BIGINT NOT NULL COMMENT '合箱追溯ID', customer_id VARCHAR(128) NOT NULL COMMENT '原客户隔离键',
|
||||
operation_id BIGINT NOT NULL COMMENT '合箱操作ID', source_carton_mark VARCHAR(128) NOT NULL COMMENT '来源箱唛 空值表示目标箱原有库存快照',
|
||||
target_carton_mark VARCHAR(128) NOT NULL COMMENT '目标箱唛', return_no VARCHAR(128) NOT NULL COMMENT '原始退货单号',
|
||||
sku_code VARCHAR(128) NOT NULL COMMENT '商品SKU编码', quantity BIGINT NOT NULL COMMENT '本次移动件数',
|
||||
created_at DATETIME(3) NOT NULL COMMENT '发生时间', PRIMARY KEY(id),
|
||||
KEY idx_return_packing_trace_order(customer_id,return_no,created_at),
|
||||
KEY idx_return_packing_trace_target(customer_id,target_carton_mark,sku_code),
|
||||
KEY idx_return_packing_trace_source(customer_id,source_carton_mark,sku_code),
|
||||
CONSTRAINT chk_return_packing_trace_quantity CHECK(quantity>0)
|
||||
) ENGINE=InnoDB COMMENT='退货合箱逐SKU原始退货单不可变追溯';
|
||||
ALTER TABLE ll_return_packing_trace MODIFY COLUMN sku_code VARCHAR(128) NOT NULL COMMENT '商品SKU编码';
|
||||
SET @return_packing_ddl = (SELECT IF(EXISTS(SELECT 1 FROM information_schema.columns WHERE table_schema=DATABASE() AND table_name='ll_return_inventory_operation' AND column_name='result_json'), 'SELECT 1', 'ALTER TABLE ll_return_inventory_operation ADD COLUMN result_json JSON NULL COMMENT ''幂等操作不可变返回快照'''));
|
||||
PREPARE return_packing_stmt FROM @return_packing_ddl; EXECUTE return_packing_stmt; DEALLOCATE PREPARE return_packing_stmt;
|
||||
SET @return_packing_ddl = (SELECT IF(EXISTS(SELECT 1 FROM information_schema.columns WHERE table_schema=DATABASE() AND table_name='ll_return_packing_plan' AND column_name='result_labels_json'), 'SELECT 1', 'ALTER TABLE ll_return_packing_plan ADD COLUMN result_labels_json JSON NULL COMMENT ''计划完工标签快照'''));
|
||||
PREPARE return_packing_stmt FROM @return_packing_ddl; EXECUTE return_packing_stmt; DEALLOCATE PREPARE return_packing_stmt;
|
||||
-- Existing outbound tables need this field even when created before the fee snapshot baseline.
|
||||
USE baiyue_lastleg;
|
||||
SET @return_outbound_ddl = IF(EXISTS(SELECT 1 FROM information_schema.columns WHERE table_schema=DATABASE() AND table_name='ll_outbound_order' AND column_name='fee_coverage_json'), 'SELECT 1', 'ALTER TABLE ll_outbound_order ADD COLUMN fee_coverage_json JSON NULL COMMENT ''发运原费用及服务覆盖确认快照''');
|
||||
PREPARE return_outbound_stmt FROM @return_outbound_ddl;
|
||||
EXECUTE return_outbound_stmt;
|
||||
DEALLOCATE PREPARE return_outbound_stmt;
|
||||
USE baiyue_lastleg;
|
||||
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库存流水';
|
||||
|
||||
-- 原生退货换标排车:保留独立退货箱来源,不伪造普通库存仓位。
|
||||
USE baiyue_lastleg;
|
||||
SET @return_dispatch_ddl = IF((SELECT COUNT(*) FROM information_schema.columns WHERE table_schema=DATABASE() AND table_name='ll_dispatch_pda_pick' AND column_name='return_carton_id')=0,
|
||||
'ALTER TABLE ll_dispatch_pda_pick ADD COLUMN return_carton_id BIGINT NULL COMMENT ''独立退货库存箱ID,与普通仓位互斥''', 'SELECT 1');
|
||||
PREPARE return_dispatch_stmt FROM @return_dispatch_ddl;
|
||||
EXECUTE return_dispatch_stmt;
|
||||
DEALLOCATE PREPARE return_dispatch_stmt;
|
||||
ALTER TABLE ll_dispatch_pda_pick MODIFY COLUMN inventory_position_id BIGINT NULL COMMENT '普通库存仓位记录ID';
|
||||
CREATE TABLE IF NOT EXISTS 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='真实退回入仓及再次发运来源凭据';
|
||||
ALTER TABLE ll_dispatch_pda_pick_order MODIFY COLUMN receipt_id BIGINT NULL COMMENT '原入仓实收来源,与退回来源或原生退货箱互斥';
|
||||
-- 真实退回凭据与尾程订单客户键使用同一排序规则,避免相关库存子查询冲突。
|
||||
SET @return_customer_collation = (SELECT collation_name FROM information_schema.columns WHERE table_schema=DATABASE() AND table_name='ll_order' AND column_name='customer_id');
|
||||
SET @return_dispatch_ddl = CONCAT('ALTER TABLE ll_return_stock_receipt MODIFY COLUMN customer_id VARCHAR(128) CHARACTER SET utf8mb4 COLLATE ', @return_customer_collation, ' NOT NULL COMMENT ''客户数据归属''');
|
||||
PREPARE return_dispatch_stmt FROM @return_dispatch_ddl;
|
||||
EXECUTE return_dispatch_stmt;
|
||||
DEALLOCATE PREPARE return_dispatch_stmt;
|
||||
SET @return_dispatch_ddl = CONCAT('ALTER TABLE ll_return_stock_receipt MODIFY COLUMN source_outbound_no VARCHAR(64) CHARACTER SET utf8mb4 COLLATE ', @return_customer_collation, ' NOT NULL COMMENT ''原发运出库业务编号''');
|
||||
PREPARE return_dispatch_stmt FROM @return_dispatch_ddl;
|
||||
EXECUTE return_dispatch_stmt;
|
||||
DEALLOCATE PREPARE return_dispatch_stmt;
|
||||
SET @return_dispatch_ddl = IF((SELECT COUNT(*) FROM information_schema.columns WHERE table_schema=DATABASE() AND table_name='ll_dispatch_pda_pick_order' AND column_name='return_carton_id')=0,
|
||||
'ALTER TABLE ll_dispatch_pda_pick_order ADD COLUMN return_carton_id BIGINT NULL COMMENT ''原生退货箱来源ID,与实收来源互斥''', 'SELECT 1');
|
||||
PREPARE return_dispatch_stmt FROM @return_dispatch_ddl;
|
||||
EXECUTE return_dispatch_stmt;
|
||||
DEALLOCATE PREPARE return_dispatch_stmt;
|
||||
SET @return_dispatch_ddl = IF((SELECT COUNT(*) FROM information_schema.table_constraints WHERE constraint_schema=DATABASE() AND table_name='ll_dispatch_pda_pick_order' AND constraint_name='chk_dispatch_pick_receipt_source')>0,
|
||||
'ALTER TABLE ll_dispatch_pda_pick_order DROP CHECK chk_dispatch_pick_receipt_source', 'SELECT 1');
|
||||
PREPARE return_dispatch_stmt FROM @return_dispatch_ddl;
|
||||
EXECUTE return_dispatch_stmt;
|
||||
DEALLOCATE PREPARE return_dispatch_stmt;
|
||||
SET @return_dispatch_ddl = IF((SELECT COUNT(*) FROM information_schema.columns WHERE table_schema=DATABASE() AND table_name='ll_dispatch_pda_pick_order' AND column_name='return_receipt_id')=0,
|
||||
'ALTER TABLE ll_dispatch_pda_pick_order ADD COLUMN return_receipt_id BIGINT NULL COMMENT ''明确选用的真实退回入仓来源''', 'SELECT 1');
|
||||
PREPARE return_dispatch_stmt FROM @return_dispatch_ddl;
|
||||
EXECUTE return_dispatch_stmt;
|
||||
DEALLOCATE PREPARE return_dispatch_stmt;
|
||||
ALTER TABLE ll_dispatch_pda_pick_order ADD CONSTRAINT chk_dispatch_pick_receipt_source CHECK((receipt_id IS NOT NULL) + (return_receipt_id IS NOT NULL) + (return_carton_id IS NOT NULL) = 1);
|
||||
SET @return_dispatch_ddl = IF((SELECT COUNT(*) FROM information_schema.columns WHERE table_schema=DATABASE() AND table_name='ll_delivery_order' AND column_name='signed_packages')=0,
|
||||
'ALTER TABLE ll_delivery_order ADD COLUMN signed_packages INT NULL COMMENT ''保存签收资料时冻结的实际签收箱数,不含此前已退回量''', 'SELECT 1');
|
||||
PREPARE return_dispatch_stmt FROM @return_dispatch_ddl;
|
||||
EXECUTE return_dispatch_stmt;
|
||||
DEALLOCATE PREPARE return_dispatch_stmt;
|
||||
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='本服务业务事件逐次投递审计';
|
||||
|
||||
-- 补齐排车实体引用的真实退回来源字段;原生退货箱单独使用 return_carton_id。
|
||||
USE baiyue_lastleg;
|
||||
SET @return_dispatch_ddl = IF((SELECT COUNT(*) FROM information_schema.columns WHERE table_schema=DATABASE() AND table_name='ll_dispatch_item' AND column_name='return_receipt_id')=0,
|
||||
'ALTER TABLE ll_dispatch_item ADD COLUMN return_receipt_id BIGINT NULL COMMENT ''明确选用的真实退回入仓来源''', 'SELECT 1');
|
||||
PREPARE return_dispatch_stmt FROM @return_dispatch_ddl;
|
||||
EXECUTE return_dispatch_stmt;
|
||||
DEALLOCATE PREPARE return_dispatch_stmt;
|
||||
SET @return_dispatch_ddl = IF((SELECT COUNT(*) FROM information_schema.columns WHERE table_schema=DATABASE() AND table_name='ll_dispatch_pallet_lock' AND column_name='return_receipt_id')=0,
|
||||
'ALTER TABLE ll_dispatch_pallet_lock ADD COLUMN return_receipt_id BIGINT NULL COMMENT ''明确选用的真实退回入仓来源''', 'SELECT 1');
|
||||
PREPARE return_dispatch_stmt FROM @return_dispatch_ddl;
|
||||
EXECUTE return_dispatch_stmt;
|
||||
DEALLOCATE PREPARE return_dispatch_stmt;
|
||||
-- 退货换标排车使用正式车次域,补齐旧本地库缺少的车队结构。
|
||||
-- MySQL 8;显式 baiyue_lastleg;不写业务数据,可重复执行。
|
||||
USE baiyue_lastleg;
|
||||
USE baiyue_iam;
|
||||
INSERT INTO iam_permission (id, tenant_id, app_code, permission_type, parent_id, permission_code, permission_name, route_path, http_method, sort_no, status, built_in, deleted, created_at, updated_at)
|
||||
VALUES
|
||||
(5107300,0,'PLATFORM','MENU',0,'platform:overseas-master-data:driver:list','司机管理','/overseas-master-data/drivers','GET',930,'ACTIVE',1,0,CURRENT_TIMESTAMP(3),CURRENT_TIMESTAMP(3)),
|
||||
(5107301,0,'PLATFORM','BUTTON',5107300,'platform:overseas-master-data:driver:create','新增司机',NULL,'POST',931,'ACTIVE',1,0,CURRENT_TIMESTAMP(3),CURRENT_TIMESTAMP(3)),
|
||||
(5107302,0,'PLATFORM','BUTTON',5107300,'platform:overseas-master-data:driver:edit','编辑与重提司机档案',NULL,'PUT',932,'ACTIVE',1,0,CURRENT_TIMESTAMP(3),CURRENT_TIMESTAMP(3)),
|
||||
(5107304,0,'PLATFORM','BUTTON',5107300,'platform:overseas-master-data:driver:review','审核司机证照',NULL,'POST',934,'ACTIVE',1,0,CURRENT_TIMESTAMP(3),CURRENT_TIMESTAMP(3)),
|
||||
(5107305,0,'PLATFORM','BUTTON',5107300,'platform:overseas-master-data:driver:upload','上传司机证照',NULL,'POST',935,'ACTIVE',1,0,CURRENT_TIMESTAMP(3),CURRENT_TIMESTAMP(3)),
|
||||
(5107310,0,'PLATFORM','MENU',0,'platform:fleet:trip:list','车次管理','/overseas-master-data/trips','GET',940,'ACTIVE',1,0,CURRENT_TIMESTAMP(3),CURRENT_TIMESTAMP(3)),
|
||||
(5107311,0,'PLATFORM','BUTTON',5107310,'platform:fleet:trip:create','创建车次',NULL,'POST',941,'ACTIVE',1,0,CURRENT_TIMESTAMP(3),CURRENT_TIMESTAMP(3)),
|
||||
(5107312,0,'PLATFORM','BUTTON',5107310,'platform:fleet:trip:edit','修改车次计划',NULL,'PUT',942,'ACTIVE',1,0,CURRENT_TIMESTAMP(3),CURRENT_TIMESTAMP(3)),
|
||||
(5107313,0,'PLATFORM','BUTTON',5107310,'platform:fleet:trip:assign','分配车辆和司机',NULL,'POST',943,'ACTIVE',1,0,CURRENT_TIMESTAMP(3),CURRENT_TIMESTAMP(3)),
|
||||
(5107317,0,'PLATFORM','BUTTON',5107310,'platform:fleet:trip:dispatch-review','审核车次客户排车',NULL,'POST',947,'ACTIVE',1,0,CURRENT_TIMESTAMP(3),CURRENT_TIMESTAMP(3)),
|
||||
(5107318,0,'PLATFORM','BUTTON',5107310,'platform:fleet:trip:loading-review','审核整车理货',NULL,'POST',948,'ACTIVE',1,0,CURRENT_TIMESTAMP(3),CURRENT_TIMESTAMP(3))
|
||||
ON DUPLICATE KEY UPDATE permission_type=VALUES(permission_type), parent_id=VALUES(parent_id), permission_name=VALUES(permission_name), route_path=VALUES(route_path), http_method=VALUES(http_method), sort_no=VALUES(sort_no), status='ACTIVE', built_in=1, deleted=0;
|
||||
INSERT INTO iam_role_permission (tenant_id, role_id, permission_id, created_at)
|
||||
SELECT 0, role.id, permission.id, CURRENT_TIMESTAMP(3)
|
||||
FROM iam_role role
|
||||
JOIN iam_permission permission ON permission.tenant_id=0 AND permission.app_code='PLATFORM'
|
||||
AND permission.permission_code IN (
|
||||
'platform:overseas-master-data:driver:list',
|
||||
'platform:overseas-master-data:driver:create',
|
||||
'platform:overseas-master-data:driver:edit',
|
||||
'platform:overseas-master-data:driver:upload',
|
||||
'platform:overseas-master-data:driver:review',
|
||||
'platform:fleet:trip:list',
|
||||
'platform:fleet:trip:create',
|
||||
'platform:fleet:trip:assign',
|
||||
'platform:fleet:trip:edit',
|
||||
'platform:fleet:trip:dispatch-review',
|
||||
'platform:fleet:trip:loading-review')
|
||||
WHERE role.tenant_id=0 AND role.app_code='PLATFORM' AND role.role_code='PLATFORM_ADMIN'
|
||||
AND role.status='ACTIVE' AND role.deleted=0 AND permission.status='ACTIVE' AND permission.deleted=0;
|
||||
USE baiyue_lastleg;
|
||||
SET @return_fleet_ddl = IF((SELECT COUNT(*) FROM information_schema.columns WHERE table_schema=DATABASE() AND table_name='ll_vehicle' AND column_name='max_pallet_spaces')=0, 'ALTER TABLE ll_vehicle ADD COLUMN max_pallet_spaces INT NULL COMMENT ''最大标准托位,未知时为空''', 'SELECT 1');
|
||||
PREPARE return_fleet_stmt FROM @return_fleet_ddl;
|
||||
EXECUTE return_fleet_stmt;
|
||||
DEALLOCATE PREPARE return_fleet_stmt;
|
||||
SET @return_fleet_ddl = IF((SELECT COUNT(*) FROM information_schema.columns WHERE table_schema=DATABASE() AND table_name='ll_vehicle' AND column_name='max_load_kg')=0, 'ALTER TABLE ll_vehicle ADD COLUMN max_load_kg DECIMAL(12,3) NULL COMMENT ''最大载重,千克''', 'SELECT 1');
|
||||
PREPARE return_fleet_stmt FROM @return_fleet_ddl;
|
||||
EXECUTE return_fleet_stmt;
|
||||
DEALLOCATE PREPARE return_fleet_stmt;
|
||||
SET @return_fleet_ddl = IF((SELECT COUNT(*) FROM information_schema.columns WHERE table_schema=DATABASE() AND table_name='ll_vehicle' AND column_name='max_volume_cbm')=0, 'ALTER TABLE ll_vehicle ADD COLUMN max_volume_cbm DECIMAL(12,3) NULL COMMENT ''可用容积,立方米''', 'SELECT 1');
|
||||
PREPARE return_fleet_stmt FROM @return_fleet_ddl;
|
||||
EXECUTE return_fleet_stmt;
|
||||
DEALLOCATE PREPARE return_fleet_stmt;
|
||||
CREATE TABLE IF NOT EXISTS 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 IF NOT EXISTS 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_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 IF NOT EXISTS 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 IF NOT EXISTS 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 IF NOT EXISTS 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 IF NOT EXISTS 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 IF NOT EXISTS 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 IF NOT EXISTS 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 IF NOT EXISTS 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 IF NOT EXISTS 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 IF NOT EXISTS 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 IF NOT EXISTS 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 IF NOT EXISTS 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 IF NOT EXISTS 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 IF NOT EXISTS 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 IF NOT EXISTS 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 IF NOT EXISTS 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 IF NOT EXISTS 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='车次成本不可变更正历史';
|
||||
|
||||
@@ -0,0 +1,549 @@
|
||||
-- 2026-10-08 近期结构增量汇总(MySQL 8.0.16+)
|
||||
-- 范围:2026-09-21 至 2026-10-08;用于已有业务库升级,不是空库初始化。
|
||||
-- 按 USE 显式切换 baiyue_iam / baiyue_firstleg / baiyue_lastleg / baiyue_lastlag_warehouse。
|
||||
-- 独立文件,无 SOURCE 或外部文件依赖;在目标 MySQL 连接中执行整个文件。
|
||||
-- 不创建数据库、不写业务行、不含账号或密码;DDL 隐式提交,出错立即停止,不使用 --force。
|
||||
-- 可重复执行,也支持仅部分新增字段已存在的情况。
|
||||
-- 来源:recent-schema-incremental-20260923.sql、customs-two-file-incremental-20260926.sql、
|
||||
-- return-receipt-box-count-incremental-20260929.sql、return-outbound-box-nullable-20260929.sql、
|
||||
-- return-packing-incremental-20261008.sql 以及 incremental.sql 的 2026-09-29 追加项。
|
||||
|
||||
-- 2026-09-23 近期字段与表结构统一增量(MySQL 8.0+)
|
||||
--
|
||||
-- 范围:2026-09-21 至 2026-09-22 合入的结构变化。
|
||||
-- 特性:显式切换到所属 schema;字段和索引均通过 information_schema 判断;可重复执行。
|
||||
-- 边界:不创建数据库、不删除业务字段/表、不包含权限种子或业务数据修正。
|
||||
-- 注意:DDL 在 MySQL 中会隐式提交;任一步失败后应停止执行并核对目标实例。
|
||||
|
||||
SET NAMES utf8mb4;
|
||||
|
||||
-- ============================================================================
|
||||
-- IAM:国内头程 PDA 操作员绑定作业仓
|
||||
-- ============================================================================
|
||||
USE baiyue_iam;
|
||||
|
||||
SET @ddl = IF(
|
||||
EXISTS (
|
||||
SELECT 1 FROM information_schema.tables
|
||||
WHERE table_schema = DATABASE() AND table_name = 'iam_membership'
|
||||
)
|
||||
AND NOT EXISTS (
|
||||
SELECT 1 FROM information_schema.columns
|
||||
WHERE table_schema = DATABASE() AND table_name = 'iam_membership'
|
||||
AND column_name = 'domestic_warehouse_id'
|
||||
),
|
||||
'ALTER TABLE iam_membership ADD COLUMN domestic_warehouse_id BIGINT NULL COMMENT ''国内头程PDA操作员绑定的唯一国内作业仓ID'' AFTER overseas_warehouse_id',
|
||||
'SELECT 1'
|
||||
);
|
||||
PREPARE recent_schema_stmt FROM @ddl;
|
||||
EXECUTE recent_schema_stmt;
|
||||
DEALLOCATE PREPARE recent_schema_stmt;
|
||||
|
||||
SET @domestic_warehouse_index_columns = (
|
||||
SELECT GROUP_CONCAT(column_name ORDER BY seq_in_index SEPARATOR ',')
|
||||
FROM information_schema.statistics
|
||||
WHERE table_schema = DATABASE()
|
||||
AND table_name = 'iam_membership'
|
||||
AND index_name = 'idx_membership_domestic_warehouse'
|
||||
);
|
||||
SET @domestic_warehouse_index_non_unique = (
|
||||
SELECT MIN(non_unique)
|
||||
FROM information_schema.statistics
|
||||
WHERE table_schema = DATABASE()
|
||||
AND table_name = 'iam_membership'
|
||||
AND index_name = 'idx_membership_domestic_warehouse'
|
||||
);
|
||||
SET @ddl = CASE
|
||||
WHEN NOT EXISTS (
|
||||
SELECT 1 FROM information_schema.columns
|
||||
WHERE table_schema = DATABASE() AND table_name = 'iam_membership'
|
||||
AND column_name = 'domestic_warehouse_id'
|
||||
) THEN 'SELECT 1'
|
||||
WHEN @domestic_warehouse_index_columns IS NULL THEN
|
||||
'ALTER TABLE iam_membership ADD KEY idx_membership_domestic_warehouse (tenant_id, domestic_warehouse_id, status)'
|
||||
WHEN @domestic_warehouse_index_columns <> 'tenant_id,domestic_warehouse_id,status'
|
||||
OR @domestic_warehouse_index_non_unique <> 1 THEN
|
||||
'ALTER TABLE iam_membership DROP INDEX idx_membership_domestic_warehouse, ADD KEY idx_membership_domestic_warehouse (tenant_id, domestic_warehouse_id, status)'
|
||||
ELSE 'SELECT 1'
|
||||
END;
|
||||
PREPARE recent_schema_stmt FROM @ddl;
|
||||
EXECUTE recent_schema_stmt;
|
||||
DEALLOCATE PREPARE recent_schema_stmt;
|
||||
|
||||
-- ============================================================================
|
||||
-- Firstleg:人工 FBA 报价允许缺少船司价格快照
|
||||
-- ============================================================================
|
||||
USE baiyue_firstleg;
|
||||
|
||||
SET @ddl = IF(
|
||||
EXISTS (
|
||||
SELECT 1 FROM information_schema.columns
|
||||
WHERE table_schema = DATABASE() AND table_name = 'fl_inbound_fee'
|
||||
AND column_name = 'carrier_rate_id' AND is_nullable = 'NO'
|
||||
),
|
||||
'ALTER TABLE fl_inbound_fee MODIFY COLUMN carrier_rate_id BIGINT UNSIGNED NULL COMMENT ''船司FBA价格ID;人工报价为空''',
|
||||
'SELECT 1'
|
||||
);
|
||||
PREPARE recent_schema_stmt FROM @ddl;
|
||||
EXECUTE recent_schema_stmt;
|
||||
DEALLOCATE PREPARE recent_schema_stmt;
|
||||
|
||||
SET @ddl = IF(
|
||||
EXISTS (
|
||||
SELECT 1 FROM information_schema.columns
|
||||
WHERE table_schema = DATABASE() AND table_name = 'fl_inbound_fee'
|
||||
AND column_name = 'carrier_rate_version' AND is_nullable = 'NO'
|
||||
),
|
||||
'ALTER TABLE fl_inbound_fee MODIFY COLUMN carrier_rate_version INT UNSIGNED NULL COMMENT ''船司价格版本快照;人工报价为空''',
|
||||
'SELECT 1'
|
||||
);
|
||||
PREPARE recent_schema_stmt FROM @ddl;
|
||||
EXECUTE recent_schema_stmt;
|
||||
DEALLOCATE PREPARE recent_schema_stmt;
|
||||
|
||||
SET @ddl = IF(
|
||||
EXISTS (
|
||||
SELECT 1 FROM information_schema.columns
|
||||
WHERE table_schema = DATABASE() AND table_name = 'fl_inbound_fee'
|
||||
AND column_name = 'rate_effective_from' AND is_nullable = 'NO'
|
||||
),
|
||||
'ALTER TABLE fl_inbound_fee MODIFY COLUMN rate_effective_from DATETIME(3) NULL COMMENT ''价格生效开始快照;人工报价为空''',
|
||||
'SELECT 1'
|
||||
);
|
||||
PREPARE recent_schema_stmt FROM @ddl;
|
||||
EXECUTE recent_schema_stmt;
|
||||
DEALLOCATE PREPARE recent_schema_stmt;
|
||||
|
||||
-- ============================================================================
|
||||
-- Firstleg:墨家测量收件箱扩展为箱唛/SKU 双分流
|
||||
-- ============================================================================
|
||||
|
||||
SET @ddl = IF(
|
||||
NOT EXISTS (
|
||||
SELECT 1 FROM information_schema.columns
|
||||
WHERE table_schema = DATABASE() AND table_name = 'fl_mojia_measurement_receipt'
|
||||
AND column_name = 'inbound_code'
|
||||
),
|
||||
'ALTER TABLE fl_mojia_measurement_receipt ADD COLUMN inbound_code VARCHAR(64) NULL COMMENT ''箱码命中后的权威入仓码;SKU记录为空'' AFTER box_code',
|
||||
'SELECT 1'
|
||||
);
|
||||
PREPARE recent_schema_stmt FROM @ddl;
|
||||
EXECUTE recent_schema_stmt;
|
||||
DEALLOCATE PREPARE recent_schema_stmt;
|
||||
|
||||
SET @ddl = IF(
|
||||
NOT EXISTS (
|
||||
SELECT 1 FROM information_schema.columns
|
||||
WHERE table_schema = DATABASE() AND table_name = 'fl_mojia_measurement_receipt'
|
||||
AND column_name = 'measurement_kind'
|
||||
),
|
||||
'ALTER TABLE fl_mojia_measurement_receipt ADD COLUMN measurement_kind VARCHAR(16) NOT NULL DEFAULT ''BOX_LABEL'' COMMENT ''测量分流:BOX_LABEL箱唛;SKU一件代发SKU'' AFTER box_code',
|
||||
'SELECT 1'
|
||||
);
|
||||
PREPARE recent_schema_stmt FROM @ddl;
|
||||
EXECUTE recent_schema_stmt;
|
||||
DEALLOCATE PREPARE recent_schema_stmt;
|
||||
|
||||
SET @ddl = IF(
|
||||
NOT EXISTS (
|
||||
SELECT 1 FROM information_schema.columns
|
||||
WHERE table_schema = DATABASE() AND table_name = 'fl_mojia_measurement_receipt'
|
||||
AND column_name = 'weight_kg'
|
||||
),
|
||||
'ALTER TABLE fl_mojia_measurement_receipt ADD COLUMN weight_kg DECIMAL(18,3) NOT NULL DEFAULT 0 COMMENT ''设备实测重量kg'' AFTER height_cm',
|
||||
'SELECT 1'
|
||||
);
|
||||
PREPARE recent_schema_stmt FROM @ddl;
|
||||
EXECUTE recent_schema_stmt;
|
||||
DEALLOCATE PREPARE recent_schema_stmt;
|
||||
|
||||
SET @ddl = IF(
|
||||
EXISTS (
|
||||
SELECT 1 FROM information_schema.columns
|
||||
WHERE table_schema = DATABASE() AND table_name = 'fl_mojia_measurement_receipt'
|
||||
AND column_name = 'weight_kg'
|
||||
AND (column_type <> 'decimal(18,3)' OR is_nullable <> 'NO' OR column_default IS NOT NULL
|
||||
OR column_comment <> '设备实测重量kg')
|
||||
),
|
||||
'ALTER TABLE fl_mojia_measurement_receipt MODIFY COLUMN weight_kg DECIMAL(18,3) NOT NULL COMMENT ''设备实测重量kg''',
|
||||
'SELECT 1'
|
||||
);
|
||||
PREPARE recent_schema_stmt FROM @ddl;
|
||||
EXECUTE recent_schema_stmt;
|
||||
DEALLOCATE PREPARE recent_schema_stmt;
|
||||
|
||||
SET @ddl = IF(
|
||||
NOT EXISTS (
|
||||
SELECT 1 FROM information_schema.columns
|
||||
WHERE table_schema = DATABASE() AND table_name = 'fl_mojia_measurement_receipt'
|
||||
AND column_name = 'sync_status'
|
||||
),
|
||||
'ALTER TABLE fl_mojia_measurement_receipt ADD COLUMN sync_status VARCHAR(24) NULL COMMENT ''SKU同步状态:PENDING/SYNCING/SUCCESS/FAILED'' AFTER status',
|
||||
'SELECT 1'
|
||||
);
|
||||
PREPARE recent_schema_stmt FROM @ddl;
|
||||
EXECUTE recent_schema_stmt;
|
||||
DEALLOCATE PREPARE recent_schema_stmt;
|
||||
|
||||
SET @ddl = IF(
|
||||
NOT EXISTS (
|
||||
SELECT 1 FROM information_schema.columns
|
||||
WHERE table_schema = DATABASE() AND table_name = 'fl_mojia_measurement_receipt'
|
||||
AND column_name = 'sync_failure_code'
|
||||
),
|
||||
'ALTER TABLE fl_mojia_measurement_receipt ADD COLUMN sync_failure_code VARCHAR(64) NULL COMMENT ''SKU同步失败业务码'' AFTER sync_status',
|
||||
'SELECT 1'
|
||||
);
|
||||
PREPARE recent_schema_stmt FROM @ddl;
|
||||
EXECUTE recent_schema_stmt;
|
||||
DEALLOCATE PREPARE recent_schema_stmt;
|
||||
|
||||
SET @ddl = IF(
|
||||
NOT EXISTS (
|
||||
SELECT 1 FROM information_schema.columns
|
||||
WHERE table_schema = DATABASE() AND table_name = 'fl_mojia_measurement_receipt'
|
||||
AND column_name = 'sync_failure_reason'
|
||||
),
|
||||
'ALTER TABLE fl_mojia_measurement_receipt ADD COLUMN sync_failure_reason VARCHAR(500) NULL COMMENT ''脱敏后的SKU同步失败原因'' AFTER sync_failure_code',
|
||||
'SELECT 1'
|
||||
);
|
||||
PREPARE recent_schema_stmt FROM @ddl;
|
||||
EXECUTE recent_schema_stmt;
|
||||
DEALLOCATE PREPARE recent_schema_stmt;
|
||||
|
||||
SET @ddl = IF(
|
||||
NOT EXISTS (
|
||||
SELECT 1 FROM information_schema.columns
|
||||
WHERE table_schema = DATABASE() AND table_name = 'fl_mojia_measurement_receipt'
|
||||
AND column_name = 'lingxing_sku_id'
|
||||
),
|
||||
'ALTER TABLE fl_mojia_measurement_receipt ADD COLUMN lingxing_sku_id VARCHAR(128) NULL COMMENT ''领星SKU内部标识'' AFTER sync_failure_reason',
|
||||
'SELECT 1'
|
||||
);
|
||||
PREPARE recent_schema_stmt FROM @ddl;
|
||||
EXECUTE recent_schema_stmt;
|
||||
DEALLOCATE PREPARE recent_schema_stmt;
|
||||
|
||||
SET @ddl = IF(
|
||||
NOT EXISTS (
|
||||
SELECT 1 FROM information_schema.columns
|
||||
WHERE table_schema = DATABASE() AND table_name = 'fl_mojia_measurement_receipt'
|
||||
AND column_name = 'revision'
|
||||
),
|
||||
'ALTER TABLE fl_mojia_measurement_receipt ADD COLUMN revision INT NOT NULL DEFAULT 1 COMMENT ''当前测量版本号'' AFTER lingxing_sku_id',
|
||||
'SELECT 1'
|
||||
);
|
||||
PREPARE recent_schema_stmt FROM @ddl;
|
||||
EXECUTE recent_schema_stmt;
|
||||
DEALLOCATE PREPARE recent_schema_stmt;
|
||||
|
||||
SET @ddl = IF(
|
||||
EXISTS (
|
||||
SELECT 1 FROM information_schema.columns
|
||||
WHERE table_schema = DATABASE() AND table_name = 'fl_mojia_measurement_receipt'
|
||||
AND column_name = 'match_failure_code' AND is_nullable = 'NO'
|
||||
),
|
||||
'ALTER TABLE fl_mojia_measurement_receipt MODIFY COLUMN match_failure_code VARCHAR(16) NULL COMMENT ''正式箱唛业务匹配失败码''',
|
||||
'SELECT 1'
|
||||
);
|
||||
PREPARE recent_schema_stmt FROM @ddl;
|
||||
EXECUTE recent_schema_stmt;
|
||||
DEALLOCATE PREPARE recent_schema_stmt;
|
||||
|
||||
SET @ddl = IF(
|
||||
EXISTS (
|
||||
SELECT 1 FROM information_schema.columns
|
||||
WHERE table_schema = DATABASE() AND table_name = 'fl_mojia_measurement_receipt'
|
||||
AND column_name = 'match_failure_reason' AND is_nullable = 'NO'
|
||||
),
|
||||
'ALTER TABLE fl_mojia_measurement_receipt MODIFY COLUMN match_failure_reason VARCHAR(500) NULL COMMENT ''脱敏后的箱唛匹配失败原因''',
|
||||
'SELECT 1'
|
||||
);
|
||||
PREPARE recent_schema_stmt FROM @ddl;
|
||||
EXECUTE recent_schema_stmt;
|
||||
DEALLOCATE PREPARE recent_schema_stmt;
|
||||
|
||||
SET @ddl = IF(
|
||||
EXISTS (
|
||||
SELECT 1 FROM information_schema.columns
|
||||
WHERE table_schema = DATABASE() AND table_name = 'fl_mojia_measurement_receipt'
|
||||
AND column_name = 'box_code'
|
||||
AND column_comment <> '设备扫描的原始箱码或不带#的SKU'
|
||||
),
|
||||
'ALTER TABLE fl_mojia_measurement_receipt MODIFY COLUMN box_code VARCHAR(128) NOT NULL COMMENT ''设备扫描的原始箱码或不带#的SKU''',
|
||||
'SELECT 1'
|
||||
);
|
||||
PREPARE recent_schema_stmt FROM @ddl;
|
||||
EXECUTE recent_schema_stmt;
|
||||
DEALLOCATE PREPARE recent_schema_stmt;
|
||||
|
||||
SET @ddl = IF(
|
||||
EXISTS (
|
||||
SELECT 1 FROM information_schema.columns
|
||||
WHERE table_schema = DATABASE() AND table_name = 'fl_mojia_measurement_receipt'
|
||||
AND column_name = 'status'
|
||||
AND column_comment <> '原始收件状态;SKU记录使用SKU_PENDING_SYNC'
|
||||
),
|
||||
'ALTER TABLE fl_mojia_measurement_receipt MODIFY COLUMN status VARCHAR(24) NOT NULL DEFAULT ''UNMATCHED'' COMMENT ''原始收件状态;SKU记录使用SKU_PENDING_SYNC''',
|
||||
'SELECT 1'
|
||||
);
|
||||
PREPARE recent_schema_stmt FROM @ddl;
|
||||
EXECUTE recent_schema_stmt;
|
||||
DEALLOCATE PREPARE recent_schema_stmt;
|
||||
|
||||
-- ============================================================================
|
||||
-- Lastleg:同一尾程单允许多次换标申请,订单关联由唯一索引改为普通索引
|
||||
-- ============================================================================
|
||||
USE baiyue_lastleg;
|
||||
|
||||
SET @ddl = IF(
|
||||
EXISTS (
|
||||
SELECT 1 FROM information_schema.statistics
|
||||
WHERE table_schema = DATABASE() AND table_name = 'll_relabel_application'
|
||||
AND index_name = 'uk_ll_relabel_application_order'
|
||||
),
|
||||
'ALTER TABLE ll_relabel_application DROP INDEX uk_ll_relabel_application_order',
|
||||
'SELECT 1'
|
||||
);
|
||||
PREPARE recent_schema_stmt FROM @ddl;
|
||||
EXECUTE recent_schema_stmt;
|
||||
DEALLOCATE PREPARE recent_schema_stmt;
|
||||
|
||||
SET @relabel_order_index_columns = (
|
||||
SELECT GROUP_CONCAT(column_name ORDER BY seq_in_index SEPARATOR ',')
|
||||
FROM information_schema.statistics
|
||||
WHERE table_schema = DATABASE()
|
||||
AND table_name = 'll_relabel_application'
|
||||
AND index_name = 'idx_ll_relabel_application_order'
|
||||
);
|
||||
SET @relabel_order_index_non_unique = (
|
||||
SELECT MIN(non_unique)
|
||||
FROM information_schema.statistics
|
||||
WHERE table_schema = DATABASE()
|
||||
AND table_name = 'll_relabel_application'
|
||||
AND index_name = 'idx_ll_relabel_application_order'
|
||||
);
|
||||
SET @ddl = CASE
|
||||
WHEN @relabel_order_index_columns IS NULL THEN
|
||||
'ALTER TABLE ll_relabel_application ADD KEY idx_ll_relabel_application_order (lastleg_order_id)'
|
||||
WHEN @relabel_order_index_columns <> 'lastleg_order_id'
|
||||
OR @relabel_order_index_non_unique <> 1 THEN
|
||||
'ALTER TABLE ll_relabel_application DROP INDEX idx_ll_relabel_application_order, ADD KEY idx_ll_relabel_application_order (lastleg_order_id)'
|
||||
ELSE 'SELECT 1'
|
||||
END;
|
||||
PREPARE recent_schema_stmt FROM @ddl;
|
||||
EXECUTE recent_schema_stmt;
|
||||
DEALLOCATE PREPARE recent_schema_stmt;
|
||||
|
||||
-- ============================================================================
|
||||
-- Overseas Warehouse:A0 系统共享溢出库位标记
|
||||
-- 注意:正式 schema 名沿用项目现有拼写 baiyue_lastlag_warehouse。
|
||||
-- ============================================================================
|
||||
USE baiyue_lastlag_warehouse;
|
||||
|
||||
SET @ddl = IF(
|
||||
NOT EXISTS (
|
||||
SELECT 1 FROM information_schema.columns
|
||||
WHERE table_schema = DATABASE() AND table_name = 'wh_location'
|
||||
AND column_name = 'shared_overflow'
|
||||
),
|
||||
'ALTER TABLE wh_location ADD COLUMN shared_overflow TINYINT(1) NOT NULL DEFAULT 0 COMMENT ''是否系统共享溢出库位(A0)'' AFTER location_type',
|
||||
'SELECT 1'
|
||||
);
|
||||
PREPARE recent_schema_stmt FROM @ddl;
|
||||
EXECUTE recent_schema_stmt;
|
||||
DEALLOCATE PREPARE recent_schema_stmt;
|
||||
|
||||
SET @ddl = IF(
|
||||
EXISTS (
|
||||
SELECT 1 FROM information_schema.columns
|
||||
WHERE table_schema = DATABASE() AND table_name = 'wh_location'
|
||||
AND column_name = 'shared_overflow'
|
||||
AND (column_type <> 'tinyint(1)' OR is_nullable <> 'NO'
|
||||
OR COALESCE(column_default, '') <> '0'
|
||||
OR column_comment <> '是否系统共享溢出库位(A0)')
|
||||
),
|
||||
'ALTER TABLE wh_location MODIFY COLUMN shared_overflow TINYINT(1) NOT NULL DEFAULT 0 COMMENT ''是否系统共享溢出库位(A0)''',
|
||||
'SELECT 1'
|
||||
);
|
||||
PREPARE recent_schema_stmt FROM @ddl;
|
||||
EXECUTE recent_schema_stmt;
|
||||
DEALLOCATE PREPARE recent_schema_stmt;
|
||||
|
||||
-- 最终只读核对;四行均应返回 READY。
|
||||
SELECT 'baiyue_iam' AS target_schema,
|
||||
IF(
|
||||
EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema = 'baiyue_iam' AND table_name = 'iam_membership' AND column_name = 'domestic_warehouse_id')
|
||||
AND (SELECT GROUP_CONCAT(column_name ORDER BY seq_in_index SEPARATOR ',') FROM information_schema.statistics WHERE table_schema = 'baiyue_iam' AND table_name = 'iam_membership' AND index_name = 'idx_membership_domestic_warehouse') = 'tenant_id,domestic_warehouse_id,status',
|
||||
'READY', 'CHECK_REQUIRED'
|
||||
) AS schema_status
|
||||
UNION ALL
|
||||
SELECT 'baiyue_firstleg',
|
||||
IF(
|
||||
(SELECT COUNT(*) FROM information_schema.columns WHERE table_schema = 'baiyue_firstleg' AND table_name = 'fl_mojia_measurement_receipt' AND column_name IN ('measurement_kind','weight_kg','sync_status','sync_failure_code','sync_failure_reason','lingxing_sku_id','revision')) = 7
|
||||
AND (SELECT COUNT(*) FROM information_schema.columns WHERE table_schema = 'baiyue_firstleg' AND table_name = 'fl_inbound_fee' AND column_name IN ('carrier_rate_id','carrier_rate_version','rate_effective_from') AND is_nullable = 'YES') = 3,
|
||||
'READY', 'CHECK_REQUIRED'
|
||||
)
|
||||
UNION ALL
|
||||
SELECT 'baiyue_lastleg',
|
||||
IF(
|
||||
NOT EXISTS (SELECT 1 FROM information_schema.statistics WHERE table_schema = 'baiyue_lastleg' AND table_name = 'll_relabel_application' AND index_name = 'uk_ll_relabel_application_order')
|
||||
AND (SELECT GROUP_CONCAT(column_name ORDER BY seq_in_index SEPARATOR ',') FROM information_schema.statistics WHERE table_schema = 'baiyue_lastleg' AND table_name = 'll_relabel_application' AND index_name = 'idx_ll_relabel_application_order') = 'lastleg_order_id'
|
||||
AND (SELECT MIN(non_unique) FROM information_schema.statistics WHERE table_schema = 'baiyue_lastleg' AND table_name = 'll_relabel_application' AND index_name = 'idx_ll_relabel_application_order') = 1,
|
||||
'READY', 'CHECK_REQUIRED'
|
||||
)
|
||||
UNION ALL
|
||||
SELECT 'baiyue_lastlag_warehouse',
|
||||
IF(
|
||||
EXISTS (
|
||||
SELECT 1 FROM information_schema.columns
|
||||
WHERE table_schema = 'baiyue_lastlag_warehouse'
|
||||
AND table_name = 'wh_location'
|
||||
AND column_name = 'shared_overflow'
|
||||
AND column_type = 'tinyint(1)'
|
||||
AND is_nullable = 'NO'
|
||||
AND COALESCE(column_default, '') = '0'
|
||||
),
|
||||
'READY', 'CHECK_REQUIRED'
|
||||
);
|
||||
|
||||
|
||||
-- 报关两文件流程:回执与真实报关完税文件分离。
|
||||
-- 仅在已确认目标测试库后执行;所有 DDL 可重复执行,不创建数据库、不写业务数据。
|
||||
USE baiyue_firstleg;
|
||||
|
||||
SET @ddl = IF(NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema=DATABASE() AND table_name='fl_customs_container' AND column_name='broker_submitted_by'), 'ALTER TABLE fl_customs_container ADD COLUMN broker_submitted_by BIGINT UNSIGNED NULL COMMENT ''发送报关行执行的操作人ID''', 'SELECT 1');
|
||||
PREPARE recent_customs_stmt FROM @ddl; EXECUTE recent_customs_stmt; DEALLOCATE PREPARE recent_customs_stmt;
|
||||
SET @ddl = IF(NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema=DATABASE() AND table_name='fl_customs_container' AND column_name='broker_submitted_by_name'), 'ALTER TABLE fl_customs_container ADD COLUMN broker_submitted_by_name VARCHAR(64) NULL COMMENT ''发送报关行执行的操作人名称''', 'SELECT 1');
|
||||
PREPARE recent_customs_stmt FROM @ddl; EXECUTE recent_customs_stmt; DEALLOCATE PREPARE recent_customs_stmt;
|
||||
SET @ddl = IF(NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema=DATABASE() AND table_name='fl_customs_container' AND column_name='broker_submitted_at'), 'ALTER TABLE fl_customs_container ADD COLUMN broker_submitted_at DATETIME(3) NULL COMMENT ''发送报关行执行时间''', 'SELECT 1');
|
||||
PREPARE recent_customs_stmt FROM @ddl; EXECUTE recent_customs_stmt; DEALLOCATE PREPARE recent_customs_stmt;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS fl_customs_final_document (
|
||||
id BIGINT UNSIGNED NOT NULL COMMENT '真实报关完税文件ID',
|
||||
source_document_id BIGINT UNSIGNED NOT NULL COMMENT '对应冻结客户资料ID',
|
||||
file_id BIGINT UNSIGNED NOT NULL COMMENT 'File服务文件ID',
|
||||
file_name VARCHAR(255) NOT NULL COMMENT '真实报关完税文件名称快照',
|
||||
file_hash CHAR(64) NOT NULL COMMENT '真实报关完税文件SHA-256摘要',
|
||||
content_type VARCHAR(128) NULL COMMENT '真实报关完税文件媒体类型',
|
||||
size_bytes BIGINT UNSIGNED NOT NULL COMMENT '真实报关完税文件大小(字节)',
|
||||
uploaded_by BIGINT UNSIGNED NOT NULL COMMENT '上传操作人ID',
|
||||
uploaded_by_name VARCHAR(64) NULL COMMENT '上传操作人名称快照',
|
||||
uploaded_at DATETIME(3) NOT NULL COMMENT '上传时间',
|
||||
version INT UNSIGNED NOT NULL DEFAULT 1 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_customs_final_source(source_document_id),
|
||||
CONSTRAINT fk_customs_final_source FOREIGN KEY(source_document_id) REFERENCES fl_customs_customer_document(id)
|
||||
) ENGINE=InnoDB COMMENT='真实报关完税文件当前版本';
|
||||
|
||||
|
||||
-- 退货/换标近期结构增量汇总(MySQL 8.0+)
|
||||
--
|
||||
-- 目标数据库:baiyue_lastleg
|
||||
-- 覆盖:退货箱级签收、箱级出库、退货合箱预占/追溯、换标箱唛总文件。
|
||||
-- 本文件只执行 DDL,不写入业务数据;所有字段、索引和约束均按元数据判断,
|
||||
-- 可在同一个目标库上重复执行。数据库不存在或基线表缺失时会立即报错并停止。
|
||||
|
||||
SET NAMES utf8mb4;
|
||||
USE `baiyue_lastleg`;
|
||||
|
||||
-- 2026-09-29:箱维度退货出库不绑定托盘。
|
||||
SET @ddl = IF(
|
||||
EXISTS (SELECT 1 FROM information_schema.tables WHERE table_schema = DATABASE() AND table_name = 'll_outbound_pallet_item')
|
||||
AND EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema = DATABASE() AND table_name = 'll_outbound_pallet_item' AND column_name = 'pallet_no' AND is_nullable = 'NO'),
|
||||
'ALTER TABLE ll_outbound_pallet_item MODIFY COLUMN pallet_no VARCHAR(128) NULL COMMENT ''托盘号,箱维度出库为空''',
|
||||
'SELECT 1'
|
||||
);
|
||||
PREPARE stmt FROM @ddl; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
|
||||
-- 2026-09-29:退货签收单元、SKU 箱数及来源实物追溯。
|
||||
SET @ddl = IF(NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema = DATABASE() AND table_name = 'll_return_receipt' AND column_name = 'unit_type'), 'ALTER TABLE ll_return_receipt ADD COLUMN unit_type VARCHAR(16) NULL COMMENT ''签收类型 PALLET/BOX/PARCEL''', 'SELECT 1');
|
||||
PREPARE stmt FROM @ddl; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
SET @ddl = IF(NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema = DATABASE() AND table_name = 'll_return_receipt' AND column_name = 'unit_code'), 'ALTER TABLE ll_return_receipt ADD COLUMN unit_code VARCHAR(128) NULL COMMENT ''签收单元业务码''', 'SELECT 1');
|
||||
PREPARE stmt FROM @ddl; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
SET @ddl = IF(NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema = DATABASE() AND table_name = 'll_return_receipt' AND column_name = 'total_box_count'), 'ALTER TABLE ll_return_receipt ADD COLUMN total_box_count BIGINT NULL COMMENT ''签收 SKU 箱数汇总''', 'SELECT 1');
|
||||
PREPARE stmt FROM @ddl; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
SET @ddl = IF(NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema = DATABASE() AND table_name = 'll_return_receipt' AND column_name = 'length'), 'ALTER TABLE ll_return_receipt ADD COLUMN length DECIMAL(12,3) NULL COMMENT ''实测尺寸 cm''', 'SELECT 1');
|
||||
PREPARE stmt FROM @ddl; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
SET @ddl = IF(NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema = DATABASE() AND table_name = 'll_return_receipt' AND column_name = 'width'), 'ALTER TABLE ll_return_receipt ADD COLUMN width DECIMAL(12,3) NULL COMMENT ''实测尺寸 cm''', 'SELECT 1');
|
||||
PREPARE stmt FROM @ddl; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
SET @ddl = IF(NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema = DATABASE() AND table_name = 'll_return_receipt' AND column_name = 'height'), 'ALTER TABLE ll_return_receipt ADD COLUMN height DECIMAL(12,3) NULL COMMENT ''实测尺寸 cm''', 'SELECT 1');
|
||||
PREPARE stmt FROM @ddl; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
SET @ddl = IF(NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema = DATABASE() AND table_name = 'll_return_receipt' AND column_name = 'weight'), 'ALTER TABLE ll_return_receipt ADD COLUMN weight DECIMAL(12,3) NULL COMMENT ''实测重量 kg''', 'SELECT 1');
|
||||
PREPARE stmt FROM @ddl; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
SET @ddl = IF(NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema = DATABASE() AND table_name = 'll_return_receipt_item' AND column_name = 'box_count'), 'ALTER TABLE ll_return_receipt_item ADD COLUMN box_count BIGINT NULL COMMENT ''SKU 签收箱数''', 'SELECT 1');
|
||||
PREPARE stmt FROM @ddl; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
SET @ddl = IF(NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema = DATABASE() AND table_name = 'll_return_inventory_carton' AND column_name = 'source_unit_type'), 'ALTER TABLE ll_return_inventory_carton ADD COLUMN source_unit_type VARCHAR(32) NULL COMMENT ''来源实物类型''', 'SELECT 1');
|
||||
PREPARE stmt FROM @ddl; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
SET @ddl = IF(NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema = DATABASE() AND table_name = 'll_return_inventory_carton' AND column_name = 'source_unit_code'), 'ALTER TABLE ll_return_inventory_carton ADD COLUMN source_unit_code VARCHAR(128) NULL COMMENT ''来源实物业务码''', 'SELECT 1');
|
||||
PREPARE stmt FROM @ddl; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
|
||||
-- 2026-09-29:换标箱唛总文件。
|
||||
SET @ddl = IF(NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema = DATABASE() AND table_name = 'll_relabel_application' AND column_name = 'carton_total_file_id'), 'ALTER TABLE ll_relabel_application ADD COLUMN carton_total_file_id VARCHAR(128) NULL COMMENT ''箱唛总文件 ID''', 'SELECT 1');
|
||||
PREPARE stmt FROM @ddl; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
SET @ddl = IF(NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema = DATABASE() AND table_name = 'll_relabel_application' AND column_name = 'carton_total_file_name'), 'ALTER TABLE ll_relabel_application ADD COLUMN carton_total_file_name VARCHAR(255) NULL COMMENT ''箱唛总文件名''', 'SELECT 1');
|
||||
PREPARE stmt FROM @ddl; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
|
||||
-- 合箱计划及精确来源/结果快照。
|
||||
CREATE TABLE IF NOT EXISTS ll_return_packing_plan (
|
||||
id BIGINT NOT NULL COMMENT '合箱计划 ID', plan_no VARCHAR(128) NOT NULL COMMENT '计划业务号',
|
||||
customer_id VARCHAR(128) NOT NULL COMMENT '客户隔离键', overseas_warehouse_id VARCHAR(128) NOT NULL COMMENT '海外仓 ID',
|
||||
return_nos_json JSON NOT NULL COMMENT '来源退货单范围', boxes_json JSON NOT NULL COMMENT '目标箱明细',
|
||||
mode VARCHAR(32) NOT NULL COMMENT 'SKU 散件或 BOX 箱合并', status VARCHAR(32) NOT NULL COMMENT '计划状态',
|
||||
remark VARCHAR(1000) NULL COMMENT '合箱备注', idempotency_key VARCHAR(255) NOT NULL COMMENT '创建幂等键',
|
||||
created_at DATETIME(3) NOT NULL COMMENT '创建时间', updated_at DATETIME(3) NOT NULL COMMENT '更新时间',
|
||||
pushed_at DATETIME(3) NULL COMMENT '审核推送时间', completed_at DATETIME(3) NULL COMMENT '作业完成时间',
|
||||
PRIMARY KEY (id), UNIQUE KEY uk_ll_return_packing_plan_no (plan_no),
|
||||
UNIQUE KEY uk_ll_return_packing_plan_key (customer_id, idempotency_key),
|
||||
KEY idx_ll_return_packing_plan_warehouse (overseas_warehouse_id, status, pushed_at)
|
||||
) ENGINE=InnoDB COMMENT='退货合箱计划';
|
||||
|
||||
SET @ddl = IF(NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema = DATABASE() AND table_name = 'll_return_packing_plan' AND column_name = 'source_items_json'), 'ALTER TABLE ll_return_packing_plan ADD COLUMN source_items_json JSON NULL COMMENT ''精确来源箱和 SKU 锁定数量''', 'SELECT 1');
|
||||
PREPARE stmt FROM @ddl; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
SET @ddl = IF(NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema = DATABASE() AND table_name = 'll_return_packing_plan' AND column_name = 'result_marks_json'), 'ALTER TABLE ll_return_packing_plan ADD COLUMN result_marks_json JSON NULL COMMENT ''完成生成或并入的目标箱唛''', 'SELECT 1');
|
||||
PREPARE stmt FROM @ddl; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
SET @ddl = IF(NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema = DATABASE() AND table_name = 'll_return_packing_plan' AND column_name = 'request_hash'), 'ALTER TABLE ll_return_packing_plan ADD COLUMN request_hash VARCHAR(64) NULL COMMENT ''创建载荷摘要''', 'SELECT 1');
|
||||
PREPARE stmt FROM @ddl; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
SET @ddl = IF(NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema = DATABASE() AND table_name = 'll_return_packing_plan' AND column_name = 'completion_hash'), 'ALTER TABLE ll_return_packing_plan ADD COLUMN completion_hash VARCHAR(64) NULL COMMENT ''完成载荷摘要''', 'SELECT 1');
|
||||
PREPARE stmt FROM @ddl; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
SET @ddl = IF(NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema = DATABASE() AND table_name = 'll_return_packing_plan' AND column_name = 'result_labels_json'), 'ALTER TABLE ll_return_packing_plan ADD COLUMN result_labels_json JSON NULL COMMENT ''计划完工标签快照''', 'SELECT 1');
|
||||
PREPARE stmt FROM @ddl; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
SET @ddl = IF(NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema = DATABASE() AND table_name = 'll_return_inventory_carton_item' AND column_name = 'packing_reserved_quantity'), 'ALTER TABLE ll_return_inventory_carton_item ADD COLUMN packing_reserved_quantity BIGINT NOT NULL DEFAULT 0 COMMENT ''合箱计划预占件数''', 'SELECT 1');
|
||||
PREPARE stmt FROM @ddl; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
SET @ddl = IF(NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema = DATABASE() AND table_name = 'll_return_inventory_carton' AND column_name = 'location_code'), 'ALTER TABLE ll_return_inventory_carton ADD COLUMN location_code VARCHAR(128) NULL COMMENT ''退货箱当前库位''', 'SELECT 1');
|
||||
PREPARE stmt FROM @ddl; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
SET @ddl = IF(NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema = DATABASE() AND table_name = 'll_return_inventory_carton' AND column_name = 'putaway_at'), 'ALTER TABLE ll_return_inventory_carton ADD COLUMN putaway_at DATETIME(3) NULL COMMENT ''退货箱上架时间''', 'SELECT 1');
|
||||
PREPARE stmt FROM @ddl; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
SET @ddl = IF(NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema = DATABASE() AND table_name = 'll_return_inventory_operation' AND column_name = 'result_json'), 'ALTER TABLE ll_return_inventory_operation ADD COLUMN result_json JSON NULL COMMENT ''幂等操作不可变返回快照''', 'SELECT 1');
|
||||
PREPARE stmt FROM @ddl; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS ll_return_packing_trace (
|
||||
id BIGINT NOT NULL COMMENT '合箱追溯 ID', customer_id VARCHAR(128) NOT NULL COMMENT '原客户隔离键',
|
||||
operation_id BIGINT NOT NULL COMMENT '合箱操作 ID', source_carton_mark VARCHAR(128) NOT NULL COMMENT '来源箱唛',
|
||||
target_carton_mark VARCHAR(128) NOT NULL COMMENT '目标箱唛', return_no VARCHAR(128) NOT NULL COMMENT '原始退货单号',
|
||||
sku_code VARCHAR(128) NOT NULL COMMENT 'SKU', quantity BIGINT NOT NULL COMMENT '本次移动件数',
|
||||
created_at DATETIME(3) NOT NULL COMMENT '发生时间', PRIMARY KEY (id),
|
||||
KEY idx_return_packing_trace_order (customer_id, return_no, created_at),
|
||||
KEY idx_return_packing_trace_target (customer_id, target_carton_mark, sku_code),
|
||||
KEY idx_return_packing_trace_source (customer_id, source_carton_mark, sku_code),
|
||||
CONSTRAINT chk_return_packing_trace_quantity CHECK (quantity > 0)
|
||||
) ENGINE=InnoDB COMMENT='退货合箱逐 SKU 原始退货单不可变追溯';
|
||||
|
||||
-- 原子替换两个 CHECK;新定义验证失败时原约束保留。
|
||||
SET @recent_drop_check_0 = 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'), 'DROP CHECK chk_ll_return_inventory_carton_quantity, ', '');
|
||||
SET @recent_drop_check_1 = 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'), 'DROP CHECK chk_ll_return_inventory_carton_status, ', '');
|
||||
SET @ddl = CONCAT('ALTER TABLE ll_return_inventory_carton ', @recent_drop_check_0, @recent_drop_check_1, 'ADD CONSTRAINT chk_ll_return_inventory_carton_quantity CHECK ((status IN (''AVAILABLE'',''PACKING_RESERVED'',''RELABEL_PENDING'',''OUTBOUND_PENDING'',''OUTBOUNDED'',''DISCARD_PENDING'') AND sku_types>0 AND total_quantity>0) OR (status IN (''MERGED'',''DISCARDED'') AND sku_types=0 AND total_quantity=0)), ADD CONSTRAINT chk_ll_return_inventory_carton_status CHECK (status IN (''AVAILABLE'',''PACKING_RESERVED'',''RELABEL_PENDING'',''OUTBOUND_PENDING'',''MERGED'',''OUTBOUNDED'',''DISCARD_PENDING'',''DISCARDED''))');
|
||||
PREPARE stmt FROM @ddl; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
|
||||
-- 同一签收批次可拆成多个退货箱:唯一约束改为普通索引。
|
||||
SET @ddl = IF(EXISTS (SELECT 1 FROM information_schema.statistics WHERE table_schema = DATABASE() AND table_name = 'll_return_inventory_carton' AND index_name = 'uk_ll_return_inventory_carton_receipt'), 'ALTER TABLE ll_return_inventory_carton DROP INDEX uk_ll_return_inventory_carton_receipt', 'SELECT 1');
|
||||
PREPARE stmt FROM @ddl; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
SET @ddl = IF(NOT EXISTS (SELECT 1 FROM information_schema.statistics WHERE table_schema = DATABASE() AND table_name = 'll_return_inventory_carton' AND index_name = 'idx_ll_return_inventory_carton_receipt'), 'ALTER TABLE ll_return_inventory_carton ADD INDEX idx_ll_return_inventory_carton_receipt (source_receipt_id)', 'SELECT 1');
|
||||
PREPARE stmt FROM @ddl; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
|
||||
SELECT DATABASE() AS target_database,
|
||||
IF((SELECT COUNT(*) FROM information_schema.columns WHERE table_schema = DATABASE() AND table_name = 'll_return_receipt' AND column_name IN ('unit_type','unit_code','total_box_count','length','width','height','weight')) = 7, 'READY', 'CHECK_REQUIRED') AS receipt_schema,
|
||||
IF(EXISTS (SELECT 1 FROM information_schema.tables WHERE table_schema = DATABASE() AND table_name = 'll_return_packing_plan') AND EXISTS (SELECT 1 FROM information_schema.tables WHERE table_schema = DATABASE() AND table_name = 'll_return_packing_trace'), 'READY', 'CHECK_REQUIRED') AS packing_schema,
|
||||
IF(EXISTS (SELECT 1 FROM information_schema.statistics WHERE table_schema = DATABASE() AND table_name = 'll_return_inventory_carton' AND index_name = 'idx_ll_return_inventory_carton_receipt'), 'READY', 'CHECK_REQUIRED') AS carton_index;
|
||||
@@ -0,0 +1,15 @@
|
||||
-- MySQL 8.0+; target database: baiyue_lastleg.
|
||||
-- Re-runnable: allow pallet-less carton outbound records.
|
||||
SET NAMES utf8mb4;
|
||||
USE baiyue_lastleg;
|
||||
|
||||
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='pallet_no' AND is_nullable='NO'
|
||||
), 'ALTER TABLE ll_outbound_pallet_item MODIFY COLUMN pallet_no VARCHAR(128) NULL COMMENT ''托盘号,箱维度出库为空''', 'SELECT 1'));
|
||||
PREPARE stmt FROM @ddl; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
|
||||
SELECT DATABASE() AS target_database, table_name, column_name, is_nullable
|
||||
FROM information_schema.columns
|
||||
WHERE table_schema=DATABASE() AND table_name='ll_outbound_pallet_item' AND column_name='pallet_no';
|
||||
@@ -0,0 +1,210 @@
|
||||
-- 2026-10-08 退货合箱精确预占、来源追溯与箱级上架;MySQL 8,可重复执行。
|
||||
SET NAMES utf8mb4;
|
||||
-- IAM:平台退货合箱写操作需要正式库存管理权限;仅授予 PLATFORM_ADMIN。
|
||||
USE baiyue_iam;
|
||||
INSERT INTO iam_permission (id, tenant_id, app_code, permission_type, parent_id, permission_code, permission_name, route_path, http_method, sort_no, status, built_in, deleted, created_at, updated_at)
|
||||
VALUES (5107044, 0, 'PLATFORM', 'BUTTON', 5107040, 'lastleg:inventory:manage', '后台退货库存管理', NULL, 'POST', 744, 'ACTIVE', 1, 0, CURRENT_TIMESTAMP(3), CURRENT_TIMESTAMP(3))
|
||||
ON DUPLICATE KEY UPDATE permission_type=VALUES(permission_type), parent_id=VALUES(parent_id), permission_name=VALUES(permission_name), http_method=VALUES(http_method), sort_no=VALUES(sort_no), status='ACTIVE', built_in=1, deleted=0;
|
||||
INSERT IGNORE INTO iam_role_permission (tenant_id, role_id, permission_id, created_at)
|
||||
SELECT 0, role.id, permission.id, CURRENT_TIMESTAMP(3)
|
||||
FROM iam_role role JOIN iam_permission permission ON permission.tenant_id=0 AND permission.id=5107044
|
||||
WHERE role.tenant_id=0 AND role.app_code='PLATFORM' AND role.role_code='PLATFORM_ADMIN'
|
||||
AND role.status='ACTIVE' AND role.deleted=0 AND permission.status='ACTIVE' AND permission.deleted=0;
|
||||
USE baiyue_lastleg;
|
||||
SET @return_packing_ddl = (SELECT IF(EXISTS(SELECT 1 FROM information_schema.statistics WHERE table_schema=DATABASE() AND table_name='ll_return_inventory_carton' AND index_name='uk_ll_return_inventory_carton_receipt'), 'ALTER TABLE ll_return_inventory_carton DROP INDEX uk_ll_return_inventory_carton_receipt', 'SELECT 1'));
|
||||
PREPARE return_packing_stmt FROM @return_packing_ddl; EXECUTE return_packing_stmt; DEALLOCATE PREPARE return_packing_stmt;
|
||||
SET @return_packing_ddl = (SELECT IF(EXISTS(SELECT 1 FROM information_schema.columns WHERE table_schema=DATABASE() AND table_name='ll_return_receipt' AND column_name='unit_type'), 'SELECT 1', 'ALTER TABLE ll_return_receipt ADD COLUMN unit_type VARCHAR(16) NULL COMMENT ''签收类型 PALLET/BOX/PARCEL'''));
|
||||
PREPARE return_packing_stmt FROM @return_packing_ddl; EXECUTE return_packing_stmt; DEALLOCATE PREPARE return_packing_stmt;
|
||||
SET @return_packing_ddl = (SELECT IF(EXISTS(SELECT 1 FROM information_schema.columns WHERE table_schema=DATABASE() AND table_name='ll_return_receipt' AND column_name='unit_code'), 'SELECT 1', 'ALTER TABLE ll_return_receipt ADD COLUMN unit_code VARCHAR(128) NULL COMMENT ''签收单元业务码'''));
|
||||
PREPARE return_packing_stmt FROM @return_packing_ddl; EXECUTE return_packing_stmt; DEALLOCATE PREPARE return_packing_stmt;
|
||||
SET @return_packing_ddl = (SELECT IF(EXISTS(SELECT 1 FROM information_schema.columns WHERE table_schema=DATABASE() AND table_name='ll_return_receipt' AND column_name='total_box_count'), 'SELECT 1', 'ALTER TABLE ll_return_receipt ADD COLUMN total_box_count BIGINT NULL COMMENT ''签收SKU箱数汇总'''));
|
||||
PREPARE return_packing_stmt FROM @return_packing_ddl; EXECUTE return_packing_stmt; DEALLOCATE PREPARE return_packing_stmt;
|
||||
SET @return_packing_ddl = (SELECT IF(EXISTS(SELECT 1 FROM information_schema.columns WHERE table_schema=DATABASE() AND table_name='ll_return_receipt' AND column_name='length'), 'SELECT 1', 'ALTER TABLE ll_return_receipt ADD COLUMN length DECIMAL(12,3) NULL COMMENT ''实测尺寸cm'''));
|
||||
PREPARE return_packing_stmt FROM @return_packing_ddl; EXECUTE return_packing_stmt; DEALLOCATE PREPARE return_packing_stmt;
|
||||
SET @return_packing_ddl = (SELECT IF(EXISTS(SELECT 1 FROM information_schema.columns WHERE table_schema=DATABASE() AND table_name='ll_return_receipt' AND column_name='width'), 'SELECT 1', 'ALTER TABLE ll_return_receipt ADD COLUMN width DECIMAL(12,3) NULL COMMENT ''实测尺寸cm'''));
|
||||
PREPARE return_packing_stmt FROM @return_packing_ddl; EXECUTE return_packing_stmt; DEALLOCATE PREPARE return_packing_stmt;
|
||||
SET @return_packing_ddl = (SELECT IF(EXISTS(SELECT 1 FROM information_schema.columns WHERE table_schema=DATABASE() AND table_name='ll_return_receipt' AND column_name='height'), 'SELECT 1', 'ALTER TABLE ll_return_receipt ADD COLUMN height DECIMAL(12,3) NULL COMMENT ''实测尺寸cm'''));
|
||||
PREPARE return_packing_stmt FROM @return_packing_ddl; EXECUTE return_packing_stmt; DEALLOCATE PREPARE return_packing_stmt;
|
||||
SET @return_packing_ddl = (SELECT IF(EXISTS(SELECT 1 FROM information_schema.columns WHERE table_schema=DATABASE() AND table_name='ll_return_receipt' AND column_name='weight'), 'SELECT 1', 'ALTER TABLE ll_return_receipt ADD COLUMN weight DECIMAL(12,3) NULL COMMENT ''实测重量kg'''));
|
||||
PREPARE return_packing_stmt FROM @return_packing_ddl; EXECUTE return_packing_stmt; DEALLOCATE PREPARE return_packing_stmt;
|
||||
SET @return_packing_ddl = (SELECT IF(EXISTS(SELECT 1 FROM information_schema.columns WHERE table_schema=DATABASE() AND table_name='ll_return_receipt_item' AND column_name='box_count'), 'SELECT 1', 'ALTER TABLE ll_return_receipt_item ADD COLUMN box_count BIGINT NULL COMMENT ''SKU签收箱数'''));
|
||||
PREPARE return_packing_stmt FROM @return_packing_ddl; EXECUTE return_packing_stmt; DEALLOCATE PREPARE return_packing_stmt;
|
||||
SET @return_packing_ddl = (SELECT IF(EXISTS(SELECT 1 FROM information_schema.columns WHERE table_schema=DATABASE() AND table_name='ll_return_inventory_carton' AND column_name='source_unit_code'), 'SELECT 1', 'ALTER TABLE ll_return_inventory_carton ADD COLUMN source_unit_code VARCHAR(128) NULL COMMENT ''来源单元业务码'''));
|
||||
PREPARE return_packing_stmt FROM @return_packing_ddl; EXECUTE return_packing_stmt; DEALLOCATE PREPARE return_packing_stmt;
|
||||
CREATE TABLE IF NOT EXISTS ll_return_packing_plan (
|
||||
id BIGINT NOT NULL COMMENT '合箱计划ID', plan_no VARCHAR(128) NOT NULL COMMENT '计划业务号',
|
||||
customer_id VARCHAR(128) NOT NULL COMMENT '客户隔离键', overseas_warehouse_id VARCHAR(128) NOT NULL COMMENT '海外仓ID',
|
||||
return_nos_json JSON NOT NULL COMMENT '来源退货单范围', boxes_json JSON NOT NULL COMMENT '目标箱明细',
|
||||
mode VARCHAR(32) NOT NULL COMMENT 'SKU散件或BOX箱合并', status VARCHAR(32) NOT NULL COMMENT 'PENDING_REVIEW待审 READY已推送 COMPLETED完成 CANCELLED取消',
|
||||
remark VARCHAR(1000) NULL COMMENT '合箱备注', idempotency_key VARCHAR(255) NOT NULL COMMENT '创建幂等键',
|
||||
created_at DATETIME(3) NOT NULL COMMENT '创建时间', updated_at DATETIME(3) NOT NULL COMMENT '更新时间',
|
||||
pushed_at DATETIME(3) NULL COMMENT '审核推送时间', completed_at DATETIME(3) NULL COMMENT '作业完成时间',
|
||||
PRIMARY KEY(id), UNIQUE KEY uk_ll_return_packing_plan_no(plan_no),
|
||||
UNIQUE KEY uk_ll_return_packing_plan_key(customer_id,idempotency_key),
|
||||
KEY idx_ll_return_packing_plan_warehouse(overseas_warehouse_id,status,pushed_at)
|
||||
) ENGINE=InnoDB COMMENT='退货合箱计划';
|
||||
SET @return_packing_ddl = (SELECT IF(EXISTS(SELECT 1 FROM information_schema.columns WHERE table_schema=DATABASE() AND table_name='ll_return_inventory_carton_item' AND column_name='packing_reserved_quantity'), 'SELECT 1', 'ALTER TABLE ll_return_inventory_carton_item ADD COLUMN packing_reserved_quantity BIGINT NOT NULL DEFAULT 0 COMMENT ''合箱计划预占件数'''));
|
||||
PREPARE return_packing_stmt FROM @return_packing_ddl; EXECUTE return_packing_stmt; DEALLOCATE PREPARE return_packing_stmt;
|
||||
SET @return_packing_ddl = (SELECT IF(EXISTS(SELECT 1 FROM information_schema.columns WHERE table_schema=DATABASE() AND table_name='ll_return_packing_plan' AND column_name='source_items_json'), 'SELECT 1', 'ALTER TABLE ll_return_packing_plan ADD COLUMN source_items_json JSON NULL COMMENT ''精确来源箱和SKU锁定数量'''));
|
||||
PREPARE return_packing_stmt FROM @return_packing_ddl; EXECUTE return_packing_stmt; DEALLOCATE PREPARE return_packing_stmt;
|
||||
SET @return_packing_ddl = (SELECT IF(EXISTS(SELECT 1 FROM information_schema.columns WHERE table_schema=DATABASE() AND table_name='ll_return_packing_plan' AND column_name='result_marks_json'), 'SELECT 1', 'ALTER TABLE ll_return_packing_plan ADD COLUMN result_marks_json JSON NULL COMMENT ''完成生成或并入的目标箱唛'''));
|
||||
PREPARE return_packing_stmt FROM @return_packing_ddl; EXECUTE return_packing_stmt; DEALLOCATE PREPARE return_packing_stmt;
|
||||
SET @return_packing_ddl = (SELECT IF(EXISTS(SELECT 1 FROM information_schema.columns WHERE table_schema=DATABASE() AND table_name='ll_return_packing_plan' AND column_name='request_hash'), 'SELECT 1', 'ALTER TABLE ll_return_packing_plan ADD COLUMN request_hash VARCHAR(64) NULL COMMENT ''创建载荷摘要'''));
|
||||
PREPARE return_packing_stmt FROM @return_packing_ddl; EXECUTE return_packing_stmt; DEALLOCATE PREPARE return_packing_stmt;
|
||||
SET @return_packing_ddl = (SELECT IF(EXISTS(SELECT 1 FROM information_schema.columns WHERE table_schema=DATABASE() AND table_name='ll_return_packing_plan' AND column_name='completion_hash'), 'SELECT 1', 'ALTER TABLE ll_return_packing_plan ADD COLUMN completion_hash VARCHAR(64) NULL COMMENT ''完成载荷摘要'''));
|
||||
PREPARE return_packing_stmt FROM @return_packing_ddl; EXECUTE return_packing_stmt; DEALLOCATE PREPARE return_packing_stmt;
|
||||
SET @return_packing_ddl = (SELECT IF(EXISTS(SELECT 1 FROM information_schema.columns WHERE table_schema=DATABASE() AND table_name='ll_return_inventory_carton' AND column_name='location_code'), 'SELECT 1', 'ALTER TABLE ll_return_inventory_carton ADD COLUMN location_code VARCHAR(128) NULL COMMENT ''退货箱当前库位'''));
|
||||
PREPARE return_packing_stmt FROM @return_packing_ddl; EXECUTE return_packing_stmt; DEALLOCATE PREPARE return_packing_stmt;
|
||||
SET @return_packing_ddl = (SELECT IF(EXISTS(SELECT 1 FROM information_schema.columns WHERE table_schema=DATABASE() AND table_name='ll_return_inventory_carton' AND column_name='putaway_at'), 'SELECT 1', 'ALTER TABLE ll_return_inventory_carton ADD COLUMN putaway_at DATETIME(3) NULL COMMENT ''退货箱上架时间'''));
|
||||
PREPARE return_packing_stmt FROM @return_packing_ddl; EXECUTE return_packing_stmt; DEALLOCATE PREPARE return_packing_stmt;
|
||||
SET @return_packing_ddl = (SELECT IF(EXISTS(SELECT 1 FROM information_schema.columns WHERE table_schema=DATABASE() AND table_name='ll_return_inventory_carton' AND column_name='source_unit_type'), 'SELECT 1', 'ALTER TABLE ll_return_inventory_carton ADD COLUMN source_unit_type VARCHAR(32) NULL COMMENT ''PALLET或BOX实物箱 PARCEL散SKU'''));
|
||||
PREPARE return_packing_stmt FROM @return_packing_ddl; EXECUTE return_packing_stmt; DEALLOCATE PREPARE return_packing_stmt;
|
||||
SET @return_packing_ddl = (SELECT IF(EXISTS(SELECT 1 FROM information_schema.table_constraints WHERE constraint_schema=DATABASE() AND table_name='ll_return_inventory_carton' AND constraint_name='chk_ll_return_inventory_carton_quantity'), 'ALTER TABLE ll_return_inventory_carton DROP CHECK chk_ll_return_inventory_carton_quantity', 'SELECT 1'));
|
||||
PREPARE return_packing_stmt FROM @return_packing_ddl; EXECUTE return_packing_stmt; DEALLOCATE PREPARE return_packing_stmt;
|
||||
SET @return_packing_ddl = (SELECT IF(EXISTS(SELECT 1 FROM information_schema.table_constraints WHERE constraint_schema=DATABASE() AND table_name='ll_return_inventory_carton' AND constraint_name='chk_ll_return_inventory_carton_status'), 'ALTER TABLE ll_return_inventory_carton DROP CHECK chk_ll_return_inventory_carton_status', 'SELECT 1'));
|
||||
PREPARE return_packing_stmt FROM @return_packing_ddl; EXECUTE return_packing_stmt; DEALLOCATE PREPARE return_packing_stmt;
|
||||
ALTER TABLE ll_return_inventory_carton ADD CONSTRAINT chk_ll_return_inventory_carton_quantity CHECK((status IN('AVAILABLE','PACKING_RESERVED','RELABEL_PENDING','OUTBOUND_PENDING','OUTBOUNDED','DISCARD_PENDING') AND sku_types>0 AND total_quantity>0) OR (status IN('MERGED','DISCARDED') AND sku_types=0 AND total_quantity=0));
|
||||
ALTER TABLE ll_return_inventory_carton ADD CONSTRAINT chk_ll_return_inventory_carton_status CHECK(status IN('AVAILABLE','PACKING_RESERVED','RELABEL_PENDING','OUTBOUND_PENDING','MERGED','OUTBOUNDED','DISCARD_PENDING','DISCARDED'));
|
||||
CREATE TABLE IF NOT EXISTS ll_return_packing_trace (
|
||||
id BIGINT NOT NULL COMMENT '合箱追溯ID', customer_id VARCHAR(128) NOT NULL COMMENT '原客户隔离键',
|
||||
operation_id BIGINT NOT NULL COMMENT '合箱操作ID', source_carton_mark VARCHAR(128) NOT NULL COMMENT '来源箱唛 空值表示目标箱原有库存快照',
|
||||
target_carton_mark VARCHAR(128) NOT NULL COMMENT '目标箱唛', return_no VARCHAR(128) NOT NULL COMMENT '原始退货单号',
|
||||
sku_code VARCHAR(128) NOT NULL COMMENT '商品SKU编码', quantity BIGINT NOT NULL COMMENT '本次移动件数',
|
||||
created_at DATETIME(3) NOT NULL COMMENT '发生时间', PRIMARY KEY(id),
|
||||
KEY idx_return_packing_trace_order(customer_id,return_no,created_at),
|
||||
KEY idx_return_packing_trace_target(customer_id,target_carton_mark,sku_code),
|
||||
KEY idx_return_packing_trace_source(customer_id,source_carton_mark,sku_code),
|
||||
CONSTRAINT chk_return_packing_trace_quantity CHECK(quantity>0)
|
||||
) ENGINE=InnoDB COMMENT='退货合箱逐SKU原始退货单不可变追溯';
|
||||
ALTER TABLE ll_return_packing_trace MODIFY COLUMN sku_code VARCHAR(128) NOT NULL COMMENT '商品SKU编码';
|
||||
SET @return_packing_ddl = (SELECT IF(EXISTS(SELECT 1 FROM information_schema.columns WHERE table_schema=DATABASE() AND table_name='ll_return_inventory_operation' AND column_name='result_json'), 'SELECT 1', 'ALTER TABLE ll_return_inventory_operation ADD COLUMN result_json JSON NULL COMMENT ''幂等操作不可变返回快照'''));
|
||||
PREPARE return_packing_stmt FROM @return_packing_ddl; EXECUTE return_packing_stmt; DEALLOCATE PREPARE return_packing_stmt;
|
||||
SET @return_packing_ddl = (SELECT IF(EXISTS(SELECT 1 FROM information_schema.columns WHERE table_schema=DATABASE() AND table_name='ll_return_packing_plan' AND column_name='result_labels_json'), 'SELECT 1', 'ALTER TABLE ll_return_packing_plan ADD COLUMN result_labels_json JSON NULL COMMENT ''计划完工标签快照'''));
|
||||
PREPARE return_packing_stmt FROM @return_packing_ddl; EXECUTE return_packing_stmt; DEALLOCATE PREPARE return_packing_stmt;
|
||||
-- Existing outbound tables need this field even when created before the fee snapshot baseline.
|
||||
USE baiyue_lastleg;
|
||||
SET @return_outbound_ddl = IF(EXISTS(SELECT 1 FROM information_schema.columns WHERE table_schema=DATABASE() AND table_name='ll_outbound_order' AND column_name='fee_coverage_json'), 'SELECT 1', 'ALTER TABLE ll_outbound_order ADD COLUMN fee_coverage_json JSON NULL COMMENT ''发运原费用及服务覆盖确认快照''');
|
||||
PREPARE return_outbound_stmt FROM @return_outbound_ddl;
|
||||
EXECUTE return_outbound_stmt;
|
||||
DEALLOCATE PREPARE return_outbound_stmt;
|
||||
USE baiyue_lastleg;
|
||||
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库存流水';
|
||||
|
||||
-- 原生退货换标排车:保留独立退货箱来源,不伪造普通库存仓位。
|
||||
USE baiyue_lastleg;
|
||||
SET @return_dispatch_ddl = IF((SELECT COUNT(*) FROM information_schema.columns WHERE table_schema=DATABASE() AND table_name='ll_dispatch_pda_pick' AND column_name='return_carton_id')=0,
|
||||
'ALTER TABLE ll_dispatch_pda_pick ADD COLUMN return_carton_id BIGINT NULL COMMENT ''独立退货库存箱ID,与普通仓位互斥''', 'SELECT 1');
|
||||
PREPARE return_dispatch_stmt FROM @return_dispatch_ddl;
|
||||
EXECUTE return_dispatch_stmt;
|
||||
DEALLOCATE PREPARE return_dispatch_stmt;
|
||||
ALTER TABLE ll_dispatch_pda_pick MODIFY COLUMN inventory_position_id BIGINT NULL COMMENT '普通库存仓位记录ID';
|
||||
CREATE TABLE IF NOT EXISTS 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='真实退回入仓及再次发运来源凭据';
|
||||
ALTER TABLE ll_dispatch_pda_pick_order MODIFY COLUMN receipt_id BIGINT NULL COMMENT '原入仓实收来源,与退回来源或原生退货箱互斥';
|
||||
-- 真实退回凭据与尾程订单客户键使用同一排序规则,避免相关库存子查询冲突。
|
||||
SET @return_customer_collation = (SELECT collation_name FROM information_schema.columns WHERE table_schema=DATABASE() AND table_name='ll_order' AND column_name='customer_id');
|
||||
SET @return_dispatch_ddl = CONCAT('ALTER TABLE ll_return_stock_receipt MODIFY COLUMN customer_id VARCHAR(128) CHARACTER SET utf8mb4 COLLATE ', @return_customer_collation, ' NOT NULL COMMENT ''客户数据归属''');
|
||||
PREPARE return_dispatch_stmt FROM @return_dispatch_ddl;
|
||||
EXECUTE return_dispatch_stmt;
|
||||
DEALLOCATE PREPARE return_dispatch_stmt;
|
||||
SET @return_dispatch_ddl = CONCAT('ALTER TABLE ll_return_stock_receipt MODIFY COLUMN source_outbound_no VARCHAR(64) CHARACTER SET utf8mb4 COLLATE ', @return_customer_collation, ' NOT NULL COMMENT ''原发运出库业务编号''');
|
||||
PREPARE return_dispatch_stmt FROM @return_dispatch_ddl;
|
||||
EXECUTE return_dispatch_stmt;
|
||||
DEALLOCATE PREPARE return_dispatch_stmt;
|
||||
SET @return_dispatch_ddl = IF((SELECT COUNT(*) FROM information_schema.columns WHERE table_schema=DATABASE() AND table_name='ll_dispatch_pda_pick_order' AND column_name='return_carton_id')=0,
|
||||
'ALTER TABLE ll_dispatch_pda_pick_order ADD COLUMN return_carton_id BIGINT NULL COMMENT ''原生退货箱来源ID,与实收来源互斥''', 'SELECT 1');
|
||||
PREPARE return_dispatch_stmt FROM @return_dispatch_ddl;
|
||||
EXECUTE return_dispatch_stmt;
|
||||
DEALLOCATE PREPARE return_dispatch_stmt;
|
||||
SET @return_dispatch_ddl = IF((SELECT COUNT(*) FROM information_schema.table_constraints WHERE constraint_schema=DATABASE() AND table_name='ll_dispatch_pda_pick_order' AND constraint_name='chk_dispatch_pick_receipt_source')>0,
|
||||
'ALTER TABLE ll_dispatch_pda_pick_order DROP CHECK chk_dispatch_pick_receipt_source', 'SELECT 1');
|
||||
PREPARE return_dispatch_stmt FROM @return_dispatch_ddl;
|
||||
EXECUTE return_dispatch_stmt;
|
||||
DEALLOCATE PREPARE return_dispatch_stmt;
|
||||
SET @return_dispatch_ddl = IF((SELECT COUNT(*) FROM information_schema.columns WHERE table_schema=DATABASE() AND table_name='ll_dispatch_pda_pick_order' AND column_name='return_receipt_id')=0,
|
||||
'ALTER TABLE ll_dispatch_pda_pick_order ADD COLUMN return_receipt_id BIGINT NULL COMMENT ''明确选用的真实退回入仓来源''', 'SELECT 1');
|
||||
PREPARE return_dispatch_stmt FROM @return_dispatch_ddl;
|
||||
EXECUTE return_dispatch_stmt;
|
||||
DEALLOCATE PREPARE return_dispatch_stmt;
|
||||
ALTER TABLE ll_dispatch_pda_pick_order ADD CONSTRAINT chk_dispatch_pick_receipt_source CHECK((receipt_id IS NOT NULL) + (return_receipt_id IS NOT NULL) + (return_carton_id IS NOT NULL) = 1);
|
||||
SET @return_dispatch_ddl = IF((SELECT COUNT(*) FROM information_schema.columns WHERE table_schema=DATABASE() AND table_name='ll_delivery_order' AND column_name='signed_packages')=0,
|
||||
'ALTER TABLE ll_delivery_order ADD COLUMN signed_packages INT NULL COMMENT ''保存签收资料时冻结的实际签收箱数,不含此前已退回量''', 'SELECT 1');
|
||||
PREPARE return_dispatch_stmt FROM @return_dispatch_ddl;
|
||||
EXECUTE return_dispatch_stmt;
|
||||
DEALLOCATE PREPARE return_dispatch_stmt;
|
||||
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='本服务业务事件逐次投递审计';
|
||||
|
||||
-- 补齐排车实体引用的真实退回来源字段;原生退货箱单独使用 return_carton_id。
|
||||
USE baiyue_lastleg;
|
||||
SET @return_dispatch_ddl = IF((SELECT COUNT(*) FROM information_schema.columns WHERE table_schema=DATABASE() AND table_name='ll_dispatch_item' AND column_name='return_receipt_id')=0,
|
||||
'ALTER TABLE ll_dispatch_item ADD COLUMN return_receipt_id BIGINT NULL COMMENT ''明确选用的真实退回入仓来源''', 'SELECT 1');
|
||||
PREPARE return_dispatch_stmt FROM @return_dispatch_ddl;
|
||||
EXECUTE return_dispatch_stmt;
|
||||
DEALLOCATE PREPARE return_dispatch_stmt;
|
||||
SET @return_dispatch_ddl = IF((SELECT COUNT(*) FROM information_schema.columns WHERE table_schema=DATABASE() AND table_name='ll_dispatch_pallet_lock' AND column_name='return_receipt_id')=0,
|
||||
'ALTER TABLE ll_dispatch_pallet_lock ADD COLUMN return_receipt_id BIGINT NULL COMMENT ''明确选用的真实退回入仓来源''', 'SELECT 1');
|
||||
PREPARE return_dispatch_stmt FROM @return_dispatch_ddl;
|
||||
EXECUTE return_dispatch_stmt;
|
||||
DEALLOCATE PREPARE return_dispatch_stmt;
|
||||
@@ -0,0 +1,26 @@
|
||||
-- 2026-09-29 海外退货签收 SKU 箱数增量
|
||||
-- MySQL 8.0+;目标数据库:baiyue_lastleg
|
||||
-- 可重复执行,不修改既有业务数据。
|
||||
|
||||
SET NAMES utf8mb4;
|
||||
USE baiyue_lastleg;
|
||||
|
||||
SET @ddl = IF(
|
||||
EXISTS (
|
||||
SELECT 1 FROM information_schema.tables
|
||||
WHERE table_schema = DATABASE() AND table_name = 'll_return_receipt_item'
|
||||
)
|
||||
AND NOT EXISTS (
|
||||
SELECT 1 FROM information_schema.columns
|
||||
WHERE table_schema = DATABASE()
|
||||
AND table_name = 'll_return_receipt_item'
|
||||
AND column_name = 'box_count'
|
||||
),
|
||||
'ALTER TABLE ll_return_receipt_item ADD COLUMN box_count BIGINT NULL COMMENT ''本次 SKU 对应箱数'' AFTER received_quantity',
|
||||
'SELECT 1'
|
||||
);
|
||||
PREPARE stmt FROM @ddl;
|
||||
EXECUTE stmt;
|
||||
DEALLOCATE PREPARE stmt;
|
||||
|
||||
SELECT DATABASE() AS target_database, 'll_return_receipt_item.box_count' AS updated_column;
|
||||
@@ -0,0 +1,493 @@
|
||||
-- 退货换标排车使用正式车次域,补齐旧本地库缺少的车队结构。
|
||||
-- MySQL 8;显式 baiyue_lastleg;不写业务数据,可重复执行。
|
||||
-- IAM:退货换标真实排车需要平台管理员的正式司机/车队权限;不授予其他角色。
|
||||
USE baiyue_iam;
|
||||
INSERT INTO iam_permission (id, tenant_id, app_code, permission_type, parent_id, permission_code, permission_name, route_path, http_method, sort_no, status, built_in, deleted, created_at, updated_at)
|
||||
VALUES
|
||||
(5107300,0,'PLATFORM','MENU',0,'platform:overseas-master-data:driver:list','司机管理','/overseas-master-data/drivers','GET',930,'ACTIVE',1,0,CURRENT_TIMESTAMP(3),CURRENT_TIMESTAMP(3)),
|
||||
(5107301,0,'PLATFORM','BUTTON',5107300,'platform:overseas-master-data:driver:create','新增司机',NULL,'POST',931,'ACTIVE',1,0,CURRENT_TIMESTAMP(3),CURRENT_TIMESTAMP(3)),
|
||||
(5107302,0,'PLATFORM','BUTTON',5107300,'platform:overseas-master-data:driver:edit','编辑与重提司机档案',NULL,'PUT',932,'ACTIVE',1,0,CURRENT_TIMESTAMP(3),CURRENT_TIMESTAMP(3)),
|
||||
(5107304,0,'PLATFORM','BUTTON',5107300,'platform:overseas-master-data:driver:review','审核司机证照',NULL,'POST',934,'ACTIVE',1,0,CURRENT_TIMESTAMP(3),CURRENT_TIMESTAMP(3)),
|
||||
(5107305,0,'PLATFORM','BUTTON',5107300,'platform:overseas-master-data:driver:upload','上传司机证照',NULL,'POST',935,'ACTIVE',1,0,CURRENT_TIMESTAMP(3),CURRENT_TIMESTAMP(3)),
|
||||
(5107310,0,'PLATFORM','MENU',0,'platform:fleet:trip:list','车次管理','/overseas-master-data/trips','GET',940,'ACTIVE',1,0,CURRENT_TIMESTAMP(3),CURRENT_TIMESTAMP(3)),
|
||||
(5107311,0,'PLATFORM','BUTTON',5107310,'platform:fleet:trip:create','创建车次',NULL,'POST',941,'ACTIVE',1,0,CURRENT_TIMESTAMP(3),CURRENT_TIMESTAMP(3)),
|
||||
(5107312,0,'PLATFORM','BUTTON',5107310,'platform:fleet:trip:edit','修改车次计划',NULL,'PUT',942,'ACTIVE',1,0,CURRENT_TIMESTAMP(3),CURRENT_TIMESTAMP(3)),
|
||||
(5107313,0,'PLATFORM','BUTTON',5107310,'platform:fleet:trip:assign','分配车辆和司机',NULL,'POST',943,'ACTIVE',1,0,CURRENT_TIMESTAMP(3),CURRENT_TIMESTAMP(3)),
|
||||
(5107317,0,'PLATFORM','BUTTON',5107310,'platform:fleet:trip:dispatch-review','审核车次客户排车',NULL,'POST',947,'ACTIVE',1,0,CURRENT_TIMESTAMP(3),CURRENT_TIMESTAMP(3)),
|
||||
(5107318,0,'PLATFORM','BUTTON',5107310,'platform:fleet:trip:loading-review','审核整车理货',NULL,'POST',948,'ACTIVE',1,0,CURRENT_TIMESTAMP(3),CURRENT_TIMESTAMP(3))
|
||||
ON DUPLICATE KEY UPDATE permission_type=VALUES(permission_type), parent_id=VALUES(parent_id), permission_name=VALUES(permission_name), route_path=VALUES(route_path), http_method=VALUES(http_method), sort_no=VALUES(sort_no), status='ACTIVE', built_in=1, deleted=0;
|
||||
INSERT INTO iam_role_permission (tenant_id, role_id, permission_id, created_at)
|
||||
SELECT 0, role.id, permission.id, CURRENT_TIMESTAMP(3)
|
||||
FROM iam_role role
|
||||
JOIN iam_permission permission ON permission.tenant_id=0 AND permission.app_code='PLATFORM'
|
||||
AND permission.permission_code IN (
|
||||
'platform:overseas-master-data:driver:list',
|
||||
'platform:overseas-master-data:driver:create',
|
||||
'platform:overseas-master-data:driver:edit',
|
||||
'platform:overseas-master-data:driver:upload',
|
||||
'platform:overseas-master-data:driver:review',
|
||||
'platform:fleet:trip:list',
|
||||
'platform:fleet:trip:create',
|
||||
'platform:fleet:trip:assign',
|
||||
'platform:fleet:trip:edit',
|
||||
'platform:fleet:trip:dispatch-review',
|
||||
'platform:fleet:trip:loading-review')
|
||||
WHERE role.tenant_id=0 AND role.app_code='PLATFORM' AND role.role_code='PLATFORM_ADMIN'
|
||||
AND role.status='ACTIVE' AND role.deleted=0 AND permission.status='ACTIVE' AND permission.deleted=0;
|
||||
USE baiyue_lastleg;
|
||||
USE baiyue_lastleg;
|
||||
SET @return_fleet_ddl = IF((SELECT COUNT(*) FROM information_schema.columns WHERE table_schema=DATABASE() AND table_name='ll_vehicle' AND column_name='max_pallet_spaces')=0, 'ALTER TABLE ll_vehicle ADD COLUMN max_pallet_spaces INT NULL COMMENT ''最大标准托位,未知时为空''', 'SELECT 1');
|
||||
PREPARE return_fleet_stmt FROM @return_fleet_ddl;
|
||||
EXECUTE return_fleet_stmt;
|
||||
DEALLOCATE PREPARE return_fleet_stmt;
|
||||
SET @return_fleet_ddl = IF((SELECT COUNT(*) FROM information_schema.columns WHERE table_schema=DATABASE() AND table_name='ll_vehicle' AND column_name='max_load_kg')=0, 'ALTER TABLE ll_vehicle ADD COLUMN max_load_kg DECIMAL(12,3) NULL COMMENT ''最大载重,千克''', 'SELECT 1');
|
||||
PREPARE return_fleet_stmt FROM @return_fleet_ddl;
|
||||
EXECUTE return_fleet_stmt;
|
||||
DEALLOCATE PREPARE return_fleet_stmt;
|
||||
SET @return_fleet_ddl = IF((SELECT COUNT(*) FROM information_schema.columns WHERE table_schema=DATABASE() AND table_name='ll_vehicle' AND column_name='max_volume_cbm')=0, 'ALTER TABLE ll_vehicle ADD COLUMN max_volume_cbm DECIMAL(12,3) NULL COMMENT ''可用容积,立方米''', 'SELECT 1');
|
||||
PREPARE return_fleet_stmt FROM @return_fleet_ddl;
|
||||
EXECUTE return_fleet_stmt;
|
||||
DEALLOCATE PREPARE return_fleet_stmt;
|
||||
CREATE TABLE IF NOT EXISTS 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 IF NOT EXISTS 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_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 IF NOT EXISTS 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 IF NOT EXISTS 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 IF NOT EXISTS 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 IF NOT EXISTS 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 IF NOT EXISTS 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 IF NOT EXISTS 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 IF NOT EXISTS 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 IF NOT EXISTS 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 IF NOT EXISTS 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 IF NOT EXISTS 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 IF NOT EXISTS 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 IF NOT EXISTS 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 IF NOT EXISTS 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 IF NOT EXISTS 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 IF NOT EXISTS 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 IF NOT EXISTS 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='车次成本不可变更正历史';
|
||||
Reference in New Issue
Block a user