feat(workbench): 接入工作台首页概览聚合接口
This commit is contained in:
@@ -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,
|
||||
}
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user