Kaynağa Gözat

站点数据统计

skyline 2 yıl önce
ebeveyn
işleme
508dec2363

+ 72 - 14
admin/src/main/java/com/kym/admin/jobs/StationStatJob.java

@@ -1,7 +1,12 @@
 package com.kym.admin.jobs;
 
+import cn.hutool.core.date.DateUtil;
+import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder;
+import com.kym.entity.admin.ConnectorInfo;
 import com.kym.entity.admin.StationStatDay;
+import com.kym.entity.admin.StationStatMonth;
 import com.kym.entity.miniapp.ChargeOrder;
+import com.kym.service.admin.ConnectorInfoService;
 import com.kym.service.admin.StationStatDayService;
 import com.kym.service.admin.StationStatMonthService;
 import com.kym.service.miniapp.ChargeOrderService;
@@ -9,12 +14,11 @@ import lombok.extern.slf4j.Slf4j;
 import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Component;
 
+import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.LocalTime;
-import java.util.ArrayList;
-import java.util.Comparator;
-import java.util.Map;
-import java.util.TreeSet;
+import java.time.temporal.TemporalAdjusters;
+import java.util.*;
 import java.util.stream.Collectors;
 
 /**
@@ -29,50 +33,104 @@ public class StationStatJob {
     private final StationStatDayService dayService;
     private final StationStatMonthService monthService;
 
-    public StationStatJob(ChargeOrderService chargeOrderService, StationStatDayService stationStatDayService, StationStatMonthService stationStatMonthService) {
+    private final ConnectorInfoService connectorInfoService;
+
+    public StationStatJob(ChargeOrderService chargeOrderService, StationStatDayService stationStatDayService, StationStatMonthService stationStatMonthService, ConnectorInfoService connectorInfoService) {
         this.chargeOrderService = chargeOrderService;
         this.dayService = stationStatDayService;
         this.monthService = stationStatMonthService;
+        this.connectorInfoService = connectorInfoService;
     }
 
 
     // 每天14:30执行一次,通过charge_app.t_charge_order表统计start_time为前一天且充电金额大于100的充电订单,分别统计充电人数、订单数、充电总费用、充电总电量、平均充电电量、平均充电费用、平均订单费用、平均订单电量
+
+    /**
+     * 日统计,每月第一天下午14:30启动,统计上日数据
+     */
     @Scheduled(cron = "0 30 14 * * ?")
