| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381 |
- import axios from 'axios';
- import * as THREE from 'three';
- import {
- AlarmDeviceData,
- CategoryChartData,
- CategoryChartDataWithPercent,
- OnlineRateChartData,
- StateChartData,
- StateChartDataWithPercent,
- AlarmChartData,
- DeviceWithAssetInfo,
- } from '../share/monitorTypes.ts';
- // API请求参数类型定义
- interface OnlineRateChartParams {
- created_at?: {
- $gte: string;
- $lte: string;
- };
- dimension?: {
- $eq: 'hour' | 'day' | 'month';
- };
- pagination?: {
- page: number;
- pageSize: number;
- };
- }
- interface AlarmChartParams {
- created_at?: {
- $gte: string;
- $lte: string;
- };
- dimension?: {
- $eq: 'hour' | 'day' | 'month';
- };
- }
- interface DeviceInstancesParams {
- is_deleted?: number;
- }
- interface RackQueryParams {
- is_deleted?: number;
- }
- interface RackServerQueryParams {
- rack_id?: number;
- is_deleted?: number;
- }
- interface RackServerTypeParams {
- is_enabled?: number;
- is_deleted?: number;
- page?: number;
- pageSize?: number;
- }
- // 机柜数据
- interface RackData {
- id: number;
- rack_name: string;
- rack_code: string;
- capacity: number;
- position_x: number;
- position_y: number;
- position_z: number;
- area?: string;
- room?: string;
- remark?: string;
- is_disabled: number;
- is_deleted: number;
- created_at: string;
- updated_at: string;
- }
- // 机柜服务器数据
- interface RackServerData {
- id: number;
- rack_id: number;
- asset_id: number;
- start_position: number;
- size: number;
- server_type?: string;
- remark?: string;
- is_disabled: number;
- is_deleted: number;
- created_at: string;
- updated_at: string;
- // 关联字段 asset
- asset_name: string;
- device_category: number;
- ip_address?: string;
- device_status: number;
- network_status: number;
- packet_loss: number;
- cpu?: string;
- memory?: string;
- disk?: string;
- // 关联字段 rack
- rack_name: string;
- rack_code: string;
- }
- // 设备类型图标数据
- interface DeviceIconData {
- id: number;
- category_id: number;
- icon: string;
- icon_name?: string;
- icon_type: string;
- sort: number;
- is_default: number;
- is_disabled: number;
- is_deleted: number;
- created_at: string;
- updated_at: string;
- category?: {
- name: string;
- };
- }
- // 机柜服务器类型数据
- interface RackServerType {
- /** 主键ID */
- id: number;
-
- /** 类型名称 */
- name: string;
-
- /** 类型编码 */
- code: string;
- /** 类型图片 */
- image_url?: string;
-
- /** 类型描述 */
- description?: string;
-
- /** 是否启用 (0否 1是) */
- is_enabled?: number;
-
- /** 是否被删除 (0否 1是) */
- is_deleted?: number;
-
- /** 创建时间 */
- created_at: string;
-
- /** 更新时间 */
- updated_at: string;
- }
- // 服务器基本信息接口
- export interface ServerData {
- id: number;
- slot: number;
- u: number;
- type: number;
- name: string;
- ip: string;
- cpu: string;
- memory: string;
- disk: string;
- deviceStatus: number;
- networkStatus: number;
- packetLoss: number;
- }
- // 设备状态和监控数据接口
- export interface DeviceStatusInfo {
- status: 'online' | 'offline' | 'warning';
- usage: {
- cpu: number;
- memory: number;
- disk: number;
- };
- }
- // 机柜配置接口
- export interface RackConfig {
- position: THREE.Vector3;
- serverCount: number;
- id: number;
- name: string;
- servers: ServerData[];
- }
- // 服务器图标接口
- export interface ServerIconConfig {
- textureUrl: string | null;
- color: number;
- }
- export interface ServerIconConfigs {
- [key: number]: ServerIconConfig;
- }
- const API_BASE_URL = '/api';
- // 从全局配置中获取OSS_HOST,如果不存在则使用默认值
- const OSS_BASE_URL = window.CONFIG?.OSS_BASE_URL || '';
- // 计算风险等级
- const calculateRiskLevel = (onlineRate: number): { level: string; color: string } => {
- if (onlineRate >= 95) {
- return { level: '健康', color: '#52c41a' }; // 绿色
- } else if (onlineRate >= 80) {
- return { level: '风险低', color: '#faad14' }; // 黄色
- } else if (onlineRate >= 70) {
- return { level: '风险中', color: '#faad14' }; // 黄色
- } else {
- return { level: '高风险', color: '#f5222d' }; // 红色
- }
- };
- // 统一将查询函数提取到顶部
- export const queryFns = {
- // 资产分类数据查询
- fetchCategoryData: async (): Promise<CategoryChartDataWithPercent[]> => {
- const res = await axios.get<CategoryChartData[]>(`${API_BASE_URL}/big/zichan_category_chart`);
-
- // 预先计算百分比
- const data = res.data;
- const total = data.reduce((sum: number, item: CategoryChartData) => sum + item['设备数'], 0);
-
- // 为每个数据项添加百分比字段
- return data.map(item => ({
- ...item,
- 百分比: total > 0 ? (item['设备数'] / total * 100).toFixed(1) : '0'
- }));
- },
- // 在线率变化数据查询
- fetchOnlineRateData: async (): Promise<OnlineRateChartData[]> => {
- // 直接使用扁平化参数
- const params = {
- // created_at_gte: dayjs().subtract(7, 'day').format('YYYY-MM-DD HH:mm:ss'),
- // created_at_lte: dayjs().format('YYYY-MM-DD HH:mm:ss'),
- // dimension: 'day',
- // page: 1,
- // pageSize: 1000
- };
-
- const res = await axios.get<OnlineRateChartData[]>(`${API_BASE_URL}/big/zichan_online_rate_chart`, { params });
- return res.data;
- },
- // 资产流转状态数据查询
- fetchStateData: async (): Promise<StateChartDataWithPercent[]> => {
- const res = await axios.get<StateChartData[]>(`${API_BASE_URL}/big/zichan_state_chart`);
-
- // 预先计算百分比
- const data = res.data;
- const total = data.reduce((sum: number, item: StateChartData) => sum + item['设备数'], 0);
-
- // 为每个数据项添加百分比字段
- return data.map(item => ({
- ...item,
- 百分比: total > 0 ? (item['设备数'] / total * 100).toFixed(1) : '0'
- }));
- },
- // 告警数据变化查询
- fetchAlarmData: async (): Promise<AlarmChartData[]> => {
- // 直接使用扁平化参数
- const params = {
- // created_at_gte: dayjs().startOf('day').format('YYYY-MM-DD HH:mm:ss'),
- // created_at_lte: dayjs().endOf('day').format('YYYY-MM-DD HH:mm:ss'),
- // dimension: 'hour'
- };
-
- const res = await axios.get<AlarmChartData[]>(`${API_BASE_URL}/big/zichan_alarm_chart`, { params });
- return res.data;
- },
- // 获取设备数据
- fetchDeviceMetrics: async () => {
- const params = {
- is_deleted: 0
- };
- const response = await axios.get<DeviceWithAssetInfo[]>(`${API_BASE_URL}/big/device-instances`, { params });
- const devices = response.data;
- const totalDevices = devices.length;
- const onlineDevices = devices.filter(device => device.device_status === 1).length;
- const offlineDevices = totalDevices - onlineDevices;
- const onlineRate = totalDevices ? ((onlineDevices / totalDevices) * 100) : 0;
- const riskLevel = calculateRiskLevel(onlineRate);
- return {
- totalDevices,
- onlineDevices,
- offlineDevices,
- onlineRate: onlineRate.toFixed(2),
- riskLevel
- };
- },
- // 获取告警设备数据
- fetchTopAlarmDevices: async (): Promise<AlarmDeviceData[]> => {
- const response = await axios.get<AlarmDeviceData[]>(`${API_BASE_URL}/big/zichan_alarm_device`);
- return response.data;
- },
- // 获取机柜配置数据
- fetchRackConfigs: async (): Promise<RackConfig[]> => {
- const params: RackQueryParams = {
- is_deleted: 0
- }
- // 1. 获取机柜数据
- const rackResponse = await axios.get<RackData[]>(`${API_BASE_URL}/big/rack`, { params });
- const racks = rackResponse.data;
-
- // 2. 获取所有机柜的服务器数据
- const serverPromises = racks.map(async (rack: RackData) => {
- const params: RackServerQueryParams = {
- rack_id: rack.id,
- is_deleted: 0
- }
- const serverResponse = await axios.get<RackServerData[]>(`${API_BASE_URL}/big/rack-server`, { params });
- // 3. 获取每个服务器对应的基本信息
- let servers: ServerData[] = [];
- try {
- servers = serverResponse.data.map((server: RackServerData) => ({
- id: server.id,
- slot: server.start_position,
- u: server.size,
- type: server.device_category,
- name: server.asset_name || '',
- ip: server.ip_address || '',
- cpu: server.cpu || '',
- memory: server.memory || '',
- disk: server.disk || '',
- deviceStatus: server.device_status || 0,
- networkStatus: server.network_status || 0,
- packetLoss: server.packet_loss || 0
- }));
- } catch (error) {
- console.error("error", error);
- }
- // 返回包含服务器数据的机柜配置
- return {
- position: new THREE.Vector3(Number(rack.position_x) || 0, Number(rack.position_y) || 0, Number(rack.position_z) || 0),
- serverCount: rack.capacity || 42,
- id: rack.id,
- name: rack.rack_name,
- servers
- };
- });
- // 等待所有数据获取完成
- return Promise.all(serverPromises);
- },
- // 获取服务器类型图标配置
- fetchDeviceIcons: async (): Promise<ServerIconConfigs> => {
- const params: RackServerTypeParams = {
- is_enabled: 1,
- is_deleted: 0,
- page: 1,
- pageSize: 100
- }
- const response = await axios.get<RackServerType[]>(`${API_BASE_URL}/big/rack/server/type/image`, { params });
- const ossHost = OSS_BASE_URL;
- return response.data.reduce((acc: ServerIconConfigs, type: RackServerType) => {
- acc[type.id] = {
- textureUrl: type.image_url ? `${ossHost}/${type.image_url}` : null,
- color: 0x444444
- };
- return acc;
- }, {});
- }
- }
|