Browse Source

严格类型,精简代码

feature/rail
zhangjiming 5 months ago
parent
commit
4b88b287ea
  1. 60
      src/pages/measure/components/MeasureAction.tsx
  2. 9
      src/services/wsTypes.ts

60
src/pages/measure/components/MeasureAction.tsx

@ -10,7 +10,7 @@ import {
import { createWebSocket, sharedWsUrl } from "../../../services/socket";
import { switchMeasureAfterSave } from "../../../store/features/contextSlice";
import { AnalysisReport, AnalyzeAngle } from "../../../services/measure/type";
import { MeasureState, taskStatusDescMap } from "../../../services/wsTypes";
import { MeasureState, TaskState, taskStatusDescMap, TrackRecordSig } from "../../../services/wsTypes";
import { useAppDispatch, useAppSelector } from "../../../utils/hooks";
import Gr_round from "../../../assets/green_round.svg";
import Bl_round from "../../../assets/blue_round.svg";
@ -36,15 +36,15 @@ export default function MeasureAction() {
const [showMark, setShowMark] = useState(true);
const [angleMarkBackup, setAngleMarkBackup] = useState(true);
const afterSave = useAppSelector(store => store.context.newMeasureAfterSave);
const [angles, setAngles] = useState<AnalyzeAngle[]>([]);
const [taskStatus, setTaskStatus] = useState<MeasureState["data"]["taskStatus"]>("IDLE");
// const [angles, setAngles] = useState<AnalyzeAngle[]>([]);
// const [taskStatus, setTaskStatus] = useState<MeasureState["data"]["taskStatus"]>("IDLE");
const [startBtnText, setStartBtnText] = useState("开始测量");
const [measurementFinished, setMeasurementFinished] = useState(false);
const [analysisClicked, setAnalysisClicked] = useState(false);
const [saveClicked, setSaveClicked] = useState(false);
const [analysisReport, setAnalysisReport] = useState<AnalysisReport | null>(null);
const [showAnalysisTable, setShowAnalysisTable] = useState(false);
const [taskStatusName, setTaskStatusName] = useState("");
// const [taskStatusName, setTaskStatusName] = useState("");
// 初始状态列表
const initialStatusList = [
@ -57,7 +57,7 @@ export default function MeasureAction() {
];
const [statusList, setStatusList] = useState(initialStatusList);
/** ----------------------- 事件处理函数 ----------------------- **/
/** ----------------------- 事件处理函数 ----------------------- */
// 切换保存后自动开始新测量
const onAfterSaveChange: CheckboxProps["onChange"] = e => {
dispatch(switchMeasureAfterSave(e.target.checked));
@ -115,13 +115,13 @@ export default function MeasureAction() {
startMeasurement().then(res => {
if (res.status !== 0) {
message.error(res.data.info);
setTaskStatusName(taskStatusDescMap["IDLE"]);
// setTaskStatusName(taskStatusDescMap["IDLE"]);
} else {
const newStatusList = [...initialStatusList];
newStatusList[0].color = "b";
setStatusList(newStatusList);
message.success("已通知设备开始测量");
setTaskStatusName(taskStatusDescMap["IDLE"]);
// setTaskStatusName(taskStatusDescMap["IDLE"]);
setStartBtnText("重新测量");
}
});
@ -144,10 +144,6 @@ export default function MeasureAction() {
});
};
// 辅助函数:渲染状态项的背景颜色
const renderStatusBackground = (item: (typeof initialStatusList)[0]) =>
item.statusCode === "START_RECORD_LEFT" ? item.background : "";
// 辅助函数:渲染状态项的图标
const renderStatusIcon = (item: (typeof initialStatusList)[0]) => {
if (item.color === "g") {
@ -172,30 +168,15 @@ export default function MeasureAction() {
/** ----------------------- WebSocket 消息处理 ----------------------- **/
useEffect(() => {
// 处理任务状态消息
const handleStateMessage = (data: any) => {
if (!data.data) return;
if (data.data.taskStatus === "IDLE") {
setTaskStatusName("空闲");
} else if (!data.data.isMeasuringLeftEnd) {
setTaskStatusName("左侧正在测量");
setStatusList(prev => {
const updated = [...prev];
updated[0].isReady = true;
return updated;
});
} else if (data.data.isMeasuringLeftEnd && !data.data.isMeasuringRightEnd) {
setTaskStatusName("右侧正在测量");
} else {
setTaskStatusName(taskStatusDescMap[data.data.taskStatus as keyof typeof taskStatusDescMap]);
}
setTaskStatus(data.data.taskStatus);
const handleStateMessage = (state: MeasureState["data"]) => {
};
// 处理事件消息
const handleEventMessage = (data: any) => {
const handleEventMessage = (type: TaskState["data"]) => {
setStatusList(prev => {
const updated = [...prev];
switch (data.data) {
switch (type) {
case "START_RECORD_LEFT":
updated[0].color = "g";
updated[1].color = "b";
@ -263,8 +244,7 @@ export default function MeasureAction() {
};
// 处理点数据消息
const handlePointReport = (data: any) => {
const pointData = data.data as { x: number; y: number };
const handlePointReport = (pointData: TrackRecordSig["data"]) => {
console.log(`pointData === ${pointData.x},${pointData.y}`);
if (!isLeftFinished.current) {
leftPoints.current.push(pointData);
@ -275,13 +255,13 @@ export default function MeasureAction() {
}
};
const subscription = wsClient.dataOb.subscribe((data: any) => {
if (data.messageType === "STATE" && data.path === "/measurement-task/get-task-state") {
handleStateMessage(data);
} else if (data.messageType === "EVENT" && data.path === "/measurement-task/event") {
handleEventMessage(data);
} else if (data.messageType === "STATE" && data.path === "/measurement-task/point-report") {
handlePointReport(data);
const subscription = wsClient.dataOb.subscribe((data) => {
if ( data.path === "/measurement-task/get-task-state") {
handleStateMessage(data.data);
} else if (data.path === "/measurement-task/event") {
handleEventMessage(data.data);
} else if (data.path === "/measurement-task/point-report") {
handlePointReport(data.data);
}
});
wsClient.connect();
@ -413,7 +393,7 @@ export default function MeasureAction() {
{statusList.map((item, index) => (
<div
key={index}
style={{ background: renderStatusBackground(item), borderRadius: "20px" }}
style={{ background: item.background, borderRadius: "20px" }}
className="mt-[10px] h-[40px]">
<div style={{ display: "flex", lineHeight: "40px" }} className="pl-[1rem]">
{renderStatusIcon(item)}

9
src/services/wsTypes.ts

@ -15,17 +15,17 @@ export type TaskState = {
// data: {
// event: "START_RECORD_SIG" | "END_RECORD_SIG" | "FINISHED" | "START_RECORD_LEFT" | "FINISH_RECORD_RIGHT" | "FINISH_RECORD" | "FINISH_RECORD_LEFT" | "END_RECORD_SIG" | "END_RECORD" | "START_RECORD_RIGHT";
// };
path: "/measurement-task/get-task-state" | "/measurement-task/point-report" | "/measurement-task/event";
path: "/measurement-task/event";
};
// 连续上报坐标点
export type TrackRecordSig = {
messageType: "EVENT";
messageType: "STATE";
data: {
x: number;
y: number;
};
path: "/measurement-task/profile-record-ctrl-sig";
path: "/measurement-task/point-report";
};
export const defaultContext: ContextMessage["data"] = {
@ -98,9 +98,10 @@ export type MeasureState = {
isMeasuringRightEnd: boolean; //测量右侧完成
motionlessSigFlag: boolean; //滑轮质心是否静止
inStartMeasuringPos: boolean; //是否在允许开始测量的位置
isWrongSide: boolean; //测量方向是错误的
// profileRecordDescription: null; //用户填写的新测量信息
};
path: "/measurement-task/get-task-state" | "/measurement-task/event" | "/measurement-task/measurement-task";
path: "/measurement-task/get-task-state";
};
export const defaultMeasureState = {

Loading…
Cancel
Save