# LeAudit 规则链路实施总方案

> 说明：这份文档是当前 `docs/规则编辑/` 目录的主实施文档。
> 原 `开发任务拆解清单.md` 的任务顺序、文件清单与验收口径，后续统一以本文件为准。
> 原 `跑通全流程所需准备项.md` 的能力清单，也统一归并到本文件维护。
> 原 `yaml规则在线编辑设计.md` 与 `worker并发执行改造方案.md` 的核心口径，也统一归并到本文件维护。

## 背景

当前 `leaudit-platform` 已经完成第一阶段原生执行链接入：

- 文档文件已开始支持 `ossUrl -> 本地临时文件 -> NativeRunner`
- 规则文件已开始支持 `run -> rule_source_oss_url -> 本地临时 YAML -> NativeRunner`
- 执行核心已经切到原生 `AuditCtx` / `AuditService`
- `leaudit` 核心不修改，平台继续通过 bridge 适配

但当前仍有三个关键缺口没有真正完成闭环：

1. 还没有统一 OSS 服务，文档/规则下载仍是临时实现
2. 还没有完整的规则 YAML 管理后端能力
3. 还没有把“上传 → OCR → 抽取 → 评查 → 查询结果”整条链路正式联调跑通

因此需要制定一份统一实施计划，按依赖顺序把这三块一起完成。

---

## 总目标

本轮实施的目标分为三部分：

### 目标 1：统一 OSS 服务

把当前 bridge 中分散的下载逻辑收敛成统一的 OSS / MinIO 能力层，供文档文件、规则 YAML、运行产物三类对象复用。

### 目标 2：补齐规则管理后端

支持规则 YAML 的：

- 内容校验
- 新版本上传
- 版本持久化
- 当前版本发布
- 历史版本回滚
- 版本正文读取

并为后续在线编辑界面提供稳定后端。

### 目标 3：打通完整评查流程

跑通最小完整业务闭环：

```text
上传文档
  -> 文档入库
  -> 文件入 OSS / 或存在可访问真源
  -> 创建 run
  -> 下载文档到本地临时文件
  -> 下载规则 YAML 到本地临时文件
  -> Native AuditCtx 执行
  -> OCR / 抽取 / 评查
  -> 结果写回 leaudit_*
  -> 查询运行状态和结果
```

---

## 当前已完成基线

### 已完成

- `AuditServiceImpl.Run()` 已可创建 `leaudit_audit_runs` 并触发执行
- `AuditServiceImpl.GetResult()` 已可读取 `leaudit_rule_results`
- 文档文件执行链已接入：
  - `LeauditDocumentFile.localPath`
  - `LeauditDocumentFile.ossUrl`
- 规则文件执行链已接入：
  - `LeauditAuditRun.ruleVersionId`
  - `LeauditAuditRun.ruleSourceOssUrl`
  - `run -> oss_url -> 本地临时 YAML -> RulesLoader -> NativeRunner`
- bridge 层已经新增：
  - `auditCtxBuilder.py`
  - `auditServiceFactory.py`
  - `nativeRunner.py`
  - `fileSourceResolver.py`
  - `ruleVersionResolver.py`

### 尚未完成

- 统一 OSS client / path utils 还未落地
- 规则上传 / 发布 / 回滚 / 读正文接口还未落地
- YAML 语法校验和 DSL 语义校验还未形成正式服务
- `run_metrics` / `run_errors` / `rescue_outcomes` 持久化还未补齐
- 全流程 E2E 还未完成真实联调

### 当前实施进展（2026-04-27）

- `M1` 已开始落地：
  - 已补 `OSS_USE_SSL` / `OSS_PRESIGN_EXPIRE_SECONDS` 等配置项
  - 已新增统一 `OssClient` 与 `OssPathUtils`
  - `fileSourceResolver.py` / `ruleVersionResolver.py` 已开始接统一 OSS 服务
- `M2` 已开始落地：
  - 已新增 `ruleValidator.py`
  - 已补 `ruleServiceImpl.py`
  - 已新增 `ruleController.py`
  - 已补规则版本创建 / 校验 / 发布 / 回滚 / 正文读取接口骨架
- `M3` 已开始落地：
  - 已按 `docs/AuditCtx深度解读-2026-04-27.html` 复用原生 `AuditCtx` 语义
  - 已开始把 `ctx.timing` / `ctx.fallback_tasks` / 抽取错误落库到运行级表
