财务对账工作台:把资金对账从 Excel 手工核对做成可审计的智能系统
Y2Ksoft 实战笔记 97 · 2026-10-18 · 金融财税 / 资金对账 / Node.js / SQLite / 资金安全 · 阅读约 13 分钟
这不是一个把 Excel 表格搬到浏览器里的“表格系统”。财务对账的核心不是界面,而是金额不出错、单据不重复核销、差异能找到证据、每一步都能审计。这篇文章完整复盘:我们如何从用户给的财务工作台模板出发,保留原来的九项业务导航,再把它做成 Node.js + SQLite 的完整前后端系统。
一、为什么“能对账”不等于“敢管钱”
市面上很多所谓对账工具,本质上是两份 Excel 的 VLOOKUP:按金额、日期或流水号查到一条记录,然后标个“已匹配”。演示时没问题,真正放到资金环境里,马上会遇到另一类问题。
- 同一张应收单被两笔流水重复核销;
- 金额看起来相等,实际因浮点精度差了 1 分;
- 用户双击提交,后端写入两条核销记录;
- 金额差异被“自动智能匹配”直接掩盖;
- 操作完成后只剩一个状态,没有操作人、时间和证据;
- 页面关闭后所有数据只在浏览器 localStorage 里。
所以这次开发的第一原则不是“功能多”,而是钱的计算和状态变化必须可证明。界面可以漂亮,但资金事实必须由数据库事务、唯一约束、审计链和权限系统守住。
财务软件的智能,不是替人拍板,而是更快找到候选、更早发现异常、更完整保留证据;最终核销仍由有权限的人确认。
二、先把原模板的九项导航做实
用户给出的原模板是:工作台、对账中心、回款管理、应收应付、发票管理、费用报销、资金报表、预警中心、系统设置。这不是九个菜单名,而是一条资金业务链:
工作台→回款管理→对账中心→差异处理→费用报销→资金报表→预警中心
我们没有为了“功能更多”另起一套导航,而是把银行流水放到“回款管理”的完整流水入口,把审批明细放到“费用报销”的审批中心入口,把智能分析放到“资金报表/预警中心”。最后新增“使用手册”,让客户不用去 F 盘翻文档,在系统侧栏就能直接看操作流程、角色权限、截图和 PDF。
🏠
工作台
今日回款、待对账、应收、异常数据、趋势和待办。
🔁
对账中心
候选扫描、评分证据、人工匹配、批量核销和差异处理。
💸
回款管理
客户回款、收款单、银行流水、催收和核销状态。
📊
资金报表
现金流、资金趋势、经营指标和智能分析入口。
三、完整架构:不是一个 HTML 加 localStorage
浏览器 SPA原生 HTML/CSS/JS、API Client、响应式页面
Node.js 24认证、CSRF、角色权限、幂等和业务路由
SQLiteWAL、事务、外键、唯一索引和审计记录
HMAC 审计服务端密钥保护的前向哈希链
| 层级 | 关键实现 |
|---|
| 前端 | 原模板信息架构、威盾深海蓝青背景、呼吸灯、风险警示灯、紧凑字体层级 |
| 认证 | scrypt 加盐密码、HttpOnly Cookie、SameSite=Strict、CSRF Token、登录失败锁定 |
| 权限 | 管理员、财务主管、会计、审计员、只读角色 |
| 资金写入 | 整数分、BEGIN IMMEDIATE 事务、双向匹配、唯一索引、幂等键 |
| 智能能力 | 确定性候选评分、重复付款、金额差异、周末交易、13 周现金流、客户信用风险 |
| 审计 | 操作人、实体、前后值、IP、请求 ID、HMAC 前向哈希链 |
四、对账引擎怎么评分
候选匹配不是“金额一样就确认”。系统把金额、方向、日期和对手方拆成可解释的分项分数,只要存在硬冲突就不进入自动候选。当前评分结构如下:
金额完全一致得满分;配置容差内仍然可匹配;小额差异会标记为“疑似手续费或净额结算”,但不能因此悄悄确认。日期超出容差、对手方明显不一致,都会降级为人工复核或直接排除。
| 规则 | 处理方式 |
|---|
| 金额、方向、对手方、日期均强一致 | 高置信度候选,可进入批量确认 |
| 金额差在容差内 | 生成候选,展示差异证据 |
| 疑似手续费净额 | 保留风险提示,必须人工核销 |
| 同对手方同额短时重复支出 | 进入重复付款预警 |
| 自动确认阈值 | 默认 0;只有功能上明确开启并配置阈值才可能自动核销 |
五、真正守住资金的六条硬约束
01 · 金额只用整数分12.34 存 1234 分,12.345 直接拒绝,不做静默四舍五入。
02 · 单据只能核销一次数据库唯一索引+事务二次校验,同一业务单据不能绑定两笔银行流水。
03 · 双向状态一致银行流水标 matched,业务单据也必须 matched,双方匹配 ID 互相指向。
04 · 重试不重复写钱资金写接口支持幂等键,相同请求返回第一次结果,不产生第二笔核销。
05 · 批次失败整体回滚批量核销里任何一组金额、方向或状态异常,整批事务回滚。
06 · 审计链不可悄悄改审计记录使用服务端 HMAC 链,修改历史内容会导致完整性复算失败。
此外,会话使用 HttpOnly + SameSite=Strict Cookie,所有写请求校验 CSRF;角色权限在服务端执行,不是前端把按钮隐藏一下。生产模式如果仍使用默认账号密码,服务会直接拒绝启动。
六、智能模块:把“聪明”放在可解释的地方
🔍
候选证据
不是只给一个百分比,而是拆开显示金额差、日期差、对手方相似度和方向。
🚨
重复付款
同对手方、同金额、72 小时内支出自动分组,红灯提示人工核查。
🌊
13 周现金流
按应收到期和待付业务单据预测周流入、流出与累计净现金流。
🏦
客户信用风险
把逾期金额、最大账龄与应收集中度合成风险分。
📅
非工作日交易
周末银行收付作为审计关注线索,不改变原始匹配事实。
🔢
异常金额
大额、整万元、频繁同额等规则形成分层预警。
这里刻意没有把最终核销交给 AI。规则引擎负责“找候选、找异常、找证据”,人负责“确认事实”。这条边界,比所谓全自动更接近真实财务环境。
七、UI 不是另起炉灶,而是在原模板上收敛
这次界面经历过一次明显调整:最初我们把它做成了另一套暗色玻璃工作台,后来按用户反馈重新回到原模板的信息结构。现在保留的是:
- 原模板的九项导航与业务顺序;
- 威盾同源深海蓝青背景和多层光晕;
- 绿色、琥珀色、红色三级呼吸灯和警示灯;
- 更紧凑但可读的字体:正文 14px、侧栏 13px、表格 11.5–12px;
- 系统内“使用手册”,不是只放一个 PDF 文件在硬盘里。
财务人员每天要盯很多数字。字号不能小到看流泪,也不能大到一屏只剩两个 KPI。最终目标是协调:左侧不抢主内容,表格能快速扫读,风险灯只在需要人动手时亮。
八、系统实拍
01 · 登录页:服务端会话与权限入口
登录成功后使用 HttpOnly 会话;管理员、财务主管、审计员拥有不同操作权限。

