Browse Source

0308代替龙龙提交代码

feature/rail
白凤吉 5 months ago
parent
commit
af6c594aa3
  1. 2
      .env
  2. 13
      src/App.tsx
  3. 38
      src/components/Header.tsx
  4. 6
      src/pages/login/Login.tsx
  5. 174
      src/pages/measure/components/MeasureAction.tsx
  6. 13
      src/pages/measure/components/MeasureConfig.tsx
  7. 48
      src/pages/measure/components/MeasureDetail.tsx
  8. 2
      src/pages/measure/components/graph/GridLayer.tsx
  9. 18
      src/pages/measure/components/graph/MarkLayer.tsx
  10. 24
      src/pages/measure/components/graph/ResultLayer.tsx
  11. 14
      src/services/measure/analysis.ts
  12. 13
      src/services/measure/type.ts
  13. 28
      src/services/wsTypes.ts
  14. 3
      src/store/features/contextSlice.ts

2
.env

@ -1 +1 @@
REACT_APP_WS_URL=192.168.1.200
REACT_APP_WS_URL=192.168.1.200:80/ws

13
src/App.tsx

@ -20,14 +20,13 @@ function App() {
//连接websocket
const wsClient = createWebSocket(sharedWsUrl);
const subscription = wsClient.dataOb.subscribe(data => {
console.log("data---", data);
if (data.messageType === "DeviceContext") {
if (data.data.loginFlag) {
dispatch(updateUser(data.data));
navigate("/measure/config");
} else {
navigate("/login");
}
// if (data.data.loginFlag) {
// dispatch(updateUser(data.data));
// navigate("/measure/config");
// } else {
// navigate("/login");
// }
}else if(data.messageType === 'STATE'){
dispatch(updateDeviceState(data.data));
}

38
src/components/Header.tsx

@ -4,23 +4,21 @@ import bluetooth_c from "../assets/bluetooth_c.svg";
import icon_avatar from "../assets/icon_avatar.svg";
import icon_logout from "../assets/icon_logout.svg";
import check_mark from "../assets/check_mark.svg";
import icon_pwd from "../assets/icon_pwd.svg";
import { useState, useEffect } from "react";
import {updateDeviceState } from '../store/device/deviceState';
// import { bluetoothList, bluetoothInfo } from '../mock/recordList'
import { Dropdown, MenuProps, message, Button, Popover } from "antd";
import { logout } from "../services/user/user";
import { getDeviceInfo } from "../services/device/deviceState"
import { useNavigate } from "react-router";
import { useAppDispatch } from "../utils/hooks";
import { updateUser } from "../store/features/contextSlice";
import "./bluetooth.scss";
import { useAppSelector } from "../utils/hooks";
import { Device } from "../services/measure/type";
import { loginUser } from '../services/wsTypes';
export default function Header() {
console.log('updateDeviceState---', updateDeviceState)
const navigate = useNavigate();
const dispatch = useAppDispatch();
let [isConnect, setIsConnect] = useState(false)
//@ts-ignoref
const deviceState = useSelector(store => store.deviceState);
const [bluetoothInfo, setBluetoothInfo] = useState(deviceState)
console.log('deviceState---',deviceState)
//获取当前websocet的状态
const showBlueImg = () => {
if(!isConnect){
@ -50,12 +48,21 @@ export default function Header() {
// //@ts-ignore
// setbluetoothList(res.data.list)
// })
if(context.user.loginUser && context.user.loginUser.nickName){
setNickname(context.user.loginUser.nickName)
}else{
const user = localStorage.getItem('user')
if(user){
let userData = JSON.parse( user || '')
setNickname(userData.nickname)
}
}
})
//@ts-ignore
const context = useSelector(store => store.context);
const [messageApi, contextHolder] = message.useMessage();
const [nickname, setNickname] = useState()
const items: MenuProps["items"] = [
// {
// key: "1",
@ -73,6 +80,13 @@ export default function Header() {
logout({}).then(res => {
if (res.status !== 0) {
messageApi.error(res.data.info)
}else{
localStorage.setItem('user','')
dispatch(updateUser({
loginFlag:false,
loginUser:{}
}));
navigate("/login");
}
})
}
@ -130,13 +144,13 @@ export default function Header() {
<div className="bg-[--bgColor] h-full flex items-center">
<div className="ml-auto mr-8 flex items-center">
<div className="ml-auto mr-8 flex items-center w-[5rem]">
{/* <div className="ml-auto mr-8 flex items-center w-[5rem]">
{showBlueImg()}
</div>
</div> */}
<Dropdown menu={{ items }} trigger={["click"]}>
<section className="flex items-center">
<img src={icon_avatar} alt="" className="h-8" />
<p className="text-base ml-2">{context.user.loginFlag ? context.user.loginUser.nickname : "未登录"}</p>
<p className="text-base ml-2">{ nickname || "未登录"}</p>
</section>
</Dropdown>
</div>

6
src/pages/login/Login.tsx

@ -5,11 +5,13 @@ import img_bg from "../../assets/img_bg.jpg";
import img_logo from "../../assets/icon_logo.png";
import { useNavigate } from "react-router";
import { login } from "../../services/user/user";
import { useAppDispatch } from "../../utils/hooks";
import { updateUser } from "../../store/features/contextSlice";
export default function Login() {
const navigate = useNavigate();
const [messageApi, contextHolder] = message.useMessage();
const dispatch = useAppDispatch();
const onFinish = (values: any) => {
console.log("Received values of form: ", values);
login({ account: values["username"], password: values["password"] }).then(res => {
@ -19,6 +21,8 @@ export default function Login() {
content: res.data.info,
});
} else {
dispatch(updateUser(res.data));
localStorage.setItem('user',JSON.stringify(res.data))
navigate("/measure/config");
}
});

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

@ -1,7 +1,7 @@
import { Button, Checkbox, CheckboxProps, Switch, message } from "antd";
import { useState, useEffect } from "react";
import { useNavigate } from "react-router";
import { analyzeMeasurement, saveMeasurement, startMeasurement } from "../../../services/measure/analysis";
import { analyzeMeasurement, saveMeasurement, startMeasurement, analysisReport } from "../../../services/measure/analysis";
import { createWebSocket, sharedWsUrl } from "../../../services/socket";
import GridLayer from "./graph/GridLayer";
import StandardLayer from "./graph/StandardLayer";
@ -11,7 +11,8 @@ import { switchMeasureAfterSave } from "../../../store/features/contextSlice";
import { AnalyzeAngle } from "../../../services/measure/type";
import { MeasureState, taskStatusDescMap } 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'
const wsClient = createWebSocket(sharedWsUrl);
export default function MeasureAction() {
@ -34,21 +35,53 @@ export default function MeasureAction() {
};
const onAnalysisBtnClick = () => {
// navigate("../detail");
analyzeMeasurement().then(res => {
// if(taskStatus !== 'FINISHED'){
// message.error('测量还未结束')
// return;
// }
const params = {//静态数据 TODO
code: 6001
}
analysisReport(params).then(res => {
console.log('res===', res)
if (res.success) {
setAngles(res.data.angles);
} else {
message.error(res.data.info);
const angleAnalysisList = res.data.angleAnalysisList;
let angles:any = []
angleAnalysisList && angleAnalysisList.map(item => {
const pointA = item.pointA;
angles.push({
x: pointA.x,
y: pointA.y,
degree: item.describe,
describe: item.describe
})
})
setAngles(angles);
}else{
}
});
})
// analyzeMeasurement().then(res => {
// if (res.success) {
// setAngles(res.data.angles);
// } else {
// message.error(res.data.info);
// }
// });
};
const onStart = () => {
startMeasurement().then(res => {
if (res.status !== 0) {
message.error(res.data.info);
let name = taskStatusDescMap['IDLE']
setTaskStatusName(name)
} else {
statusList[0].color = 'b';
setStatusList(statusList)
message.success("已通知设备开始测量");
let name = taskStatusDescMap['IDLE']
setTaskStatusName(name)
}
});
};
@ -66,15 +99,113 @@ export default function MeasureAction() {
});
};
let [taskStatusName, setTaskStatusName] = useState('')
useEffect(() => {
const subscription = wsClient.dataOb.subscribe(data => {
if (data.messageType === "STATE" && data.path === "/measurement-task/get-task-state") {
setTaskStatus(data.data.taskStatus);
if(!data.data)return;
if(data.data.isMeasuringLeftEnd && !data.data.isMeasuringRightEnd){
console.log('这是右侧的状态===', data.data.isMeasuringRightEnd)
}
if(data.data.taskStatus === 'IDLE'){
setTaskStatusName('空闲')
}else if(!data.data.isMeasuringLeftEnd){//正在测量左边
setTaskStatusName('左侧正在测量')
statusList[0].isReady = true;
setStatusList(statusList)
}else if(data.data.isMeasuringLeftEnd && !data.data.isMeasuringRightEnd){//左边为true, 右边是false时表示左边已完成,右边准备
setTaskStatusName('右侧正在测量')
}else{
let name = taskStatusDescMap[data.data.taskStatus]
setTaskStatusName(name)
}
setTaskStatus(data.data.taskStatus)
}
if (data.messageType === "EVENT" && data.path === "/measurement-task/event") {
if(data.data === "START_RECORD_LEFT"){
statusList[0].color = 'g';
statusList[1].color = 'b';
}else if(data.data === "FINISH_RECORD_LEFT"){
statusList[1].color = 'g';
statusList[2].color = 'g';
statusList[3].color = 'b';
}else if(data.data === "START_RECORD_RIGHT"){
statusList[3].color = 'g';
statusList[4].color = 'b';
}else if(data.data === "FINISH_RECORD_RIGHT"){
statusList[4].color = 'g';
statusList[5].color = 'g';
}
setStatusList(statusList)
}
});
wsClient.connect();
return () => subscription.unsubscribe();
});
type StatusCodeData = {
statusCode: string;
name: string;
background: string;
isReady:boolean;
color: string;
}
const onHandleChangeStatus = (item:StatusCodeData) => {
let backgroundColor = ''
if(item.statusCode === 'START_RECORD_LEFT'){
backgroundColor = item.background
}
return backgroundColor;
}
const onHandleIcon =(item:StatusCodeData, index:number)=>{
if(item.color === 'g'){
return <img src={Gr_round} alt=''/>
}else if(item.color === 'b'){//index > 0 && statusList[index-1].isReady
return <img src={Bl_round} alt=''/>
}else if(item.color === 'h'){
return <div style={{width:'22px',height:'22px',background:'#c0c0c0',borderRadius:"50%",marginTop:'10px'}}></div>
}
}
let [statusList,setStatusList] = useState([{
statusCode: 'START_RECORD_LEFT',
name:'请移动到顶部,停顿2秒',
background:'#ececec',
isReady:false,
color:'h'
},{
statusCode: 'START_RECORD_LEFT',
name:'开始测量左侧',
background:'#ececec',
isReady:false,
color:'h'
},{
statusCode: 'START_RECORD_LEFT',
name:'左测测量完成',
background:'#ececec',
isReady:false,
color:'h'
},{
statusCode: 'START_RECORD_LEFT',
name:'请移动到顶部,停顿2秒',
background:'#ececec',
isReady:false,
color:'h'
},{
statusCode: 'START_RECORD_LEFT',
name:'开始测量右侧',
background:'#ececec',
isReady:false,
color:'h'
},{
statusCode: 'START_RECORD_LEFT',
name:'右侧测量完成',
background:'#ececec',
isReady:false,
color:'h'
}])
return (
<div className="flex h-full ">
<div className="flex-none">
@ -159,7 +290,22 @@ export default function MeasureAction() {
<div className="w-[300px] flex-none py-6">
<h1 className="font-medium text-xl text-center"></h1>
<section className="flex flex-col items-center gap-4 mt-6 border-t border-[#D8D8D8] py-4">
<div>: {taskStatusDescMap[taskStatus]}</div>
{/* <div>测量状态: {taskStatusDescMap[taskStatus]}</div> */}
{/* <div className="w-[200px]">
{taskStatus !== 'FINISHED' &&
<div className="flex">
<img src={Gr_round} alt=''/>
<div className="ml-[2rem]">{taskStatusName}</div>
</div>
}
{
taskStatus === 'FINISHED' &&
<div className="flex mt-[10px]">
<img src={Bl_round} alt=''/>
<div className="ml-[2rem]">{taskStatusName}</div>
</div>
}
</div> */}
<Button style={{ width: 200 }} size="large" type="primary" onClick={onStart}>
</Button>
@ -173,6 +319,16 @@ export default function MeasureAction() {
</Checkbox>
</section>
<div className="ml-[45px] w-[13rem]">
{statusList && statusList.map((item,index) => {
return <div style={{background:onHandleChangeStatus(item),borderRadius:"20px"}} className="mt-[5px] h-[40px]">
<div style={{display:'flex',lineHeight:'40px'}} className="pl-[1rem]">
{onHandleIcon(item, index)}
<div className="pl-[5px]">{item.name}</div>
</div>
</div>
})}
</div>
</div>
</div>
);

13
src/pages/measure/components/MeasureConfig.tsx

@ -1,5 +1,5 @@
import { Button, Form, Input, message } from "antd";
import { useEffect } from "react";
import { useEffect, useState } from "react";
import { useNavigate } from "react-router";
import { createMeasure } from "../../../services/measure/analysis";
import { useAppSelector } from "../../../utils/hooks";
@ -24,13 +24,18 @@ export default function MeasureConfig() {
}
});
};
let user = localStorage.getItem('user') || ''
let userInfo = user && JSON.parse(user) || {};
let [nickName, setNickName] = useState()
if(context.user.loginUser && context.user.loginUser.nickname){
// setNickName(context.user.loginUser.nickname)
}
const [form] = Form.useForm();
useEffect(() => {
form.setFieldsValue({
username: context.user.loginUser.nickname || "",
username: userInfo.nickname || "",
});
}, [context.user.loginUser.nickname, form]);
}, [userInfo.nickname, form]);
return (
<>
{contextHolder}

48
src/pages/measure/components/MeasureDetail.tsx

@ -1,6 +1,6 @@
import {getDetailList, delDetail} from '../../../services/measure/analysis'
import { useState, useEffect } from 'react'
import {message, Button, type TableColumnsType, type TableProps, Modal, Table } from 'antd';
import {message, Button, type TableColumnsType, type TableProps, Modal, Table, Pagination } from 'antd';
import { useNavigate } from 'react-router-dom';
import type { DetailTable } from "../../../services/measure/type";
@ -13,14 +13,21 @@ export default function MeasureDetail() {
}
useEffect(()=>{
getDetailDataList()
const params = {
pageSize,
pageNum,
}
getDetailDataList(params)
}, [])
const [selectRows, setSelectedRow] = useState<DetailTable[]>([])
const rowSelection: TableProps<DetailTable>['rowSelection'] = {
const [selectedRowKeys, setSelectedRowKeys] = useState<React.Key[]>([]);
const rowSelection = {
selectedRowKeys,
onChange: (selectedRowKeys: React.Key[], selectedRows: DetailTable[]) => {
console.log(`selectedRowKeys: ${selectedRowKeys}`, 'selectedRows: ', selectedRows);
setSelectedRow(selectedRows)
setSelectedRowKeys(selectedRowKeys)
},
getCheckboxProps: (record: DetailTable) => ({
name: record.name,
@ -59,12 +66,15 @@ export default function MeasureDetail() {
];
const [tableData, setTableData] = useState<DetailTable[]>([])
const getDetailDataList = () => {
getDetailList().then(res => {
if(res.status === 0){
const [total, setTotal] = useState(0)
const getDetailDataList = (params:{pageSize:number, pageNum:number}) => {
getDetailList(params).then(res => {
if(res.success){
console.log('res====', res)
//@ts-ignore
setTableData(res.data.list)
setTotal(res.data.total)
}else{
// setTableData(detailList)
}
@ -77,8 +87,6 @@ export default function MeasureDetail() {
const [selectionType, setSelectionType] = useState<'checkbox'>('checkbox');
const { confirm } = Modal;
const onDel = () => {
console.log('selectedRows====', selectRows)
confirm({
title: '提示',
icon: <ExclamationCircleFilled />,
@ -104,9 +112,14 @@ export default function MeasureDetail() {
ids:ids.join(',')
}
delDetail(params).then(res => {
if(res.status === 0){
getDetailList()
if(res.success){
message.success('删除成功')
setSelectedRowKeys([])
const params = {
pageSize,
pageNum,
}
getDetailDataList(params)
}
}).catch(e=> {
//删除mock的数据
@ -118,6 +131,18 @@ export default function MeasureDetail() {
}
const [pageNum, setPageNum] = useState(1)
const [pageSize, setPageSize] = useState(8)
const onPageChange = (pageNum:number) => {
console.log('pageNum---', pageNum)
setPageNum(pageNum)
const params = {
pageSize,
pageNum,
}
getDetailDataList(params)
}
return (
<div>
<div className="p-[30px]">
@ -135,8 +160,11 @@ export default function MeasureDetail() {
}}
rowSelection={{ type: selectionType, ...rowSelection }}
columns={columns}
rowKey="id"
dataSource={tableData && tableData.map(item => ({ ...item, key: item.name }))}
pagination={false}
/>
<div className="float-right"><Pagination onChange={onPageChange} defaultPageSize={pageSize} defaultCurrent={1} total={total} /></div>
</div>
</div>

2
src/pages/measure/components/graph/GridLayer.tsx

@ -81,7 +81,7 @@ export default function GridLayer(props: {
ctx.fillText((index * 10).toString(), xStepPx * index, yMax + 20);
}
for (let index = -1; index < 5; index++) {
ctx.fillText((-index * 10).toString(), -xOffset - (index > 0 ? 18 : 14), yStepPx * index + 4);
ctx.fillText((index * 10).toString(), -xOffset - (index > 0 ? 18 : 14), yStepPx * index + 4);
}
},
[props.colCellNum, props.columns, props.height, props.rowCellNum, props.rows, props.width, xEndPx, xStartPx, xStepPx, xUnitPx, yEndPx, yStartPx, yStepPx, yUnitPx]

18
src/pages/measure/components/graph/MarkLayer.tsx

@ -3,10 +3,10 @@ import { calculatePointOnCircle, findSymmetricPoint } from "../../../../utils";
import { AnalyzeAngle } from "../../../../services/measure/type";
const marks = [
{ x: 9.949007022412, y: 0.1650166186941, degree: -80 },
{ x: 25.35, y: 2.184814802617, degree: -60 },
{ x: -9.949007022412, y: 0.1650166186941, degree: -100 },
{ x: -25.35, y: 2.184814802617, degree: -120 },
{ x: 9.949007022412, y: 0.1650166186941, degree: -80, describe:'6°C' },
{ x: 25.35, y: -2.184814802617, degree: -60, describe:'0.6°C' },
{ x: -9.949007022412, y: 0.1650166186941, degree: -100, describe: '0.2°C'},
{ x: -20.35, y: -2.184814802617, degree: -120, describe:'1.6°C' },
];
export default function MarkLayer(props: {
@ -32,8 +32,13 @@ export default function MarkLayer(props: {
const canvasRef = useRef<HTMLCanvasElement | null>(null);
const calcPoints = useCallback(() => {
return props.angles
.map(p => ({ ...p, y: -p.y, degree: -p.degree }))
//props.angles
return marks
.map(p => {
//@ts-ignore
let degree = parseInt(p.degree)
return { ...p, y: -p.y, degree: -degree }
})
.map(p => {
const p1 = calculatePointOnCircle(p.x * unitPx, p.y * unitPx, xStepPx / 2, p.degree);
const p2 = findSymmetricPoint(p1.x, p1.y, p.x * unitPx, p.y * unitPx);
@ -62,6 +67,7 @@ export default function MarkLayer(props: {
ctx.save();
ctx.translate(line[2].x, line[2].y);
//@ts-ignore 这个地方原来是marks, 现在替换为lines, 0307
ctx.rotate(((marks[idx].degree + 90) * Math.PI) / 180);
ctx.fillText(props.angles[idx].describe, 0, 0);
ctx.restore();

24
src/pages/measure/components/graph/ResultLayer.tsx

@ -16,6 +16,7 @@ export default function ResultLayer(props: {
rows: number;
visibility: 'hidden' | 'visible';
}) {
console.log('props---', props)
const xStartPx = props.leftPadding;
const xEndPx = props.width - props.rightPadding;
const xStepPx = (props.width - props.leftPadding - props.rightPadding) / props.columns;
@ -46,14 +47,19 @@ export default function ResultLayer(props: {
useEffect(() => {
const subscription = wsClient.dataOb.subscribe(data => {
if (data.path === "/measurement-task/get-task-state") {
let isRight = false;
if(data.path === "/measurement-task/measurement-task"){
}
if (data.path === "/measurement-task/event") {
const canvas = canvasRef.current;
if (!canvas) return;
const ctx = canvas.getContext("2d");
if (!ctx) return;
if ('event' in data.data && data.data.event === "START_RECORD_SIG") {
console.log('data.data---', data.data)
//@ts-ignore
if (data.data === "START_RECORD_LEFT") {
// setRtPoints([]);
pointArr.length = 0;
ctx.resetTransform();
@ -65,12 +71,18 @@ export default function ResultLayer(props: {
ctx.translate(xStartPx + xOffset, yStartPx + yOffset);
ctx.beginPath();
}, 0);
} else if ('event' in data.data && data.data.event === "END_RECORD_SIG") {
//
//@ts-ignore
} else if (data.data === "START_RECORD_RIGHT") {
// pointArr.length = 0;
isRight = true;
}
} else if (data.path === "/measurement-task/profile-record-ctrl-sig") {
} else if (data.path === "/measurement-task/point-report") {
// console.log(data.data);
// setRtPoints(rtPoints.concat([data.data]));
if(isRight){
pointArr.length = 0
}
//@ts-ignore
pointArr.push(data.data);
const canvas = canvasRef.current;

14
src/services/measure/analysis.ts

@ -1,5 +1,5 @@
import httpRequest, { type BaseResponse } from "../httpRequest";
import type { AnalyzeResult, DetailTable, MeasureRecord } from "../../services/measure/type";
import type { AnalySisReport, AnalyzeResult, DetailTable, MeasureRecord } from "../../services/measure/type";
export function startMeasurement() {
return httpRequest<BaseResponse>({
@ -27,9 +27,10 @@ export function saveMeasurement() {
});
}
export function getDetailList() {
return httpRequest<BaseResponse<{ list: DetailTable[] }>>({
export function getDetailList(params:{pageSize:number,pageNum:number}) {
return httpRequest<BaseResponse<{ list: DetailTable[], total:number }>>({
url: "/measurement-data/list",
params,
method: "POST",
});
}
@ -48,3 +49,10 @@ export function createMeasure(params: MeasureRecord) {
method: "POST",
});
}
export function analysisReport(params:{code:number}) {
return httpRequest<BaseResponse<{angleAnalysisList:AnalySisReport[]}>>({
url: `/measurement-task/save-analysis-report/${params.code}`,
method: "POST",
});
}

13
src/services/measure/type.ts

@ -6,6 +6,7 @@ export type DetailTable = {
id:number;
operatorName:string;
name: string;
trackShapeCode:string;
createTime: string;
}
@ -34,3 +35,15 @@ export type Device ={
name: string;
id:number
}
export type AnalySisReport = {
pointA:{
x: string;
y: string;
};
pointB:{
x: string;
y: string;
};
distance:string;
describe:string;
}

28
src/services/wsTypes.ts

@ -1,10 +1,11 @@
// 开始、停止绘制
export type TaskState = {
messageType: "EVENT";
data: {
event: "START_RECORD_SIG" | "END_RECORD_SIG";
};
path: "/measurement-task/get-task-state";
data: "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";
// 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";
};
// 连续上报坐标点
@ -45,17 +46,32 @@ export type ContextMessage = {
path: "/deviceContext";
};
export type loginUser = Partial<{
id: 3, //数据主键id
account: "test001", //用户账户
nickname: "测试账户001", //用户昵称
userRole: "User", //用户角色,可用值:User,Admin,Dev
isBuiltInUser: false, //是否内置用户(内置用户不可删除)
}>;
export const taskStatusDescMap: { [k in MeasureState["data"]["taskStatus"]]: string } = {
IDLE: "空闲",
MEASURING: "测量中",
WAITING_FOR_MEASURING: "等待测量",
FINISHED: "测量完成",
START_RECORD_LEFT: '',
FINISH_RECORD_RIGHT: '',
FINISH_RECORD:'',
FINISH_RECORD_LEFT: '',
END_RECORD_SIG: '',
END_RECORD: '',
START_RECORD_RIGHT : ''
};
// 测量任务状态
export type MeasureState = {
messageType: "STATE";
data: {
taskStatus: "IDLE" | "MEASURING" | "WAITING_FOR_MEASURING" | "FINISHED";
taskStatus: "IDLE" | "MEASURING" | "WAITING_FOR_MEASURING" | "FINISHED" | "START_RECORD_LEFT" | "FINISH_RECORD_RIGHT" | "FINISH_RECORD" | "FINISH_RECORD_LEFT" | "END_RECORD_SIG" | "END_RECORD" | "START_RECORD_RIGHT";
measureSideCnt: 0 | 1 | 2; //已测量数量,0,1,2 最多两边(左边和右边)
isMeasuringLeftEnd: boolean; //测量左侧完成
isMeasuringRightEnd: boolean; //测量右侧完成
@ -63,7 +79,7 @@ export type MeasureState = {
inStartMeasuringPos: boolean; //是否在允许开始测量的位置
// profileRecordDescription: null; //用户填写的新测量信息
};
path: "/measurement-task/get-task-state";
path: "/measurement-task/get-task-state" | "/measurement-task/event" | "/measurement-task/measurement-task";
};
export const defaultMeasureState = {

3
src/store/features/contextSlice.ts

@ -1,7 +1,7 @@
// counterSlice.ts 文件
import { createSlice, PayloadAction } from "@reduxjs/toolkit";
import { ContextMessage } from "../../services/wsTypes";
import type { ContextMessage } from "../../services/wsTypes";
interface ContextSlice {
user: ContextMessage["data"];
@ -19,6 +19,7 @@ export const contextSlice = createSlice({
reducers: {
updateUser: (state, action: PayloadAction<ContextMessage["data"]>) => {
state.user.loginFlag = action.payload.loginFlag;
//@ts-ignore
state.user.loginUser = action.payload.loginUser;
},
switchMeasureAfterSave: (state, action: PayloadAction<boolean>) => {

Loading…
Cancel
Save