This commit is contained in:
zxr
2026-03-27 19:26:10 +08:00
parent 7e46f8b4e1
commit 519759ea58
25 changed files with 1409 additions and 278 deletions

View File

@@ -86,6 +86,11 @@ export const fetchAssetList = (data?: AssetListParams) => {
return request.post("/Assets/v1/asset/list", data || {});
};
/** 获取资产列表(不分页,下拉) */
export const fetchAssetAll = (params?: { keyword?: string }) => {
return request.get("/Assets/v1/asset/all", { params });
};
/** 获取资产详情 */
export const fetchAssetDetail = (id: number) => {
return request.get(`/Assets/v1/asset/detail/${id}`);

View File

@@ -38,14 +38,14 @@ export const deleteDatacenter = (id: number) => {
};
/** 获取省份列表(用于下拉选择) */
export const fetchProvinceList = () => {
return request.get("/Assets/v1/province/all");
};
export const fetchProvinceList = (params?: { keyword?: string }) => {
return request.get('/Assets/v1/province/all', { params })
}
/** 获取城市列表(用于下拉选择) */
export const fetchCityList = () => {
return request.get("/Assets/v1/city/all");
};
export const fetchCityList = (provinceId: number, params?: { keyword?: string }) => {
return request.get(`/Assets/v1/city/province/${provinceId}`, { params })
}
/** 根据城市获取数据中心列表 */
export const fetchDatacenterByCity = (cityId: number) => {

View File

@@ -1,25 +1,91 @@
import { request } from "@/api/request";
import { request } from '@/api/request'
/** 获取 工单列表 */
export const fetchFeedbackTickets = (data?: {
page?: number,
page_size?: number,
size?: number,
keyword?: string,
type?: string,
priority?: string,
status?: string,
creator_id?: number,
assignee_id?: number
}) => {
// 兼容 size 参数,转换为 page_size
const params: any = data ? { ...data } : {};
if (params.size !== undefined && params.page_size === undefined) {
params.page_size = params.size;
delete params.size;
/**
* 后端要求 status 为字符串数组;统一为 string[](单选、逗号分隔写法也转成多项)。
*/
function normalizeTicketListStatusParam(params: Record<string, any>) {
const raw = params.status
if (raw === undefined || raw === null) return
let arr: string[]
if (Array.isArray(raw)) {
arr = raw.map((s) => String(s).trim()).filter(Boolean)
} else {
const s = String(raw).trim()
if (!s) {
delete params.status
return
}
arr = s.includes(',') ? s.split(',').map((x) => x.trim()).filter(Boolean) : [s]
}
return request.get("/Feedback/v1/tickets", params ? { params } : undefined);
};
if (arr.length === 0) delete params.status
else params.status = arr
}
/** GET query`status` 重复键 status=a&status=b与后端 []string 绑定一致) */
function serializeFeedbackTicketListParams(params: Record<string, any>): string {
const usp = new URLSearchParams()
const keys = Object.keys(params).sort()
for (const key of keys) {
const value = params[key]
if (value === undefined || value === null || value === '') continue
if (key === 'status' && Array.isArray(value)) {
for (const item of value) {
const t = String(item).trim()
if (t) usp.append('status', t)
}
continue
}
usp.append(key, String(value))
}
return usp.toString()
}
/** 避免 undefined / null / 空串进入 query部分运行时下发异常键名 */
function stripEmptyQueryValues(params: Record<string, any>) {
Object.keys(params).forEach((k) => {
const v = params[k]
if (v === undefined || v === null || v === '') {
delete params[k]
}
})
}
/** 获取工单列表 GET /Feedback/v1/tickets分页与多条件筛选 */
export const fetchFeedbackTickets = (data?: {
page?: number
page_size?: number
size?: number
/** 单状态、逗号分隔、或 string[](将统一为数组并以重复 query 键序列化) */
status?: string | string[]
type?: string
priority?: string
creator_id?: number
assignee_id?: number
category_id?: number
keyword?: string
/** 格式 YYYY-MM-DD HH:MM:SS */
start_time?: string
/** 格式 YYYY-MM-DD HH:MM:SS */
end_time?: string
}) => {
const params: any = data ? { ...data } : {}
if (params.size !== undefined && params.page_size === undefined) {
params.page_size = params.size
delete params.size
}
normalizeTicketListStatusParam(params)
stripEmptyQueryValues(params)
const config =
Object.keys(params).length > 0
? {
params,
paramsSerializer: {
serialize: (p: Record<string, any>) => serializeFeedbackTicketListParams(p),
},
}
: undefined
return request.get('/Feedback/v1/tickets', config)
}
/** 创建 工单 */
export const createFeedbackTicket = (data: any) => request.post("/Feedback/v1/tickets", data);

View File

@@ -16,6 +16,14 @@ export const fetchFloorDetail = (id: number) => {
return request.get(`/Assets/v1/floor/detail/${id}`);
};
/** 根据数据中心获取楼层列表(下拉,不分页) */
export const fetchFloorListByDatacenter = (
datacenterId: number,
params?: { name?: string }
) => {
return request.get(`/Assets/v1/floor/datacenter/${datacenterId}`, { params });
};
/** 创建楼层 */
export const createFloor = (data: any) => {
return request.post("/Assets/v1/floor/create", data);
@@ -32,6 +40,9 @@ export const deleteFloor = (id: number) => {
};
/** 获取数据中心列表(用于下拉选择) */
export const fetchDatacenterList = () => {
return request.get("/Assets/v1/datacenter/all");
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 });
};

View File

@@ -23,6 +23,14 @@ export const fetchRackListByDatacenter = (
return request.get(`/Assets/v1/rack/datacenter/${datacenterId}`, { params });
};
/** 根据楼层获取机柜列表(下拉,不分页) */
export const fetchRackListByFloor = (
floorId: number,
params?: { name?: string }
) => {
return request.get(`/Assets/v1/rack/floor/${floorId}`, { params });
};
/** 获取机柜详情 */
export const fetchRackDetail = (id: number) => {
return request.get(`/Assets/v1/rack/detail/${id}`);
@@ -49,11 +57,17 @@ export const fetchSupplierList = () => {
};
/** 获取数据中心列表(用于下拉选择) */
export const fetchDatacenterList = () => {
return request.get("/Assets/v1/datacenter/all");
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 = (datacenterId?: number) => {
return request.get("/Assets/v1/floor/all", { params: { datacenter_id: datacenterId } });
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 });
};