feat(prefetch): 增加实际查询时间字段及日志分页加载功能
- 在预拉取订单日志响应中新增实际最早和最晚日志时间字段 - 修改接口返回类型,添加 actualStartTime 和 actualEndTime 字段 - 组件中增加当前查询起止时间状态管理 - 优化日志列表分页加载逻辑,支持根据实际时间加载更早日志 - 修正滚动触底加载时机,避免重复加载 - 搜索后将滚动条重置至顶部 - 初始加载日志时,滚动条自动定位顶部展示最新日志
This commit is contained in:
@@ -2,9 +2,11 @@
|
|||||||
|
|
||||||
## Properties
|
## Properties
|
||||||
|
|
||||||
| Name | Type | Description | Notes |
|
| Name | Type | Description | Notes |
|
||||||
| -------- | -------------------------------------------------------------------------------------------------- | ------------------ | --------------------------------- |
|
| ------------------- | -------------------------------------------------------------------------------------------------- | ------------------------ | --------------------------------- |
|
||||||
| **logs** | [**Array<KamiApiCamelOilV1PrefetchOrderLogItem>**](KamiApiCamelOilV1PrefetchOrderLogItem.md) | 预拉取订单日志列表 | [optional] [default to undefined] |
|
| **logs** | [**Array<KamiApiCamelOilV1PrefetchOrderLogItem>**](KamiApiCamelOilV1PrefetchOrderLogItem.md) | 预拉取订单日志列表 | [optional] [default to undefined] |
|
||||||
|
| **actualStartTime** | **string** | 实际查询到的最早日志时间 | [optional] [default to undefined] |
|
||||||
|
| **actualEndTime** | **string** | 实际查询到的最晚日志时间 | [optional] [default to undefined] |
|
||||||
|
|
||||||
## Example
|
## Example
|
||||||
|
|
||||||
@@ -12,7 +14,9 @@
|
|||||||
import { KamiApiCamelOilV1GetPrefetchOrderLogsRes } from './api';
|
import { KamiApiCamelOilV1GetPrefetchOrderLogsRes } from './api';
|
||||||
|
|
||||||
const instance: KamiApiCamelOilV1GetPrefetchOrderLogsRes = {
|
const instance: KamiApiCamelOilV1GetPrefetchOrderLogsRes = {
|
||||||
logs
|
logs,
|
||||||
|
actualStartTime,
|
||||||
|
actualEndTime
|
||||||
};
|
};
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|||||||
@@ -21,4 +21,12 @@ export interface KamiApiCamelOilV1GetPrefetchOrderLogsRes {
|
|||||||
* 预拉取订单日志列表
|
* 预拉取订单日志列表
|
||||||
*/
|
*/
|
||||||
logs?: Array<KamiApiCamelOilV1PrefetchOrderLogItem>;
|
logs?: Array<KamiApiCamelOilV1PrefetchOrderLogItem>;
|
||||||
|
/**
|
||||||
|
* 实际查询到的最早日志时间
|
||||||
|
*/
|
||||||
|
actualStartTime?: string;
|
||||||
|
/**
|
||||||
|
* 实际查询到的最晚日志时间
|
||||||
|
*/
|
||||||
|
actualEndTime?: string;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -132,12 +132,11 @@ const formModel = reactive({
|
|||||||
});
|
});
|
||||||
|
|
||||||
const logsRenderData = ref<KamiApiCamelOilV1PrefetchOrderLogItem[]>([]);
|
const logsRenderData = ref<KamiApiCamelOilV1PrefetchOrderLogItem[]>([]);
|
||||||
const allLogs = ref<KamiApiCamelOilV1PrefetchOrderLogItem[]>([]);
|
|
||||||
const currentPage = ref(1);
|
|
||||||
const pageSize = ref(50);
|
|
||||||
const hasMore = ref(true);
|
const hasMore = ref(true);
|
||||||
const logContentRef = ref<HTMLElement>();
|
const logContentRef = ref<HTMLElement>();
|
||||||
const loadingMore = ref(false);
|
const loadingMore = ref(false);
|
||||||
|
const currentStartTime = ref<string | null>(null); // 当前查询的开始时间
|
||||||
|
const currentEndTime = ref<string | null>(null); // 当前查询的结束时间
|
||||||
|
|
||||||
const generateFormModel = () => {
|
const generateFormModel = () => {
|
||||||
const now = dayjs();
|
const now = dayjs();
|
||||||
@@ -156,43 +155,60 @@ const formatDateTime = (dateTime: string | undefined): string => {
|
|||||||
return dayjs(dateTime).format('YYYY-MM-DD HH:mm:ss');
|
return dayjs(dateTime).format('YYYY-MM-DD HH:mm:ss');
|
||||||
};
|
};
|
||||||
|
|
||||||
const fetchLogs = async (reset = true) => {
|
const fetchLogs = async (
|
||||||
if (!formModel.startTime || !formModel.endTime) {
|
reset = true,
|
||||||
Message.warning({
|
startTimeOverride?: string,
|
||||||
content: '请选择开始时间和结束时间',
|
endTimeOverride?: string
|
||||||
closable: true
|
) => {
|
||||||
});
|
let queryStartTime: string;
|
||||||
setLoading(false);
|
let queryEndTime: string;
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (reset) {
|
if (reset) {
|
||||||
|
// 初始查询或搜索,使用表单时间
|
||||||
|
if (!formModel.startTime || !formModel.endTime) {
|
||||||
|
Message.warning({
|
||||||
|
content: '请选择开始时间和结束时间',
|
||||||
|
closable: true
|
||||||
|
});
|
||||||
|
setLoading(false);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
queryStartTime = dayjs(formModel.startTime).format('YYYY-MM-DD HH:mm:ss');
|
||||||
|
queryEndTime = dayjs(formModel.endTime).format('YYYY-MM-DD HH:mm:ss');
|
||||||
setLoading(true);
|
setLoading(true);
|
||||||
} else {
|
} else {
|
||||||
|
// 继续查询,使用传入的时间覆盖或当前时间往前倒1分钟
|
||||||
|
queryStartTime =
|
||||||
|
startTimeOverride ||
|
||||||
|
dayjs(currentStartTime.value)
|
||||||
|
.subtract(1, 'minute')
|
||||||
|
.format('YYYY-MM-DD HH:mm:ss');
|
||||||
|
queryEndTime = endTimeOverride || currentStartTime.value!; // 从当前最早时间开始
|
||||||
loadingMore.value = true;
|
loadingMore.value = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const { data } = await jdV2PrefetchClient.apiJdV2PrefetchLogsGet({
|
const { data } = await jdV2PrefetchClient.apiJdV2PrefetchLogsGet({
|
||||||
startTime: dayjs(formModel.startTime).format('YYYY-MM-DD HH:mm:ss'),
|
startTime: queryStartTime,
|
||||||
endTime: dayjs(formModel.endTime).format('YYYY-MM-DD HH:mm:ss')
|
endTime: queryEndTime
|
||||||
});
|
});
|
||||||
|
|
||||||
const newLogs = data.logs || [];
|
const newLogs = data.logs || [];
|
||||||
|
const actualStartTime = data.actualStartTime;
|
||||||
|
const actualEndTime = data.actualEndTime;
|
||||||
|
|
||||||
if (reset) {
|
if (reset) {
|
||||||
allLogs.value = newLogs;
|
// 初始查询
|
||||||
logsRenderData.value = newLogs.slice(0, pageSize.value);
|
logsRenderData.value = newLogs.reverse(); // 倒序显示,最新的在前面
|
||||||
currentPage.value = 1;
|
currentStartTime.value = actualStartTime || queryStartTime;
|
||||||
hasMore.value = newLogs.length > pageSize.value;
|
currentEndTime.value = actualEndTime || queryEndTime;
|
||||||
|
hasMore.value = newLogs.length > 0 && actualStartTime !== null;
|
||||||
} else {
|
} else {
|
||||||
const nextBatch = newLogs.slice(
|
// 继续查询
|
||||||
currentPage.value * pageSize.value,
|
logsRenderData.value.push(...newLogs.reverse()); // 倒序显示,追加在后面
|
||||||
(currentPage.value + 1) * pageSize.value
|
currentStartTime.value = actualStartTime || queryStartTime;
|
||||||
);
|
// 如果没有返回更多数据或者实际查询时间没有变化,说明没有更多数据了
|
||||||
logsRenderData.value.push(...nextBatch);
|
hasMore.value = newLogs.length > 0 && actualStartTime !== null;
|
||||||
currentPage.value++;
|
|
||||||
hasMore.value = currentPage.value * pageSize.value < newLogs.length;
|
|
||||||
}
|
}
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
console.error('获取预拉取订单日志失败:', err);
|
console.error('获取预拉取订单日志失败:', err);
|
||||||
@@ -218,14 +234,20 @@ const handleScroll = (event: Event) => {
|
|||||||
const target = event.target as HTMLElement;
|
const target = event.target as HTMLElement;
|
||||||
const { scrollTop, scrollHeight, clientHeight } = target;
|
const { scrollTop, scrollHeight, clientHeight } = target;
|
||||||
|
|
||||||
// 当滚动到距离底部50px时加载更多
|
// 当滚动到底部(距离底部50px内)时加载更早的日志
|
||||||
if (scrollTop + clientHeight >= scrollHeight - 50) {
|
if (scrollHeight - scrollTop <= clientHeight + 50) {
|
||||||
loadMoreLogs();
|
loadMoreLogs();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
const searchLogs = () => {
|
const searchLogs = () => {
|
||||||
fetchLogs(true);
|
fetchLogs(true);
|
||||||
|
// 搜索后重置滚动位置到顶部
|
||||||
|
nextTick(() => {
|
||||||
|
if (logContentRef.value) {
|
||||||
|
logContentRef.value.scrollTop = 0;
|
||||||
|
}
|
||||||
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
const resetLogs = () => {
|
const resetLogs = () => {
|
||||||
@@ -242,6 +264,8 @@ onMounted(() => {
|
|||||||
nextTick(() => {
|
nextTick(() => {
|
||||||
if (logContentRef.value) {
|
if (logContentRef.value) {
|
||||||
logContentRef.value.addEventListener('scroll', handleScroll);
|
logContentRef.value.addEventListener('scroll', handleScroll);
|
||||||
|
// 初始状态滚动到顶部显示最新日志
|
||||||
|
logContentRef.value.scrollTop = 0;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user