7e900ebdea
历史清洗删掉了根目录两份 低值易耗品申购*.xls——它们其实是**已填写的真实申购单** (半导体型号、单价、项目名都在),不是模板;同时旧实现「项目根 glob 取名字最大者」会把 上一次生成的产物当模板,所以一并修掉: - 新增 resolve_requisition_template():REQUISITION_TEMPLATE 环境变量 → templates/ → 项目根(兼容旧位置); 环境变量指向不存在的文件时告警并继续回退,不静默失败 - 入库 templates/低值易耗品申购.xls 空白件(由旧文件删掉第 3 行起的全部内容得到,UsedRange 只剩 2 行: 标题 + 表头;真实采购明细不进仓库) - generate_requisition 默认输出改为 <会话>/artifacts/低值易耗品申购<ts>.xls,不再写模板旁边 - mcp/tools/documents.py 的 _find_template 改为复用同一解析函数,避免两处规则漂移 - 模块 docstring 与 CLI help 里 src/web/uploads 的过时示例改为 cases/ - tests:5 个纯单测覆盖解析优先级(env 优先 / templates 胜过根目录 / 根目录取最新 / env 指向不存在的文件时回退 / 全都没有时返回 None),不依赖 COM 验证:真实 Excel COM 端到端 2 项 → 产物 UsedRange 5 行(标题/表头/2 明细/合计),第 6 行起为空, 无旧明细残留;fill_requisition_excel 原本就会先删第 3 行起内容,这条也实测确认过。 门禁:ruff / format --check / mypy src / deptry 全绿,pytest 112 passed,mcp_smoke 17 工具。
last_reviewed
| last_reviewed |
|---|
| 2026-10-19 |
tests — 单元测试
pytest 运行(make test 带覆盖率)。当前 107 例。
| 文件 | 覆盖范围 |
|---|---|
test_config.py |
配置加载:默认值、文件覆盖、环境变量优先级 |
test_invoice.py |
发票常量、差旅判定、批量分类 |
test_matcher.py |
金额匹配:容差、一对一、一对多贪心、未匹配、CSV 汇总构造 |
test_mcp_analysis.py |
MCP 分析工具:缓存分组、凑额复核、业务约束违反、无发票场景、save_info 剥离多余字段、 |
草稿不落盘、rules_get 形状、info_skeleton 与规则同源、骨架填满即通过 |
|
test_requisition.py |
申购明细:品名清洗、规格猜测、发票号去重、关键词排除、项目名取值链与回退 |
不进单测的部分
- Office COM(申购单):需要本机装有 Excel,改动后用真实生成验证(约 2-5 秒,产物单元格肉眼确认)
- Playwright 填报:需要真实财务系统账号,手工验证
- MCP wire 层:用
make mcp-smoke(真起 stdio 子进程握手、列工具、调一次case_list)
测试不碰 cases/ 真实目录,一律用 tmp_path 造会话。