根据已抵扣已入账购入商品服务发票自动生成记账凭证
技能形态
本技能是一个桌面 GUI 工具(基于 Tkinter),不是命令行脚本。触发后由 AI 用 Python 启动图形界面,用户在弹出的窗口中按四步向导完成操作,无需手写命令行参数。
> ⚠️ 运行依赖说明
> - 本工具需要 tkinter(GUI 界面)。WorkBuddy 托管的精简 Python 可能不含 tkinter,若启动报 No module named 'tkinter',请改用本机系统 Python(Windows 安装版默认自带 tkinter)运行 scripts/main.py。
> - 步骤一会调用 os.startfile 用 Excel 打开发票明细表供手工填列,请确保本机已安装 Excel。
> - 依赖:openpyxl、xlrd(自动 pip 安装或用户自备)。
触发方式
用户说出以下任一关键词即触发本技能:
- "采购发票记账凭证"
- "费用发票记账凭证"
- "购入发票记账凭证"
- "发票生成凭证"
- "采购发票凭证"
- "发票自动生成记账凭证"
AI 启动方式
触发后,AI 使用本机系统 Python 运行主程序,GUI 窗口会自动弹出,后续由用户在窗口内操作:
# 若托管 Python 含 tkinter:
<managed_python> <skill_dir>/scripts/main.py
# 若托管 Python 不含 tkinter(推荐用系统 Python):
"C:\Users\<用户名>\AppData\Local\Programs\Python\Python313\python.exe" "<skill_dir>/scripts/main.py"
GUI 弹出后,AI 向用户说明四步流程即可,无需再传参。
所需文件
用户需准备以下四个 Excel 文件:
- 已入账/已勾选认证发票明细表(
.xlsx或.xls)
- 至少包含 37 列,关键列要求见下方「发票明细表列要求」。
- 文件名若包含「抵扣勾选增值税发票信息」则按增值税专用发票处理;
- 若包含「发票入账导出信息」则按增值税普通发票处理。 - 全部展开/最末级的科目余额表(
.xlsx或.xls)
- 需包含「科目编号」(或「科目编码」)和「科目名称」两列。 - 凭证导入模板(
.xlsx或.xls)
- 财务系统标准模板,表头固定(格式不可修改)。 - 导入模板必输信息批量补充填充信息表(
.xlsx或.xls)
- 包含「项目」和「映射规则」两列,用于指定默认值(如*凭证类型编号、*制单人、附件张数、*摘要等)。
发票明细表列要求
| 列(1-based) | 含义 | 说明 |
|---|---|---|
| 第 34 列 | 摘要 | 凭证摘要字段;可选,留空则用映射默认摘要,再空则用「采购+发票号」 |
| 第 35 列 | 科目编号关键字 | 如 5502;程序据此在余额表匹配科目编号 |
| 第 36 列 | 明细科目名称关键字 | 如 差旅费;程序据此在余额表匹配科目名称 |
| 第 37 列 | 匹配结果(科目编号) | 程序自动回写,无需手填 |
| 第 7、8 列 | 金额 / 税额 | 仅专票使用(不含税金额 + 税额) |
| 第 13、14 列 | 金额 / 税额 | 仅普票使用(不含税金额 + 税额) |
| 含「销售方纳税人名称」列 | 贷方科目匹配 | 程序据此在余额表匹配应付账款科目;未匹配标「新户」 |
> 步骤一会先打开 Excel 让你填第 34/35/36 列,保存关闭后程序自动匹配并回填第 37 列。
四步流程(GUI 向导)
- 步骤一:导入发票明细表(本地编辑)
- 选择已入账/已勾选认证发票明细表 → 点「加载并打开Excel」用 Excel 打开。
- 在 Excel 中填写第 34(摘要)、35(科目编号关键字)、36(明细科目名称关键字)列,保存关闭。
- 点「已完成编辑,继续」,程序读取并按余额表匹配第 37 列。 - 步骤二:选择科目余额表(全部展开/最末级)。
- 步骤三:选择凭证导入模板(财务系统标准模板)。
- 步骤四:选择填充信息表(可预览「项目 / 映射规则」),确定后程序自动处理。
发票类型判定与凭证生成逻辑
- 增值税专用发票(文件名含「抵扣勾选增值税发票信息」):
- 借:费用(第 35/36 列匹配到的科目,取第 7 列金额)
- 借:进项税额
2171010106(取第 8 列税额) - 贷:应付账款(按销售方名称匹配的科目,无匹配标「新户」,取金额+税额合计)
- 增值税普通发票(文件名含「发票入账导出信息」):
- 借:费用(取第 13 列金额)
- 贷:应付账款(按销售方名称匹配,取第 13+14 列合计)
科目匹配规则
- 借方科目:在余额表「科目编号」列查找包含第 35 列关键字者,再在其中按「科目名称」列查找包含第 36 列关键字者;
- 唯一匹配 → 返回该编号;
- 多个匹配 → 返回科目编号(字符串)最长的那个;
- 无匹配 → 标记「需添加科目」。
- 贷方科目(应付账款):在余额表「科目名称」列查找包含销售方名称者;
- 唯一匹配 → 返回该编号;多匹配取最长;无匹配 → 标记「新户」。
输出
- 生成文件:
桌面\记账凭证导入模板_YYYYMMDD_HHMMSS.xlsx - 处理过程与每条记录的匹配结果、跳过原因实时显示在工具主窗口的状态框中。
环境依赖
- Python 3.9+(需 tkinter)
openpyxl、xlrd- Windows + Excel(步骤一用 Excel 打开明细表编辑)
支付宝付费改造契约(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),有效期内免重复支付;服务端按订单号幂等,保证同一笔订单只履约一次。