数电发票 是否已入账 核对工具(个人版)
一句话价值
别人家的发票查重工具,主打报销端(员工扫票怕一票多报);这个工具主打进项端——
财务收到供应商发票,一眼看出「这张票之前是不是已经入账过 / 对方是不是又重复发了一遍」。
拿来"揭穿"对方不负责任重复发送发票,是最好的硬证据。
它能解决什么
- 供应商/同事老把同一张发票重复发过来,反复甄别费时
- 怕重复入账、重复付款,想入账前先查一遍
- 手头有一份「近 2 年已入账发票明细表」,想拿新收到的发票去比
- 一个人用:不需要内网、不需要服务器、不需要账号,打开即核对
三种输入方式(任选)
| 方式 | 说明 | |---|---| | 📷 拍照上传 | 连续拍摄发票,自动 OCR 识别发票号码;拍不清提示是否重拍(需装拍照依赖) | | 📁 上传 OFD/PDF/XML 电子发票 / 图片 | 多选,支持数电票、OFD、XML、扫描图片 | | 📄 上传号码明细表 | 只要表头带「数电发票号码」列即可,只判断入账状态 |
输出结果(严格格式)
生成一份《本次收到的电子发票是否已入账明细表》,列固定为:
序号 | 文件名 | 数电发票号码 | 含税金额 | 入账状态 | 入账时间 | 销售方纳税人名称 | 开票日期 | 金额 | 税额 | 票种 | 项目名称
其中入账状态直接标 已入账 / 未入账——"已入账"就是对方重复发铁证。
触发词
- 发票入账核对 / 是否已入账 / 已入账查验 / 发票查重
- 进项发票核对 / 进项核验 / 供应商重复发票 / 重复开票
- 揭穿重复发票 / 核对已入账明细 / 发票入账比对
- 上传发票核对 / 收到发票有没有入账
用户操作步骤(3 步,一眼就会)
- 打开工具:在 WorkBuddy 对话里说"发票入账核对",或直接运行脚本,弹出窗口
- 添加发票 + 选明细表:点「📷 拍照」或「📁 上传OFD/PDF/XML发票/图片」或「📄 上传号码明细表」,把本次收到的发票加进去(Ctrl/Shift 多选);再在下方填入「往期已入账明细表」「当期已入账明细表」路径(首次手动选,之后自动记住)
- 开始核对:确认「输出 Excel 文件路径」(首次默认桌面,之后自动默认上次路径)→ 点「开始核对」→ 结果自动保存
完成。打开《本次收到的电子发票是否已入账明细表》,看「入账状态」列即可。
路径记忆:往期/当期明细表路径、输出路径、上传目录,第一次选完后会自动记住,下次打开自动填好,不用重复选。
运行环境要求
- Python 3.8+,且必须包含 tkinter(GUI 窗口依赖,弹窗靠它)。
- Windows 用 python.org 官方安装包默认自带 tkinter;若使用精简版 / 便携版 / 隔离环境的 Python,可能缺少 tcl/tk 组件,运行时会报
No module named 'tkinter'或DLL load failed。- 解决:换用完整版 Python,或运行前先确认
python -c "import tkinter"能成功(本 Skill 的setup_env.py也会检测并提示)。
- 解决:换用完整版 Python,或运行前先确认
- macOS 自带 tkinter;Linux 需系统安装
python3-tk(如sudo apt install python3-tk)。
依赖安装(一键)
工具首次运行若提示缺依赖,在本 Skill 目录下执行:
python setup_env.py
该脚本会自动安装核心依赖(pandas / pdfplumber / openpyxl / PyMuPDF)。
拍照功能额外需要:
- Python 包:
Pillow、opencv-python、pytesseract(脚本也会一并尝试安装) - 系统引擎:Tesseract-OCR(Windows 下载 https://github.com/UB-Mannheim/tesseract/wiki ,安装时勾选 Chinese 简体语言包),装完把
tesseract.exe加入系统 PATH
只想传 PDF/OFD/XML、不用拍照的,可以跳过 Tesseract,核心依赖装好即可用(未装拍照依赖时,拍照按钮自动置灰,不影响文件核对)。
注意事项
- 只读安全:本工具只读取源文件、生成报告,不修改、不删除任何原始数据,符合本地离线处理要求。
- 隐私:纯本地运行,发票数据不出本机。
- 手机端:拍照/PDF 解析依赖 Python 运行时,目前主要在电脑端 WorkBuddy 使用。
- OFD 兼容性:优先读取 OFD 包内 XML 文本提取发票号;极个别非常规版式会 fallback 到渲染+OCR。
- 号码明细表:只要表头带「数电发票号码」列(支持"发票号码/电子发票号码"等别名),即可自动识别。
发布到 SKILLHUB
本技能结构:
invoice-accounting-check-personal/
├── SKILL.md
├── scripts/
│ └── invoice_accounting_check_personal.py ← 核心工具(GUI + 命令行)
├── requirements.txt ← 核心依赖
├── requirements-optional.txt ← 拍照 OCR 可选依赖
└── setup_env.py ← 一键安装依赖
打包命令(在 WorkBuddy 环境执行):
python "<skill-creator脚本目录>/package_skill.py" "C:\Users\admin\.workbuddy\skills\invoice-accounting-check-personal"
生成的 zip 即可上传至 SKILLHUB。
封面图见 assets/cover.png(1024×1024,发票/对账主题,在 SKILLHUB 发布页「封面图」处直接选用)。
支付宝付费改造契约(PAYSKILL)
本技能为付费技能(PAYSKILL)。调用遵循支付宝 AI 生意画像契约,由平台调度层执行 probe → pay → complete → ack 流程:
- probe(探测):平台调用前先探测是否已持有本技能的支付宝有效订阅 / 付费凭证。已付费则直接放行。
- 402 Payment-Needed:未付费时,脚本向标准输出返回 HTTP 状态
402与Payment-Needed标记,提示用户通过支付宝完成付费(pay),平台据此唤起付费页。 - complete(扣费确认):用户在支付宝完成扣费后,平台下发
Payment-Proof(付费凭证)。 - ack(验签放行):平台携带
Payment-Proof重试本次调用;scripts/payment_gate.py验签该凭证,确认有效后放行主流程。
订阅持久化与幂等:
- 付费状态缓存在本地
.pay_cache/state.json,避免每次调用重复付费(订阅持久化)。 - 同一
Payment-Proof在 24h 幂等窗口内仅生效一次,避免重复扣费。
现金流改造后的调用套路:
用户调用 → 平台 probe →
未付费:下发 402 Payment-Needed → 支付宝 pay → complete → 下发 Payment-Proof
已付费/携带 Proof:脚本 ack 验签 → 放行主流程
本契约由 SkillHUB 平台调度层解析,脚本本地仅处理
402/验签/持久化三环节;付费本体交给支付宝。
支付宝 AI 按量付费(Machine Pay / A2M)改造说明
本 Skill 已按支付宝官方 A2M 协议改造为 Pay Skill,付费闸口位于 scripts/payment_gate.py,统一调用云端计费服务 https://pay.pembroli.cn/api/resource。
付费流程
- 未付费调用时,服务端返回 HTTP 402 +
Payment-Needed头,携带金额、商户、订单号及 RSA2 签名。 - 买家侧
payment_gate.py收到 402 后引导用户完成支付,平台回传Payment-Proof。 - 客户端携带
Payment-Proof重试资源端点。
验付调用
服务端收到 Payment-Proof 后,调用支付宝验付接口(alipay.aipay.agent.payment.verify)核验凭证有效性(trade_no、out_trade_no、active 状态),验证失败返回 400,验证通过才进入资源发放。
履约确认
资源发放成功后,服务端异步调用履约确认接口(alipay.aipay.agent.fulfillment.confirm,trade_no)回执,标记本笔订单已履约;并按 out_trade_no 做幂等,重复请求直接返回已缓存结果,杜绝重复收费。
幂等与缓存
买家侧按 slug 本地缓存 Payment-Proof(24h TTL),有效期内免重复支付;服务端按订单号幂等,保证同一笔订单只履约一次。
微信扫一扫