import { useEffect, useRef, useState } from 'react'; import { createPortal } from 'react-dom'; import { X, Search, ChevronLeft, ChevronRight } from 'lucide-react'; import { useDialogFocus } from '../components/useDialogFocus'; import { HISTORY_STATE_LABELS, historyTime, type HistoryCategory, type HistoryDetails, type HistoryPoint } from '../../../shared/assets/history'; import { fetchHistoryDetails } from './api'; import { displayHistoryCounts } from './presentation'; export function HistoryDetailsDialog({ point, subject, close }: { point: HistoryPoint; subject: string | null; close: () => void }) { const ref = useRef(null); const [category, setCategory] = useState('all'); const [search, setSearch] = useState(''); const [query, setQuery] = useState(''); const [page, setPage] = useState(1); const [data, setData] = useState(null); const [error, setError] = useState(''); const [loading, setLoading] = useState(true); const [retry, setRetry] = useState(0); useDialogFocus(true, ref, close); useEffect(() => { const timer = setTimeout(() => { setQuery(search.trim()); setPage(1); }, 250); return () => clearTimeout(timer); }, [search]); useEffect(() => { const abort = new AbortController(); setLoading(true); setError(''); setData(null); fetchHistoryDetails(point.month, point.batchId, subject, category, query, page, abort.signal) .then(result => { if (!abort.signal.aborted) setData(result); }) .catch(e => { if (!abort.signal.aborted) setError(e instanceof Error ? e.message : '明细加载失败'); }) .finally(() => { if (!abort.signal.aborted) setLoading(false); }); return () => abort.abort(); }, [point.month, point.batchId, subject, category, query, page, retry]); const pages = data ? Math.max(1, Math.ceil(data.total / data.pageSize)) : 1; return createPortal(
{ if (e.target === e.currentTarget) close(); }}>

{point.month.replace('-', '年')}月资产明细

{subject || '全部公司'} · {HISTORY_STATE_LABELS[point.state]} · {point.reconstruction ? '参考时点' : point.state === 'ARCHIVED' ? '快照' : '截至'} {historyTime(point.reconstruction ? point.scheduledFor : data?.point.asOf || point.asOf)}

{loading ?

正在加载月度明细…

: error ?

{error}

: data && <>

{data.point.reconstruction ? '以下为核对表中的交还记录推算车辆,归属未知项留空。历史总数待核实,不能将两类相加当作历史资产总数。' : data.point.state === 'ARCHIVED' ? '以下为当时归档的车辆及归属信息。' : '以下为最新实时明细,数量可能随业务更新。'} 当前范围:总数 {displayHistoryCounts(data.point)?.total ?? '待核实'} · 运营 {displayHistoryCounts(data.point)?.operating} · 库存 {displayHistoryCounts(data.point)?.inventory}

{data.items.length ? <>
{data.items.map(item => )}
车辆分类公司 / 部门负责人 / 客户
{item.plateNumber || '未登记车牌'}{item.model}VIN:{item.vin || '未提供'}{item.reconstructionBasis && 推算依据:{item.reconstructionBasis}} {item.disposition === 'operating' ? '运营' : '库存'}{item.subjectOrg || '未提供'}{item.departmentName || (item.reconstructionBasis ? '历史未提供' : '未分配部门')} {item.customerManager || (item.reconstructionBasis ? '历史未提供' : '未分配')}{item.customerName || (item.reconstructionBasis ? '历史未提供' : '无客户信息')}{item.contractNo || ''}
{data.items.map(item =>
{item.plateNumber || '未登记车牌'}{item.disposition === 'operating' ? '运营' : '库存'}

{item.model}

VIN:{item.vin || '未提供'} {item.reconstructionBasis && 推算依据:{item.reconstructionBasis}}
公司 / 部门
{item.subjectOrg || '未提供'}{item.departmentName || (item.reconstructionBasis ? '历史未提供' : '未分配部门')}
负责人 / 客户
{item.customerManager || (item.reconstructionBasis ? '历史未提供' : '未分配')}{item.customerName || (item.reconstructionBasis ? '历史未提供' : '无客户信息')}
{item.contractNo && 合同:{item.contractNo}}
)}
:

当前条件下没有车辆

} }
, document.body); }