From 6410df0cb7986b486f8534ff27e78084fbf9d655 Mon Sep 17 00:00:00 2001 From: Huarch Date: Wed, 15 Apr 2026 18:42:50 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=96=B9=E6=A1=88=E8=AE=B0?= =?UTF-8?q?=E5=BD=95=E7=BC=93=E5=AD=98=E6=94=AF=E6=8C=81=E5=88=B0=E7=88=86?= =?UTF-8?q?=E7=AE=A1=E5=92=8C=E6=BC=8F=E6=8D=9F=E6=A3=80=E6=B5=8B=E9=9D=A2?= =?UTF-8?q?=E6=9D=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BurstDetection/BurstDetectionPanel.tsx | 5 +++-- .../olmap/BurstDetection/SchemeQuery.tsx | 13 ++++++++---- .../BurstLocation/BurstLocationPanel.tsx | 5 +++-- .../olmap/BurstLocation/SchemeQuery.tsx | 13 ++++++++---- .../olmap/BurstSimulation/SchemeQuery.tsx | 21 +++++++++---------- .../ContaminantSimulation/SchemeQuery.tsx | 21 +++++++++---------- .../WaterQualityPanel.tsx | 8 ++++++- .../DMALeakDetectionPanel.tsx | 5 +++-- .../olmap/DMALeakDetection/SchemeQuery.tsx | 11 +++++++--- .../FlushingAnalysisPanel.tsx | 4 +++- .../olmap/FlushingAnalysis/SchemeQuery.tsx | 21 +++++++++---------- .../SchemeQuery.tsx | 21 +++++++++---------- 12 files changed, 85 insertions(+), 63 deletions(-) diff --git a/src/components/olmap/BurstDetection/BurstDetectionPanel.tsx b/src/components/olmap/BurstDetection/BurstDetectionPanel.tsx index d85182b..54a6f21 100644 --- a/src/components/olmap/BurstDetection/BurstDetectionPanel.tsx +++ b/src/components/olmap/BurstDetection/BurstDetectionPanel.tsx @@ -12,7 +12,7 @@ import { import AnalysisParameters from "./AnalysisParameters"; import DetectionResults from "./DetectionResults"; import SchemeQuery from "./SchemeQuery"; -import { BurstDetectionResult } from "./types"; +import { BurstDetectionResult, BurstDetectionSchemeRecord } from "./types"; const TabPanel = ({ value, @@ -32,6 +32,7 @@ const BurstDetectionPanel: React.FC = () => { const [open, setOpen] = useState(true); const [tab, setTab] = useState(0); const [result, setResult] = useState(null); + const [schemes, setSchemes] = useState([]); const drawerWidth = 450; const panelTitle = "爆管侦测"; @@ -139,7 +140,7 @@ const BurstDetectionPanel: React.FC = () => { - + diff --git a/src/components/olmap/BurstDetection/SchemeQuery.tsx b/src/components/olmap/BurstDetection/SchemeQuery.tsx index a00eaec..3d292e2 100644 --- a/src/components/olmap/BurstDetection/SchemeQuery.tsx +++ b/src/components/olmap/BurstDetection/SchemeQuery.tsx @@ -31,15 +31,19 @@ import { interface Props { onViewResult: (result: BurstDetectionResult) => void; + schemes?: BurstDetectionSchemeRecord[]; + onSchemesChange?: (schemes: BurstDetectionSchemeRecord[]) => void; } -const SchemeQuery: React.FC = ({ onViewResult }) => { +const SchemeQuery: React.FC = ({ onViewResult, schemes: externalSchemes, onSchemesChange }) => { const { open } = useNotification(); const [queryAll, setQueryAll] = useState(true); const [queryDate, setQueryDate] = useState(dayjs()); - const [schemes, setSchemes] = useState([]); + const [internalSchemes, setInternalSchemes] = useState([]); const [loading, setLoading] = useState(false); const [expandedId, setExpandedId] = useState(null); + const schemes = externalSchemes !== undefined ? externalSchemes : internalSchemes; + const setSchemes = onSchemesChange || setInternalSchemes; const buildDisplayResult = ( scheme: Pick, @@ -88,11 +92,12 @@ const SchemeQuery: React.FC = ({ onViewResult }) => { } const response = await api.get("/api/v1/burst-detection/schemes/", { params }); - setSchemes(response.data); + const nextSchemes = response.data as BurstDetectionSchemeRecord[]; + setSchemes(nextSchemes); open?.({ type: "success", message: "查询成功", - description: `共找到 ${response.data.length} 条侦测记录。`, + description: `共找到 ${nextSchemes.length} 条侦测记录。`, }); } catch (error: any) { open?.({ diff --git a/src/components/olmap/BurstLocation/BurstLocationPanel.tsx b/src/components/olmap/BurstLocation/BurstLocationPanel.tsx index fe56b8f..9643d0f 100644 --- a/src/components/olmap/BurstLocation/BurstLocationPanel.tsx +++ b/src/components/olmap/BurstLocation/BurstLocationPanel.tsx @@ -12,7 +12,7 @@ import { import AnalysisParameters from "./AnalysisParameters"; import LocationResults from "./LocationResults"; import SchemeQuery from "./SchemeQuery"; -import { BurstLocationResult } from "./types"; +import { BurstLocationResult, BurstSchemeRecord } from "./types"; const TabPanel = ({ value, @@ -32,6 +32,7 @@ const BurstLocationPanel: React.FC = () => { const [open, setOpen] = useState(true); const [tab, setTab] = useState(0); const [result, setResult] = useState(null); + const [schemes, setSchemes] = useState([]); const drawerWidth = 450; const panelTitle = "爆管定位"; @@ -148,7 +149,7 @@ const BurstLocationPanel: React.FC = () => { - + diff --git a/src/components/olmap/BurstLocation/SchemeQuery.tsx b/src/components/olmap/BurstLocation/SchemeQuery.tsx index 0b28bc7..bd3a100 100644 --- a/src/components/olmap/BurstLocation/SchemeQuery.tsx +++ b/src/components/olmap/BurstLocation/SchemeQuery.tsx @@ -32,15 +32,19 @@ import { FLOW_DISPLAY_UNIT, toM3h } from "@utils/units"; interface Props { onViewResult: (result: BurstLocationResult) => void; + schemes?: BurstSchemeRecord[]; + onSchemesChange?: (schemes: BurstSchemeRecord[]) => void; } -const SchemeQuery: React.FC = ({ onViewResult }) => { +const SchemeQuery: React.FC = ({ onViewResult, schemes: externalSchemes, onSchemesChange }) => { const { open } = useNotification(); const [queryAll, setQueryAll] = useState(true); const [queryDate, setQueryDate] = useState(dayjs()); - const [schemes, setSchemes] = useState([]); + const [internalSchemes, setInternalSchemes] = useState([]); const [loading, setLoading] = useState(false); const [expandedId, setExpandedId] = useState(null); + const schemes = externalSchemes !== undefined ? externalSchemes : internalSchemes; + const setSchemes = onSchemesChange || setInternalSchemes; const buildDisplayResult = ( scheme: Pick, @@ -87,11 +91,12 @@ const SchemeQuery: React.FC = ({ onViewResult }) => { } const response = await api.get(url, { params }); - setSchemes(response.data); + const nextSchemes = response.data as BurstSchemeRecord[]; + setSchemes(nextSchemes); open?.({ type: "success", message: "查询成功", - description: `共找到 ${response.data.length} 条记录`, + description: `共找到 ${nextSchemes.length} 条记录`, }); } catch (error: any) { console.error(error); diff --git a/src/components/olmap/BurstSimulation/SchemeQuery.tsx b/src/components/olmap/BurstSimulation/SchemeQuery.tsx index 65fce5c..22915e6 100644 --- a/src/components/olmap/BurstSimulation/SchemeQuery.tsx +++ b/src/components/olmap/BurstSimulation/SchemeQuery.tsx @@ -122,17 +122,16 @@ const SchemeQuery: React.FC = ({ }); } - setSchemes( - filteredResults.map((item: SchemaItem) => ({ - id: item.scheme_id, - schemeName: item.scheme_name, - type: item.scheme_type, - user: item.username, - create_time: item.create_time, - startTime: item.scheme_start_time, - schemeDetail: item.scheme_detail, - })), - ); + const nextSchemes = filteredResults.map((item: SchemaItem) => ({ + id: item.scheme_id, + schemeName: item.scheme_name, + type: item.scheme_type, + user: item.username, + create_time: item.create_time, + startTime: item.scheme_start_time, + schemeDetail: item.scheme_detail, + })); + setSchemes(nextSchemes); if (filteredResults.length === 0) { open?.({ diff --git a/src/components/olmap/ContaminantSimulation/SchemeQuery.tsx b/src/components/olmap/ContaminantSimulation/SchemeQuery.tsx index ccef88d..faec59a 100644 --- a/src/components/olmap/ContaminantSimulation/SchemeQuery.tsx +++ b/src/components/olmap/ContaminantSimulation/SchemeQuery.tsx @@ -195,17 +195,16 @@ const SchemeQuery: React.FC = ({ ); } - setSchemes( - filteredResults.map((item: ContaminantSchemaItem) => ({ - id: item.scheme_id, - schemeName: item.scheme_name, - type: item.scheme_type, - user: item.username, - create_time: item.create_time, - startTime: item.scheme_start_time, - schemeDetail: item.scheme_detail, - })), - ); + const nextSchemes = filteredResults.map((item: ContaminantSchemaItem) => ({ + id: item.scheme_id, + schemeName: item.scheme_name, + type: item.scheme_type, + user: item.username, + create_time: item.create_time, + startTime: item.scheme_start_time, + schemeDetail: item.scheme_detail, + })); + setSchemes(nextSchemes); if (filteredResults.length === 0) { open?.({ diff --git a/src/components/olmap/ContaminantSimulation/WaterQualityPanel.tsx b/src/components/olmap/ContaminantSimulation/WaterQualityPanel.tsx index d7ba9e4..e7709ac 100644 --- a/src/components/olmap/ContaminantSimulation/WaterQualityPanel.tsx +++ b/src/components/olmap/ContaminantSimulation/WaterQualityPanel.tsx @@ -20,6 +20,7 @@ import { import ContaminantAnalysisParameters from "./AnalysisParameters"; import ContaminantSchemeQuery from "./SchemeQuery"; import { useData } from "@components/olmap/core/MapComponent"; +import { ContaminantSchemeRecord } from "./types"; interface WaterQualityPanelProps { open?: boolean; @@ -32,6 +33,7 @@ const WaterQualityPanel: React.FC = ({ }) => { const [internalOpen, setInternalOpen] = useState(true); const [currentTab, setCurrentTab] = useState(0); + const [schemes, setSchemes] = useState([]); const data = useData(); @@ -172,7 +174,11 @@ const WaterQualityPanel: React.FC = ({ - setCurrentTab(2)} /> + setCurrentTab(2)} + /> diff --git a/src/components/olmap/DMALeakDetection/DMALeakDetectionPanel.tsx b/src/components/olmap/DMALeakDetection/DMALeakDetectionPanel.tsx index ec36d49..40d4c69 100644 --- a/src/components/olmap/DMALeakDetection/DMALeakDetectionPanel.tsx +++ b/src/components/olmap/DMALeakDetection/DMALeakDetectionPanel.tsx @@ -27,7 +27,7 @@ import AnalysisParameters from "./AnalysisParameters"; import SchemeQuery from "./SchemeQuery"; import RecognitionResults from "./RecognitionResults"; import { getAreaColor } from "./utils"; -import { LeakageResultDetail } from "./types"; +import { LeakageResultDetail, LeakageSchemeRecord } from "./types"; import { config } from "@/config/config"; const TabPanel = ({ @@ -52,6 +52,7 @@ const DMALeakDetectionPanel: React.FC = () => { const [tab, setTab] = useState(0); const [result, setResult] = useState(null); const [loadedResult, setLoadedResult] = useState(null); + const [schemes, setSchemes] = useState([]); const drawerWidth = 450; const panelTitle = "DMA 漏损识别"; @@ -277,7 +278,7 @@ const DMALeakDetectionPanel: React.FC = () => { - + diff --git a/src/components/olmap/DMALeakDetection/SchemeQuery.tsx b/src/components/olmap/DMALeakDetection/SchemeQuery.tsx index 38fb60b..cd709af 100644 --- a/src/components/olmap/DMALeakDetection/SchemeQuery.tsx +++ b/src/components/olmap/DMALeakDetection/SchemeQuery.tsx @@ -28,15 +28,19 @@ import { FLOW_DISPLAY_UNIT, toM3h } from "@utils/units"; interface Props { onViewResult: (result: LeakageResultDetail) => void; + schemes?: LeakageSchemeRecord[]; + onSchemesChange?: (schemes: LeakageSchemeRecord[]) => void; } -const SchemeQuery: React.FC = ({ onViewResult }) => { +const SchemeQuery: React.FC = ({ onViewResult, schemes: externalSchemes, onSchemesChange }) => { const { open } = useNotification(); const [queryAll, setQueryAll] = useState(true); const [queryDate, setQueryDate] = useState(dayjs()); - const [schemes, setSchemes] = useState([]); + const [internalSchemes, setInternalSchemes] = useState([]); const [loading, setLoading] = useState(false); const [expandedId, setExpandedId] = useState(null); + const schemes = externalSchemes !== undefined ? externalSchemes : internalSchemes; + const setSchemes = onSchemesChange || setInternalSchemes; const handleQuery = async () => { setLoading(true); @@ -48,7 +52,8 @@ const SchemeQuery: React.FC = ({ onViewResult }) => { const response = await api.get(`${config.BACKEND_URL}/api/v1/leakage/schemes/`, { params, }); - setSchemes(response.data); + const nextSchemes = response.data as LeakageSchemeRecord[]; + setSchemes(nextSchemes); } catch (error: any) { open?.({ type: "error", diff --git a/src/components/olmap/FlushingAnalysis/FlushingAnalysisPanel.tsx b/src/components/olmap/FlushingAnalysis/FlushingAnalysisPanel.tsx index 83523bc..c1bf39a 100644 --- a/src/components/olmap/FlushingAnalysis/FlushingAnalysisPanel.tsx +++ b/src/components/olmap/FlushingAnalysis/FlushingAnalysisPanel.tsx @@ -19,6 +19,7 @@ import { import { MdCleaningServices } from "react-icons/md"; import AnalysisParameters from "./AnalysisParameters"; import SchemeQuery from "./SchemeQuery"; +import { SchemeRecord } from "./types"; interface TabPanelProps { children?: React.ReactNode; @@ -51,6 +52,7 @@ const FlushingAnalysisPanel: React.FC = ({ }) => { const [internalOpen, setInternalOpen] = useState(true); const [currentTab, setCurrentTab] = useState(0); + const [schemes, setSchemes] = useState([]); // Using controlled or uncontrolled state const isOpen = controlledOpen !== undefined ? controlledOpen : internalOpen; @@ -183,7 +185,7 @@ const FlushingAnalysisPanel: React.FC = ({ - + diff --git a/src/components/olmap/FlushingAnalysis/SchemeQuery.tsx b/src/components/olmap/FlushingAnalysis/SchemeQuery.tsx index b37a35a..fc56bf8 100644 --- a/src/components/olmap/FlushingAnalysis/SchemeQuery.tsx +++ b/src/components/olmap/FlushingAnalysis/SchemeQuery.tsx @@ -238,17 +238,16 @@ const SchemeQuery: React.FC = ({ }); } - setSchemes( - filteredResults.map((item: SchemaItem) => ({ - id: item.scheme_id, - schemeName: item.scheme_name, - type: item.scheme_type, - user: item.username, - create_time: item.create_time, - startTime: item.scheme_start_time, - schemeDetail: item.scheme_detail, - })), - ); + const nextSchemes = filteredResults.map((item: SchemaItem) => ({ + id: item.scheme_id, + schemeName: item.scheme_name, + type: item.scheme_type, + user: item.username, + create_time: item.create_time, + startTime: item.scheme_start_time, + schemeDetail: item.scheme_detail, + })); + setSchemes(nextSchemes); if (filteredResults.length === 0) { open?.({ diff --git a/src/components/olmap/MonitoringPlaceOptimization/SchemeQuery.tsx b/src/components/olmap/MonitoringPlaceOptimization/SchemeQuery.tsx index be17175..da9899c 100644 --- a/src/components/olmap/MonitoringPlaceOptimization/SchemeQuery.tsx +++ b/src/components/olmap/MonitoringPlaceOptimization/SchemeQuery.tsx @@ -163,17 +163,16 @@ const SchemeQuery: React.FC = ({ }); } - setSchemes( - filteredResults.map((item: SchemaItem) => ({ - id: item.id, - schemeName: item.scheme_name, - sensorNumber: item.sensor_number, - minDiameter: item.min_diameter, - user: item.username, - create_time: item.create_time, - sensorLocation: item.sensor_location, - })), - ); + const nextSchemes = filteredResults.map((item: SchemaItem) => ({ + id: item.id, + schemeName: item.scheme_name, + sensorNumber: item.sensor_number, + minDiameter: item.min_diameter, + user: item.username, + create_time: item.create_time, + sensorLocation: item.sensor_location, + })); + setSchemes(nextSchemes); if (filteredResults.length === 0) { open?.({