贴标申请,仓储转运
This commit is contained in:
@@ -1,5 +1,13 @@
|
||||
# 后端脚本管理与全量 HTTP 验收索引
|
||||
|
||||
`db/local-four-flows-schema-incremental-20261009.sql`:本地退货换标、仓储转运、贴标出库及退货出库结构比对所得的 MySQL 8 定向增量。显式 `USE baiyue_lastleg`,补齐预约结束时间/版本、转运换标来源绑定、分配 SKU 快照及转运收货幂等命令表;字段按存在性判断,表使用 `CREATE TABLE IF NOT EXISTS`,可重复执行,不删除或回填业务数据。使用操作者显式选择的本地数据库连接,无内置凭据;完整执行输出 `LOCAL_FLOW_SCHEMA_READY`。失败保留已完成的 DDL 与原错误,核对后重跑;不自动清理业务记录,不是全库迁移或生产验收入口。
|
||||
|
||||
`db/return-tail-order-number-incremental-20261009.sql` 将已验证关联的退货尾程单号及退货单尾程号快照统一为退货单号。显式 `USE baiyue_lastleg`,可重复执行,只更新同客户、关联订单 ID 和来源退货号均一致的 `RETURN_RELABEL` 单据;不改变业务 ID、库存或履约状态。执行前核对目标数据库,执行后核验查询应为空,异常关系保留供核实。已同步海外业务统一增量脚本。
|
||||
|
||||
`db/return-carton-count-session-incremental-20261009.sql` 为本地清点作业认领增量,明确指向 `baiyue_lastleg`,MySQL 8 可重复执行。新增按操作员唯一、签收批次唯一的持久会话表;开始清点后退出页面不释放,只有核平完成事务才释放,不修改库存数量。凭据取本机配置,执行输出作为迁移记录;失败保留错误,修复后重跑,不删除单据或清点会话。同表已同步尾程基线、海外统一增量及完整箱内清点增量脚本。
|
||||
|
||||
`db/return-carton-counting-incremental-20261009.sql` 为本地退货箱内清点增量,显式指向 `baiyue_lastleg`,适用于已执行退货合箱增量的 MySQL 8。增加清点状态、时间、操作人及索引;将整批仍可用且没有合箱追溯或换标占用的历史托盘签收箱转为待清点,不修改其数量。已履约或曾合箱的历史批次不自动回退,须单独核实。凭据由本机配置提供,不在脚本中保存;SQL 执行输出即为核验记录,可重复运行,已清点批次不会回退,失败保留错误和业务现场,不删除单据。同批结构同步到尾程基线与海外统一增量;服务须加载新代码后才能执行清点接口。
|
||||
|
||||
`db/return-relabel-truck-incremental-20261008.sql` 为本地退货换标排车增量,显式指向 `baiyue_iam` / `baiyue_lastleg`,适用于 MySQL 8。补齐管理员正式司机、车次与审核权限,以及车辆容量和正式车队表;不修改退货库存或业务单据。凭据从本机配置读取,可重复执行,失败保留原错误和业务现场;重新登录后核对权限快照。结构同步到基线及两个统一增量,权限由正式 IAM 权限种子维护。
|
||||
|
||||
`db/return-packing-incremental-20261008.sql` 为本地退货合箱增量,明确指向 `baiyue_iam` 和 `baiyue_lastleg`,适用于 MySQL 8,可重复执行。初始化平台管理员的库存管理权限,补齐精确预占、原退货单来源追溯、完成结果幂等快照和箱级库位字段,移除“一签收单只能一箱”的旧唯一索引;不修改退货、库存等业务数据。数据库凭据从本机环境配置读取;执行失败应保留原错误,修复后重跑,不清理验收业务单据。同批结构已同步到基线、海外统一增量与 `db/incremental.sql`。
|
||||
|
||||
@@ -0,0 +1,49 @@
|
||||
-- 本地四流程结构补齐;目标 baiyue_lastleg;MySQL 8;不删除或回填业务数据。
|
||||
USE `baiyue_lastleg`;
|
||||
SET NAMES utf8mb4;
|
||||
DROP PROCEDURE IF EXISTS ensure_local_flow_column;
|
||||
DELIMITER $$
|
||||
CREATE PROCEDURE ensure_local_flow_column(IN t VARCHAR(64), IN n VARCHAR(64), IN d TEXT)
|
||||
BEGIN
|
||||
IF NOT EXISTS(SELECT 1 FROM information_schema.columns WHERE table_schema=DATABASE() AND table_name=t AND column_name=n) THEN
|
||||
SET @local_flow_ddl=CONCAT('ALTER TABLE `',t,'` ADD COLUMN `',n,'` ',d);
|
||||
PREPARE local_flow_stmt FROM @local_flow_ddl; EXECUTE local_flow_stmt; DEALLOCATE PREPARE local_flow_stmt;
|
||||
END IF;
|
||||
END$$
|
||||
DELIMITER ;
|
||||
CALL ensure_local_flow_column('ll_inbound_fba_appointment','appointment_end_at','DATETIME(3) NULL COMMENT ''预约结束时间,未明确时为空''');
|
||||
|
||||
CALL ensure_local_flow_column('ll_inbound_fba_appointment','version','INT NOT NULL DEFAULT 0 COMMENT ''并发版本''');
|
||||
|
||||
CALL ensure_local_flow_column('ll_warehouse_transfer_relabel_binding','source_allocation_id','BIGINT NULL COMMENT ''已有库存转运的原始来源分配ID''');
|
||||
|
||||
CALL ensure_local_flow_column('ll_warehouse_transfer_relabel_binding','relabel_item_id','BIGINT NULL COMMENT ''本票关联换标明细ID''');
|
||||
|
||||
CALL ensure_local_flow_column('ll_warehouse_transfer_inventory_allocation','sku_code','VARCHAR(128) NULL COMMENT ''本次来源分配的实际SKU快照''');
|
||||
|
||||
CREATE TABLE IF NOT EXISTS ll_warehouse_transfer_receipt_command (
|
||||
id BIGINT NOT NULL COMMENT '收货命令主键',
|
||||
customer_id VARCHAR(128) NOT NULL COMMENT '客户标识',
|
||||
transfer_order_id BIGINT NOT NULL COMMENT '转运单标识',
|
||||
source_inventory_position_id BIGINT NOT NULL COMMENT '本次收货来源库存位置',
|
||||
idempotency_key VARCHAR(255) NOT NULL COMMENT '原始收货幂等键',
|
||||
request_hash CHAR(64) NOT NULL COMMENT '完整原始收货请求摘要',
|
||||
request_json JSON NOT NULL COMMENT '完整原始收货请求快照',
|
||||
target_warehouse_id BIGINT NOT NULL COMMENT '实际目标海外收货仓',
|
||||
target_pallet_id BIGINT NOT NULL COMMENT '目标实物托盘',
|
||||
target_location_id BIGINT NOT NULL COMMENT '目标实际库位',
|
||||
target_hash CHAR(64) NOT NULL COMMENT '共享目标资源绑定摘要',
|
||||
target_json JSON NOT NULL COMMENT '权威目标仓托盘库位及目的仓快照',
|
||||
reservation_key VARCHAR(128) NOT NULL COMMENT '同转运同目标托盘共享资源占用键',
|
||||
resource_lock_id BIGINT NULL COMMENT '已确认有效的海外资源锁标识',
|
||||
status VARCHAR(32) NOT NULL COMMENT '命令状态PREPARED准备完成RESERVED资源占用COMPLETED收货完成',
|
||||
created_at DATETIME(3) NOT NULL COMMENT '命令创建时间',
|
||||
updated_at DATETIME(3) NOT NULL COMMENT '命令最后更新时间',
|
||||
PRIMARY KEY (id),
|
||||
UNIQUE KEY uk_ll_wh_receipt_cmd_source (transfer_order_id, source_inventory_position_id),
|
||||
UNIQUE KEY uk_ll_wh_receipt_cmd_key (customer_id, idempotency_key),
|
||||
KEY idx_ll_wh_receipt_cmd_target (customer_id, transfer_order_id, target_pallet_id),
|
||||
CONSTRAINT ck_ll_wh_receipt_cmd_status CHECK (status IN ('PREPARED','RESERVED','COMPLETED'))
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='转运逐来源收货原请求与共享目标资源占用命令';
|
||||
DROP PROCEDURE IF EXISTS ensure_local_flow_column;
|
||||
SELECT 'LOCAL_FLOW_SCHEMA_READY' AS migration_status, DATABASE() AS target_database;
|
||||
@@ -0,0 +1,13 @@
|
||||
-- MySQL 8,本地尾程库,可重复执行;不修改现有清点数量或自动释放未完成任务。
|
||||
USE baiyue_lastleg;
|
||||
-- 退货箱内清点作业会话:每位操作员只能认领一个批次,每个批次只能被一人认领。
|
||||
CREATE TABLE IF NOT EXISTS ll_return_carton_count_session (
|
||||
operator_id VARCHAR(128) NOT NULL COMMENT '平台PDA操作员标识',
|
||||
warehouse_id VARCHAR(128) NOT NULL COMMENT '认领时绑定海外仓标识',
|
||||
receipt_id BIGINT NULL COMMENT '正在清点的签收批次,完成后释放为NULL',
|
||||
started_at DATETIME(3) NULL COMMENT '本次开始清点时间',
|
||||
created_at DATETIME(3) NOT NULL COMMENT '会话创建时间',
|
||||
updated_at DATETIME(3) NOT NULL COMMENT '会话更新时间',
|
||||
PRIMARY KEY(operator_id),
|
||||
UNIQUE KEY uk_ll_return_count_session_receipt(receipt_id)
|
||||
) ENGINE=InnoDB COMMENT='退货箱内清点单人单任务持久会话';
|
||||
@@ -0,0 +1,33 @@
|
||||
-- 退货托盘签收箱内清点;MySQL 8;仅在目标尾程库执行,可重复运行。
|
||||
USE baiyue_lastleg;
|
||||
SET @rc_count_ddl = IF(EXISTS(SELECT 1 FROM information_schema.columns WHERE table_schema=DATABASE() AND table_name='ll_return_inventory_carton' AND column_name='count_status'),'SELECT 1','ALTER TABLE ll_return_inventory_carton ADD COLUMN count_status VARCHAR(16) NOT NULL DEFAULT ''CONFIRMED'' COMMENT ''箱内清点状态 PENDING待清点 CONFIRMED已确认''');
|
||||
PREPARE rc_count_stmt FROM @rc_count_ddl; EXECUTE rc_count_stmt; DEALLOCATE PREPARE rc_count_stmt;
|
||||
SET @rc_count_ddl = IF(EXISTS(SELECT 1 FROM information_schema.columns WHERE table_schema=DATABASE() AND table_name='ll_return_inventory_carton' AND column_name='counted_at'),'SELECT 1','ALTER TABLE ll_return_inventory_carton ADD COLUMN counted_at DATETIME(3) NULL COMMENT ''箱内清点确认时间''');
|
||||
PREPARE rc_count_stmt FROM @rc_count_ddl; EXECUTE rc_count_stmt; DEALLOCATE PREPARE rc_count_stmt;
|
||||
SET @rc_count_ddl = IF(EXISTS(SELECT 1 FROM information_schema.columns WHERE table_schema=DATABASE() AND table_name='ll_return_inventory_carton' AND column_name='counted_by'),'SELECT 1','ALTER TABLE ll_return_inventory_carton ADD COLUMN counted_by VARCHAR(128) NULL COMMENT ''箱内清点确认操作人''');
|
||||
PREPARE rc_count_stmt FROM @rc_count_ddl; EXECUTE rc_count_stmt; DEALLOCATE PREPARE rc_count_stmt;
|
||||
SET @rc_count_ddl = 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_count'),'SELECT 1','CREATE INDEX idx_ll_return_count ON ll_return_inventory_carton(overseas_warehouse_id,count_status,status,source_receipt_id)');
|
||||
PREPARE rc_count_stmt FROM @rc_count_ddl; EXECUTE rc_count_stmt; DEALLOCATE PREPARE rc_count_stmt;
|
||||
-- 历史箱:只迁移整批仍可用、没有换标/合箱占用、未确认清点的托盘签收箱。
|
||||
-- 已进入履约或合箱的批次不回退;后续需要逐批人工核实。
|
||||
UPDATE ll_return_inventory_carton c
|
||||
JOIN (SELECT source_receipt_id FROM (SELECT a.source_receipt_id
|
||||
FROM ll_return_inventory_carton a WHERE a.source_receipt_id IS NOT NULL AND a.source_unit_type='PALLET'
|
||||
GROUP BY a.source_receipt_id
|
||||
HAVING SUM(a.status<>'AVAILABLE' OR a.relabel_application_id IS NOT NULL OR a.relabel_no IS NOT NULL OR a.counted_at IS NOT NULL)=0
|
||||
AND SUM(EXISTS(SELECT 1 FROM ll_return_inventory_carton_item i WHERE i.carton_id=a.id AND COALESCE(i.packing_reserved_quantity,0)>0))=0
|
||||
AND SUM(EXISTS(SELECT 1 FROM ll_return_packing_trace t WHERE t.source_carton_mark=a.carton_mark OR t.target_carton_mark=a.carton_mark))=0
|
||||
) pending) p ON p.source_receipt_id=c.source_receipt_id
|
||||
SET c.count_status='PENDING' WHERE c.source_unit_type='PALLET' AND c.counted_at IS NULL;
|
||||
|
||||
-- 退货箱内清点作业会话:每位操作员只能认领一个批次,每个批次只能被一人认领。
|
||||
CREATE TABLE IF NOT EXISTS ll_return_carton_count_session (
|
||||
operator_id VARCHAR(128) NOT NULL COMMENT '平台PDA操作员标识',
|
||||
warehouse_id VARCHAR(128) NOT NULL COMMENT '认领时绑定海外仓标识',
|
||||
receipt_id BIGINT NULL COMMENT '正在清点的签收批次,完成后释放为NULL',
|
||||
started_at DATETIME(3) NULL COMMENT '本次开始清点时间',
|
||||
created_at DATETIME(3) NOT NULL COMMENT '会话创建时间',
|
||||
updated_at DATETIME(3) NOT NULL COMMENT '会话更新时间',
|
||||
PRIMARY KEY(operator_id),
|
||||
UNIQUE KEY uk_ll_return_count_session_receipt(receipt_id)
|
||||
) ENGINE=InnoDB COMMENT='退货箱内清点单人单任务持久会话';
|
||||
@@ -0,0 +1,13 @@
|
||||
-- 退货业务统一单号;只修改已验证关联的单号快照,保留订单ID、库存、清点、换标及履约状态。
|
||||
USE baiyue_lastleg;
|
||||
UPDATE ll_order o
|
||||
JOIN ll_return_order r ON r.lastleg_order_id=o.id AND r.customer_id=o.customer_id
|
||||
SET o.order_no=r.return_no, r.lastleg_order_no=r.return_no
|
||||
WHERE o.order_type='RETURN_RELABEL' AND o.source_order_no=r.return_no
|
||||
AND (NOT (o.order_no <=> r.return_no) OR NOT (r.lastleg_order_no <=> r.return_no));
|
||||
|
||||
-- 应返回零行;非零表示来源关系异常,须核实,脚本不猜测或改绑。
|
||||
SELECT r.return_no, o.order_no, r.lastleg_order_no
|
||||
FROM ll_return_order r JOIN ll_order o ON o.id=r.lastleg_order_id AND o.customer_id=r.customer_id
|
||||
WHERE o.order_type='RETURN_RELABEL'
|
||||
AND (NOT (o.order_no <=> r.return_no) OR NOT (r.lastleg_order_no <=> r.return_no));
|
||||
Reference in New Issue
Block a user