Browse Source

fix: 修复页面刷新,测点获取指令重复发送问题

master
qinjian 4 weeks ago
parent
commit
d79561e2bc
  1. 24
      client/src/sections/wuyuanbiaoba/components/CameraView.jsx
  2. 4
      client/src/sections/wuyuanbiaoba/container/index.jsx
  3. 22
      client/src/sections/wuyuanbiaoba/hooks/useTargetStorage.js
  4. 2
      package.json
  5. 2
      server/tcpProxy/index.js

24
client/src/sections/wuyuanbiaoba/components/CameraView.jsx

@ -1,12 +1,16 @@
import React, { useRef, useEffect, useState, useCallback } from "react"; import React, { useRef, useEffect, useState, useCallback } from "react";
import { useWebSocket } from "../actions/websocket.jsx"; import { useWebSocket } from "../actions/websocket.jsx";
import { message } from "antd"; import { message } from "antd";
import { useTargetStorage } from "../hooks/useTargetStorage.js"; // import { useTargetStorage } from "../hooks/useTargetStorage.js";
const CameraView = ({ const CameraView = ({
selectedTargetId, selectedTargetId,
onClearSelection, onClearSelection,
onRectangleClick, onRectangleClick,
selectedTemplate, selectedTemplate,
targets = [],
targetsLoading = false,
onRefreshTargets,
}) => { }) => {
const imgRef = useRef(null); const imgRef = useRef(null);
const canvasRef = useRef(null); const canvasRef = useRef(null);
@ -43,8 +47,8 @@ const CameraView = ({
// 使WebSocket // 使WebSocket
const { isConnected, sendMessage } = useWebSocket(); const { isConnected, sendMessage } = useWebSocket();
// 使Hook // props Hook
const { targets, loading, refreshTargets } = useTargetStorage(); // const { targets, loading, refreshTargets } = useTargetStorage();
const minScale = 0.2; const minScale = 0.2;
const maxScale = 4.0; const maxScale = 4.0;
@ -797,7 +801,9 @@ const CameraView = ({
// //
setTimeout(() => { setTimeout(() => {
refreshTargets(); if (onRefreshTargets) {
onRefreshTargets();
}
}, 500); // 500ms }, 500); // 500ms
// //
@ -822,7 +828,7 @@ const CameraView = ({
rectangles, rectangles,
isConnected, isConnected,
sendMessage, sendMessage,
refreshTargets, onRefreshTargets,
onClearSelection, onClearSelection,
isSaving, isSaving,
]); ]);
@ -882,12 +888,12 @@ const CameraView = ({
useEffect(() => { useEffect(() => {
// console.log("targets loading :", { // console.log("targets loading :", {
// targets, // targets,
// loading, // targetsLoading,
// targetsLength: targets?.length, // targetsLength: targets?.length,
// }); // });
if ( if (
!loading && !targetsLoading &&
targets && targets &&
targets.length > 0 && targets.length > 0 &&
videoNaturalWidth > 0 && videoNaturalWidth > 0 &&
@ -943,7 +949,7 @@ const CameraView = ({
redrawAllRectangles(); redrawAllRectangles();
}, 100); }, 100);
return () => clearTimeout(timeoutId); return () => clearTimeout(timeoutId);
} else if (!loading && (!targets || targets.length === 0)) { } else if (!targetsLoading && (!targets || targets.length === 0)) {
// //
// console.log( // console.log(
// ":", // ":",
@ -952,7 +958,7 @@ const CameraView = ({
setRectangles([]); setRectangles([]);
// console.log(""); // console.log("");
} }
}, [targets, loading, videoNaturalWidth, videoNaturalHeight]); // targetsloading }, [targets, targetsLoading, videoNaturalWidth, videoNaturalHeight]);
// rectangles // rectangles
useEffect(() => { useEffect(() => {

4
client/src/sections/wuyuanbiaoba/container/index.jsx

@ -517,6 +517,10 @@ const WuyuanbiaobaContent = () => {
selectedTemplate={ selectedTemplate={
selectedTemplate ? getTemplateByKey(selectedTemplate) : null selectedTemplate ? getTemplateByKey(selectedTemplate) : null
} }
// Hook
targets={targetListData}
targetsLoading={targetsLoading}
onRefreshTargets={refreshTargets}
/> />
{/* 右侧 Target List / Temp List 区域 */} {/* 右侧 Target List / Temp List 区域 */}

22
client/src/sections/wuyuanbiaoba/hooks/useTargetStorage.js

@ -34,8 +34,9 @@ export const useTargetStorage = () => {
// 发送获取标靶数据的命令 // 发送获取标靶数据的命令
const fetchTargets = useCallback(() => { const fetchTargets = useCallback(() => {
if (!isConnected) { if (!isConnected) {
console.warn('WebSocket未连接,无法获取标靶数据'); console.warn('⚠️ WebSocket未连接,无法获取标靶数据');
return; return;
} }
@ -49,8 +50,11 @@ export const useTargetStorage = () => {
})); }));
if (!success) { if (!success) {
console.error('❌ 发送获取标靶数据命令失败');
setError('发送获取标靶数据命令失败'); setError('发送获取标靶数据命令失败');
setLoading(false); setLoading(false);
} else {
// console.log(' getPoints 请求已发送');
} }
}, [isConnected, sendMessage]); }, [isConnected, sendMessage]);
@ -63,7 +67,7 @@ export const useTargetStorage = () => {
// 检查是否为空对象 // 检查是否为空对象
if (!responseValues || Object.keys(responseValues).length === 0) { if (!responseValues || Object.keys(responseValues).length === 0) {
console.log('服务端返回空的标靶数据'); console.log('⚠️ 服务端返回空的标靶数据');
setTargets([]); setTargets([]);
setError(null); setError(null);
setLoading(false); setLoading(false);
@ -120,9 +124,21 @@ export const useTargetStorage = () => {
// WebSocket连接建立后自动获取数据 // WebSocket连接建立后自动获取数据
useEffect(() => { useEffect(() => {
if (isConnected) { let isMounted = true;
if (isConnected && isMounted) {
// 添加延迟,避免立即重复触发
const timer = setTimeout(() => {
if (isMounted) {
fetchTargets(); fetchTargets();
} }
}, 100);
return () => {
isMounted = false;
clearTimeout(timer);
};
}
}, [isConnected, fetchTargets]); }, [isConnected, fetchTargets]);
// 通用的标靶数据处理纯函数 // 通用的标靶数据处理纯函数

2
package.json

@ -1,6 +1,6 @@
{ {
"name": "wuyuanbiaoba-web", "name": "wuyuanbiaoba-web",
"version": "1.0.2", "version": "1.0.3",
"main": "index.html", "main": "index.html",
"scripts": { "scripts": {
"test": "echo \"Error: no test specified\" && exit 1", "test": "echo \"Error: no test specified\" && exit 1",

2
server/tcpProxy/index.js

@ -92,7 +92,7 @@ function setupTcpProxy(conf) {
// 转发字符串数据到TCP服务器 // 转发字符串数据到TCP服务器
if (tcpClient.writable) { if (tcpClient.writable) {
// console.log('准备发送数据到TCP服务器:', messageStr); console.log('准备发送数据到TCP服务器:', messageStr);
// 检查数据大小 // 检查数据大小
const dataSize = Buffer.byteLength(messageStr, 'utf8'); const dataSize = Buffer.byteLength(messageStr, 'utf8');

Loading…
Cancel
Save