feat(practice): complete five-position training operations

This commit is contained in:
2026-07-24 00:26:27 +08:00
parent 067cc30d80
commit faa2a77e9a
15 changed files with 1357 additions and 77 deletions
@@ -0,0 +1,88 @@
-- 训练内容运营闭环:会话评分规则快照、五岗位 Rubric 补齐、旧每日任务场景修正。
-- 依赖:aihr_20260717_practice_five_position_catalog_mysql8.sql 已执行。
-- 可重复执行;仅补结构和内置规则,不生成员工业务任务。
SET @aihr_schema = DATABASE();
SET @rubric_code_exists = (
SELECT COUNT(*) FROM information_schema.columns
WHERE table_schema = @aihr_schema AND table_name = 'aihr_practice_session' AND column_name = 'rubric_code'
);
SET @rubric_code_ddl = IF(@rubric_code_exists = 0,
'ALTER TABLE aihr_practice_session ADD COLUMN rubric_code varchar(100) DEFAULT NULL COMMENT ''训练开始时评分规则编码'' AFTER dim_marketing',
'SELECT 1');
PREPARE aihr_rubric_code_stmt FROM @rubric_code_ddl;
EXECUTE aihr_rubric_code_stmt;
DEALLOCATE PREPARE aihr_rubric_code_stmt;
SET @rubric_version_exists = (
SELECT COUNT(*) FROM information_schema.columns
WHERE table_schema = @aihr_schema AND table_name = 'aihr_practice_session' AND column_name = 'rubric_version'
);
SET @rubric_version_ddl = IF(@rubric_version_exists = 0,
'ALTER TABLE aihr_practice_session ADD COLUMN rubric_version varchar(30) DEFAULT NULL COMMENT ''训练开始时评分规则版本'' AFTER rubric_code',
'SELECT 1');
PREPARE aihr_rubric_version_stmt FROM @rubric_version_ddl;
EXECUTE aihr_rubric_version_stmt;
DEALLOCATE PREPARE aihr_rubric_version_stmt;
SET @rubric_snapshot_exists = (
SELECT COUNT(*) FROM information_schema.columns
WHERE table_schema = @aihr_schema AND table_name = 'aihr_practice_session' AND column_name = 'rubric_snapshot_json'
);
SET @rubric_snapshot_ddl = IF(@rubric_snapshot_exists = 0,
'ALTER TABLE aihr_practice_session ADD COLUMN rubric_snapshot_json text DEFAULT NULL COMMENT ''训练开始时评分规则快照'' AFTER rubric_version',
'SELECT 1');
PREPARE aihr_rubric_snapshot_stmt FROM @rubric_snapshot_ddl;
EXECUTE aihr_rubric_snapshot_stmt;
DEALLOCATE PREPARE aihr_rubric_snapshot_stmt;
-- 对五岗位目录中没有 Rubric 的场景创建初始 v1.0 规则;已有版本不改写。
INSERT INTO aihr_practice_rubric
(tenant_id, rubric_code, scenario_code, rubric_name, version, enabled, description, create_time, update_time)
SELECT s.tenant_id, CONCAT('rubric-', s.scenario_code), s.scenario_code,
CONCAT(s.position, '基础评分规则'), 'v1.0', 1,
'五岗位内容目录补齐的初始版本;后续由训练运营维护。', NOW(), NOW()
FROM aihr_practice_scenario s
WHERE NOT EXISTS (
SELECT 1 FROM aihr_practice_rubric r
WHERE r.tenant_id = s.tenant_id AND r.scenario_code = s.scenario_code AND r.enabled = 1
)
ON DUPLICATE KEY UPDATE update_time = VALUES(update_time);
-- 一个场景仅保留最新的已启用版本,避免运行时随机取到历史 Rubric。
UPDATE aihr_practice_rubric r
JOIN (
SELECT tenant_id, scenario_code, MAX(id) AS keep_id
FROM aihr_practice_rubric
WHERE enabled = 1
GROUP BY tenant_id, scenario_code
) current_rule
ON current_rule.tenant_id = r.tenant_id AND current_rule.scenario_code = r.scenario_code
SET r.enabled = CASE WHEN r.id = current_rule.keep_id THEN 1 ELSE 0 END,
r.update_time = NOW()
WHERE r.enabled = 1;
-- 每个生效 Rubric 具备稳定的五个机器可评分维度,前端只能调整名称、描述和权重。
INSERT IGNORE INTO aihr_practice_rubric_dimension
(tenant_id, rubric_code, dimension_code, dimension_name, weight, description, sort_order, create_time, update_time)
SELECT r.tenant_id, r.rubric_code, d.dimension_code, d.dimension_name, d.weight, d.description, d.sort_order, NOW(), NOW()
FROM aihr_practice_rubric r
JOIN (
SELECT 'task_completion' AS dimension_code, '任务完成度' AS dimension_name, 0.40 AS weight,
'问题是否被推进到可执行闭环及 SOP 关键动作覆盖。' AS description, 10 AS sort_order
UNION ALL SELECT 'standardization', '话术规范性', 0.25, '流程完整、合规表达和专业沟通。', 20
UNION ALL SELECT 'emotion', '情绪管理能力', 0.20, '共情承接、情绪降级和信任恢复。', 30
UNION ALL SELECT 'response_timeliness', '响应时效', 0.10, '阶段一仅按陪练回合响应时长统计。', 40
UNION ALL SELECT 'marketing', '增值转化潜力', 0.05, '合规的服务引导和办理意识。', 50
) d
WHERE r.enabled = 1;
-- 旧硬编码每日题把 repair-leak 写成不存在编码;仅在目标场景已存在时修正历史未完成任务。
UPDATE aihr_practice_assignment a
JOIN aihr_practice_scenario s
ON s.tenant_id = a.tenant_id AND s.scenario_code = 'repair-leak-followup'
SET a.scenario_id = s.scenario_code,
a.scenario_name = s.scenario_name,
a.update_time = NOW()
WHERE a.source = 'daily' AND a.scenario_id = 'repair-leak' AND a.status = '待训练';