From 934b22c18f4ab1a2c2da409886aa13dbaa9ce836 Mon Sep 17 00:00:00 2001 From: xuhy <3313886187@qq.com> Date: 星期二, 25 三月 2025 20:48:35 +0800 Subject: [PATCH] 监管平台 --- ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/SupEquipChargeStatus.java | 134 +++++++++ ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/StationStatusInfo.java | 4 ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/ConnectorStatusInfo.java | 23 + ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/TCECController.java | 253 ++++++++++++++++- ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/QueryStationStatus.java | 7 ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/TCECSuperviseUtil.java | 254 ++++++++++++++++++ ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/SupChargeOrderInfo.java | 145 ++++++++++ 7 files changed, 796 insertions(+), 24 deletions(-) diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/TCECController.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/TCECController.java index 5f4ca19..9e28bdf 100644 --- a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/TCECController.java +++ b/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 diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/TCECSuperviseUtil.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/TCECSuperviseUtil.java new file mode 100644 index 0000000..fb87f7c --- /dev/null +++ b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/TCECSuperviseUtil.java @@ -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); + } +} diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/ConnectorStatusInfo.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/ConnectorStatusInfo.java index 215b381..e603f9e 100644 --- a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/ConnectorStatusInfo.java +++ b/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; } diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/QueryStationStatus.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/QueryStationStatus.java index 2ee411f..27c112d 100644 --- a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/QueryStationStatus.java +++ b/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; } diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/StationStatusInfo.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/StationStatusInfo.java index 2998a11..01bd389 100644 --- a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/StationStatusInfo.java +++ b/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; } diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/SupChargeOrderInfo.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/SupChargeOrderInfo.java new file mode 100644 index 0000000..e120afd --- /dev/null +++ b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/SupChargeOrderInfo.java @@ -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; + +} diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/SupEquipChargeStatus.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/SupEquipChargeStatus.java new file mode 100644 index 0000000..01e29d7 --- /dev/null +++ b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/SupEquipChargeStatus.java @@ -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; + +} -- Gitblit v1.7.1