Selaa lähdekoodia

feat(app): 新增报警面板组件

- 添加 AlarmPanel 组件,用于展示报警信息和处理报警事件
- 实现了报警统计、报警列表、报警地图和预警管理等功能
- 集成了地图组件和全局消息组件
-优化了用户交互和界面布局
nahida 9 kuukautta sitten
vanhempi
commit
55318c039d

+ 302 - 0
app/(other)/test10/components/AlarmPanel.tsx

@@ -0,0 +1,302 @@
+"use client"
+
+import {useState} from "react"
+import dynamic from "next/dynamic"
+import {
+  Alert,
+  Badge,
+  Button,
+  Card,
+  Col,
+  DatePicker,
+  Form,
+  Input,
+  Modal,
+  Row,
+  Select,
+  Space,
+  Statistic,
+  Table,
+  Tabs,
+  Upload,
+} from "antd"
+import {EditOutlined, ExportOutlined, EyeOutlined, SearchOutlined, UploadOutlined} from "@ant-design/icons"
+import globalMessage from "@/app/_modules/globalMessage";
+
+const MapView = dynamic(() => import("./MapView"), {
+  ssr: false,
+  loading: () => <div className="flex items-center justify-center h-full">地图加载中...</div>,
+})
+
+const { Option } = Select
+const { RangePicker } = DatePicker
+const { TabPane } = Tabs
+const { TextArea } = Input
+
+export default function AlarmPanel() {
+  const [selectedTab, setSelectedTab] = useState("current-alarms")
+  const [modalVisible, setModalVisible] = useState(false)
+  const [selectedAlarm, setSelectedAlarm] = useState<any>(null)
+
+  // 模拟报警数据
+  const alarmData = [
+    {
+      key: "1",
+      id: "AL001",
+      time: "2024-01-15 14:25:30",
+      device: "LV002",
+      deviceName: "人民路积水点液位计",
+      location: "人民路与南京路交叉口",
+      level: "高",
+      type: "液位超限",
+      currentValue: "0.8m",
+      threshold: "0.5m",
+      status: "未处理",
+      description: "液位持续超过报警阈值,可能存在积水风险",
+    },
+    {
+      key: "2",
+      id: "AL002",
+      time: "2024-01-15 14:20:15",
+      device: "FL001",
+      deviceName: "主干道流量计",
+      location: "淮海路主干管网",
+      level: "中",
+      type: "流量异常",
+      currentValue: "3.2m³/s",
+      threshold: "3.0m³/s",
+      status: "处理中",
+      description: "流量超过设计值,需要关注管网负荷情况",
+    },
+    {
+      key: "3",
+      id: "AL003",
+      time: "2024-01-15 14:15:45",
+      device: "PS001",
+      deviceName: "第一泵站",
+      location: "城东泵站",
+      level: "高",
+      type: "设备故障",
+      currentValue: "停机",
+      threshold: "正常运行",
+      status: "已派单",
+      description: "泵站突然停机,疑似电机故障",
+    },
+  ]
+
+  const handleAlarmDetail = (record: any) => {
+    setSelectedAlarm(record)
+    setModalVisible(true)
+  }
+
+  const handleAlarmProcess = (record: any) => {
+    globalMessage.success(`报警 ${record.id} 已开始处理`)
+  }
+
+  const columns = [
+    { title: "报警编号", dataIndex: "id", key: "id", width: 100 },
+    { title: "报警时间", dataIndex: "time", key: "time", width: 150 },
+    { title: "设备编号", dataIndex: "device", key: "device", width: 100 },
+    { title: "设备名称", dataIndex: "deviceName", key: "deviceName", width: 150 },
+    { title: "位置", dataIndex: "location", key: "location", width: 150 },
+    {
+      title: "报警级别",
+      dataIndex: "level",
+      key: "level",
+      width: 100,
+      render: (level: string) => (
+        <Badge color={level === "高" ? "red" : level === "中" ? "orange" : "blue"} text={level} />
+      ),
+    },
+    { title: "报警类型", dataIndex: "type", key: "type", width: 100 },
+    { title: "当前值", dataIndex: "currentValue", key: "currentValue", width: 100 },
+    {
+      title: "处理状态",
+      dataIndex: "status",
+      key: "status",
+      width: 100,
+      render: (status: string) => (
+        <Badge status={status === "未处理" ? "error" : status === "处理中" ? "processing" : "success"} text={status} />
+      ),
+    },
+    {
+      title: "操作",
+      key: "action",
+      width: 200,
+      render: (_, record) => (
+        <Space>
+          <Button size="small" icon={<EyeOutlined />} onClick={() => handleAlarmDetail(record)}>
+            详情
+          </Button>
+          <Button size="small" type="primary" icon={<EditOutlined />} onClick={() => handleAlarmProcess(record)}>
+            处理
+          </Button>
+        </Space>
+      ),
+    },
+  ]
+
+  return (
+    <div className="space-y-6">
+      {/* 统计概览 */}
+      <Row gutter={[16, 16]}>
+        <Col span={6}>
+          <Card>
+            <Statistic title="当前报警总数" value={23} valueStyle={{ color: "#cf1322" }} suffix="条" />
+          </Card>
+        </Col>
+        <Col span={6}>
+          <Card>
+            <Statistic title="高级别报警" value={8} valueStyle={{ color: "#ff4d4f" }} suffix="条" />
+          </Card>
+        </Col>
+        <Col span={6}>
+          <Card>
+            <Statistic title="今日处理" value={15} valueStyle={{ color: "#52c41a" }} suffix="条" />
+          </Card>
+        </Col>
+        <Col span={6}>
+          <Card>
+            <Statistic title="处理率" value={87.5} valueStyle={{ color: "#1890ff" }} suffix="%" />
+          </Card>
+        </Col>
+      </Row>
+
+      {/* 滚动报警提醒 */}
+      <Alert
+        message="实时报警"
+        description="【14:25:30】人民路积水点液位超限报警 | 【14:20:15】主干道流量异常 | 【14:15:45】第一泵站设备故障"
+        type="error"
+        showIcon
+        closable
+      />
+
+      <Tabs activeKey={selectedTab} onChange={setSelectedTab}>
+        <TabPane tab="监测报警" key="current-alarms">
+          <Card title="报警清单">
+            <div className="mb-4">
+              <Space wrap>
+                <Input placeholder="设备编号" prefix={<SearchOutlined />} style={{ width: 150 }} />
+                <Select placeholder="报警级别" style={{ width: 120 }}>
+                  <Option value="high">高</Option>
+                  <Option value="medium">中</Option>
+                  <Option value="low">低</Option>
+                </Select>
+                <Select placeholder="处理状态" style={{ width: 120 }}>
+                  <Option value="unprocessed">未处理</Option>
+                  <Option value="processing">处理中</Option>
+                  <Option value="processed">已处理</Option>
+                </Select>
+                <RangePicker placeholder={["开始时间", "结束时间"]} />
+                <Button type="primary" icon={<SearchOutlined />}>
+                  查询
+                </Button>
+                <Button icon={<ExportOutlined />}>导出</Button>
+              </Space>
+            </div>
+
+            <Table columns={columns} dataSource={alarmData} pagination={{ pageSize: 10 }} scroll={{ x: 1200 }} />
+          </Card>
+        </TabPane>
+
+        <TabPane tab="报警地图" key="alarm-map">
+          <Card title="当前报警 GIS " className="h-96">
+            <MapView type="overview" />
+          </Card>
+        </TabPane>
+
+        <TabPane tab="监测预警" key="warnings">
+          <Card title="当前预警管理">
+            <div className="space-y-4">
+              <Alert
+                message="管网运行风险预警"
+                description="检测到3个区域管网负荷率超过85%,建议加强监控"
+                type="warning"
+                showIcon
+              />
+              <Alert
+                message="积水内涝预警"
+                description="气象部门发布暴雨预警,5个易积水点需重点关注"
+                type="info"
+                showIcon
+              />
+            </div>
+          </Card>
+        </TabPane>
+      </Tabs>
+
+      {/* 报警详情模态框 */}
+      <Modal
+        title="报警详情"
+        open={modalVisible}
+        onCancel={() => setModalVisible(false)}
+        width={800}
+        footer={[
+          <Button key="close" onClick={() => setModalVisible(false)}>
+            关闭
+          </Button>,
+          <Button key="process" type="primary">
+            处理报警
+          </Button>,
+        ]}
+      >
+        {selectedAlarm && (
+          <div className="space-y-4">
+            <Row gutter={[16, 16]}>
+              <Col span={12}>
+                <div>
+                  <strong>报警编号:</strong> {selectedAlarm.id}
+                </div>
+                <div>
+                  <strong>报警时间:</strong> {selectedAlarm.time}
+                </div>
+                <div>
+                  <strong>设备编号:</strong> {selectedAlarm.device}
+                </div>
+                <div>
+                  <strong>设备名称:</strong> {selectedAlarm.deviceName}
+                </div>
+              </Col>
+              <Col span={12}>
+                <div>
+                  <strong>报警级别:</strong>{" "}
+                  <Badge color={selectedAlarm.level === "高" ? "red" : "orange"} text={selectedAlarm.level} />
+                </div>
+                <div>
+                  <strong>报警类型:</strong> {selectedAlarm.type}
+                </div>
+                <div>
+                  <strong>当前值:</strong> {selectedAlarm.currentValue}
+                </div>
+                <div>
+                  <strong>阈值:</strong> {selectedAlarm.threshold}
+                </div>
+              </Col>
+            </Row>
+
+            <div>
+              <strong>位置信息:</strong> {selectedAlarm.location}
+            </div>
+
+            <div>
+              <strong>报警描述:</strong> {selectedAlarm.description}
+            </div>
+
+            <Card title="处理记录" size="small">
+              <Form layout="vertical">
+                <Form.Item label="处理意见">
+                  <TextArea rows={3} placeholder="请输入处理意见..." />
+                </Form.Item>
+                <Form.Item label="附件上传">
+                  <Upload>
+                    <Button icon={<UploadOutlined />}>上传文件</Button>
+                  </Upload>
+                </Form.Item>
+              </Form>
+            </Card>
+          </div>
+        )}
+      </Modal>
+    </div>
+  )
+}

+ 1206 - 0
app/(other)/test10/components/DataManagement.tsx

@@ -0,0 +1,1206 @@
+"use client"
+
+import {useEffect, useState} from "react"
+import {Button, Card, Col, Descriptions, Form, Input, Modal, Row, Select, Space, Statistic, Table, Tabs} from "antd"
+import {DeleteOutlined, EditOutlined, EyeOutlined, PlusOutlined, SearchOutlined} from "@ant-design/icons"
+import globalMessage from "@/app/_modules/globalMessage";
+import EChart from "@/components/echarts"
+
+const { Option } = Select
+const { TabPane } = Tabs
+
+export default function DataManagement() {
+  const [selectedTab, setSelectedTab] = useState("drainage-areas")
+  const [modalVisible, setModalVisible] = useState(false)
+  const [detailModalVisible, setDetailModalVisible] = useState(false)
+  const [editingRecord, setEditingRecord] = useState<any>(null)
+  const [detailRecord, setDetailRecord] = useState<any>(null)
+  const [form] = Form.useForm()
+
+  // 各种数据状态
+  const [drainageAreas, setDrainageAreas] = useState([
+    {
+      key: "1",
+      id: "DA001",
+      name: "中心城区雨水分区",
+      type: "雨水分区",
+      area: "15.6",
+      population: "120000",
+      status: "正常",
+    },
+    {
+      key: "2",
+      id: "DA002",
+      name: "工业园区污水分区",
+      type: "污水分区",
+      area: "8.3",
+      population: "45000",
+      status: "正常",
+    },
+  ])
+
+  const [pipelineData, setPipelineData] = useState([
+    {
+      key: "1",
+      id: "PL001",
+      name: "主干道雨水管",
+      type: "雨水管",
+      diameter: "1200mm",
+      length: "2.5km",
+      material: "钢筋混凝土",
+      status: "良好",
+    },
+    {
+      key: "2",
+      id: "PL002",
+      name: "支线污水管",
+      type: "污水管",
+      diameter: "800mm",
+      length: "1.8km",
+      material: "HDPE",
+      status: "良好",
+    },
+  ])
+
+  const [engineeringFacilities, setEngineeringFacilities] = useState([
+    {
+      key: "1",
+      id: "EF001",
+      name: "第一泵站",
+      type: "泵站",
+      capacity: "500m³/h",
+      power: "75kW",
+      status: "运行中",
+    },
+    {
+      key: "2",
+      id: "EF002",
+      name: "调蓄池A",
+      type: "调蓄设施",
+      capacity: "10000m³",
+      currentLevel: "30%",
+      status: "待命",
+    },
+  ])
+
+  const [waterloggingPoints, setWaterloggingPoints] = useState([
+    {
+      key: "1",
+      id: "WP001",
+      name: "人民路积水点",
+      location: "人民路与南京路交叉口",
+      riskLevel: "高",
+      historicalDepth: "0.8m",
+      status: "监控中",
+    },
+    {
+      key: "2",
+      id: "WP002",
+      name: "商业区积水点",
+      location: "淮海路商业广场",
+      riskLevel: "中",
+      historicalDepth: "0.5m",
+      status: "监控中",
+    },
+  ])
+
+  const [monitoringDevices, setMonitoringDevices] = useState([
+    {
+      key: "1",
+      id: "MD001",
+      name: "液位计LV002",
+      type: "液位计",
+      location: "人民路积水点",
+      installDate: "2023-06-15",
+      lastMaintenance: "2024-01-10",
+      status: "在线",
+    },
+    {
+      key: "2",
+      id: "MD002",
+      name: "流量计FL001",
+      type: "流量计",
+      location: "主干道管网",
+      installDate: "2023-08-20",
+      lastMaintenance: "2024-01-08",
+      status: "在线",
+    },
+  ])
+
+  // 查询条件状态
+  const [searchParams, setSearchParams] = useState({
+    drainageArea: { name: "", type: "" },
+    pipeline: { id: "", type: "" },
+    facility: { name: "", type: "" },
+    waterlogging: { name: "", riskLevel: "" },
+    device: { id: "", type: "" }
+  })
+
+  // 过滤后的数据
+  const [filteredDrainageAreas, setFilteredDrainageAreas] = useState(drainageAreas)
+  const [filteredPipelineData, setFilteredPipelineData] = useState(pipelineData)
+  const [filteredEngineeringFacilities, setFilteredEngineeringFacilities] = useState(engineeringFacilities)
+  const [filteredWaterloggingPoints, setFilteredWaterloggingPoints] = useState(waterloggingPoints)
+  const [filteredMonitoringDevices, setFilteredMonitoringDevices] = useState(monitoringDevices)
+
+  // 当原始数据变化时更新过滤数据
+  useEffect(() => {
+    setFilteredDrainageAreas(drainageAreas)
+    setFilteredPipelineData(pipelineData)
+    setFilteredEngineeringFacilities(engineeringFacilities)
+    setFilteredWaterloggingPoints(waterloggingPoints)
+    setFilteredMonitoringDevices(monitoringDevices)
+  }, [drainageAreas, pipelineData, engineeringFacilities, waterloggingPoints, monitoringDevices])
+
+  const handleEdit = (record: any) => {
+    setEditingRecord(record)
+    form.setFieldsValue(record)
+    setModalVisible(true)
+  }
+
+  const handleViewDetail = (record: any) => {
+    setDetailRecord(record)
+    setDetailModalVisible(true)
+  }
+
+  const handleDelete = (record: any, dataType: string) => {
+    Modal.confirm({
+      title: "确认删除",
+      content: `确定要删除 ${record.name} 吗?`,
+      onOk() {
+        switch (dataType) {
+          case "drainage":
+            setDrainageAreas(prev => prev.filter(item => item.id !== record.id))
+            break
+          case "pipeline":
+            setPipelineData(prev => prev.filter(item => item.id !== record.id))
+            break
+          case "facility":
+            setEngineeringFacilities(prev => prev.filter(item => item.id !== record.id))
+            break
+          case "waterlogging":
+            setWaterloggingPoints(prev => prev.filter(item => item.id !== record.id))
+            break
+          case "device":
+            setMonitoringDevices(prev => prev.filter(item => item.id !== record.id))
+            break
+        }
+        globalMessage.success("删除成功")
+      },
+    })
+  }
+
+  const handleAdd = () => {
+    setEditingRecord(null)
+    form.resetFields()
+    setModalVisible(true)
+  }
+
+  const handleSave = () => {
+    form.validateFields().then(values => {
+      if (editingRecord) {
+        // 编辑现有记录
+        const updatedData = {
+          ...editingRecord,
+          ...values
+        }
+        
+        switch (selectedTab) {
+          case "drainage-areas":
+            setDrainageAreas(prev => prev.map(item => 
+              item.id === editingRecord.id ? updatedData : item
+            ))
+            break
+          case "pipeline-network":
+            setPipelineData(prev => prev.map(item => 
+              item.id === editingRecord.id ? updatedData : item
+            ))
+            break
+          case "engineering-facilities":
+            setEngineeringFacilities(prev => prev.map(item => 
+              item.id === editingRecord.id ? updatedData : item
+            ))
+            break
+          case "waterlogging-points":
+            setWaterloggingPoints(prev => prev.map(item => 
+              item.id === editingRecord.id ? updatedData : item
+            ))
+            break
+          case "monitoring-devices":
+            setMonitoringDevices(prev => prev.map(item => 
+              item.id === editingRecord.id ? updatedData : item
+            ))
+            break
+        }
+      } else {
+        // 添加新记录
+        const newRecord = {
+          ...values,
+          key: Date.now().toString(),
+          id: generateId(selectedTab)
+        }
+        
+        switch (selectedTab) {
+          case "drainage-areas":
+            setDrainageAreas(prev => [...prev, newRecord])
+            break
+          case "pipeline-network":
+            setPipelineData(prev => [...prev, newRecord])
+            break
+          case "engineering-facilities":
+            setEngineeringFacilities(prev => [...prev, newRecord])
+            break
+          case "waterlogging-points":
+            setWaterloggingPoints(prev => [...prev, newRecord])
+            break
+          case "monitoring-devices":
+            setMonitoringDevices(prev => [...prev, newRecord])
+            break
+        }
+      }
+      
+      globalMessage.success(editingRecord ? "编辑成功" : "新增成功")
+      setModalVisible(false)
+      setEditingRecord(null)
+      form.resetFields()
+    })
+  }
+
+  const generateId = (tab: string) => {
+    const prefixMap: Record<string, string> = {
+      "drainage-areas": "DA",
+      "pipeline-network": "PL",
+      "engineering-facilities": "EF",
+      "waterlogging-points": "WP",
+      "monitoring-devices": "MD"
+    }
+    
+    const prefix = prefixMap[tab] || "ID"
+    const timestamp = Date.now().toString().slice(-6)
+    return `${prefix}${timestamp}`
+  }
+
+  // 查询处理函数
+  const handleSearch = (dataType: string) => {
+    switch (dataType) {
+      case "drainage":
+        const filteredDrainage = drainageAreas.filter(item => {
+          return (
+            (searchParams.drainageArea.name === "" || 
+             item.name.toLowerCase().includes(searchParams.drainageArea.name.toLowerCase())) &&
+            (searchParams.drainageArea.type === "" || 
+             item.type.includes(searchParams.drainageArea.type))
+          )
+        })
+        setFilteredDrainageAreas(filteredDrainage)
+        break
+        
+      case "pipeline":
+        const filteredPipeline = pipelineData.filter(item => {
+          return (
+            (searchParams.pipeline.id === "" || 
+             item.id.toLowerCase().includes(searchParams.pipeline.id.toLowerCase())) &&
+            (searchParams.pipeline.type === "" || 
+             item.type.includes(searchParams.pipeline.type))
+          )
+        })
+        setFilteredPipelineData(filteredPipeline)
+        break
+        
+      case "facility":
+        const filteredFacility = engineeringFacilities.filter(item => {
+          return (
+            (searchParams.facility.name === "" || 
+             item.name.toLowerCase().includes(searchParams.facility.name.toLowerCase())) &&
+            (searchParams.facility.type === "" || 
+             item.type.includes(searchParams.facility.type))
+          )
+        })
+        setFilteredEngineeringFacilities(filteredFacility)
+        break
+        
+      case "waterlogging":
+        const filteredWaterlogging = waterloggingPoints.filter(item => {
+          return (
+            (searchParams.waterlogging.name === "" || 
+             item.name.toLowerCase().includes(searchParams.waterlogging.name.toLowerCase())) &&
+            (searchParams.waterlogging.riskLevel === "" || 
+             item.riskLevel.includes(searchParams.waterlogging.riskLevel))
+          )
+        })
+        setFilteredWaterloggingPoints(filteredWaterlogging)
+        break
+        
+      case "device":
+        const filteredDevice = monitoringDevices.filter(item => {
+          return (
+            (searchParams.device.id === "" || 
+             item.id.toLowerCase().includes(searchParams.device.id.toLowerCase())) &&
+            (searchParams.device.type === "" || 
+             item.type.includes(searchParams.device.type))
+          )
+        })
+        setFilteredMonitoringDevices(filteredDevice)
+        break
+    }
+  }
+
+  // 更新搜索参数
+  const updateSearchParams = (dataType: string, field: string, value: string) => {
+    setSearchParams(prev => ({
+      ...prev,
+      [dataType]: {
+        ...prev[dataType],
+        [field]: value
+      }
+    }))
+  }
+
+  const commonColumns = [
+    {
+      title: "操作",
+      key: "action",
+      width: 200,
+      render: (_, record) => (
+        <Space>
+          <Button size="small" icon={<EyeOutlined />} onClick={() => handleViewDetail(record)}>
+            详情
+          </Button>
+          <Button size="small" icon={<EditOutlined />} onClick={() => handleEdit(record)}>
+            编辑
+          </Button>
+          <Button 
+            size="small" 
+            danger 
+            icon={<DeleteOutlined />} 
+            onClick={() => {
+              let dataType = ""
+              switch (selectedTab) {
+                case "drainage-areas": dataType = "drainage"; break
+                case "pipeline-network": dataType = "pipeline"; break
+                case "engineering-facilities": dataType = "facility"; break
+                case "waterlogging-points": dataType = "waterlogging"; break
+                case "monitoring-devices": dataType = "device"; break
+              }
+              handleDelete(record, dataType)
+            }}
+          >
+            删除
+          </Button>
+        </Space>
+      ),
+    },
+  ]
+
+  const drainageAreaColumns = [
+    { title: "分区编号", dataIndex: "id", key: "id" },
+    { title: "分区名称", dataIndex: "name", key: "name" },
+    { title: "分区类型", dataIndex: "type", key: "type" },
+    { title: "面积(km²)", dataIndex: "area", key: "area" },
+    { title: "服务人口", dataIndex: "population", key: "population" },
+    { title: "状态", dataIndex: "status", key: "status" },
+    ...commonColumns,
+  ]
+
+  const pipelineColumns = [
+    { title: "管线编号", dataIndex: "id", key: "id" },
+    { title: "管线名称", dataIndex: "name", key: "name" },
+    { title: "管线类型", dataIndex: "type", key: "type" },
+    { title: "管径", dataIndex: "diameter", key: "diameter" },
+    { title: "长度", dataIndex: "length", key: "length" },
+    { title: "材质", dataIndex: "material", key: "material" },
+    { title: "状态", dataIndex: "status", key: "status" },
+    ...commonColumns,
+  ]
+
+  const facilityColumns = [
+    { title: "设施编号", dataIndex: "id", key: "id" },
+    { title: "设施名称", dataIndex: "name", key: "name" },
+    { title: "设施类型", dataIndex: "type", key: "type" },
+    { title: "处理能力", dataIndex: "capacity", key: "capacity" },
+    { title: "功率/当前液位", dataIndex: "power", key: "power" },
+    { title: "状态", dataIndex: "status", key: "status" },
+    ...commonColumns,
+  ]
+
+  const waterloggingColumns = [
+    { title: "点位编号", dataIndex: "id", key: "id" },
+    { title: "点位名称", dataIndex: "name", key: "name" },
+    { title: "位置", dataIndex: "location", key: "location" },
+    { title: "风险等级", dataIndex: "riskLevel", key: "riskLevel" },
+    { title: "历史最大积水深度", dataIndex: "historicalDepth", key: "historicalDepth" },
+    { title: "状态", dataIndex: "status", key: "status" },
+    ...commonColumns,
+  ]
+
+  const deviceColumns = [
+    { title: "设备编号", dataIndex: "id", key: "id" },
+    { title: "设备名称", dataIndex: "name", key: "name" },
+    { title: "设备类型", dataIndex: "type", key: "type" },
+    { title: "安装位置", dataIndex: "location", key: "location" },
+    { title: "安装日期", dataIndex: "installDate", key: "installDate" },
+    { title: "最后维护", dataIndex: "lastMaintenance", key: "lastMaintenance" },
+    { title: "状态", dataIndex: "status", key: "status" },
+    ...commonColumns,
+  ]
+
+  const renderTabContent = () => {
+    switch (selectedTab) {
+      case "drainage-areas":
+        return (
+          <Card title="排水分区基础数据管理">
+            <div className="mb-4">
+              <Space>
+                <Input 
+                  placeholder="分区名称" 
+                  prefix={<SearchOutlined />} 
+                  value={searchParams.drainageArea.name}
+                  onChange={e => updateSearchParams("drainageArea", "name", e.target.value)}
+                />
+                <Select 
+                  placeholder="分区类型" 
+                  style={{ width: 120 }}
+                  value={searchParams.drainageArea.type}
+                  onChange={value => updateSearchParams("drainageArea", "type", value)}
+                >
+                  <Option value="雨水分区">雨水分区</Option>
+                  <Option value="污水分区">污水分区</Option>
+                </Select>
+                <Button 
+                  type="primary" 
+                  icon={<SearchOutlined />} 
+                  onClick={() => handleSearch("drainage")}
+                >
+                  查询
+                </Button>
+                <Button 
+                  type="primary" 
+                  icon={<PlusOutlined />} 
+                  onClick={handleAdd}
+                >
+                  新增
+                </Button>
+              </Space>
+            </div>
+            <Table columns={drainageAreaColumns} dataSource={filteredDrainageAreas} />
+          </Card>
+        )
+
+      case "pipeline-network":
+        return (
+          <Card title="排水管网基础数据管理">
+            <div className="mb-4">
+              <Space>
+                <Input 
+                  placeholder="管线编号" 
+                  prefix={<SearchOutlined />} 
+                  value={searchParams.pipeline.id}
+                  onChange={e => updateSearchParams("pipeline", "id", e.target.value)}
+                />
+                <Select 
+                  placeholder="管线类型" 
+                  style={{ width: 120 }}
+                  value={searchParams.pipeline.type}
+                  onChange={value => updateSearchParams("pipeline", "type", value)}
+                >
+                  <Option value="雨水管">雨水管</Option>
+                  <Option value="污水管">污水管</Option>
+                </Select>
+                <Button 
+                  type="primary" 
+                  icon={<SearchOutlined />} 
+                  onClick={() => handleSearch("pipeline")}
+                >
+                  查询
+                </Button>
+                <Button 
+                  type="primary" 
+                  icon={<PlusOutlined />} 
+                  onClick={handleAdd}
+                >
+                  新增
+                </Button>
+              </Space>
+            </div>
+            <Table columns={pipelineColumns} dataSource={filteredPipelineData} />
+          </Card>
+        )
+
+      case "engineering-facilities":
+        return (
+          <Card title="工程设施基础数据管理">
+            <div className="mb-4">
+              <Space>
+                <Input 
+                  placeholder="设施名称" 
+                  prefix={<SearchOutlined />} 
+                  value={searchParams.facility.name}
+                  onChange={e => updateSearchParams("facility", "name", e.target.value)}
+                />
+                <Select 
+                  placeholder="设施类型" 
+                  style={{ width: 120 }}
+                  value={searchParams.facility.type}
+                  onChange={value => updateSearchParams("facility", "type", value)}
+                >
+                  <Option value="泵站">泵站</Option>
+                  <Option value="调蓄设施">调蓄设施</Option>
+                  <Option value="闸门">闸门</Option>
+                </Select>
+                <Button 
+                  type="primary" 
+                  icon={<SearchOutlined />} 
+                  onClick={() => handleSearch("facility")}
+                >
+                  查询
+                </Button>
+                <Button 
+                  type="primary" 
+                  icon={<PlusOutlined />} 
+                  onClick={handleAdd}
+                >
+                  新增
+                </Button>
+              </Space>
+            </div>
+            <Table columns={facilityColumns} dataSource={filteredEngineeringFacilities} />
+          </Card>
+        )
+
+      case "waterlogging-points":
+        return (
+          <Card title="易积水点管理">
+            <div className="mb-4">
+              <Space>
+                <Input 
+                  placeholder="点位名称" 
+                  prefix={<SearchOutlined />} 
+                  value={searchParams.waterlogging.name}
+                  onChange={e => updateSearchParams("waterlogging", "name", e.target.value)}
+                />
+                <Select 
+                  placeholder="风险等级" 
+                  style={{ width: 120 }}
+                  value={searchParams.waterlogging.riskLevel}
+                  onChange={value => updateSearchParams("waterlogging", "riskLevel", value)}
+                >
+                  <Option value="高">高</Option>
+                  <Option value="中">中</Option>
+                  <Option value="低">低</Option>
+                </Select>
+                <Button 
+                  type="primary" 
+                  icon={<SearchOutlined />} 
+                  onClick={() => handleSearch("waterlogging")}
+                >
+                  查询
+                </Button>
+                <Button 
+                  type="primary" 
+                  icon={<PlusOutlined />} 
+                  onClick={handleAdd}
+                >
+                  新增
+                </Button>
+              </Space>
+            </div>
+            <Table columns={waterloggingColumns} dataSource={filteredWaterloggingPoints} />
+          </Card>
+        )
+
+      case "monitoring-devices":
+        return (
+          <Card title="监测设备管理">
+            <div className="mb-4">
+              <Space>
+                <Input 
+                  placeholder="设备编号" 
+                  prefix={<SearchOutlined />} 
+                  value={searchParams.device.id}
+                  onChange={e => updateSearchParams("device", "id", e.target.value)}
+                />
+                <Select 
+                  placeholder="设备类型" 
+                  style={{ width: 120 }}
+                  value={searchParams.device.type}
+                  onChange={value => updateSearchParams("device", "type", value)}
+                >
+                  <Option value="液位计">液位计</Option>
+                  <Option value="流量计">流量计</Option>
+                  <Option value="泵站设备">泵站设备</Option>
+                </Select>
+                <Button 
+                  type="primary" 
+                  icon={<SearchOutlined />} 
+                  onClick={() => handleSearch("device")}
+                >
+                  查询
+                </Button>
+                <Button 
+                  type="primary" 
+                  icon={<PlusOutlined />} 
+                  onClick={handleAdd}
+                >
+                  新增
+                </Button>
+              </Space>
+            </div>
+            <Table columns={deviceColumns} dataSource={filteredMonitoringDevices} />
+          </Card>
+        )
+
+      default:
+        return null
+    }
+  }
+
+  // 获取当前tab的表单字段
+  const getFormFields = () => {
+    switch (selectedTab) {
+      case "drainage-areas":
+        return (
+          <>
+            <Form.Item 
+              name="name" 
+              label="分区名称" 
+              rules={[{ required: true, message: '请输入分区名称' }]}
+            >
+              <Input />
+            </Form.Item>
+            <Form.Item 
+              name="type" 
+              label="分区类型" 
+              rules={[{ required: true, message: '请选择分区类型' }]}
+            >
+              <Select>
+                <Option value="雨水分区">雨水分区</Option>
+                <Option value="污水分区">污水分区</Option>
+              </Select>
+            </Form.Item>
+            <Form.Item name="area" label="面积(km²)">
+              <Input />
+            </Form.Item>
+            <Form.Item name="population" label="服务人口">
+              <Input />
+            </Form.Item>
+            <Form.Item name="status" label="状态">
+              <Select>
+                <Option value="正常">正常</Option>
+                <Option value="维护中">维护中</Option>
+              </Select>
+            </Form.Item>
+          </>
+        )
+        
+      case "pipeline-network":
+        return (
+          <>
+            <Form.Item 
+              name="name" 
+              label="管线名称" 
+              rules={[{ required: true, message: '请输入管线名称' }]}
+            >
+              <Input />
+            </Form.Item>
+            <Form.Item 
+              name="type" 
+              label="管线类型" 
+              rules={[{ required: true, message: '请选择管线类型' }]}
+            >
+              <Select>
+                <Option value="雨水管">雨水管</Option>
+                <Option value="污水管">污水管</Option>
+              </Select>
+            </Form.Item>
+            <Form.Item name="diameter" label="管径">
+              <Input />
+            </Form.Item>
+            <Form.Item name="length" label="长度">
+              <Input />
+            </Form.Item>
+            <Form.Item name="material" label="材质">
+              <Input />
+            </Form.Item>
+            <Form.Item name="status" label="状态">
+              <Select>
+                <Option value="良好">良好</Option>
+                <Option value="一般">一般</Option>
+                <Option value="需维护">需维护</Option>
+              </Select>
+            </Form.Item>
+          </>
+        )
+        
+      case "engineering-facilities":
+        return (
+          <>
+            <Form.Item 
+              name="name" 
+              label="设施名称" 
+              rules={[{ required: true, message: '请输入设施名称' }]}
+            >
+              <Input />
+            </Form.Item>
+            <Form.Item 
+              name="type" 
+              label="设施类型" 
+              rules={[{ required: true, message: '请选择设施类型' }]}
+            >
+              <Select>
+                <Option value="泵站">泵站</Option>
+                <Option value="调蓄设施">调蓄设施</Option>
+                <Option value="闸门">闸门</Option>
+              </Select>
+            </Form.Item>
+            <Form.Item name="capacity" label="处理能力">
+              <Input />
+            </Form.Item>
+            <Form.Item name="power" label="功率/当前液位">
+              <Input />
+            </Form.Item>
+            <Form.Item name="status" label="状态">
+              <Select>
+                <Option value="运行中">运行中</Option>
+                <Option value="待命">待命</Option>
+                <Option value="维护中">维护中</Option>
+              </Select>
+            </Form.Item>
+          </>
+        )
+        
+      case "waterlogging-points":
+        return (
+          <>
+            <Form.Item 
+              name="name" 
+              label="点位名称" 
+              rules={[{ required: true, message: '请输入点位名称' }]}
+            >
+              <Input />
+            </Form.Item>
+            <Form.Item name="location" label="位置">
+              <Input />
+            </Form.Item>
+            <Form.Item name="riskLevel" label="风险等级">
+              <Select>
+                <Option value="高">高</Option>
+                <Option value="中">中</Option>
+                <Option value="低">低</Option>
+              </Select>
+            </Form.Item>
+            <Form.Item name="historicalDepth" label="历史最大积水深度">
+              <Input />
+            </Form.Item>
+            <Form.Item name="status" label="状态">
+              <Select>
+                <Option value="监控中">监控中</Option>
+                <Option value="维护中">维护中</Option>
+              </Select>
+            </Form.Item>
+          </>
+        )
+        
+      case "monitoring-devices":
+        return (
+          <>
+            <Form.Item 
+              name="name" 
+              label="设备名称" 
+              rules={[{ required: true, message: '请输入设备名称' }]}
+            >
+              <Input />
+            </Form.Item>
+            <Form.Item 
+              name="type" 
+              label="设备类型" 
+              rules={[{ required: true, message: '请选择设备类型' }]}
+            >
+              <Select>
+                <Option value="液位计">液位计</Option>
+                <Option value="流量计">流量计</Option>
+                <Option value="泵站设备">泵站设备</Option>
+              </Select>
+            </Form.Item>
+            <Form.Item name="location" label="安装位置">
+              <Input />
+            </Form.Item>
+            <Form.Item name="installDate" label="安装日期">
+              <Input type="date" />
+            </Form.Item>
+            <Form.Item name="lastMaintenance" label="最后维护">
+              <Input type="date" />
+            </Form.Item>
+            <Form.Item name="status" label="状态">
+              <Select>
+                <Option value="在线">在线</Option>
+                <Option value="离线">离线</Option>
+                <Option value="维护中">维护中</Option>
+              </Select>
+            </Form.Item>
+          </>
+        )
+        
+      default:
+        return null
+    }
+  }
+
+  // 获取详情描述项
+  const getDetailDescriptions = () => {
+    switch (selectedTab) {
+      case "drainage-areas":
+        return (
+          <Descriptions title="排水分区详情" column={2} bordered>
+            <Descriptions.Item label="分区编号">{detailRecord?.id}</Descriptions.Item>
+            <Descriptions.Item label="分区名称">{detailRecord?.name}</Descriptions.Item>
+            <Descriptions.Item label="分区类型">{detailRecord?.type}</Descriptions.Item>
+            <Descriptions.Item label="面积">{detailRecord?.area} km²</Descriptions.Item>
+            <Descriptions.Item label="服务人口">{detailRecord?.population}</Descriptions.Item>
+            <Descriptions.Item label="状态">{detailRecord?.status}</Descriptions.Item>
+          </Descriptions>
+        )
+        
+      case "pipeline-network":
+        return (
+          <Descriptions title="管网设施详情" column={2} bordered>
+            <Descriptions.Item label="管线编号">{detailRecord?.id}</Descriptions.Item>
+            <Descriptions.Item label="管线名称">{detailRecord?.name}</Descriptions.Item>
+            <Descriptions.Item label="管线类型">{detailRecord?.type}</Descriptions.Item>
+            <Descriptions.Item label="管径">{detailRecord?.diameter}</Descriptions.Item>
+            <Descriptions.Item label="长度">{detailRecord?.length}</Descriptions.Item>
+            <Descriptions.Item label="材质">{detailRecord?.material}</Descriptions.Item>
+            <Descriptions.Item label="状态">{detailRecord?.status}</Descriptions.Item>
+          </Descriptions>
+        )
+        
+      case "engineering-facilities":
+        return (
+          <Descriptions title="工程设施详情" column={2} bordered>
+            <Descriptions.Item label="设施编号">{detailRecord?.id}</Descriptions.Item>
+            <Descriptions.Item label="设施名称">{detailRecord?.name}</Descriptions.Item>
+            <Descriptions.Item label="设施类型">{detailRecord?.type}</Descriptions.Item>
+            <Descriptions.Item label="处理能力">{detailRecord?.capacity}</Descriptions.Item>
+            <Descriptions.Item label="功率/当前液位">{detailRecord?.power || detailRecord?.currentLevel}</Descriptions.Item>
+            <Descriptions.Item label="状态">{detailRecord?.status}</Descriptions.Item>
+          </Descriptions>
+        )
+        
+      case "waterlogging-points":
+        return (
+          <Descriptions title="易积水点详情" column={2} bordered>
+            <Descriptions.Item label="点位编号">{detailRecord?.id}</Descriptions.Item>
+            <Descriptions.Item label="点位名称">{detailRecord?.name}</Descriptions.Item>
+            <Descriptions.Item label="位置">{detailRecord?.location}</Descriptions.Item>
+            <Descriptions.Item label="风险等级">{detailRecord?.riskLevel}</Descriptions.Item>
+            <Descriptions.Item label="历史最大积水深度">{detailRecord?.historicalDepth}</Descriptions.Item>
+            <Descriptions.Item label="状态">{detailRecord?.status}</Descriptions.Item>
+          </Descriptions>
+        )
+        
+      case "monitoring-devices":
+        return (
+          <Descriptions title="监测设备详情" column={2} bordered>
+            <Descriptions.Item label="设备编号">{detailRecord?.id}</Descriptions.Item>
+            <Descriptions.Item label="设备名称">{detailRecord?.name}</Descriptions.Item>
+            <Descriptions.Item label="设备类型">{detailRecord?.type}</Descriptions.Item>
+            <Descriptions.Item label="安装位置">{detailRecord?.location}</Descriptions.Item>
+            <Descriptions.Item label="安装日期">{detailRecord?.installDate}</Descriptions.Item>
+            <Descriptions.Item label="最后维护">{detailRecord?.lastMaintenance}</Descriptions.Item>
+            <Descriptions.Item label="状态">{detailRecord?.status}</Descriptions.Item>
+          </Descriptions>
+        )
+        
+      default:
+        return null
+    }
+  }
+
+  // 生成图表选项
+  const generateChartOption = () => {
+    switch (selectedTab) {
+      case "drainage-areas":
+        return {
+          title: {
+            text: '排水分区统计',
+            left: 'center'
+          },
+          tooltip: {
+            trigger: 'item'
+          },
+          legend: {
+            orient: 'vertical',
+            left: 'left'
+          },
+          series: [
+            {
+              name: '分区类型',
+              type: 'pie',
+              radius: '50%',
+              data: [
+                { value: drainageAreas.filter(item => item.type === '雨水分区').length, name: '雨水分区' },
+                { value: drainageAreas.filter(item => item.type === '污水分区').length, name: '污水分区' }
+              ],
+              emphasis: {
+                itemStyle: {
+                  shadowBlur: 10,
+                  shadowOffsetX: 0,
+                  shadowColor: 'rgba(0, 0, 0, 0.5)'
+                }
+              }
+            }
+          ]
+        }
+        
+      case "pipeline-network":
+        return {
+          title: {
+            text: '管网长度统计',
+            left: 'center'
+          },
+          tooltip: {
+            trigger: 'axis'
+          },
+          xAxis: {
+            type: 'category',
+            data: pipelineData.map(item => item.name)
+          },
+          yAxis: {
+            type: 'value',
+            name: '长度(km)'
+          },
+          series: [
+            {
+              data: pipelineData.map(item => parseFloat(item.length?.replace('km', '') || '0')),
+              type: 'bar'
+            }
+          ]
+        }
+        
+      case "engineering-facilities":
+        return {
+          title: {
+            text: '设施状态统计',
+            left: 'center'
+          },
+          tooltip: {
+            trigger: 'item'
+          },
+          legend: {
+            orient: 'vertical',
+            left: 'left'
+          },
+          series: [
+            {
+              name: '设施状态',
+              type: 'pie',
+              radius: '50%',
+              data: [
+                { value: engineeringFacilities.filter(item => item.status === '运行中').length, name: '运行中' },
+                { value: engineeringFacilities.filter(item => item.status === '待命').length, name: '待命' },
+                { value: engineeringFacilities.filter(item => item.status === '维护中').length, name: '维护中' }
+              ],
+              emphasis: {
+                itemStyle: {
+                  shadowBlur: 10,
+                  shadowOffsetX: 0,
+                  shadowColor: 'rgba(0, 0, 0, 0.5)'
+                }
+              }
+            }
+          ]
+        }
+        
+      case "waterlogging-points":
+        return {
+          title: {
+            text: '积水点风险等级统计',
+            left: 'center'
+          },
+          tooltip: {
+            trigger: 'axis'
+          },
+          xAxis: {
+            type: 'category',
+            data: ['高', '中', '低']
+          },
+          yAxis: {
+            type: 'value',
+            name: '数量(个)'
+          },
+          series: [
+            {
+              data: [
+                waterloggingPoints.filter(item => item.riskLevel === '高').length,
+                waterloggingPoints.filter(item => item.riskLevel === '中').length,
+                waterloggingPoints.filter(item => item.riskLevel === '低').length
+              ],
+              type: 'bar',
+              itemStyle: {
+                color: (params: any) => {
+                  const colors = ['#ff4d4f', '#faad14', '#52c41a']
+                  return colors[params.dataIndex]
+                }
+              }
+            }
+          ]
+        }
+        
+      case "monitoring-devices":
+        return {
+          title: {
+            text: '设备状态统计',
+            left: 'center'
+          },
+          tooltip: {
+            trigger: 'item'
+          },
+          legend: {
+            orient: 'vertical',
+            left: 'left'
+          },
+          series: [
+            {
+              name: '设备状态',
+              type: 'pie',
+              radius: '50%',
+              data: [
+                { value: monitoringDevices.filter(item => item.status === '在线').length, name: '在线' },
+                { value: monitoringDevices.filter(item => item.status === '离线').length, name: '离线' },
+                { value: monitoringDevices.filter(item => item.status === '维护中').length, name: '维护中' }
+              ],
+              emphasis: {
+                itemStyle: {
+                  shadowBlur: 10,
+                  shadowOffsetX: 0,
+                  shadowColor: 'rgba(0, 0, 0, 0.5)'
+                }
+              }
+            }
+          ]
+        }
+        
+      default:
+        return {}
+    }
+  }
+
+  return (
+    <div className="space-y-6">
+      {/* 统计概览 */}
+      <Row gutter={[16, 16]}>
+        <Col span={6}>
+          <Card>
+            <Statistic title="排水分区" value={drainageAreas.length} suffix="个" />
+          </Card>
+        </Col>
+        <Col span={6}>
+          <Card>
+            <Statistic title="管网长度" value={pipelineData.reduce((sum, item) => {
+              const length = parseFloat(item.length?.replace('km', '') || '0')
+              return sum + length
+            }, 0).toFixed(1)} suffix="km" />
+          </Card>
+        </Col>
+        <Col span={6}>
+          <Card>
+            <Statistic title="工程设施" value={engineeringFacilities.length} suffix="座" />
+          </Card>
+        </Col>
+        <Col span={6}>
+          <Card>
+            <Statistic title="监测设备" value={monitoringDevices.length} suffix="台" />
+          </Card>
+        </Col>
+      </Row>
+
+      <Tabs activeKey={selectedTab} onChange={setSelectedTab}>
+        <TabPane tab="排水分区" key="drainage-areas">
+          <Row gutter={[16, 16]}>
+            <Col span={16}>{renderTabContent()}</Col>
+            <Col span={8}>
+              <Card title="分区统计图" className="h-96">
+                <EChart option={generateChartOption()} style={{ height: '20rem' }} />
+              </Card>
+            </Col>
+          </Row>
+        </TabPane>
+
+        <TabPane tab="管网设施" key="pipeline-network">
+          <Row gutter={[16, 16]}>
+            <Col span={16}>{renderTabContent()}</Col>
+            <Col span={8}>
+              <Card title="管网统计图" className="h-96">
+                <EChart option={generateChartOption()} style={{ height: '20rem' }} />
+              </Card>
+            </Col>
+          </Row>
+        </TabPane>
+
+        <TabPane tab="工程设施" key="engineering-facilities">
+          <Row gutter={[16, 16]}>
+            <Col span={16}>{renderTabContent()}</Col>
+            <Col span={8}>
+              <Card title="设施统计图" className="h-96">
+                <EChart option={generateChartOption()} style={{ height: '20rem' }} />
+              </Card>
+            </Col>
+          </Row>
+        </TabPane>
+
+        <TabPane tab="易积水点" key="waterlogging-points">
+          <Row gutter={[16, 16]}>
+            <Col span={16}>{renderTabContent()}</Col>
+            <Col span={8}>
+              <Card title="积水点统计图" className="h-96">
+                <EChart option={generateChartOption()} style={{ height: '20rem' }} />
+              </Card>
+            </Col>
+          </Row>
+        </TabPane>
+
+        <TabPane tab="监测设备" key="monitoring-devices">
+          {renderTabContent()}
+        </TabPane>
+      </Tabs>
+
+      {/* 编辑/新增模态框 */}
+      <Modal
+        title={editingRecord ? "编辑" : "新增"}
+        open={modalVisible}
+        onCancel={() => {
+          setModalVisible(false)
+          setEditingRecord(null)
+          form.resetFields()
+        }}
+        onOk={handleSave}
+        width={600}
+      >
+        <Form form={form} layout="vertical">
+          {getFormFields()}
+        </Form>
+      </Modal>
+
+      {/* 详情模态框 */}
+      <Modal
+        title="详情信息"
+        open={detailModalVisible}
+        onCancel={() => {
+          setDetailModalVisible(false)
+          setDetailRecord(null)
+        }}
+        onOk={() => {
+          setDetailModalVisible(false)
+          setDetailRecord(null)
+        }}
+        width={800}
+      >
+        {getDetailDescriptions()}
+        {selectedTab !== "monitoring-devices" && (
+          <div className="mt-6" style={{ height: 300 }}>
+            <EChart option={generateChartOption()} style={{ height: '20rem' }} />
+          </div>
+        )}
+      </Modal>
+    </div>
+  )
+}