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. 4
      src/components/MeasureItem.tsx
  2. 9
      src/pages/MeasureRecord.tsx
  3. 76
      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

4
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 { Measurement } from '../services/apiTypes';
export type UpdateState = 'idle' | 'pending' | 'uploading' | 'uploaded';
export default function MeasureItem({
@ -41,6 +40,7 @@ export default function MeasureItem({
</main>
<footer>
<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>
</main>
<aside className="flex items-center" onClick={onDetail}>
@ -95,7 +95,7 @@ export function MeasureItemEx(props: {
<h1 className="text-[15px] font-medium ">{props.item.name}</h1>
</header>
<main className="flex my-2">
<p className="flex-1 text-sm ">{props.item.extraDescObj?.gwdCode}</p>
<p className="flex-1 text-sm ">{props.item.extraDescObj?.gwdCode}</p>
<p className="flex-1 text-sm ">{props.item.extraDescObj?.xmCode}</p>
<p className="flex-1 text-sm ">{props.item.extraDescObj?.xbCode}</p>
</main>

9
src/pages/MeasureRecord.tsx

@ -123,6 +123,15 @@ export default function MeasureRecord() {
<p className="text-[#818181]"></p>
<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>
<span className="text-text">{measure.extraDescObj?.lineClassify}</span>

76
src/pages/MeasureSave.tsx

@ -22,6 +22,8 @@ export default function MeasureSave() {
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);
@ -47,6 +49,14 @@ export default function MeasureSave() {
if (/^\d*$/.test(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 = () => {
@ -84,6 +94,8 @@ export default function MeasureSave() {
stationCode: stationCode[0],
lineClassify: lineClassCode[0],
dataSource: dataSourceCode[0],
turnoutNum: turnoutNum.toFixed(),
sleeperNum: sleeperNum.toFixed(),
unitType: unitType[0],
mileage: `${mile}+${meter.toString().padStart(3, '0')}`,
radius: '',
@ -132,25 +144,6 @@ export default function MeasureSave() {
onChange={onInputChange}
/>
</div>
<div className="h-12 flex items-center border-b border-[#eee]">
<span></span>
<input
type="text"
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="text"
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={() => setDataSourcePickerVisible(true)}
@ -161,6 +154,51 @@ export default function MeasureSave() {
</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]">
<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={() => setStationPickerVisible(true)}

35
src/pages/UploadList.tsx

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

3
src/services/apiTypes.ts

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

2
src/services/mobileWsType.ts

@ -43,7 +43,7 @@ export type SyncProgress = {
remaining: number; // 剩余未同步数量
fail: 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,
fail: 0,
total: 0,
finish: true,
status: 'finished',
},
syncItems: [],
@ -179,5 +179,3 @@ export const {
resetSettingReqStatus,
} = contextSlice.actions;
export default contextSlice.reducer;
Loading…
Cancel
Save