From 17b92e9b60dda6dcc20c748046a5ff3c3958d52e Mon Sep 17 00:00:00 2001
From: wangrong <wangrong@shsening.com>
Date: 星期五, 28 八月 2026 16:19:11 +0800
Subject: [PATCH] 增加首页大屏显示

---
 src/modules/report/hooks/use-screen.ts |   64 +++++++++++++++++++++++++------
 1 files changed, 51 insertions(+), 13 deletions(-)

diff --git a/src/modules/report/hooks/use-screen.ts b/src/modules/report/hooks/use-screen.ts
index 0ea549a..a6621c0 100644
--- a/src/modules/report/hooks/use-screen.ts
+++ b/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 || '椹鹃┒鑸辨帴鍙h皟鐢ㄥけ璐�';
 		} 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() {

--
Gitblit v1.9.1