银行流水自动生成记账凭证
功能概述
将银行流水自动转换为财务系统可导入的记账凭证模板。核心流程分四步:
- 上传银行流水 — 选择 Excel/CSV 格式的银行流水文件
- 上传模板和科目余额表 — 凭证导入模板 + 科目余额表 + 手工录入银行存款科目编号
- 上传批量补充填充信息 — 凭证编号、类型编号、制单人、摘要等映射规则
- 自动生成 — 匹配科目、生成借贷分录、输出 Excel 文件
触发方式
用户说出以下任一关键词即触发本技能:
- "银行流水记账"
- "银行流水自动生成"
- "流水生成凭证"
- "银行流水凭证"
运行环境
- Python 3.9+(需要 tkinter 支持)
- 依赖:openpyxl, xlrd
一键安装依赖
pip install -r scripts/requirements.txt
启动方式
由 AI 调用以下命令启动:
python scripts/main.py
或直接双击 scripts/ 目录中的 启动.bat(Windows)。
操作步骤
步骤1:上传银行流水
弹出"步骤 1/4 — 上传银行流水"窗口:
- 选择 Excel/CSV 格式的银行流水文件
- 支持格式:
.xlsx、.xls、.csv - 流水需包含:日期、摘要、收入/支出(或单一金额列)
- 自动识别能力:
- 自动扫描前 10 行寻找表头(适应带标题行的银行流水)
- 自动识别列名(日期/交易日期/记账日期、收入/借方/贷方、支出/贷方/借方、金额/发生额 等)
- 单一"金额"列自动根据正负区分收/付
- 金额格式自动处理(¥¥$ 符号、含千分位、括号负数等)
步骤2:上传模板和科目余额表
弹出"步骤 2/4 — 上传模板和科目余额表"窗口,需完成三项:
| 任务 | 说明 |
|---|---|
| 上传凭证导入模板 | 财务系统导出的标准模板(.xlsx/.xls) |
| 上传科目余额表 | 全部展开/最末级科目余额表,含科目名称和科目编号 |
| 录入银行存款科目编号 | 手工输入,如:100201 |
三项缺一不可。
步骤3:上传批量补充填充信息
弹出"步骤 3/4 — 上传补充填充信息"窗口:
上传 Excel 格式的补充填充信息文件,包含两列:
| 凭证导入模板批量补充填充信息项目 | 映射规则 |
|---|---|
| *凭证编号 | 每笔银行流水占用一个凭证编号,从00001开始顺延 |
| *凭证类型编号 | 统一编号为01 |
| *制单人 | 统一编号为0001 |
| *摘要 | 区分是收款还是付款,收款就写收款,付款就写付款 |
> ⚠️ 重要备注:以下表格内容仅为「举例说明」之用,不是强制要求。请根据你实际使用的财务系统导入模板,自行调整项目和映射规则。
>
> 下面是一张「示例截图」,仅供直观参考如何建立补充填充信息文件,实际内容请以你自己的模板为准:
>
>
>
> 该截图仅为演示用途,实际项目可自由增删列、修改规则。
> 也可以跳过此步骤,将使用默认值(凭证类型=01, 制单人=0001)。
步骤4:自动生成
点击"确定"后自动执行:
- 解析银行流水,识别每笔收款/付款
- 从科目余额表构建科目名称→科目编号映射
- 按补充填充信息设置凭证编号、类型、制单人、摘要
- 每笔流水生成借贷两条分录
- 结果保存到桌面(文件名含时间戳)
- 弹出结果统计窗口
识别失败时:会弹出详细的调试信息窗口,显示识别的表头行、列名映射、数据行数等,帮助定位问题。
生成规则
收款分录
| 方向 | 科目 | 金额 |
|---|---|---|
| 借 | 银行存款(用户输入的科目编号) | 收款金额 |
| 贷 | 对方科目(从科目余额表匹配) | 收款金额 |
付款分录
| 方向 | 科目 | 金额 |
|---|---|---|
| 借 | 对方科目(从科目余额表匹配) | 付款金额 |
| 贷 | 银行存款(用户输入的科目编号) | 付款金额 |
文件结构
scripts/
├── main.py # 主程序入口(含 tkinter GUI 弹窗 + 数据处理逻辑)
├── requirements.txt # Python 依赖
└── 启动.bat # Windows 快速启动脚本
常见问题
Q: 银行流水格式有什么要求?
A: 需包含日期、摘要、收入金额、支出金额等列,程序会自动识别列名。支持 .xlsx/.xls/.csv 格式。
Q: 科目余额表格式有什么要求?
A: 需包含科目名称和科目编号两列,程序会自动匹配列名。建议使用全部展开/最末级科目余额表。
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),有效期内免重复支付;服务端按订单号幂等,保证同一笔订单只履约一次。