这是「个人对后勤业务见解」系列的延伸篇,业财一体化的最后一篇。
接口是最简单的部分
需求讲完之后,所有人都觉得业财打通是个接口活儿——财务系统开几个接口,我们这边调用就行。
接口确实是这里面最简单的部分。真正吃掉周期的是另外三件事。
第一关:口径
业务侧说的「费用」和财务侧说的「费用」,经常不是一个东西。
几个反复出现的分歧
含税还是不含税。业务侧填报时习惯用发票金额(含税),财务侧核算用不含税金额。同一笔支出,两边的数字天然差一个税额。
合同金额算什么。是签约总额、本年度可执行额、还是已确认的结算额?三个数都叫「合同金额」,差得很远。
科目怎么映射。业务侧按管理需要分类(比如按项目、按用途),财务侧按会计准则设科目。两套分类不是一一对应的,一个业务分类可能落到多个会计科目,反过来也一样。
时点怎么算。费用算在申请日、审批日、还是支付日?跨月的时候这个选择直接决定数字归到哪个月。
这些在需求文档里通常一句「实现业财数据对接」带过,实际做的时候每一条都要拉着业务和财务两边的人当面对。我们在这上面开了七八次会,会议纪要比接口文档厚。
建议
把口径定义单独做成一份文档,逐条列出字段、双方定义、最终采信哪一方、换算规则。这份文档要两边签字确认。听起来很形式主义,但等到上线后对不上账、开始互相甩锅的时候,它是唯一能把讨论拉回事实的东西。
第二关:同步
字段会变,而且不通知你
上游系统是别的厂商建的。他们那边加个字段、改个枚举值、调整一下返回结构,不会有人告诉你。
所以同步链路必须做字段变更的检测和告警。最危险的不是同步失败,是同步「假成功」——任务返回 200,日志显示正常,但某个字段悄悄变成了空值,错误数据一路流下去,两个月后对账才发现。
具体做法:在接入层对关键字段做非空和格式校验,不通过的数据隔离到待处理队列并告警,不要静默写入。
别追求强一致
业财数据同步这类场景,用消息队列异步解耦就够了,配上消息持久化、消费确认、死信队列、重试机制,保证最终一致。
追求强一致的代价是把两个系统绑死——对方系统抖一下,你这边跟着挂。不值得。
只有身份认证、待办推送这类实时性要求高的场景才用同步调用,而且要有缓存兜底。
同步失败要能人工介入
网络中断、接口超时、数据格式变更、字段缺失,这些都会导致同步部分或完全失败。除了自动重试,还要留一个人工介入的通道——能查看失败明细、能手工触发重试、能标记忽略。
没有这个通道,一旦出现自动重试解决不了的问题,就只能改代码或者直接改库,两个都不是好选择。
第三关:对账
这是我认为整个项目里最重要、但最容易被忽略的一环。
业财一体化的验收,通常演示的是看板——图表好不好看、能不能下钻、响应快不快。这些都不是重点。
验收标准应该是「对不对得上账」
我的建议很具体:上线验收的时候,找财务要一份他们自己手工算的月度数据,和系统跑出来的结果逐项比对。
差多少,就是这个项目的真实完成度。
第一次比对差个百分之十几很正常,重点是把差异逐条归因——是口径没对齐、是某类费用漏采、还是时点算法不一致。归完因,改完,再比一次。通常两三轮之后能收敛到可接受范围。
对账要做成常态功能
上线时对得上,不代表半年后还对得上。上游系统会变,业务规则会调整。所以对账不能只是验收时做一次,要做成系统里的一个常规功能:定期自动比对、差异自动列出、超过阈值自动告警。
小结
业财一体化这件事,技术上没有特别难的东西——消息队列、预聚合、元数据驱动,都是成熟方案。真正难的是把两个部门对同一件事的不同理解统一起来,并且让这个统一在系统里固化下来。
所以我一直觉得,这类项目的成败在需求阶段就定了七成。代码写得好不好,反而是次要的。