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