import { useEffect, useMemo, useState } from 'react'; import { CalendarDays, Check, Search, X } from 'lucide-react'; import { adminApi, type RiskReviewTask } from '@/api/adminApi'; import { Breadcrumb, Button, Input, Modal, Select, Table, Tag, Textarea, type TableColumn } from '@/components/ui'; const statusLabel: Record = { pending_review: '待审核', approved: '已通过', rejected: '已驳回', }; const statusTone: Record = { pending_review: 'warning', approved: 'success', rejected: 'danger', }; function sourceLabel(sourceType?: string) { return sourceType === 'cmpp_template_mismatch' ? 'CMPP模板不匹配聚合' : '风控审核'; } export function AdminSmsAuditPage() { const [records, setRecords] = useState([]); const [keyword, setKeyword] = useState(''); const [status, setStatus] = useState('pending_review'); const [date, setDate] = useState(''); const [error, setError] = useState(''); const [approveTarget, setApproveTarget] = useState(null); const [rejectTarget, setRejectTarget] = useState(null); const [rejectReason, setRejectReason] = useState(''); const [selectedIds, setSelectedIds] = useState([]); function loadData() { adminApi.listRiskReviewTasks({ status: status === 'all' ? undefined : status }) .then((items) => { setRecords(items); setSelectedIds((current) => current.filter((id) => items.some((item) => item.id === id && item.status === 'pending_review'))); setError(''); }) .catch((failure: Error) => setError(failure.message || '短信审核任务加载失败')); } useEffect(() => { loadData(); }, [status]); const filteredRecords = useMemo( () => records.filter((record) => { const matchesKeyword = !keyword || [record.taskNo, record.content, record.reviewReason, record.rejectReason].join(' ').includes(keyword); const matchesDate = !date || record.createdAt.startsWith(date); return matchesKeyword && matchesDate; }), [date, keyword, records], ); async function approveRecord(record: RiskReviewTask) { await adminApi.approveRiskReviewTask(record.id, '运营审核通过'); setApproveTarget(null); loadData(); } async function approveBatch() { await Promise.all(selectedIds.map((id) => adminApi.approveRiskReviewTask(id, '运营批量审核通过'))); setApproveTarget(null); setSelectedIds([]); loadData(); } async function rejectRecord() { if (!rejectTarget) return; await adminApi.rejectRiskReviewTask(rejectTarget.id, rejectReason || '运营审核驳回'); setRejectTarget(null); setRejectReason(''); loadData(); } const selectableIds = filteredRecords.filter((item) => item.status === 'pending_review').map((item) => item.id); const allSelected = selectableIds.length > 0 && selectableIds.every((id) => selectedIds.includes(id)); const columns: Array> = [ { key: 'selection', title: setSelectedIds(event.target.checked ? selectableIds : [])} type="checkbox" />, width: '54px', render: (record) => setSelectedIds((current) => event.target.checked ? [...new Set([...current, record.id])] : current.filter((id) => id !== record.id))} type="checkbox" />, }, { key: 'taskNo', title: '任务编号', width: '180px', render: (record) => {record.taskNo} }, { key: 'sourceType', title: '审核来源', width: '180px', render: (record) => {sourceLabel(record.sourceType)} }, { key: 'content', title: '短信内容', render: (record) => {record.content} }, { key: 'phoneTotal', title: '聚合号码数', width: '140px', render: (record) => (record._count?.messageRecords ?? record.phoneTotal).toLocaleString('zh-CN') }, { key: 'createdAt', title: '提交时间', width: '190px', render: (record) => record.createdAt }, { key: 'reason', title: '审核原因', render: (record) => record.reviewReason ?? record.rejectReason ?? record.riskHits?.map((item) => item.reason).join(';') ?? '-' }, { key: 'status', title: '状态', width: '130px', render: (record) => {statusLabel[record.status] ?? record.status}, }, { key: 'actions', title: '操作', width: '160px', align: 'right', render: (record) => record.status === 'pending_review' ? (
) : null, }, ]; return (
{error ?

{error}

: null}

筛选条件

setKeyword(event.target.value)} placeholder="请输入任务编号、内容或审核原因" value={keyword} /> setDate(event.target.value)} placeholder="yyyy-mm-dd" prefix={} value={date} />
已选择 {selectedIds.length} 条待审核任务
)} onClose={() => setApproveTarget(null)} open={Boolean(approveTarget)} title="确认通过" >

{approveTarget === 'batch' ? `确认通过已选择的 ${selectedIds.length} 条待审核任务?` : '确认通过该短信审核任务?'}

)} onClose={() => setRejectTarget(null)} open={Boolean(rejectTarget)} title="确认驳回" >