#
Junjie
2024-01-08 8d530a2bc48f5f28937e0b4507b7deccf9e34e92
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
package com.zy.asrs.openapi.task;
 
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.zy.asrs.common.domain.enums.ApiType;
import com.zy.asrs.common.domain.enums.OrderSettleType;
import com.zy.asrs.common.openapi.entity.ApiList;
import com.zy.asrs.common.openapi.entity.HostKey;
import com.zy.asrs.common.openapi.service.ApiListService;
import com.zy.asrs.common.openapi.service.HostKeyService;
import com.zy.asrs.common.utils.HttpHandler;
import com.zy.asrs.common.wms.entity.Order;
import com.zy.asrs.common.wms.entity.OrderDetl;
import com.zy.asrs.common.wms.service.OrderDetlService;
import com.zy.asrs.common.wms.service.OrderService;
import org.apache.commons.codec.digest.DigestUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
 
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
 
@Component
public class ReportApiScheduler {
 
    @Autowired
    private ApiListService apiListService;
    @Autowired
    private OrderService orderService;
    @Autowired
    private OrderDetlService orderDetlService;
    @Autowired
    private HostKeyService hostKeyService;
 
    @Scheduled(cron = "0/3 * * * * ? ")
    public void orderComplete() {
        //订单完成上报
 
        //获取已完成订单
        List<Order> list = orderService.list(new LambdaQueryWrapper<Order>()
                .eq(Order::getSettle, OrderSettleType.COMPLETE.id));
        for (Order order : list) {
            //查询是否需要上报
            ApiList apiList = apiListService.getOne(new LambdaQueryWrapper<ApiList>()
                    .eq(ApiList::getType, ApiType.ORDER_COMPLETE.type)
                    .eq(ApiList::getStatus, 1)
                    .eq(ApiList::getHostId,order.getHostId()));
            if (apiList == null) {
                continue;
            }
 
            //获取订单明细
            List<OrderDetl> orderDetls = orderDetlService.list(new LambdaQueryWrapper<OrderDetl>()
                    .eq(OrderDetl::getOrderId, order.getId()));
 
            //封装数据
            HashMap<String, Object> data = new HashMap<>();
            data.put("order", order);
            data.put("orderDetls", orderDetls);
 
            getSign(data, order.getHostId());//获取签名
 
            try {
                String response = new HttpHandler.Builder()
                        .setUri(apiList.getUrl())
                        .setJson(JSON.toJSONString(data))
                        .build()
                        .doPost();
                JSONObject result = JSON.parseObject(response);
                if (result.getOrDefault("code", 0).equals(200)) {
                    order.setSettle(OrderSettleType.REPORT_COMPLETE.id.longValue());
                    order.setUpdateTime(new Date());
                    orderService.updateById(order);//更新订单状态
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
 
    @Scheduled(cron = "0/3 * * * * ? ")
    public void orderCancel() {
        //订单取消上报
 
        //获取已取消订单
        List<Order> list = orderService.list(new LambdaQueryWrapper<Order>()
                .eq(Order::getSettle, OrderSettleType.CANCEL.id));
        for (Order order : list) {
            //查询是否需要上报
            ApiList apiList = apiListService.getOne(new LambdaQueryWrapper<ApiList>()
                    .eq(ApiList::getType, ApiType.ORDER_CANCEL.type)
                    .eq(ApiList::getStatus, 1)
                    .eq(ApiList::getHostId,order.getHostId()));
            if (apiList == null) {
                continue;
            }
 
            //获取订单明细
            List<OrderDetl> orderDetls = orderDetlService.list(new LambdaQueryWrapper<OrderDetl>()
                    .eq(OrderDetl::getOrderId, order.getId()));
 
            //封装数据
            HashMap<String, Object> data = new HashMap<>();
            data.put("order", order);
            data.put("orderDetls", orderDetls);
 
            getSign(data, order.getHostId());//获取签名
 
            try {
                String response = new HttpHandler.Builder()
                        .setUri(apiList.getUrl())
                        .setJson(JSON.toJSONString(data))
                        .build()
                        .doPost();
                JSONObject result = JSON.parseObject(response);
                if (result.getOrDefault("code", 0).equals(200)) {
                    order.setSettle(OrderSettleType.REPORT_COMPLETE.id.longValue());
                    order.setUpdateTime(new Date());
                    orderService.updateById(order);//更新订单状态
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
 
    @Scheduled(cron = "* 30 23 * * ? ")
    public void reportStock() {
        //库存上报
        //每天晚上11点半执行
 
        //查询是否需要上报
        List<ApiList> list = apiListService.list(new LambdaQueryWrapper<ApiList>()
                .eq(ApiList::getType, ApiType.REPORT_STOCK.type)
                .eq(ApiList::getStatus, 1));
        for (ApiList apiList : list) {
 
        }
 
    }
 
    //获取签名
    public String getSign(HashMap<String, Object> data, Long hostId) {
        HostKey hostKey = hostKeyService.getOne(new LambdaQueryWrapper<HostKey>()
                .eq(HostKey::getHostId, hostId));
        if (hostKey == null) {
            return null;
        }
 
        if (hostKey.getSignStatus() == 0) {//没有开启签名
            return null;
        }
 
        //创建自然排序map
        JSONObject param = new JSONObject(true);
        for (Map.Entry<String, Object> entry : data.entrySet()) {
            if (!entry.getKey().equals("sign")) {//剔除sign
                param.put(entry.getKey(), entry.getValue());
            }
        }
        param.put("signKey", hostKey.getSignKey());
        String md5Hex = DigestUtils.md5Hex(param.toJSONString());
        data.put("sign", md5Hex);
        return md5Hex;
    }
 
}