根据发票号码写入发票抵扣勾选导入模板
功能概述
自动完成发票抵扣勾选导入模板的生成,核心流程分三步:
- 收集发票号码 — 从PDF发票文件提取 或 从Excel明细表导入
- 上传数据文件 — 电子税务局导出的"未抵扣发票信息" + "抵扣勾选导入模板"
- 自动匹配生成 — 号码匹配 → 数据填充 → 结果保存到桌面
触发方式
用户说出以下任一关键词即触发本技能:
- "批量勾选模板"
- "生成勾选模板"
- "发票模板生成"
- "发票抵扣勾选导入模板"
运行环境
- Python 3.9+(需要 tkinter 支持)
- 依赖:pandas, openpyxl, pdfplumber, pillow
一键安装依赖
pip install -r scripts/requirements.txt
启动方式
python scripts/main.py
或直接双击 scripts/ 目录中的 启动.bat(Windows)。
操作步骤
步骤1:获取发票号码
弹出"步骤 1/3 — 发票号码收集"窗口,提供两种方式:
| 方式 | 说明 |
|---|---|
| 上传PDF文件 | 选择一个或多个PDF发票文件,自动扫描提取20位数电发票号码 |
| 上传明细表 | 选择 Excel/CSV 文件,自动读取"数电发票号码"列 |
- 提取结果自动去重,显示在列表中
- 可手动勾选/取消勾选,支持全选/取消全选
- 确认后点击"下一步"
步骤2:上传数据文件
弹出"步骤 2/3 — 上传文件"窗口,需上传两个文件:
- 未抵扣发票信息 — 从电子税务局「发票查询」导出(.xlsx/.xls)
- 抵扣勾选导入模板 — 从电子税务局「抵扣勾选」下载(.xlsx/.xls)
步骤3:自动匹配生成
点击"确定"后自动执行:
- 发票号码匹配(主匹配字段:数电发票号码)
- 按模板列顺序填充数据
- 结果保存到桌面(文件名含时间戳)
- 弹出结果统计窗口
文件结构
scripts/
├── main.py # 主程序入口
├── number_manager.py # 发票号码管理(PDF提取、Excel读取、去重)
├── template_generator.py # 模板生成核心(匹配、填充、保存)
├── ui_dialogs.py # tkinter GUI 弹窗界面
├── config.yaml # 配置文件
└── requirements.txt # Python 依赖
常见问题
Q: PDF无法提取发票号码?
A: PDF必须是电子发票(有文字层),扫描件/图片型PDF需要先OCR识别。
Q: 提示"无匹配结果"?
A: 检查未抵扣发票信息文件中"数电发票号码"列是否包含目标号码,确认该发票状态为"未抵扣"。
Q: 生成的文件在哪里?
A: 默认保存到桌面,文件名格式:抵扣勾选导入模板_YYYYMMDD_HHMMSS.xlsx
支付宝付费改造契约(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),有效期内免重复支付;服务端按订单号幂等,保证同一笔订单只履约一次。