admin
2020-04-17 087b91bff39bb54d872a181c113cdb41c27cacbe
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
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
package com.yeshi.fanli.job.order.jd;
 
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
 
import javax.annotation.Resource;
 
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
 
import com.xxl.job.core.biz.model.ReturnT;
import com.xxl.job.core.handler.annotation.XxlJob;
import com.yeshi.fanli.dto.jd.JDOrderResult;
import com.yeshi.fanli.entity.jd.JDOrder;
import com.yeshi.fanli.exception.jd.JDOrderException;
import com.yeshi.fanli.log.LogHelper;
import com.yeshi.fanli.service.inter.order.jd.JDOrderService;
import com.yeshi.fanli.util.Constant;
import com.yeshi.fanli.util.RedisKeyEnum;
import com.yeshi.fanli.util.RedisManager;
import com.yeshi.fanli.util.StringUtil;
import com.yeshi.fanli.util.TimeUtil;
import com.yeshi.fanli.util.cmq.order.JDOrderCMQManager;
import com.yeshi.fanli.util.jd.JDApiUtil;
 
//从淘宝爬去订单更新
@Component
public class UpdateJDOrderJob {
 
    @Resource
    private JDOrderService jdOrderService;
 
    @Resource
    private RedisManager redisManager;
 
    /**
     * 保存订单
     * 
     * @param jdOrderList
     */
    public void saveJDOrders(List<JDOrder> jdOrderList) {
        for (JDOrder order : jdOrderList) {
            LogHelper.orderInfo("京东订单:" + order.getOrderId() + "-" + order.getValidCode());
            if (order.getValidCode() == 15)// 过滤掉待付款
                continue;
 
            // 防止多个商品拆单问题,爬取
            if (order.getOrderItemList().size() > 1
                    && order.getOrderTime() > System.currentTimeMillis() - 1000 * 60 * 3L) {
                continue;
            }
 
            try {
                jdOrderService.addJDOrder(order);
                /**
                 * 做频率限制
                 */
                String key = RedisKeyEnum.getRedisKey(RedisKeyEnum.JDOrder, order.getOrderId() + "");
                String result = redisManager.getCommonString(key);
                // 判断
                if (StringUtil.isNullOrEmpty(result)) {
                    JDOrderCMQManager.getInstance().addJDOrder(order.getOrderId() + "");
                    redisManager.cacheCommonString(key, "1", 60 * 60 * 2);// 2小时内不再更新
                }
            } catch (JDOrderException e) {
                e.printStackTrace();
            }
        }
    }
 
    /**
     * 快速订单更新(爬取本小时内的单,每分钟一次)
     */
    @XxlJob("updateJDSoonOrderHandler")
    public ReturnT<String> startPreDividents(String param) throws Exception {
 
        LogHelper.job("开始爬取京东订单");
        long now = System.currentTimeMillis();
 
        JDOrderResult result = JDApiUtil.getOrderList(1, 200, new Date(now), JDApiUtil.ORDER_TYPE_CREATETIME);
        if (result != null && result.getOrderList() != null)
            saveJDOrders(result.getOrderList());
        // 查询上个小时的
        result = JDApiUtil.getOrderList(1, 200, new Date(now - 1000 * 60 * 60L), JDApiUtil.ORDER_TYPE_CREATETIME);
        if (result != null && result.getOrderList() != null)
            saveJDOrders(result.getOrderList());
 
        return ReturnT.SUCCESS;
    }
 
    /**
     * 爬取最近一小时内的状态更新了的单(10分钟一次)
     */
    @Scheduled(cron = "0 0/10 * * * ? ")
    public void updateUpdateOrder() {
        if (!Constant.IS_TASK)
            return;
        List<JDOrder> jdOrderList = new ArrayList<>();
        int pageSize = 200;
        int page = 1;
        JDOrderResult result = JDApiUtil.getOrderList(page++, pageSize, new Date(), JDApiUtil.ORDER_TYPE_UPDATETIME);
        if (result != null) {
            jdOrderList.addAll(result.getOrderList());
            while (result != null && result.isHasMore()) {
                result = JDApiUtil.getOrderList(page++, pageSize, new Date(), JDApiUtil.ORDER_TYPE_UPDATETIME);
                if (result != null)
                    jdOrderList.addAll(result.getOrderList());
            }
        }
        saveJDOrders(jdOrderList);
    }
 
    /**
     * 更新一个小时的订单
     * 
     * @param date
     */
    private List<JDOrder> getHourOrder(Date date) {
        List<JDOrder> jdOrderList = new ArrayList<>();
        int pageSize = 200;
        int page = 1;
        JDOrderResult result = JDApiUtil.getOrderList(page++, pageSize, date, JDApiUtil.ORDER_TYPE_UPDATETIME);
        if (result != null) {
            jdOrderList.addAll(result.getOrderList());
            while (result != null && result.isHasMore()) {
                result = JDApiUtil.getOrderList(page++, pageSize, date, JDApiUtil.ORDER_TYPE_UPDATETIME);
                if (result != null)
                    jdOrderList.addAll(result.getOrderList());
            }
        }
        return jdOrderList;
    }
 
    /**
     * 更新一天的数据
     * 
     * @param date
     */
    public void updateDayOrder(Date date) {
        Date now = new Date();
        List<JDOrder> orderList = new ArrayList<>();
        Date startTime = new Date(
                TimeUtil.convertToTimeTemp(TimeUtil.getGernalTime(date.getTime(), "yyyy-MM-dd"), "yyyy-MM-dd"));
        // 一个小时为一个步长
        for (int i = 0; i < 24; i++) {
            Date da = new Date(startTime.getTime() + 1000 * 60 * 60L * i);
            if (da.getTime() > now.getTime())
                break;
            List<JDOrder> tempOrderList = getHourOrder(da);
            if (tempOrderList != null && tempOrderList.size() > 0)
                orderList.addAll(tempOrderList);
        }
        saveJDOrders(orderList);
    }
 
    /**
     * 更新最近3天的订单(每天早上凌晨0点过10分,早上8点过10分)
     */
    @Scheduled(cron = "0 10 0,8 * * ? ")
    public void updateLatest3DayOrder() {
        if (!Constant.IS_TASK)
            return;
        Date now = new Date();
        for (int i = 1; i < 4; i++) {
            updateDayOrder(new Date(now.getTime() - 1000 * 60 * 60 * 24L * i));
        }
    }
 
}