| | |
| | | import { useDark } from '@vueuse/core'; |
| | | import { useTheme } from '/#/theme'; |
| | | import { useCool } from '/@/cool'; |
| | | import { emptyScreen, type ScreenData, type TimeRange } from '../data/screen'; |
| | | import { |
| | | groupDemoFields, |
| | | isDemoField, |
| | | isDemoSection |
| | | } from '../data/screen-field-meta'; |
| | | import { |
| | | initialScreenData, |
| | | resolveScreenData, |
| | | type ScreenDataMode |
| | | } from '../data/screen-merge'; |
| | | import type { ScreenData, TimeRange } from '../data/screen'; |
| | | |
| | | const sharedTimeRange = ref<TimeRange>('month'); |
| | | const screenData = ref<ScreenData>(emptyScreen()); |
| | | const initial = initialScreenData(sharedTimeRange.value); |
| | | const screenData = ref<ScreenData>(initial.data); |
| | | const dataMode = ref<ScreenDataMode>(initial.mode); |
| | | const demoFields = ref<string[]>(initial.demoFields); |
| | | const liveFields = ref<string[]>(initial.liveFields); |
| | | const loading = ref(false); |
| | | const loadError = ref(''); |
| | | |
| | |
| | | return { |
| | | timeRange: sharedTimeRange, |
| | | data: screenData, |
| | | dataMode, |
| | | demoFields, |
| | | liveFields, |
| | | loading, |
| | | loadError, |
| | | reload: () => loadImpl() |
| | |
| | | |
| | | let inited = false; |
| | | let loadImpl: () => Promise<void> = async () => {}; |
| | | |
| | | function applyResolved(resolved: ReturnType<typeof resolveScreenData>) { |
| | | screenData.value = resolved.data; |
| | | dataMode.value = resolved.mode; |
| | | demoFields.value = resolved.demoFields; |
| | | liveFields.value = resolved.liveFields; |
| | | } |
| | | |
| | | export function useScreenLoader() { |
| | | const { service } = useCool(); |
| | |
| | | method: 'POST', |
| | | data: payload |
| | | }); |
| | | const fallback = emptyScreen(sharedTimeRange.value); |
| | | screenData.value = { |
| | | ...fallback, |
| | | ...(res || {}), |
| | | kpis: { ...fallback.kpis, ...(res?.kpis || {}) }, |
| | | trend: { ...fallback.trend, ...(res?.trend || {}) }, |
| | | pointFlow: { ...fallback.pointFlow, ...(res?.pointFlow || {}) }, |
| | | ordersByType: { ...fallback.ordersByType, ...(res?.ordersByType || {}) } |
| | | }; |
| | | applyResolved(resolveScreenData(res, sharedTimeRange.value)); |
| | | } catch (e: any) { |
| | | screenData.value = emptyScreen(sharedTimeRange.value); |
| | | applyResolved(resolveScreenData(null, sharedTimeRange.value)); |
| | | loadError.value = e?.message || '驾驶舱接口调用失败'; |
| | | } finally { |
| | | loading.value = false; |
| | |
| | | |
| | | load(); |
| | | |
| | | return { load, loading, loadError }; |
| | | return { load, loading, loadError, dataMode }; |
| | | } |
| | | |
| | | /** 判断区块/字段是否为演示数据(mixed 模式下按字段级判定) */ |
| | | export function useScreenFieldSource() { |
| | | const { dataMode, demoFields } = useScreenData(); |
| | | |
| | | const demoSections = computed(() => groupDemoFields(demoFields.value)); |
| | | |
| | | function demoSection(section: string) { |
| | | return isDemoSection(section, demoFields.value, dataMode.value); |
| | | } |
| | | |
| | | function demoField(field: string) { |
| | | return isDemoField(field, demoFields.value, dataMode.value); |
| | | } |
| | | |
| | | return { |
| | | dataMode, |
| | | demoSections, |
| | | isDemoSection: demoSection, |
| | | isDemoField: demoField |
| | | }; |
| | | } |
| | | |
| | | export function useChartTheme() { |