package com.taoke.autopay.manager;
|
|
import com.taoke.autopay.entity.KeyOrder;
|
import com.taoke.autopay.service.KeyOrderService;
|
import lombok.Builder;
|
import lombok.Data;
|
import org.springframework.stereotype.Component;
|
import org.springframework.transaction.annotation.Transactional;
|
|
import javax.annotation.Resource;
|
import java.util.HashMap;
|
import java.util.Map;
|
import java.util.PriorityQueue;
|
import java.util.Queue;
|
|
/**
|
* @author hxh
|
* @title: OrderPayFailProcessor
|
* @description: TODO
|
* @date 2024/7/26 21:27
|
*/
|
@Component
|
public class OrderPayFailProcessor {
|
|
@Data
|
@Builder
|
public static class OrderQueue implements Comparable{
|
private String id;
|
private long expireTime;
|
|
@Override
|
public int compareTo(Object o) {
|
return 0;
|
}
|
}
|
|
@Resource
|
private KeyOrderService keyOrderService;
|
|
private Map<String,Integer> reProcessCountMap=new HashMap<>();
|
|
private Queue<OrderQueue> orderQueues=new PriorityQueue<>();
|
|
public void clearCacheData(){
|
reProcessCountMap.clear();
|
orderQueues.clear();
|
}
|
|
@Transactional(rollbackFor = Exception.class)
|
public void processFromQueue(){
|
if(orderQueues.isEmpty()){
|
return;
|
}
|
OrderQueue queue = orderQueues.peek();
|
if(queue!=null&&System.currentTimeMillis() > queue.expireTime){
|
queue = orderQueues.poll();
|
KeyOrder order = keyOrderService.selectById(queue.getId());
|
if(order==null||order.getState()!=KeyOrder.STATE_REJECT_PAY){
|
return;
|
}
|
if(reProcessCountMap.containsKey(queue.getId())&&reProcessCountMap.get(queue.getId())>3){
|
return;
|
}
|
|
if(!reProcessCountMap.containsKey(queue.getId())){
|
reProcessCountMap.put(queue.getId(), 0);
|
}
|
reProcessCountMap.put(queue.getId(), reProcessCountMap.get(queue.getId())+1);
|
keyOrderService.removeDistributedClient(queue.getId());
|
// 移除已经分配的设备,改变状态为未分配
|
KeyOrder update=new KeyOrder();
|
update.setId(queue.getId());
|
update.setState(KeyOrder.STATE_NOT_PROCESS);
|
update.setStateDesc("重新分配");
|
keyOrderService.update(update);
|
}
|
}
|
|
/**
|
* @author hxh
|
* @description 处理支付失败
|
* @date 21:28 2024/7/26
|
* @param: id
|
* @param: msg
|
* @return void
|
**/
|
@Transactional(rollbackFor = Exception.class)
|
public void processPayFail(String id,String msg){
|
if(msg==null||!msg.contains("超时")){
|
return;
|
}
|
//加入重试队列
|
orderQueues.add(OrderQueue.builder().id(id).expireTime(System.currentTimeMillis()+2*60*1000).build());
|
KeyOrder update=new KeyOrder();
|
update.setId(id);
|
update.setState(KeyOrder.STATE_REJECT_PAY);
|
update.setStateDesc(msg);
|
keyOrderService.update(update);
|
}
|
|
public static void main(String[] args){
|
Queue<OrderQueue> orderQueues=new PriorityQueue<>();
|
orderQueues.add(OrderQueue.builder().id("1").build());
|
orderQueues.add(OrderQueue.builder().id("2").build());
|
OrderQueue queue = orderQueues.peek();
|
queue = orderQueues.poll();
|
orderQueues.isEmpty();
|
|
|
}
|
|
}
|