feat(weibo): 工作台导入后自动刷新账号资料

This commit is contained in:
yml
2026-11-12 19:38:29 +08:00
parent 275ae7f241
commit aa978a808e
+87 -5
View File
@@ -121,6 +121,11 @@ interface BatchRechargeEntry {
creditError: string;
}
interface ImportRefreshTarget {
id: number;
label: string;
}
function readMallCache(accountId: number): WeiboMallListResult | null {
try {
const raw = localStorage.getItem(WEIBO_MALL_CACHE_KEY);
@@ -332,6 +337,39 @@ export default function WeiboAccountsPage({
void loadKnownTags();
}, [loadKnownTags]);
const refreshImportedAccounts = async (targets: ImportRefreshTarget[]) => {
const uniqueTargets = Array.from(
new Map(targets.map((target) => [target.id, target])).values(),
);
let refreshed = 0;
const failures: string[] = [];
await runWithConcurrency(uniqueTargets, 3, async (target) => {
try {
await weiboApi.refreshAccount(target.id);
refreshed += 1;
} catch (error) {
failures.push(`${target.label}:${getErrorMessage(error)}`);
}
});
return {
total: uniqueTargets.length,
refreshed,
failures,
};
};
const importedRefreshMessage = (
result: Awaited<ReturnType<typeof refreshImportedAccounts>>,
) => {
if (result.total === 0) return '';
if (result.failures.length === 0) {
return `,已自动刷新 ${result.refreshed}/${result.total} 个账号`;
}
return `,已刷新 ${result.refreshed}/${result.total} 个,失败 ${result.failures.length} 个:${result.failures
.slice(0, 3)
.join(';')}`;
};
const handleImport = async () => {
const values = await form.validateFields();
setImporting(true);
@@ -344,11 +382,20 @@ export default function WeiboAccountsPage({
setImportErrors(result.errors);
setImportDuplicates(result.duplicates);
let workbenchError = '';
let refreshResult: Awaited<
ReturnType<typeof refreshImportedAccounts>
> | null = null;
if (isWorkbench && result.accounts.length > 0) {
try {
await weiboApi.addWorkbenchAccounts(
result.accounts.map((account) => account.id),
);
refreshResult = await refreshImportedAccounts(
result.accounts.map((account) => ({
id: account.id,
label: account.nickname || account.uid,
})),
);
} catch (error) {
workbenchError = getErrorMessage(error);
}
@@ -358,8 +405,14 @@ export default function WeiboAccountsPage({
message.warning(
`${result.message},但加入当前工作台失败:${workbenchError}`,
);
} else if (refreshResult?.failures.length) {
message.warning(
`${result.message}${importedRefreshMessage(refreshResult)}`,
);
} else {
message.success(result.message);
message.success(
`${result.message}${refreshResult ? importedRefreshMessage(refreshResult) : ''}`,
);
}
await loadAccounts();
await loadKnownTags();
@@ -430,6 +483,18 @@ export default function WeiboAccountsPage({
text,
isSuperAdmin && forceAddOccupied,
);
const refreshResult = await refreshImportedAccounts(
result.items
.filter(
(item) =>
item.account_id !== null &&
['added', 'forced_added', 'already_added'].includes(item.status),
)
.map((item) => ({
id: item.account_id as number,
label: item.nickname || item.uid || `账号 ${item.account_id}`,
})),
);
setBatchImportResult(result);
await loadAccounts();
await loadKnownTags();
@@ -439,11 +504,15 @@ export default function WeiboAccountsPage({
: '';
if (result.failed > 0) {
message.warning(
`批量导入完成:新增 ${result.added} 个${forceAddSummary},已存在 ${result.already_added} 个,失败 ${result.failed} 个`,
`批量导入完成:新增 ${result.added} 个${forceAddSummary},已存在 ${result.already_added} 个,失败 ${result.failed} 个${importedRefreshMessage(refreshResult)}`,
);
} else if (refreshResult.failures.length > 0) {
message.warning(
`批量导入完成:新增 ${result.added} 个${forceAddSummary},已存在 ${result.already_added} 个${importedRefreshMessage(refreshResult)}`,
);
} else {
message.success(
`批量导入完成:新增 ${result.added} 个${forceAddSummary},已存在 ${result.already_added} 个`,
`批量导入完成:新增 ${result.added} 个${forceAddSummary},已存在 ${result.already_added} 个${importedRefreshMessage(refreshResult)}`,
);
}
} catch (error) {
@@ -461,10 +530,23 @@ export default function WeiboAccountsPage({
setPoolLoading(true);
try {
await weiboApi.addWorkbenchAccounts(poolSelectedIds);
const refreshResult = await refreshImportedAccounts(
poolItems
.filter((item) => poolSelectedIds.includes(item.id))
.map((item) => ({
id: item.id,
label: item.nickname || item.uid,
})),
);
setPoolOpen(false);
setPoolSelectedIds([]);
await loadAccounts();
message.success(`已导入 ${poolSelectedIds.length} 个账号到工作台`);
const successMessage = `已导入 ${poolSelectedIds.length} 个账号到工作台${importedRefreshMessage(refreshResult)}`;
if (refreshResult.failures.length > 0) {
message.warning(successMessage);
} else {
message.success(successMessage);
}
} catch (error) {
message.error(getErrorMessage(error));
} finally {
@@ -2607,7 +2689,7 @@ export default function WeiboAccountsPage({
type="info"
showIcon
title="支持多行、空格、逗号分隔"
description="优先按 UID 精确匹配;也支持微博用户名和角色名。重名时请改用 UID。"
description="优先按 UID 精确匹配;也支持微博用户名和角色名。重名时请改用 UID。导入成功后会立即刷新角色绑定和微豆余额。"
/>
{isSuperAdmin && (
<Checkbox