You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
381 lines
14 KiB
381 lines
14 KiB
import {Mask, NavBar, Picker, SpinLoading, Toast} from 'antd-mobile';
|
|
import { useNavigate } from 'react-router';
|
|
import icon_arr_r from '../assets/icon_arr_s_r.svg';
|
|
import {ChangeEvent, useCallback, useEffect, useState} from 'react';
|
|
import { useAppDispatch, useAppSelector } from '../utils/hooks';
|
|
import { DATA_SOURCE, LINE_CLASSIFY, UNIT_TYPES, XB_CODES } from '../utils/constant';
|
|
import { ExtraDesc, MeasurementDTO } from '../services/apiTypes';
|
|
import Bridge from '../utils/bridge';
|
|
import {clearData, resetState} from '../store/features/measureSlice';
|
|
import { selectOrgTextArr } from '../store';
|
|
|
|
export default function MeasureSave() {
|
|
const navigate = useNavigate();
|
|
const dispatch = useAppDispatch();
|
|
const back = () => navigate(-1);
|
|
|
|
const contextState = useAppSelector((state) => state.context);
|
|
const baseState = useAppSelector((state) => state.baseData);
|
|
const measureState = useAppSelector((state) => state.measure);
|
|
const orgTextArr = useAppSelector(selectOrgTextArr);
|
|
|
|
|
|
const loadData = useCallback(() => {
|
|
Bridge.getRecordList({ pageNum: 1, size: 1 }).then((res) => {
|
|
if (res.success && res.data.list.length) {
|
|
const data = res.data.list[0]?.records?.[0]
|
|
console.log(data)
|
|
setName(data?.name)
|
|
setBatch(data?.batch)
|
|
setMile(data?.mileage?.split('+')?.[0])
|
|
setMeter(data?.mileage?.split('+')?.[1])
|
|
setLineClassCode([data?.lineClassify])
|
|
setDataSourceCode([data?.dataSource])
|
|
setDirectionCode([data?.xbCode])
|
|
setUnitType([data?.unitType])
|
|
setTurnoutNum(Number(data?.turnoutNum || 1))
|
|
setSleeperNum(Number(data?.sleeperNum || 1))
|
|
setStationCode([data?.stationCode])
|
|
document.getElementById('name-id')?.focus()
|
|
}
|
|
});
|
|
}, []);
|
|
useEffect(() => {
|
|
loadData();
|
|
}, [loadData]);
|
|
|
|
|
|
const [name, setName] = useState('');
|
|
const [batch, setBatch] = useState('');
|
|
const [mile, setMile] = useState('10');
|
|
const [meter, setMeter] = useState('10');
|
|
const [turnoutNum, setTurnoutNum] = useState(1);
|
|
const [sleeperNum, setSleeperNum] = useState(1);
|
|
const [railPickerVisible, setRailPickerVisible] = useState(false);
|
|
const [dataSourcePickerVisible, setDataSourcePickerVisible] = useState(false);
|
|
const [lineClassPickerVisible, setLineClassPickerVisible] = useState(false);
|
|
const [unitTypePickerVisible, setUnitTypePickerVisible] = useState(false);
|
|
const [stationPickerVisible, setStationPickerVisible] = useState(false);
|
|
|
|
const [directionCode, setDirectionCode] = useState<string[]>([XB_CODES[0].value]);
|
|
const [dataSourceCode, setDataSourceCode] = useState<string[]>([DATA_SOURCE[0].value]);
|
|
const [lineClassCode, setLineClassCode] = useState<string[]>([LINE_CLASSIFY[0].value]);
|
|
const [stationCode, setStationCode] = useState<string[]>(
|
|
contextState.stationList.length > 0 ? [contextState.stationList[0].value] : []
|
|
);
|
|
const [unitType, setUnitType] = useState<string[]>([UNIT_TYPES[0].value]);
|
|
|
|
const onInputChange = (evt: ChangeEvent<HTMLInputElement>) => {
|
|
if (evt.target.name === 'name') {
|
|
if (evt.target.value.length <= 50) {
|
|
setName(evt.target.value);
|
|
}else {
|
|
Toast.show('名称长度不能超过50个字符');
|
|
}
|
|
} else if (evt.target.name === 'batch') {
|
|
if (evt.target.value.length <= 10) {
|
|
setBatch(evt.target.value);
|
|
}
|
|
else {
|
|
Toast.show('批次长度不能超过10个字符');
|
|
}
|
|
} else if (evt.target.name === 'mile') {
|
|
const val = evt.target.value.replace(/^0+/, '')
|
|
if (/^\d*$/.test(val)) {
|
|
setMile(val || '');
|
|
}
|
|
} else if (evt.target.name === 'meter') {
|
|
const val = evt.target.value.replace(/^0+/, '')
|
|
if (/^\d*$/.test(val)) {
|
|
setMeter(val || '');
|
|
}
|
|
} else if (evt.target.name === 'turnoutNum') {
|
|
if (/^\d*$/.test(evt.target.value)) {
|
|
setTurnoutNum(+evt.target.value);
|
|
}
|
|
} else if (evt.target.name === 'sleeperNum') {
|
|
if (/^\d*$/.test(evt.target.value)) {
|
|
setSleeperNum(+evt.target.value);
|
|
}
|
|
}
|
|
};
|
|
const [measureData, setMeasureData] = useState(measureState.measureData)
|
|
useEffect(()=>{
|
|
setMeasureData(measureState.measureData)
|
|
},[measureState.measureData])
|
|
|
|
const [loading, setLoading] = useState(false);
|
|
const onSaveBtnClick = () => {
|
|
if (!name) {
|
|
return Toast.show('请输入测量名称');
|
|
}
|
|
if (!batch) {
|
|
return Toast.show('请输入批次号');
|
|
}
|
|
setLoading(true)
|
|
const railType = baseState.railTypes.find((r) => r.id === contextState.currRailTypeId);
|
|
const [tlj, gwd, xm] = orgTextArr;
|
|
const desc: ExtraDesc = {
|
|
railSize: railType!.name,
|
|
tljCode: tlj,
|
|
gwdCode: gwd,
|
|
xmCode: xm,
|
|
xbCode: XB_CODES.find((x) => x.value === directionCode[0])?.label,
|
|
stationCode:
|
|
stationCode.length > 0
|
|
? contextState.stationList.find((s) => s.value === stationCode[0])?.label
|
|
: '',
|
|
lineClassify: LINE_CLASSIFY.find((l) => l.value === lineClassCode[0])?.label,
|
|
dataSource: DATA_SOURCE.find((d) => d.value === dataSourceCode[0])?.label,
|
|
unitType: UNIT_TYPES.find((u) => u.value === unitType[0])?.label,
|
|
mile: +mile,
|
|
meter: +meter,
|
|
};
|
|
const dto: MeasurementDTO = {
|
|
operator: 'klj_test',
|
|
dataType: 'MINIPROF',
|
|
name,
|
|
batch,
|
|
railSize: railType!.code,
|
|
tljCode: contextState.currOrgCode,
|
|
gwdCode: contextState.currGWDCode,
|
|
xmCode: contextState.currXMCode,
|
|
xbCode: directionCode[0],
|
|
stationCode: stationCode.length > 0 ? stationCode[0] : '',
|
|
lineClassify: lineClassCode[0],
|
|
dataSource: dataSourceCode[0],
|
|
turnoutNum: turnoutNum?.toFixed(),
|
|
sleeperNum: sleeperNum?.toFixed(),
|
|
unitType: unitType[0],
|
|
mileage: `${mile}+${meter.padStart(3, '0')}`,
|
|
radius: '',
|
|
extraDesc: JSON.stringify(desc),
|
|
alignPoints:[]
|
|
};
|
|
if(measureData && measureData.length){
|
|
dto.alignPoints = measureData
|
|
}
|
|
Bridge.saveMeasure(dto).then((res) => {
|
|
if (res.success) {
|
|
Toast.show('保存成功');
|
|
setTimeout(() => {
|
|
navigate('/home/measure');
|
|
dispatch(resetState());
|
|
dispatch(clearData());
|
|
}, 300);
|
|
} else {
|
|
Toast.show(res.message);
|
|
}
|
|
}).catch(e=>{
|
|
Toast.show({
|
|
content: '操作失败',
|
|
});
|
|
}).finally(() => {
|
|
setLoading(false)
|
|
});
|
|
};
|
|
|
|
return (
|
|
<>
|
|
<div>
|
|
{loading && (
|
|
<Mask opacity='thick' className="h-[100vh] flex justify-center items-center">
|
|
<div style={{ margin: '45%', display: 'flex', flexDirection: 'column', alignItems: 'center', justifyContent: 'center' }}>
|
|
<SpinLoading color="#5c92b4" />
|
|
<span className="whitespace-nowrap mt-5 text-[#5c92b4]" style={{fontSize: '16px'}}>请稍候...</span>
|
|
</div>
|
|
</Mask>
|
|
)}
|
|
<NavBar className="bg-white" onBack={back}>
|
|
测量参数
|
|
</NavBar>
|
|
<div className="main-page-content overflow-x-hidden overflow-y-auto">
|
|
<div className="bg-white px-5 text-sm text-text mt-2">
|
|
<div className="h-12 flex items-center border-b border-[#eee]">
|
|
<span>测量名称</span>
|
|
<input
|
|
id='name-id'
|
|
type="text"
|
|
name="name"
|
|
value={name}
|
|
placeholder="请填写测量名称"
|
|
className="border-0 outline-none self-stretch text-right flex-1 ml-4"
|
|
onChange={onInputChange}
|
|
/>
|
|
</div>
|
|
<div className="h-12 flex items-center border-b border-[#eee]">
|
|
<span>批次</span>
|
|
<input
|
|
type="text"
|
|
name="batch"
|
|
value={batch}
|
|
placeholder="请填写批次"
|
|
className="border-0 outline-none self-stretch text-right flex-1 ml-4"
|
|
onChange={onInputChange}
|
|
/>
|
|
</div>
|
|
<div
|
|
className="h-12 flex items-center border-b border-[#eee]"
|
|
onClick={() => setDataSourcePickerVisible(true)}
|
|
>
|
|
<span>数据来源</span>
|
|
<span className="ml-auto mr-4">
|
|
{DATA_SOURCE.find((r) => r.value === dataSourceCode[0])?.label || ''}
|
|
</span>
|
|
<img src={icon_arr_r} alt="arr" />
|
|
</div>
|
|
|
|
{dataSourceCode[0] === 'DCDC' ? (
|
|
<>
|
|
<div className="h-12 flex items-center border-b border-[#eee]">
|
|
<span>道岔号</span>
|
|
<input
|
|
type="number"
|
|
name="turnoutNum"
|
|
value={turnoutNum}
|
|
className="border-0 outline-none self-stretch text-right flex-1 ml-4"
|
|
onChange={onInputChange}
|
|
/>
|
|
</div>
|
|
<div className="h-12 flex items-center border-b border-[#eee]">
|
|
<span>枕木号</span>
|
|
<input
|
|
type="number"
|
|
name="sleeperNum"
|
|
value={sleeperNum}
|
|
className="border-0 outline-none self-stretch text-right flex-1 ml-4"
|
|
onChange={onInputChange}
|
|
/>
|
|
</div>
|
|
<div
|
|
className="h-12 flex items-center border-b border-[#eee]"
|
|
onClick={() => {
|
|
if (contextState.stationList.length > 0) {
|
|
setStationPickerVisible(true);
|
|
}
|
|
}}
|
|
>
|
|
<span>车站</span>
|
|
<span className="ml-auto mr-4">
|
|
{contextState.stationList.find((r) => r.value === stationCode[0])?.label || ''}
|
|
</span>
|
|
<img src={icon_arr_r} alt="arr" />
|
|
</div>
|
|
</>
|
|
) : (
|
|
<div className="h-12 flex items-center border-b border-[#eee]">
|
|
<span>里程</span>
|
|
<input
|
|
type="number"
|
|
name="mile"
|
|
value={mile}
|
|
className="w-14 h-8 mx-1 border border-[#eee] rounded outline-none text-center ml-auto"
|
|
onChange={onInputChange}
|
|
/>
|
|
<span>公里+</span>
|
|
<input
|
|
type="number"
|
|
name="meter"
|
|
value={meter}
|
|
className="w-14 h-8 mx-1 border border-[#eee] rounded outline-none text-center"
|
|
onChange={onInputChange}
|
|
/>
|
|
<span>米</span>
|
|
</div>
|
|
)}
|
|
|
|
<div
|
|
className="h-12 flex items-center border-b border-[#eee]"
|
|
onClick={() => setLineClassPickerVisible(true)}
|
|
>
|
|
<span>线路分类</span>
|
|
<span className="ml-auto mr-4">
|
|
{LINE_CLASSIFY.find((r) => r.value === lineClassCode[0])?.label || ''}
|
|
</span>
|
|
<img src={icon_arr_r} alt="arr" />
|
|
</div>
|
|
|
|
<div
|
|
className="h-12 flex items-center border-b border-[#eee]"
|
|
onClick={() => setRailPickerVisible(true)}
|
|
>
|
|
<span>行别</span>
|
|
<span className="ml-auto mr-4">
|
|
{XB_CODES.find((r) => r.value === directionCode[0])?.label || ''}
|
|
</span>
|
|
<img src={icon_arr_r} alt="arr" />
|
|
</div>
|
|
<div className="h-12 flex items-center " onClick={() => setUnitTypePickerVisible(true)}>
|
|
<span>股别</span>
|
|
<span className="ml-auto mr-4">
|
|
{UNIT_TYPES.find((r) => r.value === unitType[0])?.label || ''}
|
|
</span>
|
|
<img src={icon_arr_r} alt="arr" />
|
|
</div>
|
|
</div>
|
|
<div
|
|
className="btn-contained rounded-md h-12 mx-9 my-8 text-base font-medium"
|
|
onClick={onSaveBtnClick}
|
|
>
|
|
确定
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<Picker
|
|
columns={[XB_CODES]}
|
|
visible={railPickerVisible}
|
|
onClose={() => {
|
|
setRailPickerVisible(false);
|
|
}}
|
|
value={directionCode}
|
|
onConfirm={(v) => {
|
|
setDirectionCode(v as string[]);
|
|
}}
|
|
/>
|
|
<Picker
|
|
columns={[DATA_SOURCE]}
|
|
visible={dataSourcePickerVisible}
|
|
onClose={() => {
|
|
setDataSourcePickerVisible(false);
|
|
}}
|
|
value={dataSourceCode}
|
|
onConfirm={(v) => {
|
|
setDataSourceCode(v as string[]);
|
|
}}
|
|
/>
|
|
<Picker
|
|
columns={[LINE_CLASSIFY]}
|
|
visible={lineClassPickerVisible}
|
|
onClose={() => {
|
|
setLineClassPickerVisible(false);
|
|
}}
|
|
value={dataSourceCode}
|
|
onConfirm={(v) => {
|
|
setLineClassCode(v as string[]);
|
|
}}
|
|
/>
|
|
<Picker
|
|
columns={[UNIT_TYPES]}
|
|
visible={unitTypePickerVisible}
|
|
onClose={() => {
|
|
setUnitTypePickerVisible(false);
|
|
}}
|
|
value={unitType}
|
|
onConfirm={(v) => {
|
|
setUnitType(v as string[]);
|
|
}}
|
|
/>
|
|
<Picker
|
|
columns={[contextState.stationList]}
|
|
visible={stationPickerVisible}
|
|
onClose={() => {
|
|
setStationPickerVisible(false);
|
|
}}
|
|
value={stationCode}
|
|
onConfirm={(v) => {
|
|
setStationCode(v as string[]);
|
|
}}
|
|
/>
|
|
</>
|
|
);
|
|
}
|