فهرست منبع

EN+接口相关处理

skyline 2 سال پیش
والد
کامیت
253c198ebc
28فایلهای تغییر یافته به همراه688 افزوده شده و 54 حذف شده
  1. 2 1
      common/src/main/java/com/kym/common/constant/ResponseEnum.java
  2. 12 5
      common/src/main/java/com/kym/common/enums/EnPlusApi.java
  3. 22 0
      common/src/main/java/com/kym/common/exception/EnPushException.java
  4. 15 0
      common/src/main/java/com/kym/common/handler/GlobalExceptionHandler.java
  5. 38 0
      entity/src/main/java/com/kym/entity/enplus/EnChargeDetails.java
  6. 26 0
      entity/src/main/java/com/kym/entity/enplus/EnChargeOrder.java
  7. 33 0
      entity/src/main/java/com/kym/entity/enplus/EnCheckOrderSeq.java
  8. 1 1
      entity/src/main/java/com/kym/entity/enplus/EnConnectorInfo.java
  9. 4 2
      entity/src/main/java/com/kym/entity/enplus/EnConnectorStatsInfo.java
  10. 1 1
      entity/src/main/java/com/kym/entity/enplus/EnConnectorStatusInfo.java
  11. 4 3
      entity/src/main/java/com/kym/entity/enplus/EnEquipmentStatsInfo.java
  12. 53 0
      entity/src/main/java/com/kym/entity/enplus/EnNotificationChargeOrderInfo.java
  13. 74 0
      entity/src/main/java/com/kym/entity/enplus/EnNotificationEquipChargeStatus.java
  14. 41 0
      entity/src/main/java/com/kym/entity/enplus/EnNotificationStartChargeResult.java
  15. 48 0
      entity/src/main/java/com/kym/entity/enplus/EnNotificationStopChargeResult.java
  16. 1 0
      entity/src/main/java/com/kym/entity/enplus/EnResponse.java
  17. 4 3
      entity/src/main/java/com/kym/entity/enplus/EnStationInfo.java
  18. 1 1
      entity/src/main/java/com/kym/entity/enplus/EquipmentInfo.java
  19. 2 2
      entity/src/main/java/com/kym/entity/enplus/StationStatsInfo.java
  20. 1 1
      entity/src/main/java/com/kym/entity/enplus/StationStatusInfo.java
  21. 81 23
      miniapp/src/main/java/com/kym/miniapp/controller/ChargerController.java
  22. 1 6
      miniapp/src/main/resources/application.yml
  23. 2 3
      service/src/main/java/com.kym.service.admin/StationService.java
  24. 15 2
      service/src/main/java/com.kym.service.admin/impl/StationServiceImpl.java
  25. 11 0
      service/src/main/java/com/kym/service/enplus/EnNotifyService.java
  26. 2 0
      service/src/main/java/com/kym/service/enplus/EnPlusService.java
  27. 59 0
      service/src/main/java/com/kym/service/enplus/impl/EnNotifyServiceImpl.java
  28. 134 0
      service/src/main/java/com/kym/service/enplus/impl/EnPlusServiceImpl.java

+ 2 - 1
common/src/main/java/com/kym/common/constant/ResponseEnum.java

