# LeAudit 开发任务拆解清单

## 1. 目标

基于以下两份文档，进一步拆出一份可执行的开发任务清单，并尽量精确到建议修改文件：

- `docs/规则编辑/yaml规则在线编辑设计.md`
- `docs/规则编辑/跑通全流程所需准备项.md`

本清单覆盖的目标不是单点“规则编辑”，而是完整业务链路：

```text
上传文档
  → 获取文件真源
  → OCR
  → 抽取
  → 评查
  → 结果落库
  → 查询运行状态 / 结果
  → 再扩展到 YAML 在线编辑 / 发布 / 回滚
```

---

## 2. 当前代码现状摘要

在开始任务前，先明确当前代码的真实状态。

> 2026-04-27 补充结论：结合 `/home/wren-dev/Porject/leaudit/src` 源码确认，
> 当前 `leaudit` 的正式执行入口应视为：
> `AuditCtx` + `AuditService.audit(ctx)`。
> 因此本清单中的后续任务，默认都以“保留 Bridge，但禁止平台自己重写主流程编排”为前提。

### 2.1 已有骨架

- 评查控制器：
  - `fastapi_modules/fastapi_leaudit/controllers/auditController.py`
- 评查服务接口/实现：
  - `fastapi_modules/fastapi_leaudit/services/auditService.py`
  - `fastapi_modules/fastapi_leaudit/services/impl/auditServiceImpl.py`
- bridge 层：
  - `fastapi_modules/fastapi_leaudit/leaudit_bridge/pipeline.py`
  - `fastapi_modules/fastapi_leaudit/leaudit_bridge/tasks.py`
  - `fastapi_modules/fastapi_leaudit/leaudit_bridge/rules_loader.py`
  - `fastapi_modules/fastapi_leaudit/leaudit_bridge/storage_adapter.py`
  - `fastapi_modules/fastapi_leaudit/leaudit_bridge/ctx_builder.py`
- 模型：
  - `fastapi_modules/fastapi_leaudit/models/leauditDocument.py`
  - `fastapi_modules/fastapi_leaudit/models/leauditDocumentFile.py`
  - `fastapi_modules/fastapi_leaudit/models/leauditAuditRun.py`
- 规则服务接口骨架：
  - `fastapi_modules/fastapi_leaudit/services/ruleService.py`
  - `fastapi_modules/fastapi_leaudit/domian/vo/ruleVo.py`

### 2.2 当前主要缺口

- `AuditServiceImpl.Run()` 已可创建 run 并触发 NativeRunner 任务
- `GetResult()` 已可查询 `leaudit_rule_results`
- 规则文件主链已开始支持 `run -> rule_version -> oss_url -> 本地临时 YAML`
- `tasks.py` 仍保留 `LEAUDIT_RULES_DIR` 和 `_TYPE_ID_RULES_MAP` 作为 fallback
- 尚未看到规则编辑控制器与 `RuleServiceImpl`
- 尚未形成统一 OSS 文件服务
- 结果写入仍有“按 document_id 找最新 run”的简化逻辑

因此，任务拆解应该分两层：

- **P0：先把上传 → OCR → 抽取 → 评查 → 查询打通**
- **P1/P2：再把规则 OSS 化、版本化、在线编辑化**

---

## 3. 分阶段开发任务清单

## P0：先打通最小评查闭环

目标：

```text
上传文档
  → 创建 document / file / run
  → bridge 执行 OCR / 抽取 / 评查
  → 落库
  → 查到 run 状态与结果
```

---

### P0-1：补齐评查服务入口

#### 任务说明

把 `POST /api/audit/run` 从“只抛异常”改成真正可执行的评查入口。

#### 需要修改

- `fastapi_modules/fastapi_leaudit/services/impl/auditServiceImpl.py`
- `fastapi_modules/fastapi_leaudit/services/auditService.py`
- `fastapi_modules/fastapi_leaudit/domian/Dto/auditDto.py`
- `fastapi_modules/fastapi_leaudit/domian/vo/auditVo.py`

#### 具体工作

- 在 `Run()` 中完成：
  - 校验文档是否存在
  - 查当前可执行文件版本
  - 计算 `run_no`
  - 创建 `leaudit_audit_runs`
  - 调用 `dispatch_leaudit_task()`
  - 返回 `AuditRunVO`
