66 lines
4.1 KiB
SQL
66 lines
4.1 KiB
SQL
SET NAMES utf8mb4;
|
|
USE baiyue_firstleg;
|
|
|
|
/* 入库单级预装与柜次级装柜计划的多对多关联;一单多柜和拼柜均通过关联行表达。 */
|
|
CREATE TABLE IF NOT EXISTS fl_preload_loading_plan_link (
|
|
id BIGINT UNSIGNED NOT NULL COMMENT '关联ID',
|
|
tenant_id BIGINT UNSIGNED NOT NULL COMMENT '入库单客户隔离ID',
|
|
inbound_id BIGINT UNSIGNED NOT NULL COMMENT '入库单ID',
|
|
preload_plan_id BIGINT UNSIGNED NOT NULL COMMENT '入库单级预装计划ID',
|
|
loading_plan_id BIGINT UNSIGNED NOT NULL COMMENT '柜次级装柜计划ID',
|
|
idempotency_key VARCHAR(128) NOT NULL COMMENT '建立关联幂等键',
|
|
request_hash CHAR(64) NOT NULL COMMENT '建立关联请求SHA-256',
|
|
created_by BIGINT UNSIGNED NOT NULL COMMENT '建立预装与装柜计划关联的操作人ID',
|
|
created_by_name VARCHAR(64) NULL COMMENT '建立关联的操作人姓名快照',
|
|
created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '关联记录创建时间',
|
|
PRIMARY KEY (id),
|
|
UNIQUE KEY uk_preload_loading_pair (tenant_id, inbound_id, loading_plan_id),
|
|
UNIQUE KEY uk_preload_loading_idempotency (created_by, idempotency_key),
|
|
KEY idx_preload_loading_preload (preload_plan_id, loading_plan_id),
|
|
KEY idx_preload_loading_plan (loading_plan_id, tenant_id, inbound_id),
|
|
CONSTRAINT fk_preload_loading_inbound FOREIGN KEY (inbound_id) REFERENCES fl_inbound_order (id),
|
|
CONSTRAINT fk_preload_loading_preload FOREIGN KEY (preload_plan_id) REFERENCES fl_preload_plan (id),
|
|
CONSTRAINT fk_preload_loading_plan FOREIGN KEY (loading_plan_id) REFERENCES fl_loading_plan (id),
|
|
CONSTRAINT chk_preload_loading_tenant CHECK (tenant_id > 0)
|
|
) ENGINE=InnoDB COMMENT='入库单预装与柜次装柜计划多对多关联';
|
|
|
|
/* 兼容已存在且可由活动装柜明细无歧义推导的关联。 */
|
|
INSERT IGNORE INTO fl_preload_loading_plan_link
|
|
(id, tenant_id, inbound_id, preload_plan_id, loading_plan_id, idempotency_key,
|
|
request_hash, created_by, created_by_name, created_at)
|
|
SELECT CAST(CONV(SUBSTRING(SHA2(CONCAT('PRELOAD_LOADING|', item.account_id, '|', item.inbound_id,
|
|
'|', item.loading_plan_id), 256), 1, 15), 16, 10) AS UNSIGNED),
|
|
item.account_id, item.inbound_id, preload.id, item.loading_plan_id,
|
|
CONCAT('BACKFILL-', item.loading_plan_id, '-', item.inbound_id),
|
|
SHA2(CONCAT('BACKFILL|', item.account_id, '|', item.inbound_id, '|', item.loading_plan_id), 256),
|
|
preload.created_by, preload.created_by_name, LEAST(preload.created_at, plan.created_at)
|
|
FROM (SELECT DISTINCT account_id, inbound_id, loading_plan_id
|
|
FROM fl_loading_plan_item WHERE deleted = 0) item
|
|
JOIN fl_preload_plan preload ON preload.tenant_id = item.account_id
|
|
AND preload.inbound_id = item.inbound_id
|
|
JOIN fl_loading_plan plan ON plan.id = item.loading_plan_id;
|
|
|
|
DROP PROCEDURE IF EXISTS assert_phase3_loading_model_bridge;
|
|
DELIMITER $$
|
|
CREATE PROCEDURE assert_phase3_loading_model_bridge()
|
|
BEGIN
|
|
IF (SELECT COUNT(*) FROM information_schema.tables
|
|
WHERE table_schema = DATABASE() AND table_name = 'fl_preload_loading_plan_link') <> 1 THEN
|
|
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '装柜模型桥接表创建失败';
|
|
END IF;
|
|
IF (SELECT COUNT(DISTINCT index_name) FROM information_schema.statistics
|
|
WHERE table_schema = DATABASE() AND table_name = 'fl_preload_loading_plan_link'
|
|
AND index_name IN ('uk_preload_loading_pair', 'uk_preload_loading_idempotency',
|
|
'idx_preload_loading_preload', 'idx_preload_loading_plan')) <> 4 THEN
|
|
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '装柜模型桥接索引不完整';
|
|
END IF;
|
|
IF (SELECT COUNT(*) FROM information_schema.key_column_usage
|
|
WHERE constraint_schema = DATABASE() AND table_name = 'fl_preload_loading_plan_link'
|
|
AND referenced_table_name IN ('fl_inbound_order', 'fl_preload_plan', 'fl_loading_plan')) <> 3 THEN
|
|
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '装柜模型桥接外键不完整';
|
|
END IF;
|
|
END$$
|
|
DELIMITER ;
|
|
CALL assert_phase3_loading_model_bridge();
|
|
DROP PROCEDURE IF EXISTS assert_phase3_loading_model_bridge;
|