Browse Source

保存测量

master
zhangjiming 4 months ago
parent
commit
445dcf242b
  1. 12
      src/components/MeasureItem.tsx
  2. 4
      src/components/MeasurementItem.tsx
  3. 59
      src/pages/MeasureSave.tsx
  4. 20
      src/services/apiTypes.ts
  5. 1
      src/services/wsTypes.ts
  6. 10
      src/store/features/measureSlice.ts
  7. 9
      src/utils/bridge.ts
  8. 84
      src/utils/constant.ts

12
src/components/MeasureItem.tsx

@ -31,12 +31,12 @@ export default function MeasureItem({
<h1 className="text-[15px] font-medium ">{item.name}</h1> <h1 className="text-[15px] font-medium ">{item.name}</h1>
</header> </header>
<main className="flex my-2"> <main className="flex my-2">
<p className="flex-1 text-sm ">{`${item.line}`}</p>
<p className="flex-1 text-sm ">{`${item.section}`}</p>
<p className="flex-1 text-sm ">{`${item.lineName}`}</p>
<p className="flex-1 text-sm ">{`${item.location}`}</p>
<p className="flex-1 text-sm ">{`${item.direction}方向`}</p> <p className="flex-1 text-sm ">{`${item.direction}方向`}</p>
</main> </main>
<footer> <footer>
<span className="text-sm text-[#b7b7b7]">{item.createAt}</span>
<span className="text-sm text-[#b7b7b7]">{item.createTime}</span>
</footer> </footer>
</main> </main>
<aside className="flex items-center" onClick={onDetail}> <aside className="flex items-center" onClick={onDetail}>
@ -91,12 +91,12 @@ export function MeasureItemEx(props: {
<h1 className="text-[15px] font-medium ">{props.item.name}</h1> <h1 className="text-[15px] font-medium ">{props.item.name}</h1>
</header> </header>
<main className="flex my-2"> <main className="flex my-2">
<p className="flex-1 text-sm ">{`${props.item.line}`}</p>
<p className="flex-1 text-sm ">{`${props.item.section}`}</p>
<p className="flex-1 text-sm ">{`${props.item.lineName}`}</p>
<p className="flex-1 text-sm ">{`${props.item.location}`}</p>
<p className="flex-1 text-sm ">{`${props.item.direction}方向`}</p> <p className="flex-1 text-sm ">{`${props.item.direction}方向`}</p>
</main> </main>
<footer> <footer>
<span className="text-sm text-[#b7b7b7]">{props.item.createAt}</span>
<span className="text-sm text-[#b7b7b7]">{props.item.createTime}</span>
</footer> </footer>
</main> </main>
<aside className="flex items-center" onClick={props.onDetail}> <aside className="flex items-center" onClick={props.onDetail}>

4
src/components/MeasurementItem.tsx

@ -29,8 +29,8 @@ export default function MeasurementItem({
{/* <span className="text-sm text-[#b7b7b7]">{item.createAt.replace('T',' ').split(' ')[1]}</span> */} {/* <span className="text-sm text-[#b7b7b7]">{item.createAt.replace('T',' ').split(' ')[1]}</span> */}
</header> </header>
<main className="flex mt-2"> <main className="flex mt-2">
<p className="flex-1 text-sm ">{`${item.line}`}</p>
<p className="flex-1 text-sm ">{`${item.section}`}</p>
<p className="flex-1 text-sm ">{`${item.lineName}`}</p>
<p className="flex-1 text-sm ">{`${item.location}`}</p>
<p className="flex-1 text-sm ">{`${item.direction}方向`}</p> <p className="flex-1 text-sm ">{`${item.direction}方向`}</p>
</main> </main>
</main> </main>

59
src/pages/MeasureSave.tsx

@ -1,26 +1,59 @@
import { NavBar, Picker } from 'antd-mobile';
import { NavBar, Picker, Toast } from 'antd-mobile';
import { useNavigate } from 'react-router'; import { useNavigate } from 'react-router';
import icon_arr_r from '../assets/icon_arr_s_r.svg'; import icon_arr_r from '../assets/icon_arr_s_r.svg';
// import { railTypes } from '../utils/constant';
import { ChangeEvent, useState } from 'react'; import { ChangeEvent, useState } from 'react';
import { useAppSelector } from '../utils/hooks'; import { useAppSelector } from '../utils/hooks';
import { XB_CODES } from '../utils/constant';
import { selectLabeledKtjOrgs } from '../store/features/baseData';
import { textsOfKeys } from '../utils/helper';
import { SaveMeasureDTO } from '../services/apiTypes';
import Bridge from '../utils/bridge';
export default function MeasureSave() { export default function MeasureSave() {
const navigate = useNavigate(); const navigate = useNavigate();
const back = () => navigate(-1); const back = () => navigate(-1);
const baseState = useAppSelector(state => state.baseData);
const contextState = useAppSelector((state) => state.context);
const baseState = useAppSelector((state) => state.baseData);
const labeledKtjOrgs = useAppSelector((state) => selectLabeledKtjOrgs(state.baseData));
const [name, setName] = useState("")
const [name, setName] = useState('');
const [railPickerVisible, setRailPickerVisible] = useState(false); const [railPickerVisible, setRailPickerVisible] = useState(false);
const [railId, setRailId] = useState<(number | string | null)[]>([1]);
// const [railId, setRailId] = useState<(number | string | null)[]>([1]);
const [directionCode, setDirectionCode] = useState<string[]>([XB_CODES[0].value]);
const onInputChange = (evt: ChangeEvent<HTMLInputElement>) => { const onInputChange = (evt: ChangeEvent<HTMLInputElement>) => {
setName(evt.target.value)
}
setName(evt.target.value);
};
const onSaveBtnClick = () => { const onSaveBtnClick = () => {
console.log(name, railId)
if (!name) {
Toast.show('请输入测量名称');
return;
}
const railType = baseState.railTypes.find((r) => r.id === contextState.currRailTypeId);
const [_, gwd, xm] = orgTextArr();
const dto: SaveMeasureDTO = {
operatorName: '',
trackShapeCode: railType!.code,
name,
lineName: xm,
location: gwd,
direction: directionCode[0],
}; };
Bridge.saveMeasure(dto).then((res) => {
if (res.success) {
Toast.show('保存成功');
} else {
Toast.show(res.message);
}
});
};
function orgTextArr() {
return textsOfKeys(
[contextState.currOrgCode, contextState.currGWDCode, contextState.currXMCode],
labeledKtjOrgs
);
}
return ( return (
<> <>
@ -41,9 +74,9 @@ export default function MeasureSave() {
/> />
</div> </div>
<div className="h-12 flex items-center " onClick={() => setRailPickerVisible(true)}> <div className="h-12 flex items-center " onClick={() => setRailPickerVisible(true)}>
<span></span>
<span></span>
<span className="ml-auto mr-4"> <span className="ml-auto mr-4">
{baseState.railTypes.find((r) => r.id === railId[0])?.name || ''}
{XB_CODES.find((r) => r.value === directionCode[0])?.label || ''}
</span> </span>
<img src={icon_arr_r} alt="arr" /> <img src={icon_arr_r} alt="arr" />
</div> </div>
@ -57,14 +90,14 @@ export default function MeasureSave() {
</div> </div>
</div> </div>
<Picker <Picker
columns={[baseState.railTypes.map((t) => ({ ...t, label: t.name, value: t.id }))]}
columns={[XB_CODES]}
visible={railPickerVisible} visible={railPickerVisible}
onClose={() => { onClose={() => {
setRailPickerVisible(false); setRailPickerVisible(false);
}} }}
value={railId}
value={directionCode}
onConfirm={(v) => { onConfirm={(v) => {
setRailId(v);
setDirectionCode(v as string[]);
}} }}
/> />
</> </>

20
src/services/apiTypes.ts

@ -1,12 +1,13 @@
export type Measurement = { export type Measurement = {
id: number; id: number;
name: string; name: string;
railId: number;
trackShapeCode: string;
operatorName: string;
bureau: string; bureau: string;
line: string;
section: string;
lineName: string;
location: string;
direction: string; direction: string;
createAt: string; // Date;
createTime: string; // Date;
leftPoints: string; // json: 坐标数组 leftPoints: string; // json: 坐标数组
rightPoints: string; // json: 坐标数组 rightPoints: string; // json: 坐标数组
upload: boolean; upload: boolean;
@ -32,4 +33,13 @@ export type RailType = {
code: string; code: string;
calPoints?: string; calPoints?: string;
points?: string; points?: string;
}
};
export type SaveMeasureDTO = {
operatorName: string;
trackShapeCode: string;
name: string;
lineName: string;
location: string;
direction: string;
};

1
src/services/wsTypes.ts

@ -3,6 +3,7 @@ export type TaskState = {
messageType: 'EVENT'; messageType: 'EVENT';
data: data:
| 'START_RECORD_SIG' | 'START_RECORD_SIG'
| 'SPEED_DETECTED'
// | "END_RECORD_SIG" // | "END_RECORD_SIG"
// | "FINISHED" // | "FINISHED"
| 'START_RECORD_LEFT' | 'START_RECORD_LEFT'

10
src/store/features/measureSlice.ts

@ -18,8 +18,7 @@ function isLeftFinished(state: MeasureState) {
if ( if (
state.taskState === 'FINISH_RECORD_LEFT' || state.taskState === 'FINISH_RECORD_LEFT' ||
state.taskState === 'START_RECORD_RIGHT' || state.taskState === 'START_RECORD_RIGHT' ||
state.taskState === 'FINISH_RECORD_RIGHT' ||
state.taskState === 'FINISH_RECORD'
state.taskState === 'FINISH_RECORD_RIGHT'
) )
return true; return true;
return false; return false;
@ -30,6 +29,13 @@ export const measureSlice = createSlice({
initialState, initialState,
reducers: { reducers: {
updateTaskState: (state, action: PayloadAction<TaskState['data']>) => { updateTaskState: (state, action: PayloadAction<TaskState['data']>) => {
if (
action.payload === 'SPEED_DETECTED' ||
action.payload === 'END_RECORD' ||
action.payload === 'FINISH_RECORD'
) {
return;
}
state.taskState = action.payload; state.taskState = action.payload;
if (action.payload === 'START_RECORD_SIG' || action.payload === 'WRONG_SIDE') { if (action.payload === 'START_RECORD_SIG' || action.payload === 'WRONG_SIDE') {
state.leftPoints = []; state.leftPoints = [];

9
src/utils/bridge.ts

@ -1,6 +1,6 @@
import { Subject } from 'rxjs'; import { Subject } from 'rxjs';
import httpRequest from '../services/httpRequest'; import httpRequest from '../services/httpRequest';
import { Measurement, RailType } from '../services/apiTypes';
import { Measurement, RailType, SaveMeasureDTO } from '../services/apiTypes';
import { MobileDatagram, SyncProgress } from '../services/mobileWsType'; import { MobileDatagram, SyncProgress } from '../services/mobileWsType';
declare global { declare global {
@ -328,4 +328,11 @@ export default class Bridge {
params, params,
}); });
} }
static saveMeasure(params: SaveMeasureDTO) {
return httpRequest<BridgeBaseResult>({
url: '/api/measure/save',
method: 'POST',
params,
});
}
} }

84
src/utils/constant.ts

@ -1,4 +1,3 @@
export const rail6001 = { export const rail6001 = {
id: 1, id: 1,
createTime: '2025-03-03 12:31:25', createTime: '2025-03-03 12:31:25',
@ -11,7 +10,6 @@ export const rail6001 = {
'[{"type":"arc","start": {"x": 0,"y": 0},"end": {"x": -9.949,"y": 0.165},"radius": 300,"color":"#339900","side":"right"},{"type":"arc","start": {"x": -9.949,"y": 0.165},"end": {"x": -25.35,"y": 2.185},"radius": 80,"color":"#336699","side":"right"},{"type":"arc","start": {"x": -25.35,"y": 2.185},"end": {"x": -35.4,"y": 14.2},"radius": 13,"color":"#660000","side":"right"},{"type":"arc","start": {"x": 0,"y": 0},"end": {"x": 9.949,"y": 0.165},"radius": 300,"color":"#99CCCC","side":"left"},{"type":"arc","start": {"x": 9.949,"y": 0.165},"end": {"x": 25.35,"y": 2.185},"radius": 80,"color":"#CC0033","side":"left"},{"type":"arc","start": {"x": 25.35,"y": 2.185},"end": {"x": 35.4,"y": 14.2},"radius": 13,"color":"#CC6600","side":"left"}]', '[{"type":"arc","start": {"x": 0,"y": 0},"end": {"x": -9.949,"y": 0.165},"radius": 300,"color":"#339900","side":"right"},{"type":"arc","start": {"x": -9.949,"y": 0.165},"end": {"x": -25.35,"y": 2.185},"radius": 80,"color":"#336699","side":"right"},{"type":"arc","start": {"x": -25.35,"y": 2.185},"end": {"x": -35.4,"y": 14.2},"radius": 13,"color":"#660000","side":"right"},{"type":"arc","start": {"x": 0,"y": 0},"end": {"x": 9.949,"y": 0.165},"radius": 300,"color":"#99CCCC","side":"left"},{"type":"arc","start": {"x": 9.949,"y": 0.165},"end": {"x": 25.35,"y": 2.185},"radius": 80,"color":"#CC0033","side":"left"},{"type":"arc","start": {"x": 25.35,"y": 2.185},"end": {"x": 35.4,"y": 14.2},"radius": 13,"color":"#CC6600","side":"left"}]',
}; };
export const ktjOrgs = [ export const ktjOrgs = [
{ {
key: '003', key: '003',
@ -1653,25 +1651,63 @@ export const ktjOrgs = [
}, },
]; ];
// export const railTypes = [
// {
// id: 1,
// code: '1',
// name: '60轨',
// },
// {
// id: 2,
// code: '2',
// name: '60N轨',
// },
// {
// id: 3,
// code: '3',
// name: '50轨',
// },
// {
// id: 4,
// code: '4',
// name: '43轨',
// },
// ];
//行别
export const XB_CODES = [
{
label: '上行',
value: 'S',
},
{
label: '下行',
value: 'X',
},
{
label: '单行',
value: 'D',
},
];
export const MILE_TYPES = [
{
label: '大里程',
value: 'D',
},
{
label: '小里程',
value: 'X',
},
];
//股别 type 1:直线 2:曲线
export const RAIN_TYPES = [
{
label: '左股',
value: 'SL',
type: 1,
},
{
label: '右股',
value: 'SR',
type: 1,
},
{
label: '上股 左股',
value: 'HL',
type: 2,
},
{
label: '上股 右股',
value: 'HR',
type: 2,
},
{
label: '下股 左股',
value: 'LL',
type: 2,
},
{
label: '下股 右股',
value: 'LR',
type: 2,
},
];
Loading…
Cancel
Save