ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/TCECController.java
@@ -25,12 +25,14 @@ import com.ruoyi.other.api.feignClient.SystemConfigurationClient; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeanUtils; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import java.math.BigDecimal; import java.math.RoundingMode; import java.text.SimpleDateFormat; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; @@ -83,7 +85,7 @@ @Resource private SystemConfigurationClient systemConfigurationClient; private final static String operatorId = "906171535"; /** * 请求校验 @@ -1796,46 +1798,93 @@ return baseResult; } /** * 查询充电站信息 * 查询充换电站状态信息 * @param baseRequest * @param request * @return */ @PostMapping("/supervise_notification_operation_stats_info") public BaseResult superviseNotificationOperationStatsInfo(@RequestBody BaseRequest baseRequest, HttpServletRequest request){ log.info("监管平台查询充电站信息请求参数:" + JacksonUtils.toJson(baseRequest)); @PostMapping("/supervise_query_station_status") public BaseResult superviseQueryStationStatus(@RequestBody BaseRequest baseRequest, HttpServletRequest request){ log.info("监管平台查询充换电站状态信息请求参数:" + JacksonUtils.toJson(baseRequest)); //校验token和签名 BaseResult baseResult = requestCheck(true, baseRequest, request); if(0 != baseResult.getRet()){ log.info("监管平台查询充电站信息响应Data:"); log.info("监管平台查询充换电站状态信息响应Data:"); baseResult.setData(""); baseResult.setSig(TCECUtil.ourBuildSign(baseResult)); log.info("监管平台查询充电站信息响应参数:" + JacksonUtils.toJson(baseResult)); log.info("监管平台查询充换电站状态信息响应参数:" + JacksonUtils.toJson(baseResult)); return baseResult; } Operator operator = baseResult.getOperator(); //解密参数 String decrypt = AESUtil.decrypt(baseRequest.getData(), operator.getOurDataSecret(), operator.getOurDataSecretIv()); log.info("监管平台查询充电站信息请求Data:" + decrypt); QueryStationsInfo queryStationsInfo = JSON.parseObject(decrypt, QueryStationsInfo.class); Integer pageNo = queryStationsInfo.getPageNo(); Integer pageSize = queryStationsInfo.getPageSize(); List<String> stationIDs = queryStationsInfo.getStationIDs(); if(null == pageNo){ pageNo = 1; log.info("监管平台查询充换电站状态信息请求Data:" + decrypt); QueryStationStatus queryStationStatus = JSON.parseObject(decrypt, QueryStationStatus.class); List<String> stationIDs = queryStationStatus.getStationIDs(); String operatorID = queryStationStatus.getOperatorID(); List<Integer> stationIDList = new ArrayList<>(); for (String stationID : stationIDs) { stationIDList.add(Integer.valueOf(stationID)); } if(null == pageSize){ pageSize = 50; QueryStationStatusResult queryStationStatusResult = new QueryStationStatusResult(); List<StationStatusInfo> stationStatusInfos = new ArrayList<>(); // 查询站点下的桩信息状态 List<TChargingPile> chargingPiles = chargingPileClient.getChargingPileBySiteIds(stationIDList).getData(); if(!CollectionUtils.isEmpty(chargingPiles)){ List<Integer> pileIds = chargingPiles.stream().map(TChargingPile::getId).collect(Collectors.toList()); List<TChargingGun> chargingGuns = chargingGunClient.getChargingGunByChargingPileIds(pileIds).getData(); if(!CollectionUtils.isEmpty(chargingGuns)){ for (Integer stationID : stationIDList) { StationStatusInfo stationStatusInfo = new StationStatusInfo(); stationStatusInfo.setOperatorID(operatorID); stationStatusInfo.setEquipmentOwnerID("999999999"); stationStatusInfo.setStationID(String.valueOf(stationID)); List<ConnectorStatusInfo> connectorStatusInfos = new ArrayList<>(); for (TChargingGun chargingGun : chargingGuns) { ConnectorStatusInfo connectorStatusInfo = new ConnectorStatusInfo(); connectorStatusInfo.setOperatorID(operatorId); connectorStatusInfo.setEquipmentOwnerID("999999999"); connectorStatusInfo.setStationID(String.valueOf(chargingGun.getSiteId())); connectorStatusInfo.setEquipmentID(String.valueOf(chargingGun.getChargingPileId())); connectorStatusInfo.setConnectorID(chargingGun.getFullNumber()); connectorStatusInfo.setEquipmentClassification(1); switch (chargingGun.getStatus()){ case 1: connectorStatusInfo.setStatus(0); break; case 2: connectorStatusInfo.setStatus(1); break; case 3: connectorStatusInfo.setStatus(2); break; case 4: connectorStatusInfo.setStatus(3); break; case 5: connectorStatusInfo.setStatus(3); break; case 6: connectorStatusInfo.setStatus(4); break; case 7: connectorStatusInfo.setStatus(255); break; } connectorStatusInfo.setUpdateTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); connectorStatusInfos.add(connectorStatusInfo); } stationStatusInfo.setConnectorStatusInfos(connectorStatusInfos); stationStatusInfos.add(stationStatusInfo); } } queryStationStatusResult.setStationStatusInfos(stationStatusInfos); } PageInfo<Site> siteListPaging = siteClient.getSiteListPaging(pageNo, pageSize, stationIDs); List<TParkingLot> parkingLots = parkingLotClient.getAllParkingLot().getData(); QueryStationsInfoResult queryStationsInfoResult = new QueryStationsInfoResult(); queryStationsInfoResult.setPageNo(pageNo); queryStationsInfoResult.setPageCount((0 == (siteListPaging.getTotal() % pageSize) ? 0 : 1) + Double.valueOf(siteListPaging.getTotal() / pageSize).intValue()); queryStationsInfoResult.setItemSize(Long.valueOf(siteListPaging.getTotal()).intValue()); queryStationsInfoResult.setStationInfos(buildSite(parkingLots, siteListPaging.getRecords())); //参数加密 String jsonString = JacksonUtils.toJson(queryStationsInfoResult); String jsonString = JacksonUtils.toJson(queryStationStatusResult); log.info("监管平台查询充电站信息响应Data:" + jsonString); String encrypt = AESUtil.encrypt(jsonString, operator.getOurDataSecret(), operator.getOurDataSecretIv()); baseResult.setData(encrypt); @@ -1844,6 +1893,162 @@ return baseResult; } /** * 推送充电设备接口状态信息 * @param chargingGun * @return */ public R pushSuperviseNotificationStationStatus(TChargingGun chargingGun){ ConnectorStatusInfo connectorStatusInfo = new ConnectorStatusInfo(); connectorStatusInfo.setOperatorID(operatorId); connectorStatusInfo.setEquipmentOwnerID("999999999"); connectorStatusInfo.setStationID(String.valueOf(chargingGun.getSiteId())); connectorStatusInfo.setEquipmentID(String.valueOf(chargingGun.getChargingPileId())); connectorStatusInfo.setConnectorID(chargingGun.getFullNumber()); connectorStatusInfo.setEquipmentClassification(1); switch (chargingGun.getStatus()){ case 1: connectorStatusInfo.setStatus(0); break; case 2: connectorStatusInfo.setStatus(1); break; case 3: connectorStatusInfo.setStatus(2); break; case 4: connectorStatusInfo.setStatus(3); break; case 5: connectorStatusInfo.setStatus(3); break; case 6: connectorStatusInfo.setStatus(4); break; case 7: connectorStatusInfo.setStatus(255); break; } connectorStatusInfo.setUpdateTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); List<Operator> operators = operatorClient.getAllOperator().getData(); for (Operator operator : operators) { TCECSuperviseUtil.notificationStationStatus(operator, connectorStatusInfo); } return R.ok(); } /** * 推送充电状态信息 * @param chargingOrder * @return */ public R pushSuperviseNotificationEquipChargeStatus(TChargingOrder chargingOrder){ SupEquipChargeStatus supEquipChargeStatus = new SupEquipChargeStatus(); supEquipChargeStatus.setOperatorID(operatorId); supEquipChargeStatus.setEquipmentOwnerID("999999999"); supEquipChargeStatus.setStationID(String.valueOf(chargingOrder.getSiteId())); supEquipChargeStatus.setEquipmentID(String.valueOf(chargingOrder.getChargingPileId())); supEquipChargeStatus.setOrderNo(operatorId+chargingOrder.getCode()); switch (chargingOrder.getStatus()){ case 2: supEquipChargeStatus.setConnectorStatus(1); break; case 3: supEquipChargeStatus.setConnectorStatus(2); break; case 4: supEquipChargeStatus.setConnectorStatus(3); break; case 5: supEquipChargeStatus.setConnectorStatus(4); break; } TChargingGun chargingGun = chargingGunClient.getChargingGunById(chargingOrder.getChargingGunId()).getData(); supEquipChargeStatus.setConnectorID(chargingGun.getFullNumber()); supEquipChargeStatus.setEquipmentClassification(1); supEquipChargeStatus.setPushTimeStamp(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); switch (chargingGun.getStatus()){ case 1: supEquipChargeStatus.setConnectorStatus(0); break; case 2: supEquipChargeStatus.setConnectorStatus(1); break; case 3: supEquipChargeStatus.setConnectorStatus(2); break; case 4: supEquipChargeStatus.setConnectorStatus(3); break; case 5: supEquipChargeStatus.setConnectorStatus(3); break; case 6: supEquipChargeStatus.setConnectorStatus(4); break; case 7: supEquipChargeStatus.setConnectorStatus(255); break; } supEquipChargeStatus.setCurrentA(chargingOrder.getCurrent()); supEquipChargeStatus.setSOC(new BigDecimal(chargingOrder.getEndSoc())); supEquipChargeStatus.setStartTime(chargingOrder.getStartTime() != null ? chargingOrder.getStartTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")) : ""); supEquipChargeStatus.setEndTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); supEquipChargeStatus.setTotalPower(chargingOrder.getElectrovalence()); List<Operator> operators = operatorClient.getAllOperator().getData(); for (Operator operator : operators) { TCECSuperviseUtil.notificationSupEquipChargeStatus(operator, supEquipChargeStatus); } return R.ok(); } /** * 推送充电订单信息 * @param chargingOrder * @return */ public R pushSuperviseNotificationChargeOrderInfo(TChargingOrder chargingOrder){ SupChargeOrderInfo supChargeOrderInfo = new SupChargeOrderInfo(); supChargeOrderInfo.setOperatorID(operatorId); supChargeOrderInfo.setEquipmentOwnerID("999999999"); supChargeOrderInfo.setStationID(String.valueOf(chargingOrder.getSiteId())); supChargeOrderInfo.setEquipmentID(String.valueOf(chargingOrder.getChargingPileId())); supChargeOrderInfo.setOrderNo(operatorId+chargingOrder.getCode()); TChargingGun chargingGun = chargingGunClient.getChargingGunById(chargingOrder.getChargingGunId()).getData(); supChargeOrderInfo.setConnectorID(chargingGun.getFullNumber()); supChargeOrderInfo.setEquipmentClassification(1); supChargeOrderInfo.setPushTimeStamp(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); supChargeOrderInfo.setStartTime(chargingOrder.getStartTime() != null ? chargingOrder.getStartTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")) : ""); supChargeOrderInfo.setEndTime(chargingOrder.getEndTime() != null ? chargingOrder.getEndTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")) : ""); supChargeOrderInfo.setTotalPower(chargingOrder.getElectrovalence()); supChargeOrderInfo.setTotalElecMoney(chargingOrder.getElectrovalence()); supChargeOrderInfo.setTotalServiceMoney(chargingOrder.getServiceCharge()); supChargeOrderInfo.setTotalMoney(chargingOrder.getOrderAmount()); switch (chargingOrder.getEndMode()){ case 0: supChargeOrderInfo.setStopReason(5); supChargeOrderInfo.setStopDesc("异常终止"); break; case 1: supChargeOrderInfo.setStopReason(0); supChargeOrderInfo.setStopDesc("用户手动停止充电"); break; case 2: supChargeOrderInfo.setStopReason(1); supChargeOrderInfo.setStopDesc("客户归属地运营商平台停止充电"); break; case 3: supChargeOrderInfo.setStopReason(1); supChargeOrderInfo.setStopDesc("费用不足中止"); break; } List<Operator> operators = operatorClient.getAllOperator().getData(); for (Operator operator : operators) { TCECSuperviseUtil.notificationChargeOrderInfo(operator, supChargeOrderInfo); } return R.ok(); } /** * 推送充换电站信息 * @param site ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/TCECSuperviseUtil.java
New file @@ -0,0 +1,254 @@ package com.ruoyi.integration.drainage; 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.alibaba.nacos.common.utils.JacksonUtils; 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.LocalDateTime; import java.time.ZoneOffset; import java.time.format.DateTimeFormatter; /** * 中电联TCEC标准 * @author zhibing.pu * @Date 2025/1/21 11:48 */ @Slf4j public class TCECSuperviseUtil { private static OperatorClient operatorClient = SpringUtils.getBean(OperatorClient.class); private final static String url = "https://dev-gov-hlht-sc.unievbj.com/evcs/v1.0.0/"; /** * 推送充电设备接口状态信息 */ private final static String supervise_notification_station_status = "/supervise_notification_station_status"; /** *推送充电状态信息 */ private final static String supervise_notification_equip_charge_status = "/supervise_notification_equip_charge_status"; /** *推送充电订单信息 */ private final static String supervise_notification_charge_order_info = "/supervise_notification_charge_order_info"; /** * 获取token */ public static String queryToken(Operator operator){ HttpRequest post = HttpUtil.createPost(operator.getUrl() + InterfaceUrlEnum.QUERY_TOKEN.getUrl()); JSONObject info = new JSONObject(); info.put("OperatorID", operator.getOurOperatorId()); info.put("OperatorSecret", operator.getOperatorSecret()); Long timeStamp = Long.valueOf(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); post.contentType("application/json;charset=utf-8"); BaseRequest baseRequest = new BaseRequest(); baseRequest.setOperatorID(operator.getOurOperatorId()); baseRequest.setTimeStamp(timeStamp); baseRequest.setSeq("0001"); String jsonString = JacksonUtils.toJson(info); String encrypt = AESUtil.encrypt(jsonString, operator.getDataSecret(), operator.getDataSecretIv()); baseRequest.setData(encrypt); baseRequest.setOperator(operator); // baseRequest.setSig(buildSign(baseRequest)); String request_json = JacksonUtils.toJson(baseRequest); log.info("获取三方平台授权token请求地址:" + post.getUrl()); log.info("获取三方平台授权token请求参数:" + request_json); log.info("获取三方平台授权token请求Data:" + jsonString); post.body(request_json); HttpResponse execute = post.execute(); if(200 != execute.getStatus()){ log.error("获取三方平台授权token失败:" + execute.body()); return null; } log.info("获取三方平台授权token响应参数:" + execute.body()); BaseResult baseResult = JSON.parseObject(execute.body(), BaseResult.class); Integer Ret = baseResult.getRet(); if(0 != Ret){ log.error("获取三方平台授权token失败:" + baseResult.getMsg()); return null; } //解密参数 String decrypt = AESUtil.decrypt(baseResult.getData(), operator.getDataSecret(), operator.getDataSecretIv()); log.info("获取三方平台授权token响应Data:" + decrypt); QueryTokenResult queryTokenResult = JSON.parseObject(decrypt, QueryTokenResult.class); String token = queryTokenResult.getAccessToken(); Long tokenAvailableTime = LocalDateTime.now().toEpochSecond(ZoneOffset.UTC) + queryTokenResult.getTokenAvailableTime(); operator.setAccessToken(token); operator.setTokenAvailableTime(tokenAvailableTime); operatorClient.editOperator(operator); return token; } /** * 获取token * @return */ public static String getToken(Operator operator){ if(null != operator.getTokenAvailableTime() && operator.getTokenAvailableTime() > LocalDateTime.now().toEpochSecond(ZoneOffset.UTC)){ return operator.getAccessToken(); }else{ return queryToken(operator); } } /** * 设备状态变化推送 * @param info */ public static NotificationStationStatusResult notificationStationStatus(Operator operator, ConnectorStatusInfo info) { HttpRequest post = HttpUtil.createPost(url+supervise_notification_station_status); buildBody(post, info, operator); HttpResponse execute = post.execute(); if(200 != execute.getStatus()){ log.error("推送三方平台设备状态失败:" + execute.body()); return null; } log.info("推送三方平台设备状态响应:" + execute.body()); BaseResult baseResult = JSON.parseObject(execute.body(), BaseResult.class); Integer Ret = baseResult.getRet(); if(0 != Ret){ log.error("推送三方平台设备状态失败:" + baseResult.getMsg()); return null; } //解密参数 String decrypt = AESUtil.decrypt(baseResult.getData(), operator.getDataSecret(), operator.getDataSecretIv()); log.info("推送三方平台设备状态Data:" + decrypt); NotificationStationStatusResult notificationStationStatusResult = JSON.parseObject(decrypt, NotificationStationStatusResult.class); return notificationStationStatusResult; } /** * 推动充电状态 * @param info * @return */ public static NotificationEquipChargeStatusResult notificationSupEquipChargeStatus(Operator operator, SupEquipChargeStatus info){ HttpRequest post = HttpUtil.createPost(url+supervise_notification_equip_charge_status); buildBody(post, info, operator); HttpResponse execute = post.execute(); if(200 != execute.getStatus()){ log.error("推送三方平台充电状态失败:" + execute.body()); return null; } log.info("推送三方平台充电状态响应:" + execute.body()); BaseResult baseResult = JSON.parseObject(execute.body(), BaseResult.class); Integer Ret = baseResult.getRet(); if(0 != Ret){ log.error("推送三方平台充电状态失败:" + baseResult.getMsg()); return null; } //解密参数 String decrypt = AESUtil.decrypt(baseResult.getData(), operator.getDataSecret(), operator.getDataSecretIv()); log.info("推送三方平台充电状态Data:" + decrypt); NotificationEquipChargeStatusResult notificationEquipChargeStatusResult = JSON.parseObject(decrypt, NotificationEquipChargeStatusResult.class); return notificationEquipChargeStatusResult; } /** * 推送充电订单信息 * @param info * @return */ public static NotificationChargeOrderInfoResult notificationChargeOrderInfo(Operator operator, SupChargeOrderInfo info){ HttpRequest post = HttpUtil.createPost(url+supervise_notification_charge_order_info); buildBody(post, info, operator); HttpResponse execute = post.execute(); if(200 != execute.getStatus()){ log.error("推送三方平台充电订单信息失败:" + execute.body()); return null; } log.info("推送三方平台充电订单信息响应:" + execute.body()); BaseResult baseResult = JSON.parseObject(execute.body(), BaseResult.class); Integer Ret = baseResult.getRet(); if(0 != Ret){ log.error("推送三方平台充电订单信息失败:" + baseResult.getMsg()); return null; } //解密参数 String decrypt = AESUtil.decrypt(baseResult.getData(), operator.getDataSecret(), operator.getDataSecretIv()); log.info("推送三方平台充电订单信息Data:" + decrypt); NotificationChargeOrderInfoResult notificationChargeOrderInfoResult = JSON.parseObject(decrypt, NotificationChargeOrderInfoResult.class); return notificationChargeOrderInfoResult; } /** * 构建请求参数和消息头 * @param post * @param o */ public static void buildBody(HttpRequest post, Object o, Operator operator){ Long timeStamp = Long.valueOf(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); post.contentType("application/json;charset=utf-8"); post.header("Authorization", "Bearer " + getToken(operator)); BaseRequest baseRequest = new BaseRequest(); baseRequest.setOperatorID(operator.getOurOperatorId()); baseRequest.setTimeStamp(timeStamp); baseRequest.setSeq("0001"); String jsonString = JacksonUtils.toJson(o); String encrypt = AESUtil.encrypt(jsonString, operator.getDataSecret(), operator.getDataSecretIv()); baseRequest.setData(encrypt); baseRequest.setOperator(operator); // baseRequest.setSig(buildSign(baseRequest)); String request_json = JacksonUtils.toJson(baseRequest); post.body(request_json); log.info("推送三方平台请求地址:" + post.getUrl()); log.info("推送三方平台请求参数:" + request_json); log.info("推送三方平台请求Data:" + jsonString); } public static void main(String[] args) { BaseModel model = new BaseModel(); model.setOperatorID("MA25CNM38"); model.setData("AoArdDDcmHcmOMkCLHodTpY1xLtt9yhLqxvKPyfdlmEOBj1LJnQM+Z4JOZllt3Pj9rubfgxJ51zMAfzquQegJzHGAT9Y7JrKFzFe6jGtXo0="); model.setTimeStamp(20250205120800L); model.setSeq("0001"); Operator operator = new Operator(); operator.setName("XinDianTu"); operator.setSigSecret("S94xUpTpOIlLJBk8"); model.setOperator(operator); String key = operator.getSigSecret(); 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 String s = SignUtil.bytesToHexString(hmacMd5); System.err.println(s); // BaseModel model = new BaseModel(); // model.setOperatorID("MA25CNM38"); // model.setData("xQYYEPiwoc4JENnQsF50qP6Tmnj7uU/AshWn3QbIgrMIk8zvFpy6fWLIiLzQHcLPFCihqH1uzoNhGVNcS8Wvf5gIx9+cWJvYtjwtsjAGMEwNQ6y+rF1jjKnqCNcQbHbhqJ2l76sD54QCFKyenKxymrXri19bDV8hizn3nBw+jcHBtqKHWzjdSHwPDWPIw4rXnrbWLya2PXVgYtVg93WPtliw+0xsqW0BxJamE70/Ilbg4wB5fOAOvXmbLFI+v9jRjpcA7ImhprqPMYkXYAfa2QlICrJEBK7DfpJvRMzKzeT90kOAITqIqFvbfV0ti+greRqToLP6ni4o6w3ID42UmKasIpLTnx+qtR4bVTBTRuDzXvNXDA92RqHaJO21xbSen1eHN/yGfrchBIM0gmav7EpaYAerfU4ubnmJ6xujR6okYepJwBD5DiSIrObfS+GWVPRekvnjvm7BC02NXTrGKA=="); // model.setTimeStamp(20250205161426L); // model.setSeq("0001"); // Operator operator = new Operator(); // operator.setOurOperatorId("2921700136"); // operator.setOurSigSecret("KBm5J2fbGzyhX023"); // model.setOperator(operator); // String key = operator.getOurSigSecret(); // // String m = new StringBuilder(operator.getOurOperatorId()).append(model.getData()).append(model.getTimeStamp()).append(model.getSeq()).toString(); // byte[] hmacMd5 = SignUtil.getHMacMD5Bytes(key.getBytes(), m.getBytes()); // // 打印计算得到的签名Sig // String s = SignUtil.bytesToHexString(hmacMd5); // System.err.println(s); } } ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/ConnectorStatusInfo.java
@@ -52,4 +52,27 @@ @JsonProperty("ConnectorStatusInfo") private ConnectorStatusInfo connectorStatusInfo; @JsonProperty("OperatorID") private String OperatorID; @JsonProperty("EquipmentOwnerID") private String EquipmentOwnerID; @JsonProperty("StationID") private String StationID; @JsonProperty("EquipmentID") private String EquipmentID; /** * 1:车辆充电设备接口 * 2:换电站内的电池箱充 * 电设备接口 */ @JsonProperty("EquipmentClassification") private Integer EquipmentClassification; /** * 本次状态变化的时间, * 格式“yyyy-MM-dd HH:mm:ss */ @JsonProperty("UpdateTime") private String UpdateTime; } ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/QueryStationStatus.java
@@ -20,4 +20,11 @@ @NotNull @JsonProperty("StationIDs") private List<String> stationIDs; /** * 运营商服务平台ID,字符9位 * 数组长度不超过50 */ @NotNull @JsonProperty("OperatorID") private String operatorID; } ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/StationStatusInfo.java
@@ -24,4 +24,8 @@ */ @JsonProperty("ConnectorStatusInfos") private List<ConnectorStatusInfo> connectorStatusInfos; @JsonProperty("OperatorID") private String OperatorID; @JsonProperty("EquipmentOwnerID") private String EquipmentOwnerID; } ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/SupChargeOrderInfo.java
New file @@ -0,0 +1,145 @@ package com.ruoyi.integration.drainage.model; import com.fasterxml.jackson.annotation.JsonProperty; import lombok.Data; import javax.validation.constraints.NotNull; import java.math.BigDecimal; /** * 推送充电订单信息 * 此接口用于数据提供方向数据需求方推送充电订单信息;充电 * 订单在充电结束时实时推送,同一订单只可推送一次,禁止重复推 * 送;推送失败时将推送失败的数据按小时级频率重试推送,直到推 * 送成功。 */ @Data public class SupChargeOrderInfo { /** * 充换电平台运营商ID */ @NotNull @JsonProperty("OperatorID") private String OperatorID; /** * 充换电服务运营商ID, * 所属方为个人时填写 * 999999999 */ @NotNull @JsonProperty("EquipmentOwnerID") private String EquipmentOwnerID; /** * 充换电站ID */ @NotNull @JsonProperty("StationID") private String StationID; /** * 充电设备编码 */ @NotNull @JsonProperty("EquipmentID") private String EquipmentID; /** * 充电订单号 * 格式“运营商ID+唯一 * 编号”,不超过64个字 * 符 */ @NotNull @JsonProperty("OrderNo") private String OrderNo; /** * 充电订单状态 * 1、启动中 * 2、充电中 * 3、停止中 * 4、充电完成 * 5、订单挂起 * 6、充电异常结束 * 7、启动失败 */ @NotNull @JsonProperty("OrderStatus") private Integer OrderStatus; /** * 充电设备接口编码 */ @NotNull @JsonProperty("ConnectorID") private String ConnectorID; /** * 设备接口分类 * 1:车辆充电设备接口 * 2:换电站内的电池箱 * 充电设备接口 */ @NotNull @JsonProperty("EquipmentClassification") private Integer EquipmentClassification = 1; /** * 推送时间 * yyyy-MM-dd HH:mm:ss ,充电设备推送给运 */ @NotNull @JsonProperty("PushTimeStamp") private String PushTimeStamp; /** * 开始充电时间 */ @NotNull @JsonProperty("StartTime") private String StartTime; /** * 本次采样时间 */ @NotNull @JsonProperty("EndTime") private String EndTime; /** * 累计充电量 小数点后4位 */ @NotNull @JsonProperty("TotalPower") private BigDecimal TotalPower; /** * 总电费 */ @NotNull @JsonProperty("TotalElecMoney") private BigDecimal TotalElecMoney; /** * 总服务费 */ @NotNull @JsonProperty("TotalServiceMoney") private BigDecimal TotalServiceMoney; /** * 累计总金额 */ @NotNull @JsonProperty("TotalMoney") private BigDecimal TotalMoney; /** * 充电结束原因 * 0:用户手动停止充电 * 1:客户归属地运营商平台停止充电 * 2:BMS停止充电 * 3:充电机设备故障 * 4:连接器断开 * 5~99: 自定义 */ @NotNull @JsonProperty("StopReason") private Integer StopReason; /** * 充电结束原因描 * 述 */ @NotNull @JsonProperty("StopDesc") private String StopDesc; } ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/SupEquipChargeStatus.java
New file @@ -0,0 +1,134 @@ package com.ruoyi.integration.drainage.model; import com.fasterxml.jackson.annotation.JsonProperty; import lombok.Data; import javax.validation.constraints.NotNull; import java.math.BigDecimal; /** * 推送充电状态信息 * 此接口用于数据提供方向数据需求方推送充电设备的充电状态 * 开始充电实时推送一次、充电过程中50-60秒推送一 * 次、充电结束实时推送一次 */ @Data public class SupEquipChargeStatus { /** * 充换电平台运营商ID */ @NotNull @JsonProperty("OperatorID") private String OperatorID; /** * 充换电服务运营商ID, * 所属方为个人时填写 * 999999999 */ @NotNull @JsonProperty("EquipmentOwnerID") private String EquipmentOwnerID; /** * 充换电站ID */ @NotNull @JsonProperty("StationID") private String StationID; /** * 充电设备编码 */ @NotNull @JsonProperty("EquipmentID") private String EquipmentID; /** * 充电订单号 * 格式“运营商ID+唯一 * 编号”,不超过64个字 * 符 */ @NotNull @JsonProperty("OrderNo") private String OrderNo; /** * 充电订单状态 * 1、启动中 * 2、充电中 * 3、停止中 * 4、充电完成 * 5、订单挂起 * 6、充电异常结束 * 7、启动失败 */ @NotNull @JsonProperty("OrderStatus") private Integer OrderStatus; /** * 充电设备接口编码 */ @NotNull @JsonProperty("ConnectorID") private String ConnectorID; /** * 设备接口分类 * 1:车辆充电设备接口 * 2:换电站内的电池箱 * 充电设备接口 */ @NotNull @JsonProperty("EquipmentClassification") private Integer EquipmentClassification = 1; /** * 推送时间 * yyyy-MM-dd HH:mm:ss ,充电设备推送给运 */ @NotNull @JsonProperty("PushTimeStamp") private String PushTimeStamp; /** * 充电设备接口状态 ConnectorStatus * 0:离网 * 1:空闲 * 2: 占用(未充电) * 3: 占用(充电中) * 4: 占用(预约锁定) * 255:故障 */ @NotNull @JsonProperty("ConnectorStatus") private Integer ConnectorStatus; /** * A相电流 * 小数点后4 * 位 */ @NotNull @JsonProperty("CurrentA") private BigDecimal CurrentA; /** * 电池剩余电量 小数点后1 * 位 */ @NotNull @JsonProperty("SOC") private BigDecimal SOC; /** * 开始充电时间 */ @NotNull @JsonProperty("StartTime") private String StartTime; /** * 本次采样时间 */ @NotNull @JsonProperty("EndTime") private String EndTime; /** * 累计充电量 小数点后4位 */ @NotNull @JsonProperty("TotalPower") private BigDecimal TotalPower; }