wr_1023
2026-09-03 974c13543c4534d4783eb521a5ba2af68f8b007b
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
export type TimeRange = 'today' | 'week' | 'month' | 'quarter' | 'year';
export type ScreenKey = 'overview' | 'resource' | 'carbon' | 'participation' | 'operation' | 'map';
export type RankMetric = 'weight' | 'people' | 'pointPerCapita' | 'weightPerCapita' | 'carbon';
 
/** 首页菜单固定为 /report/screen/index,子页通过 ?page= 切换,避免离开首页入口 */
export const SCREEN_HOME_PATH = '/report/screen/index';
 
export const SCREEN_NAV: { key: ScreenKey; index: string; label: string; audience: string }[] = [
    { key: 'overview', index: '01', label: '绿色校园总览', audience: '校领导' },
    { key: 'resource', index: '02', label: '垃圾资源化分析', audience: '后勤 / 环保' },
    { key: 'carbon', index: '03', label: '碳减排与绿色贡献', audience: '双碳 / ESG' },
    { key: 'participation', index: '04', label: '师生参与与碳积分', audience: '学工 / 团委' },
    { key: 'operation', index: '05', label: '回收运营监控', audience: '运营公司' },
    { key: 'map', index: '06', label: '地理信息总览', audience: '指挥中心' }
];
 
/** 从路由解析当前大屏子页;index / 空 / 非法值均回落到 overview */
export function resolveScreenKey(page?: string | string[] | null, queryPage?: string | string[] | null): ScreenKey {
    const raw = String(queryPage || page || 'overview');
    if (raw === 'index') return 'map';    //if (raw === 'index') return 'overview';
    return SCREEN_NAV.some(e => e.key === raw) ? (raw as ScreenKey) : 'map';
    //return SCREEN_NAV.some(e => e.key === raw) ? (raw as ScreenKey) : 'overview';
}
 
export const TIME_RANGE_OPTIONS: { label: string; value: TimeRange }[] = [
    { label: '今日', value: 'today' },
    { label: '本周', value: 'week' },
    { label: '本月', value: 'month' },
    { label: '本季度', value: 'quarter' },
    { label: '本年度', value: 'year' }
];
 
export interface ScreenData {
    range: TimeRange | string;
    axis: string[];
    kpis: Record<string, number>;
    wasteMix: { name: string; code?: string; weight: number; value: number; count: number; color: string }[];
    recycleItems: { name: string; weight: number; value: number; carbon: number; color: string }[];
    trend: { weight: number[]; value: number[]; carbon: number[] };
    yearCarbon: number[];
    deptRank: any[];
    classRank: any[];
    majorRank: any[];
    pointFlow: { issued: number; transfer: number; donate: number; mall: number; balance: number };
    participateTrend: number[];
    deliverTrend: number[];
    ordersByType: { axis: string[]; 现场回收: number[]; 预约上门: number[]; 大屏投递: number[]; 活动回收: number[] };
    appointmentFlow: { name: string; value: number }[];
    sorterStatus: { name: string; value: number; color: string }[];
    vehicles: { no: string; km: number; idle: number; overspeed: number; status: string }[];
    sites: { name: string; weight: number; online: boolean }[];
    unavailable?: string[];
}
 
import { structureScreen } from './screen-structure';
 
/** 零值结构兜底,图表轴与品类名称仍完整 */
export function emptyScreen(range: TimeRange = 'month'): ScreenData {
    return structureScreen(range);
}