import { computed, ref } from 'vue' import { defineStore } from 'pinia' import { getCampuses } from '@/api/management/organization' import { mockFlags } from '@/utils/mock-flags' import type { CampusRecord } from '@/api/management/types' import type { WorkbenchCampus } from '@/api/workbench/types' // 演示院区跟随组织数据开关:开着会把 mock 的 campusId 一并发给真实接口。 const useMockData = mockFlags.organization const mockCampusRecords: CampusRecord[] = [ { id: 'mock-campus-main', code: 'MAIN', name: '本部院区', institutionName: '新华院区', status: 'ENABLED', sortNo: 1, }, { id: 'mock-campus-east', code: 'EAST', name: '东院区', institutionName: '新华院区', status: 'ENABLED', sortNo: 2, }, { id: 'mock-campus-west', code: 'WEST', name: '西院区', institutionName: '新华院区', status: 'ENABLED', sortNo: 3, }, ] function getEnabledCampuses(records: CampusRecord[]) { return [...records] .filter((campus) => campus.status !== 'DISABLED') .sort( (left, right) => left.sortNo - right.sortNo || left.name.localeCompare(right.name, 'zh-CN'), ) } export const useAppStore = defineStore('app', () => { const campusRecords = ref( useMockData ? getEnabledCampuses(mockCampusRecords) : [], ) const selectedCampusId = ref(useMockData ? (campusRecords.value[0]?.id ?? '') : '') const campusLoading = ref(false) const campusLoaded = ref(useMockData) const campusLoadFailed = ref(false) let campusRequest: Promise | null = null const campuses = computed(() => campusRecords.value.map((campus) => campus.name), ) const selectedCampus = computed( () => campusRecords.value.find((campus) => campus.id === selectedCampusId.value)?.name ?? '', ) function selectCampus(id: string) { if (campusRecords.value.some((campus) => campus.id === id)) { selectedCampusId.value = id } } function ensureSelectedCampus() { if (!campusRecords.value.some((campus) => campus.id === selectedCampusId.value)) { selectedCampusId.value = campusRecords.value[0]?.id ?? '' } } async function loadCampuses(force = false): Promise { if (useMockData) { return } if (!force && campusLoaded.value) { return } if (campusRequest) { return campusRequest } campusLoading.value = true campusLoadFailed.value = false const request = getCampuses() .then((records) => { campusRecords.value = getEnabledCampuses(records) ensureSelectedCampus() campusLoaded.value = true }) .catch(() => { campusLoadFailed.value = true }) .finally(() => { campusLoading.value = false campusRequest = null }) campusRequest = request return request } return { campuses, campusRecords, selectedCampusId, selectedCampus, campusLoading, campusLoaded, campusLoadFailed, loadCampuses, selectCampus, } })