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

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[]);
}}
/>
</>
);
}