feat(douyu): 拆分鱼翅积分与兑换记录查询

This commit is contained in:
yml2213
2026-10-23 10:42:42 +08:00
parent 2c87deed78
commit 2de5d374df
5 changed files with 359 additions and 105 deletions
+13 -2
View File
@@ -260,6 +260,7 @@ export interface DouyuCollabTimeline {
export interface DouyuCollabQueryResult {
order: DouyuCollabOrder;
metric: DouyuCollabMetric;
scope: 'activity' | 'balances';
verdict: string;
message: string;
points_reason: string;
@@ -347,9 +348,13 @@ export const douyuCollabApi = {
{ results: Array<{ id: number; success: boolean; ck_status?: string; role?: string; message?: string }>; success: boolean },
{ results: Array<{ id: number; success: boolean; ck_status?: string; role?: string; message?: string }>; success: boolean }
>('/douyu/external-orders/verify/batch', ids),
queryActivity: (id: number) =>
queryActivity: (id: number) => api.post<DouyuCollabQueryResult, DouyuCollabQueryResult>(
`/douyu/external-orders/${id}/activity/query`,
),
/** 只刷新鱼翅与手册积分,不查兑换记录、不判定、不改状态 */
queryBalances: (id: number) =>
api.post<DouyuCollabQueryResult, DouyuCollabQueryResult>(
`/douyu/external-orders/${id}/activity/query`,
`/douyu/external-orders/${id}/balances/query`,
),
setStatus: (id: number, data: {
status: DouyuCollabStatus;
@@ -371,6 +376,12 @@ export const douyuCollabApi = {
'/douyu/external-orders/activity/query',
ids,
),
/** 批量只刷新鱼翅/积分,不查兑换记录、不判定、不改状态 */
batchBalances: (ids: number[]) =>
api.post<{ results: Array<Record<string, unknown>>; success: boolean }, { results: Array<Record<string, unknown>>; success: boolean }>(
'/douyu/external-orders/balances/query',
ids,
),
updateImages: (id: number, home_images: string[], expected_version?: number) =>
api.post<DouyuCollabOrder, DouyuCollabOrder>(`/douyu/external-orders/${id}/images`, {
home_images,
+85 -24
View File
@@ -38,6 +38,7 @@ import {
PlusOutlined,
ReloadOutlined,
SafetyCertificateOutlined,
SearchOutlined,
ShopOutlined,
SyncOutlined,
TagOutlined,
@@ -214,6 +215,8 @@ export default function DouyuCollabPage() {
const [gifts, setGifts] = useState<string[]>([]);
const [goods, setGoods] = useState<DouyuCollabGoods[]>([]);
const [loading, setLoading] = useState(false);
const [balanceQuerying, setBalanceQuerying] = useState(false);
const [recordQuerying, setRecordQuerying] = useState(false);
const [goodsLoading, setGoodsLoading] = useState(false);
const [page, setPage] = useState(1);
const [pageSize, setPageSize] = useState(20);
@@ -631,18 +634,35 @@ export default function DouyuCollabPage() {
}
};
const queryOrder = async (order: DouyuCollabOrder) => {
const queryOneBalances = async (order: DouyuCollabOrder) => {
try {
message.loading({ content: '正在查询鱼翅、积分与兑换记录…', key: 'dy-collab-query' });
const result = await douyuCollabApi.queryActivity(order.id);
message.loading({ content: '正在查询鱼翅、积分…', key: 'dy-collab-balance' });
const result = await douyuCollabApi.queryBalances(order.id);
message.success({
content: `${result.message}${result.points_reason ? `;${pointsReasonMeta(result.points_reason).label}` : ''}`,
key: 'dy-collab-query',
content: `鱼翅 ${result.fish_fin_balance ?? '-'} / 积分 ${result.points_balance ?? '-'}${
result.points_reason ? `;${pointsReasonMeta(result.points_reason).label}` : ''
}`,
key: 'dy-collab-balance',
});
refreshAll();
if (detail?.id === order.id) void openDetail(order);
} catch (error) {
message.error({ content: getErrorMessage(error), key: 'dy-collab-query' });
message.error({ content: getErrorMessage(error), key: 'dy-collab-balance' });
}
};
const queryOneRecords = async (order: DouyuCollabOrder) => {
try {
message.loading({ content: '正在查询兑换记录…', key: 'dy-collab-records' });
const result = await douyuCollabApi.queryActivity(order.id);
message.success({
content: `${result.message}${result.points_reason ? `;${pointsReasonMeta(result.points_reason).label}` : ''}`,
key: 'dy-collab-records',
});
refreshAll();
if (detail?.id === order.id) void openDetail(order);
} catch (error) {
message.error({ content: getErrorMessage(error), key: 'dy-collab-records' });
}
};
@@ -716,21 +736,39 @@ export default function DouyuCollabPage() {
}
};
const batchQuery = async () => {
const batchQueryBalances = async () => {
if (selectedIds.length === 0) {
message.warning('请先勾选协作单');
return;
}
setLoading(true);
setBalanceQuerying(true);
try {
const result = await douyuCollabApi.batchActivity(selectedIds);
const result = await douyuCollabApi.batchBalances(selectedIds);
const ok = result.results.filter((item) => item.success).length;
message.success(`查询完成:${ok}/${result.results.length}`);
message.success(`鱼翅/积分查询完成:${ok}/${result.results.length}`);
refreshAll();
} catch (error) {
message.error(getErrorMessage(error));
} finally {
setLoading(false);
setBalanceQuerying(false);
}
};
const batchQueryRecords = async () => {
if (selectedIds.length === 0) {
message.warning('请先勾选协作单');
return;
}
setRecordQuerying(true);
try {
const result = await douyuCollabApi.batchActivity(selectedIds);
const ok = result.results.filter((item) => item.success).length;
message.success(`兑换记录查询完成:${ok}/${result.results.length}`);
refreshAll();
} catch (error) {
message.error(getErrorMessage(error));
} finally {
setRecordQuerying(false);
}
};
@@ -1158,7 +1196,7 @@ export default function DouyuCollabPage() {
},
{
title: '操作',
width: 400,
width: 500,
fixed: 'right',
align: 'center',
render: (_, row) => (
@@ -1196,9 +1234,16 @@ export default function DouyuCollabPage() {
校验
</Button>
</Tooltip>
<Button size="small" icon={<SyncOutlined />} onClick={() => void queryOrder(row)}>
查询
</Button>
<Tooltip title="只刷新鱼翅与手册积分,不查兑换记录,也不会改状态">
<Button size="small" icon={<SyncOutlined />} onClick={() => void queryOneBalances(row)}>
查鱼翅/积分
</Button>
</Tooltip>
<Tooltip title="查询当前账号兑换记录,命中礼包名后自动推进订单状态">
<Button size="small" icon={<SearchOutlined />} onClick={() => void queryOneRecords(row)}>
查兑换记录
</Button>
</Tooltip>
<Dropdown
menu={{
items: [
@@ -1501,13 +1546,26 @@ export default function DouyuCollabPage() {
<Button icon={<CheckCircleOutlined />} disabled={selectedCount === 0} onClick={openBatchStatus}>
批量改状态{selectedCount > 0 ? `(${selectedCount})` : ''}
</Button>
<Button
icon={<SyncOutlined />}
disabled={selectedCount === 0 || loading}
onClick={() => void batchQuery()}
>
批量查鱼翅/积分{selectedCount > 0 ? `(${selectedCount})` : ''}
</Button>
<Tooltip title="只刷新鱼翅与手册积分,不查兑换记录,也不会改状态">
<Button
icon={<SyncOutlined />}
disabled={selectedCount === 0 || loading || balanceQuerying}
loading={balanceQuerying}
onClick={() => void batchQueryBalances()}
>
批量查鱼翅/积分{selectedCount > 0 ? `(${selectedCount})` : ''}
</Button>
</Tooltip>
<Tooltip title="查询勾选订单的兑换记录;命中礼包名后自动改状态,积分短缺/超额也会标记">
<Button
icon={<SearchOutlined />}
disabled={selectedCount === 0 || loading || recordQuerying}
loading={recordQuerying}
onClick={() => void batchQueryRecords()}
>
批量查兑换记录{selectedCount > 0 ? `(${selectedCount})` : ''}
</Button>
</Tooltip>
<Button
icon={<InboxOutlined />}
disabled={!canArchiveSelected || loading}
@@ -1552,7 +1610,7 @@ export default function DouyuCollabPage() {
loading={loading}
columns={columns}
dataSource={orders}
scroll={{ x: 2090 }}
scroll={{ x: 2190 }}
rowSelection={{
selectedRowKeys,
onChange: (keys) => setSelectedRowKeys(keys),
@@ -1933,9 +1991,12 @@ export default function DouyuCollabPage() {
<Button icon={<SafetyCertificateOutlined />} onClick={() => void verifyOrder(detail)}>
校验
</Button>
<Button icon={<SyncOutlined />} onClick={() => void queryOrder(detail)}>
<Button icon={<SyncOutlined />} onClick={() => void queryOneBalances(detail)}>
查鱼翅/积分
</Button>
<Button icon={<SearchOutlined />} onClick={() => void queryOneRecords(detail)}>
查兑换记录
</Button>
</Space>
) : undefined
}