achievement.ts 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. import { defineStore } from 'pinia';
  2. import { ref } from 'vue';
  3. import { useAchievementApi } from '@/api/achievement/index';
  4. import to from 'await-to-js';
  5. const achievementApi = useAchievementApi();
  6. export const useAchievementStore = defineStore('achievement', () => {
  7. // ==================== State ====================
  8. // 改回打平的 ref 列表,方便 storeToRefs 和响应式处理
  9. const patentList = ref<any[]>([]);
  10. const softwareList = ref<any[]>([]);
  11. const otherList = ref<any[]>([]);
  12. const standardList = ref<any[]>([]);
  13. const decisionList = ref<any[]>([]);
  14. const workList = ref<any[]>([]);
  15. const awardsList = ref<any[]>([]);
  16. const paperList = ref<any[]>([]);
  17. const conferenceList = ref<any[]>([]);
  18. const specialActivityList = ref<any[]>([]);
  19. // 分页打平
  20. const patentPagination = ref({ pageNum: 1, pageSize: 15, total: 0 });
  21. const softwarePagination = ref({ pageNum: 1, pageSize: 15, total: 0 });
  22. const otherPagination = ref({ pageNum: 1, pageSize: 15, total: 0 });
  23. const standardPagination = ref({ pageNum: 1, pageSize: 15, total: 0 });
  24. const decisionPagination = ref({ pageNum: 1, pageSize: 15, total: 0 });
  25. const workPagination = ref({ pageNum: 1, pageSize: 15, total: 0 });
  26. const awardsPagination = ref({ pageNum: 1, pageSize: 15, total: 0 });
  27. const paperPagination = ref({ pageNum: 1, pageSize: 15, total: 0 });
  28. const conferencePagination = ref({ pageNum: 1, pageSize: 15, total: 0 });
  29. const specialActivityPagination = ref({ pageNum: 1, pageSize: 15, total: 0 });
  30. // 加载状态打平
  31. const patentLoading = ref(false);
  32. const softwareLoading = ref(false);
  33. const otherLoading = ref(false);
  34. const standardLoading = ref(false);
  35. const decisionLoading = ref(false);
  36. const workLoading = ref(false);
  37. const awardsLoading = ref(false);
  38. const paperLoading = ref(false);
  39. const conferenceLoading = ref(false);
  40. const specialActivityLoading = ref(false);
  41. // 内部映射,用于通用 action
  42. const storeMap: any = {
  43. patent: { list: patentList, pagination: patentPagination, loading: patentLoading },
  44. software: { list: softwareList, pagination: softwarePagination, loading: softwareLoading },
  45. other: { list: otherList, pagination: otherPagination, loading: otherLoading },
  46. standard: { list: standardList, pagination: standardPagination, loading: standardLoading },
  47. decision: { list: decisionList, pagination: decisionPagination, loading: decisionLoading },
  48. work: { list: workList, pagination: workPagination, loading: workLoading },
  49. awards: { list: awardsList, pagination: awardsPagination, loading: awardsLoading },
  50. paper: { list: paperList, pagination: paperPagination, loading: paperLoading },
  51. conference: { list: conferenceList, pagination: conferencePagination, loading: conferenceLoading },
  52. special_activity: { list: specialActivityList, pagination: specialActivityPagination, loading: specialActivityLoading },
  53. };
  54. // ==================== Actions ====================
  55. async function fetchList(type: string, queryParams: any = {}, reset = false) {
  56. const { list, pagination, loading } = storeMap[type];
  57. if (reset) {
  58. pagination.value.pageNum = 1;
  59. list.value = [];
  60. }
  61. loading.value = true;
  62. const params = {
  63. pageNum: pagination.value.pageNum,
  64. pageSize: pagination.value.pageSize,
  65. ...queryParams,
  66. };
  67. let apiMethod;
  68. switch (type) {
  69. case 'patent': apiMethod = achievementApi.getPatentList; break;
  70. case 'software': apiMethod = achievementApi.getSoftwareList; break;
  71. case 'other': apiMethod = achievementApi.getOtherList; break;
  72. case 'standard': apiMethod = achievementApi.getStandardList; break;
  73. case 'decision': apiMethod = achievementApi.getDecisionList; break;
  74. case 'work': apiMethod = achievementApi.getWorkList; break;
  75. case 'awards': apiMethod = achievementApi.getAwardsList; break;
  76. case 'paper': apiMethod = achievementApi.getPaperList; break;
  77. case 'conference': apiMethod = achievementApi.getConferenceList; break;
  78. case 'special_activity': apiMethod = achievementApi.getSpecialActivityList; break;
  79. default: return { success: false, rows: [], total: 0 };
  80. }
  81. const [err, res] = await to(apiMethod(params)) as [any, any];
  82. loading.value = false;
  83. if (err) {
  84. console.error(`fetch ${type} error:`, err);
  85. return { success: false, rows: [], total: 0 };
  86. }
  87. // 根据用户反馈和通用模式,处理各种可能的返回结构
  88. if (res && res.code === 200) {
  89. const rows = res.data?.list || res.data?.rows || res.rows || (Array.isArray(res.data) ? res.data : []);
  90. const total = res.data?.total || res.total || 0;
  91. list.value = reset ? rows : [...list.value, ...rows];
  92. pagination.value.total = total;
  93. return { success: true, rows, total };
  94. }
  95. return { success: false, rows: [], total: 0 };
  96. }
  97. async function loadMore(type: string, queryParams: any = {}) {
  98. const { pagination } = storeMap[type];
  99. pagination.value.pageNum++;
  100. return await fetchList(type, queryParams, false);
  101. }
  102. return {
  103. patentList, softwareList, otherList, standardList, decisionList, workList, awardsList, paperList, conferenceList, specialActivityList,
  104. patentPagination, softwarePagination, otherPagination, standardPagination, decisionPagination, workPagination, awardsPagination, paperPagination, conferencePagination, specialActivityPagination,
  105. patentLoading, softwareLoading, otherLoading, standardLoading, decisionLoading, workLoading, awardsLoading, paperLoading, conferenceLoading, specialActivityLoading,
  106. fetchList,
  107. loadMore,
  108. };
  109. });