资金对账系统的设计思考
参考文章:
资金安全是公司业务稳定运行的核心方面之一,风险容忍度极低,实施上任何公司都希望全年资金运营风险事件为零。一个稳定可靠的清结算系统是资金安全的前提,一个严谨、健全、灵活的对账系统是保障。本文主要对资金对账系统进行总结探讨。
对账系统处理步骤:数据准备 => 数据核对 => 差错处理
数据准备
该模块主要实现两个目标:
- 第一是为不同的外部系统提供多元化的接入机制
- 第二是通过数据适配的手段把外部数据以统一的格式进行转换和存储
数据核对
资金流数据对账逻辑
问题梳理:
- 漏结:发起方有数据,接收方无数据。
- 重复结:发起方有一笔数据,接收方有两笔数据。
- 错结:发起方和接收方数据不一致,一般发生在金额和状态两个字段。
对账方式:
-
单向对账:以一方数据为准,进行对账。
-- SQL实现:TABLE_A和TABLE_B对账,以TABLE_A为准 SELECT A.KEY, A.VALUE AS VALUE_A, B.VALUE AS VALUE_B, A.VALUE-COALESCE(B.VALUE,0) AS DIFF FROM TABLE_A A LEFT JOIN TABLE_B B ON A.KEY =B.KEY -- LEFT JION
-
双向对账:双方数据互为基准对账。 发现问题更为全面,优先选择。
-- SQL实现:TABLE_A和TABLE_B对账,TABLE_A和TABLE_B互为基准 -- 方式1:FULL JOIN SELECT COALESCE(A.KEY, B.KEY) KEY , COALESCE(A.VALUE,0) AS VALUE_A , COALESCE(B.VALUE,0) AS VALUE_B , COALESCE(A.VALUE,0)-COALESCE(B.VALUE,0) AS DIFF FROM TABLE_A A FULL JOIN TABLE_B B ON A.KEY=B.KEY -- 方式2:UNION ALL + GROUP BY -- 推荐,因为代码更精简 SELECT T.KEY , SUM(VALUE_A) VALUE_A , SUM(VALUE_B) VALUE_B , SUM(VALUE_A)-SUM(VALUE_B) AS DIFF FROM ( SELECT A.KEY, A.VALUE AS VALUE_A, 0 AS VALUE_B FROM TABLE_A A UNION ALL SELECT B.KEY, 0 AS VALUE_A, B.VALUE AS VALUE_B FROM TABLE_B B ) T GROUP BY T.KEY
对账粒度:
- 明细对账:明细数据比对
- 优点:可以准确定位问题数据。
- 缺点:
- 对账口径设计比较复杂,因为我们需要同时针对漏、重、错三种错误类别设计不同的对账口径,同时还要考虑到业务的边缘场景。稍有不慎,就会影响对账的准确性。
- 处理的数据量大,对账处理过程长。
- 汇总对账:按一个维度汇总后比对
- 优点:对账口径设计简单,可快速实现,不易出错。处理数据量较小,对账过程快。
- 缺点:无法定位数据底层问题,一旦发现问题,还需进一步寻找问题数据。
- 因此,推荐的做法应该是以明细对账为主,定位具体问题。以总数对账为辅,对明细对账的结果进行复核兜底。
对账口径:
对账时机
差错处理
会计科目对账逻辑
在资金流数据对账的基础上,对每个资金业务配置记账模板(例如:借 科目1 + 贷 科目2),将单一资金流数据转换为会计复式记账分录数据,进一步体现为会计科目的流水,并计算科目余额,然后与外部渠道实际余额进行账实核对;同时还可以利用内部会计科目之间勾稽关系,进行账账核对(不同科目发生额/余额之间的核对)
TODO: 实现思路举例