admin
2021-10-09 367dfb4ba7f1f181314ea4bfe3cb7cf9ae036b02
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
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
package com.yeshi.fanli.job.order.jd;
 
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
 
import javax.annotation.Resource;
 
import com.yeshi.fanli.dao.jd.JDOrderBackUpDao;
import com.yeshi.fanli.dto.jd.JDOrderForBackUpResult;
import com.yeshi.fanli.entity.jd.JDBackUpOrder;
import com.yeshi.fanli.util.Constant;
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.RedisKeyEnum;
import com.yeshi.fanli.util.RedisManager;
import com.yeshi.fanli.util.StringUtil;
import org.yeshi.utils.TimeUtil;
import com.yeshi.fanli.util.jd.JDApiUtil;
import com.yeshi.fanli.util.mq.cmq.order.JDOrderCMQManager;
 
//从淘宝爬去订单更新
@Component
public class UpdateJDOrderJob {
 
    @Resource
    private JDOrderService jdOrderService;
 
    @Resource
    private RedisManager redisManager;
 
    @Resource
    private JDOrderBackUpDao jdOrderBackUpDao;
 
 
    /**
     * 保存订单
     *
     * @param jdOrderList
     */
    public void saveJDOrders(List<JDOrder> jdOrderList) {
        //5分钟不更新就报警
        try {
            redisManager.cacheCommonString(RedisKeyEnum.monitor.getKey() + Constant.SOURCE_TYPE_JD, "1", 60 * 5);
        } catch (Exception e) {
        }
 
        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("updateJDOrderHandler")
    public ReturnT<String> updateJDSoonOrder(String param) throws Exception {
        if ("1".equalsIgnoreCase(param)) {// 更新本小时内的单
            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());
        } else if ("1hour".equalsIgnoreCase(param)) {// 更新1小时内的订单
            updateUpdateOrder();
        } else if ("1day".equalsIgnoreCase(param)) {// 更新1天内的订单
            updateLatestDayOrder(new Date(System.currentTimeMillis()));
        } else if ("3day".equalsIgnoreCase(param)) {// 更新最近3天更新的数据
            updateLatest3DayOrder();
        }
 
        return ReturnT.SUCCESS;
    }
 
    /**
     * 爬取最近一小时内的状态更新了的单(10分钟一次)
     */
 
    public void updateUpdateOrder() {
        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);
    }
 
    /**
     * 更新最近一天的数据
     *
     * @param date
     */
    public void updateLatestDayOrder(Date date) {
        Date now = new Date();
        List<JDOrder> orderList = new ArrayList<>();
        Date startTime = new Date(date.getTime() - 1000 * 60 * 60 * 24L);
        // 一个小时为一个步长
        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分)
     */
    public void updateLatest3DayOrder() {
        Date now = new Date();
        for (int i = 1; i < 4; i++) {
            updateDayOrder(new Date(now.getTime() - 1000 * 60 * 60 * 24L * i));
        }
    }
 
 
    @XxlJob("order-jd-backup")
    public ReturnT<String> backUpOrder(String param) throws Exception {
        //更新90天以前的近3天的数据
        long startTime = System.currentTimeMillis() - 1000 * 60 * 60 * 24L * 90;
 
        for (int i = 0; i < 24 * 3; i++) {
            List<JDBackUpOrder> orderList = getBackUpOrders(new Date(startTime + i * 1000 * 60 * 60L));
            if (orderList != null && orderList.size() > 0) {
                for (JDBackUpOrder order : orderList) {
                    order.setUpdateTime(new Date());
                    jdOrderBackUpDao.save(order);
                }
            }
        }
        return ReturnT.SUCCESS;
    }
 
    private List<JDBackUpOrder> getBackUpOrders(Date hourDate) {
        List<JDBackUpOrder> jdOrderList = new ArrayList<>();
        int pageSize = 200;
        int page = 1;
        JDOrderForBackUpResult result = JDApiUtil.getOrderListForBackUp(page++, pageSize, hourDate, JDApiUtil.ORDER_TYPE_UPDATETIME);
        if (result != null) {
            jdOrderList.addAll(result.getOrderList());
            while (result != null && result.isHasMore()) {
                result = JDApiUtil.getOrderListForBackUp(page++, pageSize, hourDate, JDApiUtil.ORDER_TYPE_UPDATETIME);
                if (result != null)
                    jdOrderList.addAll(result.getOrderList());
            }
        }
        return jdOrderList;
    }
 
 
}