This commit is contained in:
fuenmao
2026-08-27 16:27:08 +08:00
parent ae8167a566
commit 80940c60a5
22 changed files with 218 additions and 8 deletions
@@ -0,0 +1,109 @@
-- OnboardX 任务合同变量排序快照升级脚本
-- 适用数据库:MySQL 8.0+
-- 说明:
-- 1. 可重复执行。
-- 2. 已有合同版本变量会同步全局变量字典的排序值。
-- 3. 新任务会在创建变量快照时固定模板变量的排序值。
-- 4. 历史任务按照其绑定的合同模板版本安全回填排序值。
SET NAMES utf8mb4;
DROP PROCEDURE IF EXISTS `ob_task_variable_add_column_if_missing`;
DELIMITER $$
CREATE PROCEDURE `ob_task_variable_add_column_if_missing`(
IN p_table_name VARCHAR(128),
IN p_column_name VARCHAR(128),
IN p_column_definition VARCHAR(1000)
)
BEGIN
IF NOT EXISTS (
SELECT 1
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = p_table_name
AND COLUMN_NAME = p_column_name
) THEN
SET @ddl = CONCAT(
'ALTER TABLE `', p_table_name, '` ADD COLUMN `',
p_column_name, '` ', p_column_definition
);
PREPARE stmt FROM @ddl;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END IF;
END$$
DELIMITER ;
DROP PROCEDURE IF EXISTS `ob_task_variable_add_index_if_missing`;
DELIMITER $$
CREATE PROCEDURE `ob_task_variable_add_index_if_missing`(
IN p_table_name VARCHAR(128),
IN p_index_name VARCHAR(128),
IN p_index_definition VARCHAR(1000)
)
BEGIN
IF NOT EXISTS (
SELECT 1
FROM information_schema.STATISTICS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = p_table_name
AND INDEX_NAME = p_index_name
) THEN
SET @ddl = CONCAT(
'ALTER TABLE `', p_table_name, '` ADD ', p_index_definition
);
PREPARE stmt FROM @ddl;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END IF;
END$$
DELIMITER ;
CALL `ob_task_variable_add_column_if_missing`(
'ob_task_contract_variable',
'SortCode',
'INT NOT NULL DEFAULT 100 COMMENT ''任务变量展示排序'' AFTER `DataType`'
);
-- 修复旧代码导入 DOCX 时没有继承全局变量字典排序的问题。
-- 模板变量编码创建后不可修改,因此可以按完整变量编码安全匹配。
UPDATE `ob_template_variable` template_variable
INNER JOIN `ob_variable_definition` variable_definition
ON CONVERT(variable_definition.`VariableCode` USING utf8mb4) COLLATE utf8mb4_unicode_ci
= CONVERT(template_variable.`VariableCode` USING utf8mb4) COLLATE utf8mb4_unicode_ci
SET template_variable.`SortCode` = COALESCE(variable_definition.`SortCode`, 100);
-- 使用任务锁定的合同版本回填历史变量排序;找不到模板定义的数据保留默认值 100。
UPDATE `ob_task_contract_variable` task_variable
INNER JOIN `ob_task_contract` task_contract
ON task_contract.`Id` = task_variable.`TaskContractId`
INNER JOIN `ob_template_variable` template_variable
ON template_variable.`TemplateVersionId` = task_contract.`TemplateVersionId`
AND CONVERT(template_variable.`VariableCode` USING utf8mb4) COLLATE utf8mb4_unicode_ci
= CONVERT(task_variable.`VariableCode` USING utf8mb4) COLLATE utf8mb4_unicode_ci
SET task_variable.`SortCode` = COALESCE(template_variable.`SortCode`, 100);
CALL `ob_task_variable_add_index_if_missing`(
'ob_task_contract_variable',
'idx_ob_task_contract_variable_sort',
'INDEX `idx_ob_task_contract_variable_sort` (`TaskContractId`, `SortCode`, `VariableCode`)'
);
DROP PROCEDURE IF EXISTS `ob_task_variable_add_index_if_missing`;
DROP PROCEDURE IF EXISTS `ob_task_variable_add_column_if_missing`;
-- 诊断仍未匹配到模板变量定义的历史数据。这些数据会使用默认排序值 100,并按变量编码稳定排序。
SELECT
task_variable.`Id`,
task_variable.`TaskContractId`,
task_variable.`VariableCode`,
task_variable.`SortCode`
FROM `ob_task_contract_variable` task_variable
LEFT JOIN `ob_task_contract` task_contract
ON task_contract.`Id` = task_variable.`TaskContractId`
LEFT JOIN `ob_template_variable` template_variable
ON template_variable.`TemplateVersionId` = task_contract.`TemplateVersionId`
AND CONVERT(template_variable.`VariableCode` USING utf8mb4) COLLATE utf8mb4_unicode_ci
= CONVERT(task_variable.`VariableCode` USING utf8mb4) COLLATE utf8mb4_unicode_ci
WHERE template_variable.`Id` IS NULL
ORDER BY task_variable.`TaskContractId`, task_variable.`VariableCode`;