财务系统

财务系统 #

系统划分 #

  • 账务系统:记录账户交易明细,提供账户查询功能,可以视为会记系统的前置。账户系统不同于钱包系统,属于记账系统,不属于内部资金系统,所以不应提供提现等功能。运营人员关注的是分户账的管理。如应收款未出账-正常,应收款未出账-90天内。
  • 会记系统:提供内部财务核算管理功能。财务人员关注的是财务帐的管理,不关心逾期等中间状态。

账户系统 #

数据建模 #

  • 账户表:用户ID、账户余额、更新时间、最后交易流水号。

账户类型 #

对公对私账户类型分类

  • 平台内部
    • 待清算户:交易流水在经过清算中心处理后由待清算户转移至待结算户。
    • 待结算户:用户在商户完成交易后,资金进入该账户。
    • 基本户:商户的余额户,可以提现。交易在结算后,资金才会进入该账户。
    • 手续费户
  • 银行
    • 基本户:需要最先开设的账户,负责现金收付(进出都行)和转账结算。
    • 一般户:负责借款归还(还银行钱),借款转存(向银行借钱),现金缴存(只进不出),功能类似信用卡。一般户是因借款或其它结算需要开,不能与基本户归属同一银行。
    • 专用存款账户和临时存款账户
    • 个人银行结算账户:投资,消费,转账收付,现金存取
    • 储蓄账户:现金存取(不能转账,保护老人退休工资等)

平台内部账户类型分类

  • 个人账户:个人余额账户、待清算户。
  • 企业账户:基本户(余额户)、待清算户、手续费户。
  • 内部账户:公司内部账户,为了提高并行度可按业务类型和支付渠道拆分为多个虚拟户。

账户类型流转实例:

  1. 假设企业账户一开始预存手续费10000元,交易手续费率1%,则该企业一开始情况为:待结算户=0,基本户=0,手续费户=10000
  2. 若某用户在该企业商户购买了1000元物品,则该企业情况为:待结算户=1000,基本户=0,手续费户=9990
  3. 当结算任务执行完成后,该企业情况为:待结算户=0,基本户=1000,手续费户=9990
  4. 若商户提现600,提现手续费为2元,则该企业情况为:待结算户=0,基本户=400,手续费户=9988

记账原则 #

  1. 流水记录只能新增,不能修改和删除。即使由于正当原因需要取消一笔交易,也不应该删除,而是再记录一笔“取消交易”的流水。
  2. 流水号必须是递增的,以此来确定交易的先后顺序。
  3. 在设计对外提供的服务接口时,不能提供单独更新余额或者流水的功能,只提供交易功能。
  4. 借贷记账法:这里的借贷和传统意义上的借贷关系没有任何关联,算是比较烂的起名方式。一般来说借方记录减少的发生额,贷方记录增加的发生额。

记账维度 #

  • 虚拟户记账

    • 基于账户记账,一般采用单边记账法,也就是说一次交易一条记录。通常只记录收入或支出,不记录来源。比如买菜记账只记录花了多少钱,不会记录卖家。适用于现款现货。
    • 实时入账。
    • 一般设立在账户系统中。
  • 会记科目记账

    • 基于会计科目记账,一般采用会计借贷平衡的复式记账法,也就是说一次交易记录借和贷共两条。
      • 会记科目:一级科目规范化,二级科目根据企业灵活化。
      • 总账科目(一级科目)
        • 资产类(流动资产和非流动资产);
        • 负债类(流动负债,非流动负债):个人账户余额户、公司账户余额户
        • 共同类:兼具资产和负债性质,多为金融、基金等使用;待清算充值款项、待清算提现款项,待清算支付款项。
        • 所有者权益类(实收资本、资本公积、盈余公积、本年利润、利润分配);
        • 成本类;损益类(收入类、费用类),可转入本年利润;
      • 明细类科目(二级、三级科目):只有叶子科目可以开设账户。
    • 跑批或异步入账。
    • 日终进行轧差、平衡检查。
    • 一般设立在账户系统或会计系统中。

记账方法 #

普通账户 #

  1. 开启事务,获取账户的余额和最后一笔交易的流水号。
  2. 写入新流水记录。
  3. 更新账户余额,在条件中限定只有流水号等于之前查询出的流水号时才更新。
  4. 更新成功就提交事务,否则回滚事务或重试。

热点账户 #

余额单位表

  1. 创建余额单位表。将一条余额记录拆分为多条,例如1230元余额拆分为1000元余额单位表中1条记录、100元余额单位表中2条记录、10元余额单位表中3条记录。
  2. 在账户表中记录每张余额单位表中最后一条记录的主键ID。
  3. 扣款时从个位数开始依次对余额单位表进行扣款(删除记录)。如果某位不足则从高位表借位。
  4. 入账时则在余额单位表增加记录,此时需要考虑进位问题。
  5. 任何时候不进行回滚,而是通过增加和删除行数保证数据一致性。

缓冲入账

  1. Redis中记录余额。
  2. 扣款时Redis扣除余额,同时在流水表中增加一条流水记录,状态为未入账。。
  3. 定时按批次将流水表的记录更新到账户表,同时将数据库中的余额同步到Redis中。
  4. Redis只做实时计算,不做回滚

账户拆分

  1. 账户分割系统将账户拆分为单个主账户和多个子账户,子账户个数=30天平均业务量峰值/单节点处理性能。
  2. 根据交易流水负载均衡分配给主账户或子账户进行处理。
  3. 记录支出时如果子账户余额不够,则流水路由给主账户处理。
  4. 记录支出时如果主账户仍旧不足,则将子账户余额归并后处理。

会计系统 #

所有的记账数据由账务系统发送至会计系统。这样确保了会计系统记账的依据产生于账务系统,实现两者数据的统一。 比如说会计四级科目-应收款-贷款-利息事件运营根据时间会挂到未逾期账户,预期账户,预期90天账户 而会计不关心,只需要寄到会计四级科目即可。