Skip to content

Commit 5357b30

Browse files
committed
refactor(rust): 拆 types.rs 第 4 步 — 会话 OCR 与屏卡域
1 parent 40ef959 commit 5357b30

4 files changed

Lines changed: 104 additions & 95 deletions

File tree

‎app/src-tauri/src/types.rs‎

Lines changed: 3 additions & 93 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,13 @@ mod types_session;
1414
mod types_knowledge;
1515
#[path = "types_note.rs"]
1616
mod types_note;
17+
#[path = "types_ocr.rs"]
18+
mod types_ocr;
1719

1820
pub use types_session::*;
1921
pub use types_knowledge::*;
2022
pub use types_note::*;
23+
pub use types_ocr::*;
2124

2225
/// 单条 ASR 转写片段。
2326
///
@@ -101,99 +104,6 @@ pub struct NoteDraft {
101104
pub markdown: String,
102105
}
103106

104-
/// 会话 OCR 块(关键帧画面文字 / 字幕区文字)。
105-
///
106-
/// @ai-context: region 取 subtitle | full(ADR-005:字幕区高频采样 vs 全帧低频采样)。
107-
/// @ai-context: v0.5.0 M4(REQ-048):region_kind 为分区域 OCR 的版面类型标注
108-
/// (text/table/formula/code/unknown;旧数据/整帧直跑为 None)。
109-
/// @ai-context: v0.7.3(REQ-156,ADR-015):bbox/screen_id 为屏卡体系的落库列——
110-
/// bbox 为检测框(帧坐标系,JSON {x,y,w,h}),screen_id 为采集时
111-
/// 分配的屏号(NULL=旧数据无屏,视图层聚类兜底)。
112-
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
113-
pub struct SessionOcrBlock {
114-
pub id: i64,
115-
pub session_id: i64,
116-
/// 关键帧相对会话起点的毫秒时间戳
117-
pub timestamp_ms: u64,
118-
pub text: String,
119-
/// 识别置信度 0.0-1.0
120-
pub score: f32,
121-
/// subtitle | full
122-
pub region: String,
123-
/// 来源版面区域类型(kebab-case;None=整帧直跑/旧数据)
124-
pub region_kind: Option<String>,
125-
/// 检测框(帧坐标系;None=旧数据/无 bbox——下游必须容忍缺省)
126-
#[serde(default)]
127-
pub bbox: Option<TextBox>,
128-
/// 屏号(采集时分配,会话内递增;None=旧数据无屏)
129-
#[serde(default)]
130-
pub screen_id: Option<i64>,
131-
}
132-
133-
/// 新增会话 OCR 块入参。
134-
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
135-
pub struct NewSessionOcrBlock {
136-
pub session_id: i64,
137-
pub timestamp_ms: u64,
138-
pub text: String,
139-
pub score: f32,
140-
pub region: String,
141-
/// 来源版面区域类型(kebab-case;None=整帧直跑)
142-
pub region_kind: Option<String>,
143-
/// 检测框(帧坐标系;None=未知)
144-
#[serde(default)]
145-
pub bbox: Option<TextBox>,
146-
/// 屏号(None=旧路径不分配)
147-
#[serde(default)]
148-
pub screen_id: Option<i64>,
149-
}
150-
151-
/// 屏内结构块(表格/公式/代码区域,v0.7.3 REQ-159)。
152-
///
153-
/// @ai-context: 结构块不参与行合并(版面角色独立);rendered 为精修产物
154-
/// (表格 Markdown / 公式 LaTeX / 代码原样),None=未精修/失败降级。
155-
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
156-
pub struct ScreenStructure {
157-
/// table | formula | code
158-
pub kind: String,
159-
/// 原始 OCR 文本(未精修)
160-
pub text: String,
161-
/// 精修渲染产物(None=未精修/失败,徽标降级)
162-
#[serde(default)]
163-
pub rendered: Option<String>,
164-
}
165-
166-
/// 画面要点屏(v0.7.3 REQ-155/158/160,ADR-015)。
167-
///
168-
/// @ai-context: 屏 = 老师翻一次页到下一个画面之间的静止画面——课堂记忆的天然单位。
169-
/// first_seen/last_seen 为屏内块最早/最晚时间戳(派生自成员块,
170-
/// 不建屏表,ADR-006 派生视图传统);image_ref 为 first_seen 时刻
171-
/// 最近的归档 full 图(相对路径,asset:// 消费)。
172-
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
173-
pub struct SessionScreen {
174-
pub session_id: i64,
175-
/// 屏号(None=旧数据聚类派生)
176-
#[serde(default)]
177-
pub screen_id: Option<i64>,
178-
pub first_seen_ms: u64,
179-
pub last_seen_ms: u64,
180-
/// 标题角色行(大字块;None=无 bbox 降级/无标题)
181-
#[serde(default)]
182-
pub title: Option<String>,
183-
/// 正文行(行合并后,按阅读顺序)
184-
#[serde(default)]
185-
pub body: Vec<String>,
186-
/// 图注/标签(短词,按位置排序)
187-
#[serde(default)]
188-
pub labels: Vec<String>,
189-
/// 归档 full 图相对路径(None=无匹配图)
190-
#[serde(default)]
191-
pub image_ref: Option<String>,
192-
/// 结构块(表格/公式/代码区域)
193-
#[serde(default)]
194-
pub structure: Vec<ScreenStructure>,
195-
}
196-
197107
/// 决策/应用记录(v0.13.3 REQ-208;一表两面,kind 区分)。
198108
///
199109
/// @ai-context: 对应 knowledge_decisions 表——decision=思辨面(决策),application=学习面

