上篇我们介绍了费用以及入账规则;当业务系统请求入账以后基于费用类型以及入账规则我们就可以知道应该入哪个账户;这时候问题就来了,因为账户余额也是分结构的,有冻结和可用,那么要是想先冻结起来怎么办呢?
我们先回顾一下上一篇的最后一个图,在冻结处理里我画了一个虚线圈,本篇文章我们就把他做实了。
1、冻结规则
我们在账户系统设计详解里讲过冻结模块,这里我们再细讲一下;冻结就是一个费用请求入账时要基于业务要求决定需不需要暂时冻结起来,还是直接就可以使用;那么如何设计冻结规则呢。
冻结规则是基于入账规则设置的,也就是这笔入账需不需要冻结,如何冻结,是全部冻结还是部分冻结;这里我们以全部冻结为例。
所以一个入账规则要关联一个冻结规则,入账的时候就需要同时获取冻结规则;入账规则和冻结规则是一对一的关系,费用类型和入账规则是一对多的关系。
冻结规则有2部分组成,一个是关联的入账规则;另一个是冻结规则;也就是说在配置入账规则的同时就需要关联性的去配置一条冻结规则。
冻结规则的配置有几个关键点。
冻结模式:就是按照固定时长冻结还是冻结到固定时间点。
冻结时间:如果选择固定时长的话就填一个时间值,如果是固定时间的话就选择一个可循环的时间点函数,比如次月10号,就配置成M+1月10号。
2.账户流水
账户有2个核心部分组成,一个是账户余额我们已经讲过了,另一个就是账户流水,账户流水就是记录了账户的变动历史明细,我们收窄为“资金的变动明细”。
为了记录资金的变动明细,我们就需要记录最基本的明细信息,一般必须包含以下信息:
账务流水号:作为该笔明细的唯一标识
请求ID:请求入账方的ID,便于后续的核算
账户ID:这笔流水属于哪个账户(会计记账就是科目编号)
费用类型:这笔流水是什么费用
金额:发生额
剩余余额:这笔流水发生后的账户余额
收支:支出,收入,这笔流水是增加余额还是减少余额(同会计分录的借贷)
账务发生时间:记账时间
会计时间:作为业务口径和财务口径转换的时间(非必须)
备注:业务备注信息
冻结状态:冻结的管理
操作:冻结/解冻
3、更新账户余额
这里有一个账务处理任务流,每笔入账都需要从头执行到尾,不能遗漏,任何一个处理失败了这笔入账就宣布失败进行入账的失败处理,我们先设定一个最简单的任务流
检查账户流水合法性 通过
账户流水表插入账户流水 完成
基于账户流水信息更新余额表对应账户的冻结余额或者可用余额 完成
账户ID:
- 总余额=总余额+本次发生额
- 冻结余额=冻结余额+本次发生额(冻结时)
- 可用余额=可用余额+本次发生额(不冻结时)
自洽校验:总余额=冻结余额+可用余额 通过
入账成功
经过一些列的处理,入账成功了,通知请求方,本次入账结束。
4、余额解冻
因为入账的时候有的流水处于冻结状态,那么我们就需要按照冻结的规则进行解冻,这时候就需要一个冻结解冻处理的任务进行扫描执行,至于扫描的模式要基于冻结模式去设计,我们以冻结固定时长最小单位为天为例,那么任务就需要每日凌晨去扫描遍历所有处于冻结状态的账户流水,满足解冻条件的变更冻结状态为未冻结,然后对余额进行处理;这又是一个处理的任务流。
任务扫描遍历冻结状态的账户流水。
满足条件的账户流水变更冻结状态为未冻结状态。
扣减账户的冻结余额并同时增加账户的可用余额。
解冻完成。
我们下篇讲解账户的冻结和调账功能。