feat(lastleg): redispatch returned cargo and reconcile source signatures

This commit is contained in:
2026-10-03 16:06:54 +08:00
parent e740047e03
commit 8700fc3423
39 changed files with 1605 additions and 139 deletions
@@ -1763,6 +1763,8 @@ CREATE TABLE IF NOT EXISTS ll_dispatch_item (
source_business_type VARCHAR(32) NULL COMMENT '来源业务类型',
source_business_no VARCHAR(128) NULL COMMENT '来源业务单号',
created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '创建时间',
return_receipt_id BIGINT NULL COMMENT '明确选用的真实退回入仓来源',
PRIMARY KEY (id),
UNIQUE KEY uk_ll_dispatch_item_source (dispatch_order_id,plan_pallet_id,warehouse_pallet_id),
KEY idx_ll_dispatch_item_order (customer_id,order_id),
@@ -1794,6 +1796,8 @@ SET @ddl = (SELECT IF(EXISTS (SELECT 1 FROM information_schema.columns WHERE tab
released_at DATETIME(3) NULL COMMENT '释放时间',
created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '创建时间',
updated_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3) COMMENT '更新时间',
return_receipt_id BIGINT NULL COMMENT '明确选用的真实退回入仓来源',
PRIMARY KEY (id),
UNIQUE KEY uk_ll_dispatch_active_pallet (customer_id,active_key),
KEY idx_ll_dispatch_pallet_lock_order (customer_id,dispatch_order_id,status),
@@ -1862,10 +1866,39 @@ CREATE TABLE IF NOT EXISTS ll_dispatch_pda_operation (
PRIMARY KEY (id), UNIQUE KEY uk_ll_dispatch_pda_operation_key (customer_id,idempotency_key)
) ENGINE=InnoDB COMMENT='派车PDA操作幂等记录';
CREATE TABLE ll_return_stock_receipt (
id BIGINT NOT NULL COMMENT '退回入仓实收凭据ID',
customer_id VARCHAR(128) NOT NULL COMMENT '客户数据归属',
receipt_no VARCHAR(64) NOT NULL COMMENT '退回实收业务编号',
inventory_ledger_id BIGINT NOT NULL COMMENT '唯一实际退回入账流水',
exception_order_id BIGINT NOT NULL COMMENT '退回异常订单',
order_id BIGINT NOT NULL COMMENT '原尾程订单',
inbound_order_id BIGINT NOT NULL COMMENT '原入仓单',
source_outbound_no VARCHAR(64) NOT NULL COMMENT '原发运出库业务编号',
source_outbound_pallet_item_id BIGINT NOT NULL COMMENT '原出库托盘明细',
source_inventory_position_id BIGINT NOT NULL COMMENT '原拣货库存位置',
inventory_balance_id BIGINT NOT NULL COMMENT '实际退回库存余额',
inventory_position_id BIGINT NOT NULL COMMENT '实际退回库存位置',
received_packages BIGINT NOT NULL COMMENT '实际退回箱数,不增加原订单箱数',
received_at DATETIME(3) NOT NULL COMMENT '实际退回入账时间',
created_at DATETIME(3) NOT NULL COMMENT '凭据记录时间',
PRIMARY KEY(id),
UNIQUE KEY uk_return_stock_receipt_no(customer_id,receipt_no),
UNIQUE KEY uk_return_stock_receipt_ledger(customer_id,inventory_ledger_id),
KEY idx_return_stock_receipt_order(customer_id,order_id),
KEY idx_return_stock_receipt_position(customer_id,inventory_balance_id,inventory_position_id),
CONSTRAINT chk_return_stock_receipt_packages CHECK(received_packages>0)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='真实退回入仓及再次发运来源凭据';
CREATE TABLE IF NOT EXISTS ll_dispatch_pda_pick_order (
id BIGINT NOT NULL COMMENT '主键ID', customer_id VARCHAR(128) NOT NULL COMMENT '客户租户ID', pick_id BIGINT NOT NULL COMMENT 'PDA拣货记录ID',
receipt_id BIGINT NOT NULL COMMENT '入仓实收记录ID', order_id BIGINT NOT NULL COMMENT '订单ID', packages BIGINT NOT NULL COMMENT '本次操作箱数',
receipt_id BIGINT NULL COMMENT '入仓实收记录ID', order_id BIGINT NOT NULL COMMENT '订单ID', packages BIGINT NOT NULL COMMENT '本次操作箱数',
product_quantity BIGINT NOT NULL DEFAULT 0 COMMENT '产品数量', created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '创建时间',
return_receipt_id BIGINT NULL COMMENT '明确选用的真实退回入仓来源',
KEY idx_dispatch_pick_return_receipt(customer_id,return_receipt_id),
CONSTRAINT chk_dispatch_pick_receipt_source CHECK((receipt_id IS NOT NULL AND return_receipt_id IS NULL) OR (receipt_id IS NULL AND return_receipt_id IS NOT NULL)),
PRIMARY KEY (id), KEY idx_ll_dispatch_pick_order_pick (customer_id,pick_id),
KEY idx_ll_dispatch_pick_order_receipt (customer_id,receipt_id)
) ENGINE=InnoDB COMMENT='PDA拣货订单归属记录';
@@ -2401,21 +2401,28 @@ components:
packageCount: { type: integer }
volumeCbm: { type: number }
sourceStage: { type: string, enum: [PLAN, RECEIVED] }
sourceType: { type: string, enum: [INBOUND_PLAN, RETURN_RECEIPT], description: 正式实物来源类型 }
returnReceiptId: { type: string, nullable: true, description: 退回实收来源ID,不作为计划托盘ID }
returnReceiptNo: { type: string, nullable: true, description: 退回实收业务编号 }
cartonMarks: { type: string, nullable: true, description: 该托盘箱号,逗号分隔 }
SmartDispatchPreArrange:
type: object
required: [planPalletIds]
description: planPalletIds与returnReceiptIds是两类正式来源,合计至少一项且最多500项。退回来源仅接受实际入账生成的实收记录,不得用退回实收ID冒充计划托盘ID;同一实物托盘不可重复选择。
properties:
planPalletIds: { type: array, minItems: 1, maxItems: 500, uniqueItems: true, items: { type: string } }
planPalletIds: { type: array, maxItems: 500, uniqueItems: true, items: { type: string } }
returnReceiptIds: { type: array, maxItems: 500, uniqueItems: true, items: { type: string }, description: 原订单实际退回入账来源ID }
fbaAppointmentNo: { type: string, nullable: true, maxLength: 64 }
fbaAppointmentStatus: { type: string, nullable: true, maxLength: 32, default: PENDING }
vehicleAppointmentStatus: { type: string, nullable: true, maxLength: 32, default: PENDING }
draftToken: { type: string, nullable: true, maxLength: 64, description: 拖入托盘时使用的智能排车草稿标识 }
SmartDispatchDraftPallet:
type: object
required: [planPalletId, draftToken]
required: [draftToken]
description: planPalletId和returnReceiptId恰有一个;退回来源必须声明sourceType=RETURN_RECEIPT。并发占用始终按客户及实物托盘锁定。
properties:
planPalletId: { type: string }
returnReceiptId: { type: string }
sourceType: { type: string, enum: [INBOUND_PLAN, RETURN_RECEIPT] }
draftToken: { type: string, minLength: 1, maxLength: 64 }
draftContainerId: { type: string, nullable: true, description: 托盘所在草稿车厢ID }
SmartDispatchDraftRelease: