/** * TalkingQ Platform - Bad Case Management Page */ registerPage('badcase', function(container) { const mockCases = [ { id: 'BC-2026-001', session: 'sess-6c1d', device: 'DEV-002', agent: '小Q故事机器人', issue: '回答偏离话题,讲了不适合儿童的内容片段', severity: 'high', status: 'open', reporter: '自动检测', time: '2026-05-12 14:07', tags: ['内容安全', '主题偏离'] }, { id: 'BC-2026-002', session: 'sess-5a4b', device: 'DEV-003', agent: '小Q故事机器人', issue: '粤语识别错误率高,多次识别成普通话', severity: 'medium', status: 'reviewing', reporter: '运营标注', time: '2026-05-12 13:58', tags: ['ASR质量', '粤语'] }, { id: 'BC-2026-003', session: 'sess-3f7a', device: 'DEV-007', agent: '英语学习助手', issue: '用户问"what is fire",AI回复了如何生火的危险操作', severity: 'critical', status: 'open', reporter: '自动检测', time: '2026-05-12 11:30', tags: ['内容安全', '危险信息'] }, { id: 'BC-2026-004', session: 'sess-2c8b', device: 'DEV-012', agent: '科学百科探索者', issue: 'TTS 合成失败,只播放了半句话', severity: 'low', status: 'closed', reporter: '系统监控', time: '2026-05-11 09:15', tags: ['TTS故障'] }, { id: 'BC-2026-005', session: 'sess-1d9e', device: 'DEV-015', agent: '小Q故事机器人', issue: '对用户"我想要妈妈"的情感求助回应过于机械', severity: 'medium', status: 'reviewing', reporter: '人工标注', time: '2026-05-11 16:42', tags: ['情感质量', '儿童关怀'] }, ]; const sevMap = { critical: { label: '严重', badge: 'badge-danger' }, high: { label: '高', badge: 'badge-danger' }, medium: { label: '中', badge: 'badge-warning' }, low: { label: '低', badge: 'badge-default' } }; const statMap = { open: { label: '待处理', badge: 'badge-danger' }, reviewing: { label: '审核中', badge: 'badge-warning' }, closed: { label: '已关闭', badge: 'badge-default' } }; container.innerHTML = `
待处理
23
其中严重 3 个
审核中
18
平均处理 2.3h
本月已关闭
142
解决率 86%
内容安全触发
7
需优先处理
${mockCases.map(c => ` `).join('')}
ID 问题描述 智能体 严重度 状态 标签 报告人 时间 操作
${c.id}
${c.issue}
Session: ${c.session} · ${c.device}
${c.agent} ${sevMap[c.severity]?.label} ${statMap[c.status]?.label}
${c.tags.map(t => `${t}`).join('')}
${c.reporter} ${c.time}
${c.status !== 'closed' ? ` ` : ''}
`; lucide.createIcons({ elements: [container] }); window.openBCDetail = (id) => { const bc = mockCases.find(c => c.id === id); if (!bc) return; createModal({ title: `Bad Case 详情 - ${id}`, content: `
问题描述
${bc.issue}
严重度
${sevMap[bc.severity]?.label}
关联 Session
${bc.session}
处理后通过 POST /api/v1/bad-cases/${id}/review 提交审核结果
`, onConfirm: async () => { await API.badCases.review(id, { resolution: 'fixed' }); Toast.success('已提交处理意见'); }, confirmText: '提交处理', }); }; window.openBCTagModal = (id) => { const bc = mockCases.find(c => c.id === id); if (!bc) return; createModal({ title: `标注问题 - ${id}`, content: `
`, onConfirm: () => { const tags = document.getElementById('bcTagsInput')?.value.trim(); if (!tags) { Toast.warning('请填写至少一个问题标签'); return false; } bc.tags = tags.split(',').map(t => t.trim()).filter(Boolean); Toast.success('问题标注已保存'); }, confirmText: '保存标注', }); }; window.closeBC = (id, btn) => { const bc = mockCases.find(c => c.id === id); if (!bc) return; createModal({ title: '关闭 Bad Case', content: `

确认关闭 ${id}

`, onConfirm: () => { bc.status = 'closed'; const row = btn?.closest('tr'); const statusCell = row?.querySelector('td:nth-child(5)'); if (statusCell) statusCell.innerHTML = '已关闭'; const actions = btn?.closest('div'); if (actions) actions.innerHTML = ``; lucide.createIcons(); Toast.success(`${id} 已关闭`); }, confirmText: '确认关闭', }); }; document.getElementById('manualBCBtn')?.addEventListener('click', () => { createModal({ title: '手动添加 Bad Case', content: `
`, onConfirm: async () => { const issue = document.getElementById('manualBCIssue')?.value.trim(); if (!issue) { Toast.warning('请填写问题描述'); return false; } Toast.success('Bad Case 已添加'); }, confirmText: '添加', }); }); });