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

优化:站点列表查询改为本地数据查询,性能提升

skyline преди 1 година
родител
ревизия
64792e853b

+ 4 - 0
common/src/main/java/com/kym/common/annotation/DynamicCache.java

@@ -17,5 +17,9 @@ public @interface DynamicCache {
 
     String key() default "";
 
+    /**
+     * 过期时间 默认5分钟
+     * @return
+     */
     long timeout() default 5 * 60 * 1000L;
 }

+ 11 - 3
entity/src/main/java/com/kym/entity/admin/EquipmentInfo.java

@@ -6,6 +6,9 @@ import com.baomidou.mybatisplus.annotation.TableName;
 import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
 import com.kym.entity.BaseEntity;
 import lombok.Data;
+import lombok.experimental.Accessors;
+
+import java.util.List;
 
 /**
  * <p>
@@ -17,6 +20,7 @@ import lombok.Data;
  */
 @Data
 @TableName("t_equipment_info")
+@Accessors(chain = true)
 public class EquipmentInfo extends BaseEntity {
 
     public static int SERVICE_STATUS_离线 = 0;
@@ -118,9 +122,13 @@ public class EquipmentInfo extends BaseEntity {
      */
     private Integer serviceStatus;
 
-    public void setCompanyId(Long companyId) {
-        this.companyId = companyId;
-    }
+
+    /**
+     * 充电接口列表
+     */
+    @TableField(exist = false)
+    private List<ConnectorInfo> connectorInfos;
+
 
     public EquipmentInfo setStationId(String stationId) {
         this.stationId = stationId;

+ 3 - 5
entity/src/main/java/com/kym/entity/admin/Station.java

@@ -23,19 +23,17 @@ import java.io.Serializable;
  */
 @Getter
 @Setter
-@TableName("t_station")
+@TableName(value = "t_station", autoResultMap = true)
 @Accessors(chain = true)
 public class Station extends BaseEntity implements Serializable {
 
-    private static final long serialVersionUID = 1L;
-
     // 站点状态:0:未知 1:建设中 5:关闭下线 6:维护中 50:正常使用
     public static final int STATION_STATUS_未知 = 0;
     public static final int STATION_STATUS_建设中 = 1;
     public static final int STATION_STATUS_关闭下线 = 5;
-    public static final int STATION_STATUS_维护中= 6;
+    public static final int STATION_STATUS_维护中 = 6;
     public static final int STATION_STATUS_正常使用 = 50;
-
+    private static final long serialVersionUID = 1L;
     /**
      * 公司id
      */

+ 176 - 0
entity/src/main/java/com/kym/entity/admin/vo/LocalStationVo.java

@@ -0,0 +1,176 @@
+package com.kym.entity.admin.vo;
+
+import com.alibaba.fastjson2.JSONArray;
+import com.alibaba.fastjson2.JSONObject;
+import com.alibaba.fastjson2.annotation.JSONCreator;
+import com.alibaba.fastjson2.annotation.JSONField;
+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.admin.EquipmentInfo;
+import com.kym.entity.enplus.EnEquipmentInfo;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * <p>
+ * 本地充电站信息
+ * </p>
+ *
+ * @author skyline
+ * @since 2023-08-12
+ */
+@Data
+@NoArgsConstructor
+@Accessors(chain = true)
+public class LocalStationVo extends BaseEntity implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 公司id
+     */
+    private Long companyId;
+
+    /**
+     * 电站组id
+     */
+    private Long groupId;
+
+    /**
+     * en+充电站id
+     */
+    private String stationId;
+
+    /**
+     * en+运营商id
+     */
+    private String operatorId;
+
+    /**
+     * 设备所属运营平台组织机构代码
+     */
+    private String equipmentOwnerId;
+
+    /**
+     * 站点名称
+     */
+    private String stationName;
+
+    /**
+     * 充电中国家代码:CN
+     */
+    private String countryCode;
+
+    /**
+     * 充电站省市辖区编码
+     */
+    private String areaCode;
+
+    /**
+     * 地址
+     */
+    private String address;
+
+    /**
+     * 站点电话
+     */
+    private String stationTel;
+
+    /**
+     * 服务电话
+     */
+    private String serviceTel;
+
+    /**
+     * 站点类型:1:公共 50:个人 100:公交(专业)101:环卫(专用)102:物流(专用)103:出租车(专用)255:其他
+     */
+    private Integer stationType;
+
+    /**
+     * 站点状态:0:未知 1:建设中 5:关闭下线 6:维护中 50:正常使用
+     */
+    private Integer stationStatus;
+
+    /**
+     * 充电车位数量
+     */
+    private Integer parkingNum;
+
+    /**
+     * 充电桩位置坐标
+     * <p>
+     * FastjsonTypeHandler
+     * 支持 MVC JSON 解析
+     * 不支持 MySQL JSON 解析
+     * <p>
+     * JacksonTypeHandler
+     * 支持 MVC JSON 解析
+     * 支持 MySQL JSON 解析
+     */
+    @TableField(typeHandler = JacksonTypeHandler.class)
+    private JSONObject location;
+    /**
+     * 站点引导
+     */
+    private String siteGuide;
+    /**
+     * 建设场所:1:居民区 2:公共机构 3:企事业单位 4:写字楼 5:工业园区 6:交通枢纽 7:大型文体设施 8:城市绿地 9:大型建筑配建停车场 10:路边停车位 11:城际高速服务区 255:其他
+     */
+    private Integer construction;
+    /**
+     * 站点照片
+     */
+    private String pictures;
+    /**
+     * 使用车型描述
+     */
+    private String matchCars;
+    /**
+     * 车位楼层及数量描述
+     */
+    private String parkInfo;
+    /**
+     * 营业时间描述
+     */
+    private String businessHours;
+    /**
+     * 充电费描述
+     */
+    private String electricityFee;
+    /**
+     * 服务费率描述
+     */
+    private String serviceFee;
+    /**
+     * 停车费
+     */
+    private String parkFee;
+    /**
+     * 支付方式:刷卡、线上、现金(电子钱包类卡为刷卡、身份鉴权卡、微信/支付宝、APP为线上)
+     */
+    private String payment;
+    /**
+     * 是否支持预约:0:不支持 1:支持
+     */
+    private Integer supportOrder;
+    /**
+     * 备注
+     */
+    private String remark;
+
+    /**
+     * 充电设备信息列表
+     */
+    private List<EquipmentInfo> equipmentInfos;
+    /**
+     * 站点活动
+     */
+    private List<Activity> activityList;
+
+}

+ 4 - 5
entity/src/main/java/com/kym/entity/admin/vo/StationVo.java

@@ -9,8 +9,8 @@ import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
 import com.kym.entity.BaseEntity;
 import com.kym.entity.admin.Activity;
 import com.kym.entity.enplus.EnEquipmentInfo;
-import lombok.Getter;
-import lombok.Setter;
+import lombok.Data;
+import lombok.NoArgsConstructor;
 import lombok.experimental.Accessors;
 
 import java.io.Serializable;
@@ -24,8 +24,8 @@ import java.util.List;
  * @author skyline
  * @since 2023-08-12
  */
-@Getter
-@Setter
+@Data
+@NoArgsConstructor
 @Accessors(chain = true)
 public class StationVo extends BaseEntity implements Serializable {
 
@@ -202,5 +202,4 @@ public class StationVo extends BaseEntity implements Serializable {
         this.location = JSONObject.of("stationLng", lng, "stationLat", lat);
         this.equipmentInfos = array.toJavaList(EnEquipmentInfo.class);
     }
-
 }

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

@@ -6,6 +6,7 @@ import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
 import org.springframework.cache.annotation.EnableCaching;
+import org.springframework.context.annotation.EnableAspectJAutoProxy;
 import org.springframework.scheduling.annotation.EnableAsync;
 import org.springframework.scheduling.annotation.EnableScheduling;
 
@@ -21,6 +22,7 @@ import org.springframework.scheduling.annotation.EnableScheduling;
 //@ComponentScan(basePackages = {"com.kym"},excludeFilters = @ComponentScan.Filter(type = FilterType.REGEX, pattern = "com.kym.admin.*"))
 @MapperScan(basePackages = {"com.kym.mapper"})
 @EnableCaching
+@EnableAspectJAutoProxy(exposeProxy = true)
 public class MiniAppApplication {
 
     public static void main(String[] args) {

+ 1 - 3
miniapp/src/main/java/com/kym/miniapp/controller/ChargerController.java

@@ -69,9 +69,7 @@ public class ChargerController {
     R<?> listChargeStation(
             @RequestParam(value = "pageNum", defaultValue = "1") Integer pageNum,
             @RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize) {
-        // 请求en+接口
-        List<StationVo> response = stationService.queryStationInfo(pageNum, pageSize);
-        return R.success(response);
+        return R.success(stationService.queryLocalStationInfo(pageNum, pageSize));
     }
 
     /**

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

@@ -3,13 +3,18 @@ package com.kym.service.admin;
 import com.alibaba.fastjson2.JSONObject;
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.github.yulichang.base.MPJBaseService;
+import com.kym.common.annotation.DynamicCache;
+import com.kym.entity.admin.ConnectorInfo;
+import com.kym.entity.admin.EquipmentInfo;
 import com.kym.entity.admin.Station;
 import com.kym.entity.admin.queryParams.StationQueryParam;
+import com.kym.entity.admin.vo.LocalStationVo;
 import com.kym.entity.admin.vo.StationVo;
 import com.kym.entity.enplus.EnStationStatsInfo;
 import com.kym.entity.enplus.EnStationStatusInfo;
 
 import java.util.List;
+import java.util.Map;
 
 /**
  * <p>
@@ -23,6 +28,15 @@ public interface StationService extends MPJBaseService<Station> {
 
     List<StationVo> queryStationInfo(int pageNum, int pageSize) throws JsonProcessingException;
 
+    @DynamicCache
+    Map<String,List<EquipmentInfo>> getCachedEquipmentMap();
+
+    @DynamicCache
+    Map<String,List<ConnectorInfo>> getCachedConnectorMap();
+
+    //    @DynamicCache // 方法的返回结果加一层方法缓存,5分钟内不变
+    List<LocalStationVo> queryLocalStationInfo(int pageNum, int pageSize);
+
     List<EnStationStatusInfo> stationStatus(String[] ids);
 
     EnStationStatsInfo stationStats(String stationId, String startTime, String endTime);

+ 65 - 1
service/src/main/java/com/kym/service/admin/impl/StationServiceImpl.java

@@ -13,6 +13,7 @@ import com.kym.common.utils.AESUtil;
 import com.kym.common.utils.CommUtil;
 import com.kym.entity.admin.*;
 import com.kym.entity.admin.queryParams.StationQueryParam;
+import com.kym.entity.admin.vo.LocalStationVo;
 import com.kym.entity.admin.vo.StationVo;
 import com.kym.entity.enplus.EnEquipmentInfo;
 import com.kym.entity.enplus.EnStationStatsInfo;
@@ -23,6 +24,7 @@ import com.kym.service.admin.*;
 import com.kym.service.cache.KymCache;
 import com.kym.service.enplus.EnPlusService;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.aop.framework.AopContext;
 import org.springframework.beans.BeanUtils;
 import org.springframework.context.annotation.Lazy;
 import org.springframework.stereotype.Service;
@@ -74,7 +76,7 @@ public class StationServiceImpl extends MyBaseServiceImpl<StationMapper, Station
             stationIdSets.addAll(adminStationIds);
             queryWrapper.in("station_id", stationIdSets);
         }
-        if(CommUtil.isNotEmptyAndNull(adminStationIds)){
+        if (CommUtil.isNotEmptyAndNull(adminStationIds)) {
             queryWrapper.in("station_id", adminStationIds);
         }
         queryWrapper.orderByAsc("station_id");
@@ -126,6 +128,68 @@ public class StationServiceImpl extends MyBaseServiceImpl<StationMapper, Station
 
     }
 
+    @DynamicCache(timeout = 15 * 60 * 1000L)
+    @Override
+    public Map<String, List<EquipmentInfo>> getCachedEquipmentMap() {
+        return equipmentInfoService.list().stream().collect(Collectors.groupingBy(EquipmentInfo::getStationId));
+    }
+
+    @DynamicCache(timeout = 15 * 60 * 1000L)
+    @Override
+    public Map<String, List<ConnectorInfo>> getCachedConnectorMap() {
+        return connectorInfoService.list().stream().collect(Collectors.groupingBy(ConnectorInfo::getEquipmentId));
+    }
+
+
+    @Override
+    @DynamicCache
+    public List<LocalStationVo> queryLocalStationInfo(int pageNum, int pageSize) {
+        StationService proxy = (StationService) AopContext.currentProxy();
+        var stationList = list();
+        var equipmentInfoMap = proxy.getCachedEquipmentMap();
+        var connectorInfoMap = proxy.getCachedConnectorMap();
+
+        var stationVoList = new ArrayList<LocalStationVo>();
+        for (var station : stationList) {
+            var stationVo = new LocalStationVo();
+            BeanUtils.copyProperties(station, stationVo);
+            var equipmentInfos = equipmentInfoMap.get(station.getStationId());
+            if (CommUtil.isNotEmptyAndNull(equipmentInfos)) {
+                equipmentInfos.parallelStream().forEach(equipmentInfo -> {
+                    // 填充短编号和车位号
+                    equipmentInfo.setShortId(KymCache.INSTANCE.getShortIdByEquipmentIdOrConnectorId(equipmentInfo.getEquipmentId()))
+                            .setParkingNo(KymCache.INSTANCE.getParkNoByEquipmentIdOrConnectorId(equipmentInfo.getEquipmentId()))
+                            .setConnectorInfos(connectorInfoMap.get(equipmentInfo.getEquipmentId()));
+
+                });
+                stationVo.setEquipmentInfos(equipmentInfos);
+                var res = stationList.stream().filter(item -> item.getStationId().equals(station.getStationId())).toList();
+                // 填充站点图片
+                if (!res.isEmpty()) {
+                    station.setPictures(res.get(0).getPictures());
+                } else {
+                    station.setPictures(null);
+                }
+                stationVoList.add(stationVo);
+            }
+        }
+
+        // 查询正在进行中的活动和各站点正在进行中的活动
+        var activityList = activityService.lambdaQuery().eq(Activity::getStatus, Activity.STATUS_进行中).list();
+
+        var activityStationListMap = activityStationService.lambdaQuery().eq(ActivityStation::getStatus, Activity.STATUS_进行中).list()
+                .stream().collect(Collectors.groupingBy(ActivityStation::getStationId));
+
+        var station2ActivityList = new HashMap<String, List<Activity>>();
+
+        activityStationListMap.forEach((k, v) -> {
+            station2ActivityList.put(k,
+                    v.stream().map(item -> activityList.stream().filter(activity -> activity.getId().equals(item.getActivityId())).findFirst().orElse(null)).toList());
+        });
+        stationVoList.forEach(vo -> vo.setActivityList(station2ActivityList.get(vo.getStationId())).setEquipmentInfos(vo.getEquipmentInfos().stream().sorted(Comparator.comparing(EquipmentInfo::getShortId)).toList()));
+        return stationVoList;
+    }
+
 
     @Override
     public List<EnStationStatusInfo> stationStatus(String[] ids) {

+ 1 - 1
service/src/main/java/com/kym/service/miniapp/impl/AccountServiceImpl.java

@@ -51,7 +51,7 @@ public class AccountServiceImpl extends MPJBaseServiceImpl<AccountMapper, Accoun
         var vo = new UserRightsAndCouponsVo();
         var userId = StpUtil.getLoginIdAsLong();
         vo.setUserId(userId);
-        
+
         // 当前用户的充电权益(含已失效)
         var userRechargeRight = userRechargeRightsService.lambdaQuery()
                 .eq(UserRechargeRights::getUserId, userId)

+ 7 - 13
service/src/main/java/com/kym/service/miniapp/impl/UserServiceImpl.java

@@ -19,7 +19,10 @@ import com.kym.entity.admin.queryParams.CommonQueryParam;
 import com.kym.entity.admin.vo.ActivityVo;
 import com.kym.entity.admin.vo.CustomUserVo;
 import com.kym.entity.common.PageBean;
-import com.kym.entity.miniapp.*;
+import com.kym.entity.miniapp.Account;
+import com.kym.entity.miniapp.Cars;
+import com.kym.entity.miniapp.RefundLog;
+import com.kym.entity.miniapp.User;
 import com.kym.entity.miniapp.queryParams.WxLoginParams;
 import com.kym.entity.miniapp.vo.UserVo;
 import com.kym.entity.wechat.WxPhoneNum;
@@ -66,10 +69,10 @@ public class UserServiceImpl extends MPJBaseServiceImpl<UserMapper, User> implem
 
     private final UserCouponService userCouponService;
 
-    public UserServiceImpl(WxConfig wxConfig,@Lazy AccountService accountService, RefundLogService refundLogService,
+    public UserServiceImpl(WxConfig wxConfig, @Lazy AccountService accountService, RefundLogService refundLogService,
                            CarsService carsService, UserRechargeRightsService userRechargeRightsService,
                            RechargeRightsService rechargeRightsService, @Lazy ActivityService activityService,
-                           BannerService bannerService,@Lazy UserCouponService userCouponService) {
+                           BannerService bannerService, @Lazy UserCouponService userCouponService) {
         this.wxConfig = wxConfig;
         this.accountService = accountService;
         this.refundLogService = refundLogService;
@@ -149,11 +152,7 @@ public class UserServiceImpl extends MPJBaseServiceImpl<UserMapper, User> implem
             userVo.setDefaultPlateNo(car.getPlateNo());
             userVo.setVin(car.getVin());
         }
-        // 当前用户有效的充电权益
-//        var userRechargeRight = userRechargeRightsService.lambdaQuery()
-//                .eq(UserRechargeRights::getUserId, userId).eq(UserRechargeRights::getStatus, UserRechargeRights.STATUS_有效)
-//                .orderByAsc(UserRechargeRights::getEndTime).list();
-//        userVo.setUserRechargeRightsList(userRechargeRight);
+
         // 可以参加的活动-充值权益
         DynamicDataSourceContextHolder.push("db-admin");
         var bannerList = bannerService.list();
@@ -169,11 +168,6 @@ public class UserServiceImpl extends MPJBaseServiceImpl<UserMapper, User> implem
         }).toList();
         userVo.setActivityList(voList);
 
-        // 当前用户有效的优惠券列表
-//        var usesrCouponList = userCouponService.lambdaQuery()
-//                .eq(UserCoupon::getUserId, userId).eq(UserCoupon::getStatus, UserCoupon.STATUS_有效).orderByAsc(UserCoupon::getEndTime).list();
-//        userVo.setUserCouponList(usesrCouponList);
-
         return userVo;
     }