# 评查点分组、文档类型与规则集目标结构与迁移方案

更新时间：2026-05-03

## 1. 产品确认后的最终口径

最终目标结构统一为：

- 一级分组 = 业务大类
  - 例如：`合同`、`卷宗`
  - 后续若出现新的入口业务，也允许继续新增一级分组
- 二级分组 = 该业务大类下的具体业务类型
  - 例如合同下：`建设工程合同`、`买卖合同`
  - 例如卷宗下：`处罚-一般程序`、`许可-停业办理`
- 规则集 = 挂在二级分组下
- 入口模块 = 绑定一级分组

补充关系口径：

- 文档类型 = 具体业务类型主数据
- 文档类型页 = 主数据维护与汇总展示
- 评查点分组页 = 实际运行绑定维护页

这套结构对应的运行链路是：

- 入口模块
- 一级分组（业务大类）
- 二级分组（具体业务类型）
- 规则集
- 规则版本

其中：

- 入口模块：决定当前页面进入的是哪条业务线
- 一级分组：承接该业务线的一级分类容器
- 二级分组：决定这次上传/评查具体命中的业务类型
- 规则集：决定跑哪组规则
- 规则版本：决定跑规则集的哪一版

也就是说，当前正式口径是：

`入口模块 -> 一级分组（业务大类） -> 二级分组（具体业务类型） -> 规则集 -> 规则版本`

文档类型在这条链路中的位置是：

- 作为“具体业务类型主数据”
- 通过 `document_type_id` 与二级分组形成稳定对应关系
- 用于上传页、规则页、文档列表等业务页面识别当前业务类型

## 1.1 老系统与新系统的关系

### 老系统（docauditai）

老系统更接近：

```text
DocumentType -> TopLevelGroup(s) -> ChildGroups -> EvaluationPoints
```

特点：

- `document_types.evaluation_point_groups_ids` 绑定顶层组
- `evaluation_point_groups` 是两级树
- `evaluation_points` 实际挂在子组下
- 运行时还会按 `area + document_attribute_type` 过滤

### 当前新平台（leaudit-platform）

当前新平台已经同时存在两套表达：

1. 规则执行主链
   - `DocumentType -> RuleTypeBinding -> RuleSet -> RuleVersion`
2. 分组管理主链
   - `EntryModule -> Level1Group -> Level2Group -> RuleSet`

这就是大家容易混淆的根源。

### 当前统一理解

应统一理解为：

- 文档类型是业务类型主数据
- 二级分组是运行时具体命中的业务类型节点
- 规则集挂在二级分组下
- `leaudit_rule_type_bindings` 继续承担执行链快速查找规则集的职责

也就是说：

- 文档类型页负责“主数据”
- 分组页负责“运行绑定”
- `rule_type_bindings` 负责“执行收口”

## 2. 现在系统为什么会让人混淆

当前系统的过渡态更接近：

- 一级分组 = 具体文档类型
  - 如：`建设工程合同`、`停业办理`
- 二级分组 = 该文档类型下的默认子类型
  - 如：`通用`

这与产品最新口径不一致，主要有三个问题：

1. 一级分组被错误地做成了“具体文档类型”，而不是“业务大类容器”。
2. 上传页看到的“子类型”其实只是默认二级分组，业务人员会误以为配置还没做好。
3. 入口模块与一级分组之间缺少明确绑定语义，后续无法优雅支持新入口。

## 3. 目标树形样例

### 3.1 合同类

```text
合同（一级 = 业务大类）
├── 建设工程合同（二级 = 具体业务类型）
│   ├── 规则集：建设工程合同-正文审查
│   └── 规则集：建设工程合同-签署审查
├── 买卖合同（二级 = 具体业务类型）
│   └── 规则集：买卖合同-通用审查
└── 委托合同（二级 = 具体业务类型）
    └── 规则集：委托合同-通用审查
```

### 3.2 卷宗类

```text
卷宗（一级 = 业务大类）
├── 处罚-一般程序（二级 = 具体业务类型）
│   └── 规则集：行政处罚-一般程序审查
├── 处罚-简易程序（二级 = 具体业务类型）
│   └── 规则集：行政处罚-简易程序审查
├── 许可-停业办理（二级 = 具体业务类型）
│   └── 规则集：行政许可-停业办理审查
└── 许可-新办办理（二级 = 具体业务类型）
    └── 规则集：行政许可-新办办理审查
```

### 3.3 将来新增入口

```text
内部公文（一级 = 业务大类）
├── 请示类公文（二级）
├── 通知类公文（二级）
└── 纪要类公文（二级）
```

即：

- 不需要预先写死“只有合同、卷宗”
- 后续新增业务时，直接新建一级、新建二级、挂规则集、再把一级绑定给入口模块即可

## 4. 页面职责重定义

### 4.1 评查点分组页 `/rule-groups`

这是唯一的运行绑定页，负责：

- 维护一级分组（业务大类）
- 维护二级分组（具体业务类型）
- 维护二级分组绑定的规则集
- 维护一级分组与入口模块的绑定关系