- 调整 `IAuditService.Run()` 的接口定义，使其与实现参数一致
- 如有必要，为 `AuditRunDTO` 增加可选字段：
  - `documentFileId`
  - `force`
  - `ruleType`
  - `ruleVersionId`（可选，便于指定版本重跑）

#### 产出目标

- 调用 `/api/audit/run` 不再报 “Celery 任务集成待实现”
- 至少能创建 run 并触发 bridge 层执行

---

### P0-2：补齐 run 创建与状态更新逻辑

#### 任务说明

把 run 作为整条链的中心对象，保证每次执行都能明确追踪。

#### 需要修改

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

#### 具体工作

- 在触发评查前创建 `leaudit_audit_runs`
- 明确 run 初始字段：
  - `status=pending`
  - `phase=normalize` 或空
  - `startedAt`
  - `documentFileId`
  - `ruleSetId`
  - `ruleVersionId`
- 执行链中显式传递 `run_id`
- `storage_adapter.py` 所有落库方法改为：
  - 不再“按 `document_id` 查最新 run”
  - 统一显式使用 `run_id`

#### 产出目标

- 所有结果写入能严格绑定到唯一 `run_id`
- 避免多次重跑 / 并发时结果串写

---

### P0-3：补齐文件输入链

#### 任务说明

在执行 OCR 前，明确“这次评查使用哪一个文件”。

#### 需要修改

- `fastapi_modules/fastapi_leaudit/models/leauditDocument.py`
- `fastapi_modules/fastapi_leaudit/models/leauditDocumentFile.py`
- `fastapi_modules/fastapi_leaudit/leaudit_bridge/ctx_builder.py`
- `fastapi_modules/fastapi_leaudit/services/impl/auditServiceImpl.py`

#### 建议新增

- `fastapi_modules/fastapi_leaudit/services/documentService.py`
- `fastapi_modules/fastapi_leaudit/services/impl/documentServiceImpl.py`
  或
- `fastapi_modules/fastapi_leaudit/services/fileService.py`
- `fastapi_modules/fastapi_leaudit/services/impl/fileServiceImpl.py`

#### 具体工作

- 增加“获取当前有效文件”的服务方法
- 根据 `document_id` 找到当前激活的 `leaudit_document_files`
- 如果文件在 OSS，先下载到本地临时路径
- 给 pipeline 提供稳定的 `file_path`

#### 产出目标

- 评查入口不依赖调用方直接传原始字节
- 可以从数据库+文件真源独立还原执行输入

---

### P0-4：打通 bridge 任务入口

#### 任务说明

让 `dispatch_leaudit_task()` 真正成为评查执行入口，而不是演示性同步封装。
但注意：这里的“执行入口”不是继续扩写平台自编排 pipeline，而是逐步过渡到：

```text
build AuditCtx
  → call AuditService.audit(ctx)
  → persist ctx outputs
```

#### 需要修改

- `fastapi_modules/fastapi_leaudit/leaudit_bridge/tasks.py`
- `fastapi_modules/fastapi_leaudit/leaudit_bridge/__init__.py`
- `fastapi_modules/fastapi_leaudit/leaudit_bridge/pipeline.py`

#### 建议新增

- `fastapi_modules/fastapi_leaudit/leaudit_bridge/audit_ctx_builder.py`
- `fastapi_modules/fastapi_leaudit/leaudit_bridge/audit_service_factory.py`

#### 具体工作

- 统一 `dispatch_leaudit_task()` 的入参：
  - `run_id`
  - `document_id`
  - `document_file_id`
  - `rules_path` 或 `rule_version_id`
  - 可选 `trigger_user_id`
- 逐步去掉 `source_port` 作为主上下文依赖
- 允许先同步执行，后续再切 Celery
- 逐步让 `pipeline.py` 退化为薄包装层，而不是 7 阶段自编排器
- 在 bridge 内部统一完成：
  - `AuditServices` 构造
  - `AuditConfig` 构造
  - 原生 `AuditCtx` 构造
  - `AuditService.audit(ctx)` 调用

#### 产出目标

- 业务层只调一个稳定入口
- bridge 层掌控实际执行上下文
- 主流程编排回归 `leaudit` 原生服务层

---

### P0-5：补齐结果查询接口

#### 任务说明

