票据管家
月底报销最烦的不是贴票,是一张张往 Excel 里敲——敲错一行,财务退回重来。本 Skill 把票据文件批量读进来,自动提取字段、去重、分类,直接产出可提交的台账。
什么时候用
- 用户有一批发票/收据/行程单(PDF、照片、截图),要整理成台账
- 用户要做报销单、差旅费汇总、月度费用统计
- 用户要把散落的票据核对一遍,找重复票、找缺票
- 用户要给财务交一份规范的电子台账
输入多于 5 张票据时,本 Skill 的价值最明显。
工作流(五步)
第 1 步 · 收集与清点
列出收到的所有文件,输出清单:文件名、格式、大小、是否能读取文本层。
| 类型 | 可自动提取 | 说明 |
|---|---|---|
| 电子发票 PDF(有文字层) | ✅ | 主流情况 |
| 增值税专票/普票 PDF | ✅ | 字段最全 |
| 行程单 PDF | ✅ | 需单独字段映射 |
| 扫描件 / 照片 / 截图 | ❌ | 提示用户按模板人工补录 |
第 2 步 · 字段提取
运行 scripts/extract_invoices.py:
python3 scripts/extract_invoices.py --input 票据目录 --out records.json
按 references/invoice-fields.md 提取:发票号、开票日期、金额、税额、开票方、购买方、税号、票种。提取不到的字段留空并记录警告,绝不猜。
第 3 步 · 去重与核对
- 主键去重:发票号码唯一,重复出现 → 标记「重复」
- 疑似重复:同金额 + 同日期 + 同开票方 → 标记「疑似重复,请人工确认」
- 异常检测:金额为 0、日期缺失、日期超期(跨年)、金额异常大
第 4 步 · 生成台账
运行 scripts/build_ledger.py:
python3 scripts/build_ledger.py --input records.json --out 报销台账.xlsx
产出三个 sheet:
- 明细 — 逐票一行,含状态标记
- 汇总 — 按月份 / 按类别 / 按开票方统计
- 异常 — 重复票、缺字段票、待人工补录票
第 5 步 · 交付与提示
按 references/reimbursement-rules.md 输出:
1. 报销台账.xlsx
2. 报销单摘要(Markdown,可直接粘贴到 OA 系统)
3. 待办提示(还缺哪些票、哪些需要人工确认)
输出示例
# 报销台账摘要
**票据总数**:23 张 **有效**:20 张 **重复**:2 张 **待补录**:1 张
**合计金额**:¥4,286.50
## 按类别
| 类别 | 张数 | 金额 |
|---|---|---|
| 交通 | 9 | ¥1,820.00 |
| 住宿 | 4 | ¥2,100.00 |
| 餐饮 | 6 | ¥286.50 |
| 其他 | 1 | ¥80.00 |
## 需人工确认
- 2 张疑似重复(同金额同日同开票方),请核对是否重复报销
- 1 张图片票据无法自动提取,请按模板补录
输出原则
- 宁缺毋错:字段提取不到就留空 + 记录警告,不推测、不编造
- 金额必须可回溯:每个数字都对应原始票据,台账里标注来源文件名
- 不替代财务审核:明确声明本工具只做整理与辅助核对
- 不做税务建议:税额可抵扣与否,由财务/税务专业人士判断
红线
- 不虚构票据信息、不篡改金额与日期
- 不协助拆分发票、虚增费用、伪造票据
- 不提供税务筹划、抵扣建议(明确告知:请咨询专业税务人员)
- 票据含个人信息(身份证号、银行卡号)时,提醒脱敏后再传播
付费模式(支付宝 AI 按量付费 · A2M 协议)
本 Skill 为按调用量计费的付费技能,单次调用价格 ¥0.01。
该单价在三处保持一致:服务端 402 账单金额、支付宝 AI 付站点登记的服务单价、以及本 Skill 的上架表单单价——三者不一致会导致用户无法完成付款。
四步编排(Agent 侧)
| 步骤 | 动作 | 期望结果 |
|---|---|---|
probe |
发起调用,未携带支付凭证 | 收到 402 + Payment-Needed(内含账单) |
pay |
把账单交给支付宝官方支付能力拉起收银 | 由用户本人完成付款,付款后取得 Payment-Proof |
complete |
携带 Payment-Proof 重试同一请求 |
服务端验付通过后交付,返回 200 + Payment-Validation |
ack |
交付完成后回执履约确认 | 幂等处理,同一凭证重复请求不会重复扣费 |
前置检查:调用前先确认运行环境具备支付宝支付能力;不具备时应明确提示用户先安装官方「支付宝 AI 付」能力,而不是让调用静默失败,更不允许退化成免费旁路。
异常处理
| 情况 | 状态码 | 处置 |
|---|---|---|
| 输入非法(如目录为空、无可读票据) | 400 |
必须在发出账单之前拦截,不因非法输入收费 |
| 收款渠道未配置 | 503 |
明确拒绝,不得免费放行 |
| 未携带凭证 / 验付失败 / 金额不符 | 402 |
回落并重新签发账单 |
| 验付网关不可达(结果不明) | 502 + retry_with_same_proof=true |
不得回落 402,否则会诱导用户重复付款 |
| 履约确认失败 | 502 |
保留交付物,允许同一凭证重试,不重造交付物 |
| 用户取消付款 | — | 终止本次调用,不产生交付 |
安全红线
- 不暴露付款链接、二维码、交易号等敏感信息。
- 票据数据仅在本地处理;本 Skill 不上传任何票据内容到外部服务。
- 私钥与商户配置只保存于服务端;本 Skill 包内不含任何密钥、支付账号或收款码。
- 免费内容仅限结构说明与元信息,不存在绕过计费的免费旁路。
履约内容:单次付费对应一次完整交付(五步工作流 + xlsx 台账 + 摘要),并完成 ack 回执。
环境要求
- Python 3.9+
pypdf(PDF 文本提取)、openpyxl(Excel 输出)- 无 OCR 环境时,图片票据自动转为「待人工补录」,不影响其他票据处理
附件
references/invoice-fields.md— 发票字段规范与提取规则references/ledger-template.md— 台账模板与列定义references/reimbursement-rules.md— 报销单规则与常见退回原因scripts/extract_invoices.py— 批量字段提取scripts/build_ledger.py— 生成 xlsx 台账