import { useState, useEffect, useCallback } from 'react' import { Gavel, Clock, CheckCircle2, XCircle, Loader2, MessageSquare, X } from 'lucide-react' import { useRole } from '../../context' import { useToast } from '../../context' import { api } from '../../api' import { EmptyState } from '../../components/ui/EmptyState' import type { Appeal } from '../../types' const statusLabels: Record = { pending: { label: '待处理', color: 'amber' }, accepted: { label: '已通过', color: 'emerald' }, rejected: { label: '已驳回', color: 'rose' }, } /** * 申诉复议页面 — 记者提交申诉,分站/总部处理 */ export function AppealsPage() { const { role } = useRole() const { showToast } = useToast() const [appeals, setAppeals] = useState([]) const [loading, setLoading] = useState(true) const [filterStatus, setFilterStatus] = useState('') const [selected, setSelected] = useState(null) const [response, setResponse] = useState('') const [handling, setHandling] = useState(false) const load = useCallback(async () => { setLoading(true) try { const data = await api.appeals.list(role, filterStatus || undefined) setAppeals(data) } catch (err) { showToast(err instanceof Error ? err.message : '加载失败') } finally { setLoading(false) } }, [role, filterStatus, showToast]) useEffect(() => { load() }, [load]) const handleAppeal = async (decision: 'uphold' | 'overturn') => { if (!selected) return setHandling(true) try { await api.appeals.handle(role, selected.id, decision, response) showToast(decision === 'uphold' ? '申诉已驳回' : '申诉已通过') setSelected(null) setResponse('') load() } catch (err) { showToast(err instanceof Error ? err.message : '操作失败') } finally { setHandling(false) } } return (

申诉复议

对审核结果有异议的工作记录进行申诉与复议
{loading ? (
) : appeals.length === 0 ? ( ) : (
{appeals.map(a => { const st = statusLabels[a.status] || statusLabels.pending return (
{ setSelected(a); setResponse('') }}>
{a.code} {st.label}
申诉人:{a.appellant} 站点:{a.station} 记录ID:{a.recordId}
{a.reason}
{a.response && (
处理意见:{a.response}
)}
提交于 {a.createdAt} {a.handledAt && 处理于 {a.handledAt}} {a.handler && 处理人:{a.handler}}
) })}
)} {selected && (
{ setSelected(null); setResponse('') }}>
e.stopPropagation()} style={{ maxWidth: 520 }}>

申诉详情 — {selected.code}

申诉人:{selected.appellant}({selected.station})
记录ID:{selected.recordId}
申诉原因:{selected.reason}
状态:{statusLabels[selected.status]?.label}
{selected.response &&
处理意见:{selected.response}
} {selected.handler &&
处理人:{selected.handler}
}
提交时间:{selected.createdAt}
{selected.handledAt &&
处理时间:{selected.handledAt}
}
{role !== 'reporter' && selected.status === 'pending' && ( <>