admin
2024-07-26 c0fa314702c6bb19b0c8975dfaee8e39d1896844
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
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();
 
 
    }
 
}