不仅要能跑，还要能看到结果。

#### 需要修改

- `fastapi_modules/fastapi_leaudit/services/impl/auditServiceImpl.py`
- `fastapi_modules/fastapi_leaudit/controllers/auditController.py`
- `fastapi_modules/fastapi_leaudit/domian/vo/auditVo.py`

#### 具体工作

- `GetRunStatus()` 查询真实 run 状态
- `GetResult()` 从以下表联合查询：
  - `leaudit_audit_runs`
  - `leaudit_rule_results`
  - 可选 `leaudit_field_results`
- 把 `rules=[]` 改成真实规则级返回
- 如有必要，为 `AuditResultVO` 增加：
  - `timing`
  - `fields`
  - `errors`

#### 产出目标

- `/api/audit/result/{RunId}` 能返回真实评查结果

---

### P0-6：补齐结果落库结构

#### 任务说明

当前 `StorageAdapter` 已有雏形，但还需要工程化加固。

#### 需要修改

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

#### 具体工作

- 所有保存方法显式接收 `run_id`
- 补 `run_metrics` 写入
- 补 `run_errors` 写入
- 梳理 `artifacts` 与 `field_results` 的最小必要字段
- 保持 `rule_results` 与 `AuditResultVO` 的结构一致

#### 产出目标

- 结果写入不再依赖“最新 run”猜测
- 后续前端查询更稳定

---

## P1：把规则执行链切到 OSS + DB

目标：

```text
文档类型
  → 绑定表
  → 规则集
  → 当前版本
  → OSS YAML
  → 下载本地临时文件
  → leaudit 执行
```

---

### P1-1：补规则读取服务

#### 任务说明

把规则加载从“本地目录路径”升级成“DB + OSS + 临时文件”。

#### 当前状态

这一项已经完成第一阶段落地：

- `auditServiceImpl.py` 会在建 run 时锁定 `ruleVersionId` 与 `ruleSourceOssUrl`
- `tasks.py` 会优先按 `run_id` 解析规则来源
- `ruleVersionResolver.py` 会把 OSS YAML 下载到本地临时文件
- `RulesLoader.load(local_path)` 已接入执行链

当前剩余工作已经从“能不能执行”变成“如何把上传 / 发布 / 缓存 / 回收做完整”。

#### 需要修改

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

#### 建议新增

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

#### 具体工作

- 根据 run 锁定的 `rule_version_id` / `rule_source_oss_url` 解析规则来源
- 下载 YAML 到本地临时文件
- 校验 `rule_source_sha256`
- 调 `load_rules_file(local_path)`
- 继续保留本地 `rules/` 作为 fallback

#### 产出目标

- 执行时优先走 run 绑定规则版本，而不是 `_TYPE_ID_RULES_MAP`
- 原生 `AuditCtx.rules_file` 由 bridge 正式注入，而不是平台手工绕过服务编排层

---

### P1-2：补统一 OSS 文件服务

#### 任务说明

项目当前有 OSS 配置，但缺少统一文件服务。

#### 需要修改

- `fastapi_admin/config/_settings.py`（仅在配置不够时）

#### 建议新增

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

如果不想放到 `fastapi_common/`，也可以先放：

- `fastapi_modules/fastapi_leaudit/services/ossService.py`
- `fastapi_modules/fastapi_leaudit/services/impl/ossServiceImpl.py`

#### 具体工作

- 提供统一方法：
  - 上传文件到 OSS
  - 下载到本地临时文件
  - 计算 / 校验 sha256
  - 删除临时文件
- 同时兼容：
  - 规则文件
  - 原始文档
  - 评查产物

#### 产出目标

- 文档文件和规则文件都可以共用一套对象存储服务

---

### P1-3：补规则版本与绑定的查询模型

#### 任务说明

当前代码里还没有看到对应规则表的 ORM / 查询对象，后续查询会比较痛苦。

#### 建议新增

- `fastapi_modules/fastapi_leaudit/models/leauditRuleSet.py`
- `fastapi_modules/fastapi_leaudit/models/leauditRuleVersion.py`
- `fastapi_modules/fastapi_leaudit/models/leauditRuleTypeBinding.py`
- 更新 `fastapi_modules/fastapi_leaudit/models/__init__.py`

#### 具体工作

