4 Commits

Author SHA1 Message Date
zhangjiming d1b233354e 显示失败原因 4 months ago
zhangjiming 6d8927bcfb 修改上传状态 4 months ago
zhangjiming 40f5ec65bd 添加道岔号和枕木号 4 months ago
zhangjiming a7b19c6f64 重试失败任务-重试上传 4 months ago
  1. 2
      src/components/MeasureItem.tsx
  2. 9
      src/pages/MeasureRecord.tsx
  3. 62
      src/pages/MeasureSave.tsx
  4. 35
      src/pages/UploadList.tsx
  5. 3
      src/services/apiTypes.ts
  6. 2
      src/services/mobileWsType.ts
  7. 4
      src/store/features/contextSlice.ts

2
src/components/MeasureItem.tsx

@ -6,7 +6,6 @@ import icon_uploading from '../assets/icon_upload_1.svg';
import icon_uploaded from '../assets/icon_upload_2.svg'; import icon_uploaded from '../assets/icon_upload_2.svg';
import { Measurement } from '../services/apiTypes'; import { Measurement } from '../services/apiTypes';
export type UpdateState = 'idle' | 'pending' | 'uploading' | 'uploaded'; export type UpdateState = 'idle' | 'pending' | 'uploading' | 'uploaded';
export default function MeasureItem({ export default function MeasureItem({
@ -41,6 +40,7 @@ export default function MeasureItem({
</main> </main>
<footer> <footer>
<span className="text-sm text-[#b7b7b7]">{item.createTime}</span> <span className="text-sm text-[#b7b7b7]">{item.createTime}</span>
{item.syncStatus === 'fail' && item.errorMsg && <p className='text-xs text-[red] whitespace-pre-wrap'>{item.errorMsg}</p>}
</footer> </footer>
</main> </main>
<aside className="flex items-center" onClick={onDetail}> <aside className="flex items-center" onClick={onDetail}>

9
src/pages/MeasureRecord.tsx

@ -123,6 +123,15 @@ export default function MeasureRecord() {
<p className="text-[#818181]"></p> <p className="text-[#818181]"></p>
<span className="text-text">{measure.extraDescObj?.dataSource}</span> <span className="text-text">{measure.extraDescObj?.dataSource}</span>
{measure.dataSource === 'DCDC' && (
<>
<p className="text-[#818181]"></p>
<span className="text-text">{measure.turnoutNum}</span>
<p className="text-[#818181]"></p>
<span className="text-text">{measure.sleeperNum}</span>
</>
)}
<p className="text-[#818181]">线</p> <p className="text-[#818181]">线</p>
<span className="text-text">{measure.extraDescObj?.lineClassify}</span> <span className="text-text">{measure.extraDescObj?.lineClassify}</span>

62
src/pages/MeasureSave.tsx

@ -22,6 +22,8 @@ export default function MeasureSave() {
const [batch, setBatch] = useState(''); const [batch, setBatch] = useState('');
const [mile, setMile] = useState(10); const [mile, setMile] = useState(10);
const [meter, setMeter] = useState(10); const [meter, setMeter] = useState(10);
const [turnoutNum, setTurnoutNum] = useState(1);
const [sleeperNum, setSleeperNum] = useState(1);
const [railPickerVisible, setRailPickerVisible] = useState(false); const [railPickerVisible, setRailPickerVisible] = useState(false);
const [dataSourcePickerVisible, setDataSourcePickerVisible] = useState(false); const [dataSourcePickerVisible, setDataSourcePickerVisible] = useState(false);
const [lineClassPickerVisible, setLineClassPickerVisible] = useState(false); const [lineClassPickerVisible, setLineClassPickerVisible] = useState(false);
@ -47,6 +49,14 @@ export default function MeasureSave() {
if (/^\d*$/.test(evt.target.value)) { if (/^\d*$/.test(evt.target.value)) {
setMeter(+evt.target.value); setMeter(+evt.target.value);
} }
} 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 onSaveBtnClick = () => { const onSaveBtnClick = () => {
@ -84,6 +94,8 @@ export default function MeasureSave() {
stationCode: stationCode[0], stationCode: stationCode[0],
lineClassify: lineClassCode[0], lineClassify: lineClassCode[0],
dataSource: dataSourceCode[0], dataSource: dataSourceCode[0],
turnoutNum: turnoutNum.toFixed(),
sleeperNum: sleeperNum.toFixed(),
unitType: unitType[0], unitType: unitType[0],
mileage: `${mile}+${meter.toString().padStart(3, '0')}`, mileage: `${mile}+${meter.toString().padStart(3, '0')}`,
radius: '', radius: '',
@ -132,10 +144,45 @@ export default function MeasureSave() {
onChange={onInputChange} onChange={onInputChange}
/> />
</div> </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]"> <div className="h-12 flex items-center border-b border-[#eee]">
<span></span> <span></span>
<input <input
type="text"
type="number"
name="mile" name="mile"
value={mile} value={mile}
className="w-14 h-8 mx-1 border border-[#eee] rounded outline-none text-center ml-auto" className="w-14 h-8 mx-1 border border-[#eee] rounded outline-none text-center ml-auto"
@ -143,7 +190,7 @@ export default function MeasureSave() {
/> />
<span>+</span> <span>+</span>
<input <input
type="text"
type="number"
name="meter" name="meter"
value={meter} value={meter}
className="w-14 h-8 mx-1 border border-[#eee] rounded outline-none text-center" className="w-14 h-8 mx-1 border border-[#eee] rounded outline-none text-center"
@ -151,16 +198,7 @@ export default function MeasureSave() {
/> />
<span></span> <span></span>
</div> </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>
)}
<div <div
className="h-12 flex items-center border-b border-[#eee]" className="h-12 flex items-center border-b border-[#eee]"
onClick={() => setStationPickerVisible(true)} onClick={() => setStationPickerVisible(true)}

35
src/pages/UploadList.tsx

@ -24,13 +24,10 @@ export default function UploadList() {
const actions = [ const actions = [
{ {
text: '重试失败任务',
text: '重试上传',
key: 'retry', key: 'retry',
onClick: async () => { onClick: async () => {
setShowMenu(false); setShowMenu(false);
if (context.syncProgress.fail === 0) {
return Toast.show('目前没有失败的任务');
}
const res = await Bridge.retryFailureSync(); const res = await Bridge.retryFailureSync();
if (!res.success) { if (!res.success) {
Toast.show(res.message); Toast.show(res.message);
@ -42,7 +39,7 @@ export default function UploadList() {
key: 'clear', key: 'clear',
onClick: () => { onClick: () => {
setShowMenu(false); setShowMenu(false);
if (!context.syncProgress.finish) {
if (context.syncProgress.status === 'uploading') {
Dialog.confirm({ Dialog.confirm({
content: '存在未完成的任务,确定清空?', content: '存在未完成的任务,确定清空?',
onConfirm: () => { onConfirm: () => {
@ -110,6 +107,7 @@ export default function UploadList() {
useEffect(() => { useEffect(() => {
const subscription = bridgeOb.subscribe((datagram) => { const subscription = bridgeOb.subscribe((datagram) => {
if (datagram.type === 'sync-item-finish') { if (datagram.type === 'sync-item-finish') {
console.log(datagram);
const item = list.find((item) => item.id === datagram.data.id); const item = list.find((item) => item.id === datagram.data.id);
if (item) { if (item) {
item.syncStatus = datagram.data.success ? 'finish' : 'fail'; item.syncStatus = datagram.data.success ? 'finish' : 'fail';
@ -122,16 +120,25 @@ export default function UploadList() {
const back = () => navigate(-1); const back = () => navigate(-1);
const right = ( const right = (
// <div
// onClick={() => setShowMenu(!showMenu)}
// className="flex justify-end gap-x-2"
// style={{ fontSize: 24 }}
// >
// <MoreOutline />
// </div>
<></>
<div
onClick={() => setShowMenu(!showMenu)}
className="flex justify-end gap-x-2"
style={{ fontSize: 24 }}
>
<MoreOutline />
</div>
); );
const statusText = () => {
if (context.syncProgress.status === 'finished') {
return '完成';
} else if (context.syncProgress.status === 'paused') {
return '暂停';
} else if (context.syncProgress.status === 'uploading') {
return '上传中';
}
};
return ( return (
<div> <div>
<NavBar className="bg-white" onBack={back} right={right}> <NavBar className="bg-white" onBack={back} right={right}>
@ -142,7 +149,7 @@ export default function UploadList() {
<span>{context.syncProgress.remaining}</span> <span>{context.syncProgress.remaining}</span>
<i className="border-l border-[#999] h-3 mx-2" /> <i className="border-l border-[#999] h-3 mx-2" />
<span>{context.syncProgress.fail}</span> <span>{context.syncProgress.fail}</span>
<p className="ml-auto text-primary">{context.syncProgress.finish ? '完成' : '上传中'}</p>
<p className="ml-auto text-primary">{statusText()}</p>
</header> </header>
<main <main
className="relative overflow-x-hidden overflow-y-auto" className="relative overflow-x-hidden overflow-y-auto"

3
src/services/apiTypes.ts

@ -44,6 +44,8 @@ export type MeasurementDTO = {
stationCode: string; stationCode: string;
dataType: string; // 采集方式 dataType: string; // 采集方式
dataSource: string; dataSource: string;
turnoutNum: string;
sleeperNum: string;
railSize: string; // 轨型 railSize: string; // 轨型
lineClassify: string; // 线路分类 lineClassify: string; // 线路分类
batch: string; batch: string;
@ -52,6 +54,7 @@ export type MeasurementDTO = {
unitType: string; // 股别 unitType: string; // 股别
radius: string; radius: string;
extraDesc: string; // 额外描述 extraDesc: string; // 额外描述
errorMsg?: string;
}; };
export type ExtraDesc = { export type ExtraDesc = {

2
src/services/mobileWsType.ts

@ -43,7 +43,7 @@ export type SyncProgress = {
remaining: number; // 剩余未同步数量 remaining: number; // 剩余未同步数量
fail: number; // 同步失败数量 fail: number; // 同步失败数量
total: number; // 总数量 total: number; // 总数量
finish: boolean; // 是否同步完成(true 表示全部完成)
status: "uploading" | "paused" | "finished"; // 上传中 暂停 完成
}; };
}; };

4
src/store/features/contextSlice.ts

@ -52,7 +52,7 @@ const initialState: ContextState = {
remaining: 0, remaining: 0,
fail: 0, fail: 0,
total: 0, total: 0,
finish: true,
status: 'finished',
}, },
syncItems: [], syncItems: [],
@ -179,5 +179,3 @@ export const {
resetSettingReqStatus, resetSettingReqStatus,
} = contextSlice.actions; } = contextSlice.actions;
export default contextSlice.reducer; export default contextSlice.reducer;
Loading…
Cancel
Save