"use client"; import { useEffect, useMemo, useState } from "react"; import { useQuery, useQueryClient } from "@tanstack/react-query"; import { Alert, Button, Input, Label, Spinner, TextField, toast } from "@heroui/react"; import { Gear, Lock } from "@gravity-ui/icons"; import { useSession } from "@/lib/auth-client"; import { api, type SystemSettings } from "@/lib/api"; const MIN_HEARTBEAT = 10; const MAX_HEARTBEAT = 86400; const DEFAULT_HEARTBEAT = 60; export default function ParametersSettingsPage() { const { data: session } = useSession(); const isAdmin = session?.user?.role === "admin"; const queryClient = useQueryClient(); const { data: settings, isLoading } = useQuery({ queryKey: ["system-settings"], queryFn: () => api.settings.get(), enabled: isAdmin, }); const [heartbeatInterval, setHeartbeatInterval] = useState(String(DEFAULT_HEARTBEAT)); const [saving, setSaving] = useState(false); useEffect(() => { if (!settings) return; setHeartbeatInterval(String(settings.ocpp16j.heartbeatInterval)); }, [settings]); const parsedHeartbeat = useMemo(() => { const n = Number(heartbeatInterval); if (!Number.isFinite(n)) return null; return Math.round(n); }, [heartbeatInterval]); const heartbeatError = parsedHeartbeat === null ? "请输入有效数字" : parsedHeartbeat < MIN_HEARTBEAT || parsedHeartbeat > MAX_HEARTBEAT ? `范围应为 ${MIN_HEARTBEAT} - ${MAX_HEARTBEAT} 秒` : ""; const isDirty = settings ? Number(heartbeatInterval) !== settings.ocpp16j.heartbeatInterval : false; const handleSave = async () => { if (parsedHeartbeat === null) { toast.warning("请输入有效的心跳间隔"); return; } if (parsedHeartbeat < MIN_HEARTBEAT || parsedHeartbeat > MAX_HEARTBEAT) { toast.warning(`心跳间隔范围应为 ${MIN_HEARTBEAT}-${MAX_HEARTBEAT} 秒`); return; } const payload: SystemSettings = { ocpp16j: { heartbeatInterval: parsedHeartbeat }, }; setSaving(true); try { await api.settings.put(payload); toast.success("参数配置已保存"); queryClient.invalidateQueries({ queryKey: ["system-settings"] }); } catch { toast.warning("保存失败,请稍后重试"); } finally { setSaving(false); } }; if (!isAdmin) { return (
需要管理员权限
参数配置仅对管理员开放
按功能模块管理系统参数,变更将影响后续设备交互行为
OCPP 1.6J
协议层行为参数
单位:秒。该值会用于 BootNotification.conf 的 interval 字段,并下发给充电桩默认心跳参数。
{!!heartbeatError && (