- 为规则集、规则版本、绑定表建立 ORM
- 后续服务层不必到处手写 SQL

#### 产出目标

- 规则管理服务、规则解析服务都能清晰建模

---

## P2：开放 YAML 在线编辑 / 发布 / 回滚

目标：

让规则成为后台可管理资产，而不是服务器上的裸文件。

---

### P2-1：补规则控制器与服务实现

#### 任务说明

当前只有 `IRuleService` 接口，需要真正落地规则后台。

#### 需要修改

- `fastapi_modules/fastapi_leaudit/services/ruleService.py`
- `fastapi_modules/fastapi_leaudit/domian/vo/ruleVo.py`

#### 建议新增

- `fastapi_modules/fastapi_leaudit/controllers/ruleController.py`
- `fastapi_modules/fastapi_leaudit/services/impl/ruleServiceImpl.py`
- `fastapi_modules/fastapi_leaudit/domian/Dto/ruleDto.py`

#### 具体工作

- 完成接口：
  - 列表
  - 版本历史
  - 查看内容
  - 保存版本
  - 校验
  - 发布
  - 回滚
- 为 controller 增加路由

#### 产出目标

- 后台可以真正管理规则

---

### P2-2：补规则内容查看/保存接口

#### 建议新增

- `fastapi_modules/fastapi_leaudit/domian/Dto/ruleContentDto.py`

#### 具体工作

- 定义：
  - 保存 YAML 文本请求 DTO
  - 规则校验响应 VO
  - 规则内容响应 VO
- 从 OSS 读回内容展示给前端
- 新版本保存时先写 OSS，再写 DB

#### 产出目标

- 前端可以拿到 YAML 文本并保存新版本

---

### P2-3：补 YAML 语法校验 + DSL 语义校验

#### 建议新增

- `fastapi_modules/fastapi_leaudit/services/ruleValidationService.py`
- `fastapi_modules/fastapi_leaudit/services/impl/ruleValidationServiceImpl.py`

#### 具体工作

- YAML 解析校验
- `leaudit` DSL schema 校验
- 提取 metadata 快照
- 形成标准错误列表

#### 产出目标

- 发布前可拦截坏规则

---

### P2-4：补发布、回滚、审计

#### 需要修改

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

#### 建议新增

- `fastapi_modules/fastapi_leaudit/models/leauditRulePublishLog.py`
- `fastapi_modules/fastapi_leaudit/models/leauditRuleValidationLog.py`

如果暂时不建 ORM，也至少需要：

- 对应 SQL migration / 建表脚本

#### 具体工作

- 发布时更新 `current_version_id`
- 写发布日志
- 回滚时写回滚日志
- 记录操作者与时间

#### 产出目标

- 规则变更具备可审计性

---

## P3：补平台级工程能力

目标：

让系统从“能跑”升级到“可持续运行”。

---

### P3-1：Celery / Redis 正式接入

#### 需要修改

- `fastapi_modules/fastapi_leaudit/leaudit_bridge/tasks.py`
- `fastapi_modules/fastapi_leaudit/tasks/__init__.py`
- `fastapi_admin/config/_settings.py`

#### 建议新增

- `fastapi_common/fastapi_common_cache/redis_pool.py`
- `fastapi_modules/fastapi_leaudit/tasks/celery_app.py`

#### 具体工作

- 同步任务改为异步分发
- 配置任务超时 / 重试 / 队列

---

### P3-2：规则缓存与发布失效

#### 需要修改

- `fastapi_modules/fastapi_leaudit/leaudit_bridge/rules_loader.py`
- `fastapi_modules/fastapi_leaudit/services/impl/ruleServiceImpl.py`

#### 具体工作

- 规则缓存 key 改为 `rule_version_id` 或 `oss_url + sha256`
- 发布后清缓存
- 多 worker 时设计统一失效策略

---

### P3-3：结果增强与诊断能力

#### 需要修改

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

#### 具体工作

- 完整落 `run_metrics`
- 完整落 `run_errors`
- 补 `rescue_outcomes`
- 前端可查看错误详情、阶段耗时

---

## 4. 建议新增文件总表

下面是我建议优先考虑新增的文件，便于你按模块建任务：

### 规则管理

