Browse Source

测量记录mock

master
zhangjiming 4 months ago
parent
commit
ed4071aa86
  1. 10
      src/components/MeasureGroups.tsx
  2. 85
      src/pages/MeasurementList.tsx
  3. 99
      src/utils/bridge.ts
  4. 178
      src/utils/constant.ts

10
src/components/MeasureGroups.tsx

@ -14,7 +14,7 @@ export default function MeasureGroups({
onGroupSelect,
selectedIds,
}: {
dataList: Array<{ groupName: string; list: Measurement[] }>;
dataList: Array<{ date: string; records: Measurement[] }>;
editMode: boolean;
hasMore: boolean;
loadMore: () => Promise<void>;
@ -31,15 +31,15 @@ export default function MeasureGroups({
{dataList.length > 0 ? (
<>
{dataList.map((group, idx) => (
<div key={group.groupName}>
<div key={group.date}>
<GroupItem
title={group.groupName}
title={group.date}
editMode={editMode}
selected={isSubset(group.list.map((item) => item.id))}
selected={isSubset(group.records.map((item) => item.id))}
onGroupSelect={() => onGroupSelect(idx)}
/>
<List>
{group.list.map((item) => (
{group.records.map((item) => (
<List.Item key={item.id}>
<MeasurementItem
item={item}

85
src/pages/MeasurementList.tsx

@ -1,21 +1,47 @@
import { NavBar } from 'antd-mobile';
import { NavBar, Toast } from 'antd-mobile';
import { useNavigate } from 'react-router-dom';
import MeasureGroups from '../components/MeasureGroups';
import { useState } from 'react';
import { useCallback, useEffect, useState } from 'react';
import { Measurement } from '../services/apiTypes';
import * as R from 'ramda';
import { MoreOutline, SearchOutline } from 'antd-mobile-icons';
import { dataList } from '../utils/constant';
import Bridge from '../utils/bridge';
const PAGE_SIZE = 10;
export default function MeasurementList() {
const navigate = useNavigate();
const [dataList, setDataList] = useState<{ date: string; records: Measurement[] }[]>([]);
const [noMore, setNoMore] = useState(false);
const [editMode, setEditMode] = useState(false);
const [selectedIds, setSelectedIds] = useState<number[]>([]);
async function loadMoreRecords() {}
const loadData = useCallback(() => {
Bridge.getRecordList({ pageNum: 1, size: PAGE_SIZE }).then((res) => {
if (res.success) {
setDataList(res.data.list);
setNoMore(res.data.list.length < PAGE_SIZE);
} else {
Toast.show(res.message);
}
});
}, []);
async function loadMoreData() {
const pageNum = Math.floor(dataList.length / PAGE_SIZE);
const res = await Bridge.getRecordList({ pageNum: pageNum + 1, size: PAGE_SIZE });
if (res.success) {
setDataList((list) => list.concat(res.data.list));
setNoMore(res.data.list.length < PAGE_SIZE);
} else {
Toast.show(res.message);
}
}
useEffect(() => {
loadData();
}, [loadData]);
const onItemSelect = (groupIdx: number, id: number) => {
if (selectedIds.includes(id)) {
@ -26,7 +52,7 @@ export default function MeasurementList() {
};
const onGroupSelect = (groupIdx: number) => {
const ids = dataList[groupIdx].list.map((item) => item.id);
const ids = dataList[groupIdx].records.map((item) => item.id);
if (R.intersection(selectedIds, ids).length === ids.length) {
setSelectedIds(R.difference(selectedIds, ids));
} else {
@ -34,17 +60,30 @@ export default function MeasurementList() {
}
};
const onUploadClick = () => {
navigate("/measure/upload")
}
const onUploadClick = async () => {
const res = await Bridge.uploadRecords({ ids: selectedIds });
if (res.success) {
navigate('/measure/upload');
} else {
Toast.show(res.message);
}
};
const onDeleteClick = async () => {
const res = await Bridge.deleteRecords({ ids: selectedIds });
if (res.success) {
setSelectedIds([]);
setEditMode(false);
loadData();
} else {
Toast.show(res.message);
}
};
const right = (
<div
className="flex justify-end gap-x-2"
style={{ fontSize: 24 }}
>
<SearchOutline onClick={() => navigate("/measure/search")} />
<MoreOutline onClick={() => setEditMode(!editMode)}/>
<div className="flex justify-end gap-x-2" style={{ fontSize: 24 }}>
<SearchOutline onClick={() => navigate('/measure/search')} />
<MoreOutline onClick={() => setEditMode(!editMode)} />
</div>
);
@ -61,8 +100,8 @@ export default function MeasurementList() {
<MeasureGroups
dataList={dataList}
editMode={editMode}
hasMore={false}
loadMore={loadMoreRecords}
hasMore={!noMore}
loadMore={loadMoreData}
onItemSelect={onItemSelect}
onGroupSelect={onGroupSelect}
selectedIds={selectedIds}
@ -71,10 +110,18 @@ export default function MeasurementList() {
className="fixed -bottom-12 w-full h-12 bg-white flex px-5 py-2 gap-x-4"
style={{ bottom: editMode ? 0 : '-48px', transition: 'bottom 300ms' }}
>
<button disabled={selectedIds.length === 0} className="btn-contained rounded-md flex-1" onClick={onUploadClick}>
<button
disabled={selectedIds.length === 0}
className="btn-contained rounded-md flex-1"
onClick={onUploadClick}
>
</button>
<button disabled={selectedIds.length === 0} className="btn-contained rounded-md flex-1">
<button
disabled={selectedIds.length === 0}
className="btn-contained rounded-md flex-1"
onClick={onDeleteClick}
>
</button>
</footer>

99
src/utils/bridge.ts

@ -200,21 +200,6 @@ export default class Bridge {
}
}
static uploadRecords(param: { ids: number[] }) {
if (appWebview) {
return new Promise<BridgeBaseResult>((resolve) => {
const res = window.SyncBridgeJS.call('uploadRecords', JSON.stringify(param));
resolve(JSON.parse(res));
});
} else {
return httpRequest<BridgeBaseResult>({
url: '/api/mobile/uploadRecords',
method: 'POST',
params: param,
});
}
}
static scanPeripherals() {
return httpRequest<BridgeBaseResult>({
url: '/api/ble/list/start',
@ -258,45 +243,75 @@ export default class Bridge {
});
}
static getSyncTaskList(params: { pageNum: number; size: number }) {
return httpRequest<BridgeBaseResult<{list: Measurement[]}>>({
url: '/api/sync/list',
method: "POST",
params
})
return httpRequest<BridgeBaseResult<{ list: Measurement[] }>>({
url: '/api/sync/list',
method: 'POST',
params,
});
}
static addSyncTask(params: {ids: number[]}) {
static addSyncTask(params: { ids: number[] }) {
return httpRequest<BridgeBaseResult>({
url: '/api/sync/add',
method: "POST",
params
})
url: '/api/sync/add',
method: 'POST',
params,
});
}
static getSyncProcess() {
return httpRequest<BridgeBaseResult<SyncProgress["data"]>>({
url: '/api/sync/progress',
method: "POST",
params:{}
})
return httpRequest<BridgeBaseResult<SyncProgress['data']>>({
url: '/api/sync/progress',
method: 'POST',
params: {},
});
}
static clearSyncList() {
return httpRequest<BridgeBaseResult>({
url: '/api/sync/empty-all',
method: "POST",
params:{}
})
url: '/api/sync/empty-all',
method: 'POST',
params: {},
});
}
static clearFinishedSync() {
return httpRequest<BridgeBaseResult>({
url: '/api/sync/empty-finish',
method: "POST",
params:{}
})
url: '/api/sync/empty-finish',
method: 'POST',
params: {},
});
}
static retryFailureSync() {
return httpRequest<BridgeBaseResult>({
url: '/api/sync/re-fail',
method: "POST",
params:{}
})
url: '/api/sync/re-fail',
method: 'POST',
params: {},
});
}
static getRecordList(params: { pageNum: number; size: number }) {
return httpRequest<BridgeBaseResult<{ list: Array<{ date: string; records: Measurement[] }> }>>(
{
url: '/api/record/list',
method: 'POST',
params,
}
);
}
static getRecordDetail(params: { id: number }) {
return httpRequest<BridgeBaseResult<Measurement>>({
url: '/api/record/detail',
method: 'POST',
params,
});
}
static deleteRecords(params: { ids: number[] }) {
return httpRequest<BridgeBaseResult>({
url: '/api/record/delete',
method: 'POST',
params,
});
}
static uploadRecords(params: { ids: number[] }) {
return httpRequest<BridgeBaseResult>({
url: '/api/sync/add',
method: 'POST',
params,
});
}
}

178
src/utils/constant.ts

@ -1,4 +1,3 @@
import { Measurement } from '../services/apiTypes';
export const rail6001 = {
id: 1,
@ -1676,180 +1675,3 @@ export const railTypes = [
name: '43轨',
},
];
export const bureauList = [
{
id: 1,
name: '北京铁路局',
},
{
id: 2,
name: '南京铁路局',
},
{
id: 3,
name: '上海铁路局',
},
{
id: 4,
name: '广州铁路局',
},
];
export const lineList = [
{
id: 1,
name: '京沪线',
},
{
id: 2,
name: '京九线',
},
{
id: 3,
name: '陇海线',
},
{
id: 4,
name: '京广线',
},
];
export const sectionList = [
{
id: 1,
name: '路段一',
},
{
id: 2,
name: '路段二',
},
{
id: 3,
name: '路段三',
},
{
id: 4,
name: '路段四',
},
];
// export const dataListFlat: Measurement[] = [
// {
// id: 1,
// name: '测量名称1',
// createAt: '2025-03-02 10:20',
// line: '京沪线',
// section: 'A段',
// direction: '上行',
// railId: 2,
// leftPoints: '[]',
// rightPoints: '[]',
// bureau: '北京铁路局',
// upload: false,
// },
// {
// id: 2,
// name: '测量名称2',
// createAt: '2025-03-02 12:22',
// line: '京沪线',
// section: 'B段',
// direction: '下行',
// railId: 2,
// leftPoints: '[]',
// rightPoints: '[]',
// bureau: '北京铁路局',
// upload: false,
// },
// {
// id: 3,
// name: '测量名称3',
// createAt: '2025-03-02 12:20',
// line: '京沪线',
// section: 'C段',
// direction: '上行',
// railId: 2,
// leftPoints: '[]',
// rightPoints: '[]',
// bureau: '北京铁路局',
// upload: false,
// },
// ];
export const dataList: Array<{ groupName: string; list: Measurement[] }> = [
// {
// groupName: '2025-03-02',
// list: [
// {
// id: 1,
// name: '测量名称1',
// createAt: '2025-03-02 10:20',
// line: '京沪线',
// section: 'A段',
// direction: '上行',
// railId: 2,
// leftPoints: '[]',
// rightPoints: '[]',
// bureau: '北京铁路局',
// upload: false,
// },
// {
// id: 2,
// name: '测量名称2',
// createAt: '2025-03-02 12:22',
// line: '京沪线',
// section: 'B段',
// direction: '下行',
// railId: 2,
// leftPoints: '[]',
// rightPoints: '[]',
// bureau: '北京铁路局',
// upload: false,
// },
// {
// id: 3,
// name: '测量名称3',
// createAt: '2025-03-02 12:20',
// line: '京沪线',
// section: 'C段',
// direction: '上行',
// railId: 2,
// leftPoints: '[]',
// rightPoints: '[]',
// bureau: '北京铁路局',
// upload: false,
// },
// ],
// },
// {
// groupName: '2025-02-01',
// list: [
// {
// id: 4,
// name: '测量名称2',
// createAt: '2025-03-02 10:20',
// line: '京沪线',
// section: 'D段',
// direction: '下行',
// railId: 2,
// leftPoints: '[]',
// rightPoints: '[]',
// bureau: '北京铁路局',
// upload: false,
// },
// {
// id: 5,
// name: '测量名称2',
// createAt: '2025-03-02 10:20',
// line: '京沪线',
// section: 'E段',
// direction: '下行',
// railId: 2,
// leftPoints: '[]',
// rightPoints: '[]',
// bureau: '北京铁路局',
// upload: false,
// },
// ],
// },
];
Loading…
Cancel
Save