|
@@ -2,6 +2,7 @@ package com.kym.admin.jobs;
|
|
|
|
|
|
|
|
import cn.hutool.core.date.DateUtil;
|
|
import cn.hutool.core.date.DateUtil;
|
|
|
import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder;
|
|
import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder;
|
|
|
|
|
+import com.kym.common.utils.CommUtil;
|
|
|
import com.kym.entity.admin.ConnectorInfo;
|
|
import com.kym.entity.admin.ConnectorInfo;
|
|
|
import com.kym.entity.admin.StationStatDay;
|
|
import com.kym.entity.admin.StationStatDay;
|
|
|
import com.kym.entity.admin.StationStatMonth;
|
|
import com.kym.entity.admin.StationStatMonth;
|
|
@@ -10,6 +11,7 @@ import com.kym.service.admin.ConnectorInfoService;
|
|
|
import com.kym.service.admin.StationStatDayService;
|
|
import com.kym.service.admin.StationStatDayService;
|
|
|
import com.kym.service.admin.StationStatMonthService;
|
|
import com.kym.service.admin.StationStatMonthService;
|
|
|
import com.kym.service.miniapp.ChargeOrderService;
|
|
import com.kym.service.miniapp.ChargeOrderService;
|
|
|
|
|
+import jakarta.annotation.PostConstruct;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
import org.springframework.scheduling.annotation.Scheduled;
|
|
import org.springframework.scheduling.annotation.Scheduled;
|
|
|
import org.springframework.stereotype.Component;
|
|
import org.springframework.stereotype.Component;
|
|
@@ -17,12 +19,15 @@ import org.springframework.stereotype.Component;
|
|
|
import java.time.LocalDate;
|
|
import java.time.LocalDate;
|
|
|
import java.time.LocalDateTime;
|
|
import java.time.LocalDateTime;
|
|
|
import java.time.LocalTime;
|
|
import java.time.LocalTime;
|
|
|
|
|
+import java.time.format.DateTimeFormatter;
|
|
|
import java.time.temporal.TemporalAdjusters;
|
|
import java.time.temporal.TemporalAdjusters;
|
|
|
import java.util.*;
|
|
import java.util.*;
|
|
|
import java.util.stream.Collectors;
|
|
import java.util.stream.Collectors;
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
|
* 站点统计定时任务
|
|
* 站点统计定时任务
|
|
|
|
|
+ *
|
|
|
|
|
+ * @author skyline
|
|
|
*/
|
|
*/
|
|
|
@Component
|
|
@Component
|
|
|
@Slf4j
|
|
@Slf4j
|
|
@@ -46,9 +51,10 @@ public class StationStatJob {
|
|
|
// 每天14:30执行一次,通过charge_app.t_charge_order表统计start_time为前一天且充电金额大于100的充电订单,分别统计充电人数、订单数、充电总费用、充电总电量、平均充电电量、平均充电费用、平均订单费用、平均订单电量
|
|
// 每天14:30执行一次,通过charge_app.t_charge_order表统计start_time为前一天且充电金额大于100的充电订单,分别统计充电人数、订单数、充电总费用、充电总电量、平均充电电量、平均充电费用、平均订单费用、平均订单电量
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
|
- * 日统计,每月第一天下午14:30启动,统计上日数据
|
|
|
|
|
|
|
+ * 日统计,每日下午14:30启动,统计上日数据
|
|
|
*/
|
|
*/
|
|
|
@Scheduled(cron = "0 30 14 * * ?")
|
|
@Scheduled(cron = "0 30 14 * * ?")
|
|
|
|
|
+ // 定时每日下午14:30
|
|
|
private void dayStat() {
|
|
private void dayStat() {
|
|
|
log.info("执行站点日统计定时任务-开始");
|
|
log.info("执行站点日统计定时任务-开始");
|
|
|
var statDay = LocalDateTime.now().minusDays(1);
|
|
var statDay = LocalDateTime.now().minusDays(1);
|
|
@@ -74,6 +80,30 @@ public class StationStatJob {
|
|
|
log.info("执行站点月统计定时任务-结束");
|
|
log.info("执行站点月统计定时任务-结束");
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ // 只执行一次
|
|
|
|
|
+// @PostConstruct
|
|
|
|
|
+ private void init() {
|
|
|
|
|
+ log.info("执行站点初始化定时任务-开始");
|
|
|
|
|
+ // 2023-08-01 00:00:00
|
|
|
|
|
+// var statMonth = LocalDateTime.of(2023, 12, 1, 0, 0);
|
|
|
|
|
+// var endMonth = LocalDateTime.of(2023, 12, 1, 0, 0);
|
|
|
|
|
+// var startTime = statMonth.with(TemporalAdjusters.firstDayOfMonth()).with(LocalTime.MIN);
|
|
|
|
|
+// var endTime = endMonth.with(TemporalAdjusters.lastDayOfMonth()).with(LocalTime.MAX);
|
|
|
|
|
+// var chargeOrderList = getChargeOrders(startTime, endTime);
|
|
|
|
|
+// monthService.saveBatch((Collection<StationStatMonth>) getStationStat(chargeOrderList, false));
|
|
|
|
|
+//
|
|
|
|
|
+// // 将订单按照日为单位分组
|
|
|
|
|
+// var chargeOrderMap = chargeOrderList.stream().collect(Collectors.groupingBy(order ->
|
|
|
|
|
+// order.getStartTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd"))
|
|
|
|
|
+// ));
|
|
|
|
|
+// // chargeOrderMap按照key升序排序
|
|
|
|
|
+// var chargeOrderMapSort = chargeOrderMap.entrySet().stream().sorted(Map.Entry.comparingByKey()).collect(
|
|
|
|
|
+// Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (oldValue, newValue) -> oldValue, LinkedHashMap::new));
|
|
|
|
|
+//
|
|
|
|
|
+// chargeOrderMapSort.forEach((k, v) -> dayService.saveBatch(((Collection<StationStatDay>) getStationStat(v, true))));
|
|
|
|
|
+
|
|
|
|
|
+ log.info("执行站点初始化定时任务-结束");
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
private List<ChargeOrder> getChargeOrders(LocalDateTime startTime, LocalDateTime endTime) {
|
|
private List<ChargeOrder> getChargeOrders(LocalDateTime startTime, LocalDateTime endTime) {
|
|
|
// 通过charge_app.t_charge_order表统计start_time为前一天且充电金额大于100的有效充电订单
|
|
// 通过charge_app.t_charge_order表统计start_time为前一天且充电金额大于100的有效充电订单
|
|
@@ -87,7 +117,6 @@ public class StationStatJob {
|
|
|
return res;
|
|
return res;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-
|
|
|
|
|
private Collection<?> getStationStat(List<ChargeOrder> chargeOrderList, boolean isDayStat) {
|
|
private Collection<?> getStationStat(List<ChargeOrder> chargeOrderList, boolean isDayStat) {
|
|
|
// 统计每个站点的connector_id数量
|
|
// 统计每个站点的connector_id数量
|
|
|
var stationConnectorCountMap = connectorInfoService.list().stream().collect(Collectors.groupingBy(ConnectorInfo::getStationId, Collectors.counting()));
|
|
var stationConnectorCountMap = connectorInfoService.list().stream().collect(Collectors.groupingBy(ConnectorInfo::getStationId, Collectors.counting()));
|
|
@@ -103,9 +132,14 @@ public class StationStatJob {
|
|
|
var totalMoney = chargeOrders.stream().mapToInt(ChargeOrder::getTotalMoney).sum();
|
|
var totalMoney = chargeOrders.stream().mapToInt(ChargeOrder::getTotalMoney).sum();
|
|
|
var elecMoney = chargeOrders.stream().mapToInt(ChargeOrder::getElecMoney).sum();
|
|
var elecMoney = chargeOrders.stream().mapToInt(ChargeOrder::getElecMoney).sum();
|
|
|
var serviceMoney = chargeOrders.stream().mapToInt(ChargeOrder::getServiceMoney).sum();
|
|
var serviceMoney = chargeOrders.stream().mapToInt(ChargeOrder::getServiceMoney).sum();
|
|
|
|
|
+ var serviceMoneyDiscount = chargeOrders.stream().mapToInt(ChargeOrder::getServiceMoneyDiscount).sum();
|
|
|
|
|
+ var discountAmount = chargeOrders.stream().mapToInt(ChargeOrder::getDiscountAmount).sum();
|
|
|
var totalPower = chargeOrders.stream().mapToDouble(ChargeOrder::getTotalPower).sum();
|
|
var totalPower = chargeOrders.stream().mapToDouble(ChargeOrder::getTotalPower).sum();
|
|
|
var avgPower = chargeOrders.stream().mapToDouble(ChargeOrder::getTotalPower).average().orElse(0.0);
|
|
var avgPower = chargeOrders.stream().mapToDouble(ChargeOrder::getTotalPower).average().orElse(0.0);
|
|
|
var avgOrderMoney = chargeOrders.stream().mapToInt(ChargeOrder::getTotalMoney).average().orElse(0);
|
|
var avgOrderMoney = chargeOrders.stream().mapToInt(ChargeOrder::getTotalMoney).average().orElse(0);
|
|
|
|
|
+ // 充电桩使用率 = 有订单的充电桩数量 / 总充电桩数
|
|
|
|
|
+ var connectorUsageRate = (double) chargeOrders.stream().filter(CommUtil.distinctByKey(ChargeOrder::getConnectorId)).count() / stationConnectorCountMap.get(entry.getKey());
|
|
|
|
|
+ ;
|
|
|
return isDayStat
|
|
return isDayStat
|
|
|
? new StationStatDay()
|
|
? new StationStatDay()
|
|
|
.setStationId(entry.getKey())
|
|
.setStationId(entry.getKey())
|
|
@@ -115,10 +149,15 @@ public class StationStatJob {
|
|
|
.setTotalMoney(totalMoney)
|
|
.setTotalMoney(totalMoney)
|
|
|
.setElecMoney(elecMoney)
|
|
.setElecMoney(elecMoney)
|
|
|
.setServiceMoney(serviceMoney)
|
|
.setServiceMoney(serviceMoney)
|
|
|
|
|
+ .setServiceMoneyDiscount(serviceMoneyDiscount)
|
|
|
|
|
+ .setDiscountAmount(discountAmount)
|
|
|
|
|
+
|
|
|
.setTotalPower(totalPower)
|
|
.setTotalPower(totalPower)
|
|
|
.setAvgOrderElec(avgPower)
|
|
.setAvgOrderElec(avgPower)
|
|
|
.setAvgOrderMoney((int) avgOrderMoney)
|
|
.setAvgOrderMoney((int) avgOrderMoney)
|
|
|
.setAvgConnectorElec(totalPower / (stationConnectorCountMap.get(entry.getKey())))
|
|
.setAvgConnectorElec(totalPower / (stationConnectorCountMap.get(entry.getKey())))
|
|
|
|
|
+ .setConnectorUsageRate(connectorUsageRate)
|
|
|
|
|
+
|
|
|
: new StationStatMonth()
|
|
: new StationStatMonth()
|
|
|
.setStationId(entry.getKey())
|
|
.setStationId(entry.getKey())
|
|
|
.setStatMonth(DateUtil.format(LocalDateTime.now().minusMonths(1), "yyyy-MM"))
|
|
.setStatMonth(DateUtil.format(LocalDateTime.now().minusMonths(1), "yyyy-MM"))
|
|
@@ -127,6 +166,8 @@ public class StationStatJob {
|
|
|
.setTotalMoney(totalMoney)
|
|
.setTotalMoney(totalMoney)
|
|
|
.setElecMoney(elecMoney)
|
|
.setElecMoney(elecMoney)
|
|
|
.setServiceMoney(serviceMoney)
|
|
.setServiceMoney(serviceMoney)
|
|
|
|
|
+ .setServiceMoneyDiscount(serviceMoneyDiscount)
|
|
|
|
|
+ .setDiscountAmount(discountAmount)
|
|
|
.setTotalPower(totalPower)
|
|
.setTotalPower(totalPower)
|
|
|
.setAvgOrderElec(avgPower)
|
|
.setAvgOrderElec(avgPower)
|
|
|
.setAvgOrderMoney((int) avgOrderMoney)
|
|
.setAvgOrderMoney((int) avgOrderMoney)
|