- `fastapi_modules/fastapi_leaudit/controllers/ruleController.py`
- `fastapi_modules/fastapi_leaudit/services/impl/ruleServiceImpl.py`
- `fastapi_modules/fastapi_leaudit/services/ruleValidationService.py`
- `fastapi_modules/fastapi_leaudit/services/impl/ruleValidationServiceImpl.py`
- `fastapi_modules/fastapi_leaudit/services/ruleResolverService.py`
- `fastapi_modules/fastapi_leaudit/services/impl/ruleResolverServiceImpl.py`
- `fastapi_modules/fastapi_leaudit/domian/Dto/ruleDto.py`
- `fastapi_modules/fastapi_leaudit/domian/Dto/ruleContentDto.py`

### 规则 ORM

- `fastapi_modules/fastapi_leaudit/models/leauditRuleSet.py`
- `fastapi_modules/fastapi_leaudit/models/leauditRuleVersion.py`
- `fastapi_modules/fastapi_leaudit/models/leauditRuleTypeBinding.py`
- `fastapi_modules/fastapi_leaudit/models/leauditRulePublishLog.py`
- `fastapi_modules/fastapi_leaudit/models/leauditRuleValidationLog.py`

### 文件与存储

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

### 原生 AuditCtx 接入

- `fastapi_modules/fastapi_leaudit/leaudit_bridge/audit_ctx_builder.py`
- `fastapi_modules/fastapi_leaudit/leaudit_bridge/audit_service_factory.py`

### 文档执行输入

- `fastapi_modules/fastapi_leaudit/services/documentService.py`
- `fastapi_modules/fastapi_leaudit/services/impl/documentServiceImpl.py`

### 异步任务 / 缓存

- `fastapi_modules/fastapi_leaudit/tasks/celery_app.py`
- `fastapi_common/fastapi_common_cache/redis_pool.py`

---

## 5. 建议优先修改文件总表

如果按“先把主链跑通”的角度，最优先改的文件是：

1. `fastapi_modules/fastapi_leaudit/services/impl/auditServiceImpl.py`
2. `fastapi_modules/fastapi_leaudit/leaudit_bridge/tasks.py`
3. `fastapi_modules/fastapi_leaudit/leaudit_bridge/storage_adapter.py`
4. `fastapi_modules/fastapi_leaudit/leaudit_bridge/rules_loader.py`
5. `fastapi_modules/fastapi_leaudit/leaudit_bridge/ctx_builder.py`
6. `fastapi_modules/fastapi_leaudit/domian/vo/auditVo.py`
7. `fastapi_modules/fastapi_leaudit/services/ruleService.py`
8. `fastapi_modules/fastapi_leaudit/domian/vo/ruleVo.py`
9. `fastapi_modules/fastapi_leaudit/models/__init__.py`
10. `fastapi_admin/config/_settings.py`

---

## 6. 推荐执行顺序

如果按最稳妥的方式推进，我建议这样做：

### 第一阶段：只做主链闭环

- 改 `AuditServiceImpl`
- 改 `tasks.py`
- 新增 `audit_ctx_builder.py`
- 新增 `audit_service_factory.py`
- 改 `storage_adapter.py`
- 改 `GetResult()`

目标：先能跑通上传后评查与结果查询。

### 第二阶段：切规则到 OSS + DB

- 补规则 ORM
- 改 `rules_loader.py`
- 加 OSS 文件服务

目标：评查执行真正使用数据库发布的规则版本。

### 第三阶段：开放规则后台

- 加 `ruleController.py`
- 加 `RuleServiceImpl`
- 加校验服务
- 加发布/回滚日志

目标：前端可编辑、发布、回滚 YAML。

### 第四阶段：工程化增强

- Celery / Redis
- 缓存失效
- 审计
- metrics / errors / rescue

目标：从“能跑”变成“可运营”。

---

## 7. 一句话结论

如果你要的是“基于当前代码库，把功能拆成能开发的任务”，那么真正的主线不是先做编辑器，而是：

1. 先把 `auditServiceImpl + bridge + storageAdapter` 打通  
2. 再把 `rules_loader` 从本地目录切到 `OSS + DB`  
3. 最后再做 `ruleController + RuleServiceImpl + 校验/发布/回滚`

也就是说：

- **第一优先级是评查主链**
- **第二优先级是规则执行链**
- **第三优先级才是规则编辑后台**

这样开发成本最低，验证路径也最清晰。
