feat(workbench): 接入工作台首页概览聚合接口

This commit is contained in:
yelan
2026-09-02 13:17:40 +08:00
parent e0e98ec74f
commit e52f203123
13 changed files with 398 additions and 358 deletions
+86 -3
View File
@@ -1,16 +1,99 @@
import { ref } from 'vue'
import { computed, ref } from 'vue'
import { defineStore } from 'pinia'
import { getCampuses } from '@/api/management/organization'
import type { CampusRecord } from '@/api/management/types'
import type { WorkbenchCampus } from '@/api/workbench/types'
const useMockData = import.meta.env.VITE_USE_MOCK !== 'false'
const mockCampusRecords: CampusRecord[] = [
{ id: 'mock-campus-main', code: 'MAIN', name: '本部院区', status: 'ENABLED', sortNo: 1 },
{ id: 'mock-campus-east', code: 'EAST', name: '东院区', status: 'ENABLED', sortNo: 2 },
{ id: 'mock-campus-west', code: 'WEST', name: '西院区', 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 environment = ref('接口联调环境')
const campuses = ref<WorkbenchCampus[]>(['本部院区', '东院区', '西院区'])
const selectedCampus = ref<WorkbenchCampus>('本部院区')
const campusRecords = ref<CampusRecord[]>(
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<void> | null = null
const campuses = computed<WorkbenchCampus[]>(() =>
campusRecords.value.map((campus) => campus.name),
)
const selectedCampus = computed<WorkbenchCampus>(
() => 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<void> {
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 {
environment,
campuses,
campusRecords,
selectedCampusId,
selectedCampus,
campusLoading,
campusLoaded,
campusLoadFailed,
loadCampuses,
selectCampus,
}
})