/**
* 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 = `
| ID |
问题描述 |
智能体 |
严重度 |
状态 |
标签 |
报告人 |
时间 |
操作 |
${mockCases.map(c => `
| ${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' ? `
` : ''}
|
`).join('')}
`;
lucide.createIcons({ elements: [container] });
window.openBCDetail = (id) => {
const bc = mockCases.find(c => c.id === id);
if (!bc) return;
createModal({
title: `Bad Case 详情 - ${id}`,
content: `
处理后通过 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: '添加',
});
});
});