13 KiB
内部公文前端拆分实施清单
1. 文档目的
本文档只解决一个问题:
- 在不改变“内部公文”业务语义的前提下,如何把当前前端实现拆成一套与“交叉评查”同级的独立页面架构
本文档关注的是:
- 页面编排边界
- 组件职责边界
govdoc与reviews / cross-checking的复用边界- 分阶段实施顺序
本文档不做以下事情:
- 不改后端业务语义
- 不要求照搬旧项目代码
- 不把
Collabora当成整个中栏预览架构
2. 结论先行
内部公文前端应按以下原则重构:
像交叉评查一样独立成页,但复用 reviews 的定位型预览能力。
准确解释如下:
- 内部公文应有自己独立的页面 orchestrator
- 内部公文应有自己独立的业务组件层
- 内部公文应有自己独立的 TS service / adapter 层
- 中栏 PDF / DOCX 预览不应重新发明一套,而应优先复用
reviews已有能力 Collabora只应作为 DOCX viewer,不应承担“问题定位主架构”
因此,目标不是:
- 把当前
govdoc-audit页面继续补丁式扩写
而是:
- 把内部公文前端收敛为“独立页面编排 + 统一预览协议 + 独立业务壳”的平台化实现
3. 当前实现现状
3.1 当前内部公文前端入口
当前内部公文详情页主入口为:
当前内部公文列表页主入口为:
当前路由入口为:
当前详情页已经具备:
- 顶部摘要与报告下载操作
- 评查 / 结构 / 大纲 / 实体 tab
- 中栏文档视图
- 右栏 findings / checked rules 展示
问题不在于“没有功能”,而在于“页面职责混装”。
3.2 当前详情页耦合点
当前 audit.tsx 同时承担了以下职责:
- 页面数据加载
- 顶部操作区渲染
- tab 状态切换
- 结果统计条渲染
- 中栏文档视图调度
- 右栏问题面板调度
- 规则弹窗调度
这会带来三个问题:
- 页面 orchestrator 和业务组件未分层
- 中栏预览协议没有向平台现有
reviews能力对齐 - 右栏问题区与
reviews / cross-checking的定位交互无法复用
3.3 当前中栏预览为什么不应继续沿现状扩写
当前内部公文中栏主要使用:
而平台现有成熟的“定位型预览”能力在:
- components/reviews/previewComponents/PdfPreviewTest.tsx
- components/reviews/previewComponents/DocxPreviewTest.tsx
- app/(audit)/reviews-test/ReviewsTestClient.tsx
- app/(audit)/cross-checking/result/CrossCheckingResultClient.tsx
必须明确:
- PDF 中栏定位主能力不是
Collabora - DOCX 中栏当前虽然使用
CollaboraViewer,但它承担的是文档渲染,不是完整的问题定位架构
如果内部公文要做到:
- 点击问题点后定位到对应页
- 对问题字段/段落做高亮
- 为后续“问题行定位”保留升级空间
则中栏必须对齐现有平台预览输入协议,而不是继续把 DocView 做成一套孤岛实现。
4. 目标架构
4.1 总体原则
前端目标架构应满足以下四条:
- 内部公文页面独立编排
- 中栏预览能力平台复用
- 业务面板 govdoc 自治
- 数据适配集中在 adapter 层
可以概括为:
govdoc 自己负责业务壳,platform 负责通用预览能力。
4.2 目标目录结构
建议拆分为以下结构:
legal-platform-frontend/
app/(audit)/govdoc/
audits/page.tsx
detail/[documentId]/page.tsx
components/govdoc-audit/
GovdocAuditListPage.tsx
GovdocAuditResultPage.tsx
GovdocSummaryHeader.tsx
GovdocFindingPanel.tsx
GovdocStructurePanel.tsx
GovdocOutlinePanel.tsx
GovdocEntityPanel.tsx
GovdocReportActions.tsx
lib/api/govdoc-audit/
api.ts
types.ts
adapters.ts
govdoc-routes.ts
说明如下:
page.tsx只保留路由入口职责GovdocAuditResultPage.tsx负责详情页 orchestratorGovdocAuditListPage.tsx负责列表页 orchestratorGovdoc*Panel负责内部公文独有业务视图adapters.ts负责把 govdoc 后端返回结果转成前端视图模型
4.3 页面编排职责
详情页 orchestrator
建议新增:
components/govdoc-audit/GovdocAuditResultPage.tsx
该组件只负责:
- 读取
documentId / runId - 调用 govdoc API
- 维护 tab 状态
- 维护当前激活问题点
- 维护当前预览定位目标
- 组装中栏与右栏
它不应承担:
- 具体 finding 卡片渲染细节
- 实体/结构/大纲具体 UI 细节
- 预览底层渲染逻辑
这部分应当参照:
列表页 orchestrator
建议新增:
components/govdoc-audit/GovdocAuditListPage.tsx
该组件负责:
- 列表数据加载
- 筛选状态
- 批量操作状态
- 导出与删除
- 跳转详情页
它应继续保持内部公文自己的筛选语义,但 UI 节奏应向平台文档列表页靠拢。
列表页设计参照:
5. 与 reviews / cross-checking 的复用边界
5.1 应复用的能力
内部公文应复用以下能力:
- PDF 中栏预览组件
- DOCX 中栏预览组件
- 问题点点击后的预览定位协议
- 页码跳转、高亮、bbox / charPositions 定位能力
优先复用对象:
复用的是:
- 预览能力
- 定位协议
- 用户交互模型
不是:
- 合同业务语义
- 卷宗业务命名
- 旧页面外壳
5.2 不应复用的部分
以下部分不应直接复用:
reviews-test自身的业务标题、业务字段命名- 合同/卷宗专有的右栏业务解释
cross-checking的评分协同、提议投票、交叉意见面板
原因是:
- 这些属于业务壳,而不是平台通用能力
内部公文应保留自己的:
- findings 口径
- checked rules 口径
- 结构 / 大纲 / 实体口径
- 报告下载口径
5.3 Collabora 的正确定位
CollaboraViewer 的边界必须明确:
- 它是 DOCX viewer
- 它可以承担跳页、文本高亮、编辑/只读查看
- 它不是内部公文详情页的业务 orchestrator
- 它也不是“问题行精确定位”的完整方案
因此:
Collabora只能留在DocxPreviewTest这一层- 不应让 govdoc 页面继续直接围绕
Collabora自己长出一套完整详情页体系
6. 必须新增的 adapter 层
6.1 为什么必须有 adapters.ts
当前 lib/api/govdoc-audit 下已有:
api.tstypes.tsgovdoc-routes.ts
但还缺一层:
adapters.ts
这层必须存在,因为它承担的是“业务结果语义 -> 预览与页面视图语义”的转换。
如果没有这层,后果会是:
- govdoc 页面自己维护一套 findings 展示模型
- reviews 页面自己维护一套 preview target 模型
- 同类定位交互会出现两套不兼容实现
6.2 adapters.ts 建议职责
adapters.ts 建议至少提供以下能力:
- 将
govdoc结果对象转换为结果页 view model - 将
finding / checked_rule转换为右栏展示项 - 将
finding / paragraph / entity转换为中栏跳转目标 - 根据文件类型产出统一 preview target
- 将后端报告产物状态转换为按钮展示状态
建议输出的数据语义包括:
previewKindpreviewPathactiveTargetfindingItemssummaryCardsreportActionsstructureItemsoutlineItemsentityItems
这样后续页面层只编排,不解释后端字段细节。
7. 分阶段实施顺序
7.1 第一阶段:补 adapter,不改页面语义
目标:
- 先把数据适配层补齐
动作:
- 新增
lib/api/govdoc-audit/adapters.ts - 收敛
audit.tsx里对原始接口字段的直接解释 - 把 preview target 语义统一为:
pagehighlightValuebboxHighlightcharPositions
本阶段收益:
- 不改用户可见业务逻辑
- 为后续替换中栏和右栏做稳定基础
7.2 第二阶段:拆详情页 orchestrator
目标:
- 让 govdoc 详情页像
cross-checking一样拥有独立 orchestrator
动作:
- 新增
GovdocAuditResultPage.tsx - 将现有
audit.tsx逻辑迁入新组件 - 路由入口改为挂载新组件
- 顶部摘要、下载操作、tab 切换拆成子组件
本阶段收益:
- 页面职责清晰
- 后续中栏和右栏可以独立演进
7.3 第三阶段:切换中栏到定位型预览
目标:
- 内部公文详情页中栏不再以
DocView为核心
动作:
- 根据文件类型切换到
PdfPreviewTest / DocxPreviewTest - 从 govdoc adapter 输出统一 preview target
- 让右栏点击直接驱动中栏定位
本阶段注意:
- PDF 定位优先支持
bboxHighlight / charPositions - DOCX 优先支持
targetPage + highlightValue - 不承诺此阶段立即做到“DOCX 行级精确定位”
7.4 第四阶段:重构右栏与 tab 业务壳
目标:
- 保留 govdoc 自己的业务面板,但交互模型对齐平台
动作:
- 将当前
RightPanel重构为GovdocFindingPanel - 将结构、大纲、实体分面板组件化
- 收敛旧的孤立交互状态
本阶段收益:
- govdoc 保持业务独立
- 同时具备平台统一的交互体验
7.5 第五阶段:样式与布局收口
目标:
- govdoc 页面在视觉上向平台现有绿色主题和通用 panel 节奏靠齐
动作:
- 减少
.govdoc-audit-scope中重复定义 - 优先复用
layout-primitives.css - 保留必要的 govdoc 业务样式命名空间
本阶段原则:
- 先统一布局和交互节奏
- 再减少样式重复
- 不先做“大改视觉”
8. 风险点与前置条件
8.1 最大风险不在前端组件,而在定位数据颗粒度
内部公文要实现“定位到哪一行有问题”,前端只是承载层,真正决定上限的是后端给的数据。
前端能稳定消费的数据类型分为两类:
- PDF:
pagebboxpage_boxchar_positions
- DOCX:
targetPagehighlightValue- 未来如果需要更高精度,还需要更细粒度锚点
如果后端只给:
- 问题描述
- 规则结果
而不给定位数据,那么前端最多只能做到:
- 页级定位
- 文本关键字高亮
不能承诺做到稳定的“行级定位”。
8.2 不应在这一阶段做的事情
以下动作不建议和本次拆分同时进行:
- 重写 govdoc 全部视觉设计
- 把 govdoc 规则语义改造成合同/卷宗语义
- 试图把所有
reviews业务组件直接搬进 govdoc - 在没有 adapter 的情况下直接大规模替换页面
原因很简单:
- 这些动作会把“前端分层重构”和“业务改动”混在一起,增加回归风险
9. 最终边界结论
内部公文前端的正确实现边界应锁定为:
- 像交叉评查一样,独立成页
- 像 reviews 一样,复用定位型预览能力
- 像平台模块一样,数据解释集中在 adapter 层
- 像内部公文自己一样,保留 findings / checked rules / structure / outline / entities 的业务语义
更直白地说:
Govdoc 页面负责业务编排reviews 预览组件负责中栏定位能力Collabora只负责 DOCX 渲染adapters.ts负责把 govdoc 后端结果翻译成前端可复用语义
这就是内部公文前端后续实施的固定边界。