From 8d6ef24217033e13b356502f2ade8737a43cce2b Mon Sep 17 00:00:00 2001
From: 无关风月 <443237572@qq.com>
Date: 星期六, 19 四月 2025 17:52:15 +0800
Subject: [PATCH] MQ消息队列监管平台数据上传
---
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/constant/SendTagConstant.java | 12
ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/QueryToken.java | 27
ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/SuperviseQueryOperatorInfoResult.java | 57
ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/BaseResult.java | 46
ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/util/SequenceGenerator.java | 56
ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/QueryEquipChargeStatus.java | 34
ruoyi-service/ruoyi-jianguan/src/main/resources/logback.xml | 222 ++
ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/QueryStationStats.java | 35
ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/SupConnectorPowerInfo.java | 25
ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/NotificationChargeOrderInfo.java | 106 +
ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/SupChargeOrderInfo.java | 145 +
ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/ConnectorStatusInfo1.java | 54
ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/QueryStationStatus.java | 30
ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/rocket/util/EnhanceMessageHandler.java | 151 +
ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/QueryStartChargeResult.java | 56
ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/BaseModelJianGuan.java | 47
ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/QueryStationStatsResult.java | 21
ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/PlaceHolder.java | 48
ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/NotificationStopCharge.java | 37
ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/rocket/produce/ChargingMessageListener.java | 262 ++
ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/BaseRequestJianGuan.java | 21
ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/QueryEquipAuthResult.java | 45
ruoyi-service/pom.xml | 1
ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/rocket/configuration/RocketEnhanceProperties.java | 13
ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/PolicyInfo.java | 35
ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/StationStatusInfo.java | 31
ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/SupEquipmentPowerInfo.java | 28
ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/SuperviseQueryOperatorInfoResultPage.java | 34
ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/BaseModel.java | 47
ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/EquipmentInfo.java | 98 +
ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/QueryStationsInfoResult.java | 40
ruoyi-service/ruoyi-jianguan/pom.xml | 190 ++
ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/StationStatsInfoResult.java | 15
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/produce/ChargingMessageUtil.java | 55
ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/SupStationPowerInfo.java | 31
ruoyi-service/ruoyi-jianguan/src/main/resources/mybatis-config.xml | 25
ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/QueryStationStatusResult.java | 25
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/constant/ServiceNameConstants.java | 1
ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/SupStationPowerInfoResult.java | 17
ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/rocket/constant/EnhanceMessageConstant.java | 14
ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/NotificationStartChargeResult.java | 37
ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/QueryStopChargeResult.java | 52
ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/util/SignUtil.java | 205 ++
ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/QueryEquipAuth.java | 27
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/model/ChargingOrderMessage.java | 19
ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/StationStatsInfo.java | 99 +
ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/util/AesEncryption.java | 55
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/produce/EnhanceProduce.java | 38
ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/util/HMacMD5Util.java | 122 +
ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/util/AESUtil.java | 107 +
ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/ConnectorInfo.java | 112 +
ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/ConnectorStatsInfo.java | 49
ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/NotificationStopChargeResult.java | 57
ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/QueryEquipChargeStatusResult.java | 150 +
ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/QueryEquipBusinessPolicyResult.java | 58
ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/util/SendTagConstant.java | 22
ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/NotificationEquipChargeStatusResult.java | 29
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/model/GunStatusMessage.java | 18
ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/QueryStationsInfo.java | 49
ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/rocket/base/JianGuanMessage.java | 15
ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/rocket/base/BaseMessage.java | 35
ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/BaseRequest.java | 21
ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/StationInfo.java | 375 +++
ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/EquipmentStatsInfo.java | 64
ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/OperatorInfo.java | 52
ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/SupStationInfoResult.java | 16
ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/util/TCECSuperviseUtil.java | 373 +++
ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/QueryEquipBusinessPolicy.java | 28
ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/QueryTokenResult.java | 51
ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/PlaceHolderPrice.java | 36
ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/NotificationStartCharge.java | 44
ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/rocket/configuration/RocketMQMessageConverter.java | 46
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/model/ChargingMessage.java | 8
ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/rocket/configuration/EnvironmentIsolationConfig.java | 32
ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/QueryStartCharge.java | 47
ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/rocket/configuration/RocketMQEnhanceAutoConfiguration.java | 61
ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/rocket/util/RocketMQEnhanceTemplate.java | 82
ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/NotificationStationStatusResult.java | 23
ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/QueryStopCharge.java | 27
ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/SupEquipChargeStatus.java | 134 +
ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/SupStationInfo.java | 210 ++
ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/rocket/base/GunStatusMessage.java | 17
ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/ConnectorStatusInfo.java | 78
ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/RuoYiJianGuanApplication.java | 39
ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/SuperviseQueryOperatorInfo.java | 22
ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/ChargeDetail.java | 61
ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/rocket/base/ChargingOrderMessage.java | 18
ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/NotificationChargeOrderInfoResult.java | 35
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/produce/ChargingMessageListener.java | 53
89 files changed, 5,605 insertions(+), 40 deletions(-)
diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/constant/ServiceNameConstants.java b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/constant/ServiceNameConstants.java
index 9cb4b54..06ba2cc 100644
--- a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/constant/ServiceNameConstants.java
+++ b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/constant/ServiceNameConstants.java
@@ -26,5 +26,6 @@
public static final String OTHER_SERVICE = "ruoyi-other";
public static final String ORDER_SERVICE = "ruoyi-order";
public static final String INTEGRATION_SERVICE = "ruoyi-integration";
+ public static final String JIANGUAN_SERVICE = "ruoyi-jianguan";
public static final String PAYMENT_SERVICE = "ruoyi-payment";
}
diff --git a/ruoyi-service/pom.xml b/ruoyi-service/pom.xml
index d1690fb..449b6e4 100644
--- a/ruoyi-service/pom.xml
+++ b/ruoyi-service/pom.xml
@@ -15,6 +15,7 @@
<module>ruoyi-payment</module>
<module>ruoyi-other</module>
<module>ruoyi-integration</module>
+ <module>ruoyi-jianguan</module>
</modules>
<artifactId>ruoyi-service</artifactId>
diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/constant/SendTagConstant.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/constant/SendTagConstant.java
index 9b263b9..073a4b1 100644
--- a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/constant/SendTagConstant.java
+++ b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/constant/SendTagConstant.java
@@ -7,6 +7,18 @@
*/
public class SendTagConstant {
/**
+ * 推送充电设备接口状态信息
+ */
+ public static final String GUN_STATUS ="gun_status";
+ /**
+ * 推送充电状态信息
+ */
+ public static final String ORDER_STATUS ="order_status";
+ /**
+ * 推送充电订单信息
+ */
+ public static final String ORDER_INFO = "order_info";
+ /**
* 充电桩登录认证
*/
public static final String ONLINE ="online";
diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/model/ChargingMessage.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/model/ChargingMessage.java
index 149cd59..d19924e 100644
--- a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/model/ChargingMessage.java
+++ b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/model/ChargingMessage.java
@@ -1,12 +1,18 @@
package com.ruoyi.integration.rocket.model;
+import com.ruoyi.integration.drainage.model.ConnectorStatusInfo;
+import com.ruoyi.integration.drainage.model.SupChargeOrderInfo;
+import com.ruoyi.integration.drainage.model.SupEquipChargeStatus;
import com.ruoyi.integration.rocket.base.BaseMessage;
import lombok.Data;
import org.apache.poi.ss.formula.functions.T;
@Data
public class ChargingMessage extends BaseMessage {
-
+ // 充电设备状态message
+ private GunStatusMessage gunStatusMessage;
+ // 推送充电订单状态/充电订单信息message
+ private ChargingOrderMessage orderMessage;
private AcquisitionBillingModeMessage acquisitionBillingModeMessage;
private BillingModeVerifyMessage billingModeVerifyMessage;
private BmsAbortMessage bmsAbortMessage;
diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/model/ChargingOrderMessage.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/model/ChargingOrderMessage.java
new file mode 100644
index 0000000..6e60daf
--- /dev/null
+++ b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/model/ChargingOrderMessage.java
@@ -0,0 +1,19 @@
+package com.ruoyi.integration.rocket.model;
+
+import com.ruoyi.integration.rocket.base.BaseMessage;
+import lombok.Data;
+
+/**
+ * 充电桩计费模型请求
+ **/
+
+@Data
+public class ChargingOrderMessage extends BaseMessage {
+
+ private String orderNumber;// 订单编号
+ private String soc;// soc
+
+}
+
+
+
diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/model/GunStatusMessage.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/model/GunStatusMessage.java
new file mode 100644
index 0000000..78e43ad
--- /dev/null
+++ b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/model/GunStatusMessage.java
@@ -0,0 +1,18 @@
+package com.ruoyi.integration.rocket.model;
+
+import com.ruoyi.integration.rocket.base.BaseMessage;
+import lombok.Data;
+
+/**
+ * 充电桩计费模型请求
+ **/
+
+@Data
+public class GunStatusMessage extends BaseMessage {
+
+ private String fullNumber;// 枪完整编码
+
+}
+
+
+
diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/produce/ChargingMessageListener.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/produce/ChargingMessageListener.java
index d4db2fc..f410000 100644
--- a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/produce/ChargingMessageListener.java
+++ b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/produce/ChargingMessageListener.java
@@ -132,8 +132,9 @@
@Resource
private RedisTemplate redisTemplate;
-
-
+
+ @Autowired
+ private EnhanceProduce enhanceProduce;
@@ -173,13 +174,6 @@
vo1.setPile_code(pingMessage.getCharging_pile_code());
vo1.setStatus(pingMessage.getCharging_gun_status());
chargingPileClient.updateChargingPileStatus(vo1);
-
- try {
- tcecPushUtil.pushSuperviseNotificationStationStatus(chargingGunClient.getChargingGunByFullNumber(pingMessage.getCharging_pile_code()+pingMessage.getCharging_gun_code()).getData());
- }catch (Exception e){
- e.printStackTrace();
- System.out.println("设备状态推送监管平台失败:"+e.getMessage());
- }
}
});
break;
@@ -196,14 +190,28 @@
public void run() {
// 业务处理
chargingOrderClient.endCharge(endCharge.getTransaction_serial_number());
- try {
- TChargingOrder chargingOrder = chargingOrderClient.getOrderByCode(endCharge.getTransaction_serial_number()).getData();
- tcecPushUtil.pushSuperviseNotificationChargeOrderInfo(chargingOrder);
- tcecPushUtil.pushSuperviseNotificationEquipChargeStatus(chargingOrder);
- }catch (Exception e){
- e.printStackTrace();
- System.out.println("充电结束推送监管平台失败:"+e.getMessage());
- }
+ // 订单id
+ String transactionSerialNumber = endCharge.getTransaction_serial_number();
+ ChargingOrderMessage chargingOrderMessage = new ChargingOrderMessage();
+ chargingOrderMessage.setOrderNumber(transactionSerialNumber);
+ // 推送充电订单信息
+ ChargingMessage chargingMessage1 = new ChargingMessage();
+ chargingMessage1.setServiceId(SendTagConstant.ORDER_INFO);
+ chargingMessage1.setOrderMessage(chargingOrderMessage);
+ enhanceProduce.orderInfoMessage(chargingMessage1);
+ // 推送充电订单状态
+ ChargingMessage chargingMessage2 = new ChargingMessage();
+ chargingMessage2.setServiceId(SendTagConstant.ORDER_STATUS);
+ chargingMessage2.setOrderMessage(chargingOrderMessage);
+ enhanceProduce.orderStatusMessage(chargingMessage2);
+// try {
+// TChargingOrder chargingOrder = chargingOrderClient.getOrderByCode(endCharge.getTransaction_serial_number()).getData();
+// tcecPushUtil.pushSuperviseNotificationChargeOrderInfo(chargingOrder);
+// tcecPushUtil.pushSuperviseNotificationEquipChargeStatus(chargingOrder);
+// }catch (Exception e){
+// e.printStackTrace();
+// System.out.println("充电结束推送监管平台失败:"+e.getMessage());
+// }
}
});
break;
@@ -276,8 +284,15 @@
BeanUtils.copyProperties(uploadRealTimeMonitoringData, query);
chargingOrderClient.chargeMonitoring(query);
chargingOrder.setEndSoc(uploadRealTimeMonitoringDataMessage.getSoc()+"");
-
- tcecPushUtil.pushSuperviseNotificationEquipChargeStatus(chargingOrder);
+ ChargingOrderMessage chargingOrderMessage3 = new ChargingOrderMessage();
+ chargingOrderMessage3.setSoc(uploadRealTimeMonitoringDataMessage.getSoc()+"");
+ chargingOrderMessage3.setOrderNumber(chargingOrder.getCode());
+ // 推送充电订单信息
+ ChargingMessage chargingMessage4 = new ChargingMessage();
+ chargingMessage4.setServiceId(SendTagConstant.ORDER_STATUS);
+ chargingMessage4.setOrderMessage(chargingOrderMessage3);
+ enhanceProduce.orderInfoMessage(chargingMessage4);
+// tcecPushUtil.pushSuperviseNotificationEquipChargeStatus(chargingOrder);
}
});
} catch (Exception e) {
diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/produce/ChargingMessageUtil.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/produce/ChargingMessageUtil.java
index 780b998..8072fab 100644
--- a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/produce/ChargingMessageUtil.java
+++ b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/produce/ChargingMessageUtil.java
@@ -5,6 +5,7 @@
import com.ruoyi.chargingPile.api.feignClient.ChargingGunClient;
import com.ruoyi.chargingPile.api.feignClient.ChargingPileClient;
import com.ruoyi.chargingPile.api.model.TAccountingStrategyDetail;
+import com.ruoyi.chargingPile.api.model.TChargingGun;
import com.ruoyi.chargingPile.api.vo.UpdateChargingPileStatusVo;
import com.ruoyi.integration.api.model.*;
import com.ruoyi.integration.drainage.TCECPushUtil;
@@ -20,6 +21,7 @@
import com.ruoyi.order.api.vo.SecurityDetectionVO;
import com.ruoyi.order.api.vo.TransactionRecordMessageVO;
import lombok.extern.slf4j.Slf4j;
+import org.apache.rocketmq.client.producer.SendResult;
import org.apache.rocketmq.spring.annotation.MessageModel;
import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
import org.apache.rocketmq.spring.core.RocketMQListener;
@@ -105,8 +107,8 @@
private QrCodeDeliveryReplyService qrCodeDeliveryReplyService;
@Autowired
private SecurityDetectionService securityDetectionService;
-// @Autowired
-// private TCECPushUtil tcecPushUtil;
+ @Autowired
+ private TCECPushUtil tcecPushUtil;
@Resource
private ChargingPileClient chargingPileClient;
@@ -115,7 +117,8 @@
@Resource
private RedisTemplate redisTemplate;
-
+ @Autowired
+ private EnhanceProduce enhanceProduce;
@@ -152,20 +155,16 @@
vo1.setPile_code(pingMessage.getCharging_pile_code());
vo1.setStatus(pingMessage.getCharging_gun_status());
chargingPileClient.updateChargingPileStatus(vo1);
-
-// ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>());
-// threadPoolExecutor.execute(new Runnable() {
-// @Override
-// public void run() {
-//
-// try {
-//// tcecPushUtil.pushSuperviseNotificationStationStatus(chargingGunClient.getChargingGunByFullNumber(pingMessage.getCharging_pile_code()+pingMessage.getCharging_gun_code()).getData());
-// }catch (Exception e){
-// e.printStackTrace();
-// System.out.println("设备状态推送监管平台失败:"+e.getMessage());
-// }
-// }
-// });
+ // 监管平台推送充电设备状态
+ SendResult sendResult;
+ String gunCode = pingMessage.getCharging_pile_code() + pingMessage.getCharging_gun_code();
+ ChargingMessage chargingMessage = new ChargingMessage();
+ chargingMessage.setServiceId(SendTagConstant.GUN_STATUS);
+ GunStatusMessage gunStatusMessage = new GunStatusMessage();
+ gunStatusMessage.setFullNumber(gunCode);
+ chargingMessage.setGunStatusMessage(gunStatusMessage);
+ sendResult = enhanceProduce.gunStatusMessage(chargingMessage);
+
break;
case SendTagConstant.END_CHARGE:
EndChargeMessage endChargeMessage = message.getEndChargeMessage();
@@ -176,6 +175,20 @@
endChargeService.create(endCharge);
// 业务处理
chargingOrderClient.endCharge(endCharge.getTransaction_serial_number());
+ // 订单id
+ String transactionSerialNumber = endCharge.getTransaction_serial_number();
+ ChargingOrderMessage chargingOrderMessage = new ChargingOrderMessage();
+ chargingOrderMessage.setOrderNumber(transactionSerialNumber);
+ // 推送充电订单信息
+ ChargingMessage chargingMessage1 = new ChargingMessage();
+ chargingMessage1.setServiceId(SendTagConstant.ORDER_INFO);
+ chargingMessage1.setOrderMessage(chargingOrderMessage);
+ enhanceProduce.orderInfoMessage(chargingMessage1);
+ // 推送充电订单状态
+ ChargingMessage chargingMessage2 = new ChargingMessage();
+ chargingMessage2.setServiceId(SendTagConstant.ORDER_STATUS);
+ chargingMessage2.setOrderMessage(chargingOrderMessage);
+ enhanceProduce.orderStatusMessage(chargingMessage2);
// ThreadPoolExecutor threadPoolExecutor1 = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>());
// threadPoolExecutor1.execute(new Runnable() {
// @Override
@@ -255,6 +268,14 @@
UploadRealTimeMonitoringDataQuery query = new UploadRealTimeMonitoringDataQuery();
BeanUtils.copyProperties(uploadRealTimeMonitoringData, query);
chargingOrderClient.chargeMonitoring(query);
+ // 订单id
+ ChargingOrderMessage chargingOrderMessage3 = new ChargingOrderMessage();
+ chargingOrderMessage3.setOrderNumber(chargingOrder.getCode());
+ // 推送充电订单信息
+ ChargingMessage chargingMessage4 = new ChargingMessage();
+ chargingMessage4.setServiceId(SendTagConstant.ORDER_STATUS);
+ chargingMessage4.setOrderMessage(chargingOrderMessage3);
+ enhanceProduce.orderInfoMessage(chargingMessage4);
// ThreadPoolExecutor threadPoolExecutor2 = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>());
// threadPoolExecutor2.execute(new Runnable() {
// @Override
diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/produce/EnhanceProduce.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/produce/EnhanceProduce.java
index eae74c8..43f8fdf 100644
--- a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/produce/EnhanceProduce.java
+++ b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/produce/EnhanceProduce.java
@@ -26,6 +26,7 @@
private RocketMQEnhanceTemplate rocketMQEnhanceTemplate;
private static final String TOPIC = "charge_";
+ private static final String TOPIC_JIANGUAN = "jianguan_";
/**
* 充电桩登录认证
@@ -351,10 +352,41 @@
message.setKey(UUID.randomUUID().toString());
// 设置消息来源,便于查询
message.setSource(SendTagConstant.CHARGING_MESSAGE);
-
-
-
+
return rocketMQEnhanceTemplate.send(TOPIC+SendTagConstant.CHARGING_MESSAGE, SendTagConstant.CHARGING_MESSAGE, message);
}
+ /**
+ * 监管平台推送充电设备接口状态
+ */
+ public SendResult gunStatusMessage(ChargingMessage message) {
+ // 设置业务key
+ message.setKey(UUID.randomUUID().toString());
+ // 设置消息来源,便于查询
+ message.setSource(SendTagConstant.GUN_STATUS);
+
+ return rocketMQEnhanceTemplate.send(TOPIC_JIANGUAN+SendTagConstant.GUN_STATUS, SendTagConstant.GUN_STATUS, message);
+ }
+ /**
+ * 监管平台推送充电订单信息
+ */
+ public SendResult orderInfoMessage(ChargingMessage message) {
+ // 设置业务key
+ message.setKey(UUID.randomUUID().toString());
+ // 设置消息来源,便于查询
+ message.setSource(SendTagConstant.ORDER_INFO);
+
+ return rocketMQEnhanceTemplate.send(TOPIC_JIANGUAN+SendTagConstant.ORDER_INFO, SendTagConstant.ORDER_INFO, message);
+ }
+ /**
+ * 监管平台推送充电订单状态
+ */
+ public SendResult orderStatusMessage(ChargingMessage message) {
+ // 设置业务key
+ message.setKey(UUID.randomUUID().toString());
+ // 设置消息来源,便于查询
+ message.setSource(SendTagConstant.ORDER_STATUS);
+
+ return rocketMQEnhanceTemplate.send(TOPIC_JIANGUAN+SendTagConstant.ORDER_STATUS, SendTagConstant.ORDER_STATUS, message);
+ }
}
\ No newline at end of file
diff --git a/ruoyi-service/ruoyi-jianguan/pom.xml b/ruoyi-service/ruoyi-jianguan/pom.xml
new file mode 100644
index 0000000..2a4bd64
--- /dev/null
+++ b/ruoyi-service/ruoyi-jianguan/pom.xml
@@ -0,0 +1,190 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <parent>
+ <groupId>com.ruoyi</groupId>
+ <artifactId>ruoyi-service</artifactId>
+ <version>3.6.2</version>
+ </parent>
+ <modelVersion>4.0.0</modelVersion>
+
+ <artifactId>ruoyi-modules-jianguan</artifactId>
+
+ <description>
+ ruoyi-modules-jianguan监管平台数据上传模块
+ </description>
+
+ <dependencies>
+ <dependency>
+ <groupId>com.ruoyi</groupId>
+ <artifactId>ruoyi-api-integration</artifactId>
+ </dependency>
+ <!-- SpringCloud Alibaba Nacos -->
+ <dependency>
+ <groupId>com.alibaba.cloud</groupId>
+ <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
+ </dependency>
+
+ <!-- SpringCloud Alibaba Nacos Config -->
+ <dependency>
+ <groupId>com.alibaba.cloud</groupId>
+ <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
+ </dependency>
+
+ <!-- SpringCloud Alibaba Sentinel -->
+ <dependency>
+ <groupId>com.alibaba.cloud</groupId>
+ <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
+ </dependency>
+
+ <dependency>
+ <groupId>com.alibaba.cloud</groupId>
+ <artifactId>spring-cloud-starter-alibaba-seata</artifactId>
+ </dependency>
+
+ <!-- SpringBoot Actuator -->
+ <dependency>
+ <groupId>org.springframework.boot</groupId>
+ <artifactId>spring-boot-starter-actuator</artifactId>
+ </dependency>
+
+ <!-- Swagger UI -->
+ <dependency>
+ <groupId>io.springfox</groupId>
+ <artifactId>springfox-swagger-ui</artifactId>
+ <version>${swagger.fox.version}</version>
+ </dependency>
+
+ <!-- Mysql Connector -->
+ <dependency>
+ <groupId>mysql</groupId>
+ <artifactId>mysql-connector-java</artifactId>
+ </dependency>
+
+ <!-- RuoYi Common DataSource -->
+ <!-- <dependency>-->
+ <!-- <groupId>com.ruoyi</groupId>-->
+ <!-- <artifactId>ruoyi-common-datasource</artifactId>-->
+ <!-- </dependency>-->
+
+ <!-- <!– RuoYi Common DataScope –>-->
+ <!-- <dependency>-->
+ <!-- <groupId>com.ruoyi</groupId>-->
+ <!-- <artifactId>ruoyi-common-datascope</artifactId>-->
+ <!-- </dependency>-->
+
+ <!-- RuoYi Common Log -->
+ <dependency>
+ <groupId>com.ruoyi</groupId>
+ <artifactId>ruoyi-common-log</artifactId>
+ </dependency>
+
+ <!-- RuoYi Common Swagger -->
+ <dependency>
+ <groupId>com.ruoyi</groupId>
+ <artifactId>ruoyi-common-swagger</artifactId>
+ </dependency>
+
+ <!-- 引入Druid依赖,阿里巴巴所提供的数据源 -->
+ <dependency>
+ <groupId>com.alibaba</groupId>
+ <artifactId>druid-spring-boot-starter</artifactId>
+ <version>${druid.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>com.alibaba</groupId>
+ <artifactId>fastjson</artifactId>
+ <version>1.2.47</version>
+ </dependency>
+
+ <!--mybatis-plus-->
+ <dependency>
+ <groupId>com.baomidou</groupId>
+ <artifactId>mybatis-plus-boot-starter</artifactId>
+ <version>3.5.2</version>
+ </dependency>
+
+ <dependency>
+ <groupId>org.springframework.boot</groupId>
+ <artifactId>spring-boot-starter-test</artifactId>
+ <scope>test</scope>
+ </dependency>
+ <!--rocketmq-->
+ <dependency>
+ <groupId>com.alibaba.cloud</groupId>
+ <artifactId>spring-cloud-starter-stream-rocketmq</artifactId>
+ <version>2.2.2.RELEASE</version>
+ <exclusions>
+ <exclusion>
+ <groupId>org.apache.rocketmq</groupId>
+ <artifactId>rocketmq-client</artifactId>
+ </exclusion>
+ <exclusion>
+ <groupId>org.apache.rocketmq</groupId>
+ <artifactId>rocketmq-acl</artifactId>
+ </exclusion>
+ </exclusions>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.rocketmq</groupId>
+ <artifactId>rocketmq-client</artifactId>
+ <version>4.7.1</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.rocketmq</groupId>
+ <artifactId>rocketmq-acl</artifactId>
+ <version>4.7.1</version>
+ </dependency>
+
+ <!--mongodb-->
+ <dependency>
+ <groupId>org.springframework.boot</groupId>
+ <artifactId>spring-boot-starter-data-mongodb</artifactId>
+ </dependency>
+
+ <dependency>
+ <groupId>com.huaweicloud.sdk</groupId>
+ <artifactId>huaweicloud-sdk-bundle</artifactId>
+ <version>3.1.87</version>
+ </dependency>
+
+ <dependency>
+ <groupId>com.ruoyi</groupId>
+ <artifactId>ruoyi-api-order</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>com.ruoyi</groupId>
+ <artifactId>ruoyi-api-chargingPile</artifactId>
+ </dependency>
+ </dependencies>
+
+ <build>
+ <finalName>${project.artifactId}</finalName>
+ <plugins>
+ <plugin>
+ <groupId>org.springframework.boot</groupId>
+ <artifactId>spring-boot-maven-plugin</artifactId>
+ <executions>
+ <execution>
+ <goals>
+ <goal>repackage</goal>
+ </goals>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ <resources>
+ <resource>
+ <directory>src/main/resources</directory>
+ </resource>
+ <resource>
+ <directory>src/main/java</directory>
+ <includes>
+ <include>**/*.xml</include>
+ </includes>
+ <filtering>false</filtering>
+ </resource>
+ </resources>
+ </build>
+
+</project>
diff --git a/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/RuoYiJianGuanApplication.java b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/RuoYiJianGuanApplication.java
new file mode 100644
index 0000000..c24d86f
--- /dev/null
+++ b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/RuoYiJianGuanApplication.java
@@ -0,0 +1,39 @@
+package com.ruoyi.jianguan;
+
+import com.huaweicloud.sdk.thirdparty.okio.Sink;
+import com.ruoyi.common.security.annotation.EnableCustomConfig;
+import com.ruoyi.common.security.annotation.EnableRyFeignClients;
+import com.ruoyi.common.swagger.annotation.EnableCustomSwagger2;
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.cloud.stream.annotation.EnableBinding;
+import org.springframework.scheduling.annotation.EnableScheduling;
+import org.springframework.transaction.annotation.EnableTransactionManagement;
+
+import javax.xml.transform.Source;
+
+/**
+ * 账户模块
+ * @author ruoyi
+ */
+@EnableCustomConfig
+@EnableCustomSwagger2
+@EnableRyFeignClients
+@SpringBootApplication
+@EnableScheduling//开启定时任务
+public class RuoYiJianGuanApplication {
+ public static void main(String[] args) {
+ SpringApplication.run(RuoYiJianGuanApplication.class, args);
+ System.out.println("(♥◠‿◠)ノ゙ 监管平台模块启动成功 ლ(´ڡ`ლ)゙ \n" +
+ " .-------. ____ __ \n" +
+ " | _ _ \\ \\ \\ / / \n" +
+ " | ( ' ) | \\ _. / ' \n" +
+ " |(_ o _) / _( )_ .' \n" +
+ " | (_,_).' __ ___(_ o _)' \n" +
+ " | |\\ \\ | || |(_,_)' \n" +
+ " | | \\ `' /| `-' / \n" +
+ " | | \\ / \\ / \n" +
+ " ''-' `'-' `-..-' ");
+ }
+}
diff --git a/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/BaseModel.java b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/BaseModel.java
new file mode 100644
index 0000000..e9e48dc
--- /dev/null
+++ b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/BaseModel.java
@@ -0,0 +1,47 @@
+package com.ruoyi.jianguan.model;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.ruoyi.other.api.domain.Operator;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * @author zhibing.pu
+ * @Date 2025/1/23 18:33
+ */
+@Data
+public class BaseModel {
+ /**
+ * 运营商标识
+ */
+ @NotNull
+ @JsonProperty("OperatorID")
+ private String operatorID;
+ /**
+ * 参数内容
+ */
+ @NotNull
+ @JsonProperty("Data")
+ private String data;
+ /**
+ * 时间戳
+ * yyyyMMddHHmmss
+ */
+ @NotNull
+ @JsonProperty("TimeStamp")
+ private Long timeStamp;
+ /**
+ * 自增序列
+ * 4位自增序列取自时间戳,同一秒内按序列自增长,新秒重计。如 0001
+ */
+ @NotNull
+ @JsonProperty("Seq")
+ private String seq;
+ /**
+ * 运营商对象
+ */
+ @JsonIgnore
+ private Operator operator;
+}
diff --git a/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/BaseModelJianGuan.java b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/BaseModelJianGuan.java
new file mode 100644
index 0000000..1c4ee52
--- /dev/null
+++ b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/BaseModelJianGuan.java
@@ -0,0 +1,47 @@
+package com.ruoyi.jianguan.model;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.ruoyi.other.api.domain.Operator;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * @author zhibing.pu
+ * @Date 2025/1/23 18:33
+ */
+@Data
+public class BaseModelJianGuan {
+ /**
+ * 运营商标识
+ */
+ @NotNull
+ @JsonProperty("OperatorID")
+ private String operatorID;
+ /**
+ * 参数内容
+ */
+ @NotNull
+ @JsonProperty("Data")
+ private String data;
+ /**
+ * 时间戳
+ * yyyyMMddHHmmss
+ */
+ @NotNull
+ @JsonProperty("TimeStamp")
+ private String timeStamp;
+ /**
+ * 自增序列
+ * 4位自增序列取自时间戳,同一秒内按序列自增长,新秒重计。如 0001
+ */
+ @NotNull
+ @JsonProperty("Seq")
+ private String seq;
+ /**
+ * 运营商对象
+ */
+ @JsonIgnore
+ private Operator operator;
+}
diff --git a/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/BaseRequest.java b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/BaseRequest.java
new file mode 100644
index 0000000..87dad98
--- /dev/null
+++ b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/BaseRequest.java
@@ -0,0 +1,21 @@
+package com.ruoyi.jianguan.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * 公共请求
+ * @author zhibing.pu
+ * @Date 2025/1/21 17:08
+ */
+@Data
+public class BaseRequest extends BaseModel {
+ /**
+ * 数字签名
+ */
+ @NotNull
+ @JsonProperty("Sig")
+ private String sig;
+}
diff --git a/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/BaseRequestJianGuan.java b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/BaseRequestJianGuan.java
new file mode 100644
index 0000000..6f58d6e
--- /dev/null
+++ b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/BaseRequestJianGuan.java
@@ -0,0 +1,21 @@
+package com.ruoyi.jianguan.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * 公共请求
+ * @author zhibing.pu
+ * @Date 2025/1/21 17:08
+ */
+@Data
+public class BaseRequestJianGuan extends BaseModelJianGuan {
+ /**
+ * 数字签名
+ */
+ @NotNull
+ @JsonProperty("Sig")
+ private String sig;
+}
diff --git a/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/BaseResult.java b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/BaseResult.java
new file mode 100644
index 0000000..83e9722
--- /dev/null
+++ b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/BaseResult.java
@@ -0,0 +1,46 @@
+package com.ruoyi.jianguan.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.ruoyi.other.api.domain.Operator;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * 公共返回结果
+ * @author zhibing.pu
+ * @Date 2025/1/21 15:54
+ */
+@Data
+public class BaseResult extends BaseModel {
+ /**
+ * 参数编码
+ * -1:系统繁忙,此时请求方稍后重试
+ * 0:请求成功
+ * 4001:签名错误
+ * 4002:Token错误
+ * 4003:POST参数不合法,缺少必需的
+ * 4004:请求的业务参数不合法
+ * 500:系统错误
+ */
+ @NotNull
+ @JsonProperty("Ret")
+ private Integer ret;
+ /**
+ * 错误信息描述
+ */
+ @NotNull
+ @JsonProperty("Msg")
+ private String msg;
+ /**
+ * 签名
+ */
+ @NotNull
+ @JsonProperty("Sig")
+ private String sig;
+
+ /**
+ * 运营商对象
+ */
+ private Operator operator;
+}
diff --git a/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/ChargeDetail.java b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/ChargeDetail.java
new file mode 100644
index 0000000..6e0f7cc
--- /dev/null
+++ b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/ChargeDetail.java
@@ -0,0 +1,61 @@
+package com.ruoyi.jianguan.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Null;
+import java.math.BigDecimal;
+
+/**
+ * 充电明细信息
+ * @author zhibing.pu
+ * @Date 2025/1/21 16:40
+ */
+@Data
+public class ChargeDetail {
+ /**
+ * 开始时间
+ * yyyy-MM-dd HH:mm:ss
+ */
+ @NotNull
+ @JsonProperty("DetailStartTime")
+ private String detailStartTime;
+ /**
+ * 结束时间
+ * yyyy-MM-dd HH:mm:ss
+ */
+ @NotNull
+ @JsonProperty("DetailEndTime")
+ private String detailEndTime;
+ /**
+ * 时段电价
+ */
+ @Null
+ @JsonProperty("ElecPrice")
+ private BigDecimal elecPrice;
+ /**
+ * 时段服务费价格
+ */
+ @Null
+ @JsonProperty("SevicePrice")
+ private BigDecimal sevicePrice;
+ /**
+ * 时段充电量
+ */
+ @Null
+ @JsonProperty("DetailPower")
+ private BigDecimal detailPower;
+ /**
+ * 时段电费
+ */
+ @Null
+ @JsonProperty("DetailElecMoney")
+ private BigDecimal detailElecMoney;
+ /**
+ * 时段服务费
+ */
+ @Null
+ @JsonProperty("DetailSeviceMoney")
+ private BigDecimal detailSeviceMoney;
+}
diff --git a/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/ConnectorInfo.java b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/ConnectorInfo.java
new file mode 100644
index 0000000..887c81f
--- /dev/null
+++ b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/ConnectorInfo.java
@@ -0,0 +1,112 @@
+package com.ruoyi.jianguan.model;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Null;
+import java.math.BigDecimal;
+
+/**
+ * 充电设备接口
+ * @author zhibing.pu
+ * @Date 2025/1/21 14:03
+ */
+@Data
+public class ConnectorInfo {
+ /**
+ * 充电设备接口编码
+ */
+ @NotNull
+ @JsonProperty("ConnectorID")
+ private String connectorID;
+ /**
+ * 充电设备接口名称
+ */
+ @NotNull
+ @JsonProperty("ConnectorName")
+ private String connectorName;
+ /**
+ * 1:车辆充电设备接口
+ * 2:换电站内的电池箱充电设备接口
+ */
+ @Null
+ @JsonProperty("EquipmentClassification")
+ private Integer equipmentClassification;
+ /**
+ * 充电设备接口类型
+ */
+ @NotNull
+ @JsonProperty("ConnectorType")
+ private Integer connectorType;
+ /**
+ * 额定电压上限
+ */
+ @NotNull
+ @JsonProperty("VoltageUpperLimits")
+ private BigDecimal voltageUpperLimits;
+ /**
+ * 额定电压下限
+ */
+ @NotNull
+ @JsonProperty("VoltageLowerLimits")
+ private BigDecimal voltageLowerLimits;
+ /**
+ * 额定电流
+ */
+ @NotNull
+ @JsonProperty("Current")
+ private Integer current;
+ /**
+ * 额定功率
+ */
+ @NotNull
+ @JsonProperty("Power")
+ private BigDecimal power;
+ /**
+ * 车位号
+ */
+ @Null
+ @JsonProperty("ParkNo")
+ private String parkNo;
+ /**
+ * 国家标准
+ * 1:2011
+ * 2:2015
+ * 3:兼容2011和2015
+ */
+ @NotNull
+ @JsonProperty("NationalStandard")
+ private Integer nationalStandard;
+ /**
+ * 枪二维码
+ */
+ @Null
+ @JsonProperty("QRCode")
+ private String QRCode;
+ @Null
+ @JsonProperty("ConstantVoltageUpperLimits")
+ private BigDecimal constantVoltageUpperLimits;
+ @Null
+ @JsonProperty("ConstantVoltageLowerLimits")
+ private BigDecimal constantVoltageLowerLimits;
+
+ @Null
+ @JsonProperty("ConstantCurrentUpperLimits")
+ private BigDecimal constantCurrentUpperLimits;
+
+ @Null
+ @JsonProperty("ConstantCurrentLowerLimits")
+ private BigDecimal constantCurrentLowerLimits;
+ @NotNull
+ @JsonProperty("AuxPower")
+ private Integer auxPower;
+
+ @NotNull
+ @TableField("OpreateStatus")
+ private Integer opreateStatus;
+ @Null
+ @TableField("OpreateHours")
+ private String opreateHours;
+}
diff --git a/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/ConnectorStatsInfo.java b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/ConnectorStatsInfo.java
new file mode 100644
index 0000000..358404c
--- /dev/null
+++ b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/ConnectorStatsInfo.java
@@ -0,0 +1,49 @@
+package com.ruoyi.jianguan.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+import java.math.BigDecimal;
+
+/**
+ * 充电设备接口统计信息
+ * @author zhibing.pu
+ * @Date 2025/1/21 15:24
+ */
+@Data
+public class ConnectorStatsInfo {
+ /**
+ * 充电设备接口编码
+ */
+ @NotNull
+ @JsonProperty("ConnectorID")
+ private String connectorID;
+ /**
+ * 充电设备接口累计电量
+ */
+ @NotNull
+ @JsonProperty("ConnectorElectricity")
+ private BigDecimal connectorElectricity;
+ /**
+ * 充电设备接口累
+ * 计充电时长
+ */
+ @NotNull
+ @JsonProperty("ConnectorTotalChargeTime")
+ private Integer ConnectorTotalChargeTime;
+ /**
+ * 充电设备接口累
+ * 计充电次数
+ */
+ @NotNull
+ @JsonProperty("ConnectorTotalChargeNum")
+ private Integer ConnectorTotalChargeNum;
+ /**
+ * 充电设备接口累
+ * 计告警数量
+ */
+ @NotNull
+ @JsonProperty("ConnectorTotalWarningNum")
+ private Integer ConnectorTotalWarningNum;
+}
diff --git a/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/ConnectorStatusInfo.java b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/ConnectorStatusInfo.java
new file mode 100644
index 0000000..af8eb19
--- /dev/null
+++ b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/ConnectorStatusInfo.java
@@ -0,0 +1,78 @@
+package com.ruoyi.jianguan.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Null;
+
+/**
+ * 充电设备接口状态
+ * @author zhibing.pu
+ * @Date 2025/1/21 14:53
+ */
+@Data
+public class ConnectorStatusInfo {
+ /**
+ * 充电设备接口编码
+ */
+ @NotNull
+ @JsonProperty("ConnectorID")
+ private String connectorID;
+ /**
+ * 充电设备接口状态
+ * 0:离网
+ * 1:空闲
+ * 2:占用(未充电)
+ * 3:占用(充电中)
+ * 4:占用(预约锁定)
+ * 255:故障
+ */
+ @NotNull
+ @JsonProperty("Status")
+ private Integer status;
+ /**
+ * 车位状态
+ * 0:未知
+ * 10:空闲
+ * 50:占用
+ */
+ @Null
+ @JsonProperty("ParkStatus")
+ private Integer parkStatus;
+ /**
+ * 地锁状态
+ * 0:未知
+ * 10:已解锁
+ * 50:已上锁
+ */
+ @Null
+ @JsonProperty("LookStatus")
+ private Integer lookStatus;
+
+ @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-jianguan/src/main/java/com/ruoyi/jianguan/model/ConnectorStatusInfo1.java b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/ConnectorStatusInfo1.java
new file mode 100644
index 0000000..18001e1
--- /dev/null
+++ b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/ConnectorStatusInfo1.java
@@ -0,0 +1,54 @@
+package com.ruoyi.jianguan.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Null;
+
+/**
+ * 充电设备接口状态
+ * @author zhibing.pu
+ * @Date 2025/1/21 14:53
+ */
+@Data
+public class ConnectorStatusInfo1 {
+ /**
+ * 充电设备接口编码
+ */
+ @NotNull
+ @JsonProperty("ConnectorID")
+ private String connectorID;
+ /**
+ * 充电设备接口状态
+ * 0:离网
+ * 1:空闲
+ * 2:占用(未充电)
+ * 3:占用(充电中)
+ * 4:占用(预约锁定)
+ * 255:故障
+ */
+ @NotNull
+ @JsonProperty("Status")
+ private Integer status;
+ /**
+ * 车位状态
+ * 0:未知
+ * 10:空闲
+ * 50:占用
+ */
+ @Null
+ @JsonProperty("ParkStatus")
+ private Integer parkStatus;
+ /**
+ * 地锁状态
+ * 0:未知
+ * 10:已解锁
+ * 50:已上锁
+ */
+ @Null
+ @JsonProperty("LookStatus")
+ private Integer lookStatus;
+
+ private ConnectorStatusInfo1 ConnectorStatusInfo;
+}
diff --git a/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/EquipmentInfo.java b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/EquipmentInfo.java
new file mode 100644
index 0000000..a2154ce
--- /dev/null
+++ b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/EquipmentInfo.java
@@ -0,0 +1,98 @@
+package com.ruoyi.jianguan.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Null;
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * 充电设备信息
+ * @author zhibing.pu
+ * @Date 2025/1/21 13:51
+ */
+@Data
+public class EquipmentInfo {
+ /**
+ * 设备编号
+ */
+ @NotNull
+ @JsonProperty("EquipmentID")
+ private String equipmentID;
+ /**
+ * 设备生产商组织机构代码
+ */
+ @Null
+ @JsonProperty("ManufacturerID")
+ private String manufacturerID;
+ /**
+ * 设备唯一
+ * 编码
+ */
+ @Null
+ @JsonProperty("EquipmentUniqueNumber")
+ private String equipmentUniqueNumber;
+ /**
+ * 设备生产商名称
+ */
+ @Null
+ @JsonProperty("ManufacturerName")
+ private String manufacturerName;
+ /**
+ * 设备型号
+ */
+ @Null
+ @JsonProperty("EquipmentModel")
+ private String equipmentModel;
+ /**
+ * 设备生产日期
+ * YYYY-MM-DD
+ */
+ @Null
+ @JsonProperty("ProductionDate")
+ private String productionDate;
+ /**
+ * 设备类型
+ */
+ @NotNull
+ @JsonProperty("EquipmentType")
+ private Integer equipmentType;
+ /**
+ * 充电设备接口信息列表
+ */
+ @NotNull
+ @JsonProperty("ConnectorInfos")
+ private List<ConnectorInfo> connectorInfos;
+ /**
+ * 充电设备经度
+ */
+ @Null
+ @JsonProperty("EquipmentLng")
+ private BigDecimal equipmentLng;
+ /**
+ * 充电设备纬度
+ */
+ @Null
+ @JsonProperty("EquipmentLat")
+ private BigDecimal equipmentLat;
+ /**
+ * 充电设备总功率
+ */
+ @NotNull
+ @JsonProperty("Power")
+ private BigDecimal power;
+ /**
+ * 充电设备名称
+ */
+ @Null
+ @JsonProperty("EquipmentName")
+ private String equipmentName;
+ /**
+ * 设备分类
+ */
+ @NotNull
+ @JsonProperty("EquipmentClassification")
+ private Integer equipmentClassification;
+}
diff --git a/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/EquipmentStatsInfo.java b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/EquipmentStatsInfo.java
new file mode 100644
index 0000000..b59cecb
--- /dev/null
+++ b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/EquipmentStatsInfo.java
@@ -0,0 +1,64 @@
+package com.ruoyi.jianguan.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * 充电设备统计信息
+ * @author zhibing.pu
+ * @Date 2025/1/21 15:22
+ */
+@Data
+public class EquipmentStatsInfo {
+ /**
+ * 设备编码
+ */
+ @NotNull
+ @JsonProperty("EquipmentID")
+ private String equipmentID;
+ /**
+ * 充电设备接口累计电量
+ */
+ @NotNull
+ @JsonProperty("EquipmentElectricity")
+ private BigDecimal equipmentElectricity;
+ /**
+ * 设备分类 1:车辆充电设备
+ * 2:换电站内的电池
+ * 箱充电设备
+ */
+ @NotNull
+ @JsonProperty("EquipmentClassification")
+ private Integer equipmentClassification;
+ /**
+ * 充电设备累计充电时长 单位分钟
+ */
+ @NotNull
+ @JsonProperty("EquipmentTotalChargeTime")
+ private Long equipmentTotalChargeTime;
+ /**
+ * 充电设备累计充
+ * 电次数
+ */
+ @NotNull
+ @JsonProperty("EquipmentTotalChargeNum")
+ private Integer equipmentTotalChargeNum;
+ /**
+ * 充电设备累计充
+ * 电次数
+ */
+ @NotNull
+ @JsonProperty("EquipmentTotalWarningNum")
+ private Integer equipmentTotalWarningNum;
+
+ /**
+ * 充电设备接口统计信息列表
+ */
+ @NotNull
+ @JsonProperty("ConnectorStatsInfos")
+ private List<ConnectorStatsInfo> connectorStatsInfos;
+}
diff --git a/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/NotificationChargeOrderInfo.java b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/NotificationChargeOrderInfo.java
new file mode 100644
index 0000000..1cca275
--- /dev/null
+++ b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/NotificationChargeOrderInfo.java
@@ -0,0 +1,106 @@
+package com.ruoyi.jianguan.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Null;
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * 推送充电订单信息
+ * @author zhibing.pu
+ * @Date 2025/1/21 15:39
+ */
+@Data
+public class NotificationChargeOrderInfo {
+ /**
+ * 充电订单号
+ */
+ @NotNull
+ @JsonProperty("StartChargeSeq")
+ private String startChargeSeq;
+ /**
+ * 充电设备接口编码
+ */
+ @NotNull
+ @JsonProperty("ConnectorID")
+ private String connectorID;
+ /**
+ * 开始充电时间
+ * yyyy-MM-dd HH:mm:ss
+ */
+ @NotNull
+ @JsonProperty("StartTime")
+ private String startTime;
+ /**
+ * 结束充电时间
+ * yyyy-MM-dd HH:mm:ss
+ */
+ @NotNull
+ @JsonProperty("EndTime")
+ private String endTime;
+ /**
+ * 累计充电量
+ */
+ @NotNull
+ @JsonProperty("TotalPower")
+ private BigDecimal totalPower;
+ /**
+ * 总电费
+ */
+ @NotNull
+ @JsonProperty("TotalElecMoney")
+ private BigDecimal totalElecMoney;
+ /**
+ * 总服务费
+ */
+ @NotNull
+ @JsonProperty("TotalSeviceMoney")
+ private BigDecimal totalSeviceMoney;
+ /**
+ * 累计总金额
+ */
+ @NotNull
+ @JsonProperty("TotalMoney")
+ private BigDecimal totalMoney;
+ /**
+ * 充电结束原因
+ * 0:用户手动停止充电
+ * 1:客户归属地运营商平台停止充电
+ * 2:BMS停止充电
+ * 3:充电机设备故障
+ * 4:连接器断开
+ * 5·99:自定义
+ */
+ @NotNull
+ @JsonProperty("StopReason")
+ private Integer stopReason;
+ /**
+ * 时段数 N
+ * 0·32
+ */
+ @Null
+ @JsonProperty("SumPeriod")
+ private Integer sumPeriod;
+ /**
+ * 充电明细信息
+ */
+ @Null
+ @JsonProperty("ChargeDetails")
+ private List<ChargeDetail> chargeDetails;
+ /**
+ * 占位费
+ */
+ @Null
+ @JsonProperty("TotalDelayMoney")
+ private BigDecimal totalDelayMoney;
+ /**
+ * 车辆识别码
+ */
+ @Null
+ @JsonProperty("VIN")
+ private String VIN;
+
+}
diff --git a/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/NotificationChargeOrderInfoResult.java b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/NotificationChargeOrderInfoResult.java
new file mode 100644
index 0000000..0551648
--- /dev/null
+++ b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/NotificationChargeOrderInfoResult.java
@@ -0,0 +1,35 @@
+package com.ruoyi.jianguan.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * 推送充电订单信息返回记过
+ * @author zhibing.pu
+ * @Date 2025/1/21 15:49
+ */
+@Data
+public class NotificationChargeOrderInfoResult {
+ /**
+ * 充电订单号
+ */
+ @NotNull
+ @JsonProperty("StartChargeSeq")
+ private String startChargeSeq;
+ /**
+ * 充电设备接口编码
+ */
+ @NotNull
+ @JsonProperty("ConnectorID")
+ private String connectorID;
+ /**
+ * 确认结果
+ * 0;成功
+ * 1:争议交易
+ * 2·99:自定义
+ */
+ @JsonProperty("ConfirmResult")
+ private Integer confirmResult;
+}
diff --git a/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/NotificationEquipChargeStatusResult.java b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/NotificationEquipChargeStatusResult.java
new file mode 100644
index 0000000..472bf9b
--- /dev/null
+++ b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/NotificationEquipChargeStatusResult.java
@@ -0,0 +1,29 @@
+package com.ruoyi.jianguan.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * 推送充电状态结果
+ * @author zhibing.pu
+ * @Date 2025/1/21 16:48
+ */
+@Data
+public class NotificationEquipChargeStatusResult {
+ /**
+ * 充电订单号
+ */
+ @NotNull
+ @JsonProperty("StartChargeSeq")
+ private String startChargeSeq;
+ /**
+ * 操作结果
+ * 0:成功
+ * 1:失败
+ */
+ @NotNull
+ @JsonProperty("SuccStat")
+ private Integer succStat;
+}
diff --git a/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/NotificationStartCharge.java b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/NotificationStartCharge.java
new file mode 100644
index 0000000..b3106e6
--- /dev/null
+++ b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/NotificationStartCharge.java
@@ -0,0 +1,44 @@
+package com.ruoyi.jianguan.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * 推送启动充电结果
+ * @author zhibing.pu
+ * @Date 2025/1/22 18:40
+ */
+@Data
+public class NotificationStartCharge {
+ /**
+ * 充电订单号
+ */
+ @NotNull
+ @JsonProperty("StartChargeSeq")
+ private String startChargeSeq;
+ /**
+ * 充电订单状态
+ * 1:启动中
+ * 2:充电中
+ * 3:停止中
+ * 4:已结束
+ * 5:未知
+ */
+ @NotNull
+ @JsonProperty("StartChargeSeqStat")
+ private Integer startChargeSeqStat;
+ /**
+ * 充电设别接口编码
+ */
+ @NotNull
+ @JsonProperty("ConnectorID")
+ private String connectorID;
+ /**
+ * 充电启动时间
+ */
+ @NotNull
+ @JsonProperty("StartTime")
+ private String startTime;
+}
diff --git a/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/NotificationStartChargeResult.java b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/NotificationStartChargeResult.java
new file mode 100644
index 0000000..13c652b
--- /dev/null
+++ b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/NotificationStartChargeResult.java
@@ -0,0 +1,37 @@
+package com.ruoyi.jianguan.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * 推送启动充电结果返回值
+ * @author zhibing.pu
+ * @Date 2025/1/22 18:47
+ */
+@Data
+public class NotificationStartChargeResult {
+ /**
+ * 充电订单号
+ */
+ @NotNull
+ @JsonProperty("StartChargeSeq")
+ private String startChargeSeq;
+ /**
+ * 操作结果
+ * 0:成功
+ * 1:失败
+ */
+ @NotNull
+ @JsonProperty("SuccStat")
+ private Integer succStat;
+ /**
+ * 失败原因
+ * 0:无
+ * 1:接收失败
+ */
+ @NotNull
+ @JsonProperty("FailReason")
+ private Integer failReason;
+}
diff --git a/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/NotificationStationStatusResult.java b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/NotificationStationStatusResult.java
new file mode 100644
index 0000000..5ab8918
--- /dev/null
+++ b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/NotificationStationStatusResult.java
@@ -0,0 +1,23 @@
+package com.ruoyi.jianguan.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * 设备状态变化推动返回结果
+ * @author zhibing.pu
+ * @Date 2025/1/21 14:58
+ */
+@Data
+public class NotificationStationStatusResult {
+ /**
+ * 状态
+ * 0:接收
+ * 1:丢弃/忽略,不需要重试
+ */
+ @NotNull
+ @JsonProperty("Status")
+ private Integer status;
+}
diff --git a/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/NotificationStopCharge.java b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/NotificationStopCharge.java
new file mode 100644
index 0000000..f2191fe
--- /dev/null
+++ b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/NotificationStopCharge.java
@@ -0,0 +1,37 @@
+package com.ruoyi.jianguan.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * 推送停止充电结果应答
+ * @author zhibing.pu
+ * @Date 2025/1/23 9:17
+ */
+@Data
+public class NotificationStopCharge {
+ /**
+ * 充电订单号
+ */
+ @NotNull
+ @JsonProperty("StartChargeSeq")
+ private String startChargeSeq;
+ /**
+ * 操作结果
+ * 0:成功
+ * 1:失败
+ */
+ @NotNull
+ @JsonProperty("SuccStat")
+ private Integer succStat;
+ /**
+ * 失败原因
+ * 0:无
+ * 1:接收失败
+ */
+ @NotNull
+ @JsonProperty("FailReason")
+ private Integer failReason;
+}
diff --git a/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/NotificationStopChargeResult.java b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/NotificationStopChargeResult.java
new file mode 100644
index 0000000..94b45c0
--- /dev/null
+++ b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/NotificationStopChargeResult.java
@@ -0,0 +1,57 @@
+package com.ruoyi.jianguan.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * 推送停止充电结果
+ * @author zhibing.pu
+ * @Date 2025/1/23 9:13
+ */
+@Data
+public class NotificationStopChargeResult {
+ /**
+ * 充电订单号
+ */
+ @NotNull
+ @JsonProperty("StartChargeSeq")
+ private String startChargeSeq;
+ /**
+ * 充电订单状态
+ * 1:启动中
+ * 2:充电中
+ * 3:停止中
+ * 4:已结束
+ * 5:未知
+ */
+ @NotNull
+ @JsonProperty("StartChargeSeqStat")
+ private Integer startChargeSeqStat;
+ /**
+ * 充电设备接口编码
+ */
+ @NotNull
+ @JsonProperty("ConnectorID")
+ private String connectorID;
+ /**
+ * 操作结果
+ * 0:成功
+ * 1:失败
+ */
+ @NotNull
+ @JsonProperty("SuccStat")
+ private Integer succStat;
+ /**
+ * 失败原因
+ * 0:无
+ * 1:此设备不存在
+ * 2:此设备离线
+ * 3:此设备已停止充电
+ * 4`9:自定义
+ */
+ @NotNull
+ @JsonProperty("FailReason")
+ private Integer failReason;
+}
diff --git a/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/OperatorInfo.java b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/OperatorInfo.java
new file mode 100644
index 0000000..9fb0b1f
--- /dev/null
+++ b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/OperatorInfo.java
@@ -0,0 +1,52 @@
+package com.ruoyi.jianguan.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Null;
+
+/**
+ * 基础设施运营商信息
+ * @author zhibing.pu
+ * @Date 2025/1/21 11:49
+ */
+@Data
+public class OperatorInfo {
+ /**
+ * 运营商ID
+ */
+ @NotNull
+ @JsonProperty("OperatorID")
+ private String operatorID;
+ /**
+ * 运营商名称
+ */
+ @NotNull
+ @JsonProperty("OperatorName")
+ private String operatorName;
+ /**
+ * 运营商电话1
+ */
+ @NotNull
+ @JsonProperty("OperatorTel1")
+ private String operatorTel1;
+ /**
+ * 运营商电话2
+ */
+ @Null
+ @JsonProperty("OperatorTel2")
+ private String operatorTel2;
+ /**
+ * 运营商注册地址
+ */
+ @Null
+ @JsonProperty("OperatorRegAddress")
+ private String operatorRegAddress;
+ /**
+ * 备注
+ */
+ @Null
+ @JsonProperty("OperatorNote")
+ private String operatorNote;
+}
diff --git a/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/PlaceHolder.java b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/PlaceHolder.java
new file mode 100644
index 0000000..91a81cf
--- /dev/null
+++ b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/PlaceHolder.java
@@ -0,0 +1,48 @@
+package com.ruoyi.jianguan.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * 占位费信息
+ * @author zhibing.pu
+ * @Date 2025/1/26 9:29
+ */
+@Data
+public class PlaceHolder {
+ /**
+ * 免费时长
+ */
+ @NotNull
+ @JsonProperty("FreeTime")
+ private Integer freeTime;
+ /**
+ * 嘴阀占位费
+ */
+ @NotNull
+ @JsonProperty("MaxFee")
+ private BigDecimal maxFee;
+ /**
+ * 生效开始时间
+ * yyyy-MM-dd HH:mm:ss
+ */
+ @NotNull
+ @JsonProperty("EffectStartTime")
+ private String effectStartTime;
+ /**
+ * 生效结束时间
+ */
+ @NotNull
+ @JsonProperty("EffectEndTime")
+ private String effectEndTime;
+ /**
+ * 占位费价格
+ */
+ @NotNull
+ @JsonProperty("PlaceHolderPrices")
+ private List<PlaceHolderPrice> placeHolderPrices;
+}
diff --git a/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/PlaceHolderPrice.java b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/PlaceHolderPrice.java
new file mode 100644
index 0000000..9edcb7a
--- /dev/null
+++ b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/PlaceHolderPrice.java
@@ -0,0 +1,36 @@
+package com.ruoyi.jianguan.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+import java.math.BigDecimal;
+
+/**
+ * 占位费价格
+ * @author zhibing.pu
+ * @Date 2025/1/26 9:33
+ */
+@Data
+public class PlaceHolderPrice {
+ /**
+ * 开始时段
+ * HH:mm
+ */
+ @NotNull
+ @JsonProperty("StartTime")
+ private String startTime;
+ /**
+ * 结束时段
+ * HH:mm
+ */
+ @NotNull
+ @JsonProperty("EndTime")
+ private String endTime;
+ /**
+ * 单价
+ */
+ @NotNull
+ @JsonProperty("Price")
+ private BigDecimal price;
+}
diff --git a/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/PolicyInfo.java b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/PolicyInfo.java
new file mode 100644
index 0000000..a02fe1f
--- /dev/null
+++ b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/PolicyInfo.java
@@ -0,0 +1,35 @@
+package com.ruoyi.jianguan.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+import java.math.BigDecimal;
+
+/**
+ * 计费信息
+ * @author zhibing.pu
+ * @Date 2025/1/21 16:10
+ */
+@Data
+public class PolicyInfo {
+ /**
+ * 时段起始时间点
+ * HHmmss
+ */
+ @NotNull
+ @JsonProperty("StartTime")
+ private String startTime;
+ /**
+ * 时段电费
+ */
+ @NotNull
+ @JsonProperty("ElecPrice")
+ private BigDecimal elecPrice;
+ /**
+ * 时段服务费
+ */
+ @NotNull
+ @JsonProperty("SevicePrice")
+ private BigDecimal sevicePrice;
+}
diff --git a/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/QueryEquipAuth.java b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/QueryEquipAuth.java
new file mode 100644
index 0000000..0f4dd2b
--- /dev/null
+++ b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/QueryEquipAuth.java
@@ -0,0 +1,27 @@
+package com.ruoyi.jianguan.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * 请求设备认证
+ * @author zhibing.pu
+ * @Date 2025/1/22 16:15
+ */
+@Data
+public class QueryEquipAuth {
+ /**
+ * 设备认证流水
+ */
+ @NotNull
+ @JsonProperty("EquipAuthSeq")
+ private String equipAuthSeq;
+ /**
+ * 充电设备接口编码
+ */
+ @NotNull
+ @JsonProperty("ConnectorID")
+ private String connectorID;
+}
diff --git a/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/QueryEquipAuthResult.java b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/QueryEquipAuthResult.java
new file mode 100644
index 0000000..9f96138
--- /dev/null
+++ b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/QueryEquipAuthResult.java
@@ -0,0 +1,45 @@
+package com.ruoyi.jianguan.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * 请求设备认证返回结果
+ * @author zhibing.pu
+ * @Date 2025/1/22 16:16
+ */
+@Data
+public class QueryEquipAuthResult {
+ /**
+ * 设备认证流水号
+ */
+ @NotNull
+ @JsonProperty("EquipAuthSeq")
+ private String equipAuthSeq;
+ /**
+ * 充电设备接口编码
+ */
+ @NotNull
+ @JsonProperty("ConnectorID")
+ private String connectorID;
+ /**
+ * 操作结果
+ * 0:成功
+ * 1:失败
+ */
+ @NotNull
+ @JsonProperty("SuccStat")
+ private Integer succStat;
+ /**
+ * 失败原因
+ * 0:无
+ * 1:此设备尚未插枪
+ * 2:设备检测失败
+ * 3·99:自定义
+ */
+ @NotNull
+ @JsonProperty("FailReason")
+ private Integer failReason;
+}
diff --git a/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/QueryEquipBusinessPolicy.java b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/QueryEquipBusinessPolicy.java
new file mode 100644
index 0000000..3ccc00d
--- /dev/null
+++ b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/QueryEquipBusinessPolicy.java
@@ -0,0 +1,28 @@
+package com.ruoyi.jianguan.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * 查询业务策略信息
+ * @author zhibing.pu
+ * @Date 2025/1/21 16:03
+ */
+@Data
+public class QueryEquipBusinessPolicy {
+ /**
+ * 业务策略查询流水号
+ * 格式”运营商ID+唯一编号“。27字符
+ */
+ @NotNull
+ @JsonProperty("EquipBizSeq")
+ private String equipBizSeq;
+ /**
+ * 充电设备接口编码
+ */
+ @NotNull
+ @JsonProperty("ConnectorID")
+ private String connectorID;
+}
diff --git a/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/QueryEquipBusinessPolicyResult.java b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/QueryEquipBusinessPolicyResult.java
new file mode 100644
index 0000000..9e4639c
--- /dev/null
+++ b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/QueryEquipBusinessPolicyResult.java
@@ -0,0 +1,58 @@
+package com.ruoyi.jianguan.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+import java.util.List;
+
+/**
+ * 查询业务策略信息结果
+ * @author zhibing.pu
+ * @Date 2025/1/21 16:05
+ */
+@Data
+public class QueryEquipBusinessPolicyResult {
+ /**
+ * 业务策略查询流水号
+ */
+ @NotNull
+ @JsonProperty("EquipBizSeq")
+ private String equipBizSeq;
+ /**
+ * 充电设备接口编码
+ */
+ @NotNull
+ @JsonProperty("ConnectorID")
+ private String connectorID;
+ /**
+ * 操作结果
+ * 0:成功
+ * 1:失败
+ */
+ @NotNull
+ @JsonProperty("SuccStat")
+ private Integer succStat;
+ /**
+ * 失败原因
+ * 0:无
+ * 1:此充电桩业务策略不存在
+ */
+ @NotNull
+ @JsonProperty("FailReason")
+ private Integer failReason;
+ /**
+ * 时段数N
+ * 0`32
+ */
+ @NotNull
+ @JsonProperty("SumPeriod")
+ private Integer sumPeriod;
+ /**
+ * 计策信息
+ */
+ @NotNull
+ @JsonProperty("PolicyInfos")
+ private List<PolicyInfo> policyInfos;
+
+}
diff --git a/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/QueryEquipChargeStatus.java b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/QueryEquipChargeStatus.java
new file mode 100644
index 0000000..045481b
--- /dev/null
+++ b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/QueryEquipChargeStatus.java
@@ -0,0 +1,34 @@
+package com.ruoyi.jianguan.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Null;
+
+/**
+ * 查询充电状态
+ * @author zhibing.pu
+ * @Date 2025/1/21 16:17
+ */
+@Data
+public class QueryEquipChargeStatus {
+ /**
+ * 充电订单号
+ */
+ @NotNull
+ @JsonProperty("StartChargeSeq")
+ private String startChargeSeq;
+ /**
+ * 抢号
+ */
+ @NotNull
+ @JsonProperty("ConnectorID")
+ private String connectorID;
+ /**
+ * 车辆识别码
+ */
+ @Null
+ @JsonProperty("VIN")
+ private String VIN;
+}
diff --git a/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/QueryEquipChargeStatusResult.java b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/QueryEquipChargeStatusResult.java
new file mode 100644
index 0000000..89de540
--- /dev/null
+++ b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/QueryEquipChargeStatusResult.java
@@ -0,0 +1,150 @@
+package com.ruoyi.jianguan.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Null;
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * 查询充电状态结果
+ * @author zhibing.pu
+ * @Date 2025/1/21 15:58
+ */
+@Data
+public class QueryEquipChargeStatusResult {
+ /**
+ * 充电订单号
+ */
+ @NotNull
+ @JsonProperty("StartChargeSeq")
+ private String startChargeSeq;
+ /**
+ * 充电订单状态
+ * 1:启动中
+ * 2:充电中
+ * 3:停止中
+ * 4:已结束
+ * 5:未知
+ */
+ @NotNull
+ @JsonProperty("StartChargeSeqStat")
+ private Integer startChargeSeqStat;
+ /**
+ * 充电设备接口编号
+ */
+ @NotNull
+ @JsonProperty("ConnectorID")
+ private String connectorID;
+ /**
+ * 充电设备接口状态
+ * 1:空闲
+ * 2:占用(未充电)
+ * 3:占用(充电中)
+ * 4:占用(预约锁定)
+ * 255:故障
+ */
+ @NotNull
+ @JsonProperty("ConnectorStatus")
+ private Integer connectorStatus;
+ /**
+ * A相电流
+ */
+ @NotNull
+ @JsonProperty("CurrentA")
+ private BigDecimal currentA;
+ /**
+ * B相电流
+ */
+ @Null
+ @JsonProperty("CurrentB")
+ private BigDecimal currentB;
+ /**
+ * C相电流
+ */
+ @Null
+ @JsonProperty("CurrentC")
+ private BigDecimal currentC;
+ /**
+ * A相电压
+ */
+ @NotNull
+ @JsonProperty("VoltageA")
+ private BigDecimal voltageA;
+ /**
+ * B相电压
+ */
+ @Null
+ @JsonProperty("VoltageB")
+ private BigDecimal voltageB;
+ /**
+ * C相电压
+ */
+ @Null
+ @JsonProperty("VoltageC")
+ private BigDecimal voltageC;
+ /**
+ * 电池剩余电量
+ */
+ @NotNull
+ @JsonProperty("Soc")
+ private BigDecimal soc;
+ /**
+ * 开始充电时间
+ */
+ @NotNull
+ @JsonProperty("StartTime")
+ private String startTime;
+ /**
+ * 本次采样时间
+ */
+ @NotNull
+ @JsonProperty("EndTime")
+ private String endTime;
+ /**
+ * 累计充电量
+ */
+ @NotNull
+ @JsonProperty("TotalPower")
+ private BigDecimal totalPower;
+ /**
+ * 累计电费
+ */
+ @Null
+ @JsonProperty("ElecMoney")
+ private BigDecimal elecMoney;
+ /**
+ * 累计服务费
+ */
+ @Null
+ @JsonProperty("SeviceMoney")
+ private BigDecimal seviceMoney;
+ /**
+ * 累计总金额
+ */
+ @Null
+ @JsonProperty("TotalMoney")
+ private BigDecimal totalMoney;
+ /**
+ * 时段数N
+ * 0`32
+ */
+ @Null
+ @JsonProperty("SumPeriod")
+ private Integer sumPeriod;
+ /**
+ * 充电明细信息
+ */
+ @Null
+ @JsonProperty("ChargeDetails")
+ private List<ChargeDetail> chargeDetails;
+ /**
+ * 车辆识别码
+ */
+ @Null
+ @JsonProperty("VIN")
+ private String VIN;
+
+}
diff --git a/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/QueryStartCharge.java b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/QueryStartCharge.java
new file mode 100644
index 0000000..e872e6a
--- /dev/null
+++ b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/QueryStartCharge.java
@@ -0,0 +1,47 @@
+package com.ruoyi.jianguan.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Null;
+import java.math.BigDecimal;
+
+/**
+ * 请求启动充电
+ * @author zhibing.pu
+ * @Date 2025/1/22 16:59
+ */
+@Data
+public class QueryStartCharge {
+ /**
+ * 充电订单号
+ */
+ @NotNull
+ @JsonProperty("StartChargeSeq")
+ private String startChargeSeq;
+ /**
+ * 充电设备接口编码
+ */
+ @NotNull
+ @JsonProperty("ConnectorID")
+ private String connectorID;
+ /**
+ * 二维码其他信息
+ */
+ @NotNull
+ @JsonProperty("QRCode")
+ private String QRCode;
+ /**
+ * 充电余额
+ */
+ @NotNull
+ @JsonProperty("ChargingAmt")
+ private BigDecimal chargingAmt;
+ /**
+ * 充电车牌号
+ */
+ @Null
+ @JsonProperty("PlateNum")
+ private String plateNum;
+}
diff --git a/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/QueryStartChargeResult.java b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/QueryStartChargeResult.java
new file mode 100644
index 0000000..27f66c3
--- /dev/null
+++ b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/QueryStartChargeResult.java
@@ -0,0 +1,56 @@
+package com.ruoyi.jianguan.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * 请求启动充电返回结果
+ * @author zhibing.pu
+ * @Date 2025/1/22 17:02
+ */
+@Data
+public class QueryStartChargeResult {
+ /**
+ * 充电订单号
+ */
+ @NotNull
+ @JsonProperty("StartChargeSeq")
+ private String startChargeSeq;
+ /**
+ * 充电订单状态
+ * 1:启动中
+ * 2:充电中
+ * 3:停止中
+ * 4:已结束
+ * 5:未知
+ */
+ @NotNull
+ @JsonProperty("StartChargeSeqStat")
+ private Integer startChargeSeqStat;
+ /**
+ * 充电设别接口编码
+ */
+ @NotNull
+ @JsonProperty("ConnectorID")
+ private String connectorID;
+ /**
+ * 操作结果
+ * 0:成功
+ * 1:失败
+ */
+ @NotNull
+ @JsonProperty("SuccStat")
+ private Integer succStat;
+ /**
+ * 失败原因
+ * 0:无
+ * 1:此设备不存在
+ * 2:此设备离线
+ * 3`9:自定义
+ */
+ @NotNull
+ @JsonProperty("FailReason")
+ private Integer failReason;
+}
diff --git a/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/QueryStationStats.java b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/QueryStationStats.java
new file mode 100644
index 0000000..e91f0f4
--- /dev/null
+++ b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/QueryStationStats.java
@@ -0,0 +1,35 @@
+package com.ruoyi.jianguan.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * 查询统计信息
+ * @author zhibing.pu
+ * @Date 2025/1/21 15:11
+ */
+@Data
+public class QueryStationStats {
+ /**
+ * 充电站ID
+ */
+ @NotNull
+ @JsonProperty("StationID")
+ private String stationID;
+ /**
+ * 统计开始时间
+ * yyyy-MM-dd
+ */
+ @NotNull
+ @JsonProperty("StartTime")
+ private String startTime;
+ /**
+ * 统计结束时间
+ * yyyy-MM-dd
+ */
+ @NotNull
+ @JsonProperty("EndTime")
+ private String endTime;
+}
diff --git a/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/QueryStationStatsResult.java b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/QueryStationStatsResult.java
new file mode 100644
index 0000000..0a3a8c4
--- /dev/null
+++ b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/QueryStationStatsResult.java
@@ -0,0 +1,21 @@
+package com.ruoyi.jianguan.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * 查询统计信息结果
+ * @author zhibing.pu
+ * @Date 2025/1/21 15:16
+ */
+@Data
+public class QueryStationStatsResult {
+ /**
+ * 充电站统计信息
+ */
+ @NotNull
+ @JsonProperty("StationStats")
+ private StationStatsInfo stationStats;
+}
diff --git a/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/QueryStationStatus.java b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/QueryStationStatus.java
new file mode 100644
index 0000000..9a5da17
--- /dev/null
+++ b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/QueryStationStatus.java
@@ -0,0 +1,30 @@
+package com.ruoyi.jianguan.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+import java.util.List;
+
+/**
+ * 设备接口状态查询
+ * @author zhibing.pu
+ * @Date 2025/1/21 15:01
+ */
+@Data
+public class QueryStationStatus {
+ /**
+ * 充电站ID列表
+ * 数组长度不超过50
+ */
+ @NotNull
+ @JsonProperty("StationIDs")
+ private List<String> stationIDs;
+ /**
+ * 运营商服务平台ID,字符9位
+ * 数组长度不超过50
+ */
+ @NotNull
+ @JsonProperty("OperatorID")
+ private String operatorID;
+}
diff --git a/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/QueryStationStatusResult.java b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/QueryStationStatusResult.java
new file mode 100644
index 0000000..96f9159
--- /dev/null
+++ b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/QueryStationStatusResult.java
@@ -0,0 +1,25 @@
+package com.ruoyi.jianguan.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * 设备接口状态查询返回结果
+ * @author zhibing.pu
+ * @Date 2025/1/21 15:04
+ */
+@Data
+public class QueryStationStatusResult {
+ /**
+ * 结果总数
+ */
+ @JsonProperty("Total")
+ private Integer total;
+ /**
+ * 设备接口状态列表
+ */
+ @JsonProperty("StationStatusInfos")
+ private List<StationStatusInfo> stationStatusInfos;
+}
diff --git a/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/QueryStationsInfo.java b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/QueryStationsInfo.java
new file mode 100644
index 0000000..a346b3b
--- /dev/null
+++ b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/QueryStationsInfo.java
@@ -0,0 +1,49 @@
+package com.ruoyi.jianguan.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+import javax.validation.constraints.Null;
+import java.util.List;
+
+/**
+ * @author zhibing.pu
+ * @Date 2025/1/21 14:41
+ */
+@Data
+public class QueryStationsInfo {
+ /**
+ * 上次查询时间
+ * yyyy-MM-dd HH:mm:ss
+ */
+ @Null
+ @JsonProperty("LastQueryTime")
+ private String lastQueryTime;
+ /**
+ * 查询页码
+ * 默认1
+ */
+ @Null
+ @JsonProperty("PageNo")
+ private Integer pageNo;
+ /**
+ * 每页数量
+ * 默认10
+ */
+ @Null
+ @JsonProperty("PageSize")
+ private Integer pageSize;
+ /**
+ * 运营商ID
+ */
+ @Null
+ @JsonProperty("OperatorID")
+ private String OperatorID;
+ /**
+ * 充电站ID列表
+ */
+ @Null
+ @JsonProperty("StationIDs")
+ private List<String> StationIDs;
+
+}
diff --git a/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/QueryStationsInfoResult.java b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/QueryStationsInfoResult.java
new file mode 100644
index 0000000..0c8221d
--- /dev/null
+++ b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/QueryStationsInfoResult.java
@@ -0,0 +1,40 @@
+package com.ruoyi.jianguan.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+import java.util.List;
+
+/**
+ * 公共返回结果
+ * @author zhibing.pu
+ * @Date 2025/1/21 14:44
+ */
+@Data
+public class QueryStationsInfoResult {
+ /**
+ * 当前页数
+ */
+ @NotNull
+ @JsonProperty("PageNo")
+ private Integer pageNo;
+ /**
+ * 页码总数
+ */
+ @NotNull
+ @JsonProperty("PageCount")
+ private Integer pageCount;
+ /**
+ * 总记录条数
+ */
+ @NotNull
+ @JsonProperty("ItemSize")
+ private Integer itemSize;
+ /**
+ * 充电站信息列表
+ */
+ @NotNull
+ @JsonProperty("StationInfos")
+ private List<StationInfo> stationInfos;
+}
diff --git a/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/QueryStopCharge.java b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/QueryStopCharge.java
new file mode 100644
index 0000000..c9ac309
--- /dev/null
+++ b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/QueryStopCharge.java
@@ -0,0 +1,27 @@
+package com.ruoyi.jianguan.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * 请求停止充电
+ * @author zhibing.pu
+ * @Date 2025/1/22 19:56
+ */
+@Data
+public class QueryStopCharge {
+ /**
+ * 充电订单号
+ */
+ @NotNull
+ @JsonProperty("StartChargeSeq")
+ private String startChargeSeq;
+ /**
+ * 充电设备接口编码
+ */
+ @NotNull
+ @JsonProperty("ConnectorID")
+ private String connectorID;
+}
diff --git a/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/QueryStopChargeResult.java b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/QueryStopChargeResult.java
new file mode 100644
index 0000000..db85882
--- /dev/null
+++ b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/QueryStopChargeResult.java
@@ -0,0 +1,52 @@
+package com.ruoyi.jianguan.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * 请求停止充电返回结果
+ * @author zhibing.pu
+ * @Date 2025/1/22 19:58
+ */
+@Data
+public class QueryStopChargeResult {
+ /**
+ * 充电订单号
+ */
+ @NotNull
+ @JsonProperty("StartChargeSeq")
+ private String startChargeSeq;
+ /**
+ * 充电订单状态
+ * 1:启动中
+ * 2:充电中
+ * 3:停止中
+ * 4:已结束
+ * 5:未知
+ */
+ @NotNull
+ @JsonProperty("StartChargeSeqStat")
+ private Integer startChargeSeqStat;
+ /**
+ * 操作结果
+ * 0:成功
+ * 1:失败
+ */
+ @NotNull
+ @JsonProperty("SuccStat")
+ private Integer succStat;
+ /**
+ * 失败原因
+ * 0:无
+ * 1:此设备不存在
+ * 2:此设备离线
+ * 3:此设备已停止充电
+ * 4`9:自定义
+ */
+ @NotNull
+ @JsonProperty("FailReason")
+ private Integer failReason;
+
+}
diff --git a/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/QueryToken.java b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/QueryToken.java
new file mode 100644
index 0000000..6f79085
--- /dev/null
+++ b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/QueryToken.java
@@ -0,0 +1,27 @@
+package com.ruoyi.jianguan.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * 获取token
+ * @author zhibing.pu
+ * @Date 2025/1/23 17:13
+ */
+@Data
+public class QueryToken {
+ /**
+ * 运营商标识
+ */
+ @NotNull
+ @JsonProperty("OperatorID")
+ private String operatorID;
+ /**
+ * 运营商秘钥
+ */
+ @NotNull
+ @JsonProperty("OperatorSecret")
+ private String operatorSecret;
+}
diff --git a/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/QueryTokenResult.java b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/QueryTokenResult.java
new file mode 100644
index 0000000..9708dd4
--- /dev/null
+++ b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/QueryTokenResult.java
@@ -0,0 +1,51 @@
+package com.ruoyi.jianguan.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * 获取token返回结果
+ * @author zhibing.pu
+ * @Date 2025/1/23 17:15
+ */
+@Data
+public class QueryTokenResult {
+ /**
+ * 运营商标识
+ */
+ @NotNull
+ @JsonProperty("OperatorID")
+ private String operatorID;
+ /**
+ * 成功状态
+ * 0:成功
+ * 1:失败
+ */
+ @NotNull
+ @JsonProperty("SuccStat")
+ private Integer succStat;
+ /**
+ * 获取的凭证
+ */
+ @NotNull
+ @JsonProperty("AccessToken")
+ private String accessToken;
+ /**
+ * 凭证有效期,秒
+ */
+ @NotNull
+ @JsonProperty("TokenAvailableTime")
+ private Long tokenAvailableTime;
+ /**
+ * 失败原因
+ * 0:无
+ * 1:无此运营商
+ * 2:秘钥错误
+ * 3`9自定义
+ */
+ @NotNull
+ @JsonProperty("FailReason")
+ private Integer failReason;
+}
diff --git a/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/StationInfo.java b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/StationInfo.java
new file mode 100644
index 0000000..e7bc313
--- /dev/null
+++ b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/StationInfo.java
@@ -0,0 +1,375 @@
+package com.ruoyi.jianguan.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Null;
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * 充电站信息
+ * @author zhibing.pu
+ * @Date 2025/1/21 11:54
+ */
+@Data
+public class StationInfo {
+ /**
+ * 充电站ID
+ */
+ @NotNull
+ @JsonProperty("StationID")
+ private String stationID;
+ /**
+ * 充电站唯一编码
+ */
+ @NotNull
+ @JsonProperty("StationUniqueNumber")
+ private String stationUniqueNumber;
+ /**
+ * 运营商ID
+ */
+ @NotNull
+ @JsonProperty("OperatorID")
+ private String operatorID;
+ /**
+ * 设备所属方ID
+ * 设备所属运营平台组织机构代码
+ */
+ @NotNull
+ @JsonProperty("EquipmentOwnerID")
+ private String equipmentOwnerID;
+ /**
+ * 充电站名称
+ */
+ @NotNull
+ @JsonProperty("StationName")
+ private String stationName;
+ /**
+ * 充电站国家代码
+ */
+ @NotNull
+ @JsonProperty("CountryCode")
+ private String countryCode;
+ /**
+ * 充电站省市辖区编码
+ */
+ @NotNull
+ @JsonProperty("AreaCode")
+ private String areaCode;
+ /**
+ * 充电站所在县以下行政区划代码
+ */
+ @NotNull
+ @JsonProperty("AreaCodeCountryside")
+ private String areaCodeCountryside;
+ /**
+ * 详细地址
+ */
+ @NotNull
+ @JsonProperty("Address")
+ private String address;
+ /**
+ * 站点电话
+ */
+ @Null
+ @JsonProperty("StationTel")
+ private String stationTel;
+ /**
+ * 站点电话
+ */
+ @NotNull
+ @JsonProperty("ServiceTel")
+ private String serviceTel;
+ /**
+ * 站点分类(1:充电站,2:换电站,3:充换电一体站)
+ */
+ @NotNull
+ @JsonProperty("StationClassification")
+ private Integer stationClassification;
+ /**
+ * 通用类型(1:通用,2:非通用)
+ */
+ @NotNull
+ @JsonProperty("GeneralApplicationType")
+ private Integer generalApplicationType;
+ /**
+ * 站点类型
+ */
+ @NotNull
+ @JsonProperty("StationType")
+ private Integer stationType;
+ /**
+ * 站点状态
+ */
+ @NotNull
+ @JsonProperty("StationStatus")
+ private Integer stationStatus;
+ /**
+ * 车位数量,0:未知
+ */
+ @NotNull
+ @JsonProperty("ParkNums")
+ private Integer parkNums;
+ /**
+ * 经度(保留6位小数)
+ */
+ @NotNull
+ @JsonProperty("StationLng")
+ private BigDecimal stationLng;
+ /**
+ * 纬度(保留6位小数)
+ */
+ @NotNull
+ @JsonProperty("StationLat")
+ private BigDecimal stationLat;
+ /**
+ * 站点引导
+ */
+ @Null
+ @JsonProperty("SiteGuide")
+ private String siteGuide;
+ /**
+ * 建设场所
+ */
+ @NotNull
+ @JsonProperty("Construction")
+ private Integer construction;
+ /**
+ * 站点照片
+ * 字符串数组
+ */
+ @Null
+ @JsonProperty("Pictures")
+ private List<String> pictures;
+ /**
+ * 使用车型描述
+ */
+ @Null
+ @JsonProperty("MatchCars")
+ private String matchCars;
+ /**
+ * 服务车型描述
+ */
+ @Null
+ @JsonProperty("SwapMatchCars")
+ private List<String> swapMatchCars;
+ /**
+ * 车位楼层及数量描述
+ */
+ @Null
+ @JsonProperty("ParkInfo")
+ private String parkInfo;
+ /**
+ * 营业时间
+ */
+ @Null
+ @JsonProperty("BusineHours")
+ private String busineHours;
+ /**
+ * 7*24小时营业
+ * 0:否
+ * 1:是
+ */
+ @Null
+ @JsonProperty("RoundTheClock")
+ private Integer roundTheClock;
+ /**
+ * 停车费类型
+ * 0:免费
+ * 1:不免费
+ * 2:限时免费停车
+ * 3:充电限时减免
+ * 255:参考场地实际收费标准
+ */
+ @Null
+ @JsonProperty("ParkType")
+ private Integer parkType;
+ /**
+ * 充电电费率描述
+ */
+ @Null
+ @JsonProperty("ElectricityFee")
+ private String electricityFee;
+ /**
+ * 服务费率描述
+ */
+ @Null
+ @JsonProperty("ServiceFee")
+ private String serviceFee;
+ /**
+ * 停车费率描述
+ */
+ @Null
+ @JsonProperty("ParkFee")
+ private String parkFee;
+ /**
+ * 支付方式:刷卡、线上、现金
+ */
+ @Null
+ @JsonProperty("Payment")
+ private String payment;
+ /**
+ * 是否支持预约
+ */
+ @Null
+ @JsonProperty("SupportOrder")
+ private Integer supportOrder;
+ /**
+ * 备注
+ */
+ @Null
+ @JsonProperty("Remark")
+ private String remark;
+ /**
+ * 电费类型
+ * 1:商业用电
+ * 2:普通工业用电
+ * 3:大工业用电
+ * 4:其他用电
+ */
+ @JsonProperty("ElectricityType")
+ private Integer electricityType;
+ /**
+ * 报装类型,是否独立报装
+ * 0:否
+ * 1:是
+ */
+ @JsonProperty("BusinessExpandType")
+ private Integer businessExpandType;
+ /**
+ * 报装电源容量
+ */
+ @JsonProperty("Capacity")
+ private BigDecimal capacity;
+ /**
+ * 站点额定总功率
+ */
+ @JsonProperty("RatedPower")
+ private BigDecimal ratedPower;
+ /**
+ * 峰谷分时
+ * 0:否
+ * 1:是
+ */
+ @JsonProperty("PeriodFee")
+ private Integer periodFee;
+ /**
+ * 正式投运时间 yyyy-MM-dd
+ */
+ @JsonProperty("OfficialRunTime")
+ private String officialRunTime;
+ /**
+ * 充换电站方位
+ * 1:地面-停车场
+ * 2:地面-路侧
+ * 3:地下停车场
+ * 4:立体式停车楼
+ */
+ @JsonProperty("StationOrientation")
+ private Integer stationOrientation;
+ /**
+ * 充换电站建设面积
+ */
+ @JsonProperty("StationArea")
+ private BigDecimal stationArea;
+ /**
+ * 充换电站人工值守
+ * 0:无
+ * 1:有
+ */
+ @JsonProperty("HavePerson")
+ private Integer havePerson;
+ /**
+ * 视频监控配套情况
+ * 0:无
+ * 1:有
+ */
+ @JsonProperty("VideoMonitor")
+ private Integer videoMonitor;
+ /**
+ * 周边配套设施
+ * 1:卫生间
+ * 2:便利店
+ * 3:餐厅
+ * 4:休息室
+ * 5:雨棚
+ */
+ @JsonProperty("SupportingFacilities")
+ private List<Integer> supportingFacilities;
+ /**
+ * 是否有小票机
+ * 0:无
+ * 1:有
+ */
+ @JsonProperty("PrinterFlag")
+ private Integer printerFlag;
+ /**
+ * 是否有道闸
+ * 0:无
+ * 1:有
+ */
+ @JsonProperty("BarrierFlag")
+ private Integer barrierFlag;
+ /**
+ * 是否有地锁
+ * 0:无
+ * 1:有
+ */
+ @JsonProperty("ParkingLockFlag")
+ private Integer parkingLockFlag;
+ /**
+ * 充电设备信息列表
+ */
+ @NotNull
+ @JsonProperty("EquipmentInfos")
+ private List<EquipmentInfo> equipmentInfos;
+ /**
+ * 占位费描述
+ */
+ @Null
+ @JsonProperty("OvertimeFee")
+ private String overtimeFee;
+ /**
+ * 占位费信息
+ */
+ @Null
+ @JsonProperty("PlaceHolder")
+ private PlaceHolder placeHolder;
+ /**
+ * 设备所属方名称
+ */
+ @JsonProperty("EquipmentOwnerName")
+ private String equipmentOwnerName;
+ /**
+ * 供电局用户编号
+ */
+ @JsonProperty("ResidentNo")
+ private String residentNo;
+ /**
+ * 供电类型
+ * 1:直供电
+ * 2:转供电
+ */
+ @JsonProperty("SupplyType")
+ private Integer supplyType;
+ /**
+ * 表号
+ */
+ @JsonProperty("WattHourMeterNo")
+ private String wattHourMeterNo;
+ /**
+ * 外电功率
+ */
+ @JsonProperty("ForwardPower")
+ private String forwardPower;
+ /**
+ * 充电站全省唯一备案号
+ */
+ @JsonProperty("RecordUniqueNo")
+ private String recordUniqueNo;
+
+
+
+}
diff --git a/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/StationStatsInfo.java b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/StationStatsInfo.java
new file mode 100644
index 0000000..d6ff08d
--- /dev/null
+++ b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/StationStatsInfo.java
@@ -0,0 +1,99 @@
+package com.ruoyi.jianguan.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * 充电站统计信息
+ * @author zhibing.pu
+ * @Date 2025/1/21 15:17
+ */
+@Data
+public class StationStatsInfo {
+ /**
+ * 充电站ID
+ */
+ @NotNull
+ @JsonProperty("StationID")
+ private String stationID;
+ /**
+ * 设备所属方ID
+ * 设备所属运营平台组织机构代码
+ */
+ @NotNull
+ @JsonProperty("EquipmentOwnerID")
+ private String equipmentOwnerID;
+ /**
+ * 运营商ID
+ */
+ @NotNull
+ @JsonProperty("OperatorID")
+ private String operatorID;
+ /**
+ * 站点分类 1:充电站
+ * 2:换电站
+ * 3:充换电一体站
+ */
+ @NotNull
+ @JsonProperty("StationClassification")
+ private Integer stationClassification;
+ /**
+ * 统计的开始时间
+ * yyyy-MM-dd
+ */
+ @NotNull
+ @JsonProperty("StartTime")
+ private String startTime;
+ /**
+ * 统计的结束时间
+ * yyyy-MM-dd
+ */
+ @NotNull
+ @JsonProperty("EndTime")
+ private String endTime;
+ /**
+ * 充电站累计电量 kw/h
+ */
+ @NotNull
+ @JsonProperty("StationElectricity")
+ private BigDecimal stationElectricity;
+ /**
+ * 充换电站累计
+ * 充电量
+ */
+ @NotNull
+ @JsonProperty("StationTotalChargeEnergy")
+ private BigDecimal stationTotalChargeEnergy;
+
+ /**
+ * 充换电站累计
+ * 告警数量
+ */
+ @NotNull
+ @JsonProperty("StationTotalWarningNum")
+ private Integer stationTotalWarningNum;
+ /**
+ 充换电站累计
+ 其他电量
+ */
+ @NotNull
+ @JsonProperty("StationTotalOtherEnergy")
+ private BigDecimal stationTotalOtherEnergy;
+ /**
+ 充换电站累计
+ 充电次数
+ */
+ @NotNull
+ @JsonProperty("StationTotalChargeNum")
+ private Integer stationTotalChargeNum;
+ /**
+ * 充电设备统计信息列表
+ */
+ @NotNull
+ @JsonProperty("EquipmentStatsInfos")
+ private List<EquipmentStatsInfo> equipmentStatsInfos;
+}
diff --git a/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/StationStatsInfoResult.java b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/StationStatsInfoResult.java
new file mode 100644
index 0000000..8238a1b
--- /dev/null
+++ b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/StationStatsInfoResult.java
@@ -0,0 +1,15 @@
+package com.ruoyi.jianguan.model;
+
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * 充电站统计信息
+ * @author zhibing.pu
+ * @Date 2025/1/21 15:17
+ */
+@Data
+public class StationStatsInfoResult {
+ private List<StationStatsInfo> stationStatsInfos;
+}
diff --git a/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/StationStatusInfo.java b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/StationStatusInfo.java
new file mode 100644
index 0000000..0b7274a
--- /dev/null
+++ b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/StationStatusInfo.java
@@ -0,0 +1,31 @@
+package com.ruoyi.jianguan.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+import java.util.List;
+
+/**
+ * 充电站状态信息
+ * @author zhibing.pu
+ * @Date 2025/1/21 15:07
+ */
+@Data
+public class StationStatusInfo {
+ /**
+ * 充电站ID
+ */
+ @NotNull
+ @JsonProperty("StationID")
+ private String stationID;
+ /**
+ * 充电设备接口状态列表
+ */
+ @JsonProperty("ConnectorStatusInfos")
+ private List<ConnectorStatusInfo> connectorStatusInfos;
+ @JsonProperty("OperatorID")
+ private String OperatorID;
+ @JsonProperty("EquipmentOwnerID")
+ private String EquipmentOwnerID;
+}
diff --git a/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/SupChargeOrderInfo.java b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/SupChargeOrderInfo.java
new file mode 100644
index 0000000..a85a9f6
--- /dev/null
+++ b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/SupChargeOrderInfo.java
@@ -0,0 +1,145 @@
+package com.ruoyi.jianguan.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-jianguan/src/main/java/com/ruoyi/jianguan/model/SupConnectorPowerInfo.java b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/SupConnectorPowerInfo.java
new file mode 100644
index 0000000..5cc063f
--- /dev/null
+++ b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/SupConnectorPowerInfo.java
@@ -0,0 +1,25 @@
+package com.ruoyi.jianguan.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * 充电设备接口功率信息
+ */
+@Data
+public class SupConnectorPowerInfo {
+ @JsonProperty("ConnectorID")
+
+ private String ConnectorID;
+ @JsonProperty("EquipmentClassification")
+
+ private Integer EquipmentClassification;
+ @JsonProperty("DataTime")
+
+ private String DataTime;
+ @JsonProperty("ConnectorRealTimePower")
+
+ private BigDecimal ConnectorRealTimePower;
+}
diff --git a/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/SupEquipChargeStatus.java b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/SupEquipChargeStatus.java
new file mode 100644
index 0000000..f589f79
--- /dev/null
+++ b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/SupEquipChargeStatus.java
@@ -0,0 +1,134 @@
+package com.ruoyi.jianguan.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;
+
+}
diff --git a/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/SupEquipmentPowerInfo.java b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/SupEquipmentPowerInfo.java
new file mode 100644
index 0000000..20003f2
--- /dev/null
+++ b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/SupEquipmentPowerInfo.java
@@ -0,0 +1,28 @@
+package com.ruoyi.jianguan.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * 充电设备功率信息
+ */
+@Data
+public class SupEquipmentPowerInfo {
+ @JsonProperty("EquipmentID")
+
+ private String EquipmentID;
+ @JsonProperty("EquipmentClassification")
+
+ private Integer EquipmentClassification;
+ @JsonProperty("DataTime")
+
+ private String DataTime;
+ @JsonProperty("EquipRealTimePower")
+
+ private BigDecimal EquipRealTimePower;
+ @JsonProperty("ConnectorPowerInfos")
+ private List<SupConnectorPowerInfo> ConnectorPowerInfos;
+}
diff --git a/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/SupStationInfo.java b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/SupStationInfo.java
new file mode 100644
index 0000000..fc1ba8f
--- /dev/null
+++ b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/SupStationInfo.java
@@ -0,0 +1,210 @@
+package com.ruoyi.jianguan.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.ruoyi.integration.drainage.SupSwapEquipmentInfo;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * 充换电站信息
+ */
+@Data
+public class SupStationInfo {
+ // 充换电站ID
+ @JsonProperty("StationID")
+ private String StationID;
+ // 充换电站唯一编码
+ @JsonProperty("StationUniqueNumber")
+ private String StationUniqueNumber;
+ //平台运营商
+ //ID
+ @JsonProperty("OperatorID")
+ private String OperatorID;
+ //充换电服务
+ //运营商ID
+ @JsonProperty("EquipmentOwnerID")
+ private String EquipmentOwnerID;
+ //充换电站名
+ //称
+ @JsonProperty("StationName")
+ private String StationName;
+ //充换电站国
+ //家代码
+ @JsonProperty("CountryCode")
+ private String CountryCode;
+ //充换电站省
+ //市辖区编码
+ @JsonProperty("AreaCode")
+ private String AreaCode;
+ //详细地址
+ @JsonProperty("Address")
+ private String Address;
+ //充换电站所
+ //在县以下行
+ //政区划代码
+ @JsonProperty("AreaCodeCountryside")
+ private String AreaCodeCountryside;
+ // 站点电话
+ @JsonProperty("StationTel")
+ private String StationTel;
+ // 服务电话
+ @JsonProperty("ServiceTel")
+ private String ServiceTel;
+ // 站点分类
+ @JsonProperty("StationClassification")
+ private Integer StationClassification;
+ //通用类型
+ @JsonProperty("GeneralApplicationType")
+ private Integer GeneralApplicationType;
+ //站点类型
+ @JsonProperty("StationType")
+ private Integer StationType;
+ //站点状态
+ @JsonProperty("StationStatus")
+ private Integer StationStatus;
+ //车位数量
+ @JsonProperty("ParkNums")
+ private Integer ParkNums;
+ //经度
+ @JsonProperty("StationLng")
+ private BigDecimal StationLng;
+ //纬度
+ @JsonProperty("StationLat")
+ private BigDecimal StationLat;
+ //站点引导
+ @JsonProperty("SiteGuide")
+ private String SiteGuide;
+ //建设场所
+ @JsonProperty("Construction")
+ private Integer Construction;
+ //站点照片
+ @JsonProperty("Pictures")
+ private List<String> Pictures;
+ //使用车型描
+ //述
+ @JsonProperty("MatchCars")
+ private String MatchCars;
+ //服务车型描
+ //述
+ @JsonProperty("SwapMatchCars")
+ private List<String> SwapMatchCars;
+ //车位楼层及
+ //数量描述
+ @JsonProperty("ParkInfo")
+ private String ParkInfo;
+ //营业时间
+ @JsonProperty("BusineHours")
+ private String BusineHours;
+ //7*24小时营
+ //业
+ @JsonProperty("RoundTheClock")
+ private Integer RoundTheClock;
+ //停车费类型
+ @JsonProperty("ParkType")
+ private Integer ParkType;
+ //停车费描述
+ @JsonProperty("ParkFee")
+ private String ParkFee;
+ //支付方式
+ @JsonProperty("Payment")
+ private String Payment;
+ //是否支持预
+ //约
+ @JsonProperty("SupportOrder")
+ private Integer SupportOrder;
+ //备注
+ @JsonProperty("Remark")
+ private String Remark;
+ //电费类型
+ @JsonProperty("ElectricityType")
+ private Integer ElectricityType;
+ //报装类型
+ @JsonProperty("BusinessExpandType")
+ private Integer BusinessExpandType;
+ //报装电源容
+ //量
+ @JsonProperty("Capacity")
+ private BigDecimal Capacity;
+ //站点额定总
+ //功率
+ @JsonProperty("RatedPower")
+ private BigDecimal RatedPower;
+ //峰谷分时
+ @JsonProperty("PeriodFee")
+ private Integer PeriodFee;
+ //正式投运时
+ //间
+ @JsonProperty("OfficialRunTime")
+ private String OfficialRunTime;
+ //充换电站方
+ //位
+ @JsonProperty("StationOrientation")
+ private Integer StationOrientation;
+ //充换电站建
+ //设面积
+ @JsonProperty("StationArea")
+ private BigDecimal StationArea;
+ //充换电站人
+ //工值守
+ @JsonProperty("HavePerson")
+ private Integer HavePerson;
+ //视频监控配
+ //套情况
+ @JsonProperty("VideoMonitor")
+ private Integer VideoMonitor;
+ //周边配套设
+ // 施
+ @JsonProperty("SupportingFacilities")
+ private List<Integer> SupportingFacilities;
+ //是否有小票
+ //机
+ @JsonProperty("PrinterFlag")
+ private Integer PrinterFlag;
+ //是否有道闸
+ @JsonProperty("BarrierFlag")
+ private Integer BarrierFlag;
+ //是否有地锁
+ @JsonProperty("ParkingLockFlag")
+ private Integer ParkingLockFlag;
+ //充电设备信
+ //息列表
+ @JsonProperty("EquipmentInfos")
+ private List<EquipmentInfo> EquipmentInfos;
+ //换电设备信
+ //息
+ @JsonProperty("SwapEquipmentInfos")
+ private List<SupSwapEquipmentInfo> SwapEquipmentInfos;
+ //充电电费描
+ //述
+ @JsonProperty("ElectricityFee")
+ private String ElectricityFee;
+ //设备所属方
+ //名称
+ @JsonProperty("EquipmentOwnerName")
+ private String EquipmentOwnerName;
+ //供电局用户
+ //编号
+ @JsonProperty("ResidentNo")
+ private String ResidentNo;
+ //供电类型
+ @JsonProperty("SupplyType")
+ private Integer SupplyType;
+ //表号
+ @JsonProperty("WattHourMeterNo")
+ private String WattHourMeterNo;
+ //外电功率
+ @JsonProperty("ForwardPower")
+ private BigDecimal ForwardPower;
+ //服务费描述
+ @JsonProperty("ServiceFee")
+ private String ServiceFee;
+ //充电站全省
+ //唯一备案号
+ @JsonProperty("RecordUniqueNo")
+ private String RecordUniqueNo;
+
+
+
+}
diff --git a/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/SupStationInfoResult.java b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/SupStationInfoResult.java
new file mode 100644
index 0000000..6d70a95
--- /dev/null
+++ b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/SupStationInfoResult.java
@@ -0,0 +1,16 @@
+package com.ruoyi.jianguan.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+/**
+ * 充换电站信息
+ */
+@Data
+public class SupStationInfoResult {
+ @JsonProperty("SupStationInfo")
+ private StationInfo SupStationInfo;
+
+
+
+}
diff --git a/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/SupStationPowerInfo.java b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/SupStationPowerInfo.java
new file mode 100644
index 0000000..777464f
--- /dev/null
+++ b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/SupStationPowerInfo.java
@@ -0,0 +1,31 @@
+package com.ruoyi.jianguan.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * 推送充换电站实时功率
+ */
+@Data
+public class SupStationPowerInfo {
+ @NotNull
+ @JsonProperty("OperatorID")
+ private String OperatorID;
+ @JsonProperty("EquipmentOwnerID")
+ private String EquipmentOwnerID;
+ @JsonProperty("StationID")
+ private String StationID;
+ @JsonProperty("StationClassification")
+ private Integer StationClassification;
+ @JsonProperty("DataTime")
+ private String DataTime;
+ @JsonProperty("StationRealTimePower")
+ private BigDecimal StationRealTimePower;
+ @JsonProperty("EquipmentPowerInfos")
+ private List<SupEquipmentPowerInfo> EquipmentPowerInfos;
+
+}
diff --git a/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/SupStationPowerInfoResult.java b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/SupStationPowerInfoResult.java
new file mode 100644
index 0000000..40d29ea
--- /dev/null
+++ b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/SupStationPowerInfoResult.java
@@ -0,0 +1,17 @@
+package com.ruoyi.jianguan.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 推送充换电站实时功率
+ */
+@Data
+public class SupStationPowerInfoResult implements Serializable {
+
+ @JsonProperty("SupStationPowerInfos")
+ private List<SupStationPowerInfo> SupStationPowerInfos;
+}
diff --git a/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/SuperviseQueryOperatorInfo.java b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/SuperviseQueryOperatorInfo.java
new file mode 100644
index 0000000..a3dda52
--- /dev/null
+++ b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/SuperviseQueryOperatorInfo.java
@@ -0,0 +1,22 @@
+package com.ruoyi.jianguan.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+/**
+ * @author zhibing.pu
+ * @Date 2025/2/19 9:36
+ */
+@Data
+public class SuperviseQueryOperatorInfo {
+ /**
+ * 查询页码
+ */
+ @JsonProperty("PageNo")
+ private Integer pageNo;
+ /**
+ * 每页数量
+ */
+ @JsonProperty("PageSize")
+ private Integer pageSize;
+}
diff --git a/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/SuperviseQueryOperatorInfoResult.java b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/SuperviseQueryOperatorInfoResult.java
new file mode 100644
index 0000000..3222f58
--- /dev/null
+++ b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/SuperviseQueryOperatorInfoResult.java
@@ -0,0 +1,57 @@
+package com.ruoyi.jianguan.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Null;
+
+/**
+ * @author zhibing.pu
+ * @Date 2025/2/19 9:39
+ */
+@Data
+public class SuperviseQueryOperatorInfoResult {
+ /**
+ * 运营商ID
+ */
+ @NotNull
+ @JsonProperty("OperatorID")
+ private String operatorID;
+ /**
+ * 运营商统一社会信用代码
+ */
+ @NotNull
+ @JsonProperty("OperatorUSCID")
+ private String operatorUSCID;
+ /**
+ * 运营商名称
+ */
+ @NotNull
+ @JsonProperty("OperatorName")
+ private String operatorName;
+ /**
+ * 运营商电话1
+ */
+ @NotNull
+ @JsonProperty("OperatorTel1")
+ private String operatorTel1;
+ /**
+ * 运营商电话2
+ */
+ @Null
+ @JsonProperty("OperatorTel2")
+ private String operatorTel2;
+ /**
+ * 运营商注册地址
+ */
+ @Null
+ @JsonProperty("OperatorRegAddress")
+ private String operatorRegAddress;
+ /**
+ * 备注信息
+ */
+ @Null
+ @JsonProperty("OperatorNote")
+ private String operatorNote;
+}
diff --git a/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/SuperviseQueryOperatorInfoResultPage.java b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/SuperviseQueryOperatorInfoResultPage.java
new file mode 100644
index 0000000..3eb6daa
--- /dev/null
+++ b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/model/SuperviseQueryOperatorInfoResultPage.java
@@ -0,0 +1,34 @@
+package com.ruoyi.jianguan.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @author zhibing.pu
+ * @Date 2025/2/19 9:39
+ */
+@Data
+public class SuperviseQueryOperatorInfoResultPage {
+ /**
+ * 查询页码
+ */
+ @JsonProperty("PageNo")
+ private Integer pageNo;
+ /**
+ * 每页数量
+ */
+ @JsonProperty("PageCount")
+ private Integer pageCount;
+ /**
+ * 每页数量
+ */
+ @JsonProperty("ItemSize")
+ private Integer itemSize;
+ /**
+ * 数据
+ */
+ @JsonProperty("OperatorInfos")
+ private List<SuperviseQueryOperatorInfoResult> operatorInfos;
+}
diff --git a/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/rocket/base/BaseMessage.java b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/rocket/base/BaseMessage.java
new file mode 100644
index 0000000..df2bb67
--- /dev/null
+++ b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/rocket/base/BaseMessage.java
@@ -0,0 +1,35 @@
+package com.ruoyi.jianguan.rocket.base;
+
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+/**
+ * 消息实体,所有消息都需要继承此类
+ */
+@Data
+public abstract class BaseMessage {
+ /**
+ * 业务键,用于RocketMQ控制台查看消费情况
+ */
+ protected String key;
+ /**
+ * 发送消息来源,用于排查问题
+ */
+ protected String source = "";
+
+ /**
+ * 发送时间
+ */
+ protected LocalDateTime sendTime = LocalDateTime.now();
+
+ /**
+ * 重试次数,用于判断重试次数,超过重试次数发送异常警告
+ */
+ protected Integer retryTimes = 0;
+
+ /**
+ * 服务id
+ */
+ protected String serviceId;
+}
\ No newline at end of file
diff --git a/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/rocket/base/ChargingOrderMessage.java b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/rocket/base/ChargingOrderMessage.java
new file mode 100644
index 0000000..fa8aff1
--- /dev/null
+++ b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/rocket/base/ChargingOrderMessage.java
@@ -0,0 +1,18 @@
+package com.ruoyi.jianguan.rocket.base;
+
+import lombok.Data;
+
+/**
+ * 充电桩计费模型请求
+ **/
+
+@Data
+public class ChargingOrderMessage extends BaseMessage {
+
+ private String orderNumber;// 订单编号
+ private String soc;// soc
+
+}
+
+
+
diff --git a/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/rocket/base/GunStatusMessage.java b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/rocket/base/GunStatusMessage.java
new file mode 100644
index 0000000..f9757f7
--- /dev/null
+++ b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/rocket/base/GunStatusMessage.java
@@ -0,0 +1,17 @@
+package com.ruoyi.jianguan.rocket.base;
+
+import lombok.Data;
+
+/**
+ * 充电桩计费模型请求
+ **/
+
+@Data
+public class GunStatusMessage extends BaseMessage {
+
+ private String fullNumber;// 枪完整编码
+
+}
+
+
+
diff --git a/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/rocket/base/JianGuanMessage.java b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/rocket/base/JianGuanMessage.java
new file mode 100644
index 0000000..e0691c6
--- /dev/null
+++ b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/rocket/base/JianGuanMessage.java
@@ -0,0 +1,15 @@
+package com.ruoyi.jianguan.rocket.base;
+
+import com.ruoyi.jianguan.model.ConnectorStatusInfo;
+import com.ruoyi.jianguan.model.SupChargeOrderInfo;
+import com.ruoyi.jianguan.model.SupEquipChargeStatus;
+import lombok.Data;
+
+@Data
+public class JianGuanMessage extends BaseMessage {
+ // 充电设备状态message
+ private GunStatusMessage gunStatusMessage;
+ // 推送充电订单状态/充电订单信息message
+ private ChargingOrderMessage orderMessage;
+
+}
\ No newline at end of file
diff --git a/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/rocket/configuration/EnvironmentIsolationConfig.java b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/rocket/configuration/EnvironmentIsolationConfig.java
new file mode 100644
index 0000000..0e91df7
--- /dev/null
+++ b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/rocket/configuration/EnvironmentIsolationConfig.java
@@ -0,0 +1,32 @@
+package com.ruoyi.jianguan.rocket.configuration;
+
+import org.apache.rocketmq.spring.support.DefaultRocketMQListenerContainer;
+import org.springframework.beans.BeansException;
+import org.springframework.beans.factory.config.BeanPostProcessor;
+import org.springframework.util.StringUtils;
+
+public class EnvironmentIsolationConfig implements BeanPostProcessor {
+ private RocketEnhanceProperties rocketEnhanceProperties;
+
+ public EnvironmentIsolationConfig(RocketEnhanceProperties rocketEnhanceProperties) {
+ this.rocketEnhanceProperties = rocketEnhanceProperties;
+ }
+
+
+ /**
+ * 在装载Bean之前实现参数修改
+ */
+ @Override
+ public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
+ if (bean instanceof DefaultRocketMQListenerContainer) {
+
+ DefaultRocketMQListenerContainer container = (DefaultRocketMQListenerContainer) bean;
+
+ if (rocketEnhanceProperties.isEnabledIsolation() && StringUtils.hasText(rocketEnhanceProperties.getEnvironment())) {
+ container.setTopic(String.join("_", container.getTopic(), rocketEnhanceProperties.getEnvironment()));
+ }
+ return container;
+ }
+ return bean;
+ }
+}
diff --git a/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/rocket/configuration/RocketEnhanceProperties.java b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/rocket/configuration/RocketEnhanceProperties.java
new file mode 100644
index 0000000..993b6eb
--- /dev/null
+++ b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/rocket/configuration/RocketEnhanceProperties.java
@@ -0,0 +1,13 @@
+package com.ruoyi.jianguan.rocket.configuration;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+
+@ConfigurationProperties(prefix = "rocketmq.enhance")
+@Data
+public class RocketEnhanceProperties {
+
+ private boolean enabledIsolation;
+
+ private String environment;
+}
diff --git a/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/rocket/configuration/RocketMQEnhanceAutoConfiguration.java b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/rocket/configuration/RocketMQEnhanceAutoConfiguration.java
new file mode 100644
index 0000000..cf6cc31
--- /dev/null
+++ b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/rocket/configuration/RocketMQEnhanceAutoConfiguration.java
@@ -0,0 +1,61 @@
+package com.ruoyi.jianguan.rocket.configuration;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
+import com.ruoyi.jianguan.rocket.util.RocketMQEnhanceTemplate;
+import org.apache.rocketmq.spring.core.RocketMQTemplate;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Primary;
+import org.springframework.messaging.converter.CompositeMessageConverter;
+import org.springframework.messaging.converter.MappingJackson2MessageConverter;
+import org.springframework.messaging.converter.MessageConverter;
+
+import java.util.List;
+
+@Configuration
+@EnableConfigurationProperties(RocketEnhanceProperties.class)
+public class RocketMQEnhanceAutoConfiguration {
+
+ /**
+ * 注入增强的RocketMQEnhanceTemplate
+ */
+ @Bean
+ public RocketMQEnhanceTemplate rocketMQEnhanceTemplate(RocketMQTemplate rocketMQTemplate){
+ return new RocketMQEnhanceTemplate(rocketMQTemplate);
+ }
+
+ /**
+ * 解决RocketMQ Jackson不支持Java时间类型配置
+ * 源码参考:{@link org.apache.rocketmq.spring.autoconfigure}
+ */
+ @Bean
+ @Primary
+ public RocketMQMessageConverter enhanceRocketMQMessageConverter(){
+ RocketMQMessageConverter converter = new RocketMQMessageConverter();
+ CompositeMessageConverter compositeMessageConverter = (CompositeMessageConverter) converter.getMessageConverter();
+ List<MessageConverter> messageConverterList = compositeMessageConverter.getConverters();
+ for (MessageConverter messageConverter : messageConverterList) {
+ if(messageConverter instanceof MappingJackson2MessageConverter){
+ MappingJackson2MessageConverter jackson2MessageConverter = (MappingJackson2MessageConverter) messageConverter;
+ ObjectMapper objectMapper = jackson2MessageConverter.getObjectMapper();
+ objectMapper.registerModules(new JavaTimeModule());
+ }
+ }
+ return converter;
+ }
+
+
+ /**
+ * 环境隔离配置
+ */
+ @Bean
+ @ConditionalOnProperty(name="rocketmq.enhance.enabledIsolation", havingValue="true")
+ public EnvironmentIsolationConfig environmentSetup(RocketEnhanceProperties rocketEnhanceProperties){
+ return new EnvironmentIsolationConfig(rocketEnhanceProperties);
+ }
+
+}
+
diff --git a/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/rocket/configuration/RocketMQMessageConverter.java b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/rocket/configuration/RocketMQMessageConverter.java
new file mode 100644
index 0000000..96c87a7
--- /dev/null
+++ b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/rocket/configuration/RocketMQMessageConverter.java
@@ -0,0 +1,46 @@
+package com.ruoyi.jianguan.rocket.configuration;
+
+import org.springframework.messaging.converter.*;
+import org.springframework.util.ClassUtils;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class RocketMQMessageConverter {
+
+ private static final boolean JACKSON_PRESENT;
+ private static final boolean FASTJSON_PRESENT;
+
+ static {
+ ClassLoader classLoader = RocketMQMessageConverter.class.getClassLoader();
+ JACKSON_PRESENT = ClassUtils.isPresent("com.fasterxml.jackson,databind.ObjectMapper", classLoader)
+ && ClassUtils.isPresent("com.fasterxml.jackson.core.JsonGenerator", classLoader);
+ FASTJSON_PRESENT = ClassUtils.isPresent("com.alibaba.fastjson.JSON", classLoader)
+ && ClassUtils.isPresent("com.alibaba.fastjson.support.config.FastJsonConfig", classLoader);
+ }
+ private final CompositeMessageConverter messageConverter;
+
+ public RocketMQMessageConverter(){
+ List<MessageConverter> messageConverters = new ArrayList<>();
+ ByteArrayMessageConverter byteArrayMessageConverter = new ByteArrayMessageConverter();
+ byteArrayMessageConverter.setContentTypeResolver(null);
+ messageConverters.add(byteArrayMessageConverter);
+ messageConverters.add(new StringMessageConverter());
+ if (JACKSON_PRESENT) {
+ messageConverters.add(new MappingJackson2MessageConverter());
+ }
+ if(FASTJSON_PRESENT) {
+ try {
+ messageConverters.add(
+ (MessageConverter) ClassUtils.forName(
+ "com.alibaba.fastjson.support.spring.messaging.MappingFastJsonMessageConverter", ClassUtils.getDefaultClassLoader()).newInstance());
+ } catch (ClassNotFoundException | IllegalAccessException | InstantiationException ignored) {
+
+ }
+ }
+ messageConverter = new CompositeMessageConverter(messageConverters);
+ }
+
+ public MessageConverter getMessageConverter(){ return messageConverter; }
+
+}
diff --git a/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/rocket/constant/EnhanceMessageConstant.java b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/rocket/constant/EnhanceMessageConstant.java
new file mode 100644
index 0000000..dc2e413
--- /dev/null
+++ b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/rocket/constant/EnhanceMessageConstant.java
@@ -0,0 +1,14 @@
+package com.ruoyi.jianguan.rocket.constant;
+
+public class EnhanceMessageConstant {
+
+ /**
+ * 延时等级
+ */
+ public static final int FIVE_SECOND=5000;
+ /**
+ * 消息前缀
+ */
+ public static final String RETRY_PREFIX="retry_";
+
+}
diff --git a/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/rocket/produce/ChargingMessageListener.java b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/rocket/produce/ChargingMessageListener.java
new file mode 100644
index 0000000..bb68198
--- /dev/null
+++ b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/rocket/produce/ChargingMessageListener.java
@@ -0,0 +1,262 @@
+package com.ruoyi.jianguan.rocket.produce;
+
+import com.ruoyi.chargingPile.api.feignClient.AccountingStrategyDetailClient;
+import com.ruoyi.chargingPile.api.feignClient.ChargingGunClient;
+import com.ruoyi.chargingPile.api.feignClient.ChargingPileClient;
+import com.ruoyi.chargingPile.api.model.TChargingGun;
+import com.ruoyi.integration.api.model.*;
+import com.ruoyi.jianguan.model.ConnectorStatusInfo;
+import com.ruoyi.jianguan.model.SupChargeOrderInfo;
+import com.ruoyi.jianguan.model.SupEquipChargeStatus;
+import com.ruoyi.jianguan.rocket.base.ChargingOrderMessage;
+import com.ruoyi.jianguan.rocket.base.GunStatusMessage;
+import com.ruoyi.jianguan.rocket.base.JianGuanMessage;
+import com.ruoyi.jianguan.rocket.util.EnhanceMessageHandler;
+import com.ruoyi.jianguan.util.SendTagConstant;
+import com.ruoyi.jianguan.util.TCECSuperviseUtil;
+import com.ruoyi.order.api.feignClient.ChargingOrderClient;
+import com.ruoyi.order.api.model.TChargingOrder;
+import com.ruoyi.other.api.domain.Operator;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.rocketmq.spring.annotation.MessageModel;
+import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
+import org.apache.rocketmq.spring.core.RocketMQListener;
+import org.springframework.beans.BeanUtils;
+import org.springframework.cloud.stream.annotation.StreamListener;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.stereotype.Component;
+import org.springframework.util.StringUtils;
+
+import javax.annotation.Resource;
+import java.math.BigDecimal;
+import java.text.SimpleDateFormat;
+import java.time.format.DateTimeFormatter;
+import java.util.Date;
+
+@Slf4j
+@Component
+@RocketMQMessageListener(
+ messageModel = MessageModel.CLUSTERING,
+ consumerGroup = "jianguan_message",
+ topic = "jianguan_message",
+ selectorExpression = "jianguan_message",
+ consumeThreadMax = 64 //默认是64个线程并发消息,配置 consumeThreadMax 参数指定并发消费线程数,避免太大导致资源不够
+)
+public class ChargingMessageListener extends EnhanceMessageHandler<JianGuanMessage> implements RocketMQListener<JianGuanMessage> {
+
+ @Resource
+ private ChargingOrderClient chargingOrderClient;
+ @Resource
+ private AccountingStrategyDetailClient accountingStrategyDetailClient;
+
+ @Resource
+ private ChargingPileClient chargingPileClient;
+ @Resource
+ private ChargingGunClient chargingGunClient;
+
+ @Resource
+ private RedisTemplate redisTemplate;
+ @Resource
+ private TCECSuperviseUtil tcecSuperviseUtil;
+
+ private final static String operatorId = "906171535";
+
+ @StreamListener("input")
+ @Override
+ protected void handleMessage(JianGuanMessage message) throws Exception {
+ log.info("rocket收到的消息内容:{}", message);
+ String serviceId = message.getServiceId();
+ if (!StringUtils.hasLength(serviceId)) {
+ return;
+ }
+ log.info("rocket收到的消息内容:{} {}", serviceId, message);
+ switch (serviceId) {
+ case SendTagConstant.GUN_STATUS:
+ GunStatusMessage gunStatusMessage = message.getGunStatusMessage();
+ log.info("推送充电设备接口状态:{}", gunStatusMessage);
+ TChargingGun chargingGun = chargingGunClient.getChargingGunByFullNumber(gunStatusMessage.getFullNumber()).getData();
+ if (chargingGun!=null){
+ ConnectorStatusInfo connectorStatusInfo = new ConnectorStatusInfo();
+ connectorStatusInfo.setOperatorID(operatorId);
+ connectorStatusInfo.setEquipmentOwnerID(operatorId);
+ connectorStatusInfo.setStationID(String.valueOf(chargingGun.getSiteId()));
+ connectorStatusInfo.setEquipmentID(String.valueOf(chargingGun.getChargingPileId()));
+ connectorStatusInfo.setConnectorID(chargingGun.getFullNumber());
+ if (chargingGun.getEquipmentClassification()!=null){
+ connectorStatusInfo.setEquipmentClassification(chargingGun.getEquipmentClassification());
+ }else {
+ 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()));
+ tcecSuperviseUtil.notificationStationStatus(new Operator(), connectorStatusInfo);
+ }
+
+ break;
+ case SendTagConstant.ORDER_INFO:
+ ChargingOrderMessage orderInfoMessage = message.getOrderMessage();
+ log.info("推送充电订单信息:{}", orderInfoMessage);
+ TChargingOrder chargingOrder1 = chargingOrderClient.getOrderByCode(orderInfoMessage.getOrderNumber()).getData();
+ SupChargeOrderInfo supChargeOrderInfo = new SupChargeOrderInfo();
+ supChargeOrderInfo.setOperatorID(operatorId);
+ supChargeOrderInfo.setEquipmentOwnerID(operatorId);
+ supChargeOrderInfo.setStationID(String.valueOf(chargingOrder1.getSiteId()));
+ supChargeOrderInfo.setEquipmentID(String.valueOf(chargingOrder1.getChargingPileId()));
+ supChargeOrderInfo.setOrderNo(operatorId+chargingOrder1.getCode());
+ TChargingGun chargingGun1 = chargingGunClient.getChargingGunById(chargingOrder1.getChargingGunId()).getData();
+ supChargeOrderInfo.setConnectorID(chargingGun1.getFullNumber());
+ supChargeOrderInfo.setEquipmentClassification(1);
+ supChargeOrderInfo.setPushTimeStamp(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
+ supChargeOrderInfo.setStartTime(chargingOrder1.getStartTime() != null ? chargingOrder1.getStartTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")) : "");
+ supChargeOrderInfo.setEndTime(chargingOrder1.getEndTime() != null ? chargingOrder1.getEndTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")) : "");
+ supChargeOrderInfo.setTotalPower(chargingOrder1.getElectrovalence());
+ supChargeOrderInfo.setTotalElecMoney(chargingOrder1.getElectrovalence());
+ supChargeOrderInfo.setTotalServiceMoney(chargingOrder1.getServiceCharge());
+ supChargeOrderInfo.setTotalMoney(chargingOrder1.getOrderAmount());
+ switch (chargingOrder1.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;
+ }
+ tcecSuperviseUtil.notificationChargeOrderInfo(new Operator(), supChargeOrderInfo);
+ break;
+ case SendTagConstant.ORDER_STATUS:
+ ChargingOrderMessage orderStatusMessage = message.getOrderMessage();
+ log.info("推送充电订单状态:{}", orderStatusMessage);
+ TChargingOrder chargingOrder2 = chargingOrderClient.getOrderByCode(orderStatusMessage.getOrderNumber()).getData();
+ SupEquipChargeStatus supEquipChargeStatus = new SupEquipChargeStatus();
+ supEquipChargeStatus.setOperatorID(operatorId);
+ supEquipChargeStatus.setEquipmentOwnerID(operatorId);
+ supEquipChargeStatus.setStationID(String.valueOf(chargingOrder2.getSiteId()));
+ supEquipChargeStatus.setEquipmentID(String.valueOf(chargingOrder2.getChargingPileId()));
+ supEquipChargeStatus.setOrderNo(operatorId+chargingOrder2.getCode());
+ switch (chargingOrder2.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 chargingGun2 = chargingGunClient.getChargingGunById(chargingOrder2.getChargingGunId()).getData();
+ supEquipChargeStatus.setConnectorID(chargingGun2.getFullNumber());
+ supEquipChargeStatus.setEquipmentClassification(1);
+ supEquipChargeStatus.setPushTimeStamp(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
+ switch (chargingGun2.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(chargingOrder2.getCurrent());
+
+ supEquipChargeStatus.setSOC(StringUtils.hasLength(orderStatusMessage.getSoc())?new BigDecimal(orderStatusMessage.getSoc()):new BigDecimal("1"));
+ supEquipChargeStatus.setStartTime(chargingOrder2.getStartTime() != null ? chargingOrder2.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(chargingOrder2.getElectrovalence());
+ tcecSuperviseUtil.notificationSupEquipChargeStatus(new Operator(), supEquipChargeStatus);
+ break;
+ }
+ }
+
+ @Override
+ protected void handleMaxRetriesExceeded(JianGuanMessage message) {
+ // 当超过指定重试次数消息时此处方法会被调用
+ // 生产中可以进行回退或其他业务操作
+ log.error("消息消费失败,请执行后续处理");
+ }
+
+
+ /**
+ * 是否执行重试机制
+ */
+ @Override
+ protected boolean isRetry() {
+ return true;
+ }
+
+ @Override
+ protected boolean throwException() {
+ // 是否抛出异常,false搭配retry自行处理异常
+ return false;
+ }
+
+ /**
+ * 若需要处理消息过滤,在父级中进行统一处理,或者在此处实现之后,自行处理
+ *
+ * @param message 待处理消息
+ * @return true: 本次消息被过滤,false:不过滤
+ */
+ @Override
+ protected boolean filter(JianGuanMessage message) {
+ // 此处可做消息过滤
+ return false;
+ }
+
+ /**
+ * 监听消费消息,不需要执行业务处理,委派给父类做基础操作,父类做完基础操作后会调用子类的实际处理类型
+ */
+ @Override
+ public void onMessage(JianGuanMessage message) {
+ super.dispatchMessage(message);
+ }
+
+}
\ No newline at end of file
diff --git a/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/rocket/util/EnhanceMessageHandler.java b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/rocket/util/EnhanceMessageHandler.java
new file mode 100644
index 0000000..13080a8
--- /dev/null
+++ b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/rocket/util/EnhanceMessageHandler.java
@@ -0,0 +1,151 @@
+package com.ruoyi.jianguan.rocket.util;
+
+import com.alibaba.fastjson.JSONObject;
+import com.ruoyi.jianguan.rocket.base.BaseMessage;
+import com.ruoyi.jianguan.rocket.constant.EnhanceMessageConstant;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.rocketmq.client.producer.SendResult;
+import org.apache.rocketmq.client.producer.SendStatus;
+import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
+
+import javax.annotation.Resource;
+
+@Slf4j
+public abstract class EnhanceMessageHandler<T extends BaseMessage> {
+ /**
+ * 默认重试次数
+ */
+ private static final int MAX_RETRY_TIMES = 3;
+
+ /**
+ * 延时等级
+ */
+ private static final int DELAY_LEVEL = EnhanceMessageConstant.FIVE_SECOND;
+
+
+ @Resource
+ private RocketMQEnhanceTemplate rocketMQEnhanceTemplate;
+
+ /**
+ * 消息处理
+ *
+ * @param message 待处理消息
+ * @throws Exception 消费异常
+ */
+ protected abstract void handleMessage(T message) throws Exception;
+
+ /**
+ * 超过重试次数消息,需要启用isRetry
+ *
+ * @param message 待处理消息
+ */
+ protected abstract void handleMaxRetriesExceeded(T message);
+
+
+ /**
+ * 是否需要根据业务规则过滤消息,去重逻辑可以在此处处理
+ * @param message 待处理消息
+ * @return true: 本次消息被过滤,false:不过滤
+ */
+ protected boolean filter(T message) {
+ return false;
+ }
+
+
+ /**
+ * 是否异常时重复发送
+ *
+ * @return true: 消息重试,false:不重试
+ */
+ protected abstract boolean isRetry();
+
+ /**
+ * 消费异常时是否抛出异常
+ * 返回true,则由rocketmq机制自动重试
+ * false:消费异常(如果没有开启重试则消息会被自动ack)
+ */
+ protected abstract boolean throwException();
+
+ /**
+ * 最大重试次数
+ *
+ * @return 最大重试次数,默认5次
+ */
+ protected int getMaxRetryTimes() {
+ return MAX_RETRY_TIMES;
+ }
+
+ /**
+ * isRetry开启时,重新入队延迟时间
+ * @return -1:立即入队重试
+ */
+ protected int getDelayLevel() {
+ return DELAY_LEVEL;
+ }
+
+ /**
+ * 使用模板模式构建消息消费框架,可自由扩展或删减
+ */
+ public void dispatchMessage(T message) {
+ // 基础日志记录被父类处理了
+ log.info("消费者收到消息[{}]", JSONObject.toJSON(message));
+
+ if (filter(message)) {
+ log.info("消息id{}不满足消费条件,已过滤。",message.getKey());
+ return;
+ }
+ // 超过最大重试次数时调用子类方法处理
+ if (message.getRetryTimes() > getMaxRetryTimes()) {
+ handleMaxRetriesExceeded(message);
+ return;
+ }
+ try {
+ long now = System.currentTimeMillis();
+ handleMessage(message);
+ long costTime = System.currentTimeMillis() - now;
+ log.info("消息{}消费成功,耗时[{}ms]", message.getKey(),costTime);
+ } catch (Exception e) {
+ log.error("消息{}消费异常", message.getKey(),e);
+ // 是捕获异常还是抛出,由子类决定
+ if (throwException()) {
+ //抛出异常,由DefaultMessageListenerConcurrently类处理
+ throw new RuntimeException(e);
+ }
+ //此时如果不开启重试机制,则默认ACK了
+ if (isRetry()) {
+ handleRetry(message);
+ }
+ }
+ }
+
+ protected void handleRetry(T message) {
+ // 获取子类RocketMQMessageListener注解拿到topic和tag
+ RocketMQMessageListener annotation = this.getClass().getAnnotation(RocketMQMessageListener.class);
+ if (annotation == null) {
+ return;
+ }
+ //重新构建消息体
+ String messageSource = message.getSource();
+ if(!messageSource.startsWith(EnhanceMessageConstant.RETRY_PREFIX)){
+ message.setSource(EnhanceMessageConstant.RETRY_PREFIX + messageSource);
+ }
+ message.setRetryTimes(message.getRetryTimes() + 1);
+
+ SendResult sendResult;
+
+ try {
+ // 如果消息发送不成功,则再次重新发送,如果发送异常则抛出由MQ再次处理(异常时不走延迟消息)
+ sendResult = rocketMQEnhanceTemplate.send(annotation.topic(), annotation.selectorExpression(), message, getDelayLevel());
+ } catch (Exception ex) {
+ // 此处捕获之后,相当于此条消息被消息完成然后重新发送新的消息
+ //由生产者直接发送
+ throw new RuntimeException(ex);
+ }
+ // 发送失败的处理就是不进行ACK,由RocketMQ重试
+ if (sendResult.getSendStatus() != SendStatus.SEND_OK) {
+ throw new RuntimeException("重试消息发送失败");
+ }
+
+ }
+
+}
\ No newline at end of file
diff --git a/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/rocket/util/RocketMQEnhanceTemplate.java b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/rocket/util/RocketMQEnhanceTemplate.java
new file mode 100644
index 0000000..d27c69e
--- /dev/null
+++ b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/rocket/util/RocketMQEnhanceTemplate.java
@@ -0,0 +1,82 @@
+package com.ruoyi.jianguan.rocket.util;
+
+import com.alibaba.fastjson.JSONObject;
+import com.ruoyi.jianguan.rocket.base.BaseMessage;
+import com.ruoyi.jianguan.rocket.configuration.RocketEnhanceProperties;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.rocketmq.client.producer.SendResult;
+import org.apache.rocketmq.spring.core.RocketMQTemplate;
+import org.apache.rocketmq.spring.support.RocketMQHeaders;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.messaging.Message;
+import org.springframework.messaging.support.MessageBuilder;
+import org.springframework.util.StringUtils;
+
+import javax.annotation.Resource;
+
+@Slf4j
+@RequiredArgsConstructor(onConstructor = @__(@Autowired))
+public class RocketMQEnhanceTemplate {
+ private final RocketMQTemplate template;
+
+ @Resource
+ private RocketEnhanceProperties rocketEnhanceProperties;
+
+ public RocketMQTemplate getTemplate() {
+ return template;
+ }
+
+ /**
+ * 根据系统上下文自动构建隔离后的topic
+ * 构建目的地
+ */
+ public String buildDestination(String topic, String tag) {
+ topic = reBuildTopic(topic);
+ return topic + ":" + tag;
+ }
+
+ /**
+ * 根据环境重新隔离topic
+ * @param topic 原始topic
+ */
+ private String reBuildTopic(String topic) {
+ if(rocketEnhanceProperties.isEnabledIsolation() && StringUtils.hasText(rocketEnhanceProperties.getEnvironment())){
+ return topic +"_" + rocketEnhanceProperties.getEnvironment();
+ }
+ return topic;
+ }
+
+ /**
+ * 发送同步消息
+ */
+ public <T extends BaseMessage> SendResult send(String topic, String tag, T message) {
+ // 注意分隔符
+ return send(buildDestination(topic,tag), message);
+ }
+
+
+ public <T extends BaseMessage> SendResult send(String destination, T message) {
+ // 设置业务键,此处根据公共的参数进行处理
+ // 更多的其它基础业务处理...
+ Message<T> sendMessage = MessageBuilder.withPayload(message).setHeader(RocketMQHeaders.TAGS, message.getKey()).build();
+ SendResult sendResult = template.syncSend(destination, sendMessage);
+ // 此处为了方便查看给日志转了json,根据选择选择日志记录方式,例如ELK采集
+ log.info("[{}]同步消息[{}]发送结果[{}]", destination, JSONObject.toJSON(message), JSONObject.toJSON(sendResult));
+ return sendResult;
+ }
+
+ /**
+ * 发送延迟消息
+ */
+ public <T extends BaseMessage> SendResult send(String topic, String tag, T message, int delayLevel) {
+ return send(buildDestination(topic,tag), message, delayLevel);
+ }
+
+ public <T extends BaseMessage> SendResult send(String destination, T message, int delayLevel) {
+ Message<T> sendMessage = MessageBuilder.withPayload(message).setHeader(RocketMQHeaders.TAGS, message.getKey()).build();
+ SendResult sendResult = template.syncSend(destination, sendMessage, 3000, delayLevel);
+ log.info("[{}]延迟等级[{}]消息[{}]发送结果[{}]", destination, delayLevel, JSONObject.toJSON(message), JSONObject.toJSON(sendResult));
+ return sendResult;
+ }
+}
\ No newline at end of file
diff --git a/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/util/AESUtil.java b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/util/AESUtil.java
new file mode 100644
index 0000000..cc9b7c4
--- /dev/null
+++ b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/util/AESUtil.java
@@ -0,0 +1,107 @@
+package com.ruoyi.jianguan.util;
+
+
+import com.ruoyi.common.core.utils.StringUtils;
+import org.springframework.util.Base64Utils;
+
+import javax.crypto.Cipher;
+import javax.crypto.spec.IvParameterSpec;
+import javax.crypto.spec.SecretKeySpec;
+
+/**
+ * 定义AES加密解密工具类
+ */
+public class AESUtil {
+
+ private static final String KEY_ALGORITHM = "AES";//加密方式
+
+ private static final String DEFAULT_CIPHER_ALGORITHM = "AES/CBC/PKCS5Padding";//默认的加密算法
+
+ private static final String KEY = "1234567890abcdef";//密码
+
+ private static final String IV_PARAMETER = "1234567890abcdef";//偏移量
+
+ private static final String CHARSET = "UTF-8";//编码
+
+
+
+ /**
+ * 加密操作
+ * @param content 待加密内容
+ * @return
+ * @throws Exception
+ */
+ public static String encrypt(String content) {
+ return encrypt(content, KEY, IV_PARAMETER);
+ }
+
+
+
+ /**
+ * 加密操作
+ * @param content 待加密内容
+ * @return
+ * @throws Exception
+ */
+ public static String encrypt(String content, String key, String iv_parameter) {
+ try {
+ if(StringUtils.isEmpty(content)){
+ return content;
+ }
+ Cipher cipher = Cipher.getInstance(DEFAULT_CIPHER_ALGORITHM);
+ byte[] raw = key.getBytes(CHARSET);
+ SecretKeySpec skeySpec = new SecretKeySpec(raw, KEY_ALGORITHM);
+ IvParameterSpec iv = new IvParameterSpec(iv_parameter.getBytes());
+ cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv);
+ byte[] encrypted = cipher.doFinal(content.getBytes(CHARSET));
+ return Base64Utils.encodeToString(encrypted);
+ }catch (Exception e){
+ e.printStackTrace();
+ }
+ return null;
+ }
+
+
+ public static String decrypt(String content) {
+ return decrypt(content, KEY, IV_PARAMETER);
+ }
+
+
+
+
+
+ /**
+ *解密操作
+ * @param content 待解密内容
+ * @return
+ * @throws Exception
+ */
+ public static String decrypt(String content, String key, String iv_parameter) {
+ try {
+ if(StringUtils.isEmpty(content)){
+ return content;
+ }
+ byte[] raw = key.getBytes(CHARSET);
+ SecretKeySpec skeySpec = new SecretKeySpec(raw, KEY_ALGORITHM);
+ Cipher cipher = Cipher.getInstance(DEFAULT_CIPHER_ALGORITHM);
+ IvParameterSpec iv = new IvParameterSpec(iv_parameter.getBytes());
+ cipher.init(Cipher.DECRYPT_MODE, skeySpec, iv);
+
+ byte[] encrypted1 = Base64Utils.decodeFromString(content);
+ byte[] original = cipher.doFinal(encrypted1);
+ String originalString = new String(original, CHARSET);
+ return originalString;
+ } catch (Exception ex) {
+ ex.printStackTrace();
+ }
+ return null;
+ }
+
+
+ public static void main(String[] ages){
+// String encrypt = AESUtil.encrypt("{\"OperatorSecret\":\"cn51EeFQDTSMsn11R1ZNsYSEYBxDYcKK\",\"OperatorID\":\"MA25CNM38\"}", "YPFVz1OvAS4nSwLW", "5tLoP60aR9QUB5Mx");
+// System.err.println(encrypt);
+ String travel = AESUtil.decrypt("9gVnNqAh9O7IuqqbyD8G1ukK86O3g0bUBLzM1LJL060bNjPJCtW0wWRjr756abxIm+nOuKkjMy7/DYScMcnl2KSYJJJb6Xc4Aza8L24Mp/UKQyW6Fe9m+ThDVUfMwvn7U2OxHDXniBUdmpNi2Ex9uHa/R18H2ka0DCv/bKCm/F4KTfz48Et/1L64JTTmj7l4the0Wr7KGiVewPIEE03LF5lF+h9j0W8czC6Gx5UJOMU=", "YPFVz1OvAS4nSwLW", "5tLoP60aR9QUB5Mx");
+ System.err.println(travel);
+ }
+}
diff --git a/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/util/AesEncryption.java b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/util/AesEncryption.java
new file mode 100644
index 0000000..793d902
--- /dev/null
+++ b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/util/AesEncryption.java
@@ -0,0 +1,55 @@
+package com.ruoyi.jianguan.util;
+
+import javax.crypto.Cipher;
+import javax.crypto.spec.IvParameterSpec;
+import javax.crypto.spec.SecretKeySpec;
+import java.util.Base64;
+
+/**
+ * 充电桩交互的数据的加密解密
+ */
+public class AesEncryption {
+
+ /**
+ * 加密
+ * @param key
+ * @param iv
+ * @param data
+ * @return
+ */
+ public static String encrypt(String key, String iv, String data) {
+ try {
+ Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
+ SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes(), "AES");
+ IvParameterSpec ivParameterSpec = new IvParameterSpec(iv.getBytes());
+ cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, ivParameterSpec);
+ byte[] encrypted = cipher.doFinal(data.getBytes());
+ return Base64.getEncoder().encodeToString(encrypted);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ return null;
+ }
+
+ /**
+ * 解密
+ * @param key
+ * @param iv
+ * @param encryptedData
+ * @return
+ */
+ public static String decrypt(String key, String iv, String encryptedData) {
+ try {
+ Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
+ SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes(), "AES");
+ IvParameterSpec ivParameterSpec = new IvParameterSpec(iv.getBytes());
+ cipher.init(Cipher.DECRYPT_MODE, secretKeySpec, ivParameterSpec);
+ byte[] decrypted = cipher.doFinal(Base64.getDecoder().decode(encryptedData));
+ return new String(decrypted);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ return null;
+ }
+
+}
\ No newline at end of file
diff --git a/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/util/HMacMD5Util.java b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/util/HMacMD5Util.java
new file mode 100644
index 0000000..9542d3c
--- /dev/null
+++ b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/util/HMacMD5Util.java
@@ -0,0 +1,122 @@
+package com.ruoyi.jianguan.util;
+
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+
+public class HMacMD5Util {
+
+ /**
+ * 加签
+ * @param operatorId
+ * @param timeStamp
+ * @param data
+ * @param seq
+ * @param SigSecret
+ * @return
+ */
+ public static String getHMacMD5(String operatorId,String timeStamp, String data, String seq,String SigSecret) {
+ String m = new StringBuilder(operatorId).append(data).append(timeStamp).append(seq).toString();
+ byte[] macMD5 = HMacMD5Util.getHMacMD5Bytes(SigSecret.getBytes(), m.getBytes());
+ return HMacMD5Util.bytesToHexString(macMD5);
+ }
+
+
+ /**
+ * HmacMd5的计算公式为:HMAC(K,M) = H(K⊕opad∣H(K⊕ipad∣M))
+ * 其中:K是密钥(byte[] key),长度可为64字节(后面涉及描述都是以字节byte进行),若小于该长度,在密钥后面用0(即0x00)补齐。
+ * M是消息内容(byte[] m);
+ * H是散列函数(此处采用MD5);
+ * opad和ipad分别是由若干个0x5c和0x36组成的字符串;
+ * ⊕表示异或运算;
+ * ∣表示连接操作。
+ **/
+ private static byte[] getHMacMD5Bytes(byte[] key, byte[] m) {
+ try {
+ //定义长度
+ int length = 64;
+ //定义opad和ipad
+ byte[] opad = new byte[length];
+ byte[] ipad = new byte[length];
+ for (int i = 0; i < 64; i++) {
+ opad[i] = 0x5C;
+ ipad[i] = 0x36;
+ }
+ byte[] actualKey = key;
+ byte[] keyArr = new byte[length];
+ //如果密钥长度,大于64字节,就使用MD5算法计算其散列值,作为密钥
+ if (key.length > length) {
+ actualKey = md5(key);
+ }
+ for (int i = 0; i < actualKey.length; i++) {
+ keyArr[i] = actualKey[i];
+ }
+ //如果密钥长度不足64字节,就使用0x00补齐到64字节
+ if (actualKey.length < length) {
+ for (int i = key.length; i < length; i++)
+ keyArr[i] = 0x00;
+ }
+ //使用密钥和ipad进行异或运算【K⊕ipad】
+ byte[] kIpadXorResult = new byte[length];
+ for (int i = 0; i < length; i++) {
+ kIpadXorResult[i] = (byte) (keyArr[i] ^ ipad[i]);
+ }
+ //将待加密数据M追加到kIpadXorResult后面【K⊕ipad∣M】
+ byte[] firstAppendResult = new byte[kIpadXorResult.length + m.length];
+ for (int i = 0; i < kIpadXorResult.length; i++) {
+ firstAppendResult[i] = kIpadXorResult[i];
+ }
+ for (int i = 0; i < m.length; i++) {
+ firstAppendResult[i + keyArr.length] = m[i];
+ }
+ //做MD5运算【H(K⊕ipad∣M)】
+ byte[] firstHashResult = md5(firstAppendResult);
+
+ //使用密钥和opad进行异或运算【K⊕opad】
+ byte[] kOpadXorResult = new byte[length];
+ for (int i = 0; i < length; i++) {
+ kOpadXorResult[i] = (byte) (keyArr[i] ^ opad[i]);
+ }
+ //将firstHashResult追加到kOpadXorResult后面【K⊕opad∣H(K⊕ipad∣M)】
+ byte[] secondAppendResult = new byte[kOpadXorResult.length + firstHashResult.length];
+ for (int i = 0; i < kOpadXorResult.length; i++) {
+ secondAppendResult[i] = kOpadXorResult[i];
+ }
+ for (int i = 0; i < firstHashResult.length; i++) {
+ secondAppendResult[kOpadXorResult.length + i] = firstHashResult[i];
+ }
+ //做MD5运算【H(K⊕opad∣H(K⊕ipad∣M))】
+ return md5(secondAppendResult);
+ } catch (NoSuchAlgorithmException e) {
+ e.printStackTrace();
+ }
+ return null;
+ }
+
+ /**
+ * MD5(产生出一个128位(16字节)的散列值)
+ **/
+ private static byte[] md5(byte[] str) throws NoSuchAlgorithmException {
+ MessageDigest md = MessageDigest.getInstance("MD5");
+ md.update(str);
+ return md.digest();
+ }
+
+ /**
+ * HEX转化为字符串
+ **/
+ private static String bytesToHexString(byte[] m) {
+ StringBuilder stringBuilder = new StringBuilder();
+ if (m == null || m.length <= 0) {
+ return null;
+ }
+ for (int i = 0; i < m.length; i++) {
+ int v = m[i] & 0xFF;
+ String hv = Integer.toHexString(v);
+ if (hv.length() < 2) {
+ stringBuilder.append(0);
+ }
+ stringBuilder.append(hv);
+ }
+ return stringBuilder.toString().toUpperCase();
+ }
+}
\ No newline at end of file
diff --git a/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/util/SendTagConstant.java b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/util/SendTagConstant.java
new file mode 100644
index 0000000..e1a200e
--- /dev/null
+++ b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/util/SendTagConstant.java
@@ -0,0 +1,22 @@
+package com.ruoyi.jianguan.util;
+
+
+/**
+ * @author xiaochen
+ * @Date 2024/8/22 15:28
+ */
+public class SendTagConstant {
+ /**
+ * 推送充电设备接口状态信息
+ */
+ public static final String GUN_STATUS ="gun_status";
+ /**
+ * 推送充电状态信息
+ */
+ public static final String ORDER_STATUS ="order_status";
+ /**
+ * 推送充电订单信息
+ */
+ public static final String ORDER_INFO = "order_info";
+
+}
diff --git a/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/util/SequenceGenerator.java b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/util/SequenceGenerator.java
new file mode 100644
index 0000000..c5ebc12
--- /dev/null
+++ b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/util/SequenceGenerator.java
@@ -0,0 +1,56 @@
+package com.ruoyi.jianguan.util;
+
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.atomic.AtomicInteger;
+
+public class SequenceGenerator {
+ private final ConcurrentHashMap<Long, AtomicInteger> counterMap = new ConcurrentHashMap<>();
+
+ public synchronized String getNextSequence() {
+ long currentTimestamp = System.currentTimeMillis() / 1000; // 获取当前秒级时间戳
+
+ AtomicInteger counter = counterMap.get(currentTimestamp);
+ if (counter == null) {
+ counter = new AtomicInteger(1); // 新的一秒,初始化计数器为1
+ counterMap.put(currentTimestamp, counter);
+ } else {
+ counter.incrementAndGet(); // 同一秒内,计数器递增
+ }
+
+ // 生成四位序列号
+ String sequence = String.format("%04d", counter.get());
+
+ return sequence;
+ }
+
+ public static void main(String[] args) {
+ SequenceGenerator generator = new SequenceGenerator();
+
+ // 测试生成多个序列号
+ for (int i = 0; i < 10; i++) {
+ System.out.println(generator.getNextSequence());
+ try {
+ Thread.sleep(100); // 模拟同一秒内的多次调用
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+
+ // 模拟进入新的一秒
+ try {
+ Thread.sleep(1100); // 等待超过1秒
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+
+ // 再次生成序列号
+ for (int i = 0; i < 10; i++) {
+ System.out.println(generator.getNextSequence());
+ try {
+ Thread.sleep(100); // 模拟同一秒内的多次调用
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+}
diff --git a/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/util/SignUtil.java b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/util/SignUtil.java
new file mode 100644
index 0000000..f38ff72
--- /dev/null
+++ b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/util/SignUtil.java
@@ -0,0 +1,205 @@
+package com.ruoyi.jianguan.util;
+
+import java.io.UnsupportedEncodingException;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+import java.util.Arrays;
+
+/**
+ * 签名工具
+ * @author zhibing.pu
+ * @Date 2025/1/23 11:30
+ */
+public class SignUtil {
+
+
+ /*************************************快电******************************************/
+
+ /**
+ * 签名算法
+ *
+ * @param aValue 加密的原文,即源数据
+ * @param aKey 密钥 这是针对一条字符串进行加密的方法
+ */
+ public static String hmacSign (String aValue, String aKey) {
+ byte k_ipad[] = new byte[64];
+ byte k_opad[] = new byte[64];
+ byte keyb[];
+ byte value[];
+ try {
+ keyb = aKey.getBytes("UTF-8");
+ value = aValue.getBytes("UTF-8");
+ } catch (UnsupportedEncodingException e) {
+ keyb = aKey.getBytes();
+ value = aValue.getBytes();
+ }
+
+ Arrays.fill(k_ipad, keyb.length, 64, (byte) 54);
+ Arrays.fill(k_opad, keyb.length, 64, (byte) 92);
+ for (int i = 0; i < keyb.length; i++) {
+ k_ipad[i] = (byte) (keyb[i] ^ 0x36);
+ k_opad[i] = (byte) (keyb[i] ^ 0x5c);
+ }
+
+ MessageDigest md = null;
+ try {
+ md = MessageDigest.getInstance("MD5");
+ } catch (NoSuchAlgorithmException e) {
+ return null;
+ }
+ md.update(k_ipad);
+ md.update(value);
+ byte dg[] = md.digest();
+ md.reset();
+ md.update(k_opad);
+ md.update(dg, 0, 16);
+ dg = md.digest();
+ return toHex(dg);
+ }
+
+ public static String toHex (byte input[]) {
+ if (input == null) {
+ return null;
+ }
+ StringBuffer output = new StringBuffer(input.length * 2);
+ for (int i = 0; i < input.length; i++) {
+ int current = input[i] & 0xff;
+ if (current < 16) {
+ output.append("0");
+ }
+ output.append(Integer.toString(current, 16));
+ }
+ return output.toString().toUpperCase();
+ }
+
+
+
+ /*************************************新电途******************************************/
+
+ /**
+ * HmacMd5的计算公式为:HMAC(K,M) = H(K⊕opad∣H(K⊕ipad∣M))
+ * 其中:K是密钥(byte[] key),长度可为64字节(后面涉及描述都是以字节byte进行),若小于该长度,在密钥后面用0(即0x00)补齐。
+ * M是消息内容(byte[] m);
+ * H是散列函数(此处采用MD5);
+ * opad和ipad分别是由若干个0x5c和0x36组成的字符串;
+ * ⊕表示异或运算;
+ * ∣表示连接操作。
+ **/
+ public static byte[] getHMacMD5Bytes(byte[] key, byte[] m) {
+ try {
+ //定义长度
+ int length = 64;
+ //定义opad和ipad
+ byte[] opad = new byte[length];
+ byte[] ipad = new byte[length];
+ for (int i = 0; i < length; i++) {
+ opad[i] = 0x5C;
+ ipad[i] = 0x36;
+ }
+ byte[] actualKey = key;
+ byte[] keyArr = new byte[length];
+ //如果密钥长度,大于64字节,就使用MD5算法计算其散列值,作为密钥
+ if (key.length > length) {
+ actualKey = md5(key);
+ }
+ for (int i = 0; i < actualKey.length; i++) {
+ keyArr[i] = actualKey[i];
+ }
+ //如果密钥长度不足64字节,就使用0x00补齐到64字节
+ if (actualKey.length < length) {
+ for (int i = key.length; i < length; i++) {
+ keyArr[i] = 0x00;
+ }
+ }
+ //使用密钥和ipad进行异或运算【K⊕ipad】
+ byte[] kIpadXorResult = new byte[length];
+ for (int i = 0; i < length; i++) {
+ kIpadXorResult[i] = (byte) (keyArr[i] ^ ipad[i]);
+ }
+ //将待加密数据M追加到kIpadXorResult后面【K⊕ipad∣M】
+ byte[] firstAppendResult = new byte[kIpadXorResult.length + m.length];
+ for (int i = 0; i < kIpadXorResult.length; i++) {
+ firstAppendResult[i] = kIpadXorResult[i];
+ }
+ for (int i = 0; i < m.length; i++) {
+ firstAppendResult[i + keyArr.length] = m[i];
+ }
+ //做MD5运算【H(K⊕ipad∣M)】
+ byte[] firstHashResult = md5(firstAppendResult);
+
+ //使用密钥和opad进行异或运算【K⊕opad】
+ byte[] kOpadXorResult = new byte[length];
+ for (int i = 0; i < length; i++) {
+ kOpadXorResult[i] = (byte) (keyArr[i] ^ opad[i]);
+ }
+ //将firstHashResult追加到kOpadXorResult后面【K⊕opad∣H(K⊕ipad∣M)】
+ byte[] secondAppendResult = new byte[kOpadXorResult.length + firstHashResult.length];
+ for (int i = 0; i < kOpadXorResult.length; i++) {
+ secondAppendResult[i] = kOpadXorResult[i];
+ }
+ for (int i = 0; i < firstHashResult.length; i++) {
+ secondAppendResult[kOpadXorResult.length + i] = firstHashResult[i];
+ }
+ //做MD5运算【H(K⊕opad∣H(K⊕ipad∣M))】
+ return md5(secondAppendResult);
+ } catch (NoSuchAlgorithmException e) {
+ e.printStackTrace();
+ }
+ return null;
+ }
+
+ /**
+ * MD5(产生出一个128位(16字节)的散列值)
+ **/
+ private static byte[] md5(byte[] str) throws NoSuchAlgorithmException {
+ MessageDigest md = MessageDigest.getInstance("MD5");
+ md.update(str);
+ return md.digest();
+ }
+
+ /**
+ * HEX转化为字符串
+ **/
+ public static String bytesToHexString(byte[] m) {
+ StringBuilder stringBuilder = new StringBuilder();
+ if (m == null || m.length <= 0) {
+ return null;
+ }
+ for (int i = 0; i < m.length; i++) {
+ int v = m[i] & 0xFF;
+ String hv = Integer.toHexString(v);
+ if (hv.length() < 2) {
+ stringBuilder.append(0);
+ }
+ stringBuilder.append(hv);
+ }
+ //最后得到的签名,统一转化为大写
+ return stringBuilder.toString().toUpperCase();
+ }
+
+
+
+
+ public static void main(String[] args) {
+// String encrypt = AESUtil.encrypt("{\"total\":1,\"stationStatusInfo\":{\"operationID\":\"123456789\",\"stationID\":\"111111111111111\",\"connectorStatusInfos\":{\"connectorID\":1,\"equipmentID\":\"10000000000000000000001\",\"status\":4,\"currentA\":0,\"currentB\":0,\"currentC\":0,\"voltageA\":0,\"voltageB\":0,\"voltageC\":0,\"soc\":10,}}}");
+// String s = hmacSign(encrypt, "123456789abcdef");
+// System.err.println(s);
+
+
+ //签名秘钥SigSecret
+ String key = "1234567890abcdef";
+ //运营商标识OperatorId
+ String operatorId = "123456789";
+ //参数信息Data
+ String data = "il7B0BSEjFdzpyKzfOFpvg/Se1CP802RItKYFPfSLRxJ3jf0bVl9hvYOEktPAYW2nd7S8MBcyHYyacHKbISq5iTmDzG+ivnR+SZJv3USNTYVMz9rCQVSxd0cLlqsJauko79NnwQJbzDTyLooYoIwz75qBOH2/xOMirpeEqRJrF/EQjWekJmGk9RtboXePu2rka+Xm51syBPhiXJAq0GfbfaFu9tNqs/e2Vjja/ltE1M0lqvxfXQ6da6HrThsm5id4ClZFIi0acRfrsPLRixS/IQYtksxghvJwbqOsbIsITail9Ayy4tKcogeEZiOO+4Ed264NSKmk7l3wKwJLAFjCFogBx8GE3OBz4pqcAn/ydA=";
+ //时间戳TimeStamp(格式:年月日时分秒)
+ String timeStamp = "20160729142400";
+ //自增序列Seq
+ String seq = "0001";
+ //进行字符串拼接、计算
+ String m = new StringBuilder(operatorId).append(data).append(timeStamp).append(seq).toString();
+ byte[] hmacMd5 = getHMacMD5Bytes(key.getBytes(), m.getBytes());
+ // 打印计算得到的签名Sig
+ System.out.println(bytesToHexString(hmacMd5));
+ }
+}
diff --git a/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/util/TCECSuperviseUtil.java b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/util/TCECSuperviseUtil.java
new file mode 100644
index 0000000..ee2cea2
--- /dev/null
+++ b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/util/TCECSuperviseUtil.java
@@ -0,0 +1,373 @@
+package com.ruoyi.jianguan.util;
+
+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.fasterxml.jackson.databind.MapperFeature;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.ruoyi.common.redis.service.RedisService;
+import com.ruoyi.jianguan.model.*;
+import com.ruoyi.other.api.domain.Operator;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+
+/**
+ * 中电联TCEC标准
+ * @author zhibing.pu
+ * @Date 2025/1/21 11:48
+ */
+@Slf4j
+@Component
+public class TCECSuperviseUtil {
+ // 测试环境
+// private static final String OperatorID = "MA01H3BQ2";
+// private static final String OperatorSecret = "f1331ef0b37c2d1b";
+// private static final String SigSecret = "a6fedf0e1b27d6f7";
+// private static final String DataSecret = "50a61b93919c9604";
+// private static final String DataSecretIV = "7c8ac6861661d584";
+// private final static String url = "https://dev-gov-hlht-sc.unievbj.com/evcs/v1.0.0";
+
+ // 正式环境
+ private static final String OperatorID = "MA01H3BQ2";
+ private static final String OperatorSecret = "a762796b2a8989b8";
+ private static final String SigSecret = "52cd107eb677c004";
+ private static final String DataSecret = "98f46ab6481d87c4";
+ private static final String DataSecretIV = "978170fd1c11a70e";
+ private final static String url = "https://hlht-dipper-sc.unievbj.com/evcs/v1.0.0";
+
+ private final static String query_token = "/query_token";
+
+
+
+ private static final String OurDataSecret = "50a61b93919c9605";
+ private static final String OurDataSecretIV = "7c8ac6861661d585";
+ private static final String OurSigSecret = "a6fedf0e1b27d6f6";
+ private static final String OurOperatorID = "MA01H3BQ3";
+ private static final String OurOperatorSecret = "f1331ef0b37c2d1a";
+ @Autowired
+ private RedisService redisService;
+ public static final String TOKEN_KEY = "charge_token:";
+ /**
+ * 获取token
+ */
+
+ /**
+ * 推送充电设备接口状态信息
+ */
+ 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";
+ private final static String supervise_notification_operation_stats_info = "/supervise_notification_operation_stats_info";
+ private final static String supervise_notification_realtime_power_info = "/supervise_notification_realtime_power_info";
+ private final static String supervise_notification_station_info = "/supervise_notification_station_info";
+ /** 获取token
+ */
+// public String queryToken(){
+// String token = redisService.getCacheObject(TOKEN_KEY);
+// if(StringUtils.hasLength(token)){
+// return token;
+// }
+// JSONObject jsonObject = new JSONObject();
+// jsonObject.put("OperatorID", OperatorID);
+// jsonObject.put("OperatorSecret", OperatorSecret);
+// String params = jsonObject.toJSONString();
+// // 参数加密
+// String data = AesEncryption.encrypt(DataSecret, DataSecretIV, params);
+// // 获取签名
+// String timeStamp = System.currentTimeMillis() + "";
+// SequenceGenerator generator = new SequenceGenerator();
+// String nextSequence = generator.getNextSequence();
+// String hmacMD5 = HMacMD5Util.getHMacMD5(OperatorID,timeStamp, data,nextSequence,SigSecret);
+// jsonObject = new JSONObject();
+// jsonObject.put("OperatorID", OperatorID);
+// jsonObject.put("Data", data);
+// jsonObject.put("TimeStamp", timeStamp);
+// jsonObject.put("Seq", nextSequence);
+// jsonObject.put("Sig", hmacMD5);
+// String result = HttpUtils.sendPost(url+query_token, jsonObject.toJSONString());
+// String string = JSONObject.parseObject(result).getString("Data");
+// String decrypt = AesEncryption.decrypt(DataSecret, DataSecretIV, string);
+// JSONObject tokenResult = JSONObject.parseObject(decrypt);
+// token = tokenResult.getString("AccessToken");
+// Integer TokenAvailableTime = tokenResult.getInteger("TokenAvailableTime");
+// redisService.setCacheObject(TOKEN_KEY,token, (long) (TokenAvailableTime - 60), TimeUnit.SECONDS);
+// return token;
+// }
+ public String queryToken(){
+ HttpRequest post = HttpUtil.createPost(url + query_token);
+ JSONObject info = new JSONObject();
+ info.put("OperatorID", "906171535");
+ info.put("OperatorSecret", OperatorSecret);
+ Long timeStamp = Long.valueOf(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss")));
+ post.contentType("application/json;charset=utf-8");
+ BaseRequestJianGuan baseRequest = new BaseRequestJianGuan();
+ baseRequest.setOperatorID("906171535");
+ baseRequest.setTimeStamp(timeStamp+"");
+ baseRequest.setSeq("0001");
+ String jsonString = JacksonUtils.toJson(info);
+ SequenceGenerator generator = new SequenceGenerator();
+ String nextSequence = generator.getNextSequence();
+ String data = AesEncryption.encrypt(DataSecret, DataSecretIV,jsonString);
+ String hmacMD5 = HMacMD5Util.getHMacMD5("906171535",timeStamp+"", data,nextSequence,SigSecret);
+ baseRequest.setData(data);
+ baseRequest.setSig(hmacMD5);
+ 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(), DataSecret, DataSecretIV);
+ log.info("获取三方平台授权token响应Data:" + decrypt);
+ QueryTokenResult queryTokenResult = JSON.parseObject(decrypt, QueryTokenResult.class);
+ String token = queryTokenResult.getAccessToken();
+// Long tokenAvailableTime = LocalDateTime.now().toEpochSecond(ZoneOffset.UTC) + queryTokenResult.getTokenAvailab
+ return token;
+ }
+
+ /**
+ * 设备状态变化推送
+ * @param info
+ */
+ public 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(), DataSecret, DataSecretIV);
+ log.info("推送三方平台设备状态Data:" + decrypt);
+ NotificationStationStatusResult notificationStationStatusResult = JSON.parseObject(decrypt, NotificationStationStatusResult.class);
+ return notificationStationStatusResult;
+ }
+
+
+ /**
+ * 推动充电状态
+ * @param info
+ * @return
+ */
+ public 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(), DataSecret, DataSecretIV);
+ log.info("推送三方平台充电状态Data:" + decrypt);
+ NotificationEquipChargeStatusResult notificationEquipChargeStatusResult = JSON.parseObject(decrypt, NotificationEquipChargeStatusResult.class);
+ return notificationEquipChargeStatusResult;
+ }
+
+
+ /**
+ * 推送充电订单信息
+ * @param info
+ * @return
+ */
+ public NotificationChargeOrderInfoResult notificationChargeOrderInfo(Operator operator, SupChargeOrderInfo info){
+ HttpRequest post = HttpUtil.createPost(url+supervise_notification_charge_order_info);
+ if (info.getOrderStatus()!=null){
+ switch (info.getOrderStatus()){
+ case -1:
+ info.setOrderStatus(7);
+ break;
+ case 0:
+ info.setOrderStatus(7);
+ break;
+ case 1:
+ info.setOrderStatus(1);
+ break;
+ case 2:
+ info.setOrderStatus(1);
+
+ break;
+ case 3:
+ info.setOrderStatus(2);
+ break;
+ case 4:
+ info.setOrderStatus(3);
+ break;
+ case 5:
+ info.setOrderStatus(4);
+ break;
+ }
+ }else{
+ info.setOrderStatus(5);
+ }
+ 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(), DataSecret, DataSecretIV);
+ log.info("推送三方平台充电订单信息Data:" + decrypt);
+ NotificationChargeOrderInfoResult notificationChargeOrderInfoResult = JSON.parseObject(decrypt, NotificationChargeOrderInfoResult.class);
+ return notificationChargeOrderInfoResult;
+ }
+
+
+ /**
+ * 构建请求参数和消息头
+ * @param post
+ * @param
+ */
+ public 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 " + queryToken());
+ BaseRequestJianGuan baseRequest = new BaseRequestJianGuan();
+ baseRequest.setOperatorID("906171535");
+ baseRequest.setTimeStamp(timeStamp+"");
+ baseRequest.setSeq("0001");
+ // 使用 Jackson 转换为 JSON
+ ObjectMapper objectMapper = new ObjectMapper();
+ objectMapper.enable(MapperFeature.USE_ANNOTATIONS); // 启用注解支持
+ String jsonString = null;
+ try {
+ jsonString = objectMapper.writeValueAsString(o);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+
+ String encrypt = AesEncryption.encrypt(DataSecret, DataSecretIV,jsonString);
+// String encrypt = AesEncryption.encrypt(DataSecret, DataSecretIV,jsonString);
+
+ baseRequest.setData(encrypt);
+ baseRequest.setOperator(operator);
+ SequenceGenerator generator = new SequenceGenerator();
+ String nextSequence = generator.getNextSequence();
+
+ String hmacMD5 = HMacMD5Util.getHMacMD5("906171535",timeStamp+"", encrypt,nextSequence,SigSecret);
+// String hmacMD5 = HMacMD5Util.getHMacMD5(OperatorID,timeStamp, data,nextSequence,OurSigSecret);
+
+ baseRequest.setSig(hmacMD5);
+ String request_json = JacksonUtils.toJson(baseRequest);
+ post.body(request_json);
+ log.info("推送三方平台请求地址:" + post.getUrl());
+ log.info("推送三方平台请求参数:" + request_json);
+ log.info("推送三方平台请求Data:" + jsonString);
+ }
+ /**
+ * 构建请求参数和消息头
+ * @param post
+ * @param
+ */
+ public void buildBodyStatus(HttpRequest post, SupStationPowerInfoResult info, Operator operator){
+ Long timeStamp = Long.valueOf(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss")));
+ post.contentType("application/json;charset=utf-8");
+ post.header("Authorization", "Bearer " + queryToken());
+ BaseRequestJianGuan baseRequest = new BaseRequestJianGuan();
+ baseRequest.setOperatorID("906171535");
+ baseRequest.setTimeStamp(timeStamp+"");
+ baseRequest.setSeq("0001");
+ String request_json1 = JacksonUtils.toJson(info);
+ String encrypt = AesEncryption.encrypt(DataSecret, DataSecretIV,request_json1);
+// String encrypt = AesEncryption.encrypt(DataSecret, DataSecretIV,jsonString);
+
+ baseRequest.setData(encrypt);
+ baseRequest.setOperator(operator);
+ SequenceGenerator generator = new SequenceGenerator();
+ String nextSequence = generator.getNextSequence();
+
+ String hmacMD5 = HMacMD5Util.getHMacMD5("906171535",timeStamp+"", encrypt,nextSequence,SigSecret);
+// String hmacMD5 = HMacMD5Util.getHMacMD5(OperatorID,timeStamp, data,nextSequence,OurSigSecret);
+
+ baseRequest.setSig(hmacMD5);
+ String request_json = JacksonUtils.toJson(baseRequest);
+ post.body(request_json);
+ log.info("推送三方平台请求地址:" + post.getUrl());
+ log.info("推送三方平台请求参数:" + request_json);
+ log.info("推送三方平台请求Data:" + request_json1);
+ }
+ public static void main(String[] args) {
+ BaseModel model = new BaseModel();
+ model.setOperatorID("MA01H3BQ2");
+ 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-jianguan/src/main/resources/logback.xml b/ruoyi-service/ruoyi-jianguan/src/main/resources/logback.xml
new file mode 100644
index 0000000..535b51c
--- /dev/null
+++ b/ruoyi-service/ruoyi-jianguan/src/main/resources/logback.xml
@@ -0,0 +1,222 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 日志级别从低到高分为TRACE < DEBUG < INFO < WARN < ERROR < FATAL,比如: 如果设置为WARN,则低于WARN的信息都不会输出 -->
+<!-- scan:当此属性设置为true时,配置文档如果发生改变,将会被重新加载,默认值为true -->
+<!-- scanPeriod:设置监测配置文档是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。 -->
+<!-- debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。 -->
+<configuration scan="true" scanPeriod="10 seconds">
+ <contextName>logback</contextName>
+
+ <!-- name的值是变量的名称,value的值时变量定义的值。通过定义的值会被插入到logger上下文中。定义后,可以使“${}”来使用变量。 -->
+ <property name="log.path" value="/data/log/app/ruoyi-integration"/>
+
+ <!--0. 日志格式和颜色渲染 -->
+ <!-- 彩色日志依赖的渲染类 -->
+ <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter" />
+ <conversionRule conversionWord="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter" />
+ <conversionRule conversionWord="wEx" converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter" />
+ <!-- 彩色日志格式 -->
+ <property name="CONSOLE_LOG_PATTERN" value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
+
+ <!--1. 输出到控制台-->
+ <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
+ <!--此日志appender是为开发使用,只配置最底级别,控制台输出的日志级别是大于或等于此级别的日志信息-->
+ <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
+ <level>debug</level>
+ </filter>
+ <encoder>
+ <Pattern>${CONSOLE_LOG_PATTERN}</Pattern>
+ <!-- 设置字符集 -->
+ <charset>UTF-8</charset>
+ </encoder>
+ </appender>
+
+ <!--2. 输出到文档-->
+ <!-- 2.1 level为 DEBUG 日志,时间滚动输出 -->
+ <appender name="DEBUG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
+ <!-- 正在记录的日志文档的路径及文档名 -->
+ <file>${log.path}/debug.log</file>
+ <!--日志文档输出格式-->
+ <encoder>
+ <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
+ <charset>UTF-8</charset> <!-- 设置字符集 -->
+ </encoder>
+ <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
+ <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+ <!-- 日志归档 -->
+ <fileNamePattern>${log.path}/%d{yyyy-MM-dd}/debug-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
+ <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+ <maxFileSize>100MB</maxFileSize>
+ </timeBasedFileNamingAndTriggeringPolicy>
+ <!--日志文档保留天数-->
+ <maxHistory>15</maxHistory>
+ </rollingPolicy>
+ <!-- 此日志文档只记录debug级别的 -->
+ <filter class="ch.qos.logback.classic.filter.LevelFilter">
+ <level>debug</level>
+ <onMatch>ACCEPT</onMatch>
+ <onMismatch>DENY</onMismatch>
+ </filter>
+ </appender>
+
+ <!-- 2.2 level为 INFO 日志,时间滚动输出 -->
+ <appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
+ <!-- 正在记录的日志文档的路径及文档名 -->
+ <file>${log.path}/info.log</file>
+ <!--日志文档输出格式-->
+ <encoder>
+ <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
+ <charset>UTF-8</charset>
+ </encoder>
+ <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
+ <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+ <!-- 每天日志归档路径以及格式 -->
+ <fileNamePattern>${log.path}/%d{yyyy-MM-dd}/info-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
+ <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+ <maxFileSize>100MB</maxFileSize>
+ </timeBasedFileNamingAndTriggeringPolicy>
+ <!--日志文档保留天数-->
+ <maxHistory>15</maxHistory>
+ </rollingPolicy>
+ <!-- 此日志文档只记录info级别的 -->
+ <filter class="ch.qos.logback.classic.filter.LevelFilter">
+ <level>info</level>
+ <onMatch>ACCEPT</onMatch>
+ <onMismatch>DENY</onMismatch>
+ </filter>
+ </appender>
+
+ <!-- 2.3 level为 WARN 日志,时间滚动输出 -->
+ <appender name="WARN_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
+ <!-- 正在记录的日志文档的路径及文档名 -->
+ <file>${log.path}/warn.log</file>
+ <!--日志文档输出格式-->
+ <encoder>
+ <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
+ <charset>UTF-8</charset> <!-- 此处设置字符集 -->
+ </encoder>
+ <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
+ <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+ <fileNamePattern>${log.path}/%d{yyyy-MM-dd}/warn-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
+ <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+ <maxFileSize>100MB</maxFileSize>
+ </timeBasedFileNamingAndTriggeringPolicy>
+ <!--日志文档保留天数-->
+ <maxHistory>15</maxHistory>
+ </rollingPolicy>
+ <!-- 此日志文档只记录warn级别的 -->
+ <filter class="ch.qos.logback.classic.filter.LevelFilter">
+ <level>warn</level>
+ <onMatch>ACCEPT</onMatch>
+ <onMismatch>DENY</onMismatch>
+ </filter>
+ </appender>
+
+ <!-- 2.4 level为 ERROR 日志,时间滚动输出 -->
+ <appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
+ <!-- 正在记录的日志文档的路径及文档名 -->
+ <file>${log.path}/error.log</file>
+ <!--日志文档输出格式-->
+ <encoder>
+ <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
+ <charset>UTF-8</charset> <!-- 此处设置字符集 -->
+ </encoder>
+ <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
+ <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+ <fileNamePattern>${log.path}/%d{yyyy-MM-dd}/error-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
+ <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+ <maxFileSize>100MB</maxFileSize>
+ </timeBasedFileNamingAndTriggeringPolicy>
+ <!--日志文档保留天数-->
+ <maxHistory>15</maxHistory>
+ </rollingPolicy>
+ <!-- 此日志文档只记录ERROR级别的 -->
+ <filter class="ch.qos.logback.classic.filter.LevelFilter">
+ <level>ERROR</level>
+ <onMatch>ACCEPT</onMatch>
+ <onMismatch>DENY</onMismatch>
+ </filter>
+ </appender>
+
+ <!-- 2.5 所有 除了DEBUG级别的其它高于DEBUG的 日志,记录到一个文件 -->
+ <appender name="ALL_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
+ <!-- 正在记录的日志文档的路径及文档名 -->
+ <file>${log.path}/all.log</file>
+ <!--日志文档输出格式-->
+ <encoder>
+ <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
+ <charset>UTF-8</charset> <!-- 此处设置字符集 -->
+ </encoder>
+ <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
+ <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+ <fileNamePattern>${log.path}/%d{yyyy-MM-dd}/all-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
+ <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+ <maxFileSize>100MB</maxFileSize>
+ </timeBasedFileNamingAndTriggeringPolicy>
+ <!--日志文档保留天数-->
+ <maxHistory>15</maxHistory>
+ </rollingPolicy>
+ <!-- 此日志文档记录除了DEBUG级别的其它高于DEBUG的 -->
+ <filter class="ch.qos.logback.classic.filter.LevelFilter">
+ <level>DEBUG</level>
+ <onMatch>DENY</onMatch>
+ <onMismatch>ACCEPT</onMismatch>
+ </filter>
+ </appender>
+
+ <!--
+ <logger>用来设置某一个包或者具体的某一个类的日志打印级别、
+ 以及指定<appender>。<logger>仅有一个name属性,
+ 一个可选的level和一个可选的addtivity属性。
+ name:用来指定受此logger约束的某一个包或者具体的某一个类。
+ level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,
+ 还有一个特殊值INHERITED或者同义词NULL,代表强制执行上级的级别。
+ 如果未设置此属性,那么当前logger将会继承上级的级别。
+ addtivity:是否向上级logger传递打印信息。默认是true。
+ <logger name="org.springframework.web" level="info"/>
+ <logger name="org.springframework.scheduling.annotation.ScheduledAnnotationBeanPostProcessor" level="INFO"/>
+ -->
+
+ <!--
+ root节点是必选节点,用来指定最基础的日志输出级别,只有一个level属性
+ level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,
+ 不能设置为INHERITED或者同义词NULL。默认是DEBUG
+ 可以包含零个或多个元素,标识这个appender将会添加到这个logger。
+ -->
+
+ <!-- 4 最终的策略:
+ 基本策略(root级) + 根据profile在启动时, logger标签中定制化package日志级别(优先级高于上面的root级)-->
+ <springProfile name="dev">
+ <root level="info">
+ <appender-ref ref="CONSOLE" />
+ <appender-ref ref="DEBUG_FILE" />
+ <appender-ref ref="INFO_FILE" />
+ <appender-ref ref="WARN_FILE" />
+ <appender-ref ref="ERROR_FILE" />
+ <appender-ref ref="ALL_FILE" />
+ </root>
+ <logger name="com.stylefeng.guns.modular.system.dao" level="debug"/>
+ </springProfile>
+
+ <springProfile name="test">
+ <root level="info">
+ <appender-ref ref="CONSOLE" />
+ <appender-ref ref="DEBUG_FILE" />
+ <appender-ref ref="INFO_FILE" />
+ <appender-ref ref="WARN_FILE" />
+ <appender-ref ref="ERROR_FILE" />
+ <appender-ref ref="ALL_FILE" />
+ </root>
+ </springProfile>
+
+ <springProfile name="prod">
+ <root level="info">
+ <!-- 生产环境最好不配置console写文件 -->
+ <appender-ref ref="DEBUG_FILE" />
+ <appender-ref ref="INFO_FILE" />
+ <appender-ref ref="WARN_FILE" />
+ <appender-ref ref="ERROR_FILE" />
+ <appender-ref ref="ALL_FILE" />
+ </root>
+ </springProfile>
+
+</configuration>
\ No newline at end of file
diff --git a/ruoyi-service/ruoyi-jianguan/src/main/resources/mybatis-config.xml b/ruoyi-service/ruoyi-jianguan/src/main/resources/mybatis-config.xml
new file mode 100644
index 0000000..7d487eb
--- /dev/null
+++ b/ruoyi-service/ruoyi-jianguan/src/main/resources/mybatis-config.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
+<configuration>
+
+ <settings>
+ <!-- 打印查询语句 不会写入到日志文件中-->
+ <setting name="logImpl" value="STDOUT_LOGGING"/>
+ <!--<setting name="logImpl" value="LOG4J" />-->
+ <!-- 控制全局缓存(二级缓存),按美团技术团队的说法,尽量别用缓存机制 emmmm.... -->
+ <setting name="cacheEnabled" value="true"/>
+ <!-- 延迟加载的全局开关。当开启时,所有关联对象都会延迟加载。默认 false -->
+ <!-- <setting name="lazyLoadingEnabled" value="true"/> -->
+ <setting name="mapUnderscoreToCamelCase" value="false"/><!--是否将map下划线方式转为驼峰式命名-->
+ <!-- 当开启时,任何方法的调用都会加载该对象的所有属性。默认 false,可通过select标签的 fetchType来覆盖-->
+ <!-- <setting name="aggressiveLazyLoading" value="false"/>-->
+ <!-- Mybatis 创建具有延迟加载能力的对象所用到的代理工具,默认JAVASSIST -->
+ <!--<setting name="proxyFactory" value="CGLIB" />-->
+ <!-- 关于mybatis的一二级缓存 请参照:https://tech.meituan.com/2018/01/19/mybatis-cache.html -->
+ <!-- 一级缓存范围默认:SESSION ,此范围在复杂应用场景中可能会出现脏读数据-->
+ <!-- STATEMENT级别的缓存,使一级缓存,只针对当前执行的这一statement有效 -->
+ <!--<setting name="localCacheScope" value="STATEMENT"/>-->
+ <setting name="localCacheScope" value="STATEMENT"/>
+ </settings>
+
+</configuration>
--
Gitblit v1.7.1