fix(douyu): 修复未换绑成功时角色信息被待确认新角色污染 & 增加绑定接口明细日志

This commit is contained in:
yml2213
2026-08-02 13:18:56 +08:00
parent 4fab6ed0aa
commit de2e53748d
3 changed files with 180 additions and 27 deletions
+67 -7
View File
@@ -26,12 +26,33 @@ import {
getExchangeImage,
} from '../utils/exchangeImage';
import { getErrorMessage } from '../utils/error';
import { formatTime } from '../utils/time';
import { message } from '../utils/antdMessage';
const { Text } = Typography;
type HandbookKind = 'elite' | 'esports';
const TASK_STATUS_COLORS: Record<string, string> = {
planned: 'default',
pending: 'default',
running: 'processing',
success: 'success',
failed: 'error',
error: 'error',
stopped: 'warning',
};
const TASK_STATUS_LABELS: Record<string, string> = {
planned: '已计划',
pending: '等待中',
running: '执行中',
success: '成功',
failed: '失败',
error: '异常',
stopped: '已停止',
};
const ELITE_QUICK_ACTIONS = [
{ key: 'get_bind_qr', icon: <QrcodeOutlined /> },
{ key: 'confirm_bind', icon: <CheckCircleOutlined /> },
@@ -845,22 +866,29 @@ export default function DouyuTasksPage({ handbook }: { handbook: HandbookKind })
const qrQueryResult = qrTask && qrQueryTask && qrQueryTask.id > qrTask.id ? qrQueryTask.result : null;
const qrQueryRunning = Boolean(qrQueryTask && qrTask && qrQueryTask.id > qrTask.id && qrQueryTask.status === 'running');
const qrQueryRoleName = resultText(qrQueryResult, 'role_name');
const qrQueryPendingRoleName = resultText(qrQueryResult, 'pending_role_name');
const qrQueryIsBoundAct = resultFlag(qrQueryResult, 'is_bound_act') || resultFlag(qrQueryResult, 'bind_confirmed');
const qrQueryPending = Boolean(
qrQueryResult
&& qrQueryRoleName
&& (
qrQueryResult.bind_ready_for_confirm === true
|| (!qrQueryIsBoundAct)
qrQueryPendingRoleName
|| (
qrQueryRoleName
&& (
qrQueryResult.bind_ready_for_confirm === true
|| (!qrQueryIsBoundAct)
)
)
),
);
const qrBindReady = bindReadyForConfirm(qrTask) || qrQueryPending;
const qrRoleSourceResult = qrQueryPending
? qrQueryResult
: (bindReadyForConfirm(qrTask) ? qrResult : null);
const qrRoleName = resultText(qrRoleSourceResult, 'role_name');
const qrAreaName = resultText(qrRoleSourceResult, 'area_name');
const qrPlatName = resultText(qrRoleSourceResult, 'plat_name');
// 待确认角色优先用 pending_* 字段(已绑定角色之外的扫码新角色)
const qrRoleName = resultText(qrRoleSourceResult, 'pending_role_name') || resultText(qrRoleSourceResult, 'role_name');
const qrAreaName = resultText(qrRoleSourceResult, 'pending_area_name') || resultText(qrRoleSourceResult, 'area_name');
const qrPlatName = resultText(qrRoleSourceResult, 'pending_plat_name') || resultText(qrRoleSourceResult, 'plat_name');
const qrCurrentRoleName = qrQueryRoleName
|| resultText(qrResult, 'current_role_name')
|| (
@@ -943,8 +971,10 @@ export default function DouyuTasksPage({ handbook }: { handbook: HandbookKind })
? latestEsportsStateTaskByAccount.get(record.id)
: latestQueryGameTaskByAccount.get(record.id)
)?.result || null;
// role_name = 当前已生效绑定角色;pending_role_name = 扫码后待确认的新角色
const roleName = resultText(queryResult, 'role_name')
|| (isEsportsHandbook ? record.esports_game_name : record.game_name);
const pendingRoleName = resultText(queryResult, 'pending_role_name');
const channel = (
[resultText(queryResult, 'area_name'), resultText(queryResult, 'plat_name')]
.filter(Boolean)
@@ -954,6 +984,9 @@ export default function DouyuTasksPage({ handbook }: { handbook: HandbookKind })
return roleName ? (
<Space direction="vertical" size={0}>
<Text>{roleName}</Text>
{pendingRoleName ? (
<Text type="warning" style={{ fontSize: 12 }}>: {pendingRoleName}</Text>
) : null}
{channel ? <Text type="secondary" style={{ fontSize: 12 }}>{channel}</Text> : null}
</Space>
) : <Text type="secondary"></Text>;
@@ -1035,6 +1068,33 @@ export default function DouyuTasksPage({ handbook }: { handbook: HandbookKind })
return aw - bw;
},
},
{
title: '最近操作', width: 220,
render: (_, record) => {
const latest = latestTaskByAccount.get(record.id);
if (!latest) return <Text type="secondary"></Text>;
return (
<Space direction="vertical" size={1} style={{ width: '100%' }}>
<Space size={4} wrap>
<Tag color={TASK_STATUS_COLORS[latest.status] || 'default'}>
{TASK_STATUS_LABELS[latest.status] || latest.status}
</Tag>
<Text strong ellipsis style={{ maxWidth: 130 }}>
{taskTypes[latest.task_type] || latest.task_type}
</Text>
</Space>
{latest.message ? (
<Text type="secondary" style={{ fontSize: 12 }} ellipsis title={latest.message}>
{latest.message}
</Text>
) : null}
<Text type="secondary" style={{ fontSize: 12 }}>
{formatTime(latest.finished_at || latest.created_at)}
</Text>
</Space>
);
},
},
{
title: '二维码', width: 76, align: 'center',
render: (_, record) => {
@@ -1428,7 +1488,7 @@ export default function DouyuTasksPage({ handbook }: { handbook: HandbookKind })
},
}}
tableLayout="fixed"
scroll={{ x: 960, y: Math.max(120, accountTableAreaHeight - 80) }}
scroll={{ x: 1180, y: Math.max(120, accountTableAreaHeight - 80) }}
onRow={(record) => ({
onContextMenu: (e) => handleRowContextMenu(record, e),
style: { cursor: 'context-menu' },