fix: 机柜图形化

This commit is contained in:
zxr
2026-08-20 18:06:05 +08:00
parent 43ce3433ce
commit 695755546f
26 changed files with 2163 additions and 495 deletions

View File

@@ -42,13 +42,6 @@ export interface AssetListParams {
page_size?: number
keyword?: string
status?: string
category_id?: number
supplier_id?: number
datacenter_id?: number
floor_id?: number
room_id?: number
rack_id?: number
department?: string
sort?: string
order?: string
}
@@ -66,7 +59,7 @@ export interface AssetForm {
purchase_date?: string
original_value?: number
supplier_id?: number
warranty_period?: string
warranty_period?: number
warranty_expiry?: string
department?: string
user?: string
@@ -75,9 +68,6 @@ export interface AssetForm {
datacenter_id?: number
floor_id?: number
room_id?: number
rack_id?: number
unit_start?: number
unit_end?: number
qr_code?: string
rfid_tag?: string
asset_tag?: string
@@ -138,21 +128,6 @@ export const fetchSupplierOptions = () => {
return request.get('/Assets/v1/supplier/all')
}
/** 获取数据中心列表(下拉) */
export const fetchDatacenterOptions = () => {
return request.get('/Assets/v1/datacenter/list')
}
/** 根据数据中心获取楼层列表 */
export const fetchFloorOptions = (datacenterId: number) => {
return request.get(`/Assets/v1/datacenter/${datacenterId}`)
}
/** 获取机柜列表(下拉) */
export const fetchRackOptions = (params?: { datacenter_id?: number; floor_id?: number }) => {
return request.post('/Assets/v1/rack/list', params || {})
}
/** 绑定资产和监控资源 */
export const linkAssetResource = (data: {
asset_id: number

View File

@@ -3,6 +3,7 @@ import { request } from '@/api/request'
export interface Floor {
id?: number
name?: string
code?: string
datacenter_id?: number
floor_number?: number
status?: string
@@ -54,7 +55,6 @@ export const deleteFloor = (id: number) => {
}
/** 获取数据中心列表(用于下拉选择) */
export const fetchDatacenterList = (params?: { keyword?: string; name?: string }) => {
const normalizedParams = params?.keyword ? { ...params, name: params.name ?? params.keyword } : params
return request.get('/Assets/v1/datacenter/all', { params: normalizedParams })
export const fetchDatacenterList = (params?: { keyword?: string }) => {
return request.get('/Assets/v1/datacenter/all', { params })
}

View File

@@ -21,9 +21,14 @@ export const fetchRackListByDatacenter = (datacenterId: number, params?: { name?
return request.get(`/Assets/v1/rack/datacenter/${datacenterId}`, { params })
}
/** 根据楼层获取机柜列表(下拉,不分页)- 已废弃,请使用 fetchRackListByRoom */
export const fetchRackListByFloor = (floorId: number, params?: { name?: string }) => {
return request.get(`/Assets/v1/rack/floor/${floorId}`, { params })
/** 根据楼层获取机柜列表 */
export const fetchRackListByFloor = (floorId: number, params?: { keyword?: string }) => {
return fetchRackList({
page: 1,
page_size: 100,
floor_id: floorId,
keyword: params?.keyword,
})
}
/** 根据机房获取机柜列表(下拉,不分页) */
@@ -62,13 +67,6 @@ export const fetchSupplierList = () => {
}
/** 获取数据中心列表(用于下拉选择) */
export const fetchDatacenterList = (params?: { keyword?: string; name?: string }) => {
const normalizedParams = params?.keyword ? { ...params, name: params.name ?? params.keyword } : params
return request.get('/Assets/v1/datacenter/all', { params: normalizedParams })
}
/** 获取楼层列表(用于下拉选择) */
export const fetchFloorListForSelect = (params?: { datacenter_id?: number; keyword?: string; name?: string }) => {
const normalizedParams = params?.keyword ? { ...params, name: params.name ?? params.keyword } : params
return request.get('/Assets/v1/floor/all', { params: normalizedParams })
export const fetchDatacenterList = (params?: { keyword?: string }) => {
return request.get('/Assets/v1/datacenter/all', { params })
}

View File

@@ -11,7 +11,8 @@ export interface RoomItem {
description?: string
floor_id: number
datacenter_id: number
status?: string
layout_version: number
status: string
has3D: boolean
floor?: { id: number; name: string }
datacenter?: { id: number; name: string }
@@ -26,6 +27,13 @@ export interface RoomListResponse {
}
}
/** 机房详情响应 */
export interface RoomDetailResponse {
code: number
message?: string
details: RoomItem
}
/** 机房列表查询参数 */
export interface RoomListParams {
page?: number
@@ -54,6 +62,12 @@ export interface RoomOptionItem {
sort: number
}
export interface ApiResponse<T> {
code: number
message?: string
details: T
}
/** 机房创建数据 */
export interface RoomCreateData {
name: string
@@ -61,8 +75,7 @@ export interface RoomCreateData {
description?: string
floor_id: number
datacenter_id: number
status?: string
has3D: boolean
status: string
}
/** 机房更新数据 */
@@ -74,7 +87,6 @@ export interface RoomUpdateData {
floor_id?: number
datacenter_id?: number
status?: string
has3D?: boolean
}
/** 获取机房列表(分页) */
@@ -84,17 +96,17 @@ export const fetchRoomList = (data?: RoomListParams) => {
/** 获取机房详情 */
export const fetchRoomDetail = (id: number) => {
return request.get<RoomItem>(`/Assets/v1/room/detail/${id}`)
return request.get<RoomDetailResponse>(`/Assets/v1/room/detail/${id}`)
}
/** 获取机房列表(下拉,不分页) */
export const fetchRoomOptions = (params?: RoomOptionsParams) => {
return request.get<RoomOptionItem[]>('/Assets/v1/room/all', { params })
return request.get<ApiResponse<RoomOptionItem[]>>('/Assets/v1/room/all', { params })
}
/** 根据楼层获取机房列表(下拉,不分页) */
export const fetchRoomListByFloor = (floorId: number, params?: { name?: string }) => {
return request.get<RoomItem[]>(`/Assets/v1/room/floor/${floorId}`, { params })
return request.get<ApiResponse<RoomItem[]>>(`/Assets/v1/room/floor/${floorId}`, { params })
}
/** 创建机房 */

View File

@@ -1,31 +1,100 @@
import { request } from '@/api/request'
/** U 位状态 */
export type RackUnitStatus = 'available' | 'occupied' | 'reserved' | 'disabled'
/** U 位关联资产摘要 */
export interface RackUnitAssetSummary {
unit_start: number
}
/** U 位公共字段 */
export interface RackUnitBase {
unit_number: number
occupied_units: number
description?: string
}
/** 可用 U 位 */
export interface AvailableRackUnit extends RackUnitBase {
status: 'available'
}
/** 已占用 U 位 */
export interface OccupiedRackUnit extends RackUnitBase {
status: 'occupied'
asset_id: number
asset_name: string
asset_code: string
asset_type: string
power_consumption: number
asset: RackUnitAssetSummary
}
/** 已预留 U 位 */
export interface ReservedRackUnit extends RackUnitBase {
status: 'reserved'
reserved_for: string
reserved_until: string
}
/** 已禁用 U 位 */
export interface DisabledRackUnit extends RackUnitBase {
status: 'disabled'
}
/** 单个 U 位数据 */
export type RackUnitItem = AvailableRackUnit | OccupiedRackUnit | ReservedRackUnit | DisabledRackUnit
/** U 位页面使用的机柜摘要 */
export interface RackUnitRackInfo {
id?: number
room_id: number
height: number
status?: string
used_power?: number
}
/** 获取机柜 U 位状态响应 */
export interface RackUnitListResponse {
code: number
message?: string
details: {
rack: RackUnitRackInfo
units: RackUnitItem[]
}
}
/** 获取机柜U位状态 */
export const fetchRackUnits = (rackId: number) => {
return request.get(`/Assets/v1/unit/rack/${rackId}`)
return request.get<RackUnitListResponse>(`/Assets/v1/unit/rack/${rackId}`)
}
/** 获取U位列表(别名) */
export const fetchUnitList = fetchRackUnits
/** 分配U位 */
export const allocateUnit = (data: {
/** 机柜设备上架数据 */
export interface RackPlacementData {
expected_version: number
rack_id: number
start_unit: number
occupied_units: number
asset_id?: number
asset_code?: string
asset_name: string
asset_type: string
power_consumption?: number
description?: string
}) => {
return request.post('/Assets/v1/unit/allocate', data)
power_consumption: number
}
/** 释放U位 */
export const releaseUnit = (data: { rack_id: number; start_unit: number; end_unit: number }) => {
return request.post('/Assets/v1/unit/release', data)
/** 将资产上架到机柜U位 */
export const placeAssetInRack = (roomId: number, assetId: number, data: RackPlacementData) => {
return request.put(`/Assets/v1/three-d/rooms/${roomId}/devices/${assetId}/placement`, {
...data,
placement_type: 'rack',
})
}
/** 取消资产在机房中的放置 */
export const unplaceAsset = (roomId: number, assetId: number, expectedVersion: number) => {
return request.delete(`/Assets/v1/three-d/rooms/${roomId}/devices/${assetId}/placement`, {
data: { expected_version: expectedVersion },
})
}
/** 预留U位 */