test(firstleg): cover phase3 container loading flow

This commit is contained in:
2026-08-08 21:34:39 +08:00
parent 2dae8b2029
commit da85e30f33
8 changed files with 644 additions and 15 deletions
@@ -4893,6 +4893,92 @@ CREATE TABLE IF NOT EXISTS fl_loading_pick_history (
CONSTRAINT fk_loading_pick_history_item FOREIGN KEY (pick_item_id) REFERENCES fl_loading_pick_item (id)
) ENGINE=InnoDB COMMENT='PDA拣货幂等和操作审计历史';
DROP PROCEDURE IF EXISTS repair_phase3_loading_pick_task_foreign_keys;
DELIMITER $$
CREATE PROCEDURE repair_phase3_loading_pick_task_foreign_keys()
BEGIN
DECLARE item_fk_count INT DEFAULT 0;
DECLARE item_target_count INT DEFAULT 0;
DECLARE history_fk_count INT DEFAULT 0;
DECLARE history_target_count INT DEFAULT 0;
DECLARE item_drop_clauses TEXT;
DECLARE history_drop_clauses TEXT;
IF EXISTS (
SELECT 1 FROM fl_loading_pick_item item
LEFT JOIN fl_loading_pick_task task ON task.id = item.pick_task_id
WHERE task.id IS NULL
) THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = '柜次PDA明细存在无法迁移到智能装柜任务的引用';
END IF;
IF EXISTS (
SELECT 1 FROM fl_loading_pick_history history
LEFT JOIN fl_loading_pick_task task ON task.id = history.pick_task_id
WHERE task.id IS NULL
) THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = '柜次PDA历史存在无法迁移到智能装柜任务的引用';
END IF;
SELECT COUNT(*),
SUM(k.referenced_table_name = 'fl_loading_pick_task'
AND k.referenced_column_name = 'id'
AND (SELECT COUNT(*) FROM information_schema.key_column_usage peer
WHERE peer.constraint_schema = k.constraint_schema
AND peer.table_name = k.table_name
AND peer.constraint_name = k.constraint_name) = 1),
GROUP_CONCAT(CONCAT('DROP FOREIGN KEY `', REPLACE(k.constraint_name, '`', '``'), '`')
ORDER BY k.constraint_name SEPARATOR ', ')
INTO item_fk_count, item_target_count, item_drop_clauses
FROM information_schema.key_column_usage k
WHERE k.constraint_schema = 'baiyue_firstleg'
AND k.table_name = 'fl_loading_pick_item'
AND k.column_name = 'pick_task_id'
AND k.referenced_table_name IS NOT NULL;
IF item_fk_count <> 1 OR item_target_count <> 1 THEN
IF item_drop_clauses IS NOT NULL THEN
SET @phase3_fk_ddl = CONCAT('ALTER TABLE fl_loading_pick_item ', item_drop_clauses);
PREPARE phase3_fk_statement FROM @phase3_fk_ddl;
EXECUTE phase3_fk_statement;
DEALLOCATE PREPARE phase3_fk_statement;
END IF;
ALTER TABLE fl_loading_pick_item
ADD CONSTRAINT fk_loading_pick_item_task
FOREIGN KEY (pick_task_id) REFERENCES fl_loading_pick_task (id);
END IF;
SELECT COUNT(*),
SUM(k.referenced_table_name = 'fl_loading_pick_task'
AND k.referenced_column_name = 'id'
AND (SELECT COUNT(*) FROM information_schema.key_column_usage peer
WHERE peer.constraint_schema = k.constraint_schema
AND peer.table_name = k.table_name
AND peer.constraint_name = k.constraint_name) = 1),
GROUP_CONCAT(CONCAT('DROP FOREIGN KEY `', REPLACE(k.constraint_name, '`', '``'), '`')
ORDER BY k.constraint_name SEPARATOR ', ')
INTO history_fk_count, history_target_count, history_drop_clauses
FROM information_schema.key_column_usage k
WHERE k.constraint_schema = 'baiyue_firstleg'
AND k.table_name = 'fl_loading_pick_history'
AND k.column_name = 'pick_task_id'
AND k.referenced_table_name IS NOT NULL;
IF history_fk_count <> 1 OR history_target_count <> 1 THEN
IF history_drop_clauses IS NOT NULL THEN
SET @phase3_fk_ddl = CONCAT('ALTER TABLE fl_loading_pick_history ', history_drop_clauses);
PREPARE phase3_fk_statement FROM @phase3_fk_ddl;
EXECUTE phase3_fk_statement;
DEALLOCATE PREPARE phase3_fk_statement;
END IF;
ALTER TABLE fl_loading_pick_history
ADD CONSTRAINT fk_loading_pick_history_task
FOREIGN KEY (pick_task_id) REFERENCES fl_loading_pick_task (id);
END IF;
END$$
DELIMITER ;
CALL repair_phase3_loading_pick_task_foreign_keys();
DROP PROCEDURE repair_phase3_loading_pick_task_foreign_keys;
DROP TRIGGER IF EXISTS trg_container_booking_before_update;
DELIMITER $$
CREATE TRIGGER trg_container_booking_before_update
@@ -5443,6 +5529,40 @@ BEGIN
'uk_loading_pick_history_operation')) <> 3 THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '智能装柜迁移失败:PDA唯一索引缺失';
END IF;
IF (SELECT COUNT(*) FROM information_schema.key_column_usage
WHERE constraint_schema = 'baiyue_firstleg'
AND table_name = 'fl_loading_pick_item'
AND column_name = 'pick_task_id'
AND referenced_table_name IS NOT NULL) <> 1
OR (SELECT COUNT(*) FROM information_schema.key_column_usage outer_fk
WHERE outer_fk.constraint_schema = 'baiyue_firstleg'
AND outer_fk.table_name = 'fl_loading_pick_item'
AND outer_fk.column_name = 'pick_task_id'
AND outer_fk.referenced_table_name = 'fl_loading_pick_task'
AND outer_fk.referenced_column_name = 'id'
AND (SELECT COUNT(*) FROM information_schema.key_column_usage peer
WHERE peer.constraint_schema = outer_fk.constraint_schema
AND peer.table_name = outer_fk.table_name
AND peer.constraint_name = outer_fk.constraint_name) = 1) <> 1 THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '智能装柜迁移失败:柜次PDA明细任务外键不唯一或指向错误';
END IF;
IF (SELECT COUNT(*) FROM information_schema.key_column_usage
WHERE constraint_schema = 'baiyue_firstleg'
AND table_name = 'fl_loading_pick_history'
AND column_name = 'pick_task_id'
AND referenced_table_name IS NOT NULL) <> 1
OR (SELECT COUNT(*) FROM information_schema.key_column_usage outer_fk
WHERE outer_fk.constraint_schema = 'baiyue_firstleg'
AND outer_fk.table_name = 'fl_loading_pick_history'
AND outer_fk.column_name = 'pick_task_id'
AND outer_fk.referenced_table_name = 'fl_loading_pick_task'
AND outer_fk.referenced_column_name = 'id'
AND (SELECT COUNT(*) FROM information_schema.key_column_usage peer
WHERE peer.constraint_schema = outer_fk.constraint_schema
AND peer.table_name = outer_fk.table_name
AND peer.constraint_name = outer_fk.constraint_name) = 1) <> 1 THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '智能装柜迁移失败:柜次PDA历史任务外键不唯一或指向错误';
END IF;
IF (SELECT COUNT(*) FROM information_schema.triggers
WHERE trigger_schema = 'baiyue_firstleg'
AND trigger_name IN ('trg_container_booking_before_update',
@@ -6489,10 +6609,10 @@ ON DUPLICATE KEY UPDATE
status = 'ACTIVE', built_in = 1, deleted = 0;
INSERT INTO iam_role_permission (role_id, permission_id, tenant_id)
SELECT 4000001, id, 0
FROM iam_permission
WHERE tenant_id = 0 AND app_code = 'PLATFORM'
AND permission_code IN (
SELECT role.id, permission.id, role.tenant_id
FROM iam_role role
JOIN iam_permission permission ON permission.tenant_id = 0 AND permission.app_code = 'PLATFORM'
AND permission.permission_code IN (
'firstleg:inbound:split',
'firstleg:inbound:preload',
'firstleg:inbound:preload-view',
@@ -6503,6 +6623,7 @@ WHERE tenant_id = 0 AND app_code = 'PLATFORM'
'platform:firstleg:inbound:picking:edit',
'platform:firstleg:inbound:picking:view'
)
WHERE role.tenant_id = 0 AND role.role_code IN ('PLATFORM_ADMIN', 'ORDER_OPERATOR')
ON DUPLICATE KEY UPDATE tenant_id = VALUES(tenant_id);
INSERT IGNORE INTO iam_role_permission (role_id, permission_id, tenant_id)