设计
多个渠道的对账单下载
- 使用工厂方法封装各个渠道的对账单下载类,存入数据库。
渠道对账单与平台交易流水对账
算法实现
- 从数据库根据订单号(如需分交易类型对账,同时根据交易类型)分别取出固定相同数量(计算机内存允许)的渠道账单和平台交易流水,并根据订单号排序,分别放到两个队列中。
- 对比两个队列,比较两个队列订单号大小,伪代码如下:
// 每次对比订单的数量
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 ++;
}
// 最后,比对等待查询列表,将可以对平的账单移出代查询列表,其他的留在代查询列表,标记确认为异常订单,转为人工处理。(账单跨日问题可根据业务情况,人工处理,或者将跨日点附近的订单第二天对账时再次比对)
博客