wangrong
2026-08-30 8954db4cf4969166961c72569dfa24645276b947
src/modules/report/hooks/use-screen.ts
@@ -3,9 +3,7 @@
import { useTheme } from '/#/theme';
import { useCool } from '/@/cool';
import {
   groupDemoFields,
   isDemoField,
   isDemoSection
   groupDemoFields
} from '../data/screen-field-meta';
import {
   initialScreenData,
@@ -22,6 +20,9 @@
const liveFields = ref<string[]>(initial.liveFields);
const loading = ref(false);
const loadError = ref('');
/** 驾驶舱是否处于浏览器全屏;萤石播放器在全屏切换后需 remount 才能恢复画面 */
const screenFullscreen = ref(false);
const playerRemountKey = ref(0);
export function provideScreenTime() {
   return sharedTimeRange;
@@ -29,6 +30,34 @@
export function useScreenTime() {
   return sharedTimeRange;
}
export function useScreenFullscreen() {
   function bumpPlayerRemount(delay = 280) {
      window.setTimeout(() => {
         playerRemountKey.value += 1;
         window.dispatchEvent(
            new CustomEvent('report-screen-fullscreen-change', {
               detail: { remountKey: playerRemountKey.value }
            })
         );
      }, delay);
   }
   function setFullscreen(active: boolean) {
      const changed = screenFullscreen.value !== active;
      screenFullscreen.value = active;
      if (changed) {
         bumpPlayerRemount();
      }
   }
   return {
      isFullscreen: screenFullscreen,
      playerRemountKey,
      bumpPlayerRemount,
      setFullscreen
   };
}
export function useScreenData() {
@@ -73,7 +102,11 @@
         applyResolved(resolveScreenData(res, sharedTimeRange.value));
      } catch (e: any) {
         applyResolved(resolveScreenData(null, sharedTimeRange.value));
         loadError.value = e?.message || '驾驶舱接口调用失败';
         const msg = e?.message || '';
         // 首页静默降级到演示数据,不展示登录/权限类错误文案
         if (!/登录失效|无权限/.test(msg)) {
            loadError.value = msg || '驾驶舱接口调用失败';
         }
      } finally {
         loading.value = false;
      }
@@ -91,18 +124,18 @@
   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 demoSection(_section: string) {
      return false;
   }
   function demoField(field: string) {
      return isDemoField(field, demoFields.value, dataMode.value);
   function demoField(_field: string) {
      return false;
   }
   return {