热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

自动对账系统的设计实现

需求背景现在每个月大概有几百万个订单,来自十几个不同的渠道,同时区分货币和子渠道,财务在进行对账的时候只能从对方后台下载excel对账账

需求背景

现在每个月大概有几百万个订单,来自十几个不同的渠道,同时区分货币和子渠道,财务在进行对账的时候只能从对方后台下载excel对账账单,然后从我方统计出相应时间内的订单数,然后挨个excel进行累加求和,最后对比总单数和总金额。


痛点


  1. 这样整体进行对账无法确认差异明细,一旦出现差异很难在上百万的订单中找出差异的订单。
  2. 每个渠道散落在不同的国家,渠道后台导出的时间和我方后台使用的时间时区并不一致,可能会导致由于时区产生的几小时数据误差(比如我方是UTC,对方是UTC+8,对方以UTC+8的标准导出2月份数据实际上和我方的2月份数据有8小时的数据是不准确的)。
  3. 手动对账耗时时间长,有些渠道为了每个账单大小适中,会将一个月的数据分成几个甚至几十个账单,人工计算慢并且容易出错

解决方案


  1. 获得渠道方的账单,通过手动上传或者sftp,ftps等方法获得并存储到我们自己的对象存储云上,并且将账单的渠道名称,账单类型,时区,云下载链接入库
  2. 解析已经入库的账单,抽取出重要的字段,比如金额,渠道费,税,货币,订单时间等等,将这些数据导入到新的表里。
  3. 将2里面创建的表和我方后台的表按照时间和渠道进行逐条比对,确认出无差异,我方缺订单,对方缺订单,双方都有但是金额有差异等情况
  4. 每对比一条数据就会产生一条新的对比数据,将数据插入到新的表中供后续报表展示使用
  5. 根据4中产出的明细表按照时间和渠道来计算出各个月每个渠道的总体差异值,得到各个渠道在各个月的总差异笔数和总差异金额。

遇到的问题


  • 首先最麻烦的事情是时区,每个渠道给出的对账单的时区都不太一样,当我们想要进行对账的时候就很有可能有误差。
    比如我方时区为UTC,对方时区为UTC+8
    对方给出的1月份账单中订单从2022-01-01 00:00:00 到 2022-02-01 00:00:00
    但是这个时间实际上是UTC+8的时间,对应到我们这边,订单时间其实是2021-12-30 16:00:00 到 2022-01-31 16:00:00,这样就会有8个小时的数据有差异。
    解决方法:每个渠道都用对方的时区来对账,在上述的问题中,我们拿到订单之后不再以我方的“1月份”为标准来进行对账,而是从我方取出2021-12-30 16:00:00 到 2022-01-31 16:00:00来进行对。其他时区也以此类推。

  • 每个渠道给出的账单格式不同,需要独立处理

  • 运行时间较慢,主要耗时在从云端下载对账文件以及解决方法第3步中的数据逐条比对,逐条比对本质上是将两张表进行外链接来实现的,累得到双方都有的,只有对方/我方有的数据,这个过程是两个较大的表进行链接,比较耗时


注意事项


  • join语句执行很慢,最好使用离线库来执行,不要影响线上业务
  • 尽可能复用代码,同时注意可扩展性,因为不同渠道的账单差别非常大,很多地方都需要重新format,保证每个字段都能够直接或者间接拿到或者找到合理的默认值
  • 每次解析要做到幂等,同一个文件多次解析后结果相同
  • 上传文件时进行格式检验,一旦错误的数据插入到数据集中很难将其挑选出来
  • 即便是解决了时区的问题,依旧存在时间上不可解决的误差,因为对方记录的“订单时间”和我方记录的“订单时间不是一码事”,有可能我方记录的是订单生成时间/发起支付请求的时间,但是对方给出的时间是在对方后台建立交易的时间,这中间有一些误差,而且每个渠道都不一样。

