fix(douyu): 修复未换绑成功时角色信息被待确认新角色污染 & 增加绑定接口明细日志
This commit is contained in:
@@ -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' },
|
||||
|
||||
Reference in New Issue
Block a user