zhangback
7 天以前 b054362aaf616bfe0be0b50ae5dc2137091dbd7d
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
package com.ruoyi.cwgl.service.impl;
 
import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpResponse;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.ruoyi.cwgl.domain.ApiResponse;
import com.ruoyi.cwgl.domain.VehicleDailyData;
import com.ruoyi.common.utils.SignUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
 
import java.util.*;
 
/**
 * 车辆数据API客户端服务
 * 用于调用外部车辆数据API获取车辆每日数据
 * 
 * @author ruoyi
 */
@Component
public class VehicleDataApiClient {
 
    private static final Logger logger = LoggerFactory.getLogger(VehicleDataApiClient.class);
 
    @Value("${custom.vehicle-api.baseUrl}")
    private String baseUrl;
 
    @Value("${custom.vehicle-api.appid}")
    private String appid;
 
    @Value("${custom.vehicle-api.secret}")
    private String secret;
 
    @Value("${custom.vehicle-api.timeout:30000}")
    private int timeout;
 
    /**
     * 查询某日车辆数据
     * 
     * @param date 查询日期,格式为yyyy-MM-dd
     * @return API响应结果
     */
    public ApiResponse<List<VehicleDailyData>> getDailyVehicleData(String date) {
        logger.info("开始查询日期[{}]的车辆数据", date);
        
        // 准备参数
        String nonce = SignUtil.generate16CharRandomString();
        String timestamp = String.valueOf(System.currentTimeMillis());
 
        Map<String, Object> params = new HashMap<>();
        params.put("date", date);
 
        // 生成签名
        String signature = SignUtil.signParamsSha256(params, appid, nonce, timestamp, secret);
        logger.debug("生成签名参数: appid={}, nonce={}, timestamp={}", appid, nonce, timestamp);
 
        // 构建请求URL
        String url = baseUrl + "/open/api/v1/dailyData?date=" + date;
 
        try {
            // 使用Hutool发送GET请求
            HttpResponse response = HttpRequest.get(url)
                    .header("appid", appid)
                    .header("nonce", nonce)
                    .header("timestamp", timestamp)
                    .header("signature", signature)
                    .header("Content-Type", "application/json")
                    .header("Accept", "application/json")
                    .timeout(timeout)
                    .execute();
                    
            logger.debug("请求URL: {}", url);
            logger.debug("响应状态码: {}", response.getStatus());
 
            if (response.isOk()) {
                String body = response.body();
                logger.info("响应内容: {}", body);
 
                // 解析JSON响应
                return parseResponse(body);
            } else {
                String errorBody = response.body();
                logger.error("HTTP请求失败,状态码: {}, 错误响应: {}", response.getStatus(), errorBody);
                return createErrorResponse("HTTP请求失败: " + response.getStatus() + ", " + errorBody);
            }
 
        } catch (Exception e) {
            logger.error("API调用异常: {}", e.getMessage(), e);
            return createErrorResponse("API调用异常: " + e.getMessage());
        }
    }
 
    /**
     * 解析响应内容
     * 
     * @param body 响应体JSON字符串
     * @return 解析后的API响应对象
     */
    private ApiResponse<List<VehicleDailyData>> parseResponse(String body) {
        try {
            // 使用Hutool的JSONUtil解析响应
            JSONObject jsonObject = JSONUtil.parseObj(body);
 
            ApiResponse<List<VehicleDailyData>> response = new ApiResponse<>();
            response.setCode(jsonObject.getInt("code"));
            response.setMsg(jsonObject.getStr("msg"));
 
            // 解析data数组
            if (jsonObject.containsKey("data") && jsonObject.get("data") != null) {
                String dataJson = JSONUtil.toJsonStr(jsonObject.get("data"));
                List<VehicleDailyData> dataList = JSONUtil.toList(dataJson, VehicleDailyData.class);
                response.setData(dataList);
                logger.debug("成功解析到{}条车辆数据", dataList.size());
            } else {
                response.setData(new ArrayList<>());
                logger.debug("响应中无数据");
            }
 
            return response;
 
        } catch (Exception e) {
            logger.error("JSON解析异常: {}", e.getMessage(), e);
            logger.debug("响应内容: {}", body);
            return createErrorResponse("JSON解析异常: " + e.getMessage());
        }
    }
 
    /**
     * 创建错误响应
     * 
     * @param message 错误消息
     * @return 错误响应对象
     */
    private ApiResponse<List<VehicleDailyData>> createErrorResponse(String message) {
        ApiResponse<List<VehicleDailyData>> response = new ApiResponse<>();
        response.setCode(500);
        response.setMsg(message);
        response.setData(new ArrayList<>());
        return response;
    }
}