|
|
|
|
@@ -9,10 +9,10 @@ import { createMileageExportStream, type MileageExportStream } from '../domain/m
|
|
|
|
|
import { formatZhNumber } from '../domain/formatters';
|
|
|
|
|
import { InlineError, PanelEmpty, PanelLoading } from '../shared/AsyncState';
|
|
|
|
|
import { MonitorReturnBar } from '../shared/MonitorReturnBar';
|
|
|
|
|
import { MobileFilterToggle } from '../shared/MobileFilterToggle';
|
|
|
|
|
import { TablePagination } from '../shared/TablePagination';
|
|
|
|
|
import { VehicleCandidateList } from '../shared/VehicleCandidateList';
|
|
|
|
|
import { mergeVehicleCandidates } from '../shared/vehicleCandidates';
|
|
|
|
|
import { WorkspaceFilterPanel } from '../shared/WorkspaceFilterPanel';
|
|
|
|
|
import { WorkspacePanelHeader } from '../shared/WorkspacePanelHeader';
|
|
|
|
|
import { QUERY_MEMORY, retainPreviousPageWithinScope } from '../queryPolicy';
|
|
|
|
|
import { monitorReturnFromParams, preserveMonitorReturn } from '../routing/monitorContext';
|
|
|
|
|
@@ -486,8 +486,17 @@ export default function StatisticsPage() {
|
|
|
|
|
|
|
|
|
|
return <div className="v2-mileage-page" ref={pageRef}>
|
|
|
|
|
<MonitorReturnBar />
|
|
|
|
|
<Card className="v2-mileage-query-panel" bodyStyle={{ padding: 0 }}>
|
|
|
|
|
<MobileFilterToggle title="查询条件" summary={criteria.vehicles.length ? `已选 ${criteria.vehicles.length} 辆 · ${inclusiveDays(criteria.dateFrom, criteria.dateTo)} 天` : `全部车辆 · ${inclusiveDays(criteria.dateFrom, criteria.dateTo)} 天`} expanded={!filtersCollapsed} collapsedLabel="修改" onToggle={() => setFiltersCollapsed((value) => !value)} />
|
|
|
|
|
<WorkspaceFilterPanel
|
|
|
|
|
className="v2-mileage-query-panel"
|
|
|
|
|
title="里程范围"
|
|
|
|
|
description="车牌、自然日与里程数据源策略"
|
|
|
|
|
mobileSummary={criteria.vehicles.length ? `已选 ${criteria.vehicles.length} 辆 · ${inclusiveDays(criteria.dateFrom, criteria.dateTo)} 天` : `全部车辆 · ${inclusiveDays(criteria.dateFrom, criteria.dateTo)} 天`}
|
|
|
|
|
expanded={!filtersCollapsed}
|
|
|
|
|
status={`${criteria.vehicles.length ? `${criteria.vehicles.length} 辆` : '全部授权车辆'} · ${inclusiveDays(criteria.dateFrom, criteria.dateTo)} 天`}
|
|
|
|
|
statusColor={criteria.vehicles.length ? 'blue' : 'grey'}
|
|
|
|
|
collapsedLabel="修改"
|
|
|
|
|
onToggle={() => setFiltersCollapsed((value) => !value)}
|
|
|
|
|
>
|
|
|
|
|
<form className={`v2-mileage-filter${filtersCollapsed ? ' is-mobile-collapsed' : ''}`} onSubmit={submit}>
|
|
|
|
|
<VehicleMultiSelect value={draft.vehicles} onChange={(vehicles) => setDraft((current) => ({ ...current, vehicles }))} />
|
|
|
|
|
<label><span>开始日期</span><Input aria-label="开始日期" type="date" value={draft.dateFrom} max={draft.dateTo} onChange={(value) => setDraft((current) => ({ ...current, dateFrom: value }))} /></label>
|
|
|
|
|
@@ -498,13 +507,13 @@ export default function StatisticsPage() {
|
|
|
|
|
</form>
|
|
|
|
|
{validationError || criteriaError ? <p className="v2-mileage-validation" role="alert">{validationError || criteriaError}</p> : null}
|
|
|
|
|
<SummaryRail data={statistics.data} criteria={criteria} fleetTotal={fleetVehicles.data?.total} loading={statistics.isLoading} />
|
|
|
|
|
</Card>
|
|
|
|
|
</WorkspaceFilterPanel>
|
|
|
|
|
{statistics.isError || mileage.isError || fleetVehicles.isError ? <InlineError message={(statistics.error ?? mileage.error ?? fleetVehicles.error) instanceof Error ? (statistics.error ?? mileage.error ?? fleetVehicles.error as Error).message : '里程数据加载失败'} onRetry={() => { statistics.refetch(); mileage.refetch(); if (!hasVehicles) fleetVehicles.refetch(); }} /> : null}
|
|
|
|
|
<Card className="v2-mileage-results" bodyStyle={{ padding: 0 }}>
|
|
|
|
|
<WorkspacePanelHeader
|
|
|
|
|
title="车辆每日里程"
|
|
|
|
|
description={`${criteria.dateFrom} 至 ${criteria.dateTo}`}
|
|
|
|
|
meta={`${hasVehicles ? `${totalVehicles} 辆车` : `当前 ${displayVehicles.length} 辆 / 共 ${totalVehicles} 辆`} · ${dates.length} 个自然日`}
|
|
|
|
|
meta={<span className="v2-workspace-result-meta"><Tag color="blue" type="light" size="small">{hasVehicles ? `${totalVehicles} 辆` : `${displayVehicles.length} / ${totalVehicles} 辆`}</Tag><span>{dates.length} 个自然日</span></span>}
|
|
|
|
|
actionsClassName="v2-mileage-result-actions"
|
|
|
|
|
actions={<><Button className="is-refresh" theme="borderless" aria-label="刷新里程数据" icon={<IconRefresh />} onClick={() => { statistics.refetch(); mileage.refetch(); if (!hasVehicles) fleetVehicles.refetch(); }} disabled={refreshing}>{refreshing ? '更新中' : '刷新'}</Button><Button theme="light" aria-label={isExporting ? '取消导出' : '导出 Excel'} icon={isExporting ? <IconClose /> : <IconDownload />} onClick={isExporting ? cancelExport : exportExcel} disabled={!totalVehicles || Boolean(criteriaError)}>{isExporting ? '取消导出' : '导出 Excel'}</Button></>}
|
|
|
|
|
/>
|
|
|
|
|
|