feat(prefetch): 增加实际查询时间字段及日志分页加载功能

- 在预拉取订单日志响应中新增实际最早和最晚日志时间字段
- 修改接口返回类型,添加 actualStartTime 和 actualEndTime 字段
- 组件中增加当前查询起止时间状态管理
- 优化日志列表分页加载逻辑,支持根据实际时间加载更早日志
- 修正滚动触底加载时机,避免重复加载
- 搜索后将滚动条重置至顶部
- 初始加载日志时,滚动条自动定位顶部展示最新日志
This commit is contained in:
danial
2025-12-08 15:01:40 +08:00
parent 86252f67db
commit 10a8c21fab
3 changed files with 67 additions and 31 deletions

View File

@@ -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
}; };
``` ```

View File

@@ -21,4 +21,12 @@ export interface KamiApiCamelOilV1GetPrefetchOrderLogsRes {
* 预拉取订单日志列表 * 预拉取订单日志列表
*/ */
logs?: Array<KamiApiCamelOilV1PrefetchOrderLogItem>; logs?: Array<KamiApiCamelOilV1PrefetchOrderLogItem>;
/**
* 实际查询到的最早日志时间
*/
actualStartTime?: string;
/**
* 实际查询到的最晚日志时间
*/
actualEndTime?: string;
} }

View File

@@ -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;
} }
}); });
}); });