From a155690a38eb156a4dbef88452b3d5decc833e77 Mon Sep 17 00:00:00 2001 From: Pu Zhibing <393733352@qq.com> Date: 星期五, 24 一月 2025 15:27:41 +0800 Subject: [PATCH] 新增引流接口及业务逻辑 --- ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/TCECUtil.java | 233 +++++++++++++++++++++++++++++++++++++++++++++++++++------- 1 files changed, 204 insertions(+), 29 deletions(-) diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/TCECUtil.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/TCECUtil.java index 428a49e..697d9d9 100644 --- a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/TCECUtil.java +++ b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/TCECUtil.java @@ -2,8 +2,20 @@ import cn.hutool.http.*; import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.ruoyi.common.core.utils.SpringUtils; 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.Map; /** * 中电联TCEC标准 @@ -12,6 +24,58 @@ */ @Slf4j public class TCECUtil { + /** + * 运营商标识 + */ + 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); + } + } @@ -19,45 +83,44 @@ * 设备状态变化推送 * @param info */ - public static NotificationStationStatusResult notificationStationStatus(ConnectorStatusInfo info) { - HttpRequest post = HttpUtil.createPost(""); - post.contentType(ContentType.JSON.toString()); - post.body(JSON.toJSONString(info)); + public static NotificationStationStatusResult notificationStationStatus(Operator operator, ConnectorStatusInfo info) { + HttpRequest post = HttpUtil.createPost(operator.getTestUrl() + InterfaceUrlEnum.NOTIFICATION_STATION_STATUS.getUrl()); + buildBody(post, info, operator); HttpResponse execute = post.execute(); if(200 != execute.getStatus()){ - log.error("设备状态变化推送失败:" + execute.body()); + log.error("推送三方设备状态变化失败:" + execute.body()); return null; } return JSON.parseObject(execute.body(), NotificationStationStatusResult.class); } - - /** - * 查询统计信息 - * @param query + * 推送启动充电结果 + * @param info * @return */ - public QueryStationStatsResult queryStationStats(QueryStationStats query){ - } - - /** - * 查询业务策略信息 - * @param query - * @return - */ - public BaseResult<QueryEquipBusinessPolicyResult> queryEquipBusinessPolicy(QueryEquipBusinessPolicy query){ + public static NotificationStartChargeResult notificationStartChargeResult(Operator operator, NotificationStartCharge info){ + HttpRequest post = HttpUtil.createPost(operator.getTestUrl() + InterfaceUrlEnum.NOTIFICATION_START_CHARGE_RESULT.getUrl()); + buildBody(post, info, operator); + HttpResponse execute = post.execute(); + if(200 != execute.getStatus()){ + log.error("推送三方启动充电结果失败:" + execute.body()); + return null; + } + JSONObject jsonObject = JSON.parseObject(execute.body()); + Integer ret = jsonObject.getInteger("Ret"); + if(0 != ret){ + log.error("推送三方启动充电结果失败:" + execute.body()); + return null; + } + return jsonObject.getObject("Data", NotificationStartChargeResult.class); } - /** - * 查询充电状态 - * @param query - * @return - */ - public BaseResult<QueryEquipChargeStatusResult> queryEquipChargeStatus(QueryEquipChargeStatus query){ - } + + + /** @@ -65,18 +128,130 @@ * @param info * @return */ - public BaseResult<NotificationEquipChargeStatusResult> notificationEquipChargeStatus(QueryEquipChargeStatusResult info){ + public static NotificationEquipChargeStatusResult notificationEquipChargeStatus(Operator operator, QueryEquipChargeStatusResult info){ + HttpRequest post = HttpUtil.createPost(operator.getTestUrl() + InterfaceUrlEnum.NOTIFICATION_EQUIP_CHARGE_STATUS.getUrl()); + buildBody(post, info, operator); + HttpResponse execute = post.execute(); + if(200 != execute.getStatus()){ + log.error("推送三方充电状态失败:" + execute.body()); + return null; + } + JSONObject jsonObject = JSON.parseObject(execute.body()); + Integer ret = jsonObject.getInteger("Ret"); + if(0 != ret){ + log.error("推送三方充电状态失败:" + execute.body()); + return null; + } + return jsonObject.getObject("Data", NotificationEquipChargeStatusResult.class); } /** - * 推送充电订单信息 - * @param indo + * 推送停止充电结果 + * @param info * @return */ - public BaseResult<NotificationChargeOrderInfoResult> notificationChargeOrderInfo(NotificationChargeOrderInfo indo){ + public static NotificationStopCharge notificationStopChargeResult(Operator operator, NotificationStopChargeResult info){ + HttpRequest post = HttpUtil.createPost(operator.getTestUrl() + InterfaceUrlEnum.NOTIFICATION_STOP_CHARGE_RESULT.getUrl()); + buildBody(post, info, operator); + HttpResponse execute = post.execute(); + if(200 != execute.getStatus()){ + log.error("推送三方停止充电结果失败:" + execute.body()); + return null; + } + JSONObject jsonObject = JSON.parseObject(execute.body()); + Integer ret = jsonObject.getInteger("Ret"); + if(0 != ret){ + log.error("推送三方停止充电结果失败:" + execute.body()); + return null; + } + return jsonObject.getObject("Data", NotificationStopCharge.class); } + + /** + * 推送充电订单信息 + * @param info + * @return + */ + public static NotificationChargeOrderInfoResult notificationChargeOrderInfo(Operator operator, NotificationChargeOrderInfo info){ + HttpRequest post = HttpUtil.createPost(operator.getTestUrl() + InterfaceUrlEnum.NOTIFICATION_CHARGE_ORDER_INFO.getUrl()); + buildBody(post, info, operator); + HttpResponse execute = post.execute(); + if(200 != execute.getStatus()){ + log.error("推送三方充电订单信息失败:" + execute.body()); + return null; + } + JSONObject jsonObject = JSON.parseObject(execute.body()); + Integer ret = jsonObject.getInteger("Ret"); + if(0 != ret){ + log.error("推送三方充电订单信息失败:" + execute.body()); + return null; + } + return jsonObject.getObject("Data", NotificationChargeOrderInfoResult.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); + } + } + } + + + /** + * 构建签名字符串 + * @param model + * @return + */ + public static String buildSign(BaseModel model){ + Operator operator = model.getOperator(); + //签名秘钥SigSecret + String key = operator.getSigSecret(); + String sign = ""; + switch (operator.getName()){ + case "XinDianTu": + //进行字符串拼接、计算 + String m = new StringBuilder(model.getOperatorID()).append(model.getData()).append(model.getTimeStamp()).append(model.getSeq()).toString(); + byte[] hmacMd5 = SignUtil.getHMacMD5Bytes(key.getBytes(), m.getBytes()); + // 打印计算得到的签名Sig + sign = SignUtil.bytesToHexString(hmacMd5); + break; + case "KuaiDian": + sign = SignUtil.hmacSign(model.getData(), key); + break; + } + return sign; + } + } -- Gitblit v1.7.1