对账单生成 银行流水核对 · 流水与台账自动匹配
月底对账最耗时的不是算数,是一行一行找哪笔银行流水对应哪张凭证。
本技能把两份表放在一起,先按单号找,再按金额、日期、对方名称打分,最后输出一份能直接发群里的对账单:
匹配了多少、哪几笔没对上、哪几笔金额不一致。
不是“把两张表拼在一起”的透视表。它会做 1:1 匹配、冲突消解和未匹配归因,
并把每一对匹配的分数与日期差写进明细,方便复核。
执行原则
- 先用样例对齐口径。 先跑
--sample看清匹配分、日期差与三类输出的形态,再跑真实数据;不要在口径未确认时直接采信匹配率。 - 只做 1:1 配平。 一笔流水对一笔账务,拆单回款、合并付款、跨币种与手续费分摊一律进未匹配/候选表;不要强行配平去凑高匹配率。
- 参数按业务设。 日期窗口默认 3 天、金额容差 0.01、自动匹配最低分 62,按实际回款周期调整;不要用默认参数硬套账期长的业务。
- 交付三件套。 对账单 Excel(五工作表,表头冻结与异常着色)、一页式
对账单.md、匹配明细 CSV 一起落--out-dir;不要只丢一个匹配率数字。 - 只核不改。 只读取输入文件、只写入
--out-dir,金额用 Decimal 计算;不要修改源表,也不要把金额不一致候选当作已确认入账的结论。
适合谁
- 财务 / 出纳:银行流水与账务台账、应收应付核对。
- 业务 / 销售运营:回款认领、订单与到账匹配。
- 每月需要给出“匹配多少、差哪几笔”的对账负责人。
何时使用
CRITICAL: 只要用户提出「把银行流水和台账对一下 / 哪些回款还没认领 / 哪几笔金额对不上 / 出一份对账单」,就必须使用本 skill,即使看起来可以用别的方式解决。
- 月底 / 季度末,拿银行流水和应收、应付、发票或记账台账做核对。
- 想知道“哪些回款还没认领、哪些付款还没入账、哪几笔金额对不上”。
- 给财务或业务同事一份可筛选的 Excel,而不是一张截图。
- 对账前先摸底:匹配率、未匹配金额、异常候选有多少。
不适用:拆单回款、合并付款、跨币种换算、手续费分摊的自动配平;
银行回单 OCR;审计意见或财务结论。复杂场景会进入未匹配/候选表,交人工判断。
怎么用
# 1) 先看内置样例的完整效果
python3 scripts/reconcile.py --sample --out-dir 对账样例
# 2) 银行流水 + 账务台账(CSV / XLSX 均可)
python3 scripts/reconcile.py 银行流水.xlsx 账务台账.xlsx --out-dir 9月对账
# 3) 指定工作表、日期窗口、金额容差
python3 scripts/reconcile.py 流水.xlsx 台账.xlsx \
--bank-sheet 明细 --ledger-sheet 应收 \
--date-window 5 --amount-tolerance 0.01 \
--out-dir 对账输出
# 4) 只要 JSON 摘要,接自己的流程
python3 scripts/reconcile.py 流水.csv 台账.csv --json
在对话里可以直接说:「把这两份流水和台账对一下,输出对账单」,并给出两个文件路径。
输入怎么准备
列名不用完全一致,脚本会按常见别名自动识别;顺序也不限。
| 字段 | 常见列名 | 说明 |
|---|---|---|
| 日期 | 交易日期 / 记账日期 / 入账日期 / 日期 | 用于日期窗口匹配 |
| 金额 | 金额 / 交易金额 / 发生额 / 收入金额+支出金额 / 借方+贷方 | 支持千分位、¥、括号负数 |
| 对方 | 对方户名 / 客户名称 / 供应商名称 / 往来单位 | 用于名称相似度 |
| 单号 | 流水号 / 订单号 / 发票号 / 凭证号 / 参考号 | 精确匹配优先 |
| 摘要 | 摘要 / 用途 / 备注 | 原样带进结果 |
| 方向 | 收支 / 借贷 / 交易方向 | 配合单金额列判断正负 |
如果银行表是「收入金额 / 支出金额」两列,脚本会自动算 收入 - 支出;
如果是「借方 / 贷方」两列,默认按银行视角 贷方 - 借方,可用 --amount-mode 调整。
输出文件
| 文件 | 内容 |
|---|---|
对账单.xlsx |
汇总 / 已匹配 / 银行未匹配 / 账务未匹配 / 金额不一致候选,五个工作表 |
对账单.md |
一页式结论:匹配率、未匹配金额、最大未匹配几笔、匹配口径 |
匹配明细.csv |
每一对匹配的双方字段、匹配分、日期差 |
Excel 里已做表头冻结、筛选、金额/日期格式和异常着色,打开即可用。
匹配规则
| 优先级 | 规则 | 分值 |
|---|---|---|
| 1 | 单号规范化后完全相同 + 金额在容差内 | 100+ |
| 2 | 金额一致 + 日期差 ≤ 窗口 + 对方名称相似 | 78–101 |
| 3 | 金额一致 + 无日期,或日期略超窗口 | 40–80 |
| 4 | 单号相同但金额不同 | 进入「金额不一致候选」,不自动配对 |
| 5 | 同一天、对方相似但金额不同 | 进入候选,交人工判断 |
单号会去掉空格、横线等非字母数字字符并转大写;
对方名称会去掉「有限公司 / 股份 / 集团」等后缀再做相似度比较。
只做 1:1 匹配,一笔流水对多张发票、多笔流水合并回款都不会强行配平。
设计边界
- 纯标准库 Python,本地运行,无网络请求、无上传、无
subprocess/eval。 - 只读取输入文件,只写入
--out-dir;不改原表。 - 金额用
Decimal计算,避免浮点误差;日期支持YYYY-MM-DD、YYYY/M/D、YYYY年M月D日、YYYYMMDD和 Excel 日期。 - 表格很大时按金额/日期/单号分桶,避免全量两两比较;极端情况下会提示可能漏配。
- 结果是核对辅助,不构成审计、税务或财务意见;最终以银行回单和账务凭证为准。
样例
内置样例包含 8 笔银行流水与 8 笔账务记录:6 笔单号/金额直接匹配、1 笔日期差 1 天匹配、
1 笔银行手续费和 1 笔未到账账款留在未匹配表。运行 --sample 可直接看到完整输出。