Pu Zhibing
2025-01-26 1266ed302b259f09a9370bc4315316b8a212b5d0
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
package com.ruoyi.integration.drainage.kuaidian;
 
import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpResponse;
import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.ruoyi.common.core.utils.SpringUtils;
import com.ruoyi.integration.drainage.AESUtil;
import com.ruoyi.integration.drainage.SignUtil;
import com.ruoyi.integration.drainage.kuaidian.model.NotificationStationChangeResult;
import com.ruoyi.integration.drainage.kuaidian.model.StationChange;
import com.ruoyi.integration.drainage.model.*;
import com.ruoyi.integration.drainage.model.enu.InterfaceUrlEnum;
import com.ruoyi.other.api.domain.Operator;
import com.ruoyi.other.api.feignClient.OperatorClient;
import lombok.extern.slf4j.Slf4j;
 
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
 
/**
 * 中电联TCEC标准(快电)
 * @author zhibing.pu
 * @Date 2025/1/21 11:48
 */
@Slf4j
public class TCECKDUtil {
    /**
     * 运营商标识
     */
    private static final String OperatorID = "";
    
    private static OperatorClient operatorClient = SpringUtils.getBean(OperatorClient.class);
    
    private static Map<Long, Integer> map = new HashMap<>();
    
    
    /**
     * 获取token
     */
    public static String queryToken(Operator operator){
        HttpRequest post = HttpUtil.createPost("");
        post.contentType("application/json;charset=utf-8");
        JSONObject body = new JSONObject();
        body.put("OperatorID", OperatorID);
        body.put("OperatorSecret", operator.getOurOperatorSecret());
        post.body(body.toJSONString());
        HttpResponse execute = post.execute();
        if(200 != execute.getStatus()){
            log.error("获取三方token失败:" + execute.body());
            return null;
        }
        JSONObject jsonObject = JSON.parseObject(execute.body());
        Integer succStat = jsonObject.getInteger("SuccStat");
        if(0 != succStat){
            log.error("获取三方token失败:" + jsonObject.getString("FailReason"));
            return null;
        }
        String token = jsonObject.getString("AccessToken");
        Long tokenAvailableTime = LocalDateTime.now().toEpochSecond(ZoneOffset.UTC) + jsonObject.getLong("TokenAvailableTime");
        LocalDateTime localDateTime = Instant.ofEpochSecond(tokenAvailableTime).atOffset(ZoneOffset.UTC).toLocalDateTime();
        operator.setAccessToken(token);
        operator.setTokenAvailableTime(localDateTime);
        operatorClient.editOperator(operator);
        return token;
    }
    
    
    /**
     * 获取token
     * @return
     */
    public static String getToken(Operator operator){
        if(null != operator.getTokenAvailableTime() && operator.getTokenAvailableTime().isBefore(LocalDateTime.now())){
            return operator.getAccessToken();
        }else{
            return queryToken(operator);
        }
    }
    
    
    
    
    /**
     * 站点变更通知
     * @param operator
     * @param type
     * @param siteIds
     * @return
     */
    public static NotificationStationChangeResult notificationStationChange(Operator operator, Integer type, List<Integer> siteIds) {
        StationChange stationChange = new StationChange();
        stationChange.setOperatorId(OperatorID);
        stationChange.setType(type);
        List<String> collect = siteIds.stream().map(String::valueOf).collect(Collectors.toList());
        stationChange.setStationIds(collect);
        HttpRequest post = HttpUtil.createPost(operator.getTestUrl() + InterfaceUrlEnum.NOTIFICATION_STATION_CHANGE.getUrl());
        buildBody(post, stationChange, operator);
        HttpResponse execute = post.execute();
        if(200 != execute.getStatus()){
            log.error("推送站点变更通知失败:" + execute.body());
            return null;
        }
        return JSON.parseObject(execute.body(), NotificationStationChangeResult.class);
    }
    
    
    
    /**
     * 构建请求参数和消息头
     * @param post
     * @param o
     */
    public static void buildBody(HttpRequest post, Object o, Operator operator){
        Long timeStamp = Long.valueOf(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss")));
        Integer integer = map.get(timeStamp);
        if(null == integer){
            integer = 1;
        }else{
            integer++;
        }
        map.put(timeStamp, integer);
        post.contentType("application/json;charset=utf-8");
        post.header("Authorization", "Bearer " + getToken(operator));
        BaseRequest baseRequest = new BaseRequest();
        baseRequest.setOperatorID(OperatorID);
        baseRequest.setTimeStamp(timeStamp);
        baseRequest.setSeq(String.format("%04d", integer));
        String jsonString = JSON.toJSONString(o);
        String encrypt = AESUtil.encrypt(jsonString, operator.getDataSecret(), operator.getDataSecretIv());
        baseRequest.setData(encrypt);
        baseRequest.setOperator(operator);
        baseRequest.setSig(buildSign(baseRequest));
        post.body(JSON.toJSONString(baseRequest));
        //清空小于当前时间的map中的无效数据
        for (Long k : map.keySet()) {
            if(k <= (timeStamp - 10)){
                map.remove(k);
            }
        }
    }
    
    
    public static String buildSign(BaseModel model){
        Operator operator = model.getOperator();
        //签名秘钥SigSecret
        String key = operator.getSigSecret();
        String sign = SignUtil.hmacSign(model.getData(), key);
        return sign;
    }
    
}