import { useEffect, useMemo, useState } from 'react'; import { Check, Eye, Search, X } from 'lucide-react'; import { adminApi, type FileRef, type SmsDrainageInfo } from '@/api/adminApi'; import { AuditReviewInfo, Breadcrumb, Button, FileActions, Input, Modal, Select, Table, Tabs, Tag, Textarea, type TableColumn } from '@/components/ui'; import { formatDateTime } from '@/utils/dateTime'; import { ReportImportAuditPanel } from './ReportImportAuditPanel'; const statusMeta: Record = { pending: { label: '待审核', tone: 'info' }, approved: { label: '已通过', tone: 'success' }, rejected: { label: '已驳回', tone: 'danger' }, deleted: { label: '已删除', tone: 'neutral' }, }; function fileRef(value: unknown): FileRef | null { if (!value || typeof value !== 'object' || Array.isArray(value)) return null; const item = value as Record; const fileObjectId = String(item.fileObjectId ?? ''); const fileName = String(item.fileName ?? ''); return fileObjectId && fileName ? { fileObjectId, fileName, contentType: item.contentType ? String(item.contentType) : undefined } : null; } function DrainageDetail({ item, onClose }: { item: SmsDrainageInfo; onClose: () => void }) { const values = item.reportValues && typeof item.reportValues === 'object' ? item.reportValues : {}; const meta = statusMeta[item.auditStatus] ?? { label: item.auditStatus, tone: 'neutral' as const }; return 关闭} onClose={onClose} open size="xl" title="引流信息审核详情">
企业{item.tenant?.name ?? item.tenantId}
应用{item.application?.name ?? '-'}
所属签名{item.signature?.name ?? item.signatureId}
审核状态{meta.label}
站名称{item.siteName}
引流地址{item.url}
提交时间{formatDateTime(item.submittedAt)}
备注{item.remark || '-'}
{item.rejectReason ?
驳回原因{item.rejectReason}
: null}
通道动态报备资料
{Object.keys(values).length ? Object.entries(values).map(([key, value]) => { const file = fileRef(value); return
{key}{file ? : String(value ?? '-')}
; }) : }
; } export function AdminDrainageAuditPage() { const [items, setItems] = useState([]); const [keyword, setKeyword] = useState(''); const [status, setStatus] = useState('pending'); const [detail, setDetail] = useState(); const [rejectTarget, setRejectTarget] = useState(); const [reason, setReason] = useState(''); const [error, setError] = useState(''); function loadData() { adminApi.listDrainageInfos({ keyword, status: status === 'all' ? undefined : status }) .then((records) => { setItems(records); setError(''); }) .catch((failure: Error) => setError(failure.message || '引流信息审核列表加载失败')); } useEffect(loadData, [keyword, status]); async function approve(item: SmsDrainageInfo) { try { await adminApi.approveDrainageInfo(item.id); loadData(); } catch (failure) { setError(failure instanceof Error ? failure.message : '引流信息审核通过失败'); } } async function reject() { if (!rejectTarget || !reason.trim()) return; try { await adminApi.rejectDrainageInfo(rejectTarget.id, reason.trim()); setRejectTarget(undefined); setReason(''); loadData(); } catch (failure) { setError(failure instanceof Error ? failure.message : '引流信息审核驳回失败'); } } const columns = useMemo>>(() => [ { key: 'siteName', title: '站名称/引流地址', render: (record) =>
{record.siteName}{record.url}
}, { key: 'signature', title: '所属签名', render: (record) => record.signature?.name ?? record.signatureId }, { key: 'tenant', title: '企业/应用', render: (record) =>
{record.tenant?.name ?? record.tenantId}{record.application?.name ?? '-'}
}, { key: 'submittedAt', title: '提交时间', render: (record) => formatDateTime(record.submittedAt) }, { key: 'status', title: '状态', render: (record) => { const meta = statusMeta[record.auditStatus] ?? { label: record.auditStatus, tone: 'neutral' as const }; return {meta.label}; } }, { key: 'actions', title: '操作', align: 'right', render: (record) =>
}, ], []); return

引流信息审核

{error ?

{error}

: null}
setKeyword(event.target.value)} placeholder="搜索企业、应用、签名、站点或网址" prefix={} value={keyword} />