‎app/src-tauri/src/types_ocr.rs‎

Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
//! @ai-context: 会话 OCR 落库块与画面要点屏(REQ-155~160 / ADR-005 / ADR-015):关键帧文字块、屏内结构块、屏卡。
2+
//! @ai-context: 纯数据定义(0 impl / 0 IO / 0 副作用);与引擎层内存态 OcrBlock(types_extract)语义不同——本文是落库/视图契约。
3+
//! @ai-context: 由 types.rs 门面 `#[path]` 声明 + `pub use` 再导出 ⇒ crate::types::X 引用路径逐字不变。
4+
5+
use serde::{Deserialize, Serialize};
6+
use super::TextBox;
7+
8+
/// 会话 OCR 块(关键帧画面文字 / 字幕区文字)。
9+
///
10+
/// @ai-context: region 取 subtitle | full(ADR-005:字幕区高频采样 vs 全帧低频采样)。
11+
/// @ai-context: v0.5.0 M4(REQ-048):region_kind 为分区域 OCR 的版面类型标注
12+
/// (text/table/formula/code/unknown;旧数据/整帧直跑为 None)。
13+
/// @ai-context: v0.7.3(REQ-156,ADR-015):bbox/screen_id 为屏卡体系的落库列——
14+
/// bbox 为检测框(帧坐标系,JSON {x,y,w,h}),screen_id 为采集时
15+
/// 分配的屏号(NULL=旧数据无屏,视图层聚类兜底)。
16+
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
17+
pub struct SessionOcrBlock {
18+
pub id: i64,
19+
pub session_id: i64,
20+
/// 关键帧相对会话起点的毫秒时间戳
21+
pub timestamp_ms: u64,
22+
pub text: String,
23+
/// 识别置信度 0.0-1.0
24+
pub score: f32,
25+
/// subtitle | full
26+
pub region: String,
27+
/// 来源版面区域类型(kebab-case;None=整帧直跑/旧数据)
28+
pub region_kind: Option<String>,
29+
/// 检测框(帧坐标系;None=旧数据/无 bbox——下游必须容忍缺省)
30+
#[serde(default)]
31+
pub bbox: Option<TextBox>,
32+
/// 屏号(采集时分配,会话内递增;None=旧数据无屏)
33+
#[serde(default)]
34+
pub screen_id: Option<i64>,
35+
}
36+
37+
/// 新增会话 OCR 块入参。
38+
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
39+
pub struct NewSessionOcrBlock {
40+
pub session_id: i64,
41+
pub timestamp_ms: u64,
42+
pub text: String,
43+
pub score: f32,
44+
pub region: String,
45+
/// 来源版面区域类型(kebab-case;None=整帧直跑)
46+
pub region_kind: Option<String>,
47+
/// 检测框(帧坐标系;None=未知)
48+
#[serde(default)]
49+
pub bbox: Option<TextBox>,
50+
/// 屏号(None=旧路径不分配)
51+
#[serde(default)]
52+
pub screen_id: Option<i64>,
53+
}
54+
55+
/// 屏内结构块(表格/公式/代码区域,v0.7.3 REQ-159)。
56+
///
57+
/// @ai-context: 结构块不参与行合并(版面角色独立);rendered 为精修产物
58+
/// (表格 Markdown / 公式 LaTeX / 代码原样),None=未精修/失败降级。
59+
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
60+
pub struct ScreenStructure {
61+
/// table | formula | code
62+
pub kind: String,
63+
/// 原始 OCR 文本(未精修)
64+
pub text: String,
65+
/// 精修渲染产物(None=未精修/失败,徽标降级)
66+
#[serde(default)]
67+
pub rendered: Option<String>,
68+
}
69+
70+
/// 画面要点屏(v0.7.3 REQ-155/158/160,ADR-015)。
71+
///
72+
/// @ai-context: 屏 = 老师翻一次页到下一个画面之间的静止画面——课堂记忆的天然单位。
73+
/// first_seen/last_seen 为屏内块最早/最晚时间戳(派生自成员块,
74+
/// 不建屏表,ADR-006 派生视图传统);image_ref 为 first_seen 时刻
75+
/// 最近的归档 full 图(相对路径,asset:// 消费)。
76+
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
77+
pub struct SessionScreen {
78+
pub session_id: i64,
79+
/// 屏号(None=旧数据聚类派生)
80+
#[serde(default)]
81+
pub screen_id: Option<i64>,
82+
pub first_seen_ms: u64,
83+
pub last_seen_ms: u64,
84+
/// 标题角色行(大字块;None=无 bbox 降级/无标题)
85+
#[serde(default)]
86+
pub title: Option<String>,
87+
/// 正文行(行合并后,按阅读顺序)
88+
#[serde(default)]
89+
pub body: Vec<String>,
90+
/// 图注/标签(短词,按位置排序)
91+
#[serde(default)]
92+
pub labels: Vec<String>,
93+
/// 归档 full 图相对路径(None=无匹配图)
94+
#[serde(default)]
95+
pub image_ref: Option<String>,
96+
/// 结构块(表格/公式/代码区域)
97+
#[serde(default)]
98+
pub structure: Vec<ScreenStructure>,
99+
}

