Browse Source

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

songjian-260709
qinjian 11 months ago
parent
commit
d79561e2bc
  1. 24
      client/src/sections/wuyuanbiaoba/components/CameraView.jsx
  2. 4
      client/src/sections/wuyuanbiaoba/container/index.jsx
  3. 24
      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]); // 只依赖targets和loading状态 }, [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 区域 */}

24
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,8 +124,20 @@ export const useTargetStorage = () => {
// WebSocket连接建立后自动获取数据 // WebSocket连接建立后自动获取数据
useEffect(() => { useEffect(() => {
if (isConnected) { let isMounted = true;
fetchTargets();
if (isConnected && isMounted) {
// 添加延迟,避免立即重复触发
const timer = setTimeout(() => {
if (isMounted) {
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