refactor: StartTask 抽取功能域组合式函数

This commit is contained in:
2026-08-27 21:48:32 +08:00
parent f1fcae0dac
commit d33bc11014
4 changed files with 268 additions and 151 deletions
@@ -0,0 +1,113 @@
import { ref, watch } from 'vue';
import { getTaskFragments, getTaskReports } from '@/api/studySessions';
/** 历史残片 / 历史报告共用的列表项形状(模板只消费这些字段) */
export interface SessionHistoryRecord {
id: number;
sessionNum: string;
content: string;
sessionExpectation?: string;
}
/**
* 学习会话页的“历史学习记录”面板:按任务分页查询历史残片与报告,
* 支持关键字搜索(300ms 防抖)与 tab 切换。
*/
export function useSessionHistory(taskNum: string) {
const PAGE_SIZE = 10;
const showHistory = ref(false);
const historyTab = ref("fragments");
const historyKeyword = ref("");
let historyDebounce: ReturnType<typeof setTimeout> | null = null;
const loadingHistory = ref(false);
const historyFragments = ref<SessionHistoryRecord[]>([]);
const fragmentsTotal = ref(0);
const fragmentsPage = ref(1);
const historyReports = ref<SessionHistoryRecord[]>([]);
const reportsTotal = ref(0);
const reportsPage = ref(1);
watch(showHistory, (val) => {
if (val) {
// 展开时立即加载当前 tab 的数据
if (historyTab.value === "fragments") loadHistoryFragments();
else loadHistoryReports();
}
});
const loadHistoryFragments = async () => {
loadingHistory.value = true;
try {
const res = await getTaskFragments(taskNum, fragmentsPage.value, PAGE_SIZE, historyKeyword.value || undefined);
const data = res?.data;
historyFragments.value = data?.records || [];
fragmentsTotal.value = data?.total || 0;
} catch {
historyFragments.value = [];
fragmentsTotal.value = 0;
} finally {
loadingHistory.value = false;
}
};
const loadHistoryReports = async () => {
loadingHistory.value = true;
try {
const res = await getTaskReports(taskNum, reportsPage.value, PAGE_SIZE, historyKeyword.value || undefined);
const data = res?.data;
historyReports.value = data?.records || [];
reportsTotal.value = data?.total || 0;
} catch {
historyReports.value = [];
reportsTotal.value = 0;
} finally {
loadingHistory.value = false;
}
};
const searchHistory = () => {
if (historyDebounce) clearTimeout(historyDebounce);
historyDebounce = setTimeout(() => {
fragmentsPage.value = 1;
reportsPage.value = 1;
if (historyTab.value === "fragments") loadHistoryFragments();
else loadHistoryReports();
}, 300);
};
const onHistoryTabChange = () => {
fragmentsPage.value = 1;
reportsPage.value = 1;
if (historyTab.value === "fragments") loadHistoryFragments();
else loadHistoryReports();
};
const onFragmentsPageChange = (p: number) => {
fragmentsPage.value = p;
loadHistoryFragments();
};
const onReportsPageChange = (p: number) => {
reportsPage.value = p;
loadHistoryReports();
};
return {
PAGE_SIZE,
showHistory,
historyTab,
historyKeyword,
loadingHistory,
historyFragments,
fragmentsTotal,
fragmentsPage,
historyReports,
reportsTotal,
reportsPage,
searchHistory,
onHistoryTabChange,
onFragmentsPageChange,
onReportsPageChange,
};
}