feat
This commit is contained in:
93
src/api/kb/category.ts
Normal file
93
src/api/kb/category.ts
Normal file
@@ -0,0 +1,93 @@
|
||||
import { request } from "@/api/request";
|
||||
|
||||
/** 分类类型 */
|
||||
export interface Category {
|
||||
id: number;
|
||||
created_at: string;
|
||||
updated_at: string;
|
||||
name: string;
|
||||
description: string;
|
||||
type: string;
|
||||
icon: string;
|
||||
color: string;
|
||||
parent_id: number;
|
||||
level: number;
|
||||
path: string;
|
||||
sort_order: number;
|
||||
status: string;
|
||||
creator_id: number;
|
||||
creator_name: string;
|
||||
doc_count: number;
|
||||
faq_count: number;
|
||||
metadata: string | null;
|
||||
remarks: string;
|
||||
}
|
||||
|
||||
/** API响应包装类型 */
|
||||
export interface ApiResponse<T = any> {
|
||||
code: number;
|
||||
message: string;
|
||||
data: T;
|
||||
}
|
||||
|
||||
/** 创建分类请求参数 */
|
||||
export interface CreateCategoryParams {
|
||||
name: string;
|
||||
description?: string;
|
||||
type?: string;
|
||||
icon?: string;
|
||||
color?: string;
|
||||
parent_id?: number;
|
||||
sort_order?: number;
|
||||
remarks?: string;
|
||||
}
|
||||
|
||||
/** 更新分类请求参数 */
|
||||
export interface UpdateCategoryParams {
|
||||
id: number;
|
||||
name?: string;
|
||||
description?: string;
|
||||
icon?: string;
|
||||
color?: string;
|
||||
sort_order?: number;
|
||||
status?: string;
|
||||
remarks?: string;
|
||||
}
|
||||
|
||||
/** 获取分类列表参数 */
|
||||
export interface FetchCategoryListParams {
|
||||
type?: string;
|
||||
parent_id?: number;
|
||||
}
|
||||
|
||||
/** 创建分类 */
|
||||
export const createCategory = (data: CreateCategoryParams) => {
|
||||
return request.post<ApiResponse<Category>>("/Kb/v1/category/create", data);
|
||||
};
|
||||
|
||||
/** 更新分类 */
|
||||
export const updateCategory = (data: UpdateCategoryParams) => {
|
||||
return request.post<ApiResponse<Category>>("/Kb/v1/category/update", data);
|
||||
};
|
||||
|
||||
/** 删除分类 */
|
||||
export const deleteCategory = (id: number) => {
|
||||
return request.delete<ApiResponse<string>>(`/Kb/v1/category/${id}`);
|
||||
};
|
||||
|
||||
/** 获取分类详情 */
|
||||
export const fetchCategoryDetail = (id: number) => {
|
||||
return request.get<ApiResponse<Category>>(`/Kb/v1/category/${id}`);
|
||||
};
|
||||
|
||||
/** 获取分类列表 */
|
||||
export const fetchCategoryList = (params?: FetchCategoryListParams) => {
|
||||
return request.get<ApiResponse<Category[]>>("/Kb/v1/category/list", { params });
|
||||
};
|
||||
|
||||
/** 获取分类树 */
|
||||
export const fetchCategoryTree = (type?: string) => {
|
||||
return request.get<ApiResponse<Category[]>>("/Kb/v1/category/tree", {
|
||||
params: type ? { type } : undefined,
|
||||
});
|
||||
};
|
||||
212
src/api/kb/document.ts
Normal file
212
src/api/kb/document.ts
Normal file
@@ -0,0 +1,212 @@
|
||||
import { request } from "@/api/request";
|
||||
|
||||
/** 文档状态 */
|
||||
export type DocumentStatus = 'draft' | 'published' | 'reviewed' | 'rejected';
|
||||
|
||||
/** 文档类型 */
|
||||
export type DocumentType = 'common' | 'guide' | 'solution' | 'troubleshoot' | 'process' | 'technical';
|
||||
|
||||
/** 文档接口类型 */
|
||||
export interface Document {
|
||||
id: number;
|
||||
created_at: string;
|
||||
updated_at: string;
|
||||
doc_no: string;
|
||||
title: string;
|
||||
description: string;
|
||||
content: string;
|
||||
type: DocumentType;
|
||||
status: DocumentStatus;
|
||||
category_id: number;
|
||||
sub_category: string;
|
||||
author_id: number;
|
||||
author_name: string;
|
||||
reviewer_id: number;
|
||||
reviewer_name: string;
|
||||
reviewed_at: string | null;
|
||||
published_at: string | null;
|
||||
publisher_id: number;
|
||||
view_count: number;
|
||||
like_count: number;
|
||||
comment_count: number;
|
||||
download_count: number;
|
||||
version: string;
|
||||
version_notes: string;
|
||||
tags: string;
|
||||
attachments: string | null;
|
||||
related_docs: string | null;
|
||||
metadata: string | null;
|
||||
keywords: string;
|
||||
remarks: string;
|
||||
is_favorited?: boolean;
|
||||
}
|
||||
|
||||
/** API响应包装类型 */
|
||||
export interface ApiResponse<T = any> {
|
||||
code: number;
|
||||
message: string;
|
||||
data: T;
|
||||
}
|
||||
|
||||
/** 分页响应类型 */
|
||||
export interface PaginatedResponse<T> {
|
||||
total: number;
|
||||
page: number;
|
||||
page_size: number;
|
||||
data: T[];
|
||||
}
|
||||
|
||||
/** 创建文档请求参数 */
|
||||
export interface CreateDocumentParams {
|
||||
title: string;
|
||||
description?: string;
|
||||
content: string;
|
||||
type?: DocumentType;
|
||||
category_id?: number;
|
||||
sub_category?: string;
|
||||
keywords?: string;
|
||||
tags?: string;
|
||||
remarks?: string;
|
||||
}
|
||||
|
||||
/** 更新文档请求参数 */
|
||||
export interface UpdateDocumentParams {
|
||||
id: number;
|
||||
title?: string;
|
||||
description?: string;
|
||||
content?: string;
|
||||
type?: DocumentType;
|
||||
category_id?: number;
|
||||
sub_category?: string;
|
||||
keywords?: string;
|
||||
tags?: string;
|
||||
remarks?: string;
|
||||
}
|
||||
|
||||
/** 获取文档列表参数 */
|
||||
export interface FetchDocumentListParams {
|
||||
page?: number;
|
||||
page_size?: number;
|
||||
keyword?: string;
|
||||
type?: DocumentType;
|
||||
status?: DocumentStatus;
|
||||
category_id?: number;
|
||||
}
|
||||
|
||||
/** 文档类型选项 */
|
||||
export const documentTypeOptions = [
|
||||
{ label: '通用文档', value: 'common' },
|
||||
{ label: '操作指南', value: 'guide' },
|
||||
{ label: '解决方案', value: 'solution' },
|
||||
{ label: '故障排查', value: 'troubleshoot' },
|
||||
{ label: '流程规范', value: 'process' },
|
||||
{ label: '技术文档', value: 'technical' },
|
||||
];
|
||||
|
||||
/** 文档状态选项 */
|
||||
export const documentStatusOptions = [
|
||||
{ label: '草稿', value: 'draft' },
|
||||
{ label: '已发布', value: 'published' },
|
||||
{ label: '已审核', value: 'reviewed' },
|
||||
{ label: '未通过审核', value: 'rejected' },
|
||||
];
|
||||
|
||||
/** 获取文档状态文本 */
|
||||
export const getDocumentStatusText = (status: DocumentStatus): string => {
|
||||
const statusMap: Record<DocumentStatus, string> = {
|
||||
draft: '草稿',
|
||||
published: '已发布',
|
||||
reviewed: '已审核',
|
||||
rejected: '未通过审核',
|
||||
};
|
||||
return statusMap[status] || status;
|
||||
};
|
||||
|
||||
/** 获取文档状态颜色 */
|
||||
export const getDocumentStatusColor = (status: DocumentStatus): string => {
|
||||
const colorMap: Record<DocumentStatus, string> = {
|
||||
draft: 'gray',
|
||||
published: 'blue',
|
||||
reviewed: 'green',
|
||||
rejected: 'red',
|
||||
};
|
||||
return colorMap[status] || 'gray';
|
||||
};
|
||||
|
||||
/** 获取文档类型文本 */
|
||||
export const getDocumentTypeText = (type: DocumentType): string => {
|
||||
const typeMap: Record<DocumentType, string> = {
|
||||
common: '通用文档',
|
||||
guide: '操作指南',
|
||||
solution: '解决方案',
|
||||
troubleshoot: '故障排查',
|
||||
process: '流程规范',
|
||||
technical: '技术文档',
|
||||
};
|
||||
return typeMap[type] || type;
|
||||
};
|
||||
|
||||
/** 创建文档 */
|
||||
export const createDocument = (data: CreateDocumentParams) => {
|
||||
return request.post<ApiResponse<Document>>("/Kb/v1/document/create", data);
|
||||
};
|
||||
|
||||
/** 更新文档 */
|
||||
export const updateDocument = (data: UpdateDocumentParams) => {
|
||||
return request.post<ApiResponse<Document>>("/Kb/v1/document/update", data);
|
||||
};
|
||||
|
||||
/** 删除文档(移入回收站) */
|
||||
export const deleteDocument = (id: number) => {
|
||||
return request.delete<ApiResponse<string>>(`/Kb/v1/document/${id}`);
|
||||
};
|
||||
|
||||
/** 获取文档详情 */
|
||||
export const fetchDocumentDetail = (id: number) => {
|
||||
return request.get<ApiResponse<Document>>(`/Kb/v1/document/${id}`);
|
||||
};
|
||||
|
||||
/** 获取文档列表 */
|
||||
export const fetchDocumentList = (params?: FetchDocumentListParams) => {
|
||||
return request.get<ApiResponse<PaginatedResponse<Document>>>("/Kb/v1/document/list", { params });
|
||||
};
|
||||
|
||||
/** 发布文档 */
|
||||
export const publishDocument = (id: number) => {
|
||||
return request.post<ApiResponse<string>>("/Kb/v1/document/publish", { id });
|
||||
};
|
||||
|
||||
/** 移入回收站 */
|
||||
export const moveToTrash = (id: number) => {
|
||||
return request.post<ApiResponse<string>>("/Kb/v1/trash/move", { id, type: 'document' });
|
||||
};
|
||||
|
||||
/** 获取我的文档列表(由我创建的所有文档) */
|
||||
export const fetchMyDocumentList = (params?: FetchDocumentListParams) => {
|
||||
return request.get<ApiResponse<PaginatedResponse<Document>>>("/Kb/v1/review/publish/list", { params });
|
||||
};
|
||||
|
||||
/** 获取已审核通过的文档列表 */
|
||||
export const fetchApprovedDocumentList = (params?: FetchDocumentListParams) => {
|
||||
return request.get<ApiResponse<PaginatedResponse<Document>>>("/Kb/v1/review/approved/list", { params });
|
||||
};
|
||||
|
||||
/** 收藏文档 */
|
||||
export const favoriteDocument = (id: number) => {
|
||||
return request.post<ApiResponse<string>>("/Kb/v1/favorite/create", { resource_type: 'document', resource_id: id });
|
||||
};
|
||||
|
||||
/** 取消收藏文档 */
|
||||
export const unfavoriteDocument = (id: number) => {
|
||||
return request.delete<ApiResponse<string>>("/Kb/v1/favorite/delete", { data: { resource_type: 'document', resource_id: id } });
|
||||
};
|
||||
|
||||
/** 检查文档是否已收藏 */
|
||||
export const checkFavorite = (id: number) => {
|
||||
return request.get<ApiResponse<{ is_favorited: boolean }>>(`/Kb/v1/favorite/check`, { params: { resource_type: 'document', resource_id: id } });
|
||||
};
|
||||
|
||||
/** 下载文档 */
|
||||
export const downloadDocument = (id: number) => {
|
||||
return request.get<Blob>(`/Kb/v1/document/${id}/download`, { responseType: 'blob' });
|
||||
};
|
||||
88
src/api/kb/trash.ts
Normal file
88
src/api/kb/trash.ts
Normal file
@@ -0,0 +1,88 @@
|
||||
import { request } from "@/api/request";
|
||||
|
||||
/** API响应包装类型 */
|
||||
export interface ApiResponse<T = any> {
|
||||
code: number;
|
||||
message: string;
|
||||
data: T;
|
||||
}
|
||||
|
||||
/** 分页响应类型 */
|
||||
export interface PaginatedResponse<T> {
|
||||
total: number;
|
||||
page: number;
|
||||
page_size: number;
|
||||
data: T[];
|
||||
}
|
||||
|
||||
/** 回收站记录 */
|
||||
export interface TrashRecord {
|
||||
id: number;
|
||||
created_at: string;
|
||||
updated_at: string;
|
||||
resource_type: 'document' | 'faq';
|
||||
resource_id: number;
|
||||
resource_name: string;
|
||||
deleted_by: number;
|
||||
deleted_name: string;
|
||||
deleted_time: string;
|
||||
delete_reason: string;
|
||||
original_data: string;
|
||||
remarks: string;
|
||||
}
|
||||
|
||||
/** 获取回收站列表参数 */
|
||||
export interface FetchTrashListParams {
|
||||
page?: number;
|
||||
page_size?: number;
|
||||
resource_type?: 'document' | 'faq';
|
||||
}
|
||||
|
||||
/** 恢复资源请求参数 */
|
||||
export interface RestoreTrashParams {
|
||||
id: number;
|
||||
}
|
||||
|
||||
/** 彻底删除请求参数 */
|
||||
export interface DeleteTrashParams {
|
||||
id: number;
|
||||
}
|
||||
|
||||
/** 资源类型选项 */
|
||||
export const resourceTypeOptions = [
|
||||
{ label: '文档', value: 'document' },
|
||||
{ label: '常见问题', value: 'faq' },
|
||||
];
|
||||
|
||||
/** 获取资源类型文本 */
|
||||
export const getResourceTypeText = (type: string): string => {
|
||||
const typeMap: Record<string, string> = {
|
||||
document: '文档',
|
||||
faq: '常见问题',
|
||||
};
|
||||
return typeMap[type] || type;
|
||||
};
|
||||
|
||||
/** 获取资源类型颜色 */
|
||||
export const getResourceTypeColor = (type: string): string => {
|
||||
const colorMap: Record<string, string> = {
|
||||
document: 'blue',
|
||||
faq: 'green',
|
||||
};
|
||||
return colorMap[type] || 'gray';
|
||||
};
|
||||
|
||||
/** 获取回收站列表 */
|
||||
export const fetchTrashList = (params?: FetchTrashListParams) => {
|
||||
return request.get<ApiResponse<PaginatedResponse<TrashRecord>>>("/Kb/v1/trash/list", { params });
|
||||
};
|
||||
|
||||
/** 恢复资源 */
|
||||
export const restoreTrash = (data: RestoreTrashParams) => {
|
||||
return request.post<ApiResponse<string>>("/Kb/v1/trash/restore", data);
|
||||
};
|
||||
|
||||
/** 彻底删除 */
|
||||
export const deleteTrash = (data: DeleteTrashParams) => {
|
||||
return request.post<ApiResponse<string>>("/Kb/v1/trash/delete", data);
|
||||
};
|
||||
139
src/api/ops/asset.ts
Normal file
139
src/api/ops/asset.ts
Normal file
@@ -0,0 +1,139 @@
|
||||
import { request } from "@/api/request";
|
||||
|
||||
/** 资产状态枚举 */
|
||||
export enum AssetStatus {
|
||||
IN_USE = 'in_use', // 在用
|
||||
IDLE = 'idle', // 闲置
|
||||
MAINTAIN = 'maintain', // 维修中
|
||||
SCRAP = 'scrap', // 待报废
|
||||
DISPOSED = 'disposed', // 已报废
|
||||
}
|
||||
|
||||
/** 资产状态选项 */
|
||||
export const assetStatusOptions = [
|
||||
{ label: '在用', value: AssetStatus.IN_USE },
|
||||
{ label: '闲置', value: AssetStatus.IDLE },
|
||||
{ label: '维修中', value: AssetStatus.MAINTAIN },
|
||||
{ label: '待报废', value: AssetStatus.SCRAP },
|
||||
{ label: '已报废', value: AssetStatus.DISPOSED },
|
||||
];
|
||||
|
||||
/** 获取资产状态文本 */
|
||||
export const getAssetStatusText = (status: string) => {
|
||||
const item = assetStatusOptions.find(opt => opt.value === status);
|
||||
return item?.label || status;
|
||||
};
|
||||
|
||||
/** 获取资产状态颜色 */
|
||||
export const getAssetStatusColor = (status: string) => {
|
||||
const colorMap: Record<string, string> = {
|
||||
[AssetStatus.IN_USE]: 'green',
|
||||
[AssetStatus.IDLE]: 'blue',
|
||||
[AssetStatus.MAINTAIN]: 'orange',
|
||||
[AssetStatus.SCRAP]: 'red',
|
||||
[AssetStatus.DISPOSED]: 'gray',
|
||||
};
|
||||
return colorMap[status] || 'gray';
|
||||
};
|
||||
|
||||
/** 资产列表查询参数 */
|
||||
export interface AssetListParams {
|
||||
page?: number;
|
||||
page_size?: number;
|
||||
keyword?: string;
|
||||
status?: string;
|
||||
category_id?: number;
|
||||
supplier_id?: number;
|
||||
datacenter_id?: number;
|
||||
department?: string;
|
||||
sort?: string;
|
||||
order?: string;
|
||||
}
|
||||
|
||||
/** 资产表单数据 */
|
||||
export interface AssetForm {
|
||||
id?: number;
|
||||
asset_name: string;
|
||||
asset_code: string;
|
||||
category_id?: number;
|
||||
model?: string;
|
||||
manufacturer?: string;
|
||||
serial_number?: string;
|
||||
purchase_date?: string;
|
||||
original_value?: number;
|
||||
supplier_id?: number;
|
||||
warranty_period?: string;
|
||||
warranty_expiry?: string;
|
||||
department?: string;
|
||||
user?: string;
|
||||
status?: string;
|
||||
location?: string;
|
||||
datacenter_id?: number;
|
||||
floor_id?: number;
|
||||
rack_id?: number;
|
||||
unit_start?: number;
|
||||
unit_end?: number;
|
||||
qr_code?: string;
|
||||
rfid_tag?: string;
|
||||
asset_tag?: string;
|
||||
specifications?: string;
|
||||
description?: string;
|
||||
remarks?: string;
|
||||
}
|
||||
|
||||
/** 获取资产列表(分页) */
|
||||
export const fetchAssetList = (data?: AssetListParams) => {
|
||||
return request.post("/Assets/v1/asset/list", data || {});
|
||||
};
|
||||
|
||||
/** 获取资产详情 */
|
||||
export const fetchAssetDetail = (id: number) => {
|
||||
return request.get(`/Assets/v1/asset/detail/${id}`);
|
||||
};
|
||||
|
||||
/** 创建资产 */
|
||||
export const createAsset = (data: AssetForm) => {
|
||||
return request.post("/Assets/v1/asset/create", data);
|
||||
};
|
||||
|
||||
/** 更新资产 */
|
||||
export const updateAsset = (data: AssetForm) => {
|
||||
return request.put("/Assets/v1/asset/update", data);
|
||||
};
|
||||
|
||||
/** 删除资产 */
|
||||
export const deleteAsset = (id: number) => {
|
||||
return request.delete(`/Assets/v1/asset/delete/${id}`);
|
||||
};
|
||||
|
||||
/** 导出资产 */
|
||||
export const exportAssets = (keyword?: string) => {
|
||||
const params: any = {};
|
||||
if (keyword) params.keyword = keyword;
|
||||
return request.get("/Assets/v1/asset/export", { params });
|
||||
};
|
||||
|
||||
/** 获取资产分类列表(下拉) */
|
||||
export const fetchCategoryOptions = () => {
|
||||
return request.get("/Assets/v1/category/all");
|
||||
};
|
||||
|
||||
/** 获取供应商列表(下拉) */
|
||||
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 || {});
|
||||
};
|
||||
46
src/api/ops/assetCategory.ts
Normal file
46
src/api/ops/assetCategory.ts
Normal file
@@ -0,0 +1,46 @@
|
||||
import { request } from "@/api/request";
|
||||
|
||||
/** 获取资产分类列表(分页) */
|
||||
export const fetchCategoryList = (data?: {
|
||||
page?: number;
|
||||
page_size?: number;
|
||||
keyword?: string;
|
||||
parent_id?: number;
|
||||
}) => {
|
||||
return request.post("/Assets/v1/category/list", data || {});
|
||||
};
|
||||
|
||||
/** 获取资产分类详情 */
|
||||
export const fetchCategoryDetail = (id: number) => {
|
||||
return request.get(`/Assets/v1/category/detail/${id}`);
|
||||
};
|
||||
|
||||
/** 创建资产分类 */
|
||||
export const createCategory = (data: any) => {
|
||||
return request.post("/Assets/v1/category/create", data);
|
||||
};
|
||||
|
||||
/** 更新资产分类 */
|
||||
export const updateCategory = (data: any) => {
|
||||
return request.put("/Assets/v1/category/update", data);
|
||||
};
|
||||
|
||||
/** 删除资产分类 */
|
||||
export const deleteCategory = (id: number) => {
|
||||
return request.delete(`/Assets/v1/category/delete/${id}`);
|
||||
};
|
||||
|
||||
/** 获取所有资产分类(用于下拉选择) */
|
||||
export const fetchAllCategories = () => {
|
||||
return request.get("/Assets/v1/category/all");
|
||||
};
|
||||
|
||||
/** 获取资产分类树形结构 */
|
||||
export const fetchCategoryTree = () => {
|
||||
return request.get("/Assets/v1/category/tree");
|
||||
};
|
||||
|
||||
/** 获取指定分类的子分类列表 */
|
||||
export const fetchCategoryChildren = (id: number) => {
|
||||
return request.get(`/Assets/v1/category/children/${id}`);
|
||||
};
|
||||
40
src/api/ops/supplier.ts
Normal file
40
src/api/ops/supplier.ts
Normal file
@@ -0,0 +1,40 @@
|
||||
import { request } from "@/api/request";
|
||||
|
||||
/** 获取供应商列表(分页) */
|
||||
export const fetchSupplierList = (data?: {
|
||||
page?: number;
|
||||
page_size?: number;
|
||||
keyword?: string;
|
||||
status?: string;
|
||||
enabled?: boolean;
|
||||
}) => {
|
||||
return request.post("/Assets/v1/supplier/list", data || {});
|
||||
};
|
||||
|
||||
/** 获取供应商详情 */
|
||||
export const fetchSupplierDetail = (id: number) => {
|
||||
return request.get(`/Assets/v1/supplier/detail/${id}`);
|
||||
};
|
||||
|
||||
/** 创建供应商 */
|
||||
export const createSupplier = (data: any) => {
|
||||
return request.post("/Assets/v1/supplier/create", data);
|
||||
};
|
||||
|
||||
/** 更新供应商 */
|
||||
export const updateSupplier = (data: any) => {
|
||||
return request.put("/Assets/v1/supplier/update", data);
|
||||
};
|
||||
|
||||
/** 删除供应商 */
|
||||
export const deleteSupplier = (id: number) => {
|
||||
return request.delete(`/Assets/v1/supplier/delete/${id}`);
|
||||
};
|
||||
|
||||
/** 获取所有供应商(用于下拉选择) */
|
||||
export const fetchAllSuppliers = (keyword?: string, status?: string) => {
|
||||
const params: any = {};
|
||||
if (keyword) params.keyword = keyword;
|
||||
if (status) params.status = status;
|
||||
return request.get("/Assets/v1/supplier/all", { params });
|
||||
};
|
||||
Reference in New Issue
Block a user