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