# ancient_ocr
**Repository Path**: votouch/ancient_ocr
## Basic Information
- **Project Name**: ancient_ocr
- **Description**: 一个专注于**竖排古籍**识别的OCR数字化平台,支持刻本、抄本、拓本等多种古籍类型的OCR识别、人工校对、字粒级定位和成果导出。
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2026-03-20
- **Last Updated**: 2026-05-16
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# 古籍OCR平台 - 功能模块与数据表对应关系
# 古籍OCR数字化平台
## 📝 项目简介
一个专注于**竖排古籍**识别的OCR数字化平台,支持刻本、抄本、拓本等多种古籍类型的OCR识别、人工校对、字粒级定位和成果导出。
## 🎯 核心功能
- **项目管理**:古籍元数据管理、进度跟踪
- **文档上传**:支持PDF/图片批量上传,**分片上传、断点续传、秒传(MD5去重)**
- **OCR识别**:基于PaddleOCR的竖排文字识别,**支持手动触发OCR任务**
- **版面分析**:自动识别标题、正文、表格等区域
- **字粒定位**:**每个字的精确坐标**,支持竖排阅读顺序
- **句子标记**:人工标记完整句子,获取句子外框
- **人工校对**:图文对照编辑、版本管理、批注系统
- **成果导出**:双层PDF、TXT、XML/TEI、Markdown
- **全文检索**:基于Meilisearch的快速检索
## 📊 项目进度(更新日期:2026-04-24)
| 模块 | 完成率 | 状态 |
|------|--------|------|
| **Java 后端** | **55%** | 🟡 进行中 |
| **Vue 前端** | **55%** | 🟡 进行中 |
| **Python OCR** | **55%** | 🟡 进行中 |
| **整体项目** | **55%** | 🟡 进行中 |
### 最近完成(2026-03-22 → 2026-04-24)
- ✅ OCR任务队列 + 调度器(Redis Sorted Set + 优先级调度)
- ✅ Python OCR服务回调对接(成功/失败/进度回调完整链路)
- ✅ OCR结果存储与查询(rawContent含textBlocks,前端可展示)
- ✅ 页面查看器(图片缩放/旋转/翻页/缩略图导航)
- ✅ OCR结果前端展示(行文本+置信度+OCR框覆盖层)
- ✅ OCR任务监控页面(队列统计+任务列表+筛选+挂起任务清空)
- ✅ 页面状态管理(OCR状态/校对状态/备注更新)
- ✅ 回调后自动更新page状态/置信度/字符统计
- ✅ 回调后自动更新document完成状态
### 核心未完成(按表结构流程顺序)
```
当前已通链路:project → document → page → ocr_task → ocr_result(前端可展示)
↓
待实现链路: ocr_result → text_region → text_line → character_coordinate
↓ ↓
sentence_marker correction → version_history
↓
annotation
```
| 优先级 | 待实现环节 | 涉及表 | 说明 |
|--------|-----------|--------|------|
| **P0** | Python端版面分析→text_region写入 | text_region | Python识别结果需解析并写入区域表 |
| **P0** | Python端行级识别→text_line写入 | text_line | 行级数据写入text_line(依赖text_region外键) |
| **P0** | Python端字粒切分→char_detail写入 | char_detail, character_coordinate | 从行文本切分单字坐标 |
| **P0** | Java端版面分析Mapper/Service | text_region, text_line | 缺Mapper/Service/Controller |
| **P0** | Java端字粒定位Mapper/Service | character_coordinate, text_column | 缺Mapper/Service/Controller |
| **P0** | 前端Canvas字粒高亮/编辑 | character_coordinate | 校对工作台核心 |
| **P1** | 校对记录管理 | correction | 缺Service/Controller |
| **P1** | 版本管理 | version_history | 缺Service/Controller |
| **P1** | 句子标记 | sentence_marker | 缺Service/Controller + 前端拖选交互 |
| **P1** | 批注系统 | annotation | 缺Service/Controller + 前端UI |
| **P1** | WebSocket实时推送 | - | 任务进度实时通知 |
| **P2** | 成果导出 | export_record | TXT/PDF/XML/JSON导出 |
| **P2** | 全文检索 | search_cache | Meilisearch数据同步 |
| **P2** | 表格结构识别 | table_structure | 古籍表格还原 |
## 🏗️ 技术架构
### 后端
- **Java 17** + Spring Boot 2.7.18
- **MySQL 8.0** + MyBatis-Plus
- **Redis** + 任务队列/缓存
- **Meilisearch** + 全文检索(待集成)
### 前端
- **Vue 3** + Ant Design Vue
- **Canvas** + 古籍原图渲染
- **WebSocket** + 实时进度(待集成)
### OCR引擎
- **Python 3.9** + FastAPI
- **PaddleOCR 3.4** + 竖排文字识别
- **PaddlePaddle-GPU 3.0** + GPU加速
ancient-ocr-platform/
├── backend/ # Java后端
│ ├── src/
│ ├── pom.xml
│ └── README.md
├── frontend/ # Vue前端
│ ├── src/
│ ├── package.json
│ └── README.md
├── python-ocr/ # Python OCR服务
│ ├── app/
│ ├── requirements.txt
│ └── README.md
├── docs/ # 文档
│ ├── sql/
│ │ └── ancient_ocr_schema.sql
│ ├── api/
│ │ └── api_document.md
│ └── images/
└── README.md
## 📦 快速开始
### 环境要求
- JDK 17+
- MySQL 8.0+
- Redis 7.0+
- Python 3.9+
- Meilisearch 1.3+
- Maven 3.8+
## 一、功能模块与数据表总览
| 功能模块 | 支撑数据表 |
|---------|----------|
| 项目管理 | project |
| 文档管理 | document, page |
| OCR识别 | ocr_task, ocr_task_detail, ocr_param_template
ocr_result, task_log |
| 版面分析 | text_region, text_line, table_structure |
| 字粒定位 | character_coordinate, text_column |
| 句子标记 | sentence_marker |
| 人工校对 | correction, version_history, annotation |
| 成果导出 | export_record |
| 全文检索 | search_cache (同步到Meilisearch) |
## 二、各功能模块详细对应关系
核心关联链 :project → document → page → ocr_result → text_region → text_line → char_detail
校对闭环 :char_detail → correction → version_history → annotation
### 1. 项目管理模块
| 功能点 | 操作 | 涉及表 | 字段说明 |
|-------|-----|-------|---------|
| 创建项目 | 新增项目记录 | project | 所有项目信息字段 |
| 编辑项目 | 更新项目信息 | project | name, dynasty, author等 |
| 删除项目 | 逻辑/物理删除 | project | 级联删除关联的document,page |
| 项目列表 | 查询项目 | project | 分页、排序、筛选 |
| 项目详情 | 查询单个项目 | project | 关联统计(总页数、进度) |
| 项目进度 | 计算进度 | project | processed_pages, total_pages |
| 项目统计 | 聚合统计 | project | 按朝代、类型统计 |
**核心SQL:**
```sql
-- 项目列表(带进度)
SELECT p.*,
COUNT(DISTINCT doc.id) as document_count,
SUM(doc.page_count) as total_pages,
SUM(doc.processed_count) as processed_pages,
(SUM(doc.processed_count)/SUM(doc.page_count))*100 as progress
FROM project p
LEFT JOIN document doc ON p.id = doc.project_id
GROUP BY p.id;
```
### 2. 文档管理模块
| 功能点 | 操作 | 涉及表 | 字段说明 |
|-------|-----|-------|---------|
| 上传文档 | 新增文档记录 | document | file_name, file_path, md5 |
| 批量上传 | 多条文档记录 | document | 同上 |
| 文档转图片 | 生成页面记录 | page | 为每页生成一条记录 |
| 文档列表 | 查询文档 | document | 按项目筛选 |
| 文档详情 | 查询文档 | document + page | 文档信息+页面列表 |
| 删除文档 | 删除文档 | document | 级联删除关联page |
| 文档状态 | 更新状态 | document | status, processed_count |
**页面生成逻辑:**
```java
// PDF上传后,为每一页创建page记录
for (int i = 1; i <= pageCount; i++) {
Page page = new Page();
page.setDocumentId(docId);
page.setProjectId(projectId);
page.setPageNum(i);
page.setImagePath("/storage/project_1/page_001.jpg");
page.setStatus(0); // 待识别
pageRepository.save(page);
}
```
### 3. OCR识别模块
#### 3.1 OCR任务调度
| 功能点 | 操作 | 涉及表 | 字段说明 |
|-------|-----|-------|---------|
| 提交任务 | 创建OCR任务 | ocr_task | task_no, project_id, task_type |
| 批量提交 | 创建批次任务 | ocr_task | 相同batch_no |
| 任务队列 | 查询待处理任务 | ocr_task | status=0, 按priority排序 |
| 领取任务 | 更新任务状态 | ocr_task | status=2, start_time |
| 完成任务 | 更新任务状态 | ocr_task | status=3, end_time, result_summary |
| 任务失败 | 记录失败 | ocr_task | status=4, error_msg |
| 重试任务 | 更新重试次数 | ocr_task | retry_count+1 |
| 任务监控 | 查询任务状态 | ocr_task + task_log | 任务详情+日志 |
#### 3.2 OCR参数管理
| 功能点 | 操作 | 涉及表 | 字段说明 |
|-------|-----|-------|---------|
| 参数模板 | 增删改查 | ocr_param_template | template_name, params_json |
| 默认模板 | 设置默认 | ocr_param_template | is_default |
| 应用参数 | 任务关联模板 | ocr_task_detail | param_template_id, custom_params |
#### 3.3 OCR结果存储
| 功能点 | 操作 | 涉及表 | 字段说明 |
|-------|-----|-------|---------|
| 保存结果 | 存储OCR返回 | ocr_result | raw_result, full_text |
| 多版本 | 创建新版本 | ocr_result | version+1, is_active切换 |
| 结果查询 | 获取最新结果 | ocr_result | 按page_id查询is_active=1 |
| 结果对比 | 查询历史版本 | ocr_result | 同一page_id多个version |
#### 3.4 任务日志
| 功能点 | 操作 | 涉及表 | 字段说明 |
|-------|-----|-------|---------|
| 记录日志 | 写入任务日志 | task_log | task_id, log_level, message |
| 查看日志 | 查询任务日志 | task_log | 按task_id时间倒序 |
### 4. 版面分析模块
#### 4.1 区域管理
| 功能点 | 操作 | 涉及表 | 字段说明 |
|-------|-----|-------|---------|
| 保存区域 | 存储检测到的区域 | text_region | region_type, bbox, region_text |
| 区域列表 | 查询页面所有区域 | text_region | 按page_id查询,按order_num排序 |
| 区域类型统计 | 按类型统计 | text_region | GROUP BY region_type |
| 区域更新 | 修改区域信息 | text_region | 人工调整区域边界 |
#### 4.2 行管理
| 功能点 | 操作 | 涉及表 | 字段说明 |
|-------|-----|-------|---------|
| 保存行 | 存储每行文本 | text_line | text, confidence, polygon_points |
| 行列表 | 查询区域内的行 | text_line | 按region_id查询 |
| 行坐标 | 获取行位置 | text_line | bbox_x1,y1,x2,y2 |
| 行高亮 | 前端定位 | text_line | 返回坐标用于绘制 |
#### 4.3 表格处理
| 功能点 | 操作 | 涉及表 | 字段说明 |
|-------|-----|-------|---------|
| 保存表格 | 存储表格结构 | table_structure | table_html, cells_json |
| 表格渲染 | 获取表格数据 | table_structure | 按region_id查询 |
### 5. 字粒定位模块(竖排核心)
#### 5.1 字粒坐标管理
| 功能点 | 操作 | 涉及表 | 字段说明 |
|-------|-----|-------|---------|
| 生成字粒 | OCR后切分字粒 | character_coordinate | 从text_line切分,生成每个字 |
| 字粒列表 | 查询页面所有字 | character_coordinate | 按page_id,按阅读顺序排序 |
| 单字查询 | 按内容查字 | character_coordinate | 按character模糊查询 |
| 字粒高亮 | 获取字坐标 | character_coordinate | bbox_x1,y1,x2,y2 |
| 上下文获取 | 取前后字 | character_coordinate | prev_char_id, next_char_id |
| 置信度筛选 | 低置信度字 | character_coordinate | confidence < 0.7 |
**字粒生成算法(从行切分):**
```java
// 从text_line切分出单个字符
List splitLineToChars(TextLine line) {
// 竖排:根据字符宽度估算每个字的位置
int charWidth = (line.getBboxX2() - line.getBboxX1()) / line.getText().length();
for (int i = 0; i < text.length(); i++) {
CharacterCoordinate cc = new CharacterCoordinate();
cc.setCharacter(text.charAt(i));
cc.setBboxX1(line.getBboxX1());
cc.setBboxX2(line.getBboxX2());
cc.setBboxY1(line.getBboxY1() + i * charWidth);
cc.setBboxY2(line.getBboxY1() + (i + 1) * charWidth);
// 更精确的算法需要考虑字间距
}
}
```
#### 5.2 列管理
| 功能点 | 操作 | 涉及表 | 字段说明 |
|-------|-----|-------|---------|
| 列检测 | 识别竖排列 | text_column | 根据字粒x坐标聚类 |
| 列列表 | 查询页面列 | text_column | 按page_id,按阅读顺序 |
| 列内字 | 获取列内所有字 | character_coordinate | 按column_id查询 |
| 列坐标 | 获取列边界 | text_column | bbox_x1,x2 |
### 6. 句子标记模块
| 功能点 | 操作 | 涉及表 | 字段说明 |
|-------|-----|-------|---------|
| 标记句子 | 新增句子标记 | sentence_marker | sentence_text, start_char_id, end_char_id |
| 句子列表 | 查询页面句子 | sentence_marker | 按page_id查询 |
| 句子高亮 | 获取句子外框 | sentence_marker | bbox_x1,y1,x2,y2 |
| 句子内字 | 获取句子所有字 | character_coordinate | char_index_global between start/end |
| 跨列句子 | 标记跨列句子 | sentence_marker | column_ids存储多列 |
| 句子类型 | 分类标记 | sentence_marker | sentence_type |
| 删除句子 | 取消标记 | sentence_marker | 逻辑/物理删除 |
**句子标记前端交互:**
```javascript
// 用户拖选多个字标记为句子
// 1. 获取选中的起始字和结束字
// 2. 查询之间的所有字
// 3. 计算最小外接矩形
// 4. 插入sentence_marker记录
```
### 7. 人工校对模块
#### 7.1 校对操作
| 功能点 | 操作 | 涉及表 | 字段说明 |
|-------|-----|-------|---------|
| 单字校对 | 修改单个字 | character_coordinate | corrected_char, is_corrected |
| 整行校对 | 修改整行 | text_line | text, 同时更新关联字粒 |
| 整句校对 | 修改句子 | sentence_marker | sentence_text |
| 校对记录 | 保存每次修改 | correction | original_text, corrected_text |
| 校对统计 | 统计工作量 | correction | 按人、按时间聚合 |
**校对联动逻辑:**
```sql
-- 修改单个字后,需要同步更新:
-- 1. character_coordinate.corrected_char
-- 2. text_line.text(如果该行有多个字被改,需要重组)
-- 3. ocr_result.full_text(页面全文需要重组)
-- 4. sentence_marker.sentence_text(如果该字在句子中)
```
#### 7.2 版本管理
| 功能点 | 操作 | 涉及表 | 字段说明 |
|-------|-----|-------|---------|
| 保存版本 | 校对完成生成版本 | version_history | page_id, version_no, content |
| 版本列表 | 查询页面版本 | version_history | 按page_id查询 |
| 版本回滚 | 恢复历史版本 | version_history | 用历史内容覆盖当前 |
| 版本对比 | 对比两个版本 | version_history | content_diff |
#### 7.3 批注系统
| 功能点 | 操作 | 涉及表 | 字段说明 |
|-------|-----|-------|---------|
| 添加批注 | 新增批注 | annotation | content, position_x1,y1,x2,y2 |
| 回复批注 | 关联父批注 | annotation | parent_id |
| 批注列表 | 查询页面批注 | annotation | 按page_id查询 |
| 批注状态 | 更新状态 | annotation | status, resolved_by |
| 批注定位 | 跳转到批注位置 | annotation | 用position坐标定位 |
### 8. 成果导出模块
| 功能点 | 操作 | 涉及表 | 字段说明 |
|-------|-----|-------|---------|
| 创建导出 | 新建导出任务 | export_record | export_no, project_id, export_type |
| 导出TXT | 生成文本文件 | ocr_result + correction | 取最新校对后文本 |
| 导出双层PDF | 生成可搜索PDF | page + character_coordinate | 图片+字粒坐标 |
| 导出XML/TEI | 生成学术格式 | 所有相关表 | 结构化导出 |
| 导出JSON | 原始数据导出 | 所有相关表 | 完整数据导出 |
| 下载文件 | 提供下载 | export_record | 更新download_count |
| 清理过期 | 删除过期文件 | export_record | expire_time判断 |
**各导出格式对应的数据源:**
| 导出格式 | 主要数据源 | 辅助数据 |
|---------|----------|---------|
| TXT | ocr_result.full_text + correction | 取最新校对版 |
| 双层PDF | page.image_path + character_coordinate | 字粒坐标用于文本层 |
| XML/TEI | 所有表的结构化数据 | 元数据、版本信息 |
| Markdown | text_region按阅读顺序 | 保留标题层级 |
| JSON | 所有表的完整数据 | 包含所有版本 |
### 9. 全文检索模块
| 功能点 | 操作 | 涉及表 | 说明 |
|-------|-----|-------|----|
| 数据同步 | 标记待同步 | search_cache | OCR完成或校对后插入/更新 |
| 同步任务 | 查询待同步 | search_cache | status=0, 按priority |
| 同步成功 | 更新状态 | search_cache | status=2, sync_time |
| 同步失败 | 记录错误 | search_cache | status=3, error_msg, retry_count |
| 重试同步 | 重置状态 | search_cache | status=0, retry_count+1 |
**同步到Meilisearch的数据结构:**
```javascript
// 从MySQL组装成Meilisearch文档
{
"id": "page_123",
"project_id": 1,
"project_name": "大学宋刻本",
"dynasty": "宋",
"page_num": 3,
"full_text": "大学之道...", // 从ocr_result.full_text取最新版
"characters": [ // 从character_coordinate取
{"char": "大", "bbox": [100,100,140,140]},
{"char": "学", "bbox": [100,150,140,190]}
],
"sentences": [ // 从sentence_marker取
{"text": "大学之道", "bbox": [100,100,500,200]}
],
"avg_confidence": 0.95, // 从ocr_result取
"updated_at": "2024-01-15T10:00:00"
}
```
## 三、功能操作与表的CRUD矩阵
| 功能 | 表 | 增(C) | 查(R) | 改(U) | 删(D) | 频率 |
|-----|---|------|------|------|------|-----|
| 创建项目 | project | ● | | | | 低 |
| 查看项目 | project | | ● | | | 高 |
| 更新项目 | project | | | ● | | 中 |
| 删除项目 | project | | | | ● | 低 |
| 上传文档 | document | ● | | | | 中 |
| 文档转图片 | page | ● | | | | 中 |
| 提交OCR任务 | ocr_task | ● | | | | 高 |
| 领取任务 | ocr_task | | | ● | | 高 |
| 完成任务 | ocr_task | | | ● | | 高 |
| 保存OCR结果 | ocr_result | ● | | | | 高 |
| 保存区域 | text_region | ● | | | | 高 |
| 保存行 | text_line | ● | | | | 高 |
| 生成字粒 | character_coordinate | ● | | | | 高 |
| 检测列 | text_column | ● | | | | 中 |
| 标记句子 | sentence_marker | ● | | | | 中 |
| 查询句子 | sentence_marker | | ● | | | 高 |
| 校对单字 | character_coordinate | | | ● | | 高 |
| 校对整行 | text_line | | | ● | | 高 |
| 记录校对 | correction | ● | | | | 高 |
| 保存版本 | version_history | ● | | | | 中 |
| 添加批注 | annotation | ● | | | | 中 |
| 查询批注 | annotation | | ● | | | 中 |
| 创建导出 | export_record | ● | | | | 低 |
| 下载文件 | export_record | | | ● | | 低 |
| 标记同步 | search_cache | ● | | | | 高 |
| 查询同步 | search_cache | | ● | | | 高 |
## 四、页面功能与数据表对应(前端视角)
### 1. 项目管理页面
```
项目列表表格
├── 项目名称 → project.name
├── 朝代 → project.dynasty
├── 作者 → project.author
├── 总页数 → SUM(document.page_count)
├── 已处理 → SUM(document.processed_count)
├── 进度 → 计算字段
└── 操作按钮
```
### 2. 文档列表页面
```
文档列表
├── 文件名 → document.file_name
├── 文件大小 → document.file_size
├── 总页数 → document.page_count
├── 已处理 → document.processed_count
├── 状态标签 → document.status
└── 页面缩略图 → document.first_page_path
```
### 3. OCR任务监控页面
```
任务列表
├── 任务编号 → ocr_task.task_no
├── 项目名称 → JOIN project
├── 类型 → ocr_task.task_type
├── 状态 → ocr_task.status
├── 进度 → ocr_task_detail.pages_success/pages_total
├── 提交时间 → ocr_task.submit_time
├── 处理时间 → ocr_task.duration
└── 错误信息 → ocr_task.error_msg
```
### 4. 校对工作台页面(核心!)
```
┌─────────────────────────────────────────────────┐
│ 左侧:古籍原图 │
│ ├── 区域框 → text_region.bbox │
│ ├── 行高亮 → text_line.bbox │
│ ├── 字粒框 → character_coordinate.bbox │
│ ├── 句子框 → sentence_marker.bbox │
│ └── 批注标记 → annotation.position │
├─────────────────────────────────────────────────┤
│ 右侧:文本编辑区 │
│ ├── 页面全文 → ocr_result.full_text │
│ ├── 区域文本 → text_region.region_text │
│ ├── 行文本 → text_line.text │
│ ├── 单字编辑 → character_coordinate.character │
│ ├── 置信度标识 → character_coordinate.confidence│
│ └── 保存按钮 → 写入correction表 │
├─────────────────────────────────────────────────┤
│ 底部:工具区 │
│ ├── 版本历史 → version_history │
│ ├── 批注列表 → annotation │
│ └── 句子标记 → sentence_marker │
└─────────────────────────────────────────────────┘
```
### 5. 句子标记页面
```
句子列表
├── 句子内容 → sentence_marker.sentence_text
├── 字符数 → sentence_marker.char_count
├── 类型 → sentence_marker.sentence_type
├── 坐标预览 → sentence_marker.bbox
├── 标记人 → sentence_marker.marked_by
├── 标记时间 → sentence_marker.marked_time
└── 查看详情 → 跳转到校对工作台并高亮该句子
```
### 6. 检索结果页面
```
搜索结果
├── 项目名称 → JOIN project
├── 页面缩略图 → page.thumbnail_path
├── 匹配文本高亮 → Meilisearch返回的高亮片段
├── 置信度 → ocr_result.avg_confidence
├── 跳转到原文 → 带页码和坐标参数跳转校对工作台
└── 相关句子 → sentence_marker (可选)
```
## 五、数据流转时序图
### OCR识别完整流程
```
用户上传PDF
↓
[document] 插入文档记录
↓
[page] 为每页生成记录
↓
用户点击"开始识别"
↓
[ocr_task] 创建任务记录
↓
[ocr_task_detail] 记录任务详情
↓
Python服务领取任务 → 更新[ocr_task].status=2
↓
PaddleOCR识别完成
↓
[ocr_result] 保存整体结果
↓
[text_region] 保存区域信息
↓
[text_line] 保存行信息
↓
[character_coordinate] 切分字粒并保存
↓
[text_column] 检测竖排列并保存
↓
[page].ocr_status=2, ocr_confidence=计算值
↓
[document].processed_count+1
↓
[project].processed_pages+1, 更新progress
↓
[search_cache] 插入待同步记录
↓
定时任务同步到Meilisearch
↓
[ocr_task].status=3, end_time, duration
↓
[task_log] 记录完成日志
```
### 人工校对流程
```
用户打开校对工作台
↓
查询[page]获取页面信息
↓
查询[ocr_result]获取最新识别结果
↓
查询[text_region]显示区域框
↓
查询[text_line]显示行高亮
↓
查询[character_coordinate]显示字粒
↓
用户修改某个字
↓
[correction] 插入校对记录
↓
[character_coordinate].corrected_char=新值, is_corrected=1
↓
重新组装该行文本 → 更新[text_line].text
↓
重新组装该区域文本 → 更新[text_region].region_text
↓
重新组装页面全文 → 更新[ocr_result].full_text
↓
如果该字在句子中 → 更新[sentence_marker].sentence_text
↓
[version_history] 插入新版本
↓
[page].proofread_status=1, proofread_count+1
↓
[search_cache] 插入待同步记录(更新Meilisearch)
```
### 句子标记流程
```
用户在图片上拖选多个字
↓
前端获取起始字和结束字的ID
↓
查询[character_coordinate]获取之间的所有字
↓
计算最小外接矩形(取最小x1,y1和最大x2,y2)
↓
拼接句子文本(按阅读顺序)
↓
[sentence_marker] 插入句子记录
↓
返回句子UUID
↓
前端绘制句子框
```
## 六、总结:表与功能的映射关系
| 表名 | 主要功能模块 | 核心作用 |
|-----|------------|---------|
| project | 项目管理 | 项目元数据、进度跟踪 |
| document | 文档管理 | 文件存储、页面统计 |
| page | 文档管理/OCR/校对 | 页面状态、图片路径 |
| ocr_task | OCR识别 | 任务调度、状态跟踪 |
| ocr_task_detail | OCR识别 | 任务详情、性能统计 |
| ocr_param_template | OCR识别 | 参数模板、配置管理 |
| ocr_result | OCR识别 | 识别结果存储、版本管理 |
| task_log | OCR识别 | 任务日志、问题追踪 |
| text_region | 版面分析 | 区域类型、位置、文本 |
| text_line | 版面分析 | 行文本、坐标、置信度 |
| table_structure | 版面分析 | 表格结构、HTML |
| character_coordinate | 字粒定位 | 竖排核心:每个字的坐标 |
| text_column | 字粒定位 | 竖排列信息 |
| sentence_marker | 句子标记 | 句子聚合、外框坐标 |
| correction | 人工校对 | 修改记录、统计 |
| version_history | 人工校对 | 版本管理、回滚 |
| annotation | 人工校对 | 批注、讨论 |
| export_record | 成果导出 | 导出任务、文件管理 |
| search_cache | 全文检索 | 同步状态管理 |