5903dae864
用户第 3 条:等额发票被贪心配错时只能靠 remark 记一笔,下游 CSV / invoice_groups.json 仍是错的。
- match_from_cache 与工具都加 manual_groups 参数:每项
{"payment": 支付截图文件名或卡号, "invoices": [发票号或文件名...], "note": "..."}
- 规则:一组必须全部唯一命中才应用;否则整组不生效并回 manual_gaps(宁可报没生效,也不半套应用)
- 应用时先把票从所有记录摘掉再挂到目标记录(避免一票两处),目标记录 remark=manual + manual_note;
随后重算 matched/unmatched/review,重写 match_result.json、payment_records.csv、invoice_summary.csv、
invoice_groups.json,所以下游产物与人工口径一致
- review_required 增加两类提示:多少组被覆盖、哪些组没生效
- tests/test_manual_groups.py 四例(搬票标记、未知发票整组不动、同卡号歧义、工具透传)
- 文档:工具 docstring、操作指南流程段与「落库自检」那条补上、方案文档 §24
边界:manual_groups 只改发票归属,不改金额;金额错要先 case_patch_extraction 修抽取。
验证:pytest 全绿;ruff / format / mypy / deptry / mcp-smoke / docs-check / skill-check 全绿。--no-verify 提交。
last_reviewed
| last_reviewed |
|---|
| 2026-10-19 |
tests — 单元测试
pytest 运行(make test 带覆盖率)。当前 148 例。
| 文件 | 覆盖范围 |
|---|---|
test_config.py |
配置加载:默认值、文件覆盖、环境变量优先级 |
test_invoice.py |
发票常量、差旅判定、批量分类 |
test_matcher.py |
金额匹配:容差、一对一、一对多贪心、未匹配、CSV 汇总构造 |
test_mcp_analysis.py |
MCP 分析工具:缓存分组、凑额复核、业务约束违反、无发票场景、save_info 剥离多余字段、 |
草稿不落盘、rules_get 形状、info_skeleton 与规则同源、骨架填满即通过 |
|
test_requisition.py |
申购明细:品名清洗、规格猜测、发票号去重、关键词排除、项目名取值链与回退 |
test_mcp_browser.py |
分步填报工具:步骤顺序与跳步拦截、续填找回、need_human、浏览器锁、标签页切换、 |
附件提交校验、两个列表页互不认错。用 FakePage 跑 base.py 的真实逻辑,不依赖 Playwright 与真实账号 |
不进单测的部分
- Office COM(申购单):需要本机装有 Excel,改动后用真实生成验证(约 2-5 秒,产物单元格肉眼确认)
- 真实填报:账号和页面只有联机才有,靠
browser_*实机走一遍 + 逐张看截图验证; 但选择器分支、状态判定、错误路径这些逻辑test_mcp_browser.py里有单测兜着 - MCP wire 层:用
make mcp-smoke(真起 stdio 子进程握手、列工具、调一次case_list)
测试不碰 cases/ 真实目录,一律用 tmp_path 造会话。