Files
xh-medical-sign-web/clinical-web/src/stores/app.ts
T
yelan fc22d22f85 feat(config): 按业务模块拆分 Mock 开关
用 VITE_MOCK_* 系列环境变量替换全局 VITE_USE_MOCK,各模块独立控制演示数据
启用,并新增 src/utils/mock-flags.ts 统一解析缺省值。文档库关闭演示库时
如实提示接口待接入,避免静默沿用本地数据或覆盖已保存内容。
2026-09-15 09:47:31 +08:00

102 lines
2.9 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: '本部院区', 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 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,
}
})