feat(mcp): 申购单/出库单生成与抽取结果局部修正(2a)

- src/infra/com_thread.py:Office COM 调用的单线程串行 actor。Word/Excel 并发驱动会互相抢
  ActiveDocument 与模态框,因此所有 COM 操作排队在同一线程执行(与 P3 的 Playwright actor 分开,
  COM 套间与 greenlet 约束不同)
- mcp__arb__doc_requisition:Excel 申购单,产物写 cases/<id>/artifacts/,支持 exclude 关键词与
  project 覆盖。实机验证:2 张普通发票 + 1 笔支付 → 排除「万用表」后生成 19456 字节 .xls,5.0s
- mcp__arb__doc_consumable:Word 出库单;纯差旅返回 skipped 而非报错。当前被缺模板挡住(见下)
- mcp__arb__case_patch_extraction:只改传入的键,回显每个字段的 from/to,未知键告警但仍写入,
  与现值相同时不写(避免无意义重抽),金额/日期仍走 normalize
- server.py:工具数 15 → 18,playbook 增加第 6 步(文档产物)与核对修正说明

发现(未处理,需产品决定):Word 模板「易耗品、出库单.doc」在 4fbb4c3(2026-08-31,同一提交新增
requisition.py)被删除,至今不在仓库里。因此 consumable.py 的出库单路径自那以后一直不可用;
Web 端 _try_fill_consumable_doc 捕获异常后只记日志,所以普通发票提交一直在静默跳过出库单生成。
已确认历史版本是空白校用表单(无姓名、无卡号、无长数字串),是否恢复或改为配置模板路径待定。

门禁:ruff / format --check / mypy / deptry 全绿,pytest 132 passed。
This commit is contained in:
wandering
2026-10-19 20:07:38 +08:00
parent 2f08bbd6e8
commit b2d271c5ed
4 changed files with 219 additions and 2 deletions
+8 -2
View File
@@ -13,7 +13,7 @@ from typing import Any
from mcp.server import MCPServer
from .tools import analysis, extraction, materials
from .tools import analysis, documents, extraction, materials
SERVER_NAME = "auto-reimbursement"
@@ -33,7 +33,10 @@ INSTRUCTIONS = """财务报销自动化工具集(发票抽取交接 → 匹配
或用 mcp__arb__validate_info(draft=...) 不落盘反复试。不完整就向用户要补充材料,禁止自己宣布可提交。
拼 JSON 前先 mcp__arb__info_skeleton(info_type) 取骨架:required 为 true 的键必须存在(含值为空串的备注类
字段),骨架与 validation_rules.json 同源,别凭记忆造结构。
6. 每步之后用 mcp__arb__case_status 复查态势;阶段由产物推导,没有内部状态机。
6. 普通发票用 mcp__arb__doc_consumable 生成 Word 出库单、mcp__arb__doc_requisition 生成 Excel 申购单
(COM 自动化,需本机装有 Word/Excel;纯差旅会返回 skipped,不是错误)。
人工核对后要改单张票据的某个字段,用 mcp__arb__case_patch_extraction(只传要改的键,会回显 from/to)。
7. 每步之后用 mcp__arb__case_status 复查态势;阶段由产物推导,没有内部状态机。
mcp__arb__case_reset(scope) 可清派生产物重跑;mcp__arb__case_list 看全部会话。
尚未实现(**现在不要调用,也不要在回答里承诺**):Word 出库单与 Excel 申购单、浏览器填报、
@@ -53,11 +56,14 @@ TOOLS: list[Callable[..., dict[str, Any]]] = [
extraction.case_read_text,
extraction.case_save_extraction,
extraction.extraction_spec,
extraction.case_patch_extraction,
analysis.match_payments,
analysis.save_info,
analysis.validate_info,
analysis.rules_get,
analysis.info_skeleton,
documents.doc_consumable,
documents.doc_requisition,
]