Просмотр исходного кода

支持互联互通多平台改造

skyline 1 год назад
Родитель
Сommit
a2d554188f
25 измененных файлов с 634 добавлено и 158 удалено
  1. 18 0
      admin/src/main/java/com/kym/admin/controller/ConnectorPlatformRelationController.java
  2. 18 0
      admin/src/main/java/com/kym/admin/controller/PlatformController.java
  3. 17 20
      common/src/main/java/com/kym/common/utils/PlatformAesUtil.java
  4. 48 0
      entity/src/main/java/com/kym/entity/admin/ConnectorPlatformRelation.java
  5. 73 0
      entity/src/main/java/com/kym/entity/admin/Platform.java
  6. 16 0
      mapper/src/main/java/com/kym/mapper/admin/ConnectorPlatformRelationMapper.java
  7. 16 0
      mapper/src/main/java/com/kym/mapper/admin/PlatformMapper.java
  8. 19 0
      mapper/src/main/resources/mappers/admin/ConnectorPlatformRelationMapper.xml
  9. 24 0
      mapper/src/main/resources/mappers/admin/PlatformMapper.xml
  10. 16 20
      miniapp/src/main/java/com/kym/miniapp/controller/ChargerController.java
  11. 16 0
      service/src/main/java/com/kym/service/admin/ConnectorPlatformRelationService.java
  12. 16 0
      service/src/main/java/com/kym/service/admin/PlatformService.java
  13. 3 3
      service/src/main/java/com/kym/service/admin/StationService.java
  14. 20 0
      service/src/main/java/com/kym/service/admin/impl/ConnectorPlatformRelationServiceImpl.java
  15. 20 0
      service/src/main/java/com/kym/service/admin/impl/PlatformServiceImpl.java
  16. 64 18
      service/src/main/java/com/kym/service/admin/impl/StationServiceImpl.java
  17. 120 0
      service/src/main/java/com/kym/service/cache/PlatformCache.java
  18. 5 5
      service/src/main/java/com/kym/service/enplus/EnNotifyService.java
  19. 19 10
      service/src/main/java/com/kym/service/enplus/EnPlusService.java
  20. 15 10
      service/src/main/java/com/kym/service/enplus/impl/EnNotifyServiceImpl.java
  21. 59 45
      service/src/main/java/com/kym/service/enplus/impl/EnPlusServiceImpl.java
  22. 0 2
      service/src/main/java/com/kym/service/miniapp/CollectService.java
  23. 10 6
      service/src/main/java/com/kym/service/miniapp/impl/ChargeServiceImpl.java
  24. 0 18
      service/src/main/java/com/kym/service/miniapp/impl/CollectServiceImpl.java
  25. 2 1
      service/src/main/java/com/kym/service/wechat/impl/WxPayServiceImpl.java

+ 18 - 0
admin/src/main/java/com/kym/admin/controller/ConnectorPlatformRelationController.java

@@ -0,0 +1,18 @@
+package com.kym.admin.controller;
+
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ * 充电桩接口(枪)互联互通平台关联表 前端控制器
+ * </p>
+ *
+ * @author skyline
+ * @since 2024-12-20
+ */
+@RestController
+@RequestMapping("/connector-platform-relation")
+public class ConnectorPlatformRelationController {
+
+}

+ 18 - 0
admin/src/main/java/com/kym/admin/controller/PlatformController.java

@@ -0,0 +1,18 @@
+package com.kym.admin.controller;
+
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ * 互联互通平台配置 前端控制器
+ * </p>
+ *
+ * @author skyline
+ * @since 2024-12-19
+ */
+@RestController
+@RequestMapping("/platform")
+public class PlatformController {
+
+}

+ 17 - 20
common/src/main/java/com/kym/common/utils/AESUtil.java → common/src/main/java/com/kym/common/utils/PlatformAesUtil.java

@@ -1,9 +1,8 @@
 package com.kym.common.utils;
 
 
-import com.kym.common.config.EnPlusConfig;
+import com.kym.entity.admin.Platform;
 import org.apache.tomcat.util.codec.binary.Base64;
-import org.springframework.stereotype.Component;
 
 import javax.crypto.Cipher;
 import javax.crypto.KeyGenerator;
@@ -15,12 +14,11 @@ import java.util.logging.Level;
 import java.util.logging.Logger;
 
 /**
+ * 各互联互通平台AES加解密工具
+ *
  * @author skyline
- * @description AES加解密工具
- * @date 2023-07-30 01:41
  */
-@Component
-public class AESUtil {
+public class PlatformAesUtil {
 
     //编码方式
     public static final String CODE_TYPE = "UTF-8";
@@ -29,10 +27,10 @@ public class AESUtil {
     private static final String AES = "AES";
 
 
-    static EnPlusConfig config;
+    static Platform config;
 
-    public AESUtil(EnPlusConfig config) {
-        AESUtil.config = config;
+    public PlatformAesUtil(Platform config) {
+        PlatformAesUtil.config = config;
     }
 
     /**
@@ -43,7 +41,7 @@ public class AESUtil {
      */
     public static String encrypt(String content) {
 
-        if (content == null || "".equals(content)) {
+        if (content == null || content.isEmpty()) {
             return content;
         }
 
@@ -64,15 +62,14 @@ public class AESUtil {
 
             //使用加密秘钥
             SecretKeySpec skeySpec = new SecretKeySpec(config.getDataSecret().getBytes(CODE_TYPE), AES);
-            //SecretKeySpec skeySpec = getSecretKey(key);
-
-            cipher.init(Cipher.ENCRYPT_MODE, skeySpec, zeroIv);// 初始化为加密模式的密码器
-
-            byte[] result = cipher.doFinal(byteContent);// 加密
-
-            return Base64.encodeBase64String(result);//通过Base64转码返回
+            //初始化为加密模式的密码器
+            cipher.init(Cipher.ENCRYPT_MODE, skeySpec, zeroIv);
+            // 加密
+            byte[] result = cipher.doFinal(byteContent);
+            // 通过Base64转码返回
+            return Base64.encodeBase64String(result);
         } catch (Exception ex) {
-            Logger.getLogger(AESUtil.class.getName()).log(Level.SEVERE, null, ex);
+            Logger.getLogger(PlatformAesUtil.class.getName()).log(Level.SEVERE, null, ex);
         }
 
         return null;
@@ -103,7 +100,7 @@ public class AESUtil {
 
             return new String(result, CODE_TYPE);
         } catch (Exception ex) {
-            Logger.getLogger(AESUtil.class.getName()).log(Level.SEVERE, null, ex);
+            Logger.getLogger(PlatformAesUtil.class.getName()).log(Level.SEVERE, null, ex);
         }
 
         return null;
@@ -126,7 +123,7 @@ public class AESUtil {
             // 转换为AES专用密钥
             return new SecretKeySpec(secretKey.getEncoded(), AES);
         } catch (Exception ex) {
-            Logger.getLogger(AESUtil.class.getName()).log(Level.SEVERE, null, ex);
+            Logger.getLogger(PlatformAesUtil.class.getName()).log(Level.SEVERE, null, ex);
         }
         return null;
     }

+ 48 - 0
entity/src/main/java/com/kym/entity/admin/ConnectorPlatformRelation.java

@@ -0,0 +1,48 @@
+package com.kym.entity.admin;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.kym.entity.BaseEntity;
+import java.io.Serializable;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * <p>
+ * 充电桩接口(枪)互联互通平台关联表
+ * </p>
+ *
+ * @author skyline
+ * @since 2024-12-20
+ */
+@Getter
+@Setter
+@TableName("t_connector_platform_relation")
+public class ConnectorPlatformRelation extends BaseEntity {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 公司id
+     */
+    private Long companyId;
+
+    /**
+     * 站点id
+     */
+    private String stationId;
+
+    /**
+     * 充电桩序列号
+     */
+    private String equipmentId;
+
+    /**
+     * 充电桩接口序列号
+     */
+    private String connectorId;
+
+    /**
+     * 平台名称:EN_PLUS(驿普乐氏),LONGSHINE(朗新)
+     */
+    private String platformName;
+}

+ 73 - 0
entity/src/main/java/com/kym/entity/admin/Platform.java

@@ -0,0 +1,73 @@
+package com.kym.entity.admin;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.kym.entity.BaseEntity;
+import java.io.Serializable;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * <p>
+ * 互联互通平台配置
+ * </p>
+ *
+ * @author skyline
+ * @since 2024-12-19
+ */
+@Getter
+@Setter
+@TableName("t_platform")
+public class Platform extends BaseEntity {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 公司id
+     */
+    private Long companyId;
+
+    /**
+     * 平台名称
+     */
+    private String platformName;
+
+    /**
+     * 运营商ID
+     */
+    private String operatorId;
+
+    /**
+     * 运营商密钥
+     */
+    private String operatorSecret;
+
+    /**
+     * 消息密钥
+     */
+    private String dataSecret;
+
+    /**
+     * 消息密钥初始化向量
+     */
+    private String dataSecretIv;
+
+    /**
+     * 签名密钥
+     */
+    private String sigSecret;
+
+    /**
+     * 最小充电余额(分)
+     */
+    private Integer chargeMinAmount;
+
+    /**
+     * 服务器请求地址URL
+     */
+    private String apiDomain;
+
+    /**
+     * 环境:dev开发,test测试,prod生产
+     */
+    private String env;
+}

+ 16 - 0
mapper/src/main/java/com/kym/mapper/admin/ConnectorPlatformRelationMapper.java

@@ -0,0 +1,16 @@
+package com.kym.mapper.admin;
+
+import com.kym.entity.admin.ConnectorPlatformRelation;
+import com.kym.mapper.mybatisplus.MyBaseMapper;
+
+/**
+ * <p>
+ * 充电桩接口(枪)互联互通平台关联表 Mapper 接口
+ * </p>
+ *
+ * @author skyline
+ * @since 2024-12-20
+ */
+public interface ConnectorPlatformRelationMapper extends MyBaseMapper<ConnectorPlatformRelation> {
+
+}

+ 16 - 0
mapper/src/main/java/com/kym/mapper/admin/PlatformMapper.java

@@ -0,0 +1,16 @@
+package com.kym.mapper.admin;
+
+import com.kym.entity.admin.Platform;
+import com.kym.mapper.mybatisplus.MyBaseMapper;
+
+/**
+ * <p>
+ * 互联互通平台配置 Mapper 接口
+ * </p>
+ *
+ * @author skyline
+ * @since 2024-12-19
+ */
+public interface PlatformMapper extends MyBaseMapper<Platform> {
+
+}

+ 19 - 0
mapper/src/main/resources/mappers/admin/ConnectorPlatformRelationMapper.xml

@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.kym.mapper.admin.ConnectorPlatformRelationMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.kym.entity.admin.ConnectorPlatformRelation">
+        <result column="company_id" property="companyId" />
+        <result column="station_id" property="stationId" />
+        <result column="equipment_id" property="equipmentId" />
+        <result column="connector_id" property="connectorId" />
+        <result column="platform_name" property="platformName" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        company_id, station_id, equipment_id, connector_id, platform_name
+    </sql>
+
+</mapper>

+ 24 - 0
mapper/src/main/resources/mappers/admin/PlatformMapper.xml

@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.kym.mapper.admin.PlatformMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.kym.entity.admin.Platform">
+        <result column="company_id" property="companyId" />
+        <result column="platform_name" property="platformName" />
+        <result column="operator_id" property="operatorId" />
+        <result column="operator_secret" property="operatorSecret" />
+        <result column="data_secret" property="dataSecret" />
+        <result column="data_secret_iv" property="dataSecretIv" />
+        <result column="sig_secret" property="sigSecret" />
+        <result column="charge_min_amount" property="chargeMinAmount" />
+        <result column="api_domain" property="apiDomain" />
+        <result column="env" property="env" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        company_id, platform_name, operator_id, operator_secret, data_secret, data_secret_iv, sig_secret, charge_min_amount, api_domain, env
+    </sql>
+
+</mapper>

+ 16 - 20
miniapp/src/main/java/com/kym/miniapp/controller/ChargerController.java

@@ -83,11 +83,6 @@ public class ChargerController {
         return R.success(response);
     }
 
-    @GetMapping("/token")
-    R<String> queryToken() {
-        return R.success(enPlusService.queryToken());
-    }
-
     @ApiLog("启动充电")
     @GetMapping("/startCharge/{connectorId}")
     R<?> startCharge(@PathVariable("connectorId") String connectorId,
@@ -209,9 +204,10 @@ public class ChargerController {
      * @param json
      * @return 0:接收 1:丢弃/忽略,不需要重试
      */
-    @PostMapping("/notification_stationStatus")
-    EnResponse notificationStationStatus(@RequestBody JSONObject json) {
-        return new EnResponse(enNotifyService.handleNotificationStationStatus(json));
+    @PostMapping("/{platformName}/notification_stationStatus")
+    //todo 通知en+更新推送地址,加上platformName
+    EnResponse notificationStationStatus(@PathVariable(value = "platformName", required = false) String platformName, @RequestBody JSONObject json) {
+        return new EnResponse(enNotifyService.handleNotificationStationStatus(platformName, json));
     }
 
     /**
@@ -221,9 +217,9 @@ public class ChargerController {
      * @return StartChargeSeq SuccStat 0:成功 1:失败  FailReason 0:无 1:接收失败
      */
     @ApiLog("EN+推送启动充电结果")
-    @PostMapping("/notification_start_charge_result")
-    EnResponse notificationStartChargeResult(@RequestBody JSONObject json) {
-        return new EnResponse(enNotifyService.handleNotificationStartChargeResult(json));
+    @PostMapping("/{platformName}/notification_start_charge_result")
+    EnResponse notificationStartChargeResult(@PathVariable(value = "platformName", required = false) String platformName, @RequestBody JSONObject json) {
+        return new EnResponse(enNotifyService.handleNotificationStartChargeResult(platformName, json));
     }
 
     /**
@@ -232,9 +228,9 @@ public class ChargerController {
      * @param json
      * @return
      */
-    @PostMapping("/notification_equip_charge_status")
-    EnResponse notificationEquipChargeStatus(@RequestBody JSONObject json) {
-        return new EnResponse(enNotifyService.handleNotificationEquipChargeStatus(json));
+    @PostMapping("/{platformName}/notification_equip_charge_status")
+    EnResponse notificationEquipChargeStatus(@PathVariable(value = "platformName", required = false) String platformName, @RequestBody JSONObject json) {
+        return new EnResponse(enNotifyService.handleNotificationEquipChargeStatus(platformName, json));
     }
 
     /**
@@ -244,9 +240,9 @@ public class ChargerController {
      * @return
      */
     @ApiLog("推送停止充电结果")
-    @PostMapping("/notification_stop_charge_result")
-    EnResponse notificationStopChargeResult(@RequestBody JSONObject json) {
-        return new EnResponse(enNotifyService.handleNotificationStopChargeResult(json));
+    @PostMapping("/{platformName}/notification_stop_charge_result")
+    EnResponse notificationStopChargeResult(@PathVariable(value = "platformName", required = false) String platformName, @RequestBody JSONObject json) {
+        return new EnResponse(enNotifyService.handleNotificationStopChargeResult(platformName, json));
     }
 
     /**
@@ -256,9 +252,9 @@ public class ChargerController {
      * @return
      */
     @ApiLog("推送充电订单信息")
-    @PostMapping("/notification_charge_order_info")
-    EnResponse notificationChargeOrderInfo(@RequestBody JSONObject json) {
-        return new EnResponse(enNotifyService.handleNotificationChargeOrderInfo(json));
+    @PostMapping("/{platformName}/notification_charge_order_info")
+    EnResponse notificationChargeOrderInfo(@PathVariable(value = "platformName", required = false) String platformName, @RequestBody JSONObject json) {
+        return new EnResponse(enNotifyService.handleNotificationChargeOrderInfo(platformName, json));
     }
 
 

+ 16 - 0
service/src/main/java/com/kym/service/admin/ConnectorPlatformRelationService.java

@@ -0,0 +1,16 @@
+package com.kym.service.admin;
+
+import com.kym.entity.admin.ConnectorPlatformRelation;
+import com.kym.service.mybatisplus.MyBaseService;
+
+/**
+ * <p>
+ * 充电桩接口(枪)互联互通平台关联表 服务类
+ * </p>
+ *
+ * @author skyline
+ * @since 2024-12-20
+ */
+public interface ConnectorPlatformRelationService extends MyBaseService<ConnectorPlatformRelation> {
+
+}

+ 16 - 0
service/src/main/java/com/kym/service/admin/PlatformService.java

@@ -0,0 +1,16 @@
+package com.kym.service.admin;
+
+import com.kym.entity.admin.Platform;
+import com.kym.service.mybatisplus.MyBaseService;
+
+/**
+ * <p>
+ * 互联互通平台配置 服务类
+ * </p>
+ *
+ * @author skyline
+ * @since 2024-12-19
+ */
+public interface PlatformService extends MyBaseService<Platform> {
+
+}

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

@@ -26,13 +26,13 @@ import java.util.Map;
  */
 public interface StationService extends MPJBaseService<Station> {
 
-    List<StationVo> queryEnStationInfo(int pageNum, int pageSize) throws JsonProcessingException;
+    List<StationVo> queryEnStationInfo(String platformName, int pageNum, int pageSize) throws JsonProcessingException;
 
     @DynamicCache
-    Map<String,List<EquipmentInfo>> getCachedEquipmentMap();
+    Map<String, List<EquipmentInfo>> getCachedEquipmentMap();
 
     @DynamicCache
-    Map<String,List<ConnectorInfo>> getCachedConnectorMap();
+    Map<String, List<ConnectorInfo>> getCachedConnectorMap();
 
     //    @DynamicCache // 方法的返回结果加一层方法缓存,5分钟内不变
     List<LocalStationVo> queryLocalStationInfo(int pageNum, int pageSize);

+ 20 - 0
service/src/main/java/com/kym/service/admin/impl/ConnectorPlatformRelationServiceImpl.java

@@ -0,0 +1,20 @@
+package com.kym.service.admin.impl;
+
+import com.kym.entity.admin.ConnectorPlatformRelation;
+import com.kym.mapper.admin.ConnectorPlatformRelationMapper;
+import com.kym.service.admin.ConnectorPlatformRelationService;
+import com.kym.service.mybatisplus.MyBaseServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 充电桩接口(枪)互联互通平台关联表 服务实现类
+ * </p>
+ *
+ * @author skyline
+ * @since 2024-12-20
+ */
+@Service
+public class ConnectorPlatformRelationServiceImpl extends MyBaseServiceImpl<ConnectorPlatformRelationMapper, ConnectorPlatformRelation> implements ConnectorPlatformRelationService {
+
+}

+ 20 - 0
service/src/main/java/com/kym/service/admin/impl/PlatformServiceImpl.java

@@ -0,0 +1,20 @@
+package com.kym.service.admin.impl;
+
+import com.kym.entity.admin.Platform;
+import com.kym.mapper.admin.PlatformMapper;
+import com.kym.service.admin.PlatformService;
+import com.kym.service.mybatisplus.MyBaseServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 互联互通平台配置 服务实现类
+ * </p>
+ *
+ * @author skyline
+ * @since 2024-12-19
+ */
+@Service
+public class PlatformServiceImpl extends MyBaseServiceImpl<PlatformMapper, Platform> implements PlatformService {
+
+}

+ 64 - 18
service/src/main/java/com/kym/service/admin/impl/StationServiceImpl.java

@@ -6,13 +6,11 @@ import com.alibaba.fastjson2.JSONObject;
 import com.baomidou.dynamic.datasource.annotation.DS;
 import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.github.yulichang.toolkit.JoinWrappers;
-import com.github.yulichang.wrapper.MPJLambdaWrapper;
 import com.kym.common.annotation.DynamicCache;
 import com.kym.common.enums.EnPlusApi;
 import com.kym.common.exception.BusinessException;
-import com.kym.common.utils.AESUtil;
 import com.kym.common.utils.CommUtil;
+import com.kym.common.utils.PlatformAesUtil;
 import com.kym.entity.admin.*;
 import com.kym.entity.admin.queryParams.StationQueryParam;
 import com.kym.entity.admin.vo.LocalStationVo;
@@ -20,10 +18,11 @@ import com.kym.entity.admin.vo.StationVo;
 import com.kym.entity.enplus.EnStationStatsInfo;
 import com.kym.entity.enplus.EnStationStatusInfo;
 import com.kym.mapper.admin.StationMapper;
-import com.kym.service.mybatisplus.MyBaseServiceImpl;
 import com.kym.service.admin.*;
 import com.kym.service.cache.KymCache;
+import com.kym.service.cache.PlatformCache;
 import com.kym.service.enplus.EnPlusService;
+import com.kym.service.mybatisplus.MyBaseServiceImpl;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.aop.framework.AopContext;
 import org.springframework.beans.BeanUtils;
@@ -86,7 +85,42 @@ public class StationServiceImpl extends MyBaseServiceImpl<StationMapper, Station
     }
 
     @Override
-    public List<StationVo> queryEnStationInfo(int pageNum, int pageSize) {
+    public List<StationVo> queryEnStationInfo(String platformName, int pageNum, int pageSize) {
+        var param = """
+                {
+                    "PageNo":%d,
+                    "PageSize":%d,
+                    "LastQueryTime":""
+                }
+                """.formatted(pageNum, pageSize);
+        var response = enPlusService.platformPost(platformName, EnPlusApi.EN_PLUS_QUERY_STATION_INFO.getApi(), enPlusService.buildParams(platformName, param));
+        var enStations = JSONObject.parseObject(new PlatformAesUtil(PlatformCache.INSTANCE.getPlatformByName(platformName)).decrypt(response.getData()));
+        var stationList = enStations.getJSONArray("StationInfos").toJavaList(StationVo.class);
+        // 我方station表数据
+        var stations = list();
+        stationList.forEach(station -> {
+            station.getEquipmentInfos().forEach(enEquipmentInfo ->
+                    enEquipmentInfo.setShortId(KymCache.INSTANCE.getShortIdByEquipmentIdOrConnectorId(enEquipmentInfo.getEquipmentId()))
+                            .setParkingNo(KymCache.INSTANCE.getParkNoByEquipmentIdOrConnectorId(enEquipmentInfo.getEquipmentId())));
+            var res = stations.stream().filter(item -> item.getStationId().equals(station.getStationId())).toList();
+            if (!res.isEmpty()) {
+                station.setPictures(res.get(0).getPictures());
+            } else {
+                station.setPictures(null);
+            }
+        });
+        return stationList;
+    }
+
+    /**
+     * 查询互联互通平台充电站信息
+     *
+     * @param platformName
+     * @param pageNum
+     * @param pageSize
+     * @return
+     */
+    public List<StationVo> queryPlatformStationInfo(String platformName, int pageNum, int pageSize) {
         var param = """
                 {
                     "PageNo":%d,
@@ -94,8 +128,8 @@ public class StationServiceImpl extends MyBaseServiceImpl<StationMapper, Station
                     "LastQueryTime":""
                 }
                 """.formatted(pageNum, pageSize);
-        var response = enPlusService.enPlusPost(EnPlusApi.EN_PLUS_QUERY_STATION_INFO.getApi(), enPlusService.buildParams(param));
-        var enStations = JSONObject.parseObject(AESUtil.decrypt(response.getData()));
+        var response = enPlusService.platformPost(platformName, EnPlusApi.EN_PLUS_QUERY_STATION_INFO.getApi(), enPlusService.buildParams(platformName, param));
+        var enStations = JSONObject.parseObject(new PlatformAesUtil(PlatformCache.INSTANCE.getPlatformByName(platformName)).decrypt(response.getData()));
         var stationList = enStations.getJSONArray("StationInfos").toJavaList(StationVo.class);
         // 我方station表数据
         var stations = list();
@@ -180,14 +214,24 @@ public class StationServiceImpl extends MyBaseServiceImpl<StationMapper, Station
 
     @Override
     public List<EnStationStatusInfo> stationStatus(String[] ids) {
-        var param = """
-                {
-                    "StationIDs":["%s"]
-                }
-                """.formatted(String.join("\",\"", ids));
-        var response = enPlusService.enPlusPost(EnPlusApi.EN_PLUS_QUERY_STATION_STATUS.getApi(), enPlusService.buildParams(param));
-        var enStationStatus = JSONObject.parseObject(AESUtil.decrypt(response.getData()));
-        return enStationStatus.getJSONArray("StationStatusInfos").toJavaList(EnStationStatusInfo.class);
+        // 先对站点id进行分组,单独去请求各自互联互通平台数据
+        var set = new HashSet<String>();
+        for (String stationId : ids) {
+            set.add(PlatformCache.INSTANCE.getPlatformNameByConnectorId(stationId));
+        }
+
+        var res = new ArrayList<EnStationStatusInfo>();
+        set.forEach(platformName -> {
+            var param = """
+                    {
+                        "StationIDs":["%s"]
+                    }
+                    """.formatted(String.join("\",\"", ids));
+            var response = enPlusService.platformPost(platformName, EnPlusApi.EN_PLUS_QUERY_STATION_STATUS.getApi(), enPlusService.buildParams(platformName, param));
+            var enStationStatus = JSONObject.parseObject(new PlatformAesUtil(PlatformCache.INSTANCE.getPlatformByName(platformName)).decrypt(response.getData()));
+            res.addAll(enStationStatus.getJSONArray("StationStatusInfos").toJavaList(EnStationStatusInfo.class));
+        });
+        return res;
     }
 
 
@@ -208,9 +252,10 @@ public class StationServiceImpl extends MyBaseServiceImpl<StationMapper, Station
                     "EndTime":"%s"
                 }
                 """.formatted(stationId, startTime, endTime);
-        var response = enPlusService.enPlusPost(EnPlusApi.EN_PLUS_QUERY_STATION_STATS.getApi(), enPlusService.buildParams(param));
+        var platformName = PlatformCache.INSTANCE.getPlatformNameByStationId(stationId);
+        var response = enPlusService.platformPost(platformName, EnPlusApi.EN_PLUS_QUERY_STATION_STATS.getApi(), enPlusService.buildParams(platformName, param));
         // TODO: 2023-08-12 包装成自己的数据格式
-        var enStationStats = JSONObject.parseObject(AESUtil.decrypt(response.getData()));
+        var enStationStats = JSONObject.parseObject(new PlatformAesUtil(PlatformCache.INSTANCE.getPlatformByName(platformName)).decrypt(response.getData()));
         return enStationStats.getJSONObject("StationStats").toJavaObject(EnStationStatsInfo.class);
     }
 
@@ -222,7 +267,8 @@ public class StationServiceImpl extends MyBaseServiceImpl<StationMapper, Station
     @Transactional(rollbackFor = Exception.class)
     public void pullEnStationInfos(String stationId) {
         // 指定的站点信息
-        var stationVo = queryEnStationInfo(1, 1000).stream().filter(vo -> stationId.equals(vo.getStationId())).findFirst().orElse(null);
+        var stationVo = queryEnStationInfo(PlatformCache.INSTANCE.getPlatformNameByStationId(stationId), 1, 1000)
+                .stream().filter(vo -> stationId.equals(vo.getStationId())).findFirst().orElse(null);
 
         var station = new Station();
         var equipmentList = new ArrayList<EquipmentInfo>();

+ 120 - 0
service/src/main/java/com/kym/service/cache/PlatformCache.java

@@ -0,0 +1,120 @@
+package com.kym.service.cache;
+
+import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.kym.common.utils.CommUtil;
+import com.kym.entity.admin.ConnectorPlatformRelation;
+import com.kym.entity.admin.Platform;
+import com.kym.service.admin.ConnectorPlatformRelationService;
+import com.kym.service.admin.PlatformService;
+import org.jetbrains.annotations.NotNull;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.boot.context.event.ApplicationStartedEvent;
+import org.springframework.context.ApplicationListener;
+import org.springframework.stereotype.Component;
+
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.stream.Collectors;
+
+/**
+ * 平台配置缓存
+ *
+ * @author skyline
+ */
+public enum PlatformCache {
+    INSTANCE;
+
+    /**
+     * 充电口ID-平台映射
+     */
+    private static ConcurrentHashMap<String, String> CONNECTOR_ID_PLATFORM_NAME_MAPPING = new ConcurrentHashMap<>();
+
+    /**
+     * 站点ID-平台映射
+     */
+    private static ConcurrentHashMap<String, String> STATION_ID_PLATFORM_NAME_MAPPING = new ConcurrentHashMap<>();
+
+    /**
+     * 平台名称-平台配置映射
+     */
+    private static ConcurrentHashMap<String, Platform> PLATFORM_CONFIG_MAPPING = new ConcurrentHashMap<>();
+
+    /**
+     * 站点ID获取平台名称
+     *
+     * @param stationId
+     * @return
+     */
+    public static String getPlatformNameByStationId(String stationId) {
+        return STATION_ID_PLATFORM_NAME_MAPPING.get(stationId);
+    }
+
+    public void putConnectorId2PlatformName(Map<String, String> data) {
+        CONNECTOR_ID_PLATFORM_NAME_MAPPING.putAll(data);
+    }
+
+    /**
+     * 保存站点id-平台映射
+     *
+     * @param data
+     */
+    public void putStationId2PlatformName(Map<String, String> data) {
+        STATION_ID_PLATFORM_NAME_MAPPING.putAll(data);
+    }
+
+    public void putPlatformName2Config(Map<String, Platform> data) {
+        PLATFORM_CONFIG_MAPPING.putAll(data);
+    }
+
+    public String getPlatformNameByConnectorId(String connectorId) {
+        return CONNECTOR_ID_PLATFORM_NAME_MAPPING.get(connectorId);
+    }
+
+    public Platform getPlatformByName(String... platformName) {
+        var name = "EN_PLUS";
+        if (CommUtil.isNotEmptyAndNull(platformName)) {
+            name = platformName[0];
+        }
+        return PLATFORM_CONFIG_MAPPING.get(name);
+    }
+
+    /**
+     * 根据充电口ID获取平台配置
+     *
+     * @param connectorId
+     * @return
+     */
+    public Platform getPlatformByConnectorId(String connectorId) {
+        var platformName = getPlatformNameByConnectorId(connectorId);
+        return PLATFORM_CONFIG_MAPPING.get(platformName);
+    }
+
+    @Component
+    public static class PlatformCacheInjector implements ApplicationListener<ApplicationStartedEvent> {
+        // private static final StringRedisTemplate redisTemplate = SpringUtil.getBean(StringRedisTemplate.class);
+        private final PlatformService platformService;
+
+        private final ConnectorPlatformRelationService connectorPlatformRelationService;
+
+        @Value("${spring.profiles.active}")
+        public String env;
+
+        public PlatformCacheInjector(PlatformService platformService, ConnectorPlatformRelationService connectorPlatformRelationService) {
+            this.platformService = platformService;
+            this.connectorPlatformRelationService = connectorPlatformRelationService;
+        }
+
+        @Override
+        public void onApplicationEvent(@NotNull ApplicationStartedEvent event) {
+
+            // 手动切换数据源
+            DynamicDataSourceContextHolder.push("db-admin");
+            // 缓存数据
+            PlatformCache.INSTANCE.putPlatformName2Config(platformService.lambdaQuery().eq(Platform::getEnv, env).list().stream().collect(Collectors.toMap(Platform::getPlatformName, platform -> platform)));
+            PlatformCache.INSTANCE.putConnectorId2PlatformName(connectorPlatformRelationService.list().stream().collect(Collectors.toMap(ConnectorPlatformRelation::getConnectorId, ConnectorPlatformRelation::getPlatformName)));
+            PlatformCache.INSTANCE.putStationId2PlatformName(connectorPlatformRelationService.list().stream().collect(Collectors.toMap(ConnectorPlatformRelation::getStationId, ConnectorPlatformRelation::getPlatformName)));
+            DynamicDataSourceContextHolder.poll();
+        }
+    }
+}

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

@@ -10,13 +10,13 @@ import com.alibaba.fastjson2.JSONObject;
 public interface EnNotifyService {
 
 
-    String handleNotificationStartChargeResult(JSONObject json);
+    String handleNotificationStartChargeResult(String platformName, JSONObject json);
 
-    String handleNotificationEquipChargeStatus(JSONObject json);
+    String handleNotificationEquipChargeStatus(String platformName, JSONObject json);
 
-    String handleNotificationStopChargeResult(JSONObject json);
+    String handleNotificationStopChargeResult(String platformName, JSONObject json);
 
-    String handleNotificationChargeOrderInfo(JSONObject json);
+    String handleNotificationChargeOrderInfo(String platformName, JSONObject json);
 
-    String handleNotificationStationStatus(JSONObject json);
+    String handleNotificationStationStatus(String platformName, JSONObject json);
 }

+ 19 - 10
service/src/main/java/com/kym/service/enplus/EnPlusService.java

@@ -1,6 +1,7 @@
 package com.kym.service.enplus;
 
 import com.alibaba.fastjson2.JSONObject;
+import com.kym.common.annotation.DynamicCache;
 import com.kym.entity.enplus.response.EnResponse;
 
 /**
@@ -9,24 +10,32 @@ import com.kym.entity.enplus.response.EnResponse;
  * @date 2023-07-31 14:13
  */
 public interface EnPlusService {
-    EnResponse enPlusPost(String url, String params);
 
-    String queryToken();
+    EnResponse platformPost(String platformName, String url, String params);
 
-    String buildParams(String params);
+    String queryPlatformToken(String platformName);
 
 
-    String signValidation(JSONObject json);
+    String buildParams(String platformName, String params);
 
-    JSONObject queryEquipAuth(String connectorId, String equipAuthSeq);
 
-    JSONObject queryEquipBusinessPolicy(String equipBizSeq, String connectorId);
+    String signValidation(String platformName, JSONObject json);
 
-    JSONObject queryStartCharge(String startChargeSeq, String connectorId, String qrCode, Integer amount);
 
-    JSONObject queryEquipChargeStatus(String startChargeSeq);
+    JSONObject queryEquipAuth(String platformName, String connectorId, String equipAuthSeq);
 
-    JSONObject updateBalanceByQueryEquipChargeStatus(String startChargeSeq, int amount);
+    @DynamicCache(spel = "#connectorId")
+    JSONObject queryEquipBusinessPolicy(String platformName, String equipBizSeq, String connectorId);
 
-    JSONObject queryStopCharge(String startChargeSeq, String connectorId);
+
+    JSONObject queryStartCharge(String platformName, String startChargeSeq, String connectorId, String qrCode, Integer amount);
+
+
+    JSONObject queryEquipChargeStatus(String platformName, String startChargeSeq);
+
+
+    JSONObject updateBalanceByQueryEquipChargeStatus(String platformName, String startChargeSeq, int amount);
+
+
+    JSONObject queryStopCharge(String platformName, String startChargeSeq, String connectorId);
 }

+ 15 - 10
service/src/main/java/com/kym/service/enplus/impl/EnNotifyServiceImpl.java

@@ -83,13 +83,14 @@ public class EnNotifyServiceImpl implements EnNotifyService {
     /**
      * EN+ 充电站设备状态变化推送
      *
+     * @param platformName
      * @param json
      * @return
      */
     @Override
     @DS("db-admin")
-    public String handleNotificationStationStatus(JSONObject json) {
-        var data = enPlusService.signValidation(json);
+    public String handleNotificationStationStatus(String platformName, JSONObject json) {
+        var data = enPlusService.signValidation(platformName, json);
         LOGGER.info("【EN+推送】收到充电桩设备状态变化推送:{},解密数据:{}", json, data);
         // 更新数据库,存入redis,发送邮件通知
         var connectorStatusInfo = JSONObject.parseObject(data).getJSONObject("ConnectorStatusInfo").toJavaObject(EnConnectorStatusInfo.class);
@@ -158,14 +159,15 @@ public class EnNotifyServiceImpl implements EnNotifyService {
     /**
      * EN+ 推送启动充电结果
      *
+     * @param platformName
      * @param json
      * @return
      */
     @Override
     @Transactional(rollbackFor = Exception.class)
     @DS("db-miniapp")
-    public String handleNotificationStartChargeResult(JSONObject json) {
-        var data = enPlusService.signValidation(json);
+    public String handleNotificationStartChargeResult(String platformName, JSONObject json) {
+        var data = enPlusService.signValidation(platformName,json);
         LOGGER.info("【EN+推送】收到启动充电结果推送:{},解密数据:{}", json, data);
         var obj = JSONObject.parseObject(data);
         var startChargeSeq = obj.getString("StartChargeSeq");
@@ -193,14 +195,15 @@ public class EnNotifyServiceImpl implements EnNotifyService {
     /**
      * 推送充电状态,1分钟推送一次
      *
+     * @param platformName
      * @param json
      * @return
      * @see com.kym.miniapp.jobs.EquipmentChargeStatusJob#executeMpUserRelationJob()
      */
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public String handleNotificationEquipChargeStatus(JSONObject json) {
-        var dataStr = enPlusService.signValidation(json);
+    public String handleNotificationEquipChargeStatus(String platformName, JSONObject json) {
+        var dataStr = enPlusService.signValidation(platformName,json);
         var data = JSONObject.parseObject(dataStr);
         LOGGER.info("【EN+推送】 :{},解密数据:{}", json, data);
         var startChargeSeq = data.getString("StartChargeSeq");
@@ -230,13 +233,14 @@ public class EnNotifyServiceImpl implements EnNotifyService {
     /**
      * 推送停止充电结果
      *
+     * @param platformName
      * @param json
      * @return
      */
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public String handleNotificationStopChargeResult(JSONObject json) {
-        var dataStr = enPlusService.signValidation(json);
+    public String handleNotificationStopChargeResult(String platformName, JSONObject json) {
+        var dataStr = enPlusService.signValidation(platformName,json);
         var data = JSONObject.parseObject(dataStr);
         LOGGER.info("【EN+推送】收到停止充电结果推送:{},解密数据:{}", json, data);
         var startChargeSeq = data.getString("StartChargeSeq");
@@ -257,13 +261,14 @@ public class EnNotifyServiceImpl implements EnNotifyService {
     /**
      * 推送充电订单信息(订单结算)
      *
+     * @param platformName
      * @param json
      * @return
      */
     @Override
     @DSTransactional(rollbackFor = Exception.class)
-    public String handleNotificationChargeOrderInfo(JSONObject json) {
-        var dataStr = enPlusService.signValidation(json);
+    public String handleNotificationChargeOrderInfo(String platformName, JSONObject json) {
+        var dataStr = enPlusService.signValidation(platformName,json);
         var data = JSONObject.parseObject(dataStr);
         LOGGER.info("【EN+推送】收到充电订单信息推送:{},解密数据:{}", json, data);
         var startChargeSeq = data.getString("StartChargeSeq");

+ 59 - 45
service/src/main/java/com/kym/service/enplus/impl/EnPlusServiceImpl.java

@@ -10,11 +10,12 @@ 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.common.utils.CommUtil;
+import com.kym.common.utils.PlatformAesUtil;
 import com.kym.entity.common.RedisKeys;
 import com.kym.entity.enplus.EnRespQueryToken;
 import com.kym.entity.enplus.response.EnResponse;
+import com.kym.service.cache.PlatformCache;
 import com.kym.service.enplus.EnPlusService;
 import okhttp3.*;
 import org.slf4j.Logger;
@@ -63,17 +64,19 @@ public class EnPlusServiceImpl implements EnPlusService {
         }
     }
 
+
     /**
-     * EN+ POST请求专属方法
+     * 互联互通POST请求专属方法
      *
+     * @param platformName
      * @param url
      * @param params
      * @return
      */
     @Override
-    public EnResponse enPlusPost(String url, String params) {
+    public EnResponse platformPost(String platformName, String url, String params) {
         // token获取
-        var token = queryToken();
+        var token = queryPlatformToken(platformName);
         Headers headers = Headers.of("Authorization", "Bearer ".concat(token));
         RequestBody requestBody = RequestBody.create(params, JSON);
         Request request = new Request.Builder()
@@ -87,7 +90,7 @@ public class EnPlusServiceImpl implements EnPlusService {
             return response;
         } else {
             LOGGER.error(":url:{}\n params:{}\ntoken:{}\n返回信息:{}", url, params, token, response);
-            if(4002 == response.getRet() ){
+            if (4002 == response.getRet()) {
                 // 如果返回Ret=4002,token错误的情况下,删除redis中的token,如果是预约订单则将此订单设置为延迟启动
                 redisTemplate.delete(RedisKeys.EN_PLUS_TOKEN);
                 throw new BusinessException(ResponseEnum.EN_PLUS_TOKEN_EXCEPTION);
@@ -96,17 +99,19 @@ public class EnPlusServiceImpl implements EnPlusService {
         }
     }
 
+
     /**
-     * 获取en+ AccessToken
-     * HMAC-MD5
-     * 签名密钥对整个消息体加密,MD5摘要,参数签名要求大写
-     * 签名消息体拼接顺序:OperatorID、Data、TimeStamp、Seq
+     * 查询平台互联互通token
+     *
+     * @param platformName
+     * @return
      */
     @Override
-    public String queryToken() {
-        LOGGER.debug("查询token");
+    public String queryPlatformToken(String platformName) {
+        LOGGER.info("查询互联互通平台token:{}", platformName);
         var token = redisTemplate.opsForValue().get(RedisKeys.EN_PLUS_TOKEN);
         if (CommUtil.isNotEmptyAndNull(token)) {
+            // todo 不同平台不同key
             LOGGER.debug("从缓存中查询到token:{},ttl:{}", token, redisTemplate.getExpire(RedisKeys.EN_PLUS_TOKEN));
             return token;
         }
@@ -117,20 +122,21 @@ public class EnPlusServiceImpl implements EnPlusService {
                 }
                 """.formatted(OperatorId, OperatorSecret);
 
-        var requestParams = buildParams(data);
+        var requestParams = buildParams(platformName, data);
 
-        var enResponse = enGetToken(EnPlusApi.EN_PLUS_QUERY_TOKEN.getApi(), requestParams);
+        var response = enGetToken(EnPlusApi.EN_PLUS_QUERY_TOKEN.getApi(), requestParams);
 
-        if (enResponse != null && 0 == enResponse.getRet()) {
+        if (response != null && 0 == response.getRet()) {
             // 解密Data获取token
-            var enRespQueryToken = JSONObject.parseObject(AESUtil.decrypt(enResponse.getData()), EnRespQueryToken.class);
-            LOGGER.debug("EN+接口AccessToken:{}", enRespQueryToken.toString());
+            var platformRespQueryToken = JSONObject.parseObject(new PlatformAesUtil(PlatformCache.INSTANCE.getPlatformByName(platformName)).decrypt(response.getData()), EnRespQueryToken.class);
+            LOGGER.debug("{}接口AccessToken:{}", platformName, platformRespQueryToken.toString());
             // 缓存token,有效期7天(我们这里每次请求en+获取token的有效期并不是从7天开始,有效期是在en+的剩余有效时间)
-            redisTemplate.opsForValue().set(RedisKeys.EN_PLUS_TOKEN, enRespQueryToken.getAccessToken(), enRespQueryToken.getTokenAvailableTime(), TimeUnit.SECONDS);
-            return enRespQueryToken.getAccessToken();
+            // todo 不同平台不同key
+            redisTemplate.opsForValue().set(RedisKeys.EN_PLUS_TOKEN, platformRespQueryToken.getAccessToken(), platformRespQueryToken.getTokenAvailableTime(), TimeUnit.SECONDS);
+            return platformRespQueryToken.getAccessToken();
         } else {
             // 记录错误码,返回错误信息
-            LOGGER.error("EN+接口错误:接口名{}:返回信息:{}", "query_token", enResponse);
+            LOGGER.error("{}接口错误:接口名{}:返回信息:{}", platformName, "query_token", response);
             throw new BusinessException(ResponseEnum.EN_PLUS_QUERY_TOKEN_ERROR);
         }
     }
@@ -154,15 +160,16 @@ public class EnPlusServiceImpl implements EnPlusService {
 
 
     /**
-     * 加密数据、签名、组装请求消息体
+     * 根据平台分别加密数据、签名、组装请求消息体
      *
+     * @param platformName
      * @param params
      * @return
      */
     @Override
-    public String buildParams(String params) {
+    public String buildParams(String platformName, String params) {
         // 使用DataSecret对data加密
-        var dataStr = AESUtil.encrypt(params);
+        var dataStr = new PlatformAesUtil(PlatformCache.INSTANCE.getPlatformByName(platformName)).encrypt(params);
         // 时间戳
         var timeStamp = LocalDateTimeUtil.format(LocalDateTime.now(), DatePattern.PURE_DATETIME_PATTERN);
         // 自增序列
@@ -186,11 +193,12 @@ public class EnPlusServiceImpl implements EnPlusService {
     /**
      * 验签、解密推送消息
      *
+     * @param platformName
      * @param json
      * @return
      */
     @Override
-    public String signValidation(JSONObject json) {
+    public String signValidation(String platformName, JSONObject json) {
         // 验签 解密数据
         var OperatorID = json.getString("OperatorID");
         var Data = json.getString("Data");
@@ -203,7 +211,7 @@ public class EnPlusServiceImpl implements EnPlusService {
         var sign = mac.digestHex(signString).toUpperCase();
         if (sign.equals(Sig)) {
             // 解密数据
-            return AESUtil.decrypt(Data);
+            return new PlatformAesUtil(PlatformCache.INSTANCE.getPlatformByName(platformName)).decrypt(Data);
         } else {
             // 验签失败
             EnResponse enResponse = new EnResponse();
@@ -219,47 +227,50 @@ public class EnPlusServiceImpl implements EnPlusService {
     /**
      * 请求设备认证
      *
+     * @param platformName 互联互通平台名称
      * @param connectorId  充电设备接口编码
      * @param equipAuthSeq 格式:运营商ID+唯一编码 27字符
      * @return
      */
     @Override
-    public JSONObject queryEquipAuth(String connectorId, String equipAuthSeq) {
+    public JSONObject queryEquipAuth(String platformName, String connectorId, String equipAuthSeq) {
         var param = """
                 {
                     "EquipAuthSeq":"%s",
                     "ConnectorID":"%s"
                 }
                 """.formatted(equipAuthSeq, connectorId);
-        var response = enPlusPost(EnPlusApi.EN_PLUS_QUERY_EQUIP_AUTH.getApi(), buildParams(param));
+        var response = platformPost(platformName,EnPlusApi.EN_PLUS_QUERY_EQUIP_AUTH.getApi(), buildParams(platformName,param));
 
-        return JSONObject.parseObject(AESUtil.decrypt(response.getData()));
+        return JSONObject.parseObject(new PlatformAesUtil(PlatformCache.INSTANCE.getPlatformByName(platformName)).decrypt(response.getData()));
     }
 
 
     /**
      * 查询业务策略信息
      *
-     * @param equipBizSeq 业务策略查询流水号 格式:运营商ID+唯一编码 27字符
-     * @param connectorId 充电设备接口编码
+     * @param platformName 互联互通平台名称
+     * @param equipBizSeq  业务策略查询流水号 格式:运营商ID+唯一编码 27字符
+     * @param connectorId  充电设备接口编码
      * @return
      */
     @Override
     @DynamicCache(spel = "#connectorId")
-    public JSONObject queryEquipBusinessPolicy(String equipBizSeq, String connectorId) {
+    public JSONObject queryEquipBusinessPolicy(String platformName, String equipBizSeq, String connectorId) {
         var param = """
                 {
                     "EquipBizSeq":"%s",
                     "ConnectorID":"%s"
                 }
                 """.formatted(equipBizSeq, connectorId);
-        var response = enPlusPost(EnPlusApi.EN_PLUS_QUERY_EQUIP_BUSINESS_POLICY.getApi(), buildParams(param));
-        return JSONObject.parseObject(AESUtil.decrypt(response.getData()));
+        var response = platformPost(platformName,EnPlusApi.EN_PLUS_QUERY_EQUIP_BUSINESS_POLICY.getApi(), buildParams(platformName,param));
+        return JSONObject.parseObject(new PlatformAesUtil(PlatformCache.INSTANCE.getPlatformByName(platformName)).decrypt(response.getData()));
     }
 
     /**
      * 请求EN+启动充电
      *
+     * @param platformName
      * @param startChargeSeq
      * @param connectorId
      * @param qrCode
@@ -267,7 +278,7 @@ public class EnPlusServiceImpl implements EnPlusService {
      * @return
      */
     @Override
-    public JSONObject queryStartCharge(String startChargeSeq, String connectorId, String qrCode, Integer amount) {
+    public JSONObject queryStartCharge(String platformName, String startChargeSeq, String connectorId, String qrCode, Integer amount) {
         var param = """
                 {
                     "StartChargeSeq":"%s",
@@ -276,63 +287,66 @@ public class EnPlusServiceImpl implements EnPlusService {
                     "amount":"%d"
                 }
                 """.formatted(startChargeSeq, connectorId, qrCode, amount);
-        var response = enPlusPost(EnPlusApi.EN_PLUS_QUERY_START_CHARGE.getApi(), buildParams(param));
-        return JSONObject.parseObject(AESUtil.decrypt(response.getData()));
+        var response = platformPost(platformName,EnPlusApi.EN_PLUS_QUERY_START_CHARGE.getApi(), buildParams(platformName,param));
+        return JSONObject.parseObject(new PlatformAesUtil(PlatformCache.INSTANCE.getPlatformByName(platformName)).decrypt(response.getData()));
     }
 
     /**
      * 查询充电状态
      *
+     * @param platformName
      * @param startChargeSeq
      * @return
      */
     @Override
-    public JSONObject queryEquipChargeStatus(String startChargeSeq) {
+    public JSONObject queryEquipChargeStatus(String platformName, String startChargeSeq) {
         var param = """
                 {
                     "StartChargeSeq":"%s"
                 }
                 """.formatted(startChargeSeq);
-        var response = enPlusPost(EnPlusApi.EN_PLUS_QUERY_EQUIP_CHARGE_STATUS.getApi(), buildParams(param));
-        return JSONObject.parseObject(AESUtil.decrypt(response.getData()));
+        var response = platformPost(platformName,EnPlusApi.EN_PLUS_QUERY_EQUIP_CHARGE_STATUS.getApi(), buildParams(platformName,param));
+        return JSONObject.parseObject(new PlatformAesUtil(PlatformCache.INSTANCE.getPlatformByName(platformName)).decrypt(response.getData()));
     }
 
     /**
      * 与en+开发约定使用该接口更新正在充电中的订单的金额信息,解决充电过程中用户充值续充场景
      *
+     * @param platformName
      * @param startChargeSeq
-     * @param amount
+     * @param amount         【EN+互联互通扩展参数】
      * @return
      */
     @Override
-    public JSONObject updateBalanceByQueryEquipChargeStatus(String startChargeSeq, int amount) {
+    public JSONObject updateBalanceByQueryEquipChargeStatus(String platformName, String startChargeSeq, int amount) {
         var param = """
                 {
                     "StartChargeSeq":"%s",
                     "amount":%d
                 }
                 """.formatted(startChargeSeq, amount);
-        var response = enPlusPost(EnPlusApi.EN_PLUS_QUERY_EQUIP_CHARGE_STATUS.getApi(), buildParams(param));
-        return JSONObject.parseObject(AESUtil.decrypt(response.getData()));
+        var response = platformPost(platformName,EnPlusApi.EN_PLUS_QUERY_EQUIP_CHARGE_STATUS.getApi(), buildParams(platformName,param));
+        return JSONObject.parseObject(new PlatformAesUtil(PlatformCache.INSTANCE.getPlatformByName(platformName)).decrypt(response.getData()));
     }
 
     /**
      * 请求停止充电
      *
+     * @param platformName
      * @param startChargeSeq
      * @param connectorId
      * @return
      */
     @Override
-    public JSONObject queryStopCharge(String startChargeSeq, String connectorId) {
+    public JSONObject queryStopCharge(String platformName, 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 JSONObject.parseObject(AESUtil.decrypt(response.getData()));
+        var response = platformPost(platformName,EnPlusApi.EN_PLUS_QUERY_STOP_CHARGE.getApi(), buildParams(platformName,param));
+        return JSONObject.parseObject(new PlatformAesUtil(PlatformCache.INSTANCE.getPlatformByName(platformName)).decrypt(response.getData()));
     }
 
 }

+ 0 - 2
service/src/main/java/com/kym/service/miniapp/CollectService.java

@@ -18,7 +18,5 @@ public interface CollectService extends MPJBaseService<Collect> {
 
     void updateCollect(String stationId, Integer status);
 
-    List<EnStationStatusInfo> getCollectList();
-
     List<Collect> listCollect();
 }

+ 10 - 6
service/src/main/java/com/kym/service/miniapp/impl/ChargeServiceImpl.java

@@ -21,6 +21,7 @@ import com.kym.service.admin.ConnectorInfoService;
 import com.kym.service.admin.EquipmentInfoService;
 import com.kym.service.admin.EquipmentRelationService;
 import com.kym.service.cache.KymCache;
+import com.kym.service.cache.PlatformCache;
 import com.kym.service.enplus.EnPlusService;
 import com.kym.service.jobs.DelayService;
 import com.kym.service.miniapp.*;
@@ -33,7 +34,6 @@ import org.springframework.data.redis.core.StringRedisTemplate;
 import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
 
-import java.math.BigDecimal;
 import java.time.Duration;
 import java.time.LocalDateTime;
 import java.util.Map;
@@ -374,7 +374,7 @@ public class ChargeServiceImpl implements ChargeService {
     private Map<String, String> startCharge(ChargeOrder order, String connectorId, int amount) {
 
         // 请求设备认证
-        var equipAuth = enPlusService.queryEquipAuth(connectorId, order.getStartChargeSeq());
+        var equipAuth = enPlusService.queryEquipAuth(PlatformCache.INSTANCE.getPlatformNameByConnectorId(connectorId), connectorId, order.getStartChargeSeq());
 
         if (equipAuth.containsKey("SuccStat") && equipAuth.getIntValue("SuccStat") == 0) {
             // 启动充电
@@ -383,7 +383,7 @@ public class ChargeServiceImpl implements ChargeService {
             try {
                 // 二维码文本
                 var qrCode = "";
-                startCharge = enPlusService.queryStartCharge(order.getStartChargeSeq(), connectorId, qrCode, amount);
+                startCharge = enPlusService.queryStartCharge(PlatformCache.INSTANCE.getPlatformNameByConnectorId(connectorId), order.getStartChargeSeq(), connectorId, qrCode, amount);
             } catch (Exception e) {
                 // 这里可能超时,忽略
                 LOGGER.error("EN+启动充电超时,订单:{}", order.getStartChargeSeq());
@@ -541,13 +541,17 @@ public class ChargeServiceImpl implements ChargeService {
         connectorId = getConnectorId(connectorId);
         LOGGER.info("用户:{},设备:{}请求停止充电", userId, connectorId);
         // 查询充电订单
-        var chargeOrder = chargeOrderService.lambdaQuery().eq(ChargeOrder::getUserId, userId).eq(ChargeOrder::getConnectorId, connectorId).eq(ChargeOrder::getChargeStatus, ChargeOrder.CHARGE_STATUS_充电中).one();
+        var chargeOrder = chargeOrderService.lambdaQuery()
+                .eq(ChargeOrder::getUserId, userId)
+                .eq(ChargeOrder::getConnectorId, connectorId)
+                .eq(ChargeOrder::getChargeStatus, ChargeOrder.CHARGE_STATUS_充电中)
+                .one();
         if (chargeOrder == null) {
             // 记录失败原因
             LOGGER.error("用户:{}请求停止充电异常,设备:{}无进行中的订单", userId, connectorId);
             throw new BusinessException(ResponseEnum.NO_ORDER_IN_PROGRESS);
         }
-        var data = enPlusService.queryStopCharge(chargeOrder.getStartChargeSeq(), connectorId);
+        var data = enPlusService.queryStopCharge(PlatformCache.INSTANCE.getPlatformNameByConnectorId(connectorId), chargeOrder.getStartChargeSeq(), connectorId);
         if (data.containsKey("SuccStat") && data.getIntValue("SuccStat") != 0) {
             // 记录失败原因
             LOGGER.error("订单:{}停止充电失败,返回结果:{}", chargeOrder.getStartChargeSeq(), data);
@@ -566,7 +570,7 @@ public class ChargeServiceImpl implements ChargeService {
     @Override
     public EnBusinessPolicy queryEquipBusinessPolicy(String connectorId) {
         var equipBizSeq = OrderUtils.getOrderNo(enPlusConfig.getOperatorId());
-        var data = enPlusService.queryEquipBusinessPolicy(equipBizSeq, connectorId);
+        var data = enPlusService.queryEquipBusinessPolicy(PlatformCache.INSTANCE.getPlatformNameByConnectorId(connectorId),equipBizSeq, connectorId);
         return data.toJavaObject(EnBusinessPolicy.class);
     }
 

+ 0 - 18
service/src/main/java/com/kym/service/miniapp/impl/CollectServiceImpl.java

@@ -62,24 +62,6 @@ public class CollectServiceImpl extends MPJBaseServiceImpl<CollectMapper, Collec
 
     }
 
-    /**
-     * 收藏列表
-     * 获取EN+对应站点数据
-     *
-     * @return
-     */
-    @Override
-    public List<EnStationStatusInfo> getCollectList() {
-        var userid = StpUtil.getLoginIdAsLong();
-        var collectList = lambdaQuery().eq(Collect::getUserId, userid).list().stream().map(c -> String.valueOf(c.getStationId())).toArray(String[]::new);
-        if (collectList.length == 0) {
-            return stationService.stationStatus(collectList);
-        } else {
-            return null;
-        }
-
-    }
-
     /**
      * 获取收藏列表,前端匹配站点详情数据
      *

+ 2 - 1
service/src/main/java/com/kym/service/wechat/impl/WxPayServiceImpl.java

@@ -25,6 +25,7 @@ import com.kym.entity.miniapp.*;
 import com.kym.entity.wechat.*;
 import com.kym.service.admin.ActivityService;
 import com.kym.service.admin.InvoiceDetailService;
+import com.kym.service.cache.PlatformCache;
 import com.kym.service.enplus.EnPlusService;
 import com.kym.service.miniapp.*;
 import com.kym.service.wechat.WxPayService;
@@ -362,7 +363,7 @@ public class WxPayServiceImpl implements WxPayService {
                 if (chargingOrder != null) {
                     var account = accountService.getAccountByUserId(walletDetail.getUserId());
                     // TODO: 2023-11-30 快充这里考虑过充的金额要提高
-                    var res = enPlusService.updateBalanceByQueryEquipChargeStatus(chargingOrder.getStartChargeSeq(), account.getBalance() - 50);
+                    var res = enPlusService.updateBalanceByQueryEquipChargeStatus(PlatformCache.INSTANCE.getPlatformNameByConnectorId(chargingOrder.getConnectorId()),chargingOrder.getStartChargeSeq(), account.getBalance() - 50);
                     LOGGER.info("用户:{}充电过程中充值,已更新en+充电金额,en+返回数据:{}", account.getUserId(), res);
                 }
                 return ResponseEntity.status(HttpStatus.OK).build();