购入商品或服务电子发票自动生成记账凭证
触发方式
用户说出以下任一关键词即触发本技能:
- "采购发票记账凭证"
- "费用发票记账凭证"
- "购入发票记账凭证"
- "发票生成凭证"
- "采购发票凭证"
- "发票自动生成记账凭证"
运行环境
- Python 3.9+
- 依赖:openpyxl, xlrd, PyPDF2, pdfplumber
AI 启动方式
当用户触发本技能时,AI 必须执行:
- 先安装依赖:
pip install -r scripts/requirements.txt
使用 managed Python(推荐):
# 安装依赖到 managed venv
<managed_python_pip> install -r <skill_dir>/scripts/requirements.txt
- 然后启动主程序:
python scripts/main.py
使用 managed Python(推荐):
<managed_python> <skill_dir>/scripts/main.py
重要:不要用 show_widget 弹窗,不要用 sendPrompt。直接启动 Python tkinter GUI 主程序。工作目录需设为技能根目录。
文件结构
scripts/
├── main.py # 主程序(tkinter GUI + 发票解析 + 凭证生成)
├── requirements.txt # Python 依赖
操作流程
程序启动后,会依次弹出窗口引导用户完成以下步骤:
步骤1:选择四份文件
| 文件 | 格式 | 说明 |
|---|---|---|
| 购入商品/服务电子发票 | OFD / PDF / XML | 支持多选,可混合格式 |
| 全部展开/最末级的科目余额表 | Excel (.xlsx/.xls) | 需含科目编码和科目名称 |
| 凭证导入模板 | Excel (.xlsx/.xls) | 财务系统标准模板 |
| 导入模板必输信息批量补充填充信息表(只输入映射规则即可) | Excel (.xlsx/.xls) | 项目+映射规则两列 |
步骤2:自动提取发票信息并生成中间表
- 自动解析 OFD(解压读取 XML)、PDF(pdfplumber 表格/文本提取)、XML(ElementTree)发票
- 读取科目余额表构建科目映射
- 生成「发票信息提取表.xlsx」保存到桌面
- 提取表包含:发票类型、发票号码、日期、销售方、商品明细、金额/税率/税额/价税合计等
- 发票类型会自动识别为「电子发票(普通发票)」或「电子发票(增值税专用发票)」
- 借方一级科目、明细科目、科目编号三列为空,需用户手工填写
步骤3:用户手工补充科目信息
- 在生成的 Excel 中填写每行的「借方一级科目」「明细科目」「科目编号」
- 保存并关闭 Excel
步骤4:自动生成凭证导入模板
- 读取编辑后的提取表
- 根据模板表头生成借贷分录
- 普通发票:借方使用用户填写的科目编号,金额为价税合计;贷方按销售方名称搜索科目余额表。
- 增值税专用发票:自动生成三条分录:
- 借:费用/成本科目(金额 = 不含税金额)
- 借:进项税额(金额 = 税额,按税率在科目余额表「进项税额」下查找对应科目)
- 贷:应付账款/销售方对应科目(金额 = 价税合计)
- 若找不到对应税率的进项税额明细科目,会退回普通发票逻辑并提示。
- 输出「记账凭证导入模板_YYYYMMDD_HHMMSS.xlsx」到桌面
补充填充信息表格式
| 项目 | 映射规则 |
|---|---|
| *凭证编号 | 从00001开始顺延 |
| *凭证类型编号 | 统一编号为01 |
| *制单人 | 统一编号为0001 |
输出文件
- 发票信息提取表.xlsx — 中间表,含发票明细和空白的科目列
- 记账凭证导入模板.xlsx — 最终输出,每张发票根据发票类型生成 2 条或 3 条分录
支付宝付费改造契约(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),有效期内免重复支付;服务端按订单号幂等,保证同一笔订单只履约一次。