diff --git a/web/frontend/src/pages/DouyuTasksPage.tsx b/web/frontend/src/pages/DouyuTasksPage.tsx index 65681fb..aa14184 100644 --- a/web/frontend/src/pages/DouyuTasksPage.tsx +++ b/web/frontend/src/pages/DouyuTasksPage.tsx @@ -344,6 +344,16 @@ export default function DouyuTasksPage({ handbook }: { handbook: HandbookKind }) return map; }, [tasks]); + // 每个账号最近一条任务(当前手册类型),用于账号表"最近结果"列快速查看二维码 + const latestTaskByAccount = useMemo(() => { + const map = new Map(); + for (const task of visibleTasks) { + const previous = map.get(task.account_id); + if (!previous || task.id > previous.id) map.set(task.account_id, task); + } + return map; + }, [visibleTasks]); + const loadData = useCallback(async () => { setLoading(true); try { @@ -959,6 +969,45 @@ export default function DouyuTasksPage({ handbook }: { handbook: HandbookKind }) return aw - bw; }, }, + { + title: '最近结果', width: 200, + render: (_, record) => { + const task = latestTaskByAccount.get(record.id); + if (!task) return ; + const typeLabel = taskTypes[task.task_type] || task.task_type; + // 是否有可打开的二维码/弹窗 + const canOpen = hasBindQrcode(task) || hasPaymentQrcode(task) + || (['prepare_esports_bind', 'get_esports_bind_qr'].includes(task.task_type) + && (Boolean(resultText(task.result, 'url')) || task.result?.esports_bind_dialog === true)); + const openTask = () => { + if (hasBindQrcode(task)) openQrTask(task); + else if (hasPaymentQrcode(task)) openPayTask(task); + else openEsportsBindTask(task); + }; + return ( + + + {typeLabel} + {canOpen && ( + + )} + + + {task.message || STATUS_LABELS[task.status] || task.status} + + + ); + }, + }, ]; // 任务记录表