Browse Source

轨型和核校做为基础数据,控件关联数据

dev
zhangjiming 5 months ago
parent
commit
208d255329
  1. 6
      src/index.tsx
  2. 78
      src/pages/measure/components/MeasureAction.tsx
  3. 101
      src/pages/measure/components/MeasureConfig.tsx
  4. 4
      src/pages/measure/components/RadioItem.tsx
  5. 10
      src/services/apiTypes.ts
  6. 16
      src/services/calibration/calibration.ts
  7. 12
      src/services/device/deviceState.ts
  8. 134
      src/services/measure/analysis.ts
  9. 16
      src/services/standardRail/standardRail.ts
  10. 55
      src/store/features/baseDataSlice.ts
  11. 36
      src/store/features/contextSlice.ts
  12. 4
      src/store/index.ts

6
src/index.tsx

@ -70,13 +70,13 @@ const router = createBrowserRouter([
const root = ReactDOM.createRoot(document.getElementById("root") as HTMLElement); const root = ReactDOM.createRoot(document.getElementById("root") as HTMLElement);
root.render( root.render(
// <React.StrictMode>
<React.StrictMode>
<Provider store={store}> <Provider store={store}>
<ConfigProvider locale={zhCN}> <ConfigProvider locale={zhCN}>
<RouterProvider router={router}/>
<RouterProvider router={router} />
</ConfigProvider> </ConfigProvider>
</Provider> </Provider>
// </React.StrictMode>
</React.StrictMode>
); );
console.log(process.env.REACT_APP_WS_URL); console.log(process.env.REACT_APP_WS_URL);

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

@ -8,7 +8,7 @@ import {
startMeasurement, startMeasurement,
} from "../../../services/measure/analysis"; } from "../../../services/measure/analysis";
import { createWebSocket, sharedWsUrl } from "../../../services/socket"; import { createWebSocket, sharedWsUrl } from "../../../services/socket";
import { switchMeasureAfterSave } from "../../../store/features/contextSlice";
import { switchMeasureAfterSave, updateCalibrationTypeId, updateRailTypeId } from "../../../store/features/contextSlice";
import { AnalysisReport } from "../../../services/measure/type"; import { AnalysisReport } from "../../../services/measure/type";
import { MeasureState, TaskState, TrackRecordSig } from "../../../services/wsTypes"; import { MeasureState, TaskState, TrackRecordSig } from "../../../services/wsTypes";
import { useAppDispatch, useAppSelector } from "../../../utils/hooks"; import { useAppDispatch, useAppSelector } from "../../../utils/hooks";
@ -20,6 +20,7 @@ import MeasurementCanvas, { AnalysisData, BenchmarkShape, MeasurementCanvasRef }
import "./MeasureAction.scss"; import "./MeasureAction.scss";
import SelectorBtn from "./SelectorBtn"; import SelectorBtn from "./SelectorBtn";
import RadioItem from "./RadioItem"; import RadioItem from "./RadioItem";
import { fetchCalibrationTypes, fetchRailTypes } from "../../../store/features/baseDataSlice";
// 创建 websocket 客户端 // 创建 websocket 客户端
const wsClient = createWebSocket(sharedWsUrl); const wsClient = createWebSocket(sharedWsUrl);
@ -28,6 +29,9 @@ export default function MeasureAction() {
const dispatch = useAppDispatch(); const dispatch = useAppDispatch();
const navigate = useNavigate(); const navigate = useNavigate();
const baseData = useAppSelector(store => store.baseData);
const context = useAppSelector(store => store.context);
/** ----------------------- 引用 ----------------------- **/ /** ----------------------- 引用 ----------------------- **/
const canvasRef = useRef<MeasurementCanvasRef>(null); const canvasRef = useRef<MeasurementCanvasRef>(null);
const leftPoints = useRef<{ x: number; y: number }[]>([]); const leftPoints = useRef<{ x: number; y: number }[]>([]);
@ -68,8 +72,10 @@ export default function MeasureAction() {
const [openDrawer, setOpenDrawer] = useState(false); const [openDrawer, setOpenDrawer] = useState(false);
// 显示钢轨轨型弹框 // 显示钢轨轨型弹框
const [showRailTypeModel, setShowRailTypeModel] = useState(false); const [showRailTypeModel, setShowRailTypeModel] = useState(false);
const [selectedRailType, setSelectedRailType] = useState(1);
// 显示核校方式弹框 // 显示核校方式弹框
const [showCalibrationModel, setShowCalibrationModel] = useState(false); const [showCalibrationModel, setShowCalibrationModel] = useState(false);
const [selectCalibrationType, setSelectCalibrationType] = useState(1);
/** ----------------------- 事件处理函数 ----------------------- */ /** ----------------------- 事件处理函数 ----------------------- */
// 切换保存后自动开始新测量 // 切换保存后自动开始新测量
@ -173,6 +179,13 @@ export default function MeasureAction() {
} }
}; };
useEffect(() => {
if (baseData.railTypes.length === 0) {
dispatch(fetchRailTypes());
dispatch(fetchCalibrationTypes());
}
}, [baseData.railTypes.length, dispatch]);
/** ----------------------- WebSocket 消息处理 ----------------------- **/ /** ----------------------- WebSocket 消息处理 ----------------------- **/
useEffect(() => { useEffect(() => {
// 处理任务状态消息 // 处理任务状态消息
@ -304,6 +317,20 @@ export default function MeasureAction() {
}, []); }, []);
const onExport = () => {}; const onExport = () => {};
const currentRailType = () => baseData.railTypes.find(t => t.id === context.currRailTypeId);
const currentCalibrationType = () => baseData.calibrationTypes.find(t => t.id === context.currCalibrationTypeId);
const onConfirmRailType = () => {
setShowRailTypeModel(false);
dispatch(updateRailTypeId(selectedRailType));
// TODO 重新分析
};
const onConfirmCalibrationType = () => {
setShowCalibrationModel(false);
dispatch(updateCalibrationTypeId(selectCalibrationType));
// TODO 重新分析
};
/** ----------------------- 渲染 ----------------------- **/ /** ----------------------- 渲染 ----------------------- **/
return ( return (
<> <>
@ -376,15 +403,17 @@ export default function MeasureAction() {
<div className="flex mt-2 justify-end items-center gap-4"> <div className="flex mt-2 justify-end items-center gap-4">
<SelectorBtn <SelectorBtn
imgNode={() => <img src={icon_track} alt="" />} imgNode={() => <img src={icon_track} alt="" />}
text={"60轨"}
text={currentRailType()?.name || "--"}
onClick={() => { onClick={() => {
setSelectedRailType(context.currRailTypeId);
setShowRailTypeModel(true); setShowRailTypeModel(true);
}} }}
/> />
<SelectorBtn <SelectorBtn
imgNode={() => <img src={icon_dest} alt="" />} imgNode={() => <img src={icon_dest} alt="" />}
text={"尖轨核校"}
text={currentCalibrationType()?.name || "--"}
onClick={() => { onClick={() => {
setSelectCalibrationType(context.currCalibrationTypeId);
setShowCalibrationModel(true); setShowCalibrationModel(true);
}} }}
/> />
@ -484,15 +513,25 @@ export default function MeasureAction() {
width={360} width={360}
footer={ footer={
<div className="flex justify-center gap-4"> <div className="flex justify-center gap-4">
<Button onClick={() => setShowRailTypeModel(false)}></Button>
<Button type="primary" onClick={() => setShowRailTypeModel(false)}>
<Button
onClick={() => {
setShowRailTypeModel(false);
}}>
</Button>
<Button type="primary" onClick={onConfirmRailType}>
</Button> </Button>
</div> </div>
}> }>
<RadioItem label="60轨" selected={true} />
<RadioItem label="70轨" selected={false} />
<RadioItem label="50轨" selected={false} />
{baseData.railTypes.map(t => (
<RadioItem
key={t.id}
label={t.name}
selected={t.id === selectedRailType}
onSelect={() => setSelectedRailType(t.id)}
/>
))}
</Modal> </Modal>
<Modal <Modal
title={<h1 className="text-text font-medium text-center"></h1>} title={<h1 className="text-text font-medium text-center"></h1>}
@ -501,16 +540,25 @@ export default function MeasureAction() {
width={360} width={360}
footer={ footer={
<div className="flex justify-center gap-4"> <div className="flex justify-center gap-4">
<Button onClick={() => setShowCalibrationModel(false)}></Button>
<Button type="primary" onClick={() => setShowCalibrationModel(false)}>
<Button
onClick={() => {
setShowCalibrationModel(false);
}}>
</Button>
<Button type="primary" onClick={onConfirmCalibrationType}>
</Button> </Button>
</div> </div>
}
>
<RadioItem label="尖轨核校" selected={true} />
<RadioItem label="按中心核校钢轨(道岔)" selected={false} />
<RadioItem label="按磨耗核校钢轨-左基准" selected={false} />
}>
{baseData.calibrationTypes.map(t => (
<RadioItem
key={t.id}
label={t.name}
selected={t.id === selectCalibrationType}
onSelect={() => setSelectCalibrationType(t.id)}
/>
))}
</Modal> </Modal>
</> </>
); );

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

@ -1,19 +1,24 @@
import { Button, Form, Input, message, Select } from "antd"; import { Button, Form, Input, message, Select } from "antd";
import { useEffect, useState } from "react";
import { useEffect } from "react";
import { useNavigate } from "react-router"; import { useNavigate } from "react-router";
import { createMeasure } from "../../../services/measure/analysis"; import { createMeasure } from "../../../services/measure/analysis";
import { useAppSelector } from "../../../utils/hooks";
import { useAppDispatch, useAppSelector } from "../../../utils/hooks";
import { fetchCalibrationTypes, fetchRailTypes } from "../../../store/features/baseDataSlice";
import { updateCalibrationTypeId, updateRailTypeId } from "../../../store/features/contextSlice";
export default function MeasureConfig() { export default function MeasureConfig() {
const dispatch = useAppDispatch();
const navigate = useNavigate(); const navigate = useNavigate();
const [messageApi, contextHolder] = message.useMessage(); const [messageApi, contextHolder] = message.useMessage();
const context = useAppSelector(store => store.context);
// const context = useAppSelector(store => store.context);
const deviceState = useAppSelector(store => store.deviceState); const deviceState = useAppSelector(store => store.deviceState);
const baseData = useAppSelector(store => store.baseData);
const onFinish = (values: any) => { const onFinish = (values: any) => {
console.log("Received values of form: ", values); console.log("Received values of form: ", values);
//判断是否连接了设备 //判断是否连接了设备
if(!deviceState.isConnect){
if (!deviceState.isConnect) {
// message.error('设备尚未连接或连接失败,请重新连接') // message.error('设备尚未连接或连接失败,请重新连接')
// return; // return;
} }
@ -22,29 +27,43 @@ export default function MeasureConfig() {
name: values["measureName"], name: values["measureName"],
lineName: values["lineName"], lineName: values["lineName"],
location: values["position"], location: values["position"],
direction: values["direction"]
direction: values["direction"],
}).then(res => { }).then(res => {
if (res.status !== 0) { if (res.status !== 0) {
messageApi.error(res.data.info); messageApi.error(res.data.info);
} else { } else {
dispatch(updateRailTypeId(values["railType"]))
dispatch(updateCalibrationTypeId(values["calibrationType"]))
navigate("../action"); navigate("../action");
} }
}); });
}; };
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)
}
useEffect(() => {
if (baseData.railTypes.length === 0) {
dispatch(fetchRailTypes());
dispatch(fetchCalibrationTypes());
}
}, [baseData.railTypes.length, dispatch]);
const [form] = Form.useForm(); const [form] = Form.useForm();
useEffect(() => { useEffect(() => {
form.setFieldsValue({
const user = localStorage.getItem("user") || "";
const userInfo = (user && JSON.parse(user)) || {};
const fieldValue: Record<string, any> = {
username: userInfo.nickname || "", username: userInfo.nickname || "",
direction: "左"
});
}, [userInfo.nickname, form]);
direction: "左",
}
if (baseData.railTypes.length > 0) {
fieldValue.railType = baseData.railTypes[0].id
}
if (baseData.calibrationTypes.length > 0) {
fieldValue.calibrationType = baseData.calibrationTypes[0].id
}
form.setFieldsValue(fieldValue);
}, [baseData.calibrationTypes, baseData.railTypes, form]);
return ( return (
<> <>
{contextHolder} {contextHolder}
@ -60,47 +79,45 @@ export default function MeasureConfig() {
onFinish={onFinish} onFinish={onFinish}
// onFinishFailed={onFinishFailed} // onFinishFailed={onFinishFailed}
autoComplete="off"> autoComplete="off">
<Form.Item
label="操作员"
name="username"
rules={[{ required: true, message: "请输入操作员姓名" }]}>
<Form.Item label="操作员" name="username" rules={[{ required: true, message: "请输入操作员姓名" }]}>
<Input /> <Input />
</Form.Item> </Form.Item>
{/* <Form.Item label="" name="trackType">
<Select>
<Select.Option value="demo">Demo</Select.Option>
</Select>
</Form.Item> */}
{/* <Form.Item label="" name="calibrationType">
<Select>
<Select.Option value="demo">Demo</Select.Option>
</Select>
</Form.Item> */}
<Form.Item
label="测量名称"
name="measureName"
rules={[{ required: true, message: "请输入测量名称" }]}>
<Form.Item label="轨型" name="railType" rules={[{ required: true, message: "请选择轨型" }]}>
<Select>
{baseData.railTypes.map(t => (
<Select.Option key={t.id} value={t.id}>
{t.name}
</Select.Option>
))}
</Select>
</Form.Item>
<Form.Item label="核校" name="calibrationType" rules={[{ required: true, message: "请选择核校类型" }]}>
<Select>
{baseData.calibrationTypes.map(t => (
<Select.Option key={t.id} value={t.id}>
{t.name}
</Select.Option>
))}
</Select>
</Form.Item>
<Form.Item label="测量名称" name="measureName" rules={[{ required: true, message: "请输入测量名称" }]}>
<Input /> <Input />
</Form.Item> </Form.Item>
<Form.Item
label="线路名称"
name="lineName"
rules={[{ required: false, message: "请输入线路名称" }]}>
<Form.Item label="线路名称" name="lineName" rules={[{ required: false, message: "请输入线路名称" }]}>
<Input /> <Input />
</Form.Item> </Form.Item>
<Form.Item label="位置" name="position" rules={[{ required: false, message: "请输入位置" }]}> <Form.Item label="位置" name="position" rules={[{ required: false, message: "请输入位置" }]}>
<Input /> <Input />
</Form.Item> </Form.Item>
<Form.Item label="方向" name="direction" rules={[{ required: false, message: "请输入方向" }]}>
<Form.Item label="方向" name="direction" rules={[{ required: false, message: "请输入方向" }]}>
{/* <Input /> */} {/* <Input /> */}
<Select <Select
className="w-[5rem]" className="w-[5rem]"
// defaultValue="左" // defaultValue="左"
options={[ options={[
{ value: '左', label: '左侧' },
{ value: '右', label: '右侧' },
{ value: "左", label: "左侧" },
{ value: "右", label: "右侧" },
]} ]}
/> />
</Form.Item> </Form.Item>

4
src/pages/measure/components/RadioItem.tsx

@ -1,11 +1,11 @@
import icon_select from "../../../assets/icon_selected.svg"; import icon_select from "../../../assets/icon_selected.svg";
import icon_unselect from "../../../assets/icon_unselect.svg"; import icon_unselect from "../../../assets/icon_unselect.svg";
export default function RadioItem(props: { label: string; value?: string; selected: boolean; onSelect?: (val: string) => void }) {
export default function RadioItem(props: { label: string; selected: boolean; onSelect?: () => void }) {
return ( return (
<div <div
className="h-10 border-b border-[#f7f7f7] flex justify-between items-center" className="h-10 border-b border-[#f7f7f7] flex justify-between items-center"
onClick={() => props.onSelect && props.onSelect(props.value || "")}>
onClick={() => props.onSelect && props.onSelect()}>
<p className="text-sm text-text">{props.label}</p> <p className="text-sm text-text">{props.label}</p>
<img src={props.selected ? icon_select : icon_unselect} alt="icon" /> <img src={props.selected ? icon_select : icon_unselect} alt="icon" />
</div> </div>

10
src/services/apiTypes.ts

@ -0,0 +1,10 @@
export interface Rail {
id: number;
code: string;
name: string;
}
export interface Calibration {
id: number;
name: string;
}

16
src/services/calibration/calibration.ts

@ -0,0 +1,16 @@
import { Calibration } from "../apiTypes";
import httpRequest, { BaseResponse } from "../httpRequest";
export function getCalibrationTypes() {
return httpRequest<BaseResponse<Calibration[]>>({
url: "/api/calibration/list",
method: "POST",
});
}
export function deleteCalibrationTypes(ids: number[]) {
return httpRequest<BaseResponse>({
url: `/api/calibration/delete/${ids.join(",")}`,
method: "POST",
});
}

12
src/services/device/deviceState.ts

@ -1,9 +1,9 @@
import httpRequest, { type BaseResponse } from "../httpRequest"; import httpRequest, { type BaseResponse } from "../httpRequest";
import type { Device } from "../../services/measure/type";
import type { Device } from "../measure/type";
export function getDeviceInfo() { export function getDeviceInfo() {
return httpRequest<BaseResponse<{list:Device[]}>>({
url: "/api/measurement-data/getDevice",
method: "POST",
});
}
return httpRequest<BaseResponse<{ list: Device[] }>>({
url: "/api/measurement-data/getDevice",
method: "POST",
});
}

134
src/services/measure/analysis.ts

@ -1,65 +1,69 @@
import httpRequest, {type BaseResponse} from "../httpRequest";
import httpRequest, { type BaseResponse } from "../httpRequest";
import type { import type {
AnalyzeResult, DetailTable, MeasureRecord,
ProfileRecordPointSet, BaseProfileRecordPointSet, AnalysisResults, AnalysisReport
} from "../../services/measure/type";
AnalyzeResult,
DetailTable,
MeasureRecord,
ProfileRecordPointSet,
BaseProfileRecordPointSet,
AnalysisReport,
} from "./type";
export function startMeasurement() { export function startMeasurement() {
return httpRequest<BaseResponse>({
url: "/api/measurement-task/start-measurement",
method: "POST",
});
return httpRequest<BaseResponse>({
url: "/api/measurement-task/start-measurement",
method: "POST",
});
} }
export function stopMeasurement() { export function stopMeasurement() {
return httpRequest<BaseResponse>({
url: "/api/measurement-task/stop-measurement",
method: "POST",
});
return httpRequest<BaseResponse>({
url: "/api/measurement-task/stop-measurement",
method: "POST",
});
} }
export function analyzeMeasurement() { export function analyzeMeasurement() {
return httpRequest<BaseResponse<AnalyzeResult>>({
url: "/api/measurement-task/analyze-measurement",
method: "POST",
});
return httpRequest<BaseResponse<AnalyzeResult>>({
url: "/api/measurement-task/analyze-measurement",
method: "POST",
});
} }
export function saveMeasurement() { export function saveMeasurement() {
return httpRequest<BaseResponse>({
url: "/api/measurement-task/save-report",
method: "POST",
});
return httpRequest<BaseResponse>({
url: "/api/measurement-task/save-report",
method: "POST",
});
} }
export function getDetailList(params: {name?:string, pageSize: number, pageNum: number }) {
return httpRequest<BaseResponse<{ list: DetailTable[], total: number }>>({
url: "/api/measurement-data/list",
params,
method: "POST",
});
export function getDetailList(params: { name?: string; pageSize: number; pageNum: number }) {
return httpRequest<BaseResponse<{ list: DetailTable[]; total: number }>>({
url: "/api/measurement-data/list",
params,
method: "POST",
});
} }
export function delDetail(params: { ids: string | number }) { export function delDetail(params: { ids: string | number }) {
return httpRequest<BaseResponse>({
url: `/api/measurement-data/delete/${params.ids}`,
method: "POST",
});
return httpRequest<BaseResponse>({
url: `/api/measurement-data/delete/${params.ids}`,
method: "POST",
});
} }
export function createMeasure(params: MeasureRecord) { export function createMeasure(params: MeasureRecord) {
return httpRequest<BaseResponse>({
url: "/api/measurement-task/cache-measurement",
params,
method: "POST",
});
return httpRequest<BaseResponse>({
url: "/api/measurement-task/cache-measurement",
params,
method: "POST",
});
} }
export function fetchAnalysisReport(code: string) { export function fetchAnalysisReport(code: string) {
return httpRequest<BaseResponse<AnalysisReport>>({
url: `/api/measurement-task/save-analysis-report/${code}`,
method: "POST",
});
return httpRequest<BaseResponse<AnalysisReport>>({
url: `/api/measurement-task/save-analysis-report/${code}`,
method: "POST",
});
} }
/** /**
@ -67,10 +71,10 @@ export function fetchAnalysisReport(code: string) {
* POST /measurement-analysis/point/{uuid} * POST /measurement-analysis/point/{uuid}
*/ */
export function getRecordPointSetByUUID(uuid: string) { export function getRecordPointSetByUUID(uuid: string) {
return httpRequest<BaseResponse<ProfileRecordPointSet>>({
url: `/api/measurement-analysis/point/${uuid}`,
method: "POST",
});
return httpRequest<BaseResponse<ProfileRecordPointSet>>({
url: `/api/measurement-analysis/point/${uuid}`,
method: "POST",
});
} }
/** /**
@ -78,10 +82,10 @@ export function getRecordPointSetByUUID(uuid: string) {
* POST /measurement-analysis/base-point/{code} * POST /measurement-analysis/base-point/{code}
*/ */
export function getBaseRecordPointSetByCode(code: string) { export function getBaseRecordPointSetByCode(code: string) {
return httpRequest<BaseResponse<BaseProfileRecordPointSet>>({
url: `/api/measurement-analysis/base-point/${code}`,
method: "POST",
});
return httpRequest<BaseResponse<BaseProfileRecordPointSet>>({
url: `/api/measurement-analysis/base-point/${code}`,
method: "POST",
});
} }
/** /**
@ -92,29 +96,29 @@ export function getBaseRecordPointSetByCode(code: string) {
* @param code code * @param code code
*/ */
export function getReport(uuid: string, code: string) { export function getReport(uuid: string, code: string) {
return httpRequest<BaseResponse<AnalysisReport>>({
url: `/api/measurement-analysis/report`,
method: "POST",
params: { uuid, code },
});
return httpRequest<BaseResponse<AnalysisReport>>({
url: `/api/measurement-analysis/report`,
method: "POST",
params: { uuid, code },
});
} }
/** /**
* *
* /measurement-data * /measurement-data
*/ */
export function getDetail(params:{id:number}){
return httpRequest<BaseResponse<{uuid:string}>>({
url: `/api/measurement-data/${params.id}`,
method: "POST",
params,
});
export function getDetail(params: { id: number }) {
return httpRequest<BaseResponse<{ uuid: string }>>({
url: `/api/measurement-data/${params.id}`,
method: "POST",
params,
});
} }
export function getPointByUuid(params:{uuid:string}){
return httpRequest<BaseResponse>({
url: `/api/measurement-analysis/point/${params.uuid}`,
method: "POST",
params,
});
}
export function getPointByUuid(params: { uuid: string }) {
return httpRequest<BaseResponse>({
url: `/api/measurement-analysis/point/${params.uuid}`,
method: "POST",
params,
});
}

16
src/services/standardRail/standardRail.ts

@ -0,0 +1,16 @@
import { Rail } from "../apiTypes";
import httpRequest, { BaseResponse } from "../httpRequest";
export function getRailTypes() {
return httpRequest<BaseResponse<Rail[]>>({
url: "/api/standard-rail/list",
method: "POST",
});
}
export function deleteRailTypes(ids: number[]) {
return httpRequest<BaseResponse>({
url: `/api/standard-rail/delete/${ids.join(",")}`,
method: "POST",
});
}

55
src/store/features/baseDataSlice.ts

@ -0,0 +1,55 @@
// counterSlice.ts 文件
import { createAsyncThunk, createSlice, PayloadAction } from "@reduxjs/toolkit";
import { Calibration, Rail } from "../../services/apiTypes";
import { getRailTypes } from "../../services/standardRail/standardRail";
import { getCalibrationTypes } from "../../services/calibration/calibration";
export interface BaseDataState {
railTypes: Rail[];
calibrationTypes: Calibration[];
}
const initialState: BaseDataState = {
// 轨型列表
railTypes: [],
// 核校类型列表
calibrationTypes: [],
};
export const fetchRailTypes = createAsyncThunk("fetchRailTypes", async () => {
const res = await getRailTypes();
return res.success ? res.data : [];
});
export const fetchCalibrationTypes = createAsyncThunk("fetchCalibrationTypes", async () => {
const res = await getCalibrationTypes();
return res.success ? res.data : [];
});
export const baseDataSlice = createSlice({
name: "baseData",
initialState,
reducers: {
updateRailTypes: (state, action: PayloadAction<Rail[]>) => {
state.railTypes = action.payload;
},
updateCalibrationTypes: (state, action: PayloadAction<Calibration[]>) => {
state.calibrationTypes = action.payload;
},
},
extraReducers: builder => {
builder.addCase(fetchRailTypes.fulfilled, (state, action) => {
state.railTypes = action.payload;
});
builder.addCase(fetchCalibrationTypes.fulfilled, (state, action) => {
state.calibrationTypes = action.payload;
});
},
});
// 导出加减的方法
export const { updateRailTypes, updateCalibrationTypes } = baseDataSlice.actions;
// 默认导出
export default baseDataSlice.reducer;

36
src/store/features/contextSlice.ts

@ -2,15 +2,18 @@
import { createSlice, PayloadAction } from "@reduxjs/toolkit"; import { createSlice, PayloadAction } from "@reduxjs/toolkit";
import type { ContextMessage, DeviceStatus } from "../../services/wsTypes"; import type { ContextMessage, DeviceStatus } from "../../services/wsTypes";
import { fetchCalibrationTypes, fetchRailTypes } from "./baseDataSlice";
interface ContextSlice { interface ContextSlice {
user: ContextMessage["data"]; user: ContextMessage["data"];
newMeasureAfterSave: boolean;
device: DeviceStatus["data"]; device: DeviceStatus["data"];
newMeasureAfterSave: boolean;
currRailTypeId: number;
currCalibrationTypeId: number;
} }
const initialState: ContextSlice = { const initialState: ContextSlice = {
user: { loginFlag: false, loginUser: { nickname: "", userRole: "User" } }, user: { loginFlag: false, loginUser: { nickname: "", userRole: "User" } },
newMeasureAfterSave: false,
device: { device: {
isConnected: true, //是否链接 isConnected: true, //是否链接
power: 60, //电量 power: 60, //电量
@ -18,6 +21,14 @@ const initialState: ContextSlice = {
inclinatorY: 3.019, //y轴倾斜 inclinatorY: 3.019, //y轴倾斜
temperature: 32.026, //温度 temperature: 32.026, //温度
}, },
// 测量/分析相关
// 保存后自动开始新测量
newMeasureAfterSave: false,
// 当前选择的轨型
currRailTypeId: 1,
// 当前选择的核校
currCalibrationTypeId: 1,
}; };
export const contextSlice = createSlice({ export const contextSlice = createSlice({
@ -35,10 +46,29 @@ export const contextSlice = createSlice({
updateDevice: (state, action: PayloadAction<DeviceStatus["data"]>) => { updateDevice: (state, action: PayloadAction<DeviceStatus["data"]>) => {
state.device = action.payload; state.device = action.payload;
}, },
updateRailTypeId: (state, action: PayloadAction<number>) => {
state.currRailTypeId = action.payload;
},
updateCalibrationTypeId: (state, action: PayloadAction<number>) => {
state.currCalibrationTypeId = action.payload;
},
}, },
extraReducers: builder => {
builder.addCase(fetchRailTypes.fulfilled, (state, action) => {
if (!action.payload.some(t => t.id === state.currRailTypeId)) {
state.currRailTypeId = action.payload[0].id;
}
});
builder.addCase(fetchCalibrationTypes.fulfilled, (state, action) => {
if (!action.payload.some(t => t.id === state.currCalibrationTypeId)) {
state.currCalibrationTypeId = action.payload[0].id;
}
})
}
}); });
export const { updateUser, switchMeasureAfterSave, updateDevice } = contextSlice.actions;
export const { updateUser, switchMeasureAfterSave, updateDevice, updateRailTypeId, updateCalibrationTypeId } =
contextSlice.actions;
// 默认导出 // 默认导出
export default contextSlice.reducer; export default contextSlice.reducer;

4
src/store/index.ts

@ -4,13 +4,15 @@ import { configureStore } from "@reduxjs/toolkit";
import counterSlice from "./features/counterSlice"; import counterSlice from "./features/counterSlice";
import contextSlice from "./features/contextSlice"; import contextSlice from "./features/contextSlice";
import deviceStateSlice from "./device/deviceState"; import deviceStateSlice from "./device/deviceState";
import baseDataSlice from "./features/baseDataSlice";
// configureStore创建一个redux数据 // configureStore创建一个redux数据
const store = configureStore({ const store = configureStore({
// 合并多个Slice // 合并多个Slice
reducer: { reducer: {
counter: counterSlice, counter: counterSlice,
context: contextSlice, context: contextSlice,
deviceState: deviceStateSlice
deviceState: deviceStateSlice,
baseData: baseDataSlice,
}, },
}); });

Loading…
Cancel
Save