- `M4` 仍待继续实施

---

## 总体实施分期

建议分 4 个里程碑实施：

- `M1`：统一 OSS 基础设施
- `M2`：规则管理后端能力
- `M3`：执行链正式化与结果持久化补齐
- `M4`：全流程联调与验收

实施顺序必须按依赖推进，不建议跳步。

---

## M1：统一 OSS 基础设施

### M1-1 配置模型标准化

#### 目标

统一 OSS / MinIO 的配置读取方式，为后续文档和规则服务提供底层能力。

#### 需要处理

- 新增或确认 OSS 配置项
- 保证配置能从 `app.toml` / 环境变量进入 Settings
- 补齐 `__init__.pyi` 类型声明

#### 建议配置项

- `OSS_ENDPOINT`
- `OSS_BUCKET`
- `OSS_ACCESS_KEY`
- `OSS_SECRET_KEY`
- `OSS_REGION`
- `OSS_USE_SSL`
- `OSS_PUBLIC_BASE_URL`
- `OSS_PRESIGN_EXPIRE_SECONDS`

#### 需要修改的文件

- `fastapi_admin/config/_settings.py`
- `fastapi_admin/config/__init__.pyi`
- 环境配置文件（如有）

#### 完成标准

- 业务代码可以统一 import OSS 配置
- IDE 类型可识别
- 开发 / 测试 / 生产环境可分离

### M1-2 统一 OSS Client

#### 目标

提供平台统一的上传、下载、presign 和对象存在性判断能力。

#### 建议新增文件

- `fastapi_common/fastapi_common_storage/oss_client.py`
- `fastapi_common/fastapi_common_storage/oss_path_utils.py`

#### 最低能力要求

- 上传 bytes
- 上传文本
- 上传本地文件
- 下载 bytes
- 下载到本地临时文件
- 判断对象是否存在
- 生成 presigned URL
- 统一返回 object key / url

#### 完成标准

- 规则和文档两条链都能复用同一套 OSS 接口
- bridge 代码中不再直接写 `urlopen`

### M1-3 统一 OSS 路径生成工具

#### 目标

把文档中约定的路径规范落实为代码工具，避免业务层散写路径字符串。

#### 路径规范

```text
bdocs/{region}/{type_code}/{doc_id}/{version}/{file_role}.{ext}
artifacts/{region}/{run_id}/{artifact_type}/{detail}.{ext}
rules/{rule_type}/{version_no}/rules.yaml
rules/{rule_type}/{version_no}/validation_report.json
```

#### 需要实现的方法

- `BuildBusinessDocKey(...)`
- `BuildArtifactKey(...)`
- `BuildRuleYamlKey(...)`
- `BuildRuleValidationReportKey(...)`

#### 完成标准

- 上传文档、上传规则、记录产物时统一生成 key
- 路径规范不再散落在业务代码中

### M1-4 接管当前 bridge 下载逻辑

#### 目标

把 bridge 中当前临时下载逻辑接到统一 OSS 服务。

#### 需要修改的文件

- `fastapi_modules/fastapi_leaudit/leaudit_bridge/fileSourceResolver.py`
- `fastapi_modules/fastapi_leaudit/leaudit_bridge/ruleVersionResolver.py`

#### 完成标准

- 文档下载统一经 OSS client
- 规则下载统一经 OSS client
- 支持正式私有桶而不只依赖公开 HTTP/HTTPS

---

## M2：规则管理后端能力

### M2-1 补规则服务接口

#### 目标

把规则服务从当前骨架扩展为完整规则生命周期服务。

#### 建议能力

- 查询规则集列表
- 查询规则版本列表
- 查询指定版本正文
- 校验 YAML
- 创建新规则版本
- 发布规则版本
- 回滚规则版本

#### 需要修改或新增的文件

- `fastapi_modules/fastapi_leaudit/services/ruleService.py`
- `fastapi_modules/fastapi_leaudit/services/impl/ruleServiceImpl.py`

#### 完成标准

- Service 层接口稳定
- 后续 controller 只做 DTO 拆值与返回

### M2-2 补 DTO / VO / BO

#### 目标

为规则管理接口提供规范化入参与出参。

#### 建议新增文件

