import { defineStore } from 'pinia' import { ref } from 'vue' import { applicationApi } from '../api/application' import { useOrganizationStore } from './organization' import { captureOrganizationContext, isCurrentOrganizationContext, shouldDiscardResponse } from '../utils/organizationContext' export const useApplicationStore = defineStore('application', () => { const myApplications = ref([]) const loading = ref(false) const myPage = ref({ currentPage: 1, pageSize: 20, total: 0, totalPages: 0 }) // 列表当前生效的筛选条件。取消申请后会在原地重新拉取列表,那次拉取必须沿用 // 用户选中的状态,否则列表会悄悄退回全量,而下拉框里还显示着选中的筛选值。 const filters = ref({ status: '' }) async function fetchMyApplications(status = '', pageNum = 1) { filters.value = { status } // 捕获发起时的公司上下文快照:响应回来时用它判断是否已被切换作废。 const snapshot = captureOrganizationContext() loading.value = true try { const res = await applicationApi.getMy(status, pageNum, myPage.value.pageSize) if (!isCurrentOrganizationContext(snapshot)) return myApplications.value = res.data?.items || res.data || [] myPage.value.total = res.data?.total || myApplications.value.length myPage.value.currentPage = pageNum myPage.value.totalPages = Math.ceil(myPage.value.total / myPage.value.pageSize) || 1 } catch (error) { if (shouldDiscardResponse(error)) return throw error } finally { if (isCurrentOrganizationContext(snapshot)) loading.value = false } } async function createApplication(data) { const organization = useOrganizationStore() organization.beginSaving() try { const res = await applicationApi.create(data) // 这处刻意清空筛选并回到第 1 页,和上面「沿用筛选」的规矩相反:刚提交的是 // 待审批单,若沿用「已通过」之类的筛选就看不见它,用户会以为没提交成功。 // 清空的是 store 这份状态,页面那份(下拉框)由 Application.vue 同步重置。 await fetchMyApplications('', 1) return res } finally { organization.endSaving() } } async function cancelApplication(id) { const organization = useOrganizationStore() organization.beginSaving() try { const res = await applicationApi.cancel(id) await fetchMyApplications(filters.value.status, myPage.value.currentPage) return res } finally { organization.endSaving() } } // 公司范围变更时清空共享缓存:我的申请、筛选、分页与加载态。 function resetForOrganization() { myApplications.value = [] loading.value = false myPage.value = { currentPage: 1, pageSize: 20, total: 0, totalPages: 0 } filters.value = { status: '' } } useOrganizationStore().registerOrganizationReset(resetForOrganization) return { myApplications, loading, myPage, fetchMyApplications, createApplication, cancelApplication, resetForOrganization } })