refactor(data-management): 移除知识条目的冗余字段和验证逻辑

- 移除 KnowledgeItem 实体中的 title、status、domain、businessLine、owner、sensitivity 字段
- 移除 KnowledgeItem 实体中的有效期限相关字段 validFrom 和 validTo
- 移除 KnowledgeItem 实体中的标签集合 tags 和扩展元数据 metadata
- 删除 KnowledgeItemApplicationService 中的相关验证和默认值设置逻辑
- 移除 TagMapper 和 Tag 相关的数据处理代码
- 简化创建和更新知识条目的业务流程
- 更新数据库查询条件以适应新的实体结构
- 从各种 DTO 中移除已删除字段的定义和验证规则
- 修改分页查询逻辑以匹配新的字段结构
This commit is contained in:
2026-01-29 15:09:47 +08:00
parent 49b7f2a64c
commit 3cc0802355
10 changed files with 7 additions and 471 deletions

View File

@@ -12,12 +12,10 @@ import com.datamate.datamanagement.common.enums.KnowledgeSourceType;
import com.datamate.datamanagement.common.enums.KnowledgeStatusType; import com.datamate.datamanagement.common.enums.KnowledgeStatusType;
import com.datamate.datamanagement.domain.model.dataset.Dataset; import com.datamate.datamanagement.domain.model.dataset.Dataset;
import com.datamate.datamanagement.domain.model.dataset.DatasetFile; import com.datamate.datamanagement.domain.model.dataset.DatasetFile;
import com.datamate.datamanagement.domain.model.dataset.Tag;
import com.datamate.datamanagement.domain.model.knowledge.KnowledgeItem; 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;
@@ -50,12 +48,10 @@ import java.nio.charset.StandardCharsets;
import java.nio.file.Files; import java.nio.file.Files;
import java.nio.file.Path; import java.nio.file.Path;
import java.nio.file.Paths; import java.nio.file.Paths;
import java.time.LocalDate;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatter;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Objects; import java.util.Objects;
@@ -84,7 +80,6 @@ public class KnowledgeItemApplicationService {
private final KnowledgeSetRepository knowledgeSetRepository; private final KnowledgeSetRepository knowledgeSetRepository;
private final DatasetRepository datasetRepository; private final DatasetRepository datasetRepository;
private final DatasetFileRepository datasetFileRepository; private final DatasetFileRepository datasetFileRepository;
private final TagMapper tagMapper;
private final DataManagementProperties dataManagementProperties; private final DataManagementProperties dataManagementProperties;
public KnowledgeItem createKnowledgeItem(String setId, CreateKnowledgeItemRequest request) { public KnowledgeItem createKnowledgeItem(String setId, CreateKnowledgeItemRequest request) {
@@ -102,16 +97,6 @@ public class KnowledgeItemApplicationService {
} }
knowledgeItem.setSourceDatasetId(request.getSourceDatasetId()); knowledgeItem.setSourceDatasetId(request.getSourceDatasetId());
knowledgeItem.setSourceFileId(request.getSourceFileId()); knowledgeItem.setSourceFileId(request.getSourceFileId());
if (knowledgeItem.getStatus() == null) {
knowledgeItem.setStatus(KnowledgeStatusType.DRAFT);
}
applyDefaultsFromSet(knowledgeItem, knowledgeSet, request.getTags(), request.getDomain(),
request.getBusinessLine(), request.getOwner(), request.getSensitivity(),
request.getValidFrom(), request.getValidTo(), request.getMetadata());
validateEffectivePeriod(knowledgeItem.getValidFrom(), knowledgeItem.getValidTo());
validatePublishable(knowledgeItem);
knowledgeItemRepository.save(knowledgeItem); knowledgeItemRepository.save(knowledgeItem);
return knowledgeItem; return knowledgeItem;
@@ -130,8 +115,6 @@ public class KnowledgeItemApplicationService {
BusinessAssert.isTrue(setDir.startsWith(uploadRoot), CommonErrorCode.PARAM_ERROR); BusinessAssert.isTrue(setDir.startsWith(uploadRoot), CommonErrorCode.PARAM_ERROR);
createDirectories(setDir); createDirectories(setDir);
boolean singleFile = files.size() == 1;
String overrideTitle = StringUtils.trimToNull(request.getTitle());
List<KnowledgeItem> items = new ArrayList<>(); List<KnowledgeItem> items = new ArrayList<>();
for (MultipartFile file : files) { for (MultipartFile file : files) {
@@ -155,25 +138,10 @@ public class KnowledgeItemApplicationService {
KnowledgeItem knowledgeItem = new KnowledgeItem(); KnowledgeItem knowledgeItem = new KnowledgeItem();
knowledgeItem.setId(UUID.randomUUID().toString()); knowledgeItem.setId(UUID.randomUUID().toString());
knowledgeItem.setSetId(setId); knowledgeItem.setSetId(setId);
String title = singleFile && StringUtils.isNotBlank(overrideTitle)
? overrideTitle
: stripExtension(safeOriginalName);
if (StringUtils.isBlank(title)) {
title = "未命名文件";
}
knowledgeItem.setTitle(trimToLength(title, MAX_TITLE_LENGTH));
knowledgeItem.setContent(buildRelativeFilePath(setId, storedName)); knowledgeItem.setContent(buildRelativeFilePath(setId, storedName));
knowledgeItem.setContentType(KnowledgeContentType.FILE); knowledgeItem.setContentType(KnowledgeContentType.FILE);
knowledgeItem.setSourceType(KnowledgeSourceType.FILE_UPLOAD); knowledgeItem.setSourceType(KnowledgeSourceType.FILE_UPLOAD);
knowledgeItem.setSourceFileId(trimToLength(safeOriginalName, MAX_TITLE_LENGTH)); knowledgeItem.setSourceFileId(trimToLength(safeOriginalName, MAX_TITLE_LENGTH));
knowledgeItem.setStatus(request.getStatus() == null ? KnowledgeStatusType.DRAFT : request.getStatus());
applyDefaultsFromSet(knowledgeItem, knowledgeSet, request.getTags(), request.getDomain(),
request.getBusinessLine(), request.getOwner(), request.getSensitivity(),
request.getValidFrom(), request.getValidTo(), request.getMetadata());
validateEffectivePeriod(knowledgeItem.getValidFrom(), knowledgeItem.getValidTo());
validatePublishable(knowledgeItem);
items.add(knowledgeItem); items.add(knowledgeItem);
} }
@@ -189,15 +157,9 @@ public class KnowledgeItemApplicationService {
KnowledgeItem knowledgeItem = knowledgeItemRepository.getById(itemId); KnowledgeItem knowledgeItem = knowledgeItemRepository.getById(itemId);
BusinessAssert.notNull(knowledgeItem, DataManagementErrorCode.KNOWLEDGE_ITEM_NOT_FOUND); BusinessAssert.notNull(knowledgeItem, DataManagementErrorCode.KNOWLEDGE_ITEM_NOT_FOUND);
BusinessAssert.isTrue(Objects.equals(knowledgeItem.getSetId(), setId), CommonErrorCode.PARAM_ERROR); BusinessAssert.isTrue(Objects.equals(knowledgeItem.getSetId(), setId), CommonErrorCode.PARAM_ERROR);
BusinessAssert.isTrue(!isReadOnlyStatus(knowledgeItem.getStatus()),
DataManagementErrorCode.KNOWLEDGE_ITEM_STATUS_ERROR);
BusinessAssert.isTrue(!isReadOnlyStatus(knowledgeSet.getStatus()), BusinessAssert.isTrue(!isReadOnlyStatus(knowledgeSet.getStatus()),
DataManagementErrorCode.KNOWLEDGE_SET_STATUS_ERROR); DataManagementErrorCode.KNOWLEDGE_SET_STATUS_ERROR);
if (request.getTitle() != null) {
BusinessAssert.isTrue(StringUtils.isNotBlank(request.getTitle()), CommonErrorCode.PARAM_ERROR);
knowledgeItem.setTitle(request.getTitle());
}
if (request.getContent() != null) { if (request.getContent() != null) {
BusinessAssert.isTrue(StringUtils.isNotBlank(request.getContent()), CommonErrorCode.PARAM_ERROR); BusinessAssert.isTrue(StringUtils.isNotBlank(request.getContent()), CommonErrorCode.PARAM_ERROR);
knowledgeItem.setContent(request.getContent()); knowledgeItem.setContent(request.getContent());
@@ -205,34 +167,6 @@ public class KnowledgeItemApplicationService {
if (request.getContentType() != null) { if (request.getContentType() != null) {
knowledgeItem.setContentType(request.getContentType()); knowledgeItem.setContentType(request.getContentType());
} }
if (request.getStatus() != null) {
knowledgeItem.setStatus(request.getStatus());
}
if (request.getTags() != null) {
knowledgeItem.setTags(processTagNames(request.getTags()));
}
if (request.getDomain() != null) {
knowledgeItem.setDomain(request.getDomain());
}
if (request.getBusinessLine() != null) {
knowledgeItem.setBusinessLine(request.getBusinessLine());
}
if (request.getOwner() != null) {
knowledgeItem.setOwner(request.getOwner());
}
if (request.getValidFrom() != null || request.getValidTo() != null) {
knowledgeItem.setValidFrom(request.getValidFrom());
knowledgeItem.setValidTo(request.getValidTo());
}
if (request.getSensitivity() != null) {
knowledgeItem.setSensitivity(request.getSensitivity());
}
if (request.getMetadata() != null) {
knowledgeItem.setMetadata(request.getMetadata());
}
validateEffectivePeriod(knowledgeItem.getValidFrom(), knowledgeItem.getValidTo());
validatePublishable(knowledgeItem);
knowledgeItemRepository.updateById(knowledgeItem); knowledgeItemRepository.updateById(knowledgeItem);
return knowledgeItem; return knowledgeItem;
@@ -281,20 +215,11 @@ public class KnowledgeItemApplicationService {
KnowledgeItem knowledgeItem = new KnowledgeItem(); KnowledgeItem knowledgeItem = new KnowledgeItem();
knowledgeItem.setId(UUID.randomUUID().toString()); knowledgeItem.setId(UUID.randomUUID().toString());
knowledgeItem.setSetId(setId); knowledgeItem.setSetId(setId);
knowledgeItem.setTitle(stripExtension(datasetFile.getFileName()));
knowledgeItem.setContent(content); knowledgeItem.setContent(content);
knowledgeItem.setContentType(contentType); knowledgeItem.setContentType(contentType);
knowledgeItem.setSourceType(KnowledgeSourceType.DATASET_FILE); knowledgeItem.setSourceType(KnowledgeSourceType.DATASET_FILE);
knowledgeItem.setSourceDatasetId(dataset.getId()); knowledgeItem.setSourceDatasetId(dataset.getId());
knowledgeItem.setSourceFileId(datasetFile.getId()); knowledgeItem.setSourceFileId(datasetFile.getId());
knowledgeItem.setStatus(request.getStatus() == null ? KnowledgeStatusType.DRAFT : request.getStatus());
applyDefaultsFromSet(knowledgeItem, knowledgeSet, request.getTags(), request.getDomain(),
request.getBusinessLine(), request.getOwner(), request.getSensitivity(),
request.getValidFrom(), request.getValidTo(), request.getMetadata());
validateEffectivePeriod(knowledgeItem.getValidFrom(), knowledgeItem.getValidTo());
validatePublishable(knowledgeItem);
items.add(knowledgeItem); items.add(knowledgeItem);
} }
@@ -415,8 +340,6 @@ public class KnowledgeItemApplicationService {
KnowledgeItem knowledgeItem = knowledgeItemRepository.getById(itemId); KnowledgeItem knowledgeItem = knowledgeItemRepository.getById(itemId);
BusinessAssert.notNull(knowledgeItem, DataManagementErrorCode.KNOWLEDGE_ITEM_NOT_FOUND); BusinessAssert.notNull(knowledgeItem, DataManagementErrorCode.KNOWLEDGE_ITEM_NOT_FOUND);
BusinessAssert.isTrue(Objects.equals(knowledgeItem.getSetId(), setId), CommonErrorCode.PARAM_ERROR); BusinessAssert.isTrue(Objects.equals(knowledgeItem.getSetId(), setId), CommonErrorCode.PARAM_ERROR);
BusinessAssert.isTrue(!isReadOnlyStatus(knowledgeItem.getStatus()),
DataManagementErrorCode.KNOWLEDGE_ITEM_STATUS_ERROR);
BusinessAssert.isTrue(!isReadOnlyStatus(knowledgeSet.getStatus()), BusinessAssert.isTrue(!isReadOnlyStatus(knowledgeSet.getStatus()),
DataManagementErrorCode.KNOWLEDGE_SET_STATUS_ERROR); DataManagementErrorCode.KNOWLEDGE_SET_STATUS_ERROR);
@@ -451,17 +374,10 @@ public class KnowledgeItemApplicationService {
saveMultipartFile(file, targetPath); saveMultipartFile(file, targetPath);
String title = stripExtension(safeOriginalName);
if (StringUtils.isBlank(title)) {
title = "未命名文件";
}
title = trimToLength(title, MAX_TITLE_LENGTH);
String sourceFileId = trimToLength(safeOriginalName, MAX_TITLE_LENGTH); String sourceFileId = trimToLength(safeOriginalName, MAX_TITLE_LENGTH);
String newRelativePath = buildRelativeFilePath(setId, storedName); String newRelativePath = buildRelativeFilePath(setId, storedName);
try { try {
knowledgeItem.setTitle(title);
knowledgeItem.setContent(newRelativePath); knowledgeItem.setContent(newRelativePath);
knowledgeItem.setContentType(KnowledgeContentType.FILE); knowledgeItem.setContentType(KnowledgeContentType.FILE);
knowledgeItem.setSourceType(KnowledgeSourceType.FILE_UPLOAD); knowledgeItem.setSourceType(KnowledgeSourceType.FILE_UPLOAD);
@@ -594,8 +510,10 @@ public class KnowledgeItemApplicationService {
} }
private String buildItemEntryName(KnowledgeItem item, Map<String, Integer> nameCounter) { private String buildItemEntryName(KnowledgeItem item, Map<String, Integer> nameCounter) {
String rawTitle = StringUtils.isNotBlank(item.getTitle()) ? item.getTitle() : "item-" + item.getId(); String rawName = StringUtils.isNotBlank(item.getSourceFileId())
String baseName = sanitizeFileName(rawTitle); ? stripExtension(item.getSourceFileId())
: "item-" + item.getId();
String baseName = sanitizeFileName(rawName);
if (StringUtils.isBlank(baseName)) { if (StringUtils.isBlank(baseName)) {
baseName = "item-" + item.getId(); baseName = "item-" + item.getId();
} }
@@ -698,77 +616,7 @@ public class KnowledgeItemApplicationService {
return fileName.substring(0, dotIndex); return fileName.substring(0, dotIndex);
} }
private void applyDefaultsFromSet(KnowledgeItem knowledgeItem,
KnowledgeSet knowledgeSet,
List<String> tags,
String domain,
String businessLine,
String owner,
String sensitivity,
LocalDate validFrom,
LocalDate validTo,
String metadata) {
if (tags != null) {
knowledgeItem.setTags(processTagNames(tags));
} else if (knowledgeSet.getTags() != null) {
knowledgeItem.setTags(new HashSet<>(knowledgeSet.getTags()));
} else {
knowledgeItem.setTags(new HashSet<>());
}
knowledgeItem.setDomain(StringUtils.isNotBlank(domain) ? domain : knowledgeSet.getDomain());
knowledgeItem.setBusinessLine(StringUtils.isNotBlank(businessLine) ? businessLine : knowledgeSet.getBusinessLine());
knowledgeItem.setOwner(StringUtils.isNotBlank(owner) ? owner : knowledgeSet.getOwner());
knowledgeItem.setSensitivity(StringUtils.isNotBlank(sensitivity) ? sensitivity : knowledgeSet.getSensitivity());
knowledgeItem.setValidFrom(validFrom != null ? validFrom : knowledgeSet.getValidFrom());
knowledgeItem.setValidTo(validTo != null ? validTo : knowledgeSet.getValidTo());
knowledgeItem.setMetadata(metadata != null ? metadata : knowledgeSet.getMetadata());
}
private boolean isReadOnlyStatus(KnowledgeStatusType status) { private boolean isReadOnlyStatus(KnowledgeStatusType status) {
return status == KnowledgeStatusType.ARCHIVED || status == KnowledgeStatusType.DEPRECATED; return status == KnowledgeStatusType.ARCHIVED || status == KnowledgeStatusType.DEPRECATED;
} }
private void validatePublishable(KnowledgeItem knowledgeItem) {
if (knowledgeItem.getStatus() != KnowledgeStatusType.PUBLISHED) {
return;
}
BusinessAssert.isTrue(StringUtils.isNotBlank(knowledgeItem.getDomain()), CommonErrorCode.PARAM_ERROR);
BusinessAssert.isTrue(StringUtils.isNotBlank(knowledgeItem.getBusinessLine()), CommonErrorCode.PARAM_ERROR);
BusinessAssert.isTrue(StringUtils.isNotBlank(knowledgeItem.getOwner()), CommonErrorCode.PARAM_ERROR);
BusinessAssert.isTrue(StringUtils.isNotBlank(knowledgeItem.getSensitivity()), CommonErrorCode.PARAM_ERROR);
BusinessAssert.notNull(knowledgeItem.getSourceType(), CommonErrorCode.PARAM_ERROR);
BusinessAssert.notNull(knowledgeItem.getValidFrom(), CommonErrorCode.PARAM_ERROR);
BusinessAssert.notNull(knowledgeItem.getValidTo(), CommonErrorCode.PARAM_ERROR);
}
private void validateEffectivePeriod(LocalDate validFrom, LocalDate validTo) {
if (validFrom == null || validTo == null) {
return;
}
BusinessAssert.isTrue(!validFrom.isAfter(validTo), CommonErrorCode.PARAM_ERROR);
}
private Set<Tag> processTagNames(List<String> tagNames) {
if (CollectionUtils.isEmpty(tagNames)) {
return new HashSet<>();
}
Set<Tag> tags = new HashSet<>();
for (String tagName : tagNames) {
if (StringUtils.isBlank(tagName)) {
continue;
}
Tag tag = tagMapper.findByName(tagName);
if (tag == null) {
Tag newTag = new Tag(tagName, null, null, "#007bff");
newTag.setUsageCount(0L);
newTag.setId(UUID.randomUUID().toString());
tagMapper.insert(newTag);
tag = newTag;
}
tag.setUsageCount(tag.getUsageCount() == null ? 1L : tag.getUsageCount() + 1);
tagMapper.updateUsageCount(tag.getId(), tag.getUsageCount());
tags.add(tag);
}
return tags;
}
} }

View File

@@ -1,20 +1,12 @@
package com.datamate.datamanagement.domain.model.knowledge; package com.datamate.datamanagement.domain.model.knowledge;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
import com.datamate.common.domain.model.base.BaseEntity; import com.datamate.common.domain.model.base.BaseEntity;
import com.datamate.datamanagement.common.enums.KnowledgeContentType; import com.datamate.datamanagement.common.enums.KnowledgeContentType;
import com.datamate.datamanagement.common.enums.KnowledgeSourceType; import com.datamate.datamanagement.common.enums.KnowledgeSourceType;
import com.datamate.datamanagement.common.enums.KnowledgeStatusType;
import com.datamate.datamanagement.domain.model.dataset.Tag;
import lombok.Getter; import lombok.Getter;
import lombok.Setter; import lombok.Setter;
import java.time.LocalDate;
import java.util.Collection;
import java.util.HashSet;
/** /**
* 知识条目实体(与数据库表 t_dm_knowledge_items 对齐) * 知识条目实体(与数据库表 t_dm_knowledge_items 对齐)
*/ */
@@ -26,10 +18,6 @@ public class KnowledgeItem extends BaseEntity<String> {
* 所属知识集ID * 所属知识集ID
*/ */
private String setId; private String setId;
/**
* 标题
*/
private String title;
/** /**
* 内容 * 内容
*/ */
@@ -38,38 +26,10 @@ public class KnowledgeItem extends BaseEntity<String> {
* 内容类型 * 内容类型
*/ */
private KnowledgeContentType contentType; private KnowledgeContentType contentType;
/**
* 状态
*/
private KnowledgeStatusType status;
/**
* 领域
*/
private String domain;
/**
* 业务线
*/
private String businessLine;
/**
* 负责人
*/
private String owner;
/**
* 有效期开始
*/
private LocalDate validFrom;
/**
* 有效期结束
*/
private LocalDate validTo;
/** /**
* 来源类型 * 来源类型
*/ */
private KnowledgeSourceType sourceType; private KnowledgeSourceType sourceType;
/**
* 敏感级别
*/
private String sensitivity;
/** /**
* 来源数据集ID * 来源数据集ID
*/ */
@@ -78,13 +38,4 @@ public class KnowledgeItem extends BaseEntity<String> {
* 来源文件ID * 来源文件ID
*/ */
private String sourceFileId; private String sourceFileId;
/**
* 标签列表
*/
@TableField(typeHandler = JacksonTypeHandler.class)
private Collection<Tag> tags = new HashSet<>();
/**
* 扩展元数据
*/
private String metadata;
} }

View File

@@ -25,33 +25,17 @@ public class KnowledgeItemRepositoryImpl extends CrudRepository<KnowledgeItemMap
public IPage<KnowledgeItem> findByCriteria(IPage<KnowledgeItem> page, KnowledgeItemPagingQuery query) { public IPage<KnowledgeItem> findByCriteria(IPage<KnowledgeItem> page, KnowledgeItemPagingQuery query) {
LambdaQueryWrapper<KnowledgeItem> wrapper = new LambdaQueryWrapper<KnowledgeItem>() LambdaQueryWrapper<KnowledgeItem> wrapper = new LambdaQueryWrapper<KnowledgeItem>()
.eq(StringUtils.isNotBlank(query.getSetId()), KnowledgeItem::getSetId, query.getSetId()) .eq(StringUtils.isNotBlank(query.getSetId()), KnowledgeItem::getSetId, query.getSetId())
.eq(query.getStatus() != null, KnowledgeItem::getStatus, query.getStatus())
.eq(query.getContentType() != null, KnowledgeItem::getContentType, query.getContentType()) .eq(query.getContentType() != null, KnowledgeItem::getContentType, query.getContentType())
.eq(StringUtils.isNotBlank(query.getDomain()), KnowledgeItem::getDomain, query.getDomain())
.eq(StringUtils.isNotBlank(query.getBusinessLine()), KnowledgeItem::getBusinessLine, query.getBusinessLine())
.eq(StringUtils.isNotBlank(query.getOwner()), KnowledgeItem::getOwner, query.getOwner())
.eq(StringUtils.isNotBlank(query.getSensitivity()), KnowledgeItem::getSensitivity, query.getSensitivity())
.eq(query.getSourceType() != null, KnowledgeItem::getSourceType, query.getSourceType()) .eq(query.getSourceType() != null, KnowledgeItem::getSourceType, query.getSourceType())
.eq(StringUtils.isNotBlank(query.getSourceDatasetId()), KnowledgeItem::getSourceDatasetId, query.getSourceDatasetId()) .eq(StringUtils.isNotBlank(query.getSourceDatasetId()), KnowledgeItem::getSourceDatasetId, query.getSourceDatasetId())
.eq(StringUtils.isNotBlank(query.getSourceFileId()), KnowledgeItem::getSourceFileId, query.getSourceFileId()) .eq(StringUtils.isNotBlank(query.getSourceFileId()), KnowledgeItem::getSourceFileId, query.getSourceFileId());
.ge(query.getValidFrom() != null, KnowledgeItem::getValidFrom, query.getValidFrom())
.le(query.getValidTo() != null, KnowledgeItem::getValidTo, query.getValidTo());
if (StringUtils.isNotBlank(query.getKeyword())) { if (StringUtils.isNotBlank(query.getKeyword())) {
wrapper.and(w -> w.like(KnowledgeItem::getTitle, query.getKeyword()) wrapper.and(w -> w.like(KnowledgeItem::getSourceFileId, query.getKeyword())
.or() .or()
.like(KnowledgeItem::getContent, query.getKeyword())); .like(KnowledgeItem::getContent, query.getKeyword()));
} }
for (String tagName : query.getTags()) {
wrapper.and(w ->
w.apply("tags IS NOT NULL " +
"AND JSON_VALID(tags) = 1 " +
"AND JSON_LENGTH(tags) > 0 " +
"AND JSON_SEARCH(tags, 'one', {0}, NULL, '$[*].name') IS NOT NULL", tagName)
);
}
wrapper.orderByDesc(KnowledgeItem::getCreatedAt); wrapper.orderByDesc(KnowledgeItem::getCreatedAt);
return knowledgeItemMapper.selectPage(page, wrapper); return knowledgeItemMapper.selectPage(page, wrapper);
} }

View File

@@ -22,7 +22,6 @@ public interface KnowledgeConverter {
@Mapping(target = "tags", ignore = true) @Mapping(target = "tags", ignore = true)
KnowledgeSet convertToKnowledgeSet(CreateKnowledgeSetRequest request); KnowledgeSet convertToKnowledgeSet(CreateKnowledgeSetRequest request);
@Mapping(target = "tags", ignore = true)
KnowledgeItem convertToKnowledgeItem(CreateKnowledgeItemRequest request); KnowledgeItem convertToKnowledgeItem(CreateKnowledgeItemRequest request);
KnowledgeSetResponse convertToResponse(KnowledgeSet knowledgeSet); KnowledgeSetResponse convertToResponse(KnowledgeSet knowledgeSet);

View File

@@ -1,18 +1,13 @@
package com.datamate.datamanagement.interfaces.dto; package com.datamate.datamanagement.interfaces.dto;
import com.datamate.datamanagement.common.enums.KnowledgeContentType; import com.datamate.datamanagement.common.enums.KnowledgeContentType;
import com.datamate.datamanagement.common.enums.KnowledgeStatusType;
import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Size;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Getter; import lombok.Getter;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import lombok.Setter; import lombok.Setter;
import java.time.LocalDate;
import java.util.List;
/** /**
* 创建知识条目请求DTO * 创建知识条目请求DTO
*/ */
@@ -21,12 +16,6 @@ import java.util.List;
@NoArgsConstructor @NoArgsConstructor
@AllArgsConstructor @AllArgsConstructor
public class CreateKnowledgeItemRequest { public class CreateKnowledgeItemRequest {
/**
* 标题
*/
@Size(min = 1, max = 200)
@NotBlank(message = "标题不能为空")
private String title;
/** /**
* 内容 * 内容
*/ */
@@ -37,46 +26,6 @@ public class CreateKnowledgeItemRequest {
*/ */
@NotNull(message = "内容类型不能为空") @NotNull(message = "内容类型不能为空")
private KnowledgeContentType contentType; private KnowledgeContentType contentType;
/**
* 状态
*/
private KnowledgeStatusType status;
/**
* 标签列表
*/
private List<String> tags;
/**
* 领域
*/
@Size(max = 100)
private String domain;
/**
* 业务线
*/
@Size(max = 100)
private String businessLine;
/**
* 负责人
*/
@Size(max = 100)
private String owner;
/**
* 有效期开始
*/
private LocalDate validFrom;
/**
* 有效期结束
*/
private LocalDate validTo;
/**
* 敏感级别
*/
@Size(max = 50)
private String sensitivity;
/**
* 扩展元数据
*/
private String metadata;
/** /**
* 来源数据集ID(用于标注同步等场景) * 来源数据集ID(用于标注同步等场景)
*/ */

View File

@@ -1,13 +1,9 @@
package com.datamate.datamanagement.interfaces.dto; package com.datamate.datamanagement.interfaces.dto;
import com.datamate.datamanagement.common.enums.KnowledgeStatusType;
import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotEmpty; import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.Size;
import lombok.Getter; import lombok.Getter;
import lombok.Setter; import lombok.Setter;
import java.time.LocalDate;
import java.util.List; import java.util.List;
/** /**
@@ -26,44 +22,4 @@ public class ImportKnowledgeItemsRequest {
*/ */
@NotEmpty(message = "文件列表不能为空") @NotEmpty(message = "文件列表不能为空")
private List<String> fileIds; private List<String> fileIds;
/**
* 状态
*/
private KnowledgeStatusType status;
/**
* 标签列表
*/
private List<String> tags;
/**
* 领域
*/
@Size(max = 100)
private String domain;
/**
* 业务线
*/
@Size(max = 100)
private String businessLine;
/**
* 负责人
*/
@Size(max = 100)
private String owner;
/**
* 有效期开始
*/
private LocalDate validFrom;
/**
* 有效期结束
*/
private LocalDate validTo;
/**
* 敏感级别
*/
@Size(max = 50)
private String sensitivity;
/**
* 扩展元数据
*/
private String metadata;
} }

View File

@@ -3,15 +3,11 @@ package com.datamate.datamanagement.interfaces.dto;
import com.datamate.common.interfaces.PagingQuery; import com.datamate.common.interfaces.PagingQuery;
import com.datamate.datamanagement.common.enums.KnowledgeContentType; import com.datamate.datamanagement.common.enums.KnowledgeContentType;
import com.datamate.datamanagement.common.enums.KnowledgeSourceType; import com.datamate.datamanagement.common.enums.KnowledgeSourceType;
import com.datamate.datamanagement.common.enums.KnowledgeStatusType;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Getter; import lombok.Getter;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import lombok.Setter; import lombok.Setter;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;
/** /**
* 知识条目分页查询请求 * 知识条目分页查询请求
@@ -26,37 +22,13 @@ public class KnowledgeItemPagingQuery extends PagingQuery {
*/ */
private String setId; private String setId;
/** /**
* 标签名过滤 * 关键词搜索(文件名或内容)
*/
private List<String> tags = new ArrayList<>();
/**
* 关键词搜索(标题或内容)
*/ */
private String keyword; private String keyword;
/**
* 状态过滤
*/
private KnowledgeStatusType status;
/** /**
* 内容类型过滤 * 内容类型过滤
*/ */
private KnowledgeContentType contentType; private KnowledgeContentType contentType;
/**
* 领域
*/
private String domain;
/**
* 业务线
*/
private String businessLine;
/**
* 负责人
*/
private String owner;
/**
* 敏感级别
*/
private String sensitivity;
/** /**
* 来源类型 * 来源类型
*/ */
@@ -69,12 +41,4 @@ public class KnowledgeItemPagingQuery extends PagingQuery {
* 来源文件ID * 来源文件ID
*/ */
private String sourceFileId; private String sourceFileId;
/**
* 有效期开始
*/
private LocalDate validFrom;
/**
* 有效期结束
*/
private LocalDate validTo;
} }

View File

@@ -2,13 +2,10 @@ package com.datamate.datamanagement.interfaces.dto;
import com.datamate.datamanagement.common.enums.KnowledgeContentType; import com.datamate.datamanagement.common.enums.KnowledgeContentType;
import com.datamate.datamanagement.common.enums.KnowledgeSourceType; import com.datamate.datamanagement.common.enums.KnowledgeSourceType;
import com.datamate.datamanagement.common.enums.KnowledgeStatusType;
import lombok.Getter; import lombok.Getter;
import lombok.Setter; import lombok.Setter;
import java.time.LocalDate;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.List;
/** /**
* 知识条目响应DTO * 知识条目响应DTO
@@ -18,21 +15,11 @@ import java.util.List;
public class KnowledgeItemResponse { public class KnowledgeItemResponse {
private String id; private String id;
private String setId; private String setId;
private String title;
private String content; private String content;
private KnowledgeContentType contentType; private KnowledgeContentType contentType;
private KnowledgeStatusType status;
private List<TagResponse> tags;
private String domain;
private String businessLine;
private String owner;
private LocalDate validFrom;
private LocalDate validTo;
private KnowledgeSourceType sourceType; private KnowledgeSourceType sourceType;
private String sensitivity;
private String sourceDatasetId; private String sourceDatasetId;
private String sourceFileId; private String sourceFileId;
private String metadata;
private LocalDateTime createdAt; private LocalDateTime createdAt;
private LocalDateTime updatedAt; private LocalDateTime updatedAt;
private String createdBy; private String createdBy;

View File

@@ -1,25 +1,15 @@
package com.datamate.datamanagement.interfaces.dto; package com.datamate.datamanagement.interfaces.dto;
import com.datamate.datamanagement.common.enums.KnowledgeContentType; import com.datamate.datamanagement.common.enums.KnowledgeContentType;
import com.datamate.datamanagement.common.enums.KnowledgeStatusType;
import jakarta.validation.constraints.Size;
import lombok.Getter; import lombok.Getter;
import lombok.Setter; import lombok.Setter;
import java.time.LocalDate;
import java.util.List;
/** /**
* 更新知识条目请求DTO * 更新知识条目请求DTO
*/ */
@Getter @Getter
@Setter @Setter
public class UpdateKnowledgeItemRequest { public class UpdateKnowledgeItemRequest {
/**
* 标题
*/
@Size(min = 1, max = 200)
private String title;
/** /**
* 内容 * 内容
*/ */
@@ -28,44 +18,4 @@ public class UpdateKnowledgeItemRequest {
* 内容类型 * 内容类型
*/ */
private KnowledgeContentType contentType; private KnowledgeContentType contentType;
/**
* 状态
*/
private KnowledgeStatusType status;
/**
* 标签列表
*/
private List<String> tags;
/**
* 领域
*/
@Size(max = 100)
private String domain;
/**
* 业务线
*/
@Size(max = 100)
private String businessLine;
/**
* 负责人
*/
@Size(max = 100)
private String owner;
/**
* 有效期开始
*/
private LocalDate validFrom;
/**
* 有效期结束
*/
private LocalDate validTo;
/**
* 敏感级别
*/
@Size(max = 50)
private String sensitivity;
/**
* 扩展元数据
*/
private String metadata;
} }

View File

@@ -1,14 +1,9 @@
package com.datamate.datamanagement.interfaces.dto; package com.datamate.datamanagement.interfaces.dto;
import com.datamate.datamanagement.common.enums.KnowledgeStatusType;
import jakarta.validation.constraints.NotEmpty; import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.Size;
import lombok.Getter; import lombok.Getter;
import lombok.Setter; import lombok.Setter;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
import java.time.LocalDate;
import java.util.List; import java.util.List;
/** /**
@@ -22,51 +17,4 @@ public class UploadKnowledgeItemsRequest {
*/ */
@NotEmpty(message = "文件列表不能为空") @NotEmpty(message = "文件列表不能为空")
private List<MultipartFile> files; private List<MultipartFile> files;
/**
* 标题(单文件时可指定)
*/
@Size(min = 1, max = 200)
private String title;
/**
* 状态
*/
private KnowledgeStatusType status;
/**
* 标签列表
*/
private List<String> tags;
/**
* 领域
*/
@Size(max = 100)
private String domain;
/**
* 业务线
*/
@Size(max = 100)
private String businessLine;
/**
* 负责人
*/
@Size(max = 100)
private String owner;
/**
* 有效期开始
*/
@DateTimeFormat(iso = DateTimeFormat.ISO.DATE)
private LocalDate validFrom;
/**
* 有效期结束
*/
@DateTimeFormat(iso = DateTimeFormat.ISO.DATE)
private LocalDate validTo;
/**
* 敏感级别
*/
@Size(max = 50)
private String sensitivity;
/**
* 扩展元数据
*/
private String metadata;
} }