- `fastapi_modules/fastapi_leaudit/domian/Dto/ruleVersionCreateDto.py`
- `fastapi_modules/fastapi_leaudit/domian/Dto/ruleValidateDto.py`
- `fastapi_modules/fastapi_leaudit/domian/Dto/rulePublishDto.py`
- `fastapi_modules/fastapi_leaudit/domian/vo/ruleVersionVo.py`
- `fastapi_modules/fastapi_leaudit/domian/vo/ruleContentVo.py`
- `fastapi_modules/fastapi_leaudit/domian/bo/ruleVersionCreateBo.py`

#### 完成标准

- 字段统一 lowerCamelCase
- Controller 只接 DTO
- Service 返回 VO / BO

### M2-3 实现规则校验服务

#### 目标

为在线编辑和发布提供保存前 / 发布前的双层校验能力。

#### 校验层次

##### 第一层：YAML 语法校验

- 缩进
- 基本结构
- 能否解析

##### 第二层：LeAudit DSL 语义校验

- `metadata` 是否完整
- `type_id` / `name` / `version` 是否有效
- rule / extract / stage 结构是否合法
- 字段引用是否一致
- phase / risk / score / activate_if 是否符合 DSL 约束

#### 建议新增文件

- `fastapi_modules/fastapi_leaudit/leaudit_bridge/ruleValidator.py`

#### 完成标准

- 非法 YAML 不能发布
- 校验错误可返回给前端展示

### M2-4 实现规则版本上传与落库

#### 目标

让规则版本真正以“OSS 存正文、DB 存索引”的方式保存。

#### 处理步骤

```text
接收 YAML 文本
  -> 语法校验
  -> DSL 校验
  -> 计算 sha256 / file_size
  -> 生成 rules/{rule_type}/{version_no}/rules.yaml
  -> 上传 OSS
  -> 写 leaudit_rule_versions
  -> 需要时写 validation_report.json
```

#### 需要修改的文件

- `fastapi_modules/fastapi_leaudit/services/impl/ruleServiceImpl.py`
- `fastapi_common/fastapi_common_storage/oss_path_utils.py`

#### 完成标准

- `leaudit_rule_versions` 中完整记录：
  - `oss_url`
  - `file_sha256`
  - `file_size`
  - `metadata_type_id`
  - `metadata_name`
  - `metadata_version`

### M2-5 实现发布与回滚

#### 目标

通过切换 `leaudit_rule_sets.current_version_id` 管理当前生效版本。

#### 处理要求

- 发布时更新当前生效版本
- 回滚时切换回历史版本
- 保留审计信息
- 不影响历史 run 对旧版本的追溯

#### 完成标准

- 新 run 会自动使用新版本
- 老 run 仍保留历史规则来源

### M2-6 暴露规则管理控制器

#### 目标

为后续规则编辑页面提供 API。

#### 建议新增文件

- `fastapi_modules/fastapi_leaudit/controllers/ruleController.py`

#### 建议接口

- `GET /api/leaudit/rule-sets`
- `GET /api/leaudit/rule-sets/{ruleType}/versions`
- `GET /api/leaudit/rule-versions/{versionId}/content`
- `POST /api/leaudit/rule-sets/{ruleType}/validate`
- `POST /api/leaudit/rule-sets/{ruleType}/versions`
- `POST /api/leaudit/rule-sets/{ruleType}/publish`
- `POST /api/leaudit/rule-sets/{ruleType}/rollback`

#### 完成标准

- 前端可直接基于这些接口做查看、编辑、发布、回滚
- 响应统一走 `Result`

---

## M3：执行链正式化与持久化补齐

### M3-1 文档来源解析正式接入 OSS 服务

#### 目标

把 `fileSourceResolver.py` 从临时 URL 下载升级为正式存储接入。

#### 处理优先级

1. 优先 `localPath`
2. 否则走 `ossUrl` / object key
3. 落本地临时文件或 bytes 交给执行链

#### 需要修改的文件

- `fastapi_modules/fastapi_leaudit/leaudit_bridge/fileSourceResolver.py`

#### 完成标准

- 文档来源解析不再直接依赖 `urllib`
- 后续换 OSS 实现无需改业务层

### M3-2 规则来源解析正式接入 OSS 服务

#### 目标

把 `ruleVersionResolver.py` 升级为正式的规则版本来源解析器。

#### 标准链路

```text
run_id
  -> leaudit_audit_runs.rule_version_id
  -> leaudit_audit_runs.rule_source_oss_url
  -> 下载规则 YAML
  -> sha256 校验
  -> 写本地临时 YAML
  -> RulesLoader.load(local_path)
```

