This commit is contained in:
zxr
2026-08-24 22:06:19 +08:00
71 changed files with 2970812 additions and 71 deletions

View File

@@ -0,0 +1,370 @@
import { request } from '@/api/request'
/** 3D 机房接口标准响应。 */
interface ThreeMachineRoomResponse<T> {
code: number
message?: string
details: T
}
/** 告警级别。 */
export interface ThreeMachineRoomSeverity {
id?: number
name?: string
code?: string
color?: string
priority?: number
}
/** 三维坐标和旋转。 */
export interface ThreeMachineRoomTransform {
position_x: number
position_y: number
position_z: number
rotation_x?: number
rotation_y?: number
rotation_z?: number
}
/** 独立设备三维尺寸。 */
export interface ThreeMachineRoomSize {
width: number
height: number
depth: number
}
/** 设备绑定的监控资源。 */
export interface ThreeMachineRoomBinding {
resource_uid: string
resource_category?: string
service_identity?: string
display_name?: string
business_system_id?: number | null
}
/** 监控指标。 */
export interface ThreeMachineRoomMetric {
name: string
value?: string | number | null
unit?: string
type?: string
timestamp?: string
}
/** 设备资源运行数据。 */
export interface ThreeMachineRoomResource extends ThreeMachineRoomBinding {
status?: string
metrics_at?: string
metrics?: ThreeMachineRoomMetric[]
}
/** 活动告警。 */
export interface ThreeMachineRoomAlert {
id?: number
alert_name?: string
summary?: string
severity?: ThreeMachineRoomSeverity
status?: string
starts_at?: string
last_seen_at?: string
updated_at?: string
}
/** 按监控资源分组的活动告警。 */
export interface ThreeMachineRoomAlertGroup {
resource_uid: string
active_count?: number
highest_severity?: ThreeMachineRoomSeverity
alerts?: ThreeMachineRoomAlert[]
}
/** 机柜 U 位。 */
export interface ThreeMachineRoomUnit {
id?: number
unit_number: number
status: 'available' | 'occupied' | 'reserved' | 'disabled'
asset_id?: number | null
}
/** 机柜中的资产设备。 */
export interface ThreeMachineRoomDevice {
asset_id: number
asset_code?: string
asset_name?: string
category_id?: number | null
category_code?: string
category_name?: string
placement_type?: 'rack' | 'room' | 'unplaced'
rack_id?: number | null
unit_start?: number | null
unit_end?: number | null
occupied_units?: number
power_consumption?: number
transform?: ThreeMachineRoomTransform
size?: ThreeMachineRoomSize
bindings?: ThreeMachineRoomBinding[]
}
/** 3D 场景机柜。 */
export interface ThreeMachineRoomRack {
id: number
code?: string
name?: string
row?: number
column?: number
height?: number
width_mm?: number
depth_mm?: number
status?: string
transform?: ThreeMachineRoomTransform
utilization_rate?: number
units?: ThreeMachineRoomUnit[]
devices?: ThreeMachineRoomDevice[]
}
/** 3D 机房场景数据。 */
export interface ThreeMachineRoomScene {
room: {
id: number
datacenter_id?: number
floor_id?: number
name?: string
code?: string
scene_length?: number
scene_width?: number
scene_height?: number
layout_version?: number
[key: string]: unknown
}
racks: ThreeMachineRoomRack[]
room_devices?: ThreeMachineRoomDevice[]
summary?: {
rack_count?: number
unit_count?: number
rack_device_count?: number
room_device_count?: number
device_count?: number
}
[key: string]: unknown
}
/** 设备状态信号。 */
export interface ThreeMachineRoomSignal {
asset_id: number
status?: 'normal' | 'warning' | 'abnormal' | string
active_alert_count?: number
highest_alert_severity?: ThreeMachineRoomSeverity
resources?: ThreeMachineRoomResource[]
alerts?: ThreeMachineRoomAlertGroup[]
[key: string]: unknown
}
/** 机房状态信号集合。 */
export interface ThreeMachineRoomSignals {
signals: ThreeMachineRoomSignal[]
[key: string]: unknown
}
/** 设备可观测数据。 */
export interface ThreeMachineRoomObservability {
device?: ThreeMachineRoomDevice
resources?: ThreeMachineRoomResource[]
alerts?: ThreeMachineRoomAlertGroup[]
[key: string]: unknown
}
/** 3D 场景全量导出数据。 */
export interface ThreeMachineRoomExport {
datacenters: Array<{
id: number
name?: string
code?: string
status?: string
latitude?: string
longitude?: string
rooms?: ThreeMachineRoomScene[]
}>
summary?: {
datacenter_count?: number
room_count?: number
rack_count?: number
unit_count?: number
device_count?: number
}
}
/** 机柜布局保存项。 */
export interface ThreeMachineRoomRackLayout {
rack_id: number
row?: number
column?: number
position_x: number
position_y: number
position_z: number
rotation_y: number
}
/** 机房 3D 初始化配置。 */
export interface ThreeMachineRoomConfigData {
expectedVersion: number
sceneLength: number
sceneWidth: number
sceneHeight: number
racks: ThreeMachineRoomRackLayout[]
}
/** 独立设备放置参数。 */
export interface RoomDevicePlacement {
expectedVersion: number
positionX: number
positionY: number
positionZ: number
rotationX: number
rotationY: number
rotationZ: number
sceneWidth: number
sceneHeight: number
sceneDepth: number
}
/** 设备机柜上架参数。 */
export interface RackDevicePlacement {
expectedVersion: number
rackId: number
startUnit: number
occupiedUnits: number
powerConsumption?: number
}
/** 校验响应并返回 3D 机房业务数据。 */
function getResponseDetails<T>(response: ThreeMachineRoomResponse<T>): T {
if (!response || typeof response !== 'object') {
throw new Error('接口返回格式错误')
}
if (response.code !== 0) {
throw new Error(response.message || '接口调用失败')
}
return response.details
}
/** 获取指定机房的 3D 场景。 */
export async function fetchThreeMachineRoomScene(roomId: number): Promise<ThreeMachineRoomScene> {
const response = await request.get<ThreeMachineRoomResponse<ThreeMachineRoomScene>>(
`/Assets/v1/three-d/rooms/${encodeURIComponent(roomId)}/scene`
)
return getResponseDetails(response)
}
/** 获取权限范围内的全部 3D 场景。 */
export async function exportThreeMachineRoomScenes(): Promise<ThreeMachineRoomExport> {
const response = await request.get<ThreeMachineRoomResponse<ThreeMachineRoomExport>>('/Assets/v1/three-d/export')
return getResponseDetails(response)
}
/** 保存机房尺寸和初始机柜布局。 */
export async function saveThreeMachineRoomConfig(
roomId: number,
config: ThreeMachineRoomConfigData
): Promise<{ room_id: number; layout_version: number }> {
const response = await request.put<ThreeMachineRoomResponse<{ room_id: number; layout_version: number }>>(
`/Assets/v1/three-d/rooms/${encodeURIComponent(roomId)}/config`,
{
expected_version: config.expectedVersion,
scene_length: config.sceneLength,
scene_width: config.sceneWidth,
scene_height: config.sceneHeight,
racks: config.racks,
}
)
return getResponseDetails(response)
}
/** 批量保存机柜布局。 */
export async function saveThreeMachineRoomRackLayout(
roomId: number,
expectedVersion: number,
racks: ThreeMachineRoomRackLayout[]
): Promise<{ room_id: number; layout_version: number }> {
const response = await request.put<ThreeMachineRoomResponse<{ room_id: number; layout_version: number }>>(
`/Assets/v1/three-d/rooms/${encodeURIComponent(roomId)}/layout`,
{
expected_version: expectedVersion,
racks,
}
)
return getResponseDetails(response)
}
/** 获取指定机房的设备状态与告警。 */
export async function fetchThreeMachineRoomSignals(roomId: number): Promise<ThreeMachineRoomSignals> {
const response = await request.get<ThreeMachineRoomResponse<ThreeMachineRoomSignals>>(
`/Assets/v1/three-d/rooms/${encodeURIComponent(roomId)}/signals`
)
return getResponseDetails(response)
}
/** 获取设备可观测指标与告警详情。 */
export async function fetchThreeMachineRoomDeviceObservability(assetId: number): Promise<ThreeMachineRoomObservability> {
const response = await request.get<ThreeMachineRoomResponse<ThreeMachineRoomObservability>>(
`/Assets/v1/three-d/devices/${encodeURIComponent(assetId)}/observability`
)
return getResponseDetails(response)
}
/** 保存设备机柜及 U 位。 */
export async function saveThreeMachineRoomRackPlacement(
roomId: number,
assetId: number,
placement: RackDevicePlacement
): Promise<{ layout_version: number }> {
const response = await request.put<ThreeMachineRoomResponse<{ layout_version: number }>>(
`/Assets/v1/three-d/rooms/${encodeURIComponent(roomId)}/devices/${encodeURIComponent(assetId)}/placement`,
{
expected_version: placement.expectedVersion,
placement_type: 'rack',
rack_id: placement.rackId,
start_unit: placement.startUnit,
occupied_units: placement.occupiedUnits,
power_consumption: placement.powerConsumption || 0,
}
)
return getResponseDetails(response)
}
/** 将设备放置在机房场景中。 */
export async function saveThreeMachineRoomDevicePlacement(
roomId: number,
assetId: number,
placement: RoomDevicePlacement
): Promise<{ room_id: number; asset_id: number; placement_type: 'room'; layout_version: number }> {
const response = await request.put<
ThreeMachineRoomResponse<{ room_id: number; asset_id: number; placement_type: 'room'; layout_version: number }>
>(`/Assets/v1/three-d/rooms/${encodeURIComponent(roomId)}/devices/${encodeURIComponent(assetId)}/placement`, {
expected_version: placement.expectedVersion,
placement_type: 'room',
position_x: placement.positionX,
position_y: placement.positionY,
position_z: placement.positionZ,
rotation_x: placement.rotationX,
rotation_y: placement.rotationY,
rotation_z: placement.rotationZ,
scene_width: placement.sceneWidth,
scene_height: placement.sceneHeight,
scene_depth: placement.sceneDepth,
})
return getResponseDetails(response)
}
/** 解除设备在机柜或机房中的位置。 */
export async function removeThreeMachineRoomDevicePlacement(
roomId: number,
assetId: number,
expectedVersion: number
): Promise<{ room_id: number; asset_id: number; placement_type: 'unplaced'; layout_version: number }> {
const response = await request.delete<
ThreeMachineRoomResponse<{ room_id: number; asset_id: number; placement_type: 'unplaced'; layout_version: number }>
>(`/Assets/v1/three-d/rooms/${encodeURIComponent(roomId)}/devices/${encodeURIComponent(assetId)}/placement`, {
data: { expected_version: expectedVersion },
})
return getResponseDetails(response)
}