feat(knowledge): 添加知识管理功能模块

- 实现知识集的创建、编辑、删除功能
- 实现知识条目的创建、编辑、删除功能
- 添加知识集详情页面展示功能
- 实现知识条目导入数据集文件功能
- 添加知识管理主页列表展示功能
- 实现知识集和知识条目的状态管理
- 集成标签管理和搜索过滤功能
- 添加知识条目的批量操作支持
This commit is contained in:
2026-01-21 11:48:36 +08:00
parent da6c7860cb
commit 34fa184b69
8 changed files with 1356 additions and 0 deletions

View File

@@ -0,0 +1,160 @@
import React from "react";
import {
CheckCircleOutlined,
ClockCircleOutlined,
CloseCircleOutlined,
FolderOpenOutlined,
} from "@ant-design/icons";
import { BookOpen } from "lucide-react";
import { formatDateTime } from "@/utils/unit";
import {
KnowledgeContentType,
KnowledgeItem,
KnowledgeSet,
KnowledgeSourceType,
KnowledgeStatusType,
} from "./knowledge-management.model";
export type KnowledgeStatusMeta = {
label: string;
value: KnowledgeStatusType;
color: string;
icon: React.ReactNode;
};
export const knowledgeStatusMap: Record<KnowledgeStatusType, KnowledgeStatusMeta> = {
[KnowledgeStatusType.DRAFT]: {
label: "草稿",
value: KnowledgeStatusType.DRAFT,
color: "#a1a1a1",
icon: <ClockCircleOutlined />,
},
[KnowledgeStatusType.PUBLISHED]: {
label: "已发布",
value: KnowledgeStatusType.PUBLISHED,
color: "#409f17",
icon: <CheckCircleOutlined />,
},
[KnowledgeStatusType.ARCHIVED]: {
label: "已归档",
value: KnowledgeStatusType.ARCHIVED,
color: "#6b7280",
icon: <FolderOpenOutlined />,
},
[KnowledgeStatusType.DEPRECATED]: {
label: "已废弃",
value: KnowledgeStatusType.DEPRECATED,
color: "#d97706",
icon: <CloseCircleOutlined />,
},
};
export const knowledgeStatusOptions = Object.values(knowledgeStatusMap).map((item) => ({
label: item.label,
value: item.value,
}));
export const knowledgeContentTypeOptions = [
{ label: "文本", value: KnowledgeContentType.TEXT },
{ label: "Markdown", value: KnowledgeContentType.MARKDOWN },
];
export const knowledgeSourceTypeOptions = [
{ label: "手工录入", value: KnowledgeSourceType.MANUAL },
{ label: "数据集文件导入", value: KnowledgeSourceType.DATASET_FILE },
];
export type KnowledgeSetView = {
id: string;
name: string;
description?: string;
status: KnowledgeStatusMeta | null;
rawStatus: KnowledgeStatusType;
tags: KnowledgeSet["tags"];
domain?: string;
businessLine?: string;
owner?: string;
validFrom?: string;
validTo?: string;
sourceType?: KnowledgeSet["sourceType"];
sensitivity?: string;
metadata?: string;
createdAt?: string;
updatedAt?: string;
type: string;
icon?: React.ReactNode;
iconColor?: string;
statistics?: { label: string; value: string | number }[];
};
export type KnowledgeItemView = {
id: string;
setId: string;
title: string;
content: string;
contentType: KnowledgeContentType;
status: KnowledgeStatusMeta | null;
rawStatus: KnowledgeStatusType;
tags: KnowledgeItem["tags"];
domain?: string;
businessLine?: string;
owner?: string;
validFrom?: string;
validTo?: string;
sourceType?: KnowledgeItem["sourceType"];
sensitivity?: string;
sourceDatasetId?: string;
sourceFileId?: string;
metadata?: string;
createdAt?: string;
updatedAt?: string;
};
export function mapKnowledgeSet(data: KnowledgeSet): KnowledgeSetView {
return {
id: data.id,
name: data.name,
description: data.description,
status: knowledgeStatusMap[data.status] ?? null,
rawStatus: data.status,
tags: data.tags || [],
domain: data.domain,
businessLine: data.businessLine,
owner: data.owner,
validFrom: data.validFrom,
validTo: data.validTo,
sourceType: data.sourceType,
sensitivity: data.sensitivity,
metadata: data.metadata,
createdAt: data.createdAt ? formatDateTime(data.createdAt) : "",
updatedAt: data.updatedAt ? formatDateTime(data.updatedAt) : "",
type: "知识集",
icon: <BookOpen className="w-6 h-6" />,
iconColor: "#3b82f6",
};
}
export function mapKnowledgeItem(data: KnowledgeItem): KnowledgeItemView {
return {
id: data.id,
setId: data.setId,
title: data.title,
content: data.content,
contentType: data.contentType,
status: knowledgeStatusMap[data.status] ?? null,
rawStatus: data.status,
tags: data.tags || [],
domain: data.domain,
businessLine: data.businessLine,
owner: data.owner,
validFrom: data.validFrom,
validTo: data.validTo,
sourceType: data.sourceType,
sensitivity: data.sensitivity,
sourceDatasetId: data.sourceDatasetId,
sourceFileId: data.sourceFileId,
metadata: data.metadata,
createdAt: data.createdAt ? formatDateTime(data.createdAt) : "",
updatedAt: data.updatedAt ? formatDateTime(data.updatedAt) : "",
};
}