2026-10-15 15:42:10 +08:00
-- 货物废弃增量汇总(2026-10-14),MySQL 8.0.16+,可重复执行。
-- 目标仅 baiyue_lastleg,连接实例和凭据由执行者指定。
-- 前提:已有尾程入仓箱、退货库存及出库基线;不是空库初始化脚本。
-- 覆盖基础废弃表、PDA完工、退货箱废弃、照片、通用库存及部分选箱。
-- 不回填历史单据、不补造出库单、不修改库存数量、不执行业务DML。
-- File复用已有文件表,无需修改 baiyue_file 或仓储资源库。
-- 完整执行,遇错停止,不使用 --force;DDL隐式提交,失败修正后可重跑。
-- 已有同名表/列/索引沿用,不修复任意未知旧结构,末尾输出结构供核对。
USE ` baiyue_lastleg ` ;
SET NAMES utf8mb4 ;
SELECT DATABASE () AS target_database , @@ hostname AS mysql_host , @@ port AS mysql_port , VERSION () AS mysql_version ;
-- 一、废弃业务表,存在则保留。
CREATE TABLE IF NOT EXISTS ll_cargo_discard_application (
id BIGINT NOT NULL COMMENT '主键ID' , customer_id VARCHAR ( 128 ) NOT NULL COMMENT '客户租户ID' ,
customer_confirmed_at DATETIME ( 3 ) NULL COMMENT '客户确认完成时间' ,
discard_no VARCHAR ( 64 ) NOT NULL COMMENT '废弃申请单号' , overseas_warehouse_id VARCHAR ( 128 ) NOT NULL COMMENT '海外仓ID' ,
overseas_warehouse_name VARCHAR ( 255 ) NULL COMMENT '海外仓名称快照' , inbound_codes VARCHAR ( 2000 ) NOT NULL COMMENT '入仓单号集合' ,
total_packages INT NOT NULL COMMENT '总箱数' , fee_per_package DECIMAL ( 18 , 2 ) NOT NULL COMMENT '每箱处理费用' ,
total_fee DECIMAL ( 18 , 2 ) NOT NULL COMMENT '费用合计' , currency CHAR ( 3 ) NOT NULL DEFAULT 'USD' COMMENT '币种' ,
status VARCHAR ( 32 ) NOT NULL DEFAULT 'PENDING_REVIEW' COMMENT '业务状态' , remark VARCHAR ( 1000 ) NULL COMMENT '备注' ,
idempotency_key VARCHAR ( 255 ) NOT NULL COMMENT '业务幂等键' , request_hash CHAR ( 64 ) NOT NULL COMMENT '请求内容哈希' ,
created_by VARCHAR ( 128 ) NULL COMMENT '创建人ID' , reviewed_by VARCHAR ( 128 ) NULL COMMENT '审核人ID' , review_remark VARCHAR ( 1000 ) NULL COMMENT '审核备注' ,
review_idempotency_key VARCHAR ( 255 ) NULL COMMENT '审核幂等键' , review_request_hash CHAR ( 64 ) NULL COMMENT '审核请求内容哈希' ,
reviewed_at DATETIME ( 3 ) NULL COMMENT '审核时间' , created_at DATETIME ( 3 ) NOT NULL DEFAULT CURRENT_TIMESTAMP ( 3 ) COMMENT '创建时间' ,
updated_at DATETIME ( 3 ) NOT NULL DEFAULT CURRENT_TIMESTAMP ( 3 ) ON UPDATE CURRENT_TIMESTAMP ( 3 ) COMMENT '更新时间' ,
PRIMARY KEY ( id ), UNIQUE KEY uk_ll_cargo_discard_no ( customer_id , discard_no ),
UNIQUE KEY uk_ll_cargo_discard_key ( customer_id , idempotency_key ),
KEY idx_ll_cargo_discard_list ( customer_id , status , created_at ),
KEY idx_ll_cargo_discard_warehouse ( customer_id , overseas_warehouse_id , created_at )
) ENGINE = InnoDB COMMENT = '货物废弃申请单' ;
CREATE TABLE IF NOT EXISTS ll_cargo_discard_item (
id BIGINT NOT NULL COMMENT '主键ID' , application_id BIGINT NOT NULL COMMENT '申请单ID' , customer_id VARCHAR ( 128 ) NOT NULL COMMENT '客户租户ID' ,
order_id BIGINT NULL COMMENT '一件代发订单ID' , source_type VARCHAR ( 32 ) NOT NULL DEFAULT 'DROPSHIP' COMMENT '库存来源:一件代发DROPSHIP、退货箱RETURN_CARTON、通用库存INVENTORY' ,
return_carton_id BIGINT NULL COMMENT '退货库存箱ID' , inbound_code VARCHAR ( 128 ) NOT NULL COMMENT '入仓单号快照' , profile_id BIGINT NULL COMMENT '托盘档案ID' ,
sku_inventory_id BIGINT NULL COMMENT 'SKU库存记录ID' , sku_code VARCHAR ( 128 ) NOT NULL COMMENT 'SKU编码' , product_name VARCHAR ( 255 ) NULL COMMENT '产品名称' ,
available_packages_snapshot INT NOT NULL COMMENT '可用箱数快照' , discard_packages INT NOT NULL COMMENT '申请废弃箱数' ,
inventory_position_id BIGINT NULL COMMENT '废弃来源库存仓位ID' ,
carton_marks_json TEXT NULL COMMENT '本次废弃所选真实箱唛快照JSON数组' ,
carton_scan_required TINYINT ( 1 ) NOT NULL DEFAULT 0 COMMENT '是否需要逐箱核对本次所选箱子' ,
completion_photo_file_ids TEXT NULL COMMENT 'PDA完工照片文件ID JSON数组' ,
actual_discard_packages INT NULL COMMENT 'PDA确认实际废弃箱数' , pda_status VARCHAR ( 32 ) NOT NULL DEFAULT 'PENDING' COMMENT 'PDA处理状态:待处理PENDING、已完成COMPLETED' ,
pda_operator_id VARCHAR ( 128 ) NULL COMMENT 'PDA操作人' , pda_completed_at DATETIME ( 3 ) NULL COMMENT 'PDA完成时间' ,
created_at DATETIME ( 3 ) NOT NULL DEFAULT CURRENT_TIMESTAMP ( 3 ) COMMENT '创建时间' , PRIMARY KEY ( id ),
UNIQUE KEY uk_ll_cargo_discard_item ( application_id , profile_id , sku_code ),
UNIQUE KEY uk_ll_discard_position_sku ( application_id , inventory_position_id , sku_code ),
KEY idx_ll_cargo_discard_item_list ( customer_id , application_id ),
KEY idx_ll_cargo_discard_item_inbound ( customer_id , inbound_code , sku_code )
) ENGINE = InnoDB COMMENT = '货物废弃SKU明细' ;
CREATE TABLE IF NOT EXISTS ll_cargo_discard_carton (
id BIGINT NOT NULL COMMENT '主键ID' , application_id BIGINT NOT NULL COMMENT '申请单ID' , item_id BIGINT NOT NULL COMMENT '明细ID' ,
customer_id VARCHAR ( 128 ) NOT NULL COMMENT '客户租户ID' , carton_id BIGINT NOT NULL COMMENT '箱唛记录ID' , carton_mark VARCHAR ( 128 ) NOT NULL COMMENT '箱唛' ,
source_type VARCHAR ( 32 ) NOT NULL DEFAULT 'DROPSHIP' COMMENT '箱子来源:一件代发DROPSHIP、入仓箱INBOUND、转运箱TRANSFER' ,
created_at DATETIME ( 3 ) NOT NULL DEFAULT CURRENT_TIMESTAMP ( 3 ) COMMENT '创建时间' , PRIMARY KEY ( id ),
UNIQUE KEY uk_ll_cargo_discard_carton ( application_id , carton_id ),
KEY idx_ll_cargo_discard_carton_application ( customer_id , application_id , item_id ),
KEY idx_ll_cargo_discard_carton_identity ( customer_id , carton_id )
) ENGINE = InnoDB COMMENT = '货物废弃锁定箱明细' ;
CREATE TABLE IF NOT EXISTS ll_cargo_discard_status_history (
id BIGINT NOT NULL COMMENT '主键ID' , application_id BIGINT NOT NULL COMMENT '申请单ID' , customer_id VARCHAR ( 128 ) NOT NULL COMMENT '客户租户ID' ,
from_status VARCHAR ( 32 ) NULL COMMENT '变更前状态' , to_status VARCHAR ( 32 ) NOT NULL COMMENT '变更后状态' , operator_id VARCHAR ( 128 ) NULL COMMENT '操作人ID' ,
remark VARCHAR ( 1000 ) NULL COMMENT '备注' , created_at DATETIME ( 3 ) NOT NULL DEFAULT CURRENT_TIMESTAMP ( 3 ) COMMENT '创建时间' , PRIMARY KEY ( id ),
KEY idx_ll_cargo_discard_history ( customer_id , application_id , created_at )
) ENGINE = InnoDB COMMENT = '货物废弃审批历史' ;
CREATE TABLE IF NOT EXISTS ll_cargo_discard_photo (
id BIGINT NOT NULL ,
customer_id VARCHAR ( 64 ) NOT NULL ,
application_id BIGINT NOT NULL ,
pallet_no VARCHAR ( 128 ) NOT NULL ,
file_id BIGINT NOT NULL ,
file_name VARCHAR ( 255 ) NOT NULL ,
content_type VARCHAR ( 128 ) NOT NULL ,
size_bytes BIGINT NOT NULL ,
operator_id VARCHAR ( 64 ) NOT NULL ,
created_at DATETIME ( 6 ) NOT NULL ,
submitted_at DATETIME ( 6 ) NULL ,
PRIMARY KEY ( id ),
UNIQUE KEY uk_cargo_discard_photo_file ( file_id ),
KEY idx_cargo_discard_photo_application ( customer_id , application_id , pallet_no )
2026-11-04 12:21:59 +08:00
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ;
2026-10-15 15:42:10 +08:00
-- 二、补齐已有表的PDA字段及完工照片快照。
SET @ ddl = IF ( NOT EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_cargo_discard_application' AND column_name = 'customer_confirmed_at' ),
'ALTER TABLE ll_cargo_discard_application ADD COLUMN customer_confirmed_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_cargo_discard_item' AND column_name = 'actual_discard_packages' ),
'ALTER TABLE ll_cargo_discard_item ADD COLUMN actual_discard_packages INT NULL COMMENT ''PDA确认实际废弃箱数''' , '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_cargo_discard_item' AND column_name = 'pda_status' ),
'ALTER TABLE ll_cargo_discard_item ADD COLUMN pda_status VARCHAR(32) NOT NULL DEFAULT ''PENDING'' COMMENT ''PDA处理状态:待处理PENDING、已完成COMPLETED''' , '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_cargo_discard_item' AND column_name = 'pda_operator_id' ),
'ALTER TABLE ll_cargo_discard_item ADD COLUMN pda_operator_id VARCHAR(128) NULL COMMENT ''PDA操作人''' , '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_cargo_discard_item' AND column_name = 'pda_completed_at' ),
'ALTER TABLE ll_cargo_discard_item ADD COLUMN pda_completed_at DATETIME(3) NULL COMMENT ''PDA完成时间''' , '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_cargo_discard_item' AND column_name = 'completion_photo_file_ids' ),
'ALTER TABLE ll_cargo_discard_item ADD COLUMN completion_photo_file_ids TEXT NULL COMMENT ''PDA完工照片文件ID JSON数组''' , 'SELECT 1' );
PREPARE stmt FROM @ ddl ; EXECUTE stmt ; DEALLOCATE PREPARE stmt ;
-- 三、退货箱来源和废弃状态约束(V4)。
ALTER TABLE ll_cargo_discard_item
MODIFY COLUMN order_id BIGINT NULL COMMENT '一件代发订单ID' ,
MODIFY COLUMN profile_id BIGINT NULL COMMENT '托盘档案ID' ,
MODIFY COLUMN sku_inventory_id BIGINT NULL COMMENT 'SKU库存记录ID' ;
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, 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_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))' );
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, ADD CONSTRAINT chk_ll_return_inventory_carton_status CHECK(status IN(''AVAILABLE'',''PACKING_RESERVED'',''RELABEL_PENDING'',''OUTBOUND_PENDING'',''MERGED'',''OUTBOUNDED'',''DISCARD_PENDING'',''DISCARDED''))' ,
'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''))' );
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_cargo_discard_item' AND column_name = 'source_type' ),
'ALTER TABLE ll_cargo_discard_item ADD COLUMN source_type VARCHAR(32) NOT NULL DEFAULT ''DROPSHIP'' COMMENT ''库存来源:一件代发DROPSHIP、退货箱RETURN_CARTON'' AFTER order_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_cargo_discard_item' AND column_name = 'return_carton_id' ),
'ALTER TABLE ll_cargo_discard_item ADD COLUMN return_carton_id BIGINT NULL COMMENT ''退货库存箱ID'' AFTER source_type' , '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_cargo_discard_item' AND index_name = 'idx_ll_cargo_discard_return_carton' ),
'ALTER TABLE ll_cargo_discard_item ADD KEY idx_ll_cargo_discard_return_carton(customer_id,return_carton_id)' , 'SELECT 1' );
PREPARE stmt FROM @ ddl ; EXECUTE stmt ; DEALLOCATE PREPARE stmt ;
-- 四、通用库存、部分选箱、箱来源(V25)。
-- 货物废弃支持所有入库来源及散箱全量作业;不回填或修改历史单据。
SET @ ddl = IF ( NOT EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_cargo_discard_item' AND column_name = 'inventory_position_id' ),
'ALTER TABLE ll_cargo_discard_item ADD COLUMN inventory_position_id BIGINT 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_cargo_discard_item' AND column_name = 'carton_marks_json' ),
'ALTER TABLE ll_cargo_discard_item ADD COLUMN carton_marks_json TEXT NULL COMMENT ''本次废弃所选真实箱唛快照JSON数组''' , '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_cargo_discard_item' AND index_name = 'uk_ll_discard_position_sku' ),
'ALTER TABLE ll_cargo_discard_item ADD UNIQUE KEY uk_ll_discard_position_sku(application_id,inventory_position_id,sku_code)' , 'SELECT 1' );
PREPARE stmt FROM @ ddl ; EXECUTE stmt ; DEALLOCATE PREPARE stmt ;
ALTER TABLE ll_cargo_discard_item MODIFY COLUMN source_type VARCHAR ( 32 ) NOT NULL DEFAULT 'DROPSHIP' COMMENT '库存来源:一件代发DROPSHIP、退货箱RETURN_CARTON、通用库存INVENTORY' ;
SET @ ddl = IF ( NOT EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_cargo_discard_item' AND column_name = 'carton_scan_required' ),
'ALTER TABLE ll_cargo_discard_item ADD COLUMN carton_scan_required TINYINT(1) NOT NULL DEFAULT 0 COMMENT ''是否需要逐箱核对本次所选箱子''' , 'SELECT 1' );
PREPARE stmt FROM @ ddl ; EXECUTE stmt ; DEALLOCATE PREPARE stmt ;
ALTER TABLE ll_cargo_discard_item MODIFY COLUMN carton_marks_json TEXT NULL COMMENT '本次废弃所选真实箱唛快照JSON数组' ;
ALTER TABLE ll_inbound_plan_carton MODIFY COLUMN status VARCHAR ( 32 ) NOT NULL COMMENT '箱唛状态:未绑定UNASSIGNED、已绑托ON_PALLET、整票收货BULK_RECEIVED、可用AVAILABLE、待废弃DISCARD_PENDING、已废弃DISCARDED' ;
SET @ ddl = IF ( NOT EXISTS ( SELECT 1 FROM information_schema . columns WHERE table_schema = DATABASE () AND table_name = 'll_cargo_discard_carton' AND column_name = 'source_type' ),
'ALTER TABLE ll_cargo_discard_carton ADD COLUMN source_type VARCHAR(32) NOT NULL DEFAULT ''DROPSHIP'' COMMENT ''箱子来源:一件代发DROPSHIP、入仓箱INBOUND、转运箱TRANSFER''' , 'SELECT 1' );
PREPARE stmt FROM @ ddl ; EXECUTE stmt ; DEALLOCATE PREPARE stmt ;
-- 五、退货箱SKU归零约束(V26)。
-- 整箱废弃后保留SKU明细,剩余数量允许归零,仍禁止负库存。
-- 原子替换约束,可重复执行;不修改业务记录。
SET @ ddl = IF ( EXISTS (
SELECT 1 FROM information_schema . table_constraints
WHERE constraint_schema = DATABASE () AND table_name = 'll_return_inventory_carton_item'
AND constraint_name = 'chk_ll_return_inventory_carton_item_quantity'
),
'ALTER TABLE ll_return_inventory_carton_item DROP CHECK chk_ll_return_inventory_carton_item_quantity, ADD CONSTRAINT chk_ll_return_inventory_carton_item_quantity CHECK(quantity>=0)' ,
'ALTER TABLE ll_return_inventory_carton_item ADD CONSTRAINT chk_ll_return_inventory_carton_item_quantity CHECK(quantity>=0)'
);
PREPARE stmt FROM @ ddl ;
EXECUTE stmt ;
DEALLOCATE PREPARE stmt ;
-- 六、只读核对。
SHOW CREATE TABLE ` ll_cargo_discard_application ` ;
SHOW CREATE TABLE ` ll_cargo_discard_item ` ;
SHOW CREATE TABLE ` ll_cargo_discard_carton ` ;
SHOW CREATE TABLE ` ll_cargo_discard_status_history ` ;
SHOW CREATE TABLE ` ll_cargo_discard_photo ` ;
SHOW CREATE TABLE ` ll_return_inventory_carton ` ;
SHOW CREATE TABLE ` ll_inbound_plan_carton ` ;
SHOW CREATE TABLE ll_return_inventory_carton_item ;