-    public void execute() {
-        log.info("执行站点统计定时任务");
-        // 通过charge_app.t_charge_order表统计start_time为前一天且充电金额大于100的有效充电订单
+    private void dayStat() {
+        log.info("执行站点日统计定时任务-开始");
         var statDay = LocalDateTime.now().minusDays(1);
         var startTime = LocalDateTime.of(statDay.toLocalDate(), LocalTime.MIN);
         var endTime = LocalDateTime.of(statDay.toLocalDate(), LocalTime.MAX);
-        var chargeOrderList = chargeOrderService.lambdaQuery()
+        var chargeOrderList = getChargeOrders(startTime, endTime);
+        dayService.saveBatch((Collection<StationStatDay>) getStationStat(chargeOrderList, true));
+        log.info("执行站点日统计定时任务-结束");
+    }
+
+
+    /**
+     * 月统计,每月第一天下午15:00启动,统计上月数据
+     */
+    @Scheduled(cron = "0 0 15 1 * ?")
+    private void monthStat() {
+        log.info("执行站点月统计定时任务-开始");
+        var statMonth = LocalDateTime.now().minusMonths(1);
+        var startTime = statMonth.with(TemporalAdjusters.firstDayOfMonth()).with(LocalTime.MIN);
+        var endTime = statMonth.with(TemporalAdjusters.lastDayOfMonth()).with(LocalTime.MAX);
+        var chargeOrderList = getChargeOrders(startTime, endTime);
+        monthService.saveBatch((Collection<StationStatMonth>) getStationStat(chargeOrderList, false));
+        log.info("执行站点月统计定时任务-结束");
+    }
+
+
+    private List<ChargeOrder> getChargeOrders(LocalDateTime startTime, LocalDateTime endTime) {
+        // 通过charge_app.t_charge_order表统计start_time为前一天且充电金额大于100的有效充电订单
+        DynamicDataSourceContextHolder.push("db-miniapp");
+        var res = chargeOrderService.lambdaQuery()
                 .ge(ChargeOrder::getStartTime, startTime)
                 .le(ChargeOrder::getStartTime, endTime)
                 .gt(ChargeOrder::getTotalMoney, 100)
                 .list();
+        DynamicDataSourceContextHolder.poll();
+        return res;
+    }
 
 
+    private Collection<?> getStationStat(List<ChargeOrder> chargeOrderList, boolean isDayStat) {
+        // 统计每个站点的connector_id数量
+        var stationConnectorCountMap = connectorInfoService.list().stream().collect(Collectors.groupingBy(ConnectorInfo::getStationId, Collectors.counting()));
         // 将chargeOrderList按照stationId分组
         var chargeOrderMap = chargeOrderList.stream().collect(Collectors.groupingBy(ChargeOrder::getStationId));
         // 根据分组计算每个站点的充电人数、订单数、充电总费用、充电总电量、平均充电电量、平均充电费用、平均订单费用、平均订单电量
-        var stationStats = chargeOrderMap.entrySet().stream().collect(Collectors.toMap(
+        return chargeOrderMap.entrySet().stream().collect(Collectors.toMap(
                 Map.Entry::getKey,
                 entry -> {
                     var chargeOrders = entry.getValue();
                     var chargeUsers = chargeOrders.stream().collect(Collectors.collectingAndThen(
                             Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(ChargeOrder::getUserId))), ArrayList<ChargeOrder>::new)).size();
                     var totalMoney = chargeOrders.stream().mapToInt(ChargeOrder::getTotalMoney).sum();
+                    var elecMoney = chargeOrders.stream().mapToInt(ChargeOrder::getElecMoney).sum();
+                    var serviceMoney = chargeOrders.stream().mapToInt(ChargeOrder::getServiceMoney).sum();
                     var totalPower = chargeOrders.stream().mapToDouble(ChargeOrder::getTotalPower).sum();
                     var avgPower = chargeOrders.stream().mapToDouble(ChargeOrder::getTotalPower).average().orElse(0.0);
                     var avgOrderMoney = chargeOrders.stream().mapToInt(ChargeOrder::getTotalMoney).average().orElse(0);
-                    return new StationStatDay()
+                    return isDayStat
+                            ? new StationStatDay()
+                            .setStationId(entry.getKey())
+                            .setStatDay(DateUtil.format(LocalDateTime.now().minusDays(1), "yyyy-MM-dd"))
+                            .setChargeUsers(chargeUsers)
+                            .setValidOrders(chargeOrders.size())
+                            .setTotalMoney(totalMoney)
+                            .setElecMoney(elecMoney)
+                            .setServiceMoney(serviceMoney)
+                            .setTotalPower(totalPower)
+                            .setAvgOrderElec(avgPower)
+                            .setAvgOrderMoney((int) avgOrderMoney)
+                            .setAvgConnectorElec(totalPower / (stationConnectorCountMap.get(entry.getKey())))
+                            : new StationStatMonth()
                             .setStationId(entry.getKey())
-                            .setStatDay(statDay.toLocalDate())
+                            .setStatMonth(DateUtil.format(LocalDateTime.now().minusMonths(1), "yyyy-MM"))
                             .setChargeUsers(chargeUsers)
+                            .setValidOrders(chargeOrders.size())
                             .setTotalMoney(totalMoney)
+                            .setElecMoney(elecMoney)
+                            .setServiceMoney(serviceMoney)
                             .setTotalPower(totalPower)
                             .setAvgOrderElec(avgPower)
-                            .setAvgOrderMoney((int) avgOrderMoney);
+                            .setAvgOrderMoney((int) avgOrderMoney)
+                            .setAvgConnectorElec(totalPower / (stationConnectorCountMap.get(entry.getKey()) * (LocalDate.now().minusMonths(1).lengthOfMonth())));
                 })).values();
-        dayService.saveBatch(stationStats);
     }
 }

+ 1 - 1
entity/src/main/java/com/kym/entity/admin/StationStatDay.java

@@ -32,7 +32,7 @@ public class StationStatDay extends BaseEntity {
     /**
      * 统计时间
      */
-    private LocalDate statDay;
+    private String statDay;
 
     /**
      * 充电人数

+ 1 - 1
entity/src/main/java/com/kym/entity/admin/StationStatMonth.java

@@ -32,7 +32,7 @@ public class StationStatMonth extends BaseEntity {
     /**
      * 统计时间
      */
-    private LocalDate statMonth;
+    private String statMonth;
 
     /**
      * 充电人数