export interface BulkReviewItemResult { id: number; ok: boolean; status: string | null; error: string | null; } export interface BulkReviewResult { total: number; success: number; failed: number; items: BulkReviewItemResult[]; } export const BULK_REVIEW_MAX = 50; export function failedReviewIds(result: BulkReviewResult): number[] { return result.items.filter((item) => !item.ok).map((item) => item.id); } export function bulkFailureReasonText(result: BulkReviewResult): string { const reasons = Array.from( new Set( result.items .filter((item) => !item.ok) .map((item) => item.error?.trim()) .filter((reason): reason is string => Boolean(reason)), ), ); if (!reasons.length) return ''; const visible = reasons.slice(0, 3); return `;原因:${visible.join(';')}${reasons.length > visible.length ? ';…' : ''}`; }