统一文案：

- 一级：业务大类
- 二级：具体业务类型
- 规则集：实际运行绑定
- 入口模块：一级分组归属入口

### 4.2 文档类型页 `/document-types`

文档类型页保留为“类型主数据页”，职责调整为：

- 维护具体文档类型名称、编码、描述
- 展示该类型的汇总规则集
- 不再承担一级/二级分组结构维护职责

统一文案：

- “汇总规则集”
- “仅用于总览，实际运行绑定请在评查点分组页维护”

补充说明：

- 当前文档类型与规则集之间仍可保留“汇总绑定 / 快速绑定”能力
- 但最终运行时应以“二级分组绑定规则集”为准
- 因此文档类型页更适合做：
  - 主数据编辑
  - 入口模块归属展示
  - 汇总规则集总览

### 4.3 上传页 `/files/upload`

上传页统一交互为：

1. 先根据入口模块确定可用的一级分组
2. 再根据一级分组或文档类型加载二级分组
3. 用户选择本次上传实际命中的二级分组
4. 最终上传时携带 `groupId`

## 5. 数据模型建议

## 5.1 继续复用 `leaudit_evaluation_point_groups`

当前表不必推倒重建，建议继续复用，并明确字段语义：

- `pid = 0`
  - 表示一级分组（业务大类）
- `pid != 0`
  - 表示二级分组（具体业务类型）

字段语义建议：

- 一级分组：
  - `document_type_id` 可为空
  - `entry_module_id` 可为空，但新模型建议填写
  - `name` = 业务大类名称，如 `合同` / `卷宗`
- 二级分组：
  - `document_type_id` 建议必填，对应实际具体文档类型
  - `pid` 指向对应一级分组
  - `entry_module_id` 通常从一级继承，不需要单独维护

## 5.2 新增或正式启用 `entry_module_id`

为支撑“一级分组绑定入口模块”，分组表需要显式支持：

- `entry_module_id`

用途：

- 绑定一级分组与入口模块的归属关系
- 后续上传页、首页导航、入口权限控制都可以围绕该关系展开

## 5.3 与 `leaudit_rule_type_bindings` 的关系

当前不建议粗暴删除 `leaudit_rule_type_bindings`。

更合理的口径是：

- 分组树负责表达“业务结构”和“规则集挂载关系”
- `leaudit_rule_type_bindings` 负责表达“执行时文档类型如何快速命中规则集”

可以把它理解为：

- 分组树 = 业务真相源
- `rule_type_bindings` = 执行加速索引 / 收口层

## 6. 迁移原则

### 6.1 旧“一级=具体文档类型”是过渡态

当前数据库里已经有一批：

- 一级 = `建设工程合同`
- 二级 = `通用`

这些不是最终结构，只是为了先把运行链路跑通。

### 6.2 未来迁移目标

应逐步迁成：

- 一级 = `合同`
- 二级 = `建设工程合同`
- 规则集继续挂二级

也就是说，未来需要把“当前一级里的具体文档类型”下沉成真正的二级。

## 7. 推荐迁移步骤

### 步骤 1：冻结语义

先统一团队口径：

- 一级 = 业务大类
- 二级 = 具体业务类型
- 规则集 = 只挂二级
- 一级 = 入口模块绑定对象

### 步骤 2：后端先支持双语义兼容

后端接口先支持：

- 一级可绑定 `entry_module_id`
- 二级继续绑定 `document_type_id`
- `/by-document-types` 允许从“二级文档类型”反查所属一级

这样即使数据库还没完全迁，也能先把接口语义准备好。

### 步骤 3：前端页面改口径

`/rule-groups` 需逐步改为：

- 一级显示业务大类
- 二级显示具体业务类型
- 页面突出一级与入口模块关系

### 步骤 4：测试库迁移旧树

建议先在测试库按以下思路演练：

1. 建立一级：`合同`
2. 建立一级：`卷宗`
3. 将现有“建设工程合同 / 买卖合同 / 停业办理 ...”迁成各自二级
4. 把原二级下规则集保留在新二级
5. 清理旧默认 `通用` 子类型，仅在确实没有继续细分的情况下保留

### 步骤 5：再落正式库

正式库迁移必须在测试通过后执行，避免规则命中错位。

## 8. 运行时唯一正确规则

迁移完成后，唯一正确的运行规则应为：

1. 用户进入某入口模块
2. 系统确定该入口可见的一级分组
3. 用户选择具体二级分组
4. 后端按 `groupId` 查询 `leaudit_rule_group_bindings`
5. 找到对应规则集
6. 取规则集可执行版本执行评查

即：

- 文档类型页：总览
- 分组页：运行绑定
- 上传页：按二级分组命中

## 9. 当前开发阶段结论

截至当前：

- “规则集挂二级”这部分方向是对的
- “一级=具体文档类型”这部分已被产品新口径推翻
- 后续开发应转向“一级=业务大类、一级绑定入口、二级=具体业务类型”

因此接下来所有实现都应围绕这条新口径继续推进，而不是再沿旧过渡模型加深。
