Преглед на файлове

优化:替换缓存循环依赖,规范业务边界

skyline преди 2 години
родител
ревизия
03a22a6445

+ 6 - 9
admin/src/main/java/com/kym/admin/controller/StationController.java

@@ -6,7 +6,6 @@ import com.kym.common.annotation.SysLog;
 import com.kym.entity.admin.Station;
 import com.kym.service.admin.StationService;
 import com.kym.service.cache.KymCache;
-import org.springframework.context.annotation.Lazy;
 import org.springframework.format.annotation.DateTimeFormat;
 import org.springframework.web.bind.annotation.*;
 
@@ -26,18 +25,16 @@ public class StationController {
 
     private final StationService stationService;
 
-    private final KymCache kymCache;
 
-    public StationController(StationService stationService, @Lazy KymCache kymCache) {
+    public StationController(StationService stationService) {
         this.stationService = stationService;
-        this.kymCache = kymCache;
     }
 
     @SysLog("充电站数据统计")
     @GetMapping("/stationStatusDetail")
     R<?> stationStatusDetail(@RequestParam("stationId") String stationId,
-                          @RequestParam("startTime") @DateTimeFormat(pattern = "yyyy-MM-dd") String startTime,
-                          @RequestParam("endTime") @DateTimeFormat(pattern = "yyyy-MM-dd") String endTime) {
+                             @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);
@@ -47,9 +44,9 @@ public class StationController {
     @GetMapping("listStation")
     R<?> listStation(@RequestParam(required = false) String stationName) {
         // 判断数据权限
-        var adminStationId = kymCache.getAdminUserStationId(StpUtil.getLoginIdAsLong());
+        var adminStationId = KymCache.INSTANCE.getAdminUserStationId(StpUtil.getLoginIdAsLong());
         var res = stationService.lambdaQuery()
-                .eq(Station::getStationStatus,Station.STATION_STATUS_正常使用)
+                .eq(Station::getStationStatus, Station.STATION_STATUS_正常使用)
                 .eq(isNotNull(adminStationId), Station::getStationId, adminStationId)
                 .like(isNotNull(stationName), Station::getStationName, stationName)
                 .orderByAsc(Station::getStationId).list();
@@ -58,7 +55,7 @@ public class StationController {
 
     @SysLog("修改站点信息")
     @PostMapping("modify")
-    R<?> modifyStation(@RequestBody Station station){
+    R<?> modifyStation(@RequestBody Station station) {
         stationService.modifyStation(station);
         return R.success();
     }

+ 3 - 5
admin/src/main/java/com/kym/admin/jobs/OfflineNotifyJob.java

@@ -7,7 +7,6 @@ import com.kym.service.cache.KymCache;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Value;
-import org.springframework.context.annotation.Lazy;
 import org.springframework.data.redis.core.StringRedisTemplate;
 import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Component;
@@ -28,14 +27,12 @@ import java.util.stream.Collectors;
 public class OfflineNotifyJob {
 
     private final StringRedisTemplate redisTemplate;
-    private final KymCache kymCache;
 
     @Value("${kym.notify-email}")
     private String notifyEmail;
 
-    public OfflineNotifyJob(StringRedisTemplate redisTemplate, @Lazy KymCache kymCache) {
+    public OfflineNotifyJob(StringRedisTemplate redisTemplate) {
         this.redisTemplate = redisTemplate;
-        this.kymCache = kymCache;
     }
 
     // 每5min执行一次
@@ -51,7 +48,8 @@ public class OfflineNotifyJob {
              * 【阳光粤海家园】:002001,002002,002003
              */
             var temp = "【%s】:%s\n";
-            var map = new ArrayList<String>(offlineList).stream().collect(Collectors.toMap(kymCache::getShortId, kymCache::getStationNameByConnectorId));
+            var map = new ArrayList<String>(offlineList).stream()
+                    .collect(Collectors.toMap(KymCache.INSTANCE::getShortIdByEquipmentIdOrConnectorId, KymCache.INSTANCE::getStationNameById));
             // 以站点名称分组
             var list = map.entrySet().stream().collect(Collectors.groupingBy(Map.Entry::getValue));
             StringBuilder sb = new StringBuilder();

+ 13 - 2
service/src/main/java/com/kym/service/admin/impl/AdminUserStationServiceImpl.java

@@ -1,12 +1,17 @@
 package com.kym.service.admin.impl;
 
 import com.baomidou.dynamic.datasource.annotation.DS;
+import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.kym.entity.admin.AdminUserStation;
 import com.kym.mapper.admin.AdminUserStationMapper;
 import com.kym.service.admin.AdminUserStationService;
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.kym.service.cache.KymCache;
+import jakarta.annotation.PostConstruct;
 import org.springframework.stereotype.Service;
 
+import java.util.stream.Collectors;
+
 /**
  * <p>
  * 操作员站点关联表 服务实现类
@@ -18,5 +23,11 @@ import org.springframework.stereotype.Service;
 @Service
 @DS("db-admin")
 public class AdminUserStationServiceImpl extends ServiceImpl<AdminUserStationMapper, AdminUserStation> implements AdminUserStationService {
-    
+
+    @PostConstruct
+    private void init() {
+        DynamicDataSourceContextHolder.push("db-admin");
+        KymCache.INSTANCE.putAdminUser2Station(list().stream().collect(Collectors.toMap(AdminUserStation::getAdminUserId, AdminUserStation::getStationId)));
+        DynamicDataSourceContextHolder.poll();
+    }
 }

+ 15 - 10
service/src/main/java/com/kym/service/admin/impl/EquipmentInfoServiceImpl.java

@@ -2,6 +2,7 @@ package com.kym.service.admin.impl;
 
 import cn.dev33.satoken.stp.StpUtil;
 import com.baomidou.dynamic.datasource.annotation.DS;
+import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.github.pagehelper.PageHelper;
 import com.kym.common.utils.CommUtil;
@@ -11,7 +12,7 @@ import com.kym.entity.common.PageBean;
 import com.kym.mapper.admin.EquipmentInfoMapper;
 import com.kym.service.admin.EquipmentInfoService;
 import com.kym.service.cache.KymCache;
-import org.springframework.context.annotation.Lazy;
+import jakarta.annotation.PostConstruct;
 import org.springframework.stereotype.Service;
 
 import java.util.Comparator;
@@ -32,31 +33,35 @@ import static com.baomidou.mybatisplus.core.toolkit.ObjectUtils.isNotNull;
 @DS("db-admin")
 public class EquipmentInfoServiceImpl extends ServiceImpl<EquipmentInfoMapper, EquipmentInfo> implements EquipmentInfoService {
 
-    private final KymCache kymCache;
 
-    public EquipmentInfoServiceImpl(@Lazy KymCache kymCache) {
-        this.kymCache = kymCache;
+    @PostConstruct
+    private void init() {
+        // 手动切换数据源
+        DynamicDataSourceContextHolder.push("db-admin");
+        KymCache.INSTANCE.putConnectorId2ParkingNo(list().stream().collect(Collectors.toMap(equipmentInfo -> equipmentInfo.getEquipmentId().concat("1"), EquipmentInfo::getParkingNo)));
+        DynamicDataSourceContextHolder.poll();
     }
 
+
     @Override
     public PageBean<EquipmentInfo> listEquipment(EquipmentQueryParam params) {
         // 判断数据权限
-        var adminStationId = kymCache.getAdminUserStationId(StpUtil.getLoginIdAsLong());
+        var adminStationId = KymCache.INSTANCE.getAdminUserStationId(StpUtil.getLoginIdAsLong());
         if (adminStationId != null) {
             params.setStationId(adminStationId);
         }
         PageHelper.startPage(params.getPageNum(), params.getPageSize());
         var equipmentInfos = lambdaQuery()
-                .eq(isNotNull(params.getEquipmentId()), EquipmentInfo::getEquipmentId, isNotNull(params.getEquipmentId()) ? kymCache.getConnectorId(params.getEquipmentId()).substring(0, 16) : "")
+                .eq(isNotNull(params.getEquipmentId()), EquipmentInfo::getEquipmentId, isNotNull(params.getEquipmentId()) ? KymCache.INSTANCE.getConnectorId(params.getEquipmentId()).substring(0, 16) : "")
                 .eq(isNotNull(params.getStationId()), EquipmentInfo::getStationId, params.getStationId())
                 .eq(isNotNull(params.getStatus()), EquipmentInfo::getNetStatus, params.getStatus())
                 .list();
         var page = new PageBean<>(equipmentInfos);
         // TODO: 2023-09-02  parallelStream 这里可能有坑,注意检查
         var res = equipmentInfos.parallelStream().map(item ->
-                        item.setShortId(kymCache.getShortId(item.getEquipmentId())).setStationName(kymCache.getStationName(item.getStationId()))
-                )
-                .toList().stream().sorted(Comparator.comparing(EquipmentInfo::getShortId)).toList();
+                item.setShortId(KymCache.INSTANCE.getShortIdByEquipmentIdOrConnectorId(item.getEquipmentId()))
+                        .setStationName(KymCache.INSTANCE.getStationNameById(item.getStationId()))
+        ).toList().stream().sorted(Comparator.comparing(EquipmentInfo::getShortId)).toList();
         page.setList(res);
         return page;
     }
@@ -65,7 +70,7 @@ public class EquipmentInfoServiceImpl extends ServiceImpl<EquipmentInfoMapper, E
     public Map<Integer, Long> statEquipmentStatus(String stationId) {
         if (CommUtil.null2Long(stationId) <= 0) {
             // 判断数据权限
-            stationId = kymCache.getAdminUserStationId(StpUtil.getLoginIdAsLong());
+            stationId = KymCache.INSTANCE.getAdminUserStationId(StpUtil.getLoginIdAsLong());
         }
         // 获取指定站点下的充电桩
         var equipmentInfos = lambdaQuery().eq(isNotNull(stationId), EquipmentInfo::getStationId, stationId).list();

+ 21 - 4
service/src/main/java/com/kym/service/admin/impl/EquipmentRelationServiceImpl.java

@@ -1,15 +1,20 @@
 package com.kym.service.admin.impl;
 
 import com.baomidou.dynamic.datasource.annotation.DS;
+import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.kym.entity.admin.EquipmentRelation;
 import com.kym.mapper.admin.EquipmentRelationMapper;
 import com.kym.service.admin.EquipmentRelationService;
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.kym.service.cache.KymCache;
+import jakarta.annotation.PostConstruct;
 import org.springframework.stereotype.Service;
 
+import java.util.stream.Collectors;
+
 /**
  * <p>
- *  服务实现类
+ * 服务实现类
  * </p>
  *
  * @author skyline
@@ -19,13 +24,25 @@ import org.springframework.stereotype.Service;
 @DS("db-admin")
 public class EquipmentRelationServiceImpl extends ServiceImpl<EquipmentRelationMapper, EquipmentRelation> implements EquipmentRelationService {
 
+
+    @PostConstruct
+    private void init() {
+        // 初始化KymCache shortId:equipmentId
+        // 手动切换数据源
+        DynamicDataSourceContextHolder.push("db-admin");
+        KymCache.INSTANCE.putShort2EquipmentId(list().stream().collect(Collectors.toMap(EquipmentRelation::getConnectorId, EquipmentRelation::getShortId)));
+        // 初始化KymCache connectorId:stationId
+        KymCache.INSTANCE.putConnector2Station(list().stream().collect(Collectors.toMap(EquipmentRelation::getConnectorId, EquipmentRelation::getStationId)));
+        DynamicDataSourceContextHolder.poll();
+    }
+
     @Override
     public EquipmentRelation getByShortId(String shortId) {
-        return lambdaQuery().eq(EquipmentRelation::getShortId,shortId).one();
+        return lambdaQuery().eq(EquipmentRelation::getShortId, shortId).one();
     }
 
     @Override
     public EquipmentRelation getByEquipmentId(String equipmentId) {
-        return lambdaQuery().eq(EquipmentRelation::getEquipmentId,equipmentId).one();
+        return lambdaQuery().eq(EquipmentRelation::getEquipmentId, equipmentId).one();
     }
 }

+ 31 - 10
service/src/main/java/com/kym/service/admin/impl/StationServiceImpl.java

@@ -2,6 +2,7 @@ package com.kym.service.admin.impl;
 
 import com.alibaba.fastjson2.JSONObject;
 import com.baomidou.dynamic.datasource.annotation.DS;
+import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.kym.common.annotation.DynamicCache;
 import com.kym.common.enums.EnPlusApi;
@@ -20,14 +21,15 @@ import com.kym.service.admin.EquipmentInfoService;
 import com.kym.service.admin.StationService;
 import com.kym.service.cache.KymCache;
 import com.kym.service.enplus.EnPlusService;
+import jakarta.annotation.PostConstruct;
 import org.springframework.beans.BeanUtils;
-import org.springframework.context.annotation.Lazy;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.util.ArrayList;
 import java.util.Comparator;
 import java.util.List;
+import java.util.stream.Collectors;
 
 /**
  * <p>
@@ -41,19 +43,24 @@ import java.util.List;
 @DS("db-admin")
 public class StationServiceImpl extends ServiceImpl<StationMapper, Station> implements StationService {
 
-    private final KymCache kymCache;
     private final EnPlusService enPlusService;
     private final EquipmentInfoService equipmentInfoService;
     private final ConnectorInfoService connectorInfoService;
 
-
-    public StationServiceImpl(@Lazy KymCache kymCache, EnPlusService enPlusService, EquipmentInfoService equipmentInfoService, ConnectorInfoService connectorInfoService) {
-        this.kymCache = kymCache;
+    public StationServiceImpl(EnPlusService enPlusService, EquipmentInfoService equipmentInfoService, ConnectorInfoService connectorInfoService) {
         this.enPlusService = enPlusService;
         this.equipmentInfoService = equipmentInfoService;
         this.connectorInfoService = connectorInfoService;
     }
 
+    @PostConstruct
+    private void init() {
+        // 手动切换数据源
+        DynamicDataSourceContextHolder.push("db-admin");
+        KymCache.INSTANCE.putStationId2Name(list().stream().collect(Collectors.toMap(Station::getStationId, Station::getStationName)));
+        DynamicDataSourceContextHolder.poll();
+    }
+
     @Override
     @DynamicCache // 方法的返回结果加一层方法缓存,5分钟内不变
     public List<StationVo> queryStationInfo(int pageNum, int pageSize) {
@@ -71,8 +78,8 @@ public class StationServiceImpl extends ServiceImpl<StationMapper, Station> impl
         var stations = list();
         stationList.forEach(station -> {
             station.getEquipmentInfos().forEach(enEquipmentInfo ->
-                    enEquipmentInfo.setShortId(kymCache.getShortId(enEquipmentInfo.getEquipmentId()))
-                            .setParkingNo(kymCache.getParkNoByEquipmentId(enEquipmentInfo.getEquipmentId())));
+                    enEquipmentInfo.setShortId(KymCache.INSTANCE.getShortIdByEquipmentIdOrConnectorId(enEquipmentInfo.getEquipmentId()))
+                            .setParkingNo(KymCache.INSTANCE.getParkNoByEquipmentIdOrConnectorId(enEquipmentInfo.getEquipmentId())));
             station.setPictures(stations.stream().filter(item -> item.getStationId().equals(station.getStationId())).toList().get(0).getPictures());
         });
 
@@ -159,9 +166,23 @@ public class StationServiceImpl extends ServiceImpl<StationMapper, Station> impl
         var stations = list().stream().map(Station::getStationId).toList();
         var equipments = equipmentInfoService.list().stream().map(EquipmentInfo::getEquipmentId).toList();
         var connectors = connectorInfoService.list().stream().map(ConnectorInfo::getConnectorId).toList();
-        saveBatch(stationList.stream().filter(station -> !stations.contains(station.getStationId())).toList());
-        equipmentInfoService.saveBatch(equipmentList.stream().filter(equipmentInfo -> !equipments.contains(equipmentInfo.getEquipmentId())).toList());
-        connectorInfoService.saveBatch(connectorList.stream().filter(connector -> !connectors.contains(connector.getConnectorId())).toList());
+
+        // 新增的数据
+        var newStations = stationList.stream().filter(station -> !stations.contains(station.getStationId())).toList();
+        var newEquipmentInfos = equipmentList.stream().filter(equipmentInfo -> !equipments.contains(equipmentInfo.getEquipmentId())).toList();
+        var newConnectors = connectorList.stream().filter(connector -> !connectors.contains(connector.getConnectorId())).toList();
+
+        // 将充电站相关数据写入KymCache
+        // 手动切换数据源
+        DynamicDataSourceContextHolder.push("db-admin");
+        KymCache.INSTANCE.putStationId2Name(newStations.stream().collect(Collectors.toMap(Station::getStationId, Station::getStationName)));
+        KymCache.INSTANCE.putConnectorId2ParkingNo(newEquipmentInfos.stream().collect(Collectors.toMap(equipmentInfo -> equipmentInfo.getEquipmentId().concat("1"), EquipmentInfo::getParkingNo)));
+        DynamicDataSourceContextHolder.poll();
+
+        // 新数据写入数据库
+        saveBatch(newStations);
+        equipmentInfoService.saveBatch(newEquipmentInfos);
+        connectorInfoService.saveBatch(newConnectors);
     }
 
     @Override

+ 90 - 90
service/src/main/java/com/kym/service/cache/KymCache.java

@@ -1,129 +1,129 @@
 package com.kym.service.cache;
 
-import com.baomidou.dynamic.datasource.annotation.DS;
-import com.kym.entity.admin.AdminUserStation;
-import com.kym.entity.admin.EquipmentInfo;
-import com.kym.entity.admin.EquipmentRelation;
-import com.kym.entity.admin.Station;
-import com.kym.service.admin.AdminUserStationService;
-import com.kym.service.admin.EquipmentInfoService;
-import com.kym.service.admin.EquipmentRelationService;
-import com.kym.service.admin.StationService;
-import lombok.Data;
-import org.springframework.stereotype.Component;
-
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
-import java.util.stream.Collectors;
 
 /**
  * @author skyline
  * @description
  * @date 2023-08-25 22:58
  */
-@Component
-@Data
-public class KymCache {
+public enum KymCache {
+    INSTANCE;
 
-    private static ConcurrentHashMap<String, String> SHORT_ID_MAPPING = new ConcurrentHashMap<>();
-    private static ConcurrentHashMap<String, String> CONNECTOR_STATION_MAPPING = new ConcurrentHashMap<>();
+    private static ConcurrentHashMap<String, String> CONNECTOR_ID_SHORT_ID_MAPPING = new ConcurrentHashMap<>();
+    private static ConcurrentHashMap<String, String> CONNECTOR_ID_STATION_ID_MAPPING = new ConcurrentHashMap<>();
     private static ConcurrentHashMap<String, String> STATION_MAPPING = new ConcurrentHashMap<>();
     private static ConcurrentHashMap<Long, String> ADMIN_USER_STATION = new ConcurrentHashMap<>();
     private static ConcurrentHashMap<String, String> EQUIPMENT_ID_PARKING_NO_MAPPING = new ConcurrentHashMap<>();
-    private final EquipmentRelationService relationService;
-    private final StationService stationService;
-    private final AdminUserStationService adminUserStationService;
-    private final EquipmentInfoService equipmentInfoService;
-
-    public KymCache(EquipmentRelationService relationService, StationService stationService, AdminUserStationService adminUserStationService, EquipmentInfoService equipmentInfoService) {
-        this.relationService = relationService;
-        this.stationService = stationService;
-        this.adminUserStationService = adminUserStationService;
-        this.equipmentInfoService = equipmentInfoService;
-
-        SHORT_ID_MAPPING.putAll( relationService.list().stream().collect(Collectors.toMap(EquipmentRelation::getEquipmentId, EquipmentRelation::getShortId)));
-        CONNECTOR_STATION_MAPPING.putAll( relationService.list().stream().collect(Collectors.toMap(EquipmentRelation::getConnectorId, EquipmentRelation::getStationId)));
 
-        STATION_MAPPING.putAll(stationService.list().stream().collect(Collectors.toMap(Station::getStationId, Station::getStationName)));
-        ADMIN_USER_STATION.putAll(adminUserStationService.list().stream().collect(Collectors.toMap(AdminUserStation::getAdminUserId, AdminUserStation::getStationId)));
-        EQUIPMENT_ID_PARKING_NO_MAPPING.putAll(equipmentInfoService.list().stream().collect(Collectors.toMap(EquipmentInfo::getEquipmentId, EquipmentInfo::getParkingNo)));
+    public void putShort2EquipmentId(Map<String, String> map) {
+        CONNECTOR_ID_SHORT_ID_MAPPING.putAll(map);
     }
 
-    @DS("db-admin")
-    public String getShortId(String equipmentId) {
-        if (equipmentId.length() == 17) {
-            equipmentId = equipmentId.substring(0, 16);
-        }
-        var res = SHORT_ID_MAPPING.get(equipmentId);
-        if (res == null) {
-            var relation = relationService.lambdaQuery().eq(EquipmentRelation::getEquipmentId, equipmentId).one();
-            if (relation != null) {
-                res = relation.getShortId();
-                SHORT_ID_MAPPING.put(equipmentId, res);
-            }
-        }
+    /**
+     * 通过设备编号或者枪头编号获取设备短编号
+     *
+     * @param id
+     * @return
+     */
+    public String getShortIdByEquipmentIdOrConnectorId(String id) {
+        var connectorId = getConnectorId(id);
+        var res = CONNECTOR_ID_SHORT_ID_MAPPING.get(connectorId);
+//        if (res == null) {
+//            var relation = relationService.lambdaQuery().eq(EquipmentRelation::getEquipmentId, equipmentId).one();
+//            if (relation != null) {
+//                res = relation.getShortId();
+//                CONNECTOR_ID_SHORT_ID_MAPPING.put(equipmentId, res);
+//            }
+//        }
         return res;
     }
 
+
+    public void putConnector2Station(Map<String, String> map) {
+        CONNECTOR_ID_STATION_ID_MAPPING.putAll(map);
+    }
+
     /**
-     * 转化成17为的connectorId
+     * 通过设备编号或者枪头编号获取站点id
      *
-     * @param equipmentId
+     * @param id
      * @return
      */
-    public String getConnectorId(String equipmentId) {
-        return switch (equipmentId.length()) {
-            case 17 -> equipmentId;
-            case 16 -> equipmentId.concat("1");
-            case 6 ->
-                    SHORT_ID_MAPPING.entrySet().stream().filter(entry -> equipmentId.equals(entry.getValue())).map(Map.Entry::getKey).findFirst().get();
-            default -> null;
-        };
+    public String getStationIdByEquipmentIdOrConnectorId(String id) {
+        var connectorId = getConnectorId(id);
+        var res = CONNECTOR_ID_STATION_ID_MAPPING.get(connectorId);
+//        if (res == null) {
+//            var relation = relationService.lambdaQuery().eq(EquipmentRelation::getConnectorId, connectorId).one();
+//            if (relation != null) {
+//                res = relation.getStationId();
+//                CONNECTOR_STATION_MAPPING.put(connectorId, res);
+//            }
+//        }
+        return res;
     }
 
-    @DS("db-admin")
-    public String getStationId(String connectorId) {
-        var res = CONNECTOR_STATION_MAPPING.get(connectorId);
-        if (res == null) {
-            var relation = relationService.lambdaQuery().eq(EquipmentRelation::getConnectorId, connectorId).one();
-            if (relation != null) {
-                res = relation.getStationId();
-                CONNECTOR_STATION_MAPPING.put(connectorId, res);
-            }
-        }
-        return res;
+    public void putStationId2Name(Map<String, String> map) {
+        STATION_MAPPING.putAll(map);
     }
 
-    public String getStationNameByConnectorId(String connectorId) {
-        connectorId = getConnectorId(connectorId);
-        var stationId = CONNECTOR_STATION_MAPPING.get(connectorId);
-        return getStationName(stationId);
+    /**
+     * 通过站点id获取站点名称
+     *
+     * @param stationId
+     * @return
+     */
+    public String getStationNameById(String stationId) {
+        return STATION_MAPPING.get(stationId);
     }
 
-    @DS("db-admin")
-    public String getStationName(String stationId) {
-        var res = STATION_MAPPING.get(stationId);
-        if (res == null) {
-            var station = stationService.lambdaQuery().eq(Station::getStationId, stationId).one();
-            if (station != null) {
-                res = station.getStationId();
-                STATION_MAPPING.put(stationId, res);
-            }
-        }
-        return res;
+    // TODO: 2023-11-24 这里目前只有一对一关系,后续改一对多
+    public void putAdminUser2Station(Map<Long, String> map) {
+        ADMIN_USER_STATION.putAll(map);
     }
 
-    @DS("db-admin")
+    /**
+     * 获取运营平台操作员有权限的站点ID
+     *
+     * @param adminUserId
+     * @return
+     */
     public String getAdminUserStationId(Long adminUserId) {
         var res = ADMIN_USER_STATION.get(adminUserId);
-        if (res == null) {
-            var adminUserStation = adminUserStationService.lambdaQuery().eq(AdminUserStation::getAdminUserId, adminUserId).one();
-            res = adminUserStation == null ? null : adminUserStation.getStationId();
-        }
+//        if (res == null) {
+//            var adminUserStation = adminUserStationService.lambdaQuery().eq(AdminUserStation::getAdminUserId, adminUserId).one();
+//            res = adminUserStation == null ? null : adminUserStation.getStationId();
+//        }
         return res;
     }
 
-    public String getParkNoByEquipmentId(String equipmentId){
-        return EQUIPMENT_ID_PARKING_NO_MAPPING.get(equipmentId);
+    public void putConnectorId2ParkingNo(Map<String, String> map) {
+        EQUIPMENT_ID_PARKING_NO_MAPPING.putAll(map);
+    }
+
+    /**
+     * @param id
+     * @return
+     */
+    public String getParkNoByEquipmentIdOrConnectorId(String id) {
+        var connectorId = getConnectorId(id);
+        return EQUIPMENT_ID_PARKING_NO_MAPPING.get(connectorId);
+    }
+
+    /**
+     * 将equipmentId,connectorId,shortId转化成17为的connectorId
+     *
+     * @param id
+     * @return
+     */
+    public String getConnectorId(String id) {
+        return switch (id.length()) {
+            case 17 -> id;
+            case 16 -> id.concat("1");
+            case 6 ->
+                    CONNECTOR_ID_SHORT_ID_MAPPING.entrySet().stream().filter(entry -> id.equals(entry.getValue())).map(Map.Entry::getKey).findFirst().get();
+            default -> null;
+        };
     }
 }

+ 8 - 6
service/src/main/java/com/kym/service/enplus/impl/EnNotifyServiceImpl.java

@@ -20,6 +20,7 @@ import com.kym.service.cache.KymCache;
 import com.kym.service.enplus.EnNotifyService;
 import com.kym.service.enplus.EnPlusService;
 import com.kym.service.miniapp.*;
+import jakarta.annotation.PostConstruct;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Value;
@@ -60,8 +61,6 @@ public class EnNotifyServiceImpl implements EnNotifyService {
 
     private final OrderRechargeRightsService orderRechargeRightsService;
 
-    private final KymCache kymCache;
-
     private final RedisDBChangeUtil redisDBChangeUtil;
 
     @Value("${kym.notify-email}")
@@ -70,7 +69,7 @@ public class EnNotifyServiceImpl implements EnNotifyService {
     public EnNotifyServiceImpl(EnPlusService enPlusService, ChargeOrderService chargeOrderService,
                                ChargeService chargeService, AccountService accountService, WalletDetailService walletDetailService,
                                MonitorLogService monitorLogService, EquipmentInfoService equipmentInfoService,
-                               UserRechargeRightsService userRechargeRightsService, OrderRechargeRightsService orderRechargeRightsService, KymCache kymCache, RedisDBChangeUtil redisDBChangeUtil) {
+                               UserRechargeRightsService userRechargeRightsService, OrderRechargeRightsService orderRechargeRightsService, RedisDBChangeUtil redisDBChangeUtil) {
         this.enPlusService = enPlusService;
         this.chargeOrderService = chargeOrderService;
         this.chargeService = chargeService;
@@ -80,8 +79,11 @@ public class EnNotifyServiceImpl implements EnNotifyService {
         this.equipmentInfoService = equipmentInfoService;
         this.userRechargeRightsService = userRechargeRightsService;
         this.orderRechargeRightsService = orderRechargeRightsService;
-        this.kymCache = kymCache;
         this.redisDBChangeUtil = redisDBChangeUtil;
+    }
+
+    @PostConstruct
+    void init() {
         ConnectorStatusCache.INSTANCE.putAll(equipmentInfoService.list().stream().collect(Collectors.toMap(item -> item.getEquipmentId().concat("1"), EquipmentInfo::getServiceStatus)));
     }
 
@@ -115,7 +117,7 @@ public class EnNotifyServiceImpl implements EnNotifyService {
             LOGGER.info("充电桩设备离线:{}", connectorStatusInfo.getConnectorId());
             // 如果设备离线,则存入redis
             var monitorLog = new MonitorLog()
-                    .setStationId(kymCache.getStationId(connectorStatusInfo.getConnectorId()))
+                    .setStationId(KymCache.INSTANCE.getStationIdByEquipmentIdOrConnectorId(connectorStatusInfo.getConnectorId()))
                     .setSn(connectorStatusInfo.getConnectorId())
                     .setOfflineTime(LocalDateTime.now())
                     .setType(2)
@@ -139,7 +141,7 @@ public class EnNotifyServiceImpl implements EnNotifyService {
             }
             if (exist != null && exist > 0) {
                 MailUtil.send(notifyEmail, "【设备上线通知】", "站点:%s,设备%s恢复上线"
-                        .formatted(kymCache.getStationNameByConnectorId(connectorStatusInfo.getConnectorId()), kymCache.getShortId(connectorStatusInfo.getConnectorId())), false);
+                        .formatted(KymCache.INSTANCE.getStationNameById(connectorStatusInfo.getConnectorId()), KymCache.INSTANCE.getShortIdByEquipmentIdOrConnectorId(connectorStatusInfo.getConnectorId())), false);
             }
         }
 

+ 15 - 12
service/src/main/java/com/kym/service/miniapp/impl/ChargeOrderServiceImpl.java

@@ -21,9 +21,9 @@ import com.kym.entity.miniapp.vo.ChargeOrderVo;
 import com.kym.mapper.miniapp.ChargeOrderMapper;
 import com.kym.service.admin.ExportService;
 import com.kym.service.admin.RechargeRightsService;
+import com.kym.service.cache.KymCache;
 import com.kym.service.miniapp.ChargeOrderService;
 import com.kym.service.miniapp.OrderRechargeRightsService;
-import com.kym.service.cache.KymCache;
 import jakarta.servlet.http.HttpServletResponse;
 import lombok.SneakyThrows;
 import org.springframework.beans.BeanUtils;
@@ -52,13 +52,11 @@ import java.util.stream.Collectors;
 public class ChargeOrderServiceImpl extends ServiceImpl<ChargeOrderMapper, ChargeOrder> implements ChargeOrderService {
 
 
-    private final KymCache kymCache;
     private final ExportService exportService;
     private final OrderRechargeRightsService orderRechargeRightsService;
     private final RechargeRightsService rechargeRightsService;
 
-    public ChargeOrderServiceImpl(KymCache kymCache, ExportService exportService, OrderRechargeRightsService orderRechargeRightsService, RechargeRightsService rechargeRightsService) {
-        this.kymCache = kymCache;
+    public ChargeOrderServiceImpl(ExportService exportService, OrderRechargeRightsService orderRechargeRightsService, RechargeRightsService rechargeRightsService) {
         this.exportService = exportService;
         this.orderRechargeRightsService = orderRechargeRightsService;
         this.rechargeRightsService = rechargeRightsService;
@@ -81,11 +79,11 @@ public class ChargeOrderServiceImpl extends ServiceImpl<ChargeOrderMapper, Charg
     @Override
     public PageBean<CustomOrderVo> customChargeOrders(CustomChargeOrdersQueryParam params) {
         if (params.getConnectorId() != null) {
-            var connectorId = kymCache.getConnectorId(params.getConnectorId());
+            var connectorId = KymCache.INSTANCE.getConnectorId(params.getConnectorId());
             params.setConnectorId(connectorId);
         }
         // 判断数据权限
-        var adminStationId = kymCache.getAdminUserStationId(StpUtil.getLoginIdAsLong());
+        var adminStationId = KymCache.INSTANCE.getAdminUserStationId(StpUtil.getLoginIdAsLong());
         if (adminStationId != null) {
             params.setStationId(adminStationId);
         }
@@ -93,7 +91,9 @@ public class ChargeOrderServiceImpl extends ServiceImpl<ChargeOrderMapper, Charg
         // 查询订单列表(订单编号,手机号,充电站,充电桩SN/短码,订单状态,建单时间,结算时间,充电电量,实付金额,付款状态)
         var result = baseMapper.listChargeOrders(params);
         var page = new PageBean<>(result);
-        page.setList(result.stream().map(item -> item.setShortId(kymCache.getShortId(item.getConnectorId())).setStationName(kymCache.getStationName(item.getStationId()))).collect(Collectors.toList()));
+        page.setList(result.stream().map(item ->
+                item.setShortId(KymCache.INSTANCE.getShortIdByEquipmentIdOrConnectorId(item.getConnectorId()))
+                        .setStationName(KymCache.INSTANCE.getStationNameById(item.getStationId()))).collect(Collectors.toList()));
         var map = baseMapper.statChargeOrders(params);
         return page.setExtraData(map);
     }
@@ -103,17 +103,20 @@ public class ChargeOrderServiceImpl extends ServiceImpl<ChargeOrderMapper, Charg
     public void exportCustomChargeOrders(CustomChargeOrdersQueryParam params, HttpServletResponse response) {
 
         if (params.getConnectorId() != null) {
-            var connectorId = kymCache.getConnectorId(params.getConnectorId());
+            var connectorId = KymCache.INSTANCE.getConnectorId(params.getConnectorId());
             params.setConnectorId(connectorId);
         }
         // 判断数据权限
-        var adminStationId = kymCache.getAdminUserStationId(StpUtil.getLoginIdAsLong());
+        var adminStationId = KymCache.INSTANCE.getAdminUserStationId(StpUtil.getLoginIdAsLong());
         if (adminStationId != null) {
             params.setStationId(adminStationId);
         }
         // 查询订单列表(订单编号,手机号,充电站,充电桩SN/短码,订单状态,建单时间,结算时间,充电电量,实付金额,付款状态)
         var result = baseMapper.listChargeOrders(params);
-        result = result.stream().map(item -> item.setShortId(kymCache.getShortId(item.getConnectorId())).setStationName(kymCache.getStationName(item.getStationId()))).collect(Collectors.toList());
+        result = result.stream().map(item ->
+                        item.setShortId(KymCache.INSTANCE.getShortIdByEquipmentIdOrConnectorId(item.getConnectorId()))
+                                .setStationName(KymCache.INSTANCE.getStationNameById(item.getStationId())))
+                .collect(Collectors.toList());
 
         // stationId,startChargeSeq,connectorId,startTime,endTime,totalPower,totalMoney,elecMoney,serviceMoney,orderStatus,chargeStatus,stopReason,invoiceStatus
         var rows = result.stream().map(item -> {
@@ -193,7 +196,7 @@ public class ChargeOrderServiceImpl extends ServiceImpl<ChargeOrderMapper, Charg
     @Override
     public PageBean<StationStatVo> stationStat(StatQueryParam params) {
         // 判断数据权限
-        var adminStationId = kymCache.getAdminUserStationId(StpUtil.getLoginIdAsLong());
+        var adminStationId = KymCache.INSTANCE.getAdminUserStationId(StpUtil.getLoginIdAsLong());
         if (adminStationId != null) {
             params.setStationId(adminStationId);
         }
@@ -218,7 +221,7 @@ public class ChargeOrderServiceImpl extends ServiceImpl<ChargeOrderMapper, Charg
     public Map<String, Object> stationTodayStat(String stationId) {
         if (CommUtil.null2Long(stationId) <= 0) {
             // 判断数据权限
-            stationId = kymCache.getAdminUserStationId(StpUtil.getLoginIdAsLong());
+            stationId = KymCache.INSTANCE.getAdminUserStationId(StpUtil.getLoginIdAsLong());
         }
 
         return baseMapper.stationTodayStat(stationId);