推荐阅读
  • 如何在服务器主机上实现文件共享的方法和工具
    本文介绍了在服务器主机上实现文件共享的方法和工具,包括Linux主机和Windows主机的文件传输方式,Web运维和FTP/SFTP客户端运维两种方式,以及使用WinSCP工具将文件上传至Linux云服务器的操作方法。此外,还介绍了在迁移过程中需要安装迁移Agent并输入目的端服务器所在华为云的AK/SK,以及主机迁移服务会收集的源端服务器信息。 ... [详细]
  • 本文介绍了如何使用python从列表中删除所有的零,并将结果以列表形式输出,同时提供了示例格式。 ... [详细]
  • 我们有(据我所知)星型模式SQL数据库中的数据文件。该数据库有5个不同的文件,扩展名为 ... [详细]
  • SVN 功能说明(简版)
    Subversion(SVN)是什么?SVN是一种版本管理系统,是开源软件的基石。即使在沟通充分的情况下,多人维护同一份源代码的一定也会 ... [详细]
  • FTP服务ftp的报错及用户管理
    ftp服务常见报错530报错认证失败(密码错误或者服务端拒绝)550服务本身未开启553文件系统不可写(权限问题)500服 ... [详细]
  • PHP程序员玩转Linux系列 搭建FTP代码开发环境
    PHP程序员玩转Linux系列搭建FTP代码开发环境-PHP程序员玩转Linux系列文章:有些同学可能觉得我写的都是啥yum安装的,随便配置一下而已,没啥技术含量,我的目的是让大家 ... [详细]
  • linux ftp 线程数设置,Linux搭建ftp在windows下这么访问,需要怎么设置【设置vsftp最大连接数和每个ip的最大连接数】...
    文章来源:http:zhidao.baidu.comlink?urlLOfStD1kcxGhI_D5qC7oka3_4QZc1nn1SJwWaSd4onWoVl5Wt ... [详细]
  • 本文讨论了Kotlin中扩展函数的一些惯用用法以及其合理性。作者认为在某些情况下,定义扩展函数没有意义,但官方的编码约定支持这种方式。文章还介绍了在类之外定义扩展函数的具体用法,并讨论了避免使用扩展函数的边缘情况。作者提出了对于扩展函数的合理性的质疑,并给出了自己的反驳。最后,文章强调了在编写Kotlin代码时可以自由地使用扩展函数的重要性。 ... [详细]
  • Java和JavaScript是什么关系?java跟javaScript都是编程语言,只是java跟javaScript没有什么太大关系,一个是脚本语言(前端语言),一个是面向对象 ... [详细]
  • 本文介绍了如何使用PHP代码将表格导出为UTF8格式的Excel文件。首先,需要连接到数据库并获取表格的列名。然后,设置文件名和文件指针,并将内容写入文件。最后,设置响应头部,将文件作为附件下载。 ... [详细]
  • 超级简单加解密工具的方案和功能
    本文介绍了一个超级简单的加解密工具的方案和功能。该工具可以读取文件头,并根据特定长度进行加密,加密后将加密部分写入源文件。同时,该工具也支持解密操作。加密和解密过程是可逆的。本文还提到了一些相关的功能和使用方法,并给出了Python代码示例。 ... [详细]
  • java drools5_Java Drools5.1 规则流基础【示例】(中)
    五、规则文件及规则流EduInfoRule.drl:packagemyrules;importsample.Employ;ruleBachelorruleflow-group ... [详细]
  • 苹果mac休眠快捷键_哪里不会点哪里苹果电脑应用手册
    找到所需内容,点击链接查看视频教程一、系统设置1.1用户密码的设定与使用用户密码的设定与更改1.2添加输入法鼠标触控板快捷键屏幕录像输入法鼠标触控板快捷键屏幕录像1. ... [详细]
  • 实例详解ISA防火墙策略元素
    我们在前面的工作中已经实现了ISA2006的代理服务器功能,接下来我们要实现ISA的访问控制功能。很多公司都有控制员工访问外网的需求,例如有的公司不允许 ... [详细]
  • excel怎么自动求乘积(平均值公式)
    2、如果使用单元格引用或数组作为Average函数的参数,那么参数必须为数值,其他类型的值将被忽略。功能:计算满足给定条件的所有单元格的算术平均值,即单条件计算平均值。注意实现:1 ... [详细]
author-avatar
红颜弹指老a刹那芳华_623
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有