From d417d15d9b771d7b71c3f6d9c0a04d419eb351c0 Mon Sep 17 00:00:00 2001 From: yml2213 Date: Sat, 1 Aug 2026 11:49:43 +0800 Subject: [PATCH] =?UTF-8?q?feat(douyu):=20=E8=B4=A6=E5=8F=B7=E8=A1=A8?= =?UTF-8?q?=E6=A0=BC=E6=96=B0=E5=A2=9E=E6=9C=80=E8=BF=91=E7=BB=93=E6=9E=9C?= =?UTF-8?q?=E5=88=97,=E6=94=AF=E6=8C=81=E5=BF=AB=E9=80=9F=E6=9F=A5?= =?UTF-8?q?=E7=9C=8B=E4=BA=8C=E7=BB=B4=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 latestTaskByAccount 按账号聚合最近一条任务 - 账号表新增最近结果列:任务类型Tag+查看按钮+进度文案 - 有二维码/弹窗的任务显示查看按钮,点击直接打开对应弹窗 - 二维码收起后可在账号表快速重新打开,无需去任务记录查找 --- web/frontend/src/pages/DouyuTasksPage.tsx | 49 +++++++++++++++++++++++ 1 file changed, 49 insertions(+) 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} + + + ); + }, + }, ]; // 任务记录表