--- last_reviewed: 2026-10-19 --- # src/infra/documents — 文档处理 | 文件 | 职责 | |------|------| | `invoice.py` | 发票类型常量、CSV 列定义、CSV/JSON 读写、批量分类 | | `requisition.py` | 低值易耗品申购单:从 `.invoice_cache` 取明细 → 清洗与去重 → Excel COM 填模板 | ## 对外接口 | 函数 | 说明 | |------|------| | `load_csv` / `save_csv` / `save_invoice_csv` | 支付记录与发票级 CSV 读写 | | `classify_invoice_batch(cache_map)` | 按类型分组:travel / general / application / attachments | | `load_requisition_items(cache_dir, exclude_keywords)` | 申购明细:清洗品名、猜规格、按发票号去重、关键词排除 | | `load_project_desc(session_dir)` | 「对应实验实训项目」取值顺序:`normal_info` → `travel_info` → 旧 `agent_state.json` → 默认 | | `generate_requisition(session_dir, template, output, project_desc, exclude)` | 一站式生成;`mcp__arb__doc_requisition` 经 `run_com` 调它 | ## 申购单 - 需要 **Windows + Microsoft Excel + pywin32** - 模板取项目根目录 `低值易耗品申购*.xls` 中名字最大者(仓库里保留的就是它) - 产物写 `cases//artifacts/`,不再污染项目根目录(旧实现把带时间戳的产物生成在模板旁边, 会让下次模板查找命中上次的产物) - 表头在第 2 行、数据从第 3 行起、末尾追加合计行;列位与行号常量在 `requisition.py` 顶部 > Word 版易耗品出库单(`consumable.py`)已删除:模板自提交 `63b97c6`(2026-08-31)起不在仓库, > 那条路径此后一直静默失败。历史实现看 git。