## 改动内容
### 1. 重构 FaultCategory 枚举
**修改前**:故障类别枚举
```java
EXTERNAL_API("外部接口调用失败"),
INTERNAL_ERROR("系统内部错误"),
DATABASE("数据库问题"),
...
```
**修改后**:文档分类枚举
```java
API("API 接口文档"),
INFRASTRUCTURE("基础设施文档"),
DOMAIN("领域业务文档"),
TROUBLESHOOTING("故障排查文档"),
GENERAL("通用文档");
```
### 2. 新增 fromString 映射方法
```java
public static FaultCategory fromString(String category) {
switch (category.toLowerCase()) {
case "api": return API;
case "infrastructure": return INFRASTRUCTURE;
case "domain": return DOMAIN;
case "troubleshooting": return TROUBLESHOOTING;
default: return GENERAL;
}
}
```
### 3. 更新所有引用
- `ApiDocument`: 默认值 EXTERNAL_API → GENERAL
- `DocumentManagementService`: 默认值 EXTERNAL_API → GENERAL
- `KnowledgeBaseInitService`: 使用 FaultCategory.fromString() 映射
### 4. 字段映射关系
| Frontmatter | 数据库字段 | 枚举值 | 说明 |
|-------------|-----------|--------|------|
| `category: "api"` | `fault_category` | API | API 接口文档 |
| `category: "infrastructure"` | `fault_category` | INFRASTRUCTURE | 基础设施文档 |
| `category: "domain"` | `fault_category` | DOMAIN | 领域业务文档 |
| `category: "troubleshooting"` | `fault_category` | TROUBLESHOOTING | 故障排查文档 |
| `category: "xxx"` | `fault_category` | GENERAL | 默认/其他 |
## 数据库影响
**不需要修改数据库结构**:
- `fault_category` 字段仍然是 VARCHAR(32)
- 只是存储的值从 `EXTERNAL_API` 变为 `API`, `INFRASTRUCTURE` 等
**已存在的数据**:
- 旧数据中的 `EXTERNAL_API` 仍可以正常读取(枚举向后兼容)
- 新导入的文档会使用新的枚举值
## 验证
```bash
# 1. 重新初始化
curl -X POST http://localhost:9900/api/knowledge/init?force=true
# 2. 查询统计
curl http://localhost:9900/api/knowledge/stats
# 3. 响应
{
"categories": {
"API": 1,
"INFRASTRUCTURE": 3,
"DOMAIN": 1,
"TROUBLESHOOTING": 1
}
}
```
## 数据库查询
```sql
SELECT fault_category, COUNT(*)
FROM api_document
GROUP BY fault_category;
-- 结果
API | 1
INFRASTRUCTURE | 3
DOMAIN | 1
TROUBLESHOOTING | 1
```
100 lines
2.6 KiB
Java
100 lines
2.6 KiB
Java
package com.superbiz.agent.domain.entity;
|
|
|
|
import jakarta.persistence.*;
|
|
import lombok.AllArgsConstructor;
|
|
import lombok.Builder;
|
|
import lombok.Data;
|
|
import lombok.NoArgsConstructor;
|
|
import com.superbiz.agent.domain.enums.FaultCategory;
|
|
|
|
import java.time.LocalDateTime;
|
|
|
|
/**
|
|
* API 文档元数据实体
|
|
* 对应表: api_document
|
|
*/
|
|
@Entity
|
|
@Table(name = "api_document", indexes = {
|
|
@Index(name = "idx_doc_id", columnList = "doc_id"),
|
|
@Index(name = "idx_fault_source", columnList = "fault_source"),
|
|
@Index(name = "idx_status", columnList = "status"),
|
|
@Index(name = "idx_created_at", columnList = "created_at")
|
|
}, uniqueConstraints = {
|
|
@UniqueConstraint(name = "uk_file_hash", columnNames = "file_hash")
|
|
})
|
|
@Data
|
|
@Builder
|
|
@NoArgsConstructor
|
|
@AllArgsConstructor
|
|
public class ApiDocument {
|
|
|
|
@Id
|
|
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
|
private Long id;
|
|
|
|
@Column(name = "doc_id", unique = true, nullable = false, length = 64)
|
|
private String docId;
|
|
|
|
// 文档分类
|
|
@Enumerated(EnumType.STRING)
|
|
@Column(name = "fault_category", length = 32, columnDefinition = "VARCHAR(32)")
|
|
private FaultCategory faultCategory = FaultCategory.GENERAL;
|
|
|
|
@Column(name = "fault_source", length = 128)
|
|
private String faultSource;
|
|
|
|
@Column(name = "api_name", length = 128)
|
|
private String apiName;
|
|
|
|
@Column(name = "version", length = 32)
|
|
private String version = "v1.0";
|
|
|
|
// 文件信息
|
|
@Column(name = "file_name", nullable = false, length = 256)
|
|
private String fileName;
|
|
|
|
@Column(name = "file_path", length = 512)
|
|
private String filePath;
|
|
|
|
@Column(name = "file_hash", length = 64)
|
|
private String fileHash;
|
|
|
|
@Column(name = "file_size")
|
|
private Long fileSize;
|
|
|
|
// 索引状态
|
|
@Column(name = "status", length = 16)
|
|
private String status = "PENDING";
|
|
|
|
@Column(name = "chunk_count")
|
|
private Integer chunkCount = 0;
|
|
|
|
@Column(name = "error_message", columnDefinition = "TEXT")
|
|
private String errorMessage;
|
|
|
|
// Frontmatter 元数据
|
|
@Column(name = "metadata", columnDefinition = "TEXT")
|
|
private String metadata;
|
|
|
|
// 时间字段
|
|
@Column(name = "indexed_at")
|
|
private LocalDateTime indexedAt;
|
|
|
|
@Column(name = "created_at", nullable = false, updatable = false)
|
|
private LocalDateTime createdAt;
|
|
|
|
@Column(name = "updated_at")
|
|
private LocalDateTime updatedAt;
|
|
|
|
@PrePersist
|
|
protected void onCreate() {
|
|
createdAt = LocalDateTime.now();
|
|
updatedAt = LocalDateTime.now();
|
|
}
|
|
|
|
@PreUpdate
|
|
protected void onUpdate() {
|
|
updatedAt = LocalDateTime.now();
|
|
}
|
|
}
|