From 6cc17bd234d981ef06cf8e888a1d4b8a14f51f41 Mon Sep 17 00:00:00 2001 From: guonan <guonan201020@163.com> Date: 星期四, 10 七月 2025 11:14:16 +0800 Subject: [PATCH] 断面 --- src/components/monifangzhen/echartInfo.vue | 773 ++++++++++++++++++++++++++-------------------------------- 1 files changed, 346 insertions(+), 427 deletions(-) diff --git a/src/components/monifangzhen/echartInfo.vue b/src/components/monifangzhen/echartInfo.vue index ce0892d..3c9bbd3 100644 --- a/src/components/monifangzhen/echartInfo.vue +++ b/src/components/monifangzhen/echartInfo.vue @@ -13,11 +13,6 @@ <div class="echartCont"> <p>鏂潰妯℃嫙</p> <div class="echartBox"> - <!-- <div> - <button id="startButton">寮�濮嬪姞杞�</button> - <button id="pauseButton">鏆傚仠鍔犺浇</button> - <button id="resetButton">閲嶇疆鍔犺浇</button> - </div> --> <div id="echarts2" style="width: 100%; height: 100%"></div> </div> </div> @@ -110,21 +105,22 @@ onUnmounted, } from "vue"; import dayjs from "dayjs"; -import { getRainfall } from "@/api"; +import { useSimStore } from "@/store/simulation"; +const simStore = useSimStore(); +const { rainFalls, intensityUnit } = simStore; -let dataIntervalId = null; // 瀹氭椂鍣� ID +let dataIntervalId = null; // 琛ㄦ牸瀹氭椂鍣� ID const jsonData = ref([]); // JSON 鏁版嵁 const tableData = ref([]); // 琛ㄦ牸鏁版嵁 const currentIndex = ref(0); // 褰撳墠鍔犺浇绱㈠紩 const isPaused = ref(false); // 鏄惁鏆傚仠鏍囧織 -const chart1Data = ref(null); -const chart2Data = ref(null); -let intervalId1 = null; -let intervalId2 = null; +const chart1Data = ref(null); //闄嶉洦鏁版嵁 +const chart2Data = ref(null); //鏂潰鏁版嵁 +let intervalId1 = null; //闄嶉洦鏁版嵁瀹氭椂鍣� +let intervalId2 = null; //鏂潰鏁版嵁瀹氭椂鍣� +// 鏍规嵁鏃堕棿杞村尮閰嶇殑x杞寸殑鏃堕棿鏄剧ず const nowTime = ref(null); - -const isFinished = ref(true); const props = defineProps({ isDynamicMode: { @@ -138,7 +134,6 @@ watch( () => props.isFinish, (newVal) => { - isFinished.value = newVal; if (!newVal) { resetTable(); chart1Data.value.resetLoading(); @@ -153,28 +148,13 @@ EventBus.on("reset-table", () => { resetTable(); // 璋冪敤閲嶇疆琛ㄦ牸鐨勫嚱鏁� }); + +// 娓呴櫎echarts鍥捐〃 EventBus.on("clear-echart", () => { - clearEchartData(); // 璋冪敤娓呴櫎鍑芥暟 + chart1Data.value.resetLoading(); + chart2Data.value.resetLoading(); }); -// 娓呴櫎 echart1/2鏁版嵁鐨勫嚱鏁� -const clearEchartData = () => { - if (myChart1) { - const currentOption = myChart1.getOption(); // 鑾峰彇褰撳墠鍥捐〃閰嶇疆 - currentOption.series.forEach((series) => { - series.data = []; // 娓呯┖姣忎釜绯诲垪鐨勬暟鎹� - }); - currentOption.xAxis[0].data = []; - myChart1.setOption(currentOption); - } - if (myChart2) { - const currentOption = myChart2.getOption(); - currentOption.series.forEach((series) => { - series.data = []; - }); - currentOption.xAxis[0].data = []; - myChart2.setOption(currentOption); - } -}; + // 娓呴櫎濞佽儊瀵硅薄涓殑鏁版嵁 const resetTable = () => { currentIndex.value = 0; @@ -184,6 +164,28 @@ } startAddingData(); }; + +// 鏆傚仠鏃跺仠姝㈡墍鏈夌殑鏇存柊 +const handleHideSchemeInfo = () => { + // 鍋滄鎵�鏈夊姩鎬佹洿鏂� + if (intervalId1) { + clearInterval(intervalId1); + chart1Data.value.stopUpdating(); // 姣忛殧 1 绉掓洿鏂颁竴娆� + intervalId1 = null; + } + if (intervalId2) { + clearInterval(intervalId2); + chart2Data.value.stopUpdating(); // 姣忛殧 1 绉掓洿鏂颁竴娆� + intervalId2 = null; + } + if (dataIntervalId) { + clearInterval(dataIntervalId); + dataIntervalId = null; + } +}; + +// 鐩戝惉鏃堕棿杞寸粨鏉熸ā鎷� +EventBus.on("hide-schemeInfo", handleHideSchemeInfo); // 鐩戝惉鐖剁粍浠朵紶閫掔殑鏁版嵁鍙樺寲 watch( @@ -213,49 +215,26 @@ }, 10); } } else { - // 鍋滄鎵�鏈夊姩鎬佹洿鏂� - if (intervalId1) { - clearInterval(intervalId1); - chart1Data.value.stopUpdating(); // 姣忛殧 1 绉掓洿鏂颁竴娆� - - intervalId1 = null; - } - if (intervalId2) { - console.log(intervalId2, "鏆傚仠"); - clearInterval(intervalId2); - chart2Data.value.stopUpdating(); // 姣忛殧 1 绉掓洿鏂颁竴娆� - intervalId2 = null; - } - if (dataIntervalId) { - clearInterval(dataIntervalId); - dataIntervalId = null; - } + handleHideSchemeInfo(); } }, { immediate: true } // 绔嬪嵆鎵ц鐩戝惉鍣� ); + // 鐐瑰嚮鏁版嵁瀹炵幇闈㈢墖闂姩鐨勮Е鍙戝嚱鏁� function handleRowClick(row) { console.log("Row clicked:", row); // 瑙﹀彂浜嬩欢锛屽皢褰撳墠琛岀殑 ID 鍙戦�佸埌鍦板浘缁勪欢 EventBus.emit("row-clicked", row.id); } -const listData = cityData.listData; -const data = ref([ - 8.16, 15.38, 13.94, 9.46, 86.42, 71.32, 28.52, 25.9, 13.74, 14.54, 15.53, - 9.17, 0, 0.09, 0.86, 8.15, 44.8, 21.86, 6.2, 4.98, 2.82, 2.36, 3.1, 1.06, -]); + const rainChangeShow = ref(false); const tableContainer = ref(null); let myChart1 = null; let myChart2 = null; -const getRandomInt = (min = 0, max = 100) => { - const minCeiled = Math.ceil(min); - const maxFloored = Math.floor(max); - return Math.floor(Math.random() * (maxFloored - minCeiled) + minCeiled); -}; +// 濞佽儊瀵硅薄鏁版嵁 const getDangerInfo = async () => { try { const response = await fetch( @@ -309,15 +288,6 @@ }); }; -const getRainfallData = async () => { - try { - const res = await getRainfall(); - rainfallData.value = res.data; - } catch (error) { - console.error("Error fetching rainfall data:", error); - } -}; - const rainClick = () => { rainChangeShow.value = !rainChangeShow.value; let desc = { func_name: "RainChange", visibility: rainChangeShow.value }; @@ -325,8 +295,6 @@ }; const debuffClick = () => { - // Assuming you have access to parent components in a different way in Vue 3 - // You might need to use provide/inject or props/emits instead console.log("Debuff click"); }; @@ -337,110 +305,93 @@ charts.style.height = style.height; }; +// 鏃堕棿杞存椂闂存埅鍙栧鐞� const syncTimeWithTimeline = () => { - // 2025-05-24 00:25 - // // 灏嗘椂闂村瓧绗︿覆杞崲涓哄垎閽熸暟 (鏍煎紡: "YYYY-MM-DD mm:ss") - const timeParts = nowTime.value.split(" "); - const timeOnly = timeParts[1]; // 鑾峰彇 "mm:ss" 閮ㄥ垎 - return timeOnly; + if (nowTime.value) { + const timeParts = nowTime.value.split(" "); + const timeOnly = timeParts[1]; // 鑾峰彇 "mm:ss" 閮ㄥ垎 + return timeOnly; + } }; const setEcharts1 = () => { const chartDom = document.getElementById("echarts1"); - myChart1 = echarts.init(chartDom); + const myChart1 = echarts.init(chartDom); - let rainfallData = ref([]); // 瀛樺偍浠� JSON 鏂囦欢涓姞杞界殑鏁版嵁 - let data1 = ref([]); // 闄嶉洦鏁版嵁鏁版嵁 - let data2 = ref([]); // 绱闆ㄩ噺鏁版嵁 - let xAxisData = ref([]); // 鍔ㄦ�佹椂闂磋酱 - let updateInterval = null; // 瀹氭椂鍣ㄥ彉閲� - let dataIndex = ref(0); // 褰撳墠鏁版嵁绱㈠紩锛岀敤浜庢寜椤哄簭鏇存柊 + // 鍥捐〃鏁版嵁 + let rainfallData = ref([]); + let data1 = ref([]); + let data2 = ref([]); + let xAxisData = ref(["00:00"]); + let updateInterval = null; + let dataIndex = ref(0); - // 鍔犺浇 JSON 鏁版嵁 - const loadJsonData = async () => { - try { - const response = await fetch("/json/rainfall.json"); - const result = await response.json(); - if (result && result.data && Array.isArray(result.data)) { - rainfallData.value = result.data; - - // 璁$畻 value 鍜� total 鐨勬渶澶у�� - const maxValue = Math.max( - ...rainfallData.value.map((item) => item.value) - ); - const maxTotal = Math.max( - ...rainfallData.value.map((item) => item.total) - ); - - // 鍒濆鍖栨椂闂磋酱锛堜粠00:00寮�濮嬶級 - xAxisData.value = ["00:00"]; // 鍒濆鏃堕棿鐐� - - // 鍒濆鍖栧浘琛紙浠呭姞杞界涓�涓暟鎹偣锛� - if (rainfallData.value.length > 0) { - data1.value.push(rainfallData.value[0].value); // 闄嶉洦鏁版嵁 - data2.value.push(rainfallData.value[0].total); // 绱闆ㄩ噺 - } - - // 鏍规嵁鏈�澶у�艰缃� y 杞村弬鏁板苟鍒濆鍖栧浘琛� - const yAxis1Params = calculateYAxisParams(maxValue); - const yAxis2Params = calculateYAxisParams(maxTotal); - updateChart(yAxis1Params, yAxis2Params); - } else { - console.error( - "Invalid JSON format: 'data' is missing or not an array!" - ); - } - } catch (error) { - console.error("Error fetching data:", error); - } - }; - - // 璁$畻 y 杞村弬鏁帮紙鏈�澶氭湁 4 涓偣锛� - const calculateYAxisParams = (max) => { - const step = Math.ceil(max / 3); // 鏈�澶氭湁 4 涓偣锛堝寘鎷� 0锛夛紝鎵�浠ュ垎鎴� 3 浠� + // 鍔ㄦ�佽绠梇杞磋寖鍥� + const getDynamicYAxis = (dataArray) => { + const currentMax = Math.max(...dataArray, 1); + const step = Math.ceil(currentMax / 3); return { - max: step * 3, // 纭繚鏈�澶у�兼槸姝ラ暱鐨勬暣鏁板�� + max: step * 3, interval: step, }; }; + // 鍔犺浇JSON鏁版嵁 + const loadJsonData = async () => { + try { + const result = simStore.rainFalls; + if (result?.length) { + rainfallData.value = result; + + // 鍒ゆ柇 intensityUnit 鏄惁涓� mm/15min + if (rainfallData.value.length > 0) { + // 濡傛灉鏄� mm/15min锛屽垯灏嗘墍鏈� intensity * 60 + if (intensityUnit === "mm/15min") { + rainfallData.value = rainfallData.value.map((item) => ({ + ...item, + intensity: item.intensity * 60, + total: item.total * 60, + })); + } + + // 鍒濆鍖� data1 鍜� data2锛堜粠 0 寮�濮嬶級 + data1.value = [0]; + data2.value = [0]; + + // 浣跨敤绗竴涓暟鎹」鐨� time 浣滀负鍒濆鍊� + xAxisData.value = [rainfallData.value[0]?.time || "00:00"]; + + updateChart(); + } + } + } catch (error) { + console.error("鏁版嵁鍔犺浇澶辫触:", error); + } + }; + // 鏇存柊鍥捐〃閰嶇疆 - const updateChart = (yAxis1Params, yAxis2Params) => { + const updateChart = () => { const option = { - animation: false, // 绂佺敤鍔ㄧ敾 - tooltip: { - trigger: "axis", - axisPointer: { - type: "cross", - crossStyle: { - color: "#fff", - }, - }, - }, + animation: false, + tooltip: { trigger: "axis" }, grid: { - left: "1%", - right: "1%", bottom: "1%", - containLabel: true, + containLabel: false, }, legend: { data: ["闄嶉洦鏁版嵁", "绱闆ㄩ噺"], - textStyle: { - color: "#fff", + textStyle: { color: "#fff" }, + right: "10px", + selected: { + 闄嶉洦鏁版嵁: true, + 绱闆ㄩ噺: true, }, - right: "10px", // 灏嗗浘渚嬮潬鍙宠创杈� }, xAxis: [ { type: "category", - data: xAxisData.value, // 浣跨敤鍔ㄦ�佹椂闂磋酱 - axisPointer: { - type: "shadow", - }, - axisLabel: { - color: "#fff", - rotate: 0, // 灏嗘棆杞搴﹁缃负0锛屽彇娑堝�炬枩 - }, + data: xAxisData.value, + axisLabel: { color: "#fff", rotate: 0 }, }, ], yAxis: [ @@ -448,38 +399,22 @@ type: "value", name: "鍗曚綅:mm", min: 0, - max: yAxis1Params.max, - interval: yAxis1Params.interval, - axisLabel: { - formatter: "{value}", - color: "#fff", - align: "right", // 灏嗘爣绛惧彸瀵归綈 - }, + ...getDynamicYAxis(data1.value), + axisLabel: { color: "#fff" }, + splitLine: { show: false }, nameTextStyle: { - padding: [0, 0, 0, 30], // 鍦ㄥ彸渚ф坊鍔犱竴浜涘唴杈硅窛 color: "#fff", - }, - splitLine: { - show: false, // 鍏抽棴宸︿晶 y 杞寸殑妯嚎 }, }, { type: "value", name: "鍗曚綅:mm", min: 0, - max: yAxis2Params.max, - interval: yAxis2Params.interval, - axisLabel: { - formatter: "{value}", - color: "#fff", - align: "left", // 灏嗘爣绛惧彸瀵归綈 - }, + ...getDynamicYAxis(data2.value), + axisLabel: { color: "#fff" }, + splitLine: { show: true }, nameTextStyle: { - padding: [0, 10, 0, 0], // 鍦ㄥ彸渚ф坊鍔犱竴浜涘唴杈硅窛 color: "#fff", - }, - splitLine: { - show: true, // 淇濈暀鍙充晶 y 杞寸殑妯嚎 }, }, ], @@ -487,122 +422,102 @@ { name: "闄嶉洦鏁版嵁", type: "bar", - tooltip: { - valueFormatter: function (value) { - return value + " mm/min"; - }, - }, data: data1.value, - itemStyle: { - color: "#3268fe", - }, - label: { - show: false, - color: "#fff", - }, + itemStyle: { color: "#3268fe" }, }, { name: "绱闆ㄩ噺", type: "line", yAxisIndex: 1, - tooltip: { - valueFormatter: function (value) { - return value + " mm"; - }, - }, data: data2.value, - lineStyle: { - color: "#ffb637", - }, - label: { - show: false, // 纭繚鏍囩涓嶆樉绀� - color: "#fff", - }, + lineStyle: { color: "#ffb637" }, }, ], }; - - myChart1.setOption(option); + myChart1.setOption(option, true); }; - // 瀹氫箟鎸夐『搴忔洿鏂版暟鎹殑鏂规硶 + // 鏁版嵁鏇存柊 - 姣忔娣诲姞涓�鏉℃暟鎹� const updateData = () => { if (dataIndex.value < rainfallData.value.length) { - // 鑾峰彇褰撳墠绱㈠紩鐨勬暟鎹」 - const newItem = rainfallData.value[dataIndex.value]; - data1.value.push(newItem.value); // 娣诲姞闄嶉洦鏁版嵁 - data2.value.push(newItem.total); // 娣诲姞绱闆ㄩ噺 - - const nextTime = syncTimeWithTimeline(); - xAxisData.value.push(nextTime); - - // 鏇存柊褰撳墠绱㈠紩 + const item = rainfallData.value[dataIndex.value]; + data1.value.push(item.intensity); + data2.value.push(item.total); + xAxisData.value.push(item.time); // 鉁� 鏀圭敤 item.time dataIndex.value++; - - // 鏇存柊鍥捐〃 - updateChart( - { - max: myChart1.getOption().yAxis[0].max, - interval: myChart1.getOption().yAxis[0].interval, - }, // 宸︿晶 y 杞翠繚鎸佷笉鍙� - { - max: myChart1.getOption().yAxis[1].max, - interval: myChart1.getOption().yAxis[1].interval, - } // 鍙充晶 y 杞翠繚鎸佷笉鍙� - ); + updateChart(); } else { - console.log("All data has been displayed."); - stopUpdating(); // 鍋滄瀹氭椂鏇存柊 + stopUpdating(); } }; - // 鍚姩瀹氭椂鏇存柊 - const startUpdating = (interval = 1000) => { - if (!updateInterval) { - updateInterval = setInterval(updateData, interval); // 姣忛殧 interval 姣鏇存柊涓�娆℃暟鎹� - console.log("Started updating..."); + let fixedFrameNum = null; + let startTime = null; // 灏唖tartTime绉诲埌澶栧眰 + let elapsedBeforePause = 0; // 璁板綍鏆傚仠鍓嶅凡缁忚繃鍘荤殑鏃堕棿 + + const startUpdating = () => { + if (updateInterval || dataIndex.value >= rainfallData.value.length) { + // console.log("Animation already running or completed"); + return; } + + // 濡傛灉鏄娆″惎鍔ㄦ垨閲嶆柊寮�濮� + if (fixedFrameNum === null) { + fixedFrameNum = simStore.frameNum; + elapsedBeforePause = 0; + startTime = Date.now(); + } else { + // 濡傛灉鏄殏鍋滃悗缁х画锛岃皟鏁磗tartTime浠ュ弽鏄犲凡缁忚繃鍘荤殑鏃堕棿 + startTime = Date.now() - elapsedBeforePause; + } + + const totalDuration = fixedFrameNum * 1000; + const totalPoints = rainfallData.value.length; + + const animate = (index) => { + if (index >= totalPoints) { + console.log("Animation completed"); + stopUpdating(); + return; + } + + const now = Date.now(); + const expectedTime = (index / (totalPoints - 1)) * totalDuration; + const delay = Math.max(0, startTime + expectedTime - now); + + updateInterval = setTimeout(() => { + dataIndex.value = index; + updateData(); + animate(index + 1); + }, delay); + }; + + animate(dataIndex.value); }; - // 鍋滄瀹氭椂鏇存柊 + // 鏆傚仠鍑芥暟闇�瑕佽褰曞凡缁忚繃鍘荤殑鏃堕棿 const stopUpdating = () => { if (updateInterval) { - clearInterval(updateInterval); + clearTimeout(updateInterval); updateInterval = null; - console.log("Stopped updating..."); + // 璁板綍鏆傚仠鏃跺凡缁忚繃鍘荤殑鏃堕棿 + elapsedBeforePause = Date.now() - startTime; } }; - // 閲嶇疆鍔犺浇 const resetLoading = () => { - stopUpdating(); // 鍋滄瀹氭椂鍣� - dataIndex.value = 0; // 閲嶇疆鏁版嵁绱㈠紩 - data1.value = []; // 娓呯┖闄嶉洦鏁版嵁鏁版嵁 - data2.value = []; // 娓呯┖绱闆ㄩ噺鏁版嵁 - xAxisData.value = ["00:00"]; // 閲嶇疆鏃堕棿杞� - - // 閲嶆柊鍔犺浇绗竴涓暟鎹偣 - if (rainfallData.value.length > 0) { - data1.value.push(rainfallData.value[0].value); // 闄嶉洦鏁版嵁 - data2.value.push(rainfallData.value[0].total); // 绱闆ㄩ噺 - } - - // 閲嶆柊缁樺埗鍥捐〃 - updateChart( - { - max: myChart1.getOption().yAxis[0].max, - interval: myChart1.getOption().yAxis[0].interval, - }, // 宸︿晶 y 杞翠繚鎸佷笉鍙� - { - max: myChart1.getOption().yAxis[1].max, - interval: myChart1.getOption().yAxis[1].interval, - } // 鍙充晶 y 杞翠繚鎸佷笉鍙� - ); - - console.log("Reset loading..."); + stopUpdating(); + fixedFrameNum = null; + startTime = null; + elapsedBeforePause = 0; + dataIndex.value = 0; + data1.value = [0]; + data2.value = [0]; + xAxisData.value = [rainfallData.value[0]?.time || "00:00"]; + updateChart(); }; - // 鍒濆鍖栧姞杞� JSON 鏁版嵁 + // 鍒濆鍖� loadJsonData(); return { @@ -615,96 +530,156 @@ const setEcharts2 = () => { const chartDom = document.getElementById("echarts2"); - myChart2 = echarts.init(chartDom); + const myChart2 = echarts.init(chartDom); - let jsonData = ref([]); // 瀛樺偍浠� JSON 鏂囦欢涓姞杞界殑鏁版嵁 - let data1 = ref([]); // 瀹炴椂娴侀噺鏁版嵁 - let data2 = ref([]); // 绱娴侀噺鏁版嵁 - let xAxisData = ref([]); // 鍔ㄦ�佹椂闂磋酱 - let updateInterval = null; // 瀹氭椂鍣ㄥ彉閲� - let dataIndex = ref(0); // 褰撳墠鏁版嵁绱㈠紩锛岀敤浜庢寜椤哄簭鏇存柊 + // 鍥捐〃鏁版嵁锛堜笌echarts1淇濇寔鐩稿悓缁撴瀯锛� + let flowData = ref([]); // 鍘熷鏁版嵁 + let data1 = ref([]); // 瀹炴椂娴侀噺 + let data2 = ref([]); // 娴侀�� + let xAxisData = ref(["00:00"]); + let updateInterval = ref(null); + let dataIndex = ref(0); - // 鍔犺浇 JSON 鏁版嵁 - const loadJsonData = async () => { - try { - const response = await fetch("/json/浜庡瑗挎矡鏂潰涓嬫暟鎹�.json"); - const result = await response.json(); - if (result && result.data && Array.isArray(result.data)) { - jsonData.value = result.data; + // 灏嗗悇绉嶆椂闂存牸寮忚浆鎹负鏃堕棿鎴� + const parseTimeToTimestamp = (time) => { + if (!time) return 0; - // 璁$畻 value 鍜� total 鐨勬渶澶у�� - const maxValue = Math.max(...jsonData.value.map((item) => item.value)); - const maxTotal = Math.max(...jsonData.value.map((item) => item.total)); - - // 鍒濆鍖栨椂闂磋酱锛堜粠00:00寮�濮嬶級 - xAxisData.value = ["00:00"] || syncTimeWithTimeline(); // 鍒濆鏃堕棿鐐� - - // 鍒濆鍖栧浘琛紙浠呭姞杞界涓�涓暟鎹偣锛� - if (jsonData.value.length > 0) { - data1.value.push(jsonData.value[0].value); // 瀹炴椂娴侀噺 - data2.value.push(jsonData.value[0].total); // 绱娴侀噺 - } - - // 鏍规嵁鏈�澶у�艰缃� y 杞村弬鏁板苟鍒濆鍖栧浘琛� - const yAxis1Params = calculateYAxisParams(maxValue); - const yAxis2Params = calculateYAxisParams(maxTotal); - updateChart(yAxis1Params, yAxis2Params); - } else { - console.error( - "Invalid JSON format: 'data' is missing or not an array!" - ); - } - } catch (error) { - console.error("Error fetching data:", error); + // 濡傛灉鏄椂闂存埑锛堟绉掞級 + if (typeof time === "number" && time > 1000000000000) { + return time; } + + // 濡傛灉鏄疍ate瀵硅薄 + if (time instanceof Date) { + return time.getTime(); + } + + // 濡傛灉鏄椂闂村瓧绗︿覆锛堝"2023-01-01 12:00:00"锛� + if (typeof time === "string") { + return new Date(time).getTime() || 0; + } + + return 0; }; + // 鍔ㄦ�佽绠梇杞磋寖鍥� + const calculateDynamicYAxis = (dataArray) => { + const filteredData = dataArray.filter((val) => val != null && val > 0); - // 璁$畻 y 杞村弬鏁帮紙鏈�澶氭湁 4 涓偣锛� - const calculateYAxisParams = (max) => { - const step = Math.ceil(max / 3); // 鏈�澶氭湁 4 涓偣锛堝寘鎷� 0锛夛紝鎵�浠ュ垎鎴� 3 浠� + if (filteredData.length === 0) { + // 娌℃湁鏈夋晥鏁版嵁鏃讹紝榛樿鏄剧ず涓�涓皬鍊艰寖鍥� + return { + min: 0, + max: 0.001, + interval: 0.0002, + }; + } + + const maxValue = Math.max(...filteredData); + + // 璁$畻鍚堥�傜殑姝ラ暱鍜屾渶澶у�� + const exponent = Math.floor(Math.log10(maxValue)); + const base = Math.pow(10, exponent); + let step, max; + + if (maxValue < 0.01) { + // 瀵逛簬灏忔暟鍊硷紝浣跨敤鏇寸簿缁嗙殑姝ラ暱 + step = base / 5; + max = step * 5; + } else { + // 甯歌澶勭悊 + step = base / 2; + max = step * Math.ceil(maxValue / step) + step; + } + + // 鑷姩纭畾灏忔暟浣嶆暟 + const decimalPlaces = Math.max(0, -exponent + 1); + return { - max: step * 3, // 纭繚鏈�澶у�兼槸姝ラ暱鐨勬暣鏁板�� - interval: step, + min: 0, + max: parseFloat(max.toFixed(decimalPlaces)), + interval: parseFloat(step.toFixed(decimalPlaces)), }; }; - // 鏇存柊鍥捐〃閰嶇疆 - const updateChart = (yAxis1Params, yAxis2Params) => { + // 鏍规嵁褰撳墠鏃堕棿鍔犺浇鏁版嵁锛屽鏋滄鍦ㄦ挱鏀句腑锛屼絾鏄敤鎴峰垝浜嗘柊鐨勬柇闈紝姝ゅ嚱鏁颁細鏍规嵁褰撳墠鏃堕棿缁х画鎾斁鏈�鏂扮殑鍚屾椂鍔犺浇涔嬪墠鎵�鏈夌殑 + const loadDataByCurrentTime = () => { + if (!flowData.value.length) return; + + // 灏唍owTime.value杞崲涓烘椂闂存埑 + const currentTimestamp = parseTimeToTimestamp(nowTime.value); + + // 鎵惧埌褰撳墠鏃堕棿鍙婁箣鍓嶇殑鎵�鏈夋暟鎹� + const pastData = flowData.value.filter( + (item) => item.time <= currentTimestamp + ); + + if (pastData.length) { + // 涓�娆℃�у姞杞藉巻鍙叉暟鎹� + data1.value = pastData.map((item) => item.flowRate); + data2.value = pastData.map((item) => item.velocity); + xAxisData.value = pastData.map((item) => formatTime(item.time)); + + // 璁剧疆浠庝笅涓�涓暟鎹偣寮�濮嬬户缁洿鏂� + dataIndex.value = pastData.length; + } else { + // 娌℃湁鍘嗗彶鏁版嵁锛屽垵濮嬪寲绌烘暟鎹� + resetLoading(); + } + + updateChart(); + }; + + // 鏃堕棿鏍煎紡鍖栧嚱鏁帮紙鏃堕棿鎴宠浆"HH:mm"锛� + const formatTime = (timestamp) => { + const date = new Date(timestamp); + return `${date.getHours().toString().padStart(2, "0")}:${date + .getMinutes() + .toString() + .padStart(2, "0")}`; + }; + + const loadJsonData = () => { + const crossSectionData = simStore.crossSection; + if (crossSectionData?.length) { + flowData.value = crossSectionData; + loadDataByCurrentTime(); // 鍔犺浇褰撳墠鏃堕棿涔嬪墠鐨勬暟鎹� + } else { + resetLoading(); + } + }; + + // 鍥捐〃閰嶇疆锛堜笌echarts1淇濇寔鐩稿悓缁撴瀯鍜屾牱寮忥級 + const updateChart = () => { const option = { - animation: false, // 绂佺敤鍔ㄧ敾 + animation: false, tooltip: { trigger: "axis", - axisPointer: { - type: "cross", - crossStyle: { - color: "#fff", - }, - }, + axisPointer: { type: "cross" }, }, grid: { - left: "1%", - right: "1%", + // 娉ㄩ噴鏄洜涓� y杞翠笂鐨勫崟浣嶈瑕嗙洊鎺変簡 + // left: "1%", + // right: "1%", bottom: "1%", - containLabel: true, + containLabel: false, }, legend: { - data: ["瀹炴椂娴侀噺", "绱娴侀噺"], - textStyle: { - color: "#fff", + data: ["瀹炴椂娴侀噺", "娴侀��"], + textStyle: { color: "#fff" }, + right: "10px", + selected: { + 瀹炴椂娴侀噺: true, + 娴侀��: true, }, - right: "10px", // 灏嗗浘渚嬮潬鍙宠创杈� }, xAxis: [ { type: "category", - data: xAxisData.value, // 浣跨敤鍔ㄦ�佹椂闂磋酱 - axisPointer: { - type: "shadow", - }, + data: xAxisData.value, axisLabel: { color: "#fff", - rotate: 0, // 灏嗘棆杞搴﹁缃负0锛屽彇娑堝�炬枩 + rotate: 0, }, }, ], @@ -713,38 +688,22 @@ type: "value", name: "鍗曚綅:m鲁/min", min: 0, - max: yAxis1Params.max, - interval: yAxis1Params.interval, - axisLabel: { - formatter: "{value}", - color: "#fff", - align: "right", // 灏嗘爣绛惧彸瀵归綈 - }, + ...calculateDynamicYAxis(data1.value), + axisLabel: { color: "#fff" }, + splitLine: { show: false }, nameTextStyle: { - padding: [0, 0, 0, 20], // 鍦ㄥ彸渚ф坊鍔犱竴浜涘唴杈硅窛 color: "#fff", - }, - splitLine: { - show: false, // 鍏抽棴宸︿晶 y 杞寸殑妯嚎 }, }, { type: "value", name: "鍗曚綅:m鲁", min: 0, - max: yAxis2Params.max, - interval: yAxis2Params.interval, - axisLabel: { - formatter: "{value}", - color: "#fff", - align: "left", // 灏嗘爣绛惧彸瀵归綈 - }, + ...calculateDynamicYAxis(data2.value), + axisLabel: { color: "#fff" }, + splitLine: { show: true }, nameTextStyle: { - padding: [0, 10, 0, 0], // 鍦ㄥ彸渚ф坊鍔犱竴浜涘唴杈硅窛 color: "#fff", - }, - splitLine: { - show: true, // 淇濈暀鍙充晶 y 杞寸殑妯嚎 }, }, ], @@ -752,131 +711,91 @@ { name: "瀹炴椂娴侀噺", type: "bar", - tooltip: { - valueFormatter: function (value) { - return value + " m鲁/min"; - }, - }, data: data1.value, itemStyle: { - color: "blue", // 璁剧疆鏌辩姸鍥鹃鑹蹭负钃濊壊 - }, - label: { - show: false, - color: "#fff", + color: "#3268fe", }, }, { - name: "绱娴侀噺", + name: "娴侀��", type: "line", yAxisIndex: 1, - tooltip: { - valueFormatter: function (value) { - return value + " m鲁"; - }, - }, data: data2.value, lineStyle: { - color: "#ffb637", // 璁剧疆鎶樼嚎鍥剧嚎鏉¢鑹蹭负榛勮壊 - }, - label: { - show: false, // 纭繚鏍囩涓嶆樉绀� - color: "#fff", + color: "#ffb637", }, }, ], }; - - myChart2.setOption(option); + myChart2.setOption(option, true); }; - // 瀹氫箟鎸夐『搴忔洿鏂版暟鎹殑鏂规硶 + // 鏁版嵁鏇存柊锛堜笌echarts1鐩稿悓閫昏緫锛� const updateData = () => { - if (dataIndex.value < jsonData.value.length) { - // 鑾峰彇褰撳墠绱㈠紩鐨勬暟鎹」 - const newItem = jsonData.value[dataIndex.value]; - data1.value.push(newItem.value); // 娣诲姞瀹炴椂娴侀噺 - data2.value.push(newItem.total); // 娣诲姞绱娴侀噺 - - const nextTime = syncTimeWithTimeline(); - xAxisData.value.push(nextTime); - - // 鏇存柊褰撳墠绱㈠紩 - dataIndex.value += 2; - - // 鏇存柊鍥捐〃 - updateChart( - { - max: myChart2.getOption().yAxis[0].max, - interval: myChart2.getOption().yAxis[0].interval, - }, // 宸︿晶 y 杞翠繚鎸佷笉鍙� - { - max: myChart2.getOption().yAxis[1].max, - interval: myChart2.getOption().yAxis[1].interval, - } // 鍙充晶 y 杞翠繚鎸佷笉鍙� - ); + if (dataIndex.value < flowData.value.length) { + const item = flowData.value[dataIndex.value]; + data1.value.push(item.flowRate); + data2.value.push(item.velocity); + xAxisData.value.push(syncTimeWithTimeline()); + dataIndex.value++; + updateChart(); } else { - console.log("All data has been displayed."); - stopUpdating(); // 鍋滄瀹氭椂鏇存柊 + stopUpdating(); } }; - // 鍚姩瀹氭椂鏇存柊 + // 鎺у埗鏂规硶锛堜笌echarts1瀹屽叏涓�鑷达級 const startUpdating = (interval = 1000) => { if (!updateInterval) { - updateInterval = setInterval(updateData, interval); // 姣忛殧 interval 姣鏇存柊涓�娆℃暟鎹� - console.log("Started updating..."); + updateInterval = setInterval(updateData, interval); } }; - // 鍋滄瀹氭椂鏇存柊 const stopUpdating = () => { if (updateInterval) { clearInterval(updateInterval); updateInterval = null; - console.log("Stopped updating..."); } }; - // 閲嶇疆鍔犺浇 const resetLoading = () => { - stopUpdating(); // 鍋滄瀹氭椂鍣� - dataIndex.value = 0; // 閲嶇疆鏁版嵁绱㈠紩 - data1.value = []; // 娓呯┖瀹炴椂娴侀噺鏁版嵁 - data2.value = []; // 娓呯┖绱娴侀噺鏁版嵁 - xAxisData.value = ["00:00"]; // 閲嶇疆鏃堕棿杞� - - // 閲嶆柊鍔犺浇绗竴涓暟鎹偣 - if (jsonData.value.length > 0) { - data1.value.push(jsonData.value[0].value); // 瀹炴椂娴侀噺 - data2.value.push(jsonData.value[0].total); // 绱娴侀噺 + stopUpdating(); + dataIndex.value = 0; + data1.value = []; + data2.value = []; + xAxisData.value = ["00:00"]; + if (flowData.value.length > 0) { + data1.value = [flowData.value[0].value]; + data2.value = [flowData.value[0].total]; } - - // 閲嶆柊缁樺埗鍥捐〃 - updateChart( - { - max: myChart2.getOption().yAxis[0].max, - interval: myChart2.getOption().yAxis[0].interval, - }, // 宸︿晶 y 杞翠繚鎸佷笉鍙� - { - max: myChart2.getOption().yAxis[1].max, - interval: myChart2.getOption().yAxis[1].interval, - } // 鍙充晶 y 杞翠繚鎸佷笉鍙� - ); - - console.log("Reset loading..."); + updateChart(); }; - // 鍒濆鍖栧姞杞� JSON 鏁版嵁 + // 鍒濆鍖� loadJsonData(); return { myChart2, startUpdating, stopUpdating, + loadJsonData, resetLoading, }; }; + +// 鐩戝惉 simStore.crossSection 鐨勫彉鍖� +watch( + () => simStore.crossSection, + (newVal) => { + // 纭畾鏃堕棿杞存槸鎾斁鐨勭姸鎬� + if (newVal && !isPaused.value) { + chart2Data.value.stopUpdating(); + chart2Data.value.startUpdating(); + } + chart2Data.value.loadJsonData(); + }, + { deep: true } +); const handleResize = () => { const chartBox1 = document.getElementById("echarts1"); @@ -886,7 +805,7 @@ }; onMounted(() => { - // getRainfallData(); + // 鏃堕棿杞存椂闂寸殑鍙樺寲 EventBus.on("time-update", (time) => { nowTime.value = time; }); @@ -898,7 +817,6 @@ }); onBeforeUnmount(() => { - EventBus.off("time-update"); // 娓呯悊浜嬩欢鐩戝惉 nowTime.value = null; if (intervalId1) clearInterval(intervalId1); if (intervalId2) clearInterval(intervalId2); @@ -910,6 +828,7 @@ onUnmounted(() => { EventBus.off("reset-table"); // 绉婚櫎浜嬩欢鐩戝惉 EventBus.off("clear-echart"); + EventBus.off("time-update"); // 娓呯悊浜嬩欢鐩戝惉 }); </script> -- Gitblit v1.9.3