#### 需要修改的文件

- `fastapi_modules/fastapi_leaudit/leaudit_bridge/ruleVersionResolver.py`

#### 完成标准

- 执行优先绑定具体规则版本
- 不再主要依赖 `_TYPE_ID_RULES_MAP`

### M3-3 补全运行结果持久化

#### 目标

把 NativeRunner 当前未落库的数据继续补齐。

#### 需要补的内容

- `leaudit_run_metrics`
- `leaudit_run_errors`
- `rescue_outcomes`
- `finishedAt`
- `resultStatus`
- 必要的 artifact 索引

#### 需要修改的文件

- `fastapi_modules/fastapi_leaudit/leaudit_bridge/nativeRunner.py`
- `fastapi_modules/fastapi_leaudit/leaudit_bridge/storage_adapter.py`

#### 完成标准

- 一次 run 的关键结果和错误都能追溯
- 不再只落 `ocr/extract/evaluate/rule_results`

### M3-4 明确 run 状态机

#### 目标

统一 run 的状态与 phase 更新逻辑。

#### 建议状态

- `pending`
- `running`
- `completed`
- `failed`

#### 需要修改的文件

- `fastapi_modules/fastapi_leaudit/leaudit_bridge/tasks.py`
- `fastapi_modules/fastapi_leaudit/services/impl/auditServiceImpl.py`

#### 完成标准

- 前端轮询可看到真实运行进度
- 失败时能准确落状态和错误信息

---

## M4：全流程联调与验收

### M4-1 梳理上传入口

#### 目标

确认现有上传能力到底走哪些 controller / service，以及上传后是否已形成：

- `leaudit_documents`
- `leaudit_document_files`
- 文件来源记录
- 当前活跃版本标记

#### 需要重点检查的位置

- `fastapi_modules/fastapi_leaudit/controllers/`
- `fastapi_modules/fastapi_leaudit/services/`
- 文档上传相关 service / controller

#### 完成标准

- 明确上传后如何进入评查系统

#### 当前进展（2026-04-28）

- 已确认当前仓库原先没有现成的 LeAudit 文档上传入口
- 已补最小可用上传接口：`POST /upload`
- 已新增上传服务链：
  - `DocumentController`
  - `IDocumentService`
  - `DocumentServiceImpl`
- 当前上传链已实现：

```text
multipart file
  -> 上传 OSS
  -> 写 leaudit_documents
  -> 写 leaudit_document_files
  -> autoRun=true 时直接进入 AuditServiceImpl.Run()
```

### M4-2 接通上传后触发评查

#### 目标

形成稳定用户操作路径。

#### 最小可接受路径

##### 路径 A：两步操作

```text
上传文档
  -> 手工点击触发评查
```

##### 路径 B：一步自动触发

```text
上传文档
  -> 自动创建 run 并触发评查
```

#### 完成标准

- 至少有一种路径可稳定跑通

#### 当前进展（2026-04-28）

- 路径 A“上传后手工触发评查”已具备
- 路径 B“一步自动触发”已补最小实现：

```text
POST /upload
  -> autoRun=true
  -> DocumentServiceImpl.Upload()
  -> AuditServiceImpl.Run()
```

### M4-3 补结果查询展示所需字段

#### 目标

确保前端能拿到完整结果展示数据。

#### 至少要能查到

- run 基本状态
- 总分 / 通过数 / 失败数 / 跳过数
- 规则明细
- 失败原因
- 产物地址（如有）

#### 需要重点修改的文件

- `fastapi_modules/fastapi_leaudit/services/impl/auditServiceImpl.py`
- 对应 controller / VO

#### 完成标准

- 前端拿 `runId` 可以完成结果展示

### M4-4 准备联调样例

#### 目标

准备一套可重复使用的联调数据。

#### 至少需要

- 1 份真实文档样例
- 1 条有效规则绑定
- 1 份可访问规则 YAML
- 1 套可运行配置

#### 完成标准

- 能稳定复现成功链路
- 能稳定复现失败链路

### M4-5 完成一次真实 E2E 验证

#### 验证目标链

```text
上传文档
  -> document / file 入库
  -> 文件可下载
  -> 规则 YAML 可下载
  -> Native AuditCtx 执行
  -> OCR / 抽取 / 评查完成
  -> 结果写回 DB
  -> 查询结果成功
```

