Files
xh-medical-sign-web/clinical-web/src/stores/app.ts
T

121 lines
3.0 KiB
TypeScript

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<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 {
campuses,
campusRecords,
selectedCampusId,
selectedCampus,
campusLoading,
campusLoaded,
campusLoadFailed,
loadCampuses,
selectCampus,
}
})