|
|
@@ -1,787 +1,1031 @@
|
|
|
"use client"
|
|
|
-
|
|
|
+// 在文件顶部导入 useMemo
|
|
|
import {useState} from "react"
|
|
|
import {
|
|
|
- Alert,
|
|
|
- Badge,
|
|
|
- Button,
|
|
|
- Card,
|
|
|
- Col,
|
|
|
- Form,
|
|
|
- Input,
|
|
|
- Layout,
|
|
|
- Menu,
|
|
|
- message,
|
|
|
- Modal,
|
|
|
- Row,
|
|
|
- Select,
|
|
|
- Space,
|
|
|
- Statistic,
|
|
|
- Table,
|
|
|
- Tabs,
|
|
|
- Tag,
|
|
|
+ Badge,
|
|
|
+ Button,
|
|
|
+ Card,
|
|
|
+ Col,
|
|
|
+ Form,
|
|
|
+ Input,
|
|
|
+ Layout,
|
|
|
+ Menu,
|
|
|
+ message,
|
|
|
+ Modal,
|
|
|
+ Row,
|
|
|
+ Select,
|
|
|
+ Space,
|
|
|
+ Statistic,
|
|
|
+ Table,
|
|
|
+ Tabs,
|
|
|
+ Tag,
|
|
|
} from "antd"
|
|
|
import {
|
|
|
- AlertOutlined,
|
|
|
- BarChartOutlined,
|
|
|
- DashboardOutlined,
|
|
|
- EditOutlined,
|
|
|
- EnvironmentOutlined,
|
|
|
- EyeOutlined,
|
|
|
- PlusOutlined,
|
|
|
- SettingOutlined,
|
|
|
+ AlertOutlined,
|
|
|
+ BarChartOutlined,
|
|
|
+ DashboardOutlined,
|
|
|
+ DatabaseOutlined,
|
|
|
+ EditOutlined,
|
|
|
+ EyeOutlined,
|
|
|
+ HomeOutlined,
|
|
|
+ PlusOutlined,
|
|
|
+ SettingOutlined
|
|
|
} from "@ant-design/icons"
|
|
|
import dynamic from "next/dynamic"
|
|
|
import EChart from "@/components/echarts"
|
|
|
import GisMapBaidu from "@/components/gisMapBaidu";
|
|
|
+import GisMapJinggai from "@/components/GISModule/gisMapJinggai";
|
|
|
+import PicEcharts from "@/components/GISModule/PicEcharts";
|
|
|
+import BarChart from "@/components/GISModule/eqClassIficationEcharts";
|
|
|
+import Dtxxdata from "@/components/GISModule/Dtxxdata";
|
|
|
+import Sbledata from "@/components/GISModule/Sbledata";
|
|
|
+import DbgdData from "@/components/GISModule/DbgdData";
|
|
|
+import SbqyxxData from "@/components/GISModule/SbqyxxData";
|
|
|
+
|
|
|
+//实时监测-实时监测一张图
|
|
|
+import RTMMGis from "@/components/realTimeMontorModule/RTMMGis";
|
|
|
|
|
|
-const { Header, Sider, Content } = Layout
|
|
|
-const { TabPane } = Tabs
|
|
|
-const { Option } = Select
|
|
|
+const {Header, Sider, Content} = Layout
|
|
|
+const {TabPane} = Tabs
|
|
|
+const {Option} = Select
|
|
|
|
|
|
// 动态导入地图组件避免SSR问题
|
|
|
-const MapView = dynamic(() => import("./components/map-view"), { ssr: false })
|
|
|
+const MapView = dynamic(() => import("./components/map-view"), {ssr: false})
|
|
|
+
|
|
|
|
|
|
export default function ManholeMonitoringSystem() {
|
|
|
- const [selectedMenu, setSelectedMenu] = useState("dashboard")
|
|
|
- const [deviceModalVisible, setDeviceModalVisible] = useState(false)
|
|
|
- const [selectedDevice, setSelectedDevice] = useState(null)
|
|
|
- const [addDeviceModalVisible, setAddDeviceModalVisible] = useState(false)
|
|
|
- const [editDeviceModalVisible, setEditDeviceModalVisible] = useState(false)
|
|
|
- const [editingDevice, setEditingDevice] = useState(null)
|
|
|
- const [devices, setDevices] = useState([
|
|
|
- {
|
|
|
- id: 1,
|
|
|
- name: "设备001",
|
|
|
- type: "智能井盖",
|
|
|
- status: "normal",
|
|
|
- location: "朝阳区建国路",
|
|
|
- lat: 39.9042,
|
|
|
- lng: 116.4074,
|
|
|
- battery: 85,
|
|
|
- signal: 90,
|
|
|
- },
|
|
|
- {
|
|
|
- id: 2,
|
|
|
- name: "设备002",
|
|
|
- type: "智能井盖",
|
|
|
- status: "warning",
|
|
|
- location: "海淀区中关村",
|
|
|
- lat: 39.9826,
|
|
|
- lng: 116.3186,
|
|
|
- battery: 45,
|
|
|
- signal: 75,
|
|
|
- },
|
|
|
- {
|
|
|
- id: 3,
|
|
|
- name: "设备003",
|
|
|
- type: "智能井盖",
|
|
|
- status: "error",
|
|
|
- location: "西城区金融街",
|
|
|
- lat: 39.926,
|
|
|
- lng: 116.3663,
|
|
|
- battery: 20,
|
|
|
- signal: 60,
|
|
|
- },
|
|
|
- {
|
|
|
- id: 4,
|
|
|
- name: "设备004",
|
|
|
- type: "智能井盖",
|
|
|
- status: "normal",
|
|
|
- location: "东城区王府井",
|
|
|
- lat: 39.9097,
|
|
|
- lng: 116.4109,
|
|
|
- battery: 92,
|
|
|
- signal: 95,
|
|
|
- },
|
|
|
- {
|
|
|
- id: 5,
|
|
|
- name: "设备005",
|
|
|
- type: "智能井盖",
|
|
|
- status: "maintenance",
|
|
|
- location: "丰台区丽泽",
|
|
|
- lat: 39.8584,
|
|
|
- lng: 116.3135,
|
|
|
- battery: 78,
|
|
|
- signal: 80,
|
|
|
- },
|
|
|
- ])
|
|
|
- const [alerts, setAlerts] = useState([
|
|
|
- {
|
|
|
- id: 1,
|
|
|
- deviceName: "设备002",
|
|
|
- type: "位移异常",
|
|
|
- level: "warning",
|
|
|
- time: "2024-01-15 14:30:25",
|
|
|
- location: "海淀区中关村",
|
|
|
- status: "pending", // pending, processed, ignored
|
|
|
- },
|
|
|
- {
|
|
|
- id: 2,
|
|
|
- deviceName: "设备003",
|
|
|
- type: "电池电压低",
|
|
|
- level: "error",
|
|
|
- time: "2024-01-15 14:25:10",
|
|
|
- location: "西城区金融街",
|
|
|
- status: "pending",
|
|
|
- },
|
|
|
- {
|
|
|
- id: 3,
|
|
|
- deviceName: "设备001",
|
|
|
- type: "震动异常",
|
|
|
- level: "info",
|
|
|
- time: "2024-01-15 14:20:15",
|
|
|
- location: "朝阳区建国路",
|
|
|
- status: "processed",
|
|
|
- },
|
|
|
- ])
|
|
|
-
|
|
|
- const [addDeviceForm] = Form.useForm()
|
|
|
- const [editDeviceForm] = Form.useForm()
|
|
|
-
|
|
|
- const handleAddDevice = (values: any) => {
|
|
|
- const newDevice = {
|
|
|
- id: devices.length + 1,
|
|
|
- name: values.name,
|
|
|
- type: values.type,
|
|
|
- status: values.status,
|
|
|
- location: values.location,
|
|
|
- lat: Number.parseFloat(values.lat),
|
|
|
- lng: Number.parseFloat(values.lng),
|
|
|
- battery: Number.parseInt(values.battery),
|
|
|
- signal: Number.parseInt(values.signal),
|
|
|
- }
|
|
|
- setDevices([...devices, newDevice])
|
|
|
- setAddDeviceModalVisible(false)
|
|
|
- addDeviceForm.resetFields()
|
|
|
- message.success("设备添加成功!")
|
|
|
- }
|
|
|
-
|
|
|
- const handleEditDevice = (values: any) => {
|
|
|
- const updatedDevices = devices.map((device) =>
|
|
|
- device.id === editingDevice.id
|
|
|
- ? {
|
|
|
- ...device,
|
|
|
- ...values,
|
|
|
- lat: Number.parseFloat(values.lat),
|
|
|
- lng: Number.parseFloat(values.lng),
|
|
|
- battery: Number.parseInt(values.battery),
|
|
|
- signal: Number.parseInt(values.signal),
|
|
|
+ const [selectedMenu, setSelectedMenu] = useState("home")
|
|
|
+ const [deviceModalVisible, setDeviceModalVisible] = useState(false)
|
|
|
+
|
|
|
+ const [selectedDevice, setSelectedDevice] = useState(null)
|
|
|
+ const [addDeviceModalVisible, setAddDeviceModalVisible] = useState(false)
|
|
|
+ const [editDeviceModalVisible, setEditDeviceModalVisible] = useState(false)
|
|
|
+ const [editingDevice, setEditingDevice] = useState(null)
|
|
|
+
|
|
|
+ const [devices, setDevices] = useState([
|
|
|
+ {
|
|
|
+ id: 1,
|
|
|
+ name: "设备001",
|
|
|
+ type: "智能井盖",
|
|
|
+ status: "normal",
|
|
|
+ location: "朝阳区建国路",
|
|
|
+ lat: 39.9042,
|
|
|
+ lng: 116.4074,
|
|
|
+ battery: 85,
|
|
|
+ signal: 90,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ id: 2,
|
|
|
+ name: "设备002",
|
|
|
+ type: "智能井盖",
|
|
|
+ status: "warning",
|
|
|
+ location: "海淀区中关村",
|
|
|
+ lat: 39.9826,
|
|
|
+ lng: 116.3186,
|
|
|
+ battery: 45,
|
|
|
+ signal: 75,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ id: 3,
|
|
|
+ name: "设备003",
|
|
|
+ type: "智能井盖",
|
|
|
+ status: "error",
|
|
|
+ location: "西城区金融街",
|
|
|
+ lat: 39.926,
|
|
|
+ lng: 116.3663,
|
|
|
+ battery: 20,
|
|
|
+ signal: 60,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ id: 4,
|
|
|
+ name: "设备004",
|
|
|
+ type: "智能井盖",
|
|
|
+ status: "normal",
|
|
|
+ location: "东城区王府井",
|
|
|
+ lat: 39.9097,
|
|
|
+ lng: 116.4109,
|
|
|
+ battery: 92,
|
|
|
+ signal: 95,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ id: 5,
|
|
|
+ name: "设备005",
|
|
|
+ type: "智能井盖",
|
|
|
+ status: "maintenance",
|
|
|
+ location: "丰台区丽泽",
|
|
|
+ lat: 39.8584,
|
|
|
+ lng: 116.3135,
|
|
|
+ battery: 78,
|
|
|
+ signal: 80,
|
|
|
+ },
|
|
|
+ ])
|
|
|
+ const [alerts, setAlerts] = useState([
|
|
|
+ {
|
|
|
+ id: 1,
|
|
|
+ deviceName: "设备002",
|
|
|
+ type: "位移异常",
|
|
|
+ level: "warning",
|
|
|
+ time: "2024-01-15 14:30:25",
|
|
|
+ location: "海淀区中关村",
|
|
|
+ status: "pending", // pending, processed, ignored
|
|
|
+ },
|
|
|
+ {
|
|
|
+ id: 2,
|
|
|
+ deviceName: "设备003",
|
|
|
+ type: "电池电压低",
|
|
|
+ level: "error",
|
|
|
+ time: "2024-01-15 14:25:10",
|
|
|
+ location: "西城区金融街",
|
|
|
+ status: "pending",
|
|
|
+ },
|
|
|
+ {
|
|
|
+ id: 3,
|
|
|
+ deviceName: "设备001",
|
|
|
+ type: "震动异常",
|
|
|
+ level: "info",
|
|
|
+ time: "2024-01-15 14:20:15",
|
|
|
+ location: "朝阳区建国路",
|
|
|
+ status: "processed",
|
|
|
+ },
|
|
|
+ ])
|
|
|
+
|
|
|
+ const [addDeviceForm] = Form.useForm()
|
|
|
+ const [editDeviceForm] = Form.useForm()
|
|
|
+
|
|
|
+ const handleAddDevice = (values: any) => {
|
|
|
+ const newDevice = {
|
|
|
+ id: devices.length + 1,
|
|
|
+ name: values.name,
|
|
|
+ type: values.type,
|
|
|
+ status: values.status,
|
|
|
+ location: values.location,
|
|
|
+ lat: Number.parseFloat(values.lat),
|
|
|
+ lng: Number.parseFloat(values.lng),
|
|
|
+ battery: Number.parseInt(values.battery),
|
|
|
+ signal: Number.parseInt(values.signal),
|
|
|
}
|
|
|
- : device,
|
|
|
- )
|
|
|
- setDevices(updatedDevices)
|
|
|
- setEditDeviceModalVisible(false)
|
|
|
- setEditingDevice(null)
|
|
|
- editDeviceForm.resetFields()
|
|
|
- message.success("设备信息更新成功!")
|
|
|
- }
|
|
|
-
|
|
|
- const openEditModal = (device: any) => {
|
|
|
- setEditingDevice(device)
|
|
|
- editDeviceForm.setFieldsValue(device)
|
|
|
- setEditDeviceModalVisible(true)
|
|
|
- }
|
|
|
-
|
|
|
- const handleProcessAlert = (alertId: number) => {
|
|
|
- const updatedAlerts = alerts.map((alert) => (alert.id === alertId ? { ...alert, status: "processed" } : alert))
|
|
|
- setAlerts(updatedAlerts)
|
|
|
- message.success("报警已处理!")
|
|
|
- }
|
|
|
-
|
|
|
- const handleIgnoreAlert = (alertId: number) => {
|
|
|
- const updatedAlerts = alerts.map((alert) => (alert.id === alertId ? { ...alert, status: "ignored" } : alert))
|
|
|
- setAlerts(updatedAlerts)
|
|
|
- message.success("报警已忽略!")
|
|
|
- }
|
|
|
-
|
|
|
- // 设备状态统计
|
|
|
- const deviceStats = {
|
|
|
- total: devices.length,
|
|
|
- normal: devices.filter((d) => d.status === "normal").length,
|
|
|
- warning: devices.filter((d) => d.status === "warning").length,
|
|
|
- error: devices.filter((d) => d.status === "error").length,
|
|
|
- maintenance: devices.filter((d) => d.status === "maintenance").length,
|
|
|
- }
|
|
|
-
|
|
|
- // 区域分布图表配置
|
|
|
- const regionChartOption = {
|
|
|
- title: { text: "设备区域分布", left: "center" },
|
|
|
- tooltip: { trigger: "item" },
|
|
|
- series: [
|
|
|
- {
|
|
|
- type: "pie",
|
|
|
- radius: "50%",
|
|
|
- data: [
|
|
|
- { value: 1, name: "朝阳区" },
|
|
|
- { value: 1, name: "海淀区" },
|
|
|
- { value: 1, name: "西城区" },
|
|
|
- { value: 1, name: "东城区" },
|
|
|
- { value: 1, name: "丰台区" },
|
|
|
+ setDevices([...devices, newDevice])
|
|
|
+ setAddDeviceModalVisible(false)
|
|
|
+ addDeviceForm.resetFields()
|
|
|
+ message.success("设备添加成功!")
|
|
|
+ }
|
|
|
+
|
|
|
+ const handleEditDevice = (values: any) => {
|
|
|
+ const updatedDevices = devices.map((device) =>
|
|
|
+ device.id === editingDevice.id
|
|
|
+ ? {
|
|
|
+ ...device,
|
|
|
+ ...values,
|
|
|
+ lat: Number.parseFloat(values.lat),
|
|
|
+ lng: Number.parseFloat(values.lng),
|
|
|
+ battery: Number.parseInt(values.battery),
|
|
|
+ signal: Number.parseInt(values.signal),
|
|
|
+ }
|
|
|
+ : device,
|
|
|
+ )
|
|
|
+ setDevices(updatedDevices)
|
|
|
+ setEditDeviceModalVisible(false)
|
|
|
+ setEditingDevice(null)
|
|
|
+ editDeviceForm.resetFields()
|
|
|
+ message.success("设备信息更新成功!")
|
|
|
+ }
|
|
|
+
|
|
|
+ const openEditModal = (device: any) => {
|
|
|
+ setEditingDevice(device)
|
|
|
+ editDeviceForm.setFieldsValue(device)
|
|
|
+ setEditDeviceModalVisible(true)
|
|
|
+ }
|
|
|
+
|
|
|
+ const handleProcessAlert = (alertId: number) => {
|
|
|
+ const updatedAlerts = alerts.map((alert) => (alert.id === alertId ? {...alert, status: "processed"} : alert))
|
|
|
+ setAlerts(updatedAlerts)
|
|
|
+ message.success("报警已处理!")
|
|
|
+ }
|
|
|
+
|
|
|
+ const handleIgnoreAlert = (alertId: number) => {
|
|
|
+ const updatedAlerts = alerts.map((alert) => (alert.id === alertId ? {...alert, status: "ignored"} : alert))
|
|
|
+ setAlerts(updatedAlerts)
|
|
|
+ message.success("报警已忽略!")
|
|
|
+ }
|
|
|
+
|
|
|
+ // 设备状态统计
|
|
|
+ const deviceStats = {
|
|
|
+ total: devices.length,
|
|
|
+ normal: devices.filter((d) => d.status === "normal").length,
|
|
|
+ warning: devices.filter((d) => d.status === "warning").length,
|
|
|
+ error: devices.filter((d) => d.status === "error").length,
|
|
|
+ maintenance: devices.filter((d) => d.status === "maintenance").length,
|
|
|
+ }
|
|
|
+
|
|
|
+ // 区域分布图表配置
|
|
|
+ const regionChartOption = {
|
|
|
+ title: {text: "设备区域分布", left: "center"},
|
|
|
+ tooltip: {trigger: "item"},
|
|
|
+ series: [
|
|
|
+ {
|
|
|
+ type: "pie",
|
|
|
+ radius: "50%",
|
|
|
+ data: [
|
|
|
+ {value: 1, name: "朝阳区"},
|
|
|
+ {value: 1, name: "海淀区"},
|
|
|
+ {value: 1, name: "西城区"},
|
|
|
+ {value: 1, name: "东城区"},
|
|
|
+ {value: 1, name: "丰台区"},
|
|
|
+ ],
|
|
|
+ },
|
|
|
],
|
|
|
- },
|
|
|
- ],
|
|
|
- }
|
|
|
-
|
|
|
- // 设备状态分布图表配置
|
|
|
- const statusChartOption = {
|
|
|
- title: { text: "设备状态分布", left: "center" },
|
|
|
- tooltip: { trigger: "item" },
|
|
|
- series: [
|
|
|
- {
|
|
|
- type: "pie",
|
|
|
- radius: "50%",
|
|
|
- data: [
|
|
|
- { value: deviceStats.normal, name: "正常", itemStyle: { color: "#52c41a" } },
|
|
|
- { value: deviceStats.warning, name: "告警", itemStyle: { color: "#faad14" } },
|
|
|
- { value: deviceStats.error, name: "故障", itemStyle: { color: "#f5222d" } },
|
|
|
- { value: deviceStats.maintenance, name: "维修中", itemStyle: { color: "#722ed1" } },
|
|
|
+ }
|
|
|
+
|
|
|
+ // 设备状态分布图表配置
|
|
|
+ const statusChartOption = {
|
|
|
+ title: {text: "设备状态分布", left: "center"},
|
|
|
+ tooltip: {trigger: "item"},
|
|
|
+ series: [
|
|
|
+ {
|
|
|
+ type: "pie",
|
|
|
+ radius: "50%",
|
|
|
+ data: [
|
|
|
+ {value: deviceStats.normal, name: "正常", itemStyle: {color: "#52c41a"}},
|
|
|
+ {value: deviceStats.warning, name: "告警", itemStyle: {color: "#faad14"}},
|
|
|
+ {value: deviceStats.error, name: "故障", itemStyle: {color: "#f5222d"}},
|
|
|
+ {value: deviceStats.maintenance, name: "维修中", itemStyle: {color: "#722ed1"}},
|
|
|
+ ],
|
|
|
+ },
|
|
|
],
|
|
|
- },
|
|
|
- ],
|
|
|
- }
|
|
|
-
|
|
|
- // 实时监测数据图表配置
|
|
|
- const monitoringChartOption = {
|
|
|
- title: { text: "实时监测数据趋势", left: "center" },
|
|
|
- tooltip: { trigger: "axis" },
|
|
|
- legend: { data: ["倾斜角度", "位移距离", "震动强度"], top: 30 },
|
|
|
- xAxis: {
|
|
|
- type: "category",
|
|
|
- data: ["00:00", "04:00", "08:00", "12:00", "16:00", "20:00"],
|
|
|
- },
|
|
|
- yAxis: { type: "value" },
|
|
|
- series: [
|
|
|
- {
|
|
|
- name: "倾斜角度",
|
|
|
- type: "line",
|
|
|
- data: [2.1, 2.3, 2.0, 2.5, 2.8, 2.4],
|
|
|
- itemStyle: { color: "#1890ff" },
|
|
|
- },
|
|
|
- {
|
|
|
- name: "位移距离",
|
|
|
- type: "line",
|
|
|
- data: [0.5, 0.7, 0.4, 0.9, 1.2, 0.8],
|
|
|
- itemStyle: { color: "#52c41a" },
|
|
|
- },
|
|
|
- {
|
|
|
- name: "震动强度",
|
|
|
- type: "line",
|
|
|
- data: [15, 18, 12, 22, 28, 20],
|
|
|
- itemStyle: { color: "#faad14" },
|
|
|
- },
|
|
|
- ],
|
|
|
- }
|
|
|
-
|
|
|
- const deviceColumns = [
|
|
|
- { title: "设备编号", dataIndex: "name", key: "name" },
|
|
|
- { title: "设备类型", dataIndex: "type", key: "type" },
|
|
|
- {
|
|
|
- title: "运维状态",
|
|
|
- dataIndex: "status",
|
|
|
- key: "status",
|
|
|
- render: (status: string) => {
|
|
|
- const statusMap = {
|
|
|
- normal: { color: "success", text: "正常" },
|
|
|
- warning: { color: "warning", text: "告警" },
|
|
|
- error: { color: "error", text: "故障" },
|
|
|
- maintenance: { color: "processing", text: "维修中" },
|
|
|
- }
|
|
|
- const config = statusMap[status as keyof typeof statusMap]
|
|
|
- return <Badge status={config.color as any} text={config.text} />
|
|
|
- },
|
|
|
- },
|
|
|
- { title: "所在位置", dataIndex: "location", key: "location" },
|
|
|
- {
|
|
|
- title: "电池电量",
|
|
|
- dataIndex: "battery",
|
|
|
- key: "battery",
|
|
|
- render: (battery: number) => `${battery}%`,
|
|
|
- },
|
|
|
- {
|
|
|
- title: "信号强度",
|
|
|
- dataIndex: "signal",
|
|
|
- key: "signal",
|
|
|
- render: (signal: number) => `${signal}%`,
|
|
|
- },
|
|
|
- {
|
|
|
- title: "操作",
|
|
|
- key: "action",
|
|
|
- render: (_, record: any) => (
|
|
|
- <Space>
|
|
|
- <Button
|
|
|
- type="link"
|
|
|
- icon={<EyeOutlined />}
|
|
|
- onClick={() => {
|
|
|
- setSelectedDevice(record)
|
|
|
- setDeviceModalVisible(true)
|
|
|
- }}
|
|
|
- >
|
|
|
- 查看
|
|
|
- </Button>
|
|
|
- <Button type="link" icon={<EditOutlined />} onClick={() => openEditModal(record)}>
|
|
|
- 编辑
|
|
|
- </Button>
|
|
|
- </Space>
|
|
|
- ),
|
|
|
- },
|
|
|
- ]
|
|
|
-
|
|
|
- const alertColumns = [
|
|
|
- { title: "设备名称", dataIndex: "deviceName", key: "deviceName" },
|
|
|
- { title: "报警类型", dataIndex: "type", key: "type" },
|
|
|
- {
|
|
|
- title: "报警级别",
|
|
|
- dataIndex: "level",
|
|
|
- key: "level",
|
|
|
- render: (level: string) => {
|
|
|
- const levelMap = {
|
|
|
- info: { color: "blue", text: "信息" },
|
|
|
- warning: { color: "orange", text: "警告" },
|
|
|
- error: { color: "red", text: "严重" },
|
|
|
- }
|
|
|
- const config = levelMap[level as keyof typeof levelMap]
|
|
|
- return <Tag color={config.color}>{config.text}</Tag>
|
|
|
- },
|
|
|
- },
|
|
|
- { title: "报警时间", dataIndex: "time", key: "time" },
|
|
|
- { title: "设备位置", dataIndex: "location", key: "location" },
|
|
|
- {
|
|
|
- title: "状态",
|
|
|
- dataIndex: "status",
|
|
|
- key: "status",
|
|
|
- render: (status: string) => {
|
|
|
- const statusMap = {
|
|
|
- pending: { color: "orange", text: "待处理" },
|
|
|
- processed: { color: "green", text: "已处理" },
|
|
|
- ignored: { color: "gray", text: "已忽略" },
|
|
|
- }
|
|
|
- const config = statusMap[status as keyof typeof statusMap]
|
|
|
- return <Tag color={config.color}>{config.text}</Tag>
|
|
|
- },
|
|
|
- },
|
|
|
- {
|
|
|
- title: "操作",
|
|
|
- key: "action",
|
|
|
- render: (_, record: any) => (
|
|
|
- <Space>
|
|
|
- {record.status === "pending" && (
|
|
|
- <>
|
|
|
- <Button type="link" onClick={() => handleProcessAlert(record.id)}>
|
|
|
- 处理
|
|
|
- </Button>
|
|
|
- <Button type="link" onClick={() => handleIgnoreAlert(record.id)}>
|
|
|
- 忽略
|
|
|
- </Button>
|
|
|
- </>
|
|
|
- )}
|
|
|
- {record.status !== "pending" && <span className="text-gray-400">已处理</span>}
|
|
|
- </Space>
|
|
|
- ),
|
|
|
- },
|
|
|
- ]
|
|
|
-
|
|
|
- const renderContent = () => {
|
|
|
- switch (selectedMenu) {
|
|
|
- case "dashboard":
|
|
|
- return (
|
|
|
- <div className="space-y-6">
|
|
|
- {/* 统计卡片 */}
|
|
|
- <Row gutter={16}>
|
|
|
- <Col span={6}>
|
|
|
- <Card>
|
|
|
- <Statistic title="设备总数" value={deviceStats.total} valueStyle={{ color: "#1890ff" }} />
|
|
|
- </Card>
|
|
|
- </Col>
|
|
|
- <Col span={6}>
|
|
|
- <Card>
|
|
|
- <Statistic title="正常设备" value={deviceStats.normal} valueStyle={{ color: "#52c41a" }} />
|
|
|
- </Card>
|
|
|
- </Col>
|
|
|
- <Col span={6}>
|
|
|
- <Card>
|
|
|
- <Statistic title="告警设备" value={deviceStats.warning} valueStyle={{ color: "#faad14" }} />
|
|
|
- </Card>
|
|
|
- </Col>
|
|
|
- <Col span={6}>
|
|
|
- <Card>
|
|
|
- <Statistic title="故障设备" value={deviceStats.error} valueStyle={{ color: "#f5222d" }} />
|
|
|
- </Card>
|
|
|
- </Col>
|
|
|
- </Row>
|
|
|
-
|
|
|
- {/* 图表展示 */}
|
|
|
- <Row gutter={16}>
|
|
|
- <Col span={12}>
|
|
|
- <Card title="设备区域分布">
|
|
|
- <EChart option={regionChartOption} />
|
|
|
- </Card>
|
|
|
- </Col>
|
|
|
- <Col span={12}>
|
|
|
- <Card title="设备状态分布">
|
|
|
- <EChart option={statusChartOption} />
|
|
|
- </Card>
|
|
|
- </Col>
|
|
|
- </Row>
|
|
|
-
|
|
|
- {/* 实时监测趋势 */}
|
|
|
- <Card title="实时监测数据趋势">
|
|
|
- <EChart option={monitoringChartOption} />
|
|
|
- </Card>
|
|
|
- </div>
|
|
|
- )
|
|
|
+ }
|
|
|
|
|
|
- case "devices":
|
|
|
- return (
|
|
|
- <div className="space-y-6">
|
|
|
- <Card
|
|
|
- title="监测设备台账"
|
|
|
- extra={
|
|
|
- <Button type="primary" icon={<PlusOutlined />} onClick={() => setAddDeviceModalVisible(true)}>
|
|
|
- 添加设备
|
|
|
- </Button>
|
|
|
- }
|
|
|
- >
|
|
|
- <Table columns={deviceColumns} dataSource={devices} rowKey="id" pagination={{ pageSize: 10 }} />
|
|
|
- </Card>
|
|
|
- </div>
|
|
|
- )
|
|
|
+ // 实时监测数据图表配置
|
|
|
+ const monitoringChartOption = {
|
|
|
+ title: {text: "实时监测数据趋势", left: "center"},
|
|
|
+ tooltip: {trigger: "axis"},
|
|
|
+ legend: {data: ["倾斜角度", "位移距离", "震动强度"], top: 30},
|
|
|
+ xAxis: {
|
|
|
+ type: "category",
|
|
|
+ data: ["00:00", "04:00", "08:00", "12:00", "16:00", "20:00"],
|
|
|
+ },
|
|
|
+ yAxis: {type: "value"},
|
|
|
+ series: [
|
|
|
+ {
|
|
|
+ name: "倾斜角度",
|
|
|
+ type: "line",
|
|
|
+ data: [2.1, 2.3, 2.0, 2.5, 2.8, 2.4],
|
|
|
+ itemStyle: {color: "#1890ff"},
|
|
|
+ },
|
|
|
+ {
|
|
|
+ name: "位移距离",
|
|
|
+ type: "line",
|
|
|
+ data: [0.5, 0.7, 0.4, 0.9, 1.2, 0.8],
|
|
|
+ itemStyle: {color: "#52c41a"},
|
|
|
+ },
|
|
|
+ {
|
|
|
+ name: "震动强度",
|
|
|
+ type: "line",
|
|
|
+ data: [15, 18, 12, 22, 28, 20],
|
|
|
+ itemStyle: {color: "#faad14"},
|
|
|
+ },
|
|
|
+ ],
|
|
|
+ }
|
|
|
|
|
|
- case "map":
|
|
|
- return (
|
|
|
- <div className="space-y-6">
|
|
|
- <Card title="监测设备 GIS 一张图">
|
|
|
- <div style={{ height: "600px" }}>
|
|
|
- <GisMapBaidu height={'50'} />
|
|
|
- </div>
|
|
|
- </Card>
|
|
|
- </div>
|
|
|
- )
|
|
|
+ const deviceColumns = [
|
|
|
+ {title: "设备编号", dataIndex: "name", key: "name"},
|
|
|
+ {title: "设备类型", dataIndex: "type", key: "type"},
|
|
|
+ {
|
|
|
+ title: "运维状态",
|
|
|
+ dataIndex: "status",
|
|
|
+ key: "status",
|
|
|
+ render: (status: string) => {
|
|
|
+ const statusMap = {
|
|
|
+ normal: {color: "success", text: "正常"},
|
|
|
+ warning: {color: "warning", text: "告警"},
|
|
|
+ error: {color: "error", text: "故障"},
|
|
|
+ maintenance: {color: "processing", text: "维修中"},
|
|
|
+ }
|
|
|
+ const config = statusMap[status as keyof typeof statusMap]
|
|
|
+ return <Badge status={config.color as any} text={config.text}/>
|
|
|
+ },
|
|
|
+ },
|
|
|
+ {title: "所在位置", dataIndex: "location", key: "location"},
|
|
|
+ {
|
|
|
+ title: "电池电量",
|
|
|
+ dataIndex: "battery",
|
|
|
+ key: "battery",
|
|
|
+ render: (battery: number) => `${battery}%`,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ title: "信号强度",
|
|
|
+ dataIndex: "signal",
|
|
|
+ key: "signal",
|
|
|
+ render: (signal: number) => `${signal}%`,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ title: "操作",
|
|
|
+ key: "action",
|
|
|
+ render: (_, record: any) => (
|
|
|
+ <Space>
|
|
|
+ <Button
|
|
|
+ type="link"
|
|
|
+ icon={<EyeOutlined/>}
|
|
|
+ onClick={() => {
|
|
|
+ setSelectedDevice(record)
|
|
|
+ setDeviceModalVisible(true)
|
|
|
+ }}
|
|
|
+ >
|
|
|
+ 查看
|
|
|
+ </Button>
|
|
|
+ <Button type="link" icon={<EditOutlined/>} onClick={() => openEditModal(record)}>
|
|
|
+ 编辑
|
|
|
+ </Button>
|
|
|
+ </Space>
|
|
|
+ ),
|
|
|
+ },
|
|
|
+ ]
|
|
|
|
|
|
- case "monitoring":
|
|
|
- return (
|
|
|
- <div className="space-y-6">
|
|
|
- <Row gutter={16}>
|
|
|
- <Col span={24}>
|
|
|
- <Alert
|
|
|
- message="实时监测状态"
|
|
|
- description="系统正在实时监测所有窨井盖设备状态,包括开启、位移、倾斜、震动、溢水等情况"
|
|
|
- type="info"
|
|
|
- showIcon
|
|
|
- className="mb-4"
|
|
|
- />
|
|
|
- </Col>
|
|
|
- </Row>
|
|
|
-
|
|
|
- <Tabs defaultActiveKey="realtime">
|
|
|
- <TabPane tab="实时监测" key="realtime">
|
|
|
- <Row gutter={16}>
|
|
|
- <Col span={24}>
|
|
|
- <Card title="实时监测一张图">
|
|
|
- <div style={{ height: "500px" }}>
|
|
|
- <MapView devices={devices} showRealTimeData />
|
|
|
- </div>
|
|
|
- </Card>
|
|
|
- </Col>
|
|
|
- </Row>
|
|
|
- </TabPane>
|
|
|
-
|
|
|
- <TabPane tab="监测数据" key="data">
|
|
|
- <Card title="实时监测数据">
|
|
|
- <EChart option={monitoringChartOption} />
|
|
|
- </Card>
|
|
|
- </TabPane>
|
|
|
- </Tabs>
|
|
|
- </div>
|
|
|
- )
|
|
|
+ const alertColumns = [
|
|
|
+ {title: "设备名称", dataIndex: "deviceName", key: "deviceName"},
|
|
|
+ {title: "报警类型", dataIndex: "type", key: "type"},
|
|
|
+ {
|
|
|
+ title: "报警级别",
|
|
|
+ dataIndex: "level",
|
|
|
+ key: "level",
|
|
|
+ render: (level: string) => {
|
|
|
+ const levelMap = {
|
|
|
+ info: {color: "blue", text: "信息"},
|
|
|
+ warning: {color: "orange", text: "警告"},
|
|
|
+ error: {color: "red", text: "严重"},
|
|
|
+ }
|
|
|
+ const config = levelMap[level as keyof typeof levelMap]
|
|
|
+ return <Tag color={config.color}>{config.text}</Tag>
|
|
|
+ },
|
|
|
+ },
|
|
|
+ {title: "报警时间", dataIndex: "time", key: "time"},
|
|
|
+ {title: "设备位置", dataIndex: "location", key: "location"},
|
|
|
+ {
|
|
|
+ title: "状态",
|
|
|
+ dataIndex: "status",
|
|
|
+ key: "status",
|
|
|
+ render: (status: string) => {
|
|
|
+ const statusMap = {
|
|
|
+ pending: {color: "orange", text: "待处理"},
|
|
|
+ processed: {color: "green", text: "已处理"},
|
|
|
+ ignored: {color: "gray", text: "已忽略"},
|
|
|
+ }
|
|
|
+ const config = statusMap[status as keyof typeof statusMap]
|
|
|
+ return <Tag color={config.color}>{config.text}</Tag>
|
|
|
+ },
|
|
|
+ },
|
|
|
+ {
|
|
|
+ title: "操作",
|
|
|
+ key: "action",
|
|
|
+ render: (_, record: any) => (
|
|
|
+ <Space>
|
|
|
+ {record.status === "pending" && (
|
|
|
+ <>
|
|
|
+ <Button type="link" onClick={() => handleProcessAlert(record.id)}>
|
|
|
+ 处理
|
|
|
+ </Button>
|
|
|
+ <Button type="link" onClick={() => handleIgnoreAlert(record.id)}>
|
|
|
+ 忽略
|
|
|
+ </Button>
|
|
|
+ </>
|
|
|
+ )}
|
|
|
+ {record.status !== "pending" && <span className="text-gray-400">已处理</span>}
|
|
|
+ </Space>
|
|
|
+ ),
|
|
|
+ },
|
|
|
+ ]
|
|
|
|
|
|
- case "alerts":
|
|
|
- return (
|
|
|
- <div className="space-y-6">
|
|
|
- <Row gutter={16}>
|
|
|
- <Col span={6}>
|
|
|
- <Card>
|
|
|
- <Statistic title="今日告警" value={alerts.length} valueStyle={{ color: "#f5222d" }} />
|
|
|
- </Card>
|
|
|
- </Col>
|
|
|
- <Col span={6}>
|
|
|
- <Card>
|
|
|
- <Statistic
|
|
|
- title="待处理"
|
|
|
- value={alerts.filter((a) => a.status === "pending").length}
|
|
|
- valueStyle={{ color: "#faad14" }}
|
|
|
- />
|
|
|
- </Card>
|
|
|
- </Col>
|
|
|
- <Col span={6}>
|
|
|
- <Card>
|
|
|
- <Statistic
|
|
|
- title="已处理"
|
|
|
- value={alerts.filter((a) => a.status === "processed").length}
|
|
|
- valueStyle={{ color: "#52c41a" }}
|
|
|
- />
|
|
|
- </Card>
|
|
|
- </Col>
|
|
|
- <Col span={6}>
|
|
|
- <Card>
|
|
|
- <Statistic
|
|
|
- title="已忽略"
|
|
|
- value={alerts.filter((a) => a.status === "ignored").length}
|
|
|
- valueStyle={{ color: "#d9d9d9" }}
|
|
|
- />
|
|
|
- </Card>
|
|
|
- </Col>
|
|
|
- </Row>
|
|
|
-
|
|
|
- <Card title="监测报警记录">
|
|
|
- <Table columns={alertColumns} dataSource={alerts} rowKey="id" pagination={{ pageSize: 10 }} />
|
|
|
- </Card>
|
|
|
- </div>
|
|
|
- )
|
|
|
+ const renderContent = () => {
|
|
|
+ switch (selectedMenu) {
|
|
|
+ case "home":
|
|
|
+ return (
|
|
|
+ <div>
|
|
|
+ <div className="space-y-6" style={{height: '93vh', backgroundColor: '#3a3899'}}>
|
|
|
+ <div className="flex m-0" style={{height: '70%'}}>
|
|
|
+ <div className="" style={{width: '25%'}}>
|
|
|
+ <div className='' style={{height: '50%'}}>
|
|
|
+ <div style={{
|
|
|
+ height: '12%',
|
|
|
+ backgroundImage: 'url(/boxTitle.png)',
|
|
|
+ backgroundSize: '100% 100%',
|
|
|
+ textAlign: 'left',
|
|
|
+ color: 'white',
|
|
|
+ fontSize: '18px',
|
|
|
+ fontWeight: 'bold',
|
|
|
+ paddingLeft: '20px'
|
|
|
+ }}>
|
|
|
+ 待办工单
|
|
|
+ </div>
|
|
|
+ <div className='' style={{
|
|
|
+ height: '88%',
|
|
|
+ backgroundImage: 'url(/eject.PNG)',
|
|
|
+ backgroundSize: '100% 100%',
|
|
|
+ padding: '10px'
|
|
|
+ }}>
|
|
|
+ <DbgdData></DbgdData>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <div className='' style={{height: '50%'}}>
|
|
|
+ <div style={{
|
|
|
+ height: '12%',
|
|
|
+ backgroundImage: 'url(/boxTitle.png)',
|
|
|
+ backgroundSize: '100% 100%',
|
|
|
+ textAlign: 'left',
|
|
|
+ color: 'white',
|
|
|
+ fontSize: '18px',
|
|
|
+ fontWeight: 'bold',
|
|
|
+ paddingLeft: '20px'
|
|
|
+ }}>
|
|
|
+ 告警类型统计(15天内)
|
|
|
+ </div>
|
|
|
+ <div className='' style={{
|
|
|
+ height: '88%',
|
|
|
+ backgroundImage: 'url(/eject.PNG)',
|
|
|
+ backgroundSize: '100% 100%'
|
|
|
+ }}>
|
|
|
+ <PicEcharts
|
|
|
+ // title="告警类型统计"
|
|
|
+ data={[
|
|
|
+ {value: 335, name: '位移告警'},
|
|
|
+ {value: 310, name: '倾斜告警'},
|
|
|
+ {value: 234, name: '水位告警'},
|
|
|
+ {value: 135, name: '电压告警'},
|
|
|
+ {value: 1548, name: '温度告警'}
|
|
|
+ ]}
|
|
|
+ style={{height: '100%', width: '100%'}}
|
|
|
+ />
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <div className="" style={{width: '70%'}}>
|
|
|
+ <GisMapJinggai height={'65'}/>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <div className="" style={{width: '25%'}}>
|
|
|
+ <div className='' style={{height: '100%'}}>
|
|
|
+ <div style={{
|
|
|
+ height: '6%',
|
|
|
+ backgroundImage: 'url(/boxTitle.png)',
|
|
|
+ backgroundSize: '100% 100%',
|
|
|
+ textAlign: 'left',
|
|
|
+ color: 'white',
|
|
|
+ fontSize: '18px',
|
|
|
+ fontWeight: 'bold',
|
|
|
+ paddingLeft: '20px'
|
|
|
+ }}>
|
|
|
+ 设备列表
|
|
|
+ </div>
|
|
|
+ {/* 修改表格容器样式,添加背景色覆盖白色区域 */}
|
|
|
+ <div className='' style={{
|
|
|
+ height: '94%',
|
|
|
+ backgroundImage: 'url(/eject.PNG)',
|
|
|
+ backgroundSize: '100% 100%',
|
|
|
+ padding: '40px 20px 40px 20px',
|
|
|
+ boxSizing: 'border-box',
|
|
|
+ overflowY: 'hidden',
|
|
|
+ backgroundColor: '#3a3899' // 添加与页面主色调一致的背景色
|
|
|
+ }}>
|
|
|
+ <div style={{height: '100%',}}>
|
|
|
+ <Sbledata></Sbledata>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <div className="flex m-0" style={{height: '30%', justifyContent: 'space-evenly'}}>
|
|
|
+ <div style={{width: '33%'}}>
|
|
|
+ <div style={{
|
|
|
+ height: '12%',
|
|
|
+ backgroundImage: 'url(/boxTitle.png)',
|
|
|
+ backgroundSize: '100% 100%',
|
|
|
+ textAlign: 'left',
|
|
|
+ color: 'white',
|
|
|
+ fontSize: '18px',
|
|
|
+ fontWeight: 'bold',
|
|
|
+ paddingLeft: '30px'
|
|
|
+ }}>
|
|
|
+ 设备区域信息
|
|
|
+ </div>
|
|
|
+ <div className='' style={{
|
|
|
+ height: '88%',
|
|
|
+ backgroundImage: 'url(/eject.PNG)',
|
|
|
+ backgroundSize: '100% 100%'
|
|
|
+ }}>
|
|
|
+ <SbqyxxData
|
|
|
+ data={[
|
|
|
+ {value: 81, name: '太安社区'},
|
|
|
+ {value: 85, name: '桃花岭社区'},
|
|
|
+ {value: 60, name: '龙泉山社区'},
|
|
|
+ {value: 45, name: '鸳鸯山社区'},
|
|
|
+ {value: 50, name: '龙兴社区'},
|
|
|
+ {value: 55, name: '胜利门社区'},
|
|
|
+ {value: 88, name: '鹤鸣山社区'},
|
|
|
+ {value: 25, name: '教场坪社区'},
|
|
|
+ {value: 45, name: '荷花池社区'},
|
|
|
+ {value: 22, name: '廻龙山社区'},
|
|
|
+ {value: 35, name: '凤鸣塔社区'},
|
|
|
+ {value: 35, name: '望圣坡社区'},
|
|
|
+ {value: 22, name: '凤凰山社区'},
|
|
|
+ {value: 58, name: '苦藤铺社区'},
|
|
|
+ {value: 75, name: '黄草尾社区'},
|
|
|
+ {value: 65, name: '老鸦溪社区'},
|
|
|
+ {value: 66, name: '渔家巷社区'}
|
|
|
+ ]}
|
|
|
+ style={{height: '99%', width: '100%'}}
|
|
|
+ />
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div style={{width: '33%'}}>
|
|
|
+ <div style={{
|
|
|
+ height: '12%',
|
|
|
+ backgroundImage: 'url(/boxTitle.png)',
|
|
|
+ backgroundSize: '100% 100%',
|
|
|
+ textAlign: 'left',
|
|
|
+ color: 'white',
|
|
|
+ fontSize: '18px',
|
|
|
+ fontWeight: 'bold',
|
|
|
+ paddingLeft: '30px'
|
|
|
+ }}>
|
|
|
+ 设备分类
|
|
|
+ </div>
|
|
|
+ <div className='' style={{
|
|
|
+ height: '88%',
|
|
|
+ backgroundImage: 'url(/eject.PNG)',
|
|
|
+ backgroundSize: '100% 100%'
|
|
|
+ }}>
|
|
|
+ <BarChart
|
|
|
+ data={[
|
|
|
+ {value: 120, name: '电用井盖'},
|
|
|
+ {value: 85, name: '供水井盖'},
|
|
|
+ {value: 60, name: '通信井盖'},
|
|
|
+ {value: 45, name: '燃气井盖'},
|
|
|
+ {value: 30, name: '污水井盖'},
|
|
|
+ {value: 30, name: '雨水井盖'},
|
|
|
+ {value: 30, name: '路灯井盖'},
|
|
|
+ {value: 30, name: '网络井盖'},
|
|
|
+ {value: 30, name: '电缆井盖'},
|
|
|
+ {value: 30, name: '园林井盖'},
|
|
|
+ {value: 30, name: '化粪池井盖'}
|
|
|
+ ]}
|
|
|
+ style={{height: '99%', width: '100%'}}
|
|
|
+ />
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div style={{width: '33%'}}>
|
|
|
+ <div style={{
|
|
|
+ height: '12%',
|
|
|
+ backgroundImage: 'url(/boxTitle.png)',
|
|
|
+ backgroundSize: '100% 100%',
|
|
|
+ textAlign: 'left',
|
|
|
+ color: 'white',
|
|
|
+ fontSize: '18px',
|
|
|
+ fontWeight: 'bold',
|
|
|
+ paddingLeft: '30px'
|
|
|
+ }}>
|
|
|
+ 动态信息
|
|
|
+ </div>
|
|
|
+ <div className='' style={{
|
|
|
+ height: '88%',
|
|
|
+ backgroundImage: 'url(/eject.PNG)',
|
|
|
+ backgroundSize: '100% 100%',
|
|
|
+ padding: '20px'
|
|
|
+ }}>
|
|
|
+ <Dtxxdata height={'100%'} width={'100%'}/>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ </div>
|
|
|
+ {/*<div>*/}
|
|
|
+ {/* <GisMapJinggai height={'100'}/>*/}
|
|
|
+ {/*</div>*/}
|
|
|
+ </div>
|
|
|
+ )
|
|
|
+
|
|
|
+ case "dashboard":
|
|
|
+ return (
|
|
|
+ <div className="space-y-6">
|
|
|
+ {/* 统计卡片 */}
|
|
|
+ <Row gutter={16}>
|
|
|
+ <Col span={6}>
|
|
|
+ <Card>
|
|
|
+ <Statistic title="设备总数" value={deviceStats.total} valueStyle={{color: "#1890ff"}}/>
|
|
|
+ </Card>
|
|
|
+ </Col>
|
|
|
+ <Col span={6}>
|
|
|
+ <Card>
|
|
|
+ <Statistic title="正常设备" value={deviceStats.normal} valueStyle={{color: "#52c41a"}}/>
|
|
|
+ </Card>
|
|
|
+ </Col>
|
|
|
+ <Col span={6}>
|
|
|
+ <Card>
|
|
|
+ <Statistic title="告警设备" value={deviceStats.warning}
|
|
|
+ valueStyle={{color: "#faad14"}}/>
|
|
|
+ </Card>
|
|
|
+ </Col>
|
|
|
+ <Col span={6}>
|
|
|
+ <Card>
|
|
|
+ <Statistic title="故障设备" value={deviceStats.error} valueStyle={{color: "#f5222d"}}/>
|
|
|
+ </Card>
|
|
|
+ </Col>
|
|
|
+ </Row>
|
|
|
+
|
|
|
+ {/* 图表展示 */}
|
|
|
+ <Row gutter={16}>
|
|
|
+ <Col span={12}>
|
|
|
+ <Card title="设备区域分布">
|
|
|
+ <EChart option={regionChartOption}/>
|
|
|
+ </Card>
|
|
|
+ </Col>
|
|
|
+ <Col span={12}>
|
|
|
+ <Card title="设备状态分布">
|
|
|
+ <EChart option={statusChartOption}/>
|
|
|
+ </Card>
|
|
|
+ </Col>
|
|
|
+ </Row>
|
|
|
+
|
|
|
+ {/* 实时监测趋势 */}
|
|
|
+ <Card title="实时监测数据趋势">
|
|
|
+ <EChart option={monitoringChartOption}/>
|
|
|
+ </Card>
|
|
|
+ </div>
|
|
|
+ )
|
|
|
+
|
|
|
+ case "devices":
|
|
|
+ return (
|
|
|
+ <div className="space-y-6">
|
|
|
+ <Card
|
|
|
+ title="监测设备台账"
|
|
|
+ extra={
|
|
|
+ <Button type="primary" icon={<PlusOutlined/>}
|
|
|
+ onClick={() => setAddDeviceModalVisible(true)}>
|
|
|
+ 添加设备
|
|
|
+ </Button>
|
|
|
+ }
|
|
|
+ >
|
|
|
+ <Table columns={deviceColumns} dataSource={devices} rowKey="id"
|
|
|
+ pagination={{pageSize: 10}}/>
|
|
|
+ </Card>
|
|
|
+ </div>
|
|
|
+ )
|
|
|
+
|
|
|
+ case "map":
|
|
|
+ return (
|
|
|
+ <div className="space-y-6">
|
|
|
+ <Card title="监测设备 GIS 一张图">
|
|
|
+ <div style={{height: "600px"}}>
|
|
|
+ <GisMapBaidu height={'50'}/>
|
|
|
+ </div>
|
|
|
+ </Card>
|
|
|
+ </div>
|
|
|
+ )
|
|
|
+
|
|
|
+ case "monitoring":
|
|
|
+ return (
|
|
|
+ <div className="space-y-6" style={{paddingLeft:'10px'}}>
|
|
|
+ <Tabs defaultActiveKey="realtime">
|
|
|
+ <TabPane tab="实时监测" key="realtime">
|
|
|
+ <RTMMGis height={'86.2'}></RTMMGis>
|
|
|
+ </TabPane>
|
|
|
+
|
|
|
+ <TabPane tab="窑井状态监测" key="data">
|
|
|
+ <Card title="窑井状态监测">
|
|
|
+ <EChart option={monitoringChartOption}/>
|
|
|
+ </Card>
|
|
|
+ </TabPane>
|
|
|
+ </Tabs>
|
|
|
+ </div>
|
|
|
+ )
|
|
|
+
|
|
|
+ case "alerts":
|
|
|
+ return (
|
|
|
+ <div className="space-y-6">
|
|
|
+ <Row gutter={16}>
|
|
|
+ <Col span={6}>
|
|
|
+ <Card>
|
|
|
+ <Statistic title="今日告警" value={alerts.length} valueStyle={{color: "#f5222d"}}/>
|
|
|
+ </Card>
|
|
|
+ </Col>
|
|
|
+ <Col span={6}>
|
|
|
+ <Card>
|
|
|
+ <Statistic
|
|
|
+ title="待处理"
|
|
|
+ value={alerts.filter((a) => a.status === "pending").length}
|
|
|
+ valueStyle={{color: "#faad14"}}
|
|
|
+ />
|
|
|
+ </Card>
|
|
|
+ </Col>
|
|
|
+ <Col span={6}>
|
|
|
+ <Card>
|
|
|
+ <Statistic
|
|
|
+ title="已处理"
|
|
|
+ value={alerts.filter((a) => a.status === "processed").length}
|
|
|
+ valueStyle={{color: "#52c41a"}}
|
|
|
+ />
|
|
|
+ </Card>
|
|
|
+ </Col>
|
|
|
+ <Col span={6}>
|
|
|
+ <Card>
|
|
|
+ <Statistic
|
|
|
+ title="已忽略"
|
|
|
+ value={alerts.filter((a) => a.status === "ignored").length}
|
|
|
+ valueStyle={{color: "#d9d9d9"}}
|
|
|
+ />
|
|
|
+ </Card>
|
|
|
+ </Col>
|
|
|
+ </Row>
|
|
|
+
|
|
|
+ <Card title="监测报警记录">
|
|
|
+ <Table columns={alertColumns} dataSource={alerts} rowKey="id" pagination={{pageSize: 10}}/>
|
|
|
+ </Card>
|
|
|
+ </div>
|
|
|
+ )
|
|
|
+
|
|
|
+ case "settlement":
|
|
|
+ return (
|
|
|
+ <div className="space-y-6 p-2">
|
|
|
+ <Tabs defaultActiveKey="realtime">
|
|
|
+ <TabPane tab="案件流转管理" key="realtime">
|
|
|
+ <Row gutter={16}>
|
|
|
+ <Col span={24}>
|
|
|
+ <Card title="案件流转管理">
|
|
|
+ <div style={{height: "500px"}}>
|
|
|
+ <MapView devices={devices} showRealTimeData/>
|
|
|
+ </div>
|
|
|
+ </Card>
|
|
|
+ </Col>
|
|
|
+ </Row>
|
|
|
+ </TabPane>
|
|
|
+
|
|
|
+ <TabPane tab="工单处置管理" key="data">
|
|
|
+ <Card title="工单处置管理">
|
|
|
+ <EChart option={monitoringChartOption}/>
|
|
|
+ </Card>
|
|
|
+ </TabPane>
|
|
|
|
|
|
- default:
|
|
|
- return <div>页面开发中...</div>
|
|
|
+ <TabPane tab="经办工单" key="data1">
|
|
|
+ <Card title="经办工单">
|
|
|
+ <EChart option={monitoringChartOption}/>
|
|
|
+ </Card>
|
|
|
+ </TabPane>
|
|
|
+
|
|
|
+ <TabPane tab="办结工单" key="data2">
|
|
|
+ <Card title="办结工单">
|
|
|
+ <EChart option={monitoringChartOption}/>
|
|
|
+ </Card>
|
|
|
+ </TabPane>
|
|
|
+ </Tabs>
|
|
|
+ </div>
|
|
|
+ )
|
|
|
+ default:
|
|
|
+ return <div>页面开发中...</div>
|
|
|
+ }
|
|
|
}
|
|
|
- }
|
|
|
-
|
|
|
- return (
|
|
|
- <Layout className="min-h-screen">
|
|
|
- <Header className="bg-blue-600 text-white" style={{backgroundColor:'white'}}>
|
|
|
- <div className="flex items-center justify-between">
|
|
|
- <h1 className="text-xl font-bold">窨井盖安全运行监测子系统</h1>
|
|
|
- <div className="text-sm">当前时间: {new Date().toLocaleString("zh-CN")}</div>
|
|
|
- </div>
|
|
|
- </Header>
|
|
|
-
|
|
|
- <Layout>
|
|
|
- <Sider width={200} className="bg-white">
|
|
|
- <Menu
|
|
|
- mode="inline"
|
|
|
- selectedKeys={[selectedMenu]}
|
|
|
- onClick={({ key }) => setSelectedMenu(key)}
|
|
|
- className="h-full border-r"
|
|
|
- >
|
|
|
- <Menu.Item key="dashboard" icon={<DashboardOutlined />}>
|
|
|
- 监控面板
|
|
|
- </Menu.Item>
|
|
|
- <Menu.Item key="devices" icon={<SettingOutlined />}>
|
|
|
- 设备管理
|
|
|
- </Menu.Item>
|
|
|
- <Menu.Item key="map" icon={<EnvironmentOutlined />}>
|
|
|
- GIS地图
|
|
|
- </Menu.Item>
|
|
|
- <Menu.Item key="monitoring" icon={<BarChartOutlined />}>
|
|
|
- 实时监测
|
|
|
- </Menu.Item>
|
|
|
- <Menu.Item key="alerts" icon={<AlertOutlined />}>
|
|
|
- 报警管理
|
|
|
- </Menu.Item>
|
|
|
- </Menu>
|
|
|
- </Sider>
|
|
|
-
|
|
|
- <Layout className="p-6">
|
|
|
- <Content className="bg-gray-50 min-h-full">{renderContent()}</Content>
|
|
|
- </Layout>
|
|
|
- </Layout>
|
|
|
-
|
|
|
- {/* 设备详情弹窗 */}
|
|
|
- <Modal
|
|
|
- title="设备详情"
|
|
|
- open={deviceModalVisible}
|
|
|
- onCancel={() => setDeviceModalVisible(false)}
|
|
|
- footer={null}
|
|
|
- width={600}
|
|
|
- >
|
|
|
- {selectedDevice && (
|
|
|
- <div className="space-y-4">
|
|
|
- <Row gutter={16}>
|
|
|
- <Col span={12}>
|
|
|
- <div>
|
|
|
- <strong>设备编号:</strong> {selectedDevice.name}
|
|
|
- </div>
|
|
|
- </Col>
|
|
|
- <Col span={12}>
|
|
|
- <div>
|
|
|
- <strong>设备类型:</strong> {selectedDevice.type}
|
|
|
- </div>
|
|
|
- </Col>
|
|
|
- </Row>
|
|
|
- <Row gutter={16}>
|
|
|
- <Col span={12}>
|
|
|
- <div>
|
|
|
- <strong>所在位置:</strong> {selectedDevice.location}
|
|
|
- </div>
|
|
|
- </Col>
|
|
|
- <Col span={12}>
|
|
|
- <div>
|
|
|
- <strong>运维状态:</strong>
|
|
|
- <Badge
|
|
|
- status={selectedDevice.status === "normal" ? "success" : "error"}
|
|
|
- text={selectedDevice.status === "normal" ? "正常" : "异常"}
|
|
|
- />
|
|
|
- </div>
|
|
|
- </Col>
|
|
|
- </Row>
|
|
|
- <Row gutter={16}>
|
|
|
- <Col span={12}>
|
|
|
- <div>
|
|
|
- <strong>电池电量:</strong> {selectedDevice.battery}%
|
|
|
- </div>
|
|
|
- </Col>
|
|
|
- <Col span={12}>
|
|
|
- <div>
|
|
|
- <strong>信号强度:</strong> {selectedDevice.signal}%
|
|
|
+
|
|
|
+ return (
|
|
|
+ <Layout className="min-h-screen">
|
|
|
+ <Header className="bg-blue-600 text-white" style={{backgroundColor: 'white'}}>
|
|
|
+ <div className="flex items-center justify-between">
|
|
|
+ <h1 className="text-xl font-bold">窨井盖安全运行监测子系统</h1>
|
|
|
+ <div className="text-sm">当前时间: {new Date().toLocaleString("zh-CN")}</div>
|
|
|
</div>
|
|
|
- </Col>
|
|
|
- </Row>
|
|
|
- </div>
|
|
|
- )}
|
|
|
- </Modal>
|
|
|
-
|
|
|
- {/* 添加设备弹窗 */}
|
|
|
- <Modal
|
|
|
- title="添加设备"
|
|
|
- open={addDeviceModalVisible}
|
|
|
- onCancel={() => {
|
|
|
- setAddDeviceModalVisible(false)
|
|
|
- addDeviceForm.resetFields()
|
|
|
- }}
|
|
|
- onOk={() => addDeviceForm.submit()}
|
|
|
- width={600}
|
|
|
- >
|
|
|
- <Form form={addDeviceForm} layout="vertical" onFinish={handleAddDevice}>
|
|
|
- <Row gutter={16}>
|
|
|
- <Col span={12}>
|
|
|
- <Form.Item name="name" label="设备编号" rules={[{ required: true, message: "请输入设备编号" }]}>
|
|
|
- <Input placeholder="请输入设备编号" />
|
|
|
- </Form.Item>
|
|
|
- </Col>
|
|
|
- <Col span={12}>
|
|
|
- <Form.Item name="type" label="设备类型" rules={[{ required: true, message: "请选择设备类型" }]}>
|
|
|
- <Select placeholder="请选择设备类型">
|
|
|
- <Option value="智能井盖">智能井盖</Option>
|
|
|
- <Option value="传感器">传感器</Option>
|
|
|
- <Option value="监控设备">监控设备</Option>
|
|
|
- </Select>
|
|
|
- </Form.Item>
|
|
|
- </Col>
|
|
|
- </Row>
|
|
|
- <Row gutter={16}>
|
|
|
- <Col span={12}>
|
|
|
- <Form.Item name="status" label="运维状态" rules={[{ required: true, message: "请选择运维状态" }]}>
|
|
|
- <Select placeholder="请选择运维状态">
|
|
|
- <Option value="normal">正常</Option>
|
|
|
- <Option value="warning">告警</Option>
|
|
|
- <Option value="error">故障</Option>
|
|
|
- <Option value="maintenance">维修中</Option>
|
|
|
- </Select>
|
|
|
- </Form.Item>
|
|
|
- </Col>
|
|
|
- <Col span={12}>
|
|
|
- <Form.Item name="location" label="所在位置" rules={[{ required: true, message: "请输入所在位置" }]}>
|
|
|
- <Input placeholder="请输入所在位置" />
|
|
|
- </Form.Item>
|
|
|
- </Col>
|
|
|
- </Row>
|
|
|
- <Row gutter={16}>
|
|
|
- <Col span={12}>
|
|
|
- <Form.Item name="lat" label="纬度" rules={[{ required: true, message: "请输入纬度" }]}>
|
|
|
- <Input placeholder="请输入纬度" type="number" step="0.000001" />
|
|
|
- </Form.Item>
|
|
|
- </Col>
|
|
|
- <Col span={12}>
|
|
|
- <Form.Item name="lng" label="经度" rules={[{ required: true, message: "请输入经度" }]}>
|
|
|
- <Input placeholder="请输入经度" type="number" step="0.000001" />
|
|
|
- </Form.Item>
|
|
|
- </Col>
|
|
|
- </Row>
|
|
|
- <Row gutter={16}>
|
|
|
- <Col span={12}>
|
|
|
- <Form.Item name="battery" label="电池电量(%)" rules={[{ required: true, message: "请输入电池电量" }]}>
|
|
|
- <Input placeholder="请输入电池电量" type="number" min="0" max="100" />
|
|
|
- </Form.Item>
|
|
|
- </Col>
|
|
|
- <Col span={12}>
|
|
|
- <Form.Item name="signal" label="信号强度(%)" rules={[{ required: true, message: "请输入信号强度" }]}>
|
|
|
- <Input placeholder="请输入信号强度" type="number" min="0" max="100" />
|
|
|
- </Form.Item>
|
|
|
- </Col>
|
|
|
- </Row>
|
|
|
- </Form>
|
|
|
- </Modal>
|
|
|
-
|
|
|
- {/* 编辑设备弹窗 */}
|
|
|
- <Modal
|
|
|
- title="编辑设备"
|
|
|
- open={editDeviceModalVisible}
|
|
|
- onCancel={() => {
|
|
|
- setEditDeviceModalVisible(false)
|
|
|
- setEditingDevice(null)
|
|
|
- editDeviceForm.resetFields()
|
|
|
- }}
|
|
|
- onOk={() => editDeviceForm.submit()}
|
|
|
- width={600}
|
|
|
- >
|
|
|
- <Form form={editDeviceForm} layout="vertical" onFinish={handleEditDevice}>
|
|
|
- <Row gutter={16}>
|
|
|
- <Col span={12}>
|
|
|
- <Form.Item name="name" label="设备编号" rules={[{ required: true, message: "请输入设备编号" }]}>
|
|
|
- <Input placeholder="请输入设备编号" />
|
|
|
- </Form.Item>
|
|
|
- </Col>
|
|
|
- <Col span={12}>
|
|
|
- <Form.Item name="type" label="设备类型" rules={[{ required: true, message: "请选择设备类型" }]}>
|
|
|
- <Select placeholder="请选择设备类型">
|
|
|
- <Option value="智能井盖">智能井盖</Option>
|
|
|
- <Option value="传感器">传感器</Option>
|
|
|
- <Option value="监控设备">监控设备</Option>
|
|
|
- </Select>
|
|
|
- </Form.Item>
|
|
|
- </Col>
|
|
|
- </Row>
|
|
|
- <Row gutter={16}>
|
|
|
- <Col span={12}>
|
|
|
- <Form.Item name="status" label="运维状态" rules={[{ required: true, message: "请选择运维状态" }]}>
|
|
|
- <Select placeholder="请选择运维状态">
|
|
|
- <Option value="normal">正常</Option>
|
|
|
- <Option value="warning">告警</Option>
|
|
|
- <Option value="error">故障</Option>
|
|
|
- <Option value="maintenance">维修中</Option>
|
|
|
- </Select>
|
|
|
- </Form.Item>
|
|
|
- </Col>
|
|
|
- <Col span={12}>
|
|
|
- <Form.Item name="location" label="所在位置" rules={[{ required: true, message: "请输入所在位置" }]}>
|
|
|
- <Input placeholder="请输入所在位置" />
|
|
|
- </Form.Item>
|
|
|
- </Col>
|
|
|
- </Row>
|
|
|
- <Row gutter={16}>
|
|
|
- <Col span={12}>
|
|
|
- <Form.Item name="lat" label="纬度" rules={[{ required: true, message: "请输入纬度" }]}>
|
|
|
- <Input placeholder="请输入纬度" type="number" step="0.000001" />
|
|
|
- </Form.Item>
|
|
|
- </Col>
|
|
|
- <Col span={12}>
|
|
|
- <Form.Item name="lng" label="经度" rules={[{ required: true, message: "请输入经度" }]}>
|
|
|
- <Input placeholder="请输入经度" type="number" step="0.000001" />
|
|
|
- </Form.Item>
|
|
|
- </Col>
|
|
|
- </Row>
|
|
|
- <Row gutter={16}>
|
|
|
- <Col span={12}>
|
|
|
- <Form.Item name="battery" label="电池电量(%)" rules={[{ required: true, message: "请输入电池电量" }]}>
|
|
|
- <Input placeholder="请输入电池电量" type="number" min="0" max="100" />
|
|
|
- </Form.Item>
|
|
|
- </Col>
|
|
|
- <Col span={12}>
|
|
|
- <Form.Item name="signal" label="信号强度(%)" rules={[{ required: true, message: "请输入信号强度" }]}>
|
|
|
- <Input placeholder="请输入信号强度" type="number" min="0" max="100" />
|
|
|
- </Form.Item>
|
|
|
- </Col>
|
|
|
- </Row>
|
|
|
- </Form>
|
|
|
- </Modal>
|
|
|
- </Layout>
|
|
|
- )
|
|
|
+ </Header>
|
|
|
+ <Layout>
|
|
|
+ <Sider width={200} className="bg-white">
|
|
|
+ <Menu
|
|
|
+ mode="inline"
|
|
|
+ selectedKeys={[selectedMenu]}
|
|
|
+ onClick={({key}) => setSelectedMenu(key)}
|
|
|
+ className="h-full border-r"
|
|
|
+ >
|
|
|
+ <Menu.Item key="home" icon={<HomeOutlined/>}>
|
|
|
+ GIS地图
|
|
|
+ </Menu.Item>
|
|
|
+ <Menu.Item key="dashboard" icon={<DashboardOutlined/>}>
|
|
|
+ 监控面板
|
|
|
+ </Menu.Item>
|
|
|
+ <Menu.Item key="devices" icon={<SettingOutlined/>}>
|
|
|
+ 设备管理
|
|
|
+ </Menu.Item>
|
|
|
+ {/*<Menu.Item key="map" icon={<EnvironmentOutlined/>}>*/}
|
|
|
+ {/* GIS地图*/}
|
|
|
+ {/*</Menu.Item>*/}
|
|
|
+ <Menu.Item key="monitoring" icon={<BarChartOutlined/>}>
|
|
|
+ 实时监测
|
|
|
+ </Menu.Item>
|
|
|
+ <Menu.Item key="alerts" icon={<AlertOutlined/>}>
|
|
|
+ 报警管理
|
|
|
+ </Menu.Item>
|
|
|
+ <Menu.Item key="settlement" icon={<DatabaseOutlined/>}>
|
|
|
+ 案件办结
|
|
|
+ </Menu.Item>
|
|
|
+ </Menu>
|
|
|
+ </Sider>
|
|
|
+
|
|
|
+ <Layout>
|
|
|
+ <Content className="bg-gray-50 min-h-full">{renderContent()}</Content>
|
|
|
+ </Layout>
|
|
|
+ </Layout>
|
|
|
+ {/* 设备详情弹窗 */}
|
|
|
+ <Modal
|
|
|
+ title="设备详情"
|
|
|
+ open={deviceModalVisible}
|
|
|
+ onCancel={() => setDeviceModalVisible(false)}
|
|
|
+ footer={null}
|
|
|
+ width={600}
|
|
|
+ >
|
|
|
+ {selectedDevice && (
|
|
|
+ <div className="space-y-4">
|
|
|
+ <Row gutter={16}>
|
|
|
+ <Col span={12}>
|
|
|
+ <div>
|
|
|
+ <strong>设备编号:</strong> {selectedDevice.name}
|
|
|
+ </div>
|
|
|
+ </Col>
|
|
|
+ <Col span={12}>
|
|
|
+ <div>
|
|
|
+ <strong>设备类型:</strong> {selectedDevice.type}
|
|
|
+ </div>
|
|
|
+ </Col>
|
|
|
+ </Row>
|
|
|
+ <Row gutter={16}>
|
|
|
+ <Col span={12}>
|
|
|
+ <div>
|
|
|
+ <strong>所在位置:</strong> {selectedDevice.location}
|
|
|
+ </div>
|
|
|
+ </Col>
|
|
|
+ <Col span={12}>
|
|
|
+ <div>
|
|
|
+ <strong>运维状态:</strong>
|
|
|
+ <Badge
|
|
|
+ status={selectedDevice.status === "normal" ? "success" : "error"}
|
|
|
+ text={selectedDevice.status === "normal" ? "正常" : "异常"}
|
|
|
+ />
|
|
|
+ </div>
|
|
|
+ </Col>
|
|
|
+ </Row>
|
|
|
+ <Row gutter={16}>
|
|
|
+ <Col span={12}>
|
|
|
+ <div>
|
|
|
+ <strong>电池电量:</strong> {selectedDevice.battery}%
|
|
|
+ </div>
|
|
|
+ </Col>
|
|
|
+ <Col span={12}>
|
|
|
+ <div>
|
|
|
+ <strong>信号强度:</strong> {selectedDevice.signal}%
|
|
|
+ </div>
|
|
|
+ </Col>
|
|
|
+ </Row>
|
|
|
+ </div>
|
|
|
+ )}
|
|
|
+ </Modal>
|
|
|
+
|
|
|
+ {/* 添加设备弹窗 */}
|
|
|
+ <Modal
|
|
|
+ title="添加设备"
|
|
|
+ open={addDeviceModalVisible}
|
|
|
+ onCancel={() => {
|
|
|
+ setAddDeviceModalVisible(false)
|
|
|
+ addDeviceForm.resetFields()
|
|
|
+ }}
|
|
|
+ onOk={() => addDeviceForm.submit()}
|
|
|
+ width={600}
|
|
|
+ >
|
|
|
+ <Form form={addDeviceForm} layout="vertical" onFinish={handleAddDevice}>
|
|
|
+ <Row gutter={16}>
|
|
|
+ <Col span={12}>
|
|
|
+ <Form.Item name="name" label="设备编号" rules={[{required: true, message: "请输入设备编号"}]}>
|
|
|
+ <Input placeholder="请输入设备编号"/>
|
|
|
+ </Form.Item>
|
|
|
+ </Col>
|
|
|
+ <Col span={12}>
|
|
|
+ <Form.Item name="type" label="设备类型" rules={[{required: true, message: "请选择设备类型"}]}>
|
|
|
+ <Select placeholder="请选择设备类型">
|
|
|
+ <Option value="智能井盖">智能井盖</Option>
|
|
|
+ <Option value="传感器">传感器</Option>
|
|
|
+ <Option value="监控设备">监控设备</Option>
|
|
|
+ </Select>
|
|
|
+ </Form.Item>
|
|
|
+ </Col>
|
|
|
+ </Row>
|
|
|
+ <Row gutter={16}>
|
|
|
+ <Col span={12}>
|
|
|
+ <Form.Item name="status" label="运维状态" rules={[{required: true, message: "请选择运维状态"}]}>
|
|
|
+ <Select placeholder="请选择运维状态">
|
|
|
+ <Option value="normal">正常</Option>
|
|
|
+ <Option value="warning">告警</Option>
|
|
|
+ <Option value="error">故障</Option>
|
|
|
+ <Option value="maintenance">维修中</Option>
|
|
|
+ </Select>
|
|
|
+ </Form.Item>
|
|
|
+ </Col>
|
|
|
+ <Col span={12}>
|
|
|
+ <Form.Item name="location" label="所在位置" rules={[{required: true, message: "请输入所在位置"}]}>
|
|
|
+ <Input placeholder="请输入所在位置"/>
|
|
|
+ </Form.Item>
|
|
|
+ </Col>
|
|
|
+ </Row>
|
|
|
+ <Row gutter={16}>
|
|
|
+ <Col span={12}>
|
|
|
+ <Form.Item name="lat" label="纬度" rules={[{required: true, message: "请输入纬度"}]}>
|
|
|
+ <Input placeholder="请输入纬度" type="number" step="0.000001"/>
|
|
|
+ </Form.Item>
|
|
|
+ </Col>
|
|
|
+ <Col span={12}>
|
|
|
+ <Form.Item name="lng" label="经度" rules={[{required: true, message: "请输入经度"}]}>
|
|
|
+ <Input placeholder="请输入经度" type="number" step="0.000001"/>
|
|
|
+ </Form.Item>
|
|
|
+ </Col>
|
|
|
+ </Row>
|
|
|
+ <Row gutter={16}>
|
|
|
+ <Col span={12}>
|
|
|
+ <Form.Item name="battery" label="电池电量(%)" rules={[{required: true, message: "请输入电池电量"}]}>
|
|
|
+ <Input placeholder="请输入电池电量" type="number" min="0" max="100"/>
|
|
|
+ </Form.Item>
|
|
|
+ </Col>
|
|
|
+ <Col span={12}>
|
|
|
+ <Form.Item name="signal" label="信号强度(%)" rules={[{required: true, message: "请输入信号强度"}]}>
|
|
|
+ <Input placeholder="请输入信号强度" type="number" min="0" max="100"/>
|
|
|
+ </Form.Item>
|
|
|
+ </Col>
|
|
|
+ </Row>
|
|
|
+ </Form>
|
|
|
+ </Modal>
|
|
|
+
|
|
|
+ {/* 编辑设备弹窗 */}
|
|
|
+ <Modal
|
|
|
+ title="编辑设备"
|
|
|
+ open={editDeviceModalVisible}
|
|
|
+ onCancel={() => {
|
|
|
+ setEditDeviceModalVisible(false)
|
|
|
+ setEditingDevice(null)
|
|
|
+ editDeviceForm.resetFields()
|
|
|
+ }}
|
|
|
+ onOk={() => editDeviceForm.submit()}
|
|
|
+ width={600}
|
|
|
+ >
|
|
|
+ <Form form={editDeviceForm} layout="vertical" onFinish={handleEditDevice}>
|
|
|
+ <Row gutter={16}>
|
|
|
+ <Col span={12}>
|
|
|
+ <Form.Item name="name" label="设备编号" rules={[{required: true, message: "请输入设备编号"}]}>
|
|
|
+ <Input placeholder="请输入设备编号"/>
|
|
|
+ </Form.Item>
|
|
|
+ </Col>
|
|
|
+ <Col span={12}>
|
|
|
+ <Form.Item name="type" label="设备类型" rules={[{required: true, message: "请选择设备类型"}]}>
|
|
|
+ <Select placeholder="请选择设备类型">
|
|
|
+ <Option value="智能井盖">智能井盖</Option>
|
|
|
+ <Option value="传感器">传感器</Option>
|
|
|
+ <Option value="监控设备">监控设备</Option>
|
|
|
+ </Select>
|
|
|
+ </Form.Item>
|
|
|
+ </Col>
|
|
|
+ </Row>
|
|
|
+ <Row gutter={16}>
|
|
|
+ <Col span={12}>
|
|
|
+ <Form.Item name="status" label="运维状态" rules={[{required: true, message: "请选择运维状态"}]}>
|
|
|
+ <Select placeholder="请选择运维状态">
|
|
|
+ <Option value="normal">正常</Option>
|
|
|
+ <Option value="warning">告警</Option>
|
|
|
+ <Option value="error">故障</Option>
|
|
|
+ <Option value="maintenance">维修中</Option>
|
|
|
+ </Select>
|
|
|
+ </Form.Item>
|
|
|
+ </Col>
|
|
|
+ <Col span={12}>
|
|
|
+ <Form.Item name="location" label="所在位置" rules={[{required: true, message: "请输入所在位置"}]}>
|
|
|
+ <Input placeholder="请输入所在位置"/>
|
|
|
+ </Form.Item>
|
|
|
+ </Col>
|
|
|
+ </Row>
|
|
|
+ <Row gutter={16}>
|
|
|
+ <Col span={12}>
|
|
|
+ <Form.Item name="lat" label="纬度" rules={[{required: true, message: "请输入纬度"}]}>
|
|
|
+ <Input placeholder="请输入纬度" type="number" step="0.000001"/>
|
|
|
+ </Form.Item>
|
|
|
+ </Col>
|
|
|
+ <Col span={12}>
|
|
|
+ <Form.Item name="lng" label="经度" rules={[{required: true, message: "请输入经度"}]}>
|
|
|
+ <Input placeholder="请输入经度" type="number" step="0.000001"/>
|
|
|
+ </Form.Item>
|
|
|
+ </Col>
|
|
|
+ </Row>
|
|
|
+ <Row gutter={16}>
|
|
|
+ <Col span={12}>
|
|
|
+ <Form.Item name="battery" label="电池电量(%)" rules={[{required: true, message: "请输入电池电量"}]}>
|
|
|
+ <Input placeholder="请输入电池电量" type="number" min="0" max="100"/>
|
|
|
+ </Form.Item>
|
|
|
+ </Col>
|
|
|
+ <Col span={12}>
|
|
|
+ <Form.Item name="signal" label="信号强度(%)" rules={[{required: true, message: "请输入信号强度"}]}>
|
|
|
+ <Input placeholder="请输入信号强度" type="number" min="0" max="100"/>
|
|
|
+ </Form.Item>
|
|
|
+ </Col>
|
|
|
+ </Row>
|
|
|
+ </Form>
|
|
|
+ </Modal>
|
|
|
+ </Layout>
|
|
|
+ )
|
|
|
}
|