02 · 工作台:原来的结构,真实的数据
KPI、回款趋势、对账进度、应收应付、发票、流水、待办、审批、预警和操作记录全部由数据库驱动。

03 · 对账中心:候选、证据与批量核销
扫描只生成候选;勾选高置信度后仍需人工确认。重复核销会被数据库和后端同时拒绝。

04 · 回款管理:银行流水进入业务链
回款流水可筛选、核销、创建收款单,并可进入完整银行流水页。

05 · 发票管理:到期、回款和逾期风险
发票台账同时服务应收跟踪、账龄分析和催收。

06 · 费用报销:审批状态和金额留痕
报销申请、通过、驳回和审计记录形成完整流程。

07 · 智能分析:现金流和风险一屏
13 周现金流预测、重复付款、客户信用风险、规则命中全部来自后端计算。

08 · 系统内使用手册:客户不用翻硬盘
侧栏直接进入使用手册,包含模块入口、标准流程、角色权限、关键截图、安全红线和 PDF 下载。

九、测试和资金安全审计
这个项目不是“打开页面能点”就交付。后端测试覆盖认证、CSRF、幂等、重复核销、金额精度、审批、催收、备份恢复和角色越权。
- SQLite 完整性检查
- 外键一致性
- 重复核销约束
- 匹配双向状态
- 金额整数分和正数约束
- HMAC 审计链复算
- 有效核销唯一性
- scrypt 密码哈希
- HttpOnly + SameSite
- CSRF 校验
- 幂等键
- 事务写入
- 安全响应头
- 生产默认密码闸门
- 硬编码密钥扫描
- 金额两位小数硬约束
十、上线边界与下一步
当前版本是完整的前后端私有化交付版,适合单组织财务团队试用和二次部署。它已经解决了资金精度、重复核销、权限、审计、备份和基础智能分析,但不应该被描述成“永不犯错的财务系统”。
- 真实银行接入仍需按银行或合规服务商 API 做联调与验签;
- 多组织场景要增加 tenant_id 和行级权限;
- 大规模数据可迁移 PostgreSQL,保留整数分与事务约束;
- AI 语义匹配只能补充证据,不能替代最终核销;
- 上线前仍需财务负责人规则复核和独立渗透测试。
这次从模板出发,最终交付的不只是一个更漂亮的页面,而是一套能把“候选—证据—人工确认—资金事实—审计链”串起来的系统。对财务软件来说,少一点盲目的自动化,多一点可证明,才是真正的好用。