wangrong
2026-08-28 17b92e9b60dda6dcc20c748046a5ff3c3958d52e
src/modules/report/hooks/use-screen.ts
@@ -2,10 +2,24 @@
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('');
@@ -21,6 +35,9 @@
   return {
      timeRange: sharedTimeRange,
      data: screenData,
      dataMode,
      demoFields,
      liveFields,
      loading,
      loadError,
      reload: () => loadImpl()
@@ -29,6 +46,13 @@
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();
@@ -46,17 +70,9 @@
                  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;
@@ -72,7 +88,29 @@
   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() {