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