Merge branch 'main' of https://git.apinb.com/ops/front
This commit is contained in:
370
src/api/ops/three-machine-room.ts
Normal file
370
src/api/ops/three-machine-room.ts
Normal 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)
|
||||
}
|
||||
Reference in New Issue
Block a user