import { defineStore } from 'pinia'; import { ref } from 'vue'; import { useAchievementApi } from '@/api/achievement/index'; import to from 'await-to-js'; const achievementApi = useAchievementApi(); export const useAchievementStore = defineStore('achievement', () => { // ==================== State ==================== // 改回打平的 ref 列表,方便 storeToRefs 和响应式处理 const patentList = ref([]); const softwareList = ref([]); const otherList = ref([]); const standardList = ref([]); const decisionList = ref([]); const workList = ref([]); const awardsList = ref([]); const paperList = ref([]); const conferenceList = ref([]); const specialActivityList = ref([]); // 分页打平 const patentPagination = ref({ pageNum: 1, pageSize: 15, total: 0 }); const softwarePagination = ref({ pageNum: 1, pageSize: 15, total: 0 }); const otherPagination = ref({ pageNum: 1, pageSize: 15, total: 0 }); const standardPagination = ref({ pageNum: 1, pageSize: 15, total: 0 }); const decisionPagination = ref({ pageNum: 1, pageSize: 15, total: 0 }); const workPagination = ref({ pageNum: 1, pageSize: 15, total: 0 }); const awardsPagination = ref({ pageNum: 1, pageSize: 15, total: 0 }); const paperPagination = ref({ pageNum: 1, pageSize: 15, total: 0 }); const conferencePagination = ref({ pageNum: 1, pageSize: 15, total: 0 }); const specialActivityPagination = ref({ pageNum: 1, pageSize: 15, total: 0 }); // 加载状态打平 const patentLoading = ref(false); const softwareLoading = ref(false); const otherLoading = ref(false); const standardLoading = ref(false); const decisionLoading = ref(false); const workLoading = ref(false); const awardsLoading = ref(false); const paperLoading = ref(false); const conferenceLoading = ref(false); const specialActivityLoading = ref(false); // 内部映射,用于通用 action const storeMap: any = { patent: { list: patentList, pagination: patentPagination, loading: patentLoading }, software: { list: softwareList, pagination: softwarePagination, loading: softwareLoading }, other: { list: otherList, pagination: otherPagination, loading: otherLoading }, standard: { list: standardList, pagination: standardPagination, loading: standardLoading }, decision: { list: decisionList, pagination: decisionPagination, loading: decisionLoading }, work: { list: workList, pagination: workPagination, loading: workLoading }, awards: { list: awardsList, pagination: awardsPagination, loading: awardsLoading }, paper: { list: paperList, pagination: paperPagination, loading: paperLoading }, conference: { list: conferenceList, pagination: conferencePagination, loading: conferenceLoading }, special_activity: { list: specialActivityList, pagination: specialActivityPagination, loading: specialActivityLoading }, }; // ==================== Actions ==================== async function fetchList(type: string, queryParams: any = {}, reset = false) { const { list, pagination, loading } = storeMap[type]; if (reset) { pagination.value.pageNum = 1; list.value = []; } loading.value = true; const params = { pageNum: pagination.value.pageNum, pageSize: pagination.value.pageSize, ...queryParams, }; let apiMethod; switch (type) { case 'patent': apiMethod = achievementApi.getPatentList; break; case 'software': apiMethod = achievementApi.getSoftwareList; break; case 'other': apiMethod = achievementApi.getOtherList; break; case 'standard': apiMethod = achievementApi.getStandardList; break; case 'decision': apiMethod = achievementApi.getDecisionList; break; case 'work': apiMethod = achievementApi.getWorkList; break; case 'awards': apiMethod = achievementApi.getAwardsList; break; case 'paper': apiMethod = achievementApi.getPaperList; break; case 'conference': apiMethod = achievementApi.getConferenceList; break; case 'special_activity': apiMethod = achievementApi.getSpecialActivityList; break; default: return { success: false, rows: [], total: 0 }; } const [err, res] = await to(apiMethod(params)) as [any, any]; loading.value = false; if (err) { console.error(`fetch ${type} error:`, err); return { success: false, rows: [], total: 0 }; } // 根据用户反馈和通用模式,处理各种可能的返回结构 if (res && res.code === 200) { const rows = res.data?.list || res.data?.rows || res.rows || (Array.isArray(res.data) ? res.data : []); const total = res.data?.total || res.total || 0; list.value = reset ? rows : [...list.value, ...rows]; pagination.value.total = total; return { success: true, rows, total }; } return { success: false, rows: [], total: 0 }; } async function loadMore(type: string, queryParams: any = {}) { const { pagination } = storeMap[type]; pagination.value.pageNum++; return await fetchList(type, queryParams, false); } return { patentList, softwareList, otherList, standardList, decisionList, workList, awardsList, paperList, conferenceList, specialActivityList, patentPagination, softwarePagination, otherPagination, standardPagination, decisionPagination, workPagination, awardsPagination, paperPagination, conferencePagination, specialActivityPagination, patentLoading, softwareLoading, otherLoading, standardLoading, decisionLoading, workLoading, awardsLoading, paperLoading, conferenceLoading, specialActivityLoading, fetchList, loadMore, }; });