- 输入数据
- 银行流水、银行日记账
- 核心方法
- 多条件匹配 + 金额容差 + 一对多 / 多对一匹配
- 输出物
- 已勾对、未达账项、余额调节表
银行对账模型
31 个步骤 · 38 条连接 · 12 条判定规则 · 由规格自动渲染,确认后再生成工作流
这个模型解决什么
每月几百上千笔银行流水要和账面逐笔核对,户名写法不一、日期对不齐、附言五花八门,人工核对一天也做不完一个月的量。
对账是财务每月必做、且几乎全靠人工的环节。自动匹配掉能对上的八成,人只看剩下的两成,时间从按天算变成按小时算;更重要的是每次的判断口径一致,谁来跑结果都一样,审计时说得清。
适用场景
- 月末对账:把当月银行流水与账面应收应付跑一遍,先自动匹配再人工处理差异
- 资金日清:每天跑一次,当天的未匹配项当天核实,避免积压到月末
- 审计抽查:对某个账户某段时间做全量核对,输出差异清单作为底稿
口径假设
- 附言中的单据号格式假设为 AP 加八位数字,按实际编号规则调整正则
- 日期窗口三天,含银行早于或晚于账面两种情况
- 一笔账面记录只能被匹配一次,先匹配上的占用
- 户名规范化会去掉「有限公司」「有限责任公司」等后缀与括号空格
适用边界
- 一对多不在本版范围:一笔银行收款对应多笔账面、或多笔付款合并支付,需要另一个模型
- 金额必须完全相同,手续费导致的差额不会被匹配
- 不处理跨月、跨账户的匹配
- 输出是待核清单,不是核销结论,实际核销仍需人工确认
数据来源
bank_statements.csv
读取银行流水
流水号交易日期银行账号收付方向金额对方户名附言book_entries.csv
读取账面记录
单据号记账日期往来单位收付方向金额经办人备注处理步骤
取数
判定
关联与汇总
输出
-
1. CSV读取器
读取银行流水
上游:—
- 文件:bank_statements.csv
-
2. CSV读取器
读取账面记录
上游:—
- 文件:book_entries.csv
-
3. 字符串处理
从附言里提取账面单据号
上游:1
- 表达式:regexReplace($附言$, “.*(AP[0-9]{8}).*”, “$1”)
- 新增列:提取单号
-
4. 字符串处理
户名规范化
上游:3
- 表达式:regexReplace($对方户名$, “\\s|(示例)|[()()]|股份有限公司|有限责任公司|有限公司|公司”, “”)
- 新增列:户名规范
-
5. 字符串处理
往来单位规范化
上游:2
- 表达式:regexReplace($往来单位$, “\\s|(示例)|[()()]|股份有限公司|有限责任公司|有限公司|公司”, “”)
- 新增列:单位规范
-
10. 表关联
按附言单号匹配
上游:4、5
- 左表关联列:提取单号
- 右表关联列:单据号
- 排除列:单位规范
-
11. 规则引擎
标记 M1
上游:10
- 新增列:匹配方式
- 规则:TRUE => “M1 附言单号匹配”
-
12. 规则引擎
置信度
上游:11
- 新增列:置信
- 规则:TRUE => “高”
-
20. 表关联
取出未按单号匹配的流水
上游:4、5
- 只要未匹配的行(反连接)
- 保留左表未匹配行
- 左表关联列:提取单号
- 右表关联列:单据号
-
21. 表关联
按金额户名方向匹配
上游:20、5
- 左表关联列:户名规范、金额、收付方向
- 右表关联列:单位规范、金额、收付方向
-
22. 字符串转日期&时间
日期转换
上游:21
- 日期格式:yyyy-MM-dd
- 选中列:交易日期、记账日期
-
23. 日期时间差
计算日期差
上游:22
- 日期列 1:记账日期
- 日期列 2:交易日期
- 新增列:相隔天数
-
24. 基于规则的行过滤器
日期在窗口内 → 匹配
上游:23
- 规则:$相隔天数$ <= 3 AND $相隔天数$ >= -3 => TRUE
-
25. 规则引擎
标记 M2
上游:24
- 新增列:匹配方式
- 规则:TRUE => “M2 金额户名日期匹配”
-
26. 规则引擎
置信度
上游:25
- 新增列:置信
- 规则:TRUE => “高”
-
27. 基于规则的行过滤器
超出日期窗口 → 未匹配
上游:23
- 规则:NOT ($相隔天数$ <= 3 AND $相隔天数$ >= -3) => TRUE
-
28. 规则引擎
标记未匹配
上游:27
- 新增列:匹配方式
- 规则:TRUE => “未匹配:银行有账面无”
-
29. 规则引擎
置信度
上游:28
- 新增列:置信
- 规则:TRUE => “待核”
-
30. 表关联
没有任何候选的流水
上游:20、5
- 只要未匹配的行(反连接)
- 保留左表未匹配行
- 左表关联列:户名规范、金额、收付方向
- 右表关联列:单位规范、金额、收付方向
-
31. 规则引擎
标记未匹配
上游:30
- 新增列:匹配方式
- 规则:TRUE => “未匹配:银行有账面无”
-
32. 规则引擎
置信度
上游:31
- 新增列:置信
- 规则:TRUE => “待核”
- 40. 表串联 合并已匹配的两路 上游:12、26
-
41. 分组聚合
取出已匹配的单据号
上游:40
- 分组列:单据号
-
42. 表关联
账面中未被匹配的记录
上游:5、41
- 只要未匹配的行(反连接)
- 保留左表未匹配行
- 左表关联列:单据号
- 右表关联列:单据号
-
43. 规则引擎
标记未匹配
上游:42
- 新增列:匹配方式
- 规则:TRUE => “未匹配:账面有银行无”
-
44. 规则引擎
置信度
上游:43
- 新增列:置信
- 规则:TRUE => “待核”
- 50. 表串联 合并全部四类 上游:40、29
- 51. 表串联 合并 上游:50、32
- 52. 表串联 合并 上游:51、44
-
53. 排序器
按匹配方式排序
上游:52
- 排序列:匹配方式
-
54. CSV写入器
写出对账结果
上游:53
- 文件:result.csv
判定规则汇总
| 节点 | 所在步骤 | 规则 |
|---|---|---|
| 11 | 标记 M1 | TRUE => "M1 附言单号匹配" |
| 12 | 置信度 | TRUE => "高" |
| 24 | 日期在窗口内 → 匹配 | $相隔天数$ <= 3 AND $相隔天数$ >= -3 => TRUE |
| 25 | 标记 M2 | TRUE => "M2 金额户名日期匹配" |
| 26 | 置信度 | TRUE => "高" |
| 27 | 超出日期窗口 → 未匹配 | NOT ($相隔天数$ <= 3 AND $相隔天数$ >= -3) => TRUE |
| 28 | 标记未匹配 | TRUE => "未匹配:银行有账面无" |
| 29 | 置信度 | TRUE => "待核" |
| 31 | 标记未匹配 | TRUE => "未匹配:银行有账面无" |
| 32 | 置信度 | TRUE => "待核" |
| 43 | 标记未匹配 | TRUE => "未匹配:账面有银行无" |
| 44 | 置信度 | TRUE => "待核" |
期望结果
示例数据下应得到 28 行,按「匹配方式」分布如下。运行后与 expected_result.csv 逐行比对。
12M2 金额户名日期匹配
6未匹配:银行有账面无
5M1 附言单号匹配
5未匹配:账面有银行无