169 lines
4.2 KiB
Markdown
169 lines
4.2 KiB
Markdown
# 资料包导入Skill 设计
|
||
|
||
## 1. Skill 定位
|
||
|
||
`资料包导入Skill` 是资料包导入工作流的总入口 Skill,负责把用户上传的文件集合转化为一个可处理的资料包批次,并协调解包、扫描、文档登记、页数统计、章节点识别和目录汇总。
|
||
|
||
它不直接处理法规完整性,不调用 LLM,不执行 RAG 入库。
|
||
|
||
英文实现标识建议使用 `SubmissionPackageImportSkill`,用于 Python 类名和 Tool Registry 注册处理器。
|
||
|
||
## 2. 触发场景
|
||
|
||
1. 用户在 Web 工作台上传单文件。
|
||
2. 用户批量上传多个文件。
|
||
3. 用户上传压缩包。
|
||
4. 飞书入口后续触发资料包导入任务。
|
||
5. 管理员导入平台内置法规资料。
|
||
|
||
## 3. 输入
|
||
|
||
```python
|
||
@dataclass
|
||
class SubmissionPackageImportInput:
|
||
files: list[UploadedFileRef]
|
||
batch_name: str
|
||
workflow_type: str = "registration"
|
||
source_role: str = "submission"
|
||
created_by_id: int | None = None
|
||
import_options: dict = field(default_factory=dict)
|
||
```
|
||
|
||
字段说明:
|
||
|
||
| 字段 | 说明 |
|
||
|---|---|
|
||
| `files` | 用户上传文件引用 |
|
||
| `batch_name` | 资料包批次名称 |
|
||
| `workflow_type` | 注册流程类型,V1 默认 `registration` |
|
||
| `source_role` | `submission` 或 `regulation` |
|
||
| `created_by_id` | 操作人 |
|
||
| `import_options` | 是否立即页数统计、是否跳过不支持文件等选项 |
|
||
|
||
## 4. 输出
|
||
|
||
```python
|
||
@dataclass
|
||
class SubmissionPackageImportOutput:
|
||
batch_id: int
|
||
batch_no: str
|
||
status: str
|
||
overview_report: dict
|
||
warnings: list[dict]
|
||
failed_items: list[dict]
|
||
```
|
||
|
||
## 5. 依赖 Skill
|
||
|
||
1. `压缩包解包Skill`
|
||
2. `资料包扫描Skill`
|
||
3. `文档页数统计Skill`
|
||
4. `章节点识别Skill`
|
||
5. `目录汇总Skill`
|
||
|
||
## 6. 核心方法
|
||
|
||
### 6.1 `run(input) -> SubmissionPackageImportOutput`
|
||
|
||
主入口方法。
|
||
|
||
执行顺序:
|
||
|
||
1. 创建 `SubmissionBatch`。
|
||
2. 保存上传文件到批次隔离目录。
|
||
3. 对压缩包调用 `压缩包解包Skill`。
|
||
4. 调用 `资料包扫描Skill` 扫描批次目录。
|
||
5. 创建 `RegistrationDocument` 记录。
|
||
6. 调用 `文档页数统计Skill`。
|
||
7. 调用 `章节点识别Skill`。
|
||
8. 调用 `目录汇总Skill`。
|
||
9. 更新批次状态。
|
||
10. 返回目录汇总结果。
|
||
|
||
### 6.2 `create_batch(input) -> SubmissionBatch`
|
||
|
||
创建资料包批次。
|
||
|
||
状态:
|
||
|
||
1. 初始为 `created`。
|
||
2. 文件保存开始后更新为 `importing`。
|
||
3. 汇总阶段更新为 `summarizing`。
|
||
4. 成功后更新为 `completed` 或 `partial_completed`。
|
||
|
||
### 6.3 `save_uploaded_files(batch, files) -> list[StoredUpload]`
|
||
|
||
保存原始上传文件,并记录上传文件来源。
|
||
|
||
安全要求:
|
||
|
||
1. 过滤路径穿越。
|
||
2. 原始文件名只用于展示。
|
||
3. 真实存储路径使用批次目录和安全文件名。
|
||
|
||
### 6.4 `create_document_records(batch, scanned_files) -> list[RegistrationDocument]`
|
||
|
||
把扫描结果落库为文档主数据。
|
||
|
||
落库字段:
|
||
|
||
1. `original_filename`
|
||
2. `relative_path`
|
||
3. `file_type`
|
||
4. `file_size`
|
||
5. `file_hash`
|
||
6. `source_archive_name`
|
||
7. `source_role`
|
||
8. `workflow_type`
|
||
9. `processing_status`
|
||
|
||
### 6.5 `finalize_batch_status(batch, overview_report) -> str`
|
||
|
||
根据结果决定批次状态。
|
||
|
||
规则:
|
||
|
||
1. 全部成功:`completed`
|
||
2. 存在待人工复核:`partial_completed`
|
||
3. 存在不支持文件但有有效文件:`partial_completed`
|
||
4. 无有效文件:`failed`
|
||
|
||
## 7. 技术实现
|
||
|
||
使用技术:
|
||
|
||
1. Django ORM
|
||
2. Django Storage
|
||
3. `pathlib`
|
||
4. `dataclasses` 或 Pydantic
|
||
5. Tool Registry
|
||
|
||
建议注册名:
|
||
|
||
```python
|
||
tool_registry.register(
|
||
name="submission_package_import",
|
||
handler=SubmissionPackageImportSkill().run,
|
||
)
|
||
```
|
||
|
||
## 8. 异常处理
|
||
|
||
| 异常 | 处理 |
|
||
|---|---|
|
||
| 上传文件为空 | 拒绝该文件,记录失败项 |
|
||
| 批次目录创建失败 | 整体失败 |
|
||
| 解包失败 | 批次部分失败或整体失败 |
|
||
| 无支持文件 | 批次失败 |
|
||
| 页数统计部分失败 | 批次部分完成 |
|
||
| 章节点识别失败 | 文档标记待人工确认 |
|
||
|
||
## 9. 测试要点
|
||
|
||
1. 单文件导入成功。
|
||
2. 多文件导入共用同一批次。
|
||
3. 压缩包导入保留相对路径。
|
||
4. 不支持文件不会阻断有效文件。
|
||
5. 部分失败时批次为 `partial_completed`。
|
||
6. 输出包含 `overview_report`。
|