From 4ccb3c1af05a64749b2aaba0129c72ce79c8aa42 Mon Sep 17 00:00:00 2001 From: guonan <guonan201020@163.com> Date: 星期四, 10 七月 2025 17:01:47 +0800 Subject: [PATCH] type报错问题 --- src/components/monifangzhen/echartInfo.vue | 298 ++++++++++++++++++++++++++++++++++++++++++++++------------ 1 files changed, 234 insertions(+), 64 deletions(-) diff --git a/src/components/monifangzhen/echartInfo.vue b/src/components/monifangzhen/echartInfo.vue index 6def9dc..4853ce1 100644 --- a/src/components/monifangzhen/echartInfo.vue +++ b/src/components/monifangzhen/echartInfo.vue @@ -155,6 +155,28 @@ chart2Data.value.resetLoading(); }); +// 娓呴櫎鏂潰 +EventBus.on("clear-dM", () => { + chart2Data.value.stopUpdating(); + chart2Data.value.resetLoading(); + if (intervalId2) { + clearInterval(intervalId2); + intervalId2 = null; + } + if (stopNowTimeWatch) { + stopNowTimeWatch(); // 鍋滄 nowTime 鐨勭洃鍚� + stopNowTimeWatch = null; + } +}); + +// 閲嶆柊缁樺埗鏂潰鏃讹紝閲嶆柊鍚姩 nowTime 鐩戝惉 +EventBus.on("redraw-dM", () => { + if (chart2Data.value) { + chart2Data.value.startNowTimeWatch(); + chart2Data.value.loadJsonData(); + } +}); + // 娓呴櫎濞佽儊瀵硅薄涓殑鏁版嵁 const resetTable = () => { currentIndex.value = 0; @@ -220,6 +242,7 @@ }, { immediate: true } // 绔嬪嵆鎵ц鐩戝惉鍣� ); + // 鐐瑰嚮鏁版嵁瀹炵幇闈㈢墖闂姩鐨勮Е鍙戝嚱鏁� function handleRowClick(row) { console.log("Row clicked:", row); @@ -473,7 +496,6 @@ const totalDuration = fixedFrameNum * 1000; const totalPoints = rainfallData.value.length; - const animate = (index) => { if (index >= totalPoints) { console.log("Animation completed"); @@ -505,11 +527,6 @@ } }; - // const stopUpdating = () => { - // clearTimeout(updateInterval); - // updateInterval = null; - // }; - const resetLoading = () => { stopUpdating(); fixedFrameNum = null; @@ -533,45 +550,151 @@ }; }; +let stopNowTimeWatch = null; // 瀛樺偍 watch 鐨勫仠姝㈠嚱鏁� const setEcharts2 = () => { const chartDom = document.getElementById("echarts2"); const myChart2 = echarts.init(chartDom); - // 鍥捐〃鏁版嵁锛堜笌echarts1淇濇寔鐩稿悓缁撴瀯锛� + // 鍥捐〃鏁版嵁 let flowData = ref([]); // 鍘熷鏁版嵁 let data1 = ref([]); // 瀹炴椂娴侀噺 - let data2 = ref([]); // 绱娴侀噺 + let data2 = ref([]); // 娴侀�� + let data3 = ref([]); // 娣卞害锛堟柊澧烇級 let xAxisData = ref(["00:00"]); let updateInterval = ref(null); let dataIndex = ref(0); + let lastProcessedTime = ref(0); // 璁板綍涓婃澶勭悊鐨勬椂闂存埑 - // 鍔ㄦ�佽绠梇杞磋寖鍥� - const calculateDynamicYAxis = (dataArray) => { - const currentMax = Math.max(...dataArray, 1); - const step = Math.ceil(currentMax / 3); + // 灏嗗悇绉嶆椂闂存牸寮忚浆鎹负鏃堕棿鎴� + const parseTimeToTimestamp = (time) => { + if (!time) return 0; + + // 濡傛灉鏄椂闂存埑锛堟绉掞級 + 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, isDepth = false) => { + const filteredData = dataArray.filter((val) => val != null && val > 0); + + if (filteredData.length === 0) { + return { + min: 0, + max: isDepth ? 10 : 0.001, // 娣卞害榛樿鑼冨洿鏇村ぇ + interval: isDepth ? 2 : 0.0002, + }; + } + + const maxValue = Math.max(...filteredData); + const exponent = Math.floor(Math.log10(maxValue)); + const base = Math.pow(10, exponent); + let step, max; + + if (isDepth) { + // 娣卞害鏁版嵁鐨勭壒娈婂鐞� + step = Math.ceil(maxValue / 5); // 鍥哄畾鍒嗕负5娈� + max = step * 5; + } else 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 loadJsonData = async () => { - try { - const response = await fetch("/json/浜庡瑗挎矡鏂潰涓嬫暟鎹�.json"); - const result = await response.json(); - if (result?.data?.length) { - flowData.value = result.data; - if (flowData.value.length > 0) { - data1.value = [flowData.value[0].value]; - data2.value = [flowData.value[0].total]; - updateChart(); - } + + // 鏍规嵁鎸囧畾鏃堕棿鍔犺浇鏁版嵁 + const loadDataByTime = (targetTime) => { + if (!flowData.value.length) return; + + const currentTimestamp = parseTimeToTimestamp(targetTime); + + // 鎵惧埌褰撳墠鏃堕棿鍙婁箣鍓嶇殑鎵�鏈夋暟鎹� + const pastData = flowData.value.filter( + (item) => parseTimeToTimestamp(item.time) <= currentTimestamp + ); + + if (pastData.length) { + // 涓�娆℃�у姞杞藉巻鍙叉暟鎹� + data1.value = pastData.map((item) => item.flowRate); + data2.value = pastData.map((item) => item.velocity); + data3.value = pastData.map((item) => item.depth); + xAxisData.value = pastData.map((item) => formatTime(item.time)); + + // 璁剧疆浠庝笅涓�涓暟鎹偣寮�濮嬬户缁洿鏂� + dataIndex.value = pastData.length; + + // 鏇存柊鏈�鍚庡鐞嗙殑鏃堕棿 + lastProcessedTime.value = currentTimestamp; + } else { + // 娌℃湁鍘嗗彶鏁版嵁锛屽垵濮嬪寲绌烘暟鎹� + resetLoading(); + } + + updateChart(); + }; + + // 澶勭悊鏃堕棿璺冲彉 + const handleTimeJump = (newTime) => { + const newTimestamp = parseTimeToTimestamp(newTime); + const timeDiff = Math.abs(newTimestamp - lastProcessedTime.value); + + // 濡傛灉鏃堕棿鍙樺寲瓒呰繃5绉掞紝璁や负鏄ぇ骞呰烦鍙� + if (timeDiff > 5000) { + stopUpdating(); + loadDataByTime(newTime); + + // 濡傛灉涓嶆槸鏆傚仠鐘舵�侊紝缁х画鏇存柊 + if (!isPaused.value) { + startUpdating(); } - } catch (error) { - console.error("鏁版嵁鍔犺浇澶辫触:", error); } }; - // 鍥捐〃閰嶇疆锛堜笌echarts1淇濇寔鐩稿悓缁撴瀯鍜屾牱寮忥級 + // 鏃堕棿鏍煎紡鍖栧嚱鏁帮紙鏃堕棿鎴宠浆"HH:mm:ss"锛� + const formatTime = (timestamp) => { + const date = new Date(timestamp); + const hours = date.getHours().toString().padStart(2, "0"); + const minutes = date.getMinutes().toString().padStart(2, "0"); + const seconds = date.getSeconds().toString().padStart(2, "0"); + return `${hours}:${minutes}:${seconds}`; + }; + + const loadJsonData = () => { + const crossSectionData = simStore.crossSection; + if (crossSectionData?.length) { + flowData.value = crossSectionData; + loadDataByTime(nowTime.value); // 鍔犺浇褰撳墠鏃堕棿涔嬪墠鐨勬暟鎹� + } else { + resetLoading(); + } + }; + + // 鍥捐〃閰嶇疆锛堜繚鎸佷笉鍙橈級 const updateChart = () => { const option = { animation: false, @@ -580,19 +703,17 @@ axisPointer: { type: "cross" }, }, grid: { - // 娉ㄩ噴鏄洜涓� y杞翠笂鐨勫崟浣嶈瑕嗙洊鎺変簡 - // left: "1%", - // right: "1%", bottom: "1%", containLabel: false, }, legend: { - data: ["瀹炴椂娴侀噺", "绱娴侀噺"], + data: ["瀹炴椂娴侀噺", "娴侀��", "娣卞害"], textStyle: { color: "#fff" }, right: "10px", selected: { 瀹炴椂娴侀噺: true, - 绱娴侀噺: true, + 娴侀��: true, + 娣卞害: true, }, }, xAxis: [ @@ -608,25 +729,32 @@ yAxis: [ { type: "value", - name: "鍗曚綅:m鲁/min", + name: "娴侀噺(m鲁/s)", min: 0, ...calculateDynamicYAxis(data1.value), axisLabel: { color: "#fff" }, splitLine: { show: false }, - nameTextStyle: { - color: "#fff", - }, + nameTextStyle: { color: "#fff" }, }, { type: "value", - name: "鍗曚綅:m鲁", + name: "娴侀��(m/s)", min: 0, ...calculateDynamicYAxis(data2.value), axisLabel: { color: "#fff" }, splitLine: { show: true }, - nameTextStyle: { - color: "#fff", - }, + nameTextStyle: { color: "#fff" }, + }, + { + type: "value", + name: "娣卞害(m)", + min: 0, + ...calculateDynamicYAxis(data3.value, true), + axisLabel: { color: "#fff" }, + splitLine: { show: false }, + nameTextStyle: { color: "#fff" }, + position: "right", + offset: 80, }, ], series: [ @@ -634,75 +762,115 @@ name: "瀹炴椂娴侀噺", type: "bar", data: data1.value, - itemStyle: { - color: "#3268fe", - }, + itemStyle: { color: "#3268fe" }, }, { - name: "绱娴侀噺", + name: "娴侀��", type: "line", yAxisIndex: 1, data: data2.value, - lineStyle: { - color: "#ffb637", - }, + lineStyle: { color: "#ffb637" }, + }, + { + name: "娣卞害", + type: "line", + yAxisIndex: 2, + data: data3.value, + lineStyle: { color: "#00ff99" }, + symbol: "none", + smooth: true, }, ], }; myChart2.setOption(option, true); }; - // 鏁版嵁鏇存柊锛堜笌echarts1鐩稿悓閫昏緫锛� + // 鏁版嵁鏇存柊锛堜繚鎸佷笉鍙橈級 const updateData = () => { if (dataIndex.value < flowData.value.length) { const item = flowData.value[dataIndex.value]; - data1.value.push(item.value); - data2.value.push(item.total); - xAxisData.value.push(syncTimeWithTimeline()); + data1.value.push(item.flowRate); + data2.value.push(item.velocity); + data3.value.push(item.depth); + xAxisData.value.push(formatTime(item.time)); dataIndex.value++; + lastProcessedTime.value = parseTimeToTimestamp(item.time); updateChart(); } else { stopUpdating(); } }; - // 鎺у埗鏂规硶锛堜笌echarts1瀹屽叏涓�鑷达級 + // 鎺у埗鏂规硶锛堜繚鎸佷笉鍙橈級 const startUpdating = (interval = 1000) => { - if (!updateInterval) { - updateInterval = setInterval(updateData, interval); + if (!updateInterval.value) { + updateInterval.value = setInterval(updateData, interval); } }; const stopUpdating = () => { - if (updateInterval) { - clearInterval(updateInterval); - updateInterval = null; + if (updateInterval.value) { + clearInterval(updateInterval.value); + updateInterval.value = null; } }; const resetLoading = () => { stopUpdating(); dataIndex.value = 0; - data1.value = []; - data2.value = []; + data1.value = [0]; + data2.value = [0]; + data3.value = [0]; xAxisData.value = ["00:00"]; - if (flowData.value.length > 0) { - data1.value = [flowData.value[0].value]; - data2.value = [flowData.value[0].total]; - } + lastProcessedTime.value = 0; updateChart(); }; + // 鐩戝惉鏃堕棿杞磋烦杞� + const startNowTimeWatch = () => { + if (stopNowTimeWatch) stopNowTimeWatch(); // 鍏堝仠姝㈡棫鐨勭洃鍚� + stopNowTimeWatch = watch(nowTime, (newTime) => { + if (!isPaused.value) { + handleTimeJump(newTime); + } + }); + }; + + startNowTimeWatch(); // 鍒濆鍖� loadJsonData(); + + // 鐩戝惉鍏ㄥ眬鏆傚仠鐘舵�� + watch(isPaused, (newVal) => { + if (newVal) { + stopUpdating(); + } else { + startUpdating(); + } + }); return { myChart2, startUpdating, stopUpdating, + loadJsonData, resetLoading, + startNowTimeWatch, }; }; + +// 鐩戝惉 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"); @@ -735,6 +903,8 @@ onUnmounted(() => { EventBus.off("reset-table"); // 绉婚櫎浜嬩欢鐩戝惉 EventBus.off("clear-echart"); + EventBus.off("clear-dM"); + EventBus.off("redraw-dM"); EventBus.off("time-update"); // 娓呯悊浜嬩欢鐩戝惉 }); </script> -- Gitblit v1.9.3