957 lines
74 KiB
SQL
957 lines
74 KiB
SQL
-- 2026-10-09 海外业务本地验收增量汇总;MySQL 8.0.16+;已有业务库升级。
|
||
-- 显式目标:baiyue_lastleg(业务结构)及 baiyue_iam(平台管理员正式作业权限)。
|
||
-- 独立文件,无 SOURCE 依赖;在对应实例的数据库工具中执行整个文件,出错停止,不使用 --force。
|
||
-- 包含四流程缺列/表、合箱合托及退货换标排车、清点会话、单SKU全部/部分出库。
|
||
-- 不强制完结单据,不修改库存数量,不生成验收单据,不删除业务数据。
|
||
-- 包含两项限定历史修正:符合条件的历史托盘批次标记待清点;关联一致的退货尾程单号对齐。
|
||
-- IAM只补正式平台管理员权限;数据库凭据从外部连接提供。
|
||
SET NAMES utf8mb4;
|
||
|
||
|
||
-- 来源:test-lastleg-relabel-return-transfer-columns.sql(复用结构定义,目标连接由本汇总脚本操作者指定)
|
||
-- 本地与 test 结构比对(2026-09-20):仅补 test 缺失的贴标/退货换标字段。
|
||
-- 本段只作用于已选择实例的尾程业务库。
|
||
-- MySQL 8;可重复执行。DDL 会隐式提交,遇错应停止执行,不使用 mysql --force。
|
||
USE `baiyue_lastleg`;
|
||
|
||
-- 贴标 PDA:一次 SKU 扫描可登记多件;旧记录保持默认数量 1。
|
||
SET @ddl = IF(
|
||
EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema = DATABASE()
|
||
AND table_name = 'll_relabel_pda_unit_fact' AND column_name = 'quantity'),
|
||
'SELECT 1',
|
||
'ALTER TABLE `ll_relabel_pda_unit_fact` ADD COLUMN `quantity` INT NOT NULL DEFAULT 1 COMMENT ''本次事实处理件数,箱级作业固定为1'' AFTER `reason`'
|
||
);
|
||
PREPARE stmt FROM @ddl; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||
|
||
-- 退货签收和库存箱记录来源托盘。
|
||
SET @ddl = IF(
|
||
EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema = DATABASE()
|
||
AND table_name = 'll_return_receipt' AND column_name = 'pallet_code'),
|
||
'SELECT 1',
|
||
'ALTER TABLE `ll_return_receipt` ADD COLUMN `pallet_code` VARCHAR(128) NULL COMMENT ''本次签收绑定的托盘码'' AFTER `receipt_batch_no`'
|
||
);
|
||
PREPARE stmt FROM @ddl; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||
|
||
SET @ddl = IF(
|
||
EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema = DATABASE()
|
||
AND table_name = 'll_return_inventory_carton' AND column_name = 'pallet_code'),
|
||
'SELECT 1',
|
||
'ALTER TABLE `ll_return_inventory_carton` ADD COLUMN `pallet_code` VARCHAR(128) NULL COMMENT ''签收时绑定的托盘码'' AFTER `source_return_no`'
|
||
);
|
||
PREPARE stmt FROM @ddl; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||
|
||
-- 退货单手动差异完结的审计字段。
|
||
SET @ddl = IF(
|
||
EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema = DATABASE()
|
||
AND table_name = 'll_return_order' AND column_name = 'discrepancy_reason'),
|
||
'SELECT 1',
|
||
'ALTER TABLE `ll_return_order` ADD COLUMN `discrepancy_reason` VARCHAR(500) NULL COMMENT ''手动完结差异原因'' AFTER `remark`'
|
||
);
|
||
PREPARE stmt FROM @ddl; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||
|
||
SET @ddl = IF(
|
||
EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema = DATABASE()
|
||
AND table_name = 'll_return_order' AND column_name = 'manually_completed_at'),
|
||
'SELECT 1',
|
||
'ALTER TABLE `ll_return_order` ADD COLUMN `manually_completed_at` DATETIME(3) NULL COMMENT ''手动差异完结时间'' AFTER `discrepancy_reason`'
|
||
);
|
||
PREPARE stmt FROM @ddl; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||
|
||
-- 预期返回 5;低于 5 表示本次补齐不完整。
|
||
SELECT DATABASE() AS target_schema, COUNT(*) AS aligned_column_count
|
||
FROM information_schema.columns
|
||
WHERE table_schema = DATABASE()
|
||
AND (table_name = 'll_relabel_pda_unit_fact' AND column_name = 'quantity'
|
||
OR table_name = 'll_return_receipt' AND column_name = 'pallet_code'
|
||
OR table_name = 'll_return_inventory_carton' AND column_name = 'pallet_code'
|
||
OR table_name = 'll_return_order' AND column_name IN ('discrepancy_reason', 'manually_completed_at'));
|
||
|
||
|
||
-- 来源:return-receipt-box-count-incremental-20260929.sql(复用结构定义,目标连接由本汇总脚本操作者指定)
|
||
-- 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;
|
||
|
||
|
||
-- 来源:return-outbound-box-nullable-20260929.sql(复用结构定义,目标连接由本汇总脚本操作者指定)
|
||
-- 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';
|
||
|
||
-- 来源:local-four-flows-schema-incremental-20261009.sql
|
||
-- 本地四流程结构补齐;目标 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;
|
||
|
||
|
||
-- 来源:return-packing-incremental-20261008.sql
|
||
-- 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
|
||
AND NOT EXISTS(SELECT 1 FROM iam_role_permission existing WHERE existing.role_id=role.id AND existing.permission_id=permission.id);
|
||
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;
|
||
|
||
|
||
-- 来源:return-relabel-truck-incremental-20261008.sql
|
||
-- 退货换标排车使用正式车次域,补齐旧本地库缺少的车队结构。
|
||
-- 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
|
||
AND NOT EXISTS(SELECT 1 FROM iam_role_permission existing WHERE existing.role_id=role.id AND existing.permission_id=permission.id);
|
||
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='车次成本不可变更正历史';
|
||
|
||
|
||
-- 来源:return-carton-counting-incremental-20261009.sql
|
||
-- 退货托盘签收箱内清点;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='退货箱内清点单人单任务持久会话';
|
||
|
||
|
||
-- 来源:return-tail-order-number-incremental-20261009.sql
|
||
-- 退货业务统一单号;只修改已验证关联的单号快照,保留订单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));
|
||
|
||
|
||
-- 来源:return-single-sku-quantity-incremental.sql
|
||
-- 退货单 SKU 按件数出库快照。目标库:baiyue_lastleg。可重复执行。
|
||
USE baiyue_lastleg;
|
||
SET @return_sku_quantity_ddl = IF(
|
||
EXISTS(SELECT 1 FROM information_schema.columns WHERE table_schema=DATABASE()
|
||
AND table_name='ll_outbound_pallet_item' AND column_name='return_sku_quantity'),
|
||
'SELECT 1',
|
||
'ALTER TABLE ll_outbound_pallet_item ADD COLUMN return_sku_quantity BIGINT NULL COMMENT ''退货单SKU本来源计划出库件数快照,NULL为历史整箱出库'' AFTER sku_code'
|
||
);
|
||
PREPARE return_sku_quantity_stmt FROM @return_sku_quantity_ddl;
|
||
EXECUTE return_sku_quantity_stmt;
|
||
DEALLOCATE PREPARE return_sku_quantity_stmt;
|
||
|
||
-- 部分出库仅扣件数;整箱扣一箱,保留守恒和非负约束。
|
||
SET @return_sku_check_ddl = IF(EXISTS(SELECT 1 FROM information_schema.table_constraints WHERE constraint_schema=DATABASE() AND table_name='ll_return_inventory_outbound_movement' AND constraint_name='chk_ll_return_outbound_movement_delta'), 'ALTER TABLE ll_return_inventory_outbound_movement DROP CHECK chk_ll_return_outbound_movement_delta, ADD 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 IN (0,1) AND total_after>=available_after)', 'ALTER TABLE ll_return_inventory_outbound_movement ADD 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 IN (0,1) AND total_after>=available_after)');
|
||
PREPARE return_sku_check_stmt FROM @return_sku_check_ddl;
|
||
EXECUTE return_sku_check_stmt;
|
||
DEALLOCATE PREPARE return_sku_check_stmt;
|
||
-- 同箱余数允许再次出库,防重仍由拣货ID+SKU唯一索引保证。
|
||
SET @return_sku_index_ddl = IF(EXISTS(SELECT 1 FROM information_schema.statistics WHERE table_schema=DATABASE() AND table_name='ll_return_inventory_outbound_movement' AND index_name='uk_ll_return_outbound_carton_sku'), 'ALTER TABLE ll_return_inventory_outbound_movement DROP INDEX uk_ll_return_outbound_carton_sku, ADD INDEX idx_ll_return_outbound_carton_sku(customer_id,carton_id,sku_code)', 'SELECT 1');
|
||
PREPARE return_sku_index_stmt FROM @return_sku_index_ddl;
|
||
EXECUTE return_sku_index_stmt;
|
||
DEALLOCATE PREPARE return_sku_index_stmt;
|
||
|
||
USE baiyue_lastleg;
|
||
SELECT 'OVERSEAS_INCREMENTAL_COMPLETE' AS migration_status,DATABASE() AS business_database;
|