#### 完成标准

- 至少成功跑通 1 个真实样例
- 至少验证 1 个失败样例
- 形成一份验收记录文档

---

## 推荐实施顺序

本轮开发建议严格按以下顺序执行：

### 第一阶段：先做 M1

- M1-1 配置模型
- M1-2 OSS client
- M1-3 路径工具
- M1-4 接管现有 bridge 下载逻辑

原因：

- 这是后续规则管理和全流程联调的共同底座

### 第二阶段：做 M2

- M2-1 规则服务接口
- M2-2 DTO / VO / BO
- M2-3 规则校验
- M2-4 新版本上传
- M2-5 发布 / 回滚
- M2-6 控制器接口

原因：

- 先把规则后端能力做实，再给前端接口

### 第三阶段：做 M3

- M3-1 文档来源正式接入
- M3-2 规则来源正式接入
- M3-3 持久化补齐
- M3-4 run 状态机

原因：

- 这是把“能跑”升级为“可维护、可观察”

### 第四阶段：做 M4

- M4-1 上传入口梳理
- M4-2 上传后触发
- M4-3 结果查询补齐
- M4-4 样例准备
- M4-5 E2E 联调

原因：

- 最后做整体验收，避免中途反复返工

---

## 高优先级文件清单

### 一定会修改的文件

- `fastapi_admin/config/_settings.py`
- `fastapi_admin/config/__init__.pyi`
- `fastapi_modules/fastapi_leaudit/leaudit_bridge/fileSourceResolver.py`
- `fastapi_modules/fastapi_leaudit/leaudit_bridge/ruleVersionResolver.py`
- `fastapi_modules/fastapi_leaudit/leaudit_bridge/tasks.py`
- `fastapi_modules/fastapi_leaudit/leaudit_bridge/nativeRunner.py`
- `fastapi_modules/fastapi_leaudit/leaudit_bridge/storage_adapter.py`
- `fastapi_modules/fastapi_leaudit/services/ruleService.py`
- `fastapi_modules/fastapi_leaudit/services/impl/auditServiceImpl.py`

### 大概率新增的文件

- `fastapi_common/fastapi_common_storage/oss_client.py`
- `fastapi_common/fastapi_common_storage/oss_path_utils.py`
- `fastapi_modules/fastapi_leaudit/services/ossService.py`
- `fastapi_modules/fastapi_leaudit/services/impl/ossServiceImpl.py`
- `fastapi_modules/fastapi_leaudit/services/impl/ruleServiceImpl.py`
- `fastapi_modules/fastapi_leaudit/controllers/ruleController.py`
- `fastapi_modules/fastapi_leaudit/leaudit_bridge/ruleValidator.py`
- `fastapi_modules/fastapi_leaudit/domian/Dto/ruleVersionCreateDto.py`
- `fastapi_modules/fastapi_leaudit/domian/Dto/ruleValidateDto.py`
- `fastapi_modules/fastapi_leaudit/domian/Dto/rulePublishDto.py`
- `fastapi_modules/fastapi_leaudit/domian/vo/ruleVersionVo.py`
- `fastapi_modules/fastapi_leaudit/domian/vo/ruleContentVo.py`
- `fastapi_modules/fastapi_leaudit/domian/bo/ruleVersionCreateBo.py`

---

## 验收口径

### M1 验收

- 文档和规则都经统一 OSS 服务访问
- bridge 中不再散落临时下载逻辑

### M2 验收

- 可以新建规则版本、读内容、发布、回滚
- YAML 正式存 OSS，元数据正式存 DB

### M3 验收

- run 与 rule version 绑定关系稳定
- 运行结果持久化完整
- 运行状态与 phase 可查询

### M4 验收

- 真实上传到评查结束可跑通
- 查询结果成功
- 有联调 / 验收记录

---

## 实施结论

本轮开发不再继续扩散平台手写评查逻辑，而是坚持以下原则：

- `leaudit` 核心不改
- 平台负责 DB / OSS / API / 权限 / 任务入口
- bridge 负责把平台语义转换成原生 `AuditCtx` 输入
- 文档与规则都采用“OSS 真源 + 数据库存索引 + 本地临时文件执行”的模式

按本计划推进后，既能保证当前原生执行链继续稳定，也能为后续 YAML 在线编辑界面和完整评查业务闭环打下正式基础。
