Browse Source

优化测量

feat_upload_server_url_0416
LiLongLong 4 months ago
parent
commit
4082757f35
  1. 2
      .env
  2. 2
      package.json
  3. 36
      src/components/SideMenu.tsx
  4. 63
      src/pages/measure/components/MeasureAction.tsx
  5. 28
      src/pages/measure/components/MeasureDetail.tsx
  6. 99
      src/pages/system/Setting.tsx
  7. 22
      src/pages/system/types.ts
  8. 9
      src/services/measure/type.ts
  9. 12
      src/services/user/system.ts

2
.env

@ -1 +1 @@
REACT_APP_WS_URL=192.168.1.146:8080/ws
REACT_APP_WS_URL=127.0.0.1:8080/ws

2
package.json

@ -2,7 +2,7 @@
"name": "outline", "name": "outline",
"version": "0.1.0", "version": "0.1.0",
"private": true, "private": true,
"proxy": "http://192.168.1.146:8080",
"proxy": "http://127.0.0.1:8080",
"dependencies": { "dependencies": {
"@babel/core": "^7.16.0", "@babel/core": "^7.16.0",
"@pmmmwh/react-refresh-webpack-plugin": "^0.5.3", "@pmmmwh/react-refresh-webpack-plugin": "^0.5.3",

36
src/components/SideMenu.tsx

@ -36,24 +36,24 @@ const items: MenuItem[] = [
label: '轨形配置' label: '轨形配置'
}] }]
}, },
{
key: "task",
label: "任务管理",
icon: <img src={icon_task} alt=""/>,
children: [{
key: '/task/list',
label: '任务列表'
}]
},
{
key: "system",
label: "系统设置",
icon: <img src={icon_task} alt=""/>,
children: [{
key: '/system',
label: '系统设置'
}]
},
// {
// key: "task",
// label: "任务管理",
// icon: <img src={icon_task} alt=""/>,
// children: [{
// key: '/task/list',
// label: '任务列表'
// }]
// },
// {
// key: "system",
// label: "系统设置",
// icon: <img src={icon_task} alt=""/>,
// children: [{
// key: '/system',
// label: '系统设置'
// }]
// },
]; ];
export default function SideMenu() { export default function SideMenu() {

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

@ -1,15 +1,14 @@
import React, { useState, useEffect, useRef, useCallback, useMemo } from "react"; import React, { useState, useEffect, useRef, useCallback, useMemo } from "react";
import { Button, Checkbox, CheckboxProps, Drawer, message, Switch } from "antd";
import { Button, Checkbox, CheckboxProps, Drawer, message, Select, Switch } from "antd";
import { useNavigate } from "react-router"; import { useNavigate } from "react-router";
import { import {
fetchAnalysisReport, fetchAnalysisReport,
saveMeasurement,
startMeasurement, startMeasurement,
} from "../../../services/measure/analysis"; } from "../../../services/measure/analysis";
import { getBaseRecordPointSetByCode } from "../../../services/track/trackShape"
import { getBaseRecordPointSetByCode, gx_list } from "../../../services/track/trackShape"
import { createWebSocket, sharedWsUrl } from "../../../services/socket"; import { createWebSocket, sharedWsUrl } from "../../../services/socket";
import { switchMeasureAfterSave } from "../../../store/features/contextSlice"; import { switchMeasureAfterSave } from "../../../store/features/contextSlice";
import { AnalysisReport } from "../../../services/measure/type";
import { AnalysisReport, trackItem } 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";
import Gr_round from "../../../assets/green_round.svg"; import Gr_round from "../../../assets/green_round.svg";
@ -40,15 +39,11 @@ export default function MeasureAction() {
// showMark的备份,记录showMark最近一次的值 // showMark的备份,记录showMark最近一次的值
const [angleMarkBackup, setAngleMarkBackup] = useState(true); const [angleMarkBackup, setAngleMarkBackup] = useState(true);
const afterSave = useAppSelector(store => store.context.newMeasureAfterSave); const afterSave = useAppSelector(store => store.context.newMeasureAfterSave);
// const [angles, setAngles] = useState<AnalyzeAngle[]>([]);
// const [taskStatus, setTaskStatus] = useState<MeasureState["data"]["taskStatus"]>("IDLE");
const [startBtnText, setStartBtnText] = useState("开始测量"); const [startBtnText, setStartBtnText] = useState("开始测量");
const [measurementFinished, setMeasurementFinished] = useState(false); const [measurementFinished, setMeasurementFinished] = useState(false);
// 【分析】之后,会得到分析报告 // 【分析】之后,会得到分析报告
const [analysisReport, setAnalysisReport] = useState<AnalysisReport | null>(null); const [analysisReport, setAnalysisReport] = useState<AnalysisReport | null>(null);
// const [showAnalysisTable, setShowAnalysisTable] = useState(false);
// const [taskStatusName, setTaskStatusName] = useState("");
// 初始状态列表 // 初始状态列表
const initialStatusList = useMemo( const initialStatusList = useMemo(
@ -282,7 +277,6 @@ export default function MeasureAction() {
// 处理点数据消息 // 处理点数据消息
const handlePointReport = (pointData: TrackRecordSig["data"]) => { const handlePointReport = (pointData: TrackRecordSig["data"]) => {
console.log(`pointData === ${pointData.x},${pointData.y}`);
if (!isLeftFinished.current) { if (!isLeftFinished.current) {
leftPoints.current.push(pointData); leftPoints.current.push(pointData);
canvasRef.current?.setMeasurementDataLeft([...leftPoints.current]); canvasRef.current?.setMeasurementDataLeft([...leftPoints.current]);
@ -307,7 +301,13 @@ export default function MeasureAction() {
/** ----------------------- 页面加载获取基础图形数据 ----------------------- **/ /** ----------------------- 页面加载获取基础图形数据 ----------------------- **/
useEffect(() => { useEffect(() => {
getBaseRecordPointSetByCode(GX_CODE).then(res => {
queryBasePoints(GX_CODE)
//获取轨型
getTrackDataList()
}, []);
const queryBasePoints = (gxCode:string) => {
getBaseRecordPointSetByCode(gxCode).then(res => {
if (res.success) { if (res.success) {
const benchmarkShapes = JSON.parse(res.data.points) as BenchmarkShape[]; const benchmarkShapes = JSON.parse(res.data.points) as BenchmarkShape[];
if (canvasRef.current) { if (canvasRef.current) {
@ -316,7 +316,36 @@ export default function MeasureAction() {
} }
} }
}); });
}, []);
}
/********************************轨型数据************************************* */
const [trackList, setTrackList] = useState<trackItem[]>([])
const [defaultTrackValue, setDefaultTrackValue] = useState<string>()
const getTrackDataList = () => {
gx_list().then(res => {
if(res.data && res.data.length){
let resData:trackItem[] = res.data;
let list:trackItem[] = []
resData.map(item => {
if(item.points){
list.push(item)
}
})
setTrackList(list)
}
})
}
useEffect(()=>{
if(trackList && trackList.length){
setDefaultTrackValue(trackList[0].code)
}
},[trackList])
const onTrackChange = (value: string) => {
queryBasePoints(value)
}
const onExport = () => {}; const onExport = () => {};
/** ----------------------- 渲染 ----------------------- **/ /** ----------------------- 渲染 ----------------------- **/
@ -325,7 +354,19 @@ export default function MeasureAction() {
<div className="flex h-full px-6"> <div className="flex h-full px-6">
{/* 左侧区域:包含开关区域和测量画布 */} {/* 左侧区域:包含开关区域和测量画布 */}
<div className=""> <div className="">
<div className="relative flex gap-4 items-center py-3"> <div className="relative flex gap-4 items-center py-3">
<Select
className="w-[150px]"
placeholder="请选择轨型"
key={defaultTrackValue}
defaultValue={defaultTrackValue}
onChange={onTrackChange}
options={trackList.map((item) => ({
label: item.name,
value: item.code,
}))}
></Select>
{/* <div {/* <div
className="absolute text-primary border border-primary rounded px-4 py-[2px] font-medium cursor-pointer hover:text-primary/[0.8]" className="absolute text-primary border border-primary rounded px-4 py-[2px] font-medium cursor-pointer hover:text-primary/[0.8]"
onClick={() => navigate("../config", { replace: true })}> onClick={() => navigate("../config", { replace: true })}>

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

@ -349,7 +349,7 @@ export default function MeasureDetail() {
} }
const [name, setName] = useState<string>() const [name, setName] = useState<string>()
const [lineName, setLineName] = useState<string>()
const [dataSource, setDataSource] = useState<string>()
let searchParams:SearchParams = { let searchParams:SearchParams = {
pageNum, pageNum,
pageSize, pageSize,
@ -361,7 +361,7 @@ export default function MeasureDetail() {
pageSize, pageSize,
pageNum: 1, pageNum: 1,
name, name,
lineName
dataSource
} }
getDetailDataList(searchParams) getDetailDataList(searchParams)
} }
@ -380,6 +380,25 @@ export default function MeasureDetail() {
setAnalysisReport({}) setAnalysisReport({})
setIsModalOpen(false) setIsModalOpen(false)
} }
useEffect(() => {
const intervalId = setInterval(() => {
if (percent < 100) {
const randomIncrement = Math.floor(Math.random() * 3) + 1;
const newProgress = Math.min(percent + randomIncrement, 100);
setPercent(newProgress);
} else {
clearInterval(intervalId);
}
}, 1000);
if(percent >= 90){
clearInterval(intervalId);
}
return () => {
clearInterval(intervalId);
};
}, [isModaUploadlOpen,percent]);
return ( return (
<div> <div>
@ -503,11 +522,12 @@ export default function MeasureDetail() {
</Button> </Button>
<Input className='ml-[2rem]' placeholder="测量名称" onChange={(e)=>setName(e.target.value)} style={{ width: 200 }}/>
<Input className='ml-[2rem]' allowClear placeholder="测量名称" onChange={(e)=>setName(e.target.value)} style={{ width: 200 }}/>
<Select <Select
placeholder="请选择数据来源" placeholder="请选择数据来源"
className='ml-[2rem] w-[150px]' className='ml-[2rem] w-[150px]'
onChange={setLineName}
allowClear
onChange={setDataSource}
options={SJLY_List.map((item) => ({ options={SJLY_List.map((item) => ({
label: item.value, label: item.value,
value: item.key, value: item.key,

99
src/pages/system/Setting.tsx

@ -1,3 +1,100 @@
import { useState, useEffect } from 'react';
import type { CascaderProps } from 'antd';
import { Button, Cascader, Input } from 'antd';
import { getOrgListService } from '../../services/ktj/org';
import { options, OrgItem } from '../../services/ktjTypes';
import { GwdItem, orgCascaderType, systemItem } from './types';
import { sysSet } from '../../services/user/system';
export default function Setting(){ export default function Setting(){
return <div>123</div>
useEffect(()=>{
queryRailData()
querySettingData()
},[])
const [systemList, setSystemList] = useState<systemItem[]>([])
const [accountInfo, setAccountInfo] = useState<systemItem>({})
function querySettingData(){
sysSet({}, "GET").then(res=>{
setSystemList(res.data)
let data:systemItem[] = res.data;
let accountInfo:systemItem = {}
data.map(item => {
if(item.code === 'UPLOAD_USERNAME'){
accountInfo = {
name: item.name,
code: item.code,
value: item.value
}
}
})
console.log('accountInfo---', accountInfo)
setAccountInfo(accountInfo)
})
}
useEffect(()=>{
}, [accountInfo])
//获取铁路局数据
const [KTJOrgList, setKTJOrgList] = useState<orgCascaderType[]>([]);
function queryRailData(){
getOrgListService().then((res) => {
if (res && res.data) {
let resData: OrgItem[] = res.data;
let data = convertToCascaderData(resData)
setKTJOrgList(data)
}
}).catch((e) => {});
}
function onOrgChange(value:string[]){
console.log('value===', value)
if(value && value.length)
sysSet({code:"ORG",name:"org",value:JSON.stringify(value)}, "PUT").then(res=>{
console.log('res===', res)
})
}
function onSaveAccount(){
sysSet({code:"UPLOAD_USERNAME", name:accountInfo.name,value:accountInfo.value}, "PUT").then(res=>{
console.log('res===', res)
})
}
function convertToCascaderData(data:OrgItem[]) {
return data.map(item => {
const newItem:orgCascaderType = {
value: item.key,
label: item.value,
};
if (item.gwdDicList && item.gwdDicList.length > 0) {
newItem.children = item.gwdDicList.map(gwdItem => {
const newGwdItem:GwdItem = {
value: gwdItem.key,
label: gwdItem.value,
};
if (gwdItem.railDicList && gwdItem.railDicList.length > 0) {
newGwdItem.children = gwdItem.railDicList.map(railItem => ({
value: railItem.key,
label: railItem.value || railItem.input
}));
}
return newGwdItem;
});
}
return newItem;
});
}
return <div>
<section className='p-[20px]'>
<div><Cascader className='w-[300px]' options={KTJOrgList} onChange={onOrgChange} placeholder="请选择局段线" /></div>
<div className='mt-[10px]'>
{accountInfo.name}
<Input key={accountInfo.value} defaultValue={accountInfo.value} onChange={(e)=>{setAccountInfo({...accountInfo, value:e.target.value})}} className='w-[300px]'></Input>
<Button className='ml-[10px]' size='small' type="primary" onClick={onSaveAccount}></Button>
</div>
</section>
</div>
} }

22
src/pages/system/types.ts

@ -0,0 +1,22 @@
export type child = {
value: string;
label: string;
}
export type GwdItem = {
value: string;
label: string;
children?: child[]
}
export type orgCascaderType = {
value: string;
label: string;
children?: child[]
}
export type systemItem = {
code?: string;
name?: string;
value?: string;
}

9
src/services/measure/type.ts

@ -99,7 +99,7 @@ export type SearchParams = {
pageSize:number; pageSize:number;
pageNum: number; pageNum: number;
name?: string; name?: string;
lineName?: string;
dataSource?: string;
} }
//保存测量数据 //保存测量数据
@ -118,4 +118,11 @@ export type reportParams = {
"lineClassify": string; "lineClassify": string;
"stationCode": string; "stationCode": string;
"mileage": string; "mileage": string;
}
//轨型
export type trackItem = {
name: string;
code: string;
points: string;
} }

12
src/services/user/system.ts

@ -1,8 +1,10 @@
import httpRequest, { BaseResponse } from "../httpRequest"; import httpRequest, { BaseResponse } from "../httpRequest";
export function sysSet(params: { name:string, value: string }) {
export function sysSet(params:{code?: string, name?: string, value?: string}, type: "GET" | "POST" | "PATCH" | "PUT" | "DELETE" = "GET"): Promise<BaseResponse> {
return httpRequest<BaseResponse>({ return httpRequest<BaseResponse>({
url: "/api/sysSet",
params,
method: "PUT",
url: "/api/sysSet/",
params: {
...params,
},
method: type
}); });
}
}
Loading…
Cancel
Save