版本: 1.0.0 日期: 2026-01-22 作者: AI Assistant (Claude Opus 4.5) 关联文档: 数据提取规则系统设计.md
本文档规划「数据提取规则系统」的代码实现阶段,共分为 11 个阶段,按依赖关系和优先级排序。
| 阶段 | 名称 | 主要产出 | 预估工作量 | 状态 |
|---|---|---|---|---|
| 1 | 基础设施搭建 | extract-service 模块框架、数据库表 | 小 | ✅ 已完成 |
| 2 | 核心实体与 Repository | 实体类、数据访问层 | 小 | ✅ 已完成 |
| 3 | 项目与文档管理 | Project/SourceDocument 的 CRUD API | 中 | ✅ 已完成 |
| 4 | 提取规则配置 | ExtractRule 的配置与管理 API | 中 | ⏳ 待开发 |
| 5 | 内容定位服务 | 按页码/章节/元素定位文档内容 | 中 | ⏳ 待开发 |
| 6 | AI 提取服务 | AI 字段提取、内容总结能力 | 中 | ⏳ 待开发 |
| 7 | 提取执行引擎 | 规则执行核心流程 | 大 | ⏳ 待开发 |
| 8 | 批量执行与异步任务 | 批量执行、进度跟踪 | 中 | ⏳ 待开发 |
| 9 | 结果管理与人工干预 | 结果确认、修正 API | 小 | ⏳ 待开发 |
| 10 | 规则模板功能 | 模板保存与应用 | 小 | ⏳ 待开发 |
| 11 | 集成与扩展 | 系统集成、文档完善 | 中 | ⏳ 待开发 |
当前进度: 3/11 阶段完成 (27%)
第一阶段(基础设施)
│
▼
第二阶段(实体与Repository)
│
├────────────────────────────────────────┐
│ │
▼ ▼
第三阶段(项目与文档管理) 第五阶段(内容定位服务)
│ │
▼ │
第四阶段(提取规则配置) │
│ │
├──────► 第十阶段(规则模板) │
│ │
│ 第六阶段(AI提取服务)◄──────────┤
│ │ │
│ ▼ │
└───────► 第七阶段(提取执行引擎)◄───────┘
│
┌──────────┴──────────┐
▼ ▼
第八阶段(批量执行) 第九阶段(结果管理)
│ │
└──────────┬──────────┘
▼
第十一阶段(集成与扩展)
创建新模块 extract-service 的基础框架,确保服务可以启动并注册到服务中心。
创建 Maven 模块
backend/ 下创建 extract-service 目录pom.xml,依赖 common、mybatis-plus、nacos、openfeign 等创建启动类
ExtractServiceApplication.java@EnableFeignClients、@MapperScan 等注解配置文件
application.properties 或 application.yml网关路由
gateway-service 的路由配置中添加 extract-service 的路由规则/api/v1/extract/**数据库表创建
✅ 已完成 (2026-01-22)
无外部依赖,可独立完成。
完成数据访问层,为上层业务逻辑提供数据操作能力。
创建实体类(5 个)
Project.java - 项目实体SourceDocument.java - 来源文档实体ExtractRule.java - 提取规则实体ExtractResult.java - 提取结果实体RuleTemplate.java - 规则模板实体创建 Repository 接口(5 个)
BaseMapper<T>@Select 注解或 XML)常用查询方法
| Repository | 方法 | | ---------- | ---- | | ProjectRepository | findByUserId, findByStatus | | SourceDocumentRepository | findByProjectId, findByDocumentId | | ExtractRuleRepository | findByProjectId, findByStatus, findByTargetFieldKey | | ExtractResultRepository | findByRuleId, findByProjectId, findByStatus | | RuleTemplateRepository | findByUserId, findPublicTemplates |
来源配置类:
SourceConfig.java - 基类/接口DocumentSourceConfig.java - 文档来源配置SelfReferenceSourceConfig.java - 自引用来源配置FixedSourceConfig.java - 固定内容配置ManualSourceConfig.java - 手动输入配置LocationConfig.java - 定位配置TransformConfig.java - 转换配置提取配置类:
ExtractConfigBase.java - 基类/接口DirectExtractConfig.java - 直接提取配置AIExtractConfig.java - AI 提取配置AISummarizeConfig.java - AI 总结配置OcrExtractConfig.java - OCR 配置✅ 已完成 (2026-01-22)
实现概要:
- 5 个实体类:Project, SourceDocument, ExtractRule, ExtractResult, RuleTemplate
- 5 个 Repository 接口,含丰富的自定义查询方法
- 10 个配置 DTO 类,覆盖所有来源类型和提取类型
依赖第一阶段完成。
实现项目和来源文档的完整 CRUD 功能,支持用户创建项目并关联文档。
ProjectService
create(userId, request) - 创建项目getById(id) - 获取项目详情listByUserId(userId, pageRequest) - 分页查询用户的项目update(id, request) - 更新项目delete(id) - 删除项目(级联删除关联数据)archive(id) - 归档项目getProjectWithDocuments(id) - 获取项目详情(含来源文档列表)SourceDocumentService
add(projectId, request) - 添加来源文档listByProjectId(projectId) - 获取项目的来源文档列表update(id, request) - 更新来源文档信息remove(id) - 移除来源文档batchAdd(projectId, requests) - 批量添加来源文档reorder(projectId, orders) - 调整文档顺序Controller 层
ProjectController - 项目管理 APISourceDocumentController - 来源文档管理 API请求/响应 DTO
CreateProjectRequest / UpdateProjectRequestAddSourceDocumentRequest / BatchAddSourceDocumentsRequestProjectDetailResponse / ProjectListResponseSourceDocumentResponseFeign Client 集成
DocumentServiceClient 接口事件监听
DocumentParsedEvent 事件✅ 已完成 (2026-01-22)
实现概要:
- 请求 DTO 6个:CreateProjectRequest, UpdateProjectRequest, AddSourceDocumentRequest, BatchAddSourceDocumentsRequest, UpdateSourceDocumentRequest, ReorderSourceDocumentsRequest
- 响应 DTO 3个:ProjectDetailResponse, ProjectListResponse, SourceDocumentResponse
- ProjectService:完整 CRUD + 分页 + 统计 + 权限检查
- SourceDocumentService:完整 CRUD + 批量操作 + 排序
- ProjectController:8 个 API 接口
- SourceDocumentController:7 个 API 接口
document-service 提供 Feign 接口实现规则的配置与管理,支持多种来源类型和提取类型的配置。
ExtractRuleService
create(projectId, request) - 创建规则getById(id) - 获取规则详情listByProjectId(projectId) - 获取项目的规则列表(按 ruleIndex 排序)update(id, request) - 更新规则delete(id) - 删除规则batchCreate(projectId, requests) - 批量创建规则duplicate(id) - 复制规则reorder(projectId, orders) - 调整规则顺序validateConfig(rule) - 校验规则配置配置校验逻辑
| 校验项 | 说明 | | ------ | ---- | | sourceType 与 sourceConfig 匹配 | document 类型必须有 sourceDocId 和 location | | extractType 与 extractConfig 匹配 | ai_extract 类型必须有 targetDescription | | self_reference 循环引用检测 | A 引用 B,B 引用 A 的情况 | | 必填字段校验 | targetFieldKey、targetFieldName 不能为空 | | targetFieldKey 唯一性 | 同一项目内 targetFieldKey 不能重复 |
依赖分析
analyzeDependencies(projectId) - 分析规则间的依赖关系Controller 层
ExtractRuleController请求/响应 DTO
CreateRuleRequest / UpdateRuleRequestBatchCreateRulesRequestReorderRulesRequestRuleDetailResponse / RuleListResponseDependencyAnalysisResponse依赖第三阶段完成。
实现从文档中定位和提取内容的能力,支持多种定位方式。
ContentLocatorService 接口
locateElements(documentId, location) -> List<DocumentElement>
locateContent(documentId, location) -> String
locateByPage(documentId, pageStart, pageEnd, keyword) -> List<DocumentElement>
locateByChapter(documentId, chapterPath, chapterTitle) -> List<DocumentElement>
locateByElementIds(documentId, elementIds) -> List<DocumentElement>
locateExcelCell(documentId, sheetName, cellRef) -> String
按页码定位实现
按章节定位实现
["3", "5", "3", "3"] 表示 3.5.3.3)按元素ID定位实现
Excel 定位实现
变电站扩建页 / A1:C10)1.5.1 表示某种内部编号)内容拼接
Feign Client
DocumentElementServiceClientParseServiceClient(用于 Excel 解析)document-service 的 DocumentElementServiceparse-service 的 Excel 解析能力封装 AI 提取和总结功能,提供结构化的 AI 调用接口。
AIExtractService 接口
extract(content, config) -> AIExtractResult
summarize(content, config, context) -> AISummarizeResult
AI 字段提取实现
AIExtractConfig 构建 PromptDeepSeekClient.complete() 执行AI 内容总结实现
AISummarizeConfig 构建 PromptDeepSeekClient.complete() 执行Prompt 模板管理
字段提取 Prompt 模板:
你是一个专业的文档信息提取助手。请从以下文档内容中提取指定的信息。
## 提取目标
{targetDescription}
## 字段类型
{fieldType}
## 预期格式
{expectedFormat}
## 示例
{examples}
## 文档内容
{content}
## 输出要求
请直接输出提取的值,不要包含任何解释。
内容总结 Prompt 模板:
你是一个专业的工程报告撰写助手。请对以下内容进行总结/提炼。
## 总结要求
{summarizePrompt}
## 关注维度
{focusPoints}
## 总结规则
{rules}
## 输出风格
{style}
## 字数限制
{maxLength} 字以内
## 原文内容
{content}
错误处理与重试
结果数据结构
AIExtractResult: value, confidence, reasoningAISummarizeResult: summary, keyPointsai-service 的 DeepSeekClient实现规则执行的核心流程,是整个系统的核心模块。
Executor 策略模式
interface ExtractExecutor {
boolean supports(String extractType);
ExtractResult execute(ExtractRule rule, String sourceContent);
}
实现类:
DirectExtractExecutor - 直接提取AIExtractExecutor - AI 字段提取AISummarizeExecutor - AI 总结提炼OcrExtractExecutor - OCR 识别(可选,后续实现)DirectExtractExecutor 实现
DirectExtractConfig 处理内容AIExtractExecutor 实现
AISummarizeExecutor 实现
ExtractExecuteService 核心流程
executeRule(ruleId):
1. 获取规则配置 ExtractRule
2. 根据 sourceType 获取来源内容
- document: 调用 ContentLocatorService
- self_reference: 查询已提取的字段值
- fixed: 返回 fixedContent
- manual: 返回 defaultValue 或标记为待填写
3. 选择对应的 Executor 执行提取
4. 创建 ExtractResult 记录
- 保存提取值
- 保存来源追溯信息(sourceContent, sourceLocation)
5. 更新 ExtractRule 的 status 和 extracted_value
6. 返回结果
self_reference 处理
来源追溯信息
{
"documentId": "doc_001",
"documentAlias": "可研批复",
"locationType": "page",
"pageStart": 1,
"pageEnd": 2,
"elementIds": ["elem_001", "elem_002"],
"textPreview": "本项目建设必要性主要体现在..."
}
状态管理
支持批量执行规则和后台异步任务,提供进度跟踪能力。
规则依赖排序
批量执行实现
executeRules(ruleIds):
1. 获取所有规则
2. 依赖排序
3. 按顺序执行(或并行执行同层级规则)
4. 返回所有结果
executeProject(projectId):
1. 获取项目所有规则
2. 调用 executeRules
异步执行实现
@Async 或线程池执行进度跟踪
extract_task:{taskId} -> {total, completed, failed, currentRule, status}Controller 层
ExtractExecuteController/projects/{projectId}/execute - 执行项目/rules/{ruleId}/execute - 执行单条/rules/batch-execute - 批量执行/rules/{ruleId}/preview - 预览/rules/{ruleId}/retry - 重试/tasks/{taskId}/progress - 获取进度预览功能
重试功能
依赖第七阶段完成。
支持结果查看、确认、修正等人工干预操作。
ExtractResultService
listByProjectId(projectId) - 获取项目所有结果listByRuleId(ruleId) - 获取规则的结果历史getById(id) - 获取结果详情confirm(id, userId) - 确认结果reject(id, userId, reason) - 拒绝结果modify(id, modifiedValue, userId) - 修正结果batchConfirm(projectId, userId) - 批量确认所有待确认结果状态流转
extracted ──► confirmed(确认)
──► rejected(拒绝)
──► modified(修正)
Controller 层
ExtractResultController/projects/{projectId}/results - 项目结果列表/rules/{ruleId}/results - 规则结果历史/results/{id}/confirm - 确认/results/{id}/reject - 拒绝/results/{id}/modify - 修正/projects/{projectId}/results/confirm-all - 批量确认响应 DTO
ExtractResultResponse - 包含来源追溯信息ResultListResponse - 结果列表(含统计)统计信息
依赖第七阶段完成。
支持规则配置的保存和复用,提高配置效率。
RuleTemplateService
create(userId, request) - 创建模板getById(id) - 获取模板详情listByUserId(userId) - 用户的模板列表listPublic() - 公开模板列表delete(id) - 删除模板saveFromProject(projectId, name, description) - 从项目保存为模板applyToProject(templateId, projectId) - 应用模板到项目保存为模板
应用模板
Controller 层
RuleTemplateController/templates - 创建模板/templates - 模板列表/templates/{id} - 模板详情/templates/{id} - 删除模板/templates/{id}/apply - 应用模板/projects/{projectId}/save-as-template - 保存为模板模板分享
依赖第四阶段完成,可与后续阶段并行开发。
完善系统集成、错误处理、日志和文档。
与 DataSourceService 集成
registerAsDataSource(resultId, userId) -> DataSource错误处理完善
ExtractErrorCodeExtractException| 错误码 | 说明 | | ------ | ---- | | EXTRACT_001 | 项目不存在 | | EXTRACT_002 | 来源文档不存在 | | EXTRACT_003 | 规则配置无效 | | EXTRACT_004 | 文档未解析完成 | | EXTRACT_005 | 内容定位失败 | | EXTRACT_006 | AI 提取失败 | | EXTRACT_007 | 引用的字段未提取 | | EXTRACT_008 | 循环引用 |
日志完善
API 文档
性能优化
单元测试
集成测试
依赖前面所有阶段完成。
目标:跑通「创建项目 → 添加文档 → 配置规则 → 直接提取 → 查看结果」的完整流程。
第一阶段 → 第二阶段 → 第三阶段 → 第四阶段 → 第五阶段 →
第七阶段(仅 DirectExtractExecutor)→ 第九阶段
预计产出:
目标:添加 AI 提取能力
第六阶段 + 第七阶段完善(AIExtractExecutor、AISummarizeExecutor)
预计产出:
目标:提升效率和体验
第八阶段(批量执行、异步任务)+ 第十阶段(规则模板)
预计产出:
目标:系统完善
第十一阶段(集成与扩展)
预计产出:
| 风险 | 影响 | 缓解措施 |
|---|---|---|
| AI 提取准确率不稳定 | 提取结果需要大量人工修正 | 优化 Prompt、提供人工修正功能 |
| 文档解析不完整 | 章节定位失败 | 增强解析能力、支持手动选择元素 |
| 大文档性能问题 | 执行超时 | 分批处理、异步执行 |
| 依赖 | 风险 | 缓解措施 |
|---|---|---|
| document-service | 接口变更 | 定义清晰的 Feign 接口契约 |
| DeepSeekClient | API 不稳定 | 重试机制、降级方案 |
| parse-service | Excel 解析能力不足 | 按需扩展解析能力 |
数据库事务
并发控制
数据清理
安全性
backend/extract-service/
├── pom.xml
└── src/main/java/com/lingyue/extract/
├── ExtractServiceApplication.java
├── config/
│ ├── ExtractConfig.java
│ └── FeignConfig.java
├── controller/
│ ├── ProjectController.java
│ ├── SourceDocumentController.java
│ ├── ExtractRuleController.java
│ ├── ExtractExecuteController.java
│ ├── ExtractResultController.java
│ └── RuleTemplateController.java
├── dto/
│ ├── request/
│ │ ├── CreateProjectRequest.java
│ │ ├── UpdateProjectRequest.java
│ │ ├── AddSourceDocumentRequest.java
│ │ ├── CreateRuleRequest.java
│ │ ├── UpdateRuleRequest.java
│ │ ├── BatchCreateRulesRequest.java
│ │ ├── ExecuteRulesRequest.java
│ │ ├── ConfirmResultRequest.java
│ │ ├── ModifyResultRequest.java
│ │ └── SaveAsTemplateRequest.java
│ ├── response/
│ │ ├── ProjectDetailResponse.java
│ │ ├── ProjectListResponse.java
│ │ ├── SourceDocumentResponse.java
│ │ ├── RuleDetailResponse.java
│ │ ├── RuleListResponse.java
│ │ ├── ExtractResultResponse.java
│ │ ├── ResultListResponse.java
│ │ ├── ExecuteProgressResponse.java
│ │ ├── PreviewResponse.java
│ │ └── TemplateDetailResponse.java
│ └── config/
│ ├── SourceConfig.java
│ ├── DocumentSourceConfig.java
│ ├── SelfReferenceSourceConfig.java
│ ├── FixedSourceConfig.java
│ ├── ManualSourceConfig.java
│ ├── LocationConfig.java
│ ├── TransformConfig.java
│ ├── ExtractConfigBase.java
│ ├── DirectExtractConfig.java
│ ├── AIExtractConfig.java
│ ├── AISummarizeConfig.java
│ └── OcrExtractConfig.java
├── entity/
│ ├── Project.java
│ ├── SourceDocument.java
│ ├── ExtractRule.java
│ ├── ExtractResult.java
│ └── RuleTemplate.java
├── repository/
│ ├── ProjectRepository.java
│ ├── SourceDocumentRepository.java
│ ├── ExtractRuleRepository.java
│ ├── ExtractResultRepository.java
│ └── RuleTemplateRepository.java
├── service/
│ ├── ProjectService.java
│ ├── SourceDocumentService.java
│ ├── ExtractRuleService.java
│ ├── ExtractExecuteService.java
│ ├── ExtractResultService.java
│ ├── ContentLocatorService.java
│ ├── AIExtractService.java
│ └── RuleTemplateService.java
├── executor/
│ ├── ExtractExecutor.java
│ ├── DirectExtractExecutor.java
│ ├── AIExtractExecutor.java
│ ├── AISummarizeExecutor.java
│ └── OcrExtractExecutor.java
├── client/
│ ├── DocumentServiceClient.java
│ ├── DocumentElementServiceClient.java
│ └── ParseServiceClient.java
├── exception/
│ ├── ExtractException.java
│ ├── ExtractErrorCode.java
│ └── ExtractExceptionHandler.java
└── listener/
└── DocumentParsedEventListener.java
文档结束