设计

多个渠道的对账单下载

  • 使用工厂方法封装各个渠道的对账单下载类,存入数据库。

渠道对账单与平台交易流水对账

算法实现
  1. 从数据库根据订单号(如需分交易类型对账,同时根据交易类型)分别取出固定相同数量(计算机内存允许)的渠道账单和平台交易流水,并根据订单号排序,分别放到两个队列中。
  2. 对比两个队列,比较两个队列订单号大小,伪代码如下:
  1. // 每次对比订单的数量
  2. final static Integer ORDER_SIZE = 100000;
  3. while(true){
  4. Integer pageNo = 0;
  5. // 渠道订单列表
  6. List<ChannelOrder> channelOrders = dataBaseService.queryChannelOrder(ORDER_SIZE, pageNo);
  7. // 平台订单列表
  8. List<PlatformOrder> platformOrders = dataBaseService.queryPlatformOrder(ORDER_SIZE, pageNo);
  9. Integer i = 0;
  10. Integer j = 0;
  11. while(true){
  12. if(channelOrders[i].orderNo == platformOrders[j].orderNo ){
  13. // 订单号相同,比较订单其他要素,如果相同,此订单一致
  14. i ++;
  15. j ++;
  16. }else if if(channelOrders[i].orderNo > platformOrders[j].orderNo ){
  17. // 渠道订单号大于平台订单号,说明平台多了一笔订单,将平台多出的订单号放入待查询列表,平台订单列表序号加1,渠道订单列表序号不变。
  18. j ++;
  19. }else if if(channelOrders[i].orderNo < platformOrders[j].orderNo ){
  20. // 渠道订单号小于平台订单号,说明平台少了一笔订单,将平台少的订单放入待查询列表,平台订单号列表不变,渠道订单列表序号加1。
  21. i ++;
  22. }
  23. if(i == ORDER_SIZE || j == ORDER_SIZE){
  24. // 如果任何一个订单列表到达末位,此次比对订单结束,将另一个订单列表未比对的订单放入带查询列表
  25. break;
  26. }
  27. }
  28. // 取下一批次的对账列表
  29. pageNo ++;
  30. }
  31. // 最后,比对等待查询列表,将可以对平的账单移出代查询列表,其他的留在代查询列表,标记确认为异常订单,转为人工处理。(账单跨日问题可根据业务情况,人工处理,或者将跨日点附近的订单第二天对账时再次比对)

博客