@@ -30,7 +30,8 @@ public enum ResponseEnum implements BusinessExceptionAssert {
 
     // EN+
     EN_PLUS_API_EXCEPTION(90000,"接口数据异常"),
-    EN_PLUS_QUERY_TOKEN_ERROR(90001, "TOKEN获取异常");
+    EN_PLUS_QUERY_TOKEN_ERROR(90001, "TOKEN获取异常"),
+    EN_PLUS_PUSH_SIGN_FAIL(90002,"EN+推送数据验签失败");
 
     private final Integer code;
     private final String message;

+ 12 - 5
common/src/main/java/com/kym/common/enums/EnPlusApi.java

@@ -16,15 +16,22 @@ public enum EnPlusApi implements Api {
 
 
     // 认证-获取token
-    EN_PLUS_QUERY_TOKEN(Constants.DOMAIN + "query_token", RequestMethod.POST),
+    EN_PLUS_QUERY_TOKEN(Constants.DOMAIN + "query_token", RequestMethod.POST), //获取AccessToken
 
     // 站点
-    EN_PLUS_QUERY_STATION_INFO(Constants.DOMAIN + "query_stations_info", RequestMethod.POST),
-    EN_PLUS_QUERY_STATION_STATUS(Constants.DOMAIN + "query_station_status", RequestMethod.POST),
+    EN_PLUS_QUERY_STATION_INFO(Constants.DOMAIN + "query_stations_info", RequestMethod.POST), // 站点信息
+    EN_PLUS_QUERY_STATION_STATUS(Constants.DOMAIN + "query_station_status", RequestMethod.POST), // 站点状态
+    EN_PLUS_QUERY_STATION_STATS(Constants.DOMAIN + "query_station_stats", RequestMethod.POST), // 站点统计
+    //充电
+    EN_PLUS_QUERY_EQUIP_AUTH(Constants.DOMAIN + "query_equip_auth", RequestMethod.POST), // 请求设备认证
+    EN_PLUS_QUERY_BUSINESS_POLICY(Constants.DOMAIN + "query_business_policy", RequestMethod.POST), // 查询业务策略信息
+    EN_PLUS_QUERY_START_CHARGE(Constants.DOMAIN + "query_start_charge", RequestMethod.POST), // 查询启动充电
+    EN_PLUS_QUERY_STOP_CHARGE(Constants.DOMAIN + "query_stop_charge", RequestMethod.POST), // 请求停止充电
+    EN_PLUS_QUERY_CHARGE_STATUS(Constants.DOMAIN + "query_charge_status", RequestMethod.POST), // 查询充电状态
 
     //微信
-    WX_MP_GET_PHONE("", RequestMethod.POST),
-    WX_GET_ACCESS_TOKEN("", RequestMethod.POST);
+    WX_MP_GET_PHONE("", RequestMethod.POST), // 获取手机号
+    WX_GET_ACCESS_TOKEN("", RequestMethod.POST); // 获取AccessToken
 
     private final String api;
     private final RequestMethod requestMethod;

+ 22 - 0
common/src/main/java/com/kym/common/exception/EnPushException.java

@@ -0,0 +1,22 @@
+package com.kym.common.exception;
+
+import com.kym.common.constant.IResponseCode;
+import lombok.Getter;
+
+/**
+ * @author skyline
+ * @description EN+推送数据数据异常
+ * @date 2023-08-04 13:36
+ */
+@Getter
+public class EnPushException extends RuntimeException {
+    Integer code;
+    String message;
+    Object data;
+
+    public EnPushException(IResponseCode responseEnum, Object data) {
+        this.code = responseEnum.getCode();
+        this.message = responseEnum.getMessage();
+        this.data = data;
+    }
+}

+ 15 - 0
common/src/main/java/com/kym/common/handler/GlobalExceptionHandler.java

@@ -4,6 +4,7 @@ import cn.dev33.satoken.exception.NotLoginException;
 import com.kym.common.R;
 import com.kym.common.exception.BaseException;
 import com.kym.common.exception.BusinessException;
+import com.kym.common.exception.EnPushException;
 import org.apache.ibatis.jdbc.Null;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -49,6 +50,8 @@ public class GlobalExceptionHandler {
         return R.failed();
     }
 
+
+
     /**
      * 登录异常
      *
@@ -80,4 +83,16 @@ public class GlobalExceptionHandler {
         return R.failed(LOGIN_FAILED.getCode(), message);
     }
 
+
+    /**
+     * 处理EN+推送返回异常
+     * @param e
+     * @return
+     */
+    @ExceptionHandler(value = EnPushException.class)
+    @ResponseBody
+    public Object handleEnPushException(EnPushException e) {
+        return e.getData();
+    }
+
 }

+ 38 - 0
entity/src/main/java/com/kym/entity/enplus/EnChargeDetails.java

@@ -0,0 +1,38 @@
+package com.kym.entity.enplus;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * @author skyline
+ * @description 充电明细信息体
+ * @date 2023-08-03 16:32
+ */
+@Data
+public class EnChargeDetails {
+    private String DetailStartTime;
+    private String DetailEndTime;
+    /**
+     * 时段电价
+     */
+    private BigDecimal ElecPrice;
+    /**
+     * 时段服务费价格
+     */
+    private BigDecimal ServicePrice;
+
+    /**
+     * 时段充电量(度)
+     */
+    private BigDecimal DetailPower;
+
+    /**
+     * 时段电费
+     */
+    private BigDecimal DetailElecMoney;
+    /**
+     * 时段服务费
+     */
+    private BigDecimal DetailServiceMoney;
+}

+ 26 - 0
entity/src/main/java/com/kym/entity/enplus/EnChargeOrder.java

@@ -0,0 +1,26 @@
+package com.kym.entity.enplus;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * @author skyline
+ * @description 单项订单对账信息体
+ * @date 2023-08-04 10:29
+ */
+@Data
+public class EnChargeOrder {
+    /**
+     * 充电订单号
+     */
+    private String StartChargeSeq;
+    /**
+     * 累积充电量
+     */
+    private BigDecimal TotalPower;
+    /**
+     * 累积总金额
+     */
+    private BigDecimal TotalMoney;
+}

+ 33 - 0
entity/src/main/java/com/kym/entity/enplus/EnCheckOrderSeq.java

@@ -0,0 +1,33 @@
+package com.kym.entity.enplus;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * @author skyline
+ * @description 推送订单对账信息
+ * @date 2023-08-04 10:25
+ */
+@Data
+public class EnCheckOrderSeq {
+
+    private String CheckOrderSeq;
+    private String StartTime;
+    private String EndTime;
+    /**
+     * 订单数量N
+     */
+    private int OrderCount;
+    /**
+     * 总电量
+     */
+    private BigDecimal TotalOrderPower;
+    /**
+     * 总金额
+     */
+    private BigDecimal TotalOrderMoney;
+    private List<EnChargeOrder> ChargeOrders;
+
+}

+ 1 - 1
entity/src/main/java/com/kym/entity/enplus/ConnectorInfo.java → entity/src/main/java/com/kym/entity/enplus/EnConnectorInfo.java

@@ -8,7 +8,7 @@ import lombok.Data;
  * @date 2023-07-31 15:30
  */
 @Data
-public class ConnectorInfo {
+public class EnConnectorInfo {
     /**
      * 充电设备接口编码
      */

+ 4 - 2
entity/src/main/java/com/kym/entity/enplus/ConnectorStatsInfo.java → entity/src/main/java/com/kym/entity/enplus/EnConnectorStatsInfo.java

@@ -2,13 +2,15 @@ package com.kym.entity.enplus;
 
 import lombok.Data;
 
+import java.math.BigDecimal;
+
 /**
  * @author skyline
  * @description 充电设备接口统计信息
  * @date 2023-07-31 16:15
  */
 @Data
-public class ConnectorStatsInfo {
+public class EnConnectorStatsInfo {
 
     /**
      * 充电设备接口编码
@@ -18,6 +20,6 @@ public class ConnectorStatsInfo {
     /**
      * 充电设备接口累计电量(kWh,精度0.1)
      */
-    private float ConnectorElectricity;
+    private BigDecimal ConnectorElectricity;
 
 }

+ 1 - 1
entity/src/main/java/com/kym/entity/enplus/ConnectorStatusInfo.java → entity/src/main/java/com/kym/entity/enplus/EnConnectorStatusInfo.java

@@ -8,7 +8,7 @@ import lombok.Data;
  * @date 2023-07-31 15:40
  */
 @Data
-public class ConnectorStatusInfo {
+public class EnConnectorStatusInfo {
     /**
      * 充电设备接口编码
      */

+ 4 - 3
entity/src/main/java/com/kym/entity/enplus/EquipmentStatsInfo.java → entity/src/main/java/com/kym/entity/enplus/EnEquipmentStatsInfo.java

@@ -2,6 +2,7 @@ package com.kym.entity.enplus;
 
 import lombok.Data;
 
+import java.math.BigDecimal;
 import java.util.List;
 
 /**
@@ -10,7 +11,7 @@ import java.util.List;
  * @date 2023-07-31 16:10
  */
 @Data
-public class EquipmentStatsInfo {
+public class EnEquipmentStatsInfo {
     /**
      * 设备编码
      * 设备唯一编码,对同一运营商,保证唯一
@@ -19,7 +20,7 @@ public class EquipmentStatsInfo {
     /**
      * 充电设别接口累计电量
      */
-    private float EquipmentElectricity;
-    private List<ConnectorStatsInfo> ConnectorStatsInfos;
+    private BigDecimal EquipmentElectricity;
+    private List<EnConnectorStatsInfo> ConnectorStatsInfos;
 
 }

+ 53 - 0
entity/src/main/java/com/kym/entity/enplus/EnNotificationChargeOrderInfo.java

@@ -0,0 +1,53 @@
+package com.kym.entity.enplus;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * @author skyline
+ * @description 推送充电订单信息
+ * @date 2023-08-04 10:12
+ */
+@Data
+public class EnNotificationChargeOrderInfo {
+    private String StartChargeSeq;
+    private String ConnectorID;
+    private String StartTime;
+    private String EndTime;
+    /**
+     * 累积充电量
+     */
+    private BigDecimal TotalPower;
+
+    /**
+     * 总电费
+     */
+    private BigDecimal TotalElecMoney;
+    /**
+     * 总服务费
+     */
+    private BigDecimal TotalServiceMoney;
+    /**
+     * 累积总金额
+     */
+    private BigDecimal TotalMoney;
+    /**
+     * 充电结束原因
+     * 0:用户手动停止充电
+     * 1:客户归属地运营商平台停止充电
+     * 2:BMS停止充电
+     * 3:充电机设备故障
+     * 4:连接器断开
+     * 5~99:自定义
+     */
+    private int StopReason;
+    /**
+     * 时段数N 范围0~32
+     */
+    private int SumPeriod;
+    private List<EnChargeDetails> ChargeDetails;
+
+
+}

+ 74 - 0
entity/src/main/java/com/kym/entity/enplus/EnNotificationEquipChargeStatus.java

@@ -0,0 +1,74 @@
+package com.kym.entity.enplus;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * @author skyline
+ * @description 推送充电状态
+ * @date 2023-08-03 16:22
+ */
+@Data
+public class EnNotificationEquipChargeStatus {
+
+    private String StartChargeSeq;
+
+    /**
+     * 充电订单状态
+     * 1:启动中
+     * 2:充电中
+     * 3:停止中
+     * 4:已结束
+     * 5:未知
+     */
+    private int StartChargeSeqStat;
+
+    /**
+     * 充电设备接口状态
+     * 1:空闲
+     * 2:占用(未充电)
+     * 3:占用(充电中)
+     * 4:占用(预约锁定)
+     * 255:故障
+     */
+    private String ConnectorStatus;
+
+    private BigDecimal CurrentA;
+    private BigDecimal CurrentB;
+    private BigDecimal CurrentC;
+
+    private BigDecimal VoltageA;
+    private BigDecimal VoltageB;
+    private BigDecimal VoltageC;
+
+    private BigDecimal Soc;
+    private String StartTime;
+    private String EndTime;
+
+    /**
+     * 累积充电量
+     */
+    private BigDecimal TotalPower;
+    /**
+     * 累积电费
+     */
+    private BigDecimal ElecMoney;
+    /**
+     * 累积服务费
+     */
+    private BigDecimal ServiceMoney;
+    /**
+     * 累积总金额
+     */
+    private BigDecimal TotalMoney;
+    /**
+     * 时段数N 范围0~32
+     */
+    private int SumPeriod;
+
+    private List<EnChargeDetails> ChargeDetails;
+
+
+}

+ 41 - 0
entity/src/main/java/com/kym/entity/enplus/EnNotificationStartChargeResult.java

@@ -0,0 +1,41 @@
+package com.kym.entity.enplus;
+
+import lombok.Data;
+
+/**
+ * @author skyline
+ * @description 推送停止充电结果
+ * @date 2023-08-04 10:05
+ */
+@Data
+public class EnNotificationStartChargeResult {
+
+    /**
+     * 充电订单号
+     */
+    private String StartChargeSeq;
+    /**
+     * 充电订单状态
+     * 1:启动中
+     * 2:充电中
+     * 3:停止中
+     * 4:已结束
+     * 5:未知
+     */
+    private int StartChargeSeqStat;
+
+    /**
+     * 充电设备接口编码
+     */
+    private String ConnectorID;
+
+    /**
+     * 充电启动时间
+     */
+    private String StartTime;
+
+    /**
+     * 启动充电时收到的验证码,用于充电桩手动停止充电
+     */
+    private String IdentCode;
+}

+ 48 - 0
entity/src/main/java/com/kym/entity/enplus/EnNotificationStopChargeResult.java

@@ -0,0 +1,48 @@
+package com.kym.entity.enplus;
+
+import lombok.Data;
+
+/**
+ * @author skyline
+ * @description 推送停止充电结果
+ * @date 2023-08-04 10:05
+ */
+@Data
+public class EnNotificationStopChargeResult {
+
+    /**
+     * 充电订单号
+     */
+    private String StartChargeSeq;
+    /**
+     * 充电订单状态
+     * 1:启动中
+     * 2:充电中
+     * 3:停止中
+     * 4:已结束
+     * 5:未知
+     */
+    private int StartChargeSeqStat;
+
+    /**
+     * 充电设备接口编码
+     */
+    private String ConnectorID;
+
+    /**
+     * 成功标识
+     * 0:成功
+     * 1:失败
+     */
+    private int SuccStat;
+
+    /**
+     * 停止失败原因
+     * 0:无
+     * 1:此设备不存在
+     * 2:此设备离线
+     * 3:设备已停止充电
+     * 4~99:自定义
+     */
+    private int FailReason;
+}

+ 1 - 0
entity/src/main/java/com/kym/entity/enplus/EnResponse.java

@@ -13,4 +13,5 @@ public class EnResponse {
     private String Msg;
     private String Data;
     private String Sig;
+
 }

+ 4 - 3
entity/src/main/java/com/kym/entity/enplus/StationInfo.java → entity/src/main/java/com/kym/entity/enplus/EnStationInfo.java

@@ -2,6 +2,7 @@ package com.kym.entity.enplus;
 
 import lombok.Data;
 
+import java.math.BigDecimal;
 import java.util.List;
 
 /**
@@ -10,7 +11,7 @@ import java.util.List;
  * @date 2023-07-31 14:55
  */
 @Data
-public class StationInfo {
+public class EnStationInfo {
 
 
     /**
@@ -76,11 +77,11 @@ public class StationInfo {
     /**
      * 经度
      */
-    private float StationLng;
+    private BigDecimal StationLng;
     /**
      * 纬度
      */
-    private float StationLat;
+    private BigDecimal StationLat;
     /**
      * 站点引导(100字符)
      */

+ 1 - 1
entity/src/main/java/com/kym/entity/enplus/EquipmentInfo.java

@@ -50,6 +50,6 @@ public class EquipmentInfo {
     /**
      * 充电设备接口信息列表
      */
-    private List<ConnectorInfo> ConnectorInfos;
+    private List<EnConnectorInfo> ConnectorInfos;
 
 }

+ 2 - 2
entity/src/main/java/com/kym/entity/enplus/StationStatsInfo.java

@@ -26,11 +26,11 @@ public class StationStatsInfo {
     /**
      * 充电站累积电量(kWh,精度0.1)
      */
-    private float StationElectricity;
+    private BigDecimal StationElectricity;
 
     /**
      * 充电设备统计信息列表
      */
-    private List<EquipmentStatsInfo> EquipmentStatsInfos;
+    private List<EnEquipmentStatsInfo> EquipmentStatsInfos;
 
 }

+ 1 - 1
entity/src/main/java/com/kym/entity/enplus/StationStatusInfo.java

@@ -19,6 +19,6 @@ public class StationStatusInfo {
     /**
      * 充电设备接口状态列表
      */
-    private List<ConnectorStatusInfo> ConnectorStatusInfos;
+    private List<EnConnectorStatusInfo> ConnectorStatusInfos;
 
 }

+ 81 - 23
miniapp/src/main/java/com/kym/miniapp/controller/ChargerController.java

@@ -1,19 +1,18 @@
 package com.kym.miniapp.controller;
 
+import com.alibaba.fastjson2.JSONObject;
 import com.kym.common.R;
 import com.kym.common.annotation.SysLog;
 import com.kym.service.admin.StationService;
+import com.kym.service.enplus.EnNotifyService;
 import com.kym.service.enplus.EnPlusService;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.format.annotation.DateTimeFormat;
+import org.springframework.web.bind.annotation.*;
+
 
 /**
- * <p>
- * 前端控制器
- * </p>
+ * 充电
  *
  * @author skyline
  * @since 2023-06-27
@@ -28,22 +27,8 @@ public class ChargerController {
     @Autowired
     private EnPlusService enPlusService;
 
-    @SysLog("启动充电")
-    R startCharge() {
-        return R.success();
-    }
-
-    @SysLog("停止充电")
-    R stopCharge() {
-        return R.success();
-    }
-
-    @SysLog("查询充电状态")
-    @GetMapping("chargeStatus")
-    R chargeStatus() {
-        return R.success();
-    }
-
+    @Autowired
+    private EnNotifyService enNotifyService;
 
     @SysLog("充电站列表")
     @GetMapping("listStation")
@@ -61,11 +46,84 @@ public class ChargerController {
         return R.success(response);
     }
 
+    @SysLog("充电站统计")
+    @GetMapping("stationStatus")
+    R stationStatus(@RequestParam("stationId") String stationId,
+                    @RequestParam("startTime") @DateTimeFormat(pattern = "yyyy-MM-dd") String startTime,
+                    @RequestParam("endTime") @DateTimeFormat(pattern = "yyyy-MM-dd") String endTime) {
+        // 请求en+接口
+        var response = stationService.stationStats(stationId, startTime, endTime);
+        return R.success(response);
+    }
+
 
     @GetMapping("/token")
     R queryToken() {
         return R.success(enPlusService.queryToken());
     }
 
+    @SysLog("启动充电")
+    @PostMapping("/startCharge")
+    R startCharge() {
+        return R.success();
+    }
+
+    @SysLog("停止充电")
+    @PostMapping("/stopCharge")
+    R stopCharge() {
+        return R.success();
+    }
+
+    @SysLog("查询充电状态")
+    @GetMapping("/chargeStatus")
+    R chargeStatus() {
+        return R.success();
+    }
+
+
+    //====================================================以上是请求EN+接口==============================================================
+
+    // 【我们请求en+时,数据都要加密验签;en+推送给我们的数据,只需要验签,响应也不需要加密。】
+
+    //====================================================以下是EN+推送接口==============================================================
+
+    /**
+     * EN+ 设备状态变化推送
+     *
+     * @param json
+     * @return 0:接收 1:丢弃/忽略,不需要重试
+     */
+    @PostMapping("/notification_stationStatus")
+    JSONObject notificationStationStatus(@RequestBody JSONObject json) {
+        // TODO: 2023-08-05 验签 业务逻辑
+        return null;
+    }
+
+
+    /**
+     * EN+ 推送启动充电结果
+     *
+     * @param json
+     * @return StartChargeSeq SuccStat 0:成功 1:失败  FailReason 0:无 1:接收失败
+     */
+    @PostMapping("/notification_start_charge_result")
+    JSONObject notificationStartChargeResult(@RequestBody JSONObject json) {
+        // TODO: 2023-08-03 验签 业务逻辑
+        return null;
+    }
+
+
+    /**
+     * 推送启动充电结果
+     *
+     * @param json
+     * @return
+     */
+    @PostMapping("/notification_start_charge_status")
+    JSONObject notificationStartChargeStatus(@RequestBody JSONObject json) {
+        // TODO: 2023-08-03 验签 业务逻辑
+        return null;
+    }
+
 
 }

+ 1 - 6
miniapp/src/main/resources/application.yml

@@ -20,12 +20,7 @@ spring:
     redis:
       # 缓存过期时间:7天
       time-to-live: 604800
-      # 缓存前缀
-      key-prefix: CACHE_
-      # 是否开启前缀
-      use-key-prefix: true
-      # 是否缓存空值,防止缓存穿透
-      cache-null-values: true
+
 
 #mybatis:
 #  mapper-locations: classpath:mappers/*.xml

+ 2 - 3
service/src/main/java/com.kym.service.admin/StationService.java

@@ -3,9 +3,6 @@ package com.kym.service.admin;
 import com.alibaba.fastjson2.JSONObject;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.kym.entity.admin.Station;
-import com.kym.entity.enplus.StationInfo;
-
-import java.util.List;
 
 /**
  * <p>
@@ -20,4 +17,6 @@ public interface StationService extends IService<Station> {
     JSONObject queryStationInfo(int pageNum, int pageSize);
 
     JSONObject stationStatus(String[] ids);
+
+    JSONObject stationStats(String stationId, String startTime, String endTime);
 }

+ 15 - 2
service/src/main/java/com.kym.service.admin/impl/StationServiceImpl.java

@@ -44,15 +44,28 @@ public class StationServiceImpl extends ServiceImpl<StationMapper, Station> impl
 
 
     @Override
-    public JSONObject stationStatus(String[] ids){
+    public JSONObject stationStatus(String[] ids) {
         var param = """
                 {
                     "StationIDs":["%s"]
                 }
-                """.formatted(String.join("\",\"",ids));
+                """.formatted(String.join("\",\"", ids));
         var response = enPlusService.enPlusPost(EnPlusApi.EN_PLUS_QUERY_STATION_STATUS.getApi(), enPlusService.buildParams(param));
         return JSONObject.parseObject(AESUtil.decrypt(response.getData()));
     }
 
+    @Override
+    public JSONObject stationStats(String stationId, String startTime, String endTime) {
+        var param = """
+                {
+                    "StationID":%s,
+                    "StartTime":%s,
+                    "EndTime":%s
+                }
+                """.formatted(stationId,startTime,endTime);
+        var response = enPlusService.enPlusPost(EnPlusApi.EN_PLUS_QUERY_STATION_STATS.getApi(), enPlusService.buildParams(param));
+        return JSONObject.parseObject(AESUtil.decrypt(response.getData()));
+    }
+
 
 }

+ 11 - 0
service/src/main/java/com/kym/service/enplus/EnNotifyService.java

@@ -0,0 +1,11 @@
+package com.kym.service.enplus;
+
+/**
+ * @author skyline
+ * @description
+ * @date 2023-08-04 14:24
+ */
+public interface EnNotifyService {
+
+
+}

+ 2 - 0
service/src/main/java/com/kym/service/enplus/EnPlusService.java

@@ -1,5 +1,6 @@
 package com.kym.service.enplus;
 
+import com.alibaba.fastjson2.JSONObject;
 import com.kym.entity.enplus.EnResponse;
 
 /**
@@ -15,4 +16,5 @@ public interface EnPlusService {
     String buildParams(String params);
 
 
+    String signValidation(JSONObject json);
 }

+ 59 - 0
service/src/main/java/com/kym/service/enplus/impl/EnNotifyServiceImpl.java

@@ -0,0 +1,59 @@
+package com.kym.service.enplus.impl;
+
+import com.alibaba.fastjson2.JSONObject;
+import com.kym.service.enplus.EnNotifyService;
+import com.kym.service.enplus.EnPlusService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+/**
+ * @author skyline
+ * @description
+ * @date 2023-08-04 14:26
+ */
+
+@Service
+public class EnNotifyServiceImpl implements EnNotifyService {
+
+    @Autowired
+    private EnPlusService enPlusService;
+
+    /**
+     * EN+ 设备状态变化推送
+     *
+     * @param json
+     * @return
+     */
+    String handleNotificationStationStatus(JSONObject json) {
+        var data = enPlusService.signValidation(json);
+        // TODO 业务逻辑处理
+        return null;
+    }
+
+
+    /**
+     * EN+ 推送启动充电结果
+     *
+     * @param json
+     * @return
+     */
+    String handleNotificationStartChargeResult(JSONObject json) {
+        var data = enPlusService.signValidation(json);
+        // TODO 业务逻辑处理
+        return null;
+    }
+
+    /**
+     * 推送启动充电结果
+     *
+     * @param json
+     * @return
+     */
+    String handleNotificationStartChargeStatus(JSONObject json) {
+        var data = enPlusService.signValidation(json);
+        // TODO 业务逻辑处理
+        return null;
+    }
+
+
+}

+ 134 - 0
service/src/main/java/com/kym/service/enplus/impl/EnPlusServiceImpl.java

@@ -8,6 +8,7 @@ import com.alibaba.fastjson2.JSONObject;
 import com.kym.common.constant.ResponseEnum;
 import com.kym.common.enums.EnPlusApi;
 import com.kym.common.exception.BusinessException;
+import com.kym.common.exception.EnPushException;
 import com.kym.common.utils.AESUtil;
 import com.kym.entity.enplus.EnRespQueryToken;
 import com.kym.entity.enplus.EnResponse;
@@ -125,6 +126,12 @@ public class EnPlusServiceImpl implements EnPlusService {
         }
     }
 
+    /**
+     * 加密数据、签名、组装请求消息体
+     *
+     * @param params
+     * @return
+     */
     @Override
     public String buildParams(String params) {
         // 使用DataSecret对data加密
@@ -148,4 +155,131 @@ public class EnPlusServiceImpl implements EnPlusService {
                 }
                 """.formatted(OperatorId, dataStr, timeStamp, seq, sign);
     }
+
+    /**
+     * 验签、解密推送消息
+     *
+     * @param json
+     * @return
+     */
+    @Override
+    public String signValidation(JSONObject json) {
+        // 验签 解密数据
+        var OperatorID = json.getString("OperatorID");
+        var Data = json.getString("Data");
+        var TimeStamp = json.getString("TimeStamp");
+        var Seq = json.getString("Seq");
+        var Sig = json.getString("Sig");
+        var signString = OperatorID + Data + TimeStamp + Seq;
+        HMac mac = new HMac(HmacAlgorithm.HmacMD5, SigSecret.getBytes());
+        // 签名(转为大写)
+        var sign = mac.digestHex(signString).toUpperCase();
+        if (sign.equals(Sig)) {
+            // 解密数据
+            return AESUtil.decrypt(Data);
+        } else {
+            // 验签失败
+            EnResponse enResponse = new EnResponse();
+            enResponse.setRet(4001);
+            enResponse.setMsg("签名错误");
+            throw new EnPushException(ResponseEnum.EN_PLUS_PUSH_SIGN_FAIL, enResponse);
+        }
+
+    }
+
+
+    /**
+     * 请求设备认证
+     *
+     * @param equipAuthSeq 格式:运营商ID+唯一编码 27字符
+     * @param connectorID  充电设备接口编码
+     * @return
+     */
+    String queryEquipAuth(String equipAuthSeq, String connectorID) {
+        var param = """
+                {
+                    "EquipAuthSeq":%s,
+                    "ConnectorID":%s
+                }
+                """.formatted(equipAuthSeq, connectorID);
+        var response = enPlusPost(EnPlusApi.EN_PLUS_QUERY_STATION_STATS.getApi(), buildParams(param));
+        return AESUtil.decrypt(response.getData());
+    }
+
+
+    /**
+     * 查询业务策略信息
+     *
+     * @param equipBizSeq 业务策略查询流水号 格式:运营商ID+唯一编码 27字符
+     * @param connectorID 充电设备接口编码
+     * @return
+     */
+    String queryEquipBusinessPolicy(String equipBizSeq, String connectorID) {
+        var param = """
+                {
+                    "EquipBizSeq":%s,
+                    "ConnectorID":%s
+                }
+                """.formatted(equipBizSeq, connectorID);
+        var response = enPlusPost(EnPlusApi.EN_PLUS_QUERY_STATION_STATS.getApi(), buildParams(param));
+        return AESUtil.decrypt(response.getData());
+    }
+
+
+    /**
+     * 请求启动充电
+     *
+     * @param startChargeSeq
+     * @param connectorID
+     * @param qrCode
+     * @return
+     */
+    String queryStartCharge(String startChargeSeq, String connectorID, String qrCode) {
+        var param = """
+                {
+                    "StartChargeSeq":%s,
+                    "ConnectorID":%s,
+                    "QRCode":%s
+                }
+                """.formatted(startChargeSeq, connectorID, qrCode);
+        var response = enPlusPost(EnPlusApi.EN_PLUS_QUERY_START_CHARGE.getApi(), buildParams(param));
+        return AESUtil.decrypt(response.getData());
+    }
+
+    /**
+     * 请求停止充电
+     *
+     * @param startChargeSeq
+     * @param connectorID
+     * @return
+     */
+    String queryStopCharge(String startChargeSeq, String connectorID) {
+        var param = """
+                {
+                    "StartChargeSeq":%s,
+                    "ConnectorID":%s
+                }
+                """.formatted(startChargeSeq, connectorID);
+        var response = enPlusPost(EnPlusApi.EN_PLUS_QUERY_STOP_CHARGE.getApi(), buildParams(param));
+        return AESUtil.decrypt(response.getData());
+    }
+
+
+    /**
+     * 查询充电状态
+     *
+     * @param startChargeSeq
+     * @return
+     */
+    String queryEquipChargeStatus(String startChargeSeq) {
+        var param = """
+                {
+                    "StartChargeSeq":%s
+                }
+                """.formatted(startChargeSeq);
+        var response = enPlusPost(EnPlusApi.EN_PLUS_QUERY_CHARGE_STATUS.getApi(), buildParams(param));
+        return AESUtil.decrypt(response.getData());
+    }
+
+
 }