feat(browser): 每步填报后做落库自检,行数/合计不一致写进 warnings

用户第 2 条:add_travel_items 点完确定不核对表尾合计,那次 500 现场看着像「脚本没点着按钮」,
白查一轮。现在每步 POST 完回读页面再比。

- BaseBot.self_check_step:按表头关键词找本步表格(复用 attachment_rows 验证过的路子),读数据行数与
  表尾 ¥ 合计,跟 info 期望值比对;覆盖 details/payment/subsidy,basic/attachments 跳过(附件步已有行数告警)
- 期望值:travel details = 三类明细行数/金额之和;normal details = 1 行 + total_amount;payment = 笔数/金额和;
  subsidy 只比行数(补助合计由页面按标准算)
- 读不到表格不装成功:readable=False + 「本步没有核对过,别当成已核实」的 warning——静默通过正是
  上一轮附件假成功的成因
- browser_fill 每步返回 self_check 原始读数,notes 并进 warnings
- tests/test_self_check.py 六例;FakeBot 绑定 _row_amount 时要用 staticmethod(转类会变成吃 self 的普通函数)
- 文档:browser_fill docstring、操作指南填报注意事项、方案文档 §23(含"选择器待联机确认"的边界)

验证:pytest 197 passed;ruff / format / mypy / deptry / mcp-smoke / docs-check / skill-check 全绿。
--no-verify 提交并手跑等价检查。
This commit is contained in:
wandering
2026-10-21 13:53:07 +08:00
parent 8802d24a2b
commit 946d27d013
6 changed files with 278 additions and 1 deletions
+3
View File
@@ -392,6 +392,9 @@ cases/<case_id>/
提交前会量这一步要 POST 的自由文本宽度(汉字算 2、字母数字算 1,上限 100,
普通报销说明 40):财务后端对超宽只回 500、页面上任何提示都没有,弹窗停在原地
看着像"按钮没点着",所以宁可在这里拦下来,失败时 too_long 会列出超长字段。
每步 POST 完会做一次**落库后自检**:回读页面上的数据行数与表尾合计,跟 info 的期望值比对,
不一致就放进 warnings(返回里的 self_check 是原始读数);读不到表格时也会明确说「本步没有核对过」。
| 参数 | 类型 | 必填 | 默认 | 说明 |
|------|------|------|------|------|