"use client"; import React, { useCallback, useEffect, useMemo, useState } from "react"; import { Box, Drawer, Tabs, Tab, Typography, IconButton, Tooltip, } from "@mui/material"; import { Analytics as AnalyticsIcon, Search as SearchIcon, ChevronLeft, ChevronRight, FormatListBulleted, } from "@mui/icons-material"; import { useData, useMap } from "@components/olmap/core/MapComponent"; import StyleLegend from "@components/olmap/core/Controls/StyleLegend"; import AnalysisParameters, { createDMALeakAnalysisParametersState, type DMALeakAnalysisParametersState, } from "./AnalysisParameters"; import SchemeQuery, { createDMALeakSchemeQueryState, type DMALeakSchemeQueryState, } from "./SchemeQuery"; import RecognitionResults from "./RecognitionResults"; import { applyJunctionAreaRender } from "./applyJunctionAreaRender"; import { getAreaColor } from "./utils"; import { LeakageResultDetail, LeakageSchemeRecord } from "./types"; const TabPanel = ({ value, index, children, }: { value: number; index: number; children: React.ReactNode; }) => ( ); const DMA_AREA_INDEX_PROPERTY = "dma_area_index"; const DMALeakDetectionPanel: React.FC = () => { const map = useMap(); const setSchemeRunId = useData()?.setSchemeRunId; const [open, setOpen] = useState(true); const [tab, setTab] = useState(0); const [result, setResult] = useState(null); const [loadedResult, setLoadedResult] = useState(null); const [schemes, setSchemes] = useState([]); const [analysisState, setAnalysisState] = useState( createDMALeakAnalysisParametersState, ); const [queryState, setQueryState] = useState( createDMALeakSchemeQueryState, ); const drawerWidth = 450; const panelTitle = "DMA 漏损识别"; const activeAreas = useMemo(() => loadedResult?.areas ?? [], [loadedResult]); const legendColors = useMemo( () => activeAreas.map((area) => getAreaColor(area.area_id)), [activeAreas], ); const legendLabels = useMemo( () => activeAreas.map((area) => `区域 ${area.area_id}`), [activeAreas], ); const legendBreaks = useMemo( () => Array.from({ length: activeAreas.length + 1 }, (_, i) => i + 1), [activeAreas.length], ); const handleAnalysisResult = useCallback( (res: LeakageResultDetail) => { setSchemeRunId?.(""); setResult(res); }, [setSchemeRunId], ); const handleViewResult = useCallback( (res: LeakageResultDetail, runId: string) => { setSchemeRunId?.(runId); setResult(res); setLoadedResult(res); setTab(2); }, [setSchemeRunId], ); useEffect(() => { if (!map) return; const fallbackAreaIds = Array.from( new Set(Object.values(loadedResult?.node_area_map ?? {}).map(String)), ); const areaIds = (loadedResult?.areas ?? []).length ? (loadedResult?.areas ?? []).map((area) => String(area.area_id)) : fallbackAreaIds; const areaColors = Object.fromEntries( areaIds.map((areaId) => [areaId, getAreaColor(areaId)]), ); return applyJunctionAreaRender( map, { nodeAreaMap: loadedResult?.node_area_map ?? {}, areaIds, areaColors, }, { propertyKey: DMA_AREA_INDEX_PROPERTY }, ); }, [map, loadedResult]); return ( <> {!open && ( setOpen(true)} sx={{ zIndex: 1300 }} > {panelTitle} )} {panelTitle} setOpen(false)} sx={{ color: "primary.contrastText" }} > setTab(v)} variant="fullWidth" sx={{ minHeight: 48, "& .MuiTab-root": { minHeight: 48, textTransform: "none", fontSize: "0.875rem", fontWeight: 500, transition: "all 0.2s", }, "& .Mui-selected": { color: "#257DD4", }, "& .MuiTabs-indicator": { backgroundColor: "#257DD4", }, }} > } iconPosition="start" label="识别参数" /> } iconPosition="start" label="方案查询" /> } iconPosition="start" label="识别结果" /> {loadedResult && activeAreas.length > 0 && ( )} ); }; export default DMALeakDetectionPanel;