| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127 |
- 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<any[]>([]);
- const softwareList = ref<any[]>([]);
- const otherList = ref<any[]>([]);
- const standardList = ref<any[]>([]);
- const decisionList = ref<any[]>([]);
- const workList = ref<any[]>([]);
- const awardsList = ref<any[]>([]);
- const paperList = ref<any[]>([]);
- const conferenceList = ref<any[]>([]);
- const specialActivityList = ref<any[]>([]);
- // 分页打平
- 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,
- };
- });
|