‎app/src-tauri/src/types_session.rs‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
//! @ai-context: 由 types.rs 门面 `#[path]` 声明 + `pub use` 再导出 ⇒ crate::types::X 引用路径逐字不变。
44
55
use serde::{Deserialize, Serialize};
6-
use super::{SessionOcrBlock, SessionScreen};
6+
use super::types_ocr::{SessionOcrBlock, SessionScreen};
77

88
// ────────────────────────────────────────────────────────────
99
// 会话领域类型(REQ-010,ADR-004)

‎docs/standards/line-limit-exemptions.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,11 +60,11 @@
6060
| app/src/components/KnowledgeCanvasView.tsx | 466 | v0.13.8 画布主视图(RF 装配/拖拽防抖保存/视口持久化/自动排列);v0.13.9 根卡 + 接线方向动态化;v0.14.1 布局/连线下拉 + 偏好读写(+72 行)+ 审查修复(布局 effect 原子化拆分建边 effect/prefsLoaded 控件门控/hasCore 统一 +31 行)——RF 状态与持久化编排内聚(元素构建已拆至 canvasElements/layout* 纯函数) | 若再增长:偏好读写与下拉拆至 useCanvasPrefs.ts;位置持久化拆至 useCanvasPositions.ts |
6161
| app/src-tauri/src/streaming_asr_tests.rs | 462 | 流式 ASR 测试域(端点处理/静音判定/段切分回归)单模块 #[path] 挂载 | 若再增长:端点处理组拆至 streaming_endpoint_tests.rs |
6262
| app/src-tauri/src/structure_note_tests.rs | 458 | v0.7.6(REQ-177~181):结构渲染层单测域(章节插入位置/命名窗口/词汇表排序上限锚点/零回归护栏/JSON 往返)单模块 #[path] 挂载 | 若再增长:词汇表组拆至 structure_note_glossary_tests.rs |
63-
| app/src/components/NoteListView.tsx | 450 | 超硬限(>600 行),不允许豁免 —— v0.20.12 批 7 接线 + 审查修复轮 4(refreshToken 组序重拉)净增(646→654)——**超 600 硬限随 TD-2026-09-09-A 登记(值刷新)** | **超硬限必须拆**:拖拽/移动接线拆至 useNoteOrders.ts(既有登记计划兑现) |
6463
| app/src-tauri/src/db_note_group_clean_tests.rs | 447 | REQ-316(批 7)测试域:判定表(自动/系列/手动/改判/五类残留/影响面外/级联卫生)+ 写路径集成 16 例,单模块 #[path] 挂载 | 若再增长:写路径集成组拆至 db_note_group_clean_flow_tests.rs |
6564
| app/src-tauri/src/commands_session.rs | 443 | v0.6.0 M6 + v0.7.6 审查硬拆后回归:会话命令域(CRUD/质量报告/课程分组/段搜索)内聚;笔记转换管线已拆至 commands_session_note.rs;M2 修复(search_ocr_blocks 传 data_dir 参数) | 若再增长:course/search 拆至 commands_session_extra.rs |
6665
| app/src-tauri/src/symbol_normalize.rs | 443 | v0.6.0 M1(REQ-060):口语符号映射域(映射表/上下文守卫/中文数字解析)内聚;数字解析与守卫共享字符判定 | 若再增长:parse_chinese_number/replace_number_runs 拆至 symbol_numbers.rs |
6766
| app/src-tauri/src/commands_goals_plan.rs | 442 | 规划=单次同步调用 + spawn_blocking(10-30s 交互等待可接受,(自动摘取,待细化) | 若再增长:按职责拆分 |
67+
| app/src/components/NoteListView.tsx | 442 | 超硬限(>600 行),不允许豁免 —— v0.20.12 批 7 接线 + 审查修复轮 4(refreshToken 组序重拉)净增(646→654)——**超 600 硬限随 TD-2026-09-09-A 登记(值刷新)** | **超硬限必须拆**:拖拽/移动接线拆至 useNoteOrders.ts(既有登记计划兑现) |
6868
| app/src/App.tsx | 439 | 根装配(页面切换/焦点跨页直达状态机/全局事件监听)+ v0.20.5 行动页 + v0.20.10 批 5 复习页 Tab/深链/保活挂载(f702d876)——登记值 363 过期,实测纠偏 | 若再增长:焦点跨页直达 state 族拆至 useFocusRouting.ts |
6969
| app/src-tauri/src/screens.rs | 437 | v0.7.3(REQ-155/156/160):画面要点屏构建编排(分组/聚类/图匹配 IO)+ 可消费块过滤扩展——编排与纯函数分层(纯函数在 screen_merge.rs) | 若再增长:filter_usable_blocks 拆至 screen_filter.rs |
7070
| app/src/pages/KnowledgePage.tsx | 437 | v0.13.8 画布接线越线(原 296):中栏「画布」标签 + 树/画布双入口 + v0.15 左列/详情列状态迁移(useColumnLayout + 折叠窄条 + 宽度 prop)——页面编排层内聚(数据获取/选中态/标签态为页面本地状态),子组件已全部下沉(Tree/Canvas/DetailPanel/Wizard/ConceptCardRow/Sample) | 若再增长:中栏视图块(树/画布/概念/模型 + 标签栏)拆至 KnowledgeMiddlePane.tsx,SystemCard 拆至 SystemSidebarCard.tsx |

0 commit comments

Comments
 (0)