diff --git a/src/app/telemetry/page.tsx b/src/app/telemetry/page.tsx index a6deaa3..d755b39 100644 --- a/src/app/telemetry/page.tsx +++ b/src/app/telemetry/page.tsx @@ -11,6 +11,16 @@ import Loading from '@/components/Loading' // زمان به‌روزرسانی خودکار (به میلی‌ثانیه) - می‌توانید این مقدار را تغییر دهید const AUTO_REFRESH_INTERVAL = 10 * 1000 // 10 ثانیه +type TimeRange = '1day' | '1hour' | '2hours' | '6hours' | '10hours' + +const TIME_RANGE_OPTIONS: { value: TimeRange; label: string }[] = [ + { value: '1day', label: 'یک روز' }, + { value: '1hour', label: 'یک ساعت اخیر' }, + { value: '2hours', label: 'دو ساعت اخیر' }, + { value: '6hours', label: '۶ ساعت اخیر' }, + { value: '10hours', label: '۱۰ ساعت اخیر' } +] + function useQueryParam(name: string) { if (typeof window === 'undefined') return null as string | null return new URLSearchParams(window.location.search).get(name) @@ -21,6 +31,7 @@ export default function TelemetryPage() { const [total, setTotal] = useState(0) const [loading, setLoading] = useState(true) const [lastUpdate, setLastUpdate] = useState(null) + const [timeRange, setTimeRange] = useState('1day') const deviceId = Number(useQueryParam('deviceId') ?? '1') const dateParam = useQueryParam('date') ?? `${getCurrentPersianYear()}/${getCurrentPersianMonth()}/${getCurrentPersianDay()}` const intervalRef = useRef(null) @@ -48,15 +59,43 @@ export default function TelemetryPage() { } try { - const [year, month, day] = selectedDate.split('/').map(Number) - const startDate = persianToGregorian(year, month, day) - startDate.setHours(0, 0, 0, 0) - const endDate = new Date(startDate) - endDate.setHours(23, 59, 59, 999) + let startDate: Date + let endDate: Date + + if (timeRange === '1day') { + // برای یک روز، از تاریخ انتخابی استفاده می‌کنیم + const [year, month, day] = selectedDate.split('/').map(Number) + startDate = persianToGregorian(year, month, day) + startDate.setHours(0, 0, 0, 0) + endDate = new Date(startDate) + endDate.setHours(23, 59, 59, 999) + } else { + // برای بازه‌های زمانی دیگر، از زمان فعلی به عقب می‌رویم + endDate = new Date() + const now = new Date() + + switch (timeRange) { + case '1hour': + startDate = new Date(now.getTime() - 60 * 60 * 1000) + break + case '2hours': + startDate = new Date(now.getTime() - 2 * 60 * 60 * 1000) + break + case '6hours': + startDate = new Date(now.getTime() - 6 * 60 * 60 * 1000) + break + case '10hours': + startDate = new Date(now.getTime() - 10 * 60 * 60 * 1000) + break + default: + startDate = new Date(now.getTime() - 24 * 60 * 60 * 1000) + } + } + const startUtc = startDate.toISOString() const endUtc = endDate.toISOString() - const result = await api.listTelemetry({ deviceId, startUtc, endUtc }) + const result = await api.listTelemetry({ deviceId, startUtc, endUtc, pageSize: 100000 }) setTelemetry(result.items) setTotal(result.totalCount) setLastUpdate(new Date()) @@ -67,7 +106,7 @@ export default function TelemetryPage() { setLoading(false) } } - }, [deviceId, selectedDate]) + }, [deviceId, selectedDate, timeRange]) // بارگذاری اولیه useEffect(() => { @@ -97,13 +136,13 @@ export default function TelemetryPage() { }, [selectedDate, loadData]) const sortedTelemetry = useMemo(() => { - return [...telemetry].sort((a, b) => new Date(a.timestampUtc).getTime() - new Date(b.timestampUtc).getTime()) + return [...telemetry].sort((a, b) => new Date(a.serverTimestampUtc).getTime() - new Date(b.serverTimestampUtc).getTime()) }, [telemetry]) // تبدیل timestamp به ساعت (HH:MM:SS) const labels = useMemo(() => { return sortedTelemetry.map(t => { - const date = new Date(t.timestampUtc) + const date = new Date(t.serverTimestampUtc) const hours = date.getHours().toString().padStart(2, '0') const minutes = date.getMinutes().toString().padStart(2, '0') const seconds = date.getSeconds().toString().padStart(2, '0') @@ -150,7 +189,7 @@ export default function TelemetryPage() { بازگشت به تقویم -
+
@@ -166,15 +205,28 @@ export default function TelemetryPage() { )}
- +
+ + +
@@ -188,16 +240,44 @@ export default function TelemetryPage() {
- + - - + + + + + - + - +
diff --git a/src/components/Charts.tsx b/src/components/Charts.tsx index a7135fd..aa4df53 100644 --- a/src/components/Charts.tsx +++ b/src/components/Charts.tsx @@ -25,6 +25,8 @@ type Props = { labels: string[] series: Series[] title?: string + yAxisMin?: number + yAxisMax?: number } export function Panel({ title, children }: { title: string; children: React.ReactNode }) { @@ -40,7 +42,7 @@ export function Panel({ title, children }: { title: string; children: React.Reac ) } -export function LineChart({ labels, series }: Props) { +export function LineChart({ labels, series, yAxisMin, yAxisMax }: Props) { return (
{children}
+ return
{children}
} export function Card({ title, value, subtitle, icon, color }: CardProps) { diff --git a/src/lib/api.ts b/src/lib/api.ts index c934a38..7bb7b4b 100644 --- a/src/lib/api.ts +++ b/src/lib/api.ts @@ -24,6 +24,7 @@ export type TelemetryDto = { persianMonth: number persianDate: string deviceName?: string + serverTimestampUtc?: string } export type DeviceSettingsDto = {