"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(null) const [detailRecord, setDetailRecord] = useState(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 = { "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) => ( ), }, ] 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 (
} value={searchParams.drainageArea.name} onChange={e => updateSearchParams("drainageArea", "name", e.target.value)} />
) case "pipeline-network": return (
} value={searchParams.pipeline.id} onChange={e => updateSearchParams("pipeline", "id", e.target.value)} />
) case "engineering-facilities": return (
} value={searchParams.facility.name} onChange={e => updateSearchParams("facility", "name", e.target.value)} />
) case "waterlogging-points": return (
} value={searchParams.waterlogging.name} onChange={e => updateSearchParams("waterlogging", "name", e.target.value)} />
) case "monitoring-devices": return (
} value={searchParams.device.id} onChange={e => updateSearchParams("device", "id", e.target.value)} />
) default: return null } } // 获取当前tab的表单字段 const getFormFields = () => { switch (selectedTab) { case "drainage-areas": return ( <> ) case "pipeline-network": return ( <> ) case "engineering-facilities": return ( <> ) case "waterlogging-points": return ( <> ) case "monitoring-devices": return ( <> ) default: return null } } // 获取详情描述项 const getDetailDescriptions = () => { switch (selectedTab) { case "drainage-areas": return ( {detailRecord?.id} {detailRecord?.name} {detailRecord?.type} {detailRecord?.area} km² {detailRecord?.population} {detailRecord?.status} ) case "pipeline-network": return ( {detailRecord?.id} {detailRecord?.name} {detailRecord?.type} {detailRecord?.diameter} {detailRecord?.length} {detailRecord?.material} {detailRecord?.status} ) case "engineering-facilities": return ( {detailRecord?.id} {detailRecord?.name} {detailRecord?.type} {detailRecord?.capacity} {detailRecord?.power || detailRecord?.currentLevel} {detailRecord?.status} ) case "waterlogging-points": return ( {detailRecord?.id} {detailRecord?.name} {detailRecord?.location} {detailRecord?.riskLevel} {detailRecord?.historicalDepth} {detailRecord?.status} ) case "monitoring-devices": return ( {detailRecord?.id} {detailRecord?.name} {detailRecord?.type} {detailRecord?.location} {detailRecord?.installDate} {detailRecord?.lastMaintenance} {detailRecord?.status} ) 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 (
{/* 统计概览 */}
{ const length = parseFloat(item.length?.replace('km', '') || '0') return sum + length }, 0).toFixed(1)} suffix="km" /> {renderTabContent()} {renderTabContent()} {renderTabContent()} {renderTabContent()} {renderTabContent()} {/* 编辑/新增模态框 */} { setModalVisible(false) setEditingRecord(null) form.resetFields() }} onOk={handleSave} width={600} >
{getFormFields()}
{/* 详情模态框 */} { setDetailModalVisible(false) setDetailRecord(null) }} onOk={() => { setDetailModalVisible(false) setDetailRecord(null) }} width={800} > {getDetailDescriptions()} {selectedTab !== "monitoring-devices" && (
)}
) }