2026-10-08 15:55:47 +08:00
-- 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 )
2026-11-04 12:21:59 +08:00
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '真实退回入仓及再次发运来源凭据' ;
2026-10-08 15:55:47 +08:00
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 ;