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