feat(knowledge): 添加知识库标签统计功能

- 在 KnowledgeItemApplicationService 中注入 TagMapper 并调用统计方法
- 新增 countKnowledgeSetTags 方法用于计算知识库中的标签总数
- 在 KnowledgeManagementStatisticsResponse 中添加 totalTags 字段
- 在前端 KnowledgeManagementPage 中显示标签总数统计信息
- 更新统计卡片布局从 3 列改为 4 列以适应新增统计项
- 在知识管理模型中添加 totalTags 类型定义
This commit is contained in:
2026-02-01 18:46:31 +08:00
parent 7043a26ab3
commit d135a7f336
6 changed files with 28 additions and 1 deletions

View File

@@ -16,6 +16,7 @@ import com.datamate.datamanagement.domain.model.knowledge.KnowledgeItem;
import com.datamate.datamanagement.domain.model.knowledge.KnowledgeSet; import com.datamate.datamanagement.domain.model.knowledge.KnowledgeSet;
import com.datamate.datamanagement.infrastructure.config.DataManagementProperties; import com.datamate.datamanagement.infrastructure.config.DataManagementProperties;
import com.datamate.datamanagement.infrastructure.exception.DataManagementErrorCode; import com.datamate.datamanagement.infrastructure.exception.DataManagementErrorCode;
import com.datamate.datamanagement.infrastructure.persistence.mapper.TagMapper;
import com.datamate.datamanagement.infrastructure.persistence.repository.DatasetFileRepository; import com.datamate.datamanagement.infrastructure.persistence.repository.DatasetFileRepository;
import com.datamate.datamanagement.infrastructure.persistence.repository.DatasetRepository; import com.datamate.datamanagement.infrastructure.persistence.repository.DatasetRepository;
import com.datamate.datamanagement.infrastructure.persistence.repository.KnowledgeItemRepository; import com.datamate.datamanagement.infrastructure.persistence.repository.KnowledgeItemRepository;
@@ -86,6 +87,7 @@ public class KnowledgeItemApplicationService {
private final DatasetRepository datasetRepository; private final DatasetRepository datasetRepository;
private final DatasetFileRepository datasetFileRepository; private final DatasetFileRepository datasetFileRepository;
private final DataManagementProperties dataManagementProperties; private final DataManagementProperties dataManagementProperties;
private final TagMapper tagMapper;
public KnowledgeItem createKnowledgeItem(String setId, CreateKnowledgeItemRequest request) { public KnowledgeItem createKnowledgeItem(String setId, CreateKnowledgeItemRequest request) {
KnowledgeSet knowledgeSet = requireKnowledgeSet(setId); KnowledgeSet knowledgeSet = requireKnowledgeSet(setId);
@@ -233,6 +235,7 @@ public class KnowledgeItemApplicationService {
long datasetFileSize = safeLong(knowledgeItemRepository.sumDatasetFileSize()); long datasetFileSize = safeLong(knowledgeItemRepository.sumDatasetFileSize());
long uploadFileSize = calculateUploadFileTotalSize(); long uploadFileSize = calculateUploadFileTotalSize();
response.setTotalSize(datasetFileSize + uploadFileSize); response.setTotalSize(datasetFileSize + uploadFileSize);
response.setTotalTags(safeLong(tagMapper.countKnowledgeSetTags()));
return response; return response;
} }

View File

@@ -14,6 +14,7 @@ public interface TagMapper {
List<Tag> findByIdIn(@Param("ids") List<String> ids); List<Tag> findByIdIn(@Param("ids") List<String> ids);
List<Tag> findByKeyword(@Param("keyword") String keyword); List<Tag> findByKeyword(@Param("keyword") String keyword);
List<Tag> findAllByOrderByUsageCountDesc(); List<Tag> findAllByOrderByUsageCountDesc();
Long countKnowledgeSetTags();
int insert(Tag tag); int insert(Tag tag);
int update(Tag tag); int update(Tag tag);

View File

@@ -12,4 +12,5 @@ public class KnowledgeManagementStatisticsResponse {
private Long totalKnowledgeSets = 0L; private Long totalKnowledgeSets = 0L;
private Long totalFiles = 0L; private Long totalFiles = 0L;
private Long totalSize = 0L; private Long totalSize = 0L;
private Long totalTags = 0L;
} }

View File

@@ -53,6 +53,19 @@
ORDER BY usage_count DESC, name ASC ORDER BY usage_count DESC, name ASC
</select> </select>
<select id="countKnowledgeSetTags" resultType="long">
SELECT COUNT(DISTINCT t.id)
FROM t_dm_tags t
WHERE EXISTS (
SELECT 1
FROM t_dm_knowledge_sets ks
WHERE ks.tags IS NOT NULL
AND JSON_VALID(ks.tags) = 1
AND JSON_LENGTH(ks.tags) > 0
AND JSON_SEARCH(ks.tags, 'one', t.name, NULL, '$[*].name') IS NOT NULL
)
</select>
<insert id="insert" parameterType="com.datamate.datamanagement.domain.model.dataset.Tag"> <insert id="insert" parameterType="com.datamate.datamanagement.domain.model.dataset.Tag">
INSERT INTO t_dm_tags (id, name, description, category, color, usage_count) INSERT INTO t_dm_tags (id, name, description, category, color, usage_count)
VALUES (#{id}, #{name}, #{description}, #{category}, #{color}, #{usageCount}) VALUES (#{id}, #{name}, #{description}, #{category}, #{color}, #{usageCount})

View File

@@ -40,6 +40,10 @@ const DEFAULT_STATISTICS: StatisticsItem[] = [
title: "文件总数", title: "文件总数",
value: 0, value: 0,
}, },
{
title: "标签总数",
value: 0,
},
{ {
title: "总大小", title: "总大小",
value: "0 B", value: "0 B",
@@ -113,6 +117,10 @@ export default function KnowledgeManagementPage() {
title: "文件总数", title: "文件总数",
value: stats?.totalFiles ?? 0, value: stats?.totalFiles ?? 0,
}, },
{
title: "标签总数",
value: stats?.totalTags ?? 0,
},
{ {
title: "总大小", title: "总大小",
value: formatBytes(stats?.totalSize ?? 0), value: formatBytes(stats?.totalSize ?? 0),
@@ -276,7 +284,7 @@ export default function KnowledgeManagementPage() {
<div className="grid grid-cols-1 gap-4"> <div className="grid grid-cols-1 gap-4">
<Card> <Card>
<div className="grid grid-cols-3"> <div className="grid grid-cols-4">
{statisticsData.map((item) => ( {statisticsData.map((item) => (
<Statistic <Statistic
title={item.title} title={item.title}

View File

@@ -82,6 +82,7 @@ export interface KnowledgeManagementStatistics {
totalKnowledgeSets: number; totalKnowledgeSets: number;
totalFiles: number; totalFiles: number;
totalSize: number; totalSize: number;
totalTags: number;
} }
export interface KnowledgeItemSearchResult { export interface KnowledgeItemSearchResult {