"use client"; import React, { useState } from "react"; import { Box, Button, Card, CardContent, Chip, Collapse, FormControlLabel, Checkbox, IconButton, Tooltip, Typography, } from "@mui/material"; import { Info as InfoIcon } from "@mui/icons-material"; import { DatePicker } from "@mui/x-date-pickers/DatePicker"; import { LocalizationProvider } from "@mui/x-date-pickers/LocalizationProvider"; import { AdapterDayjs } from "@mui/x-date-pickers/AdapterDayjs"; import "dayjs/locale/zh-cn"; import dayjs, { Dayjs } from "dayjs"; import { useNotification } from "@refinedev/core"; import { api } from "@/lib/api"; import { NETWORK_NAME, config } from "@config/config"; import { BurstLocationResult, BurstLocationSchemeDetail, BurstSchemeRecord, } from "./types"; import { FLOW_DISPLAY_UNIT } from "../DMALeakDetection/utils"; interface Props { onViewResult: (result: BurstLocationResult) => void; } const SchemeQuery: React.FC = ({ onViewResult }) => { const { open } = useNotification(); const [queryAll, setQueryAll] = useState(true); const [queryDate, setQueryDate] = useState(dayjs()); const [schemes, setSchemes] = useState([]); const [loading, setLoading] = useState(false); const [expandedId, setExpandedId] = useState(null); const buildDisplayResult = ( scheme: Pick, detail?: BurstLocationSchemeDetail, ): BurstLocationResult | null => { const payload = detail?.result_payload; const locatedPipe = payload?.located_pipe ?? detail?.result_summary?.located_pipe; if (!locatedPipe) return null; return { located_pipe: locatedPipe, burst_leakage: payload?.burst_leakage ?? detail?.algorithm_params?.burst_leakage ?? 0, elapsed_seconds: payload?.elapsed_seconds ?? 0, min_dpressure: payload?.min_dpressure ?? detail?.algorithm_params?.min_dpressure, basic_pressure: payload?.basic_pressure ?? detail?.algorithm_params?.basic_pressure, simulation_times: payload?.simulation_times ?? detail?.result_summary?.simulation_times ?? 0, top_candidates: payload?.top_candidates ?? [], similarity_mode: payload?.similarity_mode ?? detail?.result_summary?.similarity_mode ?? "-", scheme_name: payload?.scheme_name ?? scheme.scheme_name, username: payload?.username ?? scheme.username, network: payload?.network ?? detail?.network, data_source: payload?.data_source, observed_source: payload?.observed_source ?? detail?.observed_source, pressure_scada_ids: payload?.pressure_scada_ids ?? detail?.pressure_scada_ids, flow_scada_ids: payload?.flow_scada_ids ?? detail?.flow_scada_ids, create_time: payload?.create_time ?? scheme.create_time, scada_window: payload?.scada_window ?? detail?.scada_window, pressure_samples: payload?.pressure_samples, flow_samples: payload?.flow_samples, simulation_scheme: payload?.simulation_scheme, }; }; const handleQuery = async () => { setLoading(true); try { // API call to fetch schemes // Adjust URL as needed let url = `${config.BACKEND_URL}/api/v1/burst-location/schemes/`; const params: Record = { network: NETWORK_NAME }; if (!queryAll && queryDate) { params.query_date = queryDate.startOf("day").toISOString(); } const response = await api.get(url, { params }); setSchemes(response.data); open?.({ type: "success", message: "查询成功", description: `共找到 ${response.data.length} 条记录`, }); } catch (error: any) { console.error(error); open?.({ type: "error", message: "查询失败", description: error?.response?.data?.detail ?? "无法获取方案列表", }); } finally { setLoading(false); } }; const handleViewSchemeResult = async (schemeName: string) => { try { const response = await api.get( `${config.BACKEND_URL}/api/v1/burst-location/schemes/${encodeURIComponent(schemeName)}`, { params: { network: NETWORK_NAME } }, ); const schemeRecord = response.data as BurstSchemeRecord & { result_payload?: BurstLocationResult; }; const normalizedResult = schemeRecord.result_payload ?? buildDisplayResult( { scheme_name: schemeRecord.scheme_name, username: schemeRecord.username, create_time: schemeRecord.create_time, }, schemeRecord.scheme_detail, ); if (!normalizedResult) { throw new Error("方案详情缺少定位结果数据"); } onViewResult(normalizedResult); open?.({ type: "success", message: "方案加载成功", description: `已加载方案: ${schemeName}`, }); } catch (error: any) { open?.({ type: "error", message: "查看详情失败", description: error?.response?.data?.detail ?? "无法获取方案详情", }); } }; return ( setQueryAll(e.target.checked)} /> } label={查询全部} className="m-0" /> {schemes.length === 0 ? ( 总共 0 条 No data ) : ( 共 {schemes.length} 条记录 {schemes.map((scheme) => { const summary = scheme.scheme_detail?.result_summary; const payload = scheme.scheme_detail?.result_payload; const locatedPipe = payload?.located_pipe ?? summary?.located_pipe ?? "-"; const leakage = payload?.burst_leakage ?? scheme.scheme_detail?.algorithm_params?.burst_leakage; return ( {scheme.scheme_name} {payload?.data_source === "simulation" && payload?.simulation_scheme?.name ? ( 方案: {payload.simulation_scheme.name} ) : null} ID: {scheme.scheme_id} · 日期:{" "} {dayjs(scheme.create_time).format("MM-DD HH:mm")} setExpandedId(expandedId === scheme.scheme_id ? null : scheme.scheme_id) } color="primary" className="p-1" > 定位管段: {locatedPipe} 漏损量: {typeof leakage === "number" ? `${leakage} ${FLOW_DISPLAY_UNIT}` : "-"} 用户: {scheme.username || "-"} ); })} )} ); }; export default SchemeQuery;