From 65b79ab12b242669ce523eb1b94438eb9a9448c0 Mon Sep 17 00:00:00 2001 From: zhangjiming Date: Fri, 7 Mar 2025 11:33:04 +0800 Subject: [PATCH] =?UTF-8?q?=E6=94=AF=E6=8C=81=E6=B5=8B=E9=87=8F=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1=E7=8A=B6=E6=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/measure/components/MeasureAction.tsx | 62 ++++++++++++++-------- src/pages/measure/components/graph/ResultLayer.tsx | 2 +- src/services/wsTypes.ts | 32 +++++++++-- 3 files changed, 69 insertions(+), 27 deletions(-) diff --git a/src/pages/measure/components/MeasureAction.tsx b/src/pages/measure/components/MeasureAction.tsx index dc39289..50a7619 100644 --- a/src/pages/measure/components/MeasureAction.tsx +++ b/src/pages/measure/components/MeasureAction.tsx @@ -9,6 +9,10 @@ import ResultLayer from "./graph/ResultLayer"; import MarkLayer from "./graph/MarkLayer"; import { useDispatch, useSelector } from "react-redux"; import { switchMeasureAfterSave } from "../../../store/features/contextSlice"; +import { AnalyzeAngle } from "../../../services/measure/type"; +import { MeasureState, taskStatusDescMap } from "../../../services/wsTypes"; + +const wsClient = createWebSocket(sharedWsUrl); export default function MeasureAction() { const dispatch = useDispatch(); @@ -23,6 +27,9 @@ export default function MeasureAction() { const navigate = useNavigate(); + const [angles, setAngles] = useState([]); + const [taskStatus, setTaskStatus] = useState("IDLE"); + const onAfterSaveChange: CheckboxProps["onChange"] = e => { dispatch(switchMeasureAfterSave(e.target.checked)); }; @@ -30,12 +37,11 @@ export default function MeasureAction() { // navigate("../detail"); analyzeMeasurement().then(res => { if (res.success) { - // mask - + setAngles(res.data.angles); } else { message.error(res.data.info); } - }) + }); }; const onStart = () => { @@ -61,6 +67,15 @@ export default function MeasureAction() { }); }; + useEffect(() => { + const subscription = wsClient.dataOb.subscribe(data => { + if (data.messageType === "STATE" && data.path === "/measurement-task/get-task-state") { + setTaskStatus(data.data.taskStatus); + } + }); + wsClient.connect(); + return () => subscription.unsubscribe(); + }); return (
@@ -77,10 +92,12 @@ export default function MeasureAction() { setShowResult(checked)} /> 对比线
-
- setShowMark(checked)} /> - 角度线 -
+ {angles.length > 0 && ( +
+ setShowMark(checked)} /> + 角度线 +
+ )}
-
- -
+ {angles.length > 0 && ( +
+ +
+ )}

测量步骤

-
正在测量的状态
+
测量状态: {taskStatusDescMap[taskStatus]}
diff --git a/src/pages/measure/components/graph/ResultLayer.tsx b/src/pages/measure/components/graph/ResultLayer.tsx index 1e5269a..b38cdac 100644 --- a/src/pages/measure/components/graph/ResultLayer.tsx +++ b/src/pages/measure/components/graph/ResultLayer.tsx @@ -1,8 +1,8 @@ import { useCallback, useEffect, useRef, useState } from "react"; import points from "../../../../utils/measure.json"; import { createWebSocket, sharedWsUrl } from "../../../../services/socket"; + const wsClient = createWebSocket(sharedWsUrl); -console.log(sharedWsUrl); const pointArr: { x: number; y: number }[] = []; diff --git a/src/services/wsTypes.ts b/src/services/wsTypes.ts index 3eee932..9f38594 100644 --- a/src/services/wsTypes.ts +++ b/src/services/wsTypes.ts @@ -18,15 +18,21 @@ export type TrackRecordSig = { }; export const defaultContext: ContextMessage["data"] = { - loginFlag: false, - loginUser: {}, - newMeasureAfterSave: false + loginFlag: true, + loginUser: { + id: 3, //数据主键id + account: "test001", //用户账户 + nickname: "测试账户001", //用户昵称 + userRole: "User", //用户角色,可用值:User,Admin,Dev + isBuiltInUser: false, //是否内置用户(内置用户不可删除) + }, + newMeasureAfterSave: false, }; export type ContextMessage = { messageType: "DeviceContext"; data: { - loginFlag: boolean; + loginFlag: Boolean; loginUser: Partial<{ id: number; account: string; @@ -40,8 +46,15 @@ export type ContextMessage = { path: "/deviceContext"; }; +export const taskStatusDescMap: { [k in MeasureState["data"]["taskStatus"]]: string } = { + IDLE: "空闲", + MEASURING: "测量中", + WAITING_FOR_MEASURING: "等待测量", + FINISHED: "测量完成", +}; + export type MeasureState = { - messageType: "EVENT"; + messageType: "STATE"; data: { taskStatus: "IDLE" | "MEASURING" | "WAITING_FOR_MEASURING" | "FINISHED"; measureSideCnt: 0 | 1 | 2; //已测量数量,0,1,2 最多两边(左边和右边) @@ -54,4 +67,13 @@ export type MeasureState = { path: "/measurement-task/get-task-state"; }; +export const defaultMeasureState = { + taskStatus: "IDLE", + measureSideCnt: 0, //已测量数量,0,1,2 最多两边(左边和右边) + isMeasuringLeftEnd: false, //测量左侧完成 + isMeasuringRightEnd: false, //测量右侧完成 + motionlessSigFlag: true, //滑轮质心是否静止 + inStartMeasuringPos: true, //是否在允许开始测量的位置 +}; + export type Datagram = TrackRecordSig | TaskState | ContextMessage | MeasureState;