Selaa lähdekoodia

优化首页数据

skyline 11 kuukautta sitten
vanhempi
säilyke
d4d1002cc9

+ 7 - 2
entity/src/main/java/com/kym/entity/admin/vo/SimpleStationVo.java

@@ -3,10 +3,10 @@ package com.kym.entity.admin.vo;
 import com.alibaba.fastjson2.JSONObject;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
-import com.kym.entity.BaseEntity;
 import com.kym.entity.admin.Activity;
+import com.kym.entity.miniapp.vo.PlatformPolicyInfoVo;
+import com.kym.entity.platform.PlatformPolicyInfo;
 import lombok.Data;
-import lombok.NoArgsConstructor;
 import lombok.experimental.Accessors;
 
 import java.util.List;
@@ -87,5 +87,10 @@ public class SimpleStationVo {
      */
     private List<Activity> activityList;
 
+    /**
+     * 当前时段费率
+     */
+    private PlatformPolicyInfoVo currentPolicyInfo;
+
 
 }

+ 5 - 0
entity/src/main/java/com/kym/entity/common/RedisKeys.java

@@ -26,4 +26,9 @@ public interface RedisKeys {
     String CONNECTOR_ID_PLATFORM_NAME = "CONNECTOR_ID_PLATFORM_NAME:";
     String STATION_ID_PLATFORM_NAME = "STATION_ID_PLATFORM_NAME:";
     String PLATFORM_NAME_CONFIG = "PLATFORM_NAME_CONFIG:";
+
+    /**
+     * 站点费率
+     */
+    String STATION_ID_POLICY_INFO = "STATION_ID_POLICY_INFO:";
 }

+ 34 - 0
entity/src/main/java/com/kym/entity/miniapp/vo/PlatformPolicyInfoVo.java

@@ -0,0 +1,34 @@
+package com.kym.entity.miniapp.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+
+import java.time.LocalTime;
+
+/**
+ * @author skyline
+ * @description 分时费率
+ * @date 2023-08-15 16:11
+ */
+@Data
+public class PlatformPolicyInfoVo {
+    public final static String[] PRICE_PERIOD = {"谷", "平", "峰", "尖"};
+    /**
+     * 价格时段(尖峰平谷)
+     */
+    public String pricePeriod;
+    /**
+     * 时段开始时间点
+     */
+    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "HH:mm:ss", timezone = "GMT+8")
+    private LocalTime startTime;
+    /**
+     * 时段电费 小数点后4位
+     */
+    private Double elecPrice;
+    /**
+     * 时段服务费 小数点后4位
+     */
+    private Double servicePrice;
+
+}

+ 12 - 1
entity/src/main/java/com/kym/entity/platform/PlatformPolicyInfo.java

@@ -3,6 +3,7 @@ package com.kym.entity.platform;
 import com.alibaba.fastjson2.annotation.JSONCreator;
 import com.alibaba.fastjson2.annotation.JSONField;
 import com.fasterxml.jackson.annotation.JsonFormat;
+import com.kym.entity.miniapp.vo.PlatformPolicyInfoVo;
 import lombok.Data;
 
 import java.time.LocalTime;
@@ -37,7 +38,17 @@ public class PlatformPolicyInfo {
     private Double servicePrice;
 
     @JSONCreator
-    PlatformPolicyInfo(@JSONField(name = "StartTime") String startTime) {
+    PlatformPolicyInfo(@JSONField(name = "StartTime", serialize = false) String startTime) {
+        System.out.println("startTime = " + startTime);
         this.startTime = LocalTime.parse(startTime, DateTimeFormatter.ofPattern("HHmmss"));
     }
+
+    public static PlatformPolicyInfoVo toVo(PlatformPolicyInfo info) {
+        PlatformPolicyInfoVo vo = new PlatformPolicyInfoVo();
+        vo.setPricePeriod(info.pricePeriod);
+        vo.setStartTime(info.startTime);
+        vo.setElecPrice(info.elecPrice);
+        vo.setServicePrice(info.servicePrice);
+        return vo;
+    }
 }

+ 12 - 0
mapper/src/main/java/com/kym/mapper/admin/EquipmentRelationMapper.java

@@ -2,6 +2,10 @@ package com.kym.mapper.admin;
 
 import com.kym.entity.admin.EquipmentRelation;
 import com.kym.mapper.mybatisplus.MyBaseMapper;
+import org.apache.ibatis.annotations.Select;
+
+import java.util.List;
+import java.util.Map;
 
 /**
  * <p>
@@ -12,5 +16,13 @@ import com.kym.mapper.mybatisplus.MyBaseMapper;
  * @since 2023-08-07
  */
 public interface EquipmentRelationMapper extends MyBaseMapper<EquipmentRelation> {
+    @Select("SELECT t.station_id as stationId, t.connector_id as connectorId " +
+            "FROM ( " +
+            "    SELECT station_id, connector_id, " +
+            "           ROW_NUMBER() OVER (PARTITION BY station_id ORDER BY id DESC) AS row_num " +
+            "    FROM t_equipment_relation " +
+            ") AS t " +
+            "WHERE t.row_num = 1")
+    List<Map<String, String>> selectLatestConnectorByStation();
 
 }

+ 60 - 0
miniapp/src/main/java/com/kym/miniapp/jobs/StationPolicyInfoJob.java

@@ -0,0 +1,60 @@
+package com.kym.miniapp.jobs;
+
+import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder;
+import com.kym.entity.miniapp.vo.PlatformPolicyInfoVo;
+import com.kym.entity.platform.PlatformPolicyInfo;
+import com.kym.mapper.admin.EquipmentRelationMapper;
+import com.kym.service.admin.StationService;
+import com.kym.service.cache.KymCache;
+import com.kym.service.miniapp.ChargeService;
+import jakarta.annotation.PostConstruct;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+import java.util.HashMap;
+import java.util.List;
+
+/**
+ * @author skyline
+ * @description 用户优惠权益到期处理
+ * @date 2023-11-15 14:00
+ */
+@Component
+@Slf4j
+public class StationPolicyInfoJob {
+
+    private final StationService stationService;
+
+    private final EquipmentRelationMapper equipmentRelationMapper;
+
+    private final ChargeService chargeService;
+
+    public StationPolicyInfoJob(
+            StationService stationService,
+            EquipmentRelationMapper equipmentRelationMapper,
+            ChargeService chargeService) {
+        this.equipmentRelationMapper = equipmentRelationMapper;
+        this.stationService = stationService;
+        this.chargeService = chargeService;
+    }
+
+    // 每次应用启动或每月第一天00:30运行一次
+    @PostConstruct
+    @Scheduled(cron = "0 10 0 * * ?")
+    public void stationPolicyInfoJob() {
+        log.info("站点费率信息定时更新启动...");
+        // 手动切换数据源
+        DynamicDataSourceContextHolder.push("db-admin");
+        // 获取每个站点的第一个connectorId
+        var stationConnectorMap = equipmentRelationMapper.selectLatestConnectorByStation();
+        DynamicDataSourceContextHolder.poll();
+        var maps = new HashMap<String, List<PlatformPolicyInfoVo>>(stationConnectorMap.size());
+        stationConnectorMap.forEach(stationConnector -> {
+            var policy = chargeService.queryEquipBusinessPolicy(stationConnector.get("connectorId"));
+            maps.put(stationConnector.get("stationId"), policy.getPolicyInfos().stream().map(PlatformPolicyInfo::toVo).toList());
+        });
+        KymCache.INSTANCE.putStationId2PolicyInfo(maps);
+        log.info("站点费率信息定时更新结束...");
+    }
+}

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

@@ -36,9 +36,9 @@ public interface StationService extends MPJBaseService<Station> {
     Map<String, List<EquipmentInfo>> getCachedEquipmentMap(String... stationId);
 
     @DynamicCache(timeout = 15 * 60 * 1000L)
-    Map<String, List<ConnectorInfo>> getCachedStationConnectorMap(String... stationId);
+    Map<String, List<ConnectorInfo>> getCachedEquipmentConnectorMap(String... stationId);
 
-    Map<String, List<ConnectorInfo>> getCachedStationConnectorMap();
+    Map<String, List<ConnectorInfo>> getCachedEquipmentConnectorMap();
 
     DetailStationVo stationInfo(String stationId);
 

+ 25 - 9
service/src/main/java/com/kym/service/admin/impl/StationServiceImpl.java

@@ -19,6 +19,7 @@ import com.kym.entity.admin.*;
 import com.kym.entity.admin.queryParams.StationQueryParam;
 import com.kym.entity.admin.vo.*;
 import com.kym.entity.common.PageBean;
+import com.kym.entity.miniapp.vo.PlatformPolicyInfoVo;
 import com.kym.entity.platform.PlatformStationStatsInfo;
 import com.kym.entity.platform.PlatformStationStatusInfo;
 import com.kym.entity.platform.response.PlatformResponse;
@@ -35,6 +36,7 @@ import org.springframework.context.annotation.Lazy;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.time.LocalTime;
 import java.util.*;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
@@ -165,7 +167,7 @@ public class StationServiceImpl extends MyBaseServiceImpl<StationMapper, Station
      */
     @DynamicCache(timeout = 15 * 60 * 1000L)
     @Override
-    public Map<String, List<ConnectorInfo>> getCachedStationConnectorMap(String... stationId) {
+    public Map<String, List<ConnectorInfo>> getCachedEquipmentConnectorMap(String... stationId) {
         var list = connectorInfoService.lambdaQuery()
                 .eq(CommUtil.isNotEmptyAndNull(stationId), ConnectorInfo::getStationId, stationId[0])
                 .list();
@@ -179,7 +181,7 @@ public class StationServiceImpl extends MyBaseServiceImpl<StationMapper, Station
      */
     @DynamicCache(timeout = 15 * 60 * 1000L)
     @Override
-    public Map<String, List<ConnectorInfo>> getCachedStationConnectorMap() {
+    public Map<String, List<ConnectorInfo>> getCachedEquipmentConnectorMap() {
         return connectorInfoService.list().stream().collect(Collectors.groupingBy(ConnectorInfo::getEquipmentId));
     }
 
@@ -198,7 +200,7 @@ public class StationServiceImpl extends MyBaseServiceImpl<StationMapper, Station
         LambdaQueryWrapper<Station> queryWrapper = new LambdaQueryWrapper<>();
         queryWrapper.select(Station::getStationId, Station::getStationName, Station::getAddress, Station::getLocation,
                 Station::getStationStatus, Station::getParkingNum, Station::getElectricityFee, Station::getServiceFee, Station::getParkFee);
-        queryWrapper.in(CommUtil.isNotEmptyAndNull(params.getStationIdList()),Station::getStationId,params.getStationIdList());
+        queryWrapper.in(CommUtil.isNotEmptyAndNull(params.getStationIdList()), Station::getStationId, params.getStationIdList());
         var stationVoList = new ArrayList<SimpleStationVo>();
         var stationList = list(queryWrapper);
         for (var station : stationList) {
@@ -211,6 +213,20 @@ public class StationServiceImpl extends MyBaseServiceImpl<StationMapper, Station
                     params.getLongitude(),
                     params.getLatitude(),
                     2));
+            // 站点费率
+            var policyInfoList = KymCache.INSTANCE.getStationPolicyInfo(station.getStationId());
+            CommUtil.asserts(policyInfoList != null, "站点费率信息为空");
+
+            // 根据当前时间获取当前策略
+            var now = LocalTime.now();
+            if (policyInfoList.size() == 1) {
+                simpleStationVo.setCurrentPolicyInfo(policyInfoList.get(0));
+            } else {
+                policyInfoList.stream()
+                        .filter(policyInfo -> policyInfo.getStartTime().isBefore(now))
+                        .max(Comparator.comparing(PlatformPolicyInfoVo::getStartTime))
+                        .ifPresent(simpleStationVo::setCurrentPolicyInfo);
+            }
             stationVoList.add(simpleStationVo);
         }
         // 按照距离由近到远排序
@@ -247,21 +263,21 @@ public class StationServiceImpl extends MyBaseServiceImpl<StationMapper, Station
     @Override
     public DetailStationVo stationInfoByShortId(String shortId) {
         EquipmentRelation equipmentRel = equipmentRelationService.getByShortId(shortId);
-        CommUtil.assertsNonNull(equipmentRel,"该设备信息有误");
+        CommUtil.assertsNonNull(equipmentRel, "该设备信息有误");
         return stationInfo(equipmentRel.getStationId());
     }
 
     @Override
     public DetailStationVo stationInfoByConnectorId(String connectorId) {
         EquipmentRelation equipmentRel = equipmentRelationService.getByConnectorId(connectorId);
-        CommUtil.assertsNonNull(equipmentRel,"该设备信息有误");
+        CommUtil.assertsNonNull(equipmentRel, "该设备信息有误");
         return stationInfo(equipmentRel.getStationId());
     }
 
     @Override
     public DetailStationVo stationInfoByEquipmentId(String equipmentId) {
         EquipmentRelation equipmentRel = equipmentRelationService.getByEquipmentId(equipmentId);
-        CommUtil.assertsNonNull(equipmentRel,"该设备信息有误");
+        CommUtil.assertsNonNull(equipmentRel, "该设备信息有误");
         return stationInfo(equipmentRel.getStationId());
     }
 
@@ -277,10 +293,10 @@ public class StationServiceImpl extends MyBaseServiceImpl<StationMapper, Station
             var vo = new DetailStationVo();
             BeanUtils.copyProperties(s, vo);
             // 填充桩信息
-            var list = getCachedStationConnectorMap(s.getStationId()).get(s.getStationId()).stream()
+            var list = getCachedEquipmentConnectorMap(s.getStationId()).get(s.getStationId()).stream()
                     .map(connectorInfo -> {
                         ConnectorInfoVo v = new ConnectorInfoVo();
-                        BeanUtils.copyProperties(connectorInfo,v);
+                        BeanUtils.copyProperties(connectorInfo, v);
                         v.setShortId(KymCache.INSTANCE.getShortIdByEquipmentIdOrConnectorId(connectorInfo.getConnectorId()));
                         return v;
                     })
@@ -299,7 +315,7 @@ public class StationServiceImpl extends MyBaseServiceImpl<StationMapper, Station
         var stationList = list();
         // 获取桩号等映射信息缓存
         var equipmentInfoMap = proxy.getCachedEquipmentMap();
-        var connectorInfoMap = proxy.getCachedStationConnectorMap();
+        var connectorInfoMap = proxy.getCachedEquipmentConnectorMap();
 
         var stationVoList = new ArrayList<LocalStationVo>();
         for (var station : stationList) {

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

@@ -1,6 +1,8 @@
 package com.kym.service.cache;
 
 import cn.hutool.extra.spring.SpringUtil;
+import com.alibaba.fastjson2.JSON;
+import com.alibaba.fastjson2.JSONObject;
 import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder;
 import com.kym.common.cache.PlatformCache;
 import com.kym.entity.admin.ConnectorInfo;
@@ -8,6 +10,7 @@ import com.kym.entity.admin.EquipmentRelation;
 import com.kym.entity.admin.Platform;
 import com.kym.entity.admin.Station;
 import com.kym.entity.common.RedisKeys;
+import com.kym.entity.miniapp.vo.PlatformPolicyInfoVo;
 import com.kym.service.admin.ConnectorInfoService;
 import com.kym.service.admin.EquipmentRelationService;
 import com.kym.service.admin.PlatformService;
@@ -147,6 +150,26 @@ public enum KymCache {
         map.forEach((k, v) -> KymCacheInjector.redisTemplate.opsForValue().set(RedisKeys.CONNECTOR_ID_TO_PARKING_NO + k, v));
     }
 
+    /**
+     * 站点费率
+     *
+     * @param map
+     */
+    public void putStationId2PolicyInfo(Map<String, List<PlatformPolicyInfoVo>> map) {
+        map.forEach((k, v) -> KymCacheInjector.redisTemplate.opsForValue().set(RedisKeys.STATION_ID_POLICY_INFO + k, JSONObject.toJSONString(v)));
+    }
+
+    /**
+     * 获取站点费率
+     *
+     * @param stationId
+     * @return
+     */
+    public List<PlatformPolicyInfoVo> getStationPolicyInfo(String stationId) {
+        var json = KymCacheInjector.redisTemplate.opsForValue().get(RedisKeys.STATION_ID_POLICY_INFO + stationId);
+        return JSON.parseArray(json, PlatformPolicyInfoVo.class);
+    }
+
     /**
      * @param id
      * @return
@@ -172,6 +195,7 @@ public enum KymCache {
         };
     }
 
+
     @Component
     public static class KymCacheInjector implements ApplicationListener<ApplicationStartedEvent> {