Răsfoiți Sursa

用户对应站点数据

skyline 1 an în urmă
părinte
comite
85f29adcf2

+ 41 - 0
entity/src/main/java/com/kym/entity/miniapp/UserStation.java

@@ -0,0 +1,41 @@
+package com.kym.entity.miniapp;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.kym.entity.BaseEntity;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.experimental.Accessors;
+
+/**
+ * <p>
+ * 用户所属站点表
+ * </p>
+ *
+ * @author skyline
+ * @since 2024-08-19
+ */
+@Getter
+@Setter
+@TableName("t_user_station")
+@Accessors(chain = true)
+public class UserStation extends BaseEntity {
+
+    private static final long serialVersionUID = 1L;
+
+    private Long userId;
+
+    /**
+     * 站点id
+     */
+    private String stationId;
+
+    /**
+     * 手机号
+     */
+    private String mobilePhone;
+
+    /**
+     * 用户在该站点的充电量
+     */
+    private Double totalPower;
+}

+ 16 - 0
mapper/src/main/java/com/kym/mapper/miniapp/UserStationMapper.java

@@ -0,0 +1,16 @@
+package com.kym.mapper.miniapp;
+
+import com.kym.entity.miniapp.UserStation;
+import com.kym.mapper.mybatisplus.MyBaseMapper;
+
+/**
+ * <p>
+ * 用户所属站点表 Mapper 接口
+ * </p>
+ *
+ * @author skyline
+ * @since 2024-08-19
+ */
+public interface UserStationMapper extends MyBaseMapper<UserStation> {
+
+}

+ 21 - 0
mapper/src/main/resources/mappers/miniapp/UserStationMapper.xml

@@ -0,0 +1,21 @@
+<?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.miniapp.UserStationMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.kym.entity.miniapp.UserStation">
+        <result column="id" property="id" />
+        <result column="user_id" property="userId" />
+        <result column="station_id" property="stationId" />
+        <result column="mobile_phone" property="mobilePhone" />
+        <result column="total_power" property="totalPower" />
+        <result column="create_time" property="createTime" />
+        <result column="update_time" property="updateTime" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, user_id, station_id, mobile_phone, total_power,create_time, update_time
+    </sql>
+
+</mapper>

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

@@ -20,10 +20,7 @@ import com.kym.service.cache.KymCache;
 import com.kym.service.enplus.EnNotifyService;
 import com.kym.service.enplus.EnPlusService;
 import com.kym.service.factory.DiscountStrategyFactory;
-import com.kym.service.miniapp.AccountService;
-import com.kym.service.miniapp.ChargeOrderService;
-import com.kym.service.miniapp.ChargeService;
-import com.kym.service.miniapp.WalletDetailService;
+import com.kym.service.miniapp.*;
 import jakarta.annotation.PostConstruct;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -56,13 +53,16 @@ public class EnNotifyServiceImpl implements EnNotifyService {
     private final MonitorLogService monitorLogService;
     private final EquipmentInfoService equipmentInfoService;
     private final ConnectorInfoService connectorInfoService;
+
+    private final UserStationService userStationService;
+
     @Value("${kym.notify-email}")
     private String notifyEmail;
 
     public EnNotifyServiceImpl(EnPlusService enPlusService, ChargeOrderService chargeOrderService,
                                ChargeService chargeService, AccountService accountService, WalletDetailService walletDetailService,
                                MonitorLogService monitorLogService, EquipmentInfoService equipmentInfoService,
-                               ConnectorInfoService connectorInfoService, StringRedisTemplate redisTemplate) {
+                               ConnectorInfoService connectorInfoService, StringRedisTemplate redisTemplate, UserStationService userStationService) {
         this.enPlusService = enPlusService;
         this.chargeOrderService = chargeOrderService;
         this.chargeService = chargeService;
@@ -72,6 +72,7 @@ public class EnNotifyServiceImpl implements EnNotifyService {
         this.equipmentInfoService = equipmentInfoService;
         this.connectorInfoService = connectorInfoService;
         this.redisTemplate = redisTemplate;
+        this.userStationService = userStationService;
     }
 
     @PostConstruct
@@ -301,6 +302,9 @@ public class EnNotifyServiceImpl implements EnNotifyService {
             deductions(chargeOrder, account, endTime);
             // redis删除缓存订单信息(订单结算完调用)
             redisTemplate.opsForHash().delete(RedisKeys.CHARGE_ORDER_EQUIP_CHARGE_STATUS, startChargeSeq);
+
+            // 更新用户站点数据
+            userStationService.updateUserStation(chargeOrder);
         }
 
         return """
@@ -344,4 +348,4 @@ public class EnNotifyServiceImpl implements EnNotifyService {
         walletDetailService.save(walletDetail);
 
     }
-}
+}

+ 22 - 0
service/src/main/java/com/kym/service/miniapp/UserStationService.java

@@ -0,0 +1,22 @@
+package com.kym.service.miniapp;
+
+import com.kym.entity.miniapp.ChargeOrder;
+import com.kym.entity.miniapp.UserStation;
+import com.kym.service.mybatisplus.MyBaseService;
+import org.springframework.transaction.annotation.Transactional;
+
+/**
+ * <p>
+ * 用户所属站点表 服务类
+ * </p>
+ *
+ * @author skyline
+ * @since 2024-08-19
+ */
+public interface UserStationService extends MyBaseService<UserStation> {
+
+    @Transactional
+    void initUserStation();
+
+    void updateUserStation(ChargeOrder chargeOrder);
+}

+ 80 - 0
service/src/main/java/com/kym/service/miniapp/impl/UserStationServiceImpl.java

@@ -0,0 +1,80 @@
+package com.kym.service.miniapp.impl;
+
+import cn.hutool.core.date.StopWatch;
+import com.kym.entity.miniapp.ChargeOrder;
+import com.kym.entity.miniapp.User;
+import com.kym.entity.miniapp.UserStation;
+import com.kym.mapper.miniapp.UserStationMapper;
+import com.kym.service.miniapp.ChargeOrderService;
+import com.kym.service.miniapp.UserService;
+import com.kym.service.miniapp.UserStationService;
+import com.kym.service.mybatisplus.MyBaseServiceImpl;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.ArrayList;
+import java.util.stream.Collectors;
+
+/**
+ * <p>
+ * 用户所属站点表 服务实现类
+ * </p>
+ *
+ * @author skyline
+ * @since 2024-08-19
+ */
+@Service
+@Slf4j
+public class UserStationServiceImpl extends MyBaseServiceImpl<UserStationMapper, UserStation> implements UserStationService {
+    private UserService userService;
+
+    private ChargeOrderService chargeOrderService;
+
+    public UserStationServiceImpl(UserService userService, ChargeOrderService chargeOrderService) {
+        this.userService = userService;
+        this.chargeOrderService = chargeOrderService;
+    }
+
+    @Transactional
+    @Override
+    public void initUserStation() {
+        StopWatch stopWatch = new StopWatch();
+        stopWatch.start();
+        // 用户id对应手机号映射
+//        var userId2MobilePhone = userService.list().stream().collect(Collectors.toMap(User::getId, User::getMobilePhone));
+        var userId2MobilePhone = userService.lambdaQuery().select(User::getId, User::getMobilePhone).list().stream().collect(Collectors.toMap(User::getId, User::getMobilePhone));
+        // 获取所有完成充电的订单
+//        var chargeOrderList = chargeOrderService.lambdaQuery().eq(ChargeOrder::getOrderStatus, ChargeOrder.ORDER_STATUS_成功).list();
+        var chargeOrderList = chargeOrderService.lambdaQuery().select(ChargeOrder::getUserId, ChargeOrder::getStationId, ChargeOrder::getTotalPower).list();
+        // 将订单按照用户id和站点id分组并计算出每个用户在每个站点下的充电量
+        var userStationMap = chargeOrderList.stream()
+                .collect(Collectors.groupingBy(chargeOrder -> chargeOrder.getUserId() + ":" + chargeOrder.getStationId(),
+                        Collectors.summarizingDouble(ChargeOrder::getTotalPower)));
+        var userStationList = new ArrayList<UserStation>();
+        userStationMap.forEach((k, v) -> {
+            var userId = Long.valueOf(k.split(":")[0]);
+            var stationId = k.split(":")[1];
+            var userStation = new UserStation().setUserId(userId).setStationId(stationId).setMobilePhone(userId2MobilePhone.get(userId)).setTotalPower(v.getSum());
+            userStationList.add(userStation);
+        });
+        // 批量更新或写入
+        replaceBatch(userStationList);
+        stopWatch.stop();
+        log.info("初始化用户站点表完成,耗时:{}", stopWatch.getTotalTimeSeconds());
+    }
+
+    /**
+     * 订单结束时更新用户站点数据
+     *
+     * @param chargeOrder
+     */
+    @Override
+    public void updateUserStation(ChargeOrder chargeOrder) {
+        lambdaUpdate().setSql("total_power = total_power + #{chargeOrder.totalPower}")
+                .eq(UserStation::getUserId, chargeOrder.getUserId()).eq(UserStation::getStationId, chargeOrder.getStationId())
+                